@tulip-systems/core 0.6.0 → 0.7.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/LICENSE +662 -0
- package/dist/commands/client.d.mts +2 -1
- package/dist/commands/client.mjs +2 -1
- package/dist/components/client.d.mts +19 -3
- package/dist/components/client.mjs +18 -2
- package/dist/components/editor/components/menu-nodes.client.mjs +3 -3
- package/dist/components/editor/components/menu-nodes.client.mjs.map +1 -1
- package/dist/components/editor/components/menu.client.mjs +3 -3
- package/dist/components/editor/components/menu.client.mjs.map +1 -1
- package/dist/components/emails/forget-password-email.mjs +6 -6
- package/dist/components/emails/forget-password-email.mjs.map +1 -1
- package/dist/components/header/back-button.client.mjs +2 -2
- package/dist/components/header/back-button.client.mjs.map +1 -1
- package/dist/components/header/bottom-bar.client.mjs +2 -2
- package/dist/components/header/bottom-bar.client.mjs.map +1 -1
- package/dist/components/header/breadcrumbs.client.mjs +1 -1
- package/dist/components/header/breadcrumbs.client.mjs.map +1 -1
- package/dist/components/header/header.client.mjs +1 -1
- package/dist/components/header/header.client.mjs.map +1 -1
- package/dist/components/layouts/empty-page.mjs +2 -2
- package/dist/components/layouts/empty-page.mjs.map +1 -1
- package/dist/components/layouts/error-page.mjs +3 -3
- package/dist/components/layouts/error-page.mjs.map +1 -1
- package/dist/components/layouts/providers.client.d.mts.map +1 -1
- package/dist/components/layouts/providers.client.mjs +3 -2
- package/dist/components/layouts/providers.client.mjs.map +1 -1
- package/dist/components/layouts/root-loading.mjs +2 -2
- package/dist/components/layouts/root-loading.mjs.map +1 -1
- package/dist/components/layouts/tab-layout.mjs +1 -1
- package/dist/components/layouts/tab-layout.mjs.map +1 -1
- package/dist/components/lists/data-list.mjs +1 -1
- package/dist/components/lists/data-list.mjs.map +1 -1
- package/dist/components/lists/data-stack.mjs +1 -1
- package/dist/components/lists/data-stack.mjs.map +1 -1
- package/dist/components/navigation/admin-sidebar-header.client.mjs +3 -3
- package/dist/components/navigation/admin-sidebar-header.client.mjs.map +1 -1
- package/dist/components/navigation/admin-sidebar-skeleton.mjs +1 -1
- package/dist/components/navigation/admin-sidebar-skeleton.mjs.map +1 -1
- package/dist/components/ui/accordion.client.d.mts +26 -0
- package/dist/components/ui/accordion.client.d.mts.map +1 -0
- package/dist/components/ui/accordion.client.mjs +58 -0
- package/dist/components/ui/accordion.client.mjs.map +1 -0
- package/dist/components/ui/alert-dialog.client.d.mts +61 -0
- package/dist/components/ui/alert-dialog.client.d.mts.map +1 -0
- package/dist/components/ui/alert-dialog.client.mjs +104 -0
- package/dist/components/ui/alert-dialog.client.mjs.map +1 -0
- package/dist/components/ui/alert.d.mts +5 -1
- package/dist/components/ui/alert.d.mts.map +1 -1
- package/dist/components/ui/alert.mjs +13 -6
- package/dist/components/ui/alert.mjs.map +1 -1
- package/dist/components/ui/aspect-ratio.client.d.mts +10 -0
- package/dist/components/ui/aspect-ratio.client.d.mts.map +1 -0
- package/dist/components/ui/aspect-ratio.client.mjs +16 -0
- package/dist/components/ui/aspect-ratio.client.mjs.map +1 -0
- package/dist/components/ui/avatar.client.d.mts +21 -6
- package/dist/components/ui/avatar.client.d.mts.map +1 -1
- package/dist/components/ui/avatar.client.mjs +31 -9
- package/dist/components/ui/avatar.client.mjs.map +1 -1
- package/dist/components/ui/badge.d.mts +1 -1
- package/dist/components/ui/badge.d.mts.map +1 -1
- package/dist/components/ui/badge.mjs +11 -8
- package/dist/components/ui/badge.mjs.map +1 -1
- package/dist/components/ui/breadcrumb.d.mts +3 -1
- package/dist/components/ui/breadcrumb.d.mts.map +1 -1
- package/dist/components/ui/breadcrumb.mjs +7 -7
- package/dist/components/ui/breadcrumb.mjs.map +1 -1
- package/dist/components/ui/button-group.d.mts +29 -0
- package/dist/components/ui/button-group.d.mts.map +1 -0
- package/dist/components/ui/button-group.mjs +41 -0
- package/dist/components/ui/button-group.mjs.map +1 -0
- package/dist/components/ui/button.d.mts +1 -1
- package/dist/components/ui/button.d.mts.map +1 -1
- package/dist/components/ui/button.mjs +19 -13
- package/dist/components/ui/button.mjs.map +1 -1
- package/dist/components/ui/{calendar.d.mts → calendar.client.d.mts} +7 -4
- package/dist/components/ui/calendar.client.d.mts.map +1 -0
- package/dist/components/ui/{calendar.mjs → calendar.client.mjs} +22 -19
- package/dist/components/ui/calendar.client.mjs.map +1 -0
- package/dist/components/ui/card.d.mts +9 -2
- package/dist/components/ui/card.d.mts.map +1 -1
- package/dist/components/ui/card.mjs +15 -7
- package/dist/components/ui/card.mjs.map +1 -1
- package/dist/components/ui/{carousel.d.mts → carousel.client.d.mts} +12 -3
- package/dist/components/ui/carousel.client.d.mts.map +1 -0
- package/dist/components/ui/{carousel.mjs → carousel.client.mjs} +10 -10
- package/dist/components/ui/carousel.client.mjs.map +1 -0
- package/dist/components/ui/chart.client.d.mts.map +1 -1
- package/dist/components/ui/chart.client.mjs +11 -11
- package/dist/components/ui/chart.client.mjs.map +1 -1
- package/dist/components/ui/checkbox.client.d.mts +12 -0
- package/dist/components/ui/checkbox.client.d.mts.map +1 -0
- package/dist/components/ui/checkbox.client.mjs +24 -0
- package/dist/components/ui/checkbox.client.mjs.map +1 -0
- package/dist/components/ui/collapsible.client.d.mts +6 -6
- package/dist/components/ui/collapsible.client.d.mts.map +1 -1
- package/dist/components/ui/collapsible.client.mjs +6 -6
- package/dist/components/ui/collapsible.client.mjs.map +1 -1
- package/dist/components/ui/combobox-dropdown.client.d.mts +1 -1
- package/dist/components/ui/combobox-dropdown.client.mjs +2 -2
- package/dist/components/ui/combobox-dropdown.client.mjs.map +1 -1
- package/dist/components/ui/combobox.client.mjs +4 -4
- package/dist/components/ui/combobox.client.mjs.map +1 -1
- package/dist/components/ui/{command.d.mts → command.client.d.mts} +8 -2
- package/dist/components/ui/command.client.d.mts.map +1 -0
- package/dist/components/ui/command.client.mjs +91 -0
- package/dist/components/ui/command.client.mjs.map +1 -0
- package/dist/components/ui/context-menu.client.d.mts +86 -0
- package/dist/components/ui/context-menu.client.d.mts.map +1 -0
- package/dist/components/ui/context-menu.client.mjs +128 -0
- package/dist/components/ui/context-menu.client.mjs.map +1 -0
- package/dist/components/ui/date-picker.client.mjs +2 -2
- package/dist/components/ui/date-picker.client.mjs.map +1 -1
- package/dist/components/ui/dialog.client.d.mts +19 -12
- package/dist/components/ui/dialog.client.d.mts.map +1 -1
- package/dist/components/ui/dialog.client.mjs +40 -29
- package/dist/components/ui/dialog.client.mjs.map +1 -1
- package/dist/components/ui/drawer.client.d.mts.map +1 -1
- package/dist/components/ui/drawer.client.mjs +5 -5
- package/dist/components/ui/drawer.client.mjs.map +1 -1
- package/dist/components/ui/dropdown-menu.client.d.mts +85 -0
- package/dist/components/ui/dropdown-menu.client.d.mts.map +1 -0
- package/dist/components/ui/dropdown-menu.client.mjs +131 -0
- package/dist/components/ui/dropdown-menu.client.mjs.map +1 -0
- package/dist/components/ui/empty.d.mts +36 -0
- package/dist/components/ui/empty.d.mts.map +1 -0
- package/dist/components/ui/empty.mjs +62 -0
- package/dist/components/ui/empty.mjs.map +1 -0
- package/dist/components/ui/field.client.d.mts +65 -0
- package/dist/components/ui/field.client.d.mts.map +1 -0
- package/dist/components/ui/field.client.mjs +114 -0
- package/dist/components/ui/field.client.mjs.map +1 -0
- package/dist/components/ui/form.client.d.mts +3 -4
- package/dist/components/ui/form.client.d.mts.map +1 -1
- package/dist/components/ui/form.client.mjs +4 -4
- package/dist/components/ui/form.client.mjs.map +1 -1
- package/dist/components/ui/hover-card.client.d.mts +6 -6
- package/dist/components/ui/hover-card.client.d.mts.map +1 -1
- package/dist/components/ui/hover-card.client.mjs +14 -11
- package/dist/components/ui/hover-card.client.mjs.map +1 -1
- package/dist/components/ui/{input-date-time.d.mts → input-date-time.client.d.mts} +7 -7
- package/dist/components/ui/input-date-time.client.d.mts.map +1 -0
- package/dist/components/ui/{input-date-time.mjs → input-date-time.client.mjs} +8 -8
- package/dist/components/ui/input-date-time.client.mjs.map +1 -0
- package/dist/components/ui/input-date.d.mts +1 -1
- package/dist/components/ui/input-date.d.mts.map +1 -1
- package/dist/components/ui/input-date.mjs.map +1 -1
- package/dist/components/ui/input-group.client.d.mts +59 -0
- package/dist/components/ui/input-group.client.d.mts.map +1 -0
- package/dist/components/ui/input-group.client.mjs +106 -0
- package/dist/components/ui/input-group.client.mjs.map +1 -0
- package/dist/components/ui/input-recipient.mjs +11 -11
- package/dist/components/ui/input-recipient.mjs.map +1 -1
- package/dist/components/ui/input-time.d.mts +1 -1
- package/dist/components/ui/input-time.d.mts.map +1 -1
- package/dist/components/ui/input-time.mjs.map +1 -1
- package/dist/components/ui/input.d.mts.map +1 -1
- package/dist/components/ui/input.mjs +1 -1
- package/dist/components/ui/input.mjs.map +1 -1
- package/dist/components/ui/item.d.mts +63 -0
- package/dist/components/ui/item.d.mts.map +1 -0
- package/dist/components/ui/item.mjs +119 -0
- package/dist/components/ui/item.mjs.map +1 -0
- package/dist/components/ui/kbd.d.mts +14 -0
- package/dist/components/ui/kbd.d.mts.map +1 -0
- package/dist/components/ui/kbd.mjs +22 -0
- package/dist/components/ui/kbd.mjs.map +1 -0
- package/dist/components/ui/label.d.mts +4 -4
- package/dist/components/ui/label.d.mts.map +1 -1
- package/dist/components/ui/label.mjs +5 -5
- package/dist/components/ui/label.mjs.map +1 -1
- package/dist/components/ui/loader.d.mts +7 -0
- package/dist/components/ui/loader.d.mts.map +1 -0
- package/dist/components/ui/loader.mjs +63 -0
- package/dist/components/ui/loader.mjs.map +1 -0
- package/dist/components/ui/navigation-menu.d.mts +11 -11
- package/dist/components/ui/navigation-menu.d.mts.map +1 -1
- package/dist/components/ui/navigation-menu.mjs +18 -20
- package/dist/components/ui/navigation-menu.mjs.map +1 -1
- package/dist/components/ui/pagination.d.mts +8 -2
- package/dist/components/ui/pagination.d.mts.map +1 -1
- package/dist/components/ui/pagination.mjs +29 -21
- package/dist/components/ui/pagination.mjs.map +1 -1
- package/dist/components/ui/popover.client.d.mts +35 -0
- package/dist/components/ui/popover.client.d.mts.map +1 -0
- package/dist/components/ui/popover.client.mjs +59 -0
- package/dist/components/ui/popover.client.mjs.map +1 -0
- package/dist/components/ui/progress.client.d.mts +4 -4
- package/dist/components/ui/progress.client.d.mts.map +1 -1
- package/dist/components/ui/progress.client.mjs +7 -7
- package/dist/components/ui/progress.client.mjs.map +1 -1
- package/dist/components/ui/radio-group.d.mts +5 -5
- package/dist/components/ui/radio-group.d.mts.map +1 -1
- package/dist/components/ui/radio-group.mjs +10 -11
- package/dist/components/ui/radio-group.mjs.map +1 -1
- package/dist/components/ui/resizable.client.d.mts +3 -4
- package/dist/components/ui/resizable.client.d.mts.map +1 -1
- package/dist/components/ui/resizable.client.mjs +5 -9
- package/dist/components/ui/resizable.client.mjs.map +1 -1
- package/dist/components/ui/scroll-area.d.mts +5 -5
- package/dist/components/ui/scroll-area.d.mts.map +1 -1
- package/dist/components/ui/scroll-area.mjs +12 -11
- package/dist/components/ui/scroll-area.mjs.map +1 -1
- package/dist/components/ui/select.client.d.mts +18 -13
- package/dist/components/ui/select.client.d.mts.map +1 -1
- package/dist/components/ui/select.client.mjs +37 -32
- package/dist/components/ui/select.client.mjs.map +1 -1
- package/dist/components/ui/separator.d.mts +4 -4
- package/dist/components/ui/separator.d.mts.map +1 -1
- package/dist/components/ui/separator.mjs +6 -6
- package/dist/components/ui/separator.mjs.map +1 -1
- package/dist/components/ui/sheet.client.d.mts +9 -7
- package/dist/components/ui/sheet.client.d.mts.map +1 -1
- package/dist/components/ui/sheet.client.mjs +30 -20
- package/dist/components/ui/sheet.client.mjs.map +1 -1
- package/dist/components/ui/sidebar.client.mjs +28 -28
- package/dist/components/ui/sidebar.client.mjs.map +1 -1
- package/dist/components/ui/skeleton.mjs +1 -1
- package/dist/components/ui/skeleton.mjs.map +1 -1
- package/dist/components/ui/slider.d.mts +4 -4
- package/dist/components/ui/slider.d.mts.map +1 -1
- package/dist/components/ui/slider.mjs +11 -11
- package/dist/components/ui/slider.mjs.map +1 -1
- package/dist/components/ui/spinner.d.mts +10 -0
- package/dist/components/ui/spinner.d.mts.map +1 -0
- package/dist/components/ui/spinner.mjs +9 -55
- package/dist/components/ui/spinner.mjs.map +1 -1
- package/dist/components/ui/switch.client.d.mts +15 -0
- package/dist/components/ui/switch.client.d.mts.map +1 -0
- package/dist/components/ui/switch.client.mjs +23 -0
- package/dist/components/ui/switch.client.mjs.map +1 -0
- package/dist/components/ui/tabs.client.d.mts +31 -0
- package/dist/components/ui/tabs.client.d.mts.map +1 -0
- package/dist/components/ui/tabs.client.mjs +49 -0
- package/dist/components/ui/tabs.client.mjs.map +1 -0
- package/dist/components/ui/textarea.d.mts.map +1 -1
- package/dist/components/ui/textarea.mjs +1 -1
- package/dist/components/ui/textarea.mjs.map +1 -1
- package/dist/components/ui/toggle-group.client.d.mts +11 -6
- package/dist/components/ui/toggle-group.client.d.mts.map +1 -1
- package/dist/components/ui/toggle-group.client.mjs +20 -12
- package/dist/components/ui/toggle-group.client.mjs.map +1 -1
- package/dist/components/ui/{toggle.d.mts → toggle.client.d.mts} +6 -6
- package/dist/components/ui/toggle.client.d.mts.map +1 -0
- package/dist/components/ui/toggle.client.mjs +40 -0
- package/dist/components/ui/toggle.client.mjs.map +1 -0
- package/dist/components/ui/tooltip.client.d.mts +7 -7
- package/dist/components/ui/tooltip.client.d.mts.map +1 -1
- package/dist/components/ui/tooltip.client.mjs +10 -10
- package/dist/components/ui/tooltip.client.mjs.map +1 -1
- package/dist/components.d.mts +12 -20
- package/dist/components.mjs +12 -20
- package/dist/inline-edit/client.d.mts +3 -3
- package/dist/lib/hooks/use-indicator.d.mts.map +1 -1
- package/dist/lib/hooks/use-indicator.mjs +11 -8
- package/dist/lib/hooks/use-indicator.mjs.map +1 -1
- package/dist/modules/auth/components/auth-layout.server.mjs +3 -3
- package/dist/modules/auth/components/auth-layout.server.mjs.map +1 -1
- package/dist/modules/auth/components/create-first-user-page.client.mjs +3 -3
- package/dist/modules/auth/components/create-first-user-page.client.mjs.map +1 -1
- package/dist/modules/auth/components/forget-password-page.client.mjs +1 -1
- package/dist/modules/auth/components/forget-password-page.client.mjs.map +1 -1
- package/dist/modules/auth/components/login-page.client.mjs +5 -5
- package/dist/modules/auth/components/login-page.client.mjs.map +1 -1
- package/dist/modules/auth/components/reset-password-page.client.mjs +5 -5
- package/dist/modules/auth/components/reset-password-page.client.mjs.map +1 -1
- package/dist/modules/commands/components/alert-dialog-command.client.d.mts +9 -9
- package/dist/modules/commands/components/alert-dialog-command.client.d.mts.map +1 -1
- package/dist/modules/commands/components/alert-dialog-command.client.mjs +3 -3
- package/dist/modules/commands/components/alert-dialog-command.client.mjs.map +1 -1
- package/dist/modules/commands/components/click-command.client.mjs +2 -2
- package/dist/modules/commands/components/click-command.client.mjs.map +1 -1
- package/dist/modules/commands/components/dialog-command.client.d.mts +8 -8
- package/dist/modules/commands/components/dialog-command.client.d.mts.map +1 -1
- package/dist/modules/commands/components/dialog-command.client.mjs +2 -2
- package/dist/modules/commands/components/dialog-command.client.mjs.map +1 -1
- package/dist/modules/commands/components/dropdown-command.client.mjs +2 -2
- package/dist/modules/commands/components/dropdown-command.client.mjs.map +1 -1
- package/dist/modules/commands/components/empty-command.client.mjs +2 -2
- package/dist/modules/commands/components/empty-command.client.mjs.map +1 -1
- package/dist/modules/commands/components/form-dialog-command.client.d.mts +11 -9
- package/dist/modules/commands/components/form-dialog-command.client.d.mts.map +1 -1
- package/dist/modules/commands/components/form-dialog-command.client.mjs +8 -6
- package/dist/modules/commands/components/form-dialog-command.client.mjs.map +1 -1
- package/dist/modules/commands/hooks/use-command-menu.client.d.mts +8 -1
- package/dist/modules/commands/hooks/use-command-menu.client.d.mts.map +1 -1
- package/dist/modules/commands/hooks/use-command-menu.client.mjs.map +1 -1
- package/dist/modules/commands/menus/context-menu.client.d.mts +3 -3
- package/dist/modules/commands/menus/context-menu.client.d.mts.map +1 -1
- package/dist/modules/commands/menus/context-menu.client.mjs +1 -1
- package/dist/modules/commands/menus/context-menu.client.mjs.map +1 -1
- package/dist/modules/commands/menus/dropdown-menu.client.mjs +2 -2
- package/dist/modules/commands/menus/dropdown-menu.client.mjs.map +1 -1
- package/dist/modules/commands/menus/floating-menu.client.d.mts +19 -0
- package/dist/modules/commands/menus/floating-menu.client.d.mts.map +1 -0
- package/dist/modules/commands/menus/{data-table-menu.client.mjs → floating-menu.client.mjs} +11 -11
- package/dist/modules/commands/menus/floating-menu.client.mjs.map +1 -0
- package/dist/modules/commands/utils/archive-command.client.mjs +1 -1
- package/dist/modules/commands/utils/archive-command.client.mjs.map +1 -1
- package/dist/modules/commands/utils/delete-command.client.mjs +1 -1
- package/dist/modules/commands/utils/delete-command.client.mjs.map +1 -1
- package/dist/modules/data-tables/components/cell/select.client.mjs +1 -1
- package/dist/modules/data-tables/components/cell/select.client.mjs.map +1 -1
- package/dist/modules/data-tables/components/column-header.mjs +5 -5
- package/dist/modules/data-tables/components/column-header.mjs.map +1 -1
- package/dist/modules/data-tables/components/filters/combobox.client.mjs +6 -6
- package/dist/modules/data-tables/components/filters/combobox.client.mjs.map +1 -1
- package/dist/modules/data-tables/components/filters/slider.client.mjs +2 -2
- package/dist/modules/data-tables/components/filters/slider.client.mjs.map +1 -1
- package/dist/modules/data-tables/components/header.mjs +1 -1
- package/dist/modules/data-tables/components/header.mjs.map +1 -1
- package/dist/modules/data-tables/components/skeleton.mjs +2 -2
- package/dist/modules/data-tables/components/skeleton.mjs.map +1 -1
- package/dist/modules/data-tables/components/table.mjs +3 -3
- package/dist/modules/data-tables/components/table.mjs.map +1 -1
- package/dist/modules/data-tables/components/toolbar.mjs +1 -1
- package/dist/modules/data-tables/components/toolbar.mjs.map +1 -1
- package/dist/modules/data-tables/strategies/pagination/components.mjs +3 -3
- package/dist/modules/data-tables/strategies/pagination/components.mjs.map +1 -1
- package/dist/modules/data-tables/tables/data-table/components/table.mjs +8 -2
- package/dist/modules/data-tables/tables/data-table/components/table.mjs.map +1 -1
- package/dist/modules/data-tables/tables/inline-table/components/cells/common.mjs +1 -1
- package/dist/modules/data-tables/tables/inline-table/components/cells/common.mjs.map +1 -1
- package/dist/modules/data-tables/tables/inline-table/components/cells/drag-handle.client.mjs +1 -1
- package/dist/modules/data-tables/tables/inline-table/components/cells/drag-handle.client.mjs.map +1 -1
- package/dist/modules/data-tables/tables/inline-table/components/cells/read-only.mjs +1 -1
- package/dist/modules/data-tables/tables/inline-table/components/cells/read-only.mjs.map +1 -1
- package/dist/modules/data-tables/tables/inline-table/components/table.mjs +8 -2
- package/dist/modules/data-tables/tables/inline-table/components/table.mjs.map +1 -1
- package/dist/modules/inline-edit/components/combobox-dropdown.client.mjs +5 -1
- package/dist/modules/inline-edit/components/combobox-dropdown.client.mjs.map +1 -1
- package/dist/modules/inline-edit/components/combobox.client.mjs +5 -1
- package/dist/modules/inline-edit/components/combobox.client.mjs.map +1 -1
- package/dist/modules/inline-edit/components/date-input.client.mjs +8 -4
- package/dist/modules/inline-edit/components/date-input.client.mjs.map +1 -1
- package/dist/modules/inline-edit/components/date-picker.client.mjs +7 -3
- package/dist/modules/inline-edit/components/date-picker.client.mjs.map +1 -1
- package/dist/modules/inline-edit/components/date-time.client.d.mts +1 -1
- package/dist/modules/inline-edit/components/date-time.client.d.mts.map +1 -1
- package/dist/modules/inline-edit/components/date-time.client.mjs +7 -2
- package/dist/modules/inline-edit/components/date-time.client.mjs.map +1 -1
- package/dist/modules/inline-edit/components/editor.client.mjs +5 -1
- package/dist/modules/inline-edit/components/editor.client.mjs.map +1 -1
- package/dist/modules/inline-edit/components/input-recipient.client.mjs +5 -1
- package/dist/modules/inline-edit/components/input-recipient.client.mjs.map +1 -1
- package/dist/modules/inline-edit/components/input-toggle.client.mjs +7 -3
- package/dist/modules/inline-edit/components/input-toggle.client.mjs.map +1 -1
- package/dist/modules/inline-edit/components/input.client.d.mts.map +1 -1
- package/dist/modules/inline-edit/components/input.client.mjs +18 -6
- package/dist/modules/inline-edit/components/input.client.mjs.map +1 -1
- package/dist/modules/inline-edit/components/select.client.d.mts +8 -11
- package/dist/modules/inline-edit/components/select.client.d.mts.map +1 -1
- package/dist/modules/inline-edit/components/select.client.mjs +5 -1
- package/dist/modules/inline-edit/components/select.client.mjs.map +1 -1
- package/dist/modules/inline-edit/components/switch.client.d.mts +3 -2
- package/dist/modules/inline-edit/components/switch.client.d.mts.map +1 -1
- package/dist/modules/inline-edit/components/switch.client.mjs +6 -2
- package/dist/modules/inline-edit/components/switch.client.mjs.map +1 -1
- package/dist/modules/inline-edit/components/toggle.client.mjs +6 -2
- package/dist/modules/inline-edit/components/toggle.client.mjs.map +1 -1
- package/dist/modules/inline-edit/hooks/use-inline.client.d.mts +20 -5
- package/dist/modules/inline-edit/hooks/use-inline.client.d.mts.map +1 -1
- package/dist/modules/inline-edit/hooks/use-inline.client.mjs +11 -8
- package/dist/modules/inline-edit/hooks/use-inline.client.mjs.map +1 -1
- package/dist/modules/inline-edit/lib/variants.mjs +1 -1
- package/dist/modules/inline-edit/lib/variants.mjs.map +1 -1
- package/dist/modules/storage/components/dropzone.client.d.mts +2 -2
- package/dist/modules/storage/components/dropzone.client.d.mts.map +1 -1
- package/dist/modules/storage/components/dropzone.client.mjs +8 -8
- package/dist/modules/storage/components/dropzone.client.mjs.map +1 -1
- package/dist/modules/storage/components/image-grid.client.mjs +5 -5
- package/dist/modules/storage/components/image-grid.client.mjs.map +1 -1
- package/dist/modules/storage/components/upload-zone-context.client.d.mts +1 -0
- package/dist/modules/storage/components/upload-zone-context.client.d.mts.map +1 -1
- package/dist/modules/storage/components/upload-zone-context.client.mjs.map +1 -1
- package/dist/modules/storage/components/upload-zone.client.d.mts +2 -1
- package/dist/modules/storage/components/upload-zone.client.d.mts.map +1 -1
- package/dist/modules/storage/components/upload-zone.client.mjs +6 -4
- package/dist/modules/storage/components/upload-zone.client.mjs.map +1 -1
- package/package.json +6 -31
- package/src/components/editor/components/menu-nodes.client.tsx +3 -3
- package/src/components/editor/components/menu.client.tsx +3 -3
- package/src/components/emails/forget-password-email.tsx +6 -6
- package/src/components/entry.client.ts +16 -0
- package/src/components/entry.ts +6 -14
- package/src/components/header/back-button.client.tsx +2 -2
- package/src/components/header/bottom-bar.client.tsx +2 -2
- package/src/components/header/breadcrumbs.client.tsx +1 -1
- package/src/components/header/header.client.tsx +1 -1
- package/src/components/layouts/empty-page.tsx +2 -2
- package/src/components/layouts/error-page.tsx +3 -3
- package/src/components/layouts/providers.client.tsx +8 -5
- package/src/components/layouts/root-loading.tsx +2 -2
- package/src/components/layouts/tab-layout.tsx +1 -1
- package/src/components/lists/data-list.tsx +1 -1
- package/src/components/lists/data-stack.tsx +1 -1
- package/src/components/navigation/admin-sidebar-header.client.tsx +3 -3
- package/src/components/navigation/admin-sidebar-skeleton.tsx +1 -1
- package/src/components/navigation/admin-sidebar.client.tsx +1 -0
- package/src/components/ui/accordion.client.tsx +83 -0
- package/src/components/ui/alert-dialog.client.tsx +181 -0
- package/src/components/ui/alert.tsx +15 -7
- package/src/components/ui/aspect-ratio.client.tsx +9 -0
- package/src/components/ui/avatar.client.tsx +61 -6
- package/src/components/ui/badge.tsx +17 -11
- package/src/components/ui/breadcrumb.tsx +9 -10
- package/src/components/ui/button-group.tsx +78 -0
- package/src/components/ui/button.tsx +26 -16
- package/src/components/ui/{calendar.tsx → calendar.client.tsx} +27 -20
- package/src/components/ui/card.tsx +41 -8
- package/src/components/ui/{carousel.tsx → carousel.client.tsx} +12 -12
- package/src/components/ui/chart.client.tsx +105 -103
- package/src/components/ui/checkbox.client.tsx +28 -0
- package/src/components/ui/collapsible.client.tsx +2 -2
- package/src/components/ui/combobox-dropdown.client.tsx +2 -2
- package/src/components/ui/combobox.client.tsx +6 -6
- package/src/components/ui/command.client.tsx +179 -0
- package/src/components/ui/{context-menu.tsx → context-menu.client.tsx} +86 -64
- package/src/components/ui/date-picker.client.tsx +2 -2
- package/src/components/ui/dialog.client.tsx +43 -20
- package/src/components/ui/drawer.client.tsx +13 -15
- package/src/components/ui/{dropdown-menu.tsx → dropdown-menu.client.tsx} +45 -24
- package/src/components/ui/empty.tsx +93 -0
- package/src/components/ui/field.client.tsx +224 -0
- package/src/components/ui/form.client.tsx +4 -4
- package/src/components/ui/hover-card.client.tsx +14 -13
- package/src/components/ui/{input-date-time.tsx → input-date-time.client.tsx} +18 -11
- package/src/components/ui/input-date.tsx +1 -1
- package/src/components/ui/input-group.client.tsx +191 -0
- package/src/components/ui/input-recipient.tsx +12 -12
- package/src/components/ui/input-time.tsx +1 -1
- package/src/components/ui/input.tsx +2 -4
- package/src/components/ui/item.tsx +182 -0
- package/src/components/ui/kbd.tsx +26 -0
- package/src/components/ui/label.tsx +2 -3
- package/src/components/ui/loader.tsx +51 -0
- package/src/components/ui/navigation-menu.tsx +14 -17
- package/src/components/ui/pagination.tsx +31 -26
- package/src/components/ui/popover.client.tsx +73 -0
- package/src/components/ui/progress.client.tsx +6 -4
- package/src/components/ui/radio-group.tsx +5 -7
- package/src/components/ui/resizable.client.tsx +9 -19
- package/src/components/ui/scroll-area.tsx +5 -7
- package/src/components/ui/select.client.tsx +40 -22
- package/src/components/ui/separator.tsx +3 -4
- package/src/components/ui/sheet.client.tsx +19 -18
- package/src/components/ui/sidebar.client.tsx +27 -27
- package/src/components/ui/skeleton.tsx +1 -1
- package/src/components/ui/slider.tsx +5 -10
- package/src/components/ui/spinner.tsx +12 -48
- package/src/components/ui/switch.client.tsx +32 -0
- package/src/components/ui/tabs.client.tsx +79 -0
- package/src/components/ui/textarea.tsx +1 -2
- package/src/components/ui/toggle-group.client.tsx +26 -10
- package/src/components/ui/toggle.client.tsx +44 -0
- package/src/components/ui/tooltip.client.tsx +4 -9
- package/src/lib/hooks/use-indicator.tsx +14 -8
- package/src/modules/auth/components/auth-layout.server.tsx +3 -3
- package/src/modules/auth/components/create-first-user-page.client.tsx +4 -4
- package/src/modules/auth/components/forget-password-page.client.tsx +1 -1
- package/src/modules/auth/components/login-page.client.tsx +6 -6
- package/src/modules/auth/components/reset-password-page.client.tsx +7 -7
- package/src/modules/commands/components/alert-dialog-command.client.tsx +20 -16
- package/src/modules/commands/components/click-command.client.tsx +2 -2
- package/src/modules/commands/components/dialog-command.client.tsx +11 -10
- package/src/modules/commands/components/dropdown-command.client.tsx +2 -2
- package/src/modules/commands/components/empty-command.client.tsx +2 -2
- package/src/modules/commands/components/form-dialog-command.client.tsx +29 -13
- package/src/modules/commands/entry.client.ts +16 -0
- package/src/modules/commands/hooks/use-command-menu.client.tsx +2 -0
- package/src/modules/commands/menus/context-menu.client.tsx +3 -4
- package/src/modules/commands/menus/dropdown-menu.client.tsx +2 -2
- package/src/modules/commands/menus/floating-menu.client.tsx +54 -0
- package/src/modules/commands/utils/archive-command.client.tsx +1 -1
- package/src/modules/commands/utils/delete-command.client.tsx +1 -1
- package/src/modules/data-tables/components/cell/select.client.tsx +1 -1
- package/src/modules/data-tables/components/column-header.tsx +5 -5
- package/src/modules/data-tables/components/filters/combobox.client.tsx +6 -6
- package/src/modules/data-tables/components/filters/slider.client.tsx +2 -2
- package/src/modules/data-tables/components/header.tsx +1 -1
- package/src/modules/data-tables/components/skeleton.tsx +2 -2
- package/src/modules/data-tables/components/table.tsx +3 -3
- package/src/modules/data-tables/components/toolbar.tsx +1 -1
- package/src/modules/data-tables/strategies/pagination/components.tsx +3 -3
- package/src/modules/data-tables/tables/data-table/components/table.tsx +11 -2
- package/src/modules/data-tables/tables/inline-table/components/cells/common.tsx +1 -1
- package/src/modules/data-tables/tables/inline-table/components/cells/drag-handle.client.tsx +1 -1
- package/src/modules/data-tables/tables/inline-table/components/cells/read-only.tsx +1 -1
- package/src/modules/data-tables/tables/inline-table/components/table.tsx +11 -2
- package/src/modules/inline-edit/components/combobox-dropdown.client.tsx +4 -0
- package/src/modules/inline-edit/components/combobox.client.tsx +4 -0
- package/src/modules/inline-edit/components/date-input.client.tsx +7 -3
- package/src/modules/inline-edit/components/date-picker.client.tsx +6 -2
- package/src/modules/inline-edit/components/date-time.client.tsx +16 -2
- package/src/modules/inline-edit/components/editor.client.tsx +4 -0
- package/src/modules/inline-edit/components/input-recipient.client.tsx +4 -0
- package/src/modules/inline-edit/components/input-toggle.client.tsx +6 -2
- package/src/modules/inline-edit/components/input.client.tsx +15 -3
- package/src/modules/inline-edit/components/select.client.tsx +10 -20
- package/src/modules/inline-edit/components/switch.client.tsx +7 -3
- package/src/modules/inline-edit/components/toggle.client.tsx +5 -1
- package/src/modules/inline-edit/hooks/use-inline.client.tsx +37 -13
- package/src/modules/inline-edit/lib/parsers.ts +9 -0
- package/src/modules/inline-edit/lib/variants.ts +1 -1
- package/src/modules/storage/components/dropzone.client.tsx +8 -8
- package/src/modules/storage/components/image-grid.client.tsx +5 -5
- package/src/modules/storage/components/upload-zone-context.client.tsx +1 -0
- package/src/modules/storage/components/upload-zone.client.tsx +9 -3
- package/src/styles.css +1 -3
- package/dist/components/ui/accordion.d.mts +0 -25
- package/dist/components/ui/accordion.d.mts.map +0 -1
- package/dist/components/ui/accordion.mjs +0 -46
- package/dist/components/ui/accordion.mjs.map +0 -1
- package/dist/components/ui/alert-dialog.d.mts +0 -43
- package/dist/components/ui/alert-dialog.d.mts.map +0 -1
- package/dist/components/ui/alert-dialog.mjs +0 -84
- package/dist/components/ui/alert-dialog.mjs.map +0 -1
- package/dist/components/ui/aspect-ratio.d.mts +0 -8
- package/dist/components/ui/aspect-ratio.d.mts.map +0 -1
- package/dist/components/ui/aspect-ratio.mjs +0 -16
- package/dist/components/ui/aspect-ratio.mjs.map +0 -1
- package/dist/components/ui/calendar.d.mts.map +0 -1
- package/dist/components/ui/calendar.mjs.map +0 -1
- package/dist/components/ui/carousel.d.mts.map +0 -1
- package/dist/components/ui/carousel.mjs.map +0 -1
- package/dist/components/ui/checkbox.d.mts +0 -12
- package/dist/components/ui/checkbox.d.mts.map +0 -1
- package/dist/components/ui/checkbox.mjs +0 -24
- package/dist/components/ui/checkbox.mjs.map +0 -1
- package/dist/components/ui/command.d.mts.map +0 -1
- package/dist/components/ui/command.mjs +0 -88
- package/dist/components/ui/command.mjs.map +0 -1
- package/dist/components/ui/context-menu.d.mts +0 -77
- package/dist/components/ui/context-menu.d.mts.map +0 -1
- package/dist/components/ui/context-menu.mjs +0 -125
- package/dist/components/ui/context-menu.mjs.map +0 -1
- package/dist/components/ui/dropdown-menu.d.mts +0 -78
- package/dist/components/ui/dropdown-menu.d.mts.map +0 -1
- package/dist/components/ui/dropdown-menu.mjs +0 -126
- package/dist/components/ui/dropdown-menu.mjs.map +0 -1
- package/dist/components/ui/input-date-time.d.mts.map +0 -1
- package/dist/components/ui/input-date-time.mjs.map +0 -1
- package/dist/components/ui/popover.d.mts +0 -23
- package/dist/components/ui/popover.d.mts.map +0 -1
- package/dist/components/ui/popover.mjs +0 -38
- package/dist/components/ui/popover.mjs.map +0 -1
- package/dist/components/ui/switch.d.mts +0 -12
- package/dist/components/ui/switch.d.mts.map +0 -1
- package/dist/components/ui/switch.mjs +0 -22
- package/dist/components/ui/switch.mjs.map +0 -1
- package/dist/components/ui/tabs.d.mts +0 -24
- package/dist/components/ui/tabs.d.mts.map +0 -1
- package/dist/components/ui/tabs.mjs +0 -39
- package/dist/components/ui/tabs.mjs.map +0 -1
- package/dist/components/ui/toggle.d.mts.map +0 -1
- package/dist/components/ui/toggle.mjs +0 -40
- package/dist/components/ui/toggle.mjs.map +0 -1
- package/dist/modules/commands/menus/data-table-menu.client.mjs.map +0 -1
- package/src/components/ui/accordion.tsx +0 -63
- package/src/components/ui/alert-dialog.tsx +0 -133
- package/src/components/ui/aspect-ratio.tsx +0 -9
- package/src/components/ui/checkbox.tsx +0 -29
- package/src/components/ui/command.tsx +0 -154
- package/src/components/ui/popover.tsx +0 -42
- package/src/components/ui/switch.tsx +0 -28
- package/src/components/ui/tabs.tsx +0 -54
- package/src/components/ui/toggle.tsx +0 -46
- package/src/modules/commands/menus/data-table-menu.client.tsx +0 -46
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { Button } from "./button.mjs";
|
|
2
|
+
import { DateTimeInputProps } from "./input-date-time.client.mjs";
|
|
3
|
+
import { DateInputProps } from "./input-date.mjs";
|
|
4
|
+
import { TimeInputProps } from "./input-time.mjs";
|
|
5
|
+
import * as react_jsx_runtime0 from "react/jsx-runtime";
|
|
6
|
+
import { VariantProps } from "class-variance-authority";
|
|
7
|
+
import * as React$1 from "react";
|
|
8
|
+
import * as class_variance_authority_types0 from "class-variance-authority/types";
|
|
9
|
+
|
|
10
|
+
//#region src/components/ui/input-group.client.d.ts
|
|
11
|
+
declare function InputGroup({
|
|
12
|
+
className,
|
|
13
|
+
...props
|
|
14
|
+
}: React$1.ComponentProps<"div">): react_jsx_runtime0.JSX.Element;
|
|
15
|
+
declare const inputGroupAddonVariants: (props?: ({
|
|
16
|
+
align?: "inline-start" | "inline-end" | "block-start" | "block-end" | null | undefined;
|
|
17
|
+
} & class_variance_authority_types0.ClassProp) | undefined) => string;
|
|
18
|
+
declare function InputGroupAddon({
|
|
19
|
+
className,
|
|
20
|
+
align,
|
|
21
|
+
...props
|
|
22
|
+
}: React$1.ComponentProps<"div"> & VariantProps<typeof inputGroupAddonVariants>): react_jsx_runtime0.JSX.Element;
|
|
23
|
+
declare const inputGroupButtonVariants: (props?: ({
|
|
24
|
+
size?: "xs" | "sm" | "icon-xs" | "icon-sm" | null | undefined;
|
|
25
|
+
} & class_variance_authority_types0.ClassProp) | undefined) => string;
|
|
26
|
+
declare function InputGroupButton({
|
|
27
|
+
className,
|
|
28
|
+
type,
|
|
29
|
+
variant,
|
|
30
|
+
size,
|
|
31
|
+
...props
|
|
32
|
+
}: Omit<React$1.ComponentProps<typeof Button>, "size"> & VariantProps<typeof inputGroupButtonVariants>): react_jsx_runtime0.JSX.Element;
|
|
33
|
+
declare function InputGroupText({
|
|
34
|
+
className,
|
|
35
|
+
...props
|
|
36
|
+
}: React$1.ComponentProps<"span">): react_jsx_runtime0.JSX.Element;
|
|
37
|
+
declare function InputGroupInput({
|
|
38
|
+
className,
|
|
39
|
+
...props
|
|
40
|
+
}: React$1.ComponentProps<"input">): react_jsx_runtime0.JSX.Element;
|
|
41
|
+
declare function InputGroupTextarea({
|
|
42
|
+
className,
|
|
43
|
+
...props
|
|
44
|
+
}: React$1.ComponentProps<"textarea">): react_jsx_runtime0.JSX.Element;
|
|
45
|
+
declare function InputGroupTimeInput({
|
|
46
|
+
className,
|
|
47
|
+
...props
|
|
48
|
+
}: TimeInputProps): react_jsx_runtime0.JSX.Element;
|
|
49
|
+
declare function InputGroupDateInput({
|
|
50
|
+
className,
|
|
51
|
+
...props
|
|
52
|
+
}: DateInputProps): react_jsx_runtime0.JSX.Element;
|
|
53
|
+
declare function InputGroupDateTimeInput({
|
|
54
|
+
className,
|
|
55
|
+
...props
|
|
56
|
+
}: DateTimeInputProps): react_jsx_runtime0.JSX.Element;
|
|
57
|
+
//#endregion
|
|
58
|
+
export { InputGroup, InputGroupAddon, InputGroupButton, InputGroupDateInput, InputGroupDateTimeInput, InputGroupInput, InputGroupText, InputGroupTextarea, InputGroupTimeInput };
|
|
59
|
+
//# sourceMappingURL=input-group.client.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-group.client.d.mts","names":[],"sources":["../../../src/components/ui/input-group.client.tsx"],"mappings":";;;;;;;;;;iBAYS,UAAA,CAAA;EAAa,SAAA;EAAA,GAAc;AAAA,GAAS,OAAA,CAAM,cAAA,UAAqB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,cAelE,uBAAA,GAAuB,KAAA;;IAiB5B,+BAAA,CAAA,SAAA;AAAA,iBAEQ,eAAA,CAAA;EACP,SAAA;EACA,KAAA;EAAA,GACG;AAAA,GACF,OAAA,CAAM,cAAA,UAAwB,YAAA,QAAoB,uBAAA,IAAwB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,cAoBvE,wBAAA,GAAwB,KAAA;;IAY5B,+BAAA,CAAA,SAAA;AAAA,iBAEO,gBAAA,CAAA;EACP,SAAA;EACA,IAAA;EACA,OAAA;EACA,IAAA;EAAA,GACG;AAAA,GACF,IAAA,CAAK,OAAA,CAAM,cAAA,QAAsB,MAAA,aAClC,YAAA,QAAoB,wBAAA,IAAyB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAYtC,cAAA,CAAA;EAAiB,SAAA;EAAA,GAAc;AAAA,GAAS,OAAA,CAAM,cAAA,WAAsB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAYpE,eAAA,CAAA;EAAkB,SAAA;EAAA,GAAc;AAAA,GAAS,OAAA,CAAM,cAAA,YAAuB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAatE,kBAAA,CAAA;EAAqB,SAAA;EAAA,GAAc;AAAA,GAAS,OAAA,CAAM,cAAA,eAA0B,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAa5E,mBAAA,CAAA;EAAsB,SAAA;EAAA,GAAc;AAAA,GAAS,cAAA,GAAc,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAa3D,mBAAA,CAAA;EAAsB,SAAA;EAAA,GAAc;AAAA,GAAS,cAAA,GAAc,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAa3D,uBAAA,CAAA;EAA0B,SAAA;EAAA,GAAc;AAAA,GAAS,kBAAA,GAAkB,kBAAA,CAAA,GAAA,CAAA,OAAA"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { cn } from "../../lib/utils/cn.mjs";
|
|
4
|
+
import { Button } from "./button.mjs";
|
|
5
|
+
import { Input } from "./input.mjs";
|
|
6
|
+
import { Textarea } from "./textarea.mjs";
|
|
7
|
+
import { DateInput } from "./input-date.mjs";
|
|
8
|
+
import { DateTimeInput } from "./input-date-time.client.mjs";
|
|
9
|
+
import { TimeInput } from "./input-time.mjs";
|
|
10
|
+
import { jsx } from "react/jsx-runtime";
|
|
11
|
+
import { cva } from "class-variance-authority";
|
|
12
|
+
|
|
13
|
+
//#region src/components/ui/input-group.client.tsx
|
|
14
|
+
function InputGroup({ className, ...props }) {
|
|
15
|
+
return /* @__PURE__ */ jsx("div", {
|
|
16
|
+
"data-slot": "input-group",
|
|
17
|
+
role: "group",
|
|
18
|
+
className: cn("group/input-group relative flex h-8 w-full min-w-0 items-center rounded-lg border border-input outline-none transition-colors in-data-[slot=combobox-content]:focus-within:border-inherit in-data-[slot=combobox-content]:focus-within:ring-0 has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-start]]:h-auto has-[>textarea]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-start]]:flex-col has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot][aria-invalid=true]]:border-destructive has-disabled:bg-input/50 has-disabled:opacity-50 has-[[data-slot=input-group-control]:focus-visible]:ring-3 has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50 has-[[data-slot][aria-invalid=true]]:ring-3 has-[[data-slot][aria-invalid=true]]:ring-destructive/20 dark:bg-input/30 dark:has-disabled:bg-input/80 dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40 has-[>[data-align=block-end]]:[&>input]:pt-3 has-[>[data-align=inline-end]]:[&>input]:pr-1.5 has-[>[data-align=block-start]]:[&>input]:pb-3 has-[>[data-align=inline-start]]:[&>input]:pl-1.5", className),
|
|
19
|
+
...props
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
const inputGroupAddonVariants = cva("text-muted-foreground h-auto gap-2 py-1.5 text-sm font-medium group-data-[disabled=true]/input-group:opacity-50 [&>kbd]:rounded-[calc(var(--radius)-5px)] [&>svg:not([class*='size-'])]:size-4 flex cursor-text items-center justify-center select-none", {
|
|
23
|
+
variants: { align: {
|
|
24
|
+
"inline-start": "pl-2 has-[>button]:ml-[-0.3rem] has-[>kbd]:ml-[-0.15rem] order-first",
|
|
25
|
+
"inline-end": "pr-2 has-[>button]:mr-[-0.3rem] has-[>kbd]:mr-[-0.15rem] order-last",
|
|
26
|
+
"block-start": "px-2.5 pt-2 group-has-[>input]/input-group:pt-2 [.border-b]:pb-2 order-first w-full justify-start",
|
|
27
|
+
"block-end": "px-2.5 pb-2 group-has-[>input]/input-group:pb-2 [.border-t]:pt-2 order-last w-full justify-start"
|
|
28
|
+
} },
|
|
29
|
+
defaultVariants: { align: "inline-start" }
|
|
30
|
+
});
|
|
31
|
+
function InputGroupAddon({ className, align = "inline-start", ...props }) {
|
|
32
|
+
return /* @__PURE__ */ jsx("div", {
|
|
33
|
+
role: "group",
|
|
34
|
+
"data-slot": "input-group-addon",
|
|
35
|
+
"data-align": align,
|
|
36
|
+
className: cn(inputGroupAddonVariants({ align }), className),
|
|
37
|
+
onClick: (e) => {
|
|
38
|
+
if (e.target.closest("button")) return;
|
|
39
|
+
e.currentTarget.parentElement?.querySelector("input")?.focus();
|
|
40
|
+
},
|
|
41
|
+
...props
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
const inputGroupButtonVariants = cva("gap-2 text-sm flex items-center shadow-none", {
|
|
45
|
+
variants: { size: {
|
|
46
|
+
xs: "h-6 gap-1 rounded-[calc(var(--radius)-3px)] px-1.5 [&>svg:not([class*='size-'])]:size-3.5",
|
|
47
|
+
sm: "",
|
|
48
|
+
"icon-xs": "size-6 rounded-[calc(var(--radius)-3px)] p-0 has-[>svg]:p-0",
|
|
49
|
+
"icon-sm": "size-8 p-0 has-[>svg]:p-0"
|
|
50
|
+
} },
|
|
51
|
+
defaultVariants: { size: "xs" }
|
|
52
|
+
});
|
|
53
|
+
function InputGroupButton({ className, type = "button", variant = "ghost", size = "xs", ...props }) {
|
|
54
|
+
return /* @__PURE__ */ jsx(Button, {
|
|
55
|
+
type,
|
|
56
|
+
"data-size": size,
|
|
57
|
+
variant,
|
|
58
|
+
className: cn(inputGroupButtonVariants({ size }), className),
|
|
59
|
+
...props
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
function InputGroupText({ className, ...props }) {
|
|
63
|
+
return /* @__PURE__ */ jsx("span", {
|
|
64
|
+
className: cn("flex items-center gap-2 text-muted-foreground text-sm [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none", className),
|
|
65
|
+
...props
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
function InputGroupInput({ className, ...props }) {
|
|
69
|
+
return /* @__PURE__ */ jsx(Input, {
|
|
70
|
+
"data-slot": "input-group-control",
|
|
71
|
+
className: cn("flex-1 rounded-none border-0 bg-transparent shadow-none ring-0 focus-visible:ring-0 disabled:bg-transparent aria-invalid:ring-0 dark:bg-transparent dark:disabled:bg-transparent", className),
|
|
72
|
+
...props
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
function InputGroupTextarea({ className, ...props }) {
|
|
76
|
+
return /* @__PURE__ */ jsx(Textarea, {
|
|
77
|
+
"data-slot": "input-group-control",
|
|
78
|
+
className: cn("flex-1 resize-none rounded-none border-0 bg-transparent py-2 shadow-none ring-0 focus-visible:ring-0 disabled:bg-transparent aria-invalid:ring-0 dark:bg-transparent dark:disabled:bg-transparent", className),
|
|
79
|
+
...props
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
function InputGroupTimeInput({ className, ...props }) {
|
|
83
|
+
return /* @__PURE__ */ jsx(TimeInput, {
|
|
84
|
+
"data-slot": "input-group-control",
|
|
85
|
+
className: cn("flex-1 rounded-none border-0 bg-transparent shadow-none ring-0 focus-visible:ring-0 disabled:bg-transparent aria-invalid:ring-0 dark:bg-transparent dark:disabled:bg-transparent", className),
|
|
86
|
+
...props
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
function InputGroupDateInput({ className, ...props }) {
|
|
90
|
+
return /* @__PURE__ */ jsx(DateInput, {
|
|
91
|
+
"data-slot": "input-group-control",
|
|
92
|
+
className: cn("flex-1 rounded-none border-0 bg-transparent shadow-none ring-0 focus-visible:ring-0 disabled:bg-transparent aria-invalid:ring-0 dark:bg-transparent dark:disabled:bg-transparent", className),
|
|
93
|
+
...props
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
function InputGroupDateTimeInput({ className, ...props }) {
|
|
97
|
+
return /* @__PURE__ */ jsx(DateTimeInput, {
|
|
98
|
+
"data-slot": "input-group-control",
|
|
99
|
+
className: cn("flex-1 rounded-none border-0 bg-transparent shadow-none ring-0 focus-visible:ring-0 disabled:bg-transparent aria-invalid:ring-0 dark:bg-transparent dark:disabled:bg-transparent", className),
|
|
100
|
+
...props
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
//#endregion
|
|
105
|
+
export { InputGroup, InputGroupAddon, InputGroupButton, InputGroupDateInput, InputGroupDateTimeInput, InputGroupInput, InputGroupText, InputGroupTextarea, InputGroupTimeInput };
|
|
106
|
+
//# sourceMappingURL=input-group.client.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-group.client.mjs","names":[],"sources":["../../../src/components/ui/input-group.client.tsx"],"sourcesContent":["\"use client\";\n\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport type * as React from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport { Input } from \"@/components/ui/input\";\nimport { Textarea } from \"@/components/ui/textarea\";\nimport { cn } from \"@/lib/utils/cn\";\nimport { DateInput, type DateInputProps } from \"./input-date\";\nimport { DateTimeInput, type DateTimeInputProps } from \"./input-date-time.client\";\nimport { TimeInput, type TimeInputProps } from \"./input-time\";\n\nfunction InputGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n // biome-ignore lint/a11y/useSemanticElements: The div element is used to group the input and its addons together, and the role=\"group\" attribute is added for accessibility purposes.\n <div\n data-slot=\"input-group\"\n role=\"group\"\n className={cn(\n \"group/input-group relative flex h-8 w-full min-w-0 items-center rounded-lg border border-input outline-none transition-colors in-data-[slot=combobox-content]:focus-within:border-inherit in-data-[slot=combobox-content]:focus-within:ring-0 has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-start]]:h-auto has-[>textarea]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-start]]:flex-col has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot][aria-invalid=true]]:border-destructive has-disabled:bg-input/50 has-disabled:opacity-50 has-[[data-slot=input-group-control]:focus-visible]:ring-3 has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50 has-[[data-slot][aria-invalid=true]]:ring-3 has-[[data-slot][aria-invalid=true]]:ring-destructive/20 dark:bg-input/30 dark:has-disabled:bg-input/80 dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40 has-[>[data-align=block-end]]:[&>input]:pt-3 has-[>[data-align=inline-end]]:[&>input]:pr-1.5 has-[>[data-align=block-start]]:[&>input]:pb-3 has-[>[data-align=inline-start]]:[&>input]:pl-1.5\",\n className,\n )}\n {...props}\n />\n );\n}\n\nconst inputGroupAddonVariants = cva(\n \"text-muted-foreground h-auto gap-2 py-1.5 text-sm font-medium group-data-[disabled=true]/input-group:opacity-50 [&>kbd]:rounded-[calc(var(--radius)-5px)] [&>svg:not([class*='size-'])]:size-4 flex cursor-text items-center justify-center select-none\",\n {\n variants: {\n align: {\n \"inline-start\": \"pl-2 has-[>button]:ml-[-0.3rem] has-[>kbd]:ml-[-0.15rem] order-first\",\n \"inline-end\": \"pr-2 has-[>button]:mr-[-0.3rem] has-[>kbd]:mr-[-0.15rem] order-last\",\n \"block-start\":\n \"px-2.5 pt-2 group-has-[>input]/input-group:pt-2 [.border-b]:pb-2 order-first w-full justify-start\",\n \"block-end\":\n \"px-2.5 pb-2 group-has-[>input]/input-group:pb-2 [.border-t]:pt-2 order-last w-full justify-start\",\n },\n },\n defaultVariants: {\n align: \"inline-start\",\n },\n },\n);\n\nfunction InputGroupAddon({\n className,\n align = \"inline-start\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof inputGroupAddonVariants>) {\n return (\n // biome-ignore lint/a11y/useKeyWithClickEvents: The div element is used as an addon to the input group, and it is not intended to be interactive on its own. The onClick handler is added to allow users to focus the associated input when they click on the addon, but it does not require keyboard interaction as it is not a standalone interactive element.\n // biome-ignore lint/a11y/useSemanticElements: The div element is used as an addon to the input group, and it is not intended to be interactive on its own. The role=\"group\" attribute is added for accessibility purposes to indicate that this element is part of a group of related elements.\n <div\n role=\"group\"\n data-slot=\"input-group-addon\"\n data-align={align}\n className={cn(inputGroupAddonVariants({ align }), className)}\n onClick={(e) => {\n if ((e.target as HTMLElement).closest(\"button\")) {\n return;\n }\n e.currentTarget.parentElement?.querySelector(\"input\")?.focus();\n }}\n {...props}\n />\n );\n}\n\nconst inputGroupButtonVariants = cva(\"gap-2 text-sm flex items-center shadow-none\", {\n variants: {\n size: {\n xs: \"h-6 gap-1 rounded-[calc(var(--radius)-3px)] px-1.5 [&>svg:not([class*='size-'])]:size-3.5\",\n sm: \"\",\n \"icon-xs\": \"size-6 rounded-[calc(var(--radius)-3px)] p-0 has-[>svg]:p-0\",\n \"icon-sm\": \"size-8 p-0 has-[>svg]:p-0\",\n },\n },\n defaultVariants: {\n size: \"xs\",\n },\n});\n\nfunction InputGroupButton({\n className,\n type = \"button\",\n variant = \"ghost\",\n size = \"xs\",\n ...props\n}: Omit<React.ComponentProps<typeof Button>, \"size\"> &\n VariantProps<typeof inputGroupButtonVariants>) {\n return (\n <Button\n type={type}\n data-size={size}\n variant={variant}\n className={cn(inputGroupButtonVariants({ size }), className)}\n {...props}\n />\n );\n}\n\nfunction InputGroupText({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n className={cn(\n \"flex items-center gap-2 text-muted-foreground text-sm [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction InputGroupInput({ className, ...props }: React.ComponentProps<\"input\">) {\n return (\n <Input\n data-slot=\"input-group-control\"\n className={cn(\n \"flex-1 rounded-none border-0 bg-transparent shadow-none ring-0 focus-visible:ring-0 disabled:bg-transparent aria-invalid:ring-0 dark:bg-transparent dark:disabled:bg-transparent\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction InputGroupTextarea({ className, ...props }: React.ComponentProps<\"textarea\">) {\n return (\n <Textarea\n data-slot=\"input-group-control\"\n className={cn(\n \"flex-1 resize-none rounded-none border-0 bg-transparent py-2 shadow-none ring-0 focus-visible:ring-0 disabled:bg-transparent aria-invalid:ring-0 dark:bg-transparent dark:disabled:bg-transparent\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction InputGroupTimeInput({ className, ...props }: TimeInputProps) {\n return (\n <TimeInput\n data-slot=\"input-group-control\"\n className={cn(\n \"flex-1 rounded-none border-0 bg-transparent shadow-none ring-0 focus-visible:ring-0 disabled:bg-transparent aria-invalid:ring-0 dark:bg-transparent dark:disabled:bg-transparent\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction InputGroupDateInput({ className, ...props }: DateInputProps) {\n return (\n <DateInput\n data-slot=\"input-group-control\"\n className={cn(\n \"flex-1 rounded-none border-0 bg-transparent shadow-none ring-0 focus-visible:ring-0 disabled:bg-transparent aria-invalid:ring-0 dark:bg-transparent dark:disabled:bg-transparent\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction InputGroupDateTimeInput({ className, ...props }: DateTimeInputProps) {\n return (\n <DateTimeInput\n data-slot=\"input-group-control\"\n className={cn(\n \"flex-1 rounded-none border-0 bg-transparent shadow-none ring-0 focus-visible:ring-0 disabled:bg-transparent aria-invalid:ring-0 dark:bg-transparent dark:disabled:bg-transparent\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport {\n InputGroup,\n InputGroupAddon,\n InputGroupButton,\n InputGroupText,\n InputGroupInput,\n InputGroupTextarea,\n InputGroupTimeInput,\n InputGroupDateInput,\n InputGroupDateTimeInput,\n};\n"],"mappings":";;;;;;;;;;;;;AAYA,SAAS,WAAW,EAAE,WAAW,GAAG,SAAsC;AACxE,QAEE,oBAAC;EACC,aAAU;EACV,MAAK;EACL,WAAW,GACT,ylCACA,UACD;EACD,GAAI;GACJ;;AAIN,MAAM,0BAA0B,IAC9B,2PACA;CACE,UAAU,EACR,OAAO;EACL,gBAAgB;EAChB,cAAc;EACd,eACE;EACF,aACE;EACH,EACF;CACD,iBAAiB,EACf,OAAO,gBACR;CACF,CACF;AAED,SAAS,gBAAgB,EACvB,WACA,QAAQ,gBACR,GAAG,SAC0E;AAC7E,QAGE,oBAAC;EACC,MAAK;EACL,aAAU;EACV,cAAY;EACZ,WAAW,GAAG,wBAAwB,EAAE,OAAO,CAAC,EAAE,UAAU;EAC5D,UAAU,MAAM;AACd,OAAK,EAAE,OAAuB,QAAQ,SAAS,CAC7C;AAEF,KAAE,cAAc,eAAe,cAAc,QAAQ,EAAE,OAAO;;EAEhE,GAAI;GACJ;;AAIN,MAAM,2BAA2B,IAAI,+CAA+C;CAClF,UAAU,EACR,MAAM;EACJ,IAAI;EACJ,IAAI;EACJ,WAAW;EACX,WAAW;EACZ,EACF;CACD,iBAAiB,EACf,MAAM,MACP;CACF,CAAC;AAEF,SAAS,iBAAiB,EACxB,WACA,OAAO,UACP,UAAU,SACV,OAAO,MACP,GAAG,SAE4C;AAC/C,QACE,oBAAC;EACO;EACN,aAAW;EACF;EACT,WAAW,GAAG,yBAAyB,EAAE,MAAM,CAAC,EAAE,UAAU;EAC5D,GAAI;GACJ;;AAIN,SAAS,eAAe,EAAE,WAAW,GAAG,SAAuC;AAC7E,QACE,oBAAC;EACC,WAAW,GACT,0HACA,UACD;EACD,GAAI;GACJ;;AAIN,SAAS,gBAAgB,EAAE,WAAW,GAAG,SAAwC;AAC/E,QACE,oBAAC;EACC,aAAU;EACV,WAAW,GACT,oLACA,UACD;EACD,GAAI;GACJ;;AAIN,SAAS,mBAAmB,EAAE,WAAW,GAAG,SAA2C;AACrF,QACE,oBAAC;EACC,aAAU;EACV,WAAW,GACT,qMACA,UACD;EACD,GAAI;GACJ;;AAIN,SAAS,oBAAoB,EAAE,WAAW,GAAG,SAAyB;AACpE,QACE,oBAAC;EACC,aAAU;EACV,WAAW,GACT,oLACA,UACD;EACD,GAAI;GACJ;;AAIN,SAAS,oBAAoB,EAAE,WAAW,GAAG,SAAyB;AACpE,QACE,oBAAC;EACC,aAAU;EACV,WAAW,GACT,oLACA,UACD;EACD,GAAI;GACJ;;AAIN,SAAS,wBAAwB,EAAE,WAAW,GAAG,SAA6B;AAC5E,QACE,oBAAC;EACC,aAAU;EACV,WAAW,GACT,oLACA,UACD;EACD,GAAI;GACJ"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import { cn } from "../../lib/utils/cn.mjs";
|
|
4
4
|
import { Button } from "./button.mjs";
|
|
5
|
-
import { Popover, PopoverContent, PopoverTrigger } from "./popover.mjs";
|
|
5
|
+
import { Popover, PopoverContent, PopoverTrigger } from "./popover.client.mjs";
|
|
6
6
|
import { X } from "lucide-react";
|
|
7
7
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
8
8
|
import * as React$1 from "react";
|
|
@@ -112,12 +112,12 @@ function RecipientInput({ contacts, value, onChange, placeholder = "Kies een ont
|
|
|
112
112
|
asChild: true,
|
|
113
113
|
children: /* @__PURE__ */ jsxs("div", {
|
|
114
114
|
ref: containerRef,
|
|
115
|
-
className: cn("
|
|
115
|
+
className: cn("flex min-h-0 w-full flex-wrap items-center gap-2 rounded-lg border border-input bg-background px-3 py-2 text-base ring-offset-background transition-colors md:text-sm", "focus-within:border-ring focus-within:ring-[3px] focus-within:ring-ring/50", disabled && "cursor-not-allowed opacity-50", className),
|
|
116
116
|
onClick: () => {
|
|
117
117
|
if (!disabled) inputRef.current?.focus();
|
|
118
118
|
},
|
|
119
119
|
children: [selectedContacts.map((contact) => /* @__PURE__ */ jsxs("div", {
|
|
120
|
-
className: "
|
|
120
|
+
className: "flex items-center gap-2 rounded-full border border-border bg-accent/50 px-2 py-0.5",
|
|
121
121
|
children: [/* @__PURE__ */ jsx("span", {
|
|
122
122
|
className: "text-xs",
|
|
123
123
|
children: contact.email
|
|
@@ -125,7 +125,7 @@ function RecipientInput({ contacts, value, onChange, placeholder = "Kies een ont
|
|
|
125
125
|
type: "button",
|
|
126
126
|
variant: "ghost",
|
|
127
127
|
size: "icon",
|
|
128
|
-
className: "
|
|
128
|
+
className: "h-4 w-4 rounded-full p-0 hover:bg-destructive/20",
|
|
129
129
|
onClick: (e) => {
|
|
130
130
|
e.stopPropagation();
|
|
131
131
|
handleRemove(contact.email);
|
|
@@ -147,7 +147,7 @@ function RecipientInput({ contacts, value, onChange, placeholder = "Kies een ont
|
|
|
147
147
|
onKeyDown: handleKeyDown,
|
|
148
148
|
placeholder: value.length === 0 ? placeholder : "",
|
|
149
149
|
disabled,
|
|
150
|
-
className: "
|
|
150
|
+
className: "min-w-30 flex-1 bg-transparent outline-none placeholder:text-muted-foreground placeholder:text-sm disabled:cursor-not-allowed"
|
|
151
151
|
})]
|
|
152
152
|
})
|
|
153
153
|
}), /* @__PURE__ */ jsx(PopoverContent, {
|
|
@@ -158,14 +158,14 @@ function RecipientInput({ contacts, value, onChange, placeholder = "Kies een ont
|
|
|
158
158
|
children: /* @__PURE__ */ jsx("div", {
|
|
159
159
|
className: "max-h-75 overflow-y-auto p-1",
|
|
160
160
|
children: filteredContacts.length === 0 && inputValue ? /* @__PURE__ */ jsxs("div", {
|
|
161
|
-
className: "
|
|
161
|
+
className: "px-2 py-2 text-muted-foreground",
|
|
162
162
|
children: [/* @__PURE__ */ jsx("div", {
|
|
163
163
|
className: "mb-2 text-xs",
|
|
164
164
|
children: "Geen contacten gevonden."
|
|
165
165
|
}), isValidEmail(inputValue.trim()) && /* @__PURE__ */ jsxs("button", {
|
|
166
166
|
type: "button",
|
|
167
167
|
onClick: handleAddManualEmail,
|
|
168
|
-
className: "
|
|
168
|
+
className: "w-full rounded-sm px-2 py-1.5 text-left text-xs transition-colors hover:bg-accent",
|
|
169
169
|
children: [/* @__PURE__ */ jsx("span", {
|
|
170
170
|
className: "font-medium",
|
|
171
171
|
children: "Voeg toe: "
|
|
@@ -175,7 +175,7 @@ function RecipientInput({ contacts, value, onChange, placeholder = "Kies een ont
|
|
|
175
175
|
})]
|
|
176
176
|
})]
|
|
177
177
|
}) : filteredContacts.length === 0 ? /* @__PURE__ */ jsx("div", {
|
|
178
|
-
className: "
|
|
178
|
+
className: "py-6 text-center text-muted-foreground text-xs",
|
|
179
179
|
children: "Geen contacten gevonden."
|
|
180
180
|
}) : /* @__PURE__ */ jsxs(Fragment, { children: [filteredContacts.map((contact, index) => /* @__PURE__ */ jsx("button", {
|
|
181
181
|
ref: (el) => {
|
|
@@ -183,11 +183,11 @@ function RecipientInput({ contacts, value, onChange, placeholder = "Kies een ont
|
|
|
183
183
|
},
|
|
184
184
|
type: "button",
|
|
185
185
|
onClick: () => handleSelect(contact),
|
|
186
|
-
className: cn("
|
|
186
|
+
className: cn("flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-xs outline-hidden transition-colors hover:bg-accent", highlightedIndex === index && "bg-accent"),
|
|
187
187
|
children: /* @__PURE__ */ jsxs("div", {
|
|
188
188
|
className: "flex flex-col items-start",
|
|
189
189
|
children: [/* @__PURE__ */ jsx("span", {
|
|
190
|
-
className: "text-xs
|
|
190
|
+
className: "font-medium text-xs",
|
|
191
191
|
children: contact.name
|
|
192
192
|
}), /* @__PURE__ */ jsx("span", {
|
|
193
193
|
className: "text-muted-foreground text-xs",
|
|
@@ -199,7 +199,7 @@ function RecipientInput({ contacts, value, onChange, placeholder = "Kies een ont
|
|
|
199
199
|
children: /* @__PURE__ */ jsxs("button", {
|
|
200
200
|
type: "button",
|
|
201
201
|
onClick: handleAddManualEmail,
|
|
202
|
-
className: "
|
|
202
|
+
className: "w-full rounded-sm px-2 py-1.5 text-left text-xs transition-colors hover:bg-accent",
|
|
203
203
|
children: [/* @__PURE__ */ jsx("span", {
|
|
204
204
|
className: "font-medium",
|
|
205
205
|
children: "Voeg toe: "
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input-recipient.mjs","names":["React"],"sources":["../../../src/components/ui/input-recipient.tsx"],"sourcesContent":["\"use client\";\n\nimport { X } from \"lucide-react\";\nimport * as React from \"react\";\nimport { toast } from \"sonner\";\nimport { cn } from \"@/lib/utils/cn\";\n\nimport { Button } from \"./button\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"./popover\";\n\nexport type Contact = {\n id: string;\n email: string;\n name: string;\n};\n\ninterface RecipientInputProps {\n contacts: Contact[];\n value: string[];\n onChange: (value: string[]) => void;\n placeholder?: string;\n disabled?: boolean;\n className?: string;\n}\n\n// Simpele email validatie\nconst isValidEmail = (email: string): boolean => {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return emailRegex.test(email);\n};\n\nexport function RecipientInput({\n contacts,\n value,\n onChange,\n placeholder = \"Kies een ontvanger...\",\n disabled = false,\n className,\n}: RecipientInputProps) {\n const [open, setOpen] = React.useState(false);\n const [inputValue, setInputValue] = React.useState(\"\");\n const [highlightedIndex, setHighlightedIndex] = React.useState(0);\n const inputRef = React.useRef<HTMLInputElement>(null);\n const containerRef = React.useRef<HTMLDivElement>(null);\n const itemRefs = React.useRef<(HTMLButtonElement | null)[]>([]);\n\n const selectedContacts = React.useMemo(() => {\n return value\n .map((email) => {\n const contact = contacts.find((c) => c.email === email);\n return contact || { id: email, email, name: email };\n })\n .filter(Boolean) as Contact[];\n }, [value, contacts]);\n\n const availableContacts = React.useMemo(() => {\n return contacts.filter((contact) => !value.includes(contact.email));\n }, [contacts, value]);\n\n const filteredContacts = React.useMemo(() => {\n if (!inputValue || !inputValue.trim()) return availableContacts;\n const search = inputValue.toLowerCase().trim();\n return availableContacts.filter(\n (contact) =>\n contact.email.toLowerCase().includes(search) || contact.name.toLowerCase().includes(search),\n );\n }, [availableContacts, inputValue]);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: We only want to reset the highlighted index when the filtered contacts change\n React.useEffect(() => {\n setHighlightedIndex(0);\n }, [filteredContacts]);\n\n React.useEffect(() => {\n if (open && highlightedIndex >= 0 && itemRefs.current[highlightedIndex]) {\n itemRefs.current[highlightedIndex]?.scrollIntoView({\n block: \"nearest\",\n behavior: \"smooth\",\n });\n }\n }, [highlightedIndex, open]);\n\n React.useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(event.target as Node)) {\n setOpen(false);\n }\n };\n\n if (open) {\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }\n }, [open]);\n\n const handleSelect = (contact: Contact) => {\n onChange([...value, contact.email]);\n setInputValue(\"\");\n setOpen(false);\n setHighlightedIndex(0);\n inputRef.current?.focus();\n };\n\n const handleAddManualEmail = () => {\n const trimmedEmail = inputValue.trim();\n\n if (!trimmedEmail) return;\n\n if (!isValidEmail(trimmedEmail)) {\n toast.error(\"Ongeldig email adres\");\n return;\n }\n\n if (value.includes(trimmedEmail)) {\n toast.error(\"Email is al toegevoegd\");\n setInputValue(\"\");\n return;\n }\n\n onChange([...value, trimmedEmail]);\n setInputValue(\"\");\n setOpen(false);\n setHighlightedIndex(0);\n inputRef.current?.focus();\n };\n\n const handleRemove = (email: string) => {\n onChange(value.filter((v) => v !== email));\n inputRef.current?.focus();\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n if (!open) {\n setOpen(true);\n } else {\n setHighlightedIndex((prev) => (prev < filteredContacts.length - 1 ? prev + 1 : prev));\n }\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n if (open) {\n setHighlightedIndex((prev) => (prev > 0 ? prev - 1 : prev));\n }\n } else if (e.key === \"Enter\") {\n e.preventDefault();\n if (open && filteredContacts[highlightedIndex]) {\n // Selecteer contact uit lijst\n handleSelect(filteredContacts[highlightedIndex]);\n } else if (inputValue.trim()) {\n // Voeg handmatig ingevoerde email toe\n handleAddManualEmail();\n }\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n setOpen(false);\n } else if (e.key === \"Backspace\" && !inputValue && value.length > 0) {\n e.preventDefault();\n const lastEmail = value[value.length - 1];\n if (lastEmail) {\n handleRemove(lastEmail);\n }\n }\n };\n\n return (\n <Popover open={open}>\n <PopoverTrigger asChild>\n {/** biome-ignore lint/a11y/useKeyWithClickEvents: This is needed */}\n {/** biome-ignore lint/a11y/noStaticElementInteractions: This is needed */}\n <div\n ref={containerRef}\n className={cn(\n \"border-input bg-background ring-offset-background flex min-h-0 w-full flex-wrap items-center gap-2 rounded-lg border px-3 py-2 text-base transition-colors md:text-sm\",\n \"focus-within:border-ring focus-within:ring-ring/50 focus-within:ring-[3px]\",\n disabled && \"cursor-not-allowed opacity-50\",\n className,\n )}\n onClick={() => {\n if (!disabled) {\n inputRef.current?.focus();\n }\n }}\n >\n {selectedContacts.map((contact) => (\n <div\n key={contact.id}\n className=\"border-border bg-accent/50 flex items-center gap-2 rounded-full border px-2 py-0.5\"\n >\n <span className=\"text-xs\">{contact.email}</span>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"hover:bg-destructive/20 h-4 w-4 rounded-full p-0\"\n onClick={(e) => {\n e.stopPropagation();\n handleRemove(contact.email);\n }}\n disabled={disabled}\n >\n <X className=\"h-3 w-3\" />\n <span className=\"sr-only\">Verwijder {contact.email}</span>\n </Button>\n </div>\n ))}\n <input\n ref={inputRef}\n type=\"text\"\n value={inputValue}\n onChange={(e) => {\n setInputValue(e.target.value);\n if (e.target.value) {\n setOpen(true);\n }\n }}\n onKeyDown={handleKeyDown}\n placeholder={value.length === 0 ? placeholder : \"\"}\n disabled={disabled}\n className=\"placeholder:text-muted-foreground min-w-30 flex-1 bg-transparent outline-none placeholder:text-sm disabled:cursor-not-allowed\"\n />\n </div>\n </PopoverTrigger>\n <PopoverContent\n className=\"w-full p-0\"\n align=\"start\"\n onOpenAutoFocus={(e) => e.preventDefault()}\n style={{\n width: containerRef.current?.offsetWidth || \"auto\",\n }}\n >\n <div className=\"max-h-75 overflow-y-auto p-1\">\n {filteredContacts.length === 0 && inputValue ? (\n <div className=\"text-muted-foreground px-2 py-2\">\n <div className=\"mb-2 text-xs\">Geen contacten gevonden.</div>\n {isValidEmail(inputValue.trim()) && (\n <button\n type=\"button\"\n onClick={handleAddManualEmail}\n className=\"hover:bg-accent w-full rounded-sm px-2 py-1.5 text-left text-xs transition-colors\"\n >\n <span className=\"font-medium\">Voeg toe: </span>\n <span className=\"text-muted-foreground\">{inputValue.trim()}</span>\n </button>\n )}\n </div>\n ) : filteredContacts.length === 0 ? (\n <div className=\"text-muted-foreground py-6 text-center text-xs\">\n Geen contacten gevonden.\n </div>\n ) : (\n <>\n {filteredContacts.map((contact, index) => (\n <button\n key={contact.id}\n ref={(el) => {\n itemRefs.current[index] = el;\n }}\n type=\"button\"\n onClick={() => handleSelect(contact)}\n className={cn(\n \"outline-hidden hover:bg-accent flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-xs transition-colors\",\n highlightedIndex === index && \"bg-accent\",\n )}\n >\n <div className=\"flex flex-col items-start\">\n <span className=\"text-xs font-medium\">{contact.name}</span>\n <span className=\"text-muted-foreground text-xs\">{contact.email}</span>\n </div>\n </button>\n ))}\n {inputValue && isValidEmail(inputValue.trim()) && (\n <div className=\"mt-1 border-t pt-1\">\n <button\n type=\"button\"\n onClick={handleAddManualEmail}\n className=\"hover:bg-accent w-full rounded-sm px-2 py-1.5 text-left text-xs transition-colors\"\n >\n <span className=\"font-medium\">Voeg toe: </span>\n <span className=\"text-muted-foreground\">{inputValue.trim()}</span>\n </button>\n </div>\n )}\n </>\n )}\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"input-recipient.mjs","names":["React"],"sources":["../../../src/components/ui/input-recipient.tsx"],"sourcesContent":["\"use client\";\n\nimport { X } from \"lucide-react\";\nimport * as React from \"react\";\nimport { toast } from \"sonner\";\nimport { cn } from \"@/lib/utils/cn\";\n\nimport { Button } from \"./button\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"./popover.client\";\n\nexport type Contact = {\n id: string;\n email: string;\n name: string;\n};\n\ninterface RecipientInputProps {\n contacts: Contact[];\n value: string[];\n onChange: (value: string[]) => void;\n placeholder?: string;\n disabled?: boolean;\n className?: string;\n}\n\n// Simpele email validatie\nconst isValidEmail = (email: string): boolean => {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return emailRegex.test(email);\n};\n\nexport function RecipientInput({\n contacts,\n value,\n onChange,\n placeholder = \"Kies een ontvanger...\",\n disabled = false,\n className,\n}: RecipientInputProps) {\n const [open, setOpen] = React.useState(false);\n const [inputValue, setInputValue] = React.useState(\"\");\n const [highlightedIndex, setHighlightedIndex] = React.useState(0);\n const inputRef = React.useRef<HTMLInputElement>(null);\n const containerRef = React.useRef<HTMLDivElement>(null);\n const itemRefs = React.useRef<(HTMLButtonElement | null)[]>([]);\n\n const selectedContacts = React.useMemo(() => {\n return value\n .map((email) => {\n const contact = contacts.find((c) => c.email === email);\n return contact || { id: email, email, name: email };\n })\n .filter(Boolean) as Contact[];\n }, [value, contacts]);\n\n const availableContacts = React.useMemo(() => {\n return contacts.filter((contact) => !value.includes(contact.email));\n }, [contacts, value]);\n\n const filteredContacts = React.useMemo(() => {\n if (!inputValue || !inputValue.trim()) return availableContacts;\n const search = inputValue.toLowerCase().trim();\n return availableContacts.filter(\n (contact) =>\n contact.email.toLowerCase().includes(search) || contact.name.toLowerCase().includes(search),\n );\n }, [availableContacts, inputValue]);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: We only want to reset the highlighted index when the filtered contacts change\n React.useEffect(() => {\n setHighlightedIndex(0);\n }, [filteredContacts]);\n\n React.useEffect(() => {\n if (open && highlightedIndex >= 0 && itemRefs.current[highlightedIndex]) {\n itemRefs.current[highlightedIndex]?.scrollIntoView({\n block: \"nearest\",\n behavior: \"smooth\",\n });\n }\n }, [highlightedIndex, open]);\n\n React.useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(event.target as Node)) {\n setOpen(false);\n }\n };\n\n if (open) {\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }\n }, [open]);\n\n const handleSelect = (contact: Contact) => {\n onChange([...value, contact.email]);\n setInputValue(\"\");\n setOpen(false);\n setHighlightedIndex(0);\n inputRef.current?.focus();\n };\n\n const handleAddManualEmail = () => {\n const trimmedEmail = inputValue.trim();\n\n if (!trimmedEmail) return;\n\n if (!isValidEmail(trimmedEmail)) {\n toast.error(\"Ongeldig email adres\");\n return;\n }\n\n if (value.includes(trimmedEmail)) {\n toast.error(\"Email is al toegevoegd\");\n setInputValue(\"\");\n return;\n }\n\n onChange([...value, trimmedEmail]);\n setInputValue(\"\");\n setOpen(false);\n setHighlightedIndex(0);\n inputRef.current?.focus();\n };\n\n const handleRemove = (email: string) => {\n onChange(value.filter((v) => v !== email));\n inputRef.current?.focus();\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n if (!open) {\n setOpen(true);\n } else {\n setHighlightedIndex((prev) => (prev < filteredContacts.length - 1 ? prev + 1 : prev));\n }\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n if (open) {\n setHighlightedIndex((prev) => (prev > 0 ? prev - 1 : prev));\n }\n } else if (e.key === \"Enter\") {\n e.preventDefault();\n if (open && filteredContacts[highlightedIndex]) {\n // Selecteer contact uit lijst\n handleSelect(filteredContacts[highlightedIndex]);\n } else if (inputValue.trim()) {\n // Voeg handmatig ingevoerde email toe\n handleAddManualEmail();\n }\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n setOpen(false);\n } else if (e.key === \"Backspace\" && !inputValue && value.length > 0) {\n e.preventDefault();\n const lastEmail = value[value.length - 1];\n if (lastEmail) {\n handleRemove(lastEmail);\n }\n }\n };\n\n return (\n <Popover open={open}>\n <PopoverTrigger asChild>\n {/** biome-ignore lint/a11y/useKeyWithClickEvents: This is needed */}\n {/** biome-ignore lint/a11y/noStaticElementInteractions: This is needed */}\n <div\n ref={containerRef}\n className={cn(\n \"flex min-h-0 w-full flex-wrap items-center gap-2 rounded-lg border border-input bg-background px-3 py-2 text-base ring-offset-background transition-colors md:text-sm\",\n \"focus-within:border-ring focus-within:ring-[3px] focus-within:ring-ring/50\",\n disabled && \"cursor-not-allowed opacity-50\",\n className,\n )}\n onClick={() => {\n if (!disabled) {\n inputRef.current?.focus();\n }\n }}\n >\n {selectedContacts.map((contact) => (\n <div\n key={contact.id}\n className=\"flex items-center gap-2 rounded-full border border-border bg-accent/50 px-2 py-0.5\"\n >\n <span className=\"text-xs\">{contact.email}</span>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-4 w-4 rounded-full p-0 hover:bg-destructive/20\"\n onClick={(e) => {\n e.stopPropagation();\n handleRemove(contact.email);\n }}\n disabled={disabled}\n >\n <X className=\"h-3 w-3\" />\n <span className=\"sr-only\">Verwijder {contact.email}</span>\n </Button>\n </div>\n ))}\n <input\n ref={inputRef}\n type=\"text\"\n value={inputValue}\n onChange={(e) => {\n setInputValue(e.target.value);\n if (e.target.value) {\n setOpen(true);\n }\n }}\n onKeyDown={handleKeyDown}\n placeholder={value.length === 0 ? placeholder : \"\"}\n disabled={disabled}\n className=\"min-w-30 flex-1 bg-transparent outline-none placeholder:text-muted-foreground placeholder:text-sm disabled:cursor-not-allowed\"\n />\n </div>\n </PopoverTrigger>\n <PopoverContent\n className=\"w-full p-0\"\n align=\"start\"\n onOpenAutoFocus={(e) => e.preventDefault()}\n style={{\n width: containerRef.current?.offsetWidth || \"auto\",\n }}\n >\n <div className=\"max-h-75 overflow-y-auto p-1\">\n {filteredContacts.length === 0 && inputValue ? (\n <div className=\"px-2 py-2 text-muted-foreground\">\n <div className=\"mb-2 text-xs\">Geen contacten gevonden.</div>\n {isValidEmail(inputValue.trim()) && (\n <button\n type=\"button\"\n onClick={handleAddManualEmail}\n className=\"w-full rounded-sm px-2 py-1.5 text-left text-xs transition-colors hover:bg-accent\"\n >\n <span className=\"font-medium\">Voeg toe: </span>\n <span className=\"text-muted-foreground\">{inputValue.trim()}</span>\n </button>\n )}\n </div>\n ) : filteredContacts.length === 0 ? (\n <div className=\"py-6 text-center text-muted-foreground text-xs\">\n Geen contacten gevonden.\n </div>\n ) : (\n <>\n {filteredContacts.map((contact, index) => (\n <button\n key={contact.id}\n ref={(el) => {\n itemRefs.current[index] = el;\n }}\n type=\"button\"\n onClick={() => handleSelect(contact)}\n className={cn(\n \"flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-xs outline-hidden transition-colors hover:bg-accent\",\n highlightedIndex === index && \"bg-accent\",\n )}\n >\n <div className=\"flex flex-col items-start\">\n <span className=\"font-medium text-xs\">{contact.name}</span>\n <span className=\"text-muted-foreground text-xs\">{contact.email}</span>\n </div>\n </button>\n ))}\n {inputValue && isValidEmail(inputValue.trim()) && (\n <div className=\"mt-1 border-t pt-1\">\n <button\n type=\"button\"\n onClick={handleAddManualEmail}\n className=\"w-full rounded-sm px-2 py-1.5 text-left text-xs transition-colors hover:bg-accent\"\n >\n <span className=\"font-medium\">Voeg toe: </span>\n <span className=\"text-muted-foreground\">{inputValue.trim()}</span>\n </button>\n </div>\n )}\n </>\n )}\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input-time.d.mts","names":[],"sources":["../../../src/components/ui/input-time.tsx"],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"input-time.d.mts","names":[],"sources":["../../../src/components/ui/input-time.tsx"],"mappings":";;;;;;KAMY,cAAA,GAAiB,IAAA,CAAK,KAAA,CAAM,cAAA;AAAA,iBAExB,SAAA,CAAA;EAAY,SAAA;EAAA,GAAc;AAAA,GAAS,cAAA,GAAc,kBAAA,CAAA,GAAA,CAAA,OAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input-time.mjs","names":[],"sources":["../../../src/components/ui/input-time.tsx"],"sourcesContent":["import { cn } from \"@/lib/utils/cn\";\nimport { Input } from \"./input\";\n\n/**\n * TimeInput\n */\
|
|
1
|
+
{"version":3,"file":"input-time.mjs","names":[],"sources":["../../../src/components/ui/input-time.tsx"],"sourcesContent":["import { cn } from \"@/lib/utils/cn\";\nimport { Input } from \"./input\";\n\n/**\n * TimeInput\n */\nexport type TimeInputProps = Omit<React.ComponentProps<\"input\">, \"type\">;\n\nexport function TimeInput({ className, ...props }: TimeInputProps) {\n return (\n <Input\n {...props}\n type=\"time\"\n className={cn(\n \"appearance-none [&::-webkit-calendar-picker-indicator]:hidden [&::-webkit-calendar-picker-indicator]:appearance-none\",\n className,\n )}\n />\n );\n}\n"],"mappings":";;;;;AAQA,SAAgB,UAAU,EAAE,WAAW,GAAG,SAAyB;AACjE,QACE,oBAAC;EACC,GAAI;EACJ,MAAK;EACL,WAAW,GACT,wHACA,UACD;GACD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input.d.mts","names":[],"sources":["../../../src/components/ui/input.tsx"],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"input.d.mts","names":[],"sources":["../../../src/components/ui/input.tsx"],"mappings":";;;;iBAGS,KAAA,CAAA;EAAQ,SAAA;EAAW,IAAA;EAAA,GAAS;AAAA,GAAS,OAAA,CAAM,cAAA,YAAuB,kBAAA,CAAA,GAAA,CAAA,OAAA"}
|
|
@@ -6,7 +6,7 @@ function Input({ className, type, ...props }) {
|
|
|
6
6
|
return /* @__PURE__ */ jsx("input", {
|
|
7
7
|
type,
|
|
8
8
|
"data-slot": "input",
|
|
9
|
-
className: cn("
|
|
9
|
+
className: cn("h-8 w-full min-w-0 rounded-lg border border-input bg-transparent px-2.5 py-1 text-base outline-none transition-colors file:inline-flex file:h-6 file:border-0 file:bg-transparent file:font-medium file:text-foreground file:text-sm placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 dark:disabled:bg-input/80", "[&::-webkit-calendar-picker-indicator]:hidden [&::-webkit-calendar-picker-indicator]:appearance-none", className),
|
|
10
10
|
...props
|
|
11
11
|
});
|
|
12
12
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input.mjs","names":[],"sources":["../../../src/components/ui/input.tsx"],"sourcesContent":["import type * as React from \"react\";\
|
|
1
|
+
{"version":3,"file":"input.mjs","names":[],"sources":["../../../src/components/ui/input.tsx"],"sourcesContent":["import type * as React from \"react\";\nimport { cn } from \"@/lib/utils/cn\";\n\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n return (\n <input\n type={type}\n data-slot=\"input\"\n className={cn(\n \"h-8 w-full min-w-0 rounded-lg border border-input bg-transparent px-2.5 py-1 text-base outline-none transition-colors file:inline-flex file:h-6 file:border-0 file:bg-transparent file:font-medium file:text-foreground file:text-sm placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 dark:disabled:bg-input/80\",\n \"[&::-webkit-calendar-picker-indicator]:hidden [&::-webkit-calendar-picker-indicator]:appearance-none\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Input };\n"],"mappings":";;;;AAGA,SAAS,MAAM,EAAE,WAAW,MAAM,GAAG,SAAwC;AAC3E,QACE,oBAAC;EACO;EACN,aAAU;EACV,WAAW,GACT,+oBACA,wGACA,UACD;EACD,GAAI;GACJ"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { Separator } from "./separator.mjs";
|
|
2
|
+
import * as react_jsx_runtime0 from "react/jsx-runtime";
|
|
3
|
+
import { VariantProps } from "class-variance-authority";
|
|
4
|
+
import * as React$1 from "react";
|
|
5
|
+
import * as class_variance_authority_types0 from "class-variance-authority/types";
|
|
6
|
+
|
|
7
|
+
//#region src/components/ui/item.d.ts
|
|
8
|
+
declare function ItemGroup({
|
|
9
|
+
className,
|
|
10
|
+
...props
|
|
11
|
+
}: React$1.ComponentProps<"div">): react_jsx_runtime0.JSX.Element;
|
|
12
|
+
declare function ItemSeparator({
|
|
13
|
+
className,
|
|
14
|
+
...props
|
|
15
|
+
}: React$1.ComponentProps<typeof Separator>): react_jsx_runtime0.JSX.Element;
|
|
16
|
+
declare const itemVariants: (props?: ({
|
|
17
|
+
variant?: "default" | "outline" | "muted" | null | undefined;
|
|
18
|
+
size?: "default" | "xs" | "sm" | null | undefined;
|
|
19
|
+
} & class_variance_authority_types0.ClassProp) | undefined) => string;
|
|
20
|
+
declare function Item({
|
|
21
|
+
className,
|
|
22
|
+
variant,
|
|
23
|
+
size,
|
|
24
|
+
asChild,
|
|
25
|
+
...props
|
|
26
|
+
}: React$1.ComponentProps<"div"> & VariantProps<typeof itemVariants> & {
|
|
27
|
+
asChild?: boolean;
|
|
28
|
+
}): react_jsx_runtime0.JSX.Element;
|
|
29
|
+
declare const itemMediaVariants: (props?: ({
|
|
30
|
+
variant?: "default" | "image" | "icon" | null | undefined;
|
|
31
|
+
} & class_variance_authority_types0.ClassProp) | undefined) => string;
|
|
32
|
+
declare function ItemMedia({
|
|
33
|
+
className,
|
|
34
|
+
variant,
|
|
35
|
+
...props
|
|
36
|
+
}: React$1.ComponentProps<"div"> & VariantProps<typeof itemMediaVariants>): react_jsx_runtime0.JSX.Element;
|
|
37
|
+
declare function ItemContent({
|
|
38
|
+
className,
|
|
39
|
+
...props
|
|
40
|
+
}: React$1.ComponentProps<"div">): react_jsx_runtime0.JSX.Element;
|
|
41
|
+
declare function ItemTitle({
|
|
42
|
+
className,
|
|
43
|
+
...props
|
|
44
|
+
}: React$1.ComponentProps<"div">): react_jsx_runtime0.JSX.Element;
|
|
45
|
+
declare function ItemDescription({
|
|
46
|
+
className,
|
|
47
|
+
...props
|
|
48
|
+
}: React$1.ComponentProps<"p">): react_jsx_runtime0.JSX.Element;
|
|
49
|
+
declare function ItemActions({
|
|
50
|
+
className,
|
|
51
|
+
...props
|
|
52
|
+
}: React$1.ComponentProps<"div">): react_jsx_runtime0.JSX.Element;
|
|
53
|
+
declare function ItemHeader({
|
|
54
|
+
className,
|
|
55
|
+
...props
|
|
56
|
+
}: React$1.ComponentProps<"div">): react_jsx_runtime0.JSX.Element;
|
|
57
|
+
declare function ItemFooter({
|
|
58
|
+
className,
|
|
59
|
+
...props
|
|
60
|
+
}: React$1.ComponentProps<"div">): react_jsx_runtime0.JSX.Element;
|
|
61
|
+
//#endregion
|
|
62
|
+
export { Item, ItemActions, ItemContent, ItemDescription, ItemFooter, ItemGroup, ItemHeader, ItemMedia, ItemSeparator, ItemTitle };
|
|
63
|
+
//# sourceMappingURL=item.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"item.d.mts","names":[],"sources":["../../../src/components/ui/item.tsx"],"mappings":";;;;;;;iBAMS,SAAA,CAAA;EAAY,SAAA;EAAA,GAAc;AAAA,GAAS,OAAA,CAAM,cAAA,UAAqB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAe9D,aAAA,CAAA;EAAgB,SAAA;EAAA,GAAc;AAAA,GAAS,OAAA,CAAM,cAAA,QAAsB,SAAA,IAAU,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,cAWhF,YAAA,GAAY,KAAA;;;IAoBjB,+BAAA,CAAA,SAAA;AAAA,iBAEQ,IAAA,CAAA;EACP,SAAA;EACA,OAAA;EACA,IAAA;EACA,OAAA;EAAA,GACG;AAAA,GACF,OAAA,CAAM,cAAA,UAAwB,YAAA,QAAoB,YAAA;EAAkB,OAAA;AAAA,IAAmB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,cAapF,iBAAA,GAAiB,KAAA;;IAetB,+BAAA,CAAA,SAAA;AAAA,iBAEQ,SAAA,CAAA;EACP,SAAA;EACA,OAAA;EAAA,GACG;AAAA,GACF,OAAA,CAAM,cAAA,UAAwB,YAAA,QAAoB,iBAAA,IAAkB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAW9D,WAAA,CAAA;EAAc,SAAA;EAAA,GAAc;AAAA,GAAS,OAAA,CAAM,cAAA,UAAqB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAahE,SAAA,CAAA;EAAY,SAAA;EAAA,GAAc;AAAA,GAAS,OAAA,CAAM,cAAA,UAAqB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAa9D,eAAA,CAAA;EAAkB,SAAA;EAAA,GAAc;AAAA,GAAS,OAAA,CAAM,cAAA,QAAmB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAalE,WAAA,CAAA;EAAc,SAAA;EAAA,GAAc;AAAA,GAAS,OAAA,CAAM,cAAA,UAAqB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAMhE,UAAA,CAAA;EAAa,SAAA;EAAA,GAAc;AAAA,GAAS,OAAA,CAAM,cAAA,UAAqB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAU/D,UAAA,CAAA;EAAa,SAAA;EAAA,GAAc;AAAA,GAAS,OAAA,CAAM,cAAA,UAAqB,kBAAA,CAAA,GAAA,CAAA,OAAA"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { cn } from "../../lib/utils/cn.mjs";
|
|
2
|
+
import { Separator as Separator$1 } from "./separator.mjs";
|
|
3
|
+
import { jsx } from "react/jsx-runtime";
|
|
4
|
+
import { cva } from "class-variance-authority";
|
|
5
|
+
import { Slot } from "radix-ui";
|
|
6
|
+
|
|
7
|
+
//#region src/components/ui/item.tsx
|
|
8
|
+
function ItemGroup({ className, ...props }) {
|
|
9
|
+
return /* @__PURE__ */ jsx("div", {
|
|
10
|
+
role: "list",
|
|
11
|
+
"data-slot": "item-group",
|
|
12
|
+
className: cn("group/item-group flex w-full flex-col gap-4 has-data-[size=sm]:gap-2.5 has-data-[size=xs]:gap-2", className),
|
|
13
|
+
...props
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
function ItemSeparator({ className, ...props }) {
|
|
17
|
+
return /* @__PURE__ */ jsx(Separator$1, {
|
|
18
|
+
"data-slot": "item-separator",
|
|
19
|
+
orientation: "horizontal",
|
|
20
|
+
className: cn("my-2", className),
|
|
21
|
+
...props
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
const itemVariants = cva("[a]:hover:bg-muted rounded-lg border text-sm group/item flex w-full flex-wrap items-center transition-colors duration-100 outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 [a]:transition-colors", {
|
|
25
|
+
variants: {
|
|
26
|
+
variant: {
|
|
27
|
+
default: "border-transparent",
|
|
28
|
+
outline: "border-border",
|
|
29
|
+
muted: "bg-muted/50 border-transparent"
|
|
30
|
+
},
|
|
31
|
+
size: {
|
|
32
|
+
default: "gap-2.5 px-3 py-2.5",
|
|
33
|
+
sm: "gap-2.5 px-3 py-2.5",
|
|
34
|
+
xs: "gap-2 px-2.5 py-2 in-data-[slot=dropdown-menu-content]:p-0"
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
defaultVariants: {
|
|
38
|
+
variant: "default",
|
|
39
|
+
size: "default"
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
function Item({ className, variant = "default", size = "default", asChild = false, ...props }) {
|
|
43
|
+
return /* @__PURE__ */ jsx(asChild ? Slot.Root : "div", {
|
|
44
|
+
"data-slot": "item",
|
|
45
|
+
"data-variant": variant,
|
|
46
|
+
"data-size": size,
|
|
47
|
+
className: cn(itemVariants({
|
|
48
|
+
variant,
|
|
49
|
+
size,
|
|
50
|
+
className
|
|
51
|
+
})),
|
|
52
|
+
...props
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
const itemMediaVariants = cva("gap-2 group-has-data-[slot=item-description]/item:translate-y-0.5 group-has-data-[slot=item-description]/item:self-start flex shrink-0 items-center justify-center [&_svg]:pointer-events-none", {
|
|
56
|
+
variants: { variant: {
|
|
57
|
+
default: "bg-transparent",
|
|
58
|
+
icon: "[&_svg:not([class*='size-'])]:size-4",
|
|
59
|
+
image: "size-10 overflow-hidden rounded-sm group-data-[size=sm]/item:size-8 group-data-[size=xs]/item:size-6 [&_img]:size-full [&_img]:object-cover"
|
|
60
|
+
} },
|
|
61
|
+
defaultVariants: { variant: "default" }
|
|
62
|
+
});
|
|
63
|
+
function ItemMedia({ className, variant = "default", ...props }) {
|
|
64
|
+
return /* @__PURE__ */ jsx("div", {
|
|
65
|
+
"data-slot": "item-media",
|
|
66
|
+
"data-variant": variant,
|
|
67
|
+
className: cn(itemMediaVariants({
|
|
68
|
+
variant,
|
|
69
|
+
className
|
|
70
|
+
})),
|
|
71
|
+
...props
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
function ItemContent({ className, ...props }) {
|
|
75
|
+
return /* @__PURE__ */ jsx("div", {
|
|
76
|
+
"data-slot": "item-content",
|
|
77
|
+
className: cn("flex flex-1 flex-col gap-1 group-data-[size=xs]/item:gap-0 [&+[data-slot=item-content]]:flex-none", className),
|
|
78
|
+
...props
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
function ItemTitle({ className, ...props }) {
|
|
82
|
+
return /* @__PURE__ */ jsx("div", {
|
|
83
|
+
"data-slot": "item-title",
|
|
84
|
+
className: cn("line-clamp-1 flex w-fit items-center gap-2 font-medium text-sm leading-snug underline-offset-4", className),
|
|
85
|
+
...props
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
function ItemDescription({ className, ...props }) {
|
|
89
|
+
return /* @__PURE__ */ jsx("p", {
|
|
90
|
+
"data-slot": "item-description",
|
|
91
|
+
className: cn("line-clamp-2 text-left font-normal text-muted-foreground text-sm leading-normal group-data-[size=xs]/item:text-xs [&>a:hover]:text-primary [&>a]:underline [&>a]:underline-offset-4", className),
|
|
92
|
+
...props
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
function ItemActions({ className, ...props }) {
|
|
96
|
+
return /* @__PURE__ */ jsx("div", {
|
|
97
|
+
"data-slot": "item-actions",
|
|
98
|
+
className: cn("flex items-center gap-2", className),
|
|
99
|
+
...props
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
function ItemHeader({ className, ...props }) {
|
|
103
|
+
return /* @__PURE__ */ jsx("div", {
|
|
104
|
+
"data-slot": "item-header",
|
|
105
|
+
className: cn("flex basis-full items-center justify-between gap-2", className),
|
|
106
|
+
...props
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
function ItemFooter({ className, ...props }) {
|
|
110
|
+
return /* @__PURE__ */ jsx("div", {
|
|
111
|
+
"data-slot": "item-footer",
|
|
112
|
+
className: cn("flex basis-full items-center justify-between gap-2", className),
|
|
113
|
+
...props
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
//#endregion
|
|
118
|
+
export { Item, ItemActions, ItemContent, ItemDescription, ItemFooter, ItemGroup, ItemHeader, ItemMedia, ItemSeparator, ItemTitle };
|
|
119
|
+
//# sourceMappingURL=item.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"item.mjs","names":["Separator"],"sources":["../../../src/components/ui/item.tsx"],"sourcesContent":["import { cva, type VariantProps } from \"class-variance-authority\";\nimport { Slot } from \"radix-ui\";\nimport type * as React from \"react\";\nimport { Separator } from \"@/components/ui/separator\";\nimport { cn } from \"@/lib/utils/cn\";\n\nfunction ItemGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n // biome-ignore lint/a11y/useSemanticElements: The list role is used to group items together, but the div element is used for styling purposes.\n <div\n role=\"list\"\n data-slot=\"item-group\"\n className={cn(\n \"group/item-group flex w-full flex-col gap-4 has-data-[size=sm]:gap-2.5 has-data-[size=xs]:gap-2\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction ItemSeparator({ className, ...props }: React.ComponentProps<typeof Separator>) {\n return (\n <Separator\n data-slot=\"item-separator\"\n orientation=\"horizontal\"\n className={cn(\"my-2\", className)}\n {...props}\n />\n );\n}\n\nconst itemVariants = cva(\n \"[a]:hover:bg-muted rounded-lg border text-sm group/item flex w-full flex-wrap items-center transition-colors duration-100 outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 [a]:transition-colors\",\n {\n variants: {\n variant: {\n default: \"border-transparent\",\n outline: \"border-border\",\n muted: \"bg-muted/50 border-transparent\",\n },\n size: {\n default: \"gap-2.5 px-3 py-2.5\",\n sm: \"gap-2.5 px-3 py-2.5\",\n xs: \"gap-2 px-2.5 py-2 in-data-[slot=dropdown-menu-content]:p-0\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\nfunction Item({\n className,\n variant = \"default\",\n size = \"default\",\n asChild = false,\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof itemVariants> & { asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : \"div\";\n return (\n <Comp\n data-slot=\"item\"\n data-variant={variant}\n data-size={size}\n className={cn(itemVariants({ variant, size, className }))}\n {...props}\n />\n );\n}\n\nconst itemMediaVariants = cva(\n \"gap-2 group-has-data-[slot=item-description]/item:translate-y-0.5 group-has-data-[slot=item-description]/item:self-start flex shrink-0 items-center justify-center [&_svg]:pointer-events-none\",\n {\n variants: {\n variant: {\n default: \"bg-transparent\",\n icon: \"[&_svg:not([class*='size-'])]:size-4\",\n image:\n \"size-10 overflow-hidden rounded-sm group-data-[size=sm]/item:size-8 group-data-[size=xs]/item:size-6 [&_img]:size-full [&_img]:object-cover\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\nfunction ItemMedia({\n className,\n variant = \"default\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof itemMediaVariants>) {\n return (\n <div\n data-slot=\"item-media\"\n data-variant={variant}\n className={cn(itemMediaVariants({ variant, className }))}\n {...props}\n />\n );\n}\n\nfunction ItemContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"item-content\"\n className={cn(\n \"flex flex-1 flex-col gap-1 group-data-[size=xs]/item:gap-0 [&+[data-slot=item-content]]:flex-none\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction ItemTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"item-title\"\n className={cn(\n \"line-clamp-1 flex w-fit items-center gap-2 font-medium text-sm leading-snug underline-offset-4\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction ItemDescription({ className, ...props }: React.ComponentProps<\"p\">) {\n return (\n <p\n data-slot=\"item-description\"\n className={cn(\n \"line-clamp-2 text-left font-normal text-muted-foreground text-sm leading-normal group-data-[size=xs]/item:text-xs [&>a:hover]:text-primary [&>a]:underline [&>a]:underline-offset-4\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction ItemActions({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div data-slot=\"item-actions\" className={cn(\"flex items-center gap-2\", className)} {...props} />\n );\n}\n\nfunction ItemHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"item-header\"\n className={cn(\"flex basis-full items-center justify-between gap-2\", className)}\n {...props}\n />\n );\n}\n\nfunction ItemFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"item-footer\"\n className={cn(\"flex basis-full items-center justify-between gap-2\", className)}\n {...props}\n />\n );\n}\n\nexport {\n Item,\n ItemMedia,\n ItemContent,\n ItemActions,\n ItemGroup,\n ItemSeparator,\n ItemTitle,\n ItemDescription,\n ItemHeader,\n ItemFooter,\n};\n"],"mappings":";;;;;;;AAMA,SAAS,UAAU,EAAE,WAAW,GAAG,SAAsC;AACvE,QAEE,oBAAC;EACC,MAAK;EACL,aAAU;EACV,WAAW,GACT,mGACA,UACD;EACD,GAAI;GACJ;;AAIN,SAAS,cAAc,EAAE,WAAW,GAAG,SAAiD;AACtF,QACE,oBAACA;EACC,aAAU;EACV,aAAY;EACZ,WAAW,GAAG,QAAQ,UAAU;EAChC,GAAI;GACJ;;AAIN,MAAM,eAAe,IACnB,8OACA;CACE,UAAU;EACR,SAAS;GACP,SAAS;GACT,SAAS;GACT,OAAO;GACR;EACD,MAAM;GACJ,SAAS;GACT,IAAI;GACJ,IAAI;GACL;EACF;CACD,iBAAiB;EACf,SAAS;EACT,MAAM;EACP;CACF,CACF;AAED,SAAS,KAAK,EACZ,WACA,UAAU,WACV,OAAO,WACP,UAAU,OACV,GAAG,SACuF;AAE1F,QACE,oBAFW,UAAU,KAAK,OAAO;EAG/B,aAAU;EACV,gBAAc;EACd,aAAW;EACX,WAAW,GAAG,aAAa;GAAE;GAAS;GAAM;GAAW,CAAC,CAAC;EACzD,GAAI;GACJ;;AAIN,MAAM,oBAAoB,IACxB,kMACA;CACE,UAAU,EACR,SAAS;EACP,SAAS;EACT,MAAM;EACN,OACE;EACH,EACF;CACD,iBAAiB,EACf,SAAS,WACV;CACF,CACF;AAED,SAAS,UAAU,EACjB,WACA,UAAU,WACV,GAAG,SACoE;AACvE,QACE,oBAAC;EACC,aAAU;EACV,gBAAc;EACd,WAAW,GAAG,kBAAkB;GAAE;GAAS;GAAW,CAAC,CAAC;EACxD,GAAI;GACJ;;AAIN,SAAS,YAAY,EAAE,WAAW,GAAG,SAAsC;AACzE,QACE,oBAAC;EACC,aAAU;EACV,WAAW,GACT,qGACA,UACD;EACD,GAAI;GACJ;;AAIN,SAAS,UAAU,EAAE,WAAW,GAAG,SAAsC;AACvE,QACE,oBAAC;EACC,aAAU;EACV,WAAW,GACT,kGACA,UACD;EACD,GAAI;GACJ;;AAIN,SAAS,gBAAgB,EAAE,WAAW,GAAG,SAAoC;AAC3E,QACE,oBAAC;EACC,aAAU;EACV,WAAW,GACT,uLACA,UACD;EACD,GAAI;GACJ;;AAIN,SAAS,YAAY,EAAE,WAAW,GAAG,SAAsC;AACzE,QACE,oBAAC;EAAI,aAAU;EAAe,WAAW,GAAG,2BAA2B,UAAU;EAAE,GAAI;GAAS;;AAIpG,SAAS,WAAW,EAAE,WAAW,GAAG,SAAsC;AACxE,QACE,oBAAC;EACC,aAAU;EACV,WAAW,GAAG,sDAAsD,UAAU;EAC9E,GAAI;GACJ;;AAIN,SAAS,WAAW,EAAE,WAAW,GAAG,SAAsC;AACxE,QACE,oBAAC;EACC,aAAU;EACV,WAAW,GAAG,sDAAsD,UAAU;EAC9E,GAAI;GACJ"}
|