@hypoth-ui/cli 0.0.1 → 0.1.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 +21 -0
- package/README.md +19 -115
- package/dist/{add-PDBC4JTE.js → add-V5PW73GC.js} +29 -17
- package/dist/{chunk-5LTQ2XVL.js → chunk-27CLUUVC.js} +0 -2
- package/dist/{chunk-YPKFYE45.js → chunk-NWIRSZUQ.js} +6 -13
- package/dist/{chunk-GJ6JOQ3Q.js → chunk-PBK72SJJ.js} +1 -1
- package/dist/{diff-BQEXG7HU.js → diff-776UATCA.js} +2 -2
- package/dist/index.js +5 -5
- package/dist/{init-7AZXYAPJ.js → init-GDU2PW7K.js} +10 -13
- package/dist/{list-X6ZLM2NQ.js → list-XDP5I537.js} +3 -3
- package/package.json +16 -12
- package/registry/components.json +1820 -206
- package/templates/accordion/index.tsx +266 -0
- package/templates/accordion/wc/accordion-content.ts +113 -0
- package/templates/accordion/wc/accordion-item.ts +111 -0
- package/templates/accordion/wc/accordion-trigger.ts +105 -0
- package/templates/accordion/wc/accordion.ts +213 -0
- package/templates/accordion/wc/index.ts +12 -0
- package/templates/alert/index.tsx +177 -0
- package/templates/alert/wc/alert.ts +167 -0
- package/templates/alert/wc/index.ts +1 -0
- package/templates/alert-dialog/index.tsx +360 -0
- package/templates/alert-dialog/wc/alert-dialog-action.ts +43 -0
- package/templates/alert-dialog/wc/alert-dialog-cancel.ts +43 -0
- package/templates/alert-dialog/wc/alert-dialog-content.ts +42 -0
- package/templates/alert-dialog/wc/alert-dialog-description.ts +34 -0
- package/templates/alert-dialog/wc/alert-dialog-footer.ts +25 -0
- package/templates/alert-dialog/wc/alert-dialog-header.ts +25 -0
- package/templates/alert-dialog/wc/alert-dialog-title.ts +34 -0
- package/templates/alert-dialog/wc/alert-dialog-trigger.ts +46 -0
- package/templates/alert-dialog/wc/alert-dialog.ts +302 -0
- package/templates/alert-dialog/wc/index.ts +13 -0
- package/templates/aspect-ratio/index.tsx +50 -0
- package/templates/aspect-ratio/wc/aspect-ratio.ts +78 -0
- package/templates/aspect-ratio/wc/index.ts +5 -0
- package/templates/avatar/avatar-group.tsx +88 -0
- package/templates/avatar/avatar.tsx +124 -0
- package/templates/avatar/index.tsx +33 -0
- package/templates/avatar/wc/avatar-group.ts +112 -0
- package/templates/avatar/wc/avatar.ts +184 -0
- package/templates/avatar/wc/index.ts +5 -0
- package/templates/badge/index.tsx +140 -0
- package/templates/badge/wc/badge.ts +119 -0
- package/templates/badge/wc/index.ts +9 -0
- package/templates/breadcrumb/index.tsx +157 -0
- package/templates/breadcrumb/wc/breadcrumb-item.ts +30 -0
- package/templates/breadcrumb/wc/breadcrumb-link.ts +70 -0
- package/templates/breadcrumb/wc/breadcrumb-list.ts +30 -0
- package/templates/breadcrumb/wc/breadcrumb-page.ts +32 -0
- package/templates/breadcrumb/wc/breadcrumb-separator.ts +31 -0
- package/templates/breadcrumb/wc/breadcrumb.ts +55 -0
- package/templates/breadcrumb/wc/index.ts +10 -0
- package/templates/button/button.tsx +119 -0
- package/templates/button/index.ts +1 -0
- package/templates/button/wc/button.ts +169 -0
- package/templates/calendar/index.tsx +149 -0
- package/templates/calendar/wc/calendar.ts +316 -0
- package/templates/calendar/wc/index.ts +4 -0
- package/templates/card/index.tsx +108 -0
- package/templates/card/wc/card-content.ts +25 -0
- package/templates/card/wc/card-footer.ts +25 -0
- package/templates/card/wc/card-header.ts +25 -0
- package/templates/card/wc/card.ts +43 -0
- package/templates/card/wc/index.ts +8 -0
- package/templates/checkbox/checkbox.tsx +85 -0
- package/templates/checkbox/wc/checkbox.ts +247 -0
- package/templates/collapsible/index.tsx +172 -0
- package/templates/collapsible/wc/collapsible-content.ts +97 -0
- package/templates/collapsible/wc/collapsible-trigger.ts +39 -0
- package/templates/collapsible/wc/collapsible.ts +143 -0
- package/templates/collapsible/wc/index.ts +7 -0
- package/templates/combobox/combobox-content.tsx +141 -0
- package/templates/combobox/combobox-context.ts +36 -0
- package/templates/combobox/combobox-empty.tsx +38 -0
- package/templates/combobox/combobox-input.tsx +159 -0
- package/templates/combobox/combobox-loading.tsx +38 -0
- package/templates/combobox/combobox-option.tsx +99 -0
- package/templates/combobox/combobox-root.tsx +207 -0
- package/templates/combobox/combobox-tag.tsx +62 -0
- package/templates/combobox/index.ts +62 -0
- package/templates/combobox/wc/combobox-content.ts +97 -0
- package/templates/combobox/wc/combobox-input.ts +134 -0
- package/templates/combobox/wc/combobox-option.ts +111 -0
- package/templates/combobox/wc/combobox-tag.ts +103 -0
- package/templates/combobox/wc/combobox.ts +981 -0
- package/templates/combobox/wc/index.ts +5 -0
- package/templates/command/index.tsx +279 -0
- package/templates/command/wc/command-empty.ts +24 -0
- package/templates/command/wc/command-group.ts +60 -0
- package/templates/command/wc/command-input.ts +136 -0
- package/templates/command/wc/command-item.ts +78 -0
- package/templates/command/wc/command-list.ts +103 -0
- package/templates/command/wc/command-loading.ts +24 -0
- package/templates/command/wc/command-separator.ts +23 -0
- package/templates/command/wc/command.ts +176 -0
- package/templates/context-menu/index.tsx +262 -0
- package/templates/context-menu/wc/context-menu-content.ts +41 -0
- package/templates/context-menu/wc/context-menu-item.ts +83 -0
- package/templates/context-menu/wc/context-menu-label.ts +30 -0
- package/templates/context-menu/wc/context-menu-separator.ts +28 -0
- package/templates/context-menu/wc/context-menu.ts +324 -0
- package/templates/context-menu/wc/index.ts +9 -0
- package/templates/data-table/index.tsx +263 -0
- package/templates/data-table/wc/data-table.ts +405 -0
- package/templates/data-table/wc/index.ts +10 -0
- package/templates/date-picker/date-picker-calendar.tsx +352 -0
- package/templates/date-picker/date-picker-content.tsx +121 -0
- package/templates/date-picker/date-picker-context.ts +46 -0
- package/templates/date-picker/date-picker-root.tsx +201 -0
- package/templates/date-picker/date-picker-trigger.tsx +95 -0
- package/templates/date-picker/index.ts +44 -0
- package/templates/date-picker/wc/date-picker-calendar.ts +457 -0
- package/templates/date-picker/wc/date-picker.ts +592 -0
- package/templates/date-picker/wc/date-utils.ts +467 -0
- package/templates/date-picker/wc/index.ts +3 -0
- package/templates/dialog/dialog-close.tsx +57 -0
- package/templates/dialog/dialog-content.tsx +106 -0
- package/templates/dialog/dialog-context.ts +24 -0
- package/templates/dialog/dialog-description.tsx +51 -0
- package/templates/dialog/dialog-root.tsx +104 -0
- package/templates/dialog/dialog-title.tsx +38 -0
- package/templates/dialog/dialog-trigger.tsx +94 -0
- package/templates/dialog/index.ts +52 -0
- package/templates/dialog/wc/dialog-content.ts +59 -0
- package/templates/dialog/wc/dialog-description.ts +58 -0
- package/templates/dialog/wc/dialog-title.ts +56 -0
- package/templates/dialog/wc/dialog.ts +411 -0
- package/templates/drawer/index.tsx +263 -0
- package/templates/drawer/wc/drawer-content.ts +150 -0
- package/templates/drawer/wc/drawer-description.ts +34 -0
- package/templates/drawer/wc/drawer-footer.ts +25 -0
- package/templates/drawer/wc/drawer-header.ts +25 -0
- package/templates/drawer/wc/drawer-title.ts +34 -0
- package/templates/drawer/wc/drawer.ts +348 -0
- package/templates/drawer/wc/index.ts +10 -0
- package/templates/dropdown-menu/index.tsx +454 -0
- package/templates/dropdown-menu/wc/dropdown-menu-checkbox-item.ts +93 -0
- package/templates/dropdown-menu/wc/dropdown-menu-content.ts +43 -0
- package/templates/dropdown-menu/wc/dropdown-menu-item.ts +85 -0
- package/templates/dropdown-menu/wc/dropdown-menu-label.ts +31 -0
- package/templates/dropdown-menu/wc/dropdown-menu-radio-group.ts +80 -0
- package/templates/dropdown-menu/wc/dropdown-menu-radio-item.ts +101 -0
- package/templates/dropdown-menu/wc/dropdown-menu-separator.ts +28 -0
- package/templates/dropdown-menu/wc/dropdown-menu.ts +358 -0
- package/templates/dropdown-menu/wc/index.ts +12 -0
- package/templates/field/field-description.tsx +39 -0
- package/templates/field/field-error.tsx +37 -0
- package/templates/field/field.tsx +46 -0
- package/templates/field/index.ts +4 -0
- package/templates/field/label.tsx +40 -0
- package/templates/field/wc/field-description.ts +42 -0
- package/templates/field/wc/field-error.ts +46 -0
- package/templates/field/wc/field.ts +210 -0
- package/templates/field/wc/label.ts +54 -0
- package/templates/file-upload/file-upload-context.ts +26 -0
- package/templates/file-upload/file-upload-dropzone.tsx +111 -0
- package/templates/file-upload/file-upload-input.tsx +86 -0
- package/templates/file-upload/file-upload-item.tsx +105 -0
- package/templates/file-upload/file-upload-root.tsx +115 -0
- package/templates/file-upload/index.ts +50 -0
- package/templates/file-upload/wc/file-upload.ts +380 -0
- package/templates/file-upload/wc/index.ts +1 -0
- package/templates/hover-card/index.tsx +203 -0
- package/templates/hover-card/wc/hover-card-content.ts +50 -0
- package/templates/hover-card/wc/hover-card.ts +382 -0
- package/templates/hover-card/wc/index.ts +6 -0
- package/templates/icon/icon.tsx +76 -0
- package/templates/icon/wc/icon-adapter.ts +108 -0
- package/templates/icon/wc/icon.ts +161 -0
- package/templates/input/input.tsx +130 -0
- package/templates/input/wc/input.ts +216 -0
- package/templates/layout/app-shell.tsx +177 -0
- package/templates/layout/box.tsx +53 -0
- package/templates/layout/center.tsx +42 -0
- package/templates/layout/container.tsx +43 -0
- package/templates/layout/flow.tsx +83 -0
- package/templates/layout/grid.tsx +79 -0
- package/templates/layout/index.ts +33 -0
- package/templates/layout/inline.tsx +16 -0
- package/templates/layout/page.tsx +43 -0
- package/templates/layout/section.tsx +39 -0
- package/templates/layout/spacer.tsx +30 -0
- package/templates/layout/split.tsx +47 -0
- package/templates/layout/stack.tsx +16 -0
- package/templates/layout/wc/app-shell.ts +58 -0
- package/templates/layout/wc/box.ts +117 -0
- package/templates/layout/wc/center.ts +78 -0
- package/templates/layout/wc/container.ts +77 -0
- package/templates/layout/wc/flow.ts +149 -0
- package/templates/layout/wc/footer.ts +57 -0
- package/templates/layout/wc/grid.ts +142 -0
- package/templates/layout/wc/header.ts +57 -0
- package/templates/layout/wc/index.ts +41 -0
- package/templates/layout/wc/main.ts +46 -0
- package/templates/layout/wc/page.ts +81 -0
- package/templates/layout/wc/section.ts +65 -0
- package/templates/layout/wc/spacer.ts +77 -0
- package/templates/layout/wc/split.ts +94 -0
- package/templates/layout/wc/wrap.ts +93 -0
- package/templates/layout/wrap.tsx +46 -0
- package/templates/link/link.tsx +109 -0
- package/templates/link/wc/link.ts +124 -0
- package/templates/list/index.tsx +55 -0
- package/templates/list/list-item.tsx +117 -0
- package/templates/list/list.tsx +115 -0
- package/templates/list/wc/index.ts +5 -0
- package/templates/list/wc/list-item.ts +127 -0
- package/templates/list/wc/list.ts +114 -0
- package/templates/menu/index.ts +49 -0
- package/templates/menu/menu-content.tsx +109 -0
- package/templates/menu/menu-context.ts +17 -0
- package/templates/menu/menu-item.tsx +108 -0
- package/templates/menu/menu-label.tsx +32 -0
- package/templates/menu/menu-root.tsx +108 -0
- package/templates/menu/menu-separator.tsx +24 -0
- package/templates/menu/menu-trigger.tsx +104 -0
- package/templates/menu/wc/menu-content.ts +67 -0
- package/templates/menu/wc/menu-item.ts +109 -0
- package/templates/menu/wc/menu.ts +449 -0
- package/templates/navigation-menu/index.tsx +328 -0
- package/templates/navigation-menu/wc/index.ts +12 -0
- package/templates/navigation-menu/wc/navigation-menu-content.ts +30 -0
- package/templates/navigation-menu/wc/navigation-menu-indicator.ts +30 -0
- package/templates/navigation-menu/wc/navigation-menu-item.ts +60 -0
- package/templates/navigation-menu/wc/navigation-menu-link.ts +97 -0
- package/templates/navigation-menu/wc/navigation-menu-list.ts +30 -0
- package/templates/navigation-menu/wc/navigation-menu-trigger.ts +110 -0
- package/templates/navigation-menu/wc/navigation-menu-viewport.ts +85 -0
- package/templates/navigation-menu/wc/navigation-menu.ts +272 -0
- package/templates/number-input/index.ts +46 -0
- package/templates/number-input/number-input-context.ts +38 -0
- package/templates/number-input/number-input-decrement.tsx +53 -0
- package/templates/number-input/number-input-field.tsx +93 -0
- package/templates/number-input/number-input-increment.tsx +53 -0
- package/templates/number-input/number-input-root.tsx +137 -0
- package/templates/number-input/wc/index.ts +1 -0
- package/templates/number-input/wc/number-input.ts +283 -0
- package/templates/pagination/index.tsx +198 -0
- package/templates/pagination/wc/index.ts +11 -0
- package/templates/pagination/wc/pagination-content.ts +30 -0
- package/templates/pagination/wc/pagination-ellipsis.ts +28 -0
- package/templates/pagination/wc/pagination-item.ts +30 -0
- package/templates/pagination/wc/pagination-link.ts +76 -0
- package/templates/pagination/wc/pagination-next.ts +69 -0
- package/templates/pagination/wc/pagination-previous.ts +69 -0
- package/templates/pagination/wc/pagination.ts +156 -0
- package/templates/pin-input/index.ts +39 -0
- package/templates/pin-input/pin-input-context.ts +30 -0
- package/templates/pin-input/pin-input-field.tsx +186 -0
- package/templates/pin-input/pin-input-root.tsx +120 -0
- package/templates/pin-input/wc/index.ts +1 -0
- package/templates/pin-input/wc/pin-input.ts +259 -0
- package/templates/popover/popover.tsx +121 -0
- package/templates/popover/wc/popover-content.ts +66 -0
- package/templates/popover/wc/popover.ts +343 -0
- package/templates/progress/index.tsx +117 -0
- package/templates/progress/wc/index.ts +4 -0
- package/templates/progress/wc/progress.ts +174 -0
- package/templates/radio/radio.tsx +43 -0
- package/templates/radio/wc/radio-group.ts +261 -0
- package/templates/radio/wc/radio.ts +145 -0
- package/templates/scroll-area/index.tsx +144 -0
- package/templates/scroll-area/wc/index.ts +8 -0
- package/templates/scroll-area/wc/scroll-area-scrollbar.ts +143 -0
- package/templates/scroll-area/wc/scroll-area-thumb.ts +225 -0
- package/templates/scroll-area/wc/scroll-area-viewport.ts +120 -0
- package/templates/scroll-area/wc/scroll-area.ts +63 -0
- package/templates/select/index.ts +57 -0
- package/templates/select/select-content.tsx +243 -0
- package/templates/select/select-context.ts +30 -0
- package/templates/select/select-group.tsx +53 -0
- package/templates/select/select-label.tsx +34 -0
- package/templates/select/select-option.tsx +97 -0
- package/templates/select/select-root.tsx +153 -0
- package/templates/select/select-separator.tsx +27 -0
- package/templates/select/select-trigger.tsx +112 -0
- package/templates/select/select-value.tsx +48 -0
- package/templates/select/wc/index.ts +6 -0
- package/templates/select/wc/select-content.ts +89 -0
- package/templates/select/wc/select-group.ts +82 -0
- package/templates/select/wc/select-label.ts +49 -0
- package/templates/select/wc/select-option.ts +111 -0
- package/templates/select/wc/select-trigger.ts +101 -0
- package/templates/select/wc/select.ts +840 -0
- package/templates/separator/index.tsx +49 -0
- package/templates/separator/wc/index.ts +5 -0
- package/templates/separator/wc/separator.ts +60 -0
- package/templates/sheet/index.tsx +291 -0
- package/templates/sheet/wc/index.ts +12 -0
- package/templates/sheet/wc/sheet-close.ts +43 -0
- package/templates/sheet/wc/sheet-content.ts +47 -0
- package/templates/sheet/wc/sheet-description.ts +34 -0
- package/templates/sheet/wc/sheet-footer.ts +25 -0
- package/templates/sheet/wc/sheet-header.ts +25 -0
- package/templates/sheet/wc/sheet-overlay.ts +23 -0
- package/templates/sheet/wc/sheet-title.ts +34 -0
- package/templates/sheet/wc/sheet.ts +336 -0
- package/templates/skeleton/index.tsx +131 -0
- package/templates/skeleton/wc/index.ts +10 -0
- package/templates/skeleton/wc/skeleton.ts +107 -0
- package/templates/slider/index.ts +41 -0
- package/templates/slider/slider-context.ts +36 -0
- package/templates/slider/slider-range.tsx +59 -0
- package/templates/slider/slider-root.tsx +166 -0
- package/templates/slider/slider-thumb.tsx +213 -0
- package/templates/slider/slider-track.tsx +113 -0
- package/templates/slider/wc/index.ts +1 -0
- package/templates/slider/wc/slider.ts +465 -0
- package/templates/spinner/spinner.tsx +64 -0
- package/templates/spinner/wc/spinner.ts +70 -0
- package/templates/stepper/index.tsx +230 -0
- package/templates/stepper/wc/index.ts +12 -0
- package/templates/stepper/wc/stepper-content.ts +30 -0
- package/templates/stepper/wc/stepper-description.ts +25 -0
- package/templates/stepper/wc/stepper-indicator.ts +30 -0
- package/templates/stepper/wc/stepper-item.ts +55 -0
- package/templates/stepper/wc/stepper-separator.ts +29 -0
- package/templates/stepper/wc/stepper-title.ts +25 -0
- package/templates/stepper/wc/stepper-trigger.ts +67 -0
- package/templates/stepper/wc/stepper.ts +164 -0
- package/templates/switch/switch.tsx +90 -0
- package/templates/switch/wc/switch.ts +228 -0
- package/templates/table/body.tsx +21 -0
- package/templates/table/cell.tsx +44 -0
- package/templates/table/head.tsx +112 -0
- package/templates/table/header.tsx +21 -0
- package/templates/table/index.tsx +93 -0
- package/templates/table/root.tsx +82 -0
- package/templates/table/row.tsx +36 -0
- package/templates/table/wc/index.ts +9 -0
- package/templates/table/wc/table-body.ts +32 -0
- package/templates/table/wc/table-cell.ts +58 -0
- package/templates/table/wc/table-head.ts +129 -0
- package/templates/table/wc/table-header.ts +32 -0
- package/templates/table/wc/table-row.ts +50 -0
- package/templates/table/wc/table.ts +93 -0
- package/templates/tabs/index.tsx +222 -0
- package/templates/tabs/wc/index.ts +8 -0
- package/templates/tabs/wc/tabs-content.ts +82 -0
- package/templates/tabs/wc/tabs-list.ts +56 -0
- package/templates/tabs/wc/tabs-trigger.ts +136 -0
- package/templates/tabs/wc/tabs.ts +202 -0
- package/templates/tag/index.tsx +186 -0
- package/templates/tag/wc/index.ts +4 -0
- package/templates/tag/wc/tag.ts +166 -0
- package/templates/text/text.tsx +100 -0
- package/templates/text/wc/text.ts +94 -0
- package/templates/textarea/textarea.tsx +134 -0
- package/templates/textarea/wc/textarea.ts +280 -0
- package/templates/time-picker/index.ts +42 -0
- package/templates/time-picker/time-picker-context.ts +28 -0
- package/templates/time-picker/time-picker-root.tsx +113 -0
- package/templates/time-picker/time-picker-segment.tsx +91 -0
- package/templates/time-picker/wc/index.ts +1 -0
- package/templates/time-picker/wc/time-picker.ts +221 -0
- package/templates/toast/index.tsx +71 -0
- package/templates/toast/provider.tsx +228 -0
- package/templates/toast/toast.tsx +142 -0
- package/templates/toast/use-toast.ts +89 -0
- package/templates/toast/wc/index.ts +15 -0
- package/templates/toast/wc/toast-controller.ts +282 -0
- package/templates/toast/wc/toast-provider.ts +161 -0
- package/templates/toast/wc/toast.ts +165 -0
- package/templates/tooltip/tooltip.tsx +62 -0
- package/templates/tooltip/wc/tooltip-content.ts +64 -0
- package/templates/tooltip/wc/tooltip.ts +289 -0
- package/templates/tree/index.tsx +60 -0
- package/templates/tree/tree-item.tsx +131 -0
- package/templates/tree/tree.tsx +138 -0
- package/templates/tree/wc/index.ts +11 -0
- package/templates/tree/wc/tree-item.ts +273 -0
- package/templates/tree/wc/tree-utils.ts +143 -0
- package/templates/tree/wc/tree.ts +139 -0
- package/templates/visually-hidden/visually-hidden.tsx +45 -0
- package/templates/visually-hidden/wc/visually-hidden.ts +64 -0
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { type HTMLAttributes, type ReactNode, createElement, forwardRef } from "react";
|
|
4
|
+
import "@hypoth-ui/wc";
|
|
5
|
+
|
|
6
|
+
export interface TableRowProps extends HTMLAttributes<HTMLElement> {
|
|
7
|
+
/**
|
|
8
|
+
* Row ID for selection tracking.
|
|
9
|
+
*/
|
|
10
|
+
rowId?: string;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Whether this row is selected.
|
|
14
|
+
* @default false
|
|
15
|
+
*/
|
|
16
|
+
selected?: boolean;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Row cells.
|
|
20
|
+
*/
|
|
21
|
+
children?: ReactNode;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Table row component (tr).
|
|
26
|
+
*/
|
|
27
|
+
export const TableRow = forwardRef<HTMLElement, TableRowProps>(function TableRow(
|
|
28
|
+
{ rowId, selected = false, children, className, ...props },
|
|
29
|
+
ref
|
|
30
|
+
) {
|
|
31
|
+
return createElement(
|
|
32
|
+
"ds-table-row",
|
|
33
|
+
{ ref, "row-id": rowId, selected: selected || undefined, class: className, ...props },
|
|
34
|
+
children
|
|
35
|
+
);
|
|
36
|
+
});
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Table component exports
|
|
3
|
+
*/
|
|
4
|
+
export { DsTable, type TableSize } from "./table.js";
|
|
5
|
+
export { DsTableHeader } from "./table-header.js";
|
|
6
|
+
export { DsTableBody } from "./table-body.js";
|
|
7
|
+
export { DsTableRow } from "./table-row.js";
|
|
8
|
+
export { DsTableHead, type TableAlign, type SortDirection } from "./table-head.js";
|
|
9
|
+
export { DsTableCell } from "./table-cell.js";
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { type TemplateResult, html } from "lit";
|
|
2
|
+
import { DSElement } from "../../base/ds-element.js";
|
|
3
|
+
import { define } from "../../registry/define.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Table body component (tbody).
|
|
7
|
+
*
|
|
8
|
+
* @element ds-table-body
|
|
9
|
+
*
|
|
10
|
+
* @slot - TableRow elements for body
|
|
11
|
+
*/
|
|
12
|
+
export class DsTableBody extends DSElement {
|
|
13
|
+
static override styles = [];
|
|
14
|
+
|
|
15
|
+
override render(): TemplateResult {
|
|
16
|
+
return html`
|
|
17
|
+
<tbody class="ds-table__body" role="rowgroup">
|
|
18
|
+
<slot></slot>
|
|
19
|
+
</tbody>
|
|
20
|
+
`;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// Register the component
|
|
25
|
+
define("ds-table-body", DsTableBody);
|
|
26
|
+
|
|
27
|
+
// TypeScript declaration for HTML
|
|
28
|
+
declare global {
|
|
29
|
+
interface HTMLElementTagNameMap {
|
|
30
|
+
"ds-table-body": DsTableBody;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { type TemplateResult, html, nothing } from "lit";
|
|
2
|
+
import { property } from "lit/decorators.js";
|
|
3
|
+
import { DSElement } from "../../base/ds-element.js";
|
|
4
|
+
import { define } from "../../registry/define.js";
|
|
5
|
+
import type { TableAlign } from "./table-head.js";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Table cell component (td).
|
|
9
|
+
*
|
|
10
|
+
* @element ds-table-cell
|
|
11
|
+
*
|
|
12
|
+
* @slot - Cell content
|
|
13
|
+
*/
|
|
14
|
+
export class DsTableCell extends DSElement {
|
|
15
|
+
static override styles = [];
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Text alignment.
|
|
19
|
+
*/
|
|
20
|
+
@property({ type: String, reflect: true })
|
|
21
|
+
align: TableAlign = "left";
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Column span.
|
|
25
|
+
*/
|
|
26
|
+
@property({ type: Number })
|
|
27
|
+
colspan = 1;
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Row span.
|
|
31
|
+
*/
|
|
32
|
+
@property({ type: Number })
|
|
33
|
+
rowspan = 1;
|
|
34
|
+
|
|
35
|
+
override render(): TemplateResult {
|
|
36
|
+
return html`
|
|
37
|
+
<td
|
|
38
|
+
class="ds-table__cell"
|
|
39
|
+
role="gridcell"
|
|
40
|
+
data-align=${this.align !== "left" ? this.align : nothing}
|
|
41
|
+
colspan=${this.colspan > 1 ? this.colspan : nothing}
|
|
42
|
+
rowspan=${this.rowspan > 1 ? this.rowspan : nothing}
|
|
43
|
+
>
|
|
44
|
+
<slot></slot>
|
|
45
|
+
</td>
|
|
46
|
+
`;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Register the component
|
|
51
|
+
define("ds-table-cell", DsTableCell);
|
|
52
|
+
|
|
53
|
+
// TypeScript declaration for HTML
|
|
54
|
+
declare global {
|
|
55
|
+
interface HTMLElementTagNameMap {
|
|
56
|
+
"ds-table-cell": DsTableCell;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { type TemplateResult, html, nothing } from "lit";
|
|
2
|
+
import { property } from "lit/decorators.js";
|
|
3
|
+
import { DSElement } from "../../base/ds-element.js";
|
|
4
|
+
import { emitEvent } from "../../events/emit.js";
|
|
5
|
+
import { define } from "../../registry/define.js";
|
|
6
|
+
|
|
7
|
+
export type TableAlign = "left" | "center" | "right";
|
|
8
|
+
export type SortDirection = "asc" | "desc" | "none";
|
|
9
|
+
|
|
10
|
+
// Sort icon SVG
|
|
11
|
+
const sortIcon = html`
|
|
12
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true">
|
|
13
|
+
<path d="M12 5v14M5 12l7-7 7 7" />
|
|
14
|
+
</svg>
|
|
15
|
+
`;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Table header cell component (th).
|
|
19
|
+
*
|
|
20
|
+
* @element ds-table-head
|
|
21
|
+
*
|
|
22
|
+
* @slot - Header content
|
|
23
|
+
*
|
|
24
|
+
* @fires ds-sort - When sortable header is clicked
|
|
25
|
+
*/
|
|
26
|
+
export class DsTableHead extends DSElement {
|
|
27
|
+
static override styles = [];
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Column key for sorting.
|
|
31
|
+
*/
|
|
32
|
+
@property({ type: String })
|
|
33
|
+
column = "";
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Text alignment.
|
|
37
|
+
*/
|
|
38
|
+
@property({ type: String, reflect: true })
|
|
39
|
+
align: TableAlign = "left";
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Whether this column is sortable.
|
|
43
|
+
*/
|
|
44
|
+
@property({ type: Boolean, reflect: true })
|
|
45
|
+
sortable = false;
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Current sort direction.
|
|
49
|
+
*/
|
|
50
|
+
@property({ type: String, attribute: "sort-direction", reflect: true })
|
|
51
|
+
sortDirection: SortDirection = "none";
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Column width (CSS value).
|
|
55
|
+
*/
|
|
56
|
+
@property({ type: String })
|
|
57
|
+
width = "";
|
|
58
|
+
|
|
59
|
+
private handleClick(): void {
|
|
60
|
+
if (!this.sortable) return;
|
|
61
|
+
|
|
62
|
+
emitEvent(this, "sort", {
|
|
63
|
+
detail: {
|
|
64
|
+
column: this.column,
|
|
65
|
+
direction: this.getNextDirection(),
|
|
66
|
+
},
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
private handleKeyDown(event: KeyboardEvent): void {
|
|
71
|
+
if (!this.sortable) return;
|
|
72
|
+
if (event.key === "Enter" || event.key === " ") {
|
|
73
|
+
event.preventDefault();
|
|
74
|
+
this.handleClick();
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
private getNextDirection(): SortDirection {
|
|
79
|
+
if (this.sortDirection === "none") return "asc";
|
|
80
|
+
if (this.sortDirection === "asc") return "desc";
|
|
81
|
+
return "none";
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Get the aria-sort attribute value.
|
|
86
|
+
* Per APG, sortable columns should always have aria-sort:
|
|
87
|
+
* - "ascending" for A-Z or low-high sort
|
|
88
|
+
* - "descending" for Z-A or high-low sort
|
|
89
|
+
* - "none" when sortable but not currently sorted
|
|
90
|
+
*/
|
|
91
|
+
private getAriaSort(): "ascending" | "descending" | "none" {
|
|
92
|
+
if (this.sortDirection === "asc") return "ascending";
|
|
93
|
+
if (this.sortDirection === "desc") return "descending";
|
|
94
|
+
return "none";
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
override render(): TemplateResult {
|
|
98
|
+
const style = this.width ? `width: ${this.width}` : "";
|
|
99
|
+
|
|
100
|
+
return html`
|
|
101
|
+
<th
|
|
102
|
+
class="ds-table__head"
|
|
103
|
+
role="columnheader"
|
|
104
|
+
scope="col"
|
|
105
|
+
data-align=${this.align !== "left" ? this.align : nothing}
|
|
106
|
+
?data-sortable=${this.sortable}
|
|
107
|
+
data-sort-direction=${this.sortable ? this.sortDirection : nothing}
|
|
108
|
+
aria-sort=${this.sortable ? this.getAriaSort() : nothing}
|
|
109
|
+
tabindex=${this.sortable ? 0 : nothing}
|
|
110
|
+
style=${style || nothing}
|
|
111
|
+
@click=${this.handleClick}
|
|
112
|
+
@keydown=${this.handleKeyDown}
|
|
113
|
+
>
|
|
114
|
+
<slot></slot>
|
|
115
|
+
${this.sortable ? html`<span class="ds-table__sort-icon">${sortIcon}</span>` : nothing}
|
|
116
|
+
</th>
|
|
117
|
+
`;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// Register the component
|
|
122
|
+
define("ds-table-head", DsTableHead);
|
|
123
|
+
|
|
124
|
+
// TypeScript declaration for HTML
|
|
125
|
+
declare global {
|
|
126
|
+
interface HTMLElementTagNameMap {
|
|
127
|
+
"ds-table-head": DsTableHead;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { type TemplateResult, html } from "lit";
|
|
2
|
+
import { DSElement } from "../../base/ds-element.js";
|
|
3
|
+
import { define } from "../../registry/define.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Table header component (thead).
|
|
7
|
+
*
|
|
8
|
+
* @element ds-table-header
|
|
9
|
+
*
|
|
10
|
+
* @slot - TableRow elements for header
|
|
11
|
+
*/
|
|
12
|
+
export class DsTableHeader extends DSElement {
|
|
13
|
+
static override styles = [];
|
|
14
|
+
|
|
15
|
+
override render(): TemplateResult {
|
|
16
|
+
return html`
|
|
17
|
+
<thead class="ds-table__header" role="rowgroup">
|
|
18
|
+
<slot></slot>
|
|
19
|
+
</thead>
|
|
20
|
+
`;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// Register the component
|
|
25
|
+
define("ds-table-header", DsTableHeader);
|
|
26
|
+
|
|
27
|
+
// TypeScript declaration for HTML
|
|
28
|
+
declare global {
|
|
29
|
+
interface HTMLElementTagNameMap {
|
|
30
|
+
"ds-table-header": DsTableHeader;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { type TemplateResult, html, nothing } from "lit";
|
|
2
|
+
import { property } from "lit/decorators.js";
|
|
3
|
+
import { DSElement } from "../../base/ds-element.js";
|
|
4
|
+
import { define } from "../../registry/define.js";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Table row component (tr).
|
|
8
|
+
*
|
|
9
|
+
* @element ds-table-row
|
|
10
|
+
*
|
|
11
|
+
* @slot - TableHead or TableCell elements
|
|
12
|
+
*/
|
|
13
|
+
export class DsTableRow extends DSElement {
|
|
14
|
+
static override styles = [];
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Row ID for selection tracking.
|
|
18
|
+
*/
|
|
19
|
+
@property({ type: String, attribute: "row-id" })
|
|
20
|
+
rowId = "";
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Whether this row is selected.
|
|
24
|
+
*/
|
|
25
|
+
@property({ type: Boolean, reflect: true })
|
|
26
|
+
selected = false;
|
|
27
|
+
|
|
28
|
+
override render(): TemplateResult {
|
|
29
|
+
return html`
|
|
30
|
+
<tr
|
|
31
|
+
class="ds-table__row"
|
|
32
|
+
role="row"
|
|
33
|
+
?data-selected=${this.selected}
|
|
34
|
+
aria-selected=${this.selected ? "true" : nothing}
|
|
35
|
+
>
|
|
36
|
+
<slot></slot>
|
|
37
|
+
</tr>
|
|
38
|
+
`;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Register the component
|
|
43
|
+
define("ds-table-row", DsTableRow);
|
|
44
|
+
|
|
45
|
+
// TypeScript declaration for HTML
|
|
46
|
+
declare global {
|
|
47
|
+
interface HTMLElementTagNameMap {
|
|
48
|
+
"ds-table-row": DsTableRow;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { type TemplateResult, html, nothing } from "lit";
|
|
2
|
+
import { property } from "lit/decorators.js";
|
|
3
|
+
import { classMap } from "lit/directives/class-map.js";
|
|
4
|
+
import { DSElement } from "../../base/ds-element.js";
|
|
5
|
+
import { define } from "../../registry/define.js";
|
|
6
|
+
|
|
7
|
+
export type TableSize = "compact" | "default" | "spacious";
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Table root component.
|
|
11
|
+
*
|
|
12
|
+
* @element ds-table
|
|
13
|
+
*
|
|
14
|
+
* @slot - Table content (thead, tbody, tfoot)
|
|
15
|
+
*
|
|
16
|
+
* @cssprop --ds-table-border - Border style
|
|
17
|
+
* @cssprop --ds-table-radius - Border radius
|
|
18
|
+
* @cssprop --ds-table-bg - Background color
|
|
19
|
+
*/
|
|
20
|
+
export class DsTable extends DSElement {
|
|
21
|
+
static override styles = [];
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Size variant.
|
|
25
|
+
*/
|
|
26
|
+
@property({ type: String, reflect: true })
|
|
27
|
+
size: TableSize = "default";
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Whether to show striped rows.
|
|
31
|
+
*/
|
|
32
|
+
@property({ type: Boolean, reflect: true })
|
|
33
|
+
striped = false;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Whether to remove borders.
|
|
37
|
+
*/
|
|
38
|
+
@property({ type: Boolean, reflect: true })
|
|
39
|
+
borderless = false;
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Whether to use fixed layout.
|
|
43
|
+
*/
|
|
44
|
+
@property({ type: Boolean, reflect: true })
|
|
45
|
+
fixed = false;
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Whether header is sticky.
|
|
49
|
+
*/
|
|
50
|
+
@property({ type: Boolean, attribute: "sticky-header", reflect: true })
|
|
51
|
+
stickyHeader = false;
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Accessible caption for screen readers.
|
|
55
|
+
*/
|
|
56
|
+
@property({ type: String })
|
|
57
|
+
caption = "";
|
|
58
|
+
|
|
59
|
+
override render(): TemplateResult {
|
|
60
|
+
const classes = {
|
|
61
|
+
"ds-table": true,
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
return html`
|
|
65
|
+
<table
|
|
66
|
+
class=${classMap(classes)}
|
|
67
|
+
role="grid"
|
|
68
|
+
data-size=${this.size !== "default" ? this.size : nothing}
|
|
69
|
+
?data-striped=${this.striped}
|
|
70
|
+
?data-borderless=${this.borderless}
|
|
71
|
+
?data-fixed=${this.fixed}
|
|
72
|
+
?data-sticky-header=${this.stickyHeader}
|
|
73
|
+
>
|
|
74
|
+
${
|
|
75
|
+
this.caption
|
|
76
|
+
? html`<caption class="ds-table__caption">${this.caption}</caption>`
|
|
77
|
+
: nothing
|
|
78
|
+
}
|
|
79
|
+
<slot></slot>
|
|
80
|
+
</table>
|
|
81
|
+
`;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Register the component
|
|
86
|
+
define("ds-table", DsTable);
|
|
87
|
+
|
|
88
|
+
// TypeScript declaration for HTML
|
|
89
|
+
declare global {
|
|
90
|
+
interface HTMLElementTagNameMap {
|
|
91
|
+
"ds-table": DsTable;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tabs compound component exports.
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* ```tsx
|
|
6
|
+
* import { Tabs } from "@/components/ui";
|
|
7
|
+
*
|
|
8
|
+
* <Tabs.Root defaultValue="tab1">
|
|
9
|
+
* <Tabs.List>
|
|
10
|
+
* <Tabs.Trigger value="tab1">Tab 1</Tabs.Trigger>
|
|
11
|
+
* <Tabs.Trigger value="tab2">Tab 2</Tabs.Trigger>
|
|
12
|
+
* </Tabs.List>
|
|
13
|
+
* <Tabs.Content value="tab1">Content 1</Tabs.Content>
|
|
14
|
+
* <Tabs.Content value="tab2">Content 2</Tabs.Content>
|
|
15
|
+
* </Tabs.Root>
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import {
|
|
20
|
+
type HTMLAttributes,
|
|
21
|
+
type ReactNode,
|
|
22
|
+
createElement,
|
|
23
|
+
forwardRef,
|
|
24
|
+
useCallback,
|
|
25
|
+
useEffect,
|
|
26
|
+
useRef,
|
|
27
|
+
useState,
|
|
28
|
+
} from "react";
|
|
29
|
+
|
|
30
|
+
// ============================================================================
|
|
31
|
+
// Types
|
|
32
|
+
// ============================================================================
|
|
33
|
+
|
|
34
|
+
export type TabsOrientation = "horizontal" | "vertical";
|
|
35
|
+
export type TabsActivationMode = "automatic" | "manual";
|
|
36
|
+
|
|
37
|
+
export interface TabsRootProps extends HTMLAttributes<HTMLElement> {
|
|
38
|
+
/** Content */
|
|
39
|
+
children?: ReactNode;
|
|
40
|
+
/** Controlled value */
|
|
41
|
+
value?: string;
|
|
42
|
+
/** Default value (uncontrolled) */
|
|
43
|
+
defaultValue?: string;
|
|
44
|
+
/** Called when value changes */
|
|
45
|
+
onValueChange?: (value: string) => void;
|
|
46
|
+
/** Keyboard navigation orientation */
|
|
47
|
+
orientation?: TabsOrientation;
|
|
48
|
+
/** Activation mode */
|
|
49
|
+
activationMode?: TabsActivationMode;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export interface TabsListProps extends HTMLAttributes<HTMLElement> {
|
|
53
|
+
/** Content */
|
|
54
|
+
children?: ReactNode;
|
|
55
|
+
/** Loop focus at ends */
|
|
56
|
+
loop?: boolean;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export interface TabsTriggerProps extends HTMLAttributes<HTMLElement> {
|
|
60
|
+
/** Content */
|
|
61
|
+
children?: ReactNode;
|
|
62
|
+
/** Unique value identifying this tab */
|
|
63
|
+
value: string;
|
|
64
|
+
/** Disable this tab */
|
|
65
|
+
disabled?: boolean;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export interface TabsContentProps extends HTMLAttributes<HTMLElement> {
|
|
69
|
+
/** Content */
|
|
70
|
+
children?: ReactNode;
|
|
71
|
+
/** Value of associated tab */
|
|
72
|
+
value: string;
|
|
73
|
+
/** Keep mounted when inactive */
|
|
74
|
+
forceMount?: boolean;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// ============================================================================
|
|
78
|
+
// Components
|
|
79
|
+
// ============================================================================
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Tabs root component.
|
|
83
|
+
*/
|
|
84
|
+
const TabsRoot = forwardRef<HTMLElement, TabsRootProps>(function TabsRoot(
|
|
85
|
+
{
|
|
86
|
+
children,
|
|
87
|
+
className,
|
|
88
|
+
value: controlledValue,
|
|
89
|
+
defaultValue,
|
|
90
|
+
onValueChange,
|
|
91
|
+
orientation = "horizontal",
|
|
92
|
+
activationMode = "automatic",
|
|
93
|
+
...props
|
|
94
|
+
},
|
|
95
|
+
ref
|
|
96
|
+
) {
|
|
97
|
+
const [internalValue, setInternalValue] = useState(defaultValue);
|
|
98
|
+
const isControlled = controlledValue !== undefined;
|
|
99
|
+
const value = isControlled ? controlledValue : internalValue;
|
|
100
|
+
const elementRef = useRef<HTMLElement>(null);
|
|
101
|
+
|
|
102
|
+
// Combine refs
|
|
103
|
+
const combinedRef = (node: HTMLElement | null) => {
|
|
104
|
+
(elementRef as React.MutableRefObject<HTMLElement | null>).current = node;
|
|
105
|
+
if (typeof ref === "function") {
|
|
106
|
+
ref(node);
|
|
107
|
+
} else if (ref) {
|
|
108
|
+
(ref as React.MutableRefObject<HTMLElement | null>).current = node;
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
const handleChange = useCallback(
|
|
113
|
+
(event: Event) => {
|
|
114
|
+
const customEvent = event as CustomEvent<{ value: string }>;
|
|
115
|
+
const newValue = customEvent.detail.value;
|
|
116
|
+
|
|
117
|
+
if (!isControlled) {
|
|
118
|
+
setInternalValue(newValue);
|
|
119
|
+
}
|
|
120
|
+
onValueChange?.(newValue);
|
|
121
|
+
},
|
|
122
|
+
[isControlled, onValueChange]
|
|
123
|
+
);
|
|
124
|
+
|
|
125
|
+
// Attach event listeners
|
|
126
|
+
useEffect(() => {
|
|
127
|
+
const element = elementRef.current;
|
|
128
|
+
if (!element) return;
|
|
129
|
+
|
|
130
|
+
element.addEventListener("ds:change", handleChange);
|
|
131
|
+
|
|
132
|
+
return () => {
|
|
133
|
+
element.removeEventListener("ds:change", handleChange);
|
|
134
|
+
};
|
|
135
|
+
}, [handleChange]);
|
|
136
|
+
|
|
137
|
+
return createElement(
|
|
138
|
+
"ds-tabs",
|
|
139
|
+
{
|
|
140
|
+
ref: combinedRef,
|
|
141
|
+
class: className,
|
|
142
|
+
value: isControlled ? value : undefined,
|
|
143
|
+
"default-value": !isControlled ? defaultValue : undefined,
|
|
144
|
+
orientation,
|
|
145
|
+
"activation-mode": activationMode,
|
|
146
|
+
...props,
|
|
147
|
+
},
|
|
148
|
+
children
|
|
149
|
+
);
|
|
150
|
+
});
|
|
151
|
+
TabsRoot.displayName = "Tabs.Root";
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Tabs list component.
|
|
155
|
+
*/
|
|
156
|
+
const TabsList = forwardRef<HTMLElement, TabsListProps>(function TabsList(
|
|
157
|
+
{ children, className, loop = true, ...props },
|
|
158
|
+
ref
|
|
159
|
+
) {
|
|
160
|
+
return createElement(
|
|
161
|
+
"ds-tabs-list",
|
|
162
|
+
{ ref, class: className, loop: loop || undefined, ...props },
|
|
163
|
+
children
|
|
164
|
+
);
|
|
165
|
+
});
|
|
166
|
+
TabsList.displayName = "Tabs.List";
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Tabs trigger component.
|
|
170
|
+
*/
|
|
171
|
+
const TabsTrigger = forwardRef<HTMLElement, TabsTriggerProps>(function TabsTrigger(
|
|
172
|
+
{ children, className, value, disabled = false, ...props },
|
|
173
|
+
ref
|
|
174
|
+
) {
|
|
175
|
+
return createElement(
|
|
176
|
+
"ds-tabs-trigger",
|
|
177
|
+
{
|
|
178
|
+
ref,
|
|
179
|
+
class: className,
|
|
180
|
+
value,
|
|
181
|
+
disabled: disabled || undefined,
|
|
182
|
+
...props,
|
|
183
|
+
},
|
|
184
|
+
children
|
|
185
|
+
);
|
|
186
|
+
});
|
|
187
|
+
TabsTrigger.displayName = "Tabs.Trigger";
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Tabs content component.
|
|
191
|
+
*/
|
|
192
|
+
const TabsContent = forwardRef<HTMLElement, TabsContentProps>(function TabsContent(
|
|
193
|
+
{ children, className, value, forceMount = false, ...props },
|
|
194
|
+
ref
|
|
195
|
+
) {
|
|
196
|
+
return createElement(
|
|
197
|
+
"ds-tabs-content",
|
|
198
|
+
{
|
|
199
|
+
ref,
|
|
200
|
+
class: className,
|
|
201
|
+
value,
|
|
202
|
+
"force-mount": forceMount || undefined,
|
|
203
|
+
...props,
|
|
204
|
+
},
|
|
205
|
+
children
|
|
206
|
+
);
|
|
207
|
+
});
|
|
208
|
+
TabsContent.displayName = "Tabs.Content";
|
|
209
|
+
|
|
210
|
+
// ============================================================================
|
|
211
|
+
// Compound Component
|
|
212
|
+
// ============================================================================
|
|
213
|
+
|
|
214
|
+
export const Tabs = {
|
|
215
|
+
Root: TabsRoot,
|
|
216
|
+
List: TabsList,
|
|
217
|
+
Trigger: TabsTrigger,
|
|
218
|
+
Content: TabsContent,
|
|
219
|
+
};
|
|
220
|
+
|
|
221
|
+
// Also export individual components
|
|
222
|
+
export { TabsRoot, TabsList, TabsTrigger, TabsContent };
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tabs component barrel exports.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
export { DsTabs, type TabsOrientation, type TabsActivationMode } from "./tabs.js";
|
|
6
|
+
export { DsTabsList } from "./tabs-list.js";
|
|
7
|
+
export { DsTabsTrigger } from "./tabs-trigger.js";
|
|
8
|
+
export { DsTabsContent } from "./tabs-content.js";
|