Preskoči na vsebino

Preobleke ​

Preobleka (skin) je en videz okvirja urejevalnika: orodne vrstice, gumbov in skupin v njej, menijev z mehurčkom, spustnih menijev, pogovornih oken, okvirja okoli vsebine in okvirja izbire slike. Izbere jo lastnost skin:

vue
<Tiptapify skin="pastel" />

Skin sestavljata dve stvari: žetoni (barve in velikosti kot spremenljivke CSS) in oblika (strukturne različice, ki jih žeton ne more izraziti). Vgrajena skina sta default — klasični videz, dvignjena orodna vrstica z dvignjenimi skupinami gumbov — in pastel, umirjen videz. Skini po meri so enakovredni: registerSkin() in vrstični objekti skinov se razrešijo z natanko istim mehanizmom, vgrajeni skini pa so registrirani skini, ne posebni primeri.

Izrazoslovje: preobleka (skin) in tema Vuetify ​

  • skin — uporabniški izraz za en videz okvirja urejevalnika: žetoni + oblika. Lastnost je skin, tipi so TiptapifySkin*, register je registerSkin(), korenski razred je tiptapify-skin-{name}.
  • theme — rezerviran za svetle/temne teme Vuetify. Komponente Tiptapify svoje lastnosti theme polnijo iz imena trenutne teme Vuetify; sistem preoblek se jih nikoli ne dotakne.

Delujejo skupaj: večina barv vgrajenih žetonov se sklicuje na spremenljivke teme Vuetify (rgb(var(--v-theme-surface)), …), zato preobleke samodejno sledijo svetlemu/temnemu načinu. Celice s fiksno temno barvo v stolpcu classic — ročica za spreminjanje velikosti (rgba(0, 0, 0, .5/.8)), navadna obroba slike, senca mehurčka ter sence dvigov menijev/pogovornih oken — so namerne: klasični videz v obeh temah riše nevtralen temen okvir, izmerjena osnova pa jih zaklene. Preobleka po meri se lahko prosto sklicuje na spremenljivke teme — glejte tabelo žetonov.

Koncept ​

Žetoni ​

Žeton je lastna lastnost CSS z imenom --tf-*. Ključ kataloga je camelCase pripone CSS: toolbarBg → --tf-toolbar-bg, dialogTitleSize → --tf-dialog-title-size. Vrednosti so navadni nizi — barve, polni skrajšani zapisi obrob, sence, odmiki, polmeri.

Vsako pravilo preobleke v knjižnici obstaja enkrat in prebere svoj žeton z nadomestno vrednostjo, enako klasični (osnovni) vrednosti:

css
.tiptapify-toolbar-group {
  border-radius: var(--tf-group-radius, 4px);
}

Razrešena preobleka odda kot spremenljivke samo svoje prepise; nadomestne vrednosti CSS nosijo osnovo. Spremenljivke pristanejo na korenu urejevalnika — in ker se meniji in pogovorna okna teleportirajo iz njega, tudi na ovojnici SkinScope vsakega menija in na sami kartici pogovornega okna, tako da žetoni sledijo vsaki površini.

Oblika ​

Šest zastavic določa, katera pravila veljajo; žetoni jih pobarvajo:

zastavicavrednostikaj preklaplja
toolbarraised · flatdvig VToolbar + brez notranje tanke črte proti ploski obarvani vrstici
groupsbox · flatodseki orodne vrstice kot dvignjena polja VBtnGroup (označevanje 0.3.2: združeni gumbi, žetoni skupine pobarvajo polje) proti navadnim vrstam div s flex
buttonsvuetify · quietizvorni gumbi Vuetify proti prosojnim gumbom z nevtralnim stanjem pritiska
bubblecard · flatohranjeno zaradi združljivosti: meniji z mehurčkom so v obeh oblikah ena vrstica gumbov z ikonami, pobarvana z žetoni (njihovi gumbi sledijo buttons)
dialogclassic · softločilna črta pod naslovom, dvignjen gumb za zapiranje proti mehki kartici z besedilnim gumbom za zapiranje
menuvuetify · softspustni meniji: seznam Vuetify proti svetli kartici z odmiki

Razrešena oblika je na korenu urejevalnika kodirana kot šest razredov .tiptapify-shape-{flag}-{value} in izpostavljena kot shape: ComputedRef<ResolvedShape> na useTiptapifyConfig() za komponente orodne vrstice po meri.

Extends ​

Preobleka se razreši čez klasično osnovo, nato po verigi extends od korena naprej, nazadnje pa čez lastne člane:

classic (base tokens + classic shape) → extends chain → own colors/metrics/flags

Manjkajoče povezave se razrešijo v nakopičeno verigo (z razvojnim opozorilom); cikel se razreši v klasično (z razvojnim opozorilom). Registrirana preobleka se navede po imenu; vrstični objekt preobleke lahko z extends podeduje registrirano ime in nikoli ne vstopi v globalni register — preobleke po meri se nikoli ne razlijejo med urejevalnike. Neznani ključi žetonov se prezrejo z razvojnim opozorilom.

Žive predstavitve vseh treh oblik so na strani s primeri preoblek.

Katalog žetonov ​

Spodnje tabele so pogodba v1: ključi kataloga (TiptapifySkinColors / TiptapifySkinMetrics) so imena, ki jih lahko nastavite. Celice classic so nadomestne vrednosti CSS — vrednost, ki jo osnovna pravila pobarvajo, kadar nobena preobleka žetona ne prepiše.

Orodna vrstica / vrstica ​

žetonspremenljivka CSSclassicpastel
toolbarBg--tf-toolbar-bgrgb(var(--v-theme-surface))rgba(var(--v-theme-on-surface), 0.03)
toolbarBorderBottom--tf-toolbar-border-bottomnone1px solid rgba(var(--v-border-color), var(--v-border-opacity))
toolbarFg--tf-toolbar-fginheritrgba(var(--v-theme-on-surface), var(--v-high-emphasis-opacity))

Elementi / skupine / ločila ​

žetonspremenljivka CSSclassicpastel
itemsPadding--tf-items-padding12px 16px6px 8px
itemsGap--tf-items-gapnormal ¹6px
itemsRowGap--tf-items-row-gap5px4px
groupGap--tf-group-gap0px2px
groupHeight--tf-group-height32pxauto
groupBg--tf-group-bgrgb(var(--v-theme-surface))transparent
groupRadius--tf-group-radius4px0px
groupShadow--tf-group-shadowdvig Vuetify 2 ²none
dividerWidth--tf-divider-width0px (distančnik: rob 0 4px)1px
dividerHeight--tf-divider-height0px20px
dividerColor--tf-divider-colortransparentrgba(var(--v-border-color), var(--v-border-opacity))

¹ Izmerjena celica classic je normal — izvorna vrednost flex v Vuetify, ki jo nosi nadomestna vrednost CSS. Osnovna vrednost kataloga 0px je enakovredna izrecna dolžina za prepise preobleke.

² Celice z besedilom »dvig Vuetify n« so opisne: natančen niz trojne sence je izmerjena vrednost v potrjeni osnovni datoteki (src/skins/__fixtures__/skin-baseline.json) in je nadomestna vrednost CSS. Pri groupShadow je to dvig 2 (0 3px 1px -2px …, 0 2px 2px 0 …, 0 1px 5px 0 …) — pri groups: 'box' je odsek VBtnGroup (elevation="4"), pravilo žetona pa polje pobarva s to trojico čez lasten dvig skupine: polje je lastnik dviga, združeni otroški gumbi ga nimajo.

Gumbi ​

Ti žetoni se uporabljajo samo pri buttons: 'quiet' — glejte Dosegljivost.

žetonspremenljivka CSStiha vrednost (classic: izvorni Vuetify)
buttonFg--tf-button-fgrgba(var(--v-theme-on-surface), var(--v-medium-emphasis-opacity))
buttonHoverBg--tf-button-hover-bgrgba(var(--v-theme-on-surface), 0.07)
buttonHoverFg--tf-button-hover-fgrgba(var(--v-theme-on-surface), var(--v-high-emphasis-opacity))
buttonActiveBg--tf-button-active-bgrgba(var(--v-theme-on-surface), 0.1)
buttonActiveHoverBg--tf-button-active-hover-bgrgba(var(--v-theme-on-surface), 0.14)
buttonRadius--tf-button-radius6px

Meniji z mehurčkom (izbor, prazna vrstica, slika) ​

žetonspremenljivka CSSclassicpastel
bubbleBg--tf-bubble-bgrgb(var(--v-theme-surface))enako
bubbleBorder--tf-bubble-bordernone1px solid rgba(var(--v-border-color), var(--v-border-opacity))
bubbleShadow--tf-bubble-shadow0 4px 14px rgba(0, 0, 0, 0.12), 0 1px 3px rgba(0, 0, 0, 0.08)0 6px 20px rgba(0, 0, 0, 0.12)
bubbleRadius--tf-bubble-radius6px10px
bubblePadding--tf-bubble-padding4pxenako
bubbleGap--tf-bubble-gap2pxenako
žetonspremenljivka CSSclassicpastel
menuListPadding--tf-menu-list-padding8px 0px4px
menuRadius--tf-menu-radius4px8px
menuBorder--tf-menu-bordernone1px solid rgba(var(--v-border-color), var(--v-border-opacity))
menuShadow--tf-menu-shadowdvig Vuetify 8 ²0 4px 16px rgba(0, 0, 0, 0.08)
menuItemRadius--tf-menu-item-radius0px6px
menuItemPadding--tf-menu-item-paddingVuetify ³4px 8px
menuItemMinHeight--tf-menu-item-min-heightVuetify ³34px
menuItemActiveBg--tf-menu-item-active-bgVuetify ³rgba(var(--v-theme-on-surface), 0.06)

³ Polje seznama (polmer, senca, odmik seznama) klasičnega menija je danes pravilo preobleke — ovojnica žetonov SkinScope stoji med lastnim otroškim pravilom Vuetify in seznamom, zato knjižnica te slikovne pike obnovi kot pravila preobleke, ki berejo zgornje žetone. Slikovne pike elementov ostanejo izvorne za Vuetify (osnovna datoteka tam meri privzete vrednosti Vuetify): štirje žetoni elementov so neaktivni, dokler je menu: 'vuetify'.

Pogovorna okna ​

žetonspremenljivka CSSclassicpastel
dialogShadow--tf-dialog-shadowdvig VCard ²0 20px 48px rgba(0, 0, 0, 0.16), 0 2px 6px rgba(0, 0, 0, 0.06)
dialogRadius--tf-dialog-radius4px (VCard)12px
dialogHeaderPadding--tf-dialog-header-padding8px 16px16px 12px 12px 20px
dialogContentPadding--tf-dialog-content-padding16px 24px 24px4px 20px
dialogActionsPadding--tf-dialog-actions-padding8px16px 20px 20px
dialogTitleSize--tf-dialog-title-size1.25rem1.125rem
dialogTitleWeight--tf-dialog-title-weight400600
dialogFieldRadius--tf-dialog-field-radiusprivzeto polje (4px)8px (outlined)
dialogActionBtnMinHeight--tf-dialog-action-btn-min-heightVuetify (auto)38px
dialogActionBtnRadius--tf-dialog-action-btn-radiusVuetify (4px)8px
dialogGridGap--tf-dialog-grid-gap24px16px

Okvir (ovojnica obrobe urejevalnika) ​

žetonspremenljivka CSSclassicpastel
frameBorder--tf-frame-border1px solid rgba(var(--v-border-color), var(--v-border-opacity)), brez zgornjega robapolna obroba
frameBg--tf-frame-bgtransparentrgb(var(--v-theme-surface))
frameShadow--tf-frame-shadownone0 1px 2px rgba(0, 0, 0, 0.05)

Pri ploski obliki orodne vrstice okvir pobarva tudi razliko po straneh (zgornji rob in spodnji rob pri 1,6-kratni prosojnosti obrobe). Ta razlika pripada obliki, ne žetonu: ni dosegljiva z žetonom.

Slike in ročice za spreminjanje velikosti ​

žetonspremenljivka CSSclassicpastel
imageRadius--tf-image-radius0.125rem4px
imageBg--tf-image-bgtransparentrgba(var(--v-theme-on-surface), 0.04)
imageOutline--tf-image-outline1px solid rgba(0, 0, 0, 0.25) (izbrano)2px solid rgb(var(--v-theme-primary))
imageOutlineHover--tf-image-outline-hovertransparentrgba(var(--v-theme-primary), 0.35)
handleBg--tf-handle-bgrgba(0, 0, 0, 0.5)rgb(var(--v-theme-primary))
handleBgHover--tf-handle-bg-hoverrgba(0, 0, 0, 0.8) (ob lebdenju)rgb(var(--v-theme-primary))
handleBorder--tf-handle-bordernone2px solid rgb(var(--v-theme-surface))
handleShadow--tf-handle-shadownone0 0 0 1px rgba(0, 0, 0, 0.15)
handleRadius--tf-handle-radius2px50%

Orodna vrstica slike sledi zastavici buttons: pri tihi obliki dobi tiho površino — njena razmika 2px/4px bere --tf-bubble-gap / --tf-bubble-padding z nadomestnimi vrednostmi menija slike; namenskega žetona orodne vrstice slike ni.

Ni v katalogu (področje zasilnega izhoda) ​

Nekatere mere, omenjene v pregledu zasnove, v v1 nimajo žetona v katalogu: višina orodne vrstice, širina okvirja, polmer okvirja, širina gumba, odmik gumba, širina pogovornega okna. Zgornje tabele kataloga so pogodba; za te slikovne pike odprite zasilni izhod in neposredno oblikujte stabilne razrede.

Dosegljivost ​

Pogodba, navedena enkrat in upoštevana v vsaki zgornji skupini:

Žeton pobarva površino samo, kadar jo oblika aktivira; izvorni vizualni elementi Vuetify se oblikujejo prek barv teme Vuetify.

Po skupinah:

  • Orodna vrstica, okvir, okvir slike/ročice — aktivni v vsaki obliki; žetoni jih pobarvajo, celice classic so izvorni videz, na katerega se žetoni zanesejo.
  • Polje skupin (groupBg, groupRadius, groupHeight, groupShadow) — pri groups: 'box' je odsek VBtnGroup (struktura 0.3.2: gumbi se združijo, polje nosi dvig); pravila polja ga pobarvajo z žetoni skupine, --tf-group-height pa z !important ohranja pogodbo 32px (pravilo gostote Vuetify se bori proti njej, kot v 0.3.2). Pri groups: 'flat' so odseki navadne vrste div (prosojni, brez sence, polmer 0 je osnova oblike).
  • Tanke ločilne črte (dividerWidth/Height/Color) — vidna tanka črta je možnost oblike groups: 'flat'; v obliki polja je ločilo distančnik ničelne velikosti (margin: 0 4px iz osnovnega pravila).
  • Odmiki/razmiki elementov — kompaktna vrsta 6px 8px je pogojena z ploščato vrstico (toolbar: 'flat'), razmiki skupin z ploščatimi odseki (groups: 'flat'); dvignjena vrstica ohrani klasične mere.
  • Gumbi (buttonFg, buttonHover*, buttonActive*, buttonRadius) — neaktivni pri buttons: 'vuetify': izvorni gumbi Vuetify sami pobarvajo svoja stanja. Oblikujte jih z barvami teme Vuetify (primary, surface, …) — klasične oblike jih namerno podedujejo.
  • Mere elementov menija (menuItemRadius/Padding/MinHeight/ActiveBg) — neaktivne pri menu: 'vuetify'; Vuetify je lastnik teh slikovnih pik elementov. Polje seznama menija (polmer/senca/odmik) je v obeh oblikah pobarvano s preobleko (glejte opombo o meniju).
  • Mehek okvir pogovornega okna (dialogActionBtn*, dialogFieldRadius, mehki odmiki, manjkajoča ločilna črta) — pobarvan pri dialog: 'soft'; pri dialog: 'classic' je pogovorno okno VCard s klasičnimi odmiki.
  • Okvir mehurčka — meniji za izbor, prazno vrstico in sliko so v obeh oblikah ena vrstica gumbov z ikonami, pobarvana z žetoni mehurčka; bubble ne spreminja več njihovega označevanja.

Prepis, enak osnovi kataloga, se ne odda — pri neklasični obliki lastna osnova oblike pobarva prek nadomestne vrednosti CSS, zato »obnovitev« klasične vrednosti (npr. nastavitev buttonActiveBg nazaj na rgb(var(--v-theme-primary)) pri buttons: 'quiet') tiho ne naredi nič. Če želite pri neklasični obliki vsiliti vrednost v klasičnem videzu, nastavite prepis, ki se razlikuje od osnove kataloga — enakovreden dobesedni zapis, kot je rgba(var(--v-theme-primary), 1), pobarva enako in preživi preskok.

Žetoni namerno niso povezani z izvornimi potmi — to ohranja default pikslovno enak klasičnemu videzu, medtem ko se vse usmerja prek kataloga.

Recepti ​

Razširitev preobleke pastel ​

Podedujte tiho obliko in prebarvajte nekaj površin. Registrirana imena delujejo na vsakem urejevalniku:

ts
// main.ts — call once, before any editor mounts
import { registerSkin } from 'tiptapify'

registerSkin('mint', {
  extends: 'pastel',
  colors: {
    toolbarBg: 'rgba(0, 128, 0, 0.05)',   // mint tint over the pastel wash
    handleBg: 'rgb(0, 100, 0)',           // deep green handles
    handleBgHover: 'rgb(0, 128, 0)',
    imageOutline: '2px solid rgb(0, 100, 0)',
    imageOutlineHover: 'rgba(0, 100, 0, 0.35)',
  },
})
vue
<Tiptapify skin="mint" />

Oblika (ploska/tiha/mehka) prihaja iz preobleke pastel; nedotaknjeni žetoni ohranijo vrednosti preobleke pastel — tiha podlaga gumbov ostane nevtralna, premakne se samo to, kar prepišete. To je preobleka, živo izrisana na strani s primeri.

Razširitev preobleke default ​

Ohranite klasično strukturo, prilagodite barve:

ts
registerSkin('paper', {
  extends: 'default',
  colors: { toolbarBg: 'rgb(var(--v-theme-background))' },
  metrics: { groupRadius: '8px', itemsPadding: '10px 14px' },
})

extends: 'default' je implicitni koren, zato ključ lahko izpustite: tudi { toolbar: 'flat', … } izhaja iz klasične.

Povsem po meri ​

Brez extends, brez registracije: objekt podajte lastnosti skin in prosto nastavite zastavice oblike ter žetone. name na korenski razred postavi vašo oznako (glejte spodaj); brez njega je to tiptapify-skin-inline.

vue
<script setup lang="ts">
import { defineSkin } from 'tiptapify'

const slate = defineSkin({
  name: 'slate',
  toolbar: 'flat',
  groups: 'flat',
  buttons: 'quiet',
  bubble: 'flat',
  dialog: 'soft',
  menu: 'soft',
  colors: { toolbarBg: 'rgb(30, 41, 59)', toolbarFg: 'rgb(226, 232, 240)' },
  metrics: { buttonRadius: '8px' },
})
</script>

<template>
  <Tiptapify :skin="slate" />
</template>

defineSkin je pomožna identitetna funkcija za tipizirane konstantne definicije (ne vstopi v noben register). Zastavice oblike lahko nastavljate posamično — vsaka zastavica, ki jo izpustite, ostane klasična.

Zasilni izhod: korenski razred ​

Vsak koren urejevalnika nosi tiptapify-skin-{name} (tiptapify-skin-inline za vrstični objekt brez imena). Knjižnica nikoli ne veže nobenega pravila na ime preobleke — razred je vaš:

css
/* Style the frame of one skin, dimensions the catalog does not cover */
.tiptapify-skin-mint .tiptapify-frame {
  max-width: 720px;
  margin-inline: auto;
}

Stabilne kljuke, na katere pišete:

razredkje
tiptapify-skin-{name}koren urejevalnika
tiptapify-shape-{flag}-{value} ×6koren urejevalnika — razrešena oblika
tiptapify-toolbar · tiptapify-toolbar-items · tiptapify-toolbar-group · menu-dividerorodna vrstica in njeni odseki
tiptapify-quiet-buttonskorena orodne vrstice in mehurčka pri buttons: 'quiet'
tiptapify-bubble-row · tiptapify-bubble-dividervrstica vsakega menija z mehurčkom in tanka črta med njegovimi skupinami
tiptapify-bubble-menu · floating-menu · tiptapify-image-menuvrstice menijev za izbor, prazno vrstico in sliko
tiptapify-btn--activepritisnjen gumb menija z mehurčkom (aktivna oznaka, plavanje slike)
tiptapify-menu · tiptapify-menu--softvsebina prekrivnega spustnega menija, nosilec mehkih pravil menija
tiptapify-skin-scopediv z obsegom žetonov znotraj teleportiranih menijev
tiptapify-dialog · tiptapify-dialog--softkartica pogovornega okna in njen mehki nosilec
tiptapify-frameovojnica obrobe urejevalnika

Obramba pred temami uporabnika. Plast preobleke je zgrajena tako, da preživi administrativne teme, ki odmikajo in prebarvajo notranjost Vuetify: pravila so pogojena z razredi oblike/nosilca, za specifičnost uporabljajo podvojene razrede (.v-list.v-list, .v-btn.v-btn.v-btn) in !important ohranijo samo tam, kjer se je v osnovni potrditvi primer administrativne teme izkazal za nujnega (obrambni nabor menu.css). Konvencije, ki vaše lastne prepise ohranjajo delujoče na istem bojišču:

  • svoj CSS zamejite pod .tiptapify-skin-{name} (ali razred oblike) — nikoli na gole notranjosti Vuetify;
  • za mere iz kataloga raje uporabite žetone (--tf-*), za ostalo razrede;
  • pri prepisovanju komponent Vuetify posnemajte podvajanje (en sam .v-list-item izgubi proti pravilom preobleke).

Vizualna pogodba (opomba za sodelavce) ​

Izračunani slogi vgrajenih preoblek so zaklenjeni z osnovno datoteko src/skins/__fixtures__/skin-baseline.json (13 odsekov × svetlo/temno): plast CSS je končana, ko se izmerjena matrika z njo ujema. Opombe za branje datoteke:

  • Mer za lebdenje/aktivno stanje s strani ni mogoče vsiliti, zato snemanje prebere besedilo deklaracije prvega zadetka pravila CSSOM za vsak izbirnik lebdenja in ga razreši prek preizkusnega elementa znotraj korena preobleke (polje resolved) — to je pogodba zmagovalnega pravila, ne živi posnetek :hover.
  • _meta.selectors.menu beleži besedilo izbirnika pred SkinScope. Datoteka je zamrznjena (normativne vrednosti), zato je polje namenoma zastarelo; snemalni sveženj zaklene trenutni izbirnik.
  • Datoteka nosi svoje odobrene spremembe v _meta.notes: obnovitev označevanja VBtnGroup pri groups: 'box' z dne 2026-10-18 je znova izmerila polja otroških gumbov groupBtn/buttonsActive pri classic (združeni vogali, polje je lastnik dviga). Polja pastel so nedotaknjena — namerna vizualna sprememba posodobi samo prizadete celice classic, zabeleži opombo in prinese vrstico v CHANGELOG.

Glejte tudi ​

Izdano pod licenco MIT.