@fragments-sdk/ui 0.13.0 → 0.14.0
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/assets/ui.css +1642 -1679
- package/dist/chart.cjs.map +1 -1
- package/dist/chart.js.map +1 -1
- package/dist/codeblock.cjs +26 -18
- package/dist/codeblock.cjs.map +1 -1
- package/dist/codeblock.js +26 -18
- package/dist/codeblock.js.map +1 -1
- package/dist/components/Accordion/Accordion.module.scss.cjs +8 -8
- package/dist/components/Accordion/Accordion.module.scss.js +8 -8
- package/dist/components/Accordion/index.cjs +7 -3
- package/dist/components/Accordion/index.cjs.map +1 -1
- package/dist/components/Accordion/index.d.ts +24 -11
- package/dist/components/Accordion/index.d.ts.map +1 -1
- package/dist/components/Accordion/index.js +7 -3
- package/dist/components/Accordion/index.js.map +1 -1
- package/dist/components/Alert/Alert.module.scss.cjs +12 -12
- package/dist/components/Alert/Alert.module.scss.js +12 -12
- package/dist/components/Alert/index.cjs +37 -15
- package/dist/components/Alert/index.cjs.map +1 -1
- package/dist/components/Alert/index.d.ts +15 -22
- package/dist/components/Alert/index.d.ts.map +1 -1
- package/dist/components/Alert/index.js +37 -15
- package/dist/components/Alert/index.js.map +1 -1
- package/dist/components/AppShell/AppShell.module.scss.cjs +14 -14
- package/dist/components/AppShell/AppShell.module.scss.js +14 -14
- package/dist/components/AppShell/index.cjs +3 -1
- package/dist/components/AppShell/index.cjs.map +1 -1
- package/dist/components/AppShell/index.d.ts.map +1 -1
- package/dist/components/AppShell/index.js +3 -1
- package/dist/components/AppShell/index.js.map +1 -1
- package/dist/components/Avatar/index.cjs +9 -1
- package/dist/components/Avatar/index.cjs.map +1 -1
- package/dist/components/Avatar/index.d.ts +2 -0
- package/dist/components/Avatar/index.d.ts.map +1 -1
- package/dist/components/Avatar/index.js +9 -1
- package/dist/components/Avatar/index.js.map +1 -1
- package/dist/components/Badge/index.cjs +4 -2
- package/dist/components/Badge/index.cjs.map +1 -1
- package/dist/components/Badge/index.d.ts +3 -0
- package/dist/components/Badge/index.d.ts.map +1 -1
- package/dist/components/Badge/index.js +4 -2
- package/dist/components/Badge/index.js.map +1 -1
- package/dist/components/BentoGrid/BentoGrid.module.scss.cjs +11 -11
- package/dist/components/BentoGrid/BentoGrid.module.scss.js +11 -11
- package/dist/components/BentoGrid/index.cjs +8 -5
- package/dist/components/BentoGrid/index.cjs.map +1 -1
- package/dist/components/BentoGrid/index.d.ts +2 -8
- package/dist/components/BentoGrid/index.d.ts.map +1 -1
- package/dist/components/BentoGrid/index.js +8 -5
- package/dist/components/BentoGrid/index.js.map +1 -1
- package/dist/components/Box/index.cjs +12 -2
- package/dist/components/Box/index.cjs.map +1 -1
- package/dist/components/Box/index.d.ts +1 -1
- package/dist/components/Box/index.d.ts.map +1 -1
- package/dist/components/Box/index.js +12 -2
- package/dist/components/Box/index.js.map +1 -1
- package/dist/components/Breadcrumbs/index.cjs +3 -1
- package/dist/components/Breadcrumbs/index.cjs.map +1 -1
- package/dist/components/Breadcrumbs/index.d.ts +3 -1
- package/dist/components/Breadcrumbs/index.d.ts.map +1 -1
- package/dist/components/Breadcrumbs/index.js +3 -1
- package/dist/components/Breadcrumbs/index.js.map +1 -1
- package/dist/components/Button/Button.module.scss.cjs +11 -11
- package/dist/components/Button/Button.module.scss.js +11 -11
- package/dist/components/Button/index.cjs +5 -2
- package/dist/components/Button/index.cjs.map +1 -1
- package/dist/components/Button/index.d.ts +3 -3
- package/dist/components/Button/index.d.ts.map +1 -1
- package/dist/components/Button/index.js +5 -2
- package/dist/components/Button/index.js.map +1 -1
- package/dist/components/ButtonGroup/index.cjs +3 -2
- package/dist/components/ButtonGroup/index.cjs.map +1 -1
- package/dist/components/ButtonGroup/index.d.ts +1 -2
- package/dist/components/ButtonGroup/index.d.ts.map +1 -1
- package/dist/components/ButtonGroup/index.js +3 -2
- package/dist/components/ButtonGroup/index.js.map +1 -1
- package/dist/components/Card/Card.module.scss.cjs +14 -14
- package/dist/components/Card/Card.module.scss.js +14 -14
- package/dist/components/Card/index.cjs +3 -22
- package/dist/components/Card/index.cjs.map +1 -1
- package/dist/components/Card/index.d.ts +6 -11
- package/dist/components/Card/index.d.ts.map +1 -1
- package/dist/components/Card/index.js +3 -22
- package/dist/components/Card/index.js.map +1 -1
- package/dist/components/Chart/Chart.module.scss.cjs +15 -15
- package/dist/components/Chart/Chart.module.scss.js +15 -15
- package/dist/components/Chart/index.d.ts +3 -3
- package/dist/components/Chart/index.d.ts.map +1 -1
- package/dist/components/Checkbox/Checkbox.module.scss.cjs +10 -10
- package/dist/components/Checkbox/Checkbox.module.scss.js +10 -10
- package/dist/components/Checkbox/index.cjs +11 -4
- package/dist/components/Checkbox/index.cjs.map +1 -1
- package/dist/components/Checkbox/index.d.ts +6 -0
- package/dist/components/Checkbox/index.d.ts.map +1 -1
- package/dist/components/Checkbox/index.js +11 -4
- package/dist/components/Checkbox/index.js.map +1 -1
- package/dist/components/Chip/index.cjs +11 -3
- package/dist/components/Chip/index.cjs.map +1 -1
- package/dist/components/Chip/index.d.ts +1 -2
- package/dist/components/Chip/index.d.ts.map +1 -1
- package/dist/components/Chip/index.js +11 -3
- package/dist/components/Chip/index.js.map +1 -1
- package/dist/components/CodeBlock/CodeBlock.module.scss.cjs +20 -20
- package/dist/components/CodeBlock/CodeBlock.module.scss.js +20 -20
- package/dist/components/CodeBlock/index.d.ts +8 -2
- package/dist/components/CodeBlock/index.d.ts.map +1 -1
- package/dist/components/Collapsible/Collapsible.module.scss.cjs +10 -10
- package/dist/components/Collapsible/Collapsible.module.scss.js +10 -10
- package/dist/components/Combobox/Combobox.module.scss.cjs +15 -15
- package/dist/components/Combobox/Combobox.module.scss.js +15 -15
- package/dist/components/Combobox/index.cjs +68 -18
- package/dist/components/Combobox/index.cjs.map +1 -1
- package/dist/components/Combobox/index.d.ts +32 -11
- package/dist/components/Combobox/index.d.ts.map +1 -1
- package/dist/components/Combobox/index.js +68 -18
- package/dist/components/Combobox/index.js.map +1 -1
- package/dist/components/Command/Command.module.scss.cjs +11 -11
- package/dist/components/Command/Command.module.scss.js +11 -11
- package/dist/components/Command/index.cjs +4 -4
- package/dist/components/Command/index.cjs.map +1 -1
- package/dist/components/Command/index.d.ts +1 -1
- package/dist/components/Command/index.d.ts.map +1 -1
- package/dist/components/Command/index.js +4 -4
- package/dist/components/Command/index.js.map +1 -1
- package/dist/components/ConversationList/ConversationList.module.scss.cjs +10 -10
- package/dist/components/ConversationList/ConversationList.module.scss.js +10 -10
- package/dist/components/ConversationList/index.cjs +6 -3
- package/dist/components/ConversationList/index.cjs.map +1 -1
- package/dist/components/ConversationList/index.d.ts +1 -1
- package/dist/components/ConversationList/index.d.ts.map +1 -1
- package/dist/components/ConversationList/index.js +6 -3
- package/dist/components/ConversationList/index.js.map +1 -1
- package/dist/components/DataTable/DataTable.module.scss.cjs +26 -26
- package/dist/components/DataTable/DataTable.module.scss.js +26 -26
- package/dist/components/DataTable/index.cjs +13 -4
- package/dist/components/DataTable/index.cjs.map +1 -1
- package/dist/components/DataTable/index.d.ts +7 -2
- package/dist/components/DataTable/index.d.ts.map +1 -1
- package/dist/components/DataTable/index.js +13 -4
- package/dist/components/DataTable/index.js.map +1 -1
- package/dist/components/DatePicker/DatePicker.module.scss.cjs +26 -26
- package/dist/components/DatePicker/DatePicker.module.scss.js +26 -26
- package/dist/components/DatePicker/index.d.ts +2 -2
- package/dist/components/DatePicker/index.d.ts.map +1 -1
- package/dist/components/Dialog/Dialog.module.scss.cjs +14 -14
- package/dist/components/Dialog/Dialog.module.scss.js +14 -14
- package/dist/components/Dialog/index.cjs +2 -1
- package/dist/components/Dialog/index.cjs.map +1 -1
- package/dist/components/Dialog/index.d.ts +20 -7
- package/dist/components/Dialog/index.d.ts.map +1 -1
- package/dist/components/Dialog/index.js +2 -1
- package/dist/components/Dialog/index.js.map +1 -1
- package/dist/components/Drawer/Drawer.module.scss.cjs +26 -26
- package/dist/components/Drawer/Drawer.module.scss.js +26 -26
- package/dist/components/Drawer/index.cjs +30 -3
- package/dist/components/Drawer/index.cjs.map +1 -1
- package/dist/components/Drawer/index.d.ts +3 -1
- package/dist/components/Drawer/index.d.ts.map +1 -1
- package/dist/components/Drawer/index.js +13 -3
- package/dist/components/Drawer/index.js.map +1 -1
- package/dist/components/Editor/Editor.module.scss.cjs +17 -17
- package/dist/components/Editor/Editor.module.scss.js +17 -17
- package/dist/components/Editor/index.cjs +32 -7
- package/dist/components/Editor/index.cjs.map +1 -1
- package/dist/components/Editor/index.d.ts +16 -3
- package/dist/components/Editor/index.d.ts.map +1 -1
- package/dist/components/Editor/index.js +32 -7
- package/dist/components/Editor/index.js.map +1 -1
- package/dist/components/EmptyState/EmptyState.module.scss.cjs +8 -8
- package/dist/components/EmptyState/EmptyState.module.scss.js +8 -8
- package/dist/components/EmptyState/index.cjs +12 -8
- package/dist/components/EmptyState/index.cjs.map +1 -1
- package/dist/components/EmptyState/index.d.ts +8 -12
- package/dist/components/EmptyState/index.d.ts.map +1 -1
- package/dist/components/EmptyState/index.js +12 -8
- package/dist/components/EmptyState/index.js.map +1 -1
- package/dist/components/Fieldset/index.cjs +2 -2
- package/dist/components/Fieldset/index.cjs.map +1 -1
- package/dist/components/Fieldset/index.d.ts +2 -3
- package/dist/components/Fieldset/index.d.ts.map +1 -1
- package/dist/components/Fieldset/index.js +2 -2
- package/dist/components/Fieldset/index.js.map +1 -1
- package/dist/components/Form/index.cjs +13 -13
- package/dist/components/Form/index.cjs.map +1 -1
- package/dist/components/Form/index.d.ts +5 -2
- package/dist/components/Form/index.d.ts.map +1 -1
- package/dist/components/Form/index.js +13 -13
- package/dist/components/Form/index.js.map +1 -1
- package/dist/components/Grid/Grid.module.scss.cjs +57 -57
- package/dist/components/Grid/Grid.module.scss.js +57 -57
- package/dist/components/Grid/index.cjs +7 -4
- package/dist/components/Grid/index.cjs.map +1 -1
- package/dist/components/Grid/index.d.ts +5 -3
- package/dist/components/Grid/index.d.ts.map +1 -1
- package/dist/components/Grid/index.js +7 -4
- package/dist/components/Grid/index.js.map +1 -1
- package/dist/components/Header/Header.module.scss.cjs +21 -21
- package/dist/components/Header/Header.module.scss.js +21 -21
- package/dist/components/Header/index.cjs +61 -23
- package/dist/components/Header/index.cjs.map +1 -1
- package/dist/components/Header/index.d.ts +27 -34
- package/dist/components/Header/index.d.ts.map +1 -1
- package/dist/components/Header/index.js +61 -23
- package/dist/components/Header/index.js.map +1 -1
- package/dist/components/Icon/index.cjs +11 -1
- package/dist/components/Icon/index.cjs.map +1 -1
- package/dist/components/Icon/index.d.ts +28 -9
- package/dist/components/Icon/index.d.ts.map +1 -1
- package/dist/components/Icon/index.js +11 -1
- package/dist/components/Icon/index.js.map +1 -1
- package/dist/components/Image/index.cjs +15 -4
- package/dist/components/Image/index.cjs.map +1 -1
- package/dist/components/Image/index.d.ts +7 -1
- package/dist/components/Image/index.d.ts.map +1 -1
- package/dist/components/Image/index.js +15 -4
- package/dist/components/Image/index.js.map +1 -1
- package/dist/components/Input/Input.module.scss.cjs +13 -13
- package/dist/components/Input/Input.module.scss.js +13 -13
- package/dist/components/Input/index.cjs +79 -31
- package/dist/components/Input/index.cjs.map +1 -1
- package/dist/components/Input/index.d.ts +17 -3
- package/dist/components/Input/index.d.ts.map +1 -1
- package/dist/components/Input/index.js +79 -31
- package/dist/components/Input/index.js.map +1 -1
- package/dist/components/Link/index.cjs +17 -0
- package/dist/components/Link/index.cjs.map +1 -1
- package/dist/components/Link/index.d.ts.map +1 -1
- package/dist/components/Link/index.js +17 -0
- package/dist/components/Link/index.js.map +1 -1
- package/dist/components/Listbox/Listbox.module.scss.cjs +8 -8
- package/dist/components/Listbox/Listbox.module.scss.js +8 -8
- package/dist/components/Listbox/index.cjs +10 -6
- package/dist/components/Listbox/index.cjs.map +1 -1
- package/dist/components/Listbox/index.d.ts +2 -2
- package/dist/components/Listbox/index.d.ts.map +1 -1
- package/dist/components/Listbox/index.js +10 -6
- package/dist/components/Listbox/index.js.map +1 -1
- package/dist/components/Markdown/Markdown.module.scss.cjs +1 -1
- package/dist/components/Markdown/Markdown.module.scss.js +1 -1
- package/dist/components/Markdown/index.d.ts +4 -2
- package/dist/components/Markdown/index.d.ts.map +1 -1
- package/dist/components/Menu/Menu.module.scss.cjs +13 -13
- package/dist/components/Menu/Menu.module.scss.js +13 -13
- package/dist/components/Menu/index.cjs +12 -1
- package/dist/components/Menu/index.cjs.map +1 -1
- package/dist/components/Menu/index.d.ts +9 -4
- package/dist/components/Menu/index.d.ts.map +1 -1
- package/dist/components/Menu/index.js +12 -1
- package/dist/components/Menu/index.js.map +1 -1
- package/dist/components/Message/Message.module.scss.cjs +18 -18
- package/dist/components/Message/Message.module.scss.js +18 -18
- package/dist/components/NavigationMenu/NavigationMenu.module.scss.cjs +28 -28
- package/dist/components/NavigationMenu/NavigationMenu.module.scss.js +28 -28
- package/dist/components/NavigationMenu/NavigationMenuContext.cjs.map +1 -1
- package/dist/components/NavigationMenu/NavigationMenuContext.d.ts +8 -0
- package/dist/components/NavigationMenu/NavigationMenuContext.d.ts.map +1 -1
- package/dist/components/NavigationMenu/NavigationMenuContext.js.map +1 -1
- package/dist/components/NavigationMenu/index.cjs +49 -10
- package/dist/components/NavigationMenu/index.cjs.map +1 -1
- package/dist/components/NavigationMenu/index.d.ts +5 -1
- package/dist/components/NavigationMenu/index.d.ts.map +1 -1
- package/dist/components/NavigationMenu/index.js +49 -10
- package/dist/components/NavigationMenu/index.js.map +1 -1
- package/dist/components/Pagination/index.cjs +37 -9
- package/dist/components/Pagination/index.cjs.map +1 -1
- package/dist/components/Pagination/index.d.ts +2 -3
- package/dist/components/Pagination/index.d.ts.map +1 -1
- package/dist/components/Pagination/index.js +37 -9
- package/dist/components/Pagination/index.js.map +1 -1
- package/dist/components/Popover/Popover.module.scss.cjs +10 -10
- package/dist/components/Popover/Popover.module.scss.js +10 -10
- package/dist/components/Popover/index.cjs +43 -2
- package/dist/components/Popover/index.cjs.map +1 -1
- package/dist/components/Popover/index.d.ts +16 -6
- package/dist/components/Popover/index.d.ts.map +1 -1
- package/dist/components/Popover/index.js +26 -2
- package/dist/components/Popover/index.js.map +1 -1
- package/dist/components/Progress/index.cjs +3 -1
- package/dist/components/Progress/index.cjs.map +1 -1
- package/dist/components/Progress/index.d.ts.map +1 -1
- package/dist/components/Progress/index.js +3 -1
- package/dist/components/Progress/index.js.map +1 -1
- package/dist/components/Prompt/Prompt.module.scss.cjs +14 -14
- package/dist/components/Prompt/Prompt.module.scss.js +14 -14
- package/dist/components/Prompt/index.cjs +14 -2
- package/dist/components/Prompt/index.cjs.map +1 -1
- package/dist/components/Prompt/index.d.ts +8 -5
- package/dist/components/Prompt/index.d.ts.map +1 -1
- package/dist/components/Prompt/index.js +14 -2
- package/dist/components/Prompt/index.js.map +1 -1
- package/dist/components/RadioGroup/index.cjs +14 -6
- package/dist/components/RadioGroup/index.cjs.map +1 -1
- package/dist/components/RadioGroup/index.d.ts +12 -2
- package/dist/components/RadioGroup/index.d.ts.map +1 -1
- package/dist/components/RadioGroup/index.js +14 -6
- package/dist/components/RadioGroup/index.js.map +1 -1
- package/dist/components/Select/Select.module.scss.cjs +10 -10
- package/dist/components/Select/Select.module.scss.js +10 -10
- package/dist/components/Select/index.cjs +37 -24
- package/dist/components/Select/index.cjs.map +1 -1
- package/dist/components/Select/index.d.ts +6 -2
- package/dist/components/Select/index.d.ts.map +1 -1
- package/dist/components/Select/index.js +37 -24
- package/dist/components/Select/index.js.map +1 -1
- package/dist/components/Sidebar/Sidebar.module.scss.cjs +42 -42
- package/dist/components/Sidebar/Sidebar.module.scss.js +42 -42
- package/dist/components/Sidebar/index.cjs +2 -2
- package/dist/components/Sidebar/index.cjs.map +1 -1
- package/dist/components/Sidebar/index.d.ts +3 -3
- package/dist/components/Sidebar/index.d.ts.map +1 -1
- package/dist/components/Sidebar/index.js +2 -2
- package/dist/components/Sidebar/index.js.map +1 -1
- package/dist/components/Skeleton/index.cjs +6 -3
- package/dist/components/Skeleton/index.cjs.map +1 -1
- package/dist/components/Skeleton/index.d.ts +3 -7
- package/dist/components/Skeleton/index.d.ts.map +1 -1
- package/dist/components/Skeleton/index.js +6 -3
- package/dist/components/Skeleton/index.js.map +1 -1
- package/dist/components/Slider/Slider.module.scss.cjs +13 -10
- package/dist/components/Slider/Slider.module.scss.cjs.map +1 -1
- package/dist/components/Slider/Slider.module.scss.js +13 -10
- package/dist/components/Slider/Slider.module.scss.js.map +1 -1
- package/dist/components/Slider/index.cjs +33 -1
- package/dist/components/Slider/index.cjs.map +1 -1
- package/dist/components/Slider/index.d.ts +2 -0
- package/dist/components/Slider/index.d.ts.map +1 -1
- package/dist/components/Slider/index.js +33 -1
- package/dist/components/Slider/index.js.map +1 -1
- package/dist/components/Stack/index.cjs +12 -2
- package/dist/components/Stack/index.cjs.map +1 -1
- package/dist/components/Stack/index.d.ts +3 -2
- package/dist/components/Stack/index.d.ts.map +1 -1
- package/dist/components/Stack/index.js +12 -2
- package/dist/components/Stack/index.js.map +1 -1
- package/dist/components/Table/Table.module.scss.cjs +16 -16
- package/dist/components/Table/Table.module.scss.js +16 -16
- package/dist/components/Table/index.d.ts +10 -4
- package/dist/components/Table/index.d.ts.map +1 -1
- package/dist/components/TableOfContents/index.cjs +8 -5
- package/dist/components/TableOfContents/index.cjs.map +1 -1
- package/dist/components/TableOfContents/index.d.ts +2 -2
- package/dist/components/TableOfContents/index.d.ts.map +1 -1
- package/dist/components/TableOfContents/index.js +8 -5
- package/dist/components/TableOfContents/index.js.map +1 -1
- package/dist/components/Tabs/Tabs.module.scss.cjs +9 -9
- package/dist/components/Tabs/Tabs.module.scss.js +9 -9
- package/dist/components/Tabs/index.cjs +9 -6
- package/dist/components/Tabs/index.cjs.map +1 -1
- package/dist/components/Tabs/index.d.ts +4 -1
- package/dist/components/Tabs/index.d.ts.map +1 -1
- package/dist/components/Tabs/index.js +9 -6
- package/dist/components/Tabs/index.js.map +1 -1
- package/dist/components/Textarea/index.cjs +61 -43
- package/dist/components/Textarea/index.cjs.map +1 -1
- package/dist/components/Textarea/index.d.ts +9 -1
- package/dist/components/Textarea/index.d.ts.map +1 -1
- package/dist/components/Textarea/index.js +61 -43
- package/dist/components/Textarea/index.js.map +1 -1
- package/dist/components/Theme/index.cjs +3 -1
- package/dist/components/Theme/index.cjs.map +1 -1
- package/dist/components/Theme/index.d.ts +2 -4
- package/dist/components/Theme/index.d.ts.map +1 -1
- package/dist/components/Theme/index.js +3 -1
- package/dist/components/Theme/index.js.map +1 -1
- package/dist/components/ThinkingIndicator/ThinkingIndicator.module.scss.cjs +22 -22
- package/dist/components/ThinkingIndicator/ThinkingIndicator.module.scss.js +22 -22
- package/dist/components/Toast/Toast.module.scss.cjs +20 -20
- package/dist/components/Toast/Toast.module.scss.js +20 -20
- package/dist/components/Toast/index.cjs +15 -14
- package/dist/components/Toast/index.cjs.map +1 -1
- package/dist/components/Toast/index.d.ts +9 -5
- package/dist/components/Toast/index.d.ts.map +1 -1
- package/dist/components/Toast/index.js +15 -14
- package/dist/components/Toast/index.js.map +1 -1
- package/dist/components/Toggle/Toggle.module.scss.cjs +11 -11
- package/dist/components/Toggle/Toggle.module.scss.js +11 -11
- package/dist/components/Toggle/index.cjs +1 -1
- package/dist/components/Toggle/index.cjs.map +1 -1
- package/dist/components/Toggle/index.js +1 -1
- package/dist/components/Toggle/index.js.map +1 -1
- package/dist/components/ToggleGroup/ToggleGroup.module.scss.cjs +17 -17
- package/dist/components/ToggleGroup/ToggleGroup.module.scss.js +17 -17
- package/dist/components/ToggleGroup/index.cjs +27 -8
- package/dist/components/ToggleGroup/index.cjs.map +1 -1
- package/dist/components/ToggleGroup/index.d.ts +8 -3
- package/dist/components/ToggleGroup/index.d.ts.map +1 -1
- package/dist/components/ToggleGroup/index.js +27 -8
- package/dist/components/ToggleGroup/index.js.map +1 -1
- package/dist/components/Tooltip/Tooltip.module.scss.cjs +3 -3
- package/dist/components/Tooltip/Tooltip.module.scss.js +3 -3
- package/dist/components/Tooltip/index.cjs +20 -4
- package/dist/components/Tooltip/index.cjs.map +1 -1
- package/dist/components/Tooltip/index.d.ts +3 -1
- package/dist/components/Tooltip/index.d.ts.map +1 -1
- package/dist/components/Tooltip/index.js +20 -4
- package/dist/components/Tooltip/index.js.map +1 -1
- package/dist/components/VisuallyHidden/index.cjs +10 -2
- package/dist/components/VisuallyHidden/index.cjs.map +1 -1
- package/dist/components/VisuallyHidden/index.d.ts +1 -1
- package/dist/components/VisuallyHidden/index.d.ts.map +1 -1
- package/dist/components/VisuallyHidden/index.js +10 -2
- package/dist/components/VisuallyHidden/index.js.map +1 -1
- package/dist/datepicker.cjs +8 -1
- package/dist/datepicker.cjs.map +1 -1
- package/dist/datepicker.js +8 -1
- package/dist/datepicker.js.map +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/markdown.cjs +5 -5
- package/dist/markdown.cjs.map +1 -1
- package/dist/markdown.js +5 -5
- package/dist/markdown.js.map +1 -1
- package/dist/table.cjs +19 -3
- package/dist/table.cjs.map +1 -1
- package/dist/table.js +19 -3
- package/dist/table.js.map +1 -1
- package/fragments.json +1 -1
- package/package.json +2 -2
- package/src/blocks/AccountSettings.block.ts +1 -1
- package/src/blocks/ActivityFeed.block.ts +1 -1
- package/src/blocks/ActivityFeedSkeleton.block.ts +1 -1
- package/src/blocks/BlogEditor.block.ts +1 -1
- package/src/blocks/ChatInterface.block.ts +1 -1
- package/src/blocks/ChatMessages.block.ts +1 -1
- package/src/blocks/CheckoutForm.block.ts +1 -1
- package/src/blocks/CommandPalette.block.ts +1 -1
- package/src/blocks/ContactForm.block.ts +1 -1
- package/src/blocks/DashboardLayout.block.ts +1 -1
- package/src/blocks/DashboardPage.block.ts +1 -1
- package/src/blocks/DashboardSkeleton.block.ts +1 -1
- package/src/blocks/DataTable.block.ts +1 -1
- package/src/blocks/EmptyState.block.ts +1 -1
- package/src/blocks/FAQSection.block.ts +1 -1
- package/src/blocks/FeatureGrid.block.ts +1 -1
- package/src/blocks/HeroSection.block.ts +1 -1
- package/src/blocks/LoginForm.block.ts +1 -1
- package/src/blocks/NavigationHeader.block.ts +1 -1
- package/src/blocks/PaginatedTable.block.ts +1 -1
- package/src/blocks/PricingComparison.block.ts +1 -1
- package/src/blocks/ProductCard.block.ts +1 -1
- package/src/blocks/RegistrationForm.block.ts +1 -1
- package/src/blocks/SettingsDrawer.block.ts +1 -1
- package/src/blocks/SettingsPanel.block.ts +1 -1
- package/src/blocks/ShoppingCart.block.ts +1 -1
- package/src/blocks/StatsCard.block.ts +1 -1
- package/src/blocks/StatsCardSkeleton.block.ts +1 -1
- package/src/blocks/TableSkeleton.block.ts +1 -1
- package/src/blocks/ThinkingStates.block.ts +1 -1
- package/src/components/Accordion/Accordion.fragment.tsx +7 -7
- package/src/components/Accordion/Accordion.module.scss +2 -2
- package/src/components/Accordion/Accordion.test.tsx +8 -5
- package/src/components/Accordion/index.tsx +33 -13
- package/src/components/Alert/Alert.fragment.tsx +5 -1
- package/src/components/Alert/Alert.module.scss +1 -1
- package/src/components/Alert/Alert.test.tsx +25 -0
- package/src/components/Alert/index.tsx +49 -30
- package/src/components/AppShell/AppShell.fragment.tsx +1 -1
- package/src/components/AppShell/AppShell.module.scss +5 -5
- package/src/components/AppShell/AppShell.test.tsx +12 -0
- package/src/components/AppShell/index.tsx +2 -0
- package/src/components/Avatar/Avatar.fragment.tsx +7 -1
- package/src/components/Avatar/Avatar.test.tsx +24 -2
- package/src/components/Avatar/index.tsx +13 -1
- package/src/components/Badge/Badge.fragment.tsx +16 -1
- package/src/components/Badge/Badge.test.tsx +8 -1
- package/src/components/Badge/index.tsx +7 -2
- package/src/components/BentoGrid/BentoGrid.fragment.tsx +3 -1
- package/src/components/BentoGrid/BentoGrid.module.scss +52 -16
- package/src/components/BentoGrid/BentoGrid.test.tsx +20 -0
- package/src/components/BentoGrid/index.tsx +9 -12
- package/src/components/Box/Box.fragment.tsx +3 -1
- package/src/components/Box/Box.test.tsx +14 -0
- package/src/components/Box/index.tsx +8 -2
- package/src/components/Breadcrumbs/Breadcrumbs.fragment.tsx +19 -1
- package/src/components/Breadcrumbs/Breadcrumbs.test.tsx +13 -0
- package/src/components/Breadcrumbs/index.tsx +5 -1
- package/src/components/Button/Button.fragment.tsx +28 -6
- package/src/components/Button/Button.module.scss +3 -3
- package/src/components/Button/Button.test.tsx +11 -0
- package/src/components/Button/index.tsx +16 -6
- package/src/components/ButtonGroup/ButtonGroup.fragment.tsx +4 -2
- package/src/components/ButtonGroup/ButtonGroup.test.tsx +10 -0
- package/src/components/ButtonGroup/index.tsx +3 -3
- package/src/components/Card/Card.fragment.tsx +24 -9
- package/src/components/Card/Card.module.scss +8 -8
- package/src/components/Card/Card.test.tsx +4 -5
- package/src/components/Card/index.tsx +8 -38
- package/src/components/Chart/Chart.fragment.tsx +5 -3
- package/src/components/Chart/Chart.module.scss +1 -1
- package/src/components/Chart/index.tsx +12 -10
- package/src/components/Checkbox/Checkbox.fragment.tsx +27 -1
- package/src/components/Checkbox/Checkbox.module.scss +3 -3
- package/src/components/Checkbox/index.tsx +16 -3
- package/src/components/Chip/Chip.fragment.tsx +20 -3
- package/src/components/Chip/Chip.test.tsx +28 -0
- package/src/components/Chip/index.tsx +14 -6
- package/src/components/CodeBlock/CodeBlock.fragment.tsx +3 -1
- package/src/components/CodeBlock/CodeBlock.module.scss +9 -9
- package/src/components/CodeBlock/CodeBlock.test.tsx +21 -0
- package/src/components/CodeBlock/index.tsx +23 -9
- package/src/components/Collapsible/Collapsible.fragment.tsx +1 -1
- package/src/components/Collapsible/Collapsible.module.scss +1 -1
- package/src/components/ColorPicker/ColorPicker.fragment.tsx +1 -1
- package/src/components/Combobox/Combobox.fragment.tsx +63 -9
- package/src/components/Combobox/Combobox.module.scss +4 -7
- package/src/components/Combobox/Combobox.test.tsx +24 -3
- package/src/components/Combobox/index.tsx +117 -34
- package/src/components/Command/Command.fragment.tsx +3 -3
- package/src/components/Command/Command.module.scss +5 -5
- package/src/components/Command/Command.test.tsx +17 -0
- package/src/components/Command/index.tsx +8 -5
- package/src/components/ConversationList/ConversationList.fragment.tsx +4 -3
- package/src/components/ConversationList/ConversationList.module.scss +5 -5
- package/src/components/ConversationList/ConversationList.test.tsx +21 -0
- package/src/components/ConversationList/index.tsx +8 -4
- package/src/components/DataTable/DataTable.fragment.tsx +12 -2
- package/src/components/DataTable/DataTable.module.scss +3 -3
- package/src/components/DataTable/DataTable.test.tsx +23 -2
- package/src/components/DataTable/index.tsx +23 -5
- package/src/components/DatePicker/DatePicker.fragment.tsx +3 -1
- package/src/components/DatePicker/DatePicker.module.scss +1 -1
- package/src/components/DatePicker/DatePicker.test.tsx +17 -0
- package/src/components/DatePicker/index.tsx +9 -2
- package/src/components/Dialog/Dialog.fragment.tsx +28 -1
- package/src/components/Dialog/Dialog.module.scss +6 -6
- package/src/components/Dialog/index.tsx +25 -7
- package/src/components/Drawer/Drawer.fragment.tsx +4 -1
- package/src/components/Drawer/Drawer.module.scss +3 -3
- package/src/components/Drawer/Drawer.test.tsx +8 -0
- package/src/components/Drawer/index.tsx +15 -3
- package/src/components/Editor/Editor.fragment.tsx +10 -3
- package/src/components/Editor/Editor.module.scss +4 -4
- package/src/components/Editor/Editor.test.tsx +68 -1
- package/src/components/Editor/index.tsx +60 -9
- package/src/components/EmptyState/EmptyState.fragment.tsx +3 -1
- package/src/components/EmptyState/EmptyState.module.scss +3 -3
- package/src/components/EmptyState/EmptyState.test.tsx +18 -0
- package/src/components/EmptyState/index.tsx +16 -16
- package/src/components/Field/Field.fragment.tsx +1 -1
- package/src/components/Fieldset/Fieldset.fragment.tsx +3 -1
- package/src/components/Fieldset/Fieldset.test.tsx +14 -0
- package/src/components/Fieldset/index.tsx +3 -4
- package/src/components/Form/Form.fragment.tsx +12 -7
- package/src/components/Form/index.tsx +13 -17
- package/src/components/Grid/Grid.fragment.tsx +4 -3
- package/src/components/Grid/Grid.module.scss +3 -3
- package/src/components/Grid/index.tsx +11 -6
- package/src/components/Header/Header.fragment.tsx +31 -1
- package/src/components/Header/Header.module.scss +6 -6
- package/src/components/Header/Header.test.tsx +95 -1
- package/src/components/Header/index.tsx +95 -46
- package/src/components/Icon/Icon.fragment.tsx +21 -8
- package/src/components/Icon/Icon.test.tsx +27 -3
- package/src/components/Icon/index.tsx +39 -15
- package/src/components/Image/Image.fragment.tsx +15 -1
- package/src/components/Image/Image.test.tsx +32 -1
- package/src/components/Image/index.tsx +24 -4
- package/src/components/Input/Input.fragment.tsx +49 -1
- package/src/components/Input/Input.module.scss +4 -2
- package/src/components/Input/Input.test.tsx +3 -3
- package/src/components/Input/index.tsx +103 -37
- package/src/components/Link/Link.fragment.tsx +7 -6
- package/src/components/Link/Link.test.tsx +17 -1
- package/src/components/Link/index.tsx +22 -0
- package/src/components/List/List.fragment.tsx +1 -1
- package/src/components/Listbox/Listbox.fragment.tsx +3 -3
- package/src/components/Listbox/Listbox.module.scss +4 -4
- package/src/components/Listbox/Listbox.test.tsx +14 -0
- package/src/components/Listbox/index.tsx +12 -2
- package/src/components/Loading/Loading.fragment.tsx +1 -1
- package/src/components/Markdown/Markdown.fragment.tsx +5 -3
- package/src/components/Markdown/Markdown.module.scss +5 -5
- package/src/components/Markdown/Markdown.test.tsx +6 -0
- package/src/components/Markdown/index.tsx +12 -9
- package/src/components/Menu/Menu.fragment.tsx +19 -1
- package/src/components/Menu/Menu.module.scss +11 -11
- package/src/components/Menu/index.tsx +19 -7
- package/src/components/Message/Message.fragment.tsx +1 -1
- package/src/components/Message/Message.module.scss +3 -3
- package/src/components/NavigationMenu/NavigationMenu.fragment.tsx +9 -1
- package/src/components/NavigationMenu/NavigationMenu.module.scss +7 -7
- package/src/components/NavigationMenu/NavigationMenu.test.tsx +48 -0
- package/src/components/NavigationMenu/NavigationMenuContext.ts +14 -0
- package/src/components/NavigationMenu/index.tsx +70 -7
- package/src/components/Pagination/Pagination.fragment.tsx +4 -1
- package/src/components/Pagination/Pagination.test.tsx +39 -0
- package/src/components/Pagination/index.tsx +36 -10
- package/src/components/Popover/Popover.fragment.tsx +18 -1
- package/src/components/Popover/Popover.module.scss +13 -13
- package/src/components/Popover/index.tsx +33 -8
- package/src/components/Progress/Progress.fragment.tsx +3 -1
- package/src/components/Progress/Progress.test.tsx +8 -0
- package/src/components/Progress/index.tsx +9 -1
- package/src/components/Prompt/Prompt.fragment.tsx +4 -1
- package/src/components/Prompt/Prompt.module.scss +3 -3
- package/src/components/Prompt/Prompt.test.tsx +19 -0
- package/src/components/Prompt/index.tsx +24 -6
- package/src/components/RadioGroup/RadioGroup.fragment.tsx +31 -1
- package/src/components/RadioGroup/index.tsx +22 -3
- package/src/components/ScrollArea/ScrollArea.fragment.tsx +1 -1
- package/src/components/Select/Select.fragment.tsx +30 -3
- package/src/components/Select/Select.module.scss +3 -3
- package/src/components/Select/index.tsx +46 -33
- package/src/components/Separator/Separator.fragment.tsx +1 -1
- package/src/components/Sidebar/Sidebar.fragment.tsx +3 -1
- package/src/components/Sidebar/Sidebar.module.scss +20 -20
- package/src/components/Sidebar/Sidebar.test.tsx +25 -0
- package/src/components/Sidebar/index.tsx +7 -7
- package/src/components/Skeleton/Skeleton.fragment.tsx +3 -1
- package/src/components/Skeleton/Skeleton.test.tsx +12 -0
- package/src/components/Skeleton/index.tsx +6 -7
- package/src/components/Slider/Slider.fragment.tsx +21 -1
- package/src/components/Slider/Slider.module.scss +31 -0
- package/src/components/Slider/Slider.test.tsx +16 -0
- package/src/components/Slider/index.tsx +40 -1
- package/src/components/Stack/Stack.fragment.tsx +3 -1
- package/src/components/Stack/index.tsx +13 -6
- package/src/components/Table/Table.fragment.tsx +43 -2
- package/src/components/Table/Table.module.scss +2 -2
- package/src/components/Table/index.tsx +23 -5
- package/src/components/TableOfContents/TableOfContents.fragment.tsx +4 -2
- package/src/components/TableOfContents/TableOfContents.test.tsx +34 -9
- package/src/components/TableOfContents/index.tsx +9 -5
- package/src/components/Tabs/Tabs.fragment.tsx +33 -8
- package/src/components/Tabs/Tabs.module.scss +8 -8
- package/src/components/Tabs/index.tsx +22 -14
- package/src/components/Text/Text.fragment.tsx +1 -1
- package/src/components/Textarea/Textarea.fragment.tsx +27 -1
- package/src/components/Textarea/index.tsx +39 -14
- package/src/components/Theme/Theme.fragment.tsx +3 -1
- package/src/components/Theme/Theme.test.tsx +11 -0
- package/src/components/Theme/index.tsx +3 -3
- package/src/components/ThinkingIndicator/ThinkingIndicator.fragment.tsx +1 -1
- package/src/components/ThinkingIndicator/ThinkingIndicator.module.scss +1 -1
- package/src/components/Toast/Toast.fragment.tsx +6 -3
- package/src/components/Toast/Toast.module.scss +8 -6
- package/src/components/Toast/index.tsx +24 -20
- package/src/components/Toggle/Toggle.fragment.tsx +1 -1
- package/src/components/Toggle/Toggle.module.scss +61 -21
- package/src/components/Toggle/index.tsx +3 -3
- package/src/components/ToggleGroup/ToggleGroup.fragment.tsx +33 -8
- package/src/components/ToggleGroup/ToggleGroup.module.scss +3 -3
- package/src/components/ToggleGroup/index.tsx +29 -9
- package/src/components/Tooltip/Tooltip.fragment.tsx +16 -1
- package/src/components/Tooltip/Tooltip.module.scss +1 -1
- package/src/components/Tooltip/index.tsx +16 -1
- package/src/components/VisuallyHidden/VisuallyHidden.fragment.tsx +3 -1
- package/src/components/VisuallyHidden/VisuallyHidden.test.tsx +12 -0
- package/src/components/VisuallyHidden/index.tsx +7 -3
- package/src/index.ts +3 -2
- package/src/tokens/_computed.scss +1 -19
- package/src/tokens/_density.scss +0 -42
- package/src/tokens/_mixins.scss +4 -0
- package/src/tokens/_variables.scss +12 -114
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../src/components/Editor/index.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport styles from './Editor.module.scss';\nimport {\n TextB,\n TextItalic,\n TextStrikethrough,\n LinkSimple,\n Code,\n ListBullets,\n ListNumbers,\n TextHOne,\n TextHTwo,\n TextHThree,\n Quotes,\n ArrowCounterClockwise,\n ArrowClockwise,\n} from '@phosphor-icons/react';\nimport { KEYBOARD_SHORTCUTS } from '../../utils/keyboard-shortcuts';\n\n// ============================================\n// Lazy-loaded dependency (TipTap)\n// ============================================\n\nlet _useEditor: ((config: Record<string, unknown>) => unknown) | null = null;\nlet _EditorContent: React.ComponentType<Record<string, unknown>> | null = null;\nlet _StarterKit: unknown = null;\nlet _LinkExtension: unknown = null;\nlet _tiptapLoaded = false;\nlet _tiptapFailed = false;\n\nfunction loadTipTapDeps() {\n if (_tiptapLoaded) return;\n _tiptapLoaded = true;\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const tiptapReact = require('@tiptap/react');\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const starterKit = require('@tiptap/starter-kit');\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const linkExt = require('@tiptap/extension-link');\n\n _useEditor = tiptapReact.useEditor;\n _EditorContent = tiptapReact.EditorContent;\n _StarterKit = starterKit.default ?? starterKit.StarterKit ?? starterKit;\n _LinkExtension = linkExt.default ?? linkExt.Link ?? linkExt;\n } catch {\n _tiptapFailed = true;\n }\n}\n\n// ============================================\n// Types\n// ============================================\n\nexport type EditorFormat =\n | 'bold' | 'italic' | 'strikethrough' | 'link' | 'code'\n | 'bulletList' | 'orderedList'\n | 'heading1' | 'heading2' | 'heading3'\n | 'blockquote'\n | 'undo' | 'redo';\n\nexport type EditorSaveStatus = 'idle' | 'saving' | 'saved' | 'error';\n\nexport type EditorMode = 'rich' | 'markdown';\n\nexport type EditorSize = 'sm' | 'md' | 'lg';\n\nexport interface EditorProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange' | 'defaultValue'> {\n children?: React.ReactNode;\n /** Controlled value */\n value?: string;\n /** Default value for uncontrolled usage */\n defaultValue?: string;\n /** Called when content changes */\n onValueChange?: (value: string) => void;\n /** Placeholder text */\n placeholder?: string;\n /** Disable the editor */\n disabled?: boolean;\n /** Read-only mode */\n readOnly?: boolean;\n /** Which format buttons to show */\n formats?: EditorFormat[];\n /** Show default toolbar */\n toolbar?: boolean;\n /** Show default status bar */\n statusBar?: boolean;\n /** Auto-save callback */\n onAutoSave?: (value: string) => void;\n /** Auto-save interval in ms */\n autoSaveInterval?: number;\n /** Editor size preset */\n size?: EditorSize;\n /** Maximum character count (shows indicator in status bar) */\n maxLength?: number;\n}\n\nexport interface EditorToolbarProps {\n children: React.ReactNode;\n className?: string;\n}\n\nexport interface EditorToolbarGroupProps {\n children: React.ReactNode;\n 'aria-label'?: string;\n className?: string;\n}\n\nexport interface EditorToolbarButtonProps {\n /** Which format this button toggles */\n format: EditorFormat;\n className?: string;\n}\n\nexport interface EditorSeparatorProps {\n className?: string;\n}\n\nexport interface EditorStatusIndicatorProps {\n /** Override the save status from context */\n status?: EditorSaveStatus;\n /** Custom labels per status */\n labels?: Partial<Record<EditorSaveStatus, string>>;\n className?: string;\n}\n\nexport interface EditorContentProps {\n className?: string;\n}\n\nexport interface EditorStatusBarProps {\n /** Show word count */\n showWordCount?: boolean;\n /** Show character count */\n showCharCount?: boolean;\n className?: string;\n}\n\n// ============================================\n// Format metadata\n// ============================================\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst FORMAT_META: Record<EditorFormat, { icon: React.ComponentType<any>; label: string; shortcut: string }> = {\n bold: { icon: TextB, label: 'Bold', shortcut: KEYBOARD_SHORTCUTS.EDITOR_BOLD.label },\n italic: { icon: TextItalic, label: 'Italic', shortcut: KEYBOARD_SHORTCUTS.EDITOR_ITALIC.label },\n strikethrough: { icon: TextStrikethrough, label: 'Strikethrough', shortcut: KEYBOARD_SHORTCUTS.EDITOR_STRIKETHROUGH.label },\n link: { icon: LinkSimple, label: 'Link', shortcut: KEYBOARD_SHORTCUTS.EDITOR_LINK.label },\n code: { icon: Code, label: 'Code', shortcut: KEYBOARD_SHORTCUTS.EDITOR_CODE.label },\n bulletList: { icon: ListBullets, label: 'Bullet list', shortcut: KEYBOARD_SHORTCUTS.EDITOR_BULLET_LIST.label },\n orderedList: { icon: ListNumbers, label: 'Ordered list', shortcut: KEYBOARD_SHORTCUTS.EDITOR_ORDERED_LIST.label },\n heading1: { icon: TextHOne, label: 'Heading 1', shortcut: KEYBOARD_SHORTCUTS.EDITOR_HEADING1.label },\n heading2: { icon: TextHTwo, label: 'Heading 2', shortcut: KEYBOARD_SHORTCUTS.EDITOR_HEADING2.label },\n heading3: { icon: TextHThree, label: 'Heading 3', shortcut: KEYBOARD_SHORTCUTS.EDITOR_HEADING3.label },\n blockquote: { icon: Quotes, label: 'Blockquote', shortcut: KEYBOARD_SHORTCUTS.EDITOR_BLOCKQUOTE.label },\n undo: { icon: ArrowCounterClockwise, label: 'Undo', shortcut: KEYBOARD_SHORTCUTS.EDITOR_UNDO.label },\n redo: { icon: ArrowClockwise, label: 'Redo', shortcut: KEYBOARD_SHORTCUTS.EDITOR_REDO.label },\n};\n\nconst DEFAULT_FORMATS: EditorFormat[] = ['bold', 'italic', 'strikethrough', 'link', 'code', 'bulletList'];\n\n/** Formats that are actions (not toggles) — no aria-pressed, different disable logic */\nconst ACTION_FORMATS = new Set<EditorFormat>(['undo', 'redo']);\n\nconst DEFAULT_STATUS_LABELS: Record<EditorSaveStatus, string> = {\n idle: '',\n saving: 'SAVING...',\n saved: 'AUTO-SAVED',\n error: 'SAVE FAILED',\n};\n\n// ============================================\n// Markdown formatting helpers (textarea fallback)\n// ============================================\n\ninterface TextareaSelection {\n start: number;\n end: number;\n text: string;\n}\n\nfunction getSelection(textarea: HTMLTextAreaElement): TextareaSelection {\n return {\n start: textarea.selectionStart,\n end: textarea.selectionEnd,\n text: textarea.value.substring(textarea.selectionStart, textarea.selectionEnd),\n };\n}\n\nfunction wrapSelection(\n textarea: HTMLTextAreaElement,\n prefix: string,\n suffix: string,\n setValue: (v: string) => void,\n) {\n const sel = getSelection(textarea);\n const before = textarea.value.substring(0, sel.start);\n const after = textarea.value.substring(sel.end);\n const wrapped = `${prefix}${sel.text || 'text'}${suffix}`;\n const newValue = `${before}${wrapped}${after}`;\n setValue(newValue);\n\n requestAnimationFrame(() => {\n textarea.focus();\n const newStart = sel.start + prefix.length;\n const newEnd = newStart + (sel.text || 'text').length;\n textarea.setSelectionRange(newStart, newEnd);\n });\n}\n\nfunction applyMarkdownFormat(\n format: EditorFormat,\n textarea: HTMLTextAreaElement,\n setValue: (v: string) => void,\n) {\n switch (format) {\n case 'bold':\n wrapSelection(textarea, '**', '**', setValue);\n break;\n case 'italic':\n wrapSelection(textarea, '*', '*', setValue);\n break;\n case 'strikethrough':\n wrapSelection(textarea, '~~', '~~', setValue);\n break;\n case 'code':\n wrapSelection(textarea, '`', '`', setValue);\n break;\n case 'link': {\n const sel = getSelection(textarea);\n const linkText = sel.text || 'link text';\n const before = textarea.value.substring(0, sel.start);\n const after = textarea.value.substring(sel.end);\n const newValue = `${before}[${linkText}](url)${after}`;\n setValue(newValue);\n requestAnimationFrame(() => {\n textarea.focus();\n const urlStart = sel.start + linkText.length + 3;\n textarea.setSelectionRange(urlStart, urlStart + 3);\n });\n break;\n }\n case 'bulletList': {\n const sel = getSelection(textarea);\n const before = textarea.value.substring(0, sel.start);\n const after = textarea.value.substring(sel.end);\n const lines = (sel.text || 'item').split('\\n');\n const bulleted = lines.map((l) => `- ${l}`).join('\\n');\n const newValue = `${before}${bulleted}${after}`;\n setValue(newValue);\n break;\n }\n case 'orderedList': {\n const sel = getSelection(textarea);\n const before = textarea.value.substring(0, sel.start);\n const after = textarea.value.substring(sel.end);\n const lines = (sel.text || 'item').split('\\n');\n const numbered = lines.map((l, i) => `${i + 1}. ${l}`).join('\\n');\n const newValue = `${before}${numbered}${after}`;\n setValue(newValue);\n break;\n }\n case 'heading1':\n wrapSelection(textarea, '# ', '', setValue);\n break;\n case 'heading2':\n wrapSelection(textarea, '## ', '', setValue);\n break;\n case 'heading3':\n wrapSelection(textarea, '### ', '', setValue);\n break;\n case 'blockquote': {\n const sel = getSelection(textarea);\n const before = textarea.value.substring(0, sel.start);\n const after = textarea.value.substring(sel.end);\n const lines = (sel.text || 'quote').split('\\n');\n const quoted = lines.map((l) => `> ${l}`).join('\\n');\n const newValue = `${before}${quoted}${after}`;\n setValue(newValue);\n break;\n }\n case 'undo':\n case 'redo':\n // Undo/redo in textarea mode is handled natively by the browser\n break;\n }\n}\n\n// ============================================\n// Context\n// ============================================\n\ninterface EditorContextValue {\n value: string;\n setValue: (v: string) => void;\n placeholder: string;\n disabled: boolean;\n readOnly: boolean;\n formats: EditorFormat[];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n editor: any | null;\n mode: EditorMode;\n size: EditorSize;\n maxLength?: number;\n wordCount: number;\n charCount: number;\n toggleFormat: (f: EditorFormat) => void;\n isFormatActive: (f: EditorFormat) => boolean;\n saveStatus: EditorSaveStatus;\n contentRef: React.RefObject<HTMLTextAreaElement | null>;\n}\n\nconst EditorContext = React.createContext<EditorContextValue | null>(null);\n\nfunction useEditorContext() {\n const context = React.useContext(EditorContext);\n if (!context) {\n throw new Error('Editor compound components must be used within an Editor');\n }\n return context;\n}\n\n// ============================================\n// Hooks\n// ============================================\n\nfunction useControllableState<T>(\n controlledValue: T | undefined,\n defaultValue: T,\n onChange?: (value: T) => void,\n): [T, (value: T) => void] {\n const [uncontrolledValue, setUncontrolledValue] = React.useState(defaultValue);\n const isControlled = controlledValue !== undefined;\n const value = isControlled ? controlledValue : uncontrolledValue;\n\n const setValue = React.useCallback(\n (newValue: T) => {\n if (!isControlled) {\n setUncontrolledValue(newValue);\n }\n onChange?.(newValue);\n },\n [isControlled, onChange],\n );\n\n return [value, setValue];\n}\n\nfunction countWords(text: string): number {\n const trimmed = text.trim();\n if (!trimmed) return 0;\n return trimmed.split(/\\s+/).length;\n}\n\n// ============================================\n// Components\n// ============================================\n\nfunction EditorRoot({\n children,\n value: controlledValue,\n defaultValue = '',\n onValueChange,\n placeholder = 'Start typing...',\n disabled = false,\n readOnly = false,\n formats = DEFAULT_FORMATS,\n toolbar = true,\n statusBar = true,\n onAutoSave,\n autoSaveInterval = 30000,\n size = 'md',\n maxLength,\n className,\n ...htmlProps\n}: EditorProps) {\n const contentRef = React.useRef<HTMLTextAreaElement>(null);\n\n const [value, setValue] = useControllableState(\n controlledValue,\n defaultValue,\n onValueChange,\n );\n\n const [saveStatus, setSaveStatus] = React.useState<EditorSaveStatus>('idle');\n\n // Try loading TipTap\n loadTipTapDeps();\n const hasTipTap = !_tiptapFailed && _useEditor && _EditorContent && _StarterKit;\n const mode: EditorMode = hasTipTap ? 'rich' : 'markdown';\n\n // TipTap editor instance (only when available)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const tiptapEditor: any = hasTipTap\n ? // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (_useEditor as any)({\n extensions: [\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (_StarterKit as any).configure({\n heading: { levels: [1, 2, 3] },\n blockquote: {},\n codeBlock: false,\n horizontalRule: false,\n hardBreak: false,\n }),\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (_LinkExtension as any).configure({\n openOnClick: false,\n HTMLAttributes: { rel: 'noopener noreferrer', target: '_blank' },\n }),\n ],\n editorProps: {\n attributes: {\n role: 'textbox',\n 'aria-label': placeholder,\n 'aria-multiline': 'true',\n },\n },\n content: defaultValue || controlledValue || '',\n editable: !disabled && !readOnly,\n onUpdate: ({ editor: e }: { editor: { getHTML: () => string } }) => {\n const html = e.getHTML();\n setValue(html);\n },\n })\n : null;\n\n // Sync controlled value to TipTap\n React.useEffect(() => {\n if (tiptapEditor && controlledValue !== undefined) {\n const currentContent = tiptapEditor.getHTML();\n if (currentContent !== controlledValue) {\n tiptapEditor.commands.setContent(controlledValue, false);\n }\n }\n }, [controlledValue, tiptapEditor]);\n\n // Update editable state\n React.useEffect(() => {\n if (tiptapEditor) {\n tiptapEditor.setEditable(!disabled && !readOnly);\n }\n }, [tiptapEditor, disabled, readOnly]);\n\n // Auto-save\n React.useEffect(() => {\n if (!onAutoSave || !value) return;\n\n const timer = setTimeout(() => {\n setSaveStatus('saving');\n try {\n onAutoSave(value);\n setSaveStatus('saved');\n } catch {\n setSaveStatus('error');\n }\n }, autoSaveInterval);\n\n return () => clearTimeout(timer);\n }, [value, onAutoSave, autoSaveInterval]);\n\n const toggleFormat = React.useCallback(\n (format: EditorFormat) => {\n if (disabled || readOnly) return;\n\n if (tiptapEditor) {\n switch (format) {\n case 'bold':\n tiptapEditor.chain().focus().toggleBold().run();\n break;\n case 'italic':\n tiptapEditor.chain().focus().toggleItalic().run();\n break;\n case 'strikethrough':\n tiptapEditor.chain().focus().toggleStrike().run();\n break;\n case 'code':\n tiptapEditor.chain().focus().toggleCode().run();\n break;\n case 'bulletList':\n tiptapEditor.chain().focus().toggleBulletList().run();\n break;\n case 'orderedList':\n tiptapEditor.chain().focus().toggleOrderedList().run();\n break;\n case 'heading1':\n tiptapEditor.chain().focus().toggleHeading({ level: 1 }).run();\n break;\n case 'heading2':\n tiptapEditor.chain().focus().toggleHeading({ level: 2 }).run();\n break;\n case 'heading3':\n tiptapEditor.chain().focus().toggleHeading({ level: 3 }).run();\n break;\n case 'blockquote':\n tiptapEditor.chain().focus().toggleBlockquote().run();\n break;\n case 'undo':\n tiptapEditor.chain().focus().undo().run();\n break;\n case 'redo':\n tiptapEditor.chain().focus().redo().run();\n break;\n case 'link': {\n const previousUrl = tiptapEditor.getAttributes('link').href;\n if (previousUrl) {\n tiptapEditor.chain().focus().unsetLink().run();\n } else {\n const url = window.prompt('Enter URL');\n if (url) {\n tiptapEditor.chain().focus().setLink({ href: url }).run();\n }\n }\n break;\n }\n }\n } else if (contentRef.current) {\n applyMarkdownFormat(format, contentRef.current, setValue);\n }\n },\n [disabled, readOnly, tiptapEditor, setValue],\n );\n\n const isFormatActive = React.useCallback(\n (format: EditorFormat): boolean => {\n if (!tiptapEditor) return false;\n switch (format) {\n case 'bold':\n return tiptapEditor.isActive('bold');\n case 'italic':\n return tiptapEditor.isActive('italic');\n case 'strikethrough':\n return tiptapEditor.isActive('strike');\n case 'code':\n return tiptapEditor.isActive('code');\n case 'bulletList':\n return tiptapEditor.isActive('bulletList');\n case 'orderedList':\n return tiptapEditor.isActive('orderedList');\n case 'heading1':\n return tiptapEditor.isActive('heading', { level: 1 });\n case 'heading2':\n return tiptapEditor.isActive('heading', { level: 2 });\n case 'heading3':\n return tiptapEditor.isActive('heading', { level: 3 });\n case 'blockquote':\n return tiptapEditor.isActive('blockquote');\n case 'link':\n return tiptapEditor.isActive('link');\n case 'undo':\n case 'redo':\n return false; // Actions don't have active state\n default:\n return false;\n }\n },\n [tiptapEditor],\n );\n\n const wordCount = React.useMemo(() => {\n if (tiptapEditor) {\n const text = tiptapEditor.getText?.() ?? '';\n return countWords(text);\n }\n return countWords(value);\n }, [value, tiptapEditor]);\n\n const charCount = React.useMemo(() => {\n if (tiptapEditor) {\n return (tiptapEditor.getText?.() ?? '').length;\n }\n return value.length;\n }, [value, tiptapEditor]);\n\n const contextValue: EditorContextValue = {\n value,\n setValue,\n placeholder,\n disabled,\n readOnly,\n formats,\n editor: tiptapEditor,\n mode,\n size,\n maxLength,\n wordCount,\n charCount,\n toggleFormat,\n isFormatActive,\n saveStatus,\n contentRef,\n };\n\n const classes = [\n styles.editor,\n disabled && styles.disabled,\n readOnly && styles.readOnly,\n className,\n ].filter(Boolean).join(' ');\n\n const hasCustomChildren = children !== undefined;\n\n return (\n <EditorContext.Provider value={contextValue}>\n <div\n {...htmlProps}\n className={classes}\n data-disabled={disabled || undefined}\n data-readonly={readOnly || undefined}\n data-size={size}\n >\n {hasCustomChildren ? (\n children\n ) : (\n <>\n {toolbar && (\n <EditorToolbar>\n <EditorToolbarGroup aria-label=\"Text formatting\">\n {formats.map((f) => (\n <EditorToolbarButton key={f} format={f} />\n ))}\n </EditorToolbarGroup>\n </EditorToolbar>\n )}\n <EditorContentArea />\n {statusBar && <EditorStatusBar showWordCount showCharCount />}\n </>\n )}\n </div>\n </EditorContext.Provider>\n );\n}\n\nfunction EditorToolbar({ children, className }: EditorToolbarProps) {\n const classes = [styles.toolbar, className].filter(Boolean).join(' ');\n return (\n <div className={classes} role=\"toolbar\" aria-label=\"Editor formatting\">\n {children}\n </div>\n );\n}\n\nfunction EditorToolbarGroup({ children, 'aria-label': ariaLabel, className }: EditorToolbarGroupProps) {\n const classes = [styles.toolbarGroup, className].filter(Boolean).join(' ');\n return (\n <div className={classes} role=\"group\" aria-label={ariaLabel}>\n {children}\n </div>\n );\n}\n\nfunction EditorToolbarButton({ format, className }: EditorToolbarButtonProps) {\n const { toggleFormat, isFormatActive, disabled, readOnly, editor, mode } = useEditorContext();\n const meta = FORMAT_META[format];\n const isAction = ACTION_FORMATS.has(format);\n const active = isAction ? false : isFormatActive(format);\n const IconComponent = meta.icon;\n\n // Action buttons (undo/redo) have special disable logic\n let isDisabled = disabled || readOnly;\n if (isAction && !isDisabled) {\n if (mode === 'markdown') {\n // Undo/redo in textarea mode is handled natively by the browser\n isDisabled = true;\n } else if (editor) {\n isDisabled = format === 'undo' ? !editor.can().undo() : !editor.can().redo();\n }\n }\n\n const classes = [\n styles.toolbarButton,\n active && styles.toolbarButtonActive,\n className,\n ].filter(Boolean).join(' ');\n\n return (\n <button\n type=\"button\"\n className={classes}\n onClick={() => toggleFormat(format)}\n disabled={isDisabled}\n aria-label={meta.label}\n title={`${meta.label} (${meta.shortcut})`}\n {...(isAction ? {} : { 'aria-pressed': active })}\n >\n <IconComponent size={16} weight={active ? 'bold' : 'regular'} />\n </button>\n );\n}\n\nfunction EditorSeparator({ className }: EditorSeparatorProps) {\n const classes = [styles.separator, className].filter(Boolean).join(' ');\n return <div className={classes} role=\"separator\" aria-orientation=\"vertical\" />;\n}\n\nfunction EditorStatusIndicator({ status: statusOverride, labels, className }: EditorStatusIndicatorProps) {\n const { saveStatus } = useEditorContext();\n const status = statusOverride ?? saveStatus;\n const mergedLabels = { ...DEFAULT_STATUS_LABELS, ...labels };\n const label = mergedLabels[status];\n\n if (!label) return null;\n\n const classes = [\n styles.statusIndicator,\n status === 'error' && styles.statusError,\n className,\n ].filter(Boolean).join(' ');\n\n return (\n <span className={classes} aria-live=\"polite\" role=\"status\">\n {label}\n </span>\n );\n}\n\nfunction EditorContentArea({ className }: EditorContentProps) {\n const { value, setValue, placeholder, disabled, readOnly, editor, mode, contentRef } =\n useEditorContext();\n\n if (mode === 'rich' && editor && _EditorContent) {\n const TipTapContent = _EditorContent;\n const classes = [styles.content, styles.contentRich, className].filter(Boolean).join(' ');\n return (\n <div className={classes} data-placeholder={placeholder}>\n <TipTapContent editor={editor} />\n </div>\n );\n }\n\n // Textarea fallback for markdown mode\n const classes = [styles.content, className].filter(Boolean).join(' ');\n return (\n <div className={classes}>\n <textarea\n ref={contentRef}\n className={styles.contentTextarea}\n value={value}\n onChange={(e) => setValue(e.target.value)}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n aria-label={placeholder}\n />\n </div>\n );\n}\n\nfunction EditorStatusBar({ showWordCount = true, showCharCount = true, className }: EditorStatusBarProps) {\n const { wordCount, charCount, maxLength } = useEditorContext();\n\n const classes = [styles.statusBar, className].filter(Boolean).join(' ');\n\n const isOverLimit = maxLength !== undefined && charCount > maxLength;\n const isNearLimit = maxLength !== undefined && !isOverLimit && charCount >= maxLength * 0.9;\n\n const charLimitClasses = [\n styles.statusBarItem,\n isNearLimit && styles.statusBarItemWarning,\n isOverLimit && styles.statusBarItemError,\n ].filter(Boolean).join(' ');\n\n return (\n <div className={classes} aria-label=\"Editor statistics\">\n <div className={styles.statusBarLeft} />\n <div className={styles.statusBarRight}>\n {showWordCount && (\n <span className={styles.statusBarItem}>\n {wordCount} {wordCount === 1 ? 'Word' : 'Words'}\n </span>\n )}\n {showWordCount && showCharCount && (\n <EditorSeparator />\n )}\n {showCharCount && (\n <span className={charLimitClasses}>\n {maxLength !== undefined\n ? `${charCount} / ${maxLength}`\n : `${charCount} ${charCount === 1 ? 'Character' : 'Characters'}`\n }\n </span>\n )}\n </div>\n </div>\n );\n}\n\n// ============================================\n// Export compound component\n// ============================================\n\nexport const Editor = Object.assign(EditorRoot, {\n Toolbar: EditorToolbar,\n ToolbarGroup: EditorToolbarGroup,\n ToolbarButton: EditorToolbarButton,\n Separator: EditorSeparator,\n StatusIndicator: EditorStatusIndicator,\n Content: EditorContentArea,\n StatusBar: EditorStatusBar,\n});\n\nexport {\n EditorRoot,\n EditorToolbar,\n EditorToolbarGroup,\n EditorToolbarButton,\n EditorSeparator,\n EditorStatusIndicator,\n EditorContentArea,\n EditorStatusBar,\n};\n\nexport { useEditorContext };\n"],"names":["TextB","KEYBOARD_SHORTCUTS","TextItalic","TextStrikethrough","LinkSimple","Code","ListBullets","ListNumbers","TextHOne","TextHTwo","TextHThree","Quotes","ArrowCounterClockwise","ArrowClockwise","React","styles","jsx","jsxs","Fragment","classes"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../src/components/Editor/index.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport styles from './Editor.module.scss';\nimport {\n TextB,\n TextItalic,\n TextStrikethrough,\n LinkSimple,\n Code,\n ListBullets,\n ListNumbers,\n TextHOne,\n TextHTwo,\n TextHThree,\n Quotes,\n ArrowCounterClockwise,\n ArrowClockwise,\n} from '@phosphor-icons/react';\nimport { KEYBOARD_SHORTCUTS } from '../../utils/keyboard-shortcuts';\n\n// ============================================\n// Lazy-loaded dependency (TipTap)\n// ============================================\n\nlet _useEditor: ((config: Record<string, unknown>) => unknown) | null = null;\nlet _EditorContent: React.ComponentType<Record<string, unknown>> | null = null;\nlet _StarterKit: unknown = null;\nlet _LinkExtension: unknown = null;\nlet _tiptapLoaded = false;\nlet _tiptapFailed = false;\n\nfunction loadTipTapDeps() {\n if (_tiptapLoaded) return;\n _tiptapLoaded = true;\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const tiptapReact = require('@tiptap/react');\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const starterKit = require('@tiptap/starter-kit');\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const linkExt = require('@tiptap/extension-link');\n\n _useEditor = tiptapReact.useEditor;\n _EditorContent = tiptapReact.EditorContent;\n _StarterKit = starterKit.default ?? starterKit.StarterKit ?? starterKit;\n _LinkExtension = linkExt.default ?? linkExt.Link ?? linkExt;\n } catch {\n _tiptapFailed = true;\n }\n}\n\n// ============================================\n// Types\n// ============================================\n\nexport type EditorFormat =\n | 'bold' | 'italic' | 'strikethrough' | 'link' | 'code'\n | 'bulletList' | 'orderedList'\n | 'heading1' | 'heading2' | 'heading3'\n | 'blockquote'\n | 'undo' | 'redo';\n\nexport type EditorSaveStatus = 'idle' | 'saving' | 'saved' | 'error';\n\nexport type EditorMode = 'rich' | 'markdown';\n\nexport type EditorSize = 'sm' | 'md' | 'lg';\n\nexport interface EditorToolbarIconRenderState {\n format: EditorFormat;\n active: boolean;\n disabled: boolean;\n readOnly: boolean;\n isDisabled: boolean;\n mode: EditorMode;\n}\n\nexport type EditorToolbarIconSlot =\n | React.ReactNode\n | ((state: EditorToolbarIconRenderState) => React.ReactNode);\n\nexport type EditorToolbarIcons = Partial<Record<EditorFormat, EditorToolbarIconSlot>>;\n\nexport interface EditorProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange' | 'defaultValue'> {\n children?: React.ReactNode;\n /** Controlled value */\n value?: string;\n /** Default value for uncontrolled usage */\n defaultValue?: string;\n /** Called when content changes */\n onValueChange?: (value: string) => void;\n /** Placeholder text */\n placeholder?: string;\n /** Disable the editor */\n disabled?: boolean;\n /** Read-only mode */\n readOnly?: boolean;\n /** Which format buttons to show */\n formats?: EditorFormat[];\n /** Show default toolbar */\n toolbar?: boolean;\n /** Show default status bar */\n statusBar?: boolean;\n /** Auto-save callback (sync or async) */\n onAutoSave?: (value: string) => void | Promise<void>;\n /** Auto-save interval in ms */\n autoSaveInterval?: number;\n /** Editor size preset */\n size?: EditorSize;\n /** Maximum character count (shows indicator in status bar) */\n maxLength?: number;\n /** Custom toolbar icons keyed by format/action, for any icon package */\n toolbarIcons?: EditorToolbarIcons;\n}\n\nexport interface EditorToolbarProps {\n children: React.ReactNode;\n className?: string;\n}\n\nexport interface EditorToolbarGroupProps {\n children: React.ReactNode;\n 'aria-label'?: string;\n className?: string;\n}\n\nexport interface EditorToolbarButtonProps {\n /** Which format this button toggles */\n format: EditorFormat;\n className?: string;\n}\n\nexport interface EditorSeparatorProps {\n className?: string;\n}\n\nexport interface EditorStatusIndicatorProps {\n /** Override the save status from context */\n status?: EditorSaveStatus;\n /** Custom labels per status */\n labels?: Partial<Record<EditorSaveStatus, string>>;\n className?: string;\n}\n\nexport interface EditorContentProps {\n className?: string;\n}\n\nexport interface EditorStatusBarProps {\n /** Show word count */\n showWordCount?: boolean;\n /** Show character count */\n showCharCount?: boolean;\n className?: string;\n}\n\n// ============================================\n// Format metadata\n// ============================================\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst FORMAT_META: Record<EditorFormat, { icon: React.ComponentType<any>; label: string; shortcut: string }> = {\n bold: { icon: TextB, label: 'Bold', shortcut: KEYBOARD_SHORTCUTS.EDITOR_BOLD.label },\n italic: { icon: TextItalic, label: 'Italic', shortcut: KEYBOARD_SHORTCUTS.EDITOR_ITALIC.label },\n strikethrough: { icon: TextStrikethrough, label: 'Strikethrough', shortcut: KEYBOARD_SHORTCUTS.EDITOR_STRIKETHROUGH.label },\n link: { icon: LinkSimple, label: 'Link', shortcut: KEYBOARD_SHORTCUTS.EDITOR_LINK.label },\n code: { icon: Code, label: 'Code', shortcut: KEYBOARD_SHORTCUTS.EDITOR_CODE.label },\n bulletList: { icon: ListBullets, label: 'Bullet list', shortcut: KEYBOARD_SHORTCUTS.EDITOR_BULLET_LIST.label },\n orderedList: { icon: ListNumbers, label: 'Ordered list', shortcut: KEYBOARD_SHORTCUTS.EDITOR_ORDERED_LIST.label },\n heading1: { icon: TextHOne, label: 'Heading 1', shortcut: KEYBOARD_SHORTCUTS.EDITOR_HEADING1.label },\n heading2: { icon: TextHTwo, label: 'Heading 2', shortcut: KEYBOARD_SHORTCUTS.EDITOR_HEADING2.label },\n heading3: { icon: TextHThree, label: 'Heading 3', shortcut: KEYBOARD_SHORTCUTS.EDITOR_HEADING3.label },\n blockquote: { icon: Quotes, label: 'Blockquote', shortcut: KEYBOARD_SHORTCUTS.EDITOR_BLOCKQUOTE.label },\n undo: { icon: ArrowCounterClockwise, label: 'Undo', shortcut: KEYBOARD_SHORTCUTS.EDITOR_UNDO.label },\n redo: { icon: ArrowClockwise, label: 'Redo', shortcut: KEYBOARD_SHORTCUTS.EDITOR_REDO.label },\n};\n\nconst DEFAULT_FORMATS: EditorFormat[] = ['bold', 'italic', 'strikethrough', 'link', 'code', 'bulletList'];\n\n/** Formats that are actions (not toggles) — no aria-pressed, different disable logic */\nconst ACTION_FORMATS = new Set<EditorFormat>(['undo', 'redo']);\n\nconst DEFAULT_STATUS_LABELS: Record<EditorSaveStatus, string> = {\n idle: '',\n saving: 'SAVING...',\n saved: 'AUTO-SAVED',\n error: 'SAVE FAILED',\n};\n\n// ============================================\n// Markdown formatting helpers (textarea fallback)\n// ============================================\n\ninterface TextareaSelection {\n start: number;\n end: number;\n text: string;\n}\n\nfunction getSelection(textarea: HTMLTextAreaElement): TextareaSelection {\n return {\n start: textarea.selectionStart,\n end: textarea.selectionEnd,\n text: textarea.value.substring(textarea.selectionStart, textarea.selectionEnd),\n };\n}\n\nfunction wrapSelection(\n textarea: HTMLTextAreaElement,\n prefix: string,\n suffix: string,\n setValue: (v: string) => void,\n) {\n const sel = getSelection(textarea);\n const before = textarea.value.substring(0, sel.start);\n const after = textarea.value.substring(sel.end);\n const wrapped = `${prefix}${sel.text || 'text'}${suffix}`;\n const newValue = `${before}${wrapped}${after}`;\n setValue(newValue);\n\n requestAnimationFrame(() => {\n textarea.focus();\n const newStart = sel.start + prefix.length;\n const newEnd = newStart + (sel.text || 'text').length;\n textarea.setSelectionRange(newStart, newEnd);\n });\n}\n\nfunction applyMarkdownFormat(\n format: EditorFormat,\n textarea: HTMLTextAreaElement,\n setValue: (v: string) => void,\n) {\n switch (format) {\n case 'bold':\n wrapSelection(textarea, '**', '**', setValue);\n break;\n case 'italic':\n wrapSelection(textarea, '*', '*', setValue);\n break;\n case 'strikethrough':\n wrapSelection(textarea, '~~', '~~', setValue);\n break;\n case 'code':\n wrapSelection(textarea, '`', '`', setValue);\n break;\n case 'link': {\n const sel = getSelection(textarea);\n const linkText = sel.text || 'link text';\n const before = textarea.value.substring(0, sel.start);\n const after = textarea.value.substring(sel.end);\n const newValue = `${before}[${linkText}](url)${after}`;\n setValue(newValue);\n requestAnimationFrame(() => {\n textarea.focus();\n const urlStart = sel.start + linkText.length + 3;\n textarea.setSelectionRange(urlStart, urlStart + 3);\n });\n break;\n }\n case 'bulletList': {\n const sel = getSelection(textarea);\n const before = textarea.value.substring(0, sel.start);\n const after = textarea.value.substring(sel.end);\n const lines = (sel.text || 'item').split('\\n');\n const bulleted = lines.map((l) => `- ${l}`).join('\\n');\n const newValue = `${before}${bulleted}${after}`;\n setValue(newValue);\n break;\n }\n case 'orderedList': {\n const sel = getSelection(textarea);\n const before = textarea.value.substring(0, sel.start);\n const after = textarea.value.substring(sel.end);\n const lines = (sel.text || 'item').split('\\n');\n const numbered = lines.map((l, i) => `${i + 1}. ${l}`).join('\\n');\n const newValue = `${before}${numbered}${after}`;\n setValue(newValue);\n break;\n }\n case 'heading1':\n wrapSelection(textarea, '# ', '', setValue);\n break;\n case 'heading2':\n wrapSelection(textarea, '## ', '', setValue);\n break;\n case 'heading3':\n wrapSelection(textarea, '### ', '', setValue);\n break;\n case 'blockquote': {\n const sel = getSelection(textarea);\n const before = textarea.value.substring(0, sel.start);\n const after = textarea.value.substring(sel.end);\n const lines = (sel.text || 'quote').split('\\n');\n const quoted = lines.map((l) => `> ${l}`).join('\\n');\n const newValue = `${before}${quoted}${after}`;\n setValue(newValue);\n break;\n }\n case 'undo':\n case 'redo':\n // Undo/redo in textarea mode is handled natively by the browser\n break;\n }\n}\n\n// ============================================\n// Context\n// ============================================\n\ninterface EditorContextValue {\n value: string;\n setValue: (v: string) => void;\n placeholder: string;\n disabled: boolean;\n readOnly: boolean;\n formats: EditorFormat[];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n editor: any | null;\n mode: EditorMode;\n size: EditorSize;\n maxLength?: number;\n toolbarIcons?: EditorToolbarIcons;\n wordCount: number;\n charCount: number;\n toggleFormat: (f: EditorFormat) => void;\n isFormatActive: (f: EditorFormat) => boolean;\n saveStatus: EditorSaveStatus;\n contentRef: React.RefObject<HTMLTextAreaElement | null>;\n}\n\nconst EditorContext = React.createContext<EditorContextValue | null>(null);\n\nfunction useEditorContext() {\n const context = React.useContext(EditorContext);\n if (!context) {\n throw new Error('Editor compound components must be used within an Editor');\n }\n return context;\n}\n\n// ============================================\n// Hooks\n// ============================================\n\nfunction useControllableState<T>(\n controlledValue: T | undefined,\n defaultValue: T,\n onChange?: (value: T) => void,\n): [T, (value: T) => void] {\n const [uncontrolledValue, setUncontrolledValue] = React.useState(defaultValue);\n const isControlled = controlledValue !== undefined;\n const value = isControlled ? controlledValue : uncontrolledValue;\n\n const setValue = React.useCallback(\n (newValue: T) => {\n if (!isControlled) {\n setUncontrolledValue(newValue);\n }\n onChange?.(newValue);\n },\n [isControlled, onChange],\n );\n\n return [value, setValue];\n}\n\nfunction countWords(text: string): number {\n const trimmed = text.trim();\n if (!trimmed) return 0;\n return trimmed.split(/\\s+/).length;\n}\n\n// ============================================\n// Components\n// ============================================\n\nfunction EditorRoot({\n children,\n value: controlledValue,\n defaultValue = '',\n onValueChange,\n placeholder = 'Start typing...',\n disabled = false,\n readOnly = false,\n formats = DEFAULT_FORMATS,\n toolbar = true,\n statusBar = true,\n onAutoSave,\n autoSaveInterval = 30000,\n size = 'md',\n maxLength,\n toolbarIcons,\n className,\n ...htmlProps\n}: EditorProps) {\n const contentRef = React.useRef<HTMLTextAreaElement>(null);\n\n const [value, setValue] = useControllableState(\n controlledValue,\n defaultValue,\n onValueChange,\n );\n\n const [saveStatus, setSaveStatus] = React.useState<EditorSaveStatus>('idle');\n\n // Try loading TipTap\n loadTipTapDeps();\n const hasTipTap = !_tiptapFailed && _useEditor && _EditorContent && _StarterKit;\n const mode: EditorMode = hasTipTap ? 'rich' : 'markdown';\n\n // TipTap editor instance (only when available)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const tiptapEditor: any = hasTipTap\n ? // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (_useEditor as any)({\n extensions: [\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (_StarterKit as any).configure({\n heading: { levels: [1, 2, 3] },\n blockquote: {},\n codeBlock: false,\n horizontalRule: false,\n hardBreak: false,\n }),\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (_LinkExtension as any).configure({\n openOnClick: false,\n HTMLAttributes: { rel: 'noopener noreferrer', target: '_blank' },\n }),\n ],\n editorProps: {\n attributes: {\n role: 'textbox',\n 'aria-label': placeholder,\n 'aria-multiline': 'true',\n },\n },\n content: controlledValue !== undefined ? controlledValue : defaultValue,\n editable: !disabled && !readOnly,\n onUpdate: ({ editor: e }: { editor: { getHTML: () => string } }) => {\n const html = e.getHTML();\n setValue(html);\n },\n })\n : null;\n\n // Sync controlled value to TipTap\n React.useEffect(() => {\n if (tiptapEditor && controlledValue !== undefined) {\n const currentContent = tiptapEditor.getHTML();\n if (currentContent !== controlledValue) {\n tiptapEditor.commands.setContent(controlledValue, false);\n }\n }\n }, [controlledValue, tiptapEditor]);\n\n // Update editable state\n React.useEffect(() => {\n if (tiptapEditor) {\n tiptapEditor.setEditable(!disabled && !readOnly);\n }\n }, [tiptapEditor, disabled, readOnly]);\n\n // Auto-save\n React.useEffect(() => {\n if (!onAutoSave || !value) return;\n\n let cancelled = false;\n const timer = setTimeout(() => {\n setSaveStatus('saving');\n try {\n Promise.resolve(onAutoSave(value))\n .then(() => {\n if (!cancelled) {\n setSaveStatus('saved');\n }\n })\n .catch(() => {\n if (!cancelled) {\n setSaveStatus('error');\n }\n });\n } catch {\n if (!cancelled) {\n setSaveStatus('error');\n }\n }\n }, autoSaveInterval);\n\n return () => {\n cancelled = true;\n clearTimeout(timer);\n };\n }, [value, onAutoSave, autoSaveInterval]);\n\n const toggleFormat = React.useCallback(\n (format: EditorFormat) => {\n if (disabled || readOnly) return;\n\n if (tiptapEditor) {\n switch (format) {\n case 'bold':\n tiptapEditor.chain().focus().toggleBold().run();\n break;\n case 'italic':\n tiptapEditor.chain().focus().toggleItalic().run();\n break;\n case 'strikethrough':\n tiptapEditor.chain().focus().toggleStrike().run();\n break;\n case 'code':\n tiptapEditor.chain().focus().toggleCode().run();\n break;\n case 'bulletList':\n tiptapEditor.chain().focus().toggleBulletList().run();\n break;\n case 'orderedList':\n tiptapEditor.chain().focus().toggleOrderedList().run();\n break;\n case 'heading1':\n tiptapEditor.chain().focus().toggleHeading({ level: 1 }).run();\n break;\n case 'heading2':\n tiptapEditor.chain().focus().toggleHeading({ level: 2 }).run();\n break;\n case 'heading3':\n tiptapEditor.chain().focus().toggleHeading({ level: 3 }).run();\n break;\n case 'blockquote':\n tiptapEditor.chain().focus().toggleBlockquote().run();\n break;\n case 'undo':\n tiptapEditor.chain().focus().undo().run();\n break;\n case 'redo':\n tiptapEditor.chain().focus().redo().run();\n break;\n case 'link': {\n const previousUrl = tiptapEditor.getAttributes('link').href;\n if (previousUrl) {\n tiptapEditor.chain().focus().unsetLink().run();\n } else {\n const url = window.prompt('Enter URL');\n if (url) {\n tiptapEditor.chain().focus().setLink({ href: url }).run();\n }\n }\n break;\n }\n }\n } else if (contentRef.current) {\n applyMarkdownFormat(format, contentRef.current, setValue);\n }\n },\n [disabled, readOnly, tiptapEditor, setValue],\n );\n\n const isFormatActive = React.useCallback(\n (format: EditorFormat): boolean => {\n if (!tiptapEditor) return false;\n switch (format) {\n case 'bold':\n return tiptapEditor.isActive('bold');\n case 'italic':\n return tiptapEditor.isActive('italic');\n case 'strikethrough':\n return tiptapEditor.isActive('strike');\n case 'code':\n return tiptapEditor.isActive('code');\n case 'bulletList':\n return tiptapEditor.isActive('bulletList');\n case 'orderedList':\n return tiptapEditor.isActive('orderedList');\n case 'heading1':\n return tiptapEditor.isActive('heading', { level: 1 });\n case 'heading2':\n return tiptapEditor.isActive('heading', { level: 2 });\n case 'heading3':\n return tiptapEditor.isActive('heading', { level: 3 });\n case 'blockquote':\n return tiptapEditor.isActive('blockquote');\n case 'link':\n return tiptapEditor.isActive('link');\n case 'undo':\n case 'redo':\n return false; // Actions don't have active state\n default:\n return false;\n }\n },\n [tiptapEditor],\n );\n\n const wordCount = React.useMemo(() => {\n if (tiptapEditor) {\n const text = tiptapEditor.getText?.() ?? '';\n return countWords(text);\n }\n return countWords(value);\n }, [value, tiptapEditor]);\n\n const charCount = React.useMemo(() => {\n if (tiptapEditor) {\n return (tiptapEditor.getText?.() ?? '').length;\n }\n return value.length;\n }, [value, tiptapEditor]);\n\n const contextValue: EditorContextValue = {\n value,\n setValue,\n placeholder,\n disabled,\n readOnly,\n formats,\n editor: tiptapEditor,\n mode,\n size,\n maxLength,\n toolbarIcons,\n wordCount,\n charCount,\n toggleFormat,\n isFormatActive,\n saveStatus,\n contentRef,\n };\n\n const classes = [\n styles.editor,\n disabled && styles.disabled,\n readOnly && styles.readOnly,\n className,\n ].filter(Boolean).join(' ');\n\n const hasCustomChildren = children !== undefined;\n\n return (\n <EditorContext.Provider value={contextValue}>\n <div\n {...htmlProps}\n className={classes}\n data-disabled={disabled || undefined}\n data-readonly={readOnly || undefined}\n data-size={size}\n >\n {hasCustomChildren ? (\n children\n ) : (\n <>\n {toolbar && (\n <EditorToolbar>\n <EditorToolbarGroup aria-label=\"Text formatting\">\n {formats.map((f) => (\n <EditorToolbarButton key={f} format={f} />\n ))}\n </EditorToolbarGroup>\n </EditorToolbar>\n )}\n <EditorContentArea />\n {statusBar && <EditorStatusBar showWordCount showCharCount />}\n </>\n )}\n </div>\n </EditorContext.Provider>\n );\n}\n\nfunction EditorToolbar({ children, className }: EditorToolbarProps) {\n const classes = [styles.toolbar, className].filter(Boolean).join(' ');\n return (\n <div className={classes} role=\"toolbar\" aria-label=\"Editor formatting\">\n {children}\n </div>\n );\n}\n\nfunction EditorToolbarGroup({ children, 'aria-label': ariaLabel, className }: EditorToolbarGroupProps) {\n const classes = [styles.toolbarGroup, className].filter(Boolean).join(' ');\n return (\n <div className={classes} role=\"group\" aria-label={ariaLabel}>\n {children}\n </div>\n );\n}\n\nfunction EditorToolbarButton({ format, className }: EditorToolbarButtonProps) {\n const { toggleFormat, isFormatActive, disabled, readOnly, editor, mode, toolbarIcons } = useEditorContext();\n const meta = FORMAT_META[format];\n const isAction = ACTION_FORMATS.has(format);\n const active = isAction ? false : isFormatActive(format);\n const IconComponent = meta.icon;\n\n // Action buttons (undo/redo) have special disable logic\n let isDisabled = disabled || readOnly;\n if (isAction && !isDisabled) {\n if (mode === 'markdown') {\n // Undo/redo in textarea mode is handled natively by the browser\n isDisabled = true;\n } else if (editor) {\n isDisabled = format === 'undo' ? !editor.can().undo() : !editor.can().redo();\n }\n }\n\n const iconState: EditorToolbarIconRenderState = {\n format,\n active,\n disabled,\n readOnly,\n isDisabled,\n mode,\n };\n\n const iconOverride = toolbarIcons?.[format];\n const renderedOverride = typeof iconOverride === 'function'\n ? iconOverride(iconState)\n : iconOverride;\n\n const classes = [\n styles.toolbarButton,\n active && styles.toolbarButtonActive,\n className,\n ].filter(Boolean).join(' ');\n\n return (\n <button\n type=\"button\"\n className={classes}\n onClick={() => toggleFormat(format)}\n disabled={isDisabled}\n aria-label={meta.label}\n title={`${meta.label} (${meta.shortcut})`}\n {...(isAction ? {} : { 'aria-pressed': active })}\n >\n {iconOverride !== undefined\n ? renderedOverride\n : <IconComponent size={16} weight={active ? 'bold' : 'regular'} />}\n </button>\n );\n}\n\nfunction EditorSeparator({ className }: EditorSeparatorProps) {\n const classes = [styles.separator, className].filter(Boolean).join(' ');\n return <div className={classes} role=\"separator\" aria-orientation=\"vertical\" />;\n}\n\nfunction EditorStatusIndicator({ status: statusOverride, labels, className }: EditorStatusIndicatorProps) {\n const { saveStatus } = useEditorContext();\n const status = statusOverride ?? saveStatus;\n const mergedLabels = { ...DEFAULT_STATUS_LABELS, ...labels };\n const label = mergedLabels[status];\n\n if (!label) return null;\n\n const classes = [\n styles.statusIndicator,\n status === 'error' && styles.statusError,\n className,\n ].filter(Boolean).join(' ');\n\n return (\n <span className={classes} aria-live=\"polite\" role=\"status\">\n {label}\n </span>\n );\n}\n\nfunction EditorContentArea({ className }: EditorContentProps) {\n const { value, setValue, placeholder, disabled, readOnly, editor, mode, contentRef } =\n useEditorContext();\n\n if (mode === 'rich' && editor && _EditorContent) {\n const TipTapContent = _EditorContent;\n const classes = [styles.content, styles.contentRich, className].filter(Boolean).join(' ');\n return (\n <div className={classes} data-placeholder={placeholder}>\n <TipTapContent editor={editor} />\n </div>\n );\n }\n\n // Textarea fallback for markdown mode\n const classes = [styles.content, className].filter(Boolean).join(' ');\n return (\n <div className={classes}>\n <textarea\n ref={contentRef}\n className={styles.contentTextarea}\n value={value}\n onChange={(e) => setValue(e.target.value)}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n aria-label={placeholder}\n />\n </div>\n );\n}\n\nfunction EditorStatusBar({ showWordCount = true, showCharCount = true, className }: EditorStatusBarProps) {\n const { wordCount, charCount, maxLength } = useEditorContext();\n\n const classes = [styles.statusBar, className].filter(Boolean).join(' ');\n\n const isOverLimit = maxLength !== undefined && charCount > maxLength;\n const isNearLimit = maxLength !== undefined && !isOverLimit && charCount >= maxLength * 0.9;\n\n const charLimitClasses = [\n styles.statusBarItem,\n isNearLimit && styles.statusBarItemWarning,\n isOverLimit && styles.statusBarItemError,\n ].filter(Boolean).join(' ');\n\n return (\n <div className={classes} aria-label=\"Editor statistics\">\n <div className={styles.statusBarLeft} />\n <div className={styles.statusBarRight}>\n {showWordCount && (\n <span className={styles.statusBarItem}>\n {wordCount} {wordCount === 1 ? 'Word' : 'Words'}\n </span>\n )}\n {showWordCount && showCharCount && (\n <EditorSeparator />\n )}\n {showCharCount && (\n <span className={charLimitClasses}>\n {maxLength !== undefined\n ? `${charCount} / ${maxLength}`\n : `${charCount} ${charCount === 1 ? 'Character' : 'Characters'}`\n }\n </span>\n )}\n </div>\n </div>\n );\n}\n\n// ============================================\n// Export compound component\n// ============================================\n\nexport const Editor = Object.assign(EditorRoot, {\n Toolbar: EditorToolbar,\n ToolbarGroup: EditorToolbarGroup,\n ToolbarButton: EditorToolbarButton,\n Separator: EditorSeparator,\n StatusIndicator: EditorStatusIndicator,\n Content: EditorContentArea,\n StatusBar: EditorStatusBar,\n});\n\nexport {\n EditorRoot,\n EditorToolbar,\n EditorToolbarGroup,\n EditorToolbarButton,\n EditorSeparator,\n EditorStatusIndicator,\n EditorContentArea,\n EditorStatusBar,\n};\n\nexport { useEditorContext };\n"],"names":["TextB","KEYBOARD_SHORTCUTS","TextItalic","TextStrikethrough","LinkSimple","Code","ListBullets","ListNumbers","TextHOne","TextHTwo","TextHThree","Quotes","ArrowCounterClockwise","ArrowClockwise","React","styles","jsx","jsxs","Fragment","classes"],"mappings":"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"}
|
|
@@ -3,6 +3,16 @@ export type EditorFormat = 'bold' | 'italic' | 'strikethrough' | 'link' | 'code'
|
|
|
3
3
|
export type EditorSaveStatus = 'idle' | 'saving' | 'saved' | 'error';
|
|
4
4
|
export type EditorMode = 'rich' | 'markdown';
|
|
5
5
|
export type EditorSize = 'sm' | 'md' | 'lg';
|
|
6
|
+
export interface EditorToolbarIconRenderState {
|
|
7
|
+
format: EditorFormat;
|
|
8
|
+
active: boolean;
|
|
9
|
+
disabled: boolean;
|
|
10
|
+
readOnly: boolean;
|
|
11
|
+
isDisabled: boolean;
|
|
12
|
+
mode: EditorMode;
|
|
13
|
+
}
|
|
14
|
+
export type EditorToolbarIconSlot = React.ReactNode | ((state: EditorToolbarIconRenderState) => React.ReactNode);
|
|
15
|
+
export type EditorToolbarIcons = Partial<Record<EditorFormat, EditorToolbarIconSlot>>;
|
|
6
16
|
export interface EditorProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange' | 'defaultValue'> {
|
|
7
17
|
children?: React.ReactNode;
|
|
8
18
|
/** Controlled value */
|
|
@@ -23,14 +33,16 @@ export interface EditorProps extends Omit<React.HTMLAttributes<HTMLDivElement>,
|
|
|
23
33
|
toolbar?: boolean;
|
|
24
34
|
/** Show default status bar */
|
|
25
35
|
statusBar?: boolean;
|
|
26
|
-
/** Auto-save callback */
|
|
27
|
-
onAutoSave?: (value: string) => void
|
|
36
|
+
/** Auto-save callback (sync or async) */
|
|
37
|
+
onAutoSave?: (value: string) => void | Promise<void>;
|
|
28
38
|
/** Auto-save interval in ms */
|
|
29
39
|
autoSaveInterval?: number;
|
|
30
40
|
/** Editor size preset */
|
|
31
41
|
size?: EditorSize;
|
|
32
42
|
/** Maximum character count (shows indicator in status bar) */
|
|
33
43
|
maxLength?: number;
|
|
44
|
+
/** Custom toolbar icons keyed by format/action, for any icon package */
|
|
45
|
+
toolbarIcons?: EditorToolbarIcons;
|
|
34
46
|
}
|
|
35
47
|
export interface EditorToolbarProps {
|
|
36
48
|
children: React.ReactNode;
|
|
@@ -77,6 +89,7 @@ interface EditorContextValue {
|
|
|
77
89
|
mode: EditorMode;
|
|
78
90
|
size: EditorSize;
|
|
79
91
|
maxLength?: number;
|
|
92
|
+
toolbarIcons?: EditorToolbarIcons;
|
|
80
93
|
wordCount: number;
|
|
81
94
|
charCount: number;
|
|
82
95
|
toggleFormat: (f: EditorFormat) => void;
|
|
@@ -85,7 +98,7 @@ interface EditorContextValue {
|
|
|
85
98
|
contentRef: React.RefObject<HTMLTextAreaElement | null>;
|
|
86
99
|
}
|
|
87
100
|
declare function useEditorContext(): EditorContextValue;
|
|
88
|
-
declare function EditorRoot({ children, value: controlledValue, defaultValue, onValueChange, placeholder, disabled, readOnly, formats, toolbar, statusBar, onAutoSave, autoSaveInterval, size, maxLength, className, ...htmlProps }: EditorProps): import("react/jsx-runtime").JSX.Element;
|
|
101
|
+
declare function EditorRoot({ children, value: controlledValue, defaultValue, onValueChange, placeholder, disabled, readOnly, formats, toolbar, statusBar, onAutoSave, autoSaveInterval, size, maxLength, toolbarIcons, className, ...htmlProps }: EditorProps): import("react/jsx-runtime").JSX.Element;
|
|
89
102
|
declare function EditorToolbar({ children, className }: EditorToolbarProps): import("react/jsx-runtime").JSX.Element;
|
|
90
103
|
declare function EditorToolbarGroup({ children, 'aria-label': ariaLabel, className }: EditorToolbarGroupProps): import("react/jsx-runtime").JSX.Element;
|
|
91
104
|
declare function EditorToolbarButton({ format, className }: EditorToolbarButtonProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Editor/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAsD/B,MAAM,MAAM,YAAY,GACpB,MAAM,GAAG,QAAQ,GAAG,eAAe,GAAG,MAAM,GAAG,MAAM,GACrD,YAAY,GAAG,aAAa,GAC5B,UAAU,GAAG,UAAU,GAAG,UAAU,GACpC,YAAY,GACZ,MAAM,GAAG,MAAM,CAAC;AAEpB,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAC;AAErE,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,UAAU,CAAC;AAE7C,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE5C,MAAM,WAAW,WAAY,SAAQ,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,UAAU,GAAG,cAAc,CAAC;IAC1G,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,uBAAuB;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2CAA2C;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kCAAkC;IAClC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,uBAAuB;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yBAAyB;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,qBAAqB;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,mCAAmC;IACnC,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,2BAA2B;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,8BAA8B;IAC9B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Editor/index.tsx"],"names":[],"mappings":"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"}
|
|
@@ -180,6 +180,7 @@ function EditorRoot({
|
|
|
180
180
|
autoSaveInterval = 3e4,
|
|
181
181
|
size = "md",
|
|
182
182
|
maxLength,
|
|
183
|
+
toolbarIcons,
|
|
183
184
|
className,
|
|
184
185
|
...htmlProps
|
|
185
186
|
}) {
|
|
@@ -218,7 +219,7 @@ function EditorRoot({
|
|
|
218
219
|
"aria-multiline": "true"
|
|
219
220
|
}
|
|
220
221
|
},
|
|
221
|
-
content:
|
|
222
|
+
content: controlledValue !== void 0 ? controlledValue : defaultValue,
|
|
222
223
|
editable: !disabled && !readOnly,
|
|
223
224
|
onUpdate: ({ editor: e }) => {
|
|
224
225
|
const html = e.getHTML();
|
|
@@ -241,16 +242,29 @@ function EditorRoot({
|
|
|
241
242
|
}, [tiptapEditor, disabled, readOnly]);
|
|
242
243
|
React.useEffect(() => {
|
|
243
244
|
if (!onAutoSave || !value) return;
|
|
245
|
+
let cancelled = false;
|
|
244
246
|
const timer = setTimeout(() => {
|
|
245
247
|
setSaveStatus("saving");
|
|
246
248
|
try {
|
|
247
|
-
onAutoSave(value)
|
|
248
|
-
|
|
249
|
+
Promise.resolve(onAutoSave(value)).then(() => {
|
|
250
|
+
if (!cancelled) {
|
|
251
|
+
setSaveStatus("saved");
|
|
252
|
+
}
|
|
253
|
+
}).catch(() => {
|
|
254
|
+
if (!cancelled) {
|
|
255
|
+
setSaveStatus("error");
|
|
256
|
+
}
|
|
257
|
+
});
|
|
249
258
|
} catch {
|
|
250
|
-
|
|
259
|
+
if (!cancelled) {
|
|
260
|
+
setSaveStatus("error");
|
|
261
|
+
}
|
|
251
262
|
}
|
|
252
263
|
}, autoSaveInterval);
|
|
253
|
-
return () =>
|
|
264
|
+
return () => {
|
|
265
|
+
cancelled = true;
|
|
266
|
+
clearTimeout(timer);
|
|
267
|
+
};
|
|
254
268
|
}, [value, onAutoSave, autoSaveInterval]);
|
|
255
269
|
const toggleFormat = React.useCallback(
|
|
256
270
|
(format) => {
|
|
@@ -374,6 +388,7 @@ function EditorRoot({
|
|
|
374
388
|
mode,
|
|
375
389
|
size,
|
|
376
390
|
maxLength,
|
|
391
|
+
toolbarIcons,
|
|
377
392
|
wordCount,
|
|
378
393
|
charCount,
|
|
379
394
|
toggleFormat,
|
|
@@ -413,7 +428,7 @@ function EditorToolbarGroup({ children, "aria-label": ariaLabel, className }) {
|
|
|
413
428
|
return /* @__PURE__ */ jsx("div", { className: classes, role: "group", "aria-label": ariaLabel, children });
|
|
414
429
|
}
|
|
415
430
|
function EditorToolbarButton({ format, className }) {
|
|
416
|
-
const { toggleFormat, isFormatActive, disabled, readOnly, editor, mode } = useEditorContext();
|
|
431
|
+
const { toggleFormat, isFormatActive, disabled, readOnly, editor, mode, toolbarIcons } = useEditorContext();
|
|
417
432
|
const meta = FORMAT_META[format];
|
|
418
433
|
const isAction = ACTION_FORMATS.has(format);
|
|
419
434
|
const active = isAction ? false : isFormatActive(format);
|
|
@@ -426,6 +441,16 @@ function EditorToolbarButton({ format, className }) {
|
|
|
426
441
|
isDisabled = format === "undo" ? !editor.can().undo() : !editor.can().redo();
|
|
427
442
|
}
|
|
428
443
|
}
|
|
444
|
+
const iconState = {
|
|
445
|
+
format,
|
|
446
|
+
active,
|
|
447
|
+
disabled,
|
|
448
|
+
readOnly,
|
|
449
|
+
isDisabled,
|
|
450
|
+
mode
|
|
451
|
+
};
|
|
452
|
+
const iconOverride = toolbarIcons == null ? void 0 : toolbarIcons[format];
|
|
453
|
+
const renderedOverride = typeof iconOverride === "function" ? iconOverride(iconState) : iconOverride;
|
|
429
454
|
const classes = [
|
|
430
455
|
styles.toolbarButton,
|
|
431
456
|
active && styles.toolbarButtonActive,
|
|
@@ -441,7 +466,7 @@ function EditorToolbarButton({ format, className }) {
|
|
|
441
466
|
"aria-label": meta.label,
|
|
442
467
|
title: `${meta.label} (${meta.shortcut})`,
|
|
443
468
|
...isAction ? {} : { "aria-pressed": active },
|
|
444
|
-
children: /* @__PURE__ */ jsx(IconComponent, { size: 16, weight: active ? "bold" : "regular" })
|
|
469
|
+
children: iconOverride !== void 0 ? renderedOverride : /* @__PURE__ */ jsx(IconComponent, { size: 16, weight: active ? "bold" : "regular" })
|
|
445
470
|
}
|
|
446
471
|
);
|
|
447
472
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/components/Editor/index.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport styles from './Editor.module.scss';\nimport {\n TextB,\n TextItalic,\n TextStrikethrough,\n LinkSimple,\n Code,\n ListBullets,\n ListNumbers,\n TextHOne,\n TextHTwo,\n TextHThree,\n Quotes,\n ArrowCounterClockwise,\n ArrowClockwise,\n} from '@phosphor-icons/react';\nimport { KEYBOARD_SHORTCUTS } from '../../utils/keyboard-shortcuts';\n\n// ============================================\n// Lazy-loaded dependency (TipTap)\n// ============================================\n\nlet _useEditor: ((config: Record<string, unknown>) => unknown) | null = null;\nlet _EditorContent: React.ComponentType<Record<string, unknown>> | null = null;\nlet _StarterKit: unknown = null;\nlet _LinkExtension: unknown = null;\nlet _tiptapLoaded = false;\nlet _tiptapFailed = false;\n\nfunction loadTipTapDeps() {\n if (_tiptapLoaded) return;\n _tiptapLoaded = true;\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const tiptapReact = require('@tiptap/react');\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const starterKit = require('@tiptap/starter-kit');\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const linkExt = require('@tiptap/extension-link');\n\n _useEditor = tiptapReact.useEditor;\n _EditorContent = tiptapReact.EditorContent;\n _StarterKit = starterKit.default ?? starterKit.StarterKit ?? starterKit;\n _LinkExtension = linkExt.default ?? linkExt.Link ?? linkExt;\n } catch {\n _tiptapFailed = true;\n }\n}\n\n// ============================================\n// Types\n// ============================================\n\nexport type EditorFormat =\n | 'bold' | 'italic' | 'strikethrough' | 'link' | 'code'\n | 'bulletList' | 'orderedList'\n | 'heading1' | 'heading2' | 'heading3'\n | 'blockquote'\n | 'undo' | 'redo';\n\nexport type EditorSaveStatus = 'idle' | 'saving' | 'saved' | 'error';\n\nexport type EditorMode = 'rich' | 'markdown';\n\nexport type EditorSize = 'sm' | 'md' | 'lg';\n\nexport interface EditorProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange' | 'defaultValue'> {\n children?: React.ReactNode;\n /** Controlled value */\n value?: string;\n /** Default value for uncontrolled usage */\n defaultValue?: string;\n /** Called when content changes */\n onValueChange?: (value: string) => void;\n /** Placeholder text */\n placeholder?: string;\n /** Disable the editor */\n disabled?: boolean;\n /** Read-only mode */\n readOnly?: boolean;\n /** Which format buttons to show */\n formats?: EditorFormat[];\n /** Show default toolbar */\n toolbar?: boolean;\n /** Show default status bar */\n statusBar?: boolean;\n /** Auto-save callback */\n onAutoSave?: (value: string) => void;\n /** Auto-save interval in ms */\n autoSaveInterval?: number;\n /** Editor size preset */\n size?: EditorSize;\n /** Maximum character count (shows indicator in status bar) */\n maxLength?: number;\n}\n\nexport interface EditorToolbarProps {\n children: React.ReactNode;\n className?: string;\n}\n\nexport interface EditorToolbarGroupProps {\n children: React.ReactNode;\n 'aria-label'?: string;\n className?: string;\n}\n\nexport interface EditorToolbarButtonProps {\n /** Which format this button toggles */\n format: EditorFormat;\n className?: string;\n}\n\nexport interface EditorSeparatorProps {\n className?: string;\n}\n\nexport interface EditorStatusIndicatorProps {\n /** Override the save status from context */\n status?: EditorSaveStatus;\n /** Custom labels per status */\n labels?: Partial<Record<EditorSaveStatus, string>>;\n className?: string;\n}\n\nexport interface EditorContentProps {\n className?: string;\n}\n\nexport interface EditorStatusBarProps {\n /** Show word count */\n showWordCount?: boolean;\n /** Show character count */\n showCharCount?: boolean;\n className?: string;\n}\n\n// ============================================\n// Format metadata\n// ============================================\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst FORMAT_META: Record<EditorFormat, { icon: React.ComponentType<any>; label: string; shortcut: string }> = {\n bold: { icon: TextB, label: 'Bold', shortcut: KEYBOARD_SHORTCUTS.EDITOR_BOLD.label },\n italic: { icon: TextItalic, label: 'Italic', shortcut: KEYBOARD_SHORTCUTS.EDITOR_ITALIC.label },\n strikethrough: { icon: TextStrikethrough, label: 'Strikethrough', shortcut: KEYBOARD_SHORTCUTS.EDITOR_STRIKETHROUGH.label },\n link: { icon: LinkSimple, label: 'Link', shortcut: KEYBOARD_SHORTCUTS.EDITOR_LINK.label },\n code: { icon: Code, label: 'Code', shortcut: KEYBOARD_SHORTCUTS.EDITOR_CODE.label },\n bulletList: { icon: ListBullets, label: 'Bullet list', shortcut: KEYBOARD_SHORTCUTS.EDITOR_BULLET_LIST.label },\n orderedList: { icon: ListNumbers, label: 'Ordered list', shortcut: KEYBOARD_SHORTCUTS.EDITOR_ORDERED_LIST.label },\n heading1: { icon: TextHOne, label: 'Heading 1', shortcut: KEYBOARD_SHORTCUTS.EDITOR_HEADING1.label },\n heading2: { icon: TextHTwo, label: 'Heading 2', shortcut: KEYBOARD_SHORTCUTS.EDITOR_HEADING2.label },\n heading3: { icon: TextHThree, label: 'Heading 3', shortcut: KEYBOARD_SHORTCUTS.EDITOR_HEADING3.label },\n blockquote: { icon: Quotes, label: 'Blockquote', shortcut: KEYBOARD_SHORTCUTS.EDITOR_BLOCKQUOTE.label },\n undo: { icon: ArrowCounterClockwise, label: 'Undo', shortcut: KEYBOARD_SHORTCUTS.EDITOR_UNDO.label },\n redo: { icon: ArrowClockwise, label: 'Redo', shortcut: KEYBOARD_SHORTCUTS.EDITOR_REDO.label },\n};\n\nconst DEFAULT_FORMATS: EditorFormat[] = ['bold', 'italic', 'strikethrough', 'link', 'code', 'bulletList'];\n\n/** Formats that are actions (not toggles) — no aria-pressed, different disable logic */\nconst ACTION_FORMATS = new Set<EditorFormat>(['undo', 'redo']);\n\nconst DEFAULT_STATUS_LABELS: Record<EditorSaveStatus, string> = {\n idle: '',\n saving: 'SAVING...',\n saved: 'AUTO-SAVED',\n error: 'SAVE FAILED',\n};\n\n// ============================================\n// Markdown formatting helpers (textarea fallback)\n// ============================================\n\ninterface TextareaSelection {\n start: number;\n end: number;\n text: string;\n}\n\nfunction getSelection(textarea: HTMLTextAreaElement): TextareaSelection {\n return {\n start: textarea.selectionStart,\n end: textarea.selectionEnd,\n text: textarea.value.substring(textarea.selectionStart, textarea.selectionEnd),\n };\n}\n\nfunction wrapSelection(\n textarea: HTMLTextAreaElement,\n prefix: string,\n suffix: string,\n setValue: (v: string) => void,\n) {\n const sel = getSelection(textarea);\n const before = textarea.value.substring(0, sel.start);\n const after = textarea.value.substring(sel.end);\n const wrapped = `${prefix}${sel.text || 'text'}${suffix}`;\n const newValue = `${before}${wrapped}${after}`;\n setValue(newValue);\n\n requestAnimationFrame(() => {\n textarea.focus();\n const newStart = sel.start + prefix.length;\n const newEnd = newStart + (sel.text || 'text').length;\n textarea.setSelectionRange(newStart, newEnd);\n });\n}\n\nfunction applyMarkdownFormat(\n format: EditorFormat,\n textarea: HTMLTextAreaElement,\n setValue: (v: string) => void,\n) {\n switch (format) {\n case 'bold':\n wrapSelection(textarea, '**', '**', setValue);\n break;\n case 'italic':\n wrapSelection(textarea, '*', '*', setValue);\n break;\n case 'strikethrough':\n wrapSelection(textarea, '~~', '~~', setValue);\n break;\n case 'code':\n wrapSelection(textarea, '`', '`', setValue);\n break;\n case 'link': {\n const sel = getSelection(textarea);\n const linkText = sel.text || 'link text';\n const before = textarea.value.substring(0, sel.start);\n const after = textarea.value.substring(sel.end);\n const newValue = `${before}[${linkText}](url)${after}`;\n setValue(newValue);\n requestAnimationFrame(() => {\n textarea.focus();\n const urlStart = sel.start + linkText.length + 3;\n textarea.setSelectionRange(urlStart, urlStart + 3);\n });\n break;\n }\n case 'bulletList': {\n const sel = getSelection(textarea);\n const before = textarea.value.substring(0, sel.start);\n const after = textarea.value.substring(sel.end);\n const lines = (sel.text || 'item').split('\\n');\n const bulleted = lines.map((l) => `- ${l}`).join('\\n');\n const newValue = `${before}${bulleted}${after}`;\n setValue(newValue);\n break;\n }\n case 'orderedList': {\n const sel = getSelection(textarea);\n const before = textarea.value.substring(0, sel.start);\n const after = textarea.value.substring(sel.end);\n const lines = (sel.text || 'item').split('\\n');\n const numbered = lines.map((l, i) => `${i + 1}. ${l}`).join('\\n');\n const newValue = `${before}${numbered}${after}`;\n setValue(newValue);\n break;\n }\n case 'heading1':\n wrapSelection(textarea, '# ', '', setValue);\n break;\n case 'heading2':\n wrapSelection(textarea, '## ', '', setValue);\n break;\n case 'heading3':\n wrapSelection(textarea, '### ', '', setValue);\n break;\n case 'blockquote': {\n const sel = getSelection(textarea);\n const before = textarea.value.substring(0, sel.start);\n const after = textarea.value.substring(sel.end);\n const lines = (sel.text || 'quote').split('\\n');\n const quoted = lines.map((l) => `> ${l}`).join('\\n');\n const newValue = `${before}${quoted}${after}`;\n setValue(newValue);\n break;\n }\n case 'undo':\n case 'redo':\n // Undo/redo in textarea mode is handled natively by the browser\n break;\n }\n}\n\n// ============================================\n// Context\n// ============================================\n\ninterface EditorContextValue {\n value: string;\n setValue: (v: string) => void;\n placeholder: string;\n disabled: boolean;\n readOnly: boolean;\n formats: EditorFormat[];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n editor: any | null;\n mode: EditorMode;\n size: EditorSize;\n maxLength?: number;\n wordCount: number;\n charCount: number;\n toggleFormat: (f: EditorFormat) => void;\n isFormatActive: (f: EditorFormat) => boolean;\n saveStatus: EditorSaveStatus;\n contentRef: React.RefObject<HTMLTextAreaElement | null>;\n}\n\nconst EditorContext = React.createContext<EditorContextValue | null>(null);\n\nfunction useEditorContext() {\n const context = React.useContext(EditorContext);\n if (!context) {\n throw new Error('Editor compound components must be used within an Editor');\n }\n return context;\n}\n\n// ============================================\n// Hooks\n// ============================================\n\nfunction useControllableState<T>(\n controlledValue: T | undefined,\n defaultValue: T,\n onChange?: (value: T) => void,\n): [T, (value: T) => void] {\n const [uncontrolledValue, setUncontrolledValue] = React.useState(defaultValue);\n const isControlled = controlledValue !== undefined;\n const value = isControlled ? controlledValue : uncontrolledValue;\n\n const setValue = React.useCallback(\n (newValue: T) => {\n if (!isControlled) {\n setUncontrolledValue(newValue);\n }\n onChange?.(newValue);\n },\n [isControlled, onChange],\n );\n\n return [value, setValue];\n}\n\nfunction countWords(text: string): number {\n const trimmed = text.trim();\n if (!trimmed) return 0;\n return trimmed.split(/\\s+/).length;\n}\n\n// ============================================\n// Components\n// ============================================\n\nfunction EditorRoot({\n children,\n value: controlledValue,\n defaultValue = '',\n onValueChange,\n placeholder = 'Start typing...',\n disabled = false,\n readOnly = false,\n formats = DEFAULT_FORMATS,\n toolbar = true,\n statusBar = true,\n onAutoSave,\n autoSaveInterval = 30000,\n size = 'md',\n maxLength,\n className,\n ...htmlProps\n}: EditorProps) {\n const contentRef = React.useRef<HTMLTextAreaElement>(null);\n\n const [value, setValue] = useControllableState(\n controlledValue,\n defaultValue,\n onValueChange,\n );\n\n const [saveStatus, setSaveStatus] = React.useState<EditorSaveStatus>('idle');\n\n // Try loading TipTap\n loadTipTapDeps();\n const hasTipTap = !_tiptapFailed && _useEditor && _EditorContent && _StarterKit;\n const mode: EditorMode = hasTipTap ? 'rich' : 'markdown';\n\n // TipTap editor instance (only when available)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const tiptapEditor: any = hasTipTap\n ? // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (_useEditor as any)({\n extensions: [\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (_StarterKit as any).configure({\n heading: { levels: [1, 2, 3] },\n blockquote: {},\n codeBlock: false,\n horizontalRule: false,\n hardBreak: false,\n }),\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (_LinkExtension as any).configure({\n openOnClick: false,\n HTMLAttributes: { rel: 'noopener noreferrer', target: '_blank' },\n }),\n ],\n editorProps: {\n attributes: {\n role: 'textbox',\n 'aria-label': placeholder,\n 'aria-multiline': 'true',\n },\n },\n content: defaultValue || controlledValue || '',\n editable: !disabled && !readOnly,\n onUpdate: ({ editor: e }: { editor: { getHTML: () => string } }) => {\n const html = e.getHTML();\n setValue(html);\n },\n })\n : null;\n\n // Sync controlled value to TipTap\n React.useEffect(() => {\n if (tiptapEditor && controlledValue !== undefined) {\n const currentContent = tiptapEditor.getHTML();\n if (currentContent !== controlledValue) {\n tiptapEditor.commands.setContent(controlledValue, false);\n }\n }\n }, [controlledValue, tiptapEditor]);\n\n // Update editable state\n React.useEffect(() => {\n if (tiptapEditor) {\n tiptapEditor.setEditable(!disabled && !readOnly);\n }\n }, [tiptapEditor, disabled, readOnly]);\n\n // Auto-save\n React.useEffect(() => {\n if (!onAutoSave || !value) return;\n\n const timer = setTimeout(() => {\n setSaveStatus('saving');\n try {\n onAutoSave(value);\n setSaveStatus('saved');\n } catch {\n setSaveStatus('error');\n }\n }, autoSaveInterval);\n\n return () => clearTimeout(timer);\n }, [value, onAutoSave, autoSaveInterval]);\n\n const toggleFormat = React.useCallback(\n (format: EditorFormat) => {\n if (disabled || readOnly) return;\n\n if (tiptapEditor) {\n switch (format) {\n case 'bold':\n tiptapEditor.chain().focus().toggleBold().run();\n break;\n case 'italic':\n tiptapEditor.chain().focus().toggleItalic().run();\n break;\n case 'strikethrough':\n tiptapEditor.chain().focus().toggleStrike().run();\n break;\n case 'code':\n tiptapEditor.chain().focus().toggleCode().run();\n break;\n case 'bulletList':\n tiptapEditor.chain().focus().toggleBulletList().run();\n break;\n case 'orderedList':\n tiptapEditor.chain().focus().toggleOrderedList().run();\n break;\n case 'heading1':\n tiptapEditor.chain().focus().toggleHeading({ level: 1 }).run();\n break;\n case 'heading2':\n tiptapEditor.chain().focus().toggleHeading({ level: 2 }).run();\n break;\n case 'heading3':\n tiptapEditor.chain().focus().toggleHeading({ level: 3 }).run();\n break;\n case 'blockquote':\n tiptapEditor.chain().focus().toggleBlockquote().run();\n break;\n case 'undo':\n tiptapEditor.chain().focus().undo().run();\n break;\n case 'redo':\n tiptapEditor.chain().focus().redo().run();\n break;\n case 'link': {\n const previousUrl = tiptapEditor.getAttributes('link').href;\n if (previousUrl) {\n tiptapEditor.chain().focus().unsetLink().run();\n } else {\n const url = window.prompt('Enter URL');\n if (url) {\n tiptapEditor.chain().focus().setLink({ href: url }).run();\n }\n }\n break;\n }\n }\n } else if (contentRef.current) {\n applyMarkdownFormat(format, contentRef.current, setValue);\n }\n },\n [disabled, readOnly, tiptapEditor, setValue],\n );\n\n const isFormatActive = React.useCallback(\n (format: EditorFormat): boolean => {\n if (!tiptapEditor) return false;\n switch (format) {\n case 'bold':\n return tiptapEditor.isActive('bold');\n case 'italic':\n return tiptapEditor.isActive('italic');\n case 'strikethrough':\n return tiptapEditor.isActive('strike');\n case 'code':\n return tiptapEditor.isActive('code');\n case 'bulletList':\n return tiptapEditor.isActive('bulletList');\n case 'orderedList':\n return tiptapEditor.isActive('orderedList');\n case 'heading1':\n return tiptapEditor.isActive('heading', { level: 1 });\n case 'heading2':\n return tiptapEditor.isActive('heading', { level: 2 });\n case 'heading3':\n return tiptapEditor.isActive('heading', { level: 3 });\n case 'blockquote':\n return tiptapEditor.isActive('blockquote');\n case 'link':\n return tiptapEditor.isActive('link');\n case 'undo':\n case 'redo':\n return false; // Actions don't have active state\n default:\n return false;\n }\n },\n [tiptapEditor],\n );\n\n const wordCount = React.useMemo(() => {\n if (tiptapEditor) {\n const text = tiptapEditor.getText?.() ?? '';\n return countWords(text);\n }\n return countWords(value);\n }, [value, tiptapEditor]);\n\n const charCount = React.useMemo(() => {\n if (tiptapEditor) {\n return (tiptapEditor.getText?.() ?? '').length;\n }\n return value.length;\n }, [value, tiptapEditor]);\n\n const contextValue: EditorContextValue = {\n value,\n setValue,\n placeholder,\n disabled,\n readOnly,\n formats,\n editor: tiptapEditor,\n mode,\n size,\n maxLength,\n wordCount,\n charCount,\n toggleFormat,\n isFormatActive,\n saveStatus,\n contentRef,\n };\n\n const classes = [\n styles.editor,\n disabled && styles.disabled,\n readOnly && styles.readOnly,\n className,\n ].filter(Boolean).join(' ');\n\n const hasCustomChildren = children !== undefined;\n\n return (\n <EditorContext.Provider value={contextValue}>\n <div\n {...htmlProps}\n className={classes}\n data-disabled={disabled || undefined}\n data-readonly={readOnly || undefined}\n data-size={size}\n >\n {hasCustomChildren ? (\n children\n ) : (\n <>\n {toolbar && (\n <EditorToolbar>\n <EditorToolbarGroup aria-label=\"Text formatting\">\n {formats.map((f) => (\n <EditorToolbarButton key={f} format={f} />\n ))}\n </EditorToolbarGroup>\n </EditorToolbar>\n )}\n <EditorContentArea />\n {statusBar && <EditorStatusBar showWordCount showCharCount />}\n </>\n )}\n </div>\n </EditorContext.Provider>\n );\n}\n\nfunction EditorToolbar({ children, className }: EditorToolbarProps) {\n const classes = [styles.toolbar, className].filter(Boolean).join(' ');\n return (\n <div className={classes} role=\"toolbar\" aria-label=\"Editor formatting\">\n {children}\n </div>\n );\n}\n\nfunction EditorToolbarGroup({ children, 'aria-label': ariaLabel, className }: EditorToolbarGroupProps) {\n const classes = [styles.toolbarGroup, className].filter(Boolean).join(' ');\n return (\n <div className={classes} role=\"group\" aria-label={ariaLabel}>\n {children}\n </div>\n );\n}\n\nfunction EditorToolbarButton({ format, className }: EditorToolbarButtonProps) {\n const { toggleFormat, isFormatActive, disabled, readOnly, editor, mode } = useEditorContext();\n const meta = FORMAT_META[format];\n const isAction = ACTION_FORMATS.has(format);\n const active = isAction ? false : isFormatActive(format);\n const IconComponent = meta.icon;\n\n // Action buttons (undo/redo) have special disable logic\n let isDisabled = disabled || readOnly;\n if (isAction && !isDisabled) {\n if (mode === 'markdown') {\n // Undo/redo in textarea mode is handled natively by the browser\n isDisabled = true;\n } else if (editor) {\n isDisabled = format === 'undo' ? !editor.can().undo() : !editor.can().redo();\n }\n }\n\n const classes = [\n styles.toolbarButton,\n active && styles.toolbarButtonActive,\n className,\n ].filter(Boolean).join(' ');\n\n return (\n <button\n type=\"button\"\n className={classes}\n onClick={() => toggleFormat(format)}\n disabled={isDisabled}\n aria-label={meta.label}\n title={`${meta.label} (${meta.shortcut})`}\n {...(isAction ? {} : { 'aria-pressed': active })}\n >\n <IconComponent size={16} weight={active ? 'bold' : 'regular'} />\n </button>\n );\n}\n\nfunction EditorSeparator({ className }: EditorSeparatorProps) {\n const classes = [styles.separator, className].filter(Boolean).join(' ');\n return <div className={classes} role=\"separator\" aria-orientation=\"vertical\" />;\n}\n\nfunction EditorStatusIndicator({ status: statusOverride, labels, className }: EditorStatusIndicatorProps) {\n const { saveStatus } = useEditorContext();\n const status = statusOverride ?? saveStatus;\n const mergedLabels = { ...DEFAULT_STATUS_LABELS, ...labels };\n const label = mergedLabels[status];\n\n if (!label) return null;\n\n const classes = [\n styles.statusIndicator,\n status === 'error' && styles.statusError,\n className,\n ].filter(Boolean).join(' ');\n\n return (\n <span className={classes} aria-live=\"polite\" role=\"status\">\n {label}\n </span>\n );\n}\n\nfunction EditorContentArea({ className }: EditorContentProps) {\n const { value, setValue, placeholder, disabled, readOnly, editor, mode, contentRef } =\n useEditorContext();\n\n if (mode === 'rich' && editor && _EditorContent) {\n const TipTapContent = _EditorContent;\n const classes = [styles.content, styles.contentRich, className].filter(Boolean).join(' ');\n return (\n <div className={classes} data-placeholder={placeholder}>\n <TipTapContent editor={editor} />\n </div>\n );\n }\n\n // Textarea fallback for markdown mode\n const classes = [styles.content, className].filter(Boolean).join(' ');\n return (\n <div className={classes}>\n <textarea\n ref={contentRef}\n className={styles.contentTextarea}\n value={value}\n onChange={(e) => setValue(e.target.value)}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n aria-label={placeholder}\n />\n </div>\n );\n}\n\nfunction EditorStatusBar({ showWordCount = true, showCharCount = true, className }: EditorStatusBarProps) {\n const { wordCount, charCount, maxLength } = useEditorContext();\n\n const classes = [styles.statusBar, className].filter(Boolean).join(' ');\n\n const isOverLimit = maxLength !== undefined && charCount > maxLength;\n const isNearLimit = maxLength !== undefined && !isOverLimit && charCount >= maxLength * 0.9;\n\n const charLimitClasses = [\n styles.statusBarItem,\n isNearLimit && styles.statusBarItemWarning,\n isOverLimit && styles.statusBarItemError,\n ].filter(Boolean).join(' ');\n\n return (\n <div className={classes} aria-label=\"Editor statistics\">\n <div className={styles.statusBarLeft} />\n <div className={styles.statusBarRight}>\n {showWordCount && (\n <span className={styles.statusBarItem}>\n {wordCount} {wordCount === 1 ? 'Word' : 'Words'}\n </span>\n )}\n {showWordCount && showCharCount && (\n <EditorSeparator />\n )}\n {showCharCount && (\n <span className={charLimitClasses}>\n {maxLength !== undefined\n ? `${charCount} / ${maxLength}`\n : `${charCount} ${charCount === 1 ? 'Character' : 'Characters'}`\n }\n </span>\n )}\n </div>\n </div>\n );\n}\n\n// ============================================\n// Export compound component\n// ============================================\n\nexport const Editor = Object.assign(EditorRoot, {\n Toolbar: EditorToolbar,\n ToolbarGroup: EditorToolbarGroup,\n ToolbarButton: EditorToolbarButton,\n Separator: EditorSeparator,\n StatusIndicator: EditorStatusIndicator,\n Content: EditorContentArea,\n StatusBar: EditorStatusBar,\n});\n\nexport {\n EditorRoot,\n EditorToolbar,\n EditorToolbarGroup,\n EditorToolbarButton,\n EditorSeparator,\n EditorStatusIndicator,\n EditorContentArea,\n EditorStatusBar,\n};\n\nexport { useEditorContext };\n"],"names":["classes"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/Editor/index.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport styles from './Editor.module.scss';\nimport {\n TextB,\n TextItalic,\n TextStrikethrough,\n LinkSimple,\n Code,\n ListBullets,\n ListNumbers,\n TextHOne,\n TextHTwo,\n TextHThree,\n Quotes,\n ArrowCounterClockwise,\n ArrowClockwise,\n} from '@phosphor-icons/react';\nimport { KEYBOARD_SHORTCUTS } from '../../utils/keyboard-shortcuts';\n\n// ============================================\n// Lazy-loaded dependency (TipTap)\n// ============================================\n\nlet _useEditor: ((config: Record<string, unknown>) => unknown) | null = null;\nlet _EditorContent: React.ComponentType<Record<string, unknown>> | null = null;\nlet _StarterKit: unknown = null;\nlet _LinkExtension: unknown = null;\nlet _tiptapLoaded = false;\nlet _tiptapFailed = false;\n\nfunction loadTipTapDeps() {\n if (_tiptapLoaded) return;\n _tiptapLoaded = true;\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const tiptapReact = require('@tiptap/react');\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const starterKit = require('@tiptap/starter-kit');\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const linkExt = require('@tiptap/extension-link');\n\n _useEditor = tiptapReact.useEditor;\n _EditorContent = tiptapReact.EditorContent;\n _StarterKit = starterKit.default ?? starterKit.StarterKit ?? starterKit;\n _LinkExtension = linkExt.default ?? linkExt.Link ?? linkExt;\n } catch {\n _tiptapFailed = true;\n }\n}\n\n// ============================================\n// Types\n// ============================================\n\nexport type EditorFormat =\n | 'bold' | 'italic' | 'strikethrough' | 'link' | 'code'\n | 'bulletList' | 'orderedList'\n | 'heading1' | 'heading2' | 'heading3'\n | 'blockquote'\n | 'undo' | 'redo';\n\nexport type EditorSaveStatus = 'idle' | 'saving' | 'saved' | 'error';\n\nexport type EditorMode = 'rich' | 'markdown';\n\nexport type EditorSize = 'sm' | 'md' | 'lg';\n\nexport interface EditorToolbarIconRenderState {\n format: EditorFormat;\n active: boolean;\n disabled: boolean;\n readOnly: boolean;\n isDisabled: boolean;\n mode: EditorMode;\n}\n\nexport type EditorToolbarIconSlot =\n | React.ReactNode\n | ((state: EditorToolbarIconRenderState) => React.ReactNode);\n\nexport type EditorToolbarIcons = Partial<Record<EditorFormat, EditorToolbarIconSlot>>;\n\nexport interface EditorProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange' | 'defaultValue'> {\n children?: React.ReactNode;\n /** Controlled value */\n value?: string;\n /** Default value for uncontrolled usage */\n defaultValue?: string;\n /** Called when content changes */\n onValueChange?: (value: string) => void;\n /** Placeholder text */\n placeholder?: string;\n /** Disable the editor */\n disabled?: boolean;\n /** Read-only mode */\n readOnly?: boolean;\n /** Which format buttons to show */\n formats?: EditorFormat[];\n /** Show default toolbar */\n toolbar?: boolean;\n /** Show default status bar */\n statusBar?: boolean;\n /** Auto-save callback (sync or async) */\n onAutoSave?: (value: string) => void | Promise<void>;\n /** Auto-save interval in ms */\n autoSaveInterval?: number;\n /** Editor size preset */\n size?: EditorSize;\n /** Maximum character count (shows indicator in status bar) */\n maxLength?: number;\n /** Custom toolbar icons keyed by format/action, for any icon package */\n toolbarIcons?: EditorToolbarIcons;\n}\n\nexport interface EditorToolbarProps {\n children: React.ReactNode;\n className?: string;\n}\n\nexport interface EditorToolbarGroupProps {\n children: React.ReactNode;\n 'aria-label'?: string;\n className?: string;\n}\n\nexport interface EditorToolbarButtonProps {\n /** Which format this button toggles */\n format: EditorFormat;\n className?: string;\n}\n\nexport interface EditorSeparatorProps {\n className?: string;\n}\n\nexport interface EditorStatusIndicatorProps {\n /** Override the save status from context */\n status?: EditorSaveStatus;\n /** Custom labels per status */\n labels?: Partial<Record<EditorSaveStatus, string>>;\n className?: string;\n}\n\nexport interface EditorContentProps {\n className?: string;\n}\n\nexport interface EditorStatusBarProps {\n /** Show word count */\n showWordCount?: boolean;\n /** Show character count */\n showCharCount?: boolean;\n className?: string;\n}\n\n// ============================================\n// Format metadata\n// ============================================\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst FORMAT_META: Record<EditorFormat, { icon: React.ComponentType<any>; label: string; shortcut: string }> = {\n bold: { icon: TextB, label: 'Bold', shortcut: KEYBOARD_SHORTCUTS.EDITOR_BOLD.label },\n italic: { icon: TextItalic, label: 'Italic', shortcut: KEYBOARD_SHORTCUTS.EDITOR_ITALIC.label },\n strikethrough: { icon: TextStrikethrough, label: 'Strikethrough', shortcut: KEYBOARD_SHORTCUTS.EDITOR_STRIKETHROUGH.label },\n link: { icon: LinkSimple, label: 'Link', shortcut: KEYBOARD_SHORTCUTS.EDITOR_LINK.label },\n code: { icon: Code, label: 'Code', shortcut: KEYBOARD_SHORTCUTS.EDITOR_CODE.label },\n bulletList: { icon: ListBullets, label: 'Bullet list', shortcut: KEYBOARD_SHORTCUTS.EDITOR_BULLET_LIST.label },\n orderedList: { icon: ListNumbers, label: 'Ordered list', shortcut: KEYBOARD_SHORTCUTS.EDITOR_ORDERED_LIST.label },\n heading1: { icon: TextHOne, label: 'Heading 1', shortcut: KEYBOARD_SHORTCUTS.EDITOR_HEADING1.label },\n heading2: { icon: TextHTwo, label: 'Heading 2', shortcut: KEYBOARD_SHORTCUTS.EDITOR_HEADING2.label },\n heading3: { icon: TextHThree, label: 'Heading 3', shortcut: KEYBOARD_SHORTCUTS.EDITOR_HEADING3.label },\n blockquote: { icon: Quotes, label: 'Blockquote', shortcut: KEYBOARD_SHORTCUTS.EDITOR_BLOCKQUOTE.label },\n undo: { icon: ArrowCounterClockwise, label: 'Undo', shortcut: KEYBOARD_SHORTCUTS.EDITOR_UNDO.label },\n redo: { icon: ArrowClockwise, label: 'Redo', shortcut: KEYBOARD_SHORTCUTS.EDITOR_REDO.label },\n};\n\nconst DEFAULT_FORMATS: EditorFormat[] = ['bold', 'italic', 'strikethrough', 'link', 'code', 'bulletList'];\n\n/** Formats that are actions (not toggles) — no aria-pressed, different disable logic */\nconst ACTION_FORMATS = new Set<EditorFormat>(['undo', 'redo']);\n\nconst DEFAULT_STATUS_LABELS: Record<EditorSaveStatus, string> = {\n idle: '',\n saving: 'SAVING...',\n saved: 'AUTO-SAVED',\n error: 'SAVE FAILED',\n};\n\n// ============================================\n// Markdown formatting helpers (textarea fallback)\n// ============================================\n\ninterface TextareaSelection {\n start: number;\n end: number;\n text: string;\n}\n\nfunction getSelection(textarea: HTMLTextAreaElement): TextareaSelection {\n return {\n start: textarea.selectionStart,\n end: textarea.selectionEnd,\n text: textarea.value.substring(textarea.selectionStart, textarea.selectionEnd),\n };\n}\n\nfunction wrapSelection(\n textarea: HTMLTextAreaElement,\n prefix: string,\n suffix: string,\n setValue: (v: string) => void,\n) {\n const sel = getSelection(textarea);\n const before = textarea.value.substring(0, sel.start);\n const after = textarea.value.substring(sel.end);\n const wrapped = `${prefix}${sel.text || 'text'}${suffix}`;\n const newValue = `${before}${wrapped}${after}`;\n setValue(newValue);\n\n requestAnimationFrame(() => {\n textarea.focus();\n const newStart = sel.start + prefix.length;\n const newEnd = newStart + (sel.text || 'text').length;\n textarea.setSelectionRange(newStart, newEnd);\n });\n}\n\nfunction applyMarkdownFormat(\n format: EditorFormat,\n textarea: HTMLTextAreaElement,\n setValue: (v: string) => void,\n) {\n switch (format) {\n case 'bold':\n wrapSelection(textarea, '**', '**', setValue);\n break;\n case 'italic':\n wrapSelection(textarea, '*', '*', setValue);\n break;\n case 'strikethrough':\n wrapSelection(textarea, '~~', '~~', setValue);\n break;\n case 'code':\n wrapSelection(textarea, '`', '`', setValue);\n break;\n case 'link': {\n const sel = getSelection(textarea);\n const linkText = sel.text || 'link text';\n const before = textarea.value.substring(0, sel.start);\n const after = textarea.value.substring(sel.end);\n const newValue = `${before}[${linkText}](url)${after}`;\n setValue(newValue);\n requestAnimationFrame(() => {\n textarea.focus();\n const urlStart = sel.start + linkText.length + 3;\n textarea.setSelectionRange(urlStart, urlStart + 3);\n });\n break;\n }\n case 'bulletList': {\n const sel = getSelection(textarea);\n const before = textarea.value.substring(0, sel.start);\n const after = textarea.value.substring(sel.end);\n const lines = (sel.text || 'item').split('\\n');\n const bulleted = lines.map((l) => `- ${l}`).join('\\n');\n const newValue = `${before}${bulleted}${after}`;\n setValue(newValue);\n break;\n }\n case 'orderedList': {\n const sel = getSelection(textarea);\n const before = textarea.value.substring(0, sel.start);\n const after = textarea.value.substring(sel.end);\n const lines = (sel.text || 'item').split('\\n');\n const numbered = lines.map((l, i) => `${i + 1}. ${l}`).join('\\n');\n const newValue = `${before}${numbered}${after}`;\n setValue(newValue);\n break;\n }\n case 'heading1':\n wrapSelection(textarea, '# ', '', setValue);\n break;\n case 'heading2':\n wrapSelection(textarea, '## ', '', setValue);\n break;\n case 'heading3':\n wrapSelection(textarea, '### ', '', setValue);\n break;\n case 'blockquote': {\n const sel = getSelection(textarea);\n const before = textarea.value.substring(0, sel.start);\n const after = textarea.value.substring(sel.end);\n const lines = (sel.text || 'quote').split('\\n');\n const quoted = lines.map((l) => `> ${l}`).join('\\n');\n const newValue = `${before}${quoted}${after}`;\n setValue(newValue);\n break;\n }\n case 'undo':\n case 'redo':\n // Undo/redo in textarea mode is handled natively by the browser\n break;\n }\n}\n\n// ============================================\n// Context\n// ============================================\n\ninterface EditorContextValue {\n value: string;\n setValue: (v: string) => void;\n placeholder: string;\n disabled: boolean;\n readOnly: boolean;\n formats: EditorFormat[];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n editor: any | null;\n mode: EditorMode;\n size: EditorSize;\n maxLength?: number;\n toolbarIcons?: EditorToolbarIcons;\n wordCount: number;\n charCount: number;\n toggleFormat: (f: EditorFormat) => void;\n isFormatActive: (f: EditorFormat) => boolean;\n saveStatus: EditorSaveStatus;\n contentRef: React.RefObject<HTMLTextAreaElement | null>;\n}\n\nconst EditorContext = React.createContext<EditorContextValue | null>(null);\n\nfunction useEditorContext() {\n const context = React.useContext(EditorContext);\n if (!context) {\n throw new Error('Editor compound components must be used within an Editor');\n }\n return context;\n}\n\n// ============================================\n// Hooks\n// ============================================\n\nfunction useControllableState<T>(\n controlledValue: T | undefined,\n defaultValue: T,\n onChange?: (value: T) => void,\n): [T, (value: T) => void] {\n const [uncontrolledValue, setUncontrolledValue] = React.useState(defaultValue);\n const isControlled = controlledValue !== undefined;\n const value = isControlled ? controlledValue : uncontrolledValue;\n\n const setValue = React.useCallback(\n (newValue: T) => {\n if (!isControlled) {\n setUncontrolledValue(newValue);\n }\n onChange?.(newValue);\n },\n [isControlled, onChange],\n );\n\n return [value, setValue];\n}\n\nfunction countWords(text: string): number {\n const trimmed = text.trim();\n if (!trimmed) return 0;\n return trimmed.split(/\\s+/).length;\n}\n\n// ============================================\n// Components\n// ============================================\n\nfunction EditorRoot({\n children,\n value: controlledValue,\n defaultValue = '',\n onValueChange,\n placeholder = 'Start typing...',\n disabled = false,\n readOnly = false,\n formats = DEFAULT_FORMATS,\n toolbar = true,\n statusBar = true,\n onAutoSave,\n autoSaveInterval = 30000,\n size = 'md',\n maxLength,\n toolbarIcons,\n className,\n ...htmlProps\n}: EditorProps) {\n const contentRef = React.useRef<HTMLTextAreaElement>(null);\n\n const [value, setValue] = useControllableState(\n controlledValue,\n defaultValue,\n onValueChange,\n );\n\n const [saveStatus, setSaveStatus] = React.useState<EditorSaveStatus>('idle');\n\n // Try loading TipTap\n loadTipTapDeps();\n const hasTipTap = !_tiptapFailed && _useEditor && _EditorContent && _StarterKit;\n const mode: EditorMode = hasTipTap ? 'rich' : 'markdown';\n\n // TipTap editor instance (only when available)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const tiptapEditor: any = hasTipTap\n ? // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (_useEditor as any)({\n extensions: [\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (_StarterKit as any).configure({\n heading: { levels: [1, 2, 3] },\n blockquote: {},\n codeBlock: false,\n horizontalRule: false,\n hardBreak: false,\n }),\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (_LinkExtension as any).configure({\n openOnClick: false,\n HTMLAttributes: { rel: 'noopener noreferrer', target: '_blank' },\n }),\n ],\n editorProps: {\n attributes: {\n role: 'textbox',\n 'aria-label': placeholder,\n 'aria-multiline': 'true',\n },\n },\n content: controlledValue !== undefined ? controlledValue : defaultValue,\n editable: !disabled && !readOnly,\n onUpdate: ({ editor: e }: { editor: { getHTML: () => string } }) => {\n const html = e.getHTML();\n setValue(html);\n },\n })\n : null;\n\n // Sync controlled value to TipTap\n React.useEffect(() => {\n if (tiptapEditor && controlledValue !== undefined) {\n const currentContent = tiptapEditor.getHTML();\n if (currentContent !== controlledValue) {\n tiptapEditor.commands.setContent(controlledValue, false);\n }\n }\n }, [controlledValue, tiptapEditor]);\n\n // Update editable state\n React.useEffect(() => {\n if (tiptapEditor) {\n tiptapEditor.setEditable(!disabled && !readOnly);\n }\n }, [tiptapEditor, disabled, readOnly]);\n\n // Auto-save\n React.useEffect(() => {\n if (!onAutoSave || !value) return;\n\n let cancelled = false;\n const timer = setTimeout(() => {\n setSaveStatus('saving');\n try {\n Promise.resolve(onAutoSave(value))\n .then(() => {\n if (!cancelled) {\n setSaveStatus('saved');\n }\n })\n .catch(() => {\n if (!cancelled) {\n setSaveStatus('error');\n }\n });\n } catch {\n if (!cancelled) {\n setSaveStatus('error');\n }\n }\n }, autoSaveInterval);\n\n return () => {\n cancelled = true;\n clearTimeout(timer);\n };\n }, [value, onAutoSave, autoSaveInterval]);\n\n const toggleFormat = React.useCallback(\n (format: EditorFormat) => {\n if (disabled || readOnly) return;\n\n if (tiptapEditor) {\n switch (format) {\n case 'bold':\n tiptapEditor.chain().focus().toggleBold().run();\n break;\n case 'italic':\n tiptapEditor.chain().focus().toggleItalic().run();\n break;\n case 'strikethrough':\n tiptapEditor.chain().focus().toggleStrike().run();\n break;\n case 'code':\n tiptapEditor.chain().focus().toggleCode().run();\n break;\n case 'bulletList':\n tiptapEditor.chain().focus().toggleBulletList().run();\n break;\n case 'orderedList':\n tiptapEditor.chain().focus().toggleOrderedList().run();\n break;\n case 'heading1':\n tiptapEditor.chain().focus().toggleHeading({ level: 1 }).run();\n break;\n case 'heading2':\n tiptapEditor.chain().focus().toggleHeading({ level: 2 }).run();\n break;\n case 'heading3':\n tiptapEditor.chain().focus().toggleHeading({ level: 3 }).run();\n break;\n case 'blockquote':\n tiptapEditor.chain().focus().toggleBlockquote().run();\n break;\n case 'undo':\n tiptapEditor.chain().focus().undo().run();\n break;\n case 'redo':\n tiptapEditor.chain().focus().redo().run();\n break;\n case 'link': {\n const previousUrl = tiptapEditor.getAttributes('link').href;\n if (previousUrl) {\n tiptapEditor.chain().focus().unsetLink().run();\n } else {\n const url = window.prompt('Enter URL');\n if (url) {\n tiptapEditor.chain().focus().setLink({ href: url }).run();\n }\n }\n break;\n }\n }\n } else if (contentRef.current) {\n applyMarkdownFormat(format, contentRef.current, setValue);\n }\n },\n [disabled, readOnly, tiptapEditor, setValue],\n );\n\n const isFormatActive = React.useCallback(\n (format: EditorFormat): boolean => {\n if (!tiptapEditor) return false;\n switch (format) {\n case 'bold':\n return tiptapEditor.isActive('bold');\n case 'italic':\n return tiptapEditor.isActive('italic');\n case 'strikethrough':\n return tiptapEditor.isActive('strike');\n case 'code':\n return tiptapEditor.isActive('code');\n case 'bulletList':\n return tiptapEditor.isActive('bulletList');\n case 'orderedList':\n return tiptapEditor.isActive('orderedList');\n case 'heading1':\n return tiptapEditor.isActive('heading', { level: 1 });\n case 'heading2':\n return tiptapEditor.isActive('heading', { level: 2 });\n case 'heading3':\n return tiptapEditor.isActive('heading', { level: 3 });\n case 'blockquote':\n return tiptapEditor.isActive('blockquote');\n case 'link':\n return tiptapEditor.isActive('link');\n case 'undo':\n case 'redo':\n return false; // Actions don't have active state\n default:\n return false;\n }\n },\n [tiptapEditor],\n );\n\n const wordCount = React.useMemo(() => {\n if (tiptapEditor) {\n const text = tiptapEditor.getText?.() ?? '';\n return countWords(text);\n }\n return countWords(value);\n }, [value, tiptapEditor]);\n\n const charCount = React.useMemo(() => {\n if (tiptapEditor) {\n return (tiptapEditor.getText?.() ?? '').length;\n }\n return value.length;\n }, [value, tiptapEditor]);\n\n const contextValue: EditorContextValue = {\n value,\n setValue,\n placeholder,\n disabled,\n readOnly,\n formats,\n editor: tiptapEditor,\n mode,\n size,\n maxLength,\n toolbarIcons,\n wordCount,\n charCount,\n toggleFormat,\n isFormatActive,\n saveStatus,\n contentRef,\n };\n\n const classes = [\n styles.editor,\n disabled && styles.disabled,\n readOnly && styles.readOnly,\n className,\n ].filter(Boolean).join(' ');\n\n const hasCustomChildren = children !== undefined;\n\n return (\n <EditorContext.Provider value={contextValue}>\n <div\n {...htmlProps}\n className={classes}\n data-disabled={disabled || undefined}\n data-readonly={readOnly || undefined}\n data-size={size}\n >\n {hasCustomChildren ? (\n children\n ) : (\n <>\n {toolbar && (\n <EditorToolbar>\n <EditorToolbarGroup aria-label=\"Text formatting\">\n {formats.map((f) => (\n <EditorToolbarButton key={f} format={f} />\n ))}\n </EditorToolbarGroup>\n </EditorToolbar>\n )}\n <EditorContentArea />\n {statusBar && <EditorStatusBar showWordCount showCharCount />}\n </>\n )}\n </div>\n </EditorContext.Provider>\n );\n}\n\nfunction EditorToolbar({ children, className }: EditorToolbarProps) {\n const classes = [styles.toolbar, className].filter(Boolean).join(' ');\n return (\n <div className={classes} role=\"toolbar\" aria-label=\"Editor formatting\">\n {children}\n </div>\n );\n}\n\nfunction EditorToolbarGroup({ children, 'aria-label': ariaLabel, className }: EditorToolbarGroupProps) {\n const classes = [styles.toolbarGroup, className].filter(Boolean).join(' ');\n return (\n <div className={classes} role=\"group\" aria-label={ariaLabel}>\n {children}\n </div>\n );\n}\n\nfunction EditorToolbarButton({ format, className }: EditorToolbarButtonProps) {\n const { toggleFormat, isFormatActive, disabled, readOnly, editor, mode, toolbarIcons } = useEditorContext();\n const meta = FORMAT_META[format];\n const isAction = ACTION_FORMATS.has(format);\n const active = isAction ? false : isFormatActive(format);\n const IconComponent = meta.icon;\n\n // Action buttons (undo/redo) have special disable logic\n let isDisabled = disabled || readOnly;\n if (isAction && !isDisabled) {\n if (mode === 'markdown') {\n // Undo/redo in textarea mode is handled natively by the browser\n isDisabled = true;\n } else if (editor) {\n isDisabled = format === 'undo' ? !editor.can().undo() : !editor.can().redo();\n }\n }\n\n const iconState: EditorToolbarIconRenderState = {\n format,\n active,\n disabled,\n readOnly,\n isDisabled,\n mode,\n };\n\n const iconOverride = toolbarIcons?.[format];\n const renderedOverride = typeof iconOverride === 'function'\n ? iconOverride(iconState)\n : iconOverride;\n\n const classes = [\n styles.toolbarButton,\n active && styles.toolbarButtonActive,\n className,\n ].filter(Boolean).join(' ');\n\n return (\n <button\n type=\"button\"\n className={classes}\n onClick={() => toggleFormat(format)}\n disabled={isDisabled}\n aria-label={meta.label}\n title={`${meta.label} (${meta.shortcut})`}\n {...(isAction ? {} : { 'aria-pressed': active })}\n >\n {iconOverride !== undefined\n ? renderedOverride\n : <IconComponent size={16} weight={active ? 'bold' : 'regular'} />}\n </button>\n );\n}\n\nfunction EditorSeparator({ className }: EditorSeparatorProps) {\n const classes = [styles.separator, className].filter(Boolean).join(' ');\n return <div className={classes} role=\"separator\" aria-orientation=\"vertical\" />;\n}\n\nfunction EditorStatusIndicator({ status: statusOverride, labels, className }: EditorStatusIndicatorProps) {\n const { saveStatus } = useEditorContext();\n const status = statusOverride ?? saveStatus;\n const mergedLabels = { ...DEFAULT_STATUS_LABELS, ...labels };\n const label = mergedLabels[status];\n\n if (!label) return null;\n\n const classes = [\n styles.statusIndicator,\n status === 'error' && styles.statusError,\n className,\n ].filter(Boolean).join(' ');\n\n return (\n <span className={classes} aria-live=\"polite\" role=\"status\">\n {label}\n </span>\n );\n}\n\nfunction EditorContentArea({ className }: EditorContentProps) {\n const { value, setValue, placeholder, disabled, readOnly, editor, mode, contentRef } =\n useEditorContext();\n\n if (mode === 'rich' && editor && _EditorContent) {\n const TipTapContent = _EditorContent;\n const classes = [styles.content, styles.contentRich, className].filter(Boolean).join(' ');\n return (\n <div className={classes} data-placeholder={placeholder}>\n <TipTapContent editor={editor} />\n </div>\n );\n }\n\n // Textarea fallback for markdown mode\n const classes = [styles.content, className].filter(Boolean).join(' ');\n return (\n <div className={classes}>\n <textarea\n ref={contentRef}\n className={styles.contentTextarea}\n value={value}\n onChange={(e) => setValue(e.target.value)}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n aria-label={placeholder}\n />\n </div>\n );\n}\n\nfunction EditorStatusBar({ showWordCount = true, showCharCount = true, className }: EditorStatusBarProps) {\n const { wordCount, charCount, maxLength } = useEditorContext();\n\n const classes = [styles.statusBar, className].filter(Boolean).join(' ');\n\n const isOverLimit = maxLength !== undefined && charCount > maxLength;\n const isNearLimit = maxLength !== undefined && !isOverLimit && charCount >= maxLength * 0.9;\n\n const charLimitClasses = [\n styles.statusBarItem,\n isNearLimit && styles.statusBarItemWarning,\n isOverLimit && styles.statusBarItemError,\n ].filter(Boolean).join(' ');\n\n return (\n <div className={classes} aria-label=\"Editor statistics\">\n <div className={styles.statusBarLeft} />\n <div className={styles.statusBarRight}>\n {showWordCount && (\n <span className={styles.statusBarItem}>\n {wordCount} {wordCount === 1 ? 'Word' : 'Words'}\n </span>\n )}\n {showWordCount && showCharCount && (\n <EditorSeparator />\n )}\n {showCharCount && (\n <span className={charLimitClasses}>\n {maxLength !== undefined\n ? `${charCount} / ${maxLength}`\n : `${charCount} ${charCount === 1 ? 'Character' : 'Characters'}`\n }\n </span>\n )}\n </div>\n </div>\n );\n}\n\n// ============================================\n// Export compound component\n// ============================================\n\nexport const Editor = Object.assign(EditorRoot, {\n Toolbar: EditorToolbar,\n ToolbarGroup: EditorToolbarGroup,\n ToolbarButton: EditorToolbarButton,\n Separator: EditorSeparator,\n StatusIndicator: EditorStatusIndicator,\n Content: EditorContentArea,\n StatusBar: EditorStatusBar,\n});\n\nexport {\n EditorRoot,\n EditorToolbar,\n EditorToolbarGroup,\n EditorToolbarButton,\n EditorSeparator,\n EditorStatusIndicator,\n EditorContentArea,\n EditorStatusBar,\n};\n\nexport { useEditorContext };\n"],"names":["classes"],"mappings":"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"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
|
|
3
|
-
const emptyState = "
|
|
4
|
-
const sm = "
|
|
5
|
-
const title = "
|
|
6
|
-
const description = "
|
|
7
|
-
const icon = "
|
|
8
|
-
const actions = "
|
|
9
|
-
const md = "
|
|
10
|
-
const lg = "
|
|
3
|
+
const emptyState = "_emptyState_1rpj8_1";
|
|
4
|
+
const sm = "_sm_1rpj8_11";
|
|
5
|
+
const title = "_title_1rpj8_14";
|
|
6
|
+
const description = "_description_1rpj8_17";
|
|
7
|
+
const icon = "_icon_1rpj8_21";
|
|
8
|
+
const actions = "_actions_1rpj8_24";
|
|
9
|
+
const md = "_md_1rpj8_28";
|
|
10
|
+
const lg = "_lg_1rpj8_45";
|
|
11
11
|
const styles = {
|
|
12
12
|
emptyState,
|
|
13
13
|
sm,
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
const emptyState = "
|
|
2
|
-
const sm = "
|
|
3
|
-
const title = "
|
|
4
|
-
const description = "
|
|
5
|
-
const icon = "
|
|
6
|
-
const actions = "
|
|
7
|
-
const md = "
|
|
8
|
-
const lg = "
|
|
1
|
+
const emptyState = "_emptyState_1rpj8_1";
|
|
2
|
+
const sm = "_sm_1rpj8_11";
|
|
3
|
+
const title = "_title_1rpj8_14";
|
|
4
|
+
const description = "_description_1rpj8_17";
|
|
5
|
+
const icon = "_icon_1rpj8_21";
|
|
6
|
+
const actions = "_actions_1rpj8_24";
|
|
7
|
+
const md = "_md_1rpj8_28";
|
|
8
|
+
const lg = "_lg_1rpj8_45";
|
|
9
9
|
const styles = {
|
|
10
10
|
emptyState,
|
|
11
11
|
sm,
|