@fab1o978/react-ui 0.1.3 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/dist/components/ColorPicker/index.cjs +205 -63
  2. package/dist/components/ColorPicker/index.cjs.map +1 -1
  3. package/dist/components/ColorPicker/index.css +200 -42
  4. package/dist/components/ColorPicker/index.css.map +1 -1
  5. package/dist/components/ColorPicker/index.js +205 -63
  6. package/dist/components/ColorPicker/index.js.map +1 -1
  7. package/dist/components/RichTextEditor/index.cjs +3553 -0
  8. package/dist/components/RichTextEditor/index.cjs.map +1 -0
  9. package/dist/components/RichTextEditor/index.css +356 -0
  10. package/dist/components/RichTextEditor/index.css.map +1 -0
  11. package/dist/components/RichTextEditor/index.d.cts +30 -0
  12. package/dist/components/RichTextEditor/index.d.ts +30 -0
  13. package/dist/components/RichTextEditor/index.js +3538 -0
  14. package/dist/components/RichTextEditor/index.js.map +1 -0
  15. package/dist/components/SliderControl/index.cjs +268 -0
  16. package/dist/components/SliderControl/index.cjs.map +1 -0
  17. package/dist/components/SliderControl/index.css +202 -0
  18. package/dist/components/SliderControl/index.css.map +1 -0
  19. package/dist/components/SliderControl/index.d.cts +21 -0
  20. package/dist/components/SliderControl/index.d.ts +21 -0
  21. package/dist/components/SliderControl/index.js +266 -0
  22. package/dist/components/SliderControl/index.js.map +1 -0
  23. package/dist/components/SlidingCounter/index.cjs +181 -0
  24. package/dist/components/SlidingCounter/index.cjs.map +1 -0
  25. package/dist/components/SlidingCounter/index.css +133 -0
  26. package/dist/components/SlidingCounter/index.css.map +1 -0
  27. package/dist/components/SlidingCounter/index.d.cts +19 -0
  28. package/dist/components/SlidingCounter/index.d.ts +19 -0
  29. package/dist/components/SlidingCounter/index.js +179 -0
  30. package/dist/components/SlidingCounter/index.js.map +1 -0
  31. package/dist/index.cjs +3771 -63
  32. package/dist/index.cjs.map +1 -1
  33. package/dist/index.css +685 -42
  34. package/dist/index.css.map +1 -1
  35. package/dist/index.d.cts +5 -0
  36. package/dist/index.d.ts +5 -0
  37. package/dist/index.js +3760 -65
  38. package/dist/index.js.map +1 -1
  39. package/package.json +8 -1
@@ -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":"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","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 };