@lyfie/luthor 2.2.0 → 2.3.1
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.
- package/README.md +228 -475
- package/dist/ExtensiveEditor-Cn84lsVT.d.ts +448 -0
- package/dist/index-BtdZVw3X.d.ts +17 -0
- package/dist/index-DFnca6tP.d.ts +30 -0
- package/dist/index.css +1 -1
- package/dist/index.d.ts +203 -53
- package/dist/index.js +3 -16
- package/dist/presets/chat-window/index.css +1 -0
- package/dist/presets/chat-window/index.d.ts +22 -0
- package/dist/presets/chat-window/index.js +3 -0
- package/dist/presets/email-compose/index.css +1 -0
- package/dist/presets/email-compose/index.d.ts +17 -0
- package/dist/presets/email-compose/index.js +3 -0
- package/dist/presets/extensive/index.css +1 -0
- package/dist/presets/extensive/index.d.ts +5 -0
- package/dist/presets/extensive/index.js +3 -0
- package/dist/presets/headless-editor/index.css +1 -0
- package/dist/presets/headless-editor/index.d.ts +13 -0
- package/dist/presets/headless-editor/index.js +1 -0
- package/dist/presets/md-text/index.css +1 -0
- package/dist/presets/md-text/index.d.ts +15 -0
- package/dist/presets/md-text/index.js +3 -0
- package/dist/presets/notes/index.css +1 -0
- package/dist/presets/notes/index.d.ts +21 -0
- package/dist/presets/notes/index.js +3 -0
- package/dist/presets/notion-like/index.css +1 -0
- package/dist/presets/notion-like/index.d.ts +17 -0
- package/dist/presets/notion-like/index.js +3 -0
- package/dist/presets/rich-text-box/index.css +1 -0
- package/dist/presets/rich-text-box/index.d.ts +17 -0
- package/dist/presets/rich-text-box/index.js +3 -0
- package/dist/presets/simple-text/index.css +1 -0
- package/dist/presets/simple-text/index.d.ts +15 -0
- package/dist/presets/simple-text/index.js +3 -0
- package/package.json +76 -20
|
@@ -0,0 +1,448 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { LuthorEditorThemeOverrides, CommandPaletteItem, SlashCommandItem, FontFamilyOption, FontSizeOption, LineHeightOption, CodeHighlightProvider, CodeLanguageOptionsConfig, LuthorTheme } from '@lyfie/luthor-headless';
|
|
3
|
+
|
|
4
|
+
type CoreTheme = "light" | "dark";
|
|
5
|
+
type CoreEditorMode = "visual" | "jsonb";
|
|
6
|
+
declare const BLOCK_HEADING_LEVELS: readonly ["h1", "h2", "h3", "h4", "h5", "h6"];
|
|
7
|
+
type BlockHeadingLevel = (typeof BLOCK_HEADING_LEVELS)[number];
|
|
8
|
+
type BlockFormat = "p" | BlockHeadingLevel;
|
|
9
|
+
type ImageAlignment = "left" | "center" | "right" | "none";
|
|
10
|
+
type TextAlignment = "left" | "center" | "right" | "justify";
|
|
11
|
+
interface InsertTableConfig {
|
|
12
|
+
rows?: number;
|
|
13
|
+
columns?: number;
|
|
14
|
+
includeHeaders?: boolean;
|
|
15
|
+
}
|
|
16
|
+
interface InsertImageConfig {
|
|
17
|
+
src: string;
|
|
18
|
+
alt: string;
|
|
19
|
+
caption?: string;
|
|
20
|
+
file?: File;
|
|
21
|
+
}
|
|
22
|
+
interface CoreEditorCommands {
|
|
23
|
+
toggleBold: () => void;
|
|
24
|
+
toggleItalic: () => void;
|
|
25
|
+
toggleUnderline: () => void;
|
|
26
|
+
toggleStrikethrough: () => void;
|
|
27
|
+
formatText: (format: "code") => void;
|
|
28
|
+
setFontFamily?: (fontValue: string) => void;
|
|
29
|
+
clearFontFamily?: () => void;
|
|
30
|
+
getCurrentFontFamily?: () => Promise<string | null>;
|
|
31
|
+
getFontFamilyOptions?: () => readonly {
|
|
32
|
+
value: string;
|
|
33
|
+
label: string;
|
|
34
|
+
fontFamily: string;
|
|
35
|
+
cssImportUrl?: string;
|
|
36
|
+
}[];
|
|
37
|
+
setFontSize?: (fontSizeValue: string) => void;
|
|
38
|
+
clearFontSize?: () => void;
|
|
39
|
+
getCurrentFontSize?: () => Promise<string | null>;
|
|
40
|
+
getFontSizeOptions?: () => readonly {
|
|
41
|
+
value: string;
|
|
42
|
+
label: string;
|
|
43
|
+
fontSize: string;
|
|
44
|
+
}[];
|
|
45
|
+
setLineHeight?: (lineHeightValue: string) => void;
|
|
46
|
+
clearLineHeight?: () => void;
|
|
47
|
+
getCurrentLineHeight?: () => Promise<string | null>;
|
|
48
|
+
getLineHeightOptions?: () => readonly {
|
|
49
|
+
value: string;
|
|
50
|
+
label: string;
|
|
51
|
+
lineHeight: string;
|
|
52
|
+
}[];
|
|
53
|
+
setTextColor?: (colorValue: string) => void;
|
|
54
|
+
clearTextColor?: () => void;
|
|
55
|
+
getCurrentTextColor?: () => Promise<string | null>;
|
|
56
|
+
getTextColorOptions?: () => readonly {
|
|
57
|
+
value: string;
|
|
58
|
+
label: string;
|
|
59
|
+
color: string;
|
|
60
|
+
}[];
|
|
61
|
+
setTextHighlight?: (highlightValue: string) => void;
|
|
62
|
+
clearTextHighlight?: () => void;
|
|
63
|
+
getCurrentTextHighlight?: () => Promise<string | null>;
|
|
64
|
+
getTextHighlightOptions?: () => readonly {
|
|
65
|
+
value: string;
|
|
66
|
+
label: string;
|
|
67
|
+
backgroundColor: string;
|
|
68
|
+
}[];
|
|
69
|
+
toggleSubscript?: () => void;
|
|
70
|
+
toggleSuperscript?: () => void;
|
|
71
|
+
insertLink: () => void;
|
|
72
|
+
updateLink?: (url: string, rel?: string, target?: string) => boolean;
|
|
73
|
+
removeLink: () => void;
|
|
74
|
+
getCurrentLink?: () => Promise<{
|
|
75
|
+
url: string;
|
|
76
|
+
rel: string | null;
|
|
77
|
+
target: string | null;
|
|
78
|
+
} | null>;
|
|
79
|
+
getLinkByKey?: (linkNodeKey: string) => Promise<{
|
|
80
|
+
url: string;
|
|
81
|
+
rel: string | null;
|
|
82
|
+
target: string | null;
|
|
83
|
+
} | null>;
|
|
84
|
+
updateLinkByKey?: (linkNodeKey: string, url: string, rel?: string, target?: string) => boolean;
|
|
85
|
+
removeLinkByKey?: (linkNodeKey: string) => boolean;
|
|
86
|
+
toggleParagraph: () => void;
|
|
87
|
+
toggleHeading: (heading: BlockHeadingLevel) => void;
|
|
88
|
+
toggleQuote: () => void;
|
|
89
|
+
setTextAlignment: (alignment: TextAlignment) => void;
|
|
90
|
+
toggleCodeBlock: () => void;
|
|
91
|
+
setCodeLanguage?: (language: string) => void;
|
|
92
|
+
autoDetectCodeLanguage?: () => Promise<string | null>;
|
|
93
|
+
getCurrentCodeLanguage?: () => Promise<string | null>;
|
|
94
|
+
getCodeLanguageOptions?: () => string[];
|
|
95
|
+
copySelectedCodeBlock?: () => Promise<boolean>;
|
|
96
|
+
toggleUnorderedList: () => void;
|
|
97
|
+
toggleOrderedList: () => void;
|
|
98
|
+
toggleCheckList: () => void;
|
|
99
|
+
indentList: () => void;
|
|
100
|
+
outdentList: () => void;
|
|
101
|
+
insertHorizontalRule: () => void;
|
|
102
|
+
insertTable: (config: InsertTableConfig) => void;
|
|
103
|
+
insertImage: (config: InsertImageConfig) => void;
|
|
104
|
+
insertEmoji?: (emoji: string) => void;
|
|
105
|
+
executeEmojiSuggestion?: (emoji: string) => boolean;
|
|
106
|
+
closeEmojiSuggestions?: () => void;
|
|
107
|
+
getEmojiSuggestions?: (query?: string) => {
|
|
108
|
+
emoji: string;
|
|
109
|
+
label: string;
|
|
110
|
+
shortcodes: string[];
|
|
111
|
+
keywords?: string[];
|
|
112
|
+
}[];
|
|
113
|
+
getEmojiCatalog?: () => {
|
|
114
|
+
emoji: string;
|
|
115
|
+
label: string;
|
|
116
|
+
shortcodes: string[];
|
|
117
|
+
keywords?: string[];
|
|
118
|
+
}[];
|
|
119
|
+
resolveEmojiShortcode?: (shortcode: string) => {
|
|
120
|
+
emoji: string;
|
|
121
|
+
label: string;
|
|
122
|
+
shortcodes: string[];
|
|
123
|
+
keywords?: string[];
|
|
124
|
+
} | null;
|
|
125
|
+
setEmojiCatalog?: (catalog: {
|
|
126
|
+
emoji: string;
|
|
127
|
+
label: string;
|
|
128
|
+
shortcodes: string[];
|
|
129
|
+
keywords?: string[];
|
|
130
|
+
}[]) => void;
|
|
131
|
+
setEmojiCatalogAdapter?: (adapter: {
|
|
132
|
+
search: (query: string, options?: {
|
|
133
|
+
limit?: number;
|
|
134
|
+
}) => {
|
|
135
|
+
emoji: string;
|
|
136
|
+
label: string;
|
|
137
|
+
shortcodes: string[];
|
|
138
|
+
keywords?: string[];
|
|
139
|
+
}[];
|
|
140
|
+
resolveShortcode: (shortcode: string) => {
|
|
141
|
+
emoji: string;
|
|
142
|
+
label: string;
|
|
143
|
+
shortcodes: string[];
|
|
144
|
+
keywords?: string[];
|
|
145
|
+
} | null;
|
|
146
|
+
getAll: () => {
|
|
147
|
+
emoji: string;
|
|
148
|
+
label: string;
|
|
149
|
+
shortcodes: string[];
|
|
150
|
+
keywords?: string[];
|
|
151
|
+
}[];
|
|
152
|
+
}) => void;
|
|
153
|
+
getEmojiCatalogAdapter?: () => {
|
|
154
|
+
search: (query: string, options?: {
|
|
155
|
+
limit?: number;
|
|
156
|
+
}) => {
|
|
157
|
+
emoji: string;
|
|
158
|
+
label: string;
|
|
159
|
+
shortcodes: string[];
|
|
160
|
+
keywords?: string[];
|
|
161
|
+
}[];
|
|
162
|
+
resolveShortcode: (shortcode: string) => {
|
|
163
|
+
emoji: string;
|
|
164
|
+
label: string;
|
|
165
|
+
shortcodes: string[];
|
|
166
|
+
keywords?: string[];
|
|
167
|
+
} | null;
|
|
168
|
+
getAll: () => {
|
|
169
|
+
emoji: string;
|
|
170
|
+
label: string;
|
|
171
|
+
shortcodes: string[];
|
|
172
|
+
keywords?: string[];
|
|
173
|
+
}[];
|
|
174
|
+
};
|
|
175
|
+
setImageAlignment: (alignment: ImageAlignment) => void;
|
|
176
|
+
setImageCaption: (caption: string) => void;
|
|
177
|
+
getImageCaption?: () => Promise<string>;
|
|
178
|
+
insertIframeEmbed?: (inputUrl: string, width?: number, height?: number, title?: string) => void;
|
|
179
|
+
setIframeEmbedAlignment?: (alignment: ImageAlignment) => void;
|
|
180
|
+
resizeIframeEmbed?: (width: number, height: number) => void;
|
|
181
|
+
setIframeEmbedCaption?: (caption: string) => void;
|
|
182
|
+
getIframeEmbedCaption?: () => Promise<string>;
|
|
183
|
+
updateIframeEmbedUrl?: (inputUrl: string) => boolean;
|
|
184
|
+
getIframeEmbedUrl?: () => Promise<string>;
|
|
185
|
+
insertYouTubeEmbed?: (inputUrl: string, width?: number, height?: number, start?: number) => void;
|
|
186
|
+
setYouTubeEmbedAlignment?: (alignment: ImageAlignment) => void;
|
|
187
|
+
resizeYouTubeEmbed?: (width: number, height: number) => void;
|
|
188
|
+
setYouTubeEmbedCaption?: (caption: string) => void;
|
|
189
|
+
getYouTubeEmbedCaption?: () => Promise<string>;
|
|
190
|
+
updateYouTubeEmbedUrl?: (inputUrl: string) => boolean;
|
|
191
|
+
getYouTubeEmbedUrl?: () => Promise<string>;
|
|
192
|
+
undo: () => void;
|
|
193
|
+
redo: () => void;
|
|
194
|
+
showCommandPalette: () => void;
|
|
195
|
+
hideCommandPalette: () => void;
|
|
196
|
+
registerCommand: (command: Record<string, unknown>) => void;
|
|
197
|
+
unregisterCommand: (commandId: string) => void;
|
|
198
|
+
registerSlashCommand?: (command: Record<string, unknown>) => void;
|
|
199
|
+
unregisterSlashCommand?: (commandId: string) => void;
|
|
200
|
+
setSlashCommands?: (commands: Record<string, unknown>[]) => void;
|
|
201
|
+
closeSlashMenu?: () => void;
|
|
202
|
+
executeSlashCommand?: (commandId: string) => boolean;
|
|
203
|
+
}
|
|
204
|
+
interface CoreEditorActiveStates {
|
|
205
|
+
bold?: boolean;
|
|
206
|
+
italic?: boolean;
|
|
207
|
+
underline?: boolean;
|
|
208
|
+
strikethrough?: boolean;
|
|
209
|
+
code?: boolean;
|
|
210
|
+
hasCustomFontFamily?: boolean;
|
|
211
|
+
hasCustomFontSize?: boolean;
|
|
212
|
+
hasCustomLineHeight?: boolean;
|
|
213
|
+
hasCustomTextColor?: boolean;
|
|
214
|
+
hasTextHighlight?: boolean;
|
|
215
|
+
subscript?: boolean;
|
|
216
|
+
superscript?: boolean;
|
|
217
|
+
isLink?: boolean;
|
|
218
|
+
isQuote?: boolean;
|
|
219
|
+
isInCodeBlock?: boolean;
|
|
220
|
+
unorderedList?: boolean;
|
|
221
|
+
orderedList?: boolean;
|
|
222
|
+
checkList?: boolean;
|
|
223
|
+
isH1?: boolean;
|
|
224
|
+
isH2?: boolean;
|
|
225
|
+
isH3?: boolean;
|
|
226
|
+
isH4?: boolean;
|
|
227
|
+
isH5?: boolean;
|
|
228
|
+
isH6?: boolean;
|
|
229
|
+
isTextAlignedLeft?: boolean;
|
|
230
|
+
isTextAlignedCenter?: boolean;
|
|
231
|
+
isTextAlignedRight?: boolean;
|
|
232
|
+
isTextAlignedJustify?: boolean;
|
|
233
|
+
imageSelected?: boolean;
|
|
234
|
+
isImageAlignedLeft?: boolean;
|
|
235
|
+
isImageAlignedCenter?: boolean;
|
|
236
|
+
isImageAlignedRight?: boolean;
|
|
237
|
+
isIframeEmbedSelected?: boolean;
|
|
238
|
+
isIframeEmbedAlignedLeft?: boolean;
|
|
239
|
+
isIframeEmbedAlignedCenter?: boolean;
|
|
240
|
+
isIframeEmbedAlignedRight?: boolean;
|
|
241
|
+
isYouTubeEmbedSelected?: boolean;
|
|
242
|
+
isYouTubeEmbedAlignedLeft?: boolean;
|
|
243
|
+
isYouTubeEmbedAlignedCenter?: boolean;
|
|
244
|
+
isYouTubeEmbedAlignedRight?: boolean;
|
|
245
|
+
canUndo?: boolean;
|
|
246
|
+
canRedo?: boolean;
|
|
247
|
+
}
|
|
248
|
+
interface CoreToolbarClassNames {
|
|
249
|
+
toolbar?: string;
|
|
250
|
+
section?: string;
|
|
251
|
+
}
|
|
252
|
+
type ToolbarStyleVars = Partial<{
|
|
253
|
+
"--luthor-toolbar-bg": string;
|
|
254
|
+
"--luthor-toolbar-section-border": string;
|
|
255
|
+
"--luthor-toolbar-button-fg": string;
|
|
256
|
+
"--luthor-toolbar-button-hover-bg": string;
|
|
257
|
+
"--luthor-toolbar-button-hover-border": string;
|
|
258
|
+
"--luthor-toolbar-button-hover-shadow": string;
|
|
259
|
+
"--luthor-toolbar-button-press-shadow": string;
|
|
260
|
+
"--luthor-toolbar-button-active-bg": string;
|
|
261
|
+
"--luthor-toolbar-button-active-border": string;
|
|
262
|
+
"--luthor-toolbar-button-active-fg": string;
|
|
263
|
+
"--luthor-toolbar-button-active-shadow": string;
|
|
264
|
+
"--luthor-toolbar-button-overlay": string;
|
|
265
|
+
"--luthor-toolbar-button-active-overlay": string;
|
|
266
|
+
"--luthor-toolbar-color-indicator-border": string;
|
|
267
|
+
"--luthor-toolbar-highlight-bg": string;
|
|
268
|
+
}>;
|
|
269
|
+
type QuoteStyleVars = Partial<{
|
|
270
|
+
"--luthor-quote-bg": string;
|
|
271
|
+
"--luthor-quote-fg": string;
|
|
272
|
+
"--luthor-quote-border": string;
|
|
273
|
+
}>;
|
|
274
|
+
interface DefaultSettings {
|
|
275
|
+
font?: {
|
|
276
|
+
color?: string;
|
|
277
|
+
boldColor?: string;
|
|
278
|
+
};
|
|
279
|
+
link?: {
|
|
280
|
+
color?: string;
|
|
281
|
+
};
|
|
282
|
+
list?: {
|
|
283
|
+
markerColor?: string;
|
|
284
|
+
checkboxColor?: string;
|
|
285
|
+
};
|
|
286
|
+
quote?: {
|
|
287
|
+
backgroundColor?: string;
|
|
288
|
+
color?: string;
|
|
289
|
+
indicatorColor?: string;
|
|
290
|
+
};
|
|
291
|
+
table?: {
|
|
292
|
+
borderColor?: string;
|
|
293
|
+
headerBackgroundColor?: string;
|
|
294
|
+
};
|
|
295
|
+
hr?: {
|
|
296
|
+
color?: string;
|
|
297
|
+
};
|
|
298
|
+
placeholder?: {
|
|
299
|
+
color?: string;
|
|
300
|
+
};
|
|
301
|
+
codeblock?: {
|
|
302
|
+
backgroundColor?: string;
|
|
303
|
+
};
|
|
304
|
+
toolbar?: {
|
|
305
|
+
backgroundColor?: string;
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
type EditorThemeOverrides = LuthorEditorThemeOverrides;
|
|
309
|
+
type ToolbarPosition = "top" | "bottom";
|
|
310
|
+
type ToolbarAlignment = "left" | "center" | "right";
|
|
311
|
+
type ToolbarItemType = "fontFamily" | "fontSize" | "lineHeight" | "textColor" | "textHighlight" | "bold" | "italic" | "underline" | "strikethrough" | "subscript" | "superscript" | "code" | "link" | "blockFormat" | "quote" | "alignLeft" | "alignCenter" | "alignRight" | "alignJustify" | "codeBlock" | "unorderedList" | "orderedList" | "checkList" | "indentList" | "outdentList" | "horizontalRule" | "table" | "image" | "emoji" | "embed" | "undo" | "redo" | "commandPalette" | "themeToggle";
|
|
312
|
+
type ToolbarVisibility = Partial<Record<ToolbarItemType, boolean>>;
|
|
313
|
+
interface SlashCommandVisibilityFilters {
|
|
314
|
+
allowlist?: readonly string[];
|
|
315
|
+
denylist?: readonly string[];
|
|
316
|
+
}
|
|
317
|
+
type SlashCommandVisibilitySelection = Readonly<Record<string, boolean>>;
|
|
318
|
+
type SlashCommandVisibility = SlashCommandVisibilityFilters | readonly SlashCommandVisibilitySelection[];
|
|
319
|
+
type ToolbarSection = {
|
|
320
|
+
items: readonly ToolbarItemType[];
|
|
321
|
+
};
|
|
322
|
+
type ToolbarLayout = {
|
|
323
|
+
sections: readonly ToolbarSection[];
|
|
324
|
+
};
|
|
325
|
+
declare const DEFAULT_TOOLBAR_LAYOUT: ToolbarLayout;
|
|
326
|
+
declare const TRADITIONAL_TOOLBAR_LAYOUT: ToolbarLayout;
|
|
327
|
+
|
|
328
|
+
type KeyboardShortcut = {
|
|
329
|
+
key: string;
|
|
330
|
+
metaKey?: boolean;
|
|
331
|
+
ctrlKey?: boolean;
|
|
332
|
+
shiftKey?: boolean;
|
|
333
|
+
altKey?: boolean;
|
|
334
|
+
preventDefault?: boolean;
|
|
335
|
+
};
|
|
336
|
+
type ShortcutBindingOverride = KeyboardShortcut | readonly KeyboardShortcut[] | false | null;
|
|
337
|
+
type ShortcutConfig = {
|
|
338
|
+
disabledCommandIds?: readonly string[];
|
|
339
|
+
bindings?: Readonly<Record<string, ShortcutBindingOverride>>;
|
|
340
|
+
preventCollisions?: boolean;
|
|
341
|
+
preventNativeConflicts?: boolean;
|
|
342
|
+
};
|
|
343
|
+
type CommandConfig = {
|
|
344
|
+
id: string;
|
|
345
|
+
label: string;
|
|
346
|
+
description?: string;
|
|
347
|
+
category: string;
|
|
348
|
+
action: (commands: CoreEditorCommands) => void;
|
|
349
|
+
shortcuts?: KeyboardShortcut[];
|
|
350
|
+
keywords?: string[];
|
|
351
|
+
condition?: (commands: CoreEditorCommands) => boolean;
|
|
352
|
+
};
|
|
353
|
+
type CommandGenerationOptions = {
|
|
354
|
+
headingOptions?: readonly BlockHeadingLevel[];
|
|
355
|
+
paragraphLabel?: string;
|
|
356
|
+
slashCommandVisibility?: SlashCommandVisibility;
|
|
357
|
+
isFeatureEnabled?: (feature: string) => boolean;
|
|
358
|
+
shortcutConfig?: ShortcutConfig;
|
|
359
|
+
commandPaletteShortcutOnly?: boolean;
|
|
360
|
+
};
|
|
361
|
+
declare function generateCommands(options?: CommandGenerationOptions): CommandConfig[];
|
|
362
|
+
declare function commandsToCommandPaletteItems(commands: CoreEditorCommands, options?: CommandGenerationOptions): CommandPaletteItem[];
|
|
363
|
+
declare function commandsToSlashCommandItems(commands: CoreEditorCommands, options?: CommandGenerationOptions): SlashCommandItem[];
|
|
364
|
+
declare function registerKeyboardShortcuts(commands: CoreEditorCommands, element?: HTMLElement, options?: CommandGenerationOptions & {
|
|
365
|
+
scope?: HTMLElement | null | (() => HTMLElement | null);
|
|
366
|
+
}): () => void;
|
|
367
|
+
|
|
368
|
+
declare const EXTENSIVE_FEATURE_KEYS: readonly ["bold", "italic", "underline", "strikethrough", "fontFamily", "fontSize", "lineHeight", "textColor", "textHighlight", "subscript", "superscript", "link", "horizontalRule", "table", "list", "history", "image", "blockFormat", "code", "codeIntelligence", "codeFormat", "tabIndent", "enterKeyBehavior", "iframeEmbed", "youTubeEmbed", "floatingToolbar", "contextMenu", "commandPalette", "slashCommand", "emoji", "draggableBlock", "customNode", "themeToggle"];
|
|
369
|
+
type FeatureFlag = (typeof EXTENSIVE_FEATURE_KEYS)[number];
|
|
370
|
+
type FeatureFlags = Record<FeatureFlag, boolean>;
|
|
371
|
+
type FeatureFlagOverrides = Partial<FeatureFlags>;
|
|
372
|
+
declare const DEFAULT_FEATURE_FLAGS: FeatureFlags;
|
|
373
|
+
declare function resolveFeatureFlags(overrides?: FeatureFlagOverrides): FeatureFlags;
|
|
374
|
+
declare function isFeatureEnabled(featureFlags: FeatureFlags, feature: FeatureFlag): boolean;
|
|
375
|
+
type ExtensiveExtensionsConfig = {
|
|
376
|
+
fontFamilyOptions?: readonly FontFamilyOption[];
|
|
377
|
+
fontSizeOptions?: readonly FontSizeOption[];
|
|
378
|
+
lineHeightOptions?: readonly LineHeightOption[];
|
|
379
|
+
minimumDefaultLineHeight?: string | number;
|
|
380
|
+
featureFlags?: FeatureFlagOverrides;
|
|
381
|
+
isDraggableBoxEnabled?: boolean;
|
|
382
|
+
scaleByRatio?: boolean;
|
|
383
|
+
syntaxHighlighting?: "auto" | "disabled";
|
|
384
|
+
codeHighlightProvider?: CodeHighlightProvider | null;
|
|
385
|
+
loadCodeHighlightProvider?: () => Promise<CodeHighlightProvider | null>;
|
|
386
|
+
maxAutoDetectCodeLength?: number;
|
|
387
|
+
isCopyAllowed?: boolean;
|
|
388
|
+
languageOptions?: readonly string[] | CodeLanguageOptionsConfig;
|
|
389
|
+
};
|
|
390
|
+
declare function buildExtensiveExtensions({ fontFamilyOptions, fontSizeOptions, lineHeightOptions, minimumDefaultLineHeight, featureFlags, isDraggableBoxEnabled, scaleByRatio, syntaxHighlighting, codeHighlightProvider, loadCodeHighlightProvider, maxAutoDetectCodeLength, isCopyAllowed, languageOptions, }?: ExtensiveExtensionsConfig): Extension[];
|
|
391
|
+
type ExtensiveExtensions = ReturnType<typeof buildExtensiveExtensions>;
|
|
392
|
+
declare function createExtensiveExtensions(config?: ExtensiveExtensionsConfig): ExtensiveExtensions;
|
|
393
|
+
declare const extensiveExtensions: Extension[];
|
|
394
|
+
|
|
395
|
+
type ExtensiveEditorMode = "visual" | "jsonb";
|
|
396
|
+
type ExtensiveEditorPlaceholder = string | {
|
|
397
|
+
visual?: string;
|
|
398
|
+
jsonb?: string;
|
|
399
|
+
};
|
|
400
|
+
interface ExtensiveEditorRef {
|
|
401
|
+
injectJSONB: (content: string) => void;
|
|
402
|
+
getJSONB: () => string;
|
|
403
|
+
}
|
|
404
|
+
interface ExtensiveEditorProps {
|
|
405
|
+
className?: string;
|
|
406
|
+
onReady?: (methods: ExtensiveEditorRef) => void;
|
|
407
|
+
initialTheme?: "light" | "dark";
|
|
408
|
+
theme?: Partial<LuthorTheme>;
|
|
409
|
+
defaultContent?: string;
|
|
410
|
+
showDefaultContent?: boolean;
|
|
411
|
+
placeholder?: ExtensiveEditorPlaceholder;
|
|
412
|
+
initialMode?: ExtensiveEditorMode;
|
|
413
|
+
availableModes?: readonly ExtensiveEditorMode[];
|
|
414
|
+
variantClassName?: string;
|
|
415
|
+
toolbarLayout?: ToolbarLayout;
|
|
416
|
+
toolbarVisibility?: ToolbarVisibility;
|
|
417
|
+
toolbarPosition?: ToolbarPosition;
|
|
418
|
+
toolbarAlignment?: ToolbarAlignment;
|
|
419
|
+
toolbarClassName?: string;
|
|
420
|
+
toolbarStyleVars?: ToolbarStyleVars;
|
|
421
|
+
quoteClassName?: string;
|
|
422
|
+
quoteStyleVars?: QuoteStyleVars;
|
|
423
|
+
defaultSettings?: DefaultSettings;
|
|
424
|
+
editorThemeOverrides?: EditorThemeOverrides;
|
|
425
|
+
isToolbarEnabled?: boolean;
|
|
426
|
+
fontFamilyOptions?: readonly FontFamilyOption[];
|
|
427
|
+
fontSizeOptions?: readonly FontSizeOption[];
|
|
428
|
+
lineHeightOptions?: readonly LineHeightOption[];
|
|
429
|
+
minimumDefaultLineHeight?: string | number;
|
|
430
|
+
scaleByRatio?: boolean;
|
|
431
|
+
headingOptions?: readonly BlockHeadingLevel[];
|
|
432
|
+
paragraphLabel?: string;
|
|
433
|
+
syncHeadingOptionsWithCommands?: boolean;
|
|
434
|
+
slashCommandVisibility?: SlashCommandVisibility;
|
|
435
|
+
shortcutConfig?: ShortcutConfig;
|
|
436
|
+
commandPaletteShortcutOnly?: boolean;
|
|
437
|
+
isDraggableBoxEnabled?: boolean;
|
|
438
|
+
featureFlags?: FeatureFlagOverrides;
|
|
439
|
+
syntaxHighlighting?: "auto" | "disabled";
|
|
440
|
+
codeHighlightProvider?: CodeHighlightProvider | null;
|
|
441
|
+
loadCodeHighlightProvider?: () => Promise<CodeHighlightProvider | null>;
|
|
442
|
+
maxAutoDetectCodeLength?: number;
|
|
443
|
+
isCopyAllowed?: boolean;
|
|
444
|
+
languageOptions?: readonly string[] | CodeLanguageOptionsConfig;
|
|
445
|
+
}
|
|
446
|
+
declare const ExtensiveEditor: react.ForwardRefExoticComponent<ExtensiveEditorProps & react.RefAttributes<ExtensiveEditorRef>>;
|
|
447
|
+
|
|
448
|
+
export { type TextAlignment as A, type BlockHeadingLevel as B, type CoreEditorCommands as C, type DefaultSettings as D, type EditorThemeOverrides as E, type FeatureFlag as F, type ToolbarAlignment as G, type ToolbarPosition as H, type ImageAlignment as I, type ToolbarSection as J, type KeyboardShortcut as K, commandsToCommandPaletteItems as L, commandsToSlashCommandItems as M, createExtensiveExtensions as N, extensiveExtensions as O, generateCommands as P, type QuoteStyleVars as Q, registerKeyboardShortcuts as R, type ShortcutBindingOverride as S, type ToolbarStyleVars as T, DEFAULT_FEATURE_FLAGS as U, isFeatureEnabled as V, resolveFeatureFlags as W, type CoreEditorActiveStates as a, type CoreTheme as b, type CoreEditorMode as c, type CoreToolbarClassNames as d, type ToolbarLayout as e, type ToolbarVisibility as f, type ToolbarItemType as g, BLOCK_HEADING_LEVELS as h, type BlockFormat as i, type CommandConfig as j, type CommandGenerationOptions as k, DEFAULT_TOOLBAR_LAYOUT as l, ExtensiveEditor as m, type ExtensiveEditorMode as n, type ExtensiveEditorProps as o, type ExtensiveEditorRef as p, type ExtensiveExtensionsConfig as q, type FeatureFlagOverrides as r, type FeatureFlags as s, type InsertImageConfig as t, type InsertTableConfig as u, type ShortcutConfig as v, type SlashCommandVisibility as w, type SlashCommandVisibilityFilters as x, type SlashCommandVisibilitySelection as y, TRADITIONAL_TOOLBAR_LAYOUT as z };
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Extension, EditorConfig, LuthorTheme } from '@lyfie/luthor-headless';
|
|
2
|
+
|
|
3
|
+
interface EditorPreset {
|
|
4
|
+
id: string;
|
|
5
|
+
label: string;
|
|
6
|
+
description?: string;
|
|
7
|
+
extensions?: Extension[];
|
|
8
|
+
config?: EditorConfig;
|
|
9
|
+
theme?: LuthorTheme;
|
|
10
|
+
toolbar?: string[];
|
|
11
|
+
components?: Record<string, unknown>;
|
|
12
|
+
css?: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
declare const presetRegistry: Record<string, EditorPreset>;
|
|
16
|
+
|
|
17
|
+
export { type EditorPreset as E, presetRegistry as p };
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { E as EditorPreset } from './index-BtdZVw3X.js';
|
|
2
|
+
import { FontFamilyOption, FontSizeOption, LineHeightOption, CodeLanguageOptionsConfig } from '@lyfie/luthor-headless';
|
|
3
|
+
import { g as ToolbarItemType } from './ExtensiveEditor-Cn84lsVT.js';
|
|
4
|
+
|
|
5
|
+
declare const extensiveToolbar: readonly ["undo", "redo", "heading", "fontFamily", "fontSize", "lineHeight", "textColor", "textHighlight", "bold", "italic", "underline", "strikethrough", "subscript", "superscript", "link", "image", "table", "horizontalRule", "iframeEmbed", "youtubeEmbed", "blockquote", "code", "codeBlock", "bulletedList", "numberedList", "checkList", "commandPalette", "floatingToolbar", "contextMenu", "draggableBlock", "customNode", "sourceMode", "themeToggle"];
|
|
6
|
+
declare const extensivePreset: EditorPreset;
|
|
7
|
+
type ExtensivePresetConfig = {
|
|
8
|
+
fontFamilyOptions?: readonly FontFamilyOption[];
|
|
9
|
+
fontSizeOptions?: readonly FontSizeOption[];
|
|
10
|
+
lineHeightOptions?: readonly LineHeightOption[];
|
|
11
|
+
minimumDefaultLineHeight?: string | number;
|
|
12
|
+
isCopyAllowed?: boolean;
|
|
13
|
+
languageOptions?: readonly string[] | CodeLanguageOptionsConfig;
|
|
14
|
+
};
|
|
15
|
+
declare function createExtensivePreset(config?: ExtensivePresetConfig): EditorPreset;
|
|
16
|
+
|
|
17
|
+
type PresetModeCache<TMode extends string> = Set<TMode>;
|
|
18
|
+
type FeatureFlagsLike<TFeature extends string = string> = Record<TFeature, boolean>;
|
|
19
|
+
type FeatureShortcutSpec<TFeature extends string = string> = {
|
|
20
|
+
feature: TFeature;
|
|
21
|
+
key: string;
|
|
22
|
+
requiresPrimary: boolean;
|
|
23
|
+
shift?: boolean;
|
|
24
|
+
alt?: boolean;
|
|
25
|
+
};
|
|
26
|
+
type ToolbarFeatureMap<TFeature extends string = string> = Partial<Record<ToolbarItemType, TFeature | readonly TFeature[]>>;
|
|
27
|
+
type StyleVarRecord = Record<string, string>;
|
|
28
|
+
type StyleVarValueRecord = Record<string, string | undefined>;
|
|
29
|
+
|
|
30
|
+
export { type ExtensivePresetConfig as E, type FeatureFlagsLike as F, type PresetModeCache as P, type StyleVarRecord as S, type ToolbarFeatureMap as T, type StyleVarValueRecord as a, type FeatureShortcutSpec as b, createExtensivePreset as c, extensiveToolbar as d, extensivePreset as e };
|
package/dist/index.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
.luthor-preset-extensive.luthor-editor-wrapper[data-editor-theme=light]{--luthor-bg: #ffffff;--luthor-fg: #0f172a;--luthor-border: #e2e8f0;--luthor-border-hover: #cbd5e1;--luthor-border-active: #94a3b8;--luthor-accent: #0f172a;--luthor-accent-hover: #1e293b;--luthor-shadow: rgba(0, 0, 0, .08);--luthor-muted: #f8fafc;--luthor-muted-fg: #64748b}.luthor-preset-extensive.luthor-editor-wrapper[data-editor-theme=dark]{--luthor-bg: #0a0a0a;--luthor-fg: #ededed;--luthor-border: #262626;--luthor-border-hover: #404040;--luthor-border-active: #525252;--luthor-accent: #ededed;--luthor-accent-hover: #d4d4d8;--luthor-shadow: rgba(0, 0, 0, .5);--luthor-muted: #171717;--luthor-muted-fg: #a3a3a3}.luthor-preset-extensive.luthor-editor-wrapper{border:1px solid var(--luthor-border);border-radius:8px;background-color:var(--luthor-bg);overflow:hidden;display:flex;flex-direction:column;width:100%;max-width:100%;min-height:500px;height:auto}.luthor-editor-header{background-color:var(--luthor-muted);border-bottom:1px solid var(--luthor-border)}.luthor-mode-tabs{display:flex;border-bottom:1px solid var(--luthor-border)}.luthor-mode-tab{padding:10px 20px;background:none;border:none;cursor:pointer;color:var(--luthor-muted-fg);font-size:14px;font-weight:500;transition:all .2s cubic-bezier(.4,0,.2,1);border-bottom:2px solid transparent;position:relative}.luthor-mode-tab:hover{color:var(--luthor-fg);background-color:var(--luthor-muted)}.luthor-mode-tab.active{color:var(--luthor-accent);border-bottom-color:var(--luthor-accent);background-color:#0f172a0d}.luthor-toolbar{display:flex;align-items:center;gap:4px;padding:8px;flex-wrap:nowrap;overflow-x:auto;overflow-y:hidden;min-height:48px}.luthor-toolbar-section{display:flex;align-items:center;gap:2px;padding:0 4px}.luthor-toolbar-section:not(:last-child){border-right:1px solid var(--luthor-border);margin-right:8px;padding-right:8px}.luthor-toolbar-button{display:flex;align-items:center;justify-content:center;width:36px;height:36px;border:1px solid transparent;border-radius:6px;background-color:transparent;color:var(--luthor-fg);cursor:pointer;transition:all .2s cubic-bezier(.4,0,.2,1);font-size:16px;position:relative;overflow:hidden}.luthor-toolbar-button:before{content:"";position:absolute;inset:0;background:linear-gradient(135deg,#ffffff1a,#ffffff0d);opacity:0;transition:opacity .2s ease}.luthor-toolbar-button:hover{background-color:var(--luthor-muted);border-color:var(--luthor-border-hover);transform:translateY(-1px);box-shadow:0 4px 12px #00000026}.luthor-toolbar-button:hover:before{opacity:1}.luthor-toolbar-button:active{transform:translateY(0) scale(.98);box-shadow:0 2px 8px #0000001a}.luthor-toolbar-button.active{background-color:var(--luthor-accent);border-color:var(--luthor-accent);color:var(--luthor-bg);box-shadow:0 2px 8px #0003}.luthor-toolbar-button.active:before{background:linear-gradient(135deg,#fff3,#ffffff1a);opacity:1}.luthor-toolbar-button:disabled{opacity:.5;cursor:not-allowed;transform:none;box-shadow:none}.luthor-toolbar-button:disabled:hover{background-color:transparent;border-color:transparent;transform:none;box-shadow:none}.luthor-toolbar-button:disabled:before{opacity:0}.luthor-select{position:relative;display:inline-block}.luthor-select-trigger{display:flex;align-items:center;gap:6px;padding:8px 12px;border:1px solid var(--luthor-border);border-radius:6px;background-color:var(--luthor-bg);color:var(--luthor-fg);cursor:pointer;font-size:14px;min-width:120px;height:36px;transition:all .2s cubic-bezier(.4,0,.2,1);box-shadow:0 1px 3px #0000001a}.luthor-select-trigger:hover{border-color:var(--luthor-border-hover);box-shadow:0 2px 8px #00000026}.luthor-select-trigger.open{border-color:var(--luthor-accent);box-shadow:0 0 0 3px #0f172a1a}.luthor-select-dropdown{position:absolute;top:100%;left:0;right:0;z-index:50;background-color:var(--luthor-bg);border:1px solid var(--luthor-border);border-radius:6px;box-shadow:0 8px 32px #0000001f;margin-top:4px;max-height:200px;overflow-y:auto}.luthor-select-option{display:block;width:100%;padding:10px 14px;border:none;background:none;color:var(--luthor-fg);cursor:pointer;font-size:14px;text-align:left;transition:all .15s ease}.luthor-select-option:hover{background-color:var(--luthor-muted)}.luthor-select-option.selected{background-color:var(--luthor-accent);color:var(--luthor-bg);font-weight:500}.luthor-dropdown{position:relative;display:inline-flex}.luthor-dropdown-content{position:absolute;top:100%;left:0;z-index:50;background-color:var(--luthor-bg);border:1px solid var(--luthor-border);border-radius:4px;box-shadow:0 4px 6px -1px var(--luthor-shadow);margin-top:2px;min-width:160px;padding:4px 0}.luthor-dropdown-item{display:flex;align-items:center;gap:8px;width:100%;padding:8px 12px;border:none;background:none;color:var(--luthor-fg);cursor:pointer;font-size:14px;text-align:left;transition:background-color .15s}.luthor-dropdown-item:hover{background-color:var(--luthor-muted)}.luthor-file-input{display:none}.luthor-editor{flex:1;display:flex;flex-direction:column;min-height:400px;position:relative}.luthor-richtext-container{position:relative;flex:1;display:flex;flex-direction:column}.luthor-content-editable{flex:1;padding:20px;outline:none;color:var(--luthor-fg);line-height:1.7;font-size:16px;background-color:var(--luthor-bg);transition:background-color .2s ease}.luthor-content-editable:focus{outline:none;background-color:var(--luthor-bg)}.luthor-placeholder{color:var(--luthor-muted-fg);pointer-events:none;position:absolute;top:20px;left:20px;font-size:16px;line-height:1.7;z-index:1}.luthor-source-panel{padding:20px;flex:1;overflow-y:auto}.luthor-source-view{width:100%;min-height:280px;padding:12px;border:1px solid var(--luthor-border);font-family:SF Mono,Monaco,Inconsolata,Roboto Mono,Consolas,Courier New,monospace;font-size:14px;line-height:1.6;background-color:var(--luthor-bg);color:var(--luthor-fg);border-radius:0;transition:background-color .2s ease}.luthor-command-palette-overlay{position:fixed;inset:0;background:#00000080;display:flex;align-items:flex-start;justify-content:center;padding-top:20vh;z-index:9999}.luthor-command-palette{background:var(--luthor-bg);border:1px solid var(--luthor-border);border-radius:12px;box-shadow:0 12px 48px #0000001f;width:640px;max-width:90vw;max-height:60vh;display:flex;flex-direction:column;overflow:hidden}.luthor-command-palette-header{display:flex;align-items:center;padding:16px 20px;border-bottom:1px solid var(--luthor-border);gap:12px}.luthor-command-palette-icon{color:var(--luthor-muted-fg);flex-shrink:0}.luthor-command-palette-input{flex:1;background:transparent;border:none;outline:none;font-size:16px;color:var(--luthor-fg);font-family:inherit}.luthor-command-palette-input::placeholder{color:var(--luthor-muted-fg)}.luthor-command-palette-kbd{background:var(--luthor-muted);border:1px solid var(--luthor-border);border-radius:4px;padding:2px 6px;font-size:11px;color:var(--luthor-muted-fg);font-family:monospace}.luthor-command-palette-list{flex:1;overflow-y:auto;padding:8px 0}.luthor-command-palette-group{margin-bottom:8px}.luthor-command-palette-group-title{padding:8px 20px 4px;font-size:11px;font-weight:600;color:var(--luthor-muted-fg);text-transform:uppercase;letter-spacing:.5px}.luthor-command-palette-item{display:flex;align-items:center;padding:12px 20px;cursor:pointer;border:none;background:none;width:100%;text-align:left;transition:background-color .1s}.luthor-command-palette-item:hover,.luthor-command-palette-item.selected{background:var(--luthor-muted)}.luthor-command-palette-item-content{flex:1;min-width:0}.luthor-command-palette-item-title{font-size:14px;color:var(--luthor-fg);font-weight:500;margin-bottom:2px}.luthor-command-palette-item-description{font-size:12px;color:var(--luthor-muted-fg);line-height:1.4}.luthor-command-palette-item-shortcut{background:var(--luthor-muted);border:1px solid var(--luthor-border);border-radius:4px;padding:2px 6px;font-size:10px;color:var(--luthor-muted-fg);font-family:monospace;margin-left:12px;flex-shrink:0}.luthor-command-palette-footer{padding:12px 20px;border-top:1px solid var(--luthor-border);background:var(--luthor-muted)}.luthor-command-palette-hint{font-size:11px;color:var(--luthor-muted-fg);display:flex;align-items:center;gap:8px}.luthor-command-palette-hint kbd{background:var(--luthor-bg);border:1px solid var(--luthor-border);border-radius:3px;padding:1px 4px;font-size:10px;font-family:monospace}.luthor-command-palette-empty{padding:40px 20px;text-align:center;color:var(--luthor-muted-fg);font-size:14px}.luthor-dialog-overlay{position:fixed;inset:0;background-color:#00000080;display:flex;align-items:center;justify-content:center;z-index:1000}.luthor-dialog{background-color:var(--luthor-bg);border-radius:10px;box-shadow:0 20px 30px var(--luthor-shadow);min-width:360px;max-width:520px;max-height:90vh;overflow:hidden}.luthor-dialog-header{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid var(--luthor-border)}.luthor-dialog-title{margin:0;font-size:16px;font-weight:600;color:var(--luthor-fg)}.luthor-dialog-close{background:none;border:none;color:var(--luthor-muted-fg);cursor:pointer;padding:4px;border-radius:6px}.luthor-dialog-close:hover{background-color:var(--luthor-muted);color:var(--luthor-fg)}.luthor-dialog-content{padding:18px 20px}.luthor-table-dialog{display:flex;flex-direction:column;gap:14px}.luthor-form-group{display:flex;flex-direction:column;gap:6px}.luthor-form-group label{font-size:13px;font-weight:600;color:var(--luthor-fg)}.luthor-input{padding:8px 12px;border:1px solid var(--luthor-border);border-radius:6px;background-color:var(--luthor-bg);color:var(--luthor-fg);font-size:13px}.luthor-input:focus{outline:none;border-color:var(--luthor-accent);box-shadow:0 0 0 3px #3b82f61f}.luthor-checkbox-label{display:flex;align-items:center;gap:8px;font-size:13px;color:var(--luthor-fg)}.luthor-checkbox{width:16px;height:16px;accent-color:var(--luthor-accent)}.luthor-dialog-actions{display:flex;justify-content:flex-end;gap:10px;margin-top:4px}.luthor-button-primary,.luthor-button-secondary{padding:8px 14px;border-radius:6px;font-size:13px;font-weight:600;cursor:pointer;border:1px solid}.luthor-button-primary{background-color:var(--luthor-accent);border-color:var(--luthor-accent);color:var(--luthor-bg)}.luthor-button-primary:hover{background-color:var(--luthor-accent-hover);border-color:var(--luthor-accent-hover)}.luthor-button-secondary{background-color:transparent;border-color:var(--luthor-border);color:var(--luthor-fg)}.luthor-button-secondary:hover{background-color:var(--luthor-muted);border-color:var(--luthor-border-hover)}.luthor-text-bold{font-weight:700}.luthor-text-italic{font-style:italic}.luthor-text-underline{text-decoration:underline}.luthor-text-strikethrough{text-decoration:line-through}.luthor-text-code,.luthor-code-block{font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;background-color:var(--luthor-muted);border:1px solid var(--luthor-border);padding:2px 6px;border-radius:4px}.luthor-code-block{display:block;padding:12px;margin:12px 0}.luthor-paragraph{margin:8px 0}.luthor-heading-h1,.luthor-heading-h2,.luthor-heading-h3,.luthor-heading-h4,.luthor-heading-h5,.luthor-heading-h6{margin:16px 0 8px;font-weight:700}.luthor-heading-h1{font-size:28px}.luthor-heading-h2{font-size:24px}.luthor-heading-h3{font-size:20px}.luthor-heading-h4{font-size:18px}.luthor-heading-h5{font-size:16px}.luthor-heading-h6{font-size:14px}.luthor-list-ul,.luthor-list-ol{margin:10px 0 10px 20px}.luthor-list-li{margin:4px 0}.luthor-quote{border-left:4px solid var(--luthor-accent);background-color:var(--luthor-muted);padding:10px 14px;margin:12px 0;color:var(--luthor-fg)}.luthor-link{color:var(--luthor-accent);text-decoration:underline}.luthor-link:hover{color:var(--luthor-accent-hover)}.luthor-hr{margin:16px 0;border:none;border-top:1px solid var(--luthor-border);height:1px}.luthor-preset-extensive .lexical-image{margin:1em 0;display:block;position:relative}.luthor-preset-extensive .lexical-image img{max-width:100%;height:auto;border-radius:6px;display:block}.luthor-preset-extensive .lexical-image.align-left{float:left;margin-right:1em;margin-bottom:1em}.luthor-preset-extensive .lexical-image.align-right{float:right;margin-left:1em;margin-bottom:1em}.luthor-preset-extensive .lexical-image.align-center{text-align:center;margin:1em auto}.luthor-preset-extensive .lexical-image.align-center img{margin:0 auto}.luthor-preset-extensive .lexical-image figcaption{margin-top:.5em;font-size:12px;color:var(--luthor-muted-fg);text-align:center;font-style:italic}.luthor-preset-extensive .lexical-image.selected{outline:2px solid var(--luthor-accent);outline-offset:2px}.luthor-preset-extensive .resizer{position:absolute;width:8px;height:8px;background:var(--luthor-accent);border:1px solid white;border-radius:50%}.luthor-preset-extensive .resizer.ne{top:-4px;right:-4px;cursor:nesw-resize}.luthor-preset-extensive .resizer.nw{top:-4px;left:-4px;cursor:nwse-resize}.luthor-preset-extensive .resizer.se{bottom:-4px;right:-4px;cursor:nwse-resize}.luthor-preset-extensive .resizer.sw{bottom:-4px;left:-4px;cursor:nesw-resize}.luthor-table{border-collapse:collapse;width:100%;margin:16px 0;border:1px solid var(--luthor-border)}.luthor-table-cell,.luthor-table-cell-header{border:1px solid var(--luthor-border);padding:8px 12px;text-align:left;min-width:80px;background-color:var(--luthor-bg)}.luthor-table-cell-header{background-color:var(--luthor-muted);font-weight:600}.luthor-preset-extensive table[data-lexical-table-selection]{box-shadow:0 0 0 2px var(--luthor-accent)}.luthor-preset-extensive table td[data-lexical-table-cell-selection]{background-color:#3b82f61a}.luthor-context-menu{position:fixed;background:var(--luthor-bg);border:1px solid var(--luthor-border);border-radius:8px;box-shadow:0 10px 30px var(--luthor-shadow);z-index:1000;min-width:160px;padding:6px 0;font-size:13px}.luthor-context-menu-item{padding:8px 14px;cursor:pointer;user-select:none}.luthor-context-menu-item:hover{background-color:var(--luthor-muted)}.luthor-context-menu-item-disabled{opacity:.5;cursor:not-allowed}.luthor-floating-toolbar{display:flex;align-items:center;gap:4px;padding:6px;background-color:var(--luthor-bg);border:1px solid var(--luthor-border);border-radius:8px;box-shadow:0 8px 24px var(--luthor-shadow)}.luthor-floating-toolbar-separator{width:1px;height:18px;background-color:var(--luthor-border);margin:0 4px}.luthor-html-embed-container{border:1px solid var(--luthor-border);border-radius:8px;padding:12px;margin:14px 0;background:var(--luthor-muted)}.luthor-html-embed-preview{padding:10px;border-radius:6px;background:var(--luthor-bg);border:1px solid var(--luthor-border)}.luthor-html-embed-editor{display:flex;flex-direction:column;gap:10px}.luthor-html-embed-textarea{width:100%;min-height:120px;padding:10px;border-radius:6px;border:1px solid var(--luthor-border);background:var(--luthor-bg);color:var(--luthor-fg);font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace}.luthor-html-embed-toggle{align-self:flex-end;background:var(--luthor-accent);color:var(--luthor-bg);border:none;border-radius:6px;padding:6px 10px;cursor:pointer;font-size:12px;font-weight:600}.luthor-draggable-handle,.luthor-draggable-up-button,.luthor-draggable-down-button{width:24px;height:24px;border-radius:6px;border:1px solid var(--luthor-border);background:var(--luthor-bg);color:var(--luthor-muted-fg);display:flex;align-items:center;justify-content:center;cursor:pointer}.luthor-draggable-button-stack{display:flex;flex-direction:column;gap:6px;align-items:center}.luthor-draggable-drop-indicator{height:3px;background:var(--luthor-accent);border-radius:999px}.luthor-draggable-block-dragging,.luthor-draggable-block-is-dragging{opacity:.6}@media(max-width:768px){.luthor-preset-extensive.luthor-editor-wrapper{min-height:400px}.luthor-toolbar{padding:6px}.luthor-toolbar-button{width:32px;height:32px;font-size:14px}.luthor-toolbar-section{padding:0 2px}.luthor-toolbar-section:not(:last-child){margin-right:6px;padding-right:6px}.luthor-content-editable{padding:16px;font-size:16px}.luthor-placeholder{top:16px;left:16px}.luthor-select-trigger{min-width:100px;font-size:13px}.luthor-mode-tab{padding:8px 12px;font-size:13px}}
|
|
1
|
+
.luthor-preset-extensive.luthor-editor-wrapper[data-editor-theme=light]{--luthor-bg: #ffffff;--luthor-fg: #0f172a;--luthor-border: #e2e8f0;--luthor-border-hover: #cbd5e1;--luthor-border-active: #94a3b8;--luthor-accent: #0f172a;--luthor-accent-hover: #1e293b;--luthor-shadow: rgba(0, 0, 0, .08);--luthor-muted: #f8fafc;--luthor-muted-fg: #64748b;--luthor-toolbar-bg: var(--luthor-muted);--luthor-toolbar-section-border: var(--luthor-border);--luthor-toolbar-button-fg: var(--luthor-fg);--luthor-toolbar-button-hover-bg: var(--luthor-muted);--luthor-toolbar-button-hover-border: var(--luthor-border-hover);--luthor-toolbar-button-hover-shadow: 0 4px 12px rgba(0, 0, 0, .15);--luthor-toolbar-button-press-shadow: 0 2px 8px rgba(0, 0, 0, .1);--luthor-toolbar-button-active-bg: var(--luthor-accent);--luthor-toolbar-button-active-border: var(--luthor-accent);--luthor-toolbar-button-active-fg: var(--luthor-bg);--luthor-toolbar-button-active-shadow: 0 2px 8px rgba(0, 0, 0, .2);--luthor-toolbar-button-overlay: linear-gradient(135deg, rgba(255, 255, 255, .1) 0%, rgba(255, 255, 255, .05) 100%);--luthor-toolbar-button-active-overlay: linear-gradient(135deg, rgba(255, 255, 255, .2) 0%, rgba(255, 255, 255, .1) 100%);--luthor-toolbar-color-indicator-border: var(--luthor-border);--luthor-toolbar-highlight-bg: var(--luthor-muted);--luthor-quote-bg: var(--luthor-muted);--luthor-quote-fg: var(--luthor-fg);--luthor-quote-border: var(--luthor-accent);--luthor-text-bold-color: var(--luthor-fg);--luthor-link-color: var(--luthor-accent);--luthor-list-marker-color: var(--luthor-fg);--luthor-list-checkbox-color: var(--luthor-accent);--luthor-table-border-color: var(--luthor-border);--luthor-table-header-bg: var(--luthor-muted);--luthor-hr-color: var(--luthor-border);--luthor-placeholder-color: var(--luthor-muted-fg);--luthor-codeblock-bg: var(--luthor-muted);--luthor-floating-bg: var(--luthor-bg);--luthor-floating-fg: var(--luthor-fg);--luthor-floating-border: var(--luthor-border);--luthor-floating-shadow: var(--luthor-shadow);--luthor-floating-muted: var(--luthor-muted);--luthor-floating-border-hover: var(--luthor-border-hover);--luthor-floating-border-active: var(--luthor-border-active);--luthor-floating-accent: var(--luthor-accent);--luthor-floating-accent-fg: var(--luthor-bg);--luthor-syntax-comment: #64748b;--luthor-syntax-keyword: #64748b;--luthor-syntax-string: #64748b;--luthor-syntax-number: #64748b;--luthor-syntax-function: #64748b;--luthor-syntax-variable: #64748b}.luthor-preset-extensive.luthor-editor-wrapper[data-editor-theme=dark]{--luthor-bg: #0a0a0a;--luthor-fg: #ededed;--luthor-border: #262626;--luthor-border-hover: #404040;--luthor-border-active: #525252;--luthor-accent: #ededed;--luthor-accent-hover: #d4d4d8;--luthor-shadow: rgba(0, 0, 0, .5);--luthor-muted: #171717;--luthor-muted-fg: #a3a3a3;--luthor-toolbar-bg: var(--luthor-muted);--luthor-toolbar-section-border: var(--luthor-border);--luthor-toolbar-button-fg: var(--luthor-fg);--luthor-toolbar-button-hover-bg: var(--luthor-muted);--luthor-toolbar-button-hover-border: var(--luthor-border-hover);--luthor-toolbar-button-hover-shadow: 0 4px 12px rgba(0, 0, 0, .35);--luthor-toolbar-button-press-shadow: 0 2px 8px rgba(0, 0, 0, .3);--luthor-toolbar-button-active-bg: var(--luthor-accent);--luthor-toolbar-button-active-border: var(--luthor-accent);--luthor-toolbar-button-active-fg: var(--luthor-bg);--luthor-toolbar-button-active-shadow: 0 2px 8px rgba(0, 0, 0, .5);--luthor-toolbar-button-overlay: linear-gradient(135deg, rgba(255, 255, 255, .08) 0%, rgba(255, 255, 255, .03) 100%);--luthor-toolbar-button-active-overlay: linear-gradient(135deg, rgba(255, 255, 255, .14) 0%, rgba(255, 255, 255, .06) 100%);--luthor-toolbar-color-indicator-border: var(--luthor-border);--luthor-toolbar-highlight-bg: var(--luthor-muted);--luthor-quote-bg: color-mix(in srgb, var(--luthor-muted) 92%, #ffffff 8%);--luthor-quote-fg: var(--luthor-fg);--luthor-quote-border: color-mix(in srgb, var(--luthor-accent) 78%, #ffffff 22%);--luthor-text-bold-color: var(--luthor-fg);--luthor-link-color: var(--luthor-accent);--luthor-list-marker-color: var(--luthor-fg);--luthor-list-checkbox-color: var(--luthor-accent);--luthor-table-border-color: var(--luthor-border);--luthor-table-header-bg: var(--luthor-muted);--luthor-hr-color: var(--luthor-border);--luthor-placeholder-color: var(--luthor-muted-fg);--luthor-codeblock-bg: var(--luthor-muted);--luthor-floating-bg: var(--luthor-bg);--luthor-floating-fg: var(--luthor-fg);--luthor-floating-border: var(--luthor-border);--luthor-floating-shadow: var(--luthor-shadow);--luthor-floating-muted: var(--luthor-muted);--luthor-floating-border-hover: var(--luthor-border-hover);--luthor-floating-border-active: var(--luthor-border-active);--luthor-floating-accent: var(--luthor-accent);--luthor-floating-accent-fg: var(--luthor-bg);--luthor-syntax-comment: #8b949e;--luthor-syntax-keyword: #8b949e;--luthor-syntax-string: #8b949e;--luthor-syntax-number: #8b949e;--luthor-syntax-function: #8b949e;--luthor-syntax-variable: #8b949e}.luthor-preset-extensive.luthor-editor-wrapper{border:1px solid var(--luthor-border);border-radius:8px;background-color:var(--luthor-bg);overflow:hidden;display:flex;flex-direction:column;position:relative;--luthor-theme-transition: .2s ease;width:100%;max-width:100%;min-height:500px;height:auto;isolation:isolate;--luthor-z-dropdown: 20;--luthor-z-popover: 24;--luthor-z-menu: 28;--luthor-z-overlay: 32;--luthor-z-modal: 36;transition:background-color var(--luthor-theme-transition),border-color var(--luthor-theme-transition),color var(--luthor-theme-transition),box-shadow var(--luthor-theme-transition)}.luthor-preset-extensive.luthor-editor-wrapper,.luthor-preset-extensive.luthor-editor-wrapper *,.luthor-preset-extensive.luthor-editor-wrapper *:before,.luthor-preset-extensive.luthor-editor-wrapper *:after{box-sizing:border-box}.luthor-editor-header{background-color:var(--luthor-muted);border-bottom:1px solid var(--luthor-border);transition:background-color var(--luthor-theme-transition),border-color var(--luthor-theme-transition),color var(--luthor-theme-transition)}.luthor-editor-toolbar-slot{background-color:var(--luthor-toolbar-bg, var(--luthor-muted));transition:background-color var(--luthor-theme-transition),border-color var(--luthor-theme-transition),color var(--luthor-theme-transition)}.luthor-editor-toolbar-slot--bottom{border-top:1px solid var(--luthor-border)}.luthor-mode-tabs{display:flex;border-bottom:1px solid var(--luthor-border);transition:border-color var(--luthor-theme-transition),background-color var(--luthor-theme-transition)}.luthor-mode-tab{padding:10px 20px;background:none;border:none;cursor:pointer;color:var(--luthor-muted-fg);font-size:14px;font-weight:500;transition:all .2s cubic-bezier(.4,0,.2,1);border-bottom:2px solid transparent;position:relative}.luthor-mode-tab:hover{color:var(--luthor-fg);background-color:var(--luthor-muted)}.luthor-mode-tab.active{color:var(--luthor-accent);border-bottom-color:var(--luthor-accent);background-color:#0f172a0d}.luthor-tab-converting-spinner{display:inline-block;width:12px;height:12px;margin-left:6px;border:2px solid var(--luthor-muted-fg);border-top-color:var(--luthor-accent);border-radius:50%;animation:luthor-spin .6s linear infinite;vertical-align:middle}@keyframes luthor-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.luthor-toolbar{display:flex;align-items:center;gap:4px;padding:8px;flex-wrap:wrap;overflow-x:hidden;overflow-y:visible;row-gap:6px;min-height:48px;transition:background-color var(--luthor-theme-transition),border-color var(--luthor-theme-transition),color var(--luthor-theme-transition)}.luthor-toolbar--align-left{justify-content:flex-start}.luthor-toolbar--align-center{justify-content:center}.luthor-toolbar--align-right{justify-content:flex-end}.luthor-toolbar-section{display:flex;align-items:center;flex-wrap:wrap;gap:2px;padding:0 4px;min-width:0}.luthor-toolbar-section:not(:last-child){border-right:1px solid var(--luthor-toolbar-section-border, var(--luthor-border));margin-right:8px;padding-right:8px;transition:border-color var(--luthor-theme-transition)}.luthor-toolbar-button{display:flex;align-items:center;justify-content:center;width:36px;height:36px;border:1px solid transparent;border-radius:6px;background-color:transparent;color:var(--luthor-toolbar-button-fg, var(--luthor-fg));cursor:pointer;transition:all .2s cubic-bezier(.4,0,.2,1);font-size:16px;position:relative;overflow:hidden}.luthor-toolbar-button:before{content:"";position:absolute;inset:0;background:var(--luthor-toolbar-button-overlay);opacity:0;transition:opacity .2s ease}.luthor-toolbar-button:hover{background-color:var(--luthor-toolbar-button-hover-bg, var(--luthor-muted));border-color:var(--luthor-toolbar-button-hover-border, var(--luthor-border-hover));transform:translateY(-1px);box-shadow:var(--luthor-toolbar-button-hover-shadow)}.luthor-toolbar-button:hover:before{opacity:1}.luthor-toolbar-button:active{transform:translateY(0) scale(.98);box-shadow:var(--luthor-toolbar-button-press-shadow)}.luthor-toolbar-button.active{background-color:var(--luthor-toolbar-button-active-bg, var(--luthor-accent));border-color:var(--luthor-toolbar-button-active-border, var(--luthor-accent));color:var(--luthor-toolbar-button-active-fg, var(--luthor-bg));box-shadow:var(--luthor-toolbar-button-active-shadow)}.luthor-toolbar-button.active:before{background:var(--luthor-toolbar-button-active-overlay);opacity:1}.luthor-toolbar-button:disabled{opacity:.5;cursor:not-allowed;transform:none;box-shadow:none}.luthor-toolbar-button:disabled:hover{background-color:transparent;border-color:transparent;transform:none;box-shadow:none}.luthor-toolbar-button:disabled:before{opacity:0}.luthor-color-button{padding-bottom:4px}.luthor-color-button-letter{font-size:14px;line-height:1;font-weight:700;position:relative;z-index:1}.luthor-color-button-indicator{position:absolute;left:7px;right:7px;bottom:5px;height:3px;border-radius:999px;border:1px solid var(--luthor-toolbar-color-indicator-border, var(--luthor-border));box-shadow:inset 0 0 0 1px #fff3;z-index:1}.luthor-color-button.is-highlight .luthor-color-button-letter{padding:0 2px;border-radius:3px;background-color:var(--luthor-toolbar-highlight-bg, var(--luthor-muted))}.luthor-color-button-highlighter{position:relative;z-index:1}.luthor-color-picker{z-index:var(--luthor-z-popover, 440);background-color:var(--luthor-bg, #ffffff);border:1px solid var(--luthor-border, #e2e8f0);border-radius:10px;box-shadow:0 12px 28px #0f172a2e;padding:10px;display:grid;gap:9px;max-width:90vw;width:248px;color:var(--luthor-fg, #0f172a)}.luthor-color-picker-header{display:flex;align-items:center;justify-content:space-between;gap:10px}.luthor-color-picker-title{font-size:12px;font-weight:600;color:var(--luthor-fg)}.luthor-color-picker-native-hidden{position:absolute;width:0;height:0;opacity:0;pointer-events:none}.luthor-color-picker-clear{border:1px solid var(--luthor-border);border-radius:6px;background:var(--luthor-muted);color:var(--luthor-fg);font-size:12px;font-weight:500;padding:4px 8px;cursor:pointer}.luthor-color-picker-clear:hover{border-color:var(--luthor-border-hover)}.luthor-color-picker-section{display:grid;gap:6px}.luthor-color-picker-label{margin:0;font-size:11px;font-weight:600;color:var(--luthor-muted-fg);text-transform:uppercase;letter-spacing:.03em}.luthor-color-swatch-grid,.luthor-color-swatch-row{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:6px}.luthor-color-swatch{width:100%;aspect-ratio:1;border:1px solid var(--luthor-border);border-radius:6px;background-clip:padding-box;cursor:pointer;transition:transform .15s ease,border-color .15s ease;box-shadow:inset 0 0 0 1px #0f172a14}.luthor-color-swatch:hover:enabled{border-color:var(--luthor-border-hover);transform:translateY(-1px)}.luthor-color-swatch:disabled{cursor:not-allowed;background-image:repeating-linear-gradient(45deg,transparent,transparent 4px,var(--luthor-muted) 4px,var(--luthor-muted) 8px);opacity:.7}.luthor-color-picker-footer{display:flex;justify-content:space-between;align-items:center;gap:8px;padding-top:2px}.luthor-color-picker-custom{display:inline-flex;align-items:center;gap:6px;border:1px solid var(--luthor-border);border-radius:6px;background:var(--luthor-muted);color:var(--luthor-fg);font-size:12px;font-weight:500;padding:4px 8px;cursor:pointer}.luthor-color-picker-custom:hover{border-color:var(--luthor-border-hover)}.luthor-preset-extensive.luthor-editor-wrapper[data-editor-theme=dark] .luthor-color-picker{box-shadow:0 14px 32px #0009}.luthor-preset-extensive.luthor-editor-wrapper[data-editor-theme=dark] .luthor-color-swatch{box-shadow:inset 0 0 0 1px #ffffff14}.luthor-preset-extensive.luthor-editor-wrapper[data-editor-theme=dark] .luthor-color-picker-clear,.luthor-preset-extensive.luthor-editor-wrapper[data-editor-theme=dark] .luthor-color-picker-custom{background:#ffffff0a}.luthor-select{position:relative;display:inline-block}.luthor-select-trigger{display:flex;align-items:center;justify-content:space-between;gap:6px;padding:8px 12px;border:1px solid var(--luthor-border);border-radius:6px;background-color:var(--luthor-bg);color:var(--luthor-fg);cursor:pointer;font-size:14px;min-width:120px;max-width:180px;height:36px;transition:all .2s cubic-bezier(.4,0,.2,1);box-shadow:0 1px 3px #0000001a}.luthor-select-trigger span{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:left}.luthor-select-trigger:hover{border-color:var(--luthor-border-hover);box-shadow:0 2px 8px #00000026}.luthor-select-trigger.open{border-color:var(--luthor-accent);box-shadow:0 0 0 3px #0f172a1a}.luthor-select-dropdown{position:fixed;z-index:var(--luthor-z-dropdown, 420);background-color:var(--luthor-bg, #ffffff);border:1px solid var(--luthor-border, #e2e8f0);border-radius:6px;box-shadow:0 8px 32px #0000001f;max-height:200px;overflow-y:auto}.luthor-select-option{display:block;width:100%;padding:10px 14px;border:none;background:none;color:var(--luthor-fg);cursor:pointer;font-size:14px;text-align:left;transition:all .15s ease}.luthor-select-option:hover{background-color:var(--luthor-muted)}.luthor-select-option.selected{background-color:var(--luthor-accent);color:var(--luthor-bg);font-weight:500}.luthor-dropdown{position:relative;display:inline-flex}.luthor-dropdown-content{position:fixed;z-index:var(--luthor-z-dropdown, 420);background-color:var(--luthor-bg, #ffffff);border:1px solid var(--luthor-border, #e2e8f0);border-radius:4px;box-shadow:0 4px 6px -1px var(--luthor-shadow);margin-top:2px;min-width:160px;padding:4px 0}.luthor-dropdown-item{display:flex;align-items:center;gap:8px;width:100%;padding:8px 12px;border:none;background:none;color:var(--luthor-fg);cursor:pointer;font-size:14px;text-align:left;transition:background-color .15s}.luthor-dropdown-item:hover{background-color:var(--luthor-muted)}.luthor-file-input{display:none}.luthor-editor{flex:1;display:flex;flex-direction:column;min-height:400px;position:relative;--luthor-drag-gutter-width: 56px;background-color:var(--luthor-bg);transition:background-color var(--luthor-theme-transition),border-color var(--luthor-theme-transition),color var(--luthor-theme-transition)}.luthor-editor-visual-shell{display:grid;grid-template-columns:var(--luthor-drag-gutter-width) minmax(0,1fr);grid-template-rows:minmax(0,1fr);flex:1;min-height:0}.luthor-editor-visual-shell--no-gutter{grid-template-columns:minmax(0,1fr)}.luthor-editor-visual-shell.is-hidden{position:absolute;inset:0;visibility:hidden;pointer-events:none}.luthor-editor-visual-gutter{grid-column:1;grid-row:1;pointer-events:none;background-color:var(--luthor-bg);transition:background-color var(--luthor-theme-transition),border-color var(--luthor-theme-transition),color var(--luthor-theme-transition)}.luthor-editor--draggable-disabled{--luthor-drag-gutter-width: 0px}.luthor-editor--draggable-disabled .luthor-editor-visual-gutter{display:none}.luthor-richtext-container{position:relative;flex:1;--luthor-editor-content-padding-y: 20px;--luthor-editor-content-padding-x: 20px;--luthor-first-block-offset: calc(8px * var(--luthor-line-height-ratio, 1));background-color:var(--luthor-bg);transition:background-color var(--luthor-theme-transition),border-color var(--luthor-theme-transition),color var(--luthor-theme-transition)}.luthor-editor-visual-shell .luthor-richtext-container{grid-column:2;grid-row:1;min-width:0}.luthor-editor-visual-shell--no-gutter .luthor-richtext-container{grid-column:1}.luthor-content-editable{flex:1;padding:var(--luthor-editor-content-padding-y) var(--luthor-editor-content-padding-x);outline:none;color:var(--luthor-fg);line-height:1;font-size:16px;background-color:var(--luthor-bg);transition:background-color var(--luthor-theme-transition),color var(--luthor-theme-transition),border-color var(--luthor-theme-transition)}.luthor-content-editable:focus{outline:none;background-color:var(--luthor-bg)}.luthor-content-editable a,.luthor-content-editable a:hover,.luthor-content-editable a:focus-visible{cursor:pointer}.luthor-placeholder{color:var(--luthor-placeholder-color, var(--luthor-muted-fg));pointer-events:none;position:absolute;top:calc(var(--luthor-editor-content-padding-y) + var(--luthor-first-block-offset));left:var(--luthor-editor-content-padding-x);font-size:16px;line-height:var(--luthor-default-line-height, 1.5);z-index:1;transition:color var(--luthor-theme-transition),background-color var(--luthor-theme-transition),border-color var(--luthor-theme-transition)}.luthor-source-panel{padding:20px;flex:1;overflow-y:auto;background-color:var(--luthor-bg);transition:background-color var(--luthor-theme-transition),border-color var(--luthor-theme-transition),color var(--luthor-theme-transition)}.luthor-source-view{width:100%;min-height:280px;padding:12px;border:1px solid var(--luthor-border);font-family:SF Mono,Monaco,Inconsolata,Roboto Mono,Consolas,Courier New,monospace;font-size:14px;line-height:1.6;background-color:var(--luthor-bg);color:var(--luthor-fg);border-radius:0;resize:vertical;overflow-x:auto;overflow-y:auto;white-space:pre;tab-size:2;transition:background-color var(--luthor-theme-transition),color var(--luthor-theme-transition),border-color var(--luthor-theme-transition)}.luthor-source-error{display:flex;gap:12px;padding:12px;margin-bottom:12px;background-color:#dc26261a;border:1px solid rgba(220,38,38,.3);border-radius:6px;color:#dc2626;transition:background-color var(--luthor-theme-transition),border-color var(--luthor-theme-transition),color var(--luthor-theme-transition)}.luthor-preset-extensive.luthor-editor-wrapper[data-editor-theme=dark] .luthor-source-error{background-color:#ef444426;border-color:#ef444466;color:#fca5a5}.luthor-source-error-icon{flex-shrink:0;font-size:18px;line-height:1}.luthor-source-error-message{flex:1}.luthor-source-error-message strong{display:block;margin-bottom:4px;font-weight:600}.luthor-source-error-message p{margin:4px 0;font-size:13px;line-height:1.4;white-space:pre-wrap;word-break:break-word}.luthor-source-error-message small{display:block;margin-top:6px;font-size:12px;opacity:.7}.luthor-command-palette-overlay{position:absolute;inset:0;background:#00000080;display:flex;align-items:flex-start;justify-content:center;padding:min(20vh,120px) 16px 16px;z-index:var(--luthor-z-overlay, 480);overscroll-behavior:contain}.luthor-command-palette{background:var(--luthor-bg, #ffffff);border:1px solid var(--luthor-border, #e2e8f0);border-radius:12px;box-shadow:0 12px 48px #0000001f;width:min(640px,100%);max-width:100%;max-height:min(560px,calc(100% - min(20vh,120px) - 16px));display:flex;flex-direction:column;overflow:hidden;overscroll-behavior:contain}.luthor-command-palette-header{display:flex;align-items:center;padding:16px 20px;border-bottom:1px solid var(--luthor-border);gap:12px}.luthor-command-palette-icon{color:var(--luthor-muted-fg);flex-shrink:0}.luthor-command-palette-input{flex:1;background:transparent;border:none;outline:none;font-size:16px;color:var(--luthor-fg);font-family:inherit}.luthor-command-palette-input::placeholder{color:var(--luthor-muted-fg)}.luthor-command-palette-kbd{background:var(--luthor-muted);border:1px solid var(--luthor-border);border-radius:4px;padding:2px 6px;font-size:11px;color:var(--luthor-muted-fg);font-family:monospace}.luthor-command-palette-list{flex:1;overflow-y:auto;padding:8px 0;overscroll-behavior:contain}.luthor-command-palette-group{margin-bottom:8px}.luthor-command-palette-group-title{padding:8px 20px 4px;font-size:11px;font-weight:600;color:var(--luthor-muted-fg);text-transform:uppercase;letter-spacing:.5px}.luthor-command-palette-item{display:flex;align-items:center;padding:12px 20px;cursor:pointer;border:none;background:none;width:100%;text-align:left;transition:background-color .1s}.luthor-command-palette-item:hover,.luthor-command-palette-item.selected{background:var(--luthor-muted)}.luthor-command-palette-item-content{flex:1;min-width:0}.luthor-command-palette-item-title{font-size:14px;color:var(--luthor-fg);font-weight:500;margin-bottom:2px}.luthor-command-palette-item-description{font-size:12px;color:var(--luthor-muted-fg);line-height:1.4}.luthor-command-palette-item-shortcut{background:var(--luthor-muted);border:1px solid var(--luthor-border);border-radius:4px;padding:2px 6px;font-size:10px;color:var(--luthor-muted-fg);font-family:monospace;margin-left:12px;flex-shrink:0}.luthor-command-palette-footer{padding:12px 20px;border-top:1px solid var(--luthor-border);background:var(--luthor-muted)}.luthor-command-palette-hint{font-size:11px;color:var(--luthor-muted-fg);display:flex;align-items:center;gap:8px}.luthor-command-palette-hint kbd{background:var(--luthor-bg);border:1px solid var(--luthor-border);border-radius:3px;padding:1px 4px;font-size:10px;font-family:monospace}.luthor-command-palette-empty{padding:40px 20px;text-align:center;color:var(--luthor-muted-fg);font-size:14px}.luthor-slash-menu{position:fixed;z-index:var(--luthor-z-menu, 460);background:var(--luthor-bg, #ffffff);border:1px solid var(--luthor-border, #e2e8f0);border-radius:10px;box-shadow:0 12px 36px #00000024;width:min(420px,calc(100vw - 24px));max-height:min(55vh,420px);overflow:hidden;display:flex;flex-direction:column}.luthor-slash-menu-header{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:10px 12px;border-bottom:1px solid var(--luthor-border);background:var(--luthor-muted)}.luthor-slash-menu-title{font-size:12px;font-weight:600;color:var(--luthor-muted-fg);text-transform:uppercase;letter-spacing:.4px}.luthor-slash-menu-query{font-size:12px;font-family:monospace;color:var(--luthor-muted-fg);background:var(--luthor-bg);border:1px solid var(--luthor-border);padding:1px 6px;border-radius:4px}.luthor-slash-menu-list{overflow-y:auto;padding:8px 0}.luthor-slash-menu-group{margin-bottom:6px}.luthor-slash-menu-group-title{padding:6px 12px 4px;font-size:11px;font-weight:600;color:var(--luthor-muted-fg);text-transform:uppercase;letter-spacing:.5px}.luthor-slash-menu-item{width:100%;display:flex;align-items:center;gap:12px;padding:10px 12px;border:none;background:none;text-align:left;cursor:pointer;color:var(--luthor-fg);transition:background-color .12s}.luthor-slash-menu-item:hover,.luthor-slash-menu-item.selected{background:var(--luthor-muted)}.luthor-slash-menu-item-content{min-width:0;display:flex;flex-direction:column;gap:2px;flex:1}.luthor-slash-menu-item-title{font-size:14px;font-weight:500;color:var(--luthor-fg)}.luthor-slash-menu-item-description{font-size:12px;line-height:1.35;color:var(--luthor-muted-fg)}.luthor-slash-menu-item-shortcut{background:var(--luthor-muted);border:1px solid var(--luthor-border);border-radius:4px;padding:2px 6px;font-size:10px;font-family:monospace;color:var(--luthor-muted-fg);flex-shrink:0}.luthor-slash-menu-empty{padding:20px 12px;font-size:13px;color:var(--luthor-muted-fg);text-align:center}.luthor-emoji-picker-grid{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:6px;padding:8px;width:220px}.luthor-emoji-picker-item{display:inline-flex;align-items:center;justify-content:center;height:32px;border:1px solid transparent;border-radius:6px;background:transparent;cursor:pointer;font-size:18px;line-height:1}.luthor-emoji-picker-item:hover{background:var(--luthor-muted);border-color:var(--luthor-border)}.luthor-emoji-menu{position:fixed;z-index:var(--luthor-z-menu, 460);background:var(--luthor-bg, #ffffff);border:1px solid var(--luthor-border, #e2e8f0);border-radius:10px;box-shadow:0 12px 36px #00000024;width:min(320px,calc(100vw - 24px));max-height:min(45vh,320px);overflow:hidden;display:flex;flex-direction:column}.luthor-emoji-menu-header{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:10px 12px;border-bottom:1px solid var(--luthor-border);background:var(--luthor-muted)}.luthor-emoji-menu-title{font-size:12px;font-weight:600;color:var(--luthor-muted-fg);text-transform:uppercase;letter-spacing:.4px}.luthor-emoji-menu-query{font-size:12px;font-family:monospace;color:var(--luthor-muted-fg);background:var(--luthor-bg);border:1px solid var(--luthor-border);padding:1px 6px;border-radius:4px}.luthor-emoji-menu-list{overflow-y:auto;padding:6px 0}.luthor-emoji-menu-item{width:100%;display:flex;align-items:center;gap:10px;padding:8px 10px;border:none;background:none;text-align:left;cursor:pointer;color:var(--luthor-fg);transition:background-color .12s}.luthor-emoji-menu-item:hover,.luthor-emoji-menu-item.selected{background:var(--luthor-muted)}.luthor-emoji-menu-item-symbol{font-size:20px;line-height:1;width:24px;text-align:center;flex-shrink:0}.luthor-emoji-menu-item-content{min-width:0;display:flex;flex-direction:column;gap:1px;flex:1}.luthor-emoji-menu-item-title{font-size:13px;font-weight:500;color:var(--luthor-fg)}.luthor-emoji-menu-item-shortcode{font-size:12px;line-height:1.25;color:var(--luthor-muted-fg);font-family:monospace}.luthor-emoji-menu-empty{padding:18px 12px;font-size:13px;color:var(--luthor-muted-fg);text-align:center}.luthor-dialog-overlay{position:fixed;inset:0;background-color:#00000080;display:flex;align-items:center;justify-content:center;z-index:var(--luthor-z-modal, 500);overscroll-behavior:contain}.luthor-dialog{background-color:var(--luthor-bg);border-radius:10px;box-shadow:0 20px 30px var(--luthor-shadow);min-width:360px;max-width:520px;max-height:90vh;overflow:hidden}.luthor-dialog-header{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid var(--luthor-border)}.luthor-dialog-title{margin:0;font-size:16px;font-weight:600;color:var(--luthor-fg)}.luthor-dialog-close{background:none;border:none;color:var(--luthor-muted-fg);cursor:pointer;padding:4px;border-radius:6px}.luthor-dialog-close:hover{background-color:var(--luthor-muted);color:var(--luthor-fg)}.luthor-dialog-content{padding:18px 20px}.luthor-table-dialog{display:flex;flex-direction:column;gap:14px}.luthor-form-group{display:flex;flex-direction:column;gap:6px}.luthor-form-group label{font-size:13px;font-weight:600;color:var(--luthor-fg)}.luthor-input{padding:8px 12px;border:1px solid var(--luthor-border);border-radius:6px;background-color:var(--luthor-bg);color:var(--luthor-fg);font-size:13px}.luthor-input:focus{outline:none;border-color:var(--luthor-accent);box-shadow:0 0 0 3px #3b82f61f}.luthor-checkbox-label{display:flex;align-items:center;gap:8px;font-size:13px;color:var(--luthor-fg)}.luthor-checkbox{width:16px;height:16px;accent-color:var(--luthor-accent)}.luthor-dialog-actions{display:flex;justify-content:flex-end;gap:10px;margin-top:4px}.luthor-button-primary,.luthor-button-secondary{padding:8px 14px;border-radius:6px;font-size:13px;font-weight:600;cursor:pointer;border:1px solid}.luthor-button-primary{background-color:var(--luthor-accent);border-color:var(--luthor-accent);color:var(--luthor-bg)}.luthor-button-primary:hover{background-color:var(--luthor-accent-hover);border-color:var(--luthor-accent-hover)}.luthor-button-secondary{background-color:transparent;border-color:var(--luthor-border);color:var(--luthor-fg)}.luthor-button-secondary:hover{background-color:var(--luthor-muted);border-color:var(--luthor-border-hover)}.luthor-text-bold{font-weight:700;color:var(--luthor-text-bold-color, var(--luthor-fg))}.luthor-text-italic{font-style:italic}.luthor-text-underline{text-decoration:underline}.luthor-text-strikethrough{text-decoration:line-through}.luthor-text-code,.luthor-content-editable code,.luthor-code-block{font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;background-color:var(--luthor-codeblock-bg, var(--luthor-muted));border:1px solid var(--luthor-border);color:var(--luthor-syntax-string, var(--luthor-muted-fg));border-radius:4px}.luthor-content-editable .luthor-text-code,.luthor-content-editable code,.luthor-content-editable code.luthor-text-code,.luthor-preset .luthor-content-editable code,.luthor-preset-extensive .luthor-content-editable code{color:var(--luthor-syntax-string, var(--luthor-muted-fg));font-weight:500}.luthor-code-block{display:block;padding:12px;margin:12px 0;line-height:1.6;overflow-x:auto;max-width:min(100%,880px);width:100%;tab-size:2;white-space:pre-wrap;overflow-wrap:normal;word-break:normal}.luthor-code-block--interactive{position:relative;margin-top:40px;border-top-left-radius:0;border-top-right-radius:0;border-top:0}.luthor-codeblock-controls-layer{position:absolute;inset:0;pointer-events:none;z-index:25}.luthor-codeblock-controls{position:absolute;display:flex;align-items:center;justify-content:space-between;z-index:26;pointer-events:auto;margin:0;max-width:none;padding:8px 10px;border:1px solid var(--luthor-border);border-top-left-radius:8px;border-top-right-radius:8px;border-bottom:1px solid var(--luthor-border);background:var(--luthor-codeblock-bg, var(--luthor-muted))}.luthor-codeblock-controls-left,.luthor-codeblock-controls-right{display:inline-flex;align-items:center;gap:6px}.luthor-codeblock-language,.luthor-codeblock-copy{font-size:11px;line-height:1.2;height:24px;border-radius:6px;border:1px solid var(--luthor-border);background:var(--luthor-bg);color:var(--luthor-fg);padding:0 8px}.luthor-codeblock-language{min-width:88px;appearance:none}.luthor-codeblock-language option{background:var(--luthor-bg);color:var(--luthor-fg)}.luthor-codeblock-copy{cursor:pointer;font-weight:600;width:26px;height:24px;padding:0;display:inline-flex;align-items:center;justify-content:center;position:relative;background:var(--luthor-bg)}.luthor-codeblock-copy svg{width:14px;height:14px;fill:currentColor}.luthor-codeblock-copy:after{content:attr(data-tooltip);position:absolute;top:-28px;right:0;padding:2px 6px;font-size:10px;line-height:1.2;white-space:nowrap;border-radius:4px;border:1px solid var(--luthor-border);background:var(--luthor-bg);color:var(--luthor-fg);opacity:0;pointer-events:none;transform:translateY(4px);transition:opacity .15s ease,transform .15s ease}.luthor-codeblock-copy:hover:after,.luthor-codeblock-copy:focus-visible:after{opacity:1;transform:translateY(0)}.luthor-codeblock-copy:hover,.luthor-codeblock-language:hover,.luthor-codeblock-copy.is-copied{border-color:var(--luthor-border-hover);background:var(--luthor-codeblock-bg, var(--luthor-muted))}.luthor-codeblock-copy.is-copy-error{border-color:var(--luthor-syntax-variable);color:var(--luthor-syntax-variable)}.luthor-code-block[data-theme=plain]{--luthor-syntax-keyword: var(--luthor-muted-fg);--luthor-syntax-string: var(--luthor-muted-fg);--luthor-syntax-number: var(--luthor-muted-fg);--luthor-syntax-function: var(--luthor-muted-fg);--luthor-syntax-variable: var(--luthor-muted-fg)}:where(.luthor-code-comment),:where(.luthor-code-prolog),:where(.luthor-code-doctype),:where(.luthor-code-cdata),:where(.luthor-code-punctuation),:where(.luthor-code-operator),:where(.luthor-code-namespace),:where(.luthor-code-property),:where(.luthor-code-tag),:where(.luthor-code-constant),:where(.luthor-code-symbol),:where(.luthor-code-deleted),:where(.luthor-code-boolean),:where(.luthor-code-number),:where(.luthor-code-attr),:where(.luthor-code-selector),:where(.luthor-code-string),:where(.luthor-code-char),:where(.luthor-code-builtin),:where(.luthor-code-inserted),:where(.luthor-code-function),:where(.luthor-code-class),:where(.luthor-code-class-name),:where(.luthor-code-keyword),:where(.luthor-code-atrule),:where(.luthor-code-regex),:where(.luthor-code-variable),:where(.luthor-code-important){color:var(--luthor-syntax-string, var(--luthor-muted-fg));font-weight:inherit}.luthor-paragraph{margin:var(--luthor-first-block-offset) 0;line-height:var(--luthor-default-line-height, 1.5)}.luthor-heading-h1,.luthor-heading-h2,.luthor-heading-h3,.luthor-heading-h4,.luthor-heading-h5,.luthor-heading-h6{margin:calc(16px * var(--luthor-line-height-ratio, 1)) 0 calc(8px * var(--luthor-line-height-ratio, 1));line-height:var(--luthor-default-line-height, 1.5);font-weight:700}.luthor-heading-h1{font-size:28px}.luthor-heading-h2{font-size:24px}.luthor-heading-h3{font-size:20px}.luthor-heading-h4{font-size:18px}.luthor-heading-h5{font-size:16px}.luthor-heading-h6{font-size:14px}.luthor-list-ul,.luthor-list-ol{margin:10px 0 10px 20px}.luthor-list-li{margin:calc(4px * var(--luthor-line-height-ratio, 1)) 0;line-height:var(--luthor-default-line-height, 1.5)}.luthor-list-ul .luthor-list-li::marker,.luthor-list-ol .luthor-list-li::marker{color:var(--luthor-list-marker-color, var(--luthor-fg))}.luthor-list-item-unchecked,.luthor-list-item-checked{position:relative;list-style:none;margin-left:0;padding-left:28px;min-height:22px;cursor:pointer}.luthor-list-item-unchecked::marker,.luthor-list-item-checked::marker{content:""}.luthor-list-item-unchecked:before,.luthor-list-item-checked:before{content:"";position:absolute;left:0;top:.1em;width:16px;height:16px;border-radius:4px;border:1.5px solid var(--luthor-list-checkbox-color, var(--luthor-accent));background-color:var(--luthor-bg);box-sizing:border-box;transition:all .15s ease}.luthor-list-item-unchecked:hover:before{border-color:var(--luthor-list-checkbox-color, var(--luthor-accent))}.luthor-list-item-checked:before{content:"\2713";display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:700;line-height:1;color:var(--luthor-bg);border-color:var(--luthor-list-checkbox-color, var(--luthor-accent));background-color:var(--luthor-list-checkbox-color, var(--luthor-accent))}.luthor-list-item-checked{text-decoration:line-through;opacity:.85}.luthor-list-item-checked>ul,.luthor-list-item-checked>ol{text-decoration:none;opacity:1}.luthor-quote{border-left:4px solid var(--luthor-quote-border, var(--luthor-accent));background-color:var(--luthor-quote-bg, var(--luthor-muted));padding:10px 14px;margin:12px 0;color:var(--luthor-quote-fg, var(--luthor-fg));line-height:var(--luthor-default-line-height, 1.5)}.luthor-link{color:var(--luthor-link-color, var(--luthor-accent));text-decoration:underline}.luthor-link:hover{color:var(--luthor-accent-hover)}.luthor-hr{margin:16px 0;border:none;border-top:1px solid var(--luthor-hr-color, var(--luthor-border));height:1px}.luthor-preset-extensive .lexical-image{margin:1em 0;display:block;position:relative}.luthor-preset-extensive .lexical-image img{max-width:100%;height:auto;border-radius:6px;display:block}.luthor-preset-extensive .lexical-image.align-left{float:left;margin-right:1em;margin-bottom:1em}.luthor-preset-extensive .lexical-image.align-right{float:right;margin-left:1em;margin-bottom:1em}.luthor-preset-extensive .lexical-image.align-center{text-align:center;margin:1em auto}.luthor-preset-extensive .lexical-image.align-center img{margin:0 auto}.luthor-preset-extensive .lexical-image figcaption{margin-top:.5em;font-size:12px;color:var(--luthor-muted-fg);text-align:center;font-style:italic}.luthor-preset-extensive .lexical-image.selected{outline:none}.luthor-preset-extensive .resizer{position:absolute;width:8px;height:8px;background:var(--luthor-accent);border:1px solid white;border-radius:50%}.luthor-preset-extensive .resizer.ne{top:-4px;right:-4px;cursor:nesw-resize}.luthor-preset-extensive .resizer.nw{top:-4px;left:-4px;cursor:nwse-resize}.luthor-preset-extensive .resizer.se{bottom:-4px;right:-4px;cursor:nwse-resize}.luthor-preset-extensive .resizer.sw{bottom:-4px;left:-4px;cursor:nesw-resize}.luthor-table{border-collapse:collapse;width:100%;margin:16px 0;border:1px solid var(--luthor-table-border-color, var(--luthor-border))}.luthor-table-cell,.luthor-table-cell-header{border:1px solid var(--luthor-table-border-color, var(--luthor-border));padding:8px 12px;text-align:left;min-width:80px;background-color:var(--luthor-bg)}.luthor-table-cell-header{background-color:var(--luthor-table-header-bg, var(--luthor-muted));font-weight:600}.luthor-preset-extensive table[data-lexical-table-selection]{box-shadow:0 0 0 2px var(--luthor-accent)}.luthor-preset-extensive table td[data-lexical-table-cell-selection]{background-color:#3b82f61a}.luthor-table-bubble-menu{display:flex;align-items:center;gap:6px;padding:8px;border:1px solid var(--luthor-border);border-radius:10px;background:var(--luthor-bg);box-shadow:0 8px 24px var(--luthor-shadow);pointer-events:auto;white-space:nowrap}.luthor-table-bubble-button{height:30px;min-width:30px;padding:0 10px;display:inline-flex;align-items:center;justify-content:center;border-radius:6px;border:1px solid var(--luthor-border);background:var(--luthor-muted);color:var(--luthor-fg);font-size:12px;font-weight:600;line-height:1;cursor:pointer;transition:all .16s ease}.luthor-table-bubble-button svg{display:block}.luthor-table-bubble-button-icon{width:30px;padding:0}.luthor-table-bubble-button:hover{border-color:var(--luthor-border-hover);background:color-mix(in srgb,var(--luthor-muted) 58%,var(--luthor-accent) 42%);color:var(--luthor-bg)}.luthor-table-bubble-button-active{background:var(--luthor-accent);border-color:var(--luthor-accent);color:var(--luthor-bg)}.luthor-table-bubble-button-danger:hover{background:#dc2626;border-color:#dc2626;color:#fff}.luthor-table-bubble-checkbox{display:inline-flex;align-items:center;gap:6px;padding:0 6px;height:28px;font-size:12px;font-weight:600;color:var(--luthor-fg);user-select:none}.luthor-table-bubble-checkbox input{margin:0;accent-color:var(--luthor-accent)}.luthor-context-menu{position:fixed;background:var(--luthor-bg);border:1px solid var(--luthor-border);border-radius:8px;box-shadow:0 10px 30px var(--luthor-shadow);z-index:var(--luthor-z-menu, 460);min-width:160px;padding:6px 0;font-size:13px}.luthor-context-menu-item{padding:8px 14px;cursor:pointer;user-select:none}.luthor-context-menu-item:hover{background-color:var(--luthor-muted)}.luthor-context-menu-item-disabled{opacity:.5;cursor:not-allowed}.luthor-floating-toolbar{--luthor-floating-bg: #ffffff;--luthor-floating-fg: #0f172a;--luthor-floating-border: #e2e8f0;--luthor-floating-shadow: rgba(0, 0, 0, .08);--luthor-floating-muted: #f8fafc;--luthor-floating-border-hover: #cbd5e1;--luthor-floating-border-active: #94a3b8;--luthor-floating-accent: #0f172a;--luthor-floating-accent-fg: #ffffff;display:flex;align-items:center;gap:4px;padding:6px;background-color:var(--luthor-floating-bg);color:var(--luthor-floating-fg);border:1px solid var(--luthor-floating-border);border-radius:8px;box-shadow:0 8px 24px var(--luthor-floating-shadow)}.luthor-floating-toolbar[data-theme=dark]{--luthor-floating-bg: #0a0a0a;--luthor-floating-fg: #ededed;--luthor-floating-border: #262626;--luthor-floating-shadow: rgba(0, 0, 0, .5);--luthor-floating-muted: #171717;--luthor-floating-border-hover: #404040;--luthor-floating-border-active: #525252;--luthor-floating-accent: #ededed;--luthor-floating-accent-fg: #0a0a0a}.luthor-floating-toolbar .luthor-toolbar-button{color:var(--luthor-floating-fg);border-color:transparent}.luthor-floating-toolbar .luthor-toolbar-button:hover{background-color:var(--luthor-floating-muted);border-color:var(--luthor-floating-border-hover)}.luthor-floating-toolbar .luthor-toolbar-button.active{background-color:var(--luthor-floating-accent);border-color:var(--luthor-floating-accent);color:var(--luthor-floating-accent-fg)}.luthor-floating-toolbar-separator{width:1px;height:18px;background-color:var(--luthor-floating-border);margin:0 4px}.luthor-floating-toolbar-input{height:30px;min-width:140px;max-width:220px;padding:4px 8px;font-size:12px;color:var(--luthor-floating-fg);background-color:var(--luthor-floating-bg);border:1px solid var(--luthor-floating-border);border-radius:6px;outline:none}.luthor-floating-toolbar-fields{display:flex;flex-direction:column;gap:6px}.luthor-floating-toolbar-field-row{display:flex;align-items:center;gap:6px}.luthor-floating-toolbar-action{height:30px;min-width:30px;width:auto;padding:0 10px;font-size:12px;font-weight:600;border-color:var(--luthor-floating-border);background:var(--luthor-floating-muted);color:var(--luthor-floating-fg);transform:none;box-shadow:none}.luthor-floating-toolbar .luthor-floating-toolbar-action:hover{border-color:var(--luthor-floating-border-hover);background:var(--luthor-floating-muted);color:var(--luthor-floating-fg);transform:none;box-shadow:none}.luthor-floating-toolbar-action-primary,.luthor-floating-toolbar .luthor-floating-toolbar-action-primary:hover{border-color:var(--luthor-floating-accent);background:var(--luthor-floating-accent);color:var(--luthor-floating-accent-fg)}.luthor-floating-toolbar-action-danger:hover{border-color:#dc2626;background:#dc2626;color:#fff}.luthor-floating-toolbar-input:focus{border-color:var(--luthor-floating-border-active);box-shadow:0 0 0 2px color-mix(in srgb,var(--luthor-floating-accent) 18%,transparent)}.luthor-floating-toolbar-input.is-error{border-color:#dc2626}.luthor-link-hover-bubble{gap:6px;max-width:min(680px,calc(100vw - 20px));border-radius:10px;box-shadow:0 8px 24px var(--luthor-floating-shadow)}.luthor-link-hover-bubble-url{min-width:160px;max-width:360px;padding:0 4px;font-size:12px;line-height:1.4;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.luthor-link-hover-bubble-button{height:30px;min-width:30px;padding:0 10px;width:auto;font-size:12px;font-weight:600;border-color:var(--luthor-floating-border);background:var(--luthor-floating-muted);transform:none;box-shadow:none}.luthor-link-hover-bubble .luthor-link-hover-bubble-button:hover{border-color:var(--luthor-floating-border-hover);background:var(--luthor-floating-muted);transform:none;box-shadow:none}.luthor-link-hover-bubble-button-primary,.luthor-link-hover-bubble .luthor-link-hover-bubble-button-primary:hover{border-color:var(--luthor-floating-accent);background:var(--luthor-floating-accent);color:var(--luthor-floating-accent-fg)}.luthor-link-hover-bubble-button-danger:hover{border-color:#dc2626;background:#dc2626;color:#fff}.luthor-link-hover-bubble-input{height:28px;min-width:220px;max-width:360px;padding:4px 8px;font-size:12px;border:1px solid var(--luthor-floating-border);border-radius:6px;color:var(--luthor-floating-fg);background:var(--luthor-floating-bg);outline:none}.luthor-link-hover-bubble-input:focus{border-color:var(--luthor-floating-border-active);box-shadow:0 0 0 2px color-mix(in srgb,var(--luthor-floating-accent) 18%,transparent)}.luthor-link-hover-bubble-input.is-error{border-color:#dc2626}.luthor-media-embed-shell{position:relative;border:2px solid var(--luthor-border);border-radius:12px;overflow:hidden;background:var(--luthor-bg);transition:border-color var(--luthor-theme-transition),box-shadow var(--luthor-theme-transition),background-color var(--luthor-theme-transition)}.luthor-media-embed-shell:hover{border-color:var(--luthor-border-active)}.luthor-media-embed-shell.is-selected{border-color:var(--luthor-accent);box-shadow:0 0 0 3px color-mix(in srgb,var(--luthor-accent) 28%,transparent)}.luthor-media-embed-shell.is-resizing{user-select:none}.luthor-media-embed-controls{position:absolute;top:8px;right:8px;display:inline-flex;gap:4px;padding:4px;border:1px solid var(--luthor-border-hover);border-radius:8px;background:color-mix(in srgb,var(--luthor-bg) 92%,black 8%);z-index:2}.luthor-media-embed-control{border:1px solid var(--luthor-border);background:var(--luthor-muted);color:var(--luthor-fg);border-radius:6px;padding:2px 8px;font-size:11px;line-height:1.4;cursor:pointer}.luthor-media-embed-control:hover{border-color:var(--luthor-border-hover)}.luthor-media-embed-control.is-active{background:var(--luthor-accent);border-color:var(--luthor-accent);color:var(--luthor-bg)}.luthor-media-embed-resize-handle-width,.luthor-media-embed-resize-handle-height{position:absolute;border:1px solid var(--luthor-accent);background:color-mix(in srgb,var(--luthor-muted) 85%,var(--luthor-bg) 15%);border-radius:999px;z-index:2;opacity:.95;transition:background-color var(--luthor-theme-transition),border-color var(--luthor-theme-transition),transform .12s ease}.luthor-media-embed-resize-handle-width{top:50%;right:-7px;transform:translateY(-50%);width:14px;height:30px;cursor:ew-resize;border-radius:999px}.luthor-media-embed-resize-handle-height{left:50%;bottom:-7px;transform:translate(-50%);width:30px;height:14px;cursor:ns-resize;border-radius:999px}.luthor-media-embed-resize-handle-width:hover,.luthor-media-embed-resize-handle-height:hover{transform:translateY(-50%) scale(1.06)}.luthor-media-embed-resize-handle-height:hover{transform:translate(-50%) scale(1.06)}.luthor-media-embed-shell.is-resizing .luthor-media-embed-resize-handle-width,.luthor-media-embed-shell.is-resizing .luthor-media-embed-resize-handle-height{background:color-mix(in srgb,var(--luthor-accent) 28%,var(--luthor-bg) 72%);border:1px solid var(--luthor-accent)}.luthor-draggable-handle,.luthor-draggable-add-button{width:24px;height:24px;border-radius:0;border:none;background:transparent;color:var(--luthor-muted-fg);fill:currentColor;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:color .16s ease,transform .16s ease;outline:none}.luthor-draggable-add-button{width:20px;height:20px;font-size:14px;line-height:1;font-weight:500;padding:0}.luthor-draggable-handle svg{width:14px;height:14px;stroke:currentColor;fill:none}.luthor-draggable-handle:hover,.luthor-draggable-add-button:hover{color:var(--luthor-fg);transform:scale(1.04)}.luthor-draggable-handle:active,.luthor-draggable-add-button:active,.luthor-draggable-handle-active{background:transparent;color:var(--luthor-accent);transform:scale(.96)}.luthor-draggable-button-stack{display:flex;flex-direction:column;gap:6px;align-items:center;padding:0;border:none;background:transparent}.luthor-draggable-drop-indicator{height:3px;background:var(--luthor-accent);border-radius:999px}.luthor-draggable-block-dragging,.luthor-draggable-block-is-dragging{opacity:.6}.luthor-editor--draggable-disabled .luthor-draggable-button-stack,.luthor-editor--draggable-disabled .luthor-draggable-handle,.luthor-editor--draggable-disabled .luthor-draggable-add-button,.luthor-editor--draggable-disabled .luthor-draggable-drop-indicator{display:none!important}@media(max-width:768px){.luthor-preset-extensive.luthor-editor-wrapper{min-height:400px}.luthor-toolbar{padding:6px}.luthor-toolbar--align-right{justify-content:flex-start}.luthor-toolbar-button{width:32px;height:32px;font-size:14px}.luthor-toolbar-section{padding:0 2px}.luthor-toolbar-section:not(:last-child){margin-right:6px;padding-right:6px}.luthor-richtext-container{--luthor-editor-content-padding-y: 16px;--luthor-editor-content-padding-x: 16px}.luthor-content-editable{font-size:16px}.luthor-select-trigger{min-width:100px;font-size:13px}.luthor-mode-tab{padding:8px 12px;font-size:13px}}.luthor-extensive-feature-card{border:1px solid var(--luthor-border-active);border-radius:12px;padding:12px;margin:10px 0;background-color:var(--luthor-muted)}.luthor-extensive-feature-card.is-selected{box-shadow:0 0 0 2px var(--luthor-accent)}.luthor-extensive-feature-card__tag{display:inline-flex;align-items:center;font-size:10px;letter-spacing:.04em;text-transform:uppercase;color:var(--luthor-accent);border:1px solid var(--luthor-border-active);background-color:var(--luthor-bg);border-radius:999px;padding:2px 8px;margin-bottom:8px}.luthor-extensive-feature-card__title{margin:0;font-size:14px;color:var(--luthor-fg);line-height:1.35}.luthor-extensive-feature-card__description{margin:6px 0 0;font-size:12px;line-height:1.45;color:var(--luthor-muted-fg)}.luthor-preset-simple-text .luthor-editor-header{border-bottom:0}.luthor-preset-simple-text .luthor-editor{min-height:180px}.luthor-preset-rich-text-box .luthor-editor{min-height:220px}.luthor-preset-rich-text-box--compact .luthor-toolbar,.luthor-preset-rich-text-box__toolbar--compact{padding:4px;gap:2px}.luthor-preset-rich-text-box__toolbar--compact .luthor-toolbar-button{width:30px;height:30px}.luthor-preset-chat-window{display:flex;flex-direction:column;gap:10px}.luthor-chat-window-actions{display:flex;justify-content:flex-end;align-items:center;gap:8px}.luthor-chat-window-action{border:1px solid var(--luthor-border);background:var(--luthor-muted);color:var(--luthor-fg);border-radius:8px;height:32px;padding:0 12px;cursor:pointer}.luthor-chat-window-action-send{border-color:var(--luthor-accent);background:var(--luthor-accent);color:var(--luthor-bg)}.luthor-preset-email-compose{display:flex;flex-direction:column;gap:10px}.luthor-email-compose-shell{border:1px solid var(--luthor-border);border-radius:8px;overflow:hidden}.luthor-email-compose-row{display:grid;grid-template-columns:72px 1fr;align-items:center;gap:8px;padding:8px 12px;border-bottom:1px solid var(--luthor-border);background:var(--luthor-bg);color:var(--luthor-fg)}.luthor-email-compose-row:last-child{border-bottom:0}.luthor-email-compose-row input{border:0;outline:none;background:transparent}.luthor-preset-md-text{display:flex;flex-direction:column;gap:8px}.luthor-md-text-tabs{display:flex;gap:4px}.luthor-md-text-tabs button{border:1px solid var(--luthor-border);background:var(--luthor-muted);color:var(--luthor-fg);border-radius:6px;height:30px;padding:0 10px}.luthor-md-text-tabs button.active{border-color:var(--luthor-accent);background:var(--luthor-accent);color:var(--luthor-bg)}.luthor-md-text-source{width:100%;min-height:240px;border:1px solid var(--luthor-border);border-radius:8px;padding:12px;font-family:ui-monospace,Menlo,Consolas,monospace}.luthor-md-text-error{margin:6px 0 0;color:#dc2626;font-size:12px}.luthor-preset-notion-like .luthor-editor{min-height:280px}.luthor-headless-preset{border:1px solid #cbd5e1;border-radius:8px;padding:12px;display:grid;gap:10px}.luthor-headless-controls{display:flex;flex-wrap:wrap;gap:6px}.luthor-headless-controls button{height:30px;border:1px solid #cbd5e1;border-radius:6px;background:#f8fafc;color:#0f172a;text-transform:lowercase;padding:0 10px}.luthor-headless-editor-content{min-height:160px;border:1px solid #e2e8f0;border-radius:8px;padding:12px}.luthor-preset-notes{border:1px solid var(--luthor-border);border-radius:10px;padding:10px;display:grid;gap:10px;background:var(--luthor-bg)}.luthor-notes-title{border:0;outline:none;font-size:16px;font-weight:600;background:transparent;color:var(--luthor-fg)}.luthor-notes-actions{display:flex;gap:8px}.luthor-notes-actions button,.luthor-notes-actions select{border:1px solid var(--luthor-border);border-radius:6px;height:30px;padding:0 10px;background:var(--luthor-muted);color:var(--luthor-fg)}
|