@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,140 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import {
|
|
4
|
+
createContext,
|
|
5
|
+
forwardRef,
|
|
6
|
+
useContext,
|
|
7
|
+
useId,
|
|
8
|
+
useMemo,
|
|
9
|
+
useState
|
|
10
|
+
} from "react";
|
|
11
|
+
import { tabs as tabsRecipe } from "@becket-ui/tokens/recipes";
|
|
12
|
+
const TabsContext = createContext(null);
|
|
13
|
+
function useTabs() {
|
|
14
|
+
const ctx = useContext(TabsContext);
|
|
15
|
+
if (!ctx) {
|
|
16
|
+
throw new Error("Tabs parts must be used within Tabs");
|
|
17
|
+
}
|
|
18
|
+
return ctx;
|
|
19
|
+
}
|
|
20
|
+
function mergeClassName(...classes) {
|
|
21
|
+
return classes.filter(Boolean).join(" ");
|
|
22
|
+
}
|
|
23
|
+
const Tabs = forwardRef(
|
|
24
|
+
({ value, defaultValue, onValueChange, className, children, ...props }, ref) => {
|
|
25
|
+
const isControlled = value !== void 0;
|
|
26
|
+
const [uncontrolled, setUncontrolled] = useState(defaultValue);
|
|
27
|
+
const selected = isControlled ? value : uncontrolled;
|
|
28
|
+
const baseId = useId();
|
|
29
|
+
const styles = tabsRecipe();
|
|
30
|
+
const setValue = (next) => {
|
|
31
|
+
if (!isControlled) setUncontrolled(next);
|
|
32
|
+
onValueChange?.(next);
|
|
33
|
+
};
|
|
34
|
+
const ctx = useMemo(
|
|
35
|
+
() => ({ value: selected, setValue, baseId }),
|
|
36
|
+
[baseId, selected]
|
|
37
|
+
);
|
|
38
|
+
return /* @__PURE__ */ jsx(TabsContext.Provider, { value: ctx, children: /* @__PURE__ */ jsx("div", { ref, ...props, className: mergeClassName(styles.root, className), children }) });
|
|
39
|
+
}
|
|
40
|
+
);
|
|
41
|
+
Tabs.displayName = "Tabs";
|
|
42
|
+
const TabList = forwardRef(
|
|
43
|
+
({ className, onKeyDown, ...props }, ref) => {
|
|
44
|
+
const styles = tabsRecipe();
|
|
45
|
+
const onListKeyDown = (event) => {
|
|
46
|
+
onKeyDown?.(event);
|
|
47
|
+
if (event.defaultPrevented) return;
|
|
48
|
+
const tabs = [
|
|
49
|
+
...event.currentTarget.querySelectorAll('[role="tab"]:not([disabled])')
|
|
50
|
+
];
|
|
51
|
+
if (tabs.length === 0) return;
|
|
52
|
+
const index = tabs.findIndex((tab) => tab === document.activeElement);
|
|
53
|
+
const focusTab = (nextIndex) => {
|
|
54
|
+
const next = tabs[(nextIndex + tabs.length) % tabs.length];
|
|
55
|
+
next?.focus();
|
|
56
|
+
next?.click();
|
|
57
|
+
};
|
|
58
|
+
if (event.key === "Home") {
|
|
59
|
+
event.preventDefault();
|
|
60
|
+
focusTab(0);
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
if (event.key === "End") {
|
|
64
|
+
event.preventDefault();
|
|
65
|
+
focusTab(tabs.length - 1);
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
if (event.key !== "ArrowRight" && event.key !== "ArrowLeft") return;
|
|
69
|
+
event.preventDefault();
|
|
70
|
+
const delta = event.key === "ArrowRight" ? 1 : -1;
|
|
71
|
+
focusTab(index < 0 ? 0 : index + delta);
|
|
72
|
+
};
|
|
73
|
+
return /* @__PURE__ */ jsx(
|
|
74
|
+
"div",
|
|
75
|
+
{
|
|
76
|
+
ref,
|
|
77
|
+
role: "tablist",
|
|
78
|
+
...props,
|
|
79
|
+
"aria-orientation": "horizontal",
|
|
80
|
+
className: mergeClassName(styles.list, className),
|
|
81
|
+
onKeyDown: onListKeyDown
|
|
82
|
+
}
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
);
|
|
86
|
+
TabList.displayName = "TabList";
|
|
87
|
+
const Tab = forwardRef(
|
|
88
|
+
({ value, className, type = "button", ...props }, ref) => {
|
|
89
|
+
const { value: selected, setValue, baseId } = useTabs();
|
|
90
|
+
const styles = tabsRecipe();
|
|
91
|
+
const selectedNow = selected === value;
|
|
92
|
+
return /* @__PURE__ */ jsx(
|
|
93
|
+
"button",
|
|
94
|
+
{
|
|
95
|
+
ref,
|
|
96
|
+
type,
|
|
97
|
+
role: "tab",
|
|
98
|
+
id: `${baseId}-tab-${value}`,
|
|
99
|
+
"aria-selected": selectedNow,
|
|
100
|
+
"aria-controls": `${baseId}-panel-${value}`,
|
|
101
|
+
tabIndex: selectedNow ? 0 : -1,
|
|
102
|
+
...props,
|
|
103
|
+
className: mergeClassName(styles.tab, className),
|
|
104
|
+
onClick: (event) => {
|
|
105
|
+
props.onClick?.(event);
|
|
106
|
+
if (!event.defaultPrevented) setValue(value);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
);
|
|
110
|
+
}
|
|
111
|
+
);
|
|
112
|
+
Tab.displayName = "Tab";
|
|
113
|
+
const TabPanel = forwardRef(
|
|
114
|
+
({ value, className, children, ...props }, ref) => {
|
|
115
|
+
const { value: selected, baseId } = useTabs();
|
|
116
|
+
const styles = tabsRecipe();
|
|
117
|
+
if (selected !== value) return null;
|
|
118
|
+
return /* @__PURE__ */ jsx(
|
|
119
|
+
"div",
|
|
120
|
+
{
|
|
121
|
+
ref,
|
|
122
|
+
role: "tabpanel",
|
|
123
|
+
id: `${baseId}-panel-${value}`,
|
|
124
|
+
"aria-labelledby": `${baseId}-tab-${value}`,
|
|
125
|
+
tabIndex: 0,
|
|
126
|
+
...props,
|
|
127
|
+
className: mergeClassName(styles.panel, className),
|
|
128
|
+
children
|
|
129
|
+
}
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
);
|
|
133
|
+
TabPanel.displayName = "TabPanel";
|
|
134
|
+
export {
|
|
135
|
+
Tab,
|
|
136
|
+
TabList,
|
|
137
|
+
TabPanel,
|
|
138
|
+
Tabs
|
|
139
|
+
};
|
|
140
|
+
//# sourceMappingURL=Tabs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/Tabs.tsx"],"sourcesContent":["'use client';\n\nimport {\n createContext,\n forwardRef,\n useContext,\n useId,\n useMemo,\n useState,\n type ButtonHTMLAttributes,\n type ComponentPropsWithoutRef,\n type KeyboardEvent,\n type ReactNode,\n} from 'react';\nimport { tabs as tabsRecipe } from '@becket-ui/tokens/recipes';\n\ntype TabsContextValue = {\n value: string;\n setValue: (value: string) => void;\n baseId: string;\n};\n\nconst TabsContext = createContext<TabsContextValue | null>(null);\n\nfunction useTabs() {\n const ctx = useContext(TabsContext);\n if (!ctx) {\n throw new Error('Tabs parts must be used within Tabs');\n }\n return ctx;\n}\n\nfunction mergeClassName(...classes: (string | undefined)[]): string {\n return classes.filter(Boolean).join(' ');\n}\n\nexport type TabsProps = ComponentPropsWithoutRef<'div'> & {\n value?: string;\n defaultValue: string;\n onValueChange?: (value: string) => void;\n children?: ReactNode;\n};\n\nexport const Tabs = forwardRef<HTMLDivElement, TabsProps>(\n ({ value, defaultValue, onValueChange, className, children, ...props }, ref) => {\n const isControlled = value !== undefined;\n const [uncontrolled, setUncontrolled] = useState(defaultValue);\n const selected = isControlled ? value : uncontrolled;\n const baseId = useId();\n const styles = tabsRecipe();\n\n const setValue = (next: string) => {\n if (!isControlled) setUncontrolled(next);\n onValueChange?.(next);\n };\n\n const ctx = useMemo(\n () => ({ value: selected, setValue, baseId }),\n [baseId, selected],\n );\n\n return (\n <TabsContext.Provider value={ctx}>\n <div ref={ref} {...props} className={mergeClassName(styles.root, className)}>\n {children}\n </div>\n </TabsContext.Provider>\n );\n },\n);\n\nTabs.displayName = 'Tabs';\n\nexport const TabList = forwardRef<HTMLDivElement, ComponentPropsWithoutRef<'div'>>(\n ({ className, onKeyDown, ...props }, ref) => {\n const styles = tabsRecipe();\n\n const onListKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(event);\n if (event.defaultPrevented) return;\n const tabs = [\n ...event.currentTarget.querySelectorAll<HTMLButtonElement>('[role=\"tab\"]:not([disabled])'),\n ];\n if (tabs.length === 0) return;\n const index = tabs.findIndex((tab) => tab === document.activeElement);\n const focusTab = (nextIndex: number) => {\n const next = tabs[(nextIndex + tabs.length) % tabs.length];\n next?.focus();\n next?.click();\n };\n if (event.key === 'Home') {\n event.preventDefault();\n focusTab(0);\n return;\n }\n if (event.key === 'End') {\n event.preventDefault();\n focusTab(tabs.length - 1);\n return;\n }\n if (event.key !== 'ArrowRight' && event.key !== 'ArrowLeft') return;\n event.preventDefault();\n const delta = event.key === 'ArrowRight' ? 1 : -1;\n focusTab(index < 0 ? 0 : index + delta);\n };\n\n return (\n <div\n ref={ref}\n role=\"tablist\"\n {...props}\n aria-orientation=\"horizontal\"\n className={mergeClassName(styles.list, className)}\n onKeyDown={onListKeyDown}\n />\n );\n },\n);\n\nTabList.displayName = 'TabList';\n\ntype TabProps = ButtonHTMLAttributes<HTMLButtonElement> & {\n value: string;\n};\n\nexport const Tab = forwardRef<HTMLButtonElement, TabProps>(\n ({ value, className, type = 'button', ...props }, ref) => {\n const { value: selected, setValue, baseId } = useTabs();\n const styles = tabsRecipe();\n const selectedNow = selected === value;\n return (\n <button\n ref={ref}\n type={type}\n role=\"tab\"\n id={`${baseId}-tab-${value}`}\n aria-selected={selectedNow}\n aria-controls={`${baseId}-panel-${value}`}\n tabIndex={selectedNow ? 0 : -1}\n {...props}\n className={mergeClassName(styles.tab, className)}\n onClick={(event) => {\n props.onClick?.(event);\n if (!event.defaultPrevented) setValue(value);\n }}\n />\n );\n },\n);\n\nTab.displayName = 'Tab';\n\ntype TabPanelProps = ComponentPropsWithoutRef<'div'> & {\n value: string;\n};\n\nexport const TabPanel = forwardRef<HTMLDivElement, TabPanelProps>(\n ({ value, className, children, ...props }, ref) => {\n const { value: selected, baseId } = useTabs();\n const styles = tabsRecipe();\n if (selected !== value) return null;\n return (\n <div\n ref={ref}\n role=\"tabpanel\"\n id={`${baseId}-panel-${value}`}\n aria-labelledby={`${baseId}-tab-${value}`}\n tabIndex={0}\n {...props}\n className={mergeClassName(styles.panel, className)}\n >\n {children}\n </div>\n );\n },\n);\n\nTabPanel.displayName = 'TabPanel';\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { jsx, jsxs } 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 { Tab, TabList, TabPanel, Tabs } from "./Tabs";
|
|
7
|
+
function DemoTabs() {
|
|
8
|
+
return /* @__PURE__ */ jsxs(Tabs, { defaultValue: "one", children: [
|
|
9
|
+
/* @__PURE__ */ jsxs(TabList, { children: [
|
|
10
|
+
/* @__PURE__ */ jsx(Tab, { value: "one", children: "Overview" }),
|
|
11
|
+
/* @__PURE__ */ jsx(Tab, { value: "two", children: "Activity" }),
|
|
12
|
+
/* @__PURE__ */ jsx(Tab, { value: "three", disabled: true, children: "Disabled" })
|
|
13
|
+
] }),
|
|
14
|
+
/* @__PURE__ */ jsx(TabPanel, { value: "one", children: "First panel." }),
|
|
15
|
+
/* @__PURE__ */ jsx(TabPanel, { value: "two", children: "Second panel." }),
|
|
16
|
+
/* @__PURE__ */ jsx(TabPanel, { value: "three", children: "Hidden." })
|
|
17
|
+
] });
|
|
18
|
+
}
|
|
19
|
+
describe("Tabs", () => {
|
|
20
|
+
it("sets horizontal orientation", () => {
|
|
21
|
+
render(/* @__PURE__ */ jsx(DemoTabs, {}));
|
|
22
|
+
expect(screen.getByRole("tablist").getAttribute("aria-orientation")).toBe("horizontal");
|
|
23
|
+
});
|
|
24
|
+
it("moves to first and last enabled tab with Home and End", async () => {
|
|
25
|
+
const user = userEvent.setup();
|
|
26
|
+
render(/* @__PURE__ */ jsx(DemoTabs, {}));
|
|
27
|
+
screen.getByRole("tab", { name: "Overview" }).focus();
|
|
28
|
+
await user.keyboard("{End}");
|
|
29
|
+
expect(document.activeElement).toBe(screen.getByRole("tab", { name: "Activity" }));
|
|
30
|
+
expect(screen.getByRole("tab", { name: "Activity" }).getAttribute("aria-selected")).toBe("true");
|
|
31
|
+
await user.keyboard("{Home}");
|
|
32
|
+
expect(document.activeElement).toBe(screen.getByRole("tab", { name: "Overview" }));
|
|
33
|
+
await user.keyboard("{ArrowRight}");
|
|
34
|
+
expect(document.activeElement).toBe(screen.getByRole("tab", { name: "Activity" }));
|
|
35
|
+
});
|
|
36
|
+
it("has no axe violations", async () => {
|
|
37
|
+
const { container } = render(/* @__PURE__ */ jsx(DemoTabs, {}));
|
|
38
|
+
await assertNoAxeViolations(container);
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
//# sourceMappingURL=Tabs.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/Tabs.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 { Tab, TabList, TabPanel, Tabs } from './Tabs';\n\nfunction DemoTabs() {\n return (\n <Tabs defaultValue=\"one\">\n <TabList>\n <Tab value=\"one\">Overview</Tab>\n <Tab value=\"two\">Activity</Tab>\n <Tab value=\"three\" disabled>\n Disabled\n </Tab>\n </TabList>\n <TabPanel value=\"one\">First panel.</TabPanel>\n <TabPanel value=\"two\">Second panel.</TabPanel>\n <TabPanel value=\"three\">Hidden.</TabPanel>\n </Tabs>\n );\n}\n\ndescribe('Tabs', () => {\n it('sets horizontal orientation', () => {\n render(<DemoTabs />);\n expect(screen.getByRole('tablist').getAttribute('aria-orientation')).toBe('horizontal');\n });\n\n it('moves to first and last enabled tab with Home and End', async () => {\n const user = userEvent.setup();\n render(<DemoTabs />);\n screen.getByRole('tab', { name: 'Overview' }).focus();\n await user.keyboard('{End}');\n expect(document.activeElement).toBe(screen.getByRole('tab', { name: 'Activity' }));\n expect(screen.getByRole('tab', { name: 'Activity' }).getAttribute('aria-selected')).toBe('true');\n await user.keyboard('{Home}');\n expect(document.activeElement).toBe(screen.getByRole('tab', { name: 'Overview' }));\n await user.keyboard('{ArrowRight}');\n expect(document.activeElement).toBe(screen.getByRole('tab', { name: 'Activity' }));\n });\n\n it('has no axe violations', async () => {\n const { container } = render(<DemoTabs />);\n await assertNoAxeViolations(container);\n });\n});\n"],"mappings":"AAUM,SACE,KADF;AAVN,SAAS,UAAU,QAAQ,UAAU;AACrC,SAAS,QAAQ,cAAc;AAC/B,OAAO,eAAe;AACtB,SAAS,6BAA6B;AAEtC,SAAS,KAAK,SAAS,UAAU,YAAY;AAE7C,SAAS,WAAW;AAClB,SACE,qBAAC,QAAK,cAAa,OACjB;AAAA,yBAAC,WACC;AAAA,0BAAC,OAAI,OAAM,OAAM,sBAAQ;AAAA,MACzB,oBAAC,OAAI,OAAM,OAAM,sBAAQ;AAAA,MACzB,oBAAC,OAAI,OAAM,SAAQ,UAAQ,MAAC,sBAE5B;AAAA,OACF;AAAA,IACA,oBAAC,YAAS,OAAM,OAAM,0BAAY;AAAA,IAClC,oBAAC,YAAS,OAAM,OAAM,2BAAa;AAAA,IACnC,oBAAC,YAAS,OAAM,SAAQ,qBAAO;AAAA,KACjC;AAEJ;AAEA,SAAS,QAAQ,MAAM;AACrB,KAAG,+BAA+B,MAAM;AACtC,WAAO,oBAAC,YAAS,CAAE;AACnB,WAAO,OAAO,UAAU,SAAS,EAAE,aAAa,kBAAkB,CAAC,EAAE,KAAK,YAAY;AAAA,EACxF,CAAC;AAED,KAAG,yDAAyD,YAAY;AACtE,UAAM,OAAO,UAAU,MAAM;AAC7B,WAAO,oBAAC,YAAS,CAAE;AACnB,WAAO,UAAU,OAAO,EAAE,MAAM,WAAW,CAAC,EAAE,MAAM;AACpD,UAAM,KAAK,SAAS,OAAO;AAC3B,WAAO,SAAS,aAAa,EAAE,KAAK,OAAO,UAAU,OAAO,EAAE,MAAM,WAAW,CAAC,CAAC;AACjF,WAAO,OAAO,UAAU,OAAO,EAAE,MAAM,WAAW,CAAC,EAAE,aAAa,eAAe,CAAC,EAAE,KAAK,MAAM;AAC/F,UAAM,KAAK,SAAS,QAAQ;AAC5B,WAAO,SAAS,aAAa,EAAE,KAAK,OAAO,UAAU,OAAO,EAAE,MAAM,WAAW,CAAC,CAAC;AACjF,UAAM,KAAK,SAAS,cAAc;AAClC,WAAO,SAAS,aAAa,EAAE,KAAK,OAAO,UAAU,OAAO,EAAE,MAAM,WAAW,CAAC,CAAC;AAAA,EACnF,CAAC;AAED,KAAG,yBAAyB,YAAY;AACtC,UAAM,EAAE,UAAU,IAAI,OAAO,oBAAC,YAAS,CAAE;AACzC,UAAM,sBAAsB,SAAS;AAAA,EACvC,CAAC;AACH,CAAC;","names":[]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type ComponentPropsWithoutRef, type ElementType } from 'react';
|
|
2
|
+
import { type LabelCustomColors, type LabelVisual } from '../helpers/labelColors';
|
|
3
|
+
type TagSize = 'sm' | 'md' | 'lg';
|
|
4
|
+
type TagBorderRadius = 'none' | 'sm' | 'md' | 'lg' | 'xl' | 'full';
|
|
5
|
+
export type TagProps = ComponentPropsWithoutRef<'span'> & {
|
|
6
|
+
size?: TagSize;
|
|
7
|
+
visual?: LabelVisual;
|
|
8
|
+
borderRadius?: TagBorderRadius;
|
|
9
|
+
withGradient?: boolean;
|
|
10
|
+
customColors?: LabelCustomColors;
|
|
11
|
+
as?: ElementType;
|
|
12
|
+
};
|
|
13
|
+
export declare const Tag: import("react").ForwardRefExoticComponent<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLSpanElement>, HTMLSpanElement>, "ref"> & {
|
|
14
|
+
size?: TagSize;
|
|
15
|
+
visual?: LabelVisual;
|
|
16
|
+
borderRadius?: TagBorderRadius;
|
|
17
|
+
withGradient?: boolean;
|
|
18
|
+
customColors?: LabelCustomColors;
|
|
19
|
+
as?: ElementType;
|
|
20
|
+
} & import("react").RefAttributes<HTMLSpanElement>>;
|
|
21
|
+
export type { LabelCustomColors, LabelVisual };
|
|
22
|
+
//# sourceMappingURL=Tag.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tag.d.ts","sourceRoot":"","sources":["../../src/components/Tag.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,wBAAwB,EAAE,KAAK,WAAW,EAAE,MAAM,OAAO,CAAC;AAGpF,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,WAAW,EACjB,MAAM,wBAAwB,CAAC;AAEhC,KAAK,OAAO,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAClC,KAAK,eAAe,GAAG,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC;AAEnE,MAAM,MAAM,QAAQ,GAAG,wBAAwB,CAAC,MAAM,CAAC,GAAG;IACxD,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,YAAY,CAAC,EAAE,eAAe,CAAC;IAC/B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,YAAY,CAAC,EAAE,iBAAiB,CAAC;IACjC,EAAE,CAAC,EAAE,WAAW,CAAC;CAClB,CAAC;AAMF,eAAO,MAAM,GAAG;WAZP,OAAO;aACL,WAAW;mBACL,eAAe;mBACf,OAAO;mBACP,iBAAiB;SAC3B,WAAW;mDAkCjB,CAAC;AAIF,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef } from "react";
|
|
3
|
+
import { tag } from "@becket-ui/tokens/recipes";
|
|
4
|
+
import {
|
|
5
|
+
resolveLabelColorVars
|
|
6
|
+
} from "../helpers/labelColors";
|
|
7
|
+
function mergeClassName(...classes) {
|
|
8
|
+
return classes.filter(Boolean).join(" ");
|
|
9
|
+
}
|
|
10
|
+
const Tag = forwardRef(
|
|
11
|
+
({
|
|
12
|
+
size = "md",
|
|
13
|
+
visual = "neutral",
|
|
14
|
+
borderRadius = "full",
|
|
15
|
+
withGradient = false,
|
|
16
|
+
customColors,
|
|
17
|
+
as: Component = "span",
|
|
18
|
+
className,
|
|
19
|
+
style,
|
|
20
|
+
...props
|
|
21
|
+
}, ref) => {
|
|
22
|
+
const recipeClassName = tag({ size, visual, borderRadius, withGradient });
|
|
23
|
+
const colorVars = resolveLabelColorVars(visual, withGradient, customColors);
|
|
24
|
+
return /* @__PURE__ */ jsx(
|
|
25
|
+
Component,
|
|
26
|
+
{
|
|
27
|
+
ref,
|
|
28
|
+
...props,
|
|
29
|
+
style: { ...colorVars, ...style },
|
|
30
|
+
className: mergeClassName(recipeClassName, className)
|
|
31
|
+
}
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
);
|
|
35
|
+
Tag.displayName = "Tag";
|
|
36
|
+
export {
|
|
37
|
+
Tag
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=Tag.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/Tag.tsx"],"sourcesContent":["import { forwardRef, type ComponentPropsWithoutRef, type ElementType } from 'react';\nimport { tag } from '@becket-ui/tokens/recipes';\n\nimport {\n resolveLabelColorVars,\n type LabelCustomColors,\n type LabelVisual,\n} from '../helpers/labelColors';\n\ntype TagSize = 'sm' | 'md' | 'lg';\ntype TagBorderRadius = 'none' | 'sm' | 'md' | 'lg' | 'xl' | 'full';\n\nexport type TagProps = ComponentPropsWithoutRef<'span'> & {\n size?: TagSize;\n visual?: LabelVisual;\n borderRadius?: TagBorderRadius;\n withGradient?: boolean;\n customColors?: LabelCustomColors;\n as?: ElementType;\n};\n\nfunction mergeClassName(...classes: (string | undefined)[]): string {\n return classes.filter(Boolean).join(' ');\n}\n\nexport const Tag = forwardRef<HTMLSpanElement, TagProps>(\n (\n {\n size = 'md',\n visual = 'neutral',\n borderRadius = 'full',\n withGradient = false,\n customColors,\n as: Component = 'span',\n className,\n style,\n ...props\n },\n ref,\n ) => {\n const recipeClassName = tag({ size, visual, borderRadius, withGradient });\n const colorVars = resolveLabelColorVars(visual, withGradient, customColors);\n\n return (\n <Component\n ref={ref}\n {...props}\n style={{ ...colorVars, ...style }}\n className={mergeClassName(recipeClassName, className)}\n />\n );\n },\n);\n\nTag.displayName = 'Tag';\n\nexport type { LabelCustomColors, LabelVisual };\n"],"mappings":"AA4CM;AA5CN,SAAS,kBAAmE;AAC5E,SAAS,WAAW;AAEpB;AAAA,EACE;AAAA,OAGK;AAcP,SAAS,kBAAkB,SAAyC;AAClE,SAAO,QAAQ,OAAO,OAAO,EAAE,KAAK,GAAG;AACzC;AAEO,MAAM,MAAM;AAAA,EACjB,CACE;AAAA,IACE,OAAO;AAAA,IACP,SAAS;AAAA,IACT,eAAe;AAAA,IACf,eAAe;AAAA,IACf;AAAA,IACA,IAAI,YAAY;AAAA,IAChB;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AACH,UAAM,kBAAkB,IAAI,EAAE,MAAM,QAAQ,cAAc,aAAa,CAAC;AACxE,UAAM,YAAY,sBAAsB,QAAQ,cAAc,YAAY;AAE1E,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACC,GAAG;AAAA,QACJ,OAAO,EAAE,GAAG,WAAW,GAAG,MAAM;AAAA,QAChC,WAAW,eAAe,iBAAiB,SAAS;AAAA;AAAA,IACtD;AAAA,EAEJ;AACF;AAEA,IAAI,cAAc;","names":[]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type ElementType } from 'react';
|
|
2
|
+
import { type JsxStyleProps } from '@becket-ui/tokens';
|
|
3
|
+
type BaseElement = 'p' | 'span' | 'div' | 'strong' | 'em' | 'label';
|
|
4
|
+
export type TextProps<T extends ElementType = BaseElement> = React.ComponentPropsWithoutRef<T> & JsxStyleProps & {
|
|
5
|
+
as?: T;
|
|
6
|
+
};
|
|
7
|
+
export declare const Text: import("react").ForwardRefExoticComponent<TextProps<BaseElement> & import("react").RefAttributes<HTMLElement>>;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=Text.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Text.d.ts","sourceRoot":"","sources":["../../src/components/Text.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,WAAW,EAAE,MAAM,OAAO,CAAC;AACrD,OAAO,EAAO,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAE5D,KAAK,WAAW,GAAG,GAAG,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,IAAI,GAAG,OAAO,CAAC;AAEpE,MAAM,MAAM,SAAS,CAAC,CAAC,SAAS,WAAW,GAAG,WAAW,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC,CAAC,GAC5F,aAAa,GAAG;IACd,EAAE,CAAC,EAAE,CAAC,CAAC;CACR,CAAC;AAMJ,eAAO,MAAM,IAAI,gHAUhB,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef } from "react";
|
|
3
|
+
import { css } from "@becket-ui/tokens";
|
|
4
|
+
function mergeClassName(...classes) {
|
|
5
|
+
return classes.filter(Boolean).join(" ");
|
|
6
|
+
}
|
|
7
|
+
const Text = forwardRef(
|
|
8
|
+
({ as, children, css: cssProp, className, ...rest }, ref) => {
|
|
9
|
+
const Component = as ?? "p";
|
|
10
|
+
const styleClassName = css(rest);
|
|
11
|
+
return /* @__PURE__ */ jsx(Component, { ref, className: mergeClassName(styleClassName, className), children });
|
|
12
|
+
}
|
|
13
|
+
);
|
|
14
|
+
Text.displayName = "Text";
|
|
15
|
+
export {
|
|
16
|
+
Text
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=Text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/Text.tsx"],"sourcesContent":["import { forwardRef, type ElementType } from 'react';\nimport { css, type JsxStyleProps } from '@becket-ui/tokens';\n\ntype BaseElement = 'p' | 'span' | 'div' | 'strong' | 'em' | 'label';\n\nexport type TextProps<T extends ElementType = BaseElement> = React.ComponentPropsWithoutRef<T> &\n JsxStyleProps & {\n as?: T;\n };\n\nfunction mergeClassName(...classes: (string | undefined)[]): string {\n return classes.filter(Boolean).join(' ');\n}\n\nexport const Text = forwardRef<HTMLElement, TextProps>(\n ({ as, children, css: cssProp, className, ...rest }, ref) => {\n const Component = (as ?? 'p') as ElementType;\n const styleClassName = css(rest as JsxStyleProps);\n return (\n <Component ref={ref as any} className={mergeClassName(styleClassName, className)}>\n {children}\n </Component>\n );\n },\n);\n\nText.displayName = 'Text';\n\n\n"],"mappings":"AAmBM;AAnBN,SAAS,kBAAoC;AAC7C,SAAS,WAA+B;AASxC,SAAS,kBAAkB,SAAyC;AAClE,SAAO,QAAQ,OAAO,OAAO,EAAE,KAAK,GAAG;AACzC;AAEO,MAAM,OAAO;AAAA,EAClB,CAAC,EAAE,IAAI,UAAU,KAAK,SAAS,WAAW,GAAG,KAAK,GAAG,QAAQ;AAC3D,UAAM,YAAa,MAAM;AACzB,UAAM,iBAAiB,IAAI,IAAqB;AAChD,WACE,oBAAC,aAAU,KAAiB,WAAW,eAAe,gBAAgB,SAAS,GAC5E,UACH;AAAA,EAEJ;AACF;AAEA,KAAK,cAAc;","names":[]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type InputHTMLAttributes, type ReactNode } from 'react';
|
|
2
|
+
import { type FieldSize } from './Field';
|
|
3
|
+
export type TextFieldProps = Omit<InputHTMLAttributes<HTMLInputElement>, 'size'> & {
|
|
4
|
+
label?: ReactNode;
|
|
5
|
+
helperText?: ReactNode;
|
|
6
|
+
size?: FieldSize;
|
|
7
|
+
invalid?: boolean;
|
|
8
|
+
/** Stretch to the parent width. Default is token `sizes.field` (12.5rem). */
|
|
9
|
+
fullWidth?: boolean;
|
|
10
|
+
};
|
|
11
|
+
export declare const TextField: import("react").ForwardRefExoticComponent<Omit<InputHTMLAttributes<HTMLInputElement>, "size"> & {
|
|
12
|
+
label?: ReactNode;
|
|
13
|
+
helperText?: ReactNode;
|
|
14
|
+
size?: FieldSize;
|
|
15
|
+
invalid?: boolean;
|
|
16
|
+
/** Stretch to the parent width. Default is token `sizes.field` (12.5rem). */
|
|
17
|
+
fullWidth?: boolean;
|
|
18
|
+
} & import("react").RefAttributes<HTMLInputElement>>;
|
|
19
|
+
//# sourceMappingURL=TextField.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TextField.d.ts","sourceRoot":"","sources":["../../src/components/TextField.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAc,KAAK,mBAAmB,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAC7E,OAAO,EAML,KAAK,SAAS,EACf,MAAM,SAAS,CAAC;AAEjB,MAAM,MAAM,cAAc,GAAG,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC,GAAG;IACjF,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,6EAA6E;IAC7E,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,eAAO,MAAM,SAAS;YARZ,SAAS;iBACJ,SAAS;WACf,SAAS;cACN,OAAO;IACjB,6EAA6E;gBACjE,OAAO;oDA8BpB,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { forwardRef } from "react";
|
|
4
|
+
import {
|
|
5
|
+
Field,
|
|
6
|
+
FieldControl,
|
|
7
|
+
FieldError,
|
|
8
|
+
FieldHelper,
|
|
9
|
+
FieldLabel
|
|
10
|
+
} from "./Field";
|
|
11
|
+
const TextField = forwardRef(
|
|
12
|
+
({
|
|
13
|
+
label,
|
|
14
|
+
helperText,
|
|
15
|
+
size = "md",
|
|
16
|
+
invalid = false,
|
|
17
|
+
fullWidth = false,
|
|
18
|
+
id,
|
|
19
|
+
...props
|
|
20
|
+
}, ref) => {
|
|
21
|
+
return /* @__PURE__ */ jsxs(Field, { id, size, invalid, fullWidth, children: [
|
|
22
|
+
label != null ? /* @__PURE__ */ jsx(FieldLabel, { children: label }) : null,
|
|
23
|
+
/* @__PURE__ */ jsx(FieldControl, { ref, ...props }),
|
|
24
|
+
helperText != null ? invalid ? /* @__PURE__ */ jsx(FieldError, { children: helperText }) : /* @__PURE__ */ jsx(FieldHelper, { children: helperText }) : null
|
|
25
|
+
] });
|
|
26
|
+
}
|
|
27
|
+
);
|
|
28
|
+
TextField.displayName = "TextField";
|
|
29
|
+
export {
|
|
30
|
+
TextField
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=TextField.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/TextField.tsx"],"sourcesContent":["'use client';\n\nimport { forwardRef, type InputHTMLAttributes, type ReactNode } from 'react';\nimport {\n Field,\n FieldControl,\n FieldError,\n FieldHelper,\n FieldLabel,\n type FieldSize,\n} from './Field';\n\nexport type TextFieldProps = Omit<InputHTMLAttributes<HTMLInputElement>, 'size'> & {\n label?: ReactNode;\n helperText?: ReactNode;\n size?: FieldSize;\n invalid?: boolean;\n /** Stretch to the parent width. Default is token `sizes.field` (12.5rem). */\n fullWidth?: boolean;\n};\n\nexport const TextField = forwardRef<HTMLInputElement, TextFieldProps>(\n (\n {\n label,\n helperText,\n size = 'md',\n invalid = false,\n fullWidth = false,\n id,\n ...props\n },\n ref,\n ) => {\n return (\n <Field id={id} size={size} invalid={invalid} fullWidth={fullWidth}>\n {label != null ? <FieldLabel>{label}</FieldLabel> : null}\n <FieldControl ref={ref} {...props} />\n {helperText != null ? (\n invalid ? (\n <FieldError>{helperText}</FieldError>\n ) : (\n <FieldHelper>{helperText}</FieldHelper>\n )\n ) : null}\n </Field>\n );\n },\n);\n\nTextField.displayName = 'TextField';\n"],"mappings":";AAmCM,SACmB,KADnB;AAjCN,SAAS,kBAA4D;AACrE;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AAWA,MAAM,YAAY;AAAA,EACvB,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP,UAAU;AAAA,IACV,YAAY;AAAA,IACZ;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AACH,WACE,qBAAC,SAAM,IAAQ,MAAY,SAAkB,WAC1C;AAAA,eAAS,OAAO,oBAAC,cAAY,iBAAM,IAAgB;AAAA,MACpD,oBAAC,gBAAa,KAAW,GAAG,OAAO;AAAA,MAClC,cAAc,OACb,UACE,oBAAC,cAAY,sBAAW,IAExB,oBAAC,eAAa,sBAAW,IAEzB;AAAA,OACN;AAAA,EAEJ;AACF;AAEA,UAAU,cAAc;","names":[]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type ReactNode, type TextareaHTMLAttributes } from 'react';
|
|
2
|
+
import { type FieldSize } from './Field';
|
|
3
|
+
export type TextareaProps = Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, 'size'> & {
|
|
4
|
+
label?: ReactNode;
|
|
5
|
+
helperText?: ReactNode;
|
|
6
|
+
size?: FieldSize;
|
|
7
|
+
invalid?: boolean;
|
|
8
|
+
fullWidth?: boolean;
|
|
9
|
+
};
|
|
10
|
+
export declare const Textarea: import("react").ForwardRefExoticComponent<Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, "size"> & {
|
|
11
|
+
label?: ReactNode;
|
|
12
|
+
helperText?: ReactNode;
|
|
13
|
+
size?: FieldSize;
|
|
14
|
+
invalid?: boolean;
|
|
15
|
+
fullWidth?: boolean;
|
|
16
|
+
} & import("react").RefAttributes<HTMLTextAreaElement>>;
|
|
17
|
+
//# sourceMappingURL=Textarea.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Textarea.d.ts","sourceRoot":"","sources":["../../src/components/Textarea.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAc,KAAK,SAAS,EAAE,KAAK,sBAAsB,EAAE,MAAM,OAAO,CAAC;AAChF,OAAO,EAML,KAAK,SAAS,EACf,MAAM,SAAS,CAAC;AAEjB,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC,sBAAsB,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC,GAAG;IACtF,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,eAAO,MAAM,QAAQ;YAPX,SAAS;iBACJ,SAAS;WACf,SAAS;cACN,OAAO;gBACL,OAAO;uDAgCpB,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { forwardRef } from "react";
|
|
4
|
+
import {
|
|
5
|
+
Field,
|
|
6
|
+
FieldError,
|
|
7
|
+
FieldHelper,
|
|
8
|
+
FieldLabel,
|
|
9
|
+
FieldTextarea
|
|
10
|
+
} from "./Field";
|
|
11
|
+
const Textarea = forwardRef(
|
|
12
|
+
({
|
|
13
|
+
label,
|
|
14
|
+
helperText,
|
|
15
|
+
size = "md",
|
|
16
|
+
invalid = false,
|
|
17
|
+
fullWidth = false,
|
|
18
|
+
id,
|
|
19
|
+
rows,
|
|
20
|
+
...props
|
|
21
|
+
}, ref) => {
|
|
22
|
+
const rowCount = rows ?? (size === "sm" ? 2 : size === "lg" ? 6 : 4);
|
|
23
|
+
return /* @__PURE__ */ jsxs(Field, { id, size, invalid, fullWidth, children: [
|
|
24
|
+
label != null ? /* @__PURE__ */ jsx(FieldLabel, { children: label }) : null,
|
|
25
|
+
/* @__PURE__ */ jsx(FieldTextarea, { ref, rows: rowCount, ...props }),
|
|
26
|
+
helperText != null ? invalid ? /* @__PURE__ */ jsx(FieldError, { children: helperText }) : /* @__PURE__ */ jsx(FieldHelper, { children: helperText }) : null
|
|
27
|
+
] });
|
|
28
|
+
}
|
|
29
|
+
);
|
|
30
|
+
Textarea.displayName = "Textarea";
|
|
31
|
+
export {
|
|
32
|
+
Textarea
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=Textarea.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/Textarea.tsx"],"sourcesContent":["'use client';\n\nimport { forwardRef, type ReactNode, type TextareaHTMLAttributes } from 'react';\nimport {\n Field,\n FieldError,\n FieldHelper,\n FieldLabel,\n FieldTextarea,\n type FieldSize,\n} from './Field';\n\nexport type TextareaProps = Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, 'size'> & {\n label?: ReactNode;\n helperText?: ReactNode;\n size?: FieldSize;\n invalid?: boolean;\n fullWidth?: boolean;\n};\n\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(\n (\n {\n label,\n helperText,\n size = 'md',\n invalid = false,\n fullWidth = false,\n id,\n rows,\n ...props\n },\n ref,\n ) => {\n const rowCount = rows ?? (size === 'sm' ? 2 : size === 'lg' ? 6 : 4);\n return (\n <Field id={id} size={size} invalid={invalid} fullWidth={fullWidth}>\n {label != null ? <FieldLabel>{label}</FieldLabel> : null}\n <FieldTextarea ref={ref} rows={rowCount} {...props} />\n {helperText != null ? (\n invalid ? (\n <FieldError>{helperText}</FieldError>\n ) : (\n <FieldHelper>{helperText}</FieldHelper>\n )\n ) : null}\n </Field>\n );\n },\n);\n\nTextarea.displayName = 'Textarea';\n"],"mappings":";AAoCM,SACmB,KADnB;AAlCN,SAAS,kBAA+D;AACxE;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AAUA,MAAM,WAAW;AAAA,EACtB,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP,UAAU;AAAA,IACV,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AACH,UAAM,WAAW,SAAS,SAAS,OAAO,IAAI,SAAS,OAAO,IAAI;AAClE,WACE,qBAAC,SAAM,IAAQ,MAAY,SAAkB,WAC1C;AAAA,eAAS,OAAO,oBAAC,cAAY,iBAAM,IAAgB;AAAA,MACpD,oBAAC,iBAAc,KAAU,MAAM,UAAW,GAAG,OAAO;AAAA,MACnD,cAAc,OACb,UACE,oBAAC,cAAY,sBAAW,IAExB,oBAAC,eAAa,sBAAW,IAEzB;AAAA,OACN;AAAA,EAEJ;AACF;AAEA,SAAS,cAAc;","names":[]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hover / focus tooltip (generic DS primitive).
|
|
3
|
+
* Default placement top, open delay 200ms.
|
|
4
|
+
*/
|
|
5
|
+
import { type ReactNode } from 'react';
|
|
6
|
+
export type TooltipPlacement = 'top' | 'bottom' | 'left' | 'right';
|
|
7
|
+
export type TooltipProps = {
|
|
8
|
+
/** Short glossary / hint text (or node). */
|
|
9
|
+
content: ReactNode;
|
|
10
|
+
children: ReactNode;
|
|
11
|
+
placement?: TooltipPlacement;
|
|
12
|
+
/** Delay before open on hover/focus (ms). */
|
|
13
|
+
delayMs?: number;
|
|
14
|
+
disabled?: boolean;
|
|
15
|
+
};
|
|
16
|
+
export declare const Tooltip: import("react").ForwardRefExoticComponent<TooltipProps & import("react").RefAttributes<HTMLElement>>;
|
|
17
|
+
//# sourceMappingURL=Tooltip.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tooltip.d.ts","sourceRoot":"","sources":["../../src/components/Tooltip.tsx"],"names":[],"mappings":"AAEA;;;GAGG;AAEH,OAAO,EAeL,KAAK,SAAS,EAEf,MAAM,OAAO,CAAC;AAIf,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;AAEnE,MAAM,MAAM,YAAY,GAAG;IACzB,4CAA4C;IAC5C,OAAO,EAAE,SAAS,CAAC;IACnB,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,6CAA6C;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAoGF,eAAO,MAAM,OAAO,sGA6InB,CAAC"}
|