@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.
Files changed (146) hide show
  1. package/LICENSE +21 -0
  2. package/dist/components/Badge.d.ts +22 -0
  3. package/dist/components/Badge.d.ts.map +1 -0
  4. package/dist/components/Badge.js +39 -0
  5. package/dist/components/Badge.js.map +1 -0
  6. package/dist/components/Button.d.ts +24 -0
  7. package/dist/components/Button.d.ts.map +1 -0
  8. package/dist/components/Button.js +46 -0
  9. package/dist/components/Button.js.map +1 -0
  10. package/dist/components/Button.test.js +45 -0
  11. package/dist/components/Button.test.js.map +1 -0
  12. package/dist/components/Card.d.ts +37 -0
  13. package/dist/components/Card.d.ts.map +1 -0
  14. package/dist/components/Card.js +75 -0
  15. package/dist/components/Card.js.map +1 -0
  16. package/dist/components/Checkbox.d.ts +14 -0
  17. package/dist/components/Checkbox.d.ts.map +1 -0
  18. package/dist/components/Checkbox.js +46 -0
  19. package/dist/components/Checkbox.js.map +1 -0
  20. package/dist/components/Dialog.d.ts +41 -0
  21. package/dist/components/Dialog.d.ts.map +1 -0
  22. package/dist/components/Dialog.js +173 -0
  23. package/dist/components/Dialog.js.map +1 -0
  24. package/dist/components/Dialog.test.js +89 -0
  25. package/dist/components/Dialog.test.js.map +1 -0
  26. package/dist/components/Drawer.d.ts +38 -0
  27. package/dist/components/Drawer.d.ts.map +1 -0
  28. package/dist/components/Drawer.js +174 -0
  29. package/dist/components/Drawer.js.map +1 -0
  30. package/dist/components/Drawer.test.js +50 -0
  31. package/dist/components/Drawer.test.js.map +1 -0
  32. package/dist/components/Field.d.ts +37 -0
  33. package/dist/components/Field.d.ts.map +1 -0
  34. package/dist/components/Field.js +186 -0
  35. package/dist/components/Field.js.map +1 -0
  36. package/dist/components/Field.test.js +33 -0
  37. package/dist/components/Field.test.js.map +1 -0
  38. package/dist/components/Flex.d.ts +38 -0
  39. package/dist/components/Flex.d.ts.map +1 -0
  40. package/dist/components/Flex.js +85 -0
  41. package/dist/components/Flex.js.map +1 -0
  42. package/dist/components/Heading.d.ts +14 -0
  43. package/dist/components/Heading.d.ts.map +1 -0
  44. package/dist/components/Heading.js +33 -0
  45. package/dist/components/Heading.js.map +1 -0
  46. package/dist/components/Hide.d.ts +39 -0
  47. package/dist/components/Hide.d.ts.map +1 -0
  48. package/dist/components/Hide.js +51 -0
  49. package/dist/components/Hide.js.map +1 -0
  50. package/dist/components/Link.d.ts +14 -0
  51. package/dist/components/Link.d.ts.map +1 -0
  52. package/dist/components/Link.js +23 -0
  53. package/dist/components/Link.js.map +1 -0
  54. package/dist/components/Menu.d.ts +11 -0
  55. package/dist/components/Menu.d.ts.map +1 -0
  56. package/dist/components/Menu.js +132 -0
  57. package/dist/components/Menu.js.map +1 -0
  58. package/dist/components/Menu.test.js +69 -0
  59. package/dist/components/Menu.test.js.map +1 -0
  60. package/dist/components/Radio.d.ts +38 -0
  61. package/dist/components/Radio.d.ts.map +1 -0
  62. package/dist/components/Radio.js +144 -0
  63. package/dist/components/Radio.js.map +1 -0
  64. package/dist/components/Select.d.ts +17 -0
  65. package/dist/components/Select.d.ts.map +1 -0
  66. package/dist/components/Select.js +33 -0
  67. package/dist/components/Select.js.map +1 -0
  68. package/dist/components/Separator.d.ts +14 -0
  69. package/dist/components/Separator.d.ts.map +1 -0
  70. package/dist/components/Separator.js +25 -0
  71. package/dist/components/Separator.js.map +1 -0
  72. package/dist/components/SimpleGrid.d.ts +26 -0
  73. package/dist/components/SimpleGrid.d.ts.map +1 -0
  74. package/dist/components/SimpleGrid.js +98 -0
  75. package/dist/components/SimpleGrid.js.map +1 -0
  76. package/dist/components/Spinner.d.ts +10 -0
  77. package/dist/components/Spinner.d.ts.map +1 -0
  78. package/dist/components/Spinner.js +25 -0
  79. package/dist/components/Spinner.js.map +1 -0
  80. package/dist/components/Stack.d.ts +32 -0
  81. package/dist/components/Stack.d.ts.map +1 -0
  82. package/dist/components/Stack.js +81 -0
  83. package/dist/components/Stack.js.map +1 -0
  84. package/dist/components/Switch.d.ts +20 -0
  85. package/dist/components/Switch.d.ts.map +1 -0
  86. package/dist/components/Switch.js +83 -0
  87. package/dist/components/Switch.js.map +1 -0
  88. package/dist/components/Switch.test.js +28 -0
  89. package/dist/components/Switch.test.js.map +1 -0
  90. package/dist/components/Table.d.ts +23 -0
  91. package/dist/components/Table.d.ts.map +1 -0
  92. package/dist/components/Table.js +90 -0
  93. package/dist/components/Table.js.map +1 -0
  94. package/dist/components/Tabs.d.ts +21 -0
  95. package/dist/components/Tabs.d.ts.map +1 -0
  96. package/dist/components/Tabs.js +140 -0
  97. package/dist/components/Tabs.js.map +1 -0
  98. package/dist/components/Tabs.test.js +41 -0
  99. package/dist/components/Tabs.test.js.map +1 -0
  100. package/dist/components/Tag.d.ts +22 -0
  101. package/dist/components/Tag.d.ts.map +1 -0
  102. package/dist/components/Tag.js +39 -0
  103. package/dist/components/Tag.js.map +1 -0
  104. package/dist/components/Text.d.ts +9 -0
  105. package/dist/components/Text.d.ts.map +1 -0
  106. package/dist/components/Text.js +18 -0
  107. package/dist/components/Text.js.map +1 -0
  108. package/dist/components/TextField.d.ts +19 -0
  109. package/dist/components/TextField.d.ts.map +1 -0
  110. package/dist/components/TextField.js +32 -0
  111. package/dist/components/TextField.js.map +1 -0
  112. package/dist/components/Textarea.d.ts +17 -0
  113. package/dist/components/Textarea.d.ts.map +1 -0
  114. package/dist/components/Textarea.js +34 -0
  115. package/dist/components/Textarea.js.map +1 -0
  116. package/dist/components/Tooltip.d.ts +17 -0
  117. package/dist/components/Tooltip.d.ts.map +1 -0
  118. package/dist/components/Tooltip.js +217 -0
  119. package/dist/components/Tooltip.js.map +1 -0
  120. package/dist/components/Tooltip.test.js +58 -0
  121. package/dist/components/Tooltip.test.js.map +1 -0
  122. package/dist/helpers/gradientBorder.d.ts +5 -0
  123. package/dist/helpers/gradientBorder.d.ts.map +1 -0
  124. package/dist/helpers/gradientBorder.js +25 -0
  125. package/dist/helpers/gradientBorder.js.map +1 -0
  126. package/dist/helpers/labelColors.d.ts +17 -0
  127. package/dist/helpers/labelColors.d.ts.map +1 -0
  128. package/dist/helpers/labelColors.js +54 -0
  129. package/dist/helpers/labelColors.js.map +1 -0
  130. package/dist/helpers/nativeDialog.d.ts +23 -0
  131. package/dist/helpers/nativeDialog.d.ts.map +1 -0
  132. package/dist/helpers/nativeDialog.js +85 -0
  133. package/dist/helpers/nativeDialog.js.map +1 -0
  134. package/dist/helpers/responsive.d.ts +63 -0
  135. package/dist/helpers/responsive.d.ts.map +1 -0
  136. package/dist/helpers/responsive.js +78 -0
  137. package/dist/helpers/responsive.js.map +1 -0
  138. package/dist/helpers/storybookControls.d.ts +16 -0
  139. package/dist/helpers/storybookControls.d.ts.map +1 -0
  140. package/dist/helpers/storybookControls.js +40 -0
  141. package/dist/helpers/storybookControls.js.map +1 -0
  142. package/dist/index.d.ts +35 -0
  143. package/dist/index.d.ts.map +1 -0
  144. package/dist/index.js +158 -0
  145. package/dist/index.js.map +1 -0
  146. 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"}