@xjur-ui/react 1.0.3 → 1.0.6

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 (38) hide show
  1. package/.turbo/turbo-build.log +32 -22
  2. package/CHANGELOG.md +20 -0
  3. package/dist/components/date-picker.js +1 -1
  4. package/dist/components/divider.js +2 -1
  5. package/dist/components/dropdown-menu.js +3 -2
  6. package/dist/components/icon.d.ts +1 -1
  7. package/dist/components/icon.js +5 -1
  8. package/dist/components/input.js +1 -1
  9. package/dist/components/otp-input.js +1 -1
  10. package/dist/components/rich-editor.d.ts +25 -0
  11. package/dist/components/rich-editor.js +723 -0
  12. package/dist/components/search-input.js +1 -1
  13. package/dist/components/select.js +2 -2
  14. package/dist/components/skeleton.d.ts +6 -0
  15. package/dist/components/skeleton.js +16 -0
  16. package/dist/components/status.d.ts +14 -0
  17. package/dist/components/status.js +111 -0
  18. package/dist/components/test.d.ts +5 -0
  19. package/dist/components/test.js +8 -0
  20. package/dist/components/tooltip.d.ts +11 -0
  21. package/dist/components/tooltip.js +58 -0
  22. package/dist/index.css +251 -25
  23. package/package.json +14 -2
  24. package/src/components/date-picker.tsx +1 -1
  25. package/src/components/divider.tsx +2 -1
  26. package/src/components/dropdown-menu.tsx +1 -1
  27. package/src/components/input.tsx +1 -1
  28. package/src/components/otp-input.tsx +1 -1
  29. package/src/components/rich-editor.tsx +371 -0
  30. package/src/components/search-input.tsx +1 -2
  31. package/src/components/select.tsx +1 -1
  32. package/src/components/skeleton.tsx +12 -0
  33. package/src/components/status.tsx +43 -0
  34. package/src/components/test.tsx +3 -0
  35. package/src/components/tooltip.tsx +63 -0
  36. package/src/hooks/index.ts +1 -0
  37. package/src/hooks/use-os.ts +32 -0
  38. package/src/resources/icons.ts +5 -1
@@ -0,0 +1,723 @@
1
+ // src/components/rich-editor.tsx
2
+ import { cx as cx7 } from "@xjur-ui/util";
3
+ import { useCallback, useMemo, useState as useState2 } from "react";
4
+ import {
5
+ EditorContent,
6
+ EditorContext,
7
+ useCurrentEditor as useRichTextEditor,
8
+ useEditorState as useRichTextEditorState,
9
+ useEditor
10
+ } from "@tiptap/react";
11
+ import { StarterKit } from "@tiptap/starter-kit";
12
+ import { Heading } from "@tiptap/extension-heading";
13
+ import { Placeholder } from "@tiptap/extensions";
14
+
15
+ // src/hooks/use-os.ts
16
+ import { useState, useEffect } from "react";
17
+ function useOS() {
18
+ const [os, setOs] = useState("unknown");
19
+ useEffect(() => {
20
+ if (typeof window === "undefined") return;
21
+ const userAgent = window.navigator.userAgent;
22
+ if (/iPad|iPhone|iPod/.test(userAgent)) {
23
+ setOs("ios");
24
+ } else if (/Mac/.test(userAgent)) {
25
+ setOs("macos");
26
+ } else if (/Win/.test(userAgent)) {
27
+ setOs("windows");
28
+ } else if (/Android/.test(userAgent)) {
29
+ setOs("android");
30
+ } else if (/Linux/.test(userAgent)) {
31
+ setOs("linux");
32
+ } else {
33
+ setOs("unknown");
34
+ }
35
+ }, []);
36
+ return {
37
+ os,
38
+ shortcut: ["macos", "ios"].includes(os) ? "\u2318" : "Ctrl"
39
+ };
40
+ }
41
+
42
+ // src/components/icon.tsx
43
+ import { cx } from "@xjur-ui/util";
44
+ import { jsx } from "react/jsx-runtime";
45
+ function Icon({ className, filled = false, name, ...props }) {
46
+ return /* @__PURE__ */ jsx(
47
+ "span",
48
+ {
49
+ ...props,
50
+ className: cx(
51
+ "material-symbols-outlined",
52
+ "text-size-body-lg",
53
+ className
54
+ ),
55
+ style: {
56
+ fontVariationSettings: `'FILL' ${filled ? 1 : 0}, 'wght' 600, 'GRAD' 0, 'opsz' 20`,
57
+ ...props.style
58
+ },
59
+ children: name
60
+ }
61
+ );
62
+ }
63
+
64
+ // src/components/button.tsx
65
+ import { Slot } from "@radix-ui/react-slot";
66
+ import { cva, cx as cx2 } from "@xjur-ui/util";
67
+ import { jsx as jsx2 } from "react/jsx-runtime";
68
+ var buttonVariants = cva(
69
+ [
70
+ "outline-none inline-flex items-center justify-center rounded-circle gap-small cursor-pointer disabled:opacity-38 disabled:pointer-events-none transition-colors"
71
+ ],
72
+ {
73
+ variants: {
74
+ size: {
75
+ md: "py-small_1x-alt px-medium text-size-body-md",
76
+ sm: "py-small-1x px-small text-size-label-sm",
77
+ icon_md: "p-small text-size-body-md h-large-4x w-large-4x",
78
+ icon_sm: "p-small-1x text-size-label-sm h-large-2x w-large-2x"
79
+ },
80
+ variant: {
81
+ primary: "",
82
+ secondary: "",
83
+ tertiary: "",
84
+ destructive: "",
85
+ outlined: "bg-layer-2-idle border border-border-layer-2 hover:bg-layer-2-hover active:bg-layer-2-pressed"
86
+ },
87
+ appearance: {
88
+ solid: "",
89
+ ghost: "bg-transparent"
90
+ }
91
+ },
92
+ compoundVariants: [
93
+ {
94
+ variant: "primary",
95
+ appearance: "solid",
96
+ class: "bg-primary-idle text-neutral-label hover:bg-primary-hover active:bg-primary-pressed"
97
+ },
98
+ {
99
+ variant: "primary",
100
+ appearance: "ghost",
101
+ class: "text-primary-idle hover:bg-primary-alt-idle active:bg-primary-alt-pressed"
102
+ },
103
+ {
104
+ variant: "secondary",
105
+ appearance: "solid",
106
+ class: "bg-layer-1-hover text-neutral-dark hover:bg-layer-1-pressed active:bg-layer-1-active"
107
+ },
108
+ {
109
+ variant: "secondary",
110
+ appearance: "ghost",
111
+ class: "hover:bg-layer-1-hover active:bg-layer-1-pressed"
112
+ },
113
+ {
114
+ variant: "tertiary",
115
+ appearance: "solid",
116
+ class: "bg-layer-2-hover text-neutral-dark hover:bg-layer-2-pressed active:bg-layer-2-active"
117
+ },
118
+ {
119
+ variant: "tertiary",
120
+ appearance: "ghost",
121
+ class: "hover:bg-layer-2-hover active:bg-layer-2-pressed"
122
+ },
123
+ {
124
+ variant: "destructive",
125
+ appearance: "solid",
126
+ class: "bg-danger-idle text-neutral-label hover:bg-danger-hover active:bg-danger-pressed"
127
+ },
128
+ {
129
+ variant: "destructive",
130
+ appearance: "ghost",
131
+ class: "text-danger-label-idle hover:bg-danger-alt-idle active:bg-danger-alt-pressed"
132
+ }
133
+ ],
134
+ defaultVariants: {
135
+ size: "md",
136
+ variant: "primary",
137
+ appearance: "solid"
138
+ }
139
+ }
140
+ );
141
+ function Button({
142
+ asChild,
143
+ className,
144
+ variant = "primary",
145
+ size = "md",
146
+ appearance = "solid",
147
+ ...props
148
+ }) {
149
+ const Component = asChild ? Slot : "button";
150
+ return /* @__PURE__ */ jsx2(
151
+ Component,
152
+ {
153
+ className: cx2(buttonVariants({ variant, appearance, size }), className),
154
+ ...props
155
+ }
156
+ );
157
+ }
158
+
159
+ // src/components/dropdown-menu.tsx
160
+ import "react";
161
+ import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu";
162
+ import { cx as cx5 } from "@xjur-ui/util";
163
+
164
+ // src/components/list.tsx
165
+ import { Slot as Slot3 } from "@radix-ui/react-slot";
166
+ import { cx as cx3, cva as cva3 } from "@xjur-ui/util";
167
+
168
+ // src/components/typography.tsx
169
+ import { Slot as Slot2 } from "@radix-ui/react-slot";
170
+ import { cva as cva2 } from "@xjur-ui/util";
171
+ import { memo } from "react";
172
+ import { jsx as jsx3 } from "react/jsx-runtime";
173
+ var typographyVariants = cva2("", {
174
+ variants: {
175
+ variant: {
176
+ body: "",
177
+ label: "",
178
+ title: "",
179
+ headline: ""
180
+ },
181
+ size: {
182
+ "sm-2x": "",
183
+ "sm-1x": "",
184
+ sm: "",
185
+ md: "",
186
+ lg: ""
187
+ },
188
+ weight: {
189
+ thin: "font-thin",
190
+ extraLight: "font-extralight",
191
+ light: "font-light",
192
+ normal: "font-normal",
193
+ medium: "font-medium",
194
+ semibold: "font-semibold",
195
+ bold: "font-bold",
196
+ extraBold: "font-extrabold",
197
+ black: "font-black"
198
+ }
199
+ },
200
+ compoundVariants: [
201
+ { variant: "body", size: "sm-1x", class: "text-size-body-sm-1x" },
202
+ { variant: "body", size: "sm", class: "text-size-body-sm" },
203
+ { variant: "body", size: "md", class: "text-size-body-md" },
204
+ { variant: "body", size: "lg", class: "text-size-body-lg" },
205
+ { variant: "label", size: "sm-2x", class: "text-size-label-sm-2x" },
206
+ { variant: "label", size: "sm-1x", class: "text-size-label-sm-1x" },
207
+ { variant: "label", size: "sm", class: "text-size-label-sm" },
208
+ { variant: "label", size: "md", class: "text-size-label-md" },
209
+ { variant: "label", size: "lg", class: "text-size-label-lg" },
210
+ { variant: "title", size: "sm", class: "text-size-title-sm" },
211
+ { variant: "title", size: "md", class: "text-size-title-md" },
212
+ { variant: "title", size: "lg", class: "text-size-title-lg" },
213
+ { variant: "headline", size: "sm", class: "text-size-headline-sm" },
214
+ { variant: "headline", size: "md", class: "text-size-headline-md" },
215
+ { variant: "headline", size: "lg", class: "text-size-headline-lg" }
216
+ ],
217
+ defaultVariants: {
218
+ variant: "body",
219
+ size: "md",
220
+ weight: "normal"
221
+ }
222
+ });
223
+ var Typography = memo(
224
+ ({
225
+ variant,
226
+ size,
227
+ weight,
228
+ asChild,
229
+ className,
230
+ ...props
231
+ }) => {
232
+ const Component = asChild ? Slot2 : "span";
233
+ return /* @__PURE__ */ jsx3(
234
+ Component,
235
+ {
236
+ className: typographyVariants({ variant, size, weight, className }),
237
+ ...props
238
+ }
239
+ );
240
+ }
241
+ );
242
+ Typography.displayName = "Typography";
243
+
244
+ // src/components/list.tsx
245
+ import { jsx as jsx4 } from "react/jsx-runtime";
246
+ function ListRoot({
247
+ className,
248
+ asChild,
249
+ ...props
250
+ }) {
251
+ const Comp = asChild ? Slot3 : "div";
252
+ return /* @__PURE__ */ jsx4(
253
+ Comp,
254
+ {
255
+ ...props,
256
+ className: cx3(
257
+ className,
258
+ "rounded-small scrollbar-hide bg-layer-2-idle border-border-layer-2 shadow-elevation-3 z-10 max-h-[400px] list-none overflow-y-auto border"
259
+ )
260
+ }
261
+ );
262
+ }
263
+ function ListContent({
264
+ className,
265
+ asChild,
266
+ ...props
267
+ }) {
268
+ const Comp = asChild ? Slot3 : "ul";
269
+ return /* @__PURE__ */ jsx4(
270
+ Comp,
271
+ {
272
+ ...props,
273
+ className: cx3("gap-small-1x p-small flex flex-col", className)
274
+ }
275
+ );
276
+ }
277
+ var variants = cva3(
278
+ [
279
+ "py-medium px-small flex items-center gap-small rounded-small-1x",
280
+ "bg-layer-2-idle text-neutral-dark",
281
+ "hover:bg-layer-2-hover transition-colors duration-100 ease-out",
282
+ "active:bg-layer-2-pressed"
283
+ ],
284
+ {
285
+ variants: {
286
+ size: {
287
+ md: "h-large-4x",
288
+ lg: "h-large-7x"
289
+ },
290
+ isActive: {
291
+ true: "bg-primary-alt-active text-primary-label-active hover:bg-primary-alt-hover active:bg-primary-alt-pressed"
292
+ }
293
+ },
294
+ defaultVariants: {
295
+ size: "md",
296
+ isActive: false
297
+ }
298
+ }
299
+ );
300
+ function ListItem({
301
+ className,
302
+ size,
303
+ isActive,
304
+ asChild,
305
+ ...props
306
+ }) {
307
+ const Comp = asChild ? Slot3 : "li";
308
+ return /* @__PURE__ */ jsx4(Comp, { ...props, className: cx3(variants({ size, isActive }), className) });
309
+ }
310
+
311
+ // src/components/divider.tsx
312
+ import "react";
313
+ import * as SeparatorPrimitive from "@radix-ui/react-separator";
314
+ import { cx as cx4 } from "@xjur-ui/util";
315
+ import { jsx as jsx5 } from "react/jsx-runtime";
316
+
317
+ // src/components/dropdown-menu.tsx
318
+ import { jsx as jsx6 } from "react/jsx-runtime";
319
+ function DropdownMenuRoot({
320
+ ...props
321
+ }) {
322
+ return /* @__PURE__ */ jsx6(DropdownMenuPrimitive.Root, { "data-slot": "dropdown-menu", ...props });
323
+ }
324
+ function DropdownMenuTrigger({
325
+ ...props
326
+ }) {
327
+ return /* @__PURE__ */ jsx6(
328
+ DropdownMenuPrimitive.Trigger,
329
+ {
330
+ "data-slot": "dropdown-menu-trigger",
331
+ ...props
332
+ }
333
+ );
334
+ }
335
+ function DropdownMenuContent({
336
+ className,
337
+ sideOffset = 4,
338
+ align = "start",
339
+ side = "bottom",
340
+ children,
341
+ ...props
342
+ }) {
343
+ return /* @__PURE__ */ jsx6(DropdownMenuPrimitive.Portal, { children: /* @__PURE__ */ jsx6(
344
+ DropdownMenuPrimitive.Content,
345
+ {
346
+ align,
347
+ className: cx5(
348
+ "group z-10 max-h-[var(--radix-popover-content-available-height)] max-w-[var(--radix-popover-trigger-width)] min-w-[var(--radix-popover-trigger-width)]",
349
+ className
350
+ ),
351
+ "data-slot": "dropdown-menu-content",
352
+ side,
353
+ sideOffset,
354
+ ...props,
355
+ children: /* @__PURE__ */ jsx6(ListRoot, { children })
356
+ }
357
+ ) });
358
+ }
359
+ function DropdownMenuList({
360
+ ...props
361
+ }) {
362
+ return /* @__PURE__ */ jsx6(ListContent, { ...props });
363
+ }
364
+ function DropdownMenuItem({
365
+ className,
366
+ ...props
367
+ }) {
368
+ return /* @__PURE__ */ jsx6(ListItem, { className: cx5(className, "cursor-pointer"), ...props });
369
+ }
370
+ function DropdownMenuItemText({
371
+ ...props
372
+ }) {
373
+ return /* @__PURE__ */ jsx6(Typography, { ...props });
374
+ }
375
+
376
+ // src/components/tooltip.tsx
377
+ import * as TooltipPrimitive from "@radix-ui/react-tooltip";
378
+ import { cx as cx6 } from "@xjur-ui/util";
379
+ import { jsx as jsx7 } from "react/jsx-runtime";
380
+ function TooltipProvider({
381
+ delayDuration = 0,
382
+ ...props
383
+ }) {
384
+ return /* @__PURE__ */ jsx7(
385
+ TooltipPrimitive.Provider,
386
+ {
387
+ "data-slot": "tooltip-provider",
388
+ delayDuration,
389
+ ...props
390
+ }
391
+ );
392
+ }
393
+ function Tooltip({
394
+ ...props
395
+ }) {
396
+ return /* @__PURE__ */ jsx7(TooltipProvider, { children: /* @__PURE__ */ jsx7(TooltipPrimitive.Root, { "data-slot": "tooltip", ...props }) });
397
+ }
398
+ function TooltipTrigger({
399
+ ...props
400
+ }) {
401
+ return /* @__PURE__ */ jsx7(TooltipPrimitive.Trigger, { "data-slot": "tooltip-trigger", ...props });
402
+ }
403
+ function TooltipContent({
404
+ className,
405
+ sideOffset = 1,
406
+ variant = "simple",
407
+ children,
408
+ ...props
409
+ }) {
410
+ return /* @__PURE__ */ jsx7(TooltipPrimitive.Portal, { children: /* @__PURE__ */ jsx7(
411
+ TooltipPrimitive.Content,
412
+ {
413
+ className: cx6(
414
+ "text-size-body-sm text-balance",
415
+ "data-[variant=simple]:bg-alt-2 data-[variant=simple]:text-neutral-label data-[variant=simple]:rounded-small-1x data-[variant=simple]:px-small data-[variant=simple]:py-small-1x",
416
+ "data-[variant=rich]:bg-layer-2-idle data-[variant=rich]:text-neutral-dark data-[variant=rich]:rounded-small data-[variant=rich]:border-border-layer-2 data-[variant=rich]:p-large data-[variant=rich]:border",
417
+ "animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin)",
418
+ className
419
+ ),
420
+ "data-slot": "tooltip-content",
421
+ "data-variant": variant,
422
+ sideOffset,
423
+ ...props,
424
+ children
425
+ }
426
+ ) });
427
+ }
428
+
429
+ // src/components/rich-editor.tsx
430
+ import { jsx as jsx8, jsxs } from "react/jsx-runtime";
431
+ var headingClasses = {
432
+ 1: "text-size-body-md",
433
+ 2: "text-size-title-lg",
434
+ 3: "text-size-headline-lg"
435
+ };
436
+ function RichEditorRoot({
437
+ className,
438
+ editorOptions,
439
+ ...props
440
+ }) {
441
+ const editor = useEditor({
442
+ ...editorOptions,
443
+ extensions: [
444
+ StarterKit.configure({
445
+ bulletList: {
446
+ HTMLAttributes: {
447
+ class: "list-disc list-outside pl-large-1x"
448
+ }
449
+ },
450
+ orderedList: {
451
+ HTMLAttributes: {
452
+ class: "list-decimal list-outside pl-large-1x"
453
+ }
454
+ },
455
+ heading: false
456
+ }),
457
+ Placeholder.configure({
458
+ placeholder: ({ node, editor: editor2 }) => node.type.name === "paragraph" && editor2.isEmpty ? "Digite aqui\u2026" : "",
459
+ showOnlyWhenEditable: true,
460
+ includeChildren: false,
461
+ emptyNodeClass: "before:content-[attr(data-placeholder)] before:absolute before:top-0 before:left-0 before:text-neutral-placeholder first:before:float-left first:before:content-[attr(data-placeholder)] first:before:pointer-events-none"
462
+ }),
463
+ Heading.configure({
464
+ levels: [1, 2, 3]
465
+ }).extend({
466
+ renderHTML({ node, HTMLAttributes }) {
467
+ const level = node.attrs.level ?? 1;
468
+ return [
469
+ "h",
470
+ {
471
+ ...HTMLAttributes,
472
+ class: headingClasses[level]
473
+ },
474
+ 0
475
+ ];
476
+ }
477
+ }),
478
+ ...editorOptions?.extensions ?? []
479
+ ]
480
+ });
481
+ const value = useMemo(() => ({ editor }), [editor]);
482
+ return /* @__PURE__ */ jsx8(EditorContext.Provider, { value, children: /* @__PURE__ */ jsx8(
483
+ "div",
484
+ {
485
+ className: cx7("gap-small flex w-full flex-col", className),
486
+ "data-slot": "text-area-root",
487
+ ...props
488
+ }
489
+ ) });
490
+ }
491
+ function RichEditorContent({
492
+ className,
493
+ ...props
494
+ }) {
495
+ return /* @__PURE__ */ jsx8(
496
+ "div",
497
+ {
498
+ className: cx7(
499
+ "bg-layer-2-hover py-small_1x-alt px-small rounded-small-1x min-h-[116px] w-full border border-transparent",
500
+ "hover:border-border-layer-2 transition-colors duration-200",
501
+ "[&_ul_ul]:list-[circle]",
502
+ "[&_ul_ul_ul]:list-[square]",
503
+ "[&_ol_ol]:list-[lower-alpha]",
504
+ "[&_ol_ol_ol]:list-[lower-roman]",
505
+ "gap-small flex flex-col overflow-x-hidden overflow-y-auto",
506
+ className
507
+ ),
508
+ "data-slot": "text-area-content",
509
+ ...props
510
+ }
511
+ );
512
+ }
513
+ function RichEditorCaption({
514
+ className,
515
+ ...props
516
+ }) {
517
+ return /* @__PURE__ */ jsx8(
518
+ "p",
519
+ {
520
+ ...props,
521
+ className: cx7(
522
+ "text-size-body-sm text-neutral-dark font-normal",
523
+ className
524
+ ),
525
+ "data-slot": "text-area-caption"
526
+ }
527
+ );
528
+ }
529
+ function RichEditorAreaText({
530
+ className,
531
+ ...props
532
+ }) {
533
+ const { editor } = useRichTextEditor();
534
+ return /* @__PURE__ */ jsx8(
535
+ EditorContent,
536
+ {
537
+ className: cx7(
538
+ "text-size-body-md text-neutral-dark max-h-[116px] *:h-full *:w-full *:outline-0",
539
+ className
540
+ ),
541
+ editor,
542
+ ...props
543
+ }
544
+ );
545
+ }
546
+ function RichEditorToolbar({
547
+ className,
548
+ ...props
549
+ }) {
550
+ return /* @__PURE__ */ jsx8(
551
+ "div",
552
+ {
553
+ className: cx7(
554
+ "h-large-4x gap-small-1x h-large-6px scrollbar-hide flex flex-nowrap items-center overflow-x-auto overflow-y-hidden",
555
+ className
556
+ ),
557
+ "data-slot": "text-area-toolbar",
558
+ ...props
559
+ }
560
+ );
561
+ }
562
+ function ToolbarButton({
563
+ appearance = "ghost",
564
+ variant = "secondary",
565
+ onMouseDown,
566
+ onPointerDown,
567
+ ...props
568
+ }) {
569
+ return /* @__PURE__ */ jsx8(
570
+ Button,
571
+ {
572
+ appearance,
573
+ size: "icon_md",
574
+ tabIndex: -1,
575
+ type: "button",
576
+ variant,
577
+ onMouseDown: (e) => {
578
+ e.preventDefault();
579
+ onMouseDown?.(e);
580
+ },
581
+ onPointerDown: (e) => {
582
+ e.preventDefault();
583
+ onPointerDown?.(e);
584
+ },
585
+ ...props
586
+ }
587
+ );
588
+ }
589
+ function ToggleButton({
590
+ name,
591
+ ...props
592
+ }) {
593
+ const { editor } = useRichTextEditor();
594
+ const { shortcut } = useOS();
595
+ const isActive = useRichTextEditorState({
596
+ editor,
597
+ selector: (ctx) => ctx.editor?.isActive(name) ?? false
598
+ });
599
+ const icon = useMemo(() => {
600
+ const iconsMap = /* @__PURE__ */ new Map([
601
+ ["bold", "format_bold"],
602
+ ["italic", "format_italic"],
603
+ ["underline", "format_underlined"],
604
+ ["strike", "format_strikethrough"],
605
+ ["bulletList", "format_list_bulleted"],
606
+ ["orderedList", "format_list_numbered"],
607
+ ["undo", "undo"],
608
+ ["redo", "redo"]
609
+ ]);
610
+ return iconsMap.get(name);
611
+ }, [name]);
612
+ const description = useMemo(() => {
613
+ const descriptionsMap = /* @__PURE__ */ new Map([
614
+ ["bold", `Negrito (${shortcut} + B)`],
615
+ ["italic", `It\xE1lico (${shortcut} + I)`],
616
+ ["underline", `Sublinhado (${shortcut} + U)`],
617
+ ["strike", `Tachado (${shortcut} + S)`],
618
+ ["bulletList", `Lista (${shortcut} + Shift + 7)`],
619
+ ["orderedList", `Lista numerada (${shortcut} + Shift + 8)`],
620
+ ["undo", `Desfazer (${shortcut} + Z)`],
621
+ ["redo", `Refazer (${shortcut} + Y)`]
622
+ ]);
623
+ return descriptionsMap.get(name);
624
+ }, [name, shortcut]);
625
+ const handleToggle = useCallback(() => {
626
+ if (!editor) throw new Error("Editor not found");
627
+ const commandsMap = /* @__PURE__ */ new Map([
628
+ ["bold", () => editor.chain().focus().toggleBold().run()],
629
+ ["italic", () => editor.chain().focus().toggleItalic().run()],
630
+ ["underline", () => editor.chain().focus().toggleUnderline().run()],
631
+ ["strike", () => editor.chain().focus().toggleStrike().run()],
632
+ ["bulletList", () => editor.chain().focus().toggleBulletList().run()],
633
+ ["orderedList", () => editor.chain().focus().toggleOrderedList().run()],
634
+ ["undo", () => editor.chain().focus().undo().run()],
635
+ ["redo", () => editor.chain().focus().redo().run()]
636
+ ]);
637
+ commandsMap.get(name)?.();
638
+ }, [editor, name]);
639
+ return /* @__PURE__ */ jsxs(Tooltip, { children: [
640
+ /* @__PURE__ */ jsx8(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsx8(
641
+ ToolbarButton,
642
+ {
643
+ onClick: handleToggle,
644
+ ...isActive && { appearance: "solid" },
645
+ ...props,
646
+ children: icon && /* @__PURE__ */ jsx8(Icon, { className: "text-icon-neutral-3", name: icon })
647
+ }
648
+ ) }),
649
+ /* @__PURE__ */ jsx8(TooltipContent, { children: description && /* @__PURE__ */ jsx8(Typography, { size: "sm", children: description }) })
650
+ ] });
651
+ }
652
+ function HeadingButton({
653
+ appearance = "ghost",
654
+ variant = "secondary",
655
+ ...props
656
+ }) {
657
+ const [isOpen, setIsOpen] = useState2(false);
658
+ const { editor } = useRichTextEditor();
659
+ const isActive = useRichTextEditorState({
660
+ editor,
661
+ selector: (ctx) => ctx.editor?.isActive("heading") ?? false
662
+ });
663
+ const isLevelActive = useCallback(
664
+ (level) => {
665
+ if (!editor) throw new Error("Editor not found");
666
+ return editor.isActive("heading", { level });
667
+ },
668
+ [editor]
669
+ );
670
+ const toggleHeading = useCallback(
671
+ (level) => {
672
+ if (!editor) throw new Error("Editor not found");
673
+ setIsOpen(false);
674
+ setTimeout(() => {
675
+ editor.chain().focus().toggleHeading({ level }).run();
676
+ }, 0);
677
+ },
678
+ [editor]
679
+ );
680
+ const levels = [
681
+ { level: 1, label: "Normal", className: headingClasses[1] },
682
+ { level: 2, label: "Grande", className: headingClasses[2] },
683
+ { level: 3, label: "Enorme", className: headingClasses[3] }
684
+ ];
685
+ return /* @__PURE__ */ jsxs(DropdownMenuRoot, { open: isOpen, onOpenChange: (open) => setIsOpen(open), children: [
686
+ /* @__PURE__ */ jsx8(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsx8(
687
+ Button,
688
+ {
689
+ appearance: isActive ? "solid" : appearance,
690
+ size: "icon_md",
691
+ tabIndex: -1,
692
+ type: "button",
693
+ variant,
694
+ ...props,
695
+ children: /* @__PURE__ */ jsxs(Tooltip, { children: [
696
+ /* @__PURE__ */ jsx8(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsx8(Icon, { className: "text-icon-neutral-3", name: "format_size" }) }),
697
+ /* @__PURE__ */ jsx8(TooltipContent, { children: /* @__PURE__ */ jsx8(Typography, { size: "sm", children: "Tamanho" }) })
698
+ ] })
699
+ }
700
+ ) }),
701
+ /* @__PURE__ */ jsx8(DropdownMenuContent, { children: /* @__PURE__ */ jsx8(DropdownMenuList, { children: levels.map((level) => /* @__PURE__ */ jsx8(
702
+ DropdownMenuItem,
703
+ {
704
+ isActive: isLevelActive(level.level),
705
+ onPointerDown: () => toggleHeading(level.level),
706
+ children: /* @__PURE__ */ jsx8(DropdownMenuItemText, { className: level.className, children: level.label })
707
+ },
708
+ level.level
709
+ )) }) })
710
+ ] });
711
+ }
712
+ export {
713
+ HeadingButton,
714
+ RichEditorAreaText,
715
+ RichEditorCaption,
716
+ RichEditorContent,
717
+ RichEditorRoot,
718
+ RichEditorToolbar,
719
+ ToggleButton,
720
+ ToolbarButton,
721
+ useRichTextEditor,
722
+ useRichTextEditorState
723
+ };