@brijbyte/agentic-ui 0.0.2 → 0.0.4
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/README.md +132 -35
- package/dist/accordion/accordion.d.ts +15 -1
- package/dist/accordion/accordion.d.ts.map +1 -1
- package/dist/accordion/accordion.js +6 -1
- package/dist/accordion/accordion.js.map +1 -1
- package/dist/accordion/parts.d.ts +1 -1
- package/dist/accordion/parts.js +2 -2
- package/dist/alert-dialog/alert-dialog.d.ts +12 -1
- package/dist/alert-dialog/alert-dialog.d.ts.map +1 -1
- package/dist/alert-dialog/alert-dialog.js +6 -1
- package/dist/alert-dialog/alert-dialog.js.map +1 -1
- package/dist/alert-dialog/parts.d.ts +1 -1
- package/dist/alert-dialog/parts.js +2 -2
- package/dist/badge/badge.d.ts +7 -1
- package/dist/badge/badge.d.ts.map +1 -1
- package/dist/badge/badge.js +4 -0
- package/dist/badge/badge.js.map +1 -1
- package/dist/button/button.css +22 -8
- package/dist/button/button.d.ts +19 -8
- package/dist/button/button.d.ts.map +1 -1
- package/dist/button/button.js +6 -1
- package/dist/button/button.js.map +1 -1
- package/dist/button/button.module.js.map +1 -1
- package/dist/card/card.d.ts +11 -1
- package/dist/card/card.d.ts.map +1 -1
- package/dist/card/card.js +7 -0
- package/dist/card/card.js.map +1 -1
- package/dist/checkbox/checkbox.d.ts +14 -1
- package/dist/checkbox/checkbox.d.ts.map +1 -1
- package/dist/checkbox/checkbox.js +5 -1
- package/dist/checkbox/checkbox.js.map +1 -1
- package/dist/checkbox/parts.js +1 -1
- package/dist/collapsible/collapsible.d.ts +12 -1
- package/dist/collapsible/collapsible.d.ts.map +1 -1
- package/dist/collapsible/collapsible.js +5 -0
- package/dist/collapsible/collapsible.js.map +1 -1
- package/dist/collapsible/parts.js +1 -1
- package/dist/context-menu/context-menu.d.ts +6 -1
- package/dist/context-menu/context-menu.d.ts.map +1 -1
- package/dist/context-menu/context-menu.js +4 -0
- package/dist/context-menu/context-menu.js.map +1 -1
- package/dist/context-menu/parts.js +1 -1
- package/dist/dialog/dialog.d.ts +14 -2
- package/dist/dialog/dialog.d.ts.map +1 -1
- package/dist/dialog/dialog.js +6 -0
- package/dist/dialog/dialog.js.map +1 -1
- package/dist/dialog/parts.js +1 -1
- package/dist/drawer/drawer.d.ts +12 -1
- package/dist/drawer/drawer.d.ts.map +1 -1
- package/dist/drawer/drawer.js +5 -0
- package/dist/drawer/drawer.js.map +1 -1
- package/dist/drawer/parts.d.ts +1 -1
- package/dist/drawer/parts.js +1 -1
- package/dist/index.css +1773 -1316
- package/dist/index.d.ts +29 -20
- package/dist/index.js +50 -37
- package/dist/input/input.d.ts +8 -0
- package/dist/input/input.d.ts.map +1 -1
- package/dist/input/input.js +6 -1
- package/dist/input/input.js.map +1 -1
- package/dist/menu/menu.css +3 -8
- package/dist/menu/menu.d.ts +12 -5
- package/dist/menu/menu.d.ts.map +1 -1
- package/dist/menu/menu.js +10 -24
- package/dist/menu/menu.js.map +1 -1
- package/dist/menu/menu.module.js +1 -1
- package/dist/menu/menu.module.js.map +1 -1
- package/dist/menu/menuitemshortcut.js +1 -1
- package/dist/menu/parts.js +1 -1
- package/dist/meter/circular-meter.d.ts +48 -0
- package/dist/meter/circular-meter.d.ts.map +1 -0
- package/dist/meter/circular-meter.js +86 -0
- package/dist/meter/circular-meter.js.map +1 -0
- package/dist/meter/index.d.ts +4 -0
- package/dist/meter/index.js +5 -0
- package/dist/meter/meter.css +152 -0
- package/dist/meter/meter.d.ts +58 -0
- package/dist/meter/meter.d.ts.map +1 -0
- package/dist/meter/meter.js +50 -0
- package/dist/meter/meter.js.map +1 -0
- package/dist/meter/meter.module.css.d.ts +2 -0
- package/dist/meter/meter.module.js +27 -0
- package/dist/meter/meter.module.js.map +1 -0
- package/dist/meter/meterState.js +18 -0
- package/dist/meter/meterState.js.map +1 -0
- package/dist/meter/parts.d.ts +31 -0
- package/dist/meter/parts.d.ts.map +1 -0
- package/dist/meter/parts.js +56 -0
- package/dist/meter/parts.js.map +1 -0
- package/dist/number-field/number-field.d.ts +17 -1
- package/dist/number-field/number-field.d.ts.map +1 -1
- package/dist/number-field/number-field.js +5 -1
- package/dist/number-field/number-field.js.map +1 -1
- package/dist/number-field/parts.js +1 -1
- package/dist/popover/index.d.ts +3 -0
- package/dist/popover/index.js +4 -0
- package/dist/popover/parts.d.ts +43 -0
- package/dist/popover/parts.d.ts.map +1 -0
- package/dist/popover/parts.js +96 -0
- package/dist/popover/parts.js.map +1 -0
- package/dist/popover/popover.css +173 -0
- package/dist/popover/popover.d.ts +49 -0
- package/dist/popover/popover.d.ts.map +1 -0
- package/dist/popover/popover.js +68 -0
- package/dist/popover/popover.js.map +1 -0
- package/dist/popover/popover.module.css.d.ts +2 -0
- package/dist/popover/popover.module.js +16 -0
- package/dist/popover/popover.module.js.map +1 -0
- package/dist/progress/parts.js +1 -1
- package/dist/progress/progress.d.ts +11 -0
- package/dist/progress/progress.d.ts.map +1 -1
- package/dist/progress/progress.js +5 -0
- package/dist/progress/progress.js.map +1 -1
- package/dist/radio/index.d.ts +3 -0
- package/dist/radio/index.js +4 -0
- package/dist/radio/parts.d.ts +18 -0
- package/dist/radio/parts.d.ts.map +1 -0
- package/dist/radio/parts.js +42 -0
- package/dist/radio/parts.js.map +1 -0
- package/dist/radio/radio.css +84 -0
- package/dist/radio/radio.d.ts +31 -0
- package/dist/radio/radio.d.ts.map +1 -0
- package/dist/radio/radio.js +33 -0
- package/dist/radio/radio.js.map +1 -0
- package/dist/radio/radio.module.css.d.ts +2 -0
- package/dist/radio/radio.module.js +11 -0
- package/dist/radio/radio.module.js.map +1 -0
- package/dist/radio-group/index.d.ts +3 -0
- package/dist/radio-group/index.js +4 -0
- package/dist/radio-group/parts.d.ts +13 -0
- package/dist/radio-group/parts.d.ts.map +1 -0
- package/dist/radio-group/parts.js +31 -0
- package/dist/radio-group/parts.js.map +1 -0
- package/dist/radio-group/radio-group.css +17 -0
- package/dist/radio-group/radio-group.d.ts +37 -0
- package/dist/radio-group/radio-group.d.ts.map +1 -0
- package/dist/radio-group/radio-group.js +28 -0
- package/dist/radio-group/radio-group.js.map +1 -0
- package/dist/radio-group/radio-group.module.css.d.ts +2 -0
- package/dist/radio-group/radio-group.module.js +9 -0
- package/dist/radio-group/radio-group.module.js.map +1 -0
- package/dist/select/parts.js +1 -1
- package/dist/select/select.d.ts +15 -2
- package/dist/select/select.d.ts.map +1 -1
- package/dist/select/select.js +5 -1
- package/dist/select/select.js.map +1 -1
- package/dist/separator/separator.d.ts +4 -0
- package/dist/separator/separator.d.ts.map +1 -1
- package/dist/separator/separator.js +5 -1
- package/dist/separator/separator.js.map +1 -1
- package/dist/shared/PopupArrow.js +22 -0
- package/dist/shared/PopupArrow.js.map +1 -0
- package/dist/slider/parts.js +1 -1
- package/dist/slider/slider.d.ts +19 -1
- package/dist/slider/slider.d.ts.map +1 -1
- package/dist/slider/slider.js +6 -0
- package/dist/slider/slider.js.map +1 -1
- package/dist/styles/tokens.css +21 -8
- package/dist/switch/parts.js +1 -1
- package/dist/switch/switch.css +11 -2
- package/dist/switch/switch.d.ts +13 -1
- package/dist/switch/switch.d.ts.map +1 -1
- package/dist/switch/switch.js +5 -1
- package/dist/switch/switch.js.map +1 -1
- package/dist/switch/switch.module.js.map +1 -1
- package/dist/tabs/parts.js +1 -1
- package/dist/tabs/tabs.d.ts +9 -2
- package/dist/tabs/tabs.d.ts.map +1 -1
- package/dist/tabs/tabs.js +4 -0
- package/dist/tabs/tabs.js.map +1 -1
- package/dist/toast/parts.js +1 -1
- package/dist/toast/toast.d.ts +12 -1
- package/dist/toast/toast.d.ts.map +1 -1
- package/dist/toast/toast.js +8 -0
- package/dist/toast/toast.js.map +1 -1
- package/dist/tokens.css +23 -11
- package/dist/tooltip/parts.js +1 -1
- package/dist/tooltip/tooltip.d.ts +10 -1
- package/dist/tooltip/tooltip.d.ts.map +1 -1
- package/dist/tooltip/tooltip.js +4 -0
- package/dist/tooltip/tooltip.js.map +1 -1
- package/package.json +23 -2
- package/src/accordion/accordion.tsx +14 -0
- package/src/alert-dialog/alert-dialog.tsx +11 -0
- package/src/badge/badge.tsx +6 -0
- package/src/button/button.module.css +29 -13
- package/src/button/button.tsx +19 -8
- package/src/card/card.tsx +10 -0
- package/src/checkbox/checkbox.tsx +13 -0
- package/src/collapsible/collapsible.tsx +11 -0
- package/src/context-menu/context-menu.tsx +5 -0
- package/src/dialog/dialog.tsx +13 -1
- package/src/drawer/drawer.tsx +11 -0
- package/src/index.ts +25 -233
- package/src/input/input.tsx +8 -0
- package/src/menu/menu.module.css +3 -10
- package/src/menu/menu.tsx +13 -26
- package/src/meter/circular-meter.tsx +114 -0
- package/src/meter/index.ts +9 -0
- package/src/meter/meter.module.css +162 -0
- package/src/meter/meter.tsx +86 -0
- package/src/meter/meterState.ts +29 -0
- package/src/meter/parts.tsx +72 -0
- package/src/number-field/number-field.tsx +16 -0
- package/src/popover/index.ts +14 -0
- package/src/popover/parts.tsx +120 -0
- package/src/popover/popover.module.css +189 -0
- package/src/popover/popover.tsx +80 -0
- package/src/progress/progress.tsx +11 -0
- package/src/radio/index.ts +6 -0
- package/src/radio/parts.tsx +43 -0
- package/src/radio/radio.module.css +96 -0
- package/src/radio/radio.tsx +37 -0
- package/src/radio-group/index.ts +5 -0
- package/src/radio-group/parts.tsx +32 -0
- package/src/radio-group/radio-group.module.css +17 -0
- package/src/radio-group/radio-group.tsx +63 -0
- package/src/select/select.tsx +14 -1
- package/src/separator/separator.tsx +4 -0
- package/src/shared/PopupArrow.tsx +41 -0
- package/src/slider/slider.tsx +18 -0
- package/src/styles/tokens.css +23 -11
- package/src/switch/switch.module.css +11 -2
- package/src/switch/switch.tsx +12 -0
- package/src/tabs/tabs.tsx +8 -1
- package/src/toast/toast.tsx +11 -0
- package/src/tooltip/tooltip.tsx +9 -0
|
@@ -1,15 +1,24 @@
|
|
|
1
|
-
import { ReactElement, ReactNode } from "react";
|
|
2
1
|
import * as react_jsx_runtime0 from "react/jsx-runtime";
|
|
2
|
+
import { ReactElement, ReactNode } from "react";
|
|
3
3
|
import styles from "./tooltip.module.css";
|
|
4
4
|
|
|
5
5
|
//#region src/tooltip/tooltip.d.ts
|
|
6
6
|
interface TooltipProps {
|
|
7
|
+
/** Text or rich content shown inside the tooltip popup. */
|
|
7
8
|
content: ReactNode;
|
|
9
|
+
/** The element that triggers the tooltip on hover/focus. */
|
|
8
10
|
children: ReactElement;
|
|
11
|
+
/** Hover delay in milliseconds before the tooltip appears. @default 400 */
|
|
9
12
|
delay?: number;
|
|
13
|
+
/** Which side of the trigger the tooltip appears on. @default "top" */
|
|
10
14
|
side?: "top" | "bottom" | "left" | "right";
|
|
15
|
+
/** Alignment along the side axis. @default "center" */
|
|
11
16
|
align?: "start" | "center" | "end";
|
|
12
17
|
}
|
|
18
|
+
/**
|
|
19
|
+
* Accessible popup shown on hover or focus. Automatically positions itself
|
|
20
|
+
* with an arrow and supports configurable delay, side, and alignment.
|
|
21
|
+
*/
|
|
13
22
|
declare function Tooltip({
|
|
14
23
|
content,
|
|
15
24
|
children,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tooltip.d.ts","names":[],"sources":["../../src/tooltip/tooltip.tsx"],"mappings":";;;;;UAIiB,YAAA
|
|
1
|
+
{"version":3,"file":"tooltip.d.ts","names":[],"sources":["../../src/tooltip/tooltip.tsx"],"mappings":";;;;;UAIiB,YAAA;;EAEf,OAAA,EAAS,SAAA;EAFM;EAIf,QAAA,EAAU,YAAA;;EAEV,KAAA;EAJA;EAMA,IAAA;EAJA;EAMA,KAAA;AAAA;;;;;iBAOc,OAAA,CAAA;EAAU,OAAA;EAAS,QAAA;EAAU,KAAA;EAAa,IAAA;EAAc;AAAA,GAAoB,YAAA,GAAY,kBAAA,CAAA,GAAA,CAAA,OAAA"}
|
package/dist/tooltip/tooltip.js
CHANGED
|
@@ -2,6 +2,10 @@ import tooltip_module_default from "./tooltip.module.js";
|
|
|
2
2
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { Tooltip } from "@base-ui/react/tooltip";
|
|
4
4
|
//#region src/tooltip/tooltip.tsx
|
|
5
|
+
/**
|
|
6
|
+
* Accessible popup shown on hover or focus. Automatically positions itself
|
|
7
|
+
* with an arrow and supports configurable delay, side, and alignment.
|
|
8
|
+
*/
|
|
5
9
|
function Tooltip$1({ content, children, delay = 400, side = "top", align = "center" }) {
|
|
6
10
|
return /* @__PURE__ */ jsx(Tooltip.Provider, {
|
|
7
11
|
delay,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tooltip.js","names":["Tooltip","BaseTooltip","styles"],"sources":["../../src/tooltip/tooltip.tsx"],"sourcesContent":["import type { ReactNode, ReactElement } from \"react\";\nimport { Tooltip as BaseTooltip } from \"@base-ui/react/tooltip\";\nimport styles from \"./tooltip.module.css\";\n\nexport interface TooltipProps {\n content: ReactNode;\n children: ReactElement;\n delay?: number;\n side?: \"top\" | \"bottom\" | \"left\" | \"right\";\n align?: \"start\" | \"center\" | \"end\";\n}\n\nexport function Tooltip({ content, children, delay = 400, side = \"top\", align = \"center\" }: TooltipProps) {\n return (\n <BaseTooltip.Provider delay={delay}>\n <BaseTooltip.Root>\n <BaseTooltip.Trigger render={children} />\n <BaseTooltip.Portal>\n <BaseTooltip.Positioner className={styles.positioner} side={side} align={align} sideOffset={6}>\n <BaseTooltip.Popup className={styles.popup}>\n <BaseTooltip.Arrow className={styles.arrow} />\n {content}\n </BaseTooltip.Popup>\n </BaseTooltip.Positioner>\n </BaseTooltip.Portal>\n </BaseTooltip.Root>\n </BaseTooltip.Provider>\n );\n}\nexport { styles as TooltipStyles };\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"tooltip.js","names":["Tooltip","BaseTooltip","styles"],"sources":["../../src/tooltip/tooltip.tsx"],"sourcesContent":["import type { ReactNode, ReactElement } from \"react\";\nimport { Tooltip as BaseTooltip } from \"@base-ui/react/tooltip\";\nimport styles from \"./tooltip.module.css\";\n\nexport interface TooltipProps {\n /** Text or rich content shown inside the tooltip popup. */\n content: ReactNode;\n /** The element that triggers the tooltip on hover/focus. */\n children: ReactElement;\n /** Hover delay in milliseconds before the tooltip appears. @default 400 */\n delay?: number;\n /** Which side of the trigger the tooltip appears on. @default \"top\" */\n side?: \"top\" | \"bottom\" | \"left\" | \"right\";\n /** Alignment along the side axis. @default \"center\" */\n align?: \"start\" | \"center\" | \"end\";\n}\n\n/**\n * Accessible popup shown on hover or focus. Automatically positions itself\n * with an arrow and supports configurable delay, side, and alignment.\n */\nexport function Tooltip({ content, children, delay = 400, side = \"top\", align = \"center\" }: TooltipProps) {\n return (\n <BaseTooltip.Provider delay={delay}>\n <BaseTooltip.Root>\n <BaseTooltip.Trigger render={children} />\n <BaseTooltip.Portal>\n <BaseTooltip.Positioner className={styles.positioner} side={side} align={align} sideOffset={6}>\n <BaseTooltip.Popup className={styles.popup}>\n <BaseTooltip.Arrow className={styles.arrow} />\n {content}\n </BaseTooltip.Popup>\n </BaseTooltip.Positioner>\n </BaseTooltip.Portal>\n </BaseTooltip.Root>\n </BaseTooltip.Provider>\n );\n}\nexport { styles as TooltipStyles };\n"],"mappings":";;;;;;;;AAqBA,SAAgBA,UAAQ,EAAE,SAAS,UAAU,QAAQ,KAAK,OAAO,OAAO,QAAQ,YAA0B;AACxG,QACE,oBAACC,QAAY,UAAb;EAA6B;YAC3B,qBAACA,QAAY,MAAb,EAAA,UAAA,CACE,oBAACA,QAAY,SAAb,EAAqB,QAAQ,UAAY,CAAA,EACzC,oBAACA,QAAY,QAAb,EAAA,UACE,oBAACA,QAAY,YAAb;GAAwB,WAAWC,uBAAO;GAAkB;GAAa;GAAO,YAAY;aAC1F,qBAACD,QAAY,OAAb;IAAmB,WAAWC,uBAAO;cAArC,CACE,oBAACD,QAAY,OAAb,EAAmB,WAAWC,uBAAO,OAAS,CAAA,EAC7C,QACiB;;GACG,CAAA,EACN,CAAA,CACJ,EAAA,CAAA;EACE,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@brijbyte/agentic-ui",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.4",
|
|
4
4
|
"private": false,
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -23,6 +23,7 @@
|
|
|
23
23
|
"import": "./dist/index.js",
|
|
24
24
|
"types": "./dist/index.d.ts"
|
|
25
25
|
},
|
|
26
|
+
"./package.json": "./package.json",
|
|
26
27
|
"./styles": "./dist/index.css",
|
|
27
28
|
"./layer-order": "./dist/layer-order.css",
|
|
28
29
|
"./tokens": "./dist/tokens.css",
|
|
@@ -88,6 +89,11 @@
|
|
|
88
89
|
"types": "./dist/menu/index.d.ts"
|
|
89
90
|
},
|
|
90
91
|
"./menu.css": "./dist/menu/menu.css",
|
|
92
|
+
"./meter": {
|
|
93
|
+
"import": "./dist/meter/index.js",
|
|
94
|
+
"types": "./dist/meter/index.d.ts"
|
|
95
|
+
},
|
|
96
|
+
"./meter.css": "./dist/meter/meter.css",
|
|
91
97
|
"./number-field": {
|
|
92
98
|
"import": "./dist/number-field/index.js",
|
|
93
99
|
"types": "./dist/number-field/index.d.ts"
|
|
@@ -98,6 +104,16 @@
|
|
|
98
104
|
"types": "./dist/progress/index.d.ts"
|
|
99
105
|
},
|
|
100
106
|
"./progress.css": "./dist/progress/progress.css",
|
|
107
|
+
"./radio": {
|
|
108
|
+
"import": "./dist/radio/index.js",
|
|
109
|
+
"types": "./dist/radio/index.d.ts"
|
|
110
|
+
},
|
|
111
|
+
"./radio.css": "./dist/radio/radio.css",
|
|
112
|
+
"./radio-group": {
|
|
113
|
+
"import": "./dist/radio-group/index.js",
|
|
114
|
+
"types": "./dist/radio-group/index.d.ts"
|
|
115
|
+
},
|
|
116
|
+
"./radio-group.css": "./dist/radio-group/radio-group.css",
|
|
101
117
|
"./select": {
|
|
102
118
|
"import": "./dist/select/index.js",
|
|
103
119
|
"types": "./dist/select/index.d.ts"
|
|
@@ -132,7 +148,12 @@
|
|
|
132
148
|
"import": "./dist/tooltip/index.js",
|
|
133
149
|
"types": "./dist/tooltip/index.d.ts"
|
|
134
150
|
},
|
|
135
|
-
"./tooltip.css": "./dist/tooltip/tooltip.css"
|
|
151
|
+
"./tooltip.css": "./dist/tooltip/tooltip.css",
|
|
152
|
+
"./popover": {
|
|
153
|
+
"import": "./dist/popover/index.js",
|
|
154
|
+
"types": "./dist/popover/index.d.ts"
|
|
155
|
+
},
|
|
156
|
+
"./popover.css": "./dist/popover/popover.css"
|
|
136
157
|
},
|
|
137
158
|
"publishConfig": {
|
|
138
159
|
"access": "public",
|
|
@@ -3,17 +3,26 @@ import { Accordion as BaseAccordion } from "@base-ui/react/accordion";
|
|
|
3
3
|
import styles from "./accordion.module.css";
|
|
4
4
|
|
|
5
5
|
export interface AccordionItem {
|
|
6
|
+
/** Unique identifier for this panel. */
|
|
6
7
|
value: string;
|
|
8
|
+
/** Content rendered inside the trigger button. */
|
|
7
9
|
header: ReactNode;
|
|
10
|
+
/** Content revealed when the panel is expanded. */
|
|
8
11
|
content: ReactNode;
|
|
12
|
+
/** When `true`, the item cannot be toggled. */
|
|
9
13
|
disabled?: boolean;
|
|
10
14
|
}
|
|
11
15
|
|
|
12
16
|
export interface AccordionProps {
|
|
17
|
+
/** Array of items to render as collapsible panels. */
|
|
13
18
|
items: AccordionItem[];
|
|
19
|
+
/** Allow multiple panels open at once. @default true */
|
|
14
20
|
multiple?: boolean;
|
|
21
|
+
/** Initially expanded panel values (uncontrolled). */
|
|
15
22
|
defaultValue?: string[];
|
|
23
|
+
/** Currently expanded panel values (controlled). */
|
|
16
24
|
value?: string[];
|
|
25
|
+
/** Called when the set of open panels changes. */
|
|
17
26
|
onValueChange?: (value: string[]) => void;
|
|
18
27
|
className?: string;
|
|
19
28
|
}
|
|
@@ -26,6 +35,11 @@ function ChevronIcon() {
|
|
|
26
35
|
);
|
|
27
36
|
}
|
|
28
37
|
|
|
38
|
+
/**
|
|
39
|
+
* Collapsible content panels. Wraps `@base-ui/react` Accordion with pre-styled
|
|
40
|
+
* headers, triggers, and animated panels. Pass `multiple` to allow more than one
|
|
41
|
+
* panel open at a time.
|
|
42
|
+
*/
|
|
29
43
|
export function Accordion({ items, className, multiple = true, ...props }: AccordionProps) {
|
|
30
44
|
return (
|
|
31
45
|
<BaseAccordion.Root className={`${styles.root} ${className ?? ""}`} multiple={multiple} {...props}>
|
|
@@ -14,13 +14,19 @@ export interface AlertAction {
|
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
export interface AlertDialogProps {
|
|
17
|
+
/** Controlled open state. */
|
|
17
18
|
open?: boolean;
|
|
19
|
+
/** Whether the dialog is initially open (uncontrolled). */
|
|
18
20
|
defaultOpen?: boolean;
|
|
21
|
+
/** Called when the dialog opens or closes. */
|
|
19
22
|
onOpenChange?: (open: boolean, eventDetails: unknown) => void;
|
|
23
|
+
/** Element that opens the dialog when clicked. */
|
|
20
24
|
trigger?: ReactElement;
|
|
21
25
|
/** Optional icon shown above the title. */
|
|
22
26
|
icon?: ReactNode;
|
|
27
|
+
/** Dialog heading text. */
|
|
23
28
|
title: ReactNode;
|
|
29
|
+
/** Supplementary text below the title. */
|
|
24
30
|
description?: ReactNode;
|
|
25
31
|
/**
|
|
26
32
|
* Action buttons rendered right-aligned.
|
|
@@ -31,6 +37,11 @@ export interface AlertDialogProps {
|
|
|
31
37
|
className?: string;
|
|
32
38
|
}
|
|
33
39
|
|
|
40
|
+
/**
|
|
41
|
+
* A modal that requires a user response before continuing. Blocks interaction
|
|
42
|
+
* with the rest of the page until dismissed. Two actions render side-by-side;
|
|
43
|
+
* three or more stack vertically.
|
|
44
|
+
*/
|
|
34
45
|
export function AlertDialog({ trigger, icon, title, description, actions, className, onOpenChange, ...props }: AlertDialogProps) {
|
|
35
46
|
return (
|
|
36
47
|
<BaseAlertDialog.Root onOpenChange={onOpenChange as never} {...props}>
|
package/src/badge/badge.tsx
CHANGED
|
@@ -4,10 +4,16 @@ import styles from "./badge.module.css";
|
|
|
4
4
|
export type BadgeVariant = "default" | "solid" | "soft" | "success" | "warning" | "error" | "info";
|
|
5
5
|
|
|
6
6
|
export interface BadgeProps extends ComponentPropsWithoutRef<"span"> {
|
|
7
|
+
/** Visual style and semantic colour. @default "default" */
|
|
7
8
|
variant?: BadgeVariant;
|
|
9
|
+
/** Show a small coloured dot indicator before the label. */
|
|
8
10
|
dot?: boolean;
|
|
9
11
|
}
|
|
10
12
|
|
|
13
|
+
/**
|
|
14
|
+
* Compact label for status, counts, and categories. A plain styled `<span>` —
|
|
15
|
+
* no base-ui dependency.
|
|
16
|
+
*/
|
|
11
17
|
export function Badge({ variant = "default", dot = false, className, children, ...props }: BadgeProps) {
|
|
12
18
|
return (
|
|
13
19
|
<span className={[styles.root, styles[`variant-${variant}`], className ?? ""].filter(Boolean).join(" ")} {...props}>
|
|
@@ -78,18 +78,21 @@
|
|
|
78
78
|
}
|
|
79
79
|
/* ─── Tones — set scoped color tokens ────────────────────────────── */
|
|
80
80
|
/*
|
|
81
|
-
* Each tone exposes
|
|
82
|
-
* --btn-color solid bg
|
|
83
|
-
* --btn-color-hover solid bg hover
|
|
84
|
-
* --btn-color-pressed solid bg
|
|
81
|
+
* Each tone exposes scoped custom properties consumed by the variants below:
|
|
82
|
+
* --btn-color solid bg color
|
|
83
|
+
* --btn-color-hover solid bg on hover
|
|
84
|
+
* --btn-color-pressed solid bg on press
|
|
85
|
+
* --btn-text-color text color for soft / outline / ghost variants
|
|
86
|
+
* (may differ from --btn-color for contrast on tinted surfaces)
|
|
85
87
|
* --btn-tint soft bg
|
|
86
|
-
* --btn-tint-hover soft bg hover
|
|
88
|
+
* --btn-tint-hover soft bg on hover
|
|
87
89
|
* --btn-on-color text on solid bg
|
|
88
90
|
*/
|
|
89
91
|
.tone-primary {
|
|
90
|
-
--btn-color: var(--color-accent);
|
|
92
|
+
--btn-color: var(--color-accent-solid);
|
|
91
93
|
--btn-color-hover: var(--color-accent-hover);
|
|
92
94
|
--btn-color-pressed: var(--color-accent-pressed);
|
|
95
|
+
--btn-text-color: var(--color-accent-text);
|
|
93
96
|
--btn-tint: var(--color-accent-tint);
|
|
94
97
|
--btn-tint-hover: var(--color-accent-tint-hover);
|
|
95
98
|
--btn-on-color: var(--color-on-accent);
|
|
@@ -98,6 +101,7 @@
|
|
|
98
101
|
--btn-color: var(--color-secondary);
|
|
99
102
|
--btn-color-hover: var(--color-primary);
|
|
100
103
|
--btn-color-pressed: var(--color-primary);
|
|
104
|
+
--btn-text-color: var(--color-secondary);
|
|
101
105
|
--btn-tint: var(--color-hover);
|
|
102
106
|
--btn-tint-hover: var(--color-active);
|
|
103
107
|
--btn-on-color: var(--color-canvas);
|
|
@@ -106,25 +110,28 @@
|
|
|
106
110
|
--btn-color: var(--color-error-solid);
|
|
107
111
|
--btn-color-hover: var(--color-error-solid);
|
|
108
112
|
--btn-color-pressed: var(--color-error-solid);
|
|
113
|
+
--btn-text-color: var(--color-error-text);
|
|
109
114
|
--btn-tint: var(--color-error-bg);
|
|
110
115
|
--btn-tint-hover: var(--color-error-bg);
|
|
111
|
-
--btn-on-color:
|
|
116
|
+
--btn-on-color: var(--color-error-on-solid);
|
|
112
117
|
}
|
|
113
118
|
.tone-success {
|
|
114
119
|
--btn-color: var(--color-success-solid);
|
|
115
120
|
--btn-color-hover: var(--color-success-solid);
|
|
116
121
|
--btn-color-pressed: var(--color-success-solid);
|
|
122
|
+
--btn-text-color: var(--color-success-text);
|
|
117
123
|
--btn-tint: var(--color-success-bg);
|
|
118
124
|
--btn-tint-hover: var(--color-success-bg);
|
|
119
|
-
--btn-on-color:
|
|
125
|
+
--btn-on-color: var(--color-success-on-solid);
|
|
120
126
|
}
|
|
121
127
|
.tone-warning {
|
|
122
128
|
--btn-color: var(--color-warning-solid);
|
|
123
129
|
--btn-color-hover: var(--color-warning-solid);
|
|
124
130
|
--btn-color-pressed: var(--color-warning-solid);
|
|
131
|
+
--btn-text-color: var(--color-warning-text);
|
|
125
132
|
--btn-tint: var(--color-warning-bg);
|
|
126
133
|
--btn-tint-hover: var(--color-warning-bg);
|
|
127
|
-
--btn-on-color:
|
|
134
|
+
--btn-on-color: var(--color-warning-on-solid);
|
|
128
135
|
}
|
|
129
136
|
/* ─── Variants — consume tone tokens ────────────────────────────── */
|
|
130
137
|
.variant-solid {
|
|
@@ -158,7 +165,7 @@
|
|
|
158
165
|
.variant-soft {
|
|
159
166
|
background-color: var(--btn-tint);
|
|
160
167
|
border-color: transparent;
|
|
161
|
-
color: var(--btn-color);
|
|
168
|
+
color: var(--btn-text-color);
|
|
162
169
|
}
|
|
163
170
|
.variant-soft:hover:not([data-disabled]) {
|
|
164
171
|
background-color: var(--btn-tint-hover);
|
|
@@ -173,10 +180,15 @@
|
|
|
173
180
|
border-color: var(--color-line-strong);
|
|
174
181
|
color: var(--color-primary);
|
|
175
182
|
}
|
|
183
|
+
/* Non-secondary tones show their tone color at rest */
|
|
184
|
+
.variant-outline:not(.tone-secondary) {
|
|
185
|
+
border-color: var(--btn-text-color);
|
|
186
|
+
color: var(--btn-text-color);
|
|
187
|
+
}
|
|
176
188
|
.variant-outline:hover:not([data-disabled]) {
|
|
177
189
|
background-color: var(--color-hover);
|
|
178
|
-
border-color: var(--btn-color);
|
|
179
|
-
color: var(--btn-color);
|
|
190
|
+
border-color: var(--btn-text-color);
|
|
191
|
+
color: var(--btn-text-color);
|
|
180
192
|
}
|
|
181
193
|
.variant-outline:active:not([data-disabled]),
|
|
182
194
|
.variant-outline[data-pressed]:not([data-disabled]) {
|
|
@@ -187,9 +199,13 @@
|
|
|
187
199
|
border-color: transparent;
|
|
188
200
|
color: var(--color-secondary);
|
|
189
201
|
}
|
|
202
|
+
/* Non-secondary tones show their tone color at rest */
|
|
203
|
+
.variant-ghost:not(.tone-secondary) {
|
|
204
|
+
color: var(--btn-text-color);
|
|
205
|
+
}
|
|
190
206
|
.variant-ghost:hover:not([data-disabled]) {
|
|
191
207
|
background-color: var(--color-hover);
|
|
192
|
-
color: var(--btn-color);
|
|
208
|
+
color: var(--btn-text-color);
|
|
193
209
|
}
|
|
194
210
|
.variant-ghost:active:not([data-disabled]),
|
|
195
211
|
.variant-ghost[data-pressed]:not([data-disabled]) {
|
package/src/button/button.tsx
CHANGED
|
@@ -8,22 +8,33 @@ export type ButtonTone = "primary" | "secondary" | "destructive" | "success" | "
|
|
|
8
8
|
export type ButtonSize = "xs" | "sm" | "md" | "lg";
|
|
9
9
|
|
|
10
10
|
export interface ButtonProps extends ComponentPropsWithoutRef<"button"> {
|
|
11
|
+
/** Visual shape — filled, tinted, outlined, or borderless. @default "solid" */
|
|
11
12
|
variant?: ButtonVariant;
|
|
12
|
-
/** Semantic
|
|
13
|
-
tone?: ButtonTone;
|
|
14
|
-
size
|
|
15
|
-
|
|
13
|
+
/** Semantic colour. @default "primary" */
|
|
14
|
+
tone?: ButtonTone | undefined;
|
|
15
|
+
/** Controls padding and font size. @default "md" */
|
|
16
|
+
size?: ButtonSize | undefined;
|
|
17
|
+
/** Shows a spinner overlay and disables interaction. */
|
|
18
|
+
loading?: boolean | undefined;
|
|
16
19
|
/**
|
|
17
20
|
* Text shown in place of children while loading.
|
|
18
21
|
* When provided the button width adapts to this text (variable width).
|
|
19
22
|
* When omitted, children stay rendered invisibly — width stays stable.
|
|
20
23
|
*/
|
|
21
|
-
loadingText?: string;
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
24
|
+
loadingText?: string | undefined;
|
|
25
|
+
/** Renders as a square button with equal padding on all sides. */
|
|
26
|
+
iconOnly?: boolean | undefined;
|
|
27
|
+
/** Custom render element forwarded to base-ui Button. */
|
|
28
|
+
render?: ReactElement | undefined;
|
|
29
|
+
/** Use a native `<button>` element. @default true */
|
|
30
|
+
nativeButton?: boolean | undefined;
|
|
25
31
|
}
|
|
26
32
|
|
|
33
|
+
/**
|
|
34
|
+
* Pressable button with multiple variants, tones, and sizes. Composes
|
|
35
|
+
* `@base-ui/react` Button with focus management and disabled-while-loading.
|
|
36
|
+
* Supports a spinner overlay that preserves button width.
|
|
37
|
+
*/
|
|
27
38
|
export const Button = forwardRef<HTMLButtonElement, ButtonProps>(function Button(
|
|
28
39
|
{
|
|
29
40
|
variant = "solid",
|
package/src/card/card.tsx
CHANGED
|
@@ -2,7 +2,9 @@ import type { ComponentPropsWithoutRef, ReactNode } from "react";
|
|
|
2
2
|
import styles from "./card.module.css";
|
|
3
3
|
|
|
4
4
|
export interface CardProps extends ComponentPropsWithoutRef<"div"> {
|
|
5
|
+
/** Apply a raised shadow for layered surfaces. */
|
|
5
6
|
elevated?: boolean;
|
|
7
|
+
/** Add hover/active states for clickable cards. */
|
|
6
8
|
interactive?: boolean;
|
|
7
9
|
}
|
|
8
10
|
|
|
@@ -10,9 +12,14 @@ export interface CardProps extends ComponentPropsWithoutRef<"div"> {
|
|
|
10
12
|
export interface CardHeaderProps extends Omit<ComponentPropsWithoutRef<"div">, "title"> {
|
|
11
13
|
/** Card heading rendered in the header area. */
|
|
12
14
|
heading?: ReactNode;
|
|
15
|
+
/** Secondary text below the heading. */
|
|
13
16
|
description?: ReactNode;
|
|
14
17
|
}
|
|
15
18
|
|
|
19
|
+
/**
|
|
20
|
+
* Surface container with optional header, body, and footer slots.
|
|
21
|
+
* Pure HTML — no base-ui dependency.
|
|
22
|
+
*/
|
|
16
23
|
export function Card({ elevated, interactive, className, children, ...props }: CardProps) {
|
|
17
24
|
return (
|
|
18
25
|
<div
|
|
@@ -26,6 +33,7 @@ export function Card({ elevated, interactive, className, children, ...props }: C
|
|
|
26
33
|
);
|
|
27
34
|
}
|
|
28
35
|
|
|
36
|
+
/** Header area with optional heading and description. */
|
|
29
37
|
export function CardHeader({ heading, description, className, children, ...props }: CardHeaderProps) {
|
|
30
38
|
return (
|
|
31
39
|
<div className={`${styles.header} ${className ?? ""}`} {...props}>
|
|
@@ -36,6 +44,7 @@ export function CardHeader({ heading, description, className, children, ...props
|
|
|
36
44
|
);
|
|
37
45
|
}
|
|
38
46
|
|
|
47
|
+
/** Padded body content area. */
|
|
39
48
|
export function CardBody({ className, children, ...props }: ComponentPropsWithoutRef<"div">) {
|
|
40
49
|
return (
|
|
41
50
|
<div className={`${styles.body} ${className ?? ""}`} {...props}>
|
|
@@ -44,6 +53,7 @@ export function CardBody({ className, children, ...props }: ComponentPropsWithou
|
|
|
44
53
|
);
|
|
45
54
|
}
|
|
46
55
|
|
|
56
|
+
/** Footer area, typically used for actions. */
|
|
47
57
|
export function CardFooter({ className, children, ...props }: ComponentPropsWithoutRef<"div">) {
|
|
48
58
|
return (
|
|
49
59
|
<div className={`${styles.footer} ${className ?? ""}`} {...props}>
|
|
@@ -4,20 +4,33 @@ import { Checkbox as BaseCheckbox } from "@base-ui/react/checkbox";
|
|
|
4
4
|
import styles from "./checkbox.module.css";
|
|
5
5
|
|
|
6
6
|
export interface CheckboxProps {
|
|
7
|
+
/** Controlled checked state. */
|
|
7
8
|
checked?: boolean;
|
|
9
|
+
/** Initial checked state (uncontrolled). */
|
|
8
10
|
defaultChecked?: boolean;
|
|
11
|
+
/** Display a horizontal dash instead of a checkmark. */
|
|
9
12
|
indeterminate?: boolean;
|
|
13
|
+
/** Prevent interaction and dim the checkbox. */
|
|
10
14
|
disabled?: boolean;
|
|
15
|
+
/** Mark the field as required for form validation. */
|
|
11
16
|
required?: boolean;
|
|
17
|
+
/** HTML name attribute for form submission. */
|
|
12
18
|
name?: string;
|
|
19
|
+
/** HTML value attribute for form submission. */
|
|
13
20
|
value?: string;
|
|
14
21
|
/** Called when checked state changes. `eventDetails` is the base-ui event details object. */
|
|
15
22
|
onCheckedChange?: (checked: boolean, eventDetails: unknown) => void;
|
|
23
|
+
/** Label content rendered next to the checkbox. */
|
|
16
24
|
children?: ReactNode;
|
|
25
|
+
/** Override the auto-generated element id. */
|
|
17
26
|
id?: string;
|
|
18
27
|
className?: string;
|
|
19
28
|
}
|
|
20
29
|
|
|
30
|
+
/**
|
|
31
|
+
* Boolean selection with an accessible label. Wraps `@base-ui/react` Checkbox
|
|
32
|
+
* with a styled indicator, check icon, and label layout.
|
|
33
|
+
*/
|
|
21
34
|
export function Checkbox({ children, id, className, onCheckedChange, ...props }: CheckboxProps) {
|
|
22
35
|
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
23
36
|
const checkboxId = id ?? useId();
|
|
@@ -3,11 +3,17 @@ import { Collapsible as BaseCollapsible } from "@base-ui/react/collapsible";
|
|
|
3
3
|
import styles from "./collapsible.module.css";
|
|
4
4
|
|
|
5
5
|
export interface CollapsibleProps {
|
|
6
|
+
/** Content rendered inside the toggle button. */
|
|
6
7
|
trigger: ReactNode;
|
|
8
|
+
/** Content revealed when expanded. */
|
|
7
9
|
children: ReactNode;
|
|
10
|
+
/** Whether the panel is initially open (uncontrolled). */
|
|
8
11
|
defaultOpen?: boolean;
|
|
12
|
+
/** Controlled open state. */
|
|
9
13
|
open?: boolean;
|
|
14
|
+
/** Called when the panel opens or closes. */
|
|
10
15
|
onOpenChange?: (open: boolean) => void;
|
|
16
|
+
/** Prevent the panel from being toggled. */
|
|
11
17
|
disabled?: boolean;
|
|
12
18
|
className?: string;
|
|
13
19
|
}
|
|
@@ -20,6 +26,11 @@ function ChevronIcon() {
|
|
|
20
26
|
);
|
|
21
27
|
}
|
|
22
28
|
|
|
29
|
+
/**
|
|
30
|
+
* A single panel toggled by a button. Unlike Accordion it stands alone —
|
|
31
|
+
* ideal for inline FAQ entries, code blocks, or side panels.
|
|
32
|
+
* Animates via `--collapsible-panel-height`.
|
|
33
|
+
*/
|
|
23
34
|
export function Collapsible({ trigger, children, className, onOpenChange, ...props }: CollapsibleProps) {
|
|
24
35
|
return (
|
|
25
36
|
<BaseCollapsible.Root className={`${styles.root} ${className ?? ""}`} onOpenChange={onOpenChange as never} {...props}>
|
|
@@ -26,6 +26,7 @@ export type ContextMenuEntry = ContextMenuItemDef | ContextMenuSeparatorDef | Co
|
|
|
26
26
|
export interface ContextMenuProps {
|
|
27
27
|
/** The element that can be right-clicked / long-pressed to open the menu. */
|
|
28
28
|
children: ReactElement;
|
|
29
|
+
/** Array of menu entries: items, separators, and groups. */
|
|
29
30
|
items: ContextMenuEntry[];
|
|
30
31
|
className?: string;
|
|
31
32
|
}
|
|
@@ -40,6 +41,10 @@ function RenderItem({ item, i }: { item: ContextMenuItemDef; i: number }) {
|
|
|
40
41
|
);
|
|
41
42
|
}
|
|
42
43
|
|
|
44
|
+
/**
|
|
45
|
+
* A menu that appears at the pointer on right-click or long press. Supports
|
|
46
|
+
* items, separators, groups, keyboard shortcuts, and disabled states.
|
|
47
|
+
*/
|
|
43
48
|
export function ContextMenu({ children, items, className }: ContextMenuProps) {
|
|
44
49
|
return (
|
|
45
50
|
<BaseContextMenu.Root>
|
package/src/dialog/dialog.tsx
CHANGED
|
@@ -3,12 +3,17 @@ import { Dialog as BaseDialog } from "@base-ui/react/dialog";
|
|
|
3
3
|
import styles from "./dialog.module.css";
|
|
4
4
|
|
|
5
5
|
export interface DialogProps {
|
|
6
|
+
/** Controlled open state. */
|
|
6
7
|
open?: boolean;
|
|
8
|
+
/** Whether the dialog is initially open (uncontrolled). */
|
|
7
9
|
defaultOpen?: boolean;
|
|
8
|
-
/** `eventDetails` is the base-ui event details object. */
|
|
10
|
+
/** Called when the dialog opens or closes. `eventDetails` is the base-ui event details object. */
|
|
9
11
|
onOpenChange?: (open: boolean, eventDetails: unknown) => void;
|
|
12
|
+
/** Element that opens the dialog when clicked. */
|
|
10
13
|
trigger?: ReactElement;
|
|
14
|
+
/** Heading rendered at the top of the dialog. */
|
|
11
15
|
title?: ReactNode;
|
|
16
|
+
/** Supplementary text below the title. */
|
|
12
17
|
description?: ReactNode;
|
|
13
18
|
children?: ReactNode;
|
|
14
19
|
/** Buttons aligned to the right (cancel, confirm). */
|
|
@@ -20,6 +25,7 @@ export interface DialogProps {
|
|
|
20
25
|
*/
|
|
21
26
|
footerStart?: ReactNode;
|
|
22
27
|
className?: string;
|
|
28
|
+
/** Whether the dialog can be closed by clicking the backdrop or pressing Escape. @default true */
|
|
23
29
|
dismissible?: boolean;
|
|
24
30
|
}
|
|
25
31
|
|
|
@@ -31,6 +37,12 @@ function XIcon() {
|
|
|
31
37
|
);
|
|
32
38
|
}
|
|
33
39
|
|
|
40
|
+
/**
|
|
41
|
+
* Modal overlay dialog with title, description, body, and footer slots.
|
|
42
|
+
* Wraps `@base-ui/react` Dialog with a pre-styled backdrop, popup, and
|
|
43
|
+
* close button. Use `footerStart` for a macOS-style left-aligned
|
|
44
|
+
* destructive action.
|
|
45
|
+
*/
|
|
34
46
|
export function Dialog({
|
|
35
47
|
trigger,
|
|
36
48
|
title,
|
package/src/drawer/drawer.tsx
CHANGED
|
@@ -9,17 +9,23 @@ export interface DrawerProps {
|
|
|
9
9
|
trigger?: ReactElement;
|
|
10
10
|
/** Which edge the drawer slides in from. @default "right" */
|
|
11
11
|
side?: DrawerSide;
|
|
12
|
+
/** Heading rendered at the top of the drawer. */
|
|
12
13
|
title?: ReactNode;
|
|
14
|
+
/** Supplementary text below the title. */
|
|
13
15
|
description?: ReactNode;
|
|
14
16
|
children?: ReactNode;
|
|
17
|
+
/** Content rendered at the bottom of the drawer. */
|
|
15
18
|
footer?: ReactNode;
|
|
16
19
|
/** Show a drag handle bar (useful for bottom/top drawers). @default true for bottom/top */
|
|
17
20
|
handleBar?: boolean;
|
|
18
21
|
/** Show a close button in the top-right corner. @default true */
|
|
19
22
|
dismissible?: boolean;
|
|
20
23
|
|
|
24
|
+
/** Controlled open state. */
|
|
21
25
|
open?: boolean;
|
|
26
|
+
/** Whether the drawer is initially open (uncontrolled). */
|
|
22
27
|
defaultOpen?: boolean;
|
|
28
|
+
/** Called when the drawer opens or closes. */
|
|
23
29
|
onOpenChange?: (open: boolean) => void;
|
|
24
30
|
}
|
|
25
31
|
|
|
@@ -47,6 +53,11 @@ const POPUP_CLASS: Record<DrawerSide, string> = {
|
|
|
47
53
|
top: styles["popup-top"] as string,
|
|
48
54
|
};
|
|
49
55
|
|
|
56
|
+
/**
|
|
57
|
+
* A panel that slides in from any edge of the screen with swipe-to-dismiss
|
|
58
|
+
* gestures. Supports left, right, top, and bottom orientations with an
|
|
59
|
+
* optional drag handle bar.
|
|
60
|
+
*/
|
|
50
61
|
export function Drawer({
|
|
51
62
|
trigger,
|
|
52
63
|
side = "right",
|