@becket-ui/react 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/components/Badge.d.ts +22 -0
- package/dist/components/Badge.d.ts.map +1 -0
- package/dist/components/Badge.js +39 -0
- package/dist/components/Badge.js.map +1 -0
- package/dist/components/Button.d.ts +24 -0
- package/dist/components/Button.d.ts.map +1 -0
- package/dist/components/Button.js +46 -0
- package/dist/components/Button.js.map +1 -0
- package/dist/components/Button.test.js +45 -0
- package/dist/components/Button.test.js.map +1 -0
- package/dist/components/Card.d.ts +37 -0
- package/dist/components/Card.d.ts.map +1 -0
- package/dist/components/Card.js +75 -0
- package/dist/components/Card.js.map +1 -0
- package/dist/components/Checkbox.d.ts +14 -0
- package/dist/components/Checkbox.d.ts.map +1 -0
- package/dist/components/Checkbox.js +46 -0
- package/dist/components/Checkbox.js.map +1 -0
- package/dist/components/Dialog.d.ts +41 -0
- package/dist/components/Dialog.d.ts.map +1 -0
- package/dist/components/Dialog.js +173 -0
- package/dist/components/Dialog.js.map +1 -0
- package/dist/components/Dialog.test.js +89 -0
- package/dist/components/Dialog.test.js.map +1 -0
- package/dist/components/Drawer.d.ts +38 -0
- package/dist/components/Drawer.d.ts.map +1 -0
- package/dist/components/Drawer.js +174 -0
- package/dist/components/Drawer.js.map +1 -0
- package/dist/components/Drawer.test.js +50 -0
- package/dist/components/Drawer.test.js.map +1 -0
- package/dist/components/Field.d.ts +37 -0
- package/dist/components/Field.d.ts.map +1 -0
- package/dist/components/Field.js +186 -0
- package/dist/components/Field.js.map +1 -0
- package/dist/components/Field.test.js +33 -0
- package/dist/components/Field.test.js.map +1 -0
- package/dist/components/Flex.d.ts +38 -0
- package/dist/components/Flex.d.ts.map +1 -0
- package/dist/components/Flex.js +85 -0
- package/dist/components/Flex.js.map +1 -0
- package/dist/components/Heading.d.ts +14 -0
- package/dist/components/Heading.d.ts.map +1 -0
- package/dist/components/Heading.js +33 -0
- package/dist/components/Heading.js.map +1 -0
- package/dist/components/Hide.d.ts +39 -0
- package/dist/components/Hide.d.ts.map +1 -0
- package/dist/components/Hide.js +51 -0
- package/dist/components/Hide.js.map +1 -0
- package/dist/components/Link.d.ts +14 -0
- package/dist/components/Link.d.ts.map +1 -0
- package/dist/components/Link.js +23 -0
- package/dist/components/Link.js.map +1 -0
- package/dist/components/Menu.d.ts +11 -0
- package/dist/components/Menu.d.ts.map +1 -0
- package/dist/components/Menu.js +132 -0
- package/dist/components/Menu.js.map +1 -0
- package/dist/components/Menu.test.js +69 -0
- package/dist/components/Menu.test.js.map +1 -0
- package/dist/components/Radio.d.ts +38 -0
- package/dist/components/Radio.d.ts.map +1 -0
- package/dist/components/Radio.js +144 -0
- package/dist/components/Radio.js.map +1 -0
- package/dist/components/Select.d.ts +17 -0
- package/dist/components/Select.d.ts.map +1 -0
- package/dist/components/Select.js +33 -0
- package/dist/components/Select.js.map +1 -0
- package/dist/components/Separator.d.ts +14 -0
- package/dist/components/Separator.d.ts.map +1 -0
- package/dist/components/Separator.js +25 -0
- package/dist/components/Separator.js.map +1 -0
- package/dist/components/SimpleGrid.d.ts +26 -0
- package/dist/components/SimpleGrid.d.ts.map +1 -0
- package/dist/components/SimpleGrid.js +98 -0
- package/dist/components/SimpleGrid.js.map +1 -0
- package/dist/components/Spinner.d.ts +10 -0
- package/dist/components/Spinner.d.ts.map +1 -0
- package/dist/components/Spinner.js +25 -0
- package/dist/components/Spinner.js.map +1 -0
- package/dist/components/Stack.d.ts +32 -0
- package/dist/components/Stack.d.ts.map +1 -0
- package/dist/components/Stack.js +81 -0
- package/dist/components/Stack.js.map +1 -0
- package/dist/components/Switch.d.ts +20 -0
- package/dist/components/Switch.d.ts.map +1 -0
- package/dist/components/Switch.js +83 -0
- package/dist/components/Switch.js.map +1 -0
- package/dist/components/Switch.test.js +28 -0
- package/dist/components/Switch.test.js.map +1 -0
- package/dist/components/Table.d.ts +23 -0
- package/dist/components/Table.d.ts.map +1 -0
- package/dist/components/Table.js +90 -0
- package/dist/components/Table.js.map +1 -0
- package/dist/components/Tabs.d.ts +21 -0
- package/dist/components/Tabs.d.ts.map +1 -0
- package/dist/components/Tabs.js +140 -0
- package/dist/components/Tabs.js.map +1 -0
- package/dist/components/Tabs.test.js +41 -0
- package/dist/components/Tabs.test.js.map +1 -0
- package/dist/components/Tag.d.ts +22 -0
- package/dist/components/Tag.d.ts.map +1 -0
- package/dist/components/Tag.js +39 -0
- package/dist/components/Tag.js.map +1 -0
- package/dist/components/Text.d.ts +9 -0
- package/dist/components/Text.d.ts.map +1 -0
- package/dist/components/Text.js +18 -0
- package/dist/components/Text.js.map +1 -0
- package/dist/components/TextField.d.ts +19 -0
- package/dist/components/TextField.d.ts.map +1 -0
- package/dist/components/TextField.js +32 -0
- package/dist/components/TextField.js.map +1 -0
- package/dist/components/Textarea.d.ts +17 -0
- package/dist/components/Textarea.d.ts.map +1 -0
- package/dist/components/Textarea.js +34 -0
- package/dist/components/Textarea.js.map +1 -0
- package/dist/components/Tooltip.d.ts +17 -0
- package/dist/components/Tooltip.d.ts.map +1 -0
- package/dist/components/Tooltip.js +217 -0
- package/dist/components/Tooltip.js.map +1 -0
- package/dist/components/Tooltip.test.js +58 -0
- package/dist/components/Tooltip.test.js.map +1 -0
- package/dist/helpers/gradientBorder.d.ts +5 -0
- package/dist/helpers/gradientBorder.d.ts.map +1 -0
- package/dist/helpers/gradientBorder.js +25 -0
- package/dist/helpers/gradientBorder.js.map +1 -0
- package/dist/helpers/labelColors.d.ts +17 -0
- package/dist/helpers/labelColors.d.ts.map +1 -0
- package/dist/helpers/labelColors.js +54 -0
- package/dist/helpers/labelColors.js.map +1 -0
- package/dist/helpers/nativeDialog.d.ts +23 -0
- package/dist/helpers/nativeDialog.d.ts.map +1 -0
- package/dist/helpers/nativeDialog.js +85 -0
- package/dist/helpers/nativeDialog.js.map +1 -0
- package/dist/helpers/responsive.d.ts +63 -0
- package/dist/helpers/responsive.d.ts.map +1 -0
- package/dist/helpers/responsive.js +78 -0
- package/dist/helpers/responsive.js.map +1 -0
- package/dist/helpers/storybookControls.d.ts +16 -0
- package/dist/helpers/storybookControls.d.ts.map +1 -0
- package/dist/helpers/storybookControls.js +40 -0
- package/dist/helpers/storybookControls.js.map +1 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +158 -0
- package/dist/index.js.map +1 -0
- package/package.json +79 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef } from "react";
|
|
3
|
+
import { css } from "@becket-ui/tokens/css";
|
|
4
|
+
import { grid } from "@becket-ui/tokens/patterns";
|
|
5
|
+
import { normalizeGapValue, normalizeResponsiveValue } from "../helpers/responsive";
|
|
6
|
+
function mergeClassName(...classes) {
|
|
7
|
+
return classes.filter(Boolean).join(" ");
|
|
8
|
+
}
|
|
9
|
+
function columnCountToTemplate(count) {
|
|
10
|
+
return `repeat(${count}, minmax(0, 1fr))`;
|
|
11
|
+
}
|
|
12
|
+
function resolveGridTemplateColumns(columns) {
|
|
13
|
+
const resolved = normalizeResponsiveValue(columns);
|
|
14
|
+
if (typeof resolved === "number") {
|
|
15
|
+
return columnCountToTemplate(resolved);
|
|
16
|
+
}
|
|
17
|
+
if (Array.isArray(resolved)) {
|
|
18
|
+
return resolved.map((value) => value == null ? void 0 : columnCountToTemplate(value));
|
|
19
|
+
}
|
|
20
|
+
if (typeof resolved === "object" && resolved !== null) {
|
|
21
|
+
const out = {};
|
|
22
|
+
for (const [breakpoint, value] of Object.entries(resolved)) {
|
|
23
|
+
if (typeof value === "number") out[breakpoint] = columnCountToTemplate(value);
|
|
24
|
+
}
|
|
25
|
+
return out;
|
|
26
|
+
}
|
|
27
|
+
return void 0;
|
|
28
|
+
}
|
|
29
|
+
function buildGridStyles({
|
|
30
|
+
columns,
|
|
31
|
+
minChildWidth,
|
|
32
|
+
gap = "md",
|
|
33
|
+
rowGap,
|
|
34
|
+
columnGap
|
|
35
|
+
}) {
|
|
36
|
+
if (columns != null) {
|
|
37
|
+
return {
|
|
38
|
+
display: "grid",
|
|
39
|
+
gridTemplateColumns: resolveGridTemplateColumns(columns),
|
|
40
|
+
gap,
|
|
41
|
+
...rowGap != null && { rowGap },
|
|
42
|
+
...columnGap != null && { columnGap }
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
return grid.raw({
|
|
46
|
+
...minChildWidth != null && { minChildWidth },
|
|
47
|
+
gap,
|
|
48
|
+
...rowGap != null && { rowGap },
|
|
49
|
+
...columnGap != null && { columnGap }
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
const SimpleGrid = forwardRef(
|
|
53
|
+
({
|
|
54
|
+
columns,
|
|
55
|
+
minChildWidth,
|
|
56
|
+
gap = "md",
|
|
57
|
+
rowGap,
|
|
58
|
+
columnGap,
|
|
59
|
+
as: Component = "div",
|
|
60
|
+
className,
|
|
61
|
+
style,
|
|
62
|
+
...props
|
|
63
|
+
}, ref) => {
|
|
64
|
+
const recipeClassName = css(
|
|
65
|
+
buildGridStyles({
|
|
66
|
+
columns,
|
|
67
|
+
minChildWidth,
|
|
68
|
+
gap: normalizeGapValue(gap),
|
|
69
|
+
rowGap: normalizeGapValue(rowGap),
|
|
70
|
+
columnGap: normalizeGapValue(columnGap)
|
|
71
|
+
}),
|
|
72
|
+
{
|
|
73
|
+
width: "100%",
|
|
74
|
+
justifyItems: "stretch",
|
|
75
|
+
alignItems: "stretch",
|
|
76
|
+
"& > *": {
|
|
77
|
+
minWidth: "0",
|
|
78
|
+
width: "100%",
|
|
79
|
+
maxWidth: "100%"
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
);
|
|
83
|
+
return /* @__PURE__ */ jsx(
|
|
84
|
+
Component,
|
|
85
|
+
{
|
|
86
|
+
ref,
|
|
87
|
+
...props,
|
|
88
|
+
style,
|
|
89
|
+
className: mergeClassName(recipeClassName, className)
|
|
90
|
+
}
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
);
|
|
94
|
+
SimpleGrid.displayName = "SimpleGrid";
|
|
95
|
+
export {
|
|
96
|
+
SimpleGrid
|
|
97
|
+
};
|
|
98
|
+
//# sourceMappingURL=SimpleGrid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/SimpleGrid.tsx"],"sourcesContent":["import { forwardRef, type ComponentPropsWithoutRef, type ElementType } from 'react';\nimport { css } from '@becket-ui/tokens/css';\nimport { grid } from '@becket-ui/tokens/patterns';\nimport type { SystemStyleObject } from '@becket-ui/tokens/types';\n\nimport { normalizeGapValue, normalizeResponsiveValue, type GapValue, type ResponsiveValue } from '../helpers/responsive';\n\ntype GridOptions = NonNullable<Parameters<typeof grid>[0]>;\ntype ColumnCount = NonNullable<GridOptions['columns']>;\n\nfunction mergeClassName(...classes: (string | undefined)[]): string {\n return classes.filter(Boolean).join(' ');\n}\n\nfunction columnCountToTemplate(count: number): string {\n return `repeat(${count}, minmax(0, 1fr))`;\n}\n\nfunction resolveGridTemplateColumns(columns: ColumnCount): SystemStyleObject['gridTemplateColumns'] {\n const resolved = normalizeResponsiveValue(columns) as ColumnCount;\n if (typeof resolved === 'number') {\n return columnCountToTemplate(resolved);\n }\n if (Array.isArray(resolved)) {\n return resolved.map((value) => (value == null ? undefined : columnCountToTemplate(value)));\n }\n if (typeof resolved === 'object' && resolved !== null) {\n const out: Record<string, string> = {};\n for (const [breakpoint, value] of Object.entries(resolved)) {\n if (typeof value === 'number') out[breakpoint] = columnCountToTemplate(value);\n }\n return out;\n }\n return undefined;\n}\n\nfunction buildGridStyles({\n columns,\n minChildWidth,\n gap = 'md',\n rowGap,\n columnGap,\n}: {\n columns?: GridOptions['columns'];\n minChildWidth?: GridOptions['minChildWidth'];\n gap?: GridOptions['gap'];\n rowGap?: GridOptions['rowGap'];\n columnGap?: GridOptions['columnGap'];\n}): SystemStyleObject {\n if (columns != null) {\n return {\n display: 'grid',\n gridTemplateColumns: resolveGridTemplateColumns(columns),\n gap,\n ...(rowGap != null && { rowGap }),\n ...(columnGap != null && { columnGap }),\n };\n }\n\n return grid.raw({\n ...(minChildWidth != null && { minChildWidth }),\n gap,\n ...(rowGap != null && { rowGap }),\n ...(columnGap != null && { columnGap }),\n });\n}\n\nexport type SimpleGridProps = ComponentPropsWithoutRef<'div'> & {\n columns?: ResponsiveValue<number> | GridOptions['columns'];\n minChildWidth?: GridOptions['minChildWidth'];\n gap?: GapValue;\n rowGap?: GapValue;\n columnGap?: GapValue;\n as?: ElementType;\n};\n\n/**\n * Responsive CSS grid layout. Pass `columns` (number or breakpoint object)\n * or `minChildWidth` for auto-fit tracks. App-specific presets belong in consumers.\n */\nexport const SimpleGrid = forwardRef<HTMLDivElement, SimpleGridProps>(\n (\n {\n columns,\n minChildWidth,\n gap = 'md',\n rowGap,\n columnGap,\n as: Component = 'div',\n className,\n style,\n ...props\n },\n ref,\n ) => {\n const recipeClassName = css(\n buildGridStyles({\n columns,\n minChildWidth,\n gap: normalizeGapValue(gap) as GridOptions['gap'],\n rowGap: normalizeGapValue(rowGap) as GridOptions['rowGap'],\n columnGap: normalizeGapValue(columnGap) as GridOptions['columnGap'],\n }),\n {\n width: '100%',\n justifyItems: 'stretch',\n alignItems: 'stretch',\n '& > *': {\n minWidth: '0',\n width: '100%',\n maxWidth: '100%',\n },\n },\n );\n\n return (\n <Component\n ref={ref}\n {...props}\n style={style}\n className={mergeClassName(recipeClassName, className)}\n />\n );\n },\n);\n\nSimpleGrid.displayName = 'SimpleGrid';\n"],"mappings":"AAoHM;AApHN,SAAS,kBAAmE;AAC5E,SAAS,WAAW;AACpB,SAAS,YAAY;AAGrB,SAAS,mBAAmB,gCAAqE;AAKjG,SAAS,kBAAkB,SAAyC;AAClE,SAAO,QAAQ,OAAO,OAAO,EAAE,KAAK,GAAG;AACzC;AAEA,SAAS,sBAAsB,OAAuB;AACpD,SAAO,UAAU,KAAK;AACxB;AAEA,SAAS,2BAA2B,SAAgE;AAClG,QAAM,WAAW,yBAAyB,OAAO;AACjD,MAAI,OAAO,aAAa,UAAU;AAChC,WAAO,sBAAsB,QAAQ;AAAA,EACvC;AACA,MAAI,MAAM,QAAQ,QAAQ,GAAG;AAC3B,WAAO,SAAS,IAAI,CAAC,UAAW,SAAS,OAAO,SAAY,sBAAsB,KAAK,CAAE;AAAA,EAC3F;AACA,MAAI,OAAO,aAAa,YAAY,aAAa,MAAM;AACrD,UAAM,MAA8B,CAAC;AACrC,eAAW,CAAC,YAAY,KAAK,KAAK,OAAO,QAAQ,QAAQ,GAAG;AAC1D,UAAI,OAAO,UAAU,SAAU,KAAI,UAAU,IAAI,sBAAsB,KAAK;AAAA,IAC9E;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB;AAAA,EACvB;AAAA,EACA;AAAA,EACA,MAAM;AAAA,EACN;AAAA,EACA;AACF,GAMsB;AACpB,MAAI,WAAW,MAAM;AACnB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,qBAAqB,2BAA2B,OAAO;AAAA,MACvD;AAAA,MACA,GAAI,UAAU,QAAQ,EAAE,OAAO;AAAA,MAC/B,GAAI,aAAa,QAAQ,EAAE,UAAU;AAAA,IACvC;AAAA,EACF;AAEA,SAAO,KAAK,IAAI;AAAA,IACd,GAAI,iBAAiB,QAAQ,EAAE,cAAc;AAAA,IAC7C;AAAA,IACA,GAAI,UAAU,QAAQ,EAAE,OAAO;AAAA,IAC/B,GAAI,aAAa,QAAQ,EAAE,UAAU;AAAA,EACvC,CAAC;AACH;AAeO,MAAM,aAAa;AAAA,EACxB,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA,IAAI,YAAY;AAAA,IAChB;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AACH,UAAM,kBAAkB;AAAA,MACtB,gBAAgB;AAAA,QACd;AAAA,QACA;AAAA,QACA,KAAK,kBAAkB,GAAG;AAAA,QAC1B,QAAQ,kBAAkB,MAAM;AAAA,QAChC,WAAW,kBAAkB,SAAS;AAAA,MACxC,CAAC;AAAA,MACD;AAAA,QACE,OAAO;AAAA,QACP,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,SAAS;AAAA,UACP,UAAU;AAAA,UACV,OAAO;AAAA,UACP,UAAU;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AAEA,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACC,GAAG;AAAA,QACJ;AAAA,QACA,WAAW,eAAe,iBAAiB,SAAS;AAAA;AAAA,IACtD;AAAA,EAEJ;AACF;AAEA,WAAW,cAAc;","names":[]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type ComponentPropsWithoutRef } from 'react';
|
|
2
|
+
type SpinnerSize = 'sm' | 'md' | 'lg';
|
|
3
|
+
export type SpinnerProps = ComponentPropsWithoutRef<'span'> & {
|
|
4
|
+
size?: SpinnerSize;
|
|
5
|
+
};
|
|
6
|
+
export declare const Spinner: import("react").ForwardRefExoticComponent<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLSpanElement>, HTMLSpanElement>, "ref"> & {
|
|
7
|
+
size?: SpinnerSize;
|
|
8
|
+
} & import("react").RefAttributes<HTMLSpanElement>>;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=Spinner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Spinner.d.ts","sourceRoot":"","sources":["../../src/components/Spinner.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,wBAAwB,EAAE,MAAM,OAAO,CAAC;AAGlE,KAAK,WAAW,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAEtC,MAAM,MAAM,YAAY,GAAG,wBAAwB,CAAC,MAAM,CAAC,GAAG;IAC5D,IAAI,CAAC,EAAE,WAAW,CAAC;CACpB,CAAC;AAMF,eAAO,MAAM,OAAO;WAPX,WAAW;mDAmBnB,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef } from "react";
|
|
3
|
+
import { spinner as spinnerRecipe } from "@becket-ui/tokens/recipes";
|
|
4
|
+
function mergeClassName(...classes) {
|
|
5
|
+
return classes.filter(Boolean).join(" ");
|
|
6
|
+
}
|
|
7
|
+
const Spinner = forwardRef(
|
|
8
|
+
({ size = "md", className, ...props }, ref) => {
|
|
9
|
+
return /* @__PURE__ */ jsx(
|
|
10
|
+
"span",
|
|
11
|
+
{
|
|
12
|
+
ref,
|
|
13
|
+
role: "status",
|
|
14
|
+
...props,
|
|
15
|
+
"aria-label": props["aria-label"] ?? "Loading",
|
|
16
|
+
className: mergeClassName(spinnerRecipe({ size }), className)
|
|
17
|
+
}
|
|
18
|
+
);
|
|
19
|
+
}
|
|
20
|
+
);
|
|
21
|
+
Spinner.displayName = "Spinner";
|
|
22
|
+
export {
|
|
23
|
+
Spinner
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=Spinner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/Spinner.tsx"],"sourcesContent":["import { forwardRef, type ComponentPropsWithoutRef } from 'react';\nimport { spinner as spinnerRecipe } from '@becket-ui/tokens/recipes';\n\ntype SpinnerSize = 'sm' | 'md' | 'lg';\n\nexport type SpinnerProps = ComponentPropsWithoutRef<'span'> & {\n size?: SpinnerSize;\n};\n\nfunction mergeClassName(...classes: (string | undefined)[]): string {\n return classes.filter(Boolean).join(' ');\n}\n\nexport const Spinner = forwardRef<HTMLSpanElement, SpinnerProps>(\n ({ size = 'md', className, ...props }, ref) => {\n return (\n <span\n ref={ref}\n role=\"status\"\n {...props}\n aria-label={props['aria-label'] ?? 'Loading'}\n className={mergeClassName(spinnerRecipe({ size }), className)}\n />\n );\n },\n);\n\nSpinner.displayName = 'Spinner';\n"],"mappings":"AAgBM;AAhBN,SAAS,kBAAiD;AAC1D,SAAS,WAAW,qBAAqB;AAQzC,SAAS,kBAAkB,SAAyC;AAClE,SAAO,QAAQ,OAAO,OAAO,EAAE,KAAK,GAAG;AACzC;AAEO,MAAM,UAAU;AAAA,EACrB,CAAC,EAAE,OAAO,MAAM,WAAW,GAAG,MAAM,GAAG,QAAQ;AAC7C,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,MAAK;AAAA,QACJ,GAAG;AAAA,QACJ,cAAY,MAAM,YAAY,KAAK;AAAA,QACnC,WAAW,eAAe,cAAc,EAAE,KAAK,CAAC,GAAG,SAAS;AAAA;AAAA,IAC9D;AAAA,EAEJ;AACF;AAEA,QAAQ,cAAc;","names":[]}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { type ComponentPropsWithoutRef, type ElementType } from 'react';
|
|
2
|
+
import { stack } from '@becket-ui/tokens/patterns';
|
|
3
|
+
import { type GradientBorderToken } from '../helpers/gradientBorder';
|
|
4
|
+
import { type GapValue, type ResponsiveValue } from '../helpers/responsive';
|
|
5
|
+
type StackOptions = NonNullable<Parameters<typeof stack>[0]>;
|
|
6
|
+
type AlignVariant = 'start' | 'center' | 'end' | 'stretch' | 'baseline';
|
|
7
|
+
type JustifyVariant = 'start' | 'center' | 'end' | 'between' | 'around' | 'evenly';
|
|
8
|
+
type BorderProp = StackOptions['border'] | GradientBorderToken;
|
|
9
|
+
export type StackProps = ComponentPropsWithoutRef<'div'> & {
|
|
10
|
+
direction?: StackOptions['direction'];
|
|
11
|
+
gap?: GapValue;
|
|
12
|
+
align?: AlignVariant;
|
|
13
|
+
justify?: JustifyVariant;
|
|
14
|
+
border?: BorderProp;
|
|
15
|
+
/** Flex/grid order — responsive object supported. */
|
|
16
|
+
order?: ResponsiveValue<number>;
|
|
17
|
+
as?: ElementType;
|
|
18
|
+
};
|
|
19
|
+
export declare const Stack: import("react").ForwardRefExoticComponent<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & {
|
|
20
|
+
direction?: StackOptions['direction'];
|
|
21
|
+
gap?: GapValue;
|
|
22
|
+
align?: AlignVariant;
|
|
23
|
+
justify?: JustifyVariant;
|
|
24
|
+
border?: BorderProp;
|
|
25
|
+
/** Flex/grid order — responsive object supported. */
|
|
26
|
+
order?: ResponsiveValue<number>;
|
|
27
|
+
as?: ElementType;
|
|
28
|
+
} & import("react").RefAttributes<HTMLDivElement>>;
|
|
29
|
+
export declare const HStack: import("react").ForwardRefExoticComponent<Omit<StackProps, "direction"> & import("react").RefAttributes<HTMLDivElement>>;
|
|
30
|
+
export declare const VStack: import("react").ForwardRefExoticComponent<Omit<StackProps, "direction"> & import("react").RefAttributes<HTMLDivElement>>;
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=Stack.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Stack.d.ts","sourceRoot":"","sources":["../../src/components/Stack.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,wBAAwB,EAAE,KAAK,WAAW,EAAE,MAAM,OAAO,CAAC;AAEpF,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAC;AACnD,OAAO,EAGL,KAAK,mBAAmB,EACzB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAA+C,KAAK,QAAQ,EAAE,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAEzH,KAAK,YAAY,GAAG,WAAW,CAAC,UAAU,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7D,KAAK,YAAY,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,GAAG,UAAU,CAAC;AACxE,KAAK,cAAc,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC;AACnF,KAAK,UAAU,GAAG,YAAY,CAAC,QAAQ,CAAC,GAAG,mBAAmB,CAAC;AAuB/D,MAAM,MAAM,UAAU,GAAG,wBAAwB,CAAC,KAAK,CAAC,GAAG;IACzD,SAAS,CAAC,EAAE,YAAY,CAAC,WAAW,CAAC,CAAC;IACtC,GAAG,CAAC,EAAE,QAAQ,CAAC;IACf,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,qDAAqD;IACrD,KAAK,CAAC,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;IAChC,EAAE,CAAC,EAAE,WAAW,CAAC;CAClB,CAAC;AAEF,eAAO,MAAM,KAAK;gBAVJ,YAAY,CAAC,WAAW,CAAC;UAC/B,QAAQ;YACN,YAAY;cACV,cAAc;aACf,UAAU;IACnB,qDAAqD;YAC7C,eAAe,CAAC,MAAM,CAAC;SAC1B,WAAW;kDAoDjB,CAAC;AAIF,eAAO,MAAM,MAAM,0HAEjB,CAAC;AAGH,eAAO,MAAM,MAAM,0HAEjB,CAAC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef } from "react";
|
|
3
|
+
import { css } from "@becket-ui/tokens/css";
|
|
4
|
+
import { stack } from "@becket-ui/tokens/patterns";
|
|
5
|
+
import {
|
|
6
|
+
getGradientBorderClassName,
|
|
7
|
+
isGradientBorderToken
|
|
8
|
+
} from "../helpers/gradientBorder";
|
|
9
|
+
import { normalizeGapValue, normalizeResponsiveValue } from "../helpers/responsive";
|
|
10
|
+
const ALIGN_MAP = {
|
|
11
|
+
start: "start",
|
|
12
|
+
center: "center",
|
|
13
|
+
end: "end",
|
|
14
|
+
stretch: "stretch",
|
|
15
|
+
baseline: "baseline"
|
|
16
|
+
};
|
|
17
|
+
const JUSTIFY_MAP = {
|
|
18
|
+
start: "start",
|
|
19
|
+
center: "center",
|
|
20
|
+
end: "end",
|
|
21
|
+
between: "space-between",
|
|
22
|
+
around: "space-around",
|
|
23
|
+
evenly: "space-evenly"
|
|
24
|
+
};
|
|
25
|
+
function mergeClassName(...classes) {
|
|
26
|
+
return classes.filter(Boolean).join(" ");
|
|
27
|
+
}
|
|
28
|
+
const Stack = forwardRef(
|
|
29
|
+
({
|
|
30
|
+
direction = "column",
|
|
31
|
+
gap = "md",
|
|
32
|
+
align,
|
|
33
|
+
justify,
|
|
34
|
+
border,
|
|
35
|
+
order,
|
|
36
|
+
as: Component = "div",
|
|
37
|
+
className,
|
|
38
|
+
style,
|
|
39
|
+
...props
|
|
40
|
+
}, ref) => {
|
|
41
|
+
const isGradientBorder = isGradientBorderToken(border);
|
|
42
|
+
const resolvedGap = normalizeGapValue(gap);
|
|
43
|
+
const resolvedDirection = normalizeResponsiveValue(direction);
|
|
44
|
+
const resolvedOrder = order != null ? normalizeResponsiveValue(order) : void 0;
|
|
45
|
+
const recipeClassName = css({
|
|
46
|
+
...stack.raw({
|
|
47
|
+
direction: resolvedDirection,
|
|
48
|
+
gap: resolvedGap,
|
|
49
|
+
...align && { align: ALIGN_MAP[align] },
|
|
50
|
+
...justify && { justify: JUSTIFY_MAP[justify] },
|
|
51
|
+
...border && !isGradientBorder && { border }
|
|
52
|
+
}),
|
|
53
|
+
...resolvedOrder != null && { order: resolvedOrder }
|
|
54
|
+
});
|
|
55
|
+
const gradientBorderClassName = isGradientBorder ? getGradientBorderClassName(border) : void 0;
|
|
56
|
+
return /* @__PURE__ */ jsx(
|
|
57
|
+
Component,
|
|
58
|
+
{
|
|
59
|
+
ref,
|
|
60
|
+
...props,
|
|
61
|
+
style,
|
|
62
|
+
className: mergeClassName(
|
|
63
|
+
recipeClassName,
|
|
64
|
+
gradientBorderClassName,
|
|
65
|
+
className
|
|
66
|
+
)
|
|
67
|
+
}
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
);
|
|
71
|
+
Stack.displayName = "Stack";
|
|
72
|
+
const HStack = forwardRef((props, ref) => /* @__PURE__ */ jsx(Stack, { ref, direction: "row", ...props }));
|
|
73
|
+
HStack.displayName = "HStack";
|
|
74
|
+
const VStack = forwardRef((props, ref) => /* @__PURE__ */ jsx(Stack, { ref, direction: "column", ...props }));
|
|
75
|
+
VStack.displayName = "VStack";
|
|
76
|
+
export {
|
|
77
|
+
HStack,
|
|
78
|
+
Stack,
|
|
79
|
+
VStack
|
|
80
|
+
};
|
|
81
|
+
//# sourceMappingURL=Stack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/Stack.tsx"],"sourcesContent":["import { forwardRef, type ComponentPropsWithoutRef, type ElementType } from 'react';\nimport { css } from '@becket-ui/tokens/css';\nimport { stack } from '@becket-ui/tokens/patterns';\nimport {\n getGradientBorderClassName,\n isGradientBorderToken,\n type GradientBorderToken,\n} from '../helpers/gradientBorder';\nimport { normalizeGapValue, normalizeResponsiveValue, type GapValue, type ResponsiveValue } from '../helpers/responsive';\n\ntype StackOptions = NonNullable<Parameters<typeof stack>[0]>;\ntype AlignVariant = 'start' | 'center' | 'end' | 'stretch' | 'baseline';\ntype JustifyVariant = 'start' | 'center' | 'end' | 'between' | 'around' | 'evenly';\ntype BorderProp = StackOptions['border'] | GradientBorderToken;\n\nconst ALIGN_MAP: Record<AlignVariant, string> = {\n start: 'start',\n center: 'center',\n end: 'end',\n stretch: 'stretch',\n baseline: 'baseline',\n};\n\nconst JUSTIFY_MAP: Record<JustifyVariant, string> = {\n start: 'start',\n center: 'center',\n end: 'end',\n between: 'space-between',\n around: 'space-around',\n evenly: 'space-evenly',\n};\n\nfunction mergeClassName(...classes: (string | undefined)[]): string {\n return classes.filter(Boolean).join(' ');\n}\n\nexport type StackProps = ComponentPropsWithoutRef<'div'> & {\n direction?: StackOptions['direction'];\n gap?: GapValue;\n align?: AlignVariant;\n justify?: JustifyVariant;\n border?: BorderProp;\n /** Flex/grid order — responsive object supported. */\n order?: ResponsiveValue<number>;\n as?: ElementType;\n};\n\nexport const Stack = forwardRef<HTMLDivElement, StackProps>(\n (\n {\n direction = 'column',\n gap = 'md',\n align,\n justify,\n border,\n order,\n as: Component = 'div',\n className,\n style,\n ...props\n },\n ref,\n ) => {\n const isGradientBorder = isGradientBorderToken(border);\n const resolvedGap = normalizeGapValue(gap);\n const resolvedDirection = normalizeResponsiveValue(direction);\n const resolvedOrder = order != null ? normalizeResponsiveValue(order) : undefined;\n\n const recipeClassName = css({\n ...stack.raw({\n direction: resolvedDirection as StackOptions['direction'],\n gap: resolvedGap as StackOptions['gap'],\n ...(align && { align: ALIGN_MAP[align] }),\n ...(justify && { justify: JUSTIFY_MAP[justify] }),\n ...(border && !isGradientBorder && { border }),\n }),\n ...(resolvedOrder != null && { order: resolvedOrder }),\n });\n\n const gradientBorderClassName = isGradientBorder\n ? getGradientBorderClassName(border)\n : undefined;\n\n return (\n <Component\n ref={ref}\n {...props}\n style={style}\n className={mergeClassName(\n recipeClassName,\n gradientBorderClassName,\n className,\n )}\n />\n );\n },\n);\n\nStack.displayName = 'Stack';\n\nexport const HStack = forwardRef<HTMLDivElement, Omit<StackProps, 'direction'>>((props, ref) => (\n <Stack ref={ref} direction=\"row\" {...props} />\n));\nHStack.displayName = 'HStack';\n\nexport const VStack = forwardRef<HTMLDivElement, Omit<StackProps, 'direction'>>((props, ref) => (\n <Stack ref={ref} direction=\"column\" {...props} />\n));\nVStack.displayName = 'VStack';\n"],"mappings":"AAoFM;AApFN,SAAS,kBAAmE;AAC5E,SAAS,WAAW;AACpB,SAAS,aAAa;AACtB;AAAA,EACE;AAAA,EACA;AAAA,OAEK;AACP,SAAS,mBAAmB,gCAAqE;AAOjG,MAAM,YAA0C;AAAA,EAC9C,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,SAAS;AAAA,EACT,UAAU;AACZ;AAEA,MAAM,cAA8C;AAAA,EAClD,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AACV;AAEA,SAAS,kBAAkB,SAAyC;AAClE,SAAO,QAAQ,OAAO,OAAO,EAAE,KAAK,GAAG;AACzC;AAaO,MAAM,QAAQ;AAAA,EACnB,CACE;AAAA,IACE,YAAY;AAAA,IACZ,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,IAAI,YAAY;AAAA,IAChB;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AACH,UAAM,mBAAmB,sBAAsB,MAAM;AACrD,UAAM,cAAc,kBAAkB,GAAG;AACzC,UAAM,oBAAoB,yBAAyB,SAAS;AAC5D,UAAM,gBAAgB,SAAS,OAAO,yBAAyB,KAAK,IAAI;AAExE,UAAM,kBAAkB,IAAI;AAAA,MAC1B,GAAG,MAAM,IAAI;AAAA,QACX,WAAW;AAAA,QACX,KAAK;AAAA,QACL,GAAI,SAAS,EAAE,OAAO,UAAU,KAAK,EAAE;AAAA,QACvC,GAAI,WAAW,EAAE,SAAS,YAAY,OAAO,EAAE;AAAA,QAC/C,GAAI,UAAU,CAAC,oBAAoB,EAAE,OAAO;AAAA,MAC9C,CAAC;AAAA,MACD,GAAI,iBAAiB,QAAQ,EAAE,OAAO,cAAc;AAAA,IACtD,CAAC;AAED,UAAM,0BAA0B,mBAC5B,2BAA2B,MAAM,IACjC;AAEJ,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACC,GAAG;AAAA,QACJ;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AAEA,MAAM,cAAc;AAEb,MAAM,SAAS,WAA0D,CAAC,OAAO,QACtF,oBAAC,SAAM,KAAU,WAAU,OAAO,GAAG,OAAO,CAC7C;AACD,OAAO,cAAc;AAEd,MAAM,SAAS,WAA0D,CAAC,OAAO,QACtF,oBAAC,SAAM,KAAU,WAAU,UAAU,GAAG,OAAO,CAChD;AACD,OAAO,cAAc;","names":[]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type ButtonHTMLAttributes, type ReactNode } from 'react';
|
|
2
|
+
type SwitchSize = 'sm' | 'md' | 'lg';
|
|
3
|
+
export type SwitchProps = Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'onChange' | 'role'> & {
|
|
4
|
+
checked?: boolean;
|
|
5
|
+
defaultChecked?: boolean;
|
|
6
|
+
onCheckedChange?: (checked: boolean) => void;
|
|
7
|
+
size?: SwitchSize;
|
|
8
|
+
/** Visible name. Prefer this over a control-only `aria-label`. */
|
|
9
|
+
label?: ReactNode;
|
|
10
|
+
};
|
|
11
|
+
export declare const Switch: import("react").ForwardRefExoticComponent<Omit<ButtonHTMLAttributes<HTMLButtonElement>, "onChange" | "role"> & {
|
|
12
|
+
checked?: boolean;
|
|
13
|
+
defaultChecked?: boolean;
|
|
14
|
+
onCheckedChange?: (checked: boolean) => void;
|
|
15
|
+
size?: SwitchSize;
|
|
16
|
+
/** Visible name. Prefer this over a control-only `aria-label`. */
|
|
17
|
+
label?: ReactNode;
|
|
18
|
+
} & import("react").RefAttributes<HTMLButtonElement>>;
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=Switch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Switch.d.ts","sourceRoot":"","sources":["../../src/components/Switch.tsx"],"names":[],"mappings":"AAEA,OAAO,EAKL,KAAK,oBAAoB,EAEzB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAGf,KAAK,UAAU,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAErC,MAAM,MAAM,WAAW,GAAG,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC,GAAG;IAC7F,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7C,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,kEAAkE;IAClE,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB,CAAC;AAMF,eAAO,MAAM,MAAM;cAZP,OAAO;qBACA,OAAO;sBACN,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI;WACrC,UAAU;IACjB,kEAAkE;YAC1D,SAAS;qDAuFlB,CAAC"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import {
|
|
4
|
+
forwardRef,
|
|
5
|
+
useCallback,
|
|
6
|
+
useId,
|
|
7
|
+
useState
|
|
8
|
+
} from "react";
|
|
9
|
+
import { switchRecipe } from "@becket-ui/tokens/recipes";
|
|
10
|
+
function mergeClassName(...classes) {
|
|
11
|
+
return classes.filter(Boolean).join(" ");
|
|
12
|
+
}
|
|
13
|
+
const Switch = forwardRef(
|
|
14
|
+
({
|
|
15
|
+
checked: checkedProp,
|
|
16
|
+
defaultChecked = false,
|
|
17
|
+
onCheckedChange,
|
|
18
|
+
size = "md",
|
|
19
|
+
disabled = false,
|
|
20
|
+
className,
|
|
21
|
+
id: idProp,
|
|
22
|
+
label,
|
|
23
|
+
onClick,
|
|
24
|
+
onKeyDown,
|
|
25
|
+
...props
|
|
26
|
+
}, ref) => {
|
|
27
|
+
const generatedId = useId();
|
|
28
|
+
const id = idProp ?? generatedId;
|
|
29
|
+
const isControlled = checkedProp !== void 0;
|
|
30
|
+
const [uncontrolled, setUncontrolled] = useState(defaultChecked);
|
|
31
|
+
const checked = isControlled ? Boolean(checkedProp) : uncontrolled;
|
|
32
|
+
const setChecked = useCallback(
|
|
33
|
+
(next) => {
|
|
34
|
+
if (!isControlled) setUncontrolled(next);
|
|
35
|
+
onCheckedChange?.(next);
|
|
36
|
+
},
|
|
37
|
+
[isControlled, onCheckedChange]
|
|
38
|
+
);
|
|
39
|
+
const toggle = () => {
|
|
40
|
+
if (disabled) return;
|
|
41
|
+
setChecked(!checked);
|
|
42
|
+
};
|
|
43
|
+
const styles = switchRecipe({ size, checked });
|
|
44
|
+
const control = /* @__PURE__ */ jsx(
|
|
45
|
+
"button",
|
|
46
|
+
{
|
|
47
|
+
ref,
|
|
48
|
+
id,
|
|
49
|
+
type: "button",
|
|
50
|
+
role: "switch",
|
|
51
|
+
"aria-checked": checked,
|
|
52
|
+
disabled,
|
|
53
|
+
className: mergeClassName(styles.root, className),
|
|
54
|
+
...props,
|
|
55
|
+
onClick: (event) => {
|
|
56
|
+
onClick?.(event);
|
|
57
|
+
if (!event.defaultPrevented) toggle();
|
|
58
|
+
},
|
|
59
|
+
onKeyDown: (event) => {
|
|
60
|
+
onKeyDown?.(event);
|
|
61
|
+
if (event.defaultPrevented) return;
|
|
62
|
+
if (event.key === " " || event.key === "Enter") {
|
|
63
|
+
event.preventDefault();
|
|
64
|
+
toggle();
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
children: /* @__PURE__ */ jsx("span", { className: styles.track, "aria-hidden": "true", children: /* @__PURE__ */ jsx("span", { className: styles.thumb }) })
|
|
68
|
+
}
|
|
69
|
+
);
|
|
70
|
+
if (label == null) {
|
|
71
|
+
return control;
|
|
72
|
+
}
|
|
73
|
+
return /* @__PURE__ */ jsxs("span", { className: styles.wrap, children: [
|
|
74
|
+
control,
|
|
75
|
+
/* @__PURE__ */ jsx("label", { className: styles.label, htmlFor: id, children: label })
|
|
76
|
+
] });
|
|
77
|
+
}
|
|
78
|
+
);
|
|
79
|
+
Switch.displayName = "Switch";
|
|
80
|
+
export {
|
|
81
|
+
Switch
|
|
82
|
+
};
|
|
83
|
+
//# sourceMappingURL=Switch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/Switch.tsx"],"sourcesContent":["'use client';\n\nimport {\n forwardRef,\n useCallback,\n useId,\n useState,\n type ButtonHTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n} from 'react';\nimport { switchRecipe } from '@becket-ui/tokens/recipes';\n\ntype SwitchSize = 'sm' | 'md' | 'lg';\n\nexport type SwitchProps = Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'onChange' | 'role'> & {\n checked?: boolean;\n defaultChecked?: boolean;\n onCheckedChange?: (checked: boolean) => void;\n size?: SwitchSize;\n /** Visible name. Prefer this over a control-only `aria-label`. */\n label?: ReactNode;\n};\n\nfunction mergeClassName(...classes: (string | undefined)[]): string {\n return classes.filter(Boolean).join(' ');\n}\n\nexport const Switch = forwardRef<HTMLButtonElement, SwitchProps>(\n (\n {\n checked: checkedProp,\n defaultChecked = false,\n onCheckedChange,\n size = 'md',\n disabled = false,\n className,\n id: idProp,\n label,\n onClick,\n onKeyDown,\n ...props\n },\n ref,\n ) => {\n const generatedId = useId();\n const id = idProp ?? generatedId;\n const isControlled = checkedProp !== undefined;\n const [uncontrolled, setUncontrolled] = useState(defaultChecked);\n const checked = isControlled ? Boolean(checkedProp) : uncontrolled;\n\n const setChecked = useCallback(\n (next: boolean) => {\n if (!isControlled) setUncontrolled(next);\n onCheckedChange?.(next);\n },\n [isControlled, onCheckedChange],\n );\n\n const toggle = () => {\n if (disabled) return;\n setChecked(!checked);\n };\n\n const styles = switchRecipe({ size, checked });\n\n const control = (\n <button\n ref={ref}\n id={id}\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n disabled={disabled}\n className={mergeClassName(styles.root, className)}\n {...props}\n onClick={(event) => {\n onClick?.(event);\n if (!event.defaultPrevented) toggle();\n }}\n onKeyDown={(event: KeyboardEvent<HTMLButtonElement>) => {\n onKeyDown?.(event);\n if (event.defaultPrevented) return;\n if (event.key === ' ' || event.key === 'Enter') {\n event.preventDefault();\n toggle();\n }\n }}\n >\n <span className={styles.track} aria-hidden=\"true\">\n <span className={styles.thumb} />\n </span>\n </button>\n );\n\n if (label == null) {\n return control;\n }\n\n return (\n <span className={styles.wrap}>\n {control}\n <label className={styles.label} htmlFor={id}>\n {label}\n </label>\n </span>\n );\n },\n);\n\nSwitch.displayName = 'Switch';\n"],"mappings":";AA0FU,cAUJ,YAVI;AAxFV;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAIK;AACP,SAAS,oBAAoB;AAa7B,SAAS,kBAAkB,SAAyC;AAClE,SAAO,QAAQ,OAAO,OAAO,EAAE,KAAK,GAAG;AACzC;AAEO,MAAM,SAAS;AAAA,EACpB,CACE;AAAA,IACE,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB;AAAA,IACA,OAAO;AAAA,IACP,WAAW;AAAA,IACX;AAAA,IACA,IAAI;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AACH,UAAM,cAAc,MAAM;AAC1B,UAAM,KAAK,UAAU;AACrB,UAAM,eAAe,gBAAgB;AACrC,UAAM,CAAC,cAAc,eAAe,IAAI,SAAS,cAAc;AAC/D,UAAM,UAAU,eAAe,QAAQ,WAAW,IAAI;AAEtD,UAAM,aAAa;AAAA,MACjB,CAAC,SAAkB;AACjB,YAAI,CAAC,aAAc,iBAAgB,IAAI;AACvC,0BAAkB,IAAI;AAAA,MACxB;AAAA,MACA,CAAC,cAAc,eAAe;AAAA,IAChC;AAEA,UAAM,SAAS,MAAM;AACnB,UAAI,SAAU;AACd,iBAAW,CAAC,OAAO;AAAA,IACrB;AAEA,UAAM,SAAS,aAAa,EAAE,MAAM,QAAQ,CAAC;AAE7C,UAAM,UACJ;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,MAAK;AAAA,QACL,MAAK;AAAA,QACL,gBAAc;AAAA,QACd;AAAA,QACA,WAAW,eAAe,OAAO,MAAM,SAAS;AAAA,QAC/C,GAAG;AAAA,QACJ,SAAS,CAAC,UAAU;AAClB,oBAAU,KAAK;AACf,cAAI,CAAC,MAAM,iBAAkB,QAAO;AAAA,QACtC;AAAA,QACA,WAAW,CAAC,UAA4C;AACtD,sBAAY,KAAK;AACjB,cAAI,MAAM,iBAAkB;AAC5B,cAAI,MAAM,QAAQ,OAAO,MAAM,QAAQ,SAAS;AAC9C,kBAAM,eAAe;AACrB,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,QAEA,8BAAC,UAAK,WAAW,OAAO,OAAO,eAAY,QACzC,8BAAC,UAAK,WAAW,OAAO,OAAO,GACjC;AAAA;AAAA,IACF;AAGF,QAAI,SAAS,MAAM;AACjB,aAAO;AAAA,IACT;AAEA,WACE,qBAAC,UAAK,WAAW,OAAO,MACrB;AAAA;AAAA,MACD,oBAAC,WAAM,WAAW,OAAO,OAAO,SAAS,IACtC,iBACH;AAAA,OACF;AAAA,EAEJ;AACF;AAEA,OAAO,cAAc;","names":[]}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { describe, expect, it } from "vitest";
|
|
3
|
+
import { render, screen } from "@testing-library/react";
|
|
4
|
+
import userEvent from "@testing-library/user-event";
|
|
5
|
+
import { assertNoAxeViolations } from "@becket-ui/a11y";
|
|
6
|
+
import { Switch } from "./Switch";
|
|
7
|
+
describe("Switch", () => {
|
|
8
|
+
it("gets its accessible name from label", () => {
|
|
9
|
+
render(/* @__PURE__ */ jsx(Switch, { label: "Notifications" }));
|
|
10
|
+
expect(screen.getByRole("switch", { name: "Notifications" })).toBeTruthy();
|
|
11
|
+
});
|
|
12
|
+
it("toggles on Space and Enter", async () => {
|
|
13
|
+
const user = userEvent.setup();
|
|
14
|
+
render(/* @__PURE__ */ jsx(Switch, { label: "Notifications" }));
|
|
15
|
+
const control = screen.getByRole("switch", { name: "Notifications" });
|
|
16
|
+
expect(control.getAttribute("aria-checked")).toBe("false");
|
|
17
|
+
control.focus();
|
|
18
|
+
await user.keyboard(" ");
|
|
19
|
+
expect(control.getAttribute("aria-checked")).toBe("true");
|
|
20
|
+
await user.keyboard("{Enter}");
|
|
21
|
+
expect(control.getAttribute("aria-checked")).toBe("false");
|
|
22
|
+
});
|
|
23
|
+
it("has no axe violations with a visible label", async () => {
|
|
24
|
+
const { container } = render(/* @__PURE__ */ jsx(Switch, { label: "Notifications" }));
|
|
25
|
+
await assertNoAxeViolations(container);
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
//# sourceMappingURL=Switch.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/Switch.test.tsx"],"sourcesContent":["import { describe, expect, it } from 'vitest';\nimport { render, screen } from '@testing-library/react';\nimport userEvent from '@testing-library/user-event';\nimport { assertNoAxeViolations } from '@becket-ui/a11y';\n\nimport { Switch } from './Switch';\n\ndescribe('Switch', () => {\n it('gets its accessible name from label', () => {\n render(<Switch label=\"Notifications\" />);\n expect(screen.getByRole('switch', { name: 'Notifications' })).toBeTruthy();\n });\n\n it('toggles on Space and Enter', async () => {\n const user = userEvent.setup();\n render(<Switch label=\"Notifications\" />);\n const control = screen.getByRole('switch', { name: 'Notifications' });\n expect(control.getAttribute('aria-checked')).toBe('false');\n control.focus();\n await user.keyboard(' ');\n expect(control.getAttribute('aria-checked')).toBe('true');\n await user.keyboard('{Enter}');\n expect(control.getAttribute('aria-checked')).toBe('false');\n });\n\n it('has no axe violations with a visible label', async () => {\n const { container } = render(<Switch label=\"Notifications\" />);\n await assertNoAxeViolations(container);\n });\n});\n"],"mappings":"AASW;AATX,SAAS,UAAU,QAAQ,UAAU;AACrC,SAAS,QAAQ,cAAc;AAC/B,OAAO,eAAe;AACtB,SAAS,6BAA6B;AAEtC,SAAS,cAAc;AAEvB,SAAS,UAAU,MAAM;AACvB,KAAG,uCAAuC,MAAM;AAC9C,WAAO,oBAAC,UAAO,OAAM,iBAAgB,CAAE;AACvC,WAAO,OAAO,UAAU,UAAU,EAAE,MAAM,gBAAgB,CAAC,CAAC,EAAE,WAAW;AAAA,EAC3E,CAAC;AAED,KAAG,8BAA8B,YAAY;AAC3C,UAAM,OAAO,UAAU,MAAM;AAC7B,WAAO,oBAAC,UAAO,OAAM,iBAAgB,CAAE;AACvC,UAAM,UAAU,OAAO,UAAU,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACpE,WAAO,QAAQ,aAAa,cAAc,CAAC,EAAE,KAAK,OAAO;AACzD,YAAQ,MAAM;AACd,UAAM,KAAK,SAAS,GAAG;AACvB,WAAO,QAAQ,aAAa,cAAc,CAAC,EAAE,KAAK,MAAM;AACxD,UAAM,KAAK,SAAS,SAAS;AAC7B,WAAO,QAAQ,aAAa,cAAc,CAAC,EAAE,KAAK,OAAO;AAAA,EAC3D,CAAC;AAED,KAAG,8CAA8C,YAAY;AAC3D,UAAM,EAAE,UAAU,IAAI,OAAO,oBAAC,UAAO,OAAM,iBAAgB,CAAE;AAC7D,UAAM,sBAAsB,SAAS;AAAA,EACvC,CAAC;AACH,CAAC;","names":[]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type ComponentPropsWithoutRef } from 'react';
|
|
2
|
+
type TableSize = 'sm' | 'md';
|
|
3
|
+
export type TableProps = ComponentPropsWithoutRef<'table'> & {
|
|
4
|
+
size?: TableSize;
|
|
5
|
+
};
|
|
6
|
+
export declare const Table: import("react").ForwardRefExoticComponent<Omit<import("react").DetailedHTMLProps<import("react").TableHTMLAttributes<HTMLTableElement>, HTMLTableElement>, "ref"> & {
|
|
7
|
+
size?: TableSize;
|
|
8
|
+
} & import("react").RefAttributes<HTMLTableElement>>;
|
|
9
|
+
export declare const TableCaption: import("react").ForwardRefExoticComponent<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLElement>, HTMLElement>, "ref"> & import("react").RefAttributes<HTMLTableCaptionElement>>;
|
|
10
|
+
export declare const TableHeader: import("react").ForwardRefExoticComponent<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLTableSectionElement>, HTMLTableSectionElement>, "ref"> & import("react").RefAttributes<HTMLTableSectionElement>>;
|
|
11
|
+
export declare const TableBody: import("react").ForwardRefExoticComponent<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLTableSectionElement>, HTMLTableSectionElement>, "ref"> & import("react").RefAttributes<HTMLTableSectionElement>>;
|
|
12
|
+
export declare const TableFooter: import("react").ForwardRefExoticComponent<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLTableSectionElement>, HTMLTableSectionElement>, "ref"> & import("react").RefAttributes<HTMLTableSectionElement>>;
|
|
13
|
+
export declare const TableRow: import("react").ForwardRefExoticComponent<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLTableRowElement>, HTMLTableRowElement>, "ref"> & import("react").RefAttributes<HTMLTableRowElement>>;
|
|
14
|
+
export declare const TableColumnHeader: import("react").ForwardRefExoticComponent<Omit<import("react").DetailedHTMLProps<import("react").ThHTMLAttributes<HTMLTableHeaderCellElement>, HTMLTableHeaderCellElement>, "ref"> & import("react").RefAttributes<HTMLTableCellElement>>;
|
|
15
|
+
export declare const TableCell: import("react").ForwardRefExoticComponent<Omit<import("react").DetailedHTMLProps<import("react").TdHTMLAttributes<HTMLTableDataCellElement>, HTMLTableDataCellElement>, "ref"> & import("react").RefAttributes<HTMLTableCellElement>>;
|
|
16
|
+
export declare const Thead: import("react").ForwardRefExoticComponent<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLTableSectionElement>, HTMLTableSectionElement>, "ref"> & import("react").RefAttributes<HTMLTableSectionElement>>;
|
|
17
|
+
export declare const Tbody: import("react").ForwardRefExoticComponent<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLTableSectionElement>, HTMLTableSectionElement>, "ref"> & import("react").RefAttributes<HTMLTableSectionElement>>;
|
|
18
|
+
export declare const Tfoot: import("react").ForwardRefExoticComponent<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLTableSectionElement>, HTMLTableSectionElement>, "ref"> & import("react").RefAttributes<HTMLTableSectionElement>>;
|
|
19
|
+
export declare const Tr: import("react").ForwardRefExoticComponent<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLTableRowElement>, HTMLTableRowElement>, "ref"> & import("react").RefAttributes<HTMLTableRowElement>>;
|
|
20
|
+
export declare const Th: import("react").ForwardRefExoticComponent<Omit<import("react").DetailedHTMLProps<import("react").ThHTMLAttributes<HTMLTableHeaderCellElement>, HTMLTableHeaderCellElement>, "ref"> & import("react").RefAttributes<HTMLTableCellElement>>;
|
|
21
|
+
export declare const Td: import("react").ForwardRefExoticComponent<Omit<import("react").DetailedHTMLProps<import("react").TdHTMLAttributes<HTMLTableDataCellElement>, HTMLTableDataCellElement>, "ref"> & import("react").RefAttributes<HTMLTableCellElement>>;
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=Table.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Table.d.ts","sourceRoot":"","sources":["../../src/components/Table.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAyC,KAAK,wBAAwB,EAAE,MAAM,OAAO,CAAC;AAG7F,KAAK,SAAS,GAAG,IAAI,GAAG,IAAI,CAAC;AAQ7B,MAAM,MAAM,UAAU,GAAG,wBAAwB,CAAC,OAAO,CAAC,GAAG;IAC3D,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB,CAAC;AAEF,eAAO,MAAM,KAAK;WAHT,SAAS;oDAYjB,CAAC;AAQF,eAAO,MAAM,YAAY,8MAKxB,CAAC;AAGF,eAAO,MAAM,WAAW,sOAKvB,CAAC;AAGF,eAAO,MAAM,SAAS,sOAKrB,CAAC;AAGF,eAAO,MAAM,WAAW,sOAKvB,CAAC;AAGF,eAAO,MAAM,QAAQ,0NAKpB,CAAC;AAGF,eAAO,MAAM,iBAAiB,2OAK7B,CAAC;AAGF,eAAO,MAAM,SAAS,uOAKrB,CAAC;AAGF,eAAO,MAAM,KAAK,sOAAc,CAAC;AACjC,eAAO,MAAM,KAAK,sOAAY,CAAC;AAC/B,eAAO,MAAM,KAAK,sOAAc,CAAC;AACjC,eAAO,MAAM,EAAE,0NAAW,CAAC;AAC3B,eAAO,MAAM,EAAE,2OAAoB,CAAC;AACpC,eAAO,MAAM,EAAE,uOAAY,CAAC"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import { createContext, forwardRef, useContext } from "react";
|
|
4
|
+
import { table as tableRecipe } from "@becket-ui/tokens/recipes";
|
|
5
|
+
const TableContext = createContext("md");
|
|
6
|
+
function mergeClassName(...classes) {
|
|
7
|
+
return classes.filter(Boolean).join(" ");
|
|
8
|
+
}
|
|
9
|
+
const Table = forwardRef(
|
|
10
|
+
({ size = "md", className, ...props }, ref) => {
|
|
11
|
+
const styles = tableRecipe({ size });
|
|
12
|
+
return /* @__PURE__ */ jsx(TableContext.Provider, { value: size, children: /* @__PURE__ */ jsx("table", { ref, ...props, className: mergeClassName(styles.root, className) }) });
|
|
13
|
+
}
|
|
14
|
+
);
|
|
15
|
+
Table.displayName = "Table";
|
|
16
|
+
function useTableSize() {
|
|
17
|
+
return useContext(TableContext);
|
|
18
|
+
}
|
|
19
|
+
const TableCaption = forwardRef(
|
|
20
|
+
({ className, ...props }, ref) => {
|
|
21
|
+
const styles = tableRecipe({ size: useTableSize() });
|
|
22
|
+
return /* @__PURE__ */ jsx("caption", { ref, ...props, className: mergeClassName(styles.caption, className) });
|
|
23
|
+
}
|
|
24
|
+
);
|
|
25
|
+
TableCaption.displayName = "TableCaption";
|
|
26
|
+
const TableHeader = forwardRef(
|
|
27
|
+
({ className, ...props }, ref) => {
|
|
28
|
+
const styles = tableRecipe({ size: useTableSize() });
|
|
29
|
+
return /* @__PURE__ */ jsx("thead", { ref, ...props, className: mergeClassName(styles.thead, className) });
|
|
30
|
+
}
|
|
31
|
+
);
|
|
32
|
+
TableHeader.displayName = "TableHeader";
|
|
33
|
+
const TableBody = forwardRef(
|
|
34
|
+
({ className, ...props }, ref) => {
|
|
35
|
+
const styles = tableRecipe({ size: useTableSize() });
|
|
36
|
+
return /* @__PURE__ */ jsx("tbody", { ref, ...props, className: mergeClassName(styles.tbody, className) });
|
|
37
|
+
}
|
|
38
|
+
);
|
|
39
|
+
TableBody.displayName = "TableBody";
|
|
40
|
+
const TableFooter = forwardRef(
|
|
41
|
+
({ className, ...props }, ref) => {
|
|
42
|
+
const styles = tableRecipe({ size: useTableSize() });
|
|
43
|
+
return /* @__PURE__ */ jsx("tfoot", { ref, ...props, className: mergeClassName(styles.tfoot, className) });
|
|
44
|
+
}
|
|
45
|
+
);
|
|
46
|
+
TableFooter.displayName = "TableFooter";
|
|
47
|
+
const TableRow = forwardRef(
|
|
48
|
+
({ className, ...props }, ref) => {
|
|
49
|
+
const styles = tableRecipe({ size: useTableSize() });
|
|
50
|
+
return /* @__PURE__ */ jsx("tr", { ref, ...props, className: mergeClassName(styles.tr, className) });
|
|
51
|
+
}
|
|
52
|
+
);
|
|
53
|
+
TableRow.displayName = "TableRow";
|
|
54
|
+
const TableColumnHeader = forwardRef(
|
|
55
|
+
({ className, ...props }, ref) => {
|
|
56
|
+
const styles = tableRecipe({ size: useTableSize() });
|
|
57
|
+
return /* @__PURE__ */ jsx("th", { ref, ...props, className: mergeClassName(styles.th, className) });
|
|
58
|
+
}
|
|
59
|
+
);
|
|
60
|
+
TableColumnHeader.displayName = "TableColumnHeader";
|
|
61
|
+
const TableCell = forwardRef(
|
|
62
|
+
({ className, ...props }, ref) => {
|
|
63
|
+
const styles = tableRecipe({ size: useTableSize() });
|
|
64
|
+
return /* @__PURE__ */ jsx("td", { ref, ...props, className: mergeClassName(styles.td, className) });
|
|
65
|
+
}
|
|
66
|
+
);
|
|
67
|
+
TableCell.displayName = "TableCell";
|
|
68
|
+
const Thead = TableHeader;
|
|
69
|
+
const Tbody = TableBody;
|
|
70
|
+
const Tfoot = TableFooter;
|
|
71
|
+
const Tr = TableRow;
|
|
72
|
+
const Th = TableColumnHeader;
|
|
73
|
+
const Td = TableCell;
|
|
74
|
+
export {
|
|
75
|
+
Table,
|
|
76
|
+
TableBody,
|
|
77
|
+
TableCaption,
|
|
78
|
+
TableCell,
|
|
79
|
+
TableColumnHeader,
|
|
80
|
+
TableFooter,
|
|
81
|
+
TableHeader,
|
|
82
|
+
TableRow,
|
|
83
|
+
Tbody,
|
|
84
|
+
Td,
|
|
85
|
+
Tfoot,
|
|
86
|
+
Th,
|
|
87
|
+
Thead,
|
|
88
|
+
Tr
|
|
89
|
+
};
|
|
90
|
+
//# sourceMappingURL=Table.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/Table.tsx"],"sourcesContent":["'use client';\n\nimport { createContext, forwardRef, useContext, type ComponentPropsWithoutRef } from 'react';\nimport { table as tableRecipe } from '@becket-ui/tokens/recipes';\n\ntype TableSize = 'sm' | 'md';\n\nconst TableContext = createContext<TableSize>('md');\n\nfunction mergeClassName(...classes: (string | undefined)[]): string {\n return classes.filter(Boolean).join(' ');\n}\n\nexport type TableProps = ComponentPropsWithoutRef<'table'> & {\n size?: TableSize;\n};\n\nexport const Table = forwardRef<HTMLTableElement, TableProps>(\n ({ size = 'md', className, ...props }, ref) => {\n const styles = tableRecipe({ size });\n return (\n <TableContext.Provider value={size}>\n <table ref={ref} {...props} className={mergeClassName(styles.root, className)} />\n </TableContext.Provider>\n );\n },\n);\n\nTable.displayName = 'Table';\n\nfunction useTableSize() {\n return useContext(TableContext);\n}\n\nexport const TableCaption = forwardRef<HTMLTableCaptionElement, ComponentPropsWithoutRef<'caption'>>(\n ({ className, ...props }, ref) => {\n const styles = tableRecipe({ size: useTableSize() });\n return <caption ref={ref} {...props} className={mergeClassName(styles.caption, className)} />;\n },\n);\nTableCaption.displayName = 'TableCaption';\n\nexport const TableHeader = forwardRef<HTMLTableSectionElement, ComponentPropsWithoutRef<'thead'>>(\n ({ className, ...props }, ref) => {\n const styles = tableRecipe({ size: useTableSize() });\n return <thead ref={ref} {...props} className={mergeClassName(styles.thead, className)} />;\n },\n);\nTableHeader.displayName = 'TableHeader';\n\nexport const TableBody = forwardRef<HTMLTableSectionElement, ComponentPropsWithoutRef<'tbody'>>(\n ({ className, ...props }, ref) => {\n const styles = tableRecipe({ size: useTableSize() });\n return <tbody ref={ref} {...props} className={mergeClassName(styles.tbody, className)} />;\n },\n);\nTableBody.displayName = 'TableBody';\n\nexport const TableFooter = forwardRef<HTMLTableSectionElement, ComponentPropsWithoutRef<'tfoot'>>(\n ({ className, ...props }, ref) => {\n const styles = tableRecipe({ size: useTableSize() });\n return <tfoot ref={ref} {...props} className={mergeClassName(styles.tfoot, className)} />;\n },\n);\nTableFooter.displayName = 'TableFooter';\n\nexport const TableRow = forwardRef<HTMLTableRowElement, ComponentPropsWithoutRef<'tr'>>(\n ({ className, ...props }, ref) => {\n const styles = tableRecipe({ size: useTableSize() });\n return <tr ref={ref} {...props} className={mergeClassName(styles.tr, className)} />;\n },\n);\nTableRow.displayName = 'TableRow';\n\nexport const TableColumnHeader = forwardRef<HTMLTableCellElement, ComponentPropsWithoutRef<'th'>>(\n ({ className, ...props }, ref) => {\n const styles = tableRecipe({ size: useTableSize() });\n return <th ref={ref} {...props} className={mergeClassName(styles.th, className)} />;\n },\n);\nTableColumnHeader.displayName = 'TableColumnHeader';\n\nexport const TableCell = forwardRef<HTMLTableCellElement, ComponentPropsWithoutRef<'td'>>(\n ({ className, ...props }, ref) => {\n const styles = tableRecipe({ size: useTableSize() });\n return <td ref={ref} {...props} className={mergeClassName(styles.td, className)} />;\n },\n);\nTableCell.displayName = 'TableCell';\n\nexport const Thead = TableHeader;\nexport const Tbody = TableBody;\nexport const Tfoot = TableFooter;\nexport const Tr = TableRow;\nexport const Th = TableColumnHeader;\nexport const Td = TableCell;\n"],"mappings":";AAsBQ;AApBR,SAAS,eAAe,YAAY,kBAAiD;AACrF,SAAS,SAAS,mBAAmB;AAIrC,MAAM,eAAe,cAAyB,IAAI;AAElD,SAAS,kBAAkB,SAAyC;AAClE,SAAO,QAAQ,OAAO,OAAO,EAAE,KAAK,GAAG;AACzC;AAMO,MAAM,QAAQ;AAAA,EACnB,CAAC,EAAE,OAAO,MAAM,WAAW,GAAG,MAAM,GAAG,QAAQ;AAC7C,UAAM,SAAS,YAAY,EAAE,KAAK,CAAC;AACnC,WACE,oBAAC,aAAa,UAAb,EAAsB,OAAO,MAC5B,8BAAC,WAAM,KAAW,GAAG,OAAO,WAAW,eAAe,OAAO,MAAM,SAAS,GAAG,GACjF;AAAA,EAEJ;AACF;AAEA,MAAM,cAAc;AAEpB,SAAS,eAAe;AACtB,SAAO,WAAW,YAAY;AAChC;AAEO,MAAM,eAAe;AAAA,EAC1B,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAAQ;AAChC,UAAM,SAAS,YAAY,EAAE,MAAM,aAAa,EAAE,CAAC;AACnD,WAAO,oBAAC,aAAQ,KAAW,GAAG,OAAO,WAAW,eAAe,OAAO,SAAS,SAAS,GAAG;AAAA,EAC7F;AACF;AACA,aAAa,cAAc;AAEpB,MAAM,cAAc;AAAA,EACzB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAAQ;AAChC,UAAM,SAAS,YAAY,EAAE,MAAM,aAAa,EAAE,CAAC;AACnD,WAAO,oBAAC,WAAM,KAAW,GAAG,OAAO,WAAW,eAAe,OAAO,OAAO,SAAS,GAAG;AAAA,EACzF;AACF;AACA,YAAY,cAAc;AAEnB,MAAM,YAAY;AAAA,EACvB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAAQ;AAChC,UAAM,SAAS,YAAY,EAAE,MAAM,aAAa,EAAE,CAAC;AACnD,WAAO,oBAAC,WAAM,KAAW,GAAG,OAAO,WAAW,eAAe,OAAO,OAAO,SAAS,GAAG;AAAA,EACzF;AACF;AACA,UAAU,cAAc;AAEjB,MAAM,cAAc;AAAA,EACzB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAAQ;AAChC,UAAM,SAAS,YAAY,EAAE,MAAM,aAAa,EAAE,CAAC;AACnD,WAAO,oBAAC,WAAM,KAAW,GAAG,OAAO,WAAW,eAAe,OAAO,OAAO,SAAS,GAAG;AAAA,EACzF;AACF;AACA,YAAY,cAAc;AAEnB,MAAM,WAAW;AAAA,EACtB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAAQ;AAChC,UAAM,SAAS,YAAY,EAAE,MAAM,aAAa,EAAE,CAAC;AACnD,WAAO,oBAAC,QAAG,KAAW,GAAG,OAAO,WAAW,eAAe,OAAO,IAAI,SAAS,GAAG;AAAA,EACnF;AACF;AACA,SAAS,cAAc;AAEhB,MAAM,oBAAoB;AAAA,EAC/B,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAAQ;AAChC,UAAM,SAAS,YAAY,EAAE,MAAM,aAAa,EAAE,CAAC;AACnD,WAAO,oBAAC,QAAG,KAAW,GAAG,OAAO,WAAW,eAAe,OAAO,IAAI,SAAS,GAAG;AAAA,EACnF;AACF;AACA,kBAAkB,cAAc;AAEzB,MAAM,YAAY;AAAA,EACvB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAAQ;AAChC,UAAM,SAAS,YAAY,EAAE,MAAM,aAAa,EAAE,CAAC;AACnD,WAAO,oBAAC,QAAG,KAAW,GAAG,OAAO,WAAW,eAAe,OAAO,IAAI,SAAS,GAAG;AAAA,EACnF;AACF;AACA,UAAU,cAAc;AAEjB,MAAM,QAAQ;AACd,MAAM,QAAQ;AACd,MAAM,QAAQ;AACd,MAAM,KAAK;AACX,MAAM,KAAK;AACX,MAAM,KAAK;","names":[]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type ButtonHTMLAttributes, type ComponentPropsWithoutRef, type ReactNode } from 'react';
|
|
2
|
+
export type TabsProps = ComponentPropsWithoutRef<'div'> & {
|
|
3
|
+
value?: string;
|
|
4
|
+
defaultValue: string;
|
|
5
|
+
onValueChange?: (value: string) => void;
|
|
6
|
+
children?: ReactNode;
|
|
7
|
+
};
|
|
8
|
+
export declare const Tabs: import("react").ForwardRefExoticComponent<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & {
|
|
9
|
+
value?: string;
|
|
10
|
+
defaultValue: string;
|
|
11
|
+
onValueChange?: (value: string) => void;
|
|
12
|
+
children?: ReactNode;
|
|
13
|
+
} & import("react").RefAttributes<HTMLDivElement>>;
|
|
14
|
+
export declare const TabList: import("react").ForwardRefExoticComponent<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
|
|
15
|
+
export declare const Tab: import("react").ForwardRefExoticComponent<ButtonHTMLAttributes<HTMLButtonElement> & {
|
|
16
|
+
value: string;
|
|
17
|
+
} & import("react").RefAttributes<HTMLButtonElement>>;
|
|
18
|
+
export declare const TabPanel: import("react").ForwardRefExoticComponent<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & {
|
|
19
|
+
value: string;
|
|
20
|
+
} & import("react").RefAttributes<HTMLDivElement>>;
|
|
21
|
+
//# sourceMappingURL=Tabs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tabs.d.ts","sourceRoot":"","sources":["../../src/components/Tabs.tsx"],"names":[],"mappings":"AAEA,OAAO,EAOL,KAAK,oBAAoB,EACzB,KAAK,wBAAwB,EAE7B,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAuBf,MAAM,MAAM,SAAS,GAAG,wBAAwB,CAAC,KAAK,CAAC,GAAG;IACxD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,CAAC;AAEF,eAAO,MAAM,IAAI;YANP,MAAM;kBACA,MAAM;oBACJ,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI;eAC5B,SAAS;kDA6BrB,CAAC;AAIF,eAAO,MAAM,OAAO,2MA4CnB,CAAC;AAQF,eAAO,MAAM,GAAG;WAHP,MAAM;qDA0Bd,CAAC;AAQF,eAAO,MAAM,QAAQ;WAHZ,MAAM;kDAsBd,CAAC"}
|