Pāriet uz saturu

Apvalki ​

Apvalks (skin) ir viens redaktora čaulas izskats: rīkjosla, tajā esošās pogas un grupas, burbuļa izvēlnes, nolaižamās izvēlnes, dialoglodziņi, ietvars ap saturu un attēla atlases čaula. To izvēlas rekvizīts skin:

vue
<Tiptapify skin="pastel" />

Skins sastāv no divām lietām: tokeniem (krāsas un izmēri kā CSS mainīgie) un formas (strukturāli varianti, ko tokens nespēj izteikt). Divi iebūvētie skini ir default — klasiskais izskats, paaugstināta rīkjosla ar paaugstinātām pogu grupām — un pastel, mierīgais izskats. Pielāgotie skini ir pilnvērtīgi: registerSkin() un iekļautie skinu objekti tiek atrisināti ar tieši to pašu mehānismu, un iebūvētie skini ir reģistrēti skini, nevis īpaši gadījumi.

Terminoloģija: apvalks (skin) pret Vuetify tēmu ​

  • skin (apvalks) — lietotājam redzamais termins vienam redaktora čaulas izskatam: tokeni + forma. Rekvizīts ir skin, tipi ir TiptapifySkin*, reģistrs ir registerSkin(), saknes klase ir tiptapify-skin-{name}.
  • theme (tēma) — rezervēts Vuetify gaišajām/tumšajām tēmām. Tiptapify komponentu rekvizīti theme tiek barotas no Vuetify pašreizējās tēmas nosaukuma; apvalku sistēma tiem nekad nepieskaras.

Tie darbojas kopā: lielākā daļa iebūvēto tokenu krāsu atsaucas uz Vuetify tēmas mainīgajiem (rgb(var(--v-theme-surface)), …), tāpēc apvalki automātiski seko gaišajam/tumšajam režīmam. Fiksēti tumšās šūnas klasiskajā kolonnā — izmēra maiņas turis (rgba(0, 0, 0, .5/.8)), vienkāršā attēla kontūra, burbuļa ēna un izvēlņu/dialoglodziņu paaugstinājuma ēnas — ir tīši: klasiskais izskats abās tēmās krāso neitrālu tumšu čaulu, un izmērītais pamatlīmenis tās fiksē. Pielāgots apvalks var brīvi atsaukties uz tēmas mainīgajiem — skatiet tokenu tabulu.

Koncepcija ​

Tokeni ​

Tokens ir CSS pielāgota īpašība ar nosaukumu --tf-*. Kataloga atslēga ir CSS sufiksa camelCase forma: toolbarBg → --tf-toolbar-bg, dialogTitleSize → --tf-dialog-title-size. Vērtības ir vienkāršas virknes — krāsas, pilni apmales saīsinājumi, ēnas, atkāpes, rādiusi.

Katrs apvalka noteikums bibliotēkā pastāv vienreiz un nolasa savu tokenu ar rezerves vērtību, kas vienāda ar klasisko (bāzes) vērtību:

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

Atrisināts apvalks kā mainīgos izvada tikai savus pārrakstījumus; CSS rezerves vērtības nes bāzi. Mainīgie nonāk redaktora saknē — un, tā kā izvēlnes un dialoglodziņi tiek teleportēti ārpus tās, arī katras izvēlnes SkinScope ietinumā un pašā dialoglodziņa kartē, tāpēc tokeni seko katrai virsmai.

Forma ​

Seši karogi nosaka, kuri noteikumu kopumi tiek piemēroti; tokeni tos krāso:

karogsvērtībasko tas pārslēdz
toolbarraised · flatVToolbar paaugstinājums + bez iekšējās matiņlīnijas pret plakanu tonētu joslu
groupsbox · flatrīkjoslas sadaļas kā paaugstinātas VBtnGroup kastes (0.3.2 iezīmējums: savienotas pogas, grupas tokeni krāso kasti) pret vienkāršām flex div rindām
buttonsvuetify · quietdabiskas Vuetify pogas pret spoku pogām ar neitrālu nospiesto stāvokli
bubblecard · flatpaturēts saderībai: burbuļa izvēlnes abās formās ir viena tokeniem krāsota ikonu pogu rinda (to pogas seko buttons)
dialogclassic · softšķirtne zem virsraksta, paaugstināta aizvēršanas poga pret maigu karti, teksta aizvēršanas poga
menuvuetify · softnolaižamās izvēlnes: Vuetify saraksts pret gaišu atkāpēm bagātu karti

Atrisinātā forma ir kodēta redaktora saknē kā seši .tiptapify-shape-{flag}-{value} klases un pieejama kā shape: ComputedRef<ResolvedShape> objektā useTiptapifyConfig() pielāgotiem rīkjoslas komponentiem.

Extends ​

Apvalks tiek atrisināts virs klasiskās bāzes, tad tā extends ķēde no saknes, tad paša locekļi:

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

Trūkstošas saites tiek atrisinātas uz uzkrāto ķēdi (ar izstrādes brīdinājumu); cikls tiek atrisināts uz classic (ar izstrādes brīdinājumu). Uz reģistrētu apvalku atsaucas pēc nosaukuma; iekļauts apvalka objekts var extends reģistrētu nosaukumu un nekad nenonāk globālajā reģistrā — pielāgoti apvalki nekad nenoplūst starp redaktoriem. Nezināmas tokenu atslēgas tiek ignorētas ar izstrādes brīdinājumu.

Visu triju formu dzīvās demonstrācijas ir apvalku piemēru lapā.

Tokenu katalogs ​

Tabulas zemāk ir v1 līgums: kataloga atslēgas (TiptapifySkinColors / TiptapifySkinMetrics) ir nosaukumi, ko varat iestatīt. Klasiskās šūnas ir CSS rezerves vērtības — vērtība, ko bāzes noteikumi krāso, kad neviens apvalks tokenu nepārraksta.

Rīkjosla / josla ​

tokensCSS mainīgaisclassicpastel
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 / grupas / atdalītāji ​

tokensCSS mainīgaisclassicpastel
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-shadowVuetify elevation 2 ²none
dividerWidth--tf-divider-width0px (atstarpe: margin 0 4px)1px
dividerHeight--tf-divider-height0px20px
dividerColor--tf-divider-colortransparentrgba(var(--v-border-color), var(--v-border-opacity))

¹ Izmērītā klasiskā šūna ir normal — Vuetify dabiskā flex vērtība, ko nes CSS rezerves vērtība. Kataloga bāzes vērtība 0px ir līdzvērtīgs skaidrs garums apvalka pārrakstījumiem.

² Šūnas, kurās rakstīts “Vuetify elevation n”, ir aprakstošas: precīzā trīskāršās ēnas virkne ir izmērītā vērtība iekomitētajā pamatlīmeņa fiksētajā datu failā (src/skins/__fixtures__/skin-baseline.json) un ir CSS rezerves vērtība. Priekš groupShadow tā ir elevation 2 (0 3px 1px -2px …, 0 2px 2px 0 …, 0 1px 5px 0 …) — ar groups: 'box' sadaļa ir VBtnGroup (elevation="4"), un tokena noteikums krāso kasti ar šo trijotni virs grupas paša paaugstinājuma: kaste pieder paaugstinājumam, savienotajām bērnu pogām tā nav.

Pogas ​

Šie tokeni tiek izmantoti tikai ar buttons: 'quiet' — skatiet Sasniedzamība.

tokensCSS mainīgaisquiet vērtība (classic: dabiskais 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

Burbuļa izvēlnes (atlase, tukša rinda, attēls) ​

tokensCSS mainīgaisclassicpastel
bubbleBg--tf-bubble-bgrgb(var(--v-theme-surface))tāpat
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-padding4pxtāpat
bubbleGap--tf-bubble-gap2pxtāpat
tokensCSS mainīgaisclassicpastel
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-shadowVuetify elevation 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)

³ Klasiskās izvēlnes saraksta kaste (rādiuss, ēna, saraksta atkāpe) šobrīd ir apvalka noteikums — SkinScope tokenu ietinums atrodas starp paša Vuetify bērna noteikumu un sarakstu, tāpēc bibliotēka šos pikseļus atjauno kā apvalka noteikumus, kas nolasa iepriekš minētos tokenus. Elementu pikseļi paliek dabiskie Vuetify (fiksētais datu fails mēra Vuetify noklusējumus): četri elementu tokeni ir neaktīvi, kamēr menu: 'vuetify'.

Dialoglodziņi ​

tokensCSS mainīgaisclassicpastel
dialogShadow--tf-dialog-shadowVCard elevation ²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-radiuslauka noklusējums (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

Ietvars (redaktora apmales ietinums) ​

tokensCSS mainīgaisclassicpastel
frameBorder--tf-frame-border1px solid rgba(var(--v-border-color), var(--v-border-opacity)), bez augšējās malaspilna apmale
frameBg--tf-frame-bgtransparentrgb(var(--v-theme-surface))
frameShadow--tf-frame-shadownone0 1px 2px rgba(0, 0, 0, 0.05)

Ar plakano rīkjoslas formu ietvars krāso arī katras puses starpību (augšējo malu un apakšējo malu ar 1,6× apmales necaurredzamību). Šī starpība pieder formai, nevis tokenam: tā nav sasniedzama ar tokenu.

Attēli un izmēra maiņas turi ​

tokensCSS mainīgaisclassicpastel
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) (atlasīts)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) (hover)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%

Attēla rīkjosla seko karogam buttons: ar quiet formu tā iegūst quiet virsmu — tās 2px/4px atstarpes nolasa --tf-bubble-gap / --tf-bubble-padding ar attēla izvēlnes rezerves vērtībām; īpaša attēla rīkjoslas tokena nav.

Nav katalogā (izejas teritorija) ​

Dažiem dizaina pārskatā minētajiem izmēriem v1 katalogā nav tokena: rīkjoslas augstums, ietvara platums, ietvara rādiuss, pogas platums, pogas atkāpe, dialoglodziņa platums. Kataloga tabulas iepriekš ir līgums; šiem pikseļiem atveriet izeju un stilizējiet stabilās klases tieši.

Sasniedzamība ​

Līgums, ko nosaka vienreiz un ievēro katra iepriekš minētā grupa:

Tokens krāso virsmu tikai tad, ja forma šo virsmu aktivizē; dabiskie Vuetify vizuālie elementi tiek stilizēti ar Vuetify tēmas krāsām.

Pa grupām:

  • Rīkjosla, ietvars, attēla/turu čaula — aktīvi katrā formā; tokeni tos krāso, klasiskās šūnas ir dabiskais izskats, uz ko tokeni atkāpjas.
  • Grupu kaste (groupBg, groupRadius, groupHeight, groupShadow) — ar groups: 'box' sadaļa ir VBtnGroup (0.3.2 struktūra: pogas savienojas, kaste nes paaugstinājumu); kastes noteikumi to krāso ar grupu tokeniem, un --tf-group-height saglabā 32px līgumu ar !important (Vuetify blīvuma noteikums tam pretojas, kā 0.3.2). Ar groups: 'flat' sadaļas ir vienkāršas div rindas (caurspīdīgas, bez ēnas, rādiuss 0 ir formas bāze).
  • Atdalītāju matiņlīnijas (dividerWidth/Height/Color) — redzamā matiņlīnija ir groups: 'flat' iespēja; kastes formā atdalītājs ir nulles izmēra atstarpe (margin: 0 4px no bāzes noteikuma).
  • Elementu atkāpes/atstarpes — kompaktā 6px 8px rinda ir saistīta ar plakano joslu (toolbar: 'flat'), grupu atstarpes — ar plakanajām sadaļām (groups: 'flat'); paaugstinātā josla saglabā klasiskās metrikas.
  • Pogas (buttonFg, buttonHover*, buttonActive*, buttonRadius) — neaktīvas ar buttons: 'vuetify': dabiskās Vuetify pogas krāso savus stāvokļus pašas. Stilizējiet tās ar Vuetify tēmas krāsām (primary, surface, …) — klasiskās formas tās tīši mantojas.
  • Izvēlņu elementu metrikas (menuItemRadius/Padding/MinHeight/ActiveBg) — neaktīvas ar menu: 'vuetify'; Vuetify pieder šie elementu pikseļi. Izvēlnes saraksta kaste (rādiuss/ēna/atkāpe) abās formās ir apvalka krāsota (skatiet izvēlnes piezīmi).
  • Dialoglodziņa maigā čaula (dialogActionBtn*, dialogFieldRadius, maigās atkāpes, trūkstošā šķirtne) — krāsota ar dialog: 'soft'; ar dialog: 'classic' dialoglodziņš ir VCard ar klasiskajām atkāpēm.
  • Burbuļa čaula — atlases, tukšās rindas un attēla izvēlnes abās formās ir viena ikonu pogu rinda, ko krāso burbuļa tokeni; bubble vairs nemaina to iezīmējumu.

Pārrakstījums, kas vienāds ar kataloga bāzi, netiek izvadīts — ar nenoklasisku formu pašas formas bāze krāso ar CSS rezerves vērtību, tāpēc klasiskas vērtības “atjaunošana” (piemēram, buttonActiveBg atiestatīšana uz rgb(var(--v-theme-primary)) ar buttons: 'quiet') klusi neko nedara. Lai nenoklasiskā formā piespiestu klasiski izskatīgu vērtību, iestatiet pārrakstījumu, kas atšķiras no kataloga bāzes — līdzvērtīgs burtisks apzīmējums, piemēram, rgba(var(--v-theme-primary), 1), krāso identiski un iztur izlaišanu.

Tokeni tīši nav pieslēgti dabiskajiem ceļiem — tieši tas saglabā default pikseļu ziņā identisku klasiskajam izskatam, kamēr viss iet caur katalogu.

Receptes ​

Paplašināt pastel ​

Pārmantojiet quiet formu un pārkrāsojiet dažas virsmas. Reģistrēti nosaukumi darbojas jebkuram redaktoram:

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" />

Forma (flat/quiet/soft) nāk no pastel; neskarti tokeni saglabā pastel vērtības — quiet pogu fons paliek neitrāls, mainās tikai tas, ko pārrakstāt. Šis ir apvalks, kas dzīvi renderēts piemēru lapā.

Paplašināt default ​

Saglabājiet klasisko struktūru, pielāgojiet krāsojumu:

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

extends: 'default' ir netiešā sakne, tāpēc atslēgu var izlaist: { toolbar: 'flat', … } arī sākas no classic.

Pilnīgi pielāgots ​

Bez extends, bez reģistrācijas: nododiet objektu rekvizītam skin un brīvi iestatiet formas karogus un tokenus. Ar name uz saknes klases uzliekat savu etiķeti (skatiet zemāk); bez tā tā ir 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 ir identitātes palīgfunkcija tipizētām konstantu definīcijām (tā nenonāk nevienā reģistrā). Formas karogus var iestatīt atsevišķi — katrs izlaistais karogs paliek klasisks.

Izeja: saknes klase ​

Katra redaktora sakne nes tiptapify-skin-{name} (tiptapify-skin-inline beznosaukuma iekļautam objektam). Bibliotēka nekad neveido nevienu noteikumu pēc apvalka nosaukuma — klase ir jūsu:

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

Stabilie āķi, pret kuriem rakstīt:

klasekur
tiptapify-skin-{name}redaktora sakne
tiptapify-shape-{flag}-{value} ×6redaktora sakne — atrisinātā forma
tiptapify-toolbar · tiptapify-toolbar-items · tiptapify-toolbar-group · menu-dividerrīkjosla un tās sadaļas
tiptapify-quiet-buttonsrīkjoslas un burbuļa saknes ar buttons: 'quiet'
tiptapify-bubble-row · tiptapify-bubble-dividerkatras burbuļa izvēlnes rinda un matiņlīnija starp tās grupām
tiptapify-bubble-menu · floating-menu · tiptapify-image-menuatlases, tukšās rindas un attēla izvēlņu rindas
tiptapify-btn--activeburbuļa izvēlnes nospiesta poga (aktīva iezīme, attēla peldēšana)
tiptapify-menu · tiptapify-menu--softnolaižamās izvēlnes pārklājuma saturs, maigo izvēlnes noteikumu nesējs
tiptapify-skin-scopetokenu tvēruma div teleportētajās izvēlnēs
tiptapify-dialog · tiptapify-dialog--softdialoglodziņa karte un tās maigais nesējs
tiptapify-frameredaktora apmales ietinums

Aizsardzība pret patērētāja tēmu. Apvalku slānis ir veidots tā, lai pārdzīvotu administratora tēmas, kas Vuetify iekšienē pievieno atkāpes un pārkrāso: noteikumi tiek saistīti ar formas/nesēja klasēm, specifiskumam izmanto dubultotas klases (.v-list.v-list, .v-btn.v-btn.v-btn) un !important patur tikai tur, kur bāzes komita administratora tēmas gadījums pierādīja, ka tas ir nepieciešams (menu.css aizsardzības kopa). Konvencijas, kas jūsu pašu pārrakstījumus uztur darbībā uz tā paša kaujas lauka:

  • ierobežojiet savu CSS zem .tiptapify-skin-{name} (vai formas klases) — nekad uz kailiem Vuetify iekšējiem elementiem;
  • kataloga izmēriem dodiet priekšroku tokeniem (--tf-*), pārējam — klasēm;
  • pārrakstot Vuetify komponentus, atbilstiet dubultošanai (viens .v-list-item zaudē apvalka noteikumiem).

Vizuālais līgums (piezīme līdzdalībniekiem) ​

Iebūvēto apvalku aprēķinātos stilus fiksē pamatlīmeņa datu fails src/skins/__fixtures__/skin-baseline.json (13 sadaļas × gaišs/tumšs): CSS slānis ir pabeigts, kad izmērītā matrica tam atbilst. Piezīmes par datu faila lasīšanu:

  • Hover/active izmērus nevar piespiest no lapas, tāpēc ieraksts nolasa pirmā trāpījuma CSSOM noteikuma deklarācijas tekstu katram hover selektoram un atrisina to caur zondes elementu apvalka saknē (lauks resolved) — tas ir uzvarējušā noteikuma līgums, nevis dzīvs :hover momentuzņēmums.
  • _meta.selectors.menu ieraksta selektora tekstu pirms SkinScope. Datu fails ir iesaldēts (normatīvas vērtības), tāpēc lauks ir novecojis ar nodomu; ierakstu kopa fiksē pašreizējo selektoru.
  • Datu fails savas sankcionētās izmaiņas nes _meta.notes: 2026-10-18 VBtnGroup iezīmējuma atjaunošana ar groups: 'box' atkārtoti izmērīja klasiskos groupBtn/buttonsActive bērnu pogu laukus (savienoti stūri, kaste pieder paaugstinājumam). Pastel lauki nav skarti — apzināta vizuāla izmaiņa atjaunina tikai skartās klasiskās šūnas, ieraksta piezīmi un nāk ar CHANGELOG rindu.

Skatiet arī ​

Izlaists saskaņā ar MIT licenci.