@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,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Card compound component exports.
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* ```tsx
|
|
6
|
+
* import { Card } from "@/components/ui";
|
|
7
|
+
*
|
|
8
|
+
* <Card.Root>
|
|
9
|
+
* <Card.Header>
|
|
10
|
+
* <h3>Card Title</h3>
|
|
11
|
+
* </Card.Header>
|
|
12
|
+
* <Card.Content>
|
|
13
|
+
* <p>Card content goes here.</p>
|
|
14
|
+
* </Card.Content>
|
|
15
|
+
* <Card.Footer>
|
|
16
|
+
* <Button>Action</Button>
|
|
17
|
+
* </Card.Footer>
|
|
18
|
+
* </Card.Root>
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
import { type HTMLAttributes, type ReactNode, createElement, forwardRef } from "react";
|
|
23
|
+
|
|
24
|
+
// ============================================================================
|
|
25
|
+
// Types
|
|
26
|
+
// ============================================================================
|
|
27
|
+
|
|
28
|
+
export interface CardRootProps extends HTMLAttributes<HTMLElement> {
|
|
29
|
+
/** Card content */
|
|
30
|
+
children?: ReactNode;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export interface CardHeaderProps extends HTMLAttributes<HTMLElement> {
|
|
34
|
+
/** Header content */
|
|
35
|
+
children?: ReactNode;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export interface CardContentProps extends HTMLAttributes<HTMLElement> {
|
|
39
|
+
/** Content */
|
|
40
|
+
children?: ReactNode;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export interface CardFooterProps extends HTMLAttributes<HTMLElement> {
|
|
44
|
+
/** Footer content */
|
|
45
|
+
children?: ReactNode;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// ============================================================================
|
|
49
|
+
// Components
|
|
50
|
+
// ============================================================================
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Card root component - container for grouping related content.
|
|
54
|
+
*/
|
|
55
|
+
const CardRoot = forwardRef<HTMLElement, CardRootProps>(function CardRoot(
|
|
56
|
+
{ children, className, ...props },
|
|
57
|
+
ref
|
|
58
|
+
) {
|
|
59
|
+
return createElement("ds-card", { ref, class: className, ...props }, children);
|
|
60
|
+
});
|
|
61
|
+
CardRoot.displayName = "Card.Root";
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Card header component - header section for Card.
|
|
65
|
+
*/
|
|
66
|
+
const CardHeader = forwardRef<HTMLElement, CardHeaderProps>(function CardHeader(
|
|
67
|
+
{ children, className, ...props },
|
|
68
|
+
ref
|
|
69
|
+
) {
|
|
70
|
+
return createElement("ds-card-header", { ref, class: className, ...props }, children);
|
|
71
|
+
});
|
|
72
|
+
CardHeader.displayName = "Card.Header";
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Card content component - main content section for Card.
|
|
76
|
+
*/
|
|
77
|
+
const CardContent = forwardRef<HTMLElement, CardContentProps>(function CardContent(
|
|
78
|
+
{ children, className, ...props },
|
|
79
|
+
ref
|
|
80
|
+
) {
|
|
81
|
+
return createElement("ds-card-content", { ref, class: className, ...props }, children);
|
|
82
|
+
});
|
|
83
|
+
CardContent.displayName = "Card.Content";
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Card footer component - footer section for Card.
|
|
87
|
+
*/
|
|
88
|
+
const CardFooter = forwardRef<HTMLElement, CardFooterProps>(function CardFooter(
|
|
89
|
+
{ children, className, ...props },
|
|
90
|
+
ref
|
|
91
|
+
) {
|
|
92
|
+
return createElement("ds-card-footer", { ref, class: className, ...props }, children);
|
|
93
|
+
});
|
|
94
|
+
CardFooter.displayName = "Card.Footer";
|
|
95
|
+
|
|
96
|
+
// ============================================================================
|
|
97
|
+
// Compound Component
|
|
98
|
+
// ============================================================================
|
|
99
|
+
|
|
100
|
+
export const Card = {
|
|
101
|
+
Root: CardRoot,
|
|
102
|
+
Header: CardHeader,
|
|
103
|
+
Content: CardContent,
|
|
104
|
+
Footer: CardFooter,
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
// Also export individual components
|
|
108
|
+
export { CardRoot, CardHeader, CardContent, CardFooter };
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Card Content component - main content section for ds-card.
|
|
3
|
+
*
|
|
4
|
+
* @element ds-card-content
|
|
5
|
+
*
|
|
6
|
+
* @slot - Default slot for main card content
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { html } from "lit";
|
|
10
|
+
import { DSElement } from "../../base/ds-element.js";
|
|
11
|
+
import { define } from "../../registry/define.js";
|
|
12
|
+
|
|
13
|
+
export class DsCardContent extends DSElement {
|
|
14
|
+
override render() {
|
|
15
|
+
return html`<slot></slot>`;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
define("ds-card-content", DsCardContent);
|
|
20
|
+
|
|
21
|
+
declare global {
|
|
22
|
+
interface HTMLElementTagNameMap {
|
|
23
|
+
"ds-card-content": DsCardContent;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Card Footer component - footer section for ds-card.
|
|
3
|
+
*
|
|
4
|
+
* @element ds-card-footer
|
|
5
|
+
*
|
|
6
|
+
* @slot - Default slot for footer content (typically actions)
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { html } from "lit";
|
|
10
|
+
import { DSElement } from "../../base/ds-element.js";
|
|
11
|
+
import { define } from "../../registry/define.js";
|
|
12
|
+
|
|
13
|
+
export class DsCardFooter extends DSElement {
|
|
14
|
+
override render() {
|
|
15
|
+
return html`<slot></slot>`;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
define("ds-card-footer", DsCardFooter);
|
|
20
|
+
|
|
21
|
+
declare global {
|
|
22
|
+
interface HTMLElementTagNameMap {
|
|
23
|
+
"ds-card-footer": DsCardFooter;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Card Header component - header section for ds-card.
|
|
3
|
+
*
|
|
4
|
+
* @element ds-card-header
|
|
5
|
+
*
|
|
6
|
+
* @slot - Default slot for header content (typically title and description)
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { html } from "lit";
|
|
10
|
+
import { DSElement } from "../../base/ds-element.js";
|
|
11
|
+
import { define } from "../../registry/define.js";
|
|
12
|
+
|
|
13
|
+
export class DsCardHeader extends DSElement {
|
|
14
|
+
override render() {
|
|
15
|
+
return html`<slot></slot>`;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
define("ds-card-header", DsCardHeader);
|
|
20
|
+
|
|
21
|
+
declare global {
|
|
22
|
+
interface HTMLElementTagNameMap {
|
|
23
|
+
"ds-card-header": DsCardHeader;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Card component - container for grouping related content.
|
|
3
|
+
*
|
|
4
|
+
* A structural component that provides visual grouping with consistent
|
|
5
|
+
* styling for headers, content areas, and footers.
|
|
6
|
+
*
|
|
7
|
+
* @element ds-card
|
|
8
|
+
*
|
|
9
|
+
* @slot - Default slot for card content (ds-card-header, ds-card-content, ds-card-footer)
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```html
|
|
13
|
+
* <ds-card>
|
|
14
|
+
* <ds-card-header>
|
|
15
|
+
* <h3>Card Title</h3>
|
|
16
|
+
* </ds-card-header>
|
|
17
|
+
* <ds-card-content>
|
|
18
|
+
* <p>Card content goes here.</p>
|
|
19
|
+
* </ds-card-content>
|
|
20
|
+
* <ds-card-footer>
|
|
21
|
+
* <button>Action</button>
|
|
22
|
+
* </ds-card-footer>
|
|
23
|
+
* </ds-card>
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
import { html } from "lit";
|
|
28
|
+
import { DSElement } from "../../base/ds-element.js";
|
|
29
|
+
import { define } from "../../registry/define.js";
|
|
30
|
+
|
|
31
|
+
export class DsCard extends DSElement {
|
|
32
|
+
override render() {
|
|
33
|
+
return html`<slot></slot>`;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
define("ds-card", DsCard);
|
|
38
|
+
|
|
39
|
+
declare global {
|
|
40
|
+
interface HTMLElementTagNameMap {
|
|
41
|
+
"ds-card": DsCard;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import type React from "react";
|
|
2
|
+
import { type HTMLAttributes, createElement, forwardRef, useEffect, useRef } from "react";
|
|
3
|
+
|
|
4
|
+
export interface CheckboxProps extends Omit<HTMLAttributes<HTMLElement>, "onChange"> {
|
|
5
|
+
/** Checkbox name */
|
|
6
|
+
name?: string;
|
|
7
|
+
/** Checkbox value */
|
|
8
|
+
value?: string;
|
|
9
|
+
/** Whether checked */
|
|
10
|
+
checked?: boolean;
|
|
11
|
+
/** Default checked state (uncontrolled) */
|
|
12
|
+
defaultChecked?: boolean;
|
|
13
|
+
/** Whether disabled */
|
|
14
|
+
disabled?: boolean;
|
|
15
|
+
/** Whether required */
|
|
16
|
+
required?: boolean;
|
|
17
|
+
/** Indeterminate state */
|
|
18
|
+
indeterminate?: boolean;
|
|
19
|
+
/** Change handler */
|
|
20
|
+
onChange?: (checked: boolean, event: Event) => void;
|
|
21
|
+
/** Checkbox label content */
|
|
22
|
+
children?: React.ReactNode;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* React wrapper for ds-checkbox Web Component.
|
|
27
|
+
* Checkbox input with tri-state support.
|
|
28
|
+
*/
|
|
29
|
+
export const Checkbox = forwardRef<HTMLElement, CheckboxProps>((props, forwardedRef) => {
|
|
30
|
+
const {
|
|
31
|
+
name,
|
|
32
|
+
value,
|
|
33
|
+
checked,
|
|
34
|
+
defaultChecked,
|
|
35
|
+
disabled = false,
|
|
36
|
+
required = false,
|
|
37
|
+
indeterminate = false,
|
|
38
|
+
onChange,
|
|
39
|
+
children,
|
|
40
|
+
className,
|
|
41
|
+
...rest
|
|
42
|
+
} = props;
|
|
43
|
+
|
|
44
|
+
const internalRef = useRef<HTMLElement>(null);
|
|
45
|
+
|
|
46
|
+
useEffect(() => {
|
|
47
|
+
if (typeof forwardedRef === "function") {
|
|
48
|
+
forwardedRef(internalRef.current);
|
|
49
|
+
} else if (forwardedRef) {
|
|
50
|
+
(forwardedRef as React.MutableRefObject<HTMLElement | null>).current = internalRef.current;
|
|
51
|
+
}
|
|
52
|
+
}, [forwardedRef]);
|
|
53
|
+
|
|
54
|
+
useEffect(() => {
|
|
55
|
+
const element = internalRef.current;
|
|
56
|
+
if (!element || !onChange) return;
|
|
57
|
+
|
|
58
|
+
const handleChange = (event: Event) => {
|
|
59
|
+
const customEvent = event as CustomEvent<{ checked: boolean }>;
|
|
60
|
+
onChange(customEvent.detail.checked, event);
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
element.addEventListener("ds:change", handleChange);
|
|
64
|
+
return () => element.removeEventListener("ds:change", handleChange);
|
|
65
|
+
}, [onChange]);
|
|
66
|
+
|
|
67
|
+
return createElement(
|
|
68
|
+
"ds-checkbox",
|
|
69
|
+
{
|
|
70
|
+
ref: internalRef,
|
|
71
|
+
name,
|
|
72
|
+
value,
|
|
73
|
+
checked: checked || undefined,
|
|
74
|
+
"default-checked": defaultChecked || undefined,
|
|
75
|
+
disabled: disabled || undefined,
|
|
76
|
+
required: required || undefined,
|
|
77
|
+
indeterminate: indeterminate || undefined,
|
|
78
|
+
class: className,
|
|
79
|
+
...rest,
|
|
80
|
+
},
|
|
81
|
+
children
|
|
82
|
+
);
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
Checkbox.displayName = "Checkbox";
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
import { html } from "lit";
|
|
2
|
+
import type { PropertyValues } from "lit";
|
|
3
|
+
import { property, state } from "lit/decorators.js";
|
|
4
|
+
import { ifDefined } from "lit/directives/if-defined.js";
|
|
5
|
+
import { DSElement } from "../../base/ds-element.js";
|
|
6
|
+
import { FormAssociatedMixin } from "../../base/form-associated.js";
|
|
7
|
+
import type { ValidationFlags } from "../../base/form-associated.js";
|
|
8
|
+
import { StandardEvents, emitEvent } from "../../events/emit.js";
|
|
9
|
+
import { define } from "../../registry/define.js";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Checkbox input with tri-state support and native form participation.
|
|
13
|
+
*
|
|
14
|
+
* Uses ElementInternals for form association - values are submitted with the form
|
|
15
|
+
* and the checkbox participates in constraint validation.
|
|
16
|
+
*
|
|
17
|
+
* @element ds-checkbox
|
|
18
|
+
* @fires ds:change - Fired on state change with { checked, indeterminate }
|
|
19
|
+
* @fires ds:invalid - Fired when customValidation is true and validation fails
|
|
20
|
+
*
|
|
21
|
+
* @slot - Checkbox label
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```html
|
|
25
|
+
* <form>
|
|
26
|
+
* <ds-checkbox name="accept" required>Accept terms and conditions</ds-checkbox>
|
|
27
|
+
* <button type="submit">Submit</button>
|
|
28
|
+
* </form>
|
|
29
|
+
*
|
|
30
|
+
* <ds-field>
|
|
31
|
+
* <ds-checkbox name="newsletter" custom-validation>Subscribe to newsletter</ds-checkbox>
|
|
32
|
+
* <ds-field-error></ds-field-error>
|
|
33
|
+
* </ds-field>
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
export class DsCheckbox extends FormAssociatedMixin(DSElement) {
|
|
37
|
+
/** Checked state */
|
|
38
|
+
@property({ type: Boolean, reflect: true })
|
|
39
|
+
checked = false;
|
|
40
|
+
|
|
41
|
+
/** Indeterminate (mixed) state */
|
|
42
|
+
@property({ type: Boolean, reflect: true })
|
|
43
|
+
indeterminate = false;
|
|
44
|
+
|
|
45
|
+
/** ARIA describedby - IDs of elements that describe this checkbox */
|
|
46
|
+
@state()
|
|
47
|
+
private ariaDescribedBy?: string;
|
|
48
|
+
|
|
49
|
+
/** Label text captured from slot */
|
|
50
|
+
@state()
|
|
51
|
+
private labelText = "";
|
|
52
|
+
|
|
53
|
+
/** Unique ID for label association */
|
|
54
|
+
@state()
|
|
55
|
+
private labelId = "";
|
|
56
|
+
|
|
57
|
+
/** Default checked state for form reset */
|
|
58
|
+
private _defaultChecked = false;
|
|
59
|
+
|
|
60
|
+
private attributeObserver: MutationObserver | null = null;
|
|
61
|
+
|
|
62
|
+
override connectedCallback(): void {
|
|
63
|
+
// Capture label text before Lit renders
|
|
64
|
+
this.labelText = this.textContent?.trim() ?? "";
|
|
65
|
+
// Generate unique ID for label
|
|
66
|
+
this.labelId = `checkbox-label-${crypto.randomUUID().slice(0, 8)}`;
|
|
67
|
+
// Store default checked state
|
|
68
|
+
this._defaultChecked = this.checked;
|
|
69
|
+
|
|
70
|
+
super.connectedCallback();
|
|
71
|
+
|
|
72
|
+
// Set default value for form association
|
|
73
|
+
if (!this.value) {
|
|
74
|
+
this.value = "on";
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Observe ARIA attribute changes on the host element
|
|
78
|
+
this.attributeObserver = new MutationObserver((mutations) => {
|
|
79
|
+
for (const mutation of mutations) {
|
|
80
|
+
if (mutation.type === "attributes") {
|
|
81
|
+
this.syncAriaAttributes();
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
this.attributeObserver.observe(this, {
|
|
87
|
+
attributes: true,
|
|
88
|
+
attributeFilter: ["aria-describedby", "aria-invalid", "aria-required", "aria-disabled"],
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
// Initial sync
|
|
92
|
+
this.syncAriaAttributes();
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
override disconnectedCallback(): void {
|
|
96
|
+
super.disconnectedCallback();
|
|
97
|
+
this.attributeObserver?.disconnect();
|
|
98
|
+
this.attributeObserver = null;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Syncs ARIA attributes from the host element to internal state.
|
|
103
|
+
*/
|
|
104
|
+
private syncAriaAttributes(): void {
|
|
105
|
+
this.ariaDescribedBy = this.getAttribute("aria-describedby") ?? undefined;
|
|
106
|
+
|
|
107
|
+
// Sync required state from aria-required
|
|
108
|
+
const ariaRequired = this.getAttribute("aria-required");
|
|
109
|
+
if (ariaRequired === "true") {
|
|
110
|
+
this.required = true;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// Sync disabled state from aria-disabled
|
|
114
|
+
const ariaDisabled = this.getAttribute("aria-disabled");
|
|
115
|
+
if (ariaDisabled === "true") {
|
|
116
|
+
this.disabled = true;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Returns the aria-checked value based on state.
|
|
122
|
+
*/
|
|
123
|
+
private getAriaChecked(): "true" | "false" | "mixed" {
|
|
124
|
+
if (this.indeterminate) return "mixed";
|
|
125
|
+
return this.checked ? "true" : "false";
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Toggles the checkbox state.
|
|
130
|
+
*/
|
|
131
|
+
private toggle(): void {
|
|
132
|
+
if (this.disabled) return;
|
|
133
|
+
|
|
134
|
+
// Clear indeterminate on any interaction
|
|
135
|
+
this.indeterminate = false;
|
|
136
|
+
this.checked = !this.checked;
|
|
137
|
+
|
|
138
|
+
emitEvent(this, StandardEvents.CHANGE, {
|
|
139
|
+
detail: {
|
|
140
|
+
checked: this.checked,
|
|
141
|
+
indeterminate: this.indeterminate,
|
|
142
|
+
},
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
private handleClick = (event: Event): void => {
|
|
147
|
+
event.preventDefault();
|
|
148
|
+
this.toggle();
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
private handleKeyDown = (event: KeyboardEvent): void => {
|
|
152
|
+
if (event.key === " ") {
|
|
153
|
+
event.preventDefault();
|
|
154
|
+
this.toggle();
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
|
|
158
|
+
// Form association implementation
|
|
159
|
+
|
|
160
|
+
protected getFormValue(): string | null {
|
|
161
|
+
return this.checked ? this.value : null;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
protected getValidationAnchor(): HTMLElement | undefined {
|
|
165
|
+
return this.querySelector(".ds-checkbox__control") as HTMLElement | undefined;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
protected getValidationFlags(): ValidationFlags {
|
|
169
|
+
if (this.required && !this.checked) {
|
|
170
|
+
return { valueMissing: true };
|
|
171
|
+
}
|
|
172
|
+
return {};
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
protected getValidationMessage(flags: ValidationFlags): string {
|
|
176
|
+
if (flags.valueMissing) {
|
|
177
|
+
return "Please check this box to proceed";
|
|
178
|
+
}
|
|
179
|
+
return "";
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
protected shouldUpdateFormValue(changedProperties: PropertyValues): boolean {
|
|
183
|
+
return changedProperties.has("checked");
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
protected shouldUpdateValidity(changedProperties: PropertyValues): boolean {
|
|
187
|
+
return changedProperties.has("checked");
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
protected onFormReset(): void {
|
|
191
|
+
this.checked = this._defaultChecked;
|
|
192
|
+
this.indeterminate = false;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
protected onFormStateRestore(
|
|
196
|
+
state: string | File | FormData | null,
|
|
197
|
+
_mode: "restore" | "autocomplete"
|
|
198
|
+
): void {
|
|
199
|
+
if (typeof state === "string") {
|
|
200
|
+
this.checked = state === this.value;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
override render() {
|
|
205
|
+
return html`
|
|
206
|
+
<div
|
|
207
|
+
class="ds-checkbox"
|
|
208
|
+
part="container"
|
|
209
|
+
@click=${this.handleClick}
|
|
210
|
+
>
|
|
211
|
+
<div
|
|
212
|
+
role="checkbox"
|
|
213
|
+
part="control"
|
|
214
|
+
class="ds-checkbox__control"
|
|
215
|
+
tabindex=${this.disabled ? -1 : 0}
|
|
216
|
+
aria-checked=${this.getAriaChecked()}
|
|
217
|
+
aria-disabled=${this.disabled ? "true" : "false"}
|
|
218
|
+
aria-required=${this.required ? "true" : "false"}
|
|
219
|
+
aria-labelledby=${this.labelId}
|
|
220
|
+
aria-describedby=${ifDefined(this.ariaDescribedBy)}
|
|
221
|
+
@keydown=${this.handleKeyDown}
|
|
222
|
+
>
|
|
223
|
+
<span class="ds-checkbox__indicator" part="indicator">
|
|
224
|
+
${
|
|
225
|
+
this.indeterminate
|
|
226
|
+
? html`<span class="ds-checkbox__indeterminate-icon">−</span>`
|
|
227
|
+
: this.checked
|
|
228
|
+
? html`<span class="ds-checkbox__check-icon">✓</span>`
|
|
229
|
+
: null
|
|
230
|
+
}
|
|
231
|
+
</span>
|
|
232
|
+
</div>
|
|
233
|
+
<span id=${this.labelId} class="ds-checkbox__label" part="label">
|
|
234
|
+
${this.labelText}
|
|
235
|
+
</span>
|
|
236
|
+
</div>
|
|
237
|
+
`;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
define("ds-checkbox", DsCheckbox);
|
|
242
|
+
|
|
243
|
+
declare global {
|
|
244
|
+
interface HTMLElementTagNameMap {
|
|
245
|
+
"ds-checkbox": DsCheckbox;
|
|
246
|
+
}
|
|
247
|
+
}
|