@ginia/ui 0.1.1 → 0.1.3
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/dist/components/domain/resume/resume-editor/resume-editor.cjs +13 -5
- package/dist/components/domain/resume/resume-editor/resume-editor.cjs.map +1 -1
- package/dist/components/domain/resume/resume-editor/resume-editor.d.cts +1 -1
- package/dist/components/domain/resume/resume-editor/resume-editor.d.ts +1 -1
- package/dist/components/domain/resume/resume-editor/resume-editor.js +19 -6
- package/dist/components/domain/resume/resume-editor/resume-editor.js.map +1 -1
- package/dist/components/domain/resume/resume-editor/sections/academic-info.cjs +1 -1
- package/dist/components/domain/resume/resume-editor/sections/academic-info.cjs.map +1 -1
- package/dist/components/domain/resume/resume-editor/sections/academic-info.js +1 -1
- package/dist/components/domain/resume/resume-editor/sections/academic-info.js.map +1 -1
- package/dist/components/domain/resume/resume-editor/sections/activities.cjs +25 -11
- package/dist/components/domain/resume/resume-editor/sections/activities.cjs.map +1 -1
- package/dist/components/domain/resume/resume-editor/sections/activities.js +25 -11
- package/dist/components/domain/resume/resume-editor/sections/activities.js.map +1 -1
- package/dist/components/domain/resume/resume-editor/sections/certifications.cjs +27 -12
- package/dist/components/domain/resume/resume-editor/sections/certifications.cjs.map +1 -1
- package/dist/components/domain/resume/resume-editor/sections/certifications.js +27 -12
- package/dist/components/domain/resume/resume-editor/sections/certifications.js.map +1 -1
- package/dist/components/domain/resume/resume-editor/sections/education.cjs +25 -11
- package/dist/components/domain/resume/resume-editor/sections/education.cjs.map +1 -1
- package/dist/components/domain/resume/resume-editor/sections/education.js +25 -11
- package/dist/components/domain/resume/resume-editor/sections/education.js.map +1 -1
- package/dist/components/domain/resume/resume-editor/sections/experience.cjs +25 -11
- package/dist/components/domain/resume/resume-editor/sections/experience.cjs.map +1 -1
- package/dist/components/domain/resume/resume-editor/sections/experience.js +25 -11
- package/dist/components/domain/resume/resume-editor/sections/experience.js.map +1 -1
- package/dist/components/domain/resume/resume-editor/sections/personal-info.cjs +1 -1
- package/dist/components/domain/resume/resume-editor/sections/personal-info.cjs.map +1 -1
- package/dist/components/domain/resume/resume-editor/sections/personal-info.js +1 -1
- package/dist/components/domain/resume/resume-editor/sections/personal-info.js.map +1 -1
- package/dist/components/domain/resume/resume-editor/sections/preferences.cjs +2 -2
- package/dist/components/domain/resume/resume-editor/sections/preferences.cjs.map +1 -1
- package/dist/components/domain/resume/resume-editor/sections/preferences.js +2 -2
- package/dist/components/domain/resume/resume-editor/sections/preferences.js.map +1 -1
- package/dist/components/domain/resume/resume-editor/sections/requirements.cjs +19 -11
- package/dist/components/domain/resume/resume-editor/sections/requirements.cjs.map +1 -1
- package/dist/components/domain/resume/resume-editor/sections/requirements.js +29 -12
- package/dist/components/domain/resume/resume-editor/sections/requirements.js.map +1 -1
- package/dist/components/domain/resume/resume-editor/sections/skills.cjs +30 -10
- package/dist/components/domain/resume/resume-editor/sections/skills.cjs.map +1 -1
- package/dist/components/domain/resume/resume-editor/sections/skills.js +30 -10
- package/dist/components/domain/resume/resume-editor/sections/skills.js.map +1 -1
- package/dist/components/domain/resume/resume-preview/resume-preview.cjs +27 -11
- package/dist/components/domain/resume/resume-preview/resume-preview.cjs.map +1 -1
- package/dist/components/domain/resume/resume-preview/resume-preview.js +27 -11
- package/dist/components/domain/resume/resume-preview/resume-preview.js.map +1 -1
- package/dist/components/domain/resume/resume-preview/sections/contact-skills.cjs +31 -15
- package/dist/components/domain/resume/resume-preview/sections/contact-skills.cjs.map +1 -1
- package/dist/components/domain/resume/resume-preview/sections/contact-skills.js +31 -15
- package/dist/components/domain/resume/resume-preview/sections/contact-skills.js.map +1 -1
- package/dist/components/domain/resume/resume-preview/sections/experience-education.cjs +131 -73
- package/dist/components/domain/resume/resume-preview/sections/experience-education.cjs.map +1 -1
- package/dist/components/domain/resume/resume-preview/sections/experience-education.d.cts +1 -1
- package/dist/components/domain/resume/resume-preview/sections/experience-education.d.ts +1 -1
- package/dist/components/domain/resume/resume-preview/sections/experience-education.js +131 -73
- package/dist/components/domain/resume/resume-preview/sections/experience-education.js.map +1 -1
- package/dist/components/domain/resume/resume-preview/sections/footer-preview.cjs +2 -2
- package/dist/components/domain/resume/resume-preview/sections/footer-preview.cjs.map +1 -1
- package/dist/components/domain/resume/resume-preview/sections/footer-preview.js +2 -2
- package/dist/components/domain/resume/resume-preview/sections/footer-preview.js.map +1 -1
- package/dist/components/domain/resume/resume-preview/sections/header-preview.cjs +7 -7
- package/dist/components/domain/resume/resume-preview/sections/header-preview.cjs.map +1 -1
- package/dist/components/domain/resume/resume-preview/sections/header-preview.js +7 -7
- package/dist/components/domain/resume/resume-preview/sections/header-preview.js.map +1 -1
- package/dist/components/domain/resume/resume.cjs +46 -29
- package/dist/components/domain/resume/resume.cjs.map +1 -1
- package/dist/components/domain/resume/resume.js +46 -29
- package/dist/components/domain/resume/resume.js.map +1 -1
- package/dist/components/ui/accordion/accordion.cjs +1 -3
- package/dist/components/ui/accordion/accordion.cjs.map +1 -1
- package/dist/components/ui/accordion/accordion.js +1 -3
- package/dist/components/ui/accordion/accordion.js.map +1 -1
- package/dist/components/ui/alert/alert.cjs +12 -25
- package/dist/components/ui/alert/alert.cjs.map +1 -1
- package/dist/components/ui/alert/alert.js +12 -25
- package/dist/components/ui/alert/alert.js.map +1 -1
- package/dist/components/ui/alert-dialog/alert-dialog.cjs +12 -46
- package/dist/components/ui/alert-dialog/alert-dialog.cjs.map +1 -1
- package/dist/components/ui/alert-dialog/alert-dialog.js +12 -46
- package/dist/components/ui/alert-dialog/alert-dialog.js.map +1 -1
- package/dist/components/ui/autocomplete/autocomplete.cjs +12 -12
- package/dist/components/ui/autocomplete/autocomplete.cjs.map +1 -1
- package/dist/components/ui/autocomplete/autocomplete.js +12 -12
- package/dist/components/ui/autocomplete/autocomplete.js.map +1 -1
- package/dist/components/ui/avatar/avatar.cjs +1 -4
- package/dist/components/ui/avatar/avatar.cjs.map +1 -1
- package/dist/components/ui/avatar/avatar.js +1 -4
- package/dist/components/ui/avatar/avatar.js.map +1 -1
- package/dist/components/ui/badge/badge.cjs +1 -8
- package/dist/components/ui/badge/badge.cjs.map +1 -1
- package/dist/components/ui/badge/badge.js +1 -8
- package/dist/components/ui/badge/badge.js.map +1 -1
- package/dist/components/ui/breadcrumb/breadcrumb.cjs +6 -19
- package/dist/components/ui/breadcrumb/breadcrumb.cjs.map +1 -1
- package/dist/components/ui/breadcrumb/breadcrumb.js +6 -19
- package/dist/components/ui/breadcrumb/breadcrumb.js.map +1 -1
- package/dist/components/ui/button/button.cjs.map +1 -1
- package/dist/components/ui/button/button.js.map +1 -1
- package/dist/components/ui/calendar/calendar.cjs +1 -6
- package/dist/components/ui/calendar/calendar.cjs.map +1 -1
- package/dist/components/ui/calendar/calendar.js +1 -6
- package/dist/components/ui/calendar/calendar.js.map +1 -1
- package/dist/components/ui/card/card.cjs +7 -17
- package/dist/components/ui/card/card.cjs.map +1 -1
- package/dist/components/ui/card/card.js +7 -17
- package/dist/components/ui/card/card.js.map +1 -1
- package/dist/components/ui/carousel/carousel.cjs +4 -11
- package/dist/components/ui/carousel/carousel.cjs.map +1 -1
- package/dist/components/ui/carousel/carousel.js +4 -11
- package/dist/components/ui/carousel/carousel.js.map +1 -1
- package/dist/components/ui/checkbox/checkbox.cjs +1 -7
- package/dist/components/ui/checkbox/checkbox.cjs.map +1 -1
- package/dist/components/ui/checkbox/checkbox.js +1 -7
- package/dist/components/ui/checkbox/checkbox.js.map +1 -1
- package/dist/components/ui/collapsible/collapsible.cjs.map +1 -1
- package/dist/components/ui/collapsible/collapsible.js.map +1 -1
- package/dist/components/ui/combobox/combobox.cjs +1 -3
- package/dist/components/ui/combobox/combobox.cjs.map +1 -1
- package/dist/components/ui/combobox/combobox.js +1 -3
- package/dist/components/ui/combobox/combobox.js.map +1 -1
- package/dist/components/ui/command/command.cjs +7 -24
- package/dist/components/ui/command/command.cjs.map +1 -1
- package/dist/components/ui/command/command.js +7 -24
- package/dist/components/ui/command/command.js.map +1 -1
- package/dist/components/ui/context-menu/context-menu.cjs +4 -18
- package/dist/components/ui/context-menu/context-menu.cjs.map +1 -1
- package/dist/components/ui/context-menu/context-menu.js +4 -18
- package/dist/components/ui/context-menu/context-menu.js.map +1 -1
- package/dist/components/ui/date-picker/date-picker.cjs +21 -57
- package/dist/components/ui/date-picker/date-picker.cjs.map +1 -1
- package/dist/components/ui/date-picker/date-picker.js +22 -62
- package/dist/components/ui/date-picker/date-picker.js.map +1 -1
- package/dist/components/ui/dialog/dialog.cjs +12 -29
- package/dist/components/ui/dialog/dialog.cjs.map +1 -1
- package/dist/components/ui/dialog/dialog.js +12 -29
- package/dist/components/ui/dialog/dialog.js.map +1 -1
- package/dist/components/ui/drawer/drawer.cjs +9 -23
- package/dist/components/ui/drawer/drawer.cjs.map +1 -1
- package/dist/components/ui/drawer/drawer.js +9 -23
- package/dist/components/ui/drawer/drawer.js.map +1 -1
- package/dist/components/ui/dropdown-menu/dropdown-menu.cjs +3 -16
- package/dist/components/ui/dropdown-menu/dropdown-menu.cjs.map +1 -1
- package/dist/components/ui/dropdown-menu/dropdown-menu.js +3 -16
- package/dist/components/ui/dropdown-menu/dropdown-menu.js.map +1 -1
- package/dist/components/ui/form/form.cjs +7 -24
- package/dist/components/ui/form/form.cjs.map +1 -1
- package/dist/components/ui/form/form.js +7 -24
- package/dist/components/ui/form/form.js.map +1 -1
- package/dist/components/ui/hover-card/hover-card.cjs +2 -6
- package/dist/components/ui/hover-card/hover-card.cjs.map +1 -1
- package/dist/components/ui/hover-card/hover-card.js +2 -6
- package/dist/components/ui/hover-card/hover-card.js.map +1 -1
- package/dist/components/ui/icon/icon.cjs +1 -1
- package/dist/components/ui/icon/icon.cjs.map +1 -1
- package/dist/components/ui/icon/icon.js +1 -1
- package/dist/components/ui/icon/icon.js.map +1 -1
- package/dist/components/ui/input/input.cjs +1 -1
- package/dist/components/ui/input/input.cjs.map +1 -1
- package/dist/components/ui/input/input.js +1 -1
- package/dist/components/ui/input/input.js.map +1 -1
- package/dist/components/ui/input-field/input-field.cjs +1 -1
- package/dist/components/ui/input-field/input-field.cjs.map +1 -1
- package/dist/components/ui/input-field/input-field.js +1 -1
- package/dist/components/ui/input-field/input-field.js.map +1 -1
- package/dist/components/ui/input-otp/input-otp.cjs +5 -15
- package/dist/components/ui/input-otp/input-otp.cjs.map +1 -1
- package/dist/components/ui/input-otp/input-otp.js +5 -15
- package/dist/components/ui/input-otp/input-otp.js.map +1 -1
- package/dist/components/ui/label/label.cjs +2 -5
- package/dist/components/ui/label/label.cjs.map +1 -1
- package/dist/components/ui/label/label.js +2 -5
- package/dist/components/ui/label/label.js.map +1 -1
- package/dist/components/ui/loading-state/loading-state.cjs +3 -8
- package/dist/components/ui/loading-state/loading-state.cjs.map +1 -1
- package/dist/components/ui/loading-state/loading-state.d.cts +1 -1
- package/dist/components/ui/loading-state/loading-state.d.ts +1 -1
- package/dist/components/ui/loading-state/loading-state.js +3 -8
- package/dist/components/ui/loading-state/loading-state.js.map +1 -1
- package/dist/components/ui/menubar/menubar.cjs +5 -21
- package/dist/components/ui/menubar/menubar.cjs.map +1 -1
- package/dist/components/ui/menubar/menubar.js +5 -21
- package/dist/components/ui/menubar/menubar.js.map +1 -1
- package/dist/components/ui/month-year-picker/month-year-picker.cjs +5 -23
- package/dist/components/ui/month-year-picker/month-year-picker.cjs.map +1 -1
- package/dist/components/ui/month-year-picker/month-year-picker.js +6 -28
- package/dist/components/ui/month-year-picker/month-year-picker.js.map +1 -1
- package/dist/components/ui/multi-select/multi-select.cjs +12 -29
- package/dist/components/ui/multi-select/multi-select.cjs.map +1 -1
- package/dist/components/ui/multi-select/multi-select.js +12 -29
- package/dist/components/ui/multi-select/multi-select.js.map +1 -1
- package/dist/components/ui/navigation-menu/navigation-menu.cjs +7 -13
- package/dist/components/ui/navigation-menu/navigation-menu.cjs.map +1 -1
- package/dist/components/ui/navigation-menu/navigation-menu.js +7 -13
- package/dist/components/ui/navigation-menu/navigation-menu.js.map +1 -1
- package/dist/components/ui/pagination/pagination.cjs +4 -18
- package/dist/components/ui/pagination/pagination.cjs.map +1 -1
- package/dist/components/ui/pagination/pagination.js +4 -18
- package/dist/components/ui/pagination/pagination.js.map +1 -1
- package/dist/components/ui/popover/popover.cjs.map +1 -1
- package/dist/components/ui/popover/popover.js.map +1 -1
- package/dist/components/ui/progress/progress.cjs +2 -2
- package/dist/components/ui/progress/progress.cjs.map +1 -1
- package/dist/components/ui/progress/progress.js +2 -2
- package/dist/components/ui/progress/progress.js.map +1 -1
- package/dist/components/ui/radio-group/radio-group.cjs +1 -8
- package/dist/components/ui/radio-group/radio-group.cjs.map +1 -1
- package/dist/components/ui/radio-group/radio-group.js +1 -8
- package/dist/components/ui/radio-group/radio-group.js.map +1 -1
- package/dist/components/ui/resizable/resizable.cjs +3 -6
- package/dist/components/ui/resizable/resizable.cjs.map +1 -1
- package/dist/components/ui/resizable/resizable.js +4 -11
- package/dist/components/ui/resizable/resizable.js.map +1 -1
- package/dist/components/ui/rich-text-editor/rich-text-editor.cjs +25 -37
- package/dist/components/ui/rich-text-editor/rich-text-editor.cjs.map +1 -1
- package/dist/components/ui/rich-text-editor/rich-text-editor.js +25 -37
- package/dist/components/ui/rich-text-editor/rich-text-editor.js.map +1 -1
- package/dist/components/ui/scroll-area/scroll-area.cjs.map +1 -1
- package/dist/components/ui/scroll-area/scroll-area.js.map +1 -1
- package/dist/components/ui/section-loader/section-loader.cjs +4 -15
- package/dist/components/ui/section-loader/section-loader.cjs.map +1 -1
- package/dist/components/ui/section-loader/section-loader.js +4 -15
- package/dist/components/ui/section-loader/section-loader.js.map +1 -1
- package/dist/components/ui/select/select.cjs +11 -29
- package/dist/components/ui/select/select.cjs.map +1 -1
- package/dist/components/ui/select/select.js +11 -29
- package/dist/components/ui/select/select.js.map +1 -1
- package/dist/components/ui/separator/separator.cjs +14 -16
- package/dist/components/ui/separator/separator.cjs.map +1 -1
- package/dist/components/ui/separator/separator.js +14 -16
- package/dist/components/ui/separator/separator.js.map +1 -1
- package/dist/components/ui/sheet/sheet.cjs +10 -24
- package/dist/components/ui/sheet/sheet.cjs.map +1 -1
- package/dist/components/ui/sheet/sheet.js +10 -24
- package/dist/components/ui/sheet/sheet.js.map +1 -1
- package/dist/components/ui/skeleton/skeleton.cjs +2 -11
- package/dist/components/ui/skeleton/skeleton.cjs.map +1 -1
- package/dist/components/ui/skeleton/skeleton.js +2 -11
- package/dist/components/ui/skeleton/skeleton.js.map +1 -1
- package/dist/components/ui/slider/slider.cjs +1 -4
- package/dist/components/ui/slider/slider.cjs.map +1 -1
- package/dist/components/ui/slider/slider.js +1 -4
- package/dist/components/ui/slider/slider.js.map +1 -1
- package/dist/components/ui/sonner/sonner.cjs.map +1 -1
- package/dist/components/ui/sonner/sonner.js.map +1 -1
- package/dist/components/ui/spinner/spinner.cjs +1 -1
- package/dist/components/ui/spinner/spinner.cjs.map +1 -1
- package/dist/components/ui/spinner/spinner.js +1 -1
- package/dist/components/ui/spinner/spinner.js.map +1 -1
- package/dist/components/ui/switch/switch.cjs.map +1 -1
- package/dist/components/ui/switch/switch.js.map +1 -1
- package/dist/components/ui/table/table.cjs +6 -28
- package/dist/components/ui/table/table.cjs.map +1 -1
- package/dist/components/ui/table/table.js +6 -28
- package/dist/components/ui/table/table.js.map +1 -1
- package/dist/components/ui/tabs/tabs.cjs.map +1 -1
- package/dist/components/ui/tabs/tabs.js.map +1 -1
- package/dist/components/ui/textarea/textarea.cjs +1 -4
- package/dist/components/ui/textarea/textarea.cjs.map +1 -1
- package/dist/components/ui/textarea/textarea.js +1 -4
- package/dist/components/ui/textarea/textarea.js.map +1 -1
- package/dist/components/ui/toast/toast.cjs +3 -12
- package/dist/components/ui/toast/toast.cjs.map +1 -1
- package/dist/components/ui/toast/toast.js +3 -12
- package/dist/components/ui/toast/toast.js.map +1 -1
- package/dist/components/ui/toggle/toggle.cjs.map +1 -1
- package/dist/components/ui/toggle/toggle.js.map +1 -1
- package/dist/components/ui/toggle-group/toggle-group.cjs +1 -4
- package/dist/components/ui/toggle-group/toggle-group.cjs.map +1 -1
- package/dist/components/ui/toggle-group/toggle-group.js +1 -4
- package/dist/components/ui/toggle-group/toggle-group.js.map +1 -1
- package/dist/components/ui/tooltip/tooltip.cjs.map +1 -1
- package/dist/components/ui/tooltip/tooltip.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/ui/rich-text-editor/rich-text-editor.tsx"],"sourcesContent":["\"use client\";\n\nimport React from \"react\";\nimport { useEditor, EditorContent } from \"@tiptap/react\";\nimport StarterKit from \"@tiptap/starter-kit\";\nimport TextAlign from \"@tiptap/extension-text-align\";\nimport Color from \"@tiptap/extension-color\";\nimport { TextStyle } from \"@tiptap/extension-text-style\";\nimport ImageExtension from \"@tiptap/extension-image\";\nimport LinkExtension from \"@tiptap/extension-link\";\nimport Placeholder from \"@tiptap/extension-placeholder\";\nimport {\n Bold,\n Italic,\n Strikethrough,\n List,\n ListOrdered,\n Link,\n AlignLeft,\n AlignCenter,\n AlignRight,\n Image as ImageIcon,\n Heading1,\n Heading2,\n Heading3,\n} from \"lucide-react\";\n\nimport { cn } from \"../../../lib/utils\";\n\ninterface RichTextEditorProps {\n value: string;\n onChange: (content: string) => void;\n placeholder?: string;\n height?: number;\n className?: string;\n readOnly?: boolean;\n}\n\nfunction ToolbarButton({\n onClick,\n children,\n title,\n isActive = false,\n}: {\n onClick: () => void;\n children: React.ReactNode;\n title: string;\n isActive?: boolean;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n title={title}\n className={cn(\n \"p-2 rounded transition-colors\",\n isActive\n ? \"bg-primary text-primary-foreground\"\n : \"hover:bg-muted text-muted-foreground\"\n )}\n >\n {children}\n </button>\n );\n}\n\nfunction RichTextEditor({\n value,\n onChange,\n placeholder = \"Escribe aquí...\",\n height = 200,\n className = \"\",\n readOnly = false,\n}: RichTextEditorProps) {\n const editor = useEditor({\n extensions: [\n StarterKit,\n TextAlign.configure({\n types: [\"heading\", \"paragraph\"],\n }),\n Color.configure({ types: [TextStyle.name] }),\n TextStyle,\n ImageExtension.configure({\n HTMLAttributes: {\n class: \"max-w-full h-auto rounded-lg\",\n },\n }),\n LinkExtension.configure({\n openOnClick: false,\n }),\n Placeholder.configure({\n placeholder: placeholder,\n }),\n ],\n content: value,\n editable: !readOnly,\n immediatelyRender: false,\n onUpdate: ({ editor: e }) => {\n onChange(e.getHTML());\n },\n editorProps: {\n attributes: {\n class:\n \"prose prose-sm sm:prose lg:prose-lg xl:prose-2xl mx-auto focus:outline-none max-w-none\",\n style: `min-height: ${height}px;`,\n },\n },\n });\n\n React.useEffect(() => {\n if (editor && editor.getHTML() !== value) {\n editor.commands.setContent(value);\n }\n }, [value, editor]);\n\n if (!editor) {\n return (\n <div\n className={cn(\n \"border border-border rounded-lg overflow-hidden\",\n className\n )}\n >\n <div className=\"h-32 bg-muted rounded animate-pulse flex items-center justify-center text-muted-foreground\">\n Cargando editor...\n </div>\n </div>\n );\n }\n\n return (\n <div\n data-slot=\"rich-text-editor\"\n className={cn(\n \"border border-border rounded-lg overflow-hidden\",\n className\n )}\n >\n {!readOnly && (\n <div className=\"border-b border-border bg-muted/50 p-2 flex flex-wrap gap-1\">\n <ToolbarButton\n onClick={() =>\n editor.chain().focus().toggleHeading({ level: 1 }).run()\n }\n title=\"Título 1\"\n isActive={editor.isActive(\"heading\", { level: 1 })}\n >\n <Heading1 className=\"w-4 h-4\" />\n </ToolbarButton>\n <ToolbarButton\n onClick={() =>\n editor.chain().focus().toggleHeading({ level: 2 }).run()\n }\n title=\"Título 2\"\n isActive={editor.isActive(\"heading\", { level: 2 })}\n >\n <Heading2 className=\"w-4 h-4\" />\n </ToolbarButton>\n <ToolbarButton\n onClick={() =>\n editor.chain().focus().toggleHeading({ level: 3 }).run()\n }\n title=\"Título 3\"\n isActive={editor.isActive(\"heading\", { level: 3 })}\n >\n <Heading3 className=\"w-4 h-4\" />\n </ToolbarButton>\n <div className=\"w-px h-6 bg-border mx-1\" />\n\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleBold().run()}\n title=\"Negrita\"\n isActive={editor.isActive(\"bold\")}\n >\n <Bold className=\"w-4 h-4\" />\n </ToolbarButton>\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleItalic().run()}\n title=\"Cursiva\"\n isActive={editor.isActive(\"italic\")}\n >\n <Italic className=\"w-4 h-4\" />\n </ToolbarButton>\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleStrike().run()}\n title=\"Tachado\"\n isActive={editor.isActive(\"strike\")}\n >\n <Strikethrough className=\"w-4 h-4\" />\n </ToolbarButton>\n <div className=\"w-px h-6 bg-border mx-1\" />\n\n <div className=\"relative\">\n <input\n type=\"color\"\n className=\"w-8 h-8 border border-border rounded cursor-pointer\"\n onChange={(e) => {\n editor.chain().focus().setColor(e.target.value).run();\n }}\n title=\"Color del texto\"\n />\n </div>\n\n <div className=\"w-px h-6 bg-border mx-1\" />\n\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleBulletList().run()}\n title=\"Lista con viñetas\"\n isActive={editor.isActive(\"bulletList\")}\n >\n <List className=\"w-4 h-4\" />\n </ToolbarButton>\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleOrderedList().run()}\n title=\"Lista numerada\"\n isActive={editor.isActive(\"orderedList\")}\n >\n <ListOrdered className=\"w-4 h-4\" />\n </ToolbarButton>\n <div className=\"w-px h-6 bg-border mx-1\" />\n\n <ToolbarButton\n onClick={() =>\n editor.chain().focus().setTextAlign(\"left\").run()\n }\n title=\"Alinear izquierda\"\n isActive={editor.isActive({ textAlign: \"left\" })}\n >\n <AlignLeft className=\"w-4 h-4\" />\n </ToolbarButton>\n <ToolbarButton\n onClick={() =>\n editor.chain().focus().setTextAlign(\"center\").run()\n }\n title=\"Centrar\"\n isActive={editor.isActive({ textAlign: \"center\" })}\n >\n <AlignCenter className=\"w-4 h-4\" />\n </ToolbarButton>\n <ToolbarButton\n onClick={() =>\n editor.chain().focus().setTextAlign(\"right\").run()\n }\n title=\"Alinear derecha\"\n isActive={editor.isActive({ textAlign: \"right\" })}\n >\n <AlignRight className=\"w-4 h-4\" />\n </ToolbarButton>\n <div className=\"w-px h-6 bg-border mx-1\" />\n\n <ToolbarButton\n onClick={() => {\n const url = prompt(\"Ingresa la URL:\");\n if (url) {\n editor.chain().focus().setLink({ href: url }).run();\n }\n }}\n title=\"Insertar enlace\"\n isActive={editor.isActive(\"link\")}\n >\n <Link className=\"w-4 h-4\" />\n </ToolbarButton>\n <ToolbarButton\n onClick={() => {\n const url = prompt(\"Ingresa la URL de la imagen:\");\n if (url) {\n editor.chain().focus().setImage({ src: url }).run();\n }\n }}\n title=\"Insertar imagen\"\n >\n <ImageIcon className=\"w-4 h-4\" />\n </ToolbarButton>\n </div>\n )}\n <EditorContent\n editor={editor}\n className=\"prose prose-sm max-w-none p-3 bg-card\"\n style={{ minHeight: `${height}px` }}\n />\n </div>\n );\n}\n\nexport { RichTextEditor };\nexport type { RichTextEditorProps };\n"],"mappings":"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","names":["import_react","StarterKit","TextAlign","Color","ImageExtension","LinkExtension","Placeholder","React","ImageIcon"]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/ui/rich-text-editor/rich-text-editor.tsx"],"sourcesContent":["\"use client\";\n\nimport React from \"react\";\nimport { useEditor, EditorContent } from \"@tiptap/react\";\nimport StarterKit from \"@tiptap/starter-kit\";\nimport TextAlign from \"@tiptap/extension-text-align\";\nimport Color from \"@tiptap/extension-color\";\nimport { TextStyle } from \"@tiptap/extension-text-style\";\nimport ImageExtension from \"@tiptap/extension-image\";\nimport LinkExtension from \"@tiptap/extension-link\";\nimport Placeholder from \"@tiptap/extension-placeholder\";\nimport {\n Bold,\n Italic,\n Strikethrough,\n List,\n ListOrdered,\n Link,\n AlignLeft,\n AlignCenter,\n AlignRight,\n Image as ImageIcon,\n Heading1,\n Heading2,\n Heading3,\n} from \"lucide-react\";\n\nimport { cn } from \"../../../lib/utils\";\n\ninterface RichTextEditorProps {\n value: string;\n onChange: (content: string) => void;\n placeholder?: string;\n height?: number;\n className?: string;\n readOnly?: boolean;\n}\n\nfunction ToolbarButton({\n onClick,\n children,\n title,\n isActive = false,\n}: {\n onClick: () => void;\n children: React.ReactNode;\n title: string;\n isActive?: boolean;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n title={title}\n className={cn(\n \"rounded p-2 transition-colors\",\n isActive ? \"bg-primary text-primary-foreground\" : \"text-muted-foreground hover:bg-muted\",\n )}\n >\n {children}\n </button>\n );\n}\n\nfunction RichTextEditor({\n value,\n onChange,\n placeholder = \"Escribe aquí...\",\n height = 200,\n className = \"\",\n readOnly = false,\n}: RichTextEditorProps) {\n const editor = useEditor({\n extensions: [\n StarterKit,\n TextAlign.configure({\n types: [\"heading\", \"paragraph\"],\n }),\n Color.configure({ types: [TextStyle.name] }),\n TextStyle,\n ImageExtension.configure({\n HTMLAttributes: {\n class: \"max-w-full h-auto rounded-lg\",\n },\n }),\n LinkExtension.configure({\n openOnClick: false,\n }),\n Placeholder.configure({\n placeholder: placeholder,\n }),\n ],\n content: value,\n editable: !readOnly,\n immediatelyRender: false,\n onUpdate: ({ editor: e }) => {\n onChange(e.getHTML());\n },\n editorProps: {\n attributes: {\n class:\n \"prose prose-sm sm:prose lg:prose-lg xl:prose-2xl mx-auto focus:outline-none max-w-none\",\n style: `min-height: ${height}px;`,\n },\n },\n });\n\n React.useEffect(() => {\n if (editor && editor.getHTML() !== value) {\n editor.commands.setContent(value);\n }\n }, [value, editor]);\n\n if (!editor) {\n return (\n <div className={cn(\"overflow-hidden rounded-lg border border-border\", className)}>\n <div className=\"flex h-32 animate-pulse items-center justify-center rounded bg-muted text-muted-foreground\">\n Cargando editor...\n </div>\n </div>\n );\n }\n\n return (\n <div\n data-slot=\"rich-text-editor\"\n className={cn(\"overflow-hidden rounded-lg border border-border\", className)}\n >\n {!readOnly && (\n <div className=\"flex flex-wrap gap-1 border-b border-border bg-muted/50 p-2\">\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleHeading({ level: 1 }).run()}\n title=\"Título 1\"\n isActive={editor.isActive(\"heading\", { level: 1 })}\n >\n <Heading1 className=\"h-4 w-4\" />\n </ToolbarButton>\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleHeading({ level: 2 }).run()}\n title=\"Título 2\"\n isActive={editor.isActive(\"heading\", { level: 2 })}\n >\n <Heading2 className=\"h-4 w-4\" />\n </ToolbarButton>\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleHeading({ level: 3 }).run()}\n title=\"Título 3\"\n isActive={editor.isActive(\"heading\", { level: 3 })}\n >\n <Heading3 className=\"h-4 w-4\" />\n </ToolbarButton>\n <div className=\"mx-1 h-6 w-px bg-border\" />\n\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleBold().run()}\n title=\"Negrita\"\n isActive={editor.isActive(\"bold\")}\n >\n <Bold className=\"h-4 w-4\" />\n </ToolbarButton>\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleItalic().run()}\n title=\"Cursiva\"\n isActive={editor.isActive(\"italic\")}\n >\n <Italic className=\"h-4 w-4\" />\n </ToolbarButton>\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleStrike().run()}\n title=\"Tachado\"\n isActive={editor.isActive(\"strike\")}\n >\n <Strikethrough className=\"h-4 w-4\" />\n </ToolbarButton>\n <div className=\"mx-1 h-6 w-px bg-border\" />\n\n <div className=\"relative\">\n <input\n type=\"color\"\n className=\"h-8 w-8 cursor-pointer rounded border border-border\"\n onChange={(e) => {\n editor.chain().focus().setColor(e.target.value).run();\n }}\n title=\"Color del texto\"\n />\n </div>\n\n <div className=\"mx-1 h-6 w-px bg-border\" />\n\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleBulletList().run()}\n title=\"Lista con viñetas\"\n isActive={editor.isActive(\"bulletList\")}\n >\n <List className=\"h-4 w-4\" />\n </ToolbarButton>\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleOrderedList().run()}\n title=\"Lista numerada\"\n isActive={editor.isActive(\"orderedList\")}\n >\n <ListOrdered className=\"h-4 w-4\" />\n </ToolbarButton>\n <div className=\"mx-1 h-6 w-px bg-border\" />\n\n <ToolbarButton\n onClick={() => editor.chain().focus().setTextAlign(\"left\").run()}\n title=\"Alinear izquierda\"\n isActive={editor.isActive({ textAlign: \"left\" })}\n >\n <AlignLeft className=\"h-4 w-4\" />\n </ToolbarButton>\n <ToolbarButton\n onClick={() => editor.chain().focus().setTextAlign(\"center\").run()}\n title=\"Centrar\"\n isActive={editor.isActive({ textAlign: \"center\" })}\n >\n <AlignCenter className=\"h-4 w-4\" />\n </ToolbarButton>\n <ToolbarButton\n onClick={() => editor.chain().focus().setTextAlign(\"right\").run()}\n title=\"Alinear derecha\"\n isActive={editor.isActive({ textAlign: \"right\" })}\n >\n <AlignRight className=\"h-4 w-4\" />\n </ToolbarButton>\n <div className=\"mx-1 h-6 w-px bg-border\" />\n\n <ToolbarButton\n onClick={() => {\n const url = prompt(\"Ingresa la URL:\");\n if (url) {\n editor.chain().focus().setLink({ href: url }).run();\n }\n }}\n title=\"Insertar enlace\"\n isActive={editor.isActive(\"link\")}\n >\n <Link className=\"h-4 w-4\" />\n </ToolbarButton>\n <ToolbarButton\n onClick={() => {\n const url = prompt(\"Ingresa la URL de la imagen:\");\n if (url) {\n editor.chain().focus().setImage({ src: url }).run();\n }\n }}\n title=\"Insertar imagen\"\n >\n <ImageIcon className=\"h-4 w-4\" />\n </ToolbarButton>\n </div>\n )}\n <EditorContent\n editor={editor}\n className=\"prose prose-sm max-w-none bg-card p-3\"\n style={{ minHeight: `${height}px` }}\n />\n </div>\n );\n}\n\nexport { RichTextEditor };\nexport type { RichTextEditorProps };\n"],"mappings":"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","names":["import_react","StarterKit","TextAlign","Color","ImageExtension","LinkExtension","Placeholder","React","ImageIcon"]}
|
|
@@ -38,8 +38,8 @@ function ToolbarButton({
|
|
|
38
38
|
onClick,
|
|
39
39
|
title,
|
|
40
40
|
className: cn(
|
|
41
|
-
"p-2
|
|
42
|
-
isActive ? "bg-primary text-primary-foreground" : "hover:bg-muted
|
|
41
|
+
"rounded p-2 transition-colors",
|
|
42
|
+
isActive ? "bg-primary text-primary-foreground" : "text-muted-foreground hover:bg-muted"
|
|
43
43
|
),
|
|
44
44
|
children
|
|
45
45
|
}
|
|
@@ -92,34 +92,22 @@ function RichTextEditor({
|
|
|
92
92
|
}
|
|
93
93
|
}, [value, editor]);
|
|
94
94
|
if (!editor) {
|
|
95
|
-
return /* @__PURE__ */ jsx(
|
|
96
|
-
"div",
|
|
97
|
-
{
|
|
98
|
-
className: cn(
|
|
99
|
-
"border border-border rounded-lg overflow-hidden",
|
|
100
|
-
className
|
|
101
|
-
),
|
|
102
|
-
children: /* @__PURE__ */ jsx("div", { className: "h-32 bg-muted rounded animate-pulse flex items-center justify-center text-muted-foreground", children: "Cargando editor..." })
|
|
103
|
-
}
|
|
104
|
-
);
|
|
95
|
+
return /* @__PURE__ */ jsx("div", { className: cn("overflow-hidden rounded-lg border border-border", className), children: /* @__PURE__ */ jsx("div", { className: "flex h-32 animate-pulse items-center justify-center rounded bg-muted text-muted-foreground", children: "Cargando editor..." }) });
|
|
105
96
|
}
|
|
106
97
|
return /* @__PURE__ */ jsxs(
|
|
107
98
|
"div",
|
|
108
99
|
{
|
|
109
100
|
"data-slot": "rich-text-editor",
|
|
110
|
-
className: cn(
|
|
111
|
-
"border border-border rounded-lg overflow-hidden",
|
|
112
|
-
className
|
|
113
|
-
),
|
|
101
|
+
className: cn("overflow-hidden rounded-lg border border-border", className),
|
|
114
102
|
children: [
|
|
115
|
-
!readOnly && /* @__PURE__ */ jsxs("div", { className: "border-b border-border bg-muted/50 p-2
|
|
103
|
+
!readOnly && /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap gap-1 border-b border-border bg-muted/50 p-2", children: [
|
|
116
104
|
/* @__PURE__ */ jsx(
|
|
117
105
|
ToolbarButton,
|
|
118
106
|
{
|
|
119
107
|
onClick: () => editor.chain().focus().toggleHeading({ level: 1 }).run(),
|
|
120
108
|
title: "T\xEDtulo 1",
|
|
121
109
|
isActive: editor.isActive("heading", { level: 1 }),
|
|
122
|
-
children: /* @__PURE__ */ jsx(Heading1, { className: "
|
|
110
|
+
children: /* @__PURE__ */ jsx(Heading1, { className: "h-4 w-4" })
|
|
123
111
|
}
|
|
124
112
|
),
|
|
125
113
|
/* @__PURE__ */ jsx(
|
|
@@ -128,7 +116,7 @@ function RichTextEditor({
|
|
|
128
116
|
onClick: () => editor.chain().focus().toggleHeading({ level: 2 }).run(),
|
|
129
117
|
title: "T\xEDtulo 2",
|
|
130
118
|
isActive: editor.isActive("heading", { level: 2 }),
|
|
131
|
-
children: /* @__PURE__ */ jsx(Heading2, { className: "
|
|
119
|
+
children: /* @__PURE__ */ jsx(Heading2, { className: "h-4 w-4" })
|
|
132
120
|
}
|
|
133
121
|
),
|
|
134
122
|
/* @__PURE__ */ jsx(
|
|
@@ -137,17 +125,17 @@ function RichTextEditor({
|
|
|
137
125
|
onClick: () => editor.chain().focus().toggleHeading({ level: 3 }).run(),
|
|
138
126
|
title: "T\xEDtulo 3",
|
|
139
127
|
isActive: editor.isActive("heading", { level: 3 }),
|
|
140
|
-
children: /* @__PURE__ */ jsx(Heading3, { className: "
|
|
128
|
+
children: /* @__PURE__ */ jsx(Heading3, { className: "h-4 w-4" })
|
|
141
129
|
}
|
|
142
130
|
),
|
|
143
|
-
/* @__PURE__ */ jsx("div", { className: "
|
|
131
|
+
/* @__PURE__ */ jsx("div", { className: "mx-1 h-6 w-px bg-border" }),
|
|
144
132
|
/* @__PURE__ */ jsx(
|
|
145
133
|
ToolbarButton,
|
|
146
134
|
{
|
|
147
135
|
onClick: () => editor.chain().focus().toggleBold().run(),
|
|
148
136
|
title: "Negrita",
|
|
149
137
|
isActive: editor.isActive("bold"),
|
|
150
|
-
children: /* @__PURE__ */ jsx(Bold, { className: "
|
|
138
|
+
children: /* @__PURE__ */ jsx(Bold, { className: "h-4 w-4" })
|
|
151
139
|
}
|
|
152
140
|
),
|
|
153
141
|
/* @__PURE__ */ jsx(
|
|
@@ -156,7 +144,7 @@ function RichTextEditor({
|
|
|
156
144
|
onClick: () => editor.chain().focus().toggleItalic().run(),
|
|
157
145
|
title: "Cursiva",
|
|
158
146
|
isActive: editor.isActive("italic"),
|
|
159
|
-
children: /* @__PURE__ */ jsx(Italic, { className: "
|
|
147
|
+
children: /* @__PURE__ */ jsx(Italic, { className: "h-4 w-4" })
|
|
160
148
|
}
|
|
161
149
|
),
|
|
162
150
|
/* @__PURE__ */ jsx(
|
|
@@ -165,29 +153,29 @@ function RichTextEditor({
|
|
|
165
153
|
onClick: () => editor.chain().focus().toggleStrike().run(),
|
|
166
154
|
title: "Tachado",
|
|
167
155
|
isActive: editor.isActive("strike"),
|
|
168
|
-
children: /* @__PURE__ */ jsx(Strikethrough, { className: "
|
|
156
|
+
children: /* @__PURE__ */ jsx(Strikethrough, { className: "h-4 w-4" })
|
|
169
157
|
}
|
|
170
158
|
),
|
|
171
|
-
/* @__PURE__ */ jsx("div", { className: "
|
|
159
|
+
/* @__PURE__ */ jsx("div", { className: "mx-1 h-6 w-px bg-border" }),
|
|
172
160
|
/* @__PURE__ */ jsx("div", { className: "relative", children: /* @__PURE__ */ jsx(
|
|
173
161
|
"input",
|
|
174
162
|
{
|
|
175
163
|
type: "color",
|
|
176
|
-
className: "
|
|
164
|
+
className: "h-8 w-8 cursor-pointer rounded border border-border",
|
|
177
165
|
onChange: (e) => {
|
|
178
166
|
editor.chain().focus().setColor(e.target.value).run();
|
|
179
167
|
},
|
|
180
168
|
title: "Color del texto"
|
|
181
169
|
}
|
|
182
170
|
) }),
|
|
183
|
-
/* @__PURE__ */ jsx("div", { className: "
|
|
171
|
+
/* @__PURE__ */ jsx("div", { className: "mx-1 h-6 w-px bg-border" }),
|
|
184
172
|
/* @__PURE__ */ jsx(
|
|
185
173
|
ToolbarButton,
|
|
186
174
|
{
|
|
187
175
|
onClick: () => editor.chain().focus().toggleBulletList().run(),
|
|
188
176
|
title: "Lista con vi\xF1etas",
|
|
189
177
|
isActive: editor.isActive("bulletList"),
|
|
190
|
-
children: /* @__PURE__ */ jsx(List, { className: "
|
|
178
|
+
children: /* @__PURE__ */ jsx(List, { className: "h-4 w-4" })
|
|
191
179
|
}
|
|
192
180
|
),
|
|
193
181
|
/* @__PURE__ */ jsx(
|
|
@@ -196,17 +184,17 @@ function RichTextEditor({
|
|
|
196
184
|
onClick: () => editor.chain().focus().toggleOrderedList().run(),
|
|
197
185
|
title: "Lista numerada",
|
|
198
186
|
isActive: editor.isActive("orderedList"),
|
|
199
|
-
children: /* @__PURE__ */ jsx(ListOrdered, { className: "
|
|
187
|
+
children: /* @__PURE__ */ jsx(ListOrdered, { className: "h-4 w-4" })
|
|
200
188
|
}
|
|
201
189
|
),
|
|
202
|
-
/* @__PURE__ */ jsx("div", { className: "
|
|
190
|
+
/* @__PURE__ */ jsx("div", { className: "mx-1 h-6 w-px bg-border" }),
|
|
203
191
|
/* @__PURE__ */ jsx(
|
|
204
192
|
ToolbarButton,
|
|
205
193
|
{
|
|
206
194
|
onClick: () => editor.chain().focus().setTextAlign("left").run(),
|
|
207
195
|
title: "Alinear izquierda",
|
|
208
196
|
isActive: editor.isActive({ textAlign: "left" }),
|
|
209
|
-
children: /* @__PURE__ */ jsx(AlignLeft, { className: "
|
|
197
|
+
children: /* @__PURE__ */ jsx(AlignLeft, { className: "h-4 w-4" })
|
|
210
198
|
}
|
|
211
199
|
),
|
|
212
200
|
/* @__PURE__ */ jsx(
|
|
@@ -215,7 +203,7 @@ function RichTextEditor({
|
|
|
215
203
|
onClick: () => editor.chain().focus().setTextAlign("center").run(),
|
|
216
204
|
title: "Centrar",
|
|
217
205
|
isActive: editor.isActive({ textAlign: "center" }),
|
|
218
|
-
children: /* @__PURE__ */ jsx(AlignCenter, { className: "
|
|
206
|
+
children: /* @__PURE__ */ jsx(AlignCenter, { className: "h-4 w-4" })
|
|
219
207
|
}
|
|
220
208
|
),
|
|
221
209
|
/* @__PURE__ */ jsx(
|
|
@@ -224,10 +212,10 @@ function RichTextEditor({
|
|
|
224
212
|
onClick: () => editor.chain().focus().setTextAlign("right").run(),
|
|
225
213
|
title: "Alinear derecha",
|
|
226
214
|
isActive: editor.isActive({ textAlign: "right" }),
|
|
227
|
-
children: /* @__PURE__ */ jsx(AlignRight, { className: "
|
|
215
|
+
children: /* @__PURE__ */ jsx(AlignRight, { className: "h-4 w-4" })
|
|
228
216
|
}
|
|
229
217
|
),
|
|
230
|
-
/* @__PURE__ */ jsx("div", { className: "
|
|
218
|
+
/* @__PURE__ */ jsx("div", { className: "mx-1 h-6 w-px bg-border" }),
|
|
231
219
|
/* @__PURE__ */ jsx(
|
|
232
220
|
ToolbarButton,
|
|
233
221
|
{
|
|
@@ -239,7 +227,7 @@ function RichTextEditor({
|
|
|
239
227
|
},
|
|
240
228
|
title: "Insertar enlace",
|
|
241
229
|
isActive: editor.isActive("link"),
|
|
242
|
-
children: /* @__PURE__ */ jsx(Link, { className: "
|
|
230
|
+
children: /* @__PURE__ */ jsx(Link, { className: "h-4 w-4" })
|
|
243
231
|
}
|
|
244
232
|
),
|
|
245
233
|
/* @__PURE__ */ jsx(
|
|
@@ -252,7 +240,7 @@ function RichTextEditor({
|
|
|
252
240
|
}
|
|
253
241
|
},
|
|
254
242
|
title: "Insertar imagen",
|
|
255
|
-
children: /* @__PURE__ */ jsx(ImageIcon, { className: "
|
|
243
|
+
children: /* @__PURE__ */ jsx(ImageIcon, { className: "h-4 w-4" })
|
|
256
244
|
}
|
|
257
245
|
)
|
|
258
246
|
] }),
|
|
@@ -260,7 +248,7 @@ function RichTextEditor({
|
|
|
260
248
|
EditorContent,
|
|
261
249
|
{
|
|
262
250
|
editor,
|
|
263
|
-
className: "prose prose-sm max-w-none p-3
|
|
251
|
+
className: "prose prose-sm max-w-none bg-card p-3",
|
|
264
252
|
style: { minHeight: `${height}px` }
|
|
265
253
|
}
|
|
266
254
|
)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/ui/rich-text-editor/rich-text-editor.tsx"],"sourcesContent":["\"use client\";\n\nimport React from \"react\";\nimport { useEditor, EditorContent } from \"@tiptap/react\";\nimport StarterKit from \"@tiptap/starter-kit\";\nimport TextAlign from \"@tiptap/extension-text-align\";\nimport Color from \"@tiptap/extension-color\";\nimport { TextStyle } from \"@tiptap/extension-text-style\";\nimport ImageExtension from \"@tiptap/extension-image\";\nimport LinkExtension from \"@tiptap/extension-link\";\nimport Placeholder from \"@tiptap/extension-placeholder\";\nimport {\n Bold,\n Italic,\n Strikethrough,\n List,\n ListOrdered,\n Link,\n AlignLeft,\n AlignCenter,\n AlignRight,\n Image as ImageIcon,\n Heading1,\n Heading2,\n Heading3,\n} from \"lucide-react\";\n\nimport { cn } from \"../../../lib/utils\";\n\ninterface RichTextEditorProps {\n value: string;\n onChange: (content: string) => void;\n placeholder?: string;\n height?: number;\n className?: string;\n readOnly?: boolean;\n}\n\nfunction ToolbarButton({\n onClick,\n children,\n title,\n isActive = false,\n}: {\n onClick: () => void;\n children: React.ReactNode;\n title: string;\n isActive?: boolean;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n title={title}\n className={cn(\n \"p-2 rounded transition-colors\",\n isActive\n ? \"bg-primary text-primary-foreground\"\n : \"hover:bg-muted text-muted-foreground\"\n )}\n >\n {children}\n </button>\n );\n}\n\nfunction RichTextEditor({\n value,\n onChange,\n placeholder = \"Escribe aquí...\",\n height = 200,\n className = \"\",\n readOnly = false,\n}: RichTextEditorProps) {\n const editor = useEditor({\n extensions: [\n StarterKit,\n TextAlign.configure({\n types: [\"heading\", \"paragraph\"],\n }),\n Color.configure({ types: [TextStyle.name] }),\n TextStyle,\n ImageExtension.configure({\n HTMLAttributes: {\n class: \"max-w-full h-auto rounded-lg\",\n },\n }),\n LinkExtension.configure({\n openOnClick: false,\n }),\n Placeholder.configure({\n placeholder: placeholder,\n }),\n ],\n content: value,\n editable: !readOnly,\n immediatelyRender: false,\n onUpdate: ({ editor: e }) => {\n onChange(e.getHTML());\n },\n editorProps: {\n attributes: {\n class:\n \"prose prose-sm sm:prose lg:prose-lg xl:prose-2xl mx-auto focus:outline-none max-w-none\",\n style: `min-height: ${height}px;`,\n },\n },\n });\n\n React.useEffect(() => {\n if (editor && editor.getHTML() !== value) {\n editor.commands.setContent(value);\n }\n }, [value, editor]);\n\n if (!editor) {\n return (\n <div\n className={cn(\n \"border border-border rounded-lg overflow-hidden\",\n className\n )}\n >\n <div className=\"h-32 bg-muted rounded animate-pulse flex items-center justify-center text-muted-foreground\">\n Cargando editor...\n </div>\n </div>\n );\n }\n\n return (\n <div\n data-slot=\"rich-text-editor\"\n className={cn(\n \"border border-border rounded-lg overflow-hidden\",\n className\n )}\n >\n {!readOnly && (\n <div className=\"border-b border-border bg-muted/50 p-2 flex flex-wrap gap-1\">\n <ToolbarButton\n onClick={() =>\n editor.chain().focus().toggleHeading({ level: 1 }).run()\n }\n title=\"Título 1\"\n isActive={editor.isActive(\"heading\", { level: 1 })}\n >\n <Heading1 className=\"w-4 h-4\" />\n </ToolbarButton>\n <ToolbarButton\n onClick={() =>\n editor.chain().focus().toggleHeading({ level: 2 }).run()\n }\n title=\"Título 2\"\n isActive={editor.isActive(\"heading\", { level: 2 })}\n >\n <Heading2 className=\"w-4 h-4\" />\n </ToolbarButton>\n <ToolbarButton\n onClick={() =>\n editor.chain().focus().toggleHeading({ level: 3 }).run()\n }\n title=\"Título 3\"\n isActive={editor.isActive(\"heading\", { level: 3 })}\n >\n <Heading3 className=\"w-4 h-4\" />\n </ToolbarButton>\n <div className=\"w-px h-6 bg-border mx-1\" />\n\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleBold().run()}\n title=\"Negrita\"\n isActive={editor.isActive(\"bold\")}\n >\n <Bold className=\"w-4 h-4\" />\n </ToolbarButton>\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleItalic().run()}\n title=\"Cursiva\"\n isActive={editor.isActive(\"italic\")}\n >\n <Italic className=\"w-4 h-4\" />\n </ToolbarButton>\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleStrike().run()}\n title=\"Tachado\"\n isActive={editor.isActive(\"strike\")}\n >\n <Strikethrough className=\"w-4 h-4\" />\n </ToolbarButton>\n <div className=\"w-px h-6 bg-border mx-1\" />\n\n <div className=\"relative\">\n <input\n type=\"color\"\n className=\"w-8 h-8 border border-border rounded cursor-pointer\"\n onChange={(e) => {\n editor.chain().focus().setColor(e.target.value).run();\n }}\n title=\"Color del texto\"\n />\n </div>\n\n <div className=\"w-px h-6 bg-border mx-1\" />\n\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleBulletList().run()}\n title=\"Lista con viñetas\"\n isActive={editor.isActive(\"bulletList\")}\n >\n <List className=\"w-4 h-4\" />\n </ToolbarButton>\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleOrderedList().run()}\n title=\"Lista numerada\"\n isActive={editor.isActive(\"orderedList\")}\n >\n <ListOrdered className=\"w-4 h-4\" />\n </ToolbarButton>\n <div className=\"w-px h-6 bg-border mx-1\" />\n\n <ToolbarButton\n onClick={() =>\n editor.chain().focus().setTextAlign(\"left\").run()\n }\n title=\"Alinear izquierda\"\n isActive={editor.isActive({ textAlign: \"left\" })}\n >\n <AlignLeft className=\"w-4 h-4\" />\n </ToolbarButton>\n <ToolbarButton\n onClick={() =>\n editor.chain().focus().setTextAlign(\"center\").run()\n }\n title=\"Centrar\"\n isActive={editor.isActive({ textAlign: \"center\" })}\n >\n <AlignCenter className=\"w-4 h-4\" />\n </ToolbarButton>\n <ToolbarButton\n onClick={() =>\n editor.chain().focus().setTextAlign(\"right\").run()\n }\n title=\"Alinear derecha\"\n isActive={editor.isActive({ textAlign: \"right\" })}\n >\n <AlignRight className=\"w-4 h-4\" />\n </ToolbarButton>\n <div className=\"w-px h-6 bg-border mx-1\" />\n\n <ToolbarButton\n onClick={() => {\n const url = prompt(\"Ingresa la URL:\");\n if (url) {\n editor.chain().focus().setLink({ href: url }).run();\n }\n }}\n title=\"Insertar enlace\"\n isActive={editor.isActive(\"link\")}\n >\n <Link className=\"w-4 h-4\" />\n </ToolbarButton>\n <ToolbarButton\n onClick={() => {\n const url = prompt(\"Ingresa la URL de la imagen:\");\n if (url) {\n editor.chain().focus().setImage({ src: url }).run();\n }\n }}\n title=\"Insertar imagen\"\n >\n <ImageIcon className=\"w-4 h-4\" />\n </ToolbarButton>\n </div>\n )}\n <EditorContent\n editor={editor}\n className=\"prose prose-sm max-w-none p-3 bg-card\"\n style={{ minHeight: `${height}px` }}\n />\n </div>\n );\n}\n\nexport { RichTextEditor };\nexport type { RichTextEditorProps };\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/ui/rich-text-editor/rich-text-editor.tsx"],"sourcesContent":["\"use client\";\n\nimport React from \"react\";\nimport { useEditor, EditorContent } from \"@tiptap/react\";\nimport StarterKit from \"@tiptap/starter-kit\";\nimport TextAlign from \"@tiptap/extension-text-align\";\nimport Color from \"@tiptap/extension-color\";\nimport { TextStyle } from \"@tiptap/extension-text-style\";\nimport ImageExtension from \"@tiptap/extension-image\";\nimport LinkExtension from \"@tiptap/extension-link\";\nimport Placeholder from \"@tiptap/extension-placeholder\";\nimport {\n Bold,\n Italic,\n Strikethrough,\n List,\n ListOrdered,\n Link,\n AlignLeft,\n AlignCenter,\n AlignRight,\n Image as ImageIcon,\n Heading1,\n Heading2,\n Heading3,\n} from \"lucide-react\";\n\nimport { cn } from \"../../../lib/utils\";\n\ninterface RichTextEditorProps {\n value: string;\n onChange: (content: string) => void;\n placeholder?: string;\n height?: number;\n className?: string;\n readOnly?: boolean;\n}\n\nfunction ToolbarButton({\n onClick,\n children,\n title,\n isActive = false,\n}: {\n onClick: () => void;\n children: React.ReactNode;\n title: string;\n isActive?: boolean;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n title={title}\n className={cn(\n \"rounded p-2 transition-colors\",\n isActive ? \"bg-primary text-primary-foreground\" : \"text-muted-foreground hover:bg-muted\",\n )}\n >\n {children}\n </button>\n );\n}\n\nfunction RichTextEditor({\n value,\n onChange,\n placeholder = \"Escribe aquí...\",\n height = 200,\n className = \"\",\n readOnly = false,\n}: RichTextEditorProps) {\n const editor = useEditor({\n extensions: [\n StarterKit,\n TextAlign.configure({\n types: [\"heading\", \"paragraph\"],\n }),\n Color.configure({ types: [TextStyle.name] }),\n TextStyle,\n ImageExtension.configure({\n HTMLAttributes: {\n class: \"max-w-full h-auto rounded-lg\",\n },\n }),\n LinkExtension.configure({\n openOnClick: false,\n }),\n Placeholder.configure({\n placeholder: placeholder,\n }),\n ],\n content: value,\n editable: !readOnly,\n immediatelyRender: false,\n onUpdate: ({ editor: e }) => {\n onChange(e.getHTML());\n },\n editorProps: {\n attributes: {\n class:\n \"prose prose-sm sm:prose lg:prose-lg xl:prose-2xl mx-auto focus:outline-none max-w-none\",\n style: `min-height: ${height}px;`,\n },\n },\n });\n\n React.useEffect(() => {\n if (editor && editor.getHTML() !== value) {\n editor.commands.setContent(value);\n }\n }, [value, editor]);\n\n if (!editor) {\n return (\n <div className={cn(\"overflow-hidden rounded-lg border border-border\", className)}>\n <div className=\"flex h-32 animate-pulse items-center justify-center rounded bg-muted text-muted-foreground\">\n Cargando editor...\n </div>\n </div>\n );\n }\n\n return (\n <div\n data-slot=\"rich-text-editor\"\n className={cn(\"overflow-hidden rounded-lg border border-border\", className)}\n >\n {!readOnly && (\n <div className=\"flex flex-wrap gap-1 border-b border-border bg-muted/50 p-2\">\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleHeading({ level: 1 }).run()}\n title=\"Título 1\"\n isActive={editor.isActive(\"heading\", { level: 1 })}\n >\n <Heading1 className=\"h-4 w-4\" />\n </ToolbarButton>\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleHeading({ level: 2 }).run()}\n title=\"Título 2\"\n isActive={editor.isActive(\"heading\", { level: 2 })}\n >\n <Heading2 className=\"h-4 w-4\" />\n </ToolbarButton>\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleHeading({ level: 3 }).run()}\n title=\"Título 3\"\n isActive={editor.isActive(\"heading\", { level: 3 })}\n >\n <Heading3 className=\"h-4 w-4\" />\n </ToolbarButton>\n <div className=\"mx-1 h-6 w-px bg-border\" />\n\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleBold().run()}\n title=\"Negrita\"\n isActive={editor.isActive(\"bold\")}\n >\n <Bold className=\"h-4 w-4\" />\n </ToolbarButton>\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleItalic().run()}\n title=\"Cursiva\"\n isActive={editor.isActive(\"italic\")}\n >\n <Italic className=\"h-4 w-4\" />\n </ToolbarButton>\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleStrike().run()}\n title=\"Tachado\"\n isActive={editor.isActive(\"strike\")}\n >\n <Strikethrough className=\"h-4 w-4\" />\n </ToolbarButton>\n <div className=\"mx-1 h-6 w-px bg-border\" />\n\n <div className=\"relative\">\n <input\n type=\"color\"\n className=\"h-8 w-8 cursor-pointer rounded border border-border\"\n onChange={(e) => {\n editor.chain().focus().setColor(e.target.value).run();\n }}\n title=\"Color del texto\"\n />\n </div>\n\n <div className=\"mx-1 h-6 w-px bg-border\" />\n\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleBulletList().run()}\n title=\"Lista con viñetas\"\n isActive={editor.isActive(\"bulletList\")}\n >\n <List className=\"h-4 w-4\" />\n </ToolbarButton>\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleOrderedList().run()}\n title=\"Lista numerada\"\n isActive={editor.isActive(\"orderedList\")}\n >\n <ListOrdered className=\"h-4 w-4\" />\n </ToolbarButton>\n <div className=\"mx-1 h-6 w-px bg-border\" />\n\n <ToolbarButton\n onClick={() => editor.chain().focus().setTextAlign(\"left\").run()}\n title=\"Alinear izquierda\"\n isActive={editor.isActive({ textAlign: \"left\" })}\n >\n <AlignLeft className=\"h-4 w-4\" />\n </ToolbarButton>\n <ToolbarButton\n onClick={() => editor.chain().focus().setTextAlign(\"center\").run()}\n title=\"Centrar\"\n isActive={editor.isActive({ textAlign: \"center\" })}\n >\n <AlignCenter className=\"h-4 w-4\" />\n </ToolbarButton>\n <ToolbarButton\n onClick={() => editor.chain().focus().setTextAlign(\"right\").run()}\n title=\"Alinear derecha\"\n isActive={editor.isActive({ textAlign: \"right\" })}\n >\n <AlignRight className=\"h-4 w-4\" />\n </ToolbarButton>\n <div className=\"mx-1 h-6 w-px bg-border\" />\n\n <ToolbarButton\n onClick={() => {\n const url = prompt(\"Ingresa la URL:\");\n if (url) {\n editor.chain().focus().setLink({ href: url }).run();\n }\n }}\n title=\"Insertar enlace\"\n isActive={editor.isActive(\"link\")}\n >\n <Link className=\"h-4 w-4\" />\n </ToolbarButton>\n <ToolbarButton\n onClick={() => {\n const url = prompt(\"Ingresa la URL de la imagen:\");\n if (url) {\n editor.chain().focus().setImage({ src: url }).run();\n }\n }}\n title=\"Insertar imagen\"\n >\n <ImageIcon className=\"h-4 w-4\" />\n </ToolbarButton>\n </div>\n )}\n <EditorContent\n editor={editor}\n className=\"prose prose-sm max-w-none bg-card p-3\"\n style={{ minHeight: `${height}px` }}\n />\n </div>\n );\n}\n\nexport { RichTextEditor };\nexport type { RichTextEditorProps };\n"],"mappings":";AAkDI,cA+EI,YA/EJ;AAhDJ,OAAO,WAAW;AAClB,SAAS,WAAW,qBAAqB;AACzC,OAAO,gBAAgB;AACvB,OAAO,eAAe;AACtB,OAAO,WAAW;AAClB,SAAS,iBAAiB;AAC1B,OAAO,oBAAoB;AAC3B,OAAO,mBAAmB;AAC1B,OAAO,iBAAiB;AACxB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,SAAS,UAAU;AAWnB,SAAS,cAAc;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AACb,GAKG;AACD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA,WAAW,uCAAuC;AAAA,MACpD;AAAA,MAEC;AAAA;AAAA,EACH;AAEJ;AAEA,SAAS,eAAe;AAAA,EACtB;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,WAAW;AACb,GAAwB;AACtB,QAAM,SAAS,UAAU;AAAA,IACvB,YAAY;AAAA,MACV;AAAA,MACA,UAAU,UAAU;AAAA,QAClB,OAAO,CAAC,WAAW,WAAW;AAAA,MAChC,CAAC;AAAA,MACD,MAAM,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC;AAAA,MAC3C;AAAA,MACA,eAAe,UAAU;AAAA,QACvB,gBAAgB;AAAA,UACd,OAAO;AAAA,QACT;AAAA,MACF,CAAC;AAAA,MACD,cAAc,UAAU;AAAA,QACtB,aAAa;AAAA,MACf,CAAC;AAAA,MACD,YAAY,UAAU;AAAA,QACpB;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,SAAS;AAAA,IACT,UAAU,CAAC;AAAA,IACX,mBAAmB;AAAA,IACnB,UAAU,CAAC,EAAE,QAAQ,EAAE,MAAM;AAC3B,eAAS,EAAE,QAAQ,CAAC;AAAA,IACtB;AAAA,IACA,aAAa;AAAA,MACX,YAAY;AAAA,QACV,OACE;AAAA,QACF,OAAO,eAAe,MAAM;AAAA,MAC9B;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM,UAAU,MAAM;AACpB,QAAI,UAAU,OAAO,QAAQ,MAAM,OAAO;AACxC,aAAO,SAAS,WAAW,KAAK;AAAA,IAClC;AAAA,EACF,GAAG,CAAC,OAAO,MAAM,CAAC;AAElB,MAAI,CAAC,QAAQ;AACX,WACE,oBAAC,SAAI,WAAW,GAAG,mDAAmD,SAAS,GAC7E,8BAAC,SAAI,WAAU,8FAA6F,gCAE5G,GACF;AAAA,EAEJ;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,mDAAmD,SAAS;AAAA,MAEzE;AAAA,SAAC,YACA,qBAAC,SAAI,WAAU,+DACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI;AAAA,cACtE,OAAM;AAAA,cACN,UAAU,OAAO,SAAS,WAAW,EAAE,OAAO,EAAE,CAAC;AAAA,cAEjD,8BAAC,YAAS,WAAU,WAAU;AAAA;AAAA,UAChC;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI;AAAA,cACtE,OAAM;AAAA,cACN,UAAU,OAAO,SAAS,WAAW,EAAE,OAAO,EAAE,CAAC;AAAA,cAEjD,8BAAC,YAAS,WAAU,WAAU;AAAA;AAAA,UAChC;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI;AAAA,cACtE,OAAM;AAAA,cACN,UAAU,OAAO,SAAS,WAAW,EAAE,OAAO,EAAE,CAAC;AAAA,cAEjD,8BAAC,YAAS,WAAU,WAAU;AAAA;AAAA,UAChC;AAAA,UACA,oBAAC,SAAI,WAAU,2BAA0B;AAAA,UAEzC;AAAA,YAAC;AAAA;AAAA,cACC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI;AAAA,cACvD,OAAM;AAAA,cACN,UAAU,OAAO,SAAS,MAAM;AAAA,cAEhC,8BAAC,QAAK,WAAU,WAAU;AAAA;AAAA,UAC5B;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI;AAAA,cACzD,OAAM;AAAA,cACN,UAAU,OAAO,SAAS,QAAQ;AAAA,cAElC,8BAAC,UAAO,WAAU,WAAU;AAAA;AAAA,UAC9B;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI;AAAA,cACzD,OAAM;AAAA,cACN,UAAU,OAAO,SAAS,QAAQ;AAAA,cAElC,8BAAC,iBAAc,WAAU,WAAU;AAAA;AAAA,UACrC;AAAA,UACA,oBAAC,SAAI,WAAU,2BAA0B;AAAA,UAEzC,oBAAC,SAAI,WAAU,YACb;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAU;AAAA,cACV,UAAU,CAAC,MAAM;AACf,uBAAO,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,KAAK,EAAE,IAAI;AAAA,cACtD;AAAA,cACA,OAAM;AAAA;AAAA,UACR,GACF;AAAA,UAEA,oBAAC,SAAI,WAAU,2BAA0B;AAAA,UAEzC;AAAA,YAAC;AAAA;AAAA,cACC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,IAAI;AAAA,cAC7D,OAAM;AAAA,cACN,UAAU,OAAO,SAAS,YAAY;AAAA,cAEtC,8BAAC,QAAK,WAAU,WAAU;AAAA;AAAA,UAC5B;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,kBAAkB,EAAE,IAAI;AAAA,cAC9D,OAAM;AAAA,cACN,UAAU,OAAO,SAAS,aAAa;AAAA,cAEvC,8BAAC,eAAY,WAAU,WAAU;AAAA;AAAA,UACnC;AAAA,UACA,oBAAC,SAAI,WAAU,2BAA0B;AAAA,UAEzC;AAAA,YAAC;AAAA;AAAA,cACC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,aAAa,MAAM,EAAE,IAAI;AAAA,cAC/D,OAAM;AAAA,cACN,UAAU,OAAO,SAAS,EAAE,WAAW,OAAO,CAAC;AAAA,cAE/C,8BAAC,aAAU,WAAU,WAAU;AAAA;AAAA,UACjC;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,aAAa,QAAQ,EAAE,IAAI;AAAA,cACjE,OAAM;AAAA,cACN,UAAU,OAAO,SAAS,EAAE,WAAW,SAAS,CAAC;AAAA,cAEjD,8BAAC,eAAY,WAAU,WAAU;AAAA;AAAA,UACnC;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,aAAa,OAAO,EAAE,IAAI;AAAA,cAChE,OAAM;AAAA,cACN,UAAU,OAAO,SAAS,EAAE,WAAW,QAAQ,CAAC;AAAA,cAEhD,8BAAC,cAAW,WAAU,WAAU;AAAA;AAAA,UAClC;AAAA,UACA,oBAAC,SAAI,WAAU,2BAA0B;AAAA,UAEzC;AAAA,YAAC;AAAA;AAAA,cACC,SAAS,MAAM;AACb,sBAAM,MAAM,OAAO,iBAAiB;AACpC,oBAAI,KAAK;AACP,yBAAO,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC,EAAE,IAAI;AAAA,gBACpD;AAAA,cACF;AAAA,cACA,OAAM;AAAA,cACN,UAAU,OAAO,SAAS,MAAM;AAAA,cAEhC,8BAAC,QAAK,WAAU,WAAU;AAAA;AAAA,UAC5B;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,SAAS,MAAM;AACb,sBAAM,MAAM,OAAO,8BAA8B;AACjD,oBAAI,KAAK;AACP,yBAAO,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,IAAI,CAAC,EAAE,IAAI;AAAA,gBACpD;AAAA,cACF;AAAA,cACA,OAAM;AAAA,cAEN,8BAAC,aAAU,WAAU,WAAU;AAAA;AAAA,UACjC;AAAA,WACF;AAAA,QAEF;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA,WAAU;AAAA,YACV,OAAO,EAAE,WAAW,GAAG,MAAM,KAAK;AAAA;AAAA,QACpC;AAAA;AAAA;AAAA,EACF;AAEJ;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/ui/scroll-area/scroll-area.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport * as ScrollAreaPrimitive from \"@radix-ui/react-scroll-area\";\n\nimport { cn } from \"../../../lib/utils\";\n\nconst ScrollArea = React.forwardRef<\n
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/ui/scroll-area/scroll-area.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport * as ScrollAreaPrimitive from \"@radix-ui/react-scroll-area\";\n\nimport { cn } from \"../../../lib/utils\";\n\nconst ScrollArea = React.forwardRef<\n React.ElementRef<typeof ScrollAreaPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.Root>\n>(({ className, children, ...props }, ref) => (\n <ScrollAreaPrimitive.Root\n ref={ref}\n className={cn(\"relative overflow-hidden\", className)}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport className=\"h-full w-full rounded-[inherit]\">\n {children}\n </ScrollAreaPrimitive.Viewport>\n <ScrollBar />\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n));\nScrollArea.displayName = ScrollAreaPrimitive.Root.displayName;\n\nconst ScrollBar = React.forwardRef<\n React.ElementRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>,\n React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>\n>(({ className, orientation = \"vertical\", ...props }, ref) => (\n <ScrollAreaPrimitive.ScrollAreaScrollbar\n ref={ref}\n orientation={orientation}\n className={cn(\n \"flex touch-none select-none transition-colors\",\n orientation === \"vertical\" && \"h-full w-2.5 border-l border-l-transparent p-[1px]\",\n orientation === \"horizontal\" && \"h-2.5 flex-col border-t border-t-transparent p-[1px]\",\n className,\n )}\n {...props}\n >\n <ScrollAreaPrimitive.ScrollAreaThumb className=\"relative flex-1 rounded-full bg-border\" />\n </ScrollAreaPrimitive.ScrollAreaScrollbar>\n));\nScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName;\n\nexport { ScrollArea, ScrollBar };\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWE;AATF,YAAuB;AACvB,0BAAqC;AAErC,mBAAmB;AAEnB,MAAM,aAAa,MAAM,WAGvB,CAAC,EAAE,WAAW,UAAU,GAAG,MAAM,GAAG,QACpC;AAAA,EAAC,oBAAoB;AAAA,EAApB;AAAA,IACC;AAAA,IACA,eAAW,iBAAG,4BAA4B,SAAS;AAAA,IAClD,GAAG;AAAA,IAEJ;AAAA,kDAAC,oBAAoB,UAApB,EAA6B,WAAU,mCACrC,UACH;AAAA,MACA,4CAAC,aAAU;AAAA,MACX,4CAAC,oBAAoB,QAApB,EAA2B;AAAA;AAAA;AAC9B,CACD;AACD,WAAW,cAAc,oBAAoB,KAAK;AAElD,MAAM,YAAY,MAAM,WAGtB,CAAC,EAAE,WAAW,cAAc,YAAY,GAAG,MAAM,GAAG,QACpD;AAAA,EAAC,oBAAoB;AAAA,EAApB;AAAA,IACC;AAAA,IACA;AAAA,IACA,eAAW;AAAA,MACT;AAAA,MACA,gBAAgB,cAAc;AAAA,MAC9B,gBAAgB,gBAAgB;AAAA,MAChC;AAAA,IACF;AAAA,IACC,GAAG;AAAA,IAEJ,sDAAC,oBAAoB,iBAApB,EAAoC,WAAU,0CAAyC;AAAA;AAC1F,CACD;AACD,UAAU,cAAc,oBAAoB,oBAAoB;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/ui/scroll-area/scroll-area.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport * as ScrollAreaPrimitive from \"@radix-ui/react-scroll-area\";\n\nimport { cn } from \"../../../lib/utils\";\n\nconst ScrollArea = React.forwardRef<\n
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/ui/scroll-area/scroll-area.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport * as ScrollAreaPrimitive from \"@radix-ui/react-scroll-area\";\n\nimport { cn } from \"../../../lib/utils\";\n\nconst ScrollArea = React.forwardRef<\n React.ElementRef<typeof ScrollAreaPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.Root>\n>(({ className, children, ...props }, ref) => (\n <ScrollAreaPrimitive.Root\n ref={ref}\n className={cn(\"relative overflow-hidden\", className)}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport className=\"h-full w-full rounded-[inherit]\">\n {children}\n </ScrollAreaPrimitive.Viewport>\n <ScrollBar />\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n));\nScrollArea.displayName = ScrollAreaPrimitive.Root.displayName;\n\nconst ScrollBar = React.forwardRef<\n React.ElementRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>,\n React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>\n>(({ className, orientation = \"vertical\", ...props }, ref) => (\n <ScrollAreaPrimitive.ScrollAreaScrollbar\n ref={ref}\n orientation={orientation}\n className={cn(\n \"flex touch-none select-none transition-colors\",\n orientation === \"vertical\" && \"h-full w-2.5 border-l border-l-transparent p-[1px]\",\n orientation === \"horizontal\" && \"h-2.5 flex-col border-t border-t-transparent p-[1px]\",\n className,\n )}\n {...props}\n >\n <ScrollAreaPrimitive.ScrollAreaThumb className=\"relative flex-1 rounded-full bg-border\" />\n </ScrollAreaPrimitive.ScrollAreaScrollbar>\n));\nScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName;\n\nexport { ScrollArea, ScrollBar };\n"],"mappings":";AAWE,SAKE,KALF;AATF,YAAY,WAAW;AACvB,YAAY,yBAAyB;AAErC,SAAS,UAAU;AAEnB,MAAM,aAAa,MAAM,WAGvB,CAAC,EAAE,WAAW,UAAU,GAAG,MAAM,GAAG,QACpC;AAAA,EAAC,oBAAoB;AAAA,EAApB;AAAA,IACC;AAAA,IACA,WAAW,GAAG,4BAA4B,SAAS;AAAA,IAClD,GAAG;AAAA,IAEJ;AAAA,0BAAC,oBAAoB,UAApB,EAA6B,WAAU,mCACrC,UACH;AAAA,MACA,oBAAC,aAAU;AAAA,MACX,oBAAC,oBAAoB,QAApB,EAA2B;AAAA;AAAA;AAC9B,CACD;AACD,WAAW,cAAc,oBAAoB,KAAK;AAElD,MAAM,YAAY,MAAM,WAGtB,CAAC,EAAE,WAAW,cAAc,YAAY,GAAG,MAAM,GAAG,QACpD;AAAA,EAAC,oBAAoB;AAAA,EAApB;AAAA,IACC;AAAA,IACA;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA,gBAAgB,cAAc;AAAA,MAC9B,gBAAgB,gBAAgB;AAAA,MAChC;AAAA,IACF;AAAA,IACC,GAAG;AAAA,IAEJ,8BAAC,oBAAoB,iBAApB,EAAoC,WAAU,0CAAyC;AAAA;AAC1F,CACD;AACD,UAAU,cAAc,oBAAoB,oBAAoB;","names":[]}
|
|
@@ -37,27 +37,16 @@ function SectionLoader({
|
|
|
37
37
|
"div",
|
|
38
38
|
{
|
|
39
39
|
"data-slot": "section-loader",
|
|
40
|
-
className: (0, import_utils.cn)(
|
|
41
|
-
"flex flex-col items-center justify-center py-12 space-y-4",
|
|
42
|
-
className
|
|
43
|
-
),
|
|
40
|
+
className: (0, import_utils.cn)("flex flex-col items-center justify-center space-y-4 py-12", className),
|
|
44
41
|
children: [
|
|
45
42
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center space-x-3", children: [
|
|
46
43
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Loader2, { className: "h-6 w-6 animate-spin text-primary" }),
|
|
47
44
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("h3", { className: "text-lg font-semibold text-foreground/70", children: title })
|
|
48
45
|
] }),
|
|
49
|
-
description && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "
|
|
46
|
+
description && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "max-w-md text-center text-sm text-muted-foreground", children: description }),
|
|
50
47
|
showProgress && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "w-full max-w-xs", children: [
|
|
51
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
52
|
-
|
|
53
|
-
{
|
|
54
|
-
value: progressValue,
|
|
55
|
-
size: "md",
|
|
56
|
-
variant: "default",
|
|
57
|
-
className: "mb-2"
|
|
58
|
-
}
|
|
59
|
-
),
|
|
60
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("p", { className: "text-xs text-muted-foreground text-center", children: [
|
|
48
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_progress.Progress, { value: progressValue, size: "md", variant: "default", className: "mb-2" }),
|
|
49
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("p", { className: "text-center text-xs text-muted-foreground", children: [
|
|
61
50
|
progressValue,
|
|
62
51
|
"% completado"
|
|
63
52
|
] })
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/ui/section-loader/section-loader.tsx"],"sourcesContent":["import { Loader2 } from \"lucide-react\";\n\nimport { cn } from \"../../../lib/utils\";\nimport { Progress } from \"../progress\";\n\ninterface SectionLoaderProps {\n title?: string;\n description?: string;\n showProgress?: boolean;\n progressValue?: number;\n className?: string;\n}\n\nfunction SectionLoader({\n title = \"Cargando...\",\n description,\n showProgress = false,\n progressValue = 0,\n className = \"\",\n}: SectionLoaderProps) {\n return (\n <div\n data-slot=\"section-loader\"\n className={cn(\
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/ui/section-loader/section-loader.tsx"],"sourcesContent":["import { Loader2 } from \"lucide-react\";\n\nimport { cn } from \"../../../lib/utils\";\nimport { Progress } from \"../progress\";\n\ninterface SectionLoaderProps {\n title?: string;\n description?: string;\n showProgress?: boolean;\n progressValue?: number;\n className?: string;\n}\n\nfunction SectionLoader({\n title = \"Cargando...\",\n description,\n showProgress = false,\n progressValue = 0,\n className = \"\",\n}: SectionLoaderProps) {\n return (\n <div\n data-slot=\"section-loader\"\n className={cn(\"flex flex-col items-center justify-center space-y-4 py-12\", className)}\n >\n <div className=\"flex items-center space-x-3\">\n <Loader2 className=\"h-6 w-6 animate-spin text-primary\" />\n <h3 className=\"text-lg font-semibold text-foreground/70\">{title}</h3>\n </div>\n\n {description && (\n <p className=\"max-w-md text-center text-sm text-muted-foreground\">{description}</p>\n )}\n\n {showProgress && (\n <div className=\"w-full max-w-xs\">\n <Progress value={progressValue} size=\"md\" variant=\"default\" className=\"mb-2\" />\n <p className=\"text-center text-xs text-muted-foreground\">{progressValue}% completado</p>\n </div>\n )}\n </div>\n );\n}\n\n/** @deprecated Use `SectionLoader` instead */\nconst TabLoadingState = SectionLoader;\n/** @deprecated Use `SectionLoaderProps` instead */\ntype TabLoadingStateProps = SectionLoaderProps;\n\nexport { SectionLoader, TabLoadingState };\nexport type { SectionLoaderProps, TabLoadingStateProps };\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyBM;AAzBN,0BAAwB;AAExB,mBAAmB;AACnB,sBAAyB;AAUzB,SAAS,cAAc;AAAA,EACrB,QAAQ;AAAA,EACR;AAAA,EACA,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,YAAY;AACd,GAAuB;AACrB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,eAAW,iBAAG,6DAA6D,SAAS;AAAA,MAEpF;AAAA,qDAAC,SAAI,WAAU,+BACb;AAAA,sDAAC,+BAAQ,WAAU,qCAAoC;AAAA,UACvD,4CAAC,QAAG,WAAU,4CAA4C,iBAAM;AAAA,WAClE;AAAA,QAEC,eACC,4CAAC,OAAE,WAAU,sDAAsD,uBAAY;AAAA,QAGhF,gBACC,6CAAC,SAAI,WAAU,mBACb;AAAA,sDAAC,4BAAS,OAAO,eAAe,MAAK,MAAK,SAAQ,WAAU,WAAU,QAAO;AAAA,UAC7E,6CAAC,OAAE,WAAU,6CAA6C;AAAA;AAAA,YAAc;AAAA,aAAY;AAAA,WACtF;AAAA;AAAA;AAAA,EAEJ;AAEJ;AAGA,MAAM,kBAAkB;","names":[]}
|
|
@@ -13,27 +13,16 @@ function SectionLoader({
|
|
|
13
13
|
"div",
|
|
14
14
|
{
|
|
15
15
|
"data-slot": "section-loader",
|
|
16
|
-
className: cn(
|
|
17
|
-
"flex flex-col items-center justify-center py-12 space-y-4",
|
|
18
|
-
className
|
|
19
|
-
),
|
|
16
|
+
className: cn("flex flex-col items-center justify-center space-y-4 py-12", className),
|
|
20
17
|
children: [
|
|
21
18
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center space-x-3", children: [
|
|
22
19
|
/* @__PURE__ */ jsx(Loader2, { className: "h-6 w-6 animate-spin text-primary" }),
|
|
23
20
|
/* @__PURE__ */ jsx("h3", { className: "text-lg font-semibold text-foreground/70", children: title })
|
|
24
21
|
] }),
|
|
25
|
-
description && /* @__PURE__ */ jsx("p", { className: "
|
|
22
|
+
description && /* @__PURE__ */ jsx("p", { className: "max-w-md text-center text-sm text-muted-foreground", children: description }),
|
|
26
23
|
showProgress && /* @__PURE__ */ jsxs("div", { className: "w-full max-w-xs", children: [
|
|
27
|
-
/* @__PURE__ */ jsx(
|
|
28
|
-
|
|
29
|
-
{
|
|
30
|
-
value: progressValue,
|
|
31
|
-
size: "md",
|
|
32
|
-
variant: "default",
|
|
33
|
-
className: "mb-2"
|
|
34
|
-
}
|
|
35
|
-
),
|
|
36
|
-
/* @__PURE__ */ jsxs("p", { className: "text-xs text-muted-foreground text-center", children: [
|
|
24
|
+
/* @__PURE__ */ jsx(Progress, { value: progressValue, size: "md", variant: "default", className: "mb-2" }),
|
|
25
|
+
/* @__PURE__ */ jsxs("p", { className: "text-center text-xs text-muted-foreground", children: [
|
|
37
26
|
progressValue,
|
|
38
27
|
"% completado"
|
|
39
28
|
] })
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/ui/section-loader/section-loader.tsx"],"sourcesContent":["import { Loader2 } from \"lucide-react\";\n\nimport { cn } from \"../../../lib/utils\";\nimport { Progress } from \"../progress\";\n\ninterface SectionLoaderProps {\n title?: string;\n description?: string;\n showProgress?: boolean;\n progressValue?: number;\n className?: string;\n}\n\nfunction SectionLoader({\n title = \"Cargando...\",\n description,\n showProgress = false,\n progressValue = 0,\n className = \"\",\n}: SectionLoaderProps) {\n return (\n <div\n data-slot=\"section-loader\"\n className={cn(\
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/ui/section-loader/section-loader.tsx"],"sourcesContent":["import { Loader2 } from \"lucide-react\";\n\nimport { cn } from \"../../../lib/utils\";\nimport { Progress } from \"../progress\";\n\ninterface SectionLoaderProps {\n title?: string;\n description?: string;\n showProgress?: boolean;\n progressValue?: number;\n className?: string;\n}\n\nfunction SectionLoader({\n title = \"Cargando...\",\n description,\n showProgress = false,\n progressValue = 0,\n className = \"\",\n}: SectionLoaderProps) {\n return (\n <div\n data-slot=\"section-loader\"\n className={cn(\"flex flex-col items-center justify-center space-y-4 py-12\", className)}\n >\n <div className=\"flex items-center space-x-3\">\n <Loader2 className=\"h-6 w-6 animate-spin text-primary\" />\n <h3 className=\"text-lg font-semibold text-foreground/70\">{title}</h3>\n </div>\n\n {description && (\n <p className=\"max-w-md text-center text-sm text-muted-foreground\">{description}</p>\n )}\n\n {showProgress && (\n <div className=\"w-full max-w-xs\">\n <Progress value={progressValue} size=\"md\" variant=\"default\" className=\"mb-2\" />\n <p className=\"text-center text-xs text-muted-foreground\">{progressValue}% completado</p>\n </div>\n )}\n </div>\n );\n}\n\n/** @deprecated Use `SectionLoader` instead */\nconst TabLoadingState = SectionLoader;\n/** @deprecated Use `SectionLoaderProps` instead */\ntype TabLoadingStateProps = SectionLoaderProps;\n\nexport { SectionLoader, TabLoadingState };\nexport type { SectionLoaderProps, TabLoadingStateProps };\n"],"mappings":"AAyBM,SACE,KADF;AAzBN,SAAS,eAAe;AAExB,SAAS,UAAU;AACnB,SAAS,gBAAgB;AAUzB,SAAS,cAAc;AAAA,EACrB,QAAQ;AAAA,EACR;AAAA,EACA,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,YAAY;AACd,GAAuB;AACrB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,6DAA6D,SAAS;AAAA,MAEpF;AAAA,6BAAC,SAAI,WAAU,+BACb;AAAA,8BAAC,WAAQ,WAAU,qCAAoC;AAAA,UACvD,oBAAC,QAAG,WAAU,4CAA4C,iBAAM;AAAA,WAClE;AAAA,QAEC,eACC,oBAAC,OAAE,WAAU,sDAAsD,uBAAY;AAAA,QAGhF,gBACC,qBAAC,SAAI,WAAU,mBACb;AAAA,8BAAC,YAAS,OAAO,eAAe,MAAK,MAAK,SAAQ,WAAU,WAAU,QAAO;AAAA,UAC7E,qBAAC,OAAE,WAAU,6CAA6C;AAAA;AAAA,YAAc;AAAA,aAAY;AAAA,WACtF;AAAA;AAAA;AAAA,EAEJ;AAEJ;AAGA,MAAM,kBAAkB;","names":[]}
|
|
@@ -45,19 +45,13 @@ var import_jsx_runtime = require("react/jsx-runtime");
|
|
|
45
45
|
var SelectPrimitive = __toESM(require("@radix-ui/react-select"), 1);
|
|
46
46
|
var import_lucide_react = require("lucide-react");
|
|
47
47
|
var import_utils = require("../../../lib/utils");
|
|
48
|
-
function Select({
|
|
49
|
-
...props
|
|
50
|
-
}) {
|
|
48
|
+
function Select({ ...props }) {
|
|
51
49
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(SelectPrimitive.Root, { "data-slot": "select", ...props });
|
|
52
50
|
}
|
|
53
|
-
function SelectGroup({
|
|
54
|
-
...props
|
|
55
|
-
}) {
|
|
51
|
+
function SelectGroup({ ...props }) {
|
|
56
52
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(SelectPrimitive.Group, { "data-slot": "select-group", ...props });
|
|
57
53
|
}
|
|
58
|
-
function SelectValue({
|
|
59
|
-
...props
|
|
60
|
-
}) {
|
|
54
|
+
function SelectValue({ ...props }) {
|
|
61
55
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(SelectPrimitive.Value, { "data-slot": "select-value", ...props });
|
|
62
56
|
}
|
|
63
57
|
function SelectTrigger({
|
|
@@ -72,7 +66,7 @@ function SelectTrigger({
|
|
|
72
66
|
"data-slot": "select-trigger",
|
|
73
67
|
"data-size": size,
|
|
74
68
|
className: (0, import_utils.cn)(
|
|
75
|
-
"
|
|
69
|
+
"aria-invalid:ring-destructive/20 aria-invalid:border-destructive shadow-xs flex w-fit items-center justify-between gap-2 whitespace-nowrap rounded-md border border-input bg-card px-3 py-2 text-sm outline-none transition-[color,box-shadow] focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 data-[size=default]:h-9 data-[size=sm]:h-8 data-[placeholder]:text-muted-foreground *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0",
|
|
76
70
|
className
|
|
77
71
|
),
|
|
78
72
|
...props,
|
|
@@ -94,7 +88,7 @@ function SelectContent({
|
|
|
94
88
|
{
|
|
95
89
|
"data-slot": "select-content",
|
|
96
90
|
className: (0, import_utils.cn)(
|
|
97
|
-
"
|
|
91
|
+
"origin-(--radix-select-content-transform-origin) relative z-50 max-h-[var(--radix-select-content-available-height)] min-w-[8rem] overflow-y-auto overflow-x-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-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",
|
|
98
92
|
position === "popper" && "data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",
|
|
99
93
|
className
|
|
100
94
|
),
|
|
@@ -117,15 +111,12 @@ function SelectContent({
|
|
|
117
111
|
}
|
|
118
112
|
) });
|
|
119
113
|
}
|
|
120
|
-
function SelectLabel({
|
|
121
|
-
className,
|
|
122
|
-
...props
|
|
123
|
-
}) {
|
|
114
|
+
function SelectLabel({ className, ...props }) {
|
|
124
115
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
125
116
|
SelectPrimitive.Label,
|
|
126
117
|
{
|
|
127
118
|
"data-slot": "select-label",
|
|
128
|
-
className: (0, import_utils.cn)("
|
|
119
|
+
className: (0, import_utils.cn)("px-2 py-1.5 text-xs text-muted-foreground", className),
|
|
129
120
|
...props
|
|
130
121
|
}
|
|
131
122
|
);
|
|
@@ -140,7 +131,7 @@ function SelectItem({
|
|
|
140
131
|
{
|
|
141
132
|
"data-slot": "select-item",
|
|
142
133
|
className: (0, import_utils.cn)(
|
|
143
|
-
"
|
|
134
|
+
"outline-hidden *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2 relative flex w-full cursor-default select-none items-center gap-2 rounded-sm py-1.5 pl-2 pr-8 text-sm focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0",
|
|
144
135
|
className
|
|
145
136
|
),
|
|
146
137
|
...props,
|
|
@@ -159,10 +150,7 @@ function SelectSeparator({
|
|
|
159
150
|
SelectPrimitive.Separator,
|
|
160
151
|
{
|
|
161
152
|
"data-slot": "select-separator",
|
|
162
|
-
className: (0, import_utils.cn)(
|
|
163
|
-
"bg-border pointer-events-none -mx-1 my-1 h-px",
|
|
164
|
-
className
|
|
165
|
-
),
|
|
153
|
+
className: (0, import_utils.cn)("pointer-events-none -mx-1 my-1 h-px bg-border", className),
|
|
166
154
|
...props
|
|
167
155
|
}
|
|
168
156
|
);
|
|
@@ -175,10 +163,7 @@ function SelectScrollUpButton({
|
|
|
175
163
|
SelectPrimitive.ScrollUpButton,
|
|
176
164
|
{
|
|
177
165
|
"data-slot": "select-scroll-up-button",
|
|
178
|
-
className: (0, import_utils.cn)(
|
|
179
|
-
"flex cursor-default items-center justify-center py-1",
|
|
180
|
-
className
|
|
181
|
-
),
|
|
166
|
+
className: (0, import_utils.cn)("flex cursor-default items-center justify-center py-1", className),
|
|
182
167
|
...props,
|
|
183
168
|
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.ChevronUpIcon, { className: "size-4" })
|
|
184
169
|
}
|
|
@@ -192,10 +177,7 @@ function SelectScrollDownButton({
|
|
|
192
177
|
SelectPrimitive.ScrollDownButton,
|
|
193
178
|
{
|
|
194
179
|
"data-slot": "select-scroll-down-button",
|
|
195
|
-
className: (0, import_utils.cn)(
|
|
196
|
-
"flex cursor-default items-center justify-center py-1",
|
|
197
|
-
className
|
|
198
|
-
),
|
|
180
|
+
className: (0, import_utils.cn)("flex cursor-default items-center justify-center py-1", className),
|
|
199
181
|
...props,
|
|
200
182
|
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.ChevronDownIcon, { className: "size-4" })
|
|
201
183
|
}
|