sv5ui 1.7.0 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/dist/Banner/Banner.svelte +162 -0
  2. package/dist/Banner/Banner.svelte.d.ts +5 -0
  3. package/dist/Banner/banner.types.d.ts +148 -0
  4. package/dist/Banner/banner.types.js +1 -0
  5. package/dist/Banner/banner.variants.d.ts +293 -0
  6. package/dist/Banner/banner.variants.js +86 -0
  7. package/dist/Banner/index.d.ts +2 -0
  8. package/dist/Banner/index.js +1 -0
  9. package/dist/Editor/Editor.svelte +738 -0
  10. package/dist/Editor/Editor.svelte.d.ts +6 -0
  11. package/dist/Editor/EditorUrlPrompt.svelte +111 -0
  12. package/dist/Editor/EditorUrlPrompt.svelte.d.ts +15 -0
  13. package/dist/Editor/SlashPopup.svelte +67 -0
  14. package/dist/Editor/SlashPopup.svelte.d.ts +9 -0
  15. package/dist/Editor/editor.extensions.d.ts +23 -0
  16. package/dist/Editor/editor.extensions.js +123 -0
  17. package/dist/Editor/editor.schemas.d.ts +4 -0
  18. package/dist/Editor/editor.schemas.js +3 -0
  19. package/dist/Editor/editor.slash.svelte.d.ts +34 -0
  20. package/dist/Editor/editor.slash.svelte.js +273 -0
  21. package/dist/Editor/editor.suggestion.d.ts +7 -0
  22. package/dist/Editor/editor.suggestion.js +142 -0
  23. package/dist/Editor/editor.toolbar.d.ts +11 -0
  24. package/dist/Editor/editor.toolbar.js +212 -0
  25. package/dist/Editor/editor.types.d.ts +347 -0
  26. package/dist/Editor/editor.types.js +1 -0
  27. package/dist/Editor/editor.variants.d.ts +308 -0
  28. package/dist/Editor/editor.variants.js +150 -0
  29. package/dist/Editor/index.d.ts +53 -0
  30. package/dist/Editor/index.js +52 -0
  31. package/dist/Stepper/Stepper.svelte +292 -0
  32. package/dist/Stepper/Stepper.svelte.d.ts +5 -0
  33. package/dist/Stepper/index.d.ts +2 -0
  34. package/dist/Stepper/index.js +1 -0
  35. package/dist/Stepper/stepper.types.d.ts +223 -0
  36. package/dist/Stepper/stepper.types.js +1 -0
  37. package/dist/Stepper/stepper.variants.d.ts +428 -0
  38. package/dist/Stepper/stepper.variants.js +204 -0
  39. package/dist/index.d.ts +2 -0
  40. package/dist/index.js +2 -0
  41. package/package.json +97 -1
@@ -0,0 +1,347 @@
1
+ import type { Snippet } from 'svelte';
2
+ import type { HTMLAttributes } from 'svelte/elements';
3
+ import type { ClassNameValue } from 'tailwind-merge';
4
+ import type { AnyExtension, Editor as TiptapEditor } from '@tiptap/core';
5
+ import type { EditorVariantProps, EditorSlots } from './editor.variants.js';
6
+ /**
7
+ * Tiptap's structural JSON document. Re-exported so consumers don't need a
8
+ * direct `@tiptap/core` dependency just to type their state.
9
+ */
10
+ export interface EditorJSON {
11
+ type: string;
12
+ attrs?: Record<string, unknown>;
13
+ content?: EditorJSON[];
14
+ marks?: {
15
+ type: string;
16
+ attrs?: Record<string, unknown>;
17
+ }[];
18
+ text?: string;
19
+ }
20
+ /**
21
+ * Serialization format for the bindable `value`.
22
+ * - `'html'` — string of HTML (e.g. `<p><strong>Hi</strong></p>`)
23
+ * - `'json'` — Tiptap structured document
24
+ * - `'markdown'` — Markdown string (via `tiptap-markdown` extension)
25
+ */
26
+ export type EditorOutput = 'html' | 'json' | 'markdown';
27
+ /**
28
+ * Item shown in the mention suggestion popup. The `id` is what gets stored
29
+ * (e.g. user id); `label` is the visible name displayed inline.
30
+ */
31
+ export interface MentionItem {
32
+ id: string;
33
+ label: string;
34
+ /** Optional avatar URL or icon name for the suggestion item. */
35
+ avatar?: string;
36
+ /** Free-form metadata available in `attrs.data`. */
37
+ data?: Record<string, unknown>;
38
+ }
39
+ /**
40
+ * A single command that appears in the slash menu (triggered by typing `/`).
41
+ *
42
+ * @example
43
+ * ```ts
44
+ * const heading1: SlashCommand = {
45
+ * id: 'h1',
46
+ * label: 'Heading 1',
47
+ * description: 'Big section heading',
48
+ * icon: 'lucide:heading-1',
49
+ * keywords: ['h1', 'header', 'title'],
50
+ * run: ({ editor }) => editor.chain().focus().toggleHeading({ level: 1 }).run()
51
+ * }
52
+ * ```
53
+ */
54
+ export interface SlashCommand {
55
+ /** Unique key for this command. */
56
+ id: string;
57
+ /** Display name in the suggestion popup. */
58
+ label: string;
59
+ /** Optional second-line subtitle. */
60
+ description?: string;
61
+ /** Iconify icon name. */
62
+ icon?: string;
63
+ /** Extra terms used for fuzzy matching. */
64
+ keywords?: string[];
65
+ /**
66
+ * Invoked when the user picks this item. Receives the editor instance —
67
+ * use Tiptap chains to mutate content. Trigger range is auto-removed
68
+ * before this fires.
69
+ */
70
+ run: (props: {
71
+ editor: TiptapEditor;
72
+ }) => void;
73
+ }
74
+ /**
75
+ * Built-in toolbar action ids. Use these in the `toolbar` prop to pick
76
+ * which buttons appear and in what order. Use `'|'` for vertical separators.
77
+ *
78
+ * @example
79
+ * ```svelte
80
+ * <Editor toolbar={['bold', 'italic', '|', 'h1', 'h2', '|', 'link']} />
81
+ * ```
82
+ */
83
+ export type ToolbarAction = 'bold' | 'italic' | 'underline' | 'strike' | 'code' | 'h1' | 'h2' | 'h3' | 'paragraph' | 'bulletList' | 'orderedList' | 'blockquote' | 'codeBlock' | 'horizontalRule' | 'link' | 'unlink' | 'alignLeft' | 'alignCenter' | 'alignRight' | 'alignJustify' | 'undo' | 'redo' | 'clearFormatting' | 'image' | 'table' | 'youtube';
84
+ /** Vertical divider between toolbar groups. */
85
+ export type ToolbarSeparator = '|';
86
+ /**
87
+ * Toolbar configuration.
88
+ * - `true` — show the default toolbar (most common actions)
89
+ * - `false` — hide the toolbar entirely (useful when only `bubbleMenu` is needed)
90
+ * - `(ToolbarAction | '|')[]` — explicit ordered list of actions and separators
91
+ */
92
+ export type ToolbarConfig = boolean | (ToolbarAction | ToolbarSeparator)[];
93
+ /**
94
+ * Snapshot of editor state, kept in sync with Tiptap's internal state via
95
+ * reactive runes. Safe to read inside `$derived` / template — re-evaluates
96
+ * on every selection / transaction.
97
+ */
98
+ export interface EditorReactiveState {
99
+ /**
100
+ * Which marks / nodes / alignments are active at the current selection.
101
+ * Actions without a meaningful "active" state (e.g. `horizontalRule`,
102
+ * `clearFormatting`, `unlink`, `undo`, `redo`) are omitted.
103
+ */
104
+ active: Partial<Record<ToolbarAction, boolean>>;
105
+ /** Whether each command is currently runnable. */
106
+ can: {
107
+ undo: boolean;
108
+ redo: boolean;
109
+ };
110
+ /** Total character count (from `@tiptap/extension-character-count`). */
111
+ charCount: number;
112
+ /** Total word count. */
113
+ wordCount: number;
114
+ /** Whether the document is currently empty (no meaningful content). */
115
+ isEmpty: boolean;
116
+ /** Whether the editor currently has focus. */
117
+ isFocused: boolean;
118
+ }
119
+ /**
120
+ * Imperative API exposed via `bind:api`. Lets a parent component drive the
121
+ * editor (focus, run commands, set content) without re-implementing Tiptap
122
+ * command chains.
123
+ *
124
+ * @example
125
+ * ```svelte
126
+ * <script>
127
+ * let api = $state<EditorApi>()
128
+ * </script>
129
+ *
130
+ * <Editor bind:api bind:value />
131
+ * <Button onclick={() => api?.run('bold')}>Toggle bold</Button>
132
+ * <Button onclick={() => api?.clear()}>Clear</Button>
133
+ * ```
134
+ */
135
+ export interface EditorApi {
136
+ /** The underlying Tiptap editor instance — `null` until mounted client-side. */
137
+ readonly editor: TiptapEditor | null;
138
+ /** Reactive snapshot of editor state. Re-reads automatically. */
139
+ readonly state: EditorReactiveState;
140
+ /** Focus the editor. Optional positioning: `'start'`, `'end'`, or a numeric position. */
141
+ focus: (position?: 'start' | 'end' | number) => void;
142
+ /** Run a built-in toolbar action by id (bypasses any disabled state). */
143
+ run: (action: ToolbarAction) => void;
144
+ /** Serialize current content. Format defaults to the component's `output` prop. */
145
+ getValue: (format?: EditorOutput) => string | EditorJSON;
146
+ /** Replace content programmatically. Does NOT fire `onValueChange`. */
147
+ setValue: (value: string | EditorJSON) => void;
148
+ /** Empty the document. */
149
+ clear: () => void;
150
+ /** Insert content at the current selection. */
151
+ insert: (content: string | EditorJSON) => void;
152
+ }
153
+ /**
154
+ * Props for the Editor component (sub-export `sv5ui/editor`).
155
+ *
156
+ * Rich-text WYSIWYG editor built on Tiptap v3 + ProseMirror. Renders a
157
+ * toolbar (configurable or hidden) and a content area. Bindable `value` in
158
+ * HTML or JSON format. Imperative control via `bind:api`.
159
+ *
160
+ * @remarks
161
+ * Extension config props (`image`, `tables`, `youtube`, `dragHandle`,
162
+ * `bubbleMenu`, `headingLevels`, `placeholder`, `maxLength`, `autolink`,
163
+ * `linkOpenInNewTab`, `mentionTrigger`, `slash`, `slashTrigger`, `extensions`,
164
+ * `extensionsOverride`, `output`) are read once at mount. Changing them
165
+ * after mount does NOT rebuild the editor. To switch configurations, key
166
+ * the `<Editor>` on the relevant prop so Svelte recreates it.
167
+ *
168
+ * @example
169
+ * ```svelte
170
+ * <script>
171
+ * import { Editor } from 'sv5ui/editor'
172
+ * let content = $state('<p>Start writing…</p>')
173
+ * </script>
174
+ *
175
+ * <Editor bind:value={content} placeholder="Write something…" />
176
+ * ```
177
+ */
178
+ export interface EditorProps extends Omit<HTMLAttributes<HTMLElement>, 'class' | 'autofocus' | 'id'> {
179
+ /** Bindable reference to the root DOM element. */
180
+ ref?: HTMLElement | null;
181
+ /** Bindable imperative controller. */
182
+ api?: EditorApi;
183
+ /**
184
+ * `id` applied to the inner contenteditable element so an enclosing
185
+ * `<FormField>` label can target it via `for=`. When inside a FormField,
186
+ * this defaults to the FormField's `ariaId` automatically.
187
+ */
188
+ id?: string;
189
+ /**
190
+ * Form field name. When inside a `<FormField>`, defaults to the
191
+ * FormField's `name`.
192
+ */
193
+ name?: string;
194
+ /**
195
+ * Bindable content. The runtime type depends on `output`:
196
+ * - `output: 'html'` (default) → `string` of HTML
197
+ * - `output: 'json'` → `EditorJSON` document
198
+ */
199
+ value?: string | EditorJSON;
200
+ /**
201
+ * Serialization format used for `value` and `onValueChange`.
202
+ * @default 'html'
203
+ */
204
+ output?: EditorOutput;
205
+ /**
206
+ * Allow raw HTML inside Markdown input/output. Off by default — raw HTML
207
+ * is escaped on serialize and stripped on parse. Turn on only when you
208
+ * trust the source and your downstream renderer sanitizes HTML.
209
+ *
210
+ * Only applies when `output: 'markdown'`.
211
+ * @default false
212
+ */
213
+ markdownAllowHtml?: boolean;
214
+ /** Placeholder shown when the editor is empty. */
215
+ placeholder?: string;
216
+ /** Fired on content change. Receives the serialized value. */
217
+ onValueChange?: (value: string | EditorJSON) => void;
218
+ /** Fired when the editor gains focus. */
219
+ onFocus?: () => void;
220
+ /** Fired when the editor loses focus. */
221
+ onBlur?: () => void;
222
+ /** Render content but disable editing. @default false */
223
+ readonly?: boolean;
224
+ /** Visually disable and prevent editing. @default false */
225
+ disabled?: boolean;
226
+ /** Focus the editor on mount. Pass position to control caret placement. @default false */
227
+ autofocus?: boolean | 'start' | 'end' | number;
228
+ /** Hard cap on character count (enforced via `@tiptap/extension-character-count`). */
229
+ maxLength?: number;
230
+ /** Show character/word counter in the footer. @default false */
231
+ showCount?: boolean;
232
+ /**
233
+ * Toolbar config. Pass `true` for default, `false` to hide, or an array
234
+ * of action ids + `'|'` separators for explicit control.
235
+ * @default true
236
+ */
237
+ toolbar?: ToolbarConfig;
238
+ /** Stick the toolbar to the top of the editor on scroll. @default false */
239
+ stickyToolbar?: boolean;
240
+ /** Show a floating bubble menu on text selection. @default false */
241
+ bubbleMenu?: boolean;
242
+ /** Which heading levels to support. @default [1, 2, 3] */
243
+ headingLevels?: (1 | 2 | 3 | 4 | 5 | 6)[];
244
+ /** Auto-detect URLs as you type. @default true */
245
+ autolink?: boolean;
246
+ /** Open links in new tab in readonly mode. @default true */
247
+ linkOpenInNewTab?: boolean;
248
+ /**
249
+ * Enable image insertion. Adds the `image` toolbar action (opens a file
250
+ * picker). Also accepts pasted/dropped image files when `onImageUpload`
251
+ * is provided.
252
+ * @default false
253
+ */
254
+ image?: boolean;
255
+ /**
256
+ * Async upload handler. Called with the selected/pasted/dropped file;
257
+ * must return the resolved URL to insert as `<img src=...>`. When
258
+ * omitted and `image` is `true`, images can only be inserted via URL
259
+ * prompt (toolbar).
260
+ */
261
+ onImageUpload?: (file: File) => Promise<string>;
262
+ /**
263
+ * Enable tables. Adds the `table` toolbar action which opens a
264
+ * dimension picker (rows × columns) and inserts a new table.
265
+ * @default false
266
+ */
267
+ tables?: boolean;
268
+ /**
269
+ * Enable slash commands. Typing `/` (or `slashTrigger`) opens a command
270
+ * palette with built-in actions (headings, lists, blockquote, code block,
271
+ * horizontal rule, plus image/table/youtube if their respective flags are
272
+ * enabled). Extend or replace via `slashCommands`.
273
+ * @default false
274
+ */
275
+ slash?: boolean;
276
+ /**
277
+ * Customize the slash command list. When provided, replaces the default
278
+ * commands entirely. Use spread + `buildDefaultSlashCommands(opts)` to
279
+ * extend rather than replace.
280
+ */
281
+ slashCommands?: SlashCommand[];
282
+ /**
283
+ * Trigger character for the slash menu.
284
+ * @default '/'
285
+ */
286
+ slashTrigger?: string;
287
+ /**
288
+ * Enable YouTube video embeds. Adds a `youtube` toolbar action that
289
+ * prompts for a video URL and inserts a responsive embed.
290
+ * @default false
291
+ */
292
+ youtube?: boolean;
293
+ /**
294
+ * Show a drag handle on the left side of each block when hovered. Lets
295
+ * users reorder paragraphs, headings, lists, tables, etc. by drag-and-drop.
296
+ * @default false
297
+ */
298
+ dragHandle?: boolean;
299
+ /**
300
+ * Async lookup for `@`-style mentions. When provided, typing `@` opens
301
+ * a suggestion popup. Receives the current query string after `@`;
302
+ * must return matching items.
303
+ */
304
+ onMention?: (query: string) => Promise<MentionItem[]>;
305
+ /**
306
+ * Trigger character for the suggestion popup.
307
+ * @default '@'
308
+ */
309
+ mentionTrigger?: string;
310
+ /**
311
+ * Append custom Tiptap extensions on top of the built-in set. Use this to
312
+ * add features beyond the defaults (e.g. images, tables, mentions).
313
+ */
314
+ extensions?: AnyExtension[];
315
+ /**
316
+ * Replace the entire extension array. When provided, `headingLevels`,
317
+ * `autolink`, `placeholder`, etc. are ignored — bring your own
318
+ * configuration.
319
+ */
320
+ extensionsOverride?: AnyExtension[];
321
+ /** @default 'md' */
322
+ size?: NonNullable<EditorVariantProps['size']>;
323
+ /** Focus ring color. @default 'primary' */
324
+ color?: NonNullable<EditorVariantProps['color']>;
325
+ class?: ClassNameValue;
326
+ ui?: Partial<Record<EditorSlots, ClassNameValue>>;
327
+ /**
328
+ * Replace the entire toolbar. Receives reactive state + api for full
329
+ * control over button rendering and command dispatch.
330
+ */
331
+ toolbarSlot?: Snippet<[{
332
+ state: EditorReactiveState;
333
+ api: EditorApi;
334
+ }]>;
335
+ /**
336
+ * Replace bubble menu content. Only rendered when `bubbleMenu={true}`.
337
+ * Receives reactive state + api.
338
+ */
339
+ bubbleMenuSlot?: Snippet<[{
340
+ state: EditorReactiveState;
341
+ api: EditorApi;
342
+ }]>;
343
+ /** Custom content rendered between the toolbar and the content area. */
344
+ header?: Snippet;
345
+ /** Custom content rendered below the content area (overrides the count footer). */
346
+ footer?: Snippet;
347
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,308 @@
1
+ import { type VariantProps } from 'tailwind-variants';
2
+ export declare const editorVariants: import("tailwind-variants").TVReturnType<{
3
+ size: {
4
+ sm: {
5
+ toolbarButton: string;
6
+ content: string;
7
+ footer: string;
8
+ };
9
+ md: {
10
+ toolbarButton: string;
11
+ content: string;
12
+ footer: string;
13
+ };
14
+ lg: {
15
+ toolbarButton: string;
16
+ content: string;
17
+ footer: string;
18
+ };
19
+ };
20
+ color: {
21
+ primary: {
22
+ root: string;
23
+ };
24
+ secondary: {
25
+ root: string;
26
+ };
27
+ tertiary: {
28
+ root: string;
29
+ };
30
+ success: {
31
+ root: string;
32
+ };
33
+ warning: {
34
+ root: string;
35
+ };
36
+ error: {
37
+ root: string;
38
+ };
39
+ info: {
40
+ root: string;
41
+ };
42
+ surface: {
43
+ root: string;
44
+ };
45
+ };
46
+ sticky: {
47
+ true: {
48
+ toolbar: string;
49
+ };
50
+ false: string;
51
+ };
52
+ }, {
53
+ root: string[];
54
+ toolbar: string[];
55
+ toolbarGroup: string;
56
+ toolbarButton: string[];
57
+ toolbarSeparator: string;
58
+ content: string[];
59
+ footer: string[];
60
+ countLabel: string;
61
+ bubbleMenu: string[];
62
+ }, undefined, {
63
+ size: {
64
+ sm: {
65
+ toolbarButton: string;
66
+ content: string;
67
+ footer: string;
68
+ };
69
+ md: {
70
+ toolbarButton: string;
71
+ content: string;
72
+ footer: string;
73
+ };
74
+ lg: {
75
+ toolbarButton: string;
76
+ content: string;
77
+ footer: string;
78
+ };
79
+ };
80
+ color: {
81
+ primary: {
82
+ root: string;
83
+ };
84
+ secondary: {
85
+ root: string;
86
+ };
87
+ tertiary: {
88
+ root: string;
89
+ };
90
+ success: {
91
+ root: string;
92
+ };
93
+ warning: {
94
+ root: string;
95
+ };
96
+ error: {
97
+ root: string;
98
+ };
99
+ info: {
100
+ root: string;
101
+ };
102
+ surface: {
103
+ root: string;
104
+ };
105
+ };
106
+ sticky: {
107
+ true: {
108
+ toolbar: string;
109
+ };
110
+ false: string;
111
+ };
112
+ }, {
113
+ root: string[];
114
+ toolbar: string[];
115
+ toolbarGroup: string;
116
+ toolbarButton: string[];
117
+ toolbarSeparator: string;
118
+ content: string[];
119
+ footer: string[];
120
+ countLabel: string;
121
+ bubbleMenu: string[];
122
+ }, import("tailwind-variants").TVReturnType<{
123
+ size: {
124
+ sm: {
125
+ toolbarButton: string;
126
+ content: string;
127
+ footer: string;
128
+ };
129
+ md: {
130
+ toolbarButton: string;
131
+ content: string;
132
+ footer: string;
133
+ };
134
+ lg: {
135
+ toolbarButton: string;
136
+ content: string;
137
+ footer: string;
138
+ };
139
+ };
140
+ color: {
141
+ primary: {
142
+ root: string;
143
+ };
144
+ secondary: {
145
+ root: string;
146
+ };
147
+ tertiary: {
148
+ root: string;
149
+ };
150
+ success: {
151
+ root: string;
152
+ };
153
+ warning: {
154
+ root: string;
155
+ };
156
+ error: {
157
+ root: string;
158
+ };
159
+ info: {
160
+ root: string;
161
+ };
162
+ surface: {
163
+ root: string;
164
+ };
165
+ };
166
+ sticky: {
167
+ true: {
168
+ toolbar: string;
169
+ };
170
+ false: string;
171
+ };
172
+ }, {
173
+ root: string[];
174
+ toolbar: string[];
175
+ toolbarGroup: string;
176
+ toolbarButton: string[];
177
+ toolbarSeparator: string;
178
+ content: string[];
179
+ footer: string[];
180
+ countLabel: string;
181
+ bubbleMenu: string[];
182
+ }, undefined, unknown, unknown, undefined>>;
183
+ export type EditorVariantProps = VariantProps<typeof editorVariants>;
184
+ export type EditorSlots = keyof ReturnType<typeof editorVariants>;
185
+ export declare const editorDefaults: {
186
+ defaultVariants: import("tailwind-variants").TVDefaultVariants<{
187
+ size: {
188
+ sm: {
189
+ toolbarButton: string;
190
+ content: string;
191
+ footer: string;
192
+ };
193
+ md: {
194
+ toolbarButton: string;
195
+ content: string;
196
+ footer: string;
197
+ };
198
+ lg: {
199
+ toolbarButton: string;
200
+ content: string;
201
+ footer: string;
202
+ };
203
+ };
204
+ color: {
205
+ primary: {
206
+ root: string;
207
+ };
208
+ secondary: {
209
+ root: string;
210
+ };
211
+ tertiary: {
212
+ root: string;
213
+ };
214
+ success: {
215
+ root: string;
216
+ };
217
+ warning: {
218
+ root: string;
219
+ };
220
+ error: {
221
+ root: string;
222
+ };
223
+ info: {
224
+ root: string;
225
+ };
226
+ surface: {
227
+ root: string;
228
+ };
229
+ };
230
+ sticky: {
231
+ true: {
232
+ toolbar: string;
233
+ };
234
+ false: string;
235
+ };
236
+ }, {
237
+ root: string[];
238
+ toolbar: string[];
239
+ toolbarGroup: string;
240
+ toolbarButton: string[];
241
+ toolbarSeparator: string;
242
+ content: string[];
243
+ footer: string[];
244
+ countLabel: string;
245
+ bubbleMenu: string[];
246
+ }, {
247
+ size: {
248
+ sm: {
249
+ toolbarButton: string;
250
+ content: string;
251
+ footer: string;
252
+ };
253
+ md: {
254
+ toolbarButton: string;
255
+ content: string;
256
+ footer: string;
257
+ };
258
+ lg: {
259
+ toolbarButton: string;
260
+ content: string;
261
+ footer: string;
262
+ };
263
+ };
264
+ color: {
265
+ primary: {
266
+ root: string;
267
+ };
268
+ secondary: {
269
+ root: string;
270
+ };
271
+ tertiary: {
272
+ root: string;
273
+ };
274
+ success: {
275
+ root: string;
276
+ };
277
+ warning: {
278
+ root: string;
279
+ };
280
+ error: {
281
+ root: string;
282
+ };
283
+ info: {
284
+ root: string;
285
+ };
286
+ surface: {
287
+ root: string;
288
+ };
289
+ };
290
+ sticky: {
291
+ true: {
292
+ toolbar: string;
293
+ };
294
+ false: string;
295
+ };
296
+ }, {
297
+ root: string[];
298
+ toolbar: string[];
299
+ toolbarGroup: string;
300
+ toolbarButton: string[];
301
+ toolbarSeparator: string;
302
+ content: string[];
303
+ footer: string[];
304
+ countLabel: string;
305
+ bubbleMenu: string[];
306
+ }>;
307
+ slots: Partial<Record<EditorSlots, string>>;
308
+ };