@vitinnczk/onyx-ui 0.0.0-stage → 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/CHANGELOG.md +7 -0
- package/LICENSE +21 -0
- package/README.md +330 -2
- package/dist/components/Accordion/Accordion.d.ts +42 -0
- package/dist/components/Accordion/Accordion.js +105 -0
- package/dist/components/Accordion/Accordion.js.map +1 -0
- package/dist/components/Accordion/Accordion.module.js +14 -0
- package/dist/components/Accordion/Accordion.module.js.map +1 -0
- package/dist/components/Accordion/index.d.ts +2 -0
- package/dist/components/Alert/Alert.d.ts +26 -0
- package/dist/components/Alert/Alert.js +58 -0
- package/dist/components/Alert/Alert.js.map +1 -0
- package/dist/components/Alert/Alert.module.js +19 -0
- package/dist/components/Alert/Alert.module.js.map +1 -0
- package/dist/components/Alert/index.d.ts +2 -0
- package/dist/components/Avatar/Avatar.d.ts +16 -0
- package/dist/components/Avatar/Avatar.js +33 -0
- package/dist/components/Avatar/Avatar.js.map +1 -0
- package/dist/components/Avatar/Avatar.module.js +15 -0
- package/dist/components/Avatar/Avatar.module.js.map +1 -0
- package/dist/components/Avatar/index.d.ts +2 -0
- package/dist/components/Badge/Badge.d.ts +15 -0
- package/dist/components/Badge/Badge.js +17 -0
- package/dist/components/Badge/Badge.js.map +1 -0
- package/dist/components/Badge/Badge.module.js +18 -0
- package/dist/components/Badge/Badge.module.js.map +1 -0
- package/dist/components/Badge/index.d.ts +2 -0
- package/dist/components/Breadcrumb/Breadcrumb.d.ts +26 -0
- package/dist/components/Breadcrumb/Breadcrumb.js +44 -0
- package/dist/components/Breadcrumb/Breadcrumb.js.map +1 -0
- package/dist/components/Breadcrumb/Breadcrumb.module.js +11 -0
- package/dist/components/Breadcrumb/Breadcrumb.module.js.map +1 -0
- package/dist/components/Breadcrumb/index.d.ts +2 -0
- package/dist/components/Button/Button.d.ts +29 -0
- package/dist/components/Button/Button.js +40 -0
- package/dist/components/Button/Button.js.map +1 -0
- package/dist/components/Button/Button.module.js +18 -0
- package/dist/components/Button/Button.module.js.map +1 -0
- package/dist/components/Button/index.d.ts +2 -0
- package/dist/components/Card/Card.d.ts +24 -0
- package/dist/components/Card/Card.js +34 -0
- package/dist/components/Card/Card.js.map +1 -0
- package/dist/components/Card/Card.module.js +17 -0
- package/dist/components/Card/Card.module.js.map +1 -0
- package/dist/components/Card/index.d.ts +2 -0
- package/dist/components/Checkbox/Checkbox.d.ts +21 -0
- package/dist/components/Checkbox/Checkbox.js +52 -0
- package/dist/components/Checkbox/Checkbox.js.map +1 -0
- package/dist/components/Checkbox/Checkbox.module.js +9 -0
- package/dist/components/Checkbox/Checkbox.module.js.map +1 -0
- package/dist/components/Checkbox/index.d.ts +2 -0
- package/dist/components/Divider/Divider.d.ts +18 -0
- package/dist/components/Divider/Divider.js +24 -0
- package/dist/components/Divider/Divider.js.map +1 -0
- package/dist/components/Divider/Divider.module.js +12 -0
- package/dist/components/Divider/Divider.module.js.map +1 -0
- package/dist/components/Divider/index.d.ts +2 -0
- package/dist/components/Drawer/Drawer.d.ts +18 -0
- package/dist/components/Drawer/Drawer.js +27 -0
- package/dist/components/Drawer/Drawer.js.map +1 -0
- package/dist/components/Drawer/Drawer.module.js +17 -0
- package/dist/components/Drawer/Drawer.module.js.map +1 -0
- package/dist/components/Drawer/index.d.ts +2 -0
- package/dist/components/DropdownMenu/DropdownMenu.d.ts +65 -0
- package/dist/components/DropdownMenu/DropdownMenu.js +159 -0
- package/dist/components/DropdownMenu/DropdownMenu.js.map +1 -0
- package/dist/components/DropdownMenu/DropdownMenu.module.js +16 -0
- package/dist/components/DropdownMenu/DropdownMenu.module.js.map +1 -0
- package/dist/components/DropdownMenu/index.d.ts +2 -0
- package/dist/components/EmptyState/EmptyState.d.ts +20 -0
- package/dist/components/EmptyState/EmptyState.js +36 -0
- package/dist/components/EmptyState/EmptyState.js.map +1 -0
- package/dist/components/EmptyState/EmptyState.module.js +12 -0
- package/dist/components/EmptyState/EmptyState.module.js.map +1 -0
- package/dist/components/EmptyState/index.d.ts +2 -0
- package/dist/components/FormField/FormField.d.ts +24 -0
- package/dist/components/FormField/FormField.js +49 -0
- package/dist/components/FormField/FormField.js.map +1 -0
- package/dist/components/FormField/FormField.module.js +10 -0
- package/dist/components/FormField/FormField.module.js.map +1 -0
- package/dist/components/FormField/formFieldContext.d.ts +24 -0
- package/dist/components/FormField/formFieldContext.js +18 -0
- package/dist/components/FormField/formFieldContext.js.map +1 -0
- package/dist/components/FormField/index.d.ts +2 -0
- package/dist/components/Heading/Heading.d.ts +14 -0
- package/dist/components/Heading/Heading.js +32 -0
- package/dist/components/Heading/Heading.js.map +1 -0
- package/dist/components/Heading/Heading.module.js +14 -0
- package/dist/components/Heading/Heading.module.js.map +1 -0
- package/dist/components/Heading/index.d.ts +2 -0
- package/dist/components/Icon/Icon.d.ts +16 -0
- package/dist/components/Icon/Icon.js +28 -0
- package/dist/components/Icon/Icon.js.map +1 -0
- package/dist/components/Icon/Icon.module.js +13 -0
- package/dist/components/Icon/Icon.module.js.map +1 -0
- package/dist/components/Icon/icons.d.ts +17 -0
- package/dist/components/Icon/icons.js +47 -0
- package/dist/components/Icon/icons.js.map +1 -0
- package/dist/components/Icon/index.d.ts +3 -0
- package/dist/components/IconButton/IconButton.d.ts +12 -0
- package/dist/components/IconButton/IconButton.js +25 -0
- package/dist/components/IconButton/IconButton.js.map +1 -0
- package/dist/components/IconButton/IconButton.module.js +11 -0
- package/dist/components/IconButton/IconButton.module.js.map +1 -0
- package/dist/components/IconButton/index.d.ts +2 -0
- package/dist/components/Input/Input.d.ts +18 -0
- package/dist/components/Input/Input.js +47 -0
- package/dist/components/Input/Input.js.map +1 -0
- package/dist/components/Input/Input.module.js +5 -0
- package/dist/components/Input/Input.module.js.map +1 -0
- package/dist/components/Input/index.d.ts +2 -0
- package/dist/components/Label/Label.d.ts +15 -0
- package/dist/components/Label/Label.js +22 -0
- package/dist/components/Label/Label.js.map +1 -0
- package/dist/components/Label/Label.module.js +10 -0
- package/dist/components/Label/Label.module.js.map +1 -0
- package/dist/components/Label/index.d.ts +2 -0
- package/dist/components/Link/Link.d.ts +23 -0
- package/dist/components/Link/Link.js +27 -0
- package/dist/components/Link/Link.js.map +1 -0
- package/dist/components/Link/Link.module.js +11 -0
- package/dist/components/Link/Link.module.js.map +1 -0
- package/dist/components/Link/index.d.ts +2 -0
- package/dist/components/Modal/DialogSurface.d.ts +39 -0
- package/dist/components/Modal/DialogSurface.js +69 -0
- package/dist/components/Modal/DialogSurface.js.map +1 -0
- package/dist/components/Modal/DialogSurface.module.js +16 -0
- package/dist/components/Modal/DialogSurface.module.js.map +1 -0
- package/dist/components/Modal/Modal.d.ts +34 -0
- package/dist/components/Modal/Modal.js +44 -0
- package/dist/components/Modal/Modal.js.map +1 -0
- package/dist/components/Modal/Modal.module.js +13 -0
- package/dist/components/Modal/Modal.module.js.map +1 -0
- package/dist/components/Modal/index.d.ts +3 -0
- package/dist/components/Pagination/Pagination.d.ts +46 -0
- package/dist/components/Pagination/Pagination.js +71 -0
- package/dist/components/Pagination/Pagination.js.map +1 -0
- package/dist/components/Pagination/Pagination.module.js +13 -0
- package/dist/components/Pagination/Pagination.module.js.map +1 -0
- package/dist/components/Pagination/index.d.ts +2 -0
- package/dist/components/Popover/Popover.d.ts +46 -0
- package/dist/components/Popover/Popover.js +89 -0
- package/dist/components/Popover/Popover.js.map +1 -0
- package/dist/components/Popover/Popover.module.js +12 -0
- package/dist/components/Popover/Popover.module.js.map +1 -0
- package/dist/components/Popover/index.d.ts +2 -0
- package/dist/components/Portal/Portal.d.ts +10 -0
- package/dist/components/Portal/Portal.js +13 -0
- package/dist/components/Portal/Portal.js.map +1 -0
- package/dist/components/Portal/index.d.ts +2 -0
- package/dist/components/Progress/Progress.d.ts +28 -0
- package/dist/components/Progress/Progress.js +42 -0
- package/dist/components/Progress/Progress.js.map +1 -0
- package/dist/components/Progress/Progress.module.js +18 -0
- package/dist/components/Progress/Progress.module.js.map +1 -0
- package/dist/components/Progress/index.d.ts +2 -0
- package/dist/components/RadioGroup/RadioGroup.d.ts +41 -0
- package/dist/components/RadioGroup/RadioGroup.js +112 -0
- package/dist/components/RadioGroup/RadioGroup.js.map +1 -0
- package/dist/components/RadioGroup/RadioGroup.module.js +16 -0
- package/dist/components/RadioGroup/RadioGroup.module.js.map +1 -0
- package/dist/components/RadioGroup/index.d.ts +2 -0
- package/dist/components/Select/Select.d.ts +19 -0
- package/dist/components/Select/Select.js +44 -0
- package/dist/components/Select/Select.js.map +1 -0
- package/dist/components/Select/Select.module.js +10 -0
- package/dist/components/Select/Select.module.js.map +1 -0
- package/dist/components/Select/index.d.ts +2 -0
- package/dist/components/Skeleton/Skeleton.d.ts +22 -0
- package/dist/components/Skeleton/Skeleton.js +33 -0
- package/dist/components/Skeleton/Skeleton.js.map +1 -0
- package/dist/components/Skeleton/Skeleton.module.js +12 -0
- package/dist/components/Skeleton/Skeleton.module.js.map +1 -0
- package/dist/components/Skeleton/index.d.ts +2 -0
- package/dist/components/Slider/Slider.d.ts +38 -0
- package/dist/components/Slider/Slider.js +55 -0
- package/dist/components/Slider/Slider.js.map +1 -0
- package/dist/components/Slider/Slider.module.js +11 -0
- package/dist/components/Slider/Slider.module.js.map +1 -0
- package/dist/components/Slider/index.d.ts +2 -0
- package/dist/components/Spinner/Spinner.d.ts +22 -0
- package/dist/components/Spinner/Spinner.js +34 -0
- package/dist/components/Spinner/Spinner.js.map +1 -0
- package/dist/components/Spinner/Spinner.module.js +17 -0
- package/dist/components/Spinner/Spinner.module.js.map +1 -0
- package/dist/components/Spinner/index.d.ts +2 -0
- package/dist/components/Switch/Switch.d.ts +17 -0
- package/dist/components/Switch/Switch.js +48 -0
- package/dist/components/Switch/Switch.js.map +1 -0
- package/dist/components/Switch/Switch.module.js +9 -0
- package/dist/components/Switch/Switch.module.js.map +1 -0
- package/dist/components/Switch/index.d.ts +2 -0
- package/dist/components/Table/Table.d.ts +84 -0
- package/dist/components/Table/Table.js +105 -0
- package/dist/components/Table/Table.js.map +1 -0
- package/dist/components/Table/Table.module.js +23 -0
- package/dist/components/Table/Table.module.js.map +1 -0
- package/dist/components/Table/index.d.ts +2 -0
- package/dist/components/Tabs/Tabs.d.ts +41 -0
- package/dist/components/Tabs/Tabs.js +86 -0
- package/dist/components/Tabs/Tabs.js.map +1 -0
- package/dist/components/Tabs/Tabs.module.js +14 -0
- package/dist/components/Tabs/Tabs.module.js.map +1 -0
- package/dist/components/Tabs/index.d.ts +2 -0
- package/dist/components/Text/Text.d.ts +22 -0
- package/dist/components/Text/Text.js +37 -0
- package/dist/components/Text/Text.js.map +1 -0
- package/dist/components/Text/Text.module.js +30 -0
- package/dist/components/Text/Text.module.js.map +1 -0
- package/dist/components/Text/index.d.ts +2 -0
- package/dist/components/Textarea/Textarea.d.ts +17 -0
- package/dist/components/Textarea/Textarea.js +36 -0
- package/dist/components/Textarea/Textarea.js.map +1 -0
- package/dist/components/Textarea/Textarea.module.js +11 -0
- package/dist/components/Textarea/Textarea.module.js.map +1 -0
- package/dist/components/Textarea/index.d.ts +2 -0
- package/dist/components/ThemeProvider/ThemeProvider.d.ts +39 -0
- package/dist/components/ThemeProvider/ThemeProvider.js +36 -0
- package/dist/components/ThemeProvider/ThemeProvider.js.map +1 -0
- package/dist/components/ThemeProvider/index.d.ts +2 -0
- package/dist/components/ThemeProvider/themeStore.d.ts +8 -0
- package/dist/components/ThemeProvider/themeStore.js +36 -0
- package/dist/components/ThemeProvider/themeStore.js.map +1 -0
- package/dist/components/Toast/Toast.d.ts +66 -0
- package/dist/components/Toast/Toast.js +166 -0
- package/dist/components/Toast/Toast.js.map +1 -0
- package/dist/components/Toast/Toast.module.js +27 -0
- package/dist/components/Toast/Toast.module.js.map +1 -0
- package/dist/components/Toast/index.d.ts +2 -0
- package/dist/components/Tooltip/Tooltip.d.ts +40 -0
- package/dist/components/Tooltip/Tooltip.js +63 -0
- package/dist/components/Tooltip/Tooltip.js.map +1 -0
- package/dist/components/Tooltip/Tooltip.module.js +8 -0
- package/dist/components/Tooltip/Tooltip.module.js.map +1 -0
- package/dist/components/Tooltip/index.d.ts +2 -0
- package/dist/components/VisuallyHidden/VisuallyHidden.d.ts +4 -0
- package/dist/components/VisuallyHidden/VisuallyHidden.js +16 -0
- package/dist/components/VisuallyHidden/VisuallyHidden.js.map +1 -0
- package/dist/components/VisuallyHidden/VisuallyHidden.module.js +5 -0
- package/dist/components/VisuallyHidden/VisuallyHidden.module.js.map +1 -0
- package/dist/components/VisuallyHidden/index.d.ts +2 -0
- package/dist/hooks/index.d.ts +10 -0
- package/dist/hooks/useClickOutside.d.ts +10 -0
- package/dist/hooks/useClickOutside.js +21 -0
- package/dist/hooks/useClickOutside.js.map +1 -0
- package/dist/hooks/useControllableState.d.ts +10 -0
- package/dist/hooks/useControllableState.js +16 -0
- package/dist/hooks/useControllableState.js.map +1 -0
- package/dist/hooks/useEscapeKey.d.ts +9 -0
- package/dist/hooks/useEscapeKey.js +21 -0
- package/dist/hooks/useEscapeKey.js.map +1 -0
- package/dist/hooks/useFocusTrap.d.ts +19 -0
- package/dist/hooks/useFocusTrap.js +42 -0
- package/dist/hooks/useFocusTrap.js.map +1 -0
- package/dist/hooks/useLatestRef.d.ts +1 -0
- package/dist/hooks/useLatestRef.js +12 -0
- package/dist/hooks/useLatestRef.js.map +1 -0
- package/dist/hooks/useScrollLock.d.ts +10 -0
- package/dist/hooks/useScrollLock.js +19 -0
- package/dist/hooks/useScrollLock.js.map +1 -0
- package/dist/hooks/useTimeout.d.ts +5 -0
- package/dist/hooks/useTimeout.js +16 -0
- package/dist/hooks/useTimeout.js.map +1 -0
- package/dist/index.d.ts +83 -0
- package/dist/index.js +59 -0
- package/dist/styles/choice.module.js +15 -0
- package/dist/styles/choice.module.js.map +1 -0
- package/dist/styles/field.module.js +11 -0
- package/dist/styles/field.module.js.map +1 -0
- package/dist/styles.css +2 -0
- package/dist/tokens/breakpoints.d.ts +12 -0
- package/dist/tokens/breakpoints.js +11 -0
- package/dist/tokens/breakpoints.js.map +1 -0
- package/dist/tokens/colors.d.ts +82 -0
- package/dist/tokens/colors.js +92 -0
- package/dist/tokens/colors.js.map +1 -0
- package/dist/tokens/focus.d.ts +4 -0
- package/dist/tokens/focus.js +8 -0
- package/dist/tokens/focus.js.map +1 -0
- package/dist/tokens/index.d.ts +22 -0
- package/dist/tokens/index.js +37 -0
- package/dist/tokens/index.js.map +1 -0
- package/dist/tokens/motion.d.ts +21 -0
- package/dist/tokens/motion.js +16 -0
- package/dist/tokens/motion.js.map +1 -0
- package/dist/tokens/radius.d.ts +9 -0
- package/dist/tokens/radius.js +13 -0
- package/dist/tokens/radius.js.map +1 -0
- package/dist/tokens/shadows.d.ts +12 -0
- package/dist/tokens/shadows.js +12 -0
- package/dist/tokens/shadows.js.map +1 -0
- package/dist/tokens/sizes.d.ts +22 -0
- package/dist/tokens/sizes.js +23 -0
- package/dist/tokens/sizes.js.map +1 -0
- package/dist/tokens/spacing.d.ts +19 -0
- package/dist/tokens/spacing.js +19 -0
- package/dist/tokens/spacing.js.map +1 -0
- package/dist/tokens/themes.d.ts +256 -0
- package/dist/tokens/themes.js +120 -0
- package/dist/tokens/themes.js.map +1 -0
- package/dist/tokens/typography.d.ts +37 -0
- package/dist/tokens/typography.js +35 -0
- package/dist/tokens/typography.js.map +1 -0
- package/dist/tokens/z-index.d.ts +8 -0
- package/dist/tokens/z-index.js +11 -0
- package/dist/tokens/z-index.js.map +1 -0
- package/dist/utils/cn.d.ts +8 -0
- package/dist/utils/cn.js +14 -0
- package/dist/utils/cn.js.map +1 -0
- package/dist/utils/floating.d.ts +20 -0
- package/dist/utils/floating.js +31 -0
- package/dist/utils/floating.js.map +1 -0
- package/dist/utils/getElementRef.d.ts +3 -0
- package/dist/utils/getElementRef.js +8 -0
- package/dist/utils/getElementRef.js.map +1 -0
- package/dist/utils/mergeRefs.d.ts +2 -0
- package/dist/utils/mergeRefs.js +9 -0
- package/dist/utils/mergeRefs.js.map +1 -0
- package/dist/utils/polymorphic.d.ts +13 -0
- package/dist/utils/refocusIfLost.d.ts +6 -0
- package/dist/utils/refocusIfLost.js +10 -0
- package/dist/utils/refocusIfLost.js.map +1 -0
- package/package.json +106 -4
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// src/components/Table/Table.module.css
|
|
2
|
+
var e = "onyx-wrapper-Qd7Cl", t = "onyx-table-Dkosn", n = "onyx-compact-haE8n", r = "onyx-caption-9vU1I", i = "onyx-hidden-3k90-", a = "onyx-headerCell-vZciR", o = "onyx-sticky-QfxLu", s = "onyx-sortButton-V9clQ onyx-focusRing-qmcYD", c = "onyx-end-eOUuQ", l = "onyx-center-kj838", u = "onyx-sortIcon-V3-dH", d = "onyx-sortIconActive-zctsc", f = "onyx-cell-nJrDK", p = "onyx-rowHeader-BTDF0", m = "onyx-row-DD8Km", h = "onyx-striped-5BaG7", g = "onyx-empty-O1nyD", _ = {
|
|
3
|
+
wrapper: e,
|
|
4
|
+
table: t,
|
|
5
|
+
compact: n,
|
|
6
|
+
caption: r,
|
|
7
|
+
hidden: i,
|
|
8
|
+
headerCell: a,
|
|
9
|
+
sticky: o,
|
|
10
|
+
sortButton: s,
|
|
11
|
+
end: c,
|
|
12
|
+
center: l,
|
|
13
|
+
sortIcon: u,
|
|
14
|
+
sortIconActive: d,
|
|
15
|
+
cell: f,
|
|
16
|
+
rowHeader: p,
|
|
17
|
+
row: m,
|
|
18
|
+
striped: h,
|
|
19
|
+
empty: g
|
|
20
|
+
};
|
|
21
|
+
export { r as caption, f as cell, l as center, n as compact, _ as default, g as empty, c as end, a as headerCell, i as hidden, m as row, p as rowHeader, s as sortButton, u as sortIcon, d as sortIconActive, o as sticky, h as striped, t as table, e as wrapper };
|
|
22
|
+
|
|
23
|
+
//# sourceMappingURL=Table.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Table.module.js","names":["wrapper","table","compact","caption","hidden","headerCell","sticky","sortButton","end","center","sortIcon","sortIconActive","cell","rowHeader","row","striped","empty","Table_module_default"],"sources":["../../../src/components/Table/Table.module.css"],"sourcesContent":[".wrapper {\n max-width: 100%;\n overflow: auto;\n background-color: var(--color-surface);\n border: var(--border-width-thin) solid var(--color-border);\n border-radius: var(--radius-lg);\n}\n\n.wrapper:focus-visible {\n outline: var(--focus-ring-width) solid var(--color-focus);\n outline-offset: var(--focus-ring-offset);\n}\n\n.table {\n --table-cell-y: var(--space-3);\n --table-cell-x: var(--space-4);\n\n width: 100%;\n font-size: var(--font-size-sm);\n line-height: var(--line-height-normal);\n color: var(--color-text);\n border-collapse: separate;\n border-spacing: 0;\n}\n\n.compact {\n --table-cell-y: var(--space-2);\n --table-cell-x: var(--space-3);\n}\n\n.caption {\n padding: var(--space-3) var(--table-cell-x);\n font-weight: var(--font-weight-semibold);\n text-align: start;\n caption-side: top;\n}\n\n.hidden {\n position: absolute;\n width: var(--border-width-thin);\n height: var(--border-width-thin);\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n}\n\n.headerCell {\n padding: var(--table-cell-y) var(--table-cell-x);\n font-weight: var(--font-weight-semibold);\n color: var(--color-text-muted);\n text-align: start;\n white-space: nowrap;\n background-color: var(--color-bg-subtle);\n border-bottom: var(--border-width-thin) solid var(--color-border);\n}\n\n.sticky .headerCell {\n position: sticky;\n top: 0;\n z-index: 1;\n}\n\n.headerCell:has(.sortButton) {\n padding: 0;\n}\n\n.sortButton {\n composes: focusRing from '../../styles/focus-ring.module.css';\n --focus-ring-offset: calc(var(--focus-ring-width) * -1);\n\n display: inline-flex;\n gap: var(--space-1);\n align-items: center;\n width: 100%;\n min-height: var(--size-control-md);\n padding: var(--table-cell-y) var(--table-cell-x);\n font: inherit;\n color: inherit;\n text-align: inherit;\n cursor: pointer;\n background: transparent;\n border: 0;\n transition: color var(--duration-fast) var(--easing-standard);\n}\n\n.sortButton:hover {\n color: var(--color-text);\n background-color: var(--color-state-hover);\n}\n\n.sortButton:active {\n background-color: var(--color-state-active);\n}\n\n.end .sortButton {\n flex-direction: row-reverse;\n}\n\n.center .sortButton {\n justify-content: center;\n}\n\n.sortIcon {\n flex-shrink: 0;\n font-size: var(--size-icon-sm);\n opacity: 0.6;\n}\n\n.sortIconActive {\n color: var(--color-primary-text);\n opacity: 1;\n}\n\n.cell {\n padding: var(--table-cell-y) var(--table-cell-x);\n text-align: start;\n vertical-align: middle;\n border-bottom: var(--border-width-thin) solid var(--color-border);\n}\n\n.rowHeader {\n font-weight: var(--font-weight-medium);\n}\n\n.row:last-child .cell {\n border-bottom: 0;\n}\n\n.row:hover {\n background-color: var(--color-state-hover);\n}\n\n.striped .row:nth-child(even) {\n background-color: var(--color-bg-subtle);\n}\n\n.striped .row:nth-child(even):hover {\n background-image: linear-gradient(var(--color-state-hover), var(--color-state-hover));\n}\n\n.center {\n text-align: center;\n}\n\n.end {\n text-align: end;\n font-variant-numeric: tabular-nums;\n}\n\n.empty {\n padding: var(--space-8) var(--table-cell-x);\n color: var(--color-text-muted);\n text-align: center;\n}\n\n.table[aria-busy='true'] tbody {\n opacity: 0.6;\n}\n\n@media (pointer: coarse) {\n .sortButton {\n min-height: var(--size-touch-target);\n }\n}\n"],"mappings":""}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { ButtonHTMLAttributes, HTMLAttributes } from 'react';
|
|
2
|
+
export interface TabsProps extends Omit<HTMLAttributes<HTMLDivElement>, 'defaultValue'> {
|
|
3
|
+
/** Value of the selected tab, for controlled tabs. */
|
|
4
|
+
value?: string;
|
|
5
|
+
/** Value of the tab selected at first, for uncontrolled tabs. */
|
|
6
|
+
defaultValue?: string;
|
|
7
|
+
/** Called with the value of the tab that becomes selected. */
|
|
8
|
+
onValueChange?: (value: string) => void;
|
|
9
|
+
/**
|
|
10
|
+
* `automatic` selects a tab as soon as it receives focus; `manual` waits for Enter or Space,
|
|
11
|
+
* which suits panels that are slow to render.
|
|
12
|
+
* @default 'automatic'
|
|
13
|
+
*/
|
|
14
|
+
activationMode?: 'automatic' | 'manual';
|
|
15
|
+
/**
|
|
16
|
+
* Also sets which arrow keys move between tabs.
|
|
17
|
+
* @default 'horizontal'
|
|
18
|
+
*/
|
|
19
|
+
orientation?: 'horizontal' | 'vertical';
|
|
20
|
+
/** @default 'line' */
|
|
21
|
+
variant?: 'line' | 'solid';
|
|
22
|
+
/** @default 'md' */
|
|
23
|
+
size?: 'sm' | 'md';
|
|
24
|
+
}
|
|
25
|
+
/** Switches between panels of content, one visible at a time. */
|
|
26
|
+
export declare const Tabs: import('react').ForwardRefExoticComponent<TabsProps & import('react').RefAttributes<HTMLDivElement>>;
|
|
27
|
+
export type TabListProps = HTMLAttributes<HTMLDivElement>;
|
|
28
|
+
/** Row of `Tab` buttons. Name it with `aria-label` or `aria-labelledby`. */
|
|
29
|
+
export declare const TabList: import('react').ForwardRefExoticComponent<TabListProps & import('react').RefAttributes<HTMLDivElement>>;
|
|
30
|
+
export interface TabProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'value'> {
|
|
31
|
+
/** Identifies the tab and the `TabPanel` it shows. */
|
|
32
|
+
value: string;
|
|
33
|
+
}
|
|
34
|
+
/** Button that shows the `TabPanel` with the same `value`. */
|
|
35
|
+
export declare const Tab: import('react').ForwardRefExoticComponent<TabProps & import('react').RefAttributes<HTMLButtonElement>>;
|
|
36
|
+
export interface TabPanelProps extends HTMLAttributes<HTMLDivElement> {
|
|
37
|
+
/** Value of the `Tab` that shows this panel. */
|
|
38
|
+
value: string;
|
|
39
|
+
}
|
|
40
|
+
/** Content shown while the `Tab` with the same `value` is selected. */
|
|
41
|
+
export declare const TabPanel: import('react').ForwardRefExoticComponent<TabPanelProps & import('react').RefAttributes<HTMLDivElement>>;
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useControllableState as e } from "../../hooks/useControllableState.js";
|
|
3
|
+
import { cn as t } from "../../utils/cn.js";
|
|
4
|
+
import n from "./Tabs.module.js";
|
|
5
|
+
import { createContext as r, forwardRef as i, useContext as a, useId as o } from "react";
|
|
6
|
+
import { jsx as s } from "react/jsx-runtime";
|
|
7
|
+
// src/components/Tabs/Tabs.tsx
|
|
8
|
+
var c = r(null);
|
|
9
|
+
function l(e) {
|
|
10
|
+
let t = a(c);
|
|
11
|
+
if (!t) throw Error(`${e} must be rendered inside Tabs.`);
|
|
12
|
+
return t;
|
|
13
|
+
}
|
|
14
|
+
var u = (e) => e.replace(/\s+/g, "-"), d = i(function({ value: r, defaultValue: i, onValueChange: a, activationMode: l = "automatic", orientation: u = "horizontal", variant: d = "line", size: f = "md", className: p, children: m, ...h }, g) {
|
|
15
|
+
let _ = o(), [v, y] = e({
|
|
16
|
+
value: r,
|
|
17
|
+
defaultValue: i,
|
|
18
|
+
onChange: (e) => {
|
|
19
|
+
e !== void 0 && a?.(e);
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
return /* @__PURE__ */ s("div", {
|
|
23
|
+
ref: g,
|
|
24
|
+
"data-orientation": u,
|
|
25
|
+
className: t(n.tabs, n[u], n[d], n[f], p),
|
|
26
|
+
...h,
|
|
27
|
+
children: /* @__PURE__ */ s(c.Provider, {
|
|
28
|
+
value: {
|
|
29
|
+
value: v,
|
|
30
|
+
select: y,
|
|
31
|
+
baseId: _,
|
|
32
|
+
activationMode: l,
|
|
33
|
+
orientation: u
|
|
34
|
+
},
|
|
35
|
+
children: m
|
|
36
|
+
})
|
|
37
|
+
});
|
|
38
|
+
}), f = i(function({ className: e, ...r }, i) {
|
|
39
|
+
let { orientation: a } = l("TabList");
|
|
40
|
+
return /* @__PURE__ */ s("div", {
|
|
41
|
+
ref: i,
|
|
42
|
+
role: "tablist",
|
|
43
|
+
"aria-orientation": a,
|
|
44
|
+
className: t(n.list, e),
|
|
45
|
+
...r
|
|
46
|
+
});
|
|
47
|
+
}), p = i(function({ value: e, className: r, onClick: i, onKeyDown: a, ...o }, c) {
|
|
48
|
+
let { value: d, select: f, baseId: p, orientation: m, activationMode: h } = l("Tab"), g = d === e;
|
|
49
|
+
return /* @__PURE__ */ s("button", {
|
|
50
|
+
ref: c,
|
|
51
|
+
type: "button",
|
|
52
|
+
role: "tab",
|
|
53
|
+
id: `${p}-tab-${u(e)}`,
|
|
54
|
+
"aria-selected": g,
|
|
55
|
+
"aria-controls": `${p}-panel-${u(e)}`,
|
|
56
|
+
tabIndex: g || d === void 0 ? 0 : -1,
|
|
57
|
+
"data-value": e,
|
|
58
|
+
className: t(n.tab, r),
|
|
59
|
+
onClick: (t) => {
|
|
60
|
+
i?.(t), t.defaultPrevented || f(e);
|
|
61
|
+
},
|
|
62
|
+
onKeyDown: (e) => {
|
|
63
|
+
a?.(e);
|
|
64
|
+
let t = e.currentTarget.closest("[role=\"tablist\"]");
|
|
65
|
+
if (e.defaultPrevented || !t) return;
|
|
66
|
+
let n = [...t.querySelectorAll("[role=\"tab\"]:not(:disabled)")], r = n.indexOf(e.currentTarget), i = getComputedStyle(t).direction === "rtl", [o, s] = m === "vertical" ? ["ArrowUp", "ArrowDown"] : i ? ["ArrowRight", "ArrowLeft"] : ["ArrowLeft", "ArrowRight"], c;
|
|
67
|
+
e.key === s ? c = n[(r + 1) % n.length] : e.key === o ? c = n.at(r - 1) : e.key === "Home" ? c = n[0] : e.key === "End" && (c = n.at(-1)), c && (e.preventDefault(), c.focus(), h === "automatic" && c.dataset.value && f(c.dataset.value));
|
|
68
|
+
},
|
|
69
|
+
...o
|
|
70
|
+
});
|
|
71
|
+
}), m = i(function({ value: e, tabIndex: r = 0, className: i, ...a }, o) {
|
|
72
|
+
let { value: c, baseId: d } = l("TabPanel");
|
|
73
|
+
return /* @__PURE__ */ s("div", {
|
|
74
|
+
ref: o,
|
|
75
|
+
role: "tabpanel",
|
|
76
|
+
id: `${d}-panel-${u(e)}`,
|
|
77
|
+
"aria-labelledby": `${d}-tab-${u(e)}`,
|
|
78
|
+
tabIndex: r,
|
|
79
|
+
hidden: c !== e,
|
|
80
|
+
className: t(n.panel, i),
|
|
81
|
+
...a
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
export { p as Tab, f as TabList, m as TabPanel, d as Tabs };
|
|
85
|
+
|
|
86
|
+
//# sourceMappingURL=Tabs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tabs.js","names":["styles","Tabs_module_default","TabsContext","createContext","useTabsContext","context","useContext","component","toId","value","Tabs","forwardRef","props","baseId","useId","selected","setSelected","useControllableState","next","onValueChange","orientation","cn","variant","size","className","TabList","Tab","selectedValue","onClick","event","select","list","tabs","index","rtl","previous","target","activationMode","TabPanel"],"sources":["../../../src/components/Tabs/Tabs.tsx"],"sourcesContent":["import {\n createContext,\n forwardRef,\n useContext,\n useId,\n type ButtonHTMLAttributes,\n type HTMLAttributes,\n type KeyboardEvent,\n} from 'react';\nimport { useControllableState } from '@/hooks/useControllableState';\nimport { cn } from '@/utils/cn';\nimport styles from './Tabs.module.css';\n\ninterface TabsContextValue {\n value: string | undefined;\n select: (value: string) => void;\n baseId: string;\n activationMode: 'automatic' | 'manual';\n orientation: 'horizontal' | 'vertical';\n}\n\nconst TabsContext = createContext<TabsContextValue | null>(null);\n\nfunction useTabsContext(component: string) {\n const context = useContext(TabsContext);\n if (!context) throw new Error(`${component} must be rendered inside Tabs.`);\n return context;\n}\n\nconst toId = (value: string) => value.replace(/\\s+/g, '-');\n\nexport interface TabsProps extends Omit<HTMLAttributes<HTMLDivElement>, 'defaultValue'> {\n /** Value of the selected tab, for controlled tabs. */\n value?: string;\n /** Value of the tab selected at first, for uncontrolled tabs. */\n defaultValue?: string;\n /** Called with the value of the tab that becomes selected. */\n onValueChange?: (value: string) => void;\n /**\n * `automatic` selects a tab as soon as it receives focus; `manual` waits for Enter or Space,\n * which suits panels that are slow to render.\n * @default 'automatic'\n */\n activationMode?: 'automatic' | 'manual';\n /**\n * Also sets which arrow keys move between tabs.\n * @default 'horizontal'\n */\n orientation?: 'horizontal' | 'vertical';\n /** @default 'line' */\n variant?: 'line' | 'solid';\n /** @default 'md' */\n size?: 'sm' | 'md';\n}\n\n/** Switches between panels of content, one visible at a time. */\nexport const Tabs = forwardRef<HTMLDivElement, TabsProps>(function Tabs(\n {\n value,\n defaultValue,\n onValueChange,\n activationMode = 'automatic',\n orientation = 'horizontal',\n variant = 'line',\n size = 'md',\n className,\n children,\n ...props\n },\n ref,\n) {\n const baseId = useId();\n const [selected, setSelected] = useControllableState<string | undefined>({\n value,\n defaultValue,\n onChange: (next) => {\n if (next !== undefined) onValueChange?.(next);\n },\n });\n\n return (\n <div\n ref={ref}\n data-orientation={orientation}\n className={cn(styles.tabs, styles[orientation], styles[variant], styles[size], className)}\n {...props}\n >\n <TabsContext.Provider\n value={{ value: selected, select: setSelected, baseId, activationMode, orientation }}\n >\n {children}\n </TabsContext.Provider>\n </div>\n );\n});\n\nexport type TabListProps = HTMLAttributes<HTMLDivElement>;\n\n/** Row of `Tab` buttons. Name it with `aria-label` or `aria-labelledby`. */\nexport const TabList = forwardRef<HTMLDivElement, TabListProps>(function TabList(\n { className, ...props },\n ref,\n) {\n const { orientation } = useTabsContext('TabList');\n\n return (\n <div\n ref={ref}\n role=\"tablist\"\n aria-orientation={orientation}\n className={cn(styles.list, className)}\n {...props}\n />\n );\n});\n\nexport interface TabProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'value'> {\n /** Identifies the tab and the `TabPanel` it shows. */\n value: string;\n}\n\n/** Button that shows the `TabPanel` with the same `value`. */\nexport const Tab = forwardRef<HTMLButtonElement, TabProps>(function Tab(\n { value, className, onClick, onKeyDown, ...props },\n ref,\n) {\n const {\n value: selectedValue,\n select,\n baseId,\n orientation,\n activationMode,\n } = useTabsContext('Tab');\n const selected = selectedValue === value;\n\n const onTabKeyDown = (event: KeyboardEvent<HTMLButtonElement>) => {\n onKeyDown?.(event);\n const list = event.currentTarget.closest('[role=\"tablist\"]');\n if (event.defaultPrevented || !list) return;\n\n const tabs = [...list.querySelectorAll<HTMLButtonElement>('[role=\"tab\"]:not(:disabled)')];\n const index = tabs.indexOf(event.currentTarget);\n const rtl = getComputedStyle(list).direction === 'rtl';\n const [previous, next] =\n orientation === 'vertical'\n ? ['ArrowUp', 'ArrowDown']\n : rtl\n ? ['ArrowRight', 'ArrowLeft']\n : ['ArrowLeft', 'ArrowRight'];\n\n let target: HTMLButtonElement | undefined;\n if (event.key === next) target = tabs[(index + 1) % tabs.length];\n else if (event.key === previous) target = tabs.at(index - 1);\n else if (event.key === 'Home') target = tabs[0];\n else if (event.key === 'End') target = tabs.at(-1);\n if (!target) return;\n\n event.preventDefault();\n target.focus();\n if (activationMode === 'automatic' && target.dataset.value) select(target.dataset.value);\n };\n\n return (\n <button\n ref={ref}\n type=\"button\"\n role=\"tab\"\n id={`${baseId}-tab-${toId(value)}`}\n aria-selected={selected}\n aria-controls={`${baseId}-panel-${toId(value)}`}\n tabIndex={selected || selectedValue === undefined ? 0 : -1}\n data-value={value}\n className={cn(styles.tab, className)}\n onClick={(event) => {\n onClick?.(event);\n if (!event.defaultPrevented) select(value);\n }}\n onKeyDown={onTabKeyDown}\n {...props}\n />\n );\n});\n\nexport interface TabPanelProps extends HTMLAttributes<HTMLDivElement> {\n /** Value of the `Tab` that shows this panel. */\n value: string;\n}\n\n/** Content shown while the `Tab` with the same `value` is selected. */\nexport const TabPanel = forwardRef<HTMLDivElement, TabPanelProps>(function TabPanel(\n { value, tabIndex = 0, className, ...props },\n ref,\n) {\n const { value: selectedValue, baseId } = useTabsContext('TabPanel');\n\n return (\n <div\n ref={ref}\n role=\"tabpanel\"\n id={`${baseId}-panel-${toId(value)}`}\n aria-labelledby={`${baseId}-tab-${toId(value)}`}\n tabIndex={tabIndex}\n hidden={selectedValue !== value}\n className={cn(styles.panel, className)}\n {...props}\n />\n );\n});\n"],"mappings":";;;;;;;AAqBA,IAAME,IAAcC,EAAuC,IAAI;AAE/D,SAASC,EAAe,GAAmB;CACzC,IAAMC,IAAUC,EAAWJ,CAAW;CACtC,IAAI,CAACG,GAAS,MAAU,MAAM,GAAGE,EAAU,+BAA+B;CAC1E,OAAOF;AACT;AAEA,IAAMG,KAAQ,MAAkBC,EAAM,QAAQ,QAAQ,GAAG,GA2B5CC,IAAOC,EAAsC,SACxD,EACE,UACA,iBACA,kBACA,oBAAiB,aACjB,iBAAc,cACd,aAAU,QACV,UAAO,MACP,cACA,aACA,GAAGC,KAEL,GACA;CACA,IAAMC,IAASC,EAAM,GACf,CAACC,GAAUC,KAAeC,EAAyC;EACvE;EACA;EACA,WAAW,MAAS;GAClB,AAAIC,MAAS,KAAA,KAAWC,IAAgBD,CAAI;EAC9C;CACF,CAAC;CAED,OACE,kBAAC,OAAD;EACO;EACL,oBAAkBE;EAClB,WAAWC,EAAGrB,EAAO,MAAMA,EAAOoB,IAAcpB,EAAOsB,IAAUtB,EAAOuB,IAAOC,CAAS;EACxF,GAAIZ;EAEJ,UAAA,kBAACV,EAAY,UAAb;GACE,OAAO;IAAE,OAAOa;IAAU,QAAQC;IAAa;IAAQ;IAAgB;GAAY;GAElF;EACmB,CAAA;CACnB,CAAA;AAET,CAAC,GAKYS,IAAUd,EAAyC,SAC9D,EAAE,cAAW,GAAGC,KAChB,GACA;CACA,IAAM,EAAE,mBAAgBR,EAAe,SAAS;CAEhD,OACE,kBAAC,OAAD;EACO;EACL,MAAK;EACL,oBAAkBgB;EAClB,WAAWC,EAAGrB,EAAO,MAAMwB,CAAS;EACpC,GAAIZ;CACL,CAAA;AAEL,CAAC,GAQYc,IAAMf,EAAwC,SACzD,EAAE,UAAO,cAAW,YAAS,cAAW,GAAGC,KAC3C,GACA;CACA,IAAM,EACJ,OAAOe,GACP,WACA,WACA,gBACA,sBACEvB,EAAe,KAAK,GAClBW,IAAWY,MAAkBlB;CA6BnC,OACE,kBAAC,UAAD;EACO;EACL,MAAK;EACL,MAAK;EACL,IAAI,GAAGI,EAAO,OAAOL,EAAKC,CAAK;EAC/B,iBAAeM;EACf,iBAAe,GAAGF,EAAO,SAASL,EAAKC,CAAK;EAC5C,UAAUM,KAAYY,MAAkB,KAAA,IAAY,IAAI;EACxD,cAAYlB;EACZ,WAAWY,EAAGrB,EAAO,KAAKwB,CAAS;EACnC,UAAU,MAAU;GAElB,AADAI,IAAUC,CAAK,GACVA,EAAM,oBAAkBC,EAAOrB,CAAK;EAC3C;EACA,YA1CkB,MAA4C;GAChE,IAAYoB,CAAK;GACjB,IAAME,IAAOF,EAAM,cAAc,QAAQ,oBAAkB;GAC3D,IAAIA,EAAM,oBAAoB,CAACE,GAAM;GAErC,IAAMC,IAAO,CAAC,GAAGD,EAAK,iBAAoC,+BAA6B,CAAC,GAClFE,IAAQD,EAAK,QAAQH,EAAM,aAAa,GACxCK,IAAM,iBAAiBH,CAAI,CAAC,CAAC,cAAc,OAC3C,CAACI,GAAUjB,KACfE,MAAgB,aACZ,CAAC,WAAW,WAAW,IACvBc,IACE,CAAC,cAAc,WAAW,IAC1B,CAAC,aAAa,YAAY,GAE9BE;GAKJ,AAJIP,EAAM,QAAQX,IAAM,IAASc,GAAMC,IAAQ,KAAKD,EAAK,UAChDH,EAAM,QAAQM,IAAU,IAASH,EAAK,GAAGC,IAAQ,CAAC,IAClDJ,EAAM,QAAQ,SAAQ,IAASG,EAAK,KACpCH,EAAM,QAAQ,UAAO,IAASG,EAAK,GAAG,EAAE,IAC5CI,MAELP,EAAM,eAAe,GACrBO,EAAO,MAAM,GACTC,MAAmB,eAAeD,EAAO,QAAQ,SAAON,EAAOM,EAAO,QAAQ,KAAK;EACzF;EAkBI,GAAIxB;CACL,CAAA;AAEL,CAAC,GAQY0B,IAAW3B,EAA0C,SAChE,EAAE,UAAO,cAAW,GAAG,cAAW,GAAGC,KACrC,GACA;CACA,IAAM,EAAE,OAAOe,GAAe,cAAWvB,EAAe,UAAU;CAElE,OACE,kBAAC,OAAD;EACO;EACL,MAAK;EACL,IAAI,GAAGS,EAAO,SAASL,EAAKC,CAAK;EACjC,mBAAiB,GAAGI,EAAO,OAAOL,EAAKC,CAAK;EAClC;EACV,QAAQkB,MAAkBlB;EAC1B,WAAWY,EAAGrB,EAAO,OAAOwB,CAAS;EACrC,GAAIZ;CACL,CAAA;AAEL,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// src/components/Tabs/Tabs.module.css
|
|
2
|
+
var e = "onyx-tabs-QzIkz", t = "onyx-vertical-W3hzW", n = "onyx-sm-b6EPY", r = "onyx-list-qRVME", i = "onyx-tab-IdDYc onyx-focusRing-qmcYD", a = "onyx-line-TQjAo", o = "onyx-solid-OvGOc", s = "onyx-panel-08i9c", c = {
|
|
3
|
+
tabs: e,
|
|
4
|
+
vertical: t,
|
|
5
|
+
sm: n,
|
|
6
|
+
list: r,
|
|
7
|
+
tab: i,
|
|
8
|
+
line: a,
|
|
9
|
+
solid: o,
|
|
10
|
+
panel: s
|
|
11
|
+
};
|
|
12
|
+
export { c as default, a as line, r as list, s as panel, n as sm, o as solid, i as tab, e as tabs, t as vertical };
|
|
13
|
+
|
|
14
|
+
//# sourceMappingURL=Tabs.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tabs.module.js","names":["tabs","vertical","sm","list","tab","line","solid","panel","Tabs_module_default"],"sources":["../../../src/components/Tabs/Tabs.module.css"],"sourcesContent":[".tabs {\n --tabs-height: var(--size-control-md);\n\n display: flex;\n flex-direction: column;\n gap: var(--space-4);\n min-width: 0;\n}\n\n.vertical {\n flex-direction: row;\n}\n\n.sm {\n --tabs-height: var(--size-control-sm);\n}\n\n.list {\n display: flex;\n min-width: 0;\n overflow-x: auto;\n scrollbar-width: thin;\n}\n\n.vertical .list {\n flex-direction: column;\n flex-shrink: 0;\n overflow: visible;\n}\n\n.tab {\n composes: focusRing from '../../styles/focus-ring.module.css';\n --focus-ring-offset: calc(var(--focus-ring-width) * -1);\n\n position: relative;\n display: inline-flex;\n flex-shrink: 0;\n gap: var(--space-2);\n align-items: center;\n justify-content: center;\n min-height: var(--tabs-height);\n padding-inline: var(--space-4);\n font: inherit;\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-medium);\n color: var(--color-text-muted);\n white-space: nowrap;\n cursor: pointer;\n background: transparent;\n border: 0;\n border-radius: var(--radius-md);\n transition-timing-function: var(--easing-standard);\n transition-duration: var(--duration-fast);\n transition-property: color, background-color, box-shadow;\n}\n\n.tab:hover:not(:disabled) {\n color: var(--color-text);\n}\n\n.tab[aria-selected='true'] {\n color: var(--color-text);\n}\n\n.tab:disabled {\n color: var(--color-text-disabled);\n cursor: not-allowed;\n}\n\n.line .list {\n gap: var(--space-1);\n box-shadow: inset 0 calc(var(--border-width-thin) * -1) 0 var(--color-border);\n}\n\n.line .tab {\n border-radius: var(--radius-md) var(--radius-md) 0 0;\n}\n\n.line .tab:hover:not(:disabled) {\n background-color: var(--color-state-hover);\n}\n\n.line .tab[aria-selected='true'] {\n box-shadow: inset 0 calc(var(--border-width-thick) * -1) 0 var(--color-primary);\n}\n\n.line.vertical .list {\n box-shadow: inset calc(var(--border-width-thin) * -1) 0 0 var(--color-border);\n}\n\n.line.vertical .tab {\n justify-content: flex-start;\n border-radius: var(--radius-md) 0 0 var(--radius-md);\n}\n\n.line.vertical .tab[aria-selected='true'] {\n box-shadow: inset calc(var(--border-width-thick) * -1) 0 0 var(--color-primary);\n}\n\n.solid .list {\n gap: var(--space-1);\n align-self: flex-start;\n max-width: 100%;\n padding: var(--space-1);\n background-color: var(--color-bg-muted);\n border-radius: var(--radius-lg);\n}\n\n.solid .tab:hover:not(:disabled, [aria-selected='true']) {\n background-color: var(--color-state-hover);\n}\n\n.solid .tab[aria-selected='true'] {\n background-color: var(--color-surface);\n box-shadow: var(--shadow-sm);\n}\n\n.panel {\n flex: 1;\n min-width: 0;\n border-radius: var(--radius-md);\n}\n\n.panel:focus-visible {\n outline: var(--focus-ring-width) solid var(--color-focus);\n outline-offset: var(--focus-ring-offset);\n}\n\n@media (pointer: coarse) {\n .tab {\n min-height: var(--size-touch-target);\n }\n}\n"],"mappings":""}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { ElementType } from 'react';
|
|
2
|
+
import { PolymorphicComponent, PolymorphicPropsWithRef } from '../../utils/polymorphic.js';
|
|
3
|
+
export type TextSize = 'inherit' | 'xs' | 'sm' | 'md' | 'lg' | 'xl';
|
|
4
|
+
export type TextWeight = 'regular' | 'medium' | 'semibold' | 'bold';
|
|
5
|
+
export type TextTone = 'default' | 'muted' | 'inherit' | 'primary' | 'success' | 'warning' | 'danger' | 'info';
|
|
6
|
+
export interface TextOwnProps {
|
|
7
|
+
/** @default 'md' */
|
|
8
|
+
size?: TextSize;
|
|
9
|
+
/** Defaults to the weight of the surrounding text. */
|
|
10
|
+
weight?: TextWeight;
|
|
11
|
+
/** @default 'default' */
|
|
12
|
+
tone?: TextTone;
|
|
13
|
+
align?: 'start' | 'center' | 'end';
|
|
14
|
+
/**
|
|
15
|
+
* `true` cuts the text to one line with an ellipsis; a number clamps it to that many lines.
|
|
16
|
+
* @default false
|
|
17
|
+
*/
|
|
18
|
+
truncate?: boolean | number;
|
|
19
|
+
}
|
|
20
|
+
export type TextProps<As extends ElementType = 'p'> = PolymorphicPropsWithRef<As, TextOwnProps>;
|
|
21
|
+
/** Body text. Renders a paragraph by default; use `as` for inline text or other elements. */
|
|
22
|
+
export declare const Text: PolymorphicComponent<"p", TextOwnProps>;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn as e } from "../../utils/cn.js";
|
|
3
|
+
import t from "./Text.module.js";
|
|
4
|
+
import { forwardRef as n } from "react";
|
|
5
|
+
import { jsx as r } from "react/jsx-runtime";
|
|
6
|
+
// src/components/Text/Text.tsx
|
|
7
|
+
var i = {
|
|
8
|
+
inherit: t.sizeInherit,
|
|
9
|
+
xs: t.sizeXs,
|
|
10
|
+
sm: t.sizeSm,
|
|
11
|
+
md: t.sizeMd,
|
|
12
|
+
lg: t.sizeLg,
|
|
13
|
+
xl: t.sizeXl
|
|
14
|
+
}, a = {
|
|
15
|
+
default: t.toneDefault,
|
|
16
|
+
muted: t.toneMuted,
|
|
17
|
+
inherit: t.toneInherit,
|
|
18
|
+
primary: t.tonePrimary,
|
|
19
|
+
success: t.toneSuccess,
|
|
20
|
+
warning: t.toneWarning,
|
|
21
|
+
danger: t.toneDanger,
|
|
22
|
+
info: t.toneInfo
|
|
23
|
+
}, o = n(function({ as: n = "p", size: o = "md", weight: s, tone: c = "default", align: l, truncate: u = !1, className: d, style: f, ...p }, m) {
|
|
24
|
+
let h = typeof u == "number" ? u : void 0;
|
|
25
|
+
return /* @__PURE__ */ r(n, {
|
|
26
|
+
ref: m,
|
|
27
|
+
className: e(t.text, i[o], s && t[s], a[c], l && t[l], u === !0 && t.truncate, h !== void 0 && t.clamp, d),
|
|
28
|
+
style: h === void 0 ? f : {
|
|
29
|
+
"--text-lines": h,
|
|
30
|
+
...f
|
|
31
|
+
},
|
|
32
|
+
...p
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
export { o as Text };
|
|
36
|
+
|
|
37
|
+
//# sourceMappingURL=Text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Text.js","names":["styles","Text_module_default","sizeClasses","toneClasses","Text","forwardRef","Component","props","lines","truncate","cn","size","weight","tone","align","className","style"],"sources":["../../../src/components/Text/Text.tsx"],"sourcesContent":["import { forwardRef, type CSSProperties, type ElementType } from 'react';\nimport { cn } from '@/utils/cn';\nimport type {\n PolymorphicComponent,\n PolymorphicProps,\n PolymorphicPropsWithRef,\n} from '@/utils/polymorphic';\nimport styles from './Text.module.css';\n\nexport type TextSize = 'inherit' | 'xs' | 'sm' | 'md' | 'lg' | 'xl';\nexport type TextWeight = 'regular' | 'medium' | 'semibold' | 'bold';\nexport type TextTone =\n 'default' | 'muted' | 'inherit' | 'primary' | 'success' | 'warning' | 'danger' | 'info';\n\nexport interface TextOwnProps {\n /** @default 'md' */\n size?: TextSize;\n /** Defaults to the weight of the surrounding text. */\n weight?: TextWeight;\n /** @default 'default' */\n tone?: TextTone;\n align?: 'start' | 'center' | 'end';\n /**\n * `true` cuts the text to one line with an ellipsis; a number clamps it to that many lines.\n * @default false\n */\n truncate?: boolean | number;\n}\n\nconst sizeClasses: Record<TextSize, string | undefined> = {\n inherit: styles.sizeInherit,\n xs: styles.sizeXs,\n sm: styles.sizeSm,\n md: styles.sizeMd,\n lg: styles.sizeLg,\n xl: styles.sizeXl,\n};\n\nconst toneClasses: Record<TextTone, string | undefined> = {\n default: styles.toneDefault,\n muted: styles.toneMuted,\n inherit: styles.toneInherit,\n primary: styles.tonePrimary,\n success: styles.toneSuccess,\n warning: styles.toneWarning,\n danger: styles.toneDanger,\n info: styles.toneInfo,\n};\n\nexport type TextProps<As extends ElementType = 'p'> = PolymorphicPropsWithRef<As, TextOwnProps>;\n\n/** Body text. Renders a paragraph by default; use `as` for inline text or other elements. */\nexport const Text = forwardRef<HTMLParagraphElement, PolymorphicProps<'p', TextOwnProps>>(\n function Text(\n {\n as: Component = 'p',\n size = 'md',\n weight,\n tone = 'default',\n align,\n truncate = false,\n className,\n style,\n ...props\n },\n ref,\n ) {\n const lines = typeof truncate === 'number' ? truncate : undefined;\n\n return (\n <Component\n ref={ref}\n className={cn(\n styles.text,\n sizeClasses[size],\n weight && styles[weight],\n toneClasses[tone],\n align && styles[align],\n truncate === true && styles.truncate,\n lines !== undefined && styles.clamp,\n className,\n )}\n style={lines === undefined ? style : ({ '--text-lines': lines, ...style } as CSSProperties)}\n {...props}\n />\n );\n },\n) as PolymorphicComponent<'p', TextOwnProps>;\n"],"mappings":";;;;;;AA6BA,IAAME,IAAoD;CACxD,SAASF,EAAO;CAChB,IAAIA,EAAO;CACX,IAAIA,EAAO;CACX,IAAIA,EAAO;CACX,IAAIA,EAAO;CACX,IAAIA,EAAO;AACb,GAEMG,IAAoD;CACxD,SAASH,EAAO;CAChB,OAAOA,EAAO;CACd,SAASA,EAAO;CAChB,SAASA,EAAO;CAChB,SAASA,EAAO;CAChB,SAASA,EAAO;CAChB,QAAQA,EAAO;CACf,MAAMA,EAAO;AACf,GAKaI,IAAOC,EAClB,SACE,EACE,IAAIC,IAAY,KAChB,UAAO,MACP,WACA,UAAO,WACP,UACA,cAAW,IACX,cACA,UACA,GAAGC,KAEL,GACA;CACA,IAAMC,IAAQ,OAAOC,KAAa,WAAWA,IAAW,KAAA;CAExD,OACE,kBAACH,GAAD;EACO;EACL,WAAWI,EACTV,EAAO,MACPE,EAAYS,IACZC,KAAUZ,EAAOY,IACjBT,EAAYU,IACZC,KAASd,EAAOc,IAChBL,MAAa,MAAQT,EAAO,UAC5BQ,MAAU,KAAA,KAAaR,EAAO,OAC9Be,CACF;EACA,OAAOP,MAAU,KAAA,IAAYQ,IAAS;GAAE,gBAAgBR;GAAO,GAAGQ;EAAM;EACxE,GAAIT;CACL,CAAA;AAEL,CACF"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// src/components/Text/Text.module.css
|
|
2
|
+
var e = "onyx-text-78lq0", t = "onyx-sizeInherit-G4GMi", n = "onyx-sizeXs-9Ok-b", r = "onyx-sizeSm-2Oiat", i = "onyx-sizeMd-k9dGF", a = "onyx-sizeLg-7aFQL", o = "onyx-sizeXl-LpJtS", s = "onyx-regular-Lo8tB", c = "onyx-medium-xqpTE", l = "onyx-semibold-yUnFf", u = "onyx-bold-lOfLu", d = "onyx-toneDefault-7B4RK", f = "onyx-toneMuted-MN5MD", p = "onyx-toneInherit-rraUC", m = "onyx-tonePrimary-pBMCm", h = "onyx-toneSuccess-DtrGc", g = "onyx-toneWarning-F8qKI", _ = "onyx-toneDanger-rEOI6", v = "onyx-toneInfo-meG5F", y = "onyx-start-du0tX", b = "onyx-center-AiQMQ", x = "onyx-end-BY5dh", S = "onyx-truncate-WVdAt", C = "onyx-clamp-KKAQd", w = {
|
|
3
|
+
text: e,
|
|
4
|
+
sizeInherit: t,
|
|
5
|
+
sizeXs: n,
|
|
6
|
+
sizeSm: r,
|
|
7
|
+
sizeMd: i,
|
|
8
|
+
sizeLg: a,
|
|
9
|
+
sizeXl: o,
|
|
10
|
+
regular: s,
|
|
11
|
+
medium: c,
|
|
12
|
+
semibold: l,
|
|
13
|
+
bold: u,
|
|
14
|
+
toneDefault: d,
|
|
15
|
+
toneMuted: f,
|
|
16
|
+
toneInherit: p,
|
|
17
|
+
tonePrimary: m,
|
|
18
|
+
toneSuccess: h,
|
|
19
|
+
toneWarning: g,
|
|
20
|
+
toneDanger: _,
|
|
21
|
+
toneInfo: v,
|
|
22
|
+
start: y,
|
|
23
|
+
center: b,
|
|
24
|
+
end: x,
|
|
25
|
+
truncate: S,
|
|
26
|
+
clamp: C
|
|
27
|
+
};
|
|
28
|
+
export { u as bold, b as center, C as clamp, w as default, x as end, c as medium, s as regular, l as semibold, t as sizeInherit, a as sizeLg, i as sizeMd, r as sizeSm, o as sizeXl, n as sizeXs, y as start, e as text, _ as toneDanger, d as toneDefault, v as toneInfo, p as toneInherit, f as toneMuted, m as tonePrimary, h as toneSuccess, g as toneWarning, S as truncate };
|
|
29
|
+
|
|
30
|
+
//# sourceMappingURL=Text.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Text.module.js","names":["text","sizeInherit","sizeXs","sizeSm","sizeMd","sizeLg","sizeXl","regular","medium","semibold","bold","toneDefault","toneMuted","toneInherit","tonePrimary","toneSuccess","toneWarning","toneDanger","toneInfo","start","center","end","truncate","clamp","Text_module_default"],"sources":["../../../src/components/Text/Text.module.css"],"sourcesContent":[".text {\n --text-lines: 2;\n margin: 0;\n}\n\n.sizeInherit {\n font-size: inherit;\n}\n\n.sizeXs {\n font-size: var(--font-size-xs);\n line-height: var(--line-height-normal);\n}\n\n.sizeSm {\n font-size: var(--font-size-sm);\n line-height: var(--line-height-normal);\n}\n\n.sizeMd {\n font-size: var(--font-size-md);\n line-height: var(--line-height-normal);\n}\n\n.sizeLg {\n font-size: var(--font-size-lg);\n line-height: var(--line-height-relaxed);\n}\n\n.sizeXl {\n font-size: var(--font-size-xl);\n line-height: var(--line-height-relaxed);\n}\n\n.regular {\n font-weight: var(--font-weight-regular);\n}\n\n.medium {\n font-weight: var(--font-weight-medium);\n}\n\n.semibold {\n font-weight: var(--font-weight-semibold);\n}\n\n.bold {\n font-weight: var(--font-weight-bold);\n}\n\n.toneDefault {\n color: var(--color-text);\n}\n\n.toneMuted {\n color: var(--color-text-muted);\n}\n\n.toneInherit {\n color: inherit;\n}\n\n.tonePrimary {\n color: var(--color-primary-text);\n}\n\n.toneSuccess {\n color: var(--color-success-text);\n}\n\n.toneWarning {\n color: var(--color-warning-text);\n}\n\n.toneDanger {\n color: var(--color-danger-text);\n}\n\n.toneInfo {\n color: var(--color-info-text);\n}\n\n.start {\n text-align: start;\n}\n\n.center {\n text-align: center;\n}\n\n.end {\n text-align: end;\n}\n\n.truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.clamp {\n display: -webkit-box;\n overflow: hidden;\n -webkit-line-clamp: var(--text-lines);\n line-clamp: var(--text-lines);\n -webkit-box-orient: vertical;\n}\n"],"mappings":""}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { TextareaHTMLAttributes } from 'react';
|
|
2
|
+
import { FieldSize } from '../Input/index.js';
|
|
3
|
+
export interface TextareaProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {
|
|
4
|
+
/** @default 'md' */
|
|
5
|
+
size?: FieldSize;
|
|
6
|
+
/** Marks the value as invalid. Inside a `FormField`, defaults to whether it has an error. */
|
|
7
|
+
invalid?: boolean;
|
|
8
|
+
/** @default 'vertical' */
|
|
9
|
+
resize?: 'none' | 'vertical' | 'both';
|
|
10
|
+
/**
|
|
11
|
+
* Grows with its content, starting from `rows`, in browsers that support `field-sizing`.
|
|
12
|
+
* @default false
|
|
13
|
+
*/
|
|
14
|
+
autoResize?: boolean;
|
|
15
|
+
}
|
|
16
|
+
/** Multi-line text field. */
|
|
17
|
+
export declare const Textarea: import('react').ForwardRefExoticComponent<TextareaProps & import('react').RefAttributes<HTMLTextAreaElement>>;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn as e } from "../../utils/cn.js";
|
|
3
|
+
import { useFieldControl as t } from "../FormField/formFieldContext.js";
|
|
4
|
+
import n from "../../styles/field.module.js";
|
|
5
|
+
import r from "./Textarea.module.js";
|
|
6
|
+
import { forwardRef as i } from "react";
|
|
7
|
+
import { jsx as a } from "react/jsx-runtime";
|
|
8
|
+
// src/components/Textarea/Textarea.tsx
|
|
9
|
+
var o = i(function({ size: i = "md", invalid: o, resize: s = "vertical", autoResize: c = !1, rows: l = 3, className: u, style: d, id: f, disabled: p, required: m, "aria-describedby": h, ...g }, _) {
|
|
10
|
+
let v = t({
|
|
11
|
+
id: f,
|
|
12
|
+
disabled: p,
|
|
13
|
+
required: m,
|
|
14
|
+
invalid: o,
|
|
15
|
+
"aria-describedby": h
|
|
16
|
+
});
|
|
17
|
+
return /* @__PURE__ */ a("textarea", {
|
|
18
|
+
ref: _,
|
|
19
|
+
rows: l,
|
|
20
|
+
id: v.id,
|
|
21
|
+
disabled: v.disabled,
|
|
22
|
+
required: v.required,
|
|
23
|
+
"aria-invalid": v["aria-invalid"],
|
|
24
|
+
"aria-describedby": v["aria-describedby"],
|
|
25
|
+
"data-invalid": v.invalid || void 0,
|
|
26
|
+
className: e(n.control, n[i], r.textarea, r[s], c && r.autoResize, u),
|
|
27
|
+
style: c ? {
|
|
28
|
+
"--textarea-rows": l,
|
|
29
|
+
...d
|
|
30
|
+
} : d,
|
|
31
|
+
...g
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
export { o as Textarea };
|
|
35
|
+
|
|
36
|
+
//# sourceMappingURL=Textarea.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Textarea.js","names":["field","styles","field_module_default","Textarea_module_default","Textarea","forwardRef","describedBy","props","control","useFieldControl","cn","size","resize","autoResize","className","rows","style"],"sources":["../../../src/components/Textarea/Textarea.tsx"],"sourcesContent":["import { forwardRef, type CSSProperties, type TextareaHTMLAttributes } from 'react';\nimport { cn } from '@/utils/cn';\nimport field from '@/styles/field.module.css';\nimport { useFieldControl } from '../FormField/formFieldContext';\nimport type { FieldSize } from '../Input';\nimport styles from './Textarea.module.css';\n\nexport interface TextareaProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {\n /** @default 'md' */\n size?: FieldSize;\n /** Marks the value as invalid. Inside a `FormField`, defaults to whether it has an error. */\n invalid?: boolean;\n /** @default 'vertical' */\n resize?: 'none' | 'vertical' | 'both';\n /**\n * Grows with its content, starting from `rows`, in browsers that support `field-sizing`.\n * @default false\n */\n autoResize?: boolean;\n}\n\n/** Multi-line text field. */\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(function Textarea(\n {\n size = 'md',\n invalid,\n resize = 'vertical',\n autoResize = false,\n rows = 3,\n className,\n style,\n id,\n disabled,\n required,\n 'aria-describedby': describedBy,\n ...props\n },\n ref,\n) {\n const control = useFieldControl({\n id,\n disabled,\n required,\n invalid,\n 'aria-describedby': describedBy,\n });\n\n return (\n <textarea\n ref={ref}\n rows={rows}\n id={control.id}\n disabled={control.disabled}\n required={control.required}\n aria-invalid={control['aria-invalid']}\n aria-describedby={control['aria-describedby']}\n data-invalid={control.invalid || undefined}\n className={cn(\n field.control,\n field[size],\n styles.textarea,\n styles[resize],\n autoResize && styles.autoResize,\n className,\n )}\n style={autoResize ? ({ '--textarea-rows': rows, ...style } as CSSProperties) : style}\n {...props}\n />\n );\n});\n"],"mappings":";;;;;;;;AAsBA,IAAaI,IAAWC,EAA+C,SACrE,EACE,UAAO,MACP,YACA,YAAS,YACT,gBAAa,IACb,UAAO,GACP,cACA,UACA,OACA,aACA,aACA,oBAAoBC,GACpB,GAAGC,KAEL,GACA;CACA,IAAMC,IAAUC,EAAgB;EAC9B;EACA;EACA;EACA;EACA,oBAAoBH;CACtB,CAAC;CAED,OACE,kBAAC,YAAD;EACO;EACC;EACN,IAAIE,EAAQ;EACZ,UAAUA,EAAQ;EAClB,UAAUA,EAAQ;EAClB,gBAAcA,EAAQ;EACtB,oBAAkBA,EAAQ;EAC1B,gBAAcA,EAAQ,WAAW,KAAA;EACjC,WAAWE,EACTV,EAAM,SACNA,EAAMW,IACNV,EAAO,UACPA,EAAOW,IACPC,KAAcZ,EAAO,YACrBa,CACF;EACA,OAAOD,IAAc;GAAE,mBAAmBE;GAAM,GAAGC;EAAM,IAAsBA;EAC/E,GAAIT;CACL,CAAA;AAEL,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// src/components/Textarea/Textarea.module.css
|
|
2
|
+
var e = "onyx-textarea-Z-y6g", t = "onyx-none-nYidn", n = "onyx-vertical-J6yKE", r = "onyx-both-gSk8o", i = "onyx-autoResize-VaNSp", a = {
|
|
3
|
+
textarea: e,
|
|
4
|
+
none: t,
|
|
5
|
+
vertical: n,
|
|
6
|
+
both: r,
|
|
7
|
+
autoResize: i
|
|
8
|
+
};
|
|
9
|
+
export { i as autoResize, r as both, a as default, t as none, e as textarea, n as vertical };
|
|
10
|
+
|
|
11
|
+
//# sourceMappingURL=Textarea.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Textarea.module.js","names":["textarea","none","vertical","both","autoResize","Textarea_module_default"],"sources":["../../../src/components/Textarea/Textarea.module.css"],"sourcesContent":[".textarea {\n --textarea-rows: 3;\n\n display: block;\n padding-block: var(--space-2);\n line-height: var(--line-height-normal);\n}\n\n.none {\n resize: none;\n}\n\n.vertical {\n resize: vertical;\n}\n\n.both {\n resize: both;\n}\n\n.autoResize {\n field-sizing: content;\n min-height: calc(var(--textarea-rows) * 1lh + var(--space-2) * 2);\n}\n"],"mappings":""}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { ThemeName } from '../../tokens/index.js';
|
|
3
|
+
/** A built-in theme or the name of a custom `[data-theme='<name>']` block. */
|
|
4
|
+
export type ResolvedTheme = ThemeName | (string & Record<never, never>);
|
|
5
|
+
/** A theme, or `system` to follow the operating system's `prefers-color-scheme`. */
|
|
6
|
+
export type Theme = 'system' | ResolvedTheme;
|
|
7
|
+
export interface ThemeProviderProps {
|
|
8
|
+
/**
|
|
9
|
+
* Theme used until the user picks one with `setTheme`.
|
|
10
|
+
* @default 'system'
|
|
11
|
+
*/
|
|
12
|
+
defaultTheme?: Theme;
|
|
13
|
+
/**
|
|
14
|
+
* `localStorage` key that persists the user's choice.
|
|
15
|
+
* @default 'onyx-theme'
|
|
16
|
+
*/
|
|
17
|
+
storageKey?: string;
|
|
18
|
+
children?: ReactNode;
|
|
19
|
+
}
|
|
20
|
+
export interface ThemeContextValue {
|
|
21
|
+
/** The chosen theme, `system` included. */
|
|
22
|
+
theme: Theme;
|
|
23
|
+
/** The theme applied to the page: `system` resolved to `light` or `dark`. */
|
|
24
|
+
resolvedTheme: ResolvedTheme;
|
|
25
|
+
/** Switches theme and persists the choice. */
|
|
26
|
+
setTheme: (theme: Theme) => void;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Applies a theme to the page by setting `data-theme` on `<html>`, follows the system preference
|
|
30
|
+
* in `system` mode and remembers the user's choice in `localStorage`.
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* <ThemeProvider defaultTheme="system">
|
|
34
|
+
* <App />
|
|
35
|
+
* </ThemeProvider>
|
|
36
|
+
*/
|
|
37
|
+
export declare function ThemeProvider({ defaultTheme, storageKey, children, }: ThemeProviderProps): import('react').JSX.Element;
|
|
38
|
+
/** Reads and changes the current theme. Must be called inside a `ThemeProvider`. */
|
|
39
|
+
export declare function useTheme(): ThemeContextValue;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { getServerStoredTheme as e, getServerSystemPrefersDark as t, getSystemPrefersDark as n, readStoredTheme as r, subscribeToStoredTheme as i, subscribeToSystemTheme as a, writeStoredTheme as o } from "./themeStore.js";
|
|
3
|
+
import { createContext as s, useCallback as c, useContext as l, useEffect as u, useLayoutEffect as d, useMemo as f, useSyncExternalStore as p } from "react";
|
|
4
|
+
import { jsx as m } from "react/jsx-runtime";
|
|
5
|
+
// src/components/ThemeProvider/ThemeProvider.tsx
|
|
6
|
+
var h = s(null), g = typeof window > "u" ? u : d;
|
|
7
|
+
function _({ defaultTheme: s = "system", storageKey: l = "onyx-theme", children: u }) {
|
|
8
|
+
let d = p(i, () => r(l), e), _ = p(a, n, t), v = d || s, y = v === "system" ? _ ? "dark" : "light" : v;
|
|
9
|
+
g(() => {
|
|
10
|
+
let e = document.documentElement, t = e.getAttribute("data-theme");
|
|
11
|
+
return e.setAttribute("data-theme", y), () => {
|
|
12
|
+
t === null ? e.removeAttribute("data-theme") : e.setAttribute("data-theme", t);
|
|
13
|
+
};
|
|
14
|
+
}, [y]);
|
|
15
|
+
let b = c((e) => o(l, e), [l]), x = f(() => ({
|
|
16
|
+
theme: v,
|
|
17
|
+
resolvedTheme: y,
|
|
18
|
+
setTheme: b
|
|
19
|
+
}), [
|
|
20
|
+
v,
|
|
21
|
+
y,
|
|
22
|
+
b
|
|
23
|
+
]);
|
|
24
|
+
return /* @__PURE__ */ m(h.Provider, {
|
|
25
|
+
value: x,
|
|
26
|
+
children: u
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
function v() {
|
|
30
|
+
let e = l(h);
|
|
31
|
+
if (!e) throw Error("useTheme must be used inside a <ThemeProvider>.");
|
|
32
|
+
return e;
|
|
33
|
+
}
|
|
34
|
+
export { _ as ThemeProvider, v as useTheme };
|
|
35
|
+
|
|
36
|
+
//# sourceMappingURL=ThemeProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ThemeProvider.js","names":["ThemeContext","createContext","useIsomorphicLayoutEffect","useEffect","useLayoutEffect","ThemeProvider","storedTheme","useSyncExternalStore","subscribeToStoredTheme","readStoredTheme","storageKey","getServerStoredTheme","prefersDark","subscribeToSystemTheme","getSystemPrefersDark","getServerSystemPrefersDark","theme","defaultTheme","resolvedTheme","root","previous","setTheme","useCallback","writeStoredTheme","next","value","useMemo","useTheme","context","useContext"],"sources":["../../../src/components/ThemeProvider/ThemeProvider.tsx"],"sourcesContent":["import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useLayoutEffect,\n useMemo,\n useSyncExternalStore,\n type ReactNode,\n} from 'react';\nimport type { ThemeName } from '@/tokens';\nimport {\n getServerStoredTheme,\n getServerSystemPrefersDark,\n getSystemPrefersDark,\n readStoredTheme,\n subscribeToStoredTheme,\n subscribeToSystemTheme,\n writeStoredTheme,\n} from './themeStore';\n\n/** A built-in theme or the name of a custom `[data-theme='<name>']` block. */\nexport type ResolvedTheme = ThemeName | (string & Record<never, never>);\n\n/** A theme, or `system` to follow the operating system's `prefers-color-scheme`. */\nexport type Theme = 'system' | ResolvedTheme;\n\nexport interface ThemeProviderProps {\n /**\n * Theme used until the user picks one with `setTheme`.\n * @default 'system'\n */\n defaultTheme?: Theme;\n /**\n * `localStorage` key that persists the user's choice.\n * @default 'onyx-theme'\n */\n storageKey?: string;\n children?: ReactNode;\n}\n\nexport interface ThemeContextValue {\n /** The chosen theme, `system` included. */\n theme: Theme;\n /** The theme applied to the page: `system` resolved to `light` or `dark`. */\n resolvedTheme: ResolvedTheme;\n /** Switches theme and persists the choice. */\n setTheme: (theme: Theme) => void;\n}\n\nconst ThemeContext = createContext<ThemeContextValue | null>(null);\n\nconst useIsomorphicLayoutEffect = typeof window === 'undefined' ? useEffect : useLayoutEffect;\n\n/**\n * Applies a theme to the page by setting `data-theme` on `<html>`, follows the system preference\n * in `system` mode and remembers the user's choice in `localStorage`.\n *\n * @example\n * <ThemeProvider defaultTheme=\"system\">\n * <App />\n * </ThemeProvider>\n */\nexport function ThemeProvider({\n defaultTheme = 'system',\n storageKey = 'onyx-theme',\n children,\n}: ThemeProviderProps) {\n const storedTheme = useSyncExternalStore(\n subscribeToStoredTheme,\n () => readStoredTheme(storageKey),\n getServerStoredTheme,\n );\n const prefersDark = useSyncExternalStore(\n subscribeToSystemTheme,\n getSystemPrefersDark,\n getServerSystemPrefersDark,\n );\n\n const theme = storedTheme || defaultTheme;\n const resolvedTheme = theme === 'system' ? (prefersDark ? 'dark' : 'light') : theme;\n\n // Layout effect, so the theme is in place before the first paint.\n useIsomorphicLayoutEffect(() => {\n const root = document.documentElement;\n const previous = root.getAttribute('data-theme');\n root.setAttribute('data-theme', resolvedTheme);\n\n return () => {\n if (previous === null) root.removeAttribute('data-theme');\n else root.setAttribute('data-theme', previous);\n };\n }, [resolvedTheme]);\n\n const setTheme = useCallback((next: Theme) => writeStoredTheme(storageKey, next), [storageKey]);\n\n const value = useMemo(\n () => ({ theme, resolvedTheme, setTheme }),\n [theme, resolvedTheme, setTheme],\n );\n\n return <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>;\n}\n\n/** Reads and changes the current theme. Must be called inside a `ThemeProvider`. */\nexport function useTheme(): ThemeContextValue {\n const context = useContext(ThemeContext);\n if (!context) throw new Error('useTheme must be used inside a <ThemeProvider>.');\n return context;\n}\n"],"mappings":";;;;;AAkDA,IAAMA,IAAeC,EAAwC,IAAI,GAE3DC,IAA4B,OAAO,SAAW,MAAcC,IAAYC;AAW9E,SAAgBC,EAAc,EAC5B,kBAAe,UACf,gBAAa,cACb,eACqB;CACrB,IAAMC,IAAcC,EAClBC,SACMC,EAAgBC,CAAU,GAChCC,CACF,GACMC,IAAcL,EAClBM,GACAC,GACAC,CACF,GAEMC,IAAQV,KAAeW,GACvBC,IAAgBF,MAAU,WAAYJ,IAAc,SAAS,UAAWI;CAG9E,QAAgC;EAC9B,IAAMG,IAAO,SAAS,iBAChBC,IAAWD,EAAK,aAAa,YAAY;EAG/C,OAFAA,EAAK,aAAa,cAAcD,CAAa,SAEhC;GACX,AAAIE,MAAa,OAAMD,EAAK,gBAAgB,YAAY,IACnDA,EAAK,aAAa,cAAcC,CAAQ;EAC/C;CACF,GAAG,CAACF,CAAa,CAAC;CAElB,IAAMG,IAAWC,GAAa,MAAgBC,EAAiBb,GAAYc,CAAI,GAAG,CAACd,CAAU,CAAC,GAExFe,IAAQC,SACL;EAAE;EAAO;EAAe;CAAS,IACxC;EAACV;EAAOE;EAAeG;CAAQ,CACjC;CAEA,OAAO,kBAACrB,EAAa,UAAd;EAA8B;EAAQ;CAAgC,CAAA;AAC/E;AAGA,SAAgB2B,IAA8B;CAC5C,IAAMC,IAAUC,EAAW7B,CAAY;CACvC,IAAI,CAAC4B,GAAS,MAAU,MAAM,iDAAiD;CAC/E,OAAOA;AACT"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare function subscribeToSystemTheme(onChange: () => void): () => void;
|
|
2
|
+
export declare const getSystemPrefersDark: () => boolean;
|
|
3
|
+
export declare const getServerSystemPrefersDark: () => boolean;
|
|
4
|
+
export declare function readStoredTheme(key: string): string | null;
|
|
5
|
+
export declare function writeStoredTheme(key: string, theme: string): void;
|
|
6
|
+
/** Notifies on writes from this page and, through the `storage` event, from other tabs. */
|
|
7
|
+
export declare function subscribeToStoredTheme(onChange: () => void): () => void;
|
|
8
|
+
export declare const getServerStoredTheme: () => null;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// src/components/ThemeProvider/themeStore.ts
|
|
2
|
+
var e = "(prefers-color-scheme: dark)", t = () => typeof window < "u" && typeof window.matchMedia == "function";
|
|
3
|
+
function n(n) {
|
|
4
|
+
if (!t()) return () => {};
|
|
5
|
+
let r = window.matchMedia(e);
|
|
6
|
+
return r.addEventListener("change", n), () => r.removeEventListener("change", n);
|
|
7
|
+
}
|
|
8
|
+
var r = () => t() && window.matchMedia(e).matches, i = () => !1, a = /* @__PURE__ */ new Map(), o = /* @__PURE__ */ new Set();
|
|
9
|
+
function s(e) {
|
|
10
|
+
if (a.has(e)) return a.get(e);
|
|
11
|
+
try {
|
|
12
|
+
return window.localStorage.getItem(e);
|
|
13
|
+
} catch {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
function c(e, t) {
|
|
18
|
+
try {
|
|
19
|
+
window.localStorage.setItem(e, t), a.delete(e);
|
|
20
|
+
} catch {
|
|
21
|
+
a.set(e, t);
|
|
22
|
+
}
|
|
23
|
+
o.forEach((e) => e());
|
|
24
|
+
}
|
|
25
|
+
function l(e) {
|
|
26
|
+
let t = (t) => {
|
|
27
|
+
t.key === null ? a.clear() : a.delete(t.key), e();
|
|
28
|
+
};
|
|
29
|
+
return o.add(e), window.addEventListener("storage", t), () => {
|
|
30
|
+
o.delete(e), window.removeEventListener("storage", t);
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
var u = () => null;
|
|
34
|
+
export { u as getServerStoredTheme, i as getServerSystemPrefersDark, r as getSystemPrefersDark, s as readStoredTheme, l as subscribeToStoredTheme, n as subscribeToSystemTheme, c as writeStoredTheme };
|
|
35
|
+
|
|
36
|
+
//# sourceMappingURL=themeStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"themeStore.js","names":["darkQuery","canMatchMedia","subscribeToSystemTheme","query","onChange","getSystemPrefersDark","getServerSystemPrefersDark","unsaved","listeners","readStoredTheme","key","writeStoredTheme","theme","listener","subscribeToStoredTheme","onStorage","event","getServerStoredTheme"],"sources":["../../../src/components/ThemeProvider/themeStore.ts"],"sourcesContent":["// External stores read with `useSyncExternalStore`, so the server and the hydration pass render\n// with the server snapshot and the client switches to the real value right after.\n\nconst darkQuery = '(prefers-color-scheme: dark)';\n\nconst canMatchMedia = () =>\n typeof window !== 'undefined' && typeof window.matchMedia === 'function';\n\nexport function subscribeToSystemTheme(onChange: () => void): () => void {\n if (!canMatchMedia()) return () => {};\n\n const query = window.matchMedia(darkQuery);\n query.addEventListener('change', onChange);\n return () => query.removeEventListener('change', onChange);\n}\n\nexport const getSystemPrefersDark = () => canMatchMedia() && window.matchMedia(darkQuery).matches;\n\nexport const getServerSystemPrefersDark = () => false;\n\n/**\n * Values that could not be written to `localStorage` (blocked storage, quota, private mode).\n * They keep the choice for the rest of the session even though it won't survive a reload.\n */\nconst unsaved = new Map<string, string>();\nconst listeners = new Set<() => void>();\n\nexport function readStoredTheme(key: string): string | null {\n if (unsaved.has(key)) return unsaved.get(key)!;\n try {\n return window.localStorage.getItem(key);\n } catch {\n return null;\n }\n}\n\nexport function writeStoredTheme(key: string, theme: string): void {\n try {\n window.localStorage.setItem(key, theme);\n unsaved.delete(key);\n } catch {\n unsaved.set(key, theme);\n }\n listeners.forEach((listener) => listener());\n}\n\n/** Notifies on writes from this page and, through the `storage` event, from other tabs. */\nexport function subscribeToStoredTheme(onChange: () => void): () => void {\n const onStorage = (event: StorageEvent) => {\n if (event.key === null) unsaved.clear();\n else unsaved.delete(event.key);\n onChange();\n };\n\n listeners.add(onChange);\n window.addEventListener('storage', onStorage);\n return () => {\n listeners.delete(onChange);\n window.removeEventListener('storage', onStorage);\n };\n}\n\nexport const getServerStoredTheme = () => null;\n"],"mappings":";AAGA,IAAMA,IAAY,gCAEZC,UACJ,OAAO,SAAW,OAAe,OAAO,OAAO,cAAe;AAEhE,SAAgBC,EAAuB,GAAkC;CACvE,IAAI,CAACD,EAAc,GAAG,aAAa,CAAC;CAEpC,IAAME,IAAQ,OAAO,WAAWH,CAAS;CAEzC,OADAG,EAAM,iBAAiB,UAAUC,CAAQ,SAC5BD,EAAM,oBAAoB,UAAUC,CAAQ;AAC3D;AAEA,IAAaC,UAA6BJ,EAAc,KAAK,OAAO,WAAWD,CAAS,CAAC,CAAC,SAE7EM,UAAmC,IAM1CC,oBAAU,IAAI,IAAoB,GAClCC,oBAAY,IAAI,IAAgB;AAEtC,SAAgBC,EAAgB,GAA4B;CAC1D,IAAIF,EAAQ,IAAIG,CAAG,GAAG,OAAOH,EAAQ,IAAIG,CAAG;CAC5C,IAAI;EACF,OAAO,OAAO,aAAa,QAAQA,CAAG;CACxC,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAgBC,EAAiB,GAAa,GAAqB;CACjE,IAAI;EAEF,AADA,OAAO,aAAa,QAAQD,GAAKE,CAAK,GACtCL,EAAQ,OAAOG,CAAG;CACpB,QAAQ;EACN,EAAQ,IAAIA,GAAKE,CAAK;CACxB;CACA,EAAU,SAAS,MAAaC,EAAS,CAAC;AAC5C;AAGA,SAAgBC,EAAuB,GAAkC;CACvE,IAAMC,KAAa,MAAwB;EAGzC,AAFIC,EAAM,QAAQ,OAAMT,EAAQ,MAAM,IACjCA,EAAQ,OAAOS,EAAM,GAAG,GAC7BZ,EAAS;CACX;CAIA,OAFAI,EAAU,IAAIJ,CAAQ,GACtB,OAAO,iBAAiB,WAAWW,CAAS,SAC/B;EAEX,AADAP,EAAU,OAAOJ,CAAQ,GACzB,OAAO,oBAAoB,WAAWW,CAAS;CACjD;AACF;AAEA,IAAaE,UAA6B"}
|