@fab1o978/react-ui 0.1.3 → 0.1.5

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.
@@ -0,0 +1,356 @@
1
+ @import "https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&display=swap";
2
+
3
+ /* src/components/RichTextEditor/RichTextEditor.module.scss */
4
+ :root {
5
+ --accent: #3b82f6;
6
+ --accent-dot: rgb(82.52, 145, 247.08);
7
+ --accent-track: #3b82f6;
8
+ --accent-ring: #3b82f6;
9
+ --accent-glow: rgba(59, 130, 246, 0.3);
10
+ --accent-light: rgb(157.485, 188.725, 239.765);
11
+ --color-primary-50: rgb(169.3455, 194.6925, 236.1045);
12
+ --color-primary-100: rgb(149.4545, 184.4575, 241.6455);
13
+ --color-primary-400: rgb(82.52, 145, 247.08);
14
+ --color-primary-500: #3b82f6;
15
+ --color-primary-600: rgb(29.8390243902, 111.4024390244, 244.6609756098);
16
+ --color-primary-700: rgb(10.712195122, 95.2195121951, 233.287804878);
17
+ --color-neutral-0: #ffffff;
18
+ --color-neutral-100: #f3f4f6;
19
+ --color-neutral-200: #e5e7eb;
20
+ --color-neutral-400: #9ca3af;
21
+ --color-neutral-600: #4b5563;
22
+ --color-neutral-900: #111827;
23
+ --color-success-500: #22c55e;
24
+ --color-success-600: #16a34a;
25
+ --color-danger-500: #ef4444;
26
+ --color-danger-600: #dc2626;
27
+ --color-warning-500: #f59e0b;
28
+ --color-warning-600: #d97706;
29
+ --font-family-base:
30
+ "Inter",
31
+ system-ui,
32
+ -apple-system,
33
+ sans-serif;
34
+ --font-size-xs: 0.75rem;
35
+ --font-size-sm: 0.875rem;
36
+ --font-size-md: 1rem;
37
+ --font-size-lg: 1.125rem;
38
+ --spacing-1: 0.25rem;
39
+ --spacing-2: 0.5rem;
40
+ --spacing-3: 0.75rem;
41
+ --spacing-4: 1rem;
42
+ --radius-sm: 0.25rem;
43
+ --radius-md: 0.375rem;
44
+ --radius-lg: 0.5rem;
45
+ --radius-full: 9999px;
46
+ --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05);
47
+ --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
48
+ --transition-fast: 150ms ease;
49
+ --color-surface: #ffffff;
50
+ --color-surface-elevated: #ffffff;
51
+ }
52
+ [data-theme=dark] {
53
+ --color-neutral-0: #0f172a;
54
+ --color-neutral-100: #1e293b;
55
+ --color-neutral-200: #334155;
56
+ --color-neutral-400: #94a3b8;
57
+ --color-neutral-600: #cbd5e1;
58
+ --color-neutral-900: #f8fafc;
59
+ --color-surface: #1e293b;
60
+ --color-surface-elevated: #273549;
61
+ --color-primary-50: #172554;
62
+ --color-primary-100: #1e3a8a;
63
+ --accent-light: #172554;
64
+ --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.4);
65
+ --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.5), 0 2px 4px -2px rgb(0 0 0 / 0.4);
66
+ }
67
+ .RichTextEditor_module_root2 {
68
+ display: flex;
69
+ flex-direction: column;
70
+ border: 1px solid var(--color-neutral-200);
71
+ border-radius: var(--radius-lg);
72
+ background: var(--color-surface);
73
+ transition: border-color var(--transition-fast), box-shadow var(--transition-fast);
74
+ }
75
+ .RichTextEditor_module_root2:focus-within {
76
+ border-color: var(--rich-text-editor-accent-ring, var(--accent-ring));
77
+ box-shadow: 0 0 0 3px var(--rich-text-editor-accent-glow, var(--accent-glow));
78
+ }
79
+ .RichTextEditor_module_readOnly2 {
80
+ border-color: transparent;
81
+ background: transparent;
82
+ }
83
+ .RichTextEditor_module_readOnly2:focus-within {
84
+ border-color: transparent;
85
+ box-shadow: none;
86
+ }
87
+ .RichTextEditor_module_toolbar2 {
88
+ display: flex;
89
+ align-items: center;
90
+ gap: var(--spacing-1);
91
+ padding: var(--spacing-1) var(--spacing-2);
92
+ background: var(--color-surface-elevated);
93
+ border: 1px solid var(--color-neutral-200);
94
+ border-radius: var(--radius-md);
95
+ flex-shrink: 0;
96
+ position: sticky;
97
+ top: var(--spacing-1);
98
+ margin: var(--spacing-1) var(--spacing-1) 0;
99
+ z-index: 10;
100
+ }
101
+ .RichTextEditor_module_toolbarGroup2 {
102
+ display: flex;
103
+ align-items: center;
104
+ gap: 2px;
105
+ }
106
+ .RichTextEditor_module_divider2 {
107
+ width: 1px;
108
+ height: 18px;
109
+ background: var(--color-neutral-200);
110
+ margin: 0 var(--spacing-1);
111
+ flex-shrink: 0;
112
+ }
113
+ .RichTextEditor_module_toolbarButton2 {
114
+ display: inline-flex;
115
+ align-items: center;
116
+ justify-content: center;
117
+ width: 28px;
118
+ height: 28px;
119
+ padding: 0;
120
+ border: none;
121
+ border-radius: var(--radius-sm);
122
+ background: transparent;
123
+ color: var(--color-neutral-600);
124
+ cursor: pointer;
125
+ font-size: var(--font-size-sm);
126
+ font-family: var(--font-family-base);
127
+ line-height: 1;
128
+ transition: background var(--transition-fast), color var(--transition-fast);
129
+ }
130
+ .RichTextEditor_module_toolbarButton2:hover {
131
+ background: var(--color-neutral-100);
132
+ color: var(--color-neutral-900);
133
+ }
134
+ .RichTextEditor_module_toolbarButton2:focus-visible {
135
+ outline: 2px solid var(--rich-text-editor-accent-ring, var(--accent-ring));
136
+ outline-offset: 1px;
137
+ }
138
+ .RichTextEditor_module_toolbarButton2.RichTextEditor_module_active2 {
139
+ background: var(--rich-text-editor-accent-light, var(--accent-light));
140
+ color: var(--rich-text-editor-accent, var(--accent));
141
+ }
142
+ .RichTextEditor_module_headingButton2 {
143
+ width: auto;
144
+ min-width: 28px;
145
+ padding: 0 var(--spacing-2);
146
+ font-size: 11px;
147
+ font-weight: 700;
148
+ letter-spacing: 0.02em;
149
+ }
150
+ .RichTextEditor_module_bubbleMenu2 {
151
+ display: flex;
152
+ align-items: center;
153
+ gap: 2px;
154
+ padding: var(--spacing-1) var(--spacing-2);
155
+ background: var(--color-surface-elevated);
156
+ border: 1px solid var(--color-neutral-200);
157
+ border-radius: var(--radius-md);
158
+ box-shadow: var(--shadow-md);
159
+ }
160
+ .RichTextEditor_module_prose2 {
161
+ color: var(--color-neutral-900);
162
+ font-family: var(--font-family-base);
163
+ font-size: var(--font-size-md);
164
+ line-height: 1.65;
165
+ }
166
+ .RichTextEditor_module_prose2 > * + * {
167
+ margin-top: 0.5em;
168
+ }
169
+ .RichTextEditor_module_prose2 p {
170
+ margin: 0;
171
+ }
172
+ .RichTextEditor_module_prose2 h1 {
173
+ font-size: 1.75rem;
174
+ font-weight: 700;
175
+ line-height: 1.25;
176
+ color: var(--color-neutral-900);
177
+ margin-top: 0.75em;
178
+ margin-bottom: 0.25em;
179
+ }
180
+ .RichTextEditor_module_prose2 h1:first-child {
181
+ margin-top: 0;
182
+ }
183
+ .RichTextEditor_module_prose2 h2 {
184
+ font-size: 1.375rem;
185
+ font-weight: 600;
186
+ line-height: 1.3;
187
+ color: var(--color-neutral-900);
188
+ margin-top: 0.75em;
189
+ margin-bottom: 0.25em;
190
+ }
191
+ .RichTextEditor_module_prose2 h2:first-child {
192
+ margin-top: 0;
193
+ }
194
+ .RichTextEditor_module_prose2 h3 {
195
+ font-size: 1.125rem;
196
+ font-weight: 600;
197
+ line-height: 1.4;
198
+ color: var(--color-neutral-900);
199
+ margin-top: 0.75em;
200
+ margin-bottom: 0.25em;
201
+ }
202
+ .RichTextEditor_module_prose2 h3:first-child {
203
+ margin-top: 0;
204
+ }
205
+ .RichTextEditor_module_prose2 ul,
206
+ .RichTextEditor_module_prose2 ol {
207
+ padding-left: 1.5em;
208
+ margin: 0.5em 0;
209
+ }
210
+ .RichTextEditor_module_prose2 ul {
211
+ list-style-type: disc;
212
+ }
213
+ .RichTextEditor_module_prose2 ol {
214
+ list-style-type: decimal;
215
+ }
216
+ .RichTextEditor_module_prose2 li {
217
+ line-height: 1.65;
218
+ }
219
+ .RichTextEditor_module_prose2 li + li {
220
+ margin-top: 0.25em;
221
+ }
222
+ .RichTextEditor_module_prose2 li p {
223
+ margin: 0;
224
+ }
225
+ .RichTextEditor_module_prose2 {
226
+ padding: var(--spacing-3) var(--spacing-4);
227
+ }
228
+ .RichTextEditor_module_editorContent2 {
229
+ flex: 1;
230
+ overflow-y: auto;
231
+ max-height: var(--rte-max-height);
232
+ scrollbar-width: thin;
233
+ scrollbar-color: var(--color-neutral-200) transparent;
234
+ }
235
+ .RichTextEditor_module_editorContent2::-webkit-scrollbar {
236
+ width: 4px;
237
+ }
238
+ .RichTextEditor_module_editorContent2::-webkit-scrollbar-track {
239
+ background: transparent;
240
+ }
241
+ .RichTextEditor_module_editorContent2::-webkit-scrollbar-thumb {
242
+ background: var(--color-neutral-200);
243
+ border-radius: var(--radius-full);
244
+ }
245
+ .RichTextEditor_module_editorContent2::before {
246
+ content: "";
247
+ display: block;
248
+ position: sticky;
249
+ top: 0;
250
+ pointer-events: none;
251
+ z-index: 9;
252
+ }
253
+ .RichTextEditor_module_editorContent2 .ProseMirror {
254
+ color: var(--color-neutral-900);
255
+ font-family: var(--font-family-base);
256
+ font-size: var(--font-size-md);
257
+ line-height: 1.65;
258
+ }
259
+ .RichTextEditor_module_editorContent2 .ProseMirror > * + * {
260
+ margin-top: 0.5em;
261
+ }
262
+ .RichTextEditor_module_editorContent2 .ProseMirror p {
263
+ margin: 0;
264
+ }
265
+ .RichTextEditor_module_editorContent2 .ProseMirror h1 {
266
+ font-size: 1.75rem;
267
+ font-weight: 700;
268
+ line-height: 1.25;
269
+ color: var(--color-neutral-900);
270
+ margin-top: 0.75em;
271
+ margin-bottom: 0.25em;
272
+ }
273
+ .RichTextEditor_module_editorContent2 .ProseMirror h1:first-child {
274
+ margin-top: 0;
275
+ }
276
+ .RichTextEditor_module_editorContent2 .ProseMirror h2 {
277
+ font-size: 1.375rem;
278
+ font-weight: 600;
279
+ line-height: 1.3;
280
+ color: var(--color-neutral-900);
281
+ margin-top: 0.75em;
282
+ margin-bottom: 0.25em;
283
+ }
284
+ .RichTextEditor_module_editorContent2 .ProseMirror h2:first-child {
285
+ margin-top: 0;
286
+ }
287
+ .RichTextEditor_module_editorContent2 .ProseMirror h3 {
288
+ font-size: 1.125rem;
289
+ font-weight: 600;
290
+ line-height: 1.4;
291
+ color: var(--color-neutral-900);
292
+ margin-top: 0.75em;
293
+ margin-bottom: 0.25em;
294
+ }
295
+ .RichTextEditor_module_editorContent2 .ProseMirror h3:first-child {
296
+ margin-top: 0;
297
+ }
298
+ .RichTextEditor_module_editorContent2 .ProseMirror ul,
299
+ .RichTextEditor_module_editorContent2 .ProseMirror ol {
300
+ padding-left: 1.5em;
301
+ margin: 0.5em 0;
302
+ }
303
+ .RichTextEditor_module_editorContent2 .ProseMirror ul {
304
+ list-style-type: disc;
305
+ }
306
+ .RichTextEditor_module_editorContent2 .ProseMirror ol {
307
+ list-style-type: decimal;
308
+ }
309
+ .RichTextEditor_module_editorContent2 .ProseMirror li {
310
+ line-height: 1.65;
311
+ }
312
+ .RichTextEditor_module_editorContent2 .ProseMirror li + li {
313
+ margin-top: 0.25em;
314
+ }
315
+ .RichTextEditor_module_editorContent2 .ProseMirror li p {
316
+ margin: 0;
317
+ }
318
+ .RichTextEditor_module_editorContent2 .ProseMirror {
319
+ min-height: var(--rte-min-height, 200px);
320
+ padding: var(--spacing-3) var(--spacing-4);
321
+ outline: none;
322
+ caret-color: var(--rich-text-editor-accent, var(--accent));
323
+ }
324
+ .RichTextEditor_module_editorContent2 .ProseMirror p.RichTextEditor_module_is-empty2:first-child::before {
325
+ content: attr(data-placeholder);
326
+ color: var(--color-neutral-400);
327
+ pointer-events: none;
328
+ float: left;
329
+ height: 0;
330
+ }
331
+ .RichTextEditor_module_editorContent2 .ProseMirror div[data-type=page-break] {
332
+ position: relative;
333
+ margin: 1em 0;
334
+ border: none;
335
+ height: 0;
336
+ border-top: 2px dashed var(--color-neutral-200);
337
+ pointer-events: none;
338
+ user-select: none;
339
+ }
340
+ .RichTextEditor_module_editorContent2 .ProseMirror div[data-type=page-break]::after {
341
+ content: "Page break";
342
+ position: absolute;
343
+ top: 50%;
344
+ left: 50%;
345
+ transform: translate(-50%, -50%);
346
+ padding: 0 var(--spacing-2);
347
+ background: var(--color-surface);
348
+ font-size: var(--font-size-xs);
349
+ color: var(--color-neutral-400);
350
+ font-family: var(--font-family-base);
351
+ white-space: nowrap;
352
+ }
353
+ .RichTextEditor_module_editorContent2 .ProseMirror ::selection {
354
+ background: var(--rich-text-editor-accent-light, var(--accent-light));
355
+ }
356
+ /*# sourceMappingURL=index.css.map */
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/styles/tokens.scss","../../../src/components/RichTextEditor/RichTextEditor.module.scss"],"sourcesContent":["@use \"sass:color\";\n\n@import url(\"https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&display=swap\");\n\n// Accent di default — cambia qui per aggiornare tutta la libreria\n$accent: #3b82f6;\n\n:root {\n // Accent scale — derivata da $accent a compile time\n --accent: #{$accent};\n --accent-dot: #{color.scale($accent, $lightness: 12%)};\n --accent-track: #{$accent};\n --accent-ring: #{$accent};\n --accent-glow: #{color.change($accent, $alpha: 0.3)};\n --accent-light: #{color.scale($accent, $lightness: 45%, $saturation: -20%)};\n\n // Primary scale (mantenuta per retrocompatibilità con Button, Badge, Input)\n --color-primary-50: #{color.scale($accent, $lightness: 49%, $saturation: -30%)};\n --color-primary-100: #{color.scale($accent, $lightness: 42%, $saturation: -15%)};\n --color-primary-400: #{color.scale($accent, $lightness: 12%)};\n --color-primary-500: #{$accent};\n --color-primary-600: #{color.scale($accent, $lightness: -10%)};\n --color-primary-700: #{color.scale($accent, $lightness: -20%)};\n\n // Neutral\n --color-neutral-0: #ffffff;\n --color-neutral-100: #f3f4f6;\n --color-neutral-200: #e5e7eb;\n --color-neutral-400: #9ca3af;\n --color-neutral-600: #4b5563;\n --color-neutral-900: #111827;\n\n // Semantic\n --color-success-500: #22c55e;\n --color-success-600: #16a34a;\n --color-danger-500: #ef4444;\n --color-danger-600: #dc2626;\n --color-warning-500: #f59e0b;\n --color-warning-600: #d97706;\n\n // Typography\n --font-family-base: \"Inter\", system-ui, -apple-system, sans-serif;\n --font-size-xs: 0.75rem;\n --font-size-sm: 0.875rem;\n --font-size-md: 1rem;\n --font-size-lg: 1.125rem;\n\n // Spacing\n --spacing-1: 0.25rem;\n --spacing-2: 0.5rem;\n --spacing-3: 0.75rem;\n --spacing-4: 1rem;\n\n // Radius\n --radius-sm: 0.25rem;\n --radius-md: 0.375rem;\n --radius-lg: 0.5rem;\n --radius-full: 9999px;\n\n // Shadows\n --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);\n\n // Transitions\n --transition-fast: 150ms ease;\n\n // Surface (background di card/panel)\n --color-surface: #ffffff;\n --color-surface-elevated: #ffffff;\n}\n\n// ─── Dark theme ────────────────────────────────────────────────────────────────\n// Applicato via data-theme=\"dark\" sull'elemento root (gestito da Storybook decorator\n// e dall'app consumer). I componenti non devono fare nulla di speciale: basta che\n// usino i token var() e riceveranno automaticamente i valori dark.\n\n[data-theme=\"dark\"] {\n // Neutral (scala invertita)\n --color-neutral-0: #0f172a;\n --color-neutral-100: #1e293b;\n --color-neutral-200: #334155;\n --color-neutral-400: #94a3b8;\n --color-neutral-600: #cbd5e1;\n --color-neutral-900: #f8fafc;\n\n // Surface\n --color-surface: #1e293b;\n --color-surface-elevated: #273549;\n\n // Primary scale dark (per il default accent blu — le sfumature chiare diventano scure)\n --color-primary-50: #172554;\n --color-primary-100: #1e3a8a;\n // 400 / 500 / 600 / 700 rimangono invariati (abbastanza saturi su bg scuro)\n\n // Accent light: variante scura\n --accent-light: #172554;\n\n // Shadows (più forti su bg scuro)\n --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.4);\n --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.5), 0 2px 4px -2px rgb(0 0 0 / 0.4);\n}\n","@use \"../../styles/tokens\" as *;\n\n// ─── Root ─────────────────────────────────────────────────────────────────────\n\n.root {\n display: flex;\n flex-direction: column;\n border: 1px solid var(--color-neutral-200);\n border-radius: var(--radius-lg);\n background: var(--color-surface);\n transition:\n border-color var(--transition-fast),\n box-shadow var(--transition-fast);\n &:focus-within {\n border-color: var(--rich-text-editor-accent-ring, var(--accent-ring));\n box-shadow: 0 0 0 3px var(--rich-text-editor-accent-glow, var(--accent-glow));\n }\n}\n\n.readOnly {\n border-color: transparent;\n background: transparent;\n\n &:focus-within {\n border-color: transparent;\n box-shadow: none;\n }\n}\n\n// ─── Toolbar ──────────────────────────────────────────────────────────────────\n\n.toolbar {\n display: flex;\n align-items: center;\n gap: var(--spacing-1);\n padding: var(--spacing-1) var(--spacing-2);\n background: var(--color-surface-elevated);\n border: 1px solid var(--color-neutral-200);\n border-radius: var(--radius-md);\n flex-shrink: 0;\n position: sticky;\n top: var(--spacing-1);\n margin: var(--spacing-1) var(--spacing-1) 0;\n z-index: 10;\n}\n\n.toolbarGroup {\n display: flex;\n align-items: center;\n gap: 2px;\n}\n\n.divider {\n width: 1px;\n height: 18px;\n background: var(--color-neutral-200);\n margin: 0 var(--spacing-1);\n flex-shrink: 0;\n}\n\n// ─── Toolbar button ───────────────────────────────────────────────────────────\n\n.toolbarButton {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n padding: 0;\n border: none;\n border-radius: var(--radius-sm);\n background: transparent;\n color: var(--color-neutral-600);\n cursor: pointer;\n font-size: var(--font-size-sm);\n font-family: var(--font-family-base);\n line-height: 1;\n transition:\n background var(--transition-fast),\n color var(--transition-fast);\n\n &:hover {\n background: var(--color-neutral-100);\n color: var(--color-neutral-900);\n }\n\n &:focus-visible {\n outline: 2px solid var(--rich-text-editor-accent-ring, var(--accent-ring));\n outline-offset: 1px;\n }\n\n &.active {\n background: var(--rich-text-editor-accent-light, var(--accent-light));\n color: var(--rich-text-editor-accent, var(--accent));\n }\n}\n\n.headingButton {\n width: auto;\n min-width: 28px;\n padding: 0 var(--spacing-2);\n font-size: 11px;\n font-weight: 700;\n letter-spacing: 0.02em;\n}\n\n// ─── Bubble menu ──────────────────────────────────────────────────────────────\n\n.bubbleMenu {\n display: flex;\n align-items: center;\n gap: 2px;\n padding: var(--spacing-1) var(--spacing-2);\n background: var(--color-surface-elevated);\n border: 1px solid var(--color-neutral-200);\n border-radius: var(--radius-md);\n box-shadow: var(--shadow-md);\n}\n\n// ─── Shared prose typography ──────────────────────────────────────────────────\n// Applied both to the editor (.editorContent) and to external preview divs (.prose).\n\n@mixin prose {\n color: var(--color-neutral-900);\n font-family: var(--font-family-base);\n font-size: var(--font-size-md);\n line-height: 1.65;\n\n > * + * { margin-top: 0.5em; }\n\n p { margin: 0; }\n\n h1 {\n font-size: 1.75rem;\n font-weight: 700;\n line-height: 1.25;\n color: var(--color-neutral-900);\n margin-top: 0.75em;\n margin-bottom: 0.25em;\n &:first-child { margin-top: 0; }\n }\n\n h2 {\n font-size: 1.375rem;\n font-weight: 600;\n line-height: 1.3;\n color: var(--color-neutral-900);\n margin-top: 0.75em;\n margin-bottom: 0.25em;\n &:first-child { margin-top: 0; }\n }\n\n h3 {\n font-size: 1.125rem;\n font-weight: 600;\n line-height: 1.4;\n color: var(--color-neutral-900);\n margin-top: 0.75em;\n margin-bottom: 0.25em;\n &:first-child { margin-top: 0; }\n }\n\n ul, ol {\n padding-left: 1.5em;\n margin: 0.5em 0;\n }\n\n ul { list-style-type: disc; }\n ol { list-style-type: decimal; }\n\n li {\n line-height: 1.65;\n + li { margin-top: 0.25em; }\n p { margin: 0; }\n }\n}\n\n// Exported class for use in preview divs outside the editor.\n.prose {\n @include prose;\n padding: var(--spacing-3) var(--spacing-4);\n}\n\n// ─── Editor content ───────────────────────────────────────────────────────────\n\n.editorContent {\n flex: 1;\n overflow-y: auto;\n max-height: var(--rte-max-height);\n scrollbar-width: thin;\n scrollbar-color: var(--color-neutral-200) transparent;\n\n &::-webkit-scrollbar { width: 4px; }\n &::-webkit-scrollbar-track { background: transparent; }\n &::-webkit-scrollbar-thumb {\n background: var(--color-neutral-200);\n border-radius: var(--radius-full);\n }\n\n &::before {\n content: \"\";\n display: block;\n position: sticky;\n top: 0;\n // height: 36px;\n // margin-bottom: -36px;\n // background: linear-gradient(to bottom, var(--color-surface) 0%, transparent 100%);\n pointer-events: none;\n z-index: 9;\n }\n\n :global(.ProseMirror) {\n @include prose;\n min-height: var(--rte-min-height, 200px);\n padding: var(--spacing-3) var(--spacing-4);\n outline: none;\n caret-color: var(--rich-text-editor-accent, var(--accent));\n\n p.is-empty:first-child::before {\n content: attr(data-placeholder);\n color: var(--color-neutral-400);\n pointer-events: none;\n float: left;\n height: 0;\n }\n\n // ── Page break ─────────────────────────────────────────────────────────\n div[data-type=\"page-break\"] {\n position: relative;\n margin: 1em 0;\n border: none;\n height: 0;\n border-top: 2px dashed var(--color-neutral-200);\n pointer-events: none;\n user-select: none;\n\n &::after {\n content: \"Page break\";\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n padding: 0 var(--spacing-2);\n background: var(--color-surface);\n font-size: var(--font-size-xs);\n color: var(--color-neutral-400);\n font-family: var(--font-family-base);\n white-space: nowrap;\n }\n }\n\n ::selection {\n background: var(--rich-text-editor-accent-light, var(--accent-light));\n }\n }\n}\n"],"mappings":";;;AAOA;AAEE,YAAA;AACA,gBAAA,IAAA,KAAA,EAAA,GAAA,EAAA;AACA,kBAAA;AACA,iBAAA;AACA,iBAAA,KAAA,EAAA,EAAA,GAAA,EAAA,GAAA,EAAA;AACA,kBAAA,IAAA,OAAA,EAAA,OAAA,EAAA;AAGA,sBAAA,IAAA,QAAA,EAAA,QAAA,EAAA;AACA,uBAAA,IAAA,QAAA,EAAA,QAAA,EAAA;AACA,uBAAA,IAAA,KAAA,EAAA,GAAA,EAAA;AACA,uBAAA;AACA,uBAAA,IAAA,aAAA,EAAA,cAAA,EAAA;AACA,uBAAA,IAAA,YAAA,EAAA,aAAA,EAAA;AAGA,qBAAA;AACA,uBAAA;AACA,uBAAA;AACA,uBAAA;AACA,uBAAA;AACA,uBAAA;AAGA,uBAAA;AACA,uBAAA;AACA,sBAAA;AACA,sBAAA;AACA,uBAAA;AACA,uBAAA;AAGA;IAAA,OAAA;IAAA,SAAA;IAAA,aAAA;IAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AAGA,eAAA;AACA,eAAA;AACA,eAAA;AACA,eAAA;AAGA,eAAA;AACA,eAAA;AACA,eAAA;AACA,iBAAA;AAGA,eAAA,EAAA,IAAA,IAAA,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA;AACA,eAAA,EAAA,IAAA,IAAA,KAAA,IAAA,EAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IAAA,KAAA,IAAA,EAAA,EAAA,EAAA,EAAA;AAGA,qBAAA,MAAA;AAGA,mBAAA;AACA,4BAAA;;AAQF,CAAA;AAEE,qBAAA;AACA,uBAAA;AACA,uBAAA;AACA,uBAAA;AACA,uBAAA;AACA,uBAAA;AAGA,mBAAA;AACA,4BAAA;AAGA,sBAAA;AACA,uBAAA;AAIA,kBAAA;AAGA,eAAA,EAAA,IAAA,IAAA,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA;AACA,eAAA,EAAA,IAAA,IAAA,KAAA,IAAA,EAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IAAA,KAAA,IAAA,EAAA,EAAA,EAAA,EAAA;;AC/FF,CAAAA;AACE,WAAA;AACA,kBAAA;AACA,UAAA,IAAA,MAAA,IAAA;AACA,iBAAA,IAAA;AACA,cAAA,IAAA;AACA,cACE,aAAA,IAAA,kBAAA,EAAA,WAAA,IAAA;;AAEF,CATFA,2BASE;AACE,gBAAA,IAAA,8BAAA,EAAA,IAAA;AACA,cAAA,EAAA,EAAA,EAAA,IAAA,IAAA,8BAAA,EAAA,IAAA;;AAIJ,CAAAC;AACE,gBAAA;AACA,cAAA;;AAEA,CAJFA,+BAIE;AACE,gBAAA;AACA,cAAA;;AAMJ,CAAAC;AACE,WAAA;AACA,eAAA;AACA,OAAA,IAAA;AACA,WAAA,IAAA,aAAA,IAAA;AACA,cAAA,IAAA;AACA,UAAA,IAAA,MAAA,IAAA;AACA,iBAAA,IAAA;AACA,eAAA;AACA,YAAA;AACA,OAAA,IAAA;AACA,UAAA,IAAA,aAAA,IAAA,aAAA;AACA,WAAA;;AAGF,CAAAC;AACE,WAAA;AACA,eAAA;AACA,OAAA;;AAGF,CAAAC;AACE,SAAA;AACA,UAAA;AACA,cAAA,IAAA;AACA,UAAA,EAAA,IAAA;AACA,eAAA;;AAKF,CAAAC;AACE,WAAA;AACA,eAAA;AACA,mBAAA;AACA,SAAA;AACA,UAAA;AACA,WAAA;AACA,UAAA;AACA,iBAAA,IAAA;AACA,cAAA;AACA,SAAA,IAAA;AACA,UAAA;AACA,aAAA,IAAA;AACA,eAAA,IAAA;AACA,eAAA;AACA,cACE,WAAA,IAAA,kBAAA,EAAA,MAAA,IAAA;;AAGF,CAnBFA,oCAmBE;AACE,cAAA,IAAA;AACA,SAAA,IAAA;;AAGF,CAxBFA,oCAwBE;AACE,WAAA,IAAA,MAAA,IAAA,8BAAA,EAAA,IAAA;AACA,kBAAA;;AAGF,CA7BFA,oCA6BE,CAAAC;AACE,cAAA,IAAA,+BAAA,EAAA,IAAA;AACA,SAAA,IAAA,yBAAA,EAAA,IAAA;;AAIJ,CAAAC;AACE,SAAA;AACA,aAAA;AACA,WAAA,EAAA,IAAA;AACA,aAAA;AACA,eAAA;AACA,kBAAA;;AAKF,CAAAC;AACE,WAAA;AACA,eAAA;AACA,OAAA;AACA,WAAA,IAAA,aAAA,IAAA;AACA,cAAA,IAAA;AACA,UAAA,IAAA,MAAA,IAAA;AACA,iBAAA,IAAA;AACA,cAAA,IAAA;;AA8DF,CAAAC;AAvDE,SAAA,IAAA;AACA,eAAA,IAAA;AACA,aAAA,IAAA;AACA,eAAA;;AAEA,CAkDFA,6BAlDE,EAAA,EAAA,EAAA;AAAU,cAAA;;AAEV,CAgDFA,6BAhDE;AAAI,UAAA;;AAEJ,CA8CFA,6BA9CE;AACE,aAAA;AACA,eAAA;AACA,eAAA;AACA,SAAA,IAAA;AACA,cAAA;AACA,iBAAA;;AACA,CAuCJA,6BAvCI,EAAA;AAAgB,cAAA;;AAGlB,CAoCFA,6BApCE;AACE,aAAA;AACA,eAAA;AACA,eAAA;AACA,SAAA,IAAA;AACA,cAAA;AACA,iBAAA;;AACA,CA6BJA,6BA7BI,EAAA;AAAgB,cAAA;;AAGlB,CA0BFA,6BA1BE;AACE,aAAA;AACA,eAAA;AACA,eAAA;AACA,SAAA,IAAA;AACA,cAAA;AACA,iBAAA;;AACA,CAmBJA,6BAnBI,EAAA;AAAgB,cAAA;;AAGlB,CAgBFA,6BAhBE;AAAA,CAgBFA,6BAhBE;AACE,gBAAA;AACA,UAAA,MAAA;;AAGF,CAWFA,6BAXE;AAAK,mBAAA;;AACL,CAUFA,6BAVE;AAAK,mBAAA;;AAEL,CAQFA,6BARE;AACE,eAAA;;AACA,CAMJA,6BANI,GAAA,EAAA;AAAO,cAAA;;AACP,CAKJA,6BALI,GAAA;AAAI,UAAA;;AAKR,CAAAA;AAEE,WAAA,IAAA,aAAA,IAAA;;AAKF,CAAAC;AACE,QAAA;AACA,cAAA;AACA,cAAA,IAAA;AACA,mBAAA;AACA,mBAAA,IAAA,qBAAA;;AAEA,CAPFA,oCAOE;AAAuB,SAAA;;AACvB,CARFA,oCAQE;AAA6B,cAAA;;AAC7B,CATFA,oCASE;AACE,cAAA,IAAA;AACA,iBAAA,IAAA;;AAGF,CAdFA,oCAcE;AACE,WAAA;AACA,WAAA;AACA,YAAA;AACA,OAAA;AAIA,kBAAA;AACA,WAAA;;AAGF,CA1BFA,qCA0BE,CAAA;AAxFA,SAAA,IAAA;AACA,eAAA,IAAA;AACA,aAAA,IAAA;AACA,eAAA;;AAEA,CAyDFA,qCAzDE,CAmFA,YAnFA,EAAA,EAAA,EAAA;AAAU,cAAA;;AAEV,CAuDFA,qCAvDE,CAiFA,YAjFA;AAAI,UAAA;;AAEJ,CAqDFA,qCArDE,CA+EA,YA/EA;AACE,aAAA;AACA,eAAA;AACA,eAAA;AACA,SAAA,IAAA;AACA,cAAA;AACA,iBAAA;;AACA,CA8CJA,qCA9CI,CAwEF,YAxEE,EAAA;AAAgB,cAAA;;AAGlB,CA2CFA,qCA3CE,CAqEA,YArEA;AACE,aAAA;AACA,eAAA;AACA,eAAA;AACA,SAAA,IAAA;AACA,cAAA;AACA,iBAAA;;AACA,CAoCJA,qCApCI,CA8DF,YA9DE,EAAA;AAAgB,cAAA;;AAGlB,CAiCFA,qCAjCE,CA2DA,YA3DA;AACE,aAAA;AACA,eAAA;AACA,eAAA;AACA,SAAA,IAAA;AACA,cAAA;AACA,iBAAA;;AACA,CA0BJA,qCA1BI,CAoDF,YApDE,EAAA;AAAgB,cAAA;;AAGlB,CAuBFA,qCAvBE,CAiDA,YAjDA;AAAA,CAuBFA,qCAvBE,CAiDA,YAjDA;AACE,gBAAA;AACA,UAAA,MAAA;;AAGF,CAkBFA,qCAlBE,CA4CA,YA5CA;AAAK,mBAAA;;AACL,CAiBFA,qCAjBE,CA2CA,YA3CA;AAAK,mBAAA;;AAEL,CAeFA,qCAfE,CAyCA,YAzCA;AACE,eAAA;;AACA,CAaJA,qCAbI,CAuCF,YAvCE,GAAA,EAAA;AAAO,cAAA;;AACP,CAYJA,qCAZI,CAsCF,YAtCE,GAAA;AAAI,UAAA;;AAsCN,CA1BFA,qCA0BE,CAAA;AAEE,cAAA,IAAA,gBAAA,EAAA;AACA,WAAA,IAAA,aAAA,IAAA;AACA,WAAA;AACA,eAAA,IAAA,yBAAA,EAAA,IAAA;;AAEA,CAjCJA,qCAiCI,CAPF,YAOE,CAAA,CAAAC,+BAAA,YAAA;AACE,WAAA,KAAA;AACA,SAAA,IAAA;AACA,kBAAA;AACA,SAAA;AACA,UAAA;;AAIF,CA1CJD,qCA0CI,CAhBF,YAgBE,GAAA,CAAA;AACE,YAAA;AACA,UAAA,IAAA;AACA,UAAA;AACA,UAAA;AACA,cAAA,IAAA,OAAA,IAAA;AACA,kBAAA;AACA,eAAA;;AAEA,CAnDNA,qCAmDM,CAzBJ,YAyBI,GAAA,CAAA,qBAAA;AACE,WAAA;AACA,YAAA;AACA,OAAA;AACA,QAAA;AACA,aAAA,UAAA,IAAA,EAAA;AACA,WAAA,EAAA,IAAA;AACA,cAAA,IAAA;AACA,aAAA,IAAA;AACA,SAAA,IAAA;AACA,eAAA,IAAA;AACA,eAAA;;AAIJ,CAlEJA,qCAkEI,CAxCF,YAwCE;AACE,cAAA,IAAA,+BAAA,EAAA,IAAA;;","names":["root","readOnly","toolbar","toolbarGroup","divider","toolbarButton","active","headingButton","bubbleMenu","prose","editorContent","is-empty"]}
@@ -0,0 +1,30 @@
1
+ import React from 'react';
2
+ import { Extensions, JSONContent, Mark, Node } from '@tiptap/core';
3
+ export { useCurrentEditor } from '@tiptap/react';
4
+
5
+ interface RichTextEditorProps {
6
+ value?: string;
7
+ placeholder?: string;
8
+ readOnly?: boolean;
9
+ minHeight?: string | number;
10
+ maxHeight?: string | number;
11
+ accent?: string;
12
+ extensions?: Extensions;
13
+ /** Rendered inside the toolbar, after the built-in buttons. Use with useCurrentEditor(). */
14
+ slotBefore?: React.ReactNode;
15
+ /** Rendered below the editor area. Use with useCurrentEditor(). */
16
+ slotAfter?: React.ReactNode;
17
+ onChangeHTML?: (html: string) => void;
18
+ onChangeJSON?: (json: JSONContent) => void;
19
+ }
20
+ declare const RichTextEditor: React.FC<RichTextEditorProps>;
21
+
22
+ declare const Highlight: Mark<any, any>;
23
+
24
+ declare const HighlightButton: React.FC;
25
+
26
+ declare const PageBreak: Node<any, any>;
27
+
28
+ declare const PageBreakButton: React.FC;
29
+
30
+ export { Highlight, HighlightButton, PageBreak, PageBreakButton, RichTextEditor, type RichTextEditorProps };
@@ -0,0 +1,30 @@
1
+ import React from 'react';
2
+ import { Extensions, JSONContent, Mark, Node } from '@tiptap/core';
3
+ export { useCurrentEditor } from '@tiptap/react';
4
+
5
+ interface RichTextEditorProps {
6
+ value?: string;
7
+ placeholder?: string;
8
+ readOnly?: boolean;
9
+ minHeight?: string | number;
10
+ maxHeight?: string | number;
11
+ accent?: string;
12
+ extensions?: Extensions;
13
+ /** Rendered inside the toolbar, after the built-in buttons. Use with useCurrentEditor(). */
14
+ slotBefore?: React.ReactNode;
15
+ /** Rendered below the editor area. Use with useCurrentEditor(). */
16
+ slotAfter?: React.ReactNode;
17
+ onChangeHTML?: (html: string) => void;
18
+ onChangeJSON?: (json: JSONContent) => void;
19
+ }
20
+ declare const RichTextEditor: React.FC<RichTextEditorProps>;
21
+
22
+ declare const Highlight: Mark<any, any>;
23
+
24
+ declare const HighlightButton: React.FC;
25
+
26
+ declare const PageBreak: Node<any, any>;
27
+
28
+ declare const PageBreakButton: React.FC;
29
+
30
+ export { Highlight, HighlightButton, PageBreak, PageBreakButton, RichTextEditor, type RichTextEditorProps };