@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,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AppShell React Component
|
|
3
|
+
*
|
|
4
|
+
* Application structure with compound component pattern.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type React from "react";
|
|
8
|
+
import { createElement, forwardRef } from "react";
|
|
9
|
+
|
|
10
|
+
type SidebarPosition = "left" | "right" | "none";
|
|
11
|
+
|
|
12
|
+
// ============================================
|
|
13
|
+
// AppShell Root
|
|
14
|
+
// ============================================
|
|
15
|
+
|
|
16
|
+
export interface AppShellProps {
|
|
17
|
+
/** Sidebar position. */
|
|
18
|
+
sidebarPosition?: SidebarPosition;
|
|
19
|
+
/** Additional CSS class names. */
|
|
20
|
+
className?: string;
|
|
21
|
+
/** Children elements. */
|
|
22
|
+
children?: React.ReactNode;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const AppShellRoot = forwardRef<HTMLElement, AppShellProps>((props, ref) => {
|
|
26
|
+
const { sidebarPosition = "none", className, children, ...rest } = props;
|
|
27
|
+
|
|
28
|
+
return createElement(
|
|
29
|
+
"ds-app-shell",
|
|
30
|
+
{
|
|
31
|
+
ref,
|
|
32
|
+
"sidebar-position": sidebarPosition,
|
|
33
|
+
class: className,
|
|
34
|
+
...rest,
|
|
35
|
+
},
|
|
36
|
+
children
|
|
37
|
+
);
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
AppShellRoot.displayName = "AppShell";
|
|
41
|
+
|
|
42
|
+
// ============================================
|
|
43
|
+
// Header Sub-component
|
|
44
|
+
// ============================================
|
|
45
|
+
|
|
46
|
+
export interface HeaderProps {
|
|
47
|
+
/** Enable sticky positioning. */
|
|
48
|
+
sticky?: boolean;
|
|
49
|
+
/** Enable safe area insets. */
|
|
50
|
+
safeArea?: boolean;
|
|
51
|
+
/** Additional CSS class names. */
|
|
52
|
+
className?: string;
|
|
53
|
+
/** Children elements. */
|
|
54
|
+
children?: React.ReactNode;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const Header = forwardRef<HTMLElement, HeaderProps>((props, ref) => {
|
|
58
|
+
const { sticky = false, safeArea = false, className, children, ...rest } = props;
|
|
59
|
+
|
|
60
|
+
return createElement(
|
|
61
|
+
"ds-header",
|
|
62
|
+
{
|
|
63
|
+
ref,
|
|
64
|
+
slot: "header",
|
|
65
|
+
sticky: sticky || undefined,
|
|
66
|
+
"safe-area": safeArea || undefined,
|
|
67
|
+
class: className,
|
|
68
|
+
...rest,
|
|
69
|
+
},
|
|
70
|
+
children
|
|
71
|
+
);
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
Header.displayName = "AppShell.Header";
|
|
75
|
+
|
|
76
|
+
// ============================================
|
|
77
|
+
// Footer Sub-component
|
|
78
|
+
// ============================================
|
|
79
|
+
|
|
80
|
+
export interface FooterProps {
|
|
81
|
+
/** Enable sticky positioning. */
|
|
82
|
+
sticky?: boolean;
|
|
83
|
+
/** Enable safe area insets. */
|
|
84
|
+
safeArea?: boolean;
|
|
85
|
+
/** Additional CSS class names. */
|
|
86
|
+
className?: string;
|
|
87
|
+
/** Children elements. */
|
|
88
|
+
children?: React.ReactNode;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const Footer = forwardRef<HTMLElement, FooterProps>((props, ref) => {
|
|
92
|
+
const { sticky = false, safeArea = false, className, children, ...rest } = props;
|
|
93
|
+
|
|
94
|
+
return createElement(
|
|
95
|
+
"ds-footer",
|
|
96
|
+
{
|
|
97
|
+
ref,
|
|
98
|
+
slot: "footer",
|
|
99
|
+
sticky: sticky || undefined,
|
|
100
|
+
"safe-area": safeArea || undefined,
|
|
101
|
+
class: className,
|
|
102
|
+
...rest,
|
|
103
|
+
},
|
|
104
|
+
children
|
|
105
|
+
);
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
Footer.displayName = "AppShell.Footer";
|
|
109
|
+
|
|
110
|
+
// ============================================
|
|
111
|
+
// Main Sub-component
|
|
112
|
+
// ============================================
|
|
113
|
+
|
|
114
|
+
export interface MainProps {
|
|
115
|
+
/** Element ID for skip-link targeting. */
|
|
116
|
+
id?: string;
|
|
117
|
+
/** Additional CSS class names. */
|
|
118
|
+
className?: string;
|
|
119
|
+
/** Children elements. */
|
|
120
|
+
children?: React.ReactNode;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
const Main = forwardRef<HTMLElement, MainProps>((props, ref) => {
|
|
124
|
+
const { id = "main-content", className, children, ...rest } = props;
|
|
125
|
+
|
|
126
|
+
return createElement(
|
|
127
|
+
"ds-main",
|
|
128
|
+
{
|
|
129
|
+
ref,
|
|
130
|
+
id,
|
|
131
|
+
class: className,
|
|
132
|
+
...rest,
|
|
133
|
+
},
|
|
134
|
+
children
|
|
135
|
+
);
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
Main.displayName = "AppShell.Main";
|
|
139
|
+
|
|
140
|
+
// ============================================
|
|
141
|
+
// Sidebar Sub-component
|
|
142
|
+
// ============================================
|
|
143
|
+
|
|
144
|
+
export interface SidebarProps {
|
|
145
|
+
/** Additional CSS class names. */
|
|
146
|
+
className?: string;
|
|
147
|
+
/** Children elements. */
|
|
148
|
+
children?: React.ReactNode;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
const Sidebar = forwardRef<HTMLElement, SidebarProps>((props, ref) => {
|
|
152
|
+
const { className, children, ...rest } = props;
|
|
153
|
+
|
|
154
|
+
return createElement(
|
|
155
|
+
"aside",
|
|
156
|
+
{
|
|
157
|
+
ref,
|
|
158
|
+
slot: "sidebar",
|
|
159
|
+
class: `ds-sidebar ${className || ""}`.trim(),
|
|
160
|
+
...rest,
|
|
161
|
+
},
|
|
162
|
+
children
|
|
163
|
+
);
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
Sidebar.displayName = "AppShell.Sidebar";
|
|
167
|
+
|
|
168
|
+
// ============================================
|
|
169
|
+
// Compound Component Export
|
|
170
|
+
// ============================================
|
|
171
|
+
|
|
172
|
+
export const AppShell = Object.assign(AppShellRoot, {
|
|
173
|
+
Header,
|
|
174
|
+
Footer,
|
|
175
|
+
Main,
|
|
176
|
+
Sidebar,
|
|
177
|
+
});
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Box React Component
|
|
3
|
+
*
|
|
4
|
+
* Token-only styling escape hatch for padding, background, and radius.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type React from "react";
|
|
8
|
+
import { createElement, forwardRef } from "react";
|
|
9
|
+
|
|
10
|
+
type SpacingToken = "none" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl" | "3xl";
|
|
11
|
+
type SurfaceToken = "background" | "surface" | "surface-raised" | "surface-sunken" | "muted";
|
|
12
|
+
type RadiusToken = "none" | "sm" | "md" | "lg" | "xl" | "full";
|
|
13
|
+
|
|
14
|
+
export interface BoxProps {
|
|
15
|
+
/** Padding (all sides). */
|
|
16
|
+
p?: SpacingToken;
|
|
17
|
+
/** Horizontal padding. */
|
|
18
|
+
px?: SpacingToken;
|
|
19
|
+
/** Vertical padding. */
|
|
20
|
+
py?: SpacingToken;
|
|
21
|
+
/** Background color token. */
|
|
22
|
+
bg?: SurfaceToken;
|
|
23
|
+
/** Border radius token. */
|
|
24
|
+
radius?: RadiusToken;
|
|
25
|
+
/** Additional CSS class names. */
|
|
26
|
+
className?: string;
|
|
27
|
+
/** Children elements. */
|
|
28
|
+
children?: React.ReactNode;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* React wrapper for ds-box Web Component.
|
|
33
|
+
*/
|
|
34
|
+
export const Box = forwardRef<HTMLElement, BoxProps>((props, ref) => {
|
|
35
|
+
const { p, px, py, bg, radius, className, children, ...rest } = props;
|
|
36
|
+
|
|
37
|
+
return createElement(
|
|
38
|
+
"ds-box",
|
|
39
|
+
{
|
|
40
|
+
ref,
|
|
41
|
+
p,
|
|
42
|
+
px,
|
|
43
|
+
py,
|
|
44
|
+
bg,
|
|
45
|
+
radius,
|
|
46
|
+
class: className,
|
|
47
|
+
...rest,
|
|
48
|
+
},
|
|
49
|
+
children
|
|
50
|
+
);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
Box.displayName = "Box";
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Center React Component
|
|
3
|
+
*
|
|
4
|
+
* Centers content horizontally/vertically with optional max-width.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type React from "react";
|
|
8
|
+
import { createElement, forwardRef } from "react";
|
|
9
|
+
|
|
10
|
+
type ContainerSizeToken = "sm" | "md" | "lg" | "xl" | "2xl" | "full";
|
|
11
|
+
|
|
12
|
+
export interface CenterProps {
|
|
13
|
+
/** Maximum width constraint. */
|
|
14
|
+
maxWidth?: ContainerSizeToken;
|
|
15
|
+
/** Enable vertical centering. */
|
|
16
|
+
vertical?: boolean;
|
|
17
|
+
/** Additional CSS class names. */
|
|
18
|
+
className?: string;
|
|
19
|
+
/** Children elements. */
|
|
20
|
+
children?: React.ReactNode;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* React wrapper for ds-center Web Component.
|
|
25
|
+
*/
|
|
26
|
+
export const Center = forwardRef<HTMLElement, CenterProps>((props, ref) => {
|
|
27
|
+
const { maxWidth, vertical = false, className, children, ...rest } = props;
|
|
28
|
+
|
|
29
|
+
return createElement(
|
|
30
|
+
"ds-center",
|
|
31
|
+
{
|
|
32
|
+
ref,
|
|
33
|
+
"max-width": maxWidth,
|
|
34
|
+
vertical: vertical || undefined,
|
|
35
|
+
class: className,
|
|
36
|
+
...rest,
|
|
37
|
+
},
|
|
38
|
+
children
|
|
39
|
+
);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
Center.displayName = "Center";
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Container React Component
|
|
3
|
+
*
|
|
4
|
+
* Constrains content width with responsive max-widths and padding.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type React from "react";
|
|
8
|
+
import { createElement, forwardRef } from "react";
|
|
9
|
+
|
|
10
|
+
type ContainerSizeToken = "sm" | "md" | "lg" | "xl" | "2xl" | "full";
|
|
11
|
+
type SpacingToken = "none" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl" | "3xl";
|
|
12
|
+
|
|
13
|
+
export interface ContainerProps {
|
|
14
|
+
/** Maximum width constraint. */
|
|
15
|
+
size?: ContainerSizeToken;
|
|
16
|
+
/** Horizontal padding. */
|
|
17
|
+
padding?: SpacingToken;
|
|
18
|
+
/** Additional CSS class names. */
|
|
19
|
+
className?: string;
|
|
20
|
+
/** Children elements. */
|
|
21
|
+
children?: React.ReactNode;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* React wrapper for ds-container Web Component.
|
|
26
|
+
*/
|
|
27
|
+
export const Container = forwardRef<HTMLElement, ContainerProps>((props, ref) => {
|
|
28
|
+
const { size = "lg", padding = "md", className, children, ...rest } = props;
|
|
29
|
+
|
|
30
|
+
return createElement(
|
|
31
|
+
"ds-container",
|
|
32
|
+
{
|
|
33
|
+
ref,
|
|
34
|
+
size,
|
|
35
|
+
padding,
|
|
36
|
+
class: className,
|
|
37
|
+
...rest,
|
|
38
|
+
},
|
|
39
|
+
children
|
|
40
|
+
);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
Container.displayName = "Container";
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Flow React Component
|
|
3
|
+
*
|
|
4
|
+
* Primary 1D layout primitive with responsive direction switching.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type React from "react";
|
|
8
|
+
import { createElement, forwardRef, useMemo } from "react";
|
|
9
|
+
import { type ResponsiveValue, parseResponsiveValue } from "../../hooks/use-responsive-classes.js";
|
|
10
|
+
|
|
11
|
+
type FlexDirection = "row" | "column" | "row-reverse" | "column-reverse";
|
|
12
|
+
type FlexAlign = "start" | "center" | "end" | "stretch" | "baseline";
|
|
13
|
+
type FlexJustify = "start" | "center" | "end" | "between" | "around" | "evenly";
|
|
14
|
+
type FlexWrap = "nowrap" | "wrap" | "wrap-reverse";
|
|
15
|
+
type SpacingToken = "none" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl" | "3xl";
|
|
16
|
+
|
|
17
|
+
export interface FlowProps {
|
|
18
|
+
/** Flex direction. Supports responsive object syntax. */
|
|
19
|
+
direction?: ResponsiveValue<FlexDirection>;
|
|
20
|
+
/** Gap between children. Supports responsive object syntax. */
|
|
21
|
+
gap?: ResponsiveValue<SpacingToken>;
|
|
22
|
+
/** Cross-axis alignment. */
|
|
23
|
+
align?: FlexAlign;
|
|
24
|
+
/** Main-axis alignment. */
|
|
25
|
+
justify?: FlexJustify;
|
|
26
|
+
/** Flex wrap behavior. */
|
|
27
|
+
wrap?: FlexWrap;
|
|
28
|
+
/** Use inline-flex instead of flex. */
|
|
29
|
+
inline?: boolean;
|
|
30
|
+
/** Additional CSS class names. */
|
|
31
|
+
className?: string;
|
|
32
|
+
/** Children elements. */
|
|
33
|
+
children?: React.ReactNode;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* React wrapper for ds-flow Web Component.
|
|
38
|
+
*/
|
|
39
|
+
export const Flow = forwardRef<HTMLElement, FlowProps>((props, ref) => {
|
|
40
|
+
const {
|
|
41
|
+
direction = "row",
|
|
42
|
+
gap = "none",
|
|
43
|
+
align = "stretch",
|
|
44
|
+
justify = "start",
|
|
45
|
+
wrap = "nowrap",
|
|
46
|
+
inline = false,
|
|
47
|
+
className,
|
|
48
|
+
children,
|
|
49
|
+
...rest
|
|
50
|
+
} = props;
|
|
51
|
+
|
|
52
|
+
// Parse responsive values
|
|
53
|
+
const directionResult = useMemo(
|
|
54
|
+
() => parseResponsiveValue("flow", "dir", direction),
|
|
55
|
+
[direction]
|
|
56
|
+
);
|
|
57
|
+
const gapResult = useMemo(() => parseResponsiveValue("flow", "gap", gap), [gap]);
|
|
58
|
+
|
|
59
|
+
// Combine all classes
|
|
60
|
+
const allClasses = useMemo(() => {
|
|
61
|
+
const classes = [...directionResult.classes, ...gapResult.classes];
|
|
62
|
+
if (className) classes.push(className);
|
|
63
|
+
return classes.join(" ") || undefined;
|
|
64
|
+
}, [directionResult.classes, gapResult.classes, className]);
|
|
65
|
+
|
|
66
|
+
return createElement(
|
|
67
|
+
"ds-flow",
|
|
68
|
+
{
|
|
69
|
+
ref,
|
|
70
|
+
direction: directionResult.baseValue,
|
|
71
|
+
gap: gapResult.baseValue,
|
|
72
|
+
align,
|
|
73
|
+
justify,
|
|
74
|
+
wrap,
|
|
75
|
+
inline: inline || undefined,
|
|
76
|
+
class: allClasses,
|
|
77
|
+
...rest,
|
|
78
|
+
},
|
|
79
|
+
children
|
|
80
|
+
);
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
Flow.displayName = "Flow";
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Grid React Component
|
|
3
|
+
*
|
|
4
|
+
* 2D grid layout with responsive columns.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type React from "react";
|
|
8
|
+
import { createElement, forwardRef, useMemo } from "react";
|
|
9
|
+
import { type ResponsiveValue, parseResponsiveValue } from "../../hooks/use-responsive-classes.js";
|
|
10
|
+
|
|
11
|
+
type GridColumns = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | "auto-fit" | "auto-fill";
|
|
12
|
+
type SpacingToken = "none" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl" | "3xl";
|
|
13
|
+
|
|
14
|
+
export interface GridProps {
|
|
15
|
+
/** Number of columns. Supports responsive object syntax. */
|
|
16
|
+
columns?: ResponsiveValue<GridColumns>;
|
|
17
|
+
/** Gap between grid items. Supports responsive object syntax. */
|
|
18
|
+
gap?: ResponsiveValue<SpacingToken>;
|
|
19
|
+
/** Row gap override. */
|
|
20
|
+
rowGap?: SpacingToken;
|
|
21
|
+
/** Column gap override. */
|
|
22
|
+
columnGap?: SpacingToken;
|
|
23
|
+
/** Additional CSS class names. */
|
|
24
|
+
className?: string;
|
|
25
|
+
/** Children elements. */
|
|
26
|
+
children?: React.ReactNode;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* React wrapper for ds-grid Web Component.
|
|
31
|
+
*/
|
|
32
|
+
export const Grid = forwardRef<HTMLElement, GridProps>((props, ref) => {
|
|
33
|
+
const { columns = 1, gap = "md", rowGap, columnGap, className, children, ...rest } = props;
|
|
34
|
+
|
|
35
|
+
// Parse responsive values - convert numbers to strings
|
|
36
|
+
const columnsValue = useMemo(() => {
|
|
37
|
+
if (typeof columns === "number") {
|
|
38
|
+
return String(columns);
|
|
39
|
+
}
|
|
40
|
+
if (typeof columns === "object") {
|
|
41
|
+
const converted: Record<string, string> = {};
|
|
42
|
+
for (const [key, val] of Object.entries(columns)) {
|
|
43
|
+
converted[key] = String(val);
|
|
44
|
+
}
|
|
45
|
+
return converted;
|
|
46
|
+
}
|
|
47
|
+
return columns;
|
|
48
|
+
}, [columns]);
|
|
49
|
+
|
|
50
|
+
const columnsResult = useMemo(
|
|
51
|
+
() => parseResponsiveValue("grid", "cols", columnsValue as ResponsiveValue<string>),
|
|
52
|
+
[columnsValue]
|
|
53
|
+
);
|
|
54
|
+
|
|
55
|
+
const gapResult = useMemo(() => parseResponsiveValue("grid", "gap", gap), [gap]);
|
|
56
|
+
|
|
57
|
+
// Combine all classes
|
|
58
|
+
const allClasses = useMemo(() => {
|
|
59
|
+
const classes = [...columnsResult.classes, ...gapResult.classes];
|
|
60
|
+
if (className) classes.push(className);
|
|
61
|
+
return classes.join(" ") || undefined;
|
|
62
|
+
}, [columnsResult.classes, gapResult.classes, className]);
|
|
63
|
+
|
|
64
|
+
return createElement(
|
|
65
|
+
"ds-grid",
|
|
66
|
+
{
|
|
67
|
+
ref,
|
|
68
|
+
columns: columnsResult.baseValue,
|
|
69
|
+
gap: gapResult.baseValue,
|
|
70
|
+
"row-gap": rowGap,
|
|
71
|
+
"column-gap": columnGap,
|
|
72
|
+
class: allClasses,
|
|
73
|
+
...rest,
|
|
74
|
+
},
|
|
75
|
+
children
|
|
76
|
+
);
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
Grid.displayName = "Grid";
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Layout Components Index
|
|
3
|
+
*
|
|
4
|
+
* Exports all layout primitive React components.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
// Core Layout
|
|
8
|
+
export { Flow, type FlowProps } from "./flow.js";
|
|
9
|
+
export { Container, type ContainerProps } from "./container.js";
|
|
10
|
+
export { Grid, type GridProps } from "./grid.js";
|
|
11
|
+
export { Box, type BoxProps } from "./box.js";
|
|
12
|
+
|
|
13
|
+
// Page Composition
|
|
14
|
+
export { Page, type PageProps } from "./page.js";
|
|
15
|
+
export { Section, type SectionProps } from "./section.js";
|
|
16
|
+
export {
|
|
17
|
+
AppShell,
|
|
18
|
+
type AppShellProps,
|
|
19
|
+
type HeaderProps,
|
|
20
|
+
type FooterProps,
|
|
21
|
+
type MainProps,
|
|
22
|
+
type SidebarProps,
|
|
23
|
+
} from "./app-shell.js";
|
|
24
|
+
|
|
25
|
+
// Helpers
|
|
26
|
+
export { Spacer, type SpacerProps } from "./spacer.js";
|
|
27
|
+
export { Center, type CenterProps } from "./center.js";
|
|
28
|
+
export { Split, type SplitProps } from "./split.js";
|
|
29
|
+
export { Wrap, type WrapProps } from "./wrap.js";
|
|
30
|
+
|
|
31
|
+
// Aliases
|
|
32
|
+
export { Stack, type StackProps } from "./stack.js";
|
|
33
|
+
export { Inline, type InlineProps } from "./inline.js";
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { forwardRef } from "react";
|
|
2
|
+
import { Flow, type FlowProps } from "./flow.js";
|
|
3
|
+
|
|
4
|
+
export interface InlineProps extends Omit<FlowProps, "direction"> {
|
|
5
|
+
/** Gap between children. Supports responsive object syntax. */
|
|
6
|
+
gap?: FlowProps["gap"];
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Inline is a Flow with direction="row".
|
|
11
|
+
*/
|
|
12
|
+
export const Inline = forwardRef<HTMLElement, InlineProps>((props, ref) => {
|
|
13
|
+
return <Flow ref={ref} direction="row" {...props} />;
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
Inline.displayName = "Inline";
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Page React Component
|
|
3
|
+
*
|
|
4
|
+
* Page wrapper with min-height and background.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type React from "react";
|
|
8
|
+
import { createElement, forwardRef } from "react";
|
|
9
|
+
|
|
10
|
+
type SurfaceToken = "background" | "surface" | "surface-raised" | "surface-sunken" | "muted";
|
|
11
|
+
type MinHeightValue = "viewport" | "full";
|
|
12
|
+
|
|
13
|
+
export interface PageProps {
|
|
14
|
+
/** Background color token. */
|
|
15
|
+
bg?: SurfaceToken;
|
|
16
|
+
/** Minimum height. */
|
|
17
|
+
minHeight?: MinHeightValue;
|
|
18
|
+
/** Additional CSS class names. */
|
|
19
|
+
className?: string;
|
|
20
|
+
/** Children elements. */
|
|
21
|
+
children?: React.ReactNode;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* React wrapper for ds-page Web Component.
|
|
26
|
+
*/
|
|
27
|
+
export const Page = forwardRef<HTMLElement, PageProps>((props, ref) => {
|
|
28
|
+
const { bg = "background", minHeight = "viewport", className, children, ...rest } = props;
|
|
29
|
+
|
|
30
|
+
return createElement(
|
|
31
|
+
"ds-page",
|
|
32
|
+
{
|
|
33
|
+
ref,
|
|
34
|
+
bg,
|
|
35
|
+
"min-height": minHeight,
|
|
36
|
+
class: className,
|
|
37
|
+
...rest,
|
|
38
|
+
},
|
|
39
|
+
children
|
|
40
|
+
);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
Page.displayName = "Page";
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Section React Component
|
|
3
|
+
*
|
|
4
|
+
* Semantic section wrapper with consistent vertical spacing.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type React from "react";
|
|
8
|
+
import { createElement, forwardRef } from "react";
|
|
9
|
+
|
|
10
|
+
type SpacingToken = "none" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl" | "3xl";
|
|
11
|
+
|
|
12
|
+
export interface SectionProps {
|
|
13
|
+
/** Vertical padding. */
|
|
14
|
+
spacing?: SpacingToken;
|
|
15
|
+
/** Additional CSS class names. */
|
|
16
|
+
className?: string;
|
|
17
|
+
/** Children elements. */
|
|
18
|
+
children?: React.ReactNode;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* React wrapper for ds-section Web Component.
|
|
23
|
+
*/
|
|
24
|
+
export const Section = forwardRef<HTMLElement, SectionProps>((props, ref) => {
|
|
25
|
+
const { spacing = "lg", className, children, ...rest } = props;
|
|
26
|
+
|
|
27
|
+
return createElement(
|
|
28
|
+
"ds-section",
|
|
29
|
+
{
|
|
30
|
+
ref,
|
|
31
|
+
spacing,
|
|
32
|
+
class: className,
|
|
33
|
+
...rest,
|
|
34
|
+
},
|
|
35
|
+
children
|
|
36
|
+
);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
Section.displayName = "Section";
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { createElement, forwardRef } from "react";
|
|
2
|
+
|
|
3
|
+
type SpacingToken = "none" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl" | "3xl";
|
|
4
|
+
type SpacerAxis = "horizontal" | "vertical";
|
|
5
|
+
|
|
6
|
+
export interface SpacerProps {
|
|
7
|
+
/** Size of the space. */
|
|
8
|
+
size?: SpacingToken;
|
|
9
|
+
/** Axis direction. */
|
|
10
|
+
axis?: SpacerAxis;
|
|
11
|
+
/** Additional CSS class names. */
|
|
12
|
+
className?: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* React wrapper for ds-spacer Web Component.
|
|
17
|
+
*/
|
|
18
|
+
export const Spacer = forwardRef<HTMLElement, SpacerProps>((props, ref) => {
|
|
19
|
+
const { size = "md", axis = "vertical", className, ...rest } = props;
|
|
20
|
+
|
|
21
|
+
return createElement("ds-spacer", {
|
|
22
|
+
ref,
|
|
23
|
+
size,
|
|
24
|
+
axis,
|
|
25
|
+
class: className,
|
|
26
|
+
...rest,
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
Spacer.displayName = "Spacer";
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Split React Component
|
|
3
|
+
*
|
|
4
|
+
* Two-region layout with collapse breakpoint.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type React from "react";
|
|
8
|
+
import { createElement, forwardRef } from "react";
|
|
9
|
+
|
|
10
|
+
type BreakpointToken = "xs" | "sm" | "md" | "lg" | "xl" | "2xl" | "3xl";
|
|
11
|
+
type SpacingToken = "none" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl" | "3xl";
|
|
12
|
+
type SplitRatio = "equal" | "1:2" | "2:1" | "1:3" | "3:1";
|
|
13
|
+
|
|
14
|
+
export interface SplitProps {
|
|
15
|
+
/** Breakpoint at which to collapse to single column. */
|
|
16
|
+
collapseAt?: BreakpointToken;
|
|
17
|
+
/** Gap between regions. */
|
|
18
|
+
gap?: SpacingToken;
|
|
19
|
+
/** Width ratio between regions. */
|
|
20
|
+
ratio?: SplitRatio;
|
|
21
|
+
/** Additional CSS class names. */
|
|
22
|
+
className?: string;
|
|
23
|
+
/** Children elements (should be exactly 2). */
|
|
24
|
+
children?: React.ReactNode;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* React wrapper for ds-split Web Component.
|
|
29
|
+
*/
|
|
30
|
+
export const Split = forwardRef<HTMLElement, SplitProps>((props, ref) => {
|
|
31
|
+
const { collapseAt = "md", gap = "md", ratio = "equal", className, children, ...rest } = props;
|
|
32
|
+
|
|
33
|
+
return createElement(
|
|
34
|
+
"ds-split",
|
|
35
|
+
{
|
|
36
|
+
ref,
|
|
37
|
+
"collapse-at": collapseAt,
|
|
38
|
+
gap,
|
|
39
|
+
ratio,
|
|
40
|
+
class: className,
|
|
41
|
+
...rest,
|
|
42
|
+
},
|
|
43
|
+
children
|
|
44
|
+
);
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
Split.displayName = "Split";
|