@mihcm/ui 0.14.1
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/README.md +138 -0
- package/dist/AccessLevelGroup.d.ts +37 -0
- package/dist/AccessLevelGroup.d.ts.map +1 -0
- package/dist/AccessLevelGroup.js +39 -0
- package/dist/AccessLevelGroup.js.map +1 -0
- package/dist/AccessLevelGroup.native.d.ts +18 -0
- package/dist/AccessLevelGroup.native.d.ts.map +1 -0
- package/dist/AccessLevelGroup.native.js +40 -0
- package/dist/AccessLevelGroup.native.js.map +1 -0
- package/dist/Accordion.d.ts +52 -0
- package/dist/Accordion.d.ts.map +1 -0
- package/dist/Accordion.js +90 -0
- package/dist/Accordion.js.map +1 -0
- package/dist/Accordion.native.d.ts +36 -0
- package/dist/Accordion.native.d.ts.map +1 -0
- package/dist/Accordion.native.js +86 -0
- package/dist/Accordion.native.js.map +1 -0
- package/dist/Alert.d.ts +33 -0
- package/dist/Alert.d.ts.map +1 -0
- package/dist/Alert.js +45 -0
- package/dist/Alert.js.map +1 -0
- package/dist/Alert.native.d.ts +26 -0
- package/dist/Alert.native.d.ts.map +1 -0
- package/dist/Alert.native.js +41 -0
- package/dist/Alert.native.js.map +1 -0
- package/dist/AlertDialog.d.ts +57 -0
- package/dist/AlertDialog.d.ts.map +1 -0
- package/dist/AlertDialog.js +91 -0
- package/dist/AlertDialog.js.map +1 -0
- package/dist/AlertDialog.native.d.ts +66 -0
- package/dist/AlertDialog.native.d.ts.map +1 -0
- package/dist/AlertDialog.native.js +71 -0
- package/dist/AlertDialog.native.js.map +1 -0
- package/dist/AspectRatio.d.ts +18 -0
- package/dist/AspectRatio.d.ts.map +1 -0
- package/dist/AspectRatio.js +19 -0
- package/dist/AspectRatio.js.map +1 -0
- package/dist/AspectRatio.native.d.ts +7 -0
- package/dist/AspectRatio.native.d.ts.map +1 -0
- package/dist/AspectRatio.native.js +13 -0
- package/dist/AspectRatio.native.js.map +1 -0
- package/dist/Avatar.d.ts +45 -0
- package/dist/Avatar.d.ts.map +1 -0
- package/dist/Avatar.js +69 -0
- package/dist/Avatar.js.map +1 -0
- package/dist/Avatar.native.d.ts +38 -0
- package/dist/Avatar.native.d.ts.map +1 -0
- package/dist/Avatar.native.js +56 -0
- package/dist/Avatar.native.js.map +1 -0
- package/dist/AvatarGroup.d.ts +32 -0
- package/dist/AvatarGroup.d.ts.map +1 -0
- package/dist/AvatarGroup.js +45 -0
- package/dist/AvatarGroup.js.map +1 -0
- package/dist/AvatarGroup.native.d.ts +18 -0
- package/dist/AvatarGroup.native.d.ts.map +1 -0
- package/dist/AvatarGroup.native.js +35 -0
- package/dist/AvatarGroup.native.js.map +1 -0
- package/dist/Badge.d.ts +26 -0
- package/dist/Badge.d.ts.map +1 -0
- package/dist/Badge.js +44 -0
- package/dist/Badge.js.map +1 -0
- package/dist/Badge.native.d.ts +23 -0
- package/dist/Badge.native.d.ts.map +1 -0
- package/dist/Badge.native.js +49 -0
- package/dist/Badge.native.js.map +1 -0
- package/dist/Banner.d.ts +27 -0
- package/dist/Banner.d.ts.map +1 -0
- package/dist/Banner.js +41 -0
- package/dist/Banner.js.map +1 -0
- package/dist/Banner.native.d.ts +24 -0
- package/dist/Banner.native.d.ts.map +1 -0
- package/dist/Banner.native.js +39 -0
- package/dist/Banner.native.js.map +1 -0
- package/dist/BarList.d.ts +27 -0
- package/dist/BarList.d.ts.map +1 -0
- package/dist/BarList.js +25 -0
- package/dist/BarList.js.map +1 -0
- package/dist/Breadcrumb.d.ts +67 -0
- package/dist/Breadcrumb.d.ts.map +1 -0
- package/dist/Breadcrumb.js +63 -0
- package/dist/Breadcrumb.js.map +1 -0
- package/dist/Breadcrumb.native.d.ts +64 -0
- package/dist/Breadcrumb.native.d.ts.map +1 -0
- package/dist/Breadcrumb.native.js +50 -0
- package/dist/Breadcrumb.native.js.map +1 -0
- package/dist/Button.d.ts +42 -0
- package/dist/Button.d.ts.map +1 -0
- package/dist/Button.js +68 -0
- package/dist/Button.js.map +1 -0
- package/dist/Button.native.d.ts +38 -0
- package/dist/Button.native.d.ts.map +1 -0
- package/dist/Button.native.js +51 -0
- package/dist/Button.native.js.map +1 -0
- package/dist/Calendar.d.ts +16 -0
- package/dist/Calendar.d.ts.map +1 -0
- package/dist/Calendar.js +94 -0
- package/dist/Calendar.js.map +1 -0
- package/dist/Calendar.native.d.ts +21 -0
- package/dist/Calendar.native.d.ts.map +1 -0
- package/dist/Calendar.native.js +15 -0
- package/dist/Calendar.native.js.map +1 -0
- package/dist/Card.d.ts +29 -0
- package/dist/Card.d.ts.map +1 -0
- package/dist/Card.js +44 -0
- package/dist/Card.js.map +1 -0
- package/dist/Card.native.d.ts +20 -0
- package/dist/Card.native.d.ts.map +1 -0
- package/dist/Card.native.js +32 -0
- package/dist/Card.native.js.map +1 -0
- package/dist/Carousel.d.ts +46 -0
- package/dist/Carousel.d.ts.map +1 -0
- package/dist/Carousel.js +115 -0
- package/dist/Carousel.js.map +1 -0
- package/dist/Carousel.native.d.ts +59 -0
- package/dist/Carousel.native.d.ts.map +1 -0
- package/dist/Carousel.native.js +93 -0
- package/dist/Carousel.native.js.map +1 -0
- package/dist/CategoryBar.d.ts +22 -0
- package/dist/CategoryBar.d.ts.map +1 -0
- package/dist/CategoryBar.js +27 -0
- package/dist/CategoryBar.js.map +1 -0
- package/dist/Chart.d.ts +77 -0
- package/dist/Chart.d.ts.map +1 -0
- package/dist/Chart.js +197 -0
- package/dist/Chart.js.map +1 -0
- package/dist/Checkbox.d.ts +28 -0
- package/dist/Checkbox.d.ts.map +1 -0
- package/dist/Checkbox.js +44 -0
- package/dist/Checkbox.js.map +1 -0
- package/dist/Checkbox.native.d.ts +13 -0
- package/dist/Checkbox.native.d.ts.map +1 -0
- package/dist/Checkbox.native.js +34 -0
- package/dist/Checkbox.native.js.map +1 -0
- package/dist/CheckboxGrid.d.ts +49 -0
- package/dist/CheckboxGrid.d.ts.map +1 -0
- package/dist/CheckboxGrid.js +79 -0
- package/dist/CheckboxGrid.js.map +1 -0
- package/dist/CheckboxGrid.native.d.ts +14 -0
- package/dist/CheckboxGrid.native.d.ts.map +1 -0
- package/dist/CheckboxGrid.native.js +47 -0
- package/dist/CheckboxGrid.native.js.map +1 -0
- package/dist/Collapsible.d.ts +51 -0
- package/dist/Collapsible.d.ts.map +1 -0
- package/dist/Collapsible.js +101 -0
- package/dist/Collapsible.js.map +1 -0
- package/dist/Collapsible.native.d.ts +53 -0
- package/dist/Collapsible.native.d.ts.map +1 -0
- package/dist/Collapsible.native.js +109 -0
- package/dist/Collapsible.native.js.map +1 -0
- package/dist/Combobox.d.ts +42 -0
- package/dist/Combobox.d.ts.map +1 -0
- package/dist/Combobox.js +96 -0
- package/dist/Combobox.js.map +1 -0
- package/dist/Combobox.native.d.ts +21 -0
- package/dist/Combobox.native.d.ts.map +1 -0
- package/dist/Combobox.native.js +28 -0
- package/dist/Combobox.native.js.map +1 -0
- package/dist/Command.d.ts +107 -0
- package/dist/Command.d.ts.map +1 -0
- package/dist/Command.js +68 -0
- package/dist/Command.js.map +1 -0
- package/dist/Command.native.d.ts +41 -0
- package/dist/Command.native.d.ts.map +1 -0
- package/dist/Command.native.js +31 -0
- package/dist/Command.native.js.map +1 -0
- package/dist/ContextMenu.d.ts +48 -0
- package/dist/ContextMenu.d.ts.map +1 -0
- package/dist/ContextMenu.js +79 -0
- package/dist/ContextMenu.js.map +1 -0
- package/dist/ContextMenu.native.d.ts +81 -0
- package/dist/ContextMenu.native.d.ts.map +1 -0
- package/dist/ContextMenu.native.js +82 -0
- package/dist/ContextMenu.native.js.map +1 -0
- package/dist/DataTable.d.ts +98 -0
- package/dist/DataTable.d.ts.map +1 -0
- package/dist/DataTable.js +291 -0
- package/dist/DataTable.js.map +1 -0
- package/dist/DataTable.native.d.ts +31 -0
- package/dist/DataTable.native.d.ts.map +1 -0
- package/dist/DataTable.native.js +22 -0
- package/dist/DataTable.native.js.map +1 -0
- package/dist/DatePicker.d.ts +63 -0
- package/dist/DatePicker.d.ts.map +1 -0
- package/dist/DatePicker.js +106 -0
- package/dist/DatePicker.js.map +1 -0
- package/dist/DatePicker.native.d.ts +21 -0
- package/dist/DatePicker.native.d.ts.map +1 -0
- package/dist/DatePicker.native.js +15 -0
- package/dist/DatePicker.native.js.map +1 -0
- package/dist/Dialog.d.ts +52 -0
- package/dist/Dialog.d.ts.map +1 -0
- package/dist/Dialog.js +93 -0
- package/dist/Dialog.js.map +1 -0
- package/dist/Dialog.native.d.ts +57 -0
- package/dist/Dialog.native.d.ts.map +1 -0
- package/dist/Dialog.native.js +62 -0
- package/dist/Dialog.native.js.map +1 -0
- package/dist/Drawer.d.ts +36 -0
- package/dist/Drawer.d.ts.map +1 -0
- package/dist/Drawer.js +57 -0
- package/dist/Drawer.js.map +1 -0
- package/dist/Drawer.native.d.ts +50 -0
- package/dist/Drawer.native.d.ts.map +1 -0
- package/dist/Drawer.native.js +43 -0
- package/dist/Drawer.native.js.map +1 -0
- package/dist/DropdownMenu.d.ts +57 -0
- package/dist/DropdownMenu.d.ts.map +1 -0
- package/dist/DropdownMenu.js +192 -0
- package/dist/DropdownMenu.js.map +1 -0
- package/dist/DropdownMenu.native.d.ts +53 -0
- package/dist/DropdownMenu.native.d.ts.map +1 -0
- package/dist/DropdownMenu.native.js +71 -0
- package/dist/DropdownMenu.native.js.map +1 -0
- package/dist/Dropzone.d.ts +27 -0
- package/dist/Dropzone.d.ts.map +1 -0
- package/dist/Dropzone.js +33 -0
- package/dist/Dropzone.js.map +1 -0
- package/dist/EmptyState.d.ts +21 -0
- package/dist/EmptyState.d.ts.map +1 -0
- package/dist/EmptyState.js +16 -0
- package/dist/EmptyState.js.map +1 -0
- package/dist/EmptyState.native.d.ts +19 -0
- package/dist/EmptyState.native.d.ts.map +1 -0
- package/dist/EmptyState.native.js +16 -0
- package/dist/EmptyState.native.js.map +1 -0
- package/dist/Form.d.ts +310 -0
- package/dist/Form.d.ts.map +1 -0
- package/dist/Form.js +260 -0
- package/dist/Form.js.map +1 -0
- package/dist/Form.native.d.ts +36 -0
- package/dist/Form.native.d.ts.map +1 -0
- package/dist/Form.native.js +33 -0
- package/dist/Form.native.js.map +1 -0
- package/dist/HoverCard.d.ts +47 -0
- package/dist/HoverCard.d.ts.map +1 -0
- package/dist/HoverCard.js +86 -0
- package/dist/HoverCard.js.map +1 -0
- package/dist/HoverCard.native.d.ts +48 -0
- package/dist/HoverCard.native.d.ts.map +1 -0
- package/dist/HoverCard.native.js +19 -0
- package/dist/HoverCard.native.js.map +1 -0
- package/dist/IconSidebar.d.ts +50 -0
- package/dist/IconSidebar.d.ts.map +1 -0
- package/dist/IconSidebar.js +121 -0
- package/dist/IconSidebar.js.map +1 -0
- package/dist/IconSidebar.native.d.ts +40 -0
- package/dist/IconSidebar.native.d.ts.map +1 -0
- package/dist/IconSidebar.native.js +24 -0
- package/dist/IconSidebar.native.js.map +1 -0
- package/dist/Input.d.ts +52 -0
- package/dist/Input.d.ts.map +1 -0
- package/dist/Input.js +57 -0
- package/dist/Input.js.map +1 -0
- package/dist/Input.native.d.ts +37 -0
- package/dist/Input.native.d.ts.map +1 -0
- package/dist/Input.native.js +39 -0
- package/dist/Input.native.js.map +1 -0
- package/dist/InputOTP.d.ts +30 -0
- package/dist/InputOTP.d.ts.map +1 -0
- package/dist/InputOTP.js +47 -0
- package/dist/InputOTP.js.map +1 -0
- package/dist/InputOTP.native.d.ts +32 -0
- package/dist/InputOTP.native.d.ts.map +1 -0
- package/dist/InputOTP.native.js +48 -0
- package/dist/InputOTP.native.js.map +1 -0
- package/dist/Label.d.ts +26 -0
- package/dist/Label.d.ts.map +1 -0
- package/dist/Label.js +35 -0
- package/dist/Label.js.map +1 -0
- package/dist/Label.native.d.ts +26 -0
- package/dist/Label.native.d.ts.map +1 -0
- package/dist/Label.native.js +30 -0
- package/dist/Label.native.js.map +1 -0
- package/dist/Link.d.ts +21 -0
- package/dist/Link.d.ts.map +1 -0
- package/dist/Link.js +46 -0
- package/dist/Link.js.map +1 -0
- package/dist/Link.native.d.ts +23 -0
- package/dist/Link.native.d.ts.map +1 -0
- package/dist/Link.native.js +59 -0
- package/dist/Link.native.js.map +1 -0
- package/dist/Logo.d.ts +25 -0
- package/dist/Logo.d.ts.map +1 -0
- package/dist/Logo.js +58 -0
- package/dist/Logo.js.map +1 -0
- package/dist/Logo.native.d.ts +22 -0
- package/dist/Logo.native.d.ts.map +1 -0
- package/dist/Logo.native.js +46 -0
- package/dist/Logo.native.js.map +1 -0
- package/dist/MainSidebar.d.ts +2 -0
- package/dist/MainSidebar.d.ts.map +1 -0
- package/dist/MainSidebar.js +3 -0
- package/dist/MainSidebar.js.map +1 -0
- package/dist/MainSidebar.native.d.ts +2 -0
- package/dist/MainSidebar.native.d.ts.map +1 -0
- package/dist/MainSidebar.native.js +2 -0
- package/dist/MainSidebar.native.js.map +1 -0
- package/dist/Menubar.d.ts +70 -0
- package/dist/Menubar.d.ts.map +1 -0
- package/dist/Menubar.js +142 -0
- package/dist/Menubar.js.map +1 -0
- package/dist/NavigationMenu.d.ts +12 -0
- package/dist/NavigationMenu.d.ts.map +1 -0
- package/dist/NavigationMenu.js +63 -0
- package/dist/NavigationMenu.js.map +1 -0
- package/dist/NavigationMenu.native.d.ts +44 -0
- package/dist/NavigationMenu.native.d.ts.map +1 -0
- package/dist/NavigationMenu.native.js +43 -0
- package/dist/NavigationMenu.native.js.map +1 -0
- package/dist/NotificationBadge.d.ts +33 -0
- package/dist/NotificationBadge.d.ts.map +1 -0
- package/dist/NotificationBadge.js +49 -0
- package/dist/NotificationBadge.js.map +1 -0
- package/dist/NotificationBadge.native.d.ts +25 -0
- package/dist/NotificationBadge.native.d.ts.map +1 -0
- package/dist/NotificationBadge.native.js +41 -0
- package/dist/NotificationBadge.native.js.map +1 -0
- package/dist/PageShell.d.ts +24 -0
- package/dist/PageShell.d.ts.map +1 -0
- package/dist/PageShell.js +24 -0
- package/dist/PageShell.js.map +1 -0
- package/dist/PageShell.native.d.ts +21 -0
- package/dist/PageShell.native.d.ts.map +1 -0
- package/dist/PageShell.native.js +19 -0
- package/dist/PageShell.native.js.map +1 -0
- package/dist/Pagination.d.ts +53 -0
- package/dist/Pagination.d.ts.map +1 -0
- package/dist/Pagination.js +79 -0
- package/dist/Pagination.js.map +1 -0
- package/dist/Pagination.native.d.ts +48 -0
- package/dist/Pagination.native.d.ts.map +1 -0
- package/dist/Pagination.native.js +55 -0
- package/dist/Pagination.native.js.map +1 -0
- package/dist/Popover.d.ts +57 -0
- package/dist/Popover.d.ts.map +1 -0
- package/dist/Popover.js +71 -0
- package/dist/Popover.js.map +1 -0
- package/dist/Popover.native.d.ts +48 -0
- package/dist/Popover.native.d.ts.map +1 -0
- package/dist/Popover.native.js +65 -0
- package/dist/Popover.native.js.map +1 -0
- package/dist/Popper.d.ts +54 -0
- package/dist/Popper.d.ts.map +1 -0
- package/dist/Popper.js +219 -0
- package/dist/Popper.js.map +1 -0
- package/dist/Progress.d.ts +79 -0
- package/dist/Progress.d.ts.map +1 -0
- package/dist/Progress.js +110 -0
- package/dist/Progress.js.map +1 -0
- package/dist/Progress.native.d.ts +42 -0
- package/dist/Progress.native.d.ts.map +1 -0
- package/dist/Progress.native.js +91 -0
- package/dist/Progress.native.js.map +1 -0
- package/dist/ProgressCircle.d.ts +69 -0
- package/dist/ProgressCircle.d.ts.map +1 -0
- package/dist/ProgressCircle.js +78 -0
- package/dist/ProgressCircle.js.map +1 -0
- package/dist/RadioCardGroup.d.ts +26 -0
- package/dist/RadioCardGroup.d.ts.map +1 -0
- package/dist/RadioCardGroup.js +26 -0
- package/dist/RadioCardGroup.js.map +1 -0
- package/dist/RadioGroup.d.ts +35 -0
- package/dist/RadioGroup.d.ts.map +1 -0
- package/dist/RadioGroup.js +68 -0
- package/dist/RadioGroup.js.map +1 -0
- package/dist/RadioGroup.native.d.ts +33 -0
- package/dist/RadioGroup.native.d.ts.map +1 -0
- package/dist/RadioGroup.native.js +55 -0
- package/dist/RadioGroup.native.js.map +1 -0
- package/dist/Resizable.d.ts +32 -0
- package/dist/Resizable.d.ts.map +1 -0
- package/dist/Resizable.js +31 -0
- package/dist/Resizable.js.map +1 -0
- package/dist/Resizable.native.d.ts +32 -0
- package/dist/Resizable.native.d.ts.map +1 -0
- package/dist/Resizable.native.js +23 -0
- package/dist/Resizable.native.js.map +1 -0
- package/dist/RichTextEditor.d.ts +38 -0
- package/dist/RichTextEditor.d.ts.map +1 -0
- package/dist/RichTextEditor.js +218 -0
- package/dist/RichTextEditor.js.map +1 -0
- package/dist/ScrollArea.d.ts +4 -0
- package/dist/ScrollArea.d.ts.map +1 -0
- package/dist/ScrollArea.js +26 -0
- package/dist/ScrollArea.js.map +1 -0
- package/dist/ScrollArea.native.d.ts +19 -0
- package/dist/ScrollArea.native.d.ts.map +1 -0
- package/dist/ScrollArea.native.js +19 -0
- package/dist/ScrollArea.native.js.map +1 -0
- package/dist/SearchField.d.ts +43 -0
- package/dist/SearchField.d.ts.map +1 -0
- package/dist/SearchField.js +34 -0
- package/dist/SearchField.js.map +1 -0
- package/dist/SearchField.native.d.ts +31 -0
- package/dist/SearchField.native.d.ts.map +1 -0
- package/dist/SearchField.native.js +30 -0
- package/dist/SearchField.native.js.map +1 -0
- package/dist/SectionHeader.d.ts +58 -0
- package/dist/SectionHeader.d.ts.map +1 -0
- package/dist/SectionHeader.js +95 -0
- package/dist/SectionHeader.js.map +1 -0
- package/dist/SectionHeader.native.d.ts +45 -0
- package/dist/SectionHeader.native.d.ts.map +1 -0
- package/dist/SectionHeader.native.js +92 -0
- package/dist/SectionHeader.native.js.map +1 -0
- package/dist/Select.d.ts +78 -0
- package/dist/Select.d.ts.map +1 -0
- package/dist/Select.js +310 -0
- package/dist/Select.js.map +1 -0
- package/dist/Select.native.d.ts +53 -0
- package/dist/Select.native.d.ts.map +1 -0
- package/dist/Select.native.js +86 -0
- package/dist/Select.native.js.map +1 -0
- package/dist/Separator.d.ts +20 -0
- package/dist/Separator.d.ts.map +1 -0
- package/dist/Separator.js +20 -0
- package/dist/Separator.js.map +1 -0
- package/dist/Separator.native.d.ts +8 -0
- package/dist/Separator.native.d.ts.map +1 -0
- package/dist/Separator.native.js +17 -0
- package/dist/Separator.native.js.map +1 -0
- package/dist/Sheet.d.ts +54 -0
- package/dist/Sheet.d.ts.map +1 -0
- package/dist/Sheet.js +191 -0
- package/dist/Sheet.js.map +1 -0
- package/dist/Sheet.native.d.ts +55 -0
- package/dist/Sheet.native.d.ts.map +1 -0
- package/dist/Sheet.native.js +112 -0
- package/dist/Sheet.native.js.map +1 -0
- package/dist/Sidebar.d.ts +131 -0
- package/dist/Sidebar.d.ts.map +1 -0
- package/dist/Sidebar.js +328 -0
- package/dist/Sidebar.js.map +1 -0
- package/dist/Skeleton.d.ts +14 -0
- package/dist/Skeleton.d.ts.map +1 -0
- package/dist/Skeleton.js +17 -0
- package/dist/Skeleton.js.map +1 -0
- package/dist/Skeleton.native.d.ts +6 -0
- package/dist/Skeleton.native.d.ts.map +1 -0
- package/dist/Skeleton.native.js +26 -0
- package/dist/Skeleton.native.js.map +1 -0
- package/dist/Slider.d.ts +63 -0
- package/dist/Slider.d.ts.map +1 -0
- package/dist/Slider.js +109 -0
- package/dist/Slider.js.map +1 -0
- package/dist/Slider.native.d.ts +38 -0
- package/dist/Slider.native.d.ts.map +1 -0
- package/dist/Slider.native.js +18 -0
- package/dist/Slider.native.js.map +1 -0
- package/dist/SortableList.d.ts +26 -0
- package/dist/SortableList.d.ts.map +1 -0
- package/dist/SortableList.js +44 -0
- package/dist/SortableList.js.map +1 -0
- package/dist/SparkChart.d.ts +34 -0
- package/dist/SparkChart.d.ts.map +1 -0
- package/dist/SparkChart.js +55 -0
- package/dist/SparkChart.js.map +1 -0
- package/dist/StatCard.d.ts +35 -0
- package/dist/StatCard.d.ts.map +1 -0
- package/dist/StatCard.js +37 -0
- package/dist/StatCard.js.map +1 -0
- package/dist/StatCard.native.d.ts +28 -0
- package/dist/StatCard.native.d.ts.map +1 -0
- package/dist/StatCard.native.js +31 -0
- package/dist/StatCard.native.js.map +1 -0
- package/dist/StatusBadge.d.ts +23 -0
- package/dist/StatusBadge.d.ts.map +1 -0
- package/dist/StatusBadge.js +33 -0
- package/dist/StatusBadge.js.map +1 -0
- package/dist/StatusBadge.native.d.ts +21 -0
- package/dist/StatusBadge.native.d.ts.map +1 -0
- package/dist/StatusBadge.native.js +37 -0
- package/dist/StatusBadge.native.js.map +1 -0
- package/dist/Switch.d.ts +31 -0
- package/dist/Switch.d.ts.map +1 -0
- package/dist/Switch.js +46 -0
- package/dist/Switch.js.map +1 -0
- package/dist/Switch.native.d.ts +16 -0
- package/dist/Switch.native.d.ts.map +1 -0
- package/dist/Switch.native.js +41 -0
- package/dist/Switch.native.js.map +1 -0
- package/dist/TabNavigation.d.ts +49 -0
- package/dist/TabNavigation.d.ts.map +1 -0
- package/dist/TabNavigation.js +121 -0
- package/dist/TabNavigation.js.map +1 -0
- package/dist/Table.d.ts +54 -0
- package/dist/Table.d.ts.map +1 -0
- package/dist/Table.js +96 -0
- package/dist/Table.js.map +1 -0
- package/dist/Table.native.d.ts +37 -0
- package/dist/Table.native.d.ts.map +1 -0
- package/dist/Table.native.js +37 -0
- package/dist/Table.native.js.map +1 -0
- package/dist/Tabs.d.ts +45 -0
- package/dist/Tabs.d.ts.map +1 -0
- package/dist/Tabs.js +94 -0
- package/dist/Tabs.js.map +1 -0
- package/dist/Tabs.native.d.ts +47 -0
- package/dist/Tabs.native.d.ts.map +1 -0
- package/dist/Tabs.native.js +57 -0
- package/dist/Tabs.native.js.map +1 -0
- package/dist/Tag.d.ts +24 -0
- package/dist/Tag.d.ts.map +1 -0
- package/dist/Tag.js +41 -0
- package/dist/Tag.js.map +1 -0
- package/dist/Tag.native.d.ts +23 -0
- package/dist/Tag.native.d.ts.map +1 -0
- package/dist/Tag.native.js +55 -0
- package/dist/Tag.native.js.map +1 -0
- package/dist/Text.d.ts +26 -0
- package/dist/Text.d.ts.map +1 -0
- package/dist/Text.js +63 -0
- package/dist/Text.js.map +1 -0
- package/dist/Text.native.d.ts +18 -0
- package/dist/Text.native.d.ts.map +1 -0
- package/dist/Text.native.js +58 -0
- package/dist/Text.native.js.map +1 -0
- package/dist/Textarea.d.ts +23 -0
- package/dist/Textarea.d.ts.map +1 -0
- package/dist/Textarea.js +39 -0
- package/dist/Textarea.js.map +1 -0
- package/dist/Textarea.native.d.ts +16 -0
- package/dist/Textarea.native.d.ts.map +1 -0
- package/dist/Textarea.native.js +30 -0
- package/dist/Textarea.native.js.map +1 -0
- package/dist/TiptapEditor.d.ts +24 -0
- package/dist/TiptapEditor.d.ts.map +1 -0
- package/dist/TiptapEditor.js +84 -0
- package/dist/TiptapEditor.js.map +1 -0
- package/dist/TitleBar.d.ts +31 -0
- package/dist/TitleBar.d.ts.map +1 -0
- package/dist/TitleBar.js +27 -0
- package/dist/TitleBar.js.map +1 -0
- package/dist/TitleBar.native.d.ts +19 -0
- package/dist/TitleBar.native.d.ts.map +1 -0
- package/dist/TitleBar.native.js +16 -0
- package/dist/TitleBar.native.js.map +1 -0
- package/dist/Toast.d.ts +72 -0
- package/dist/Toast.d.ts.map +1 -0
- package/dist/Toast.js +194 -0
- package/dist/Toast.js.map +1 -0
- package/dist/Toast.native.d.ts +65 -0
- package/dist/Toast.native.d.ts.map +1 -0
- package/dist/Toast.native.js +182 -0
- package/dist/Toast.native.js.map +1 -0
- package/dist/Toggle.d.ts +46 -0
- package/dist/Toggle.d.ts.map +1 -0
- package/dist/Toggle.js +70 -0
- package/dist/Toggle.js.map +1 -0
- package/dist/Toggle.native.d.ts +42 -0
- package/dist/Toggle.native.d.ts.map +1 -0
- package/dist/Toggle.native.js +56 -0
- package/dist/Toggle.native.js.map +1 -0
- package/dist/Tooltip.d.ts +32 -0
- package/dist/Tooltip.d.ts.map +1 -0
- package/dist/Tooltip.js +43 -0
- package/dist/Tooltip.js.map +1 -0
- package/dist/Tooltip.native.d.ts +25 -0
- package/dist/Tooltip.native.d.ts.map +1 -0
- package/dist/Tooltip.native.js +25 -0
- package/dist/Tooltip.native.js.map +1 -0
- package/dist/TopBar.d.ts +105 -0
- package/dist/TopBar.d.ts.map +1 -0
- package/dist/TopBar.js +90 -0
- package/dist/TopBar.js.map +1 -0
- package/dist/TopBar.native.d.ts +67 -0
- package/dist/TopBar.native.d.ts.map +1 -0
- package/dist/TopBar.native.js +41 -0
- package/dist/TopBar.native.js.map +1 -0
- package/dist/Tracker.d.ts +44 -0
- package/dist/Tracker.d.ts.map +1 -0
- package/dist/Tracker.js +92 -0
- package/dist/Tracker.js.map +1 -0
- package/dist/TransferList.d.ts +51 -0
- package/dist/TransferList.d.ts.map +1 -0
- package/dist/TransferList.js +107 -0
- package/dist/TransferList.js.map +1 -0
- package/dist/TransferList.native.d.ts +14 -0
- package/dist/TransferList.native.d.ts.map +1 -0
- package/dist/TransferList.native.js +57 -0
- package/dist/TransferList.native.js.map +1 -0
- package/dist/index.d.ts +78 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +79 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/cn.d.ts +7 -0
- package/dist/internal/cn.d.ts.map +1 -0
- package/dist/internal/cn.js +30 -0
- package/dist/internal/cn.js.map +1 -0
- package/package.json +499 -0
- package/src/AccessLevelGroup.native.tsx +103 -0
- package/src/AccessLevelGroup.tsx +103 -0
- package/src/Accordion.native.tsx +199 -0
- package/src/Accordion.tsx +279 -0
- package/src/Alert.native.tsx +100 -0
- package/src/Alert.tsx +101 -0
- package/src/AlertDialog.native.tsx +189 -0
- package/src/AlertDialog.tsx +194 -0
- package/src/AspectRatio.native.tsx +28 -0
- package/src/AspectRatio.tsx +35 -0
- package/src/Avatar.native.tsx +142 -0
- package/src/Avatar.tsx +155 -0
- package/src/AvatarGroup.native.tsx +81 -0
- package/src/AvatarGroup.tsx +114 -0
- package/src/Badge.native.tsx +85 -0
- package/src/Badge.tsx +93 -0
- package/src/Banner.native.tsx +77 -0
- package/src/Banner.tsx +95 -0
- package/src/BarList.tsx +102 -0
- package/src/Breadcrumb.native.tsx +238 -0
- package/src/Breadcrumb.tsx +258 -0
- package/src/Button.native.tsx +123 -0
- package/src/Button.tsx +153 -0
- package/src/Calendar.native.tsx +28 -0
- package/src/Calendar.tsx +211 -0
- package/src/Card.native.tsx +82 -0
- package/src/Card.tsx +94 -0
- package/src/Carousel.native.tsx +224 -0
- package/src/Carousel.tsx +292 -0
- package/src/CategoryBar.tsx +85 -0
- package/src/Chart.tsx +467 -0
- package/src/Checkbox.native.tsx +69 -0
- package/src/Checkbox.tsx +108 -0
- package/src/CheckboxGrid.native.tsx +160 -0
- package/src/CheckboxGrid.tsx +262 -0
- package/src/Collapsible.native.tsx +240 -0
- package/src/Collapsible.tsx +241 -0
- package/src/Combobox.native.tsx +171 -0
- package/src/Combobox.tsx +272 -0
- package/src/Command.native.tsx +71 -0
- package/src/Command.tsx +203 -0
- package/src/ContextMenu.native.tsx +313 -0
- package/src/ContextMenu.tsx +238 -0
- package/src/DataTable.native.tsx +70 -0
- package/src/DataTable.tsx +989 -0
- package/src/DatePicker.native.tsx +46 -0
- package/src/DatePicker.tsx +357 -0
- package/src/Dialog.native.tsx +181 -0
- package/src/Dialog.tsx +224 -0
- package/src/Drawer.native.tsx +134 -0
- package/src/Drawer.tsx +119 -0
- package/src/DropdownMenu.native.tsx +258 -0
- package/src/DropdownMenu.tsx +387 -0
- package/src/Dropzone.tsx +95 -0
- package/src/EmptyState.native.tsx +43 -0
- package/src/EmptyState.tsx +52 -0
- package/src/Form.native.tsx +94 -0
- package/src/Form.tsx +1324 -0
- package/src/HoverCard.native.tsx +63 -0
- package/src/HoverCard.tsx +181 -0
- package/src/IconSidebar.native.tsx +94 -0
- package/src/IconSidebar.tsx +448 -0
- package/src/Input.native.tsx +99 -0
- package/src/Input.tsx +132 -0
- package/src/InputOTP.native.tsx +154 -0
- package/src/InputOTP.tsx +119 -0
- package/src/Label.native.tsx +55 -0
- package/src/Label.tsx +60 -0
- package/src/Link.native.tsx +89 -0
- package/src/Link.tsx +85 -0
- package/src/Logo.native.tsx +114 -0
- package/src/Logo.tsx +153 -0
- package/src/MainSidebar.native.tsx +8 -0
- package/src/MainSidebar.tsx +10 -0
- package/src/Menubar.tsx +485 -0
- package/src/NavigationMenu.native.tsx +136 -0
- package/src/NavigationMenu.tsx +180 -0
- package/src/NotificationBadge.native.tsx +80 -0
- package/src/NotificationBadge.tsx +91 -0
- package/src/PageShell.native.tsx +43 -0
- package/src/PageShell.tsx +50 -0
- package/src/Pagination.native.tsx +217 -0
- package/src/Pagination.tsx +250 -0
- package/src/Popover.native.tsx +139 -0
- package/src/Popover.tsx +175 -0
- package/src/Popper.tsx +399 -0
- package/src/Progress.native.tsx +197 -0
- package/src/Progress.tsx +286 -0
- package/src/ProgressCircle.tsx +200 -0
- package/src/RadioCardGroup.tsx +97 -0
- package/src/RadioGroup.native.tsx +153 -0
- package/src/RadioGroup.tsx +201 -0
- package/src/Resizable.native.tsx +76 -0
- package/src/Resizable.tsx +88 -0
- package/src/RichTextEditor.tsx +513 -0
- package/src/ScrollArea.native.tsx +36 -0
- package/src/ScrollArea.tsx +62 -0
- package/src/SearchField.native.tsx +104 -0
- package/src/SearchField.tsx +136 -0
- package/src/SectionHeader.native.tsx +226 -0
- package/src/SectionHeader.tsx +250 -0
- package/src/Select.native.tsx +299 -0
- package/src/Select.tsx +710 -0
- package/src/Separator.native.tsx +38 -0
- package/src/Separator.tsx +43 -0
- package/src/Sheet.native.tsx +233 -0
- package/src/Sheet.tsx +329 -0
- package/src/Sidebar.tsx +956 -0
- package/src/Skeleton.native.tsx +47 -0
- package/src/Skeleton.tsx +29 -0
- package/src/Slider.native.tsx +64 -0
- package/src/Slider.tsx +284 -0
- package/src/SortableList.tsx +158 -0
- package/src/SparkChart.tsx +143 -0
- package/src/StatCard.native.tsx +64 -0
- package/src/StatCard.tsx +75 -0
- package/src/StatusBadge.native.tsx +57 -0
- package/src/StatusBadge.tsx +52 -0
- package/src/Switch.native.tsx +78 -0
- package/src/Switch.tsx +94 -0
- package/src/TabNavigation.tsx +329 -0
- package/src/Table.native.tsx +183 -0
- package/src/Table.tsx +260 -0
- package/src/Tabs.native.tsx +139 -0
- package/src/Tabs.tsx +216 -0
- package/src/Tag.native.tsx +87 -0
- package/src/Tag.tsx +93 -0
- package/src/Text.native.tsx +95 -0
- package/src/Text.tsx +93 -0
- package/src/Textarea.native.tsx +64 -0
- package/src/Textarea.tsx +66 -0
- package/src/TitleBar.native.tsx +46 -0
- package/src/TitleBar.tsx +64 -0
- package/src/Toast.native.tsx +366 -0
- package/src/Toast.tsx +408 -0
- package/src/Toggle.native.tsx +162 -0
- package/src/Toggle.tsx +169 -0
- package/src/Tooltip.native.tsx +62 -0
- package/src/Tooltip.tsx +88 -0
- package/src/TopBar.native.tsx +223 -0
- package/src/TopBar.tsx +436 -0
- package/src/Tracker.tsx +244 -0
- package/src/TransferList.native.tsx +180 -0
- package/src/TransferList.tsx +297 -0
- package/src/globals.d.ts +1 -0
- package/src/index.ts +502 -0
- package/src/internal/cn.ts +31 -0
|
@@ -0,0 +1,513 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* RichTextEditor (web only — React DOM).
|
|
5
|
+
*
|
|
6
|
+
* A Lexical-powered rich text editor styled to match the MiHCM design system.
|
|
7
|
+
* Four variants control which toolbar features are shown:
|
|
8
|
+
*
|
|
9
|
+
* minimal — Bold, Italic only
|
|
10
|
+
* default — Bold, Italic, Underline, Strikethrough + Bullet/Numbered lists
|
|
11
|
+
* semi — default + Headings (H1–H3) + Undo/Redo + Code + Link + Indent/Outdent + Markdown shortcuts + Tab indentation
|
|
12
|
+
* full — semi + Text alignment (L/C/R/Justify) + Superscript/Subscript + Check list + Table + Horizontal rule + Block quote + Clear formatting
|
|
13
|
+
*
|
|
14
|
+
* Web only — native apps should use a platform-specific editor.
|
|
15
|
+
*
|
|
16
|
+
* Wiki: docs/components/RichTextEditor.md
|
|
17
|
+
*/
|
|
18
|
+
import {
|
|
19
|
+
forwardRef,
|
|
20
|
+
useCallback,
|
|
21
|
+
useEffect,
|
|
22
|
+
useState,
|
|
23
|
+
type HTMLAttributes,
|
|
24
|
+
type ReactNode,
|
|
25
|
+
} from 'react';
|
|
26
|
+
import { cn } from './internal/cn.js';
|
|
27
|
+
|
|
28
|
+
import { LexicalComposer } from '@lexical/react/LexicalComposer.js';
|
|
29
|
+
import { RichTextPlugin } from '@lexical/react/LexicalRichTextPlugin.js';
|
|
30
|
+
import { ContentEditable } from '@lexical/react/LexicalContentEditable.js';
|
|
31
|
+
import { HistoryPlugin } from '@lexical/react/LexicalHistoryPlugin.js';
|
|
32
|
+
import { ListPlugin } from '@lexical/react/LexicalListPlugin.js';
|
|
33
|
+
import { CheckListPlugin } from '@lexical/react/LexicalCheckListPlugin.js';
|
|
34
|
+
import { LinkPlugin } from '@lexical/react/LexicalLinkPlugin.js';
|
|
35
|
+
import { OnChangePlugin } from '@lexical/react/LexicalOnChangePlugin.js';
|
|
36
|
+
import { MarkdownShortcutPlugin } from '@lexical/react/LexicalMarkdownShortcutPlugin.js';
|
|
37
|
+
import { TabIndentationPlugin } from '@lexical/react/LexicalTabIndentationPlugin.js';
|
|
38
|
+
import { TablePlugin } from '@lexical/react/LexicalTablePlugin.js';
|
|
39
|
+
import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js';
|
|
40
|
+
import { LexicalErrorBoundary } from '@lexical/react/LexicalErrorBoundary.js';
|
|
41
|
+
import {
|
|
42
|
+
$isRangeSelection,
|
|
43
|
+
$getSelection,
|
|
44
|
+
$createParagraphNode,
|
|
45
|
+
FORMAT_TEXT_COMMAND,
|
|
46
|
+
FORMAT_ELEMENT_COMMAND,
|
|
47
|
+
INDENT_CONTENT_COMMAND,
|
|
48
|
+
OUTDENT_CONTENT_COMMAND,
|
|
49
|
+
UNDO_COMMAND,
|
|
50
|
+
REDO_COMMAND,
|
|
51
|
+
type EditorState,
|
|
52
|
+
type LexicalEditor,
|
|
53
|
+
type Klass,
|
|
54
|
+
type LexicalNode,
|
|
55
|
+
} from 'lexical';
|
|
56
|
+
import { HeadingNode, $createHeadingNode, QuoteNode, $createQuoteNode, type HeadingTagType } from '@lexical/rich-text';
|
|
57
|
+
import { ListItemNode, ListNode, INSERT_ORDERED_LIST_COMMAND, INSERT_UNORDERED_LIST_COMMAND } from '@lexical/list';
|
|
58
|
+
import { INSERT_CHECK_LIST_COMMAND } from '@lexical/list';
|
|
59
|
+
import { LinkNode, $isLinkNode, TOGGLE_LINK_COMMAND } from '@lexical/link';
|
|
60
|
+
import { CodeNode } from '@lexical/code';
|
|
61
|
+
import { $setBlocksType } from '@lexical/selection';
|
|
62
|
+
import { HorizontalRuleNode, INSERT_HORIZONTAL_RULE_COMMAND } from '@lexical/react/LexicalHorizontalRuleNode.js';
|
|
63
|
+
import { HorizontalRulePlugin } from '@lexical/react/LexicalHorizontalRulePlugin.js';
|
|
64
|
+
import { TableNode, TableCellNode, TableRowNode, $createTableNodeWithDimensions } from '@lexical/table';
|
|
65
|
+
import { TRANSFORMERS, ELEMENT_TRANSFORMERS, TEXT_FORMAT_TRANSFORMERS, TEXT_MATCH_TRANSFORMERS } from '@lexical/markdown';
|
|
66
|
+
|
|
67
|
+
/* ── Variant config ───────────────────────────────────────────────── */
|
|
68
|
+
|
|
69
|
+
export type RichTextEditorVariant = 'minimal' | 'default' | 'semi' | 'full';
|
|
70
|
+
|
|
71
|
+
/* ── Theme (maps Lexical class names to Tailwind) ─────────────────── */
|
|
72
|
+
|
|
73
|
+
const editorTheme = {
|
|
74
|
+
paragraph: 'mb-2 last:mb-0',
|
|
75
|
+
heading: {
|
|
76
|
+
h1: 'text-2xl font-bold mb-3 text-foreground',
|
|
77
|
+
h2: 'text-xl font-semibold mb-2 text-foreground',
|
|
78
|
+
h3: 'text-lg font-medium mb-2 text-foreground',
|
|
79
|
+
},
|
|
80
|
+
text: {
|
|
81
|
+
bold: 'font-bold',
|
|
82
|
+
italic: 'italic',
|
|
83
|
+
underline: 'underline',
|
|
84
|
+
strikethrough: 'line-through',
|
|
85
|
+
underlineStrikethrough: 'underline line-through',
|
|
86
|
+
code: 'font-mono text-sm bg-muted px-1.5 py-0.5 rounded',
|
|
87
|
+
subscript: 'align-sub',
|
|
88
|
+
superscript: 'align-super',
|
|
89
|
+
},
|
|
90
|
+
list: {
|
|
91
|
+
ul: 'list-disc ml-6 mb-2',
|
|
92
|
+
ol: 'list-decimal ml-6 mb-2',
|
|
93
|
+
listitem: 'mb-0.5',
|
|
94
|
+
listitemChecked: 'line-through opacity-60 relative ml-2 list-none outline-none',
|
|
95
|
+
listitemUnchecked: 'relative ml-2 list-none outline-none',
|
|
96
|
+
nested: { listitem: 'list-none' },
|
|
97
|
+
checklist: 'list-none ml-0',
|
|
98
|
+
},
|
|
99
|
+
link: 'text-primary underline cursor-pointer hover:text-primary/80',
|
|
100
|
+
quote: 'border-l-4 border-primary-200 dark:border-primary-800 pl-4 italic text-muted-foreground mb-2',
|
|
101
|
+
code: 'font-mono text-sm bg-muted p-3 rounded-md mb-2 block overflow-x-auto',
|
|
102
|
+
horizontalRule: 'my-4 border-t border-border',
|
|
103
|
+
table: 'border-collapse border border-border w-full mb-2',
|
|
104
|
+
tableCell: 'border border-border px-2 py-1.5 text-sm min-w-[75px]',
|
|
105
|
+
tableCellHeader: 'border border-border px-2 py-1.5 text-sm font-semibold bg-muted/50',
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
/* ── Toolbar primitives ───────────────────────────────────────────── */
|
|
109
|
+
|
|
110
|
+
function TbIcon({ d, className }: { d: string; className?: string }) {
|
|
111
|
+
return (
|
|
112
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" className={cn('size-3.5', className)}>
|
|
113
|
+
<path d={d} />
|
|
114
|
+
</svg>
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function TbMultiIcon({ paths, className }: { paths: string[]; className?: string }) {
|
|
119
|
+
return (
|
|
120
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" className={cn('size-3.5', className)}>
|
|
121
|
+
{paths.map((d, i) => <path key={i} d={d} />)}
|
|
122
|
+
</svg>
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function TbBtn({ active, onClick, title, children }: { active?: boolean; onClick: () => void; title: string; children: ReactNode }) {
|
|
127
|
+
return (
|
|
128
|
+
<button type="button" onClick={onClick} title={title} aria-label={title} aria-pressed={active} className={cn(
|
|
129
|
+
'flex items-center justify-center size-7 rounded transition-colors duration-150 cursor-pointer',
|
|
130
|
+
'hover:bg-muted focus:outline-none focus-visible:ring-2 focus-visible:ring-ring',
|
|
131
|
+
active && 'border border-primary bg-primary text-primary-foreground shadow-mi-card',
|
|
132
|
+
)}>
|
|
133
|
+
{children}
|
|
134
|
+
</button>
|
|
135
|
+
);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
function TbSep() {
|
|
139
|
+
return <span className="w-px h-4 bg-border mx-0.5" aria-hidden />;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/* ── Toolbar plugin ───────────────────────────────────────────────── */
|
|
143
|
+
|
|
144
|
+
function ToolbarPlugin({ variant }: { variant: RichTextEditorVariant }) {
|
|
145
|
+
const [editor] = useLexicalComposerContext();
|
|
146
|
+
const [isBold, setIsBold] = useState(false);
|
|
147
|
+
const [isItalic, setIsItalic] = useState(false);
|
|
148
|
+
const [isUnderline, setIsUnderline] = useState(false);
|
|
149
|
+
const [isStrikethrough, setIsStrikethrough] = useState(false);
|
|
150
|
+
const [isCode, setIsCode] = useState(false);
|
|
151
|
+
const [isSuperscript, setIsSuperscript] = useState(false);
|
|
152
|
+
const [isSubscript, setIsSubscript] = useState(false);
|
|
153
|
+
const [isLink, setIsLink] = useState(false);
|
|
154
|
+
|
|
155
|
+
const updateToolbar = useCallback(() => {
|
|
156
|
+
const selection = $getSelection();
|
|
157
|
+
if ($isRangeSelection(selection)) {
|
|
158
|
+
setIsBold(selection.hasFormat('bold'));
|
|
159
|
+
setIsItalic(selection.hasFormat('italic'));
|
|
160
|
+
setIsUnderline(selection.hasFormat('underline'));
|
|
161
|
+
setIsStrikethrough(selection.hasFormat('strikethrough'));
|
|
162
|
+
setIsCode(selection.hasFormat('code'));
|
|
163
|
+
setIsSuperscript(selection.hasFormat('superscript'));
|
|
164
|
+
setIsSubscript(selection.hasFormat('subscript'));
|
|
165
|
+
const node = selection.anchor.getNode();
|
|
166
|
+
const parent = node.getParent();
|
|
167
|
+
setIsLink($isLinkNode(parent) || $isLinkNode(node));
|
|
168
|
+
}
|
|
169
|
+
}, []);
|
|
170
|
+
|
|
171
|
+
useEffect(() => {
|
|
172
|
+
return editor.registerUpdateListener(({ editorState }) => {
|
|
173
|
+
editorState.read(() => updateToolbar());
|
|
174
|
+
});
|
|
175
|
+
}, [editor, updateToolbar]);
|
|
176
|
+
|
|
177
|
+
const formatHeading = (tag: HeadingTagType) => {
|
|
178
|
+
editor.update(() => {
|
|
179
|
+
const selection = $getSelection();
|
|
180
|
+
if ($isRangeSelection(selection)) $setBlocksType(selection, () => $createHeadingNode(tag));
|
|
181
|
+
});
|
|
182
|
+
};
|
|
183
|
+
|
|
184
|
+
const formatParagraph = () => {
|
|
185
|
+
editor.update(() => {
|
|
186
|
+
const selection = $getSelection();
|
|
187
|
+
if ($isRangeSelection(selection)) $setBlocksType(selection, () => $createParagraphNode());
|
|
188
|
+
});
|
|
189
|
+
};
|
|
190
|
+
|
|
191
|
+
const formatBlockQuote = () => {
|
|
192
|
+
editor.update(() => {
|
|
193
|
+
const selection = $getSelection();
|
|
194
|
+
if ($isRangeSelection(selection)) $setBlocksType(selection, () => $createQuoteNode());
|
|
195
|
+
});
|
|
196
|
+
};
|
|
197
|
+
|
|
198
|
+
const insertLink = () => {
|
|
199
|
+
if (isLink) {
|
|
200
|
+
editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);
|
|
201
|
+
} else {
|
|
202
|
+
const url = prompt('Enter URL:');
|
|
203
|
+
if (url) editor.dispatchCommand(TOGGLE_LINK_COMMAND, url);
|
|
204
|
+
}
|
|
205
|
+
};
|
|
206
|
+
|
|
207
|
+
const insertTable = () => {
|
|
208
|
+
editor.update(() => {
|
|
209
|
+
const table = $createTableNodeWithDimensions(3, 3, false);
|
|
210
|
+
const selection = $getSelection();
|
|
211
|
+
if ($isRangeSelection(selection)) {
|
|
212
|
+
const anchor = selection.anchor.getNode();
|
|
213
|
+
const parent = anchor.getTopLevelElementOrThrow();
|
|
214
|
+
parent.insertAfter(table);
|
|
215
|
+
}
|
|
216
|
+
});
|
|
217
|
+
};
|
|
218
|
+
|
|
219
|
+
const clearFormatting = () => {
|
|
220
|
+
editor.update(() => {
|
|
221
|
+
const selection = $getSelection();
|
|
222
|
+
if ($isRangeSelection(selection)) {
|
|
223
|
+
for (const format of ['bold', 'italic', 'underline', 'strikethrough', 'code', 'superscript', 'subscript'] as const) {
|
|
224
|
+
if (selection.hasFormat(format)) {
|
|
225
|
+
editor.dispatchCommand(FORMAT_TEXT_COMMAND, format);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
});
|
|
230
|
+
};
|
|
231
|
+
|
|
232
|
+
const showHistory = variant === 'semi' || variant === 'full';
|
|
233
|
+
const showHeadings = variant === 'semi' || variant === 'full';
|
|
234
|
+
const showUnderlineStrike = variant !== 'minimal';
|
|
235
|
+
const showLists = variant !== 'minimal';
|
|
236
|
+
const showCode = variant === 'semi' || variant === 'full';
|
|
237
|
+
const showLink = variant === 'semi' || variant === 'full';
|
|
238
|
+
const showIndent = variant === 'semi' || variant === 'full';
|
|
239
|
+
const showAlignment = variant === 'full';
|
|
240
|
+
const showSuperSub = variant === 'full';
|
|
241
|
+
const showCheckList = variant === 'full';
|
|
242
|
+
const showTable = variant === 'full';
|
|
243
|
+
const showExtras = variant === 'full';
|
|
244
|
+
|
|
245
|
+
return (
|
|
246
|
+
<div className="flex items-center gap-0.5 px-2 py-1.5 border-b border-border bg-muted/50 rounded-t-lg flex-wrap">
|
|
247
|
+
{/* Undo / Redo */}
|
|
248
|
+
{showHistory && (
|
|
249
|
+
<>
|
|
250
|
+
<TbBtn title="Undo (Ctrl+Z)" onClick={() => editor.dispatchCommand(UNDO_COMMAND, undefined)}>
|
|
251
|
+
<TbIcon d="M3 7v6h6M3 13a9 9 0 1 0 3-7.7" />
|
|
252
|
+
</TbBtn>
|
|
253
|
+
<TbBtn title="Redo (Ctrl+Shift+Z)" onClick={() => editor.dispatchCommand(REDO_COMMAND, undefined)}>
|
|
254
|
+
<TbIcon d="M21 7v6h-6M21 13a9 9 0 1 1-3-7.7" />
|
|
255
|
+
</TbBtn>
|
|
256
|
+
<TbSep />
|
|
257
|
+
</>
|
|
258
|
+
)}
|
|
259
|
+
|
|
260
|
+
{/* Headings */}
|
|
261
|
+
{showHeadings && (
|
|
262
|
+
<>
|
|
263
|
+
<TbBtn title="Heading 1" onClick={() => formatHeading('h1')}>
|
|
264
|
+
<span className="text-xs font-bold leading-none">H1</span>
|
|
265
|
+
</TbBtn>
|
|
266
|
+
<TbBtn title="Heading 2" onClick={() => formatHeading('h2')}>
|
|
267
|
+
<span className="text-xs font-bold leading-none">H2</span>
|
|
268
|
+
</TbBtn>
|
|
269
|
+
<TbBtn title="Heading 3" onClick={() => formatHeading('h3')}>
|
|
270
|
+
<span className="text-xs font-bold leading-none">H3</span>
|
|
271
|
+
</TbBtn>
|
|
272
|
+
<TbBtn title="Paragraph" onClick={formatParagraph}>
|
|
273
|
+
<span className="text-xs font-medium leading-none">¶</span>
|
|
274
|
+
</TbBtn>
|
|
275
|
+
<TbSep />
|
|
276
|
+
</>
|
|
277
|
+
)}
|
|
278
|
+
|
|
279
|
+
{/* Text formatting */}
|
|
280
|
+
<TbBtn title="Bold (Ctrl+B)" active={isBold} onClick={() => editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'bold')}>
|
|
281
|
+
<span className="text-xs font-bold">B</span>
|
|
282
|
+
</TbBtn>
|
|
283
|
+
<TbBtn title="Italic (Ctrl+I)" active={isItalic} onClick={() => editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'italic')}>
|
|
284
|
+
<span className="text-xs italic">I</span>
|
|
285
|
+
</TbBtn>
|
|
286
|
+
{showUnderlineStrike && (
|
|
287
|
+
<>
|
|
288
|
+
<TbBtn title="Underline (Ctrl+U)" active={isUnderline} onClick={() => editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'underline')}>
|
|
289
|
+
<span className="text-xs underline">U</span>
|
|
290
|
+
</TbBtn>
|
|
291
|
+
<TbBtn title="Strikethrough" active={isStrikethrough} onClick={() => editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'strikethrough')}>
|
|
292
|
+
<span className="text-xs line-through">S</span>
|
|
293
|
+
</TbBtn>
|
|
294
|
+
</>
|
|
295
|
+
)}
|
|
296
|
+
|
|
297
|
+
{/* Code */}
|
|
298
|
+
{showCode && (
|
|
299
|
+
<TbBtn title="Inline code" active={isCode} onClick={() => editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'code')}>
|
|
300
|
+
<TbMultiIcon paths={['M16 18l6-6-6-6', 'M8 6l-6 6 6 6']} />
|
|
301
|
+
</TbBtn>
|
|
302
|
+
)}
|
|
303
|
+
|
|
304
|
+
{/* Super/sub */}
|
|
305
|
+
{showSuperSub && (
|
|
306
|
+
<>
|
|
307
|
+
<TbBtn title="Superscript" active={isSuperscript} onClick={() => editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'superscript')}>
|
|
308
|
+
<span className="text-xs leading-none">X<sup>2</sup></span>
|
|
309
|
+
</TbBtn>
|
|
310
|
+
<TbBtn title="Subscript" active={isSubscript} onClick={() => editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'subscript')}>
|
|
311
|
+
<span className="text-xs leading-none">X<sub>2</sub></span>
|
|
312
|
+
</TbBtn>
|
|
313
|
+
</>
|
|
314
|
+
)}
|
|
315
|
+
|
|
316
|
+
{(showLists || showLink) && <TbSep />}
|
|
317
|
+
|
|
318
|
+
{/* Lists */}
|
|
319
|
+
{showLists && (
|
|
320
|
+
<>
|
|
321
|
+
<TbBtn title="Bullet list" onClick={() => editor.dispatchCommand(INSERT_UNORDERED_LIST_COMMAND, undefined)}>
|
|
322
|
+
<TbIcon d="M8 6h13M8 12h13M8 18h13M3 6h.01M3 12h.01M3 18h.01" />
|
|
323
|
+
</TbBtn>
|
|
324
|
+
<TbBtn title="Numbered list" onClick={() => editor.dispatchCommand(INSERT_ORDERED_LIST_COMMAND, undefined)}>
|
|
325
|
+
<TbIcon d="M10 6h11M10 12h11M10 18h11M3 5l2 1V4M3 11h2l-1 2h2M3 17l2 1-2 1" />
|
|
326
|
+
</TbBtn>
|
|
327
|
+
</>
|
|
328
|
+
)}
|
|
329
|
+
|
|
330
|
+
{/* Check list */}
|
|
331
|
+
{showCheckList && (
|
|
332
|
+
<TbBtn title="Check list" onClick={() => editor.dispatchCommand(INSERT_CHECK_LIST_COMMAND, undefined)}>
|
|
333
|
+
<TbMultiIcon paths={['M9 11l3 3L22 4', 'M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11']} />
|
|
334
|
+
</TbBtn>
|
|
335
|
+
)}
|
|
336
|
+
|
|
337
|
+
{/* Link */}
|
|
338
|
+
{showLink && (
|
|
339
|
+
<TbBtn title="Insert link" active={isLink} onClick={insertLink}>
|
|
340
|
+
<TbMultiIcon paths={['M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71', 'M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71']} />
|
|
341
|
+
</TbBtn>
|
|
342
|
+
)}
|
|
343
|
+
|
|
344
|
+
{/* Indent / Outdent */}
|
|
345
|
+
{showIndent && (
|
|
346
|
+
<>
|
|
347
|
+
<TbSep />
|
|
348
|
+
<TbBtn title="Indent" onClick={() => editor.dispatchCommand(INDENT_CONTENT_COMMAND, undefined)}>
|
|
349
|
+
<TbMultiIcon paths={['M3 8l4 4-4 4', 'M11 6h10', 'M11 12h10', 'M11 18h10']} />
|
|
350
|
+
</TbBtn>
|
|
351
|
+
<TbBtn title="Outdent" onClick={() => editor.dispatchCommand(OUTDENT_CONTENT_COMMAND, undefined)}>
|
|
352
|
+
<TbMultiIcon paths={['M7 8l-4 4 4 4', 'M11 6h10', 'M11 12h10', 'M11 18h10']} />
|
|
353
|
+
</TbBtn>
|
|
354
|
+
</>
|
|
355
|
+
)}
|
|
356
|
+
|
|
357
|
+
{/* Alignment */}
|
|
358
|
+
{showAlignment && (
|
|
359
|
+
<>
|
|
360
|
+
<TbSep />
|
|
361
|
+
<TbBtn title="Align left" onClick={() => editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, 'left')}>
|
|
362
|
+
<TbIcon d="M17 10H3M21 6H3M21 14H3M17 18H3" />
|
|
363
|
+
</TbBtn>
|
|
364
|
+
<TbBtn title="Align center" onClick={() => editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, 'center')}>
|
|
365
|
+
<TbIcon d="M18 10H6M21 6H3M21 14H3M18 18H6" />
|
|
366
|
+
</TbBtn>
|
|
367
|
+
<TbBtn title="Align right" onClick={() => editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, 'right')}>
|
|
368
|
+
<TbIcon d="M21 10H7M21 6H3M21 14H3M21 18H7" />
|
|
369
|
+
</TbBtn>
|
|
370
|
+
<TbBtn title="Justify" onClick={() => editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, 'justify')}>
|
|
371
|
+
<TbIcon d="M3 6h18M3 12h18M3 18h18" />
|
|
372
|
+
</TbBtn>
|
|
373
|
+
</>
|
|
374
|
+
)}
|
|
375
|
+
|
|
376
|
+
{/* Table + Extras (full only) */}
|
|
377
|
+
{showExtras && (
|
|
378
|
+
<>
|
|
379
|
+
<TbSep />
|
|
380
|
+
<TbBtn title="Insert table (3×3)" onClick={insertTable}>
|
|
381
|
+
<TbMultiIcon paths={['M3 3h18v18H3V3z', 'M3 9h18', 'M3 15h18', 'M9 3v18', 'M15 3v18']} />
|
|
382
|
+
</TbBtn>
|
|
383
|
+
<TbBtn title="Block quote" onClick={formatBlockQuote}>
|
|
384
|
+
<TbMultiIcon paths={['M3 21c3 0 7-1 7-8V5c0-1.25-.756-2.017-2-2H4c-1.25 0-2 .75-2 1.972V11c0 1.25.75 2 2 2 1 0 1 0 1 1v1c0 1-1 2-2 2s-1 .008-1 1.031V20c0 1 0 1 1 1', 'M15 21c3 0 7-1 7-8V5c0-1.25-.757-2.017-2-2h-4c-1.25 0-2 .75-2 1.972V11c0 1.25.75 2 2 2h.75c0 2.25.25 4-2.75 4v3c0 1 0 1 1 1']} />
|
|
385
|
+
</TbBtn>
|
|
386
|
+
<TbBtn title="Horizontal rule" onClick={() => editor.dispatchCommand(INSERT_HORIZONTAL_RULE_COMMAND, undefined)}>
|
|
387
|
+
<TbIcon d="M3 12h18" />
|
|
388
|
+
</TbBtn>
|
|
389
|
+
<TbBtn title="Clear formatting" onClick={clearFormatting}>
|
|
390
|
+
<TbMultiIcon paths={['M4 7h7l-2 9h7', 'M16 4l4 4-4 4', 'M7 20l5-5']} />
|
|
391
|
+
</TbBtn>
|
|
392
|
+
</>
|
|
393
|
+
)}
|
|
394
|
+
</div>
|
|
395
|
+
);
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
/* ── Placeholder ──────────────────────────────────────────────────── */
|
|
399
|
+
|
|
400
|
+
function Placeholder({ text }: { text: string }) {
|
|
401
|
+
return (
|
|
402
|
+
<div className="absolute top-0 left-0 pointer-events-none text-muted-foreground text-sm px-4 pt-3">
|
|
403
|
+
{text}
|
|
404
|
+
</div>
|
|
405
|
+
);
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
/* ── RichTextEditor ───────────────────────────────────────────────── */
|
|
409
|
+
|
|
410
|
+
export interface RichTextEditorProps
|
|
411
|
+
extends Omit<HTMLAttributes<HTMLDivElement>, 'onChange'> {
|
|
412
|
+
/**
|
|
413
|
+
* Controls which toolbar features are shown.
|
|
414
|
+
* - `minimal` — Bold, Italic
|
|
415
|
+
* - `default` — Bold, Italic, Underline, Strikethrough, Lists
|
|
416
|
+
* - `semi` — default + Headings, Undo/Redo, Code, Link, Indent/Outdent, Markdown shortcuts, Tab indentation
|
|
417
|
+
* - `full` — semi + Alignment (L/C/R/Justify), Super/Subscript, Check list, Table, Block quote, HR, Clear formatting
|
|
418
|
+
*/
|
|
419
|
+
variant?: RichTextEditorVariant;
|
|
420
|
+
/** Placeholder text for the editor. */
|
|
421
|
+
placeholder?: string;
|
|
422
|
+
/** Called with the serialised editor state on every change. */
|
|
423
|
+
onChange?: (editorState: EditorState, editor: LexicalEditor) => void;
|
|
424
|
+
/** Make the editor read-only. */
|
|
425
|
+
readOnly?: boolean;
|
|
426
|
+
/** Minimum height for the editor area. Default `'150px'`. */
|
|
427
|
+
minHeight?: string;
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
export const RichTextEditor = forwardRef<HTMLDivElement, RichTextEditorProps>(
|
|
431
|
+
function RichTextEditor(
|
|
432
|
+
{
|
|
433
|
+
className,
|
|
434
|
+
variant = 'default',
|
|
435
|
+
placeholder = 'Start typing...',
|
|
436
|
+
onChange,
|
|
437
|
+
readOnly = false,
|
|
438
|
+
minHeight = '150px',
|
|
439
|
+
...props
|
|
440
|
+
},
|
|
441
|
+
ref,
|
|
442
|
+
) {
|
|
443
|
+
const nodes: Klass<LexicalNode>[] = [ListNode, ListItemNode];
|
|
444
|
+
if (variant === 'semi' || variant === 'full') {
|
|
445
|
+
nodes.push(HeadingNode, LinkNode, CodeNode);
|
|
446
|
+
}
|
|
447
|
+
if (variant === 'full') {
|
|
448
|
+
nodes.push(QuoteNode, HorizontalRuleNode, TableNode, TableCellNode, TableRowNode);
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
const initialConfig = {
|
|
452
|
+
namespace: 'MiHCMRichTextEditor',
|
|
453
|
+
theme: editorTheme,
|
|
454
|
+
nodes,
|
|
455
|
+
editable: !readOnly,
|
|
456
|
+
onError: (error: Error) => {
|
|
457
|
+
console.error('[RichTextEditor]', error);
|
|
458
|
+
},
|
|
459
|
+
};
|
|
460
|
+
|
|
461
|
+
return (
|
|
462
|
+
<div
|
|
463
|
+
ref={ref}
|
|
464
|
+
className={cn(
|
|
465
|
+
'rounded-lg border border-border bg-card text-foreground',
|
|
466
|
+
'focus-within:ring-2 focus-within:ring-ring focus-within:border-transparent',
|
|
467
|
+
'transition-shadow',
|
|
468
|
+
readOnly && 'opacity-70',
|
|
469
|
+
className,
|
|
470
|
+
)}
|
|
471
|
+
{...props}
|
|
472
|
+
>
|
|
473
|
+
<LexicalComposer initialConfig={initialConfig}>
|
|
474
|
+
{!readOnly && <ToolbarPlugin variant={variant} />}
|
|
475
|
+
<div className="relative" style={{ minHeight }}>
|
|
476
|
+
<RichTextPlugin
|
|
477
|
+
contentEditable={
|
|
478
|
+
<ContentEditable
|
|
479
|
+
className="outline-none px-4 py-3 text-sm leading-relaxed min-h-full"
|
|
480
|
+
style={{ minHeight }}
|
|
481
|
+
/>
|
|
482
|
+
}
|
|
483
|
+
placeholder={<Placeholder text={placeholder} />}
|
|
484
|
+
ErrorBoundary={LexicalErrorBoundary}
|
|
485
|
+
/>
|
|
486
|
+
</div>
|
|
487
|
+
<HistoryPlugin />
|
|
488
|
+
<ListPlugin />
|
|
489
|
+
{variant === 'full' && <CheckListPlugin />}
|
|
490
|
+
{(variant === 'semi' || variant === 'full') && <LinkPlugin />}
|
|
491
|
+
{variant === 'full' && <MarkdownShortcutPlugin transformers={TRANSFORMERS} />}
|
|
492
|
+
{variant === 'semi' && (
|
|
493
|
+
<MarkdownShortcutPlugin
|
|
494
|
+
transformers={[
|
|
495
|
+
...ELEMENT_TRANSFORMERS.filter((t) => t.dependencies.every(
|
|
496
|
+
(dep) => [HeadingNode, ListNode, ListItemNode, LinkNode, CodeNode].includes(dep as never),
|
|
497
|
+
)),
|
|
498
|
+
...TEXT_FORMAT_TRANSFORMERS,
|
|
499
|
+
...TEXT_MATCH_TRANSFORMERS,
|
|
500
|
+
]}
|
|
501
|
+
/>
|
|
502
|
+
)}
|
|
503
|
+
{(variant === 'semi' || variant === 'full') && <TabIndentationPlugin />}
|
|
504
|
+
{variant === 'full' && <HorizontalRulePlugin />}
|
|
505
|
+
{variant === 'full' && <TablePlugin />}
|
|
506
|
+
{onChange && (
|
|
507
|
+
<OnChangePlugin onChange={(editorState, editor) => onChange(editorState, editor)} />
|
|
508
|
+
)}
|
|
509
|
+
</LexicalComposer>
|
|
510
|
+
</div>
|
|
511
|
+
);
|
|
512
|
+
},
|
|
513
|
+
);
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ScrollArea (React Native variant).
|
|
3
|
+
*
|
|
4
|
+
* Thin wrapper around ScrollView for API parity with the web ScrollArea.
|
|
5
|
+
* On native the OS handles scrollbar styling, so this is essentially
|
|
6
|
+
* a typed re-export.
|
|
7
|
+
*
|
|
8
|
+
* Wiki: docs/components/ScrollArea.md
|
|
9
|
+
*/
|
|
10
|
+
import { ScrollView, type ScrollViewProps } from 'react-native';
|
|
11
|
+
import { cn } from './internal/cn.js';
|
|
12
|
+
|
|
13
|
+
export interface ScrollAreaProps extends ScrollViewProps {
|
|
14
|
+
className?: string;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function ScrollArea({ className, children, ...props }: ScrollAreaProps) {
|
|
18
|
+
return (
|
|
19
|
+
<ScrollView
|
|
20
|
+
showsVerticalScrollIndicator
|
|
21
|
+
showsHorizontalScrollIndicator={false}
|
|
22
|
+
className={cn(className)}
|
|
23
|
+
{...props}
|
|
24
|
+
>
|
|
25
|
+
{children}
|
|
26
|
+
</ScrollView>
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export interface ScrollBarProps {
|
|
31
|
+
className?: string;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export function ScrollBar(_props: ScrollBarProps) {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* ScrollArea (web variant — React DOM).
|
|
5
|
+
*
|
|
6
|
+
* Custom-styled scrollable container powered by Radix ScrollArea.
|
|
7
|
+
* Thin translucent scrollbars that appear on hover/scroll and fade out.
|
|
8
|
+
*
|
|
9
|
+
* <ScrollArea className="h-72">
|
|
10
|
+
* <p>Long content…</p>
|
|
11
|
+
* </ScrollArea>
|
|
12
|
+
*
|
|
13
|
+
* Wiki: docs/components/ScrollArea.md
|
|
14
|
+
*/
|
|
15
|
+
import { forwardRef, type ComponentPropsWithoutRef, type ElementRef } from 'react';
|
|
16
|
+
import * as ScrollAreaPrimitive from '@radix-ui/react-scroll-area';
|
|
17
|
+
import { cn } from './internal/cn.js';
|
|
18
|
+
|
|
19
|
+
/* ── Root ───────────────────────────────────────────────────────────── */
|
|
20
|
+
|
|
21
|
+
export const ScrollArea = forwardRef<
|
|
22
|
+
ElementRef<typeof ScrollAreaPrimitive.Root>,
|
|
23
|
+
ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.Root>
|
|
24
|
+
>(function ScrollArea({ className, children, ...props }, ref) {
|
|
25
|
+
return (
|
|
26
|
+
<ScrollAreaPrimitive.Root
|
|
27
|
+
ref={ref}
|
|
28
|
+
className={cn('relative overflow-hidden', className)}
|
|
29
|
+
{...props}
|
|
30
|
+
>
|
|
31
|
+
<ScrollAreaPrimitive.Viewport className="h-full w-full rounded-[inherit]">
|
|
32
|
+
{children}
|
|
33
|
+
</ScrollAreaPrimitive.Viewport>
|
|
34
|
+
<ScrollBar />
|
|
35
|
+
<ScrollBar orientation="horizontal" />
|
|
36
|
+
<ScrollAreaPrimitive.Corner />
|
|
37
|
+
</ScrollAreaPrimitive.Root>
|
|
38
|
+
);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
/* ── ScrollBar ──────────────────────────────────────────────────────── */
|
|
42
|
+
|
|
43
|
+
export const ScrollBar = forwardRef<
|
|
44
|
+
ElementRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>,
|
|
45
|
+
ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>
|
|
46
|
+
>(function ScrollBar({ className, orientation = 'vertical', ...props }, ref) {
|
|
47
|
+
return (
|
|
48
|
+
<ScrollAreaPrimitive.ScrollAreaScrollbar
|
|
49
|
+
ref={ref}
|
|
50
|
+
orientation={orientation}
|
|
51
|
+
className={cn(
|
|
52
|
+
'flex touch-none select-none transition-colors duration-150',
|
|
53
|
+
orientation === 'vertical' && 'h-full w-2.5 border-l border-l-transparent p-px',
|
|
54
|
+
orientation === 'horizontal' && 'h-2.5 flex-col border-t border-t-transparent p-px',
|
|
55
|
+
className,
|
|
56
|
+
)}
|
|
57
|
+
{...props}
|
|
58
|
+
>
|
|
59
|
+
<ScrollAreaPrimitive.ScrollAreaThumb className="relative flex-1 rounded-full bg-border" />
|
|
60
|
+
</ScrollAreaPrimitive.ScrollAreaScrollbar>
|
|
61
|
+
);
|
|
62
|
+
});
|