İçeriğe geç

Temalar ​

Tema (skin), düzenleyici arayüzünün tek bir görünümüdür: araç çubuğu, içindeki düğmeler ve gruplar, balon menüler, açılır menüler, diyaloglar, içeriğin etrafındaki çerçeve ve görsel seçim arayüzü. skin prop'u onu seçer:

vue
<Tiptapify skin="pastel" />

Bir skin iki şeyden oluşur: token'lar (CSS değişkenleri olarak renkler ve boyutlar) ve şekil (token'ın ifade edemediği yapısal varyantlar). İki yerleşik skin default — klasik görünüm, yükseltilmiş düğme gruplarına sahip yükseltilmiş bir araç çubuğu — ve sakin görünümlü pastel'dir. Özel skin'ler birinci sınıf desteklenir: registerSkin() ve satır içi skin nesneleri tamamen aynı mekanizmayla çözümlenir; yerleşik skin'ler de özel durum değil, kayıtlı skin'lerdir.

Terminoloji: skin ve Vuetify theme ​

  • skin — düzenleyici arayüzünün tek bir görünümü için kullanıcıya dönük terim: token'lar + biçim. Prop skin, tipler TiptapifySkin*, kayıt defteri registerSkin(), kök sınıf tiptapify-skin-{name}.
  • theme — Vuetify'ın açık/koyu temaları için ayrılmıştır. Tiptapify bileşenleri theme prop'larını Vuetify'ın geçerli tema adından alır; skin sistemi onlara hiç dokunmaz.

Birlikte çalışırlar: yerleşik token renklerinin çoğu Vuetify tema değişkenlerine başvurur (rgb(var(--v-theme-surface)), …), böylece temalar açık/koyu moda otomatik uyar. Classic sütunundaki sabit koyu hücreler — yeniden boyutlandırma tutamacı (rgba(0, 0, 0, .5/.8)), düz görsel çerçevesi, balon gölgesi ve menü/diyalog yükselti gölgeleri — bilinçlidir: klasik görünüm her iki temada da nötr koyu bir arayüz boyar ve ölçülen taban çizgi bunları sabitler. Özel bir tema tema değişkenlerine özgürce başvurabilir — token tablosuna bakın.

Kavram ​

Token'lar ​

Token, --tf-* adlı bir CSS özel özelliğidir. Katalog anahtarı, CSS son ekinin camelCase halidir: toolbarBg → --tf-toolbar-bg, dialogTitleSize → --tf-dialog-title-size. Değerler düz dizelerdir — renkler, tam kenarlık kısaltmaları, gölgeler, dolgular, yarıçaplar.

Kütüphanedeki her tema kuralı bir kez bulunur ve token'ını klasik (taban) değere eşit bir yedekle okur:

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

Çözümlenmiş bir tema yalnızca geçersiz kılmalarını değişken olarak yayımlar; CSS yedekleri tabanı taşır. Değişkenler düzenleyici köküne — ve menüler ile diyaloglar ondan dışarı ışınlandığı için, her menünün SkinScope sarmalayıcısına ve diyalog kartının kendisine — yerleşir; böylece token'lar her yüzeyi izler.

Biçim ​

Altı bayrak hangi kural kümelerinin uygulanacağını belirler; token'lar onları boyar:

bayrakdeğerlerneyi değiştirir
toolbarraised · flatVToolbar yükseltisi + iç ince çizgi yok / düz renk tonlu çubuk
groupsbox · flataraç çubuğu bölümleri yükseltilmiş VBtnGroup kutuları olarak (0.3.2 işaretlemesi: birleşik düğmeler, kutuyu grup token'ları boyar) / düz flex div dizileri
buttonsvuetify · quietyerel Vuetify düğmeleri / nötr basılı durumlu hayalet düğmeler
bubblecard · flatuyumluluk için korunur: balon menüler her iki biçimde de token ile boyanan tek sıra ikon düğmesidir (düğmeleri buttons değerini izler)
dialogclassic · softbaşlığın altında ayırıcı, yükseltilmiş kapat düğmesi / yumuşak kart, metin kapat düğmesi
menuvuetify · softaçılır menüler: Vuetify listesi / açık renkli dolgulu kart

Çözümlenen biçim, düzenleyici kökünde altı .tiptapify-shape-{flag}-{value} sınıfı olarak kodlanır ve özel araç çubuğu bileşenleri için useTiptapifyConfig() üzerinde shape: ComputedRef<ResolvedShape> olarak sunulur.

Extends ​

Bir tema önce klasik tabanın üzerinden, sonra extends zincirinden kökten başlayarak, sonra kendi üyeleriyle çözümlenir:

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

Eksik halkalar birikmiş zincire çözümlenir (geliştirme uyarısıyla); bir döngü klasiğe çözümlenir (geliştirme uyarısıyla). Kayıtlı bir tema adıyla başvurulur; satır içi bir tema nesnesi kayıtlı bir adı extends edebilir ve genel kayıt defterine hiç girmez — özel temalar düzenleyiciler arasında sızmaz. Bilinmeyen token anahtarları geliştirme uyarısıyla yok sayılır.

Üç biçimin canlı demoları Temalar örnekleri sayfasındadır.

Token kataloğu ​

Aşağıdaki tablolar v1 sözleşmesidir: katalog anahtarları (TiptapifySkinColors / TiptapifySkinMetrics) ayarlayabileceğiniz adlardır. Classic hücreleri CSS yedekleridir — hiçbir tema token'ı geçersiz kılmadığında taban kuralların boyadığı değer.

Araç çubuğu / çubuk ​

tokenCSS değişkeniclassicpastel
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))

Öğeler / gruplar / ayırıcılar ​

tokenCSS değişkeniclassicpastel
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 yükselti 2 ²none
dividerWidth--tf-divider-width0px (ara parça: margin 0 4px)1px
dividerHeight--tf-divider-height0px20px
dividerColor--tf-divider-colortransparentrgba(var(--v-border-color), var(--v-border-opacity))

¹ Ölçülen classic hücresi normal'dir — Vuetify'ın yerel flex değeri; CSS yedeğinin taşıdığı değer budur. Katalog taban değeri 0px, tema geçersiz kılmaları için eşdeğer açık uzunluktur.

² "Vuetify yükselti n" yazan hücreler açıklayıcıdır: tam üçlü gölge dizesi, işlenmiş taban çizgi fixture'ındaki (src/skins/__fixtures__/skin-baseline.json) ölçülen değerdir ve CSS yedeğidir. groupShadow için bu yükselti 2'dir (0 3px 1px -2px …, 0 2px 2px 0 …, 0 1px 5px 0 …) — groups: 'box' altında bölüm bir VBtnGroup'tur (elevation="4") ve token kuralı kutuyu grubun kendi yükseltisinin üzerine bu üçlüyle boyar: yükselti kutuya aittir, birleşik alt düğmeler yükselti taşımaz.

Düğmeler ​

Bu token'lar yalnızca buttons: 'quiet' altında kullanılır — bkz. Erişilebilirlik.

tokenCSS değişkeniquiet değeri (classic: yerel 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

Balon menüler (seçim, boş satır, görsel) ​

tokenCSS değişkeniclassicpastel
bubbleBg--tf-bubble-bgrgb(var(--v-theme-surface))aynı
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-padding4pxaynı
bubbleGap--tf-bubble-gap2pxaynı
tokenCSS değişkeniclassicpastel
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 yükselti 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)

³ Klasik menünün liste kutusu (yarıçap, gölge, liste dolgusu) bugün bir tema kuralıdır — SkinScope token sarmalayıcısı Vuetify'ın kendi alt kuralı ile liste arasında durur; bu yüzden kütüphane bu pikselleri yukarıdaki token'ları okuyan tema kuralları olarak geri yükler. Öğe pikselleri yerel Vuetify olarak kalır (fixture orada Vuetify varsayılanlarını ölçer): dört öğe token'ı menu: 'vuetify' iken etkisizdir.

Diyaloglar ​

tokenCSS değişkeniclassicpastel
dialogShadow--tf-dialog-shadowVCard yükselti ²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-radiusalan varsayılanı (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

Çerçeve (düzenleyici kenarlık sarmalayıcısı) ​

tokenCSS değişkeniclassicpastel
frameBorder--tf-frame-border1px solid rgba(var(--v-border-color), var(--v-border-opacity)), üst kenar yoktam kenarlık
frameBg--tf-frame-bgtransparentrgb(var(--v-theme-surface))
frameShadow--tf-frame-shadownone0 1px 2px rgba(0, 0, 0, 0.05)

Düz araç çubuğu biçimi altında çerçeve ayrıca kenar başına bir fark da boyar (bir üst kenar ve 1,6× kenarlık opaklığında alt kenar). Bu fark token'a değil biçime aittir: token ile erişilemez.

Görseller ve yeniden boyutlandırma tutamaçları ​

tokenCSS değişkeniclassicpastel
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) (seçili)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) (üzerine gelince)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%

Görsel araç çubuğu buttons bayrağını izler: sakin biçim altında sakin yüzeyi alır — 2px/4px boşlukları görsel menüsü yedekleriyle --tf-bubble-gap / --tf-bubble-padding değerlerini okur; ayrılmış bir görsel araç çubuğu token'ı yoktur.

Katalogda yok (kaçış yolu alanı) ​

Tasarım genel bakışında adı geçen bazı boyutların v1'de katalog token'ı yoktur: araç çubuğu yüksekliği, çerçeve genişliği, çerçeve yarıçapı, düğme genişliği, düğme dolgusu, diyalog genişliği. Yukarıdaki katalog tabloları sözleşmedir; bu pikseller için kaçış yolunu açın ve kararlı sınıfları doğrudan biçimlendirin.

Erişilebilirlik ​

Bir kez belirtilen ve yukarıdaki her grubun uyduğu sözleşme:

Bir token, bir yüzeyi yalnızca biçim o yüzeyi etkinleştirdiğinde boyar; yerel Vuetify görselleri Vuetify tema renkleriyle biçimlendirilir.

Grup başına:

  • Araç çubuğu, çerçeve, görsel/tutamaç arayüzü — her biçimde etkindir; token'lar onları boyar, classic hücreleri token'ların geri döndüğü yerel görünümdür.
  • Grup kutusu (groupBg, groupRadius, groupHeight, groupShadow) — groups: 'box' altında bölüm bir VBtnGroup'tur (0.3.2 yapısı: düğmeler birleşir, yükseltiyi kutu taşır); kutu kuralları onu grup token'larıyla boyar ve --tf-group-height, 32px sözleşmesini bir !important ile korur (Vuetify'ın yoğunluk kuralı 0.3.2'de olduğu gibi buna karşı çıkar). groups: 'flat' altında bölümler düz div dizileridir (saydam, gölgesiz, yarıçap 0 biçimin tabanıdır).
  • Ayırıcı ince çizgiler (dividerWidth/Height/Color) — görünür ince çizgi bir groups: 'flat' olanağıdır; kutu biçiminde ayırıcı sıfır boyutlu bir ara parçadır (taban kuraldan margin: 0 4px).
  • Öğe dolgusu/boşlukları — kompakt 6px 8px dizisi düz çubuğa (toolbar: 'flat'), grup boşlukları düz bölümlere (groups: 'flat') bağlıdır; yükseltilmiş çubuk klasik ölçüleri korur.
  • Düğmeler (buttonFg, buttonHover*, buttonActive*, buttonRadius) — buttons: 'vuetify' altında etkisizdir: yerel Vuetify düğmeleri kendi durumlarını boyar. Onları Vuetify tema renkleriyle (primary, surface, …) biçimlendirin — klasik biçimler bunları bilerek miras alır.
  • Menü öğesi ölçüleri (menuItemRadius/Padding/MinHeight/ActiveBg) — menu: 'vuetify' altında etkisizdir; bu öğe piksellerinin sahibi Vuetify'dır. Menü liste kutusu (yarıçap/gölge/dolgu) her iki biçimde de tema tarafından boyanır (menü notuna bakın).
  • Diyalog yumuşak arayüzü (dialogActionBtn*, dialogFieldRadius, yumuşak dolgular, eksik ayırıcı) — dialog: 'soft' altında boyanır; dialog: 'classic' altında diyalog klasik dolgulara sahip bir VCard'dır.
  • Balon arayüzü — seçim, boş satır ve görsel menüleri her iki biçimde de balon token'larıyla boyanan tek sıra ikon düğmesidir; bubble artık işaretlemelerini değiştirmez.

Katalog tabanına eşit bir geçersiz kılma yayımlanmaz — klasik olmayan bir biçim altında biçimin kendi tabanı CSS yedeğiyle boyar; bu yüzden bir klasik değeri "geri yüklemek" (örneğin buttons: 'quiet' altında buttonActiveBg değerini rgb(var(--v-theme-primary)) olarak geri ayarlamak) sessizce hiçbir şey yapmaz. Klasik olmayan bir biçim altında klasik görünümlü bir değeri zorlamak için katalog tabanından farklı bir geçersiz kılma ayarlayın — rgba(var(--v-theme-primary), 1) gibi eşdeğer bir değişmez, aynı şekilde boyar ve atlamadan kurtulur.

Token'lar yerel yollara bilerek bağlanmaz — her şey kataloğa yönlenirken default temasının klasik görünümle piksel piksel aynı kalmasını sağlayan budur.

Tarifler ​

pastel'i genişletme ​

Sakin biçimi miras alın ve birkaç yüzeyi yeniden boyayın. Kayıtlı adlar her düzenleyicide çalışır:

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

Biçim (flat/quiet/soft) pastel'den gelir; dokunulmayan token'lar pastel'in değerlerini korur — sakin düğme tonu nötr kalır, yalnızca geçersiz kıldığınız şey değişir. Bu, örnekler sayfasında canlı işlenen temadır.

default'u genişletme ​

Klasik yapıyı koruyun, boyayı ayarlayın:

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

extends: 'default' örtük köktür, bu yüzden anahtar atlanabilir: { toolbar: 'flat', … } de klasikten başlar.

Tam özel ​

extends yok, kayıt yok: nesneyi skin prop'una verin ve biçim bayraklarını ile token'ları özgürce ayarlayın. Bir name, kök sınıfa kendi etiketinizi koyar (aşağıya bakın); olmadan tiptapify-skin-inline olur.

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, tiplenmiş sabit tanımlar için bir özdeşlik yardımcısıdır (hiçbir kayıt defterine girmez). Biçim bayrakları tek tek ayarlanabilir — atladığınız her bayrak klasik kalır.

Kaçış yolu: kök sınıf ​

Her düzenleyici kökü tiptapify-skin-{name} sınıfını taşır (adsız satır içi bir nesne için tiptapify-skin-inline). Kütüphane hiçbir kuralı bir tema adına bağlamaz — sınıf sizindir:

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

Üzerine yazı yazılabilecek kararlı kancalar:

sınıfnerede
tiptapify-skin-{name}düzenleyici kökü
tiptapify-shape-{flag}-{value} ×6düzenleyici kökü — çözümlenen biçim
tiptapify-toolbar · tiptapify-toolbar-items · tiptapify-toolbar-group · menu-divideraraç çubuğu ve bölümleri
tiptapify-quiet-buttonsbuttons: 'quiet' altında araç çubuğu ve balon kökleri
tiptapify-bubble-row · tiptapify-bubble-dividerher balon menünün satırı ve grupları arasındaki ince çizgi
tiptapify-bubble-menu · floating-menu · tiptapify-image-menuseçim, boş satır ve görsel menüsü satırları
tiptapify-btn--activebir balon menünün basılı düğmesi (etkin bir işaret, görsel yüzdürme)
tiptapify-menu · tiptapify-menu--softaçılır menü katman içeriği, yumuşak menü kurallarının taşıyıcısı
tiptapify-skin-scopeışınlanan menülerin içindeki token kapsam div'i
tiptapify-dialog · tiptapify-dialog--softdiyalog kartı ve yumuşak taşıyıcısı
tiptapify-framedüzenleyici kenarlık sarmalayıcısı

Tüketici teması savunması. Tema katmanı, Vuetify iç yapılarına dolgu ekleyen ve onları yeniden boyayan yönetici temalarından sağ çıkacak şekilde tasarlanmıştır: kurallar biçim/taşıyıcı sınıflarına bağlanır, özgüllük için ikiye katlanmış sınıflar (.v-list.v-list, .v-btn.v-btn.v-btn) kullanır ve !important değerini yalnızca temel commit'in yönetici teması durumunun gerekli olduğunu kanıtladığı yerde (menu.css savunma kümesi) tutar. Kendi geçersiz kılmalarınızın aynı savaş alanında çalışmaya devam etmesini sağlayan kurallar:

  • CSS'inizi .tiptapify-skin-{name} (veya bir biçim sınıfı) altında kapsamlandırın — çıplak Vuetify iç yapılarına asla uygulamayın;
  • katalog boyutları için token'ları (--tf-*), geri kalanı için sınıfları tercih edin;
  • Vuetify bileşenlerini geçersiz kılarken ikiye katlamayı eşleştirin (tek bir .v-list-item, tema kurallarına yenilir).

Görsel sözleşme (katkıda bulunanlar için not) ​

Yerleşik temaların hesaplanmış stilleri src/skins/__fixtures__/skin-baseline.json taban çizgi fixture'ı ile sabitlenir (13 bölüm × açık/koyu): ölçülen matris onunla eşleştiğinde CSS katmanı tamamdır. Fixture için okuma notları:

  • Üzerine gelme/etkin boyutlar sayfadan zorlanamaz, bu yüzden kayıt her üzerine gelme seçicisi için ilk eşleşen CSSOM kuralının bildirim metnini okur ve onu tema kökü içindeki bir prob öğesi üzerinden çözümler (resolved alanı) — canlı bir :hover anlık görüntüsü değil, kazanan kuralın sözleşmesidir.
  • _meta.selectors.menu, SkinScope öncesi seçici metnini kaydeder. Fixture dondurulmuştur (normatif değerler), bu yüzden alan bilerek eskidir; kayıt paketi güncel seçiciyi sabitler.
  • Fixture onaylanmış değişikliklerini _meta.notes içinde taşır: groups: 'box' altında VBtnGroup işaretlemesinin 18.10.2026'daki geri yüklenmesi, klasik groupBtn/buttonsActive alt düğme alanlarını yeniden ölçtü (birleşik köşeler, yükseltiyi kutu taşır). Pastel alanlarına dokunulmamıştır — bilinçli bir görsel değişiklik yalnızca etkilenen classic hücrelerini günceller, bir not kaydeder ve bir CHANGELOG satırıyla yayımlanır.

Ayrıca bakın ​

MIT Lisansı altında yayımlanmıştır.