@sbkbs/ui 1.0.5 → 2.0.0-beta.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 (209) hide show
  1. package/CHANGELOG.md +57 -0
  2. package/MIGRATION.md +96 -0
  3. package/README.md +221 -115
  4. package/dist/assets/favicon/apple-touch-icon.png +0 -0
  5. package/dist/assets/favicon/favicon-96x96.png +0 -0
  6. package/dist/assets/favicon/favicon.ico +0 -0
  7. package/dist/assets/favicon/favicon.svg +1 -0
  8. package/dist/assets/favicon/site.webmanifest +21 -0
  9. package/dist/assets/favicon/web-app-manifest-192x192.png +0 -0
  10. package/dist/assets/favicon/web-app-manifest-512x512.png +0 -0
  11. package/dist/base.css +38 -0
  12. package/dist/components/Accordion/Accordion.d.ts +13 -1
  13. package/dist/components/Accordion/Accordion.js +100 -52
  14. package/dist/components/Accordion/Accordion.js.map +1 -1
  15. package/dist/components/Alert/Alert.d.ts +17 -4
  16. package/dist/components/Alert/Alert.js +64 -20
  17. package/dist/components/Alert/Alert.js.map +1 -1
  18. package/dist/components/Avatar/Avatar.d.ts +17 -0
  19. package/dist/components/Avatar/Avatar.js +66 -0
  20. package/dist/components/Avatar/Avatar.js.map +1 -0
  21. package/dist/components/Badge/Badge.d.ts +11 -2
  22. package/dist/components/Badge/Badge.js +42 -30
  23. package/dist/components/Badge/Badge.js.map +1 -1
  24. package/dist/components/Breadcrumb/Breadcrumb.d.ts +5 -2
  25. package/dist/components/Breadcrumb/Breadcrumb.js +23 -16
  26. package/dist/components/Breadcrumb/Breadcrumb.js.map +1 -1
  27. package/dist/components/Button/Button.d.ts +10 -8
  28. package/dist/components/Button/Button.js +73 -114
  29. package/dist/components/Button/Button.js.map +1 -1
  30. package/dist/components/Card/Card.d.ts +33 -3
  31. package/dist/components/Card/Card.js +91 -30
  32. package/dist/components/Card/Card.js.map +1 -1
  33. package/dist/components/Checkbox/Checkbox.d.ts +4 -1
  34. package/dist/components/Checkbox/Checkbox.js +32 -31
  35. package/dist/components/Checkbox/Checkbox.js.map +1 -1
  36. package/dist/components/Chip/Chip.d.ts +7 -1
  37. package/dist/components/Chip/Chip.js +19 -9
  38. package/dist/components/Chip/Chip.js.map +1 -1
  39. package/dist/components/Combobox/Combobox.d.ts +10 -2
  40. package/dist/components/Combobox/Combobox.js +146 -133
  41. package/dist/components/Combobox/Combobox.js.map +1 -1
  42. package/dist/components/Divider/Divider.d.ts +7 -1
  43. package/dist/components/Divider/Divider.js +28 -12
  44. package/dist/components/Divider/Divider.js.map +1 -1
  45. package/dist/components/DropdownMenu/DropdownMenu.d.ts +33 -0
  46. package/dist/components/DropdownMenu/DropdownMenu.js +147 -0
  47. package/dist/components/DropdownMenu/DropdownMenu.js.map +1 -0
  48. package/dist/components/EmptyState/EmptyState.d.ts +7 -1
  49. package/dist/components/EmptyState/EmptyState.js +28 -19
  50. package/dist/components/EmptyState/EmptyState.js.map +1 -1
  51. package/dist/components/Field/Field.d.ts +21 -0
  52. package/dist/components/Field/Field.js +35 -0
  53. package/dist/components/Field/Field.js.map +1 -0
  54. package/dist/components/FileUpload/FileUpload.d.ts +9 -2
  55. package/dist/components/FileUpload/FileUpload.js +128 -102
  56. package/dist/components/FileUpload/FileUpload.js.map +1 -1
  57. package/dist/components/Footer/Footer.d.ts +19 -6
  58. package/dist/components/Footer/Footer.js +47 -50
  59. package/dist/components/Footer/Footer.js.map +1 -1
  60. package/dist/components/GlassPanel/GlassPanel.d.ts +18 -0
  61. package/dist/components/GlassPanel/GlassPanel.js +39 -0
  62. package/dist/components/GlassPanel/GlassPanel.js.map +1 -0
  63. package/dist/components/Header/Header.d.ts +27 -10
  64. package/dist/components/Header/Header.js +98 -98
  65. package/dist/components/Header/Header.js.map +1 -1
  66. package/dist/components/Highlight/Highlight.d.ts +13 -0
  67. package/dist/components/Highlight/Highlight.js +18 -0
  68. package/dist/components/Highlight/Highlight.js.map +1 -0
  69. package/dist/components/Icon/Icon.d.ts +21 -0
  70. package/dist/components/Icon/Icon.js +31 -0
  71. package/dist/components/Icon/Icon.js.map +1 -0
  72. package/dist/components/IconButton/IconButton.d.ts +12 -0
  73. package/dist/components/IconButton/IconButton.js +49 -0
  74. package/dist/components/IconButton/IconButton.js.map +1 -0
  75. package/dist/components/Input/Input.d.ts +3 -2
  76. package/dist/components/Input/Input.js +51 -69
  77. package/dist/components/Input/Input.js.map +1 -1
  78. package/dist/components/Layout/Layout.d.ts +2 -0
  79. package/dist/components/Layout/Layout.js +24 -18
  80. package/dist/components/Layout/Layout.js.map +1 -1
  81. package/dist/components/Logo/Logo.d.ts +27 -0
  82. package/dist/components/Logo/Logo.js +107 -0
  83. package/dist/components/Logo/Logo.js.map +1 -0
  84. package/dist/components/MiniCard/MiniCard.d.ts +21 -0
  85. package/dist/components/MiniCard/MiniCard.js +90 -0
  86. package/dist/components/MiniCard/MiniCard.js.map +1 -0
  87. package/dist/components/Modal/Modal.d.ts +16 -3
  88. package/dist/components/Modal/Modal.js +124 -93
  89. package/dist/components/Modal/Modal.js.map +1 -1
  90. package/dist/components/Navigation/Navigation.d.ts +1 -0
  91. package/dist/components/Navigation/Navigation.js +14 -14
  92. package/dist/components/Navigation/Navigation.js.map +1 -1
  93. package/dist/components/NumberInput/NumberInput.d.ts +5 -2
  94. package/dist/components/NumberInput/NumberInput.js +98 -128
  95. package/dist/components/NumberInput/NumberInput.js.map +1 -1
  96. package/dist/components/PageHeader/PageHeader.d.ts +8 -1
  97. package/dist/components/PageHeader/PageHeader.js +26 -25
  98. package/dist/components/PageHeader/PageHeader.js.map +1 -1
  99. package/dist/components/Pagination/Pagination.d.ts +15 -2
  100. package/dist/components/Pagination/Pagination.js +68 -34
  101. package/dist/components/Pagination/Pagination.js.map +1 -1
  102. package/dist/components/Paragraph/Paragraph.d.ts +8 -2
  103. package/dist/components/Paragraph/Paragraph.js +39 -36
  104. package/dist/components/Paragraph/Paragraph.js.map +1 -1
  105. package/dist/components/Popover/Popover.d.ts +12 -1
  106. package/dist/components/Popover/Popover.js +49 -37
  107. package/dist/components/Popover/Popover.js.map +1 -1
  108. package/dist/components/ProgressBar/ProgressBar.d.ts +18 -0
  109. package/dist/components/ProgressBar/ProgressBar.js +71 -0
  110. package/dist/components/ProgressBar/ProgressBar.js.map +1 -0
  111. package/dist/components/Radio/Radio.d.ts +2 -1
  112. package/dist/components/Radio/Radio.js +27 -31
  113. package/dist/components/Radio/Radio.js.map +1 -1
  114. package/dist/components/SectionHeader/SectionHeader.d.ts +6 -1
  115. package/dist/components/SectionHeader/SectionHeader.js +14 -12
  116. package/dist/components/SectionHeader/SectionHeader.js.map +1 -1
  117. package/dist/components/Select/Select.d.ts +6 -2
  118. package/dist/components/Select/Select.js +47 -35
  119. package/dist/components/Select/Select.js.map +1 -1
  120. package/dist/components/SideNav/SideNav.d.ts +55 -0
  121. package/dist/components/SideNav/SideNav.js +141 -0
  122. package/dist/components/SideNav/SideNav.js.map +1 -0
  123. package/dist/components/Skeleton/Skeleton.d.ts +12 -1
  124. package/dist/components/Skeleton/Skeleton.js +33 -18
  125. package/dist/components/Skeleton/Skeleton.js.map +1 -1
  126. package/dist/components/Spinner/Spinner.d.ts +15 -0
  127. package/dist/components/Spinner/Spinner.js +57 -0
  128. package/dist/components/Spinner/Spinner.js.map +1 -0
  129. package/dist/components/Stepper/Stepper.d.ts +1 -1
  130. package/dist/components/Stepper/Stepper.js +68 -55
  131. package/dist/components/Stepper/Stepper.js.map +1 -1
  132. package/dist/components/Subtitle/Subtitle.d.ts +9 -3
  133. package/dist/components/Subtitle/Subtitle.js +29 -35
  134. package/dist/components/Subtitle/Subtitle.js.map +1 -1
  135. package/dist/components/Switch/Switch.d.ts +2 -1
  136. package/dist/components/Switch/Switch.js +45 -33
  137. package/dist/components/Switch/Switch.js.map +1 -1
  138. package/dist/components/Table/Table.d.ts +19 -1
  139. package/dist/components/Table/Table.js +48 -11
  140. package/dist/components/Table/Table.js.map +1 -1
  141. package/dist/components/Tabs/Tabs.d.ts +16 -2
  142. package/dist/components/Tabs/Tabs.js +80 -44
  143. package/dist/components/Tabs/Tabs.js.map +1 -1
  144. package/dist/components/Tag/Tag.d.ts +8 -1
  145. package/dist/components/Tag/Tag.js +27 -12
  146. package/dist/components/Tag/Tag.js.map +1 -1
  147. package/dist/components/Textarea/Textarea.d.ts +3 -1
  148. package/dist/components/Textarea/Textarea.js +36 -40
  149. package/dist/components/Textarea/Textarea.js.map +1 -1
  150. package/dist/components/Title/Title.d.ts +9 -3
  151. package/dist/components/Title/Title.js +42 -42
  152. package/dist/components/Title/Title.js.map +1 -1
  153. package/dist/components/Toast/Toast.d.ts +39 -11
  154. package/dist/components/Toast/Toast.js +130 -76
  155. package/dist/components/Toast/Toast.js.map +1 -1
  156. package/dist/components/Tooltip/Tooltip.d.ts +12 -2
  157. package/dist/components/Tooltip/Tooltip.js +50 -32
  158. package/dist/components/Tooltip/Tooltip.js.map +1 -1
  159. package/dist/components/Typography/weight.d.ts +9 -0
  160. package/dist/components/Typography/weight.js +5 -0
  161. package/dist/components/Typography/weight.js.map +1 -0
  162. package/dist/fonts.css +8 -0
  163. package/dist/index.cjs +2 -0
  164. package/dist/index.cjs.map +1 -0
  165. package/dist/index.d.ts +55 -43
  166. package/dist/index.js +118 -83
  167. package/dist/index.js.map +1 -1
  168. package/dist/reset.css +9 -0
  169. package/dist/styles.css +1 -0
  170. package/dist/tailwind.css +153 -0
  171. package/dist/theme/ThemeProvider.d.ts +21 -3
  172. package/dist/theme/ThemeProvider.js +57 -18
  173. package/dist/theme/ThemeProvider.js.map +1 -1
  174. package/dist/theme/tokens.d.ts +43 -0
  175. package/dist/theme/tokens.js +39 -0
  176. package/dist/theme/tokens.js.map +1 -0
  177. package/dist/theme.css +296 -261
  178. package/dist/tokens.css +327 -0
  179. package/dist/utils/cn.d.ts +2 -2
  180. package/dist/utils/cn.js +19 -4
  181. package/dist/utils/cn.js.map +1 -1
  182. package/dist/utils/styles.d.ts +37 -0
  183. package/dist/utils/styles.js +35 -0
  184. package/dist/utils/styles.js.map +1 -0
  185. package/package.json +140 -114
  186. package/dist/components/Accordion/Accordion.stories.d.ts +0 -7
  187. package/dist/components/Alert/Alert.stories.d.ts +0 -8
  188. package/dist/components/Badge/Badge.stories.d.ts +0 -8
  189. package/dist/components/Breadcrumb/Breadcrumb.stories.d.ts +0 -8
  190. package/dist/components/Button/Button.stories.d.ts +0 -7
  191. package/dist/components/Card/Card.stories.d.ts +0 -8
  192. package/dist/components/Checkbox/Checkbox.stories.d.ts +0 -7
  193. package/dist/components/Combobox/Combobox.stories.d.ts +0 -9
  194. package/dist/components/Feedback/Feedback.stories.d.ts +0 -5
  195. package/dist/components/FileUpload/FileUpload.stories.d.ts +0 -10
  196. package/dist/components/Input/Input.stories.d.ts +0 -9
  197. package/dist/components/Modal/Modal.stories.d.ts +0 -8
  198. package/dist/components/NumberInput/NumberInput.stories.d.ts +0 -8
  199. package/dist/components/Pagination/Pagination.stories.d.ts +0 -8
  200. package/dist/components/Radio/Radio.stories.d.ts +0 -7
  201. package/dist/components/Select/Select.stories.d.ts +0 -8
  202. package/dist/components/Stepper/Stepper.stories.d.ts +0 -8
  203. package/dist/components/Switch/Switch.stories.d.ts +0 -8
  204. package/dist/components/Tabs/Tabs.stories.d.ts +0 -8
  205. package/dist/components/Textarea/Textarea.stories.d.ts +0 -7
  206. package/dist/components/Toast/Toast.stories.d.ts +0 -8
  207. package/dist/oficios-ui.css +0 -1
  208. package/dist/oficios-ui.umd.cjs +0 -2
  209. package/dist/oficios-ui.umd.cjs.map +0 -1
@@ -1,62 +1,98 @@
1
- import { jsxs as v, jsx as i } from "react/jsx-runtime";
2
- import { useState as p } from "react";
3
- import { cn as f } from "../../utils/cn.js";
4
- const x = ({ items: n, defaultTabId: s }) => {
5
- var b;
6
- const [d, l] = p(s ?? ((b = n[0]) == null ? void 0 : b.id)), a = n.find((r) => r.id === d) ?? n[0], c = Math.max(
7
- 0,
8
- n.findIndex((r) => r.id === (a == null ? void 0 : a.id))
9
- ), t = (r) => {
10
- const e = n[r];
11
- if (!e)
12
- return;
13
- l(e.id);
14
- const o = document.getElementById(`tab-${e.id}`);
15
- o == null || o.focus();
1
+ import { jsxs as k, jsx as c } from "react/jsx-runtime";
2
+ import { useState as j, useId as z, useRef as K } from "react";
3
+ import { cn as h } from "../../utils/cn.js";
4
+ import { transitionColors as S, buttonReset as _ } from "../../utils/styles.js";
5
+ const q = {
6
+ pill: {
7
+ list: "inline-flex flex-wrap gap-1 rounded-sbk-sm bg-sbk-surface-sunken p-1",
8
+ tab: "rounded-sbk-xs px-3 py-1.5",
9
+ active: "bg-sbk-surface text-sbk-fg-heading shadow-sbk-sm",
10
+ idle: "text-sbk-fg-muted hover:text-sbk-fg"
11
+ },
12
+ line: {
13
+ list: "flex flex-wrap gap-4 border-b border-sbk-line",
14
+ tab: "-mb-px border-b-2 px-1 py-2.5",
15
+ active: "border-sbk-primary text-sbk-fg-heading",
16
+ idle: "border-transparent text-sbk-fg-muted hover:border-sbk-line-strong hover:text-sbk-fg"
17
+ }
18
+ }, B = ({
19
+ items: i,
20
+ defaultTabId: m,
21
+ tabId: f,
22
+ onTabChange: r,
23
+ variant: y = "pill",
24
+ className: w,
25
+ "aria-label": $
26
+ }) => {
27
+ var x;
28
+ const [A, N] = j(m ?? ((x = i.find((e) => !e.disabled)) == null ? void 0 : x.id)), I = f ?? A, l = z(), u = K(null), t = i.find((e) => e.id === I) ?? i[0], o = q[y], p = (e) => {
29
+ f === void 0 && N(e), r == null || r(e);
30
+ }, R = (e, a) => {
31
+ var v, g;
32
+ const s = i.map((b, D) => b.disabled ? -1 : D).filter((b) => b >= 0), n = s.indexOf(a), d = {
33
+ ArrowRight: s[(n + 1) % s.length],
34
+ ArrowLeft: s[(n - 1 + s.length) % s.length],
35
+ Home: s[0],
36
+ End: s[s.length - 1]
37
+ }[e.key];
38
+ d !== void 0 && (e.preventDefault(), p(i[d].id), (g = (v = u.current) == null ? void 0 : v.querySelectorAll('[role="tab"]')[d]) == null || g.focus());
16
39
  };
17
- return /* @__PURE__ */ v("div", { className: "grid gap-3", children: [
18
- /* @__PURE__ */ i(
40
+ return /* @__PURE__ */ k("div", { className: h("grid gap-3", w), children: [
41
+ /* @__PURE__ */ c(
19
42
  "div",
20
43
  {
44
+ ref: u,
45
+ "aria-label": $,
21
46
  "aria-orientation": "horizontal",
22
- className: "inline-flex flex-wrap gap-1 rounded-[var(--border-radius-md)] bg-[var(--bg-tertiary)] p-1",
47
+ className: o.list,
23
48
  role: "tablist",
24
- children: n.map((r, e) => /* @__PURE__ */ i(
25
- "button",
26
- {
27
- "aria-controls": `panel-${r.id}`,
28
- "aria-selected": d === r.id,
29
- className: f(
30
- "rounded-[var(--border-radius-sm)] px-3 py-1.5 text-sm transition",
31
- d === r.id ? "bg-[var(--bg-secondary)] text-[var(--text-primary)] shadow-[var(--shadow-xs)]" : "text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]"
32
- ),
33
- id: `tab-${r.id}`,
34
- onClick: () => l(r.id),
35
- onKeyDown: (o) => {
36
- o.key === "ArrowRight" ? (o.preventDefault(), t((e + 1) % n.length)) : o.key === "ArrowLeft" ? (o.preventDefault(), t((e - 1 + n.length) % n.length)) : o.key === "Home" ? (o.preventDefault(), t(0)) : o.key === "End" && (o.preventDefault(), t(n.length - 1));
49
+ children: i.map((e, a) => {
50
+ const s = e.id === (t == null ? void 0 : t.id);
51
+ return /* @__PURE__ */ k(
52
+ "button",
53
+ {
54
+ "aria-controls": `${l}-panel-${e.id}`,
55
+ "aria-selected": s,
56
+ className: h(
57
+ _,
58
+ "inline-flex cursor-pointer items-center gap-2 text-sm font-semibold disabled:cursor-not-allowed disabled:opacity-50 [&_svg]:size-4",
59
+ "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-sbk-focus focus-visible:outline-solid",
60
+ S,
61
+ o.tab,
62
+ s ? o.active : o.idle
63
+ ),
64
+ disabled: e.disabled,
65
+ id: `${l}-tab-${e.id}`,
66
+ onClick: () => p(e.id),
67
+ onKeyDown: (n) => R(n, a),
68
+ role: "tab",
69
+ tabIndex: s ? 0 : -1,
70
+ type: "button",
71
+ children: [
72
+ e.icon && /* @__PURE__ */ c("span", { "aria-hidden": "true", className: "inline-flex", children: e.icon }),
73
+ e.label
74
+ ]
37
75
  },
38
- role: "tab",
39
- tabIndex: e === c ? 0 : -1,
40
- type: "button",
41
- children: r.label
42
- },
43
- r.id
44
- ))
76
+ e.id
77
+ );
78
+ })
45
79
  }
46
80
  ),
47
- /* @__PURE__ */ i(
81
+ t && /* @__PURE__ */ c(
48
82
  "div",
49
83
  {
50
- "aria-labelledby": `tab-${(a == null ? void 0 : a.id) ?? ""}`,
51
- className: "rounded-[var(--border-radius-md)] border border-[var(--border-color)] bg-[var(--bg-secondary)] p-4",
52
- id: `panel-${(a == null ? void 0 : a.id) ?? ""}`,
84
+ "aria-labelledby": `${l}-tab-${t.id}`,
85
+ className: "rounded-sbk-sm font-light text-sbk-fg focus-visible:outline-2 focus-visible:outline-sbk-focus focus-visible:outline-solid",
86
+ id: `${l}-panel-${t.id}`,
53
87
  role: "tabpanel",
54
- children: a == null ? void 0 : a.content
88
+ tabIndex: 0,
89
+ children: t.content
55
90
  }
56
91
  )
57
92
  ] });
58
93
  };
94
+ B.displayName = "Tabs";
59
95
  export {
60
- x as Tabs
96
+ B as Tabs
61
97
  };
62
98
  //# sourceMappingURL=Tabs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Tabs.js","sources":["../../../src/components/Tabs/Tabs.tsx"],"sourcesContent":["import type React from 'react';\nimport { useState } from 'react';\nimport { cn } from '../../utils/cn';\n\nexport interface TabItem {\n content: React.ReactNode;\n id: string;\n label: string;\n}\n\nexport interface TabsProps {\n defaultTabId?: string;\n items: TabItem[];\n}\n\nexport const Tabs: React.FC<TabsProps> = ({ items, defaultTabId }) => {\n const [activeTab, setActiveTab] = useState(defaultTabId ?? items[0]?.id);\n const selected = items.find((item) => item.id === activeTab) ?? items[0];\n const selectedIndex = Math.max(\n 0,\n items.findIndex((item) => item.id === selected?.id),\n );\n\n const moveFocus = (nextIndex: number) => {\n const item = items[nextIndex];\n if (!item) {\n return;\n }\n setActiveTab(item.id);\n const tab = document.getElementById(`tab-${item.id}`);\n tab?.focus();\n };\n\n return (\n <div className=\"grid gap-3\">\n <div\n aria-orientation=\"horizontal\"\n className=\"inline-flex flex-wrap gap-1 rounded-[var(--border-radius-md)] bg-[var(--bg-tertiary)] p-1\"\n role=\"tablist\"\n >\n {items.map((item, index) => (\n <button\n aria-controls={`panel-${item.id}`}\n aria-selected={activeTab === item.id}\n className={cn(\n 'rounded-[var(--border-radius-sm)] px-3 py-1.5 text-sm transition',\n activeTab === item.id\n ? 'bg-[var(--bg-secondary)] text-[var(--text-primary)] shadow-[var(--shadow-xs)]'\n : 'text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]',\n )}\n id={`tab-${item.id}`}\n key={item.id}\n onClick={() => setActiveTab(item.id)}\n onKeyDown={(e) => {\n if (e.key === 'ArrowRight') {\n e.preventDefault();\n moveFocus((index + 1) % items.length);\n } else if (e.key === 'ArrowLeft') {\n e.preventDefault();\n moveFocus((index - 1 + items.length) % items.length);\n } else if (e.key === 'Home') {\n e.preventDefault();\n moveFocus(0);\n } else if (e.key === 'End') {\n e.preventDefault();\n moveFocus(items.length - 1);\n }\n }}\n role=\"tab\"\n tabIndex={index === selectedIndex ? 0 : -1}\n type=\"button\"\n >\n {item.label}\n </button>\n ))}\n </div>\n <div\n aria-labelledby={`tab-${selected?.id ?? ''}`}\n className=\"rounded-[var(--border-radius-md)] border border-[var(--border-color)] bg-[var(--bg-secondary)] p-4\"\n id={`panel-${selected?.id ?? ''}`}\n role=\"tabpanel\"\n >\n {selected?.content}\n </div>\n </div>\n );\n};\n"],"names":["Tabs","items","defaultTabId","activeTab","setActiveTab","useState","_a","selected","item","selectedIndex","moveFocus","nextIndex","tab","jsxs","jsx","index","cn","e"],"mappings":";;;AAeO,MAAMA,IAA4B,CAAC,EAAE,OAAAC,GAAO,cAAAC,QAAmB;;AACpE,QAAM,CAACC,GAAWC,CAAY,IAAIC,EAASH,OAAgBI,IAAAL,EAAM,CAAC,MAAP,gBAAAK,EAAU,GAAE,GACjEC,IAAWN,EAAM,KAAK,CAACO,MAASA,EAAK,OAAOL,CAAS,KAAKF,EAAM,CAAC,GACjEQ,IAAgB,KAAK;AAAA,IACzB;AAAA,IACAR,EAAM,UAAU,CAACO,MAASA,EAAK,QAAOD,KAAA,gBAAAA,EAAU,GAAE;AAAA,EAAA,GAG9CG,IAAY,CAACC,MAAsB;AACvC,UAAMH,IAAOP,EAAMU,CAAS;AAC5B,QAAI,CAACH;AACH;AAEF,IAAAJ,EAAaI,EAAK,EAAE;AACpB,UAAMI,IAAM,SAAS,eAAe,OAAOJ,EAAK,EAAE,EAAE;AACpD,IAAAI,KAAA,QAAAA,EAAK;AAAA,EACP;AAEA,SACE,gBAAAC,EAAC,OAAA,EAAI,WAAU,cACb,UAAA;AAAA,IAAA,gBAAAC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,oBAAiB;AAAA,QACjB,WAAU;AAAA,QACV,MAAK;AAAA,QAEJ,UAAAb,EAAM,IAAI,CAACO,GAAMO,MAChB,gBAAAD;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,iBAAe,SAASN,EAAK,EAAE;AAAA,YAC/B,iBAAeL,MAAcK,EAAK;AAAA,YAClC,WAAWQ;AAAA,cACT;AAAA,cACAb,MAAcK,EAAK,KACf,kFACA;AAAA,YAAA;AAAA,YAEN,IAAI,OAAOA,EAAK,EAAE;AAAA,YAElB,SAAS,MAAMJ,EAAaI,EAAK,EAAE;AAAA,YACnC,WAAW,CAACS,MAAM;AAChB,cAAIA,EAAE,QAAQ,gBACZA,EAAE,eAAA,GACFP,GAAWK,IAAQ,KAAKd,EAAM,MAAM,KAC3BgB,EAAE,QAAQ,eACnBA,EAAE,eAAA,GACFP,GAAWK,IAAQ,IAAId,EAAM,UAAUA,EAAM,MAAM,KAC1CgB,EAAE,QAAQ,UACnBA,EAAE,eAAA,GACFP,EAAU,CAAC,KACFO,EAAE,QAAQ,UACnBA,EAAE,eAAA,GACFP,EAAUT,EAAM,SAAS,CAAC;AAAA,YAE9B;AAAA,YACA,MAAK;AAAA,YACL,UAAUc,MAAUN,IAAgB,IAAI;AAAA,YACxC,MAAK;AAAA,YAEJ,UAAAD,EAAK;AAAA,UAAA;AAAA,UArBDA,EAAK;AAAA,QAAA,CAuBb;AAAA,MAAA;AAAA,IAAA;AAAA,IAEH,gBAAAM;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,mBAAiB,QAAOP,KAAA,gBAAAA,EAAU,OAAM,EAAE;AAAA,QAC1C,WAAU;AAAA,QACV,IAAI,UAASA,KAAA,gBAAAA,EAAU,OAAM,EAAE;AAAA,QAC/B,MAAK;AAAA,QAEJ,UAAAA,KAAA,gBAAAA,EAAU;AAAA,MAAA;AAAA,IAAA;AAAA,EACb,GACF;AAEJ;"}
1
+ {"version":3,"file":"Tabs.js","sources":["../../../src/components/Tabs/Tabs.tsx"],"sourcesContent":["import type React from 'react';\nimport { useId, useRef, useState } from 'react';\nimport { cn } from '../../utils/cn';\nimport { buttonReset, transitionColors } from '../../utils/styles';\n\nexport interface TabItem {\n content: React.ReactNode;\n disabled?: boolean;\n icon?: React.ReactNode;\n id: string;\n label: React.ReactNode;\n}\n\nexport interface TabsProps {\n /** Rótulo acessível da lista de abas. */\n 'aria-label'?: string;\n className?: string;\n defaultTabId?: string;\n items: TabItem[];\n onTabChange?: (id: string) => void;\n /** Aba ativa controlada externamente. */\n tabId?: string;\n /** `pill`: segmentado. `line`: sublinhado. Padrão: pill. */\n variant?: 'pill' | 'line';\n}\n\nconst TAB_VARIANT = {\n pill: {\n list: 'inline-flex flex-wrap gap-1 rounded-sbk-sm bg-sbk-surface-sunken p-1',\n tab: 'rounded-sbk-xs px-3 py-1.5',\n active: 'bg-sbk-surface text-sbk-fg-heading shadow-sbk-sm',\n idle: 'text-sbk-fg-muted hover:text-sbk-fg',\n },\n line: {\n list: 'flex flex-wrap gap-4 border-b border-sbk-line',\n tab: '-mb-px border-b-2 px-1 py-2.5',\n active: 'border-sbk-primary text-sbk-fg-heading',\n idle: 'border-transparent text-sbk-fg-muted hover:border-sbk-line-strong hover:text-sbk-fg',\n },\n} as const;\n\n/** Abas (padrão ARIA tabs com ativação automática): setas, Home e End. */\nexport const Tabs = ({\n items,\n defaultTabId,\n tabId,\n onTabChange,\n variant = 'pill',\n className,\n 'aria-label': ariaLabel,\n}: TabsProps) => {\n const [internal, setInternal] = useState(defaultTabId ?? items.find((i) => !i.disabled)?.id);\n const activeId = tabId ?? internal;\n const baseId = useId();\n const listRef = useRef<HTMLDivElement>(null);\n const selected = items.find((item) => item.id === activeId) ?? items[0];\n const styles = TAB_VARIANT[variant];\n\n const select = (id: string) => {\n if (tabId === undefined) setInternal(id);\n onTabChange?.(id);\n };\n\n const onKeyDown = (e: React.KeyboardEvent, index: number) => {\n const enabled = items.map((it, i) => (it.disabled ? -1 : i)).filter((i) => i >= 0);\n const pos = enabled.indexOf(index);\n const next: Record<string, number | undefined> = {\n ArrowRight: enabled[(pos + 1) % enabled.length],\n ArrowLeft: enabled[(pos - 1 + enabled.length) % enabled.length],\n Home: enabled[0],\n End: enabled[enabled.length - 1],\n };\n const target = next[e.key];\n if (target === undefined) return;\n e.preventDefault();\n select(items[target].id);\n listRef.current?.querySelectorAll<HTMLButtonElement>('[role=\"tab\"]')[target]?.focus();\n };\n\n return (\n <div className={cn('grid gap-3', className)}>\n <div\n ref={listRef}\n aria-label={ariaLabel}\n aria-orientation=\"horizontal\"\n className={styles.list}\n role=\"tablist\"\n >\n {items.map((item, index) => {\n const isActive = item.id === selected?.id;\n return (\n <button\n key={item.id}\n aria-controls={`${baseId}-panel-${item.id}`}\n aria-selected={isActive}\n className={cn(\n buttonReset,\n 'inline-flex cursor-pointer items-center gap-2 text-sm font-semibold disabled:cursor-not-allowed disabled:opacity-50 [&_svg]:size-4',\n 'focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-sbk-focus focus-visible:outline-solid',\n transitionColors,\n styles.tab,\n isActive ? styles.active : styles.idle,\n )}\n disabled={item.disabled}\n id={`${baseId}-tab-${item.id}`}\n onClick={() => select(item.id)}\n onKeyDown={(e) => onKeyDown(e, index)}\n role=\"tab\"\n tabIndex={isActive ? 0 : -1}\n type=\"button\"\n >\n {item.icon && (\n <span aria-hidden=\"true\" className=\"inline-flex\">\n {item.icon}\n </span>\n )}\n {item.label}\n </button>\n );\n })}\n </div>\n {selected && (\n <div\n aria-labelledby={`${baseId}-tab-${selected.id}`}\n className=\"rounded-sbk-sm font-light text-sbk-fg focus-visible:outline-2 focus-visible:outline-sbk-focus focus-visible:outline-solid\"\n id={`${baseId}-panel-${selected.id}`}\n role=\"tabpanel\"\n tabIndex={0}\n >\n {selected.content}\n </div>\n )}\n </div>\n );\n};\n\nTabs.displayName = 'Tabs';\n"],"names":["TAB_VARIANT","Tabs","items","defaultTabId","tabId","onTabChange","variant","className","ariaLabel","internal","setInternal","useState","_a","i","activeId","baseId","useId","listRef","useRef","selected","item","styles","select","id","onKeyDown","index","enabled","it","pos","target","_b","cn","jsx","isActive","jsxs","buttonReset","transitionColors","e"],"mappings":"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"}
@@ -1,5 +1,12 @@
1
1
  import type React from 'react';
2
2
  export interface TagProps extends React.HTMLAttributes<HTMLSpanElement> {
3
+ icon?: React.ReactNode;
3
4
  onRemove?: () => void;
5
+ /** Rótulo acessível do botão de remover. Padrão: "Remover". */
6
+ removeLabel?: string;
4
7
  }
5
- export declare const Tag: React.FC<TagProps>;
8
+ /** Etiqueta de metadado, opcionalmente removível. */
9
+ export declare const Tag: {
10
+ ({ className, children, icon, onRemove, removeLabel, ...props }: TagProps): import("react/jsx-runtime").JSX.Element;
11
+ displayName: string;
12
+ };
@@ -1,29 +1,44 @@
1
- import { jsxs as o, jsx as n } from "react/jsx-runtime";
2
- import { cn as s } from "../../utils/cn.js";
3
- const l = ({ className: e, children: t, onRemove: r, ...a }) => /* @__PURE__ */ o(
1
+ import { jsxs as f, jsx as t } from "react/jsx-runtime";
2
+ import { X as l } from "lucide-react";
3
+ import { cn as n } from "../../utils/cn.js";
4
+ import { focusRing as m, buttonReset as b } from "../../utils/styles.js";
5
+ const u = ({
6
+ className: o,
7
+ children: e,
8
+ icon: s,
9
+ onRemove: r,
10
+ removeLabel: i = "Remover",
11
+ ...a
12
+ }) => /* @__PURE__ */ f(
4
13
  "span",
5
14
  {
6
- className: s(
7
- "inline-flex items-center gap-1 rounded-[var(--border-radius-sm)] border border-[var(--border-color)] bg-[var(--bg-secondary)] px-2.5 py-1 text-xs text-[var(--text-secondary)]",
8
- e
15
+ className: n(
16
+ "inline-flex items-center gap-1.5 rounded-sbk-xs border border-sbk-line bg-sbk-surface px-2.5 py-1 text-xs font-light text-sbk-fg [&_svg]:size-3.5",
17
+ o
9
18
  ),
10
19
  ...a,
11
20
  children: [
12
- t,
13
- r && /* @__PURE__ */ n(
21
+ s && /* @__PURE__ */ t("span", { "aria-hidden": "true", className: "inline-flex text-sbk-fg-muted", children: s }),
22
+ e,
23
+ r && /* @__PURE__ */ t(
14
24
  "button",
15
25
  {
16
- "aria-label": "Remover tag",
17
- className: "inline-flex h-4 w-4 items-center justify-center rounded-full text-[var(--text-muted)] transition hover:bg-[var(--bg-hover)] hover:text-[var(--text-primary)]",
26
+ "aria-label": typeof e == "string" ? `${i} ${e}` : i,
27
+ className: n(
28
+ b,
29
+ "-mr-1 inline-flex size-4 cursor-pointer items-center justify-center rounded-full text-sbk-fg-muted hover:bg-sbk-surface-hover hover:text-sbk-fg",
30
+ m
31
+ ),
18
32
  onClick: r,
19
33
  type: "button",
20
- children: "×"
34
+ children: /* @__PURE__ */ t(l, { "aria-hidden": "true" })
21
35
  }
22
36
  )
23
37
  ]
24
38
  }
25
39
  );
40
+ u.displayName = "Tag";
26
41
  export {
27
- l as Tag
42
+ u as Tag
28
43
  };
29
44
  //# sourceMappingURL=Tag.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Tag.js","sources":["../../../src/components/Tag/Tag.tsx"],"sourcesContent":["import type React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport interface TagProps extends React.HTMLAttributes<HTMLSpanElement> {\n onRemove?: () => void;\n}\n\nexport const Tag: React.FC<TagProps> = ({ className, children, onRemove, ...props }) => {\n return (\n <span\n className={cn(\n 'inline-flex items-center gap-1 rounded-[var(--border-radius-sm)] border border-[var(--border-color)] bg-[var(--bg-secondary)] px-2.5 py-1 text-xs text-[var(--text-secondary)]',\n className,\n )}\n {...props}\n >\n {children}\n {onRemove && (\n <button\n aria-label=\"Remover tag\"\n className=\"inline-flex h-4 w-4 items-center justify-center rounded-full text-[var(--text-muted)] transition hover:bg-[var(--bg-hover)] hover:text-[var(--text-primary)]\"\n onClick={onRemove}\n type=\"button\"\n >\n ×\n </button>\n )}\n </span>\n );\n};\n"],"names":["Tag","className","children","onRemove","props","jsxs","cn","jsx"],"mappings":";;AAOO,MAAMA,IAA0B,CAAC,EAAE,WAAAC,GAAW,UAAAC,GAAU,UAAAC,GAAU,GAAGC,QAExE,gBAAAC;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,WAAWC;AAAA,MACT;AAAA,MACAL;AAAA,IAAA;AAAA,IAED,GAAGG;AAAA,IAEH,UAAA;AAAA,MAAAF;AAAA,MACAC,KACC,gBAAAI;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,cAAW;AAAA,UACX,WAAU;AAAA,UACV,SAASJ;AAAA,UACT,MAAK;AAAA,UACN,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IAED;AAAA,EAAA;AAAA;"}
1
+ {"version":3,"file":"Tag.js","sources":["../../../src/components/Tag/Tag.tsx"],"sourcesContent":["import type React from 'react';\nimport { X } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { buttonReset, focusRing } from '../../utils/styles';\n\nexport interface TagProps extends React.HTMLAttributes<HTMLSpanElement> {\n icon?: React.ReactNode;\n onRemove?: () => void;\n /** Rótulo acessível do botão de remover. Padrão: \"Remover\". */\n removeLabel?: string;\n}\n\n/** Etiqueta de metadado, opcionalmente removível. */\nexport const Tag = ({\n className,\n children,\n icon,\n onRemove,\n removeLabel = 'Remover',\n ...props\n}: TagProps) => (\n <span\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-sbk-xs border border-sbk-line bg-sbk-surface px-2.5 py-1 text-xs font-light text-sbk-fg [&_svg]:size-3.5',\n className,\n )}\n {...props}\n >\n {icon && (\n <span aria-hidden=\"true\" className=\"inline-flex text-sbk-fg-muted\">\n {icon}\n </span>\n )}\n {children}\n {onRemove && (\n <button\n aria-label={typeof children === 'string' ? `${removeLabel} ${children}` : removeLabel}\n className={cn(\n buttonReset,\n '-mr-1 inline-flex size-4 cursor-pointer items-center justify-center rounded-full text-sbk-fg-muted hover:bg-sbk-surface-hover hover:text-sbk-fg',\n focusRing,\n )}\n onClick={onRemove}\n type=\"button\"\n >\n <X aria-hidden=\"true\" />\n </button>\n )}\n </span>\n);\n\nTag.displayName = 'Tag';\n"],"names":["Tag","className","children","icon","onRemove","removeLabel","props","jsxs","cn","jsx","buttonReset","focusRing","X"],"mappings":";;;;AAaO,MAAMA,IAAM,CAAC;AAAA,EAClB,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,MAAAC;AAAA,EACA,UAAAC;AAAA,EACA,aAAAC,IAAc;AAAA,EACd,GAAGC;AACL,MACE,gBAAAC;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,WAAWC;AAAA,MACT;AAAA,MACAP;AAAA,IAAA;AAAA,IAED,GAAGK;AAAA,IAEH,UAAA;AAAA,MAAAH,uBACE,QAAA,EAAK,eAAY,QAAO,WAAU,iCAChC,UAAAA,GACH;AAAA,MAEDD;AAAA,MACAE,KACC,gBAAAK;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,cAAY,OAAOP,KAAa,WAAW,GAAGG,CAAW,IAAIH,CAAQ,KAAKG;AAAA,UAC1E,WAAWG;AAAA,YACTE;AAAA,YACA;AAAA,YACAC;AAAA,UAAA;AAAA,UAEF,SAASP;AAAA,UACT,MAAK;AAAA,UAEL,UAAA,gBAAAK,EAACG,GAAA,EAAE,eAAY,OAAA,CAAO;AAAA,QAAA;AAAA,MAAA;AAAA,IACxB;AAAA,EAAA;AAEJ;AAGFZ,EAAI,cAAc;"}
@@ -2,6 +2,8 @@ import React from 'react';
2
2
  export interface TextareaProps extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {
3
3
  error?: string;
4
4
  helperText?: string;
5
- label?: string;
5
+ label?: React.ReactNode;
6
+ /** Permite redimensionar verticalmente. Padrão: true. */
7
+ resizable?: boolean;
6
8
  }
7
9
  export declare const Textarea: React.ForwardRefExoticComponent<TextareaProps & React.RefAttributes<HTMLTextAreaElement>>;
@@ -1,46 +1,42 @@
1
- import { jsxs as c, jsx as e } from "react/jsx-runtime";
2
- import m from "react";
1
+ import { jsx as r } from "react/jsx-runtime";
2
+ import p, { useId as x } from "react";
3
3
  import { cn as l } from "../../utils/cn.js";
4
- const v = m.forwardRef(
5
- ({ label: t, helperText: o, error: a, className: d, id: s, ...i }, n) => {
6
- const r = s || `textarea-${Math.random().toString(36).slice(2, 9)}`;
7
- return /* @__PURE__ */ c("div", { className: "grid gap-1", children: [
8
- t && /* @__PURE__ */ e(
9
- "label",
10
- {
11
- className: "text-[var(--font-size-sm)] font-[var(--font-weight-semibold)] text-[var(--md-on-surface)]",
12
- htmlFor: r,
13
- children: t
14
- }
15
- ),
16
- /* @__PURE__ */ e(
17
- "textarea",
18
- {
19
- ref: n,
20
- "aria-describedby": a ? `${r}-error` : o ? `${r}-helper` : void 0,
21
- "aria-invalid": a ? !0 : void 0,
22
- className: l(
23
- "min-h-24 w-full rounded-[var(--border-radius-md)] border border-[var(--md-outline-variant)] bg-[var(--md-surface)] px-3.5 py-2 text-[var(--md-on-surface)] outline-none transition placeholder:text-[var(--md-on-surface-variant)] focus:border-[var(--border-color-focus)] focus:[box-shadow:0_0_0_0.1875rem_rgba(47,93,140,0.15)] disabled:cursor-not-allowed disabled:opacity-60",
24
- a && "border-[var(--md-error)] focus:border-[var(--md-error)] focus:[box-shadow:0_0_0_0.1875rem_rgba(186,26,26,0.2)]",
25
- d
26
- ),
27
- id: r,
28
- ...i
29
- }
30
- ),
31
- a ? /* @__PURE__ */ e("span", { className: "text-xs text-[var(--md-error)]", id: `${r}-error`, role: "alert", children: a }) : o && /* @__PURE__ */ e(
32
- "span",
33
- {
34
- className: "text-xs text-[var(--md-on-surface-variant)]",
35
- id: `${r}-helper`,
36
- children: o
37
- }
38
- )
39
- ] });
4
+ import { describedBy as y, fieldControl as b } from "../../utils/styles.js";
5
+ import { Field as u } from "../Field/Field.js";
6
+ const I = p.forwardRef(
7
+ ({ label: o, helperText: a, error: e, resizable: d = !0, className: m, id: s, required: i, ...n }, c) => {
8
+ const f = x(), t = s ?? f;
9
+ return /* @__PURE__ */ r(
10
+ u,
11
+ {
12
+ error: e,
13
+ helperText: a,
14
+ id: t,
15
+ label: o,
16
+ required: i,
17
+ children: /* @__PURE__ */ r(
18
+ "textarea",
19
+ {
20
+ ref: c,
21
+ "aria-describedby": y(t, e, a),
22
+ "aria-invalid": e ? !0 : void 0,
23
+ className: l(
24
+ b,
25
+ "min-h-24 px-3.5 py-2 text-base",
26
+ d ? "resize-y" : "resize-none",
27
+ m
28
+ ),
29
+ id: t,
30
+ required: i,
31
+ ...n
32
+ }
33
+ )
34
+ }
35
+ );
40
36
  }
41
37
  );
42
- v.displayName = "Textarea";
38
+ I.displayName = "Textarea";
43
39
  export {
44
- v as Textarea
40
+ I as Textarea
45
41
  };
46
42
  //# sourceMappingURL=Textarea.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Textarea.js","sources":["../../../src/components/Textarea/Textarea.tsx"],"sourcesContent":["import React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport interface TextareaProps extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {\n error?: string;\n helperText?: string;\n label?: string;\n}\n\nexport const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n ({ label, helperText, error, className, id, ...props }, ref) => {\n const textareaId = id || `textarea-${Math.random().toString(36).slice(2, 9)}`;\n\n return (\n <div className=\"grid gap-1\">\n {label && (\n <label\n className=\"text-[var(--font-size-sm)] font-[var(--font-weight-semibold)] text-[var(--md-on-surface)]\"\n htmlFor={textareaId}\n >\n {label}\n </label>\n )}\n <textarea\n ref={ref}\n aria-describedby={\n error ? `${textareaId}-error` : helperText ? `${textareaId}-helper` : undefined\n }\n aria-invalid={error ? true : undefined}\n className={cn(\n 'min-h-24 w-full rounded-[var(--border-radius-md)] border border-[var(--md-outline-variant)] bg-[var(--md-surface)] px-3.5 py-2 text-[var(--md-on-surface)] outline-none transition placeholder:text-[var(--md-on-surface-variant)] focus:border-[var(--border-color-focus)] focus:[box-shadow:0_0_0_0.1875rem_rgba(47,93,140,0.15)] disabled:cursor-not-allowed disabled:opacity-60',\n error &&\n 'border-[var(--md-error)] focus:border-[var(--md-error)] focus:[box-shadow:0_0_0_0.1875rem_rgba(186,26,26,0.2)]',\n className,\n )}\n id={textareaId}\n {...props}\n />\n {error ? (\n <span className=\"text-xs text-[var(--md-error)]\" id={`${textareaId}-error`} role=\"alert\">\n {error}\n </span>\n ) : (\n helperText && (\n <span\n className=\"text-xs text-[var(--md-on-surface-variant)]\"\n id={`${textareaId}-helper`}\n >\n {helperText}\n </span>\n )\n )}\n </div>\n );\n },\n);\n\nTextarea.displayName = 'Textarea';\n"],"names":["Textarea","React","label","helperText","error","className","id","props","ref","textareaId","jsxs","jsx","cn"],"mappings":";;;AASO,MAAMA,IAAWC,EAAM;AAAA,EAC5B,CAAC,EAAE,OAAAC,GAAO,YAAAC,GAAY,OAAAC,GAAO,WAAAC,GAAW,IAAAC,GAAI,GAAGC,EAAA,GAASC,MAAQ;AAC9D,UAAMC,IAAaH,KAAM,YAAY,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AAE3E,WACE,gBAAAI,EAAC,OAAA,EAAI,WAAU,cACZ,UAAA;AAAA,MAAAR,KACC,gBAAAS;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,SAASF;AAAA,UAER,UAAAP;AAAA,QAAA;AAAA,MAAA;AAAA,MAGL,gBAAAS;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,KAAAH;AAAA,UACA,oBACEJ,IAAQ,GAAGK,CAAU,WAAWN,IAAa,GAAGM,CAAU,YAAY;AAAA,UAExE,gBAAcL,IAAQ,KAAO;AAAA,UAC7B,WAAWQ;AAAA,YACT;AAAA,YACAR,KACE;AAAA,YACFC;AAAA,UAAA;AAAA,UAEF,IAAII;AAAA,UACH,GAAGF;AAAA,QAAA;AAAA,MAAA;AAAA,MAELH,IACC,gBAAAO,EAAC,QAAA,EAAK,WAAU,kCAAiC,IAAI,GAAGF,CAAU,UAAU,MAAK,SAC9E,UAAAL,EAAA,CACH,IAEAD,KACE,gBAAAQ;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,IAAI,GAAGF,CAAU;AAAA,UAEhB,UAAAN;AAAA,QAAA;AAAA,MAAA;AAAA,IACH,GAGN;AAAA,EAEJ;AACF;AAEAH,EAAS,cAAc;"}
1
+ {"version":3,"file":"Textarea.js","sources":["../../../src/components/Textarea/Textarea.tsx"],"sourcesContent":["import React, { useId } from 'react';\nimport { cn } from '../../utils/cn';\nimport { describedBy, fieldControl } from '../../utils/styles';\nimport { Field } from '../Field/Field';\n\nexport interface TextareaProps extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {\n error?: string;\n helperText?: string;\n label?: React.ReactNode;\n /** Permite redimensionar verticalmente. Padrão: true. */\n resizable?: boolean;\n}\n\nexport const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n ({ label, helperText, error, resizable = true, className, id, required, ...props }, ref) => {\n const autoId = useId();\n const textareaId = id ?? autoId;\n\n return (\n <Field\n error={error}\n helperText={helperText}\n id={textareaId}\n label={label}\n required={required}\n >\n <textarea\n ref={ref}\n aria-describedby={describedBy(textareaId, error, helperText)}\n aria-invalid={error ? true : undefined}\n className={cn(\n fieldControl,\n 'min-h-24 px-3.5 py-2 text-base',\n resizable ? 'resize-y' : 'resize-none',\n className,\n )}\n id={textareaId}\n required={required}\n {...props}\n />\n </Field>\n );\n },\n);\n\nTextarea.displayName = 'Textarea';\n"],"names":["Textarea","React","label","helperText","error","resizable","className","id","required","props","ref","autoId","useId","textareaId","jsx","Field","describedBy","cn","fieldControl"],"mappings":";;;;;AAaO,MAAMA,IAAWC,EAAM;AAAA,EAC5B,CAAC,EAAE,OAAAC,GAAO,YAAAC,GAAY,OAAAC,GAAO,WAAAC,IAAY,IAAM,WAAAC,GAAW,IAAAC,GAAI,UAAAC,GAAU,GAAGC,EAAA,GAASC,MAAQ;AAC1F,UAAMC,IAASC,EAAA,GACTC,IAAaN,KAAMI;AAEzB,WACE,gBAAAG;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,OAAAX;AAAA,QACA,YAAAD;AAAA,QACA,IAAIU;AAAA,QACJ,OAAAX;AAAA,QACA,UAAAM;AAAA,QAEA,UAAA,gBAAAM;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,KAAAJ;AAAA,YACA,oBAAkBM,EAAYH,GAAYT,GAAOD,CAAU;AAAA,YAC3D,gBAAcC,IAAQ,KAAO;AAAA,YAC7B,WAAWa;AAAA,cACTC;AAAA,cACA;AAAA,cACAb,IAAY,aAAa;AAAA,cACzBC;AAAA,YAAA;AAAA,YAEF,IAAIO;AAAA,YACJ,UAAAL;AAAA,YACC,GAAGC;AAAA,UAAA;AAAA,QAAA;AAAA,MACN;AAAA,IAAA;AAAA,EAGN;AACF;AAEAT,EAAS,cAAc;"}
@@ -1,11 +1,17 @@
1
1
  import type React from 'react';
2
+ import { type TextWeight } from '../Typography/weight';
2
3
  export interface TitleProps extends React.HTMLAttributes<HTMLHeadingElement> {
3
4
  align?: 'left' | 'center' | 'right';
4
5
  as?: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';
5
6
  children: React.ReactNode;
6
- gradient?: boolean;
7
+ /** `heading`: Verde Escuro (padrão). `default`: cor de texto. `inherit`: herda do pai. */
8
+ color?: 'heading' | 'default' | 'inherit';
7
9
  italic?: boolean;
8
10
  size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl';
9
- weight?: 'light' | 'normal' | 'medium' | 'semibold' | 'bold' | 'extrabold';
11
+ /** Padrão: semibold (Seminegrito, brand book). */
12
+ weight?: TextWeight;
10
13
  }
11
- export declare const Title: React.FC<TitleProps>;
14
+ export declare const Title: {
15
+ ({ as: Tag, size, weight, align, color, italic, children, className, ...props }: TitleProps): import("react/jsx-runtime").JSX.Element;
16
+ displayName: string;
17
+ };
@@ -1,47 +1,47 @@
1
- import { jsx as d } from "react/jsx-runtime";
2
- const b = ({
1
+ import { jsx as r } from "react/jsx-runtime";
2
+ import { cn as g } from "../../utils/cn.js";
3
+ import { weightClass as o } from "../Typography/weight.js";
4
+ const c = {
5
+ xs: "text-sm",
6
+ sm: "text-base",
7
+ md: "text-lg",
8
+ lg: "text-xl",
9
+ xl: "text-2xl",
10
+ "2xl": "text-[2rem]",
11
+ "3xl": "text-[2.5rem]",
12
+ "4xl": "text-5xl"
13
+ }, f = {
14
+ heading: "text-sbk-fg-heading",
15
+ default: "text-sbk-fg",
16
+ inherit: "text-inherit"
17
+ }, h = { left: "text-left", center: "text-center", right: "text-right" }, d = ({
3
18
  as: t = "h1",
4
19
  size: e = "2xl",
5
- weight: o = "bold",
6
- align: a = "left",
7
- gradient: r = !1,
8
- italic: n = !1,
9
- children: i,
10
- className: l = "",
11
- ...s
12
- }) => {
13
- const x = t, f = {
14
- xs: "text-[var(--font-size-sm)]",
15
- sm: "text-[var(--font-size-base)]",
16
- md: "text-[var(--font-size-lg)]",
17
- lg: "text-[var(--font-size-xl)]",
18
- xl: "text-[var(--font-size-2xl)]",
19
- "2xl": "text-[var(--font-size-3xl)]",
20
- "3xl": "text-[var(--font-size-4xl)]",
21
- "4xl": "text-[3rem]"
22
- }, g = {
23
- light: "font-[var(--font-weight-light)]",
24
- normal: "font-[var(--font-weight-normal)]",
25
- medium: "font-[var(--font-weight-medium)]",
26
- semibold: "font-[var(--font-weight-semibold)]",
27
- bold: "font-[var(--font-weight-bold)]",
28
- extrabold: "font-extrabold"
29
- }, m = {
30
- left: "text-left",
31
- center: "text-center",
32
- right: "text-right"
33
- }, c = r ? "bg-[linear-gradient(135deg,var(--text-primary)_0%,var(--primary-color)_50%,var(--secondary-color)_100%)] bg-clip-text text-transparent" : "", v = [
34
- "m-0 leading-[var(--line-height-tight)] text-[var(--text-primary)] transition-[var(--transition-colors)]",
35
- f[e],
36
- g[o],
37
- m[a],
38
- n ? "italic" : "not-italic",
39
- c,
40
- l
41
- ].filter(Boolean).join(" ");
42
- return /* @__PURE__ */ d(x, { className: v, ...s, children: i });
43
- };
20
+ weight: x = "semibold",
21
+ align: l = "left",
22
+ color: i = "heading",
23
+ italic: s = !1,
24
+ children: a,
25
+ className: m,
26
+ ...n
27
+ }) => /* @__PURE__ */ r(
28
+ t,
29
+ {
30
+ className: g(
31
+ "m-0 font-sbk leading-tight tracking-[-0.01em] text-balance",
32
+ c[e],
33
+ o(x),
34
+ f[i],
35
+ h[l],
36
+ s && "italic",
37
+ m
38
+ ),
39
+ ...n,
40
+ children: a
41
+ }
42
+ );
43
+ d.displayName = "Title";
44
44
  export {
45
- b as Title
45
+ d as Title
46
46
  };
47
47
  //# sourceMappingURL=Title.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Title.js","sources":["../../../src/components/Title/Title.tsx"],"sourcesContent":["import type React from 'react';\n\nexport interface TitleProps extends React.HTMLAttributes<HTMLHeadingElement> {\n align?: 'left' | 'center' | 'right';\n as?: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\n children: React.ReactNode;\n gradient?: boolean;\n italic?: boolean;\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl';\n weight?: 'light' | 'normal' | 'medium' | 'semibold' | 'bold' | 'extrabold';\n}\n\nexport const Title: React.FC<TitleProps> = ({\n as = 'h1',\n size = '2xl',\n weight = 'bold',\n align = 'left',\n gradient = false,\n italic = false,\n children,\n className = '',\n ...props\n}) => {\n const Component = as;\n const sizeClassMap: Record<NonNullable<TitleProps['size']>, string> = {\n xs: 'text-[var(--font-size-sm)]',\n sm: 'text-[var(--font-size-base)]',\n md: 'text-[var(--font-size-lg)]',\n lg: 'text-[var(--font-size-xl)]',\n xl: 'text-[var(--font-size-2xl)]',\n '2xl': 'text-[var(--font-size-3xl)]',\n '3xl': 'text-[var(--font-size-4xl)]',\n '4xl': 'text-[3rem]',\n };\n const weightClassMap: Record<NonNullable<TitleProps['weight']>, string> = {\n light: 'font-[var(--font-weight-light)]',\n normal: 'font-[var(--font-weight-normal)]',\n medium: 'font-[var(--font-weight-medium)]',\n semibold: 'font-[var(--font-weight-semibold)]',\n bold: 'font-[var(--font-weight-bold)]',\n extrabold: 'font-extrabold',\n };\n const alignClassMap: Record<NonNullable<TitleProps['align']>, string> = {\n left: 'text-left',\n center: 'text-center',\n right: 'text-right',\n };\n const gradientClass = gradient\n ? 'bg-[linear-gradient(135deg,var(--text-primary)_0%,var(--primary-color)_50%,var(--secondary-color)_100%)] bg-clip-text text-transparent'\n : '';\n const combinedClass = [\n 'm-0 leading-[var(--line-height-tight)] text-[var(--text-primary)] transition-[var(--transition-colors)]',\n sizeClassMap[size],\n weightClassMap[weight],\n alignClassMap[align],\n italic ? 'italic' : 'not-italic',\n gradientClass,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <Component className={combinedClass} {...props}>\n {children}\n </Component>\n );\n};\n"],"names":["Title","as","size","weight","align","gradient","italic","children","className","props","Component","sizeClassMap","weightClassMap","alignClassMap","gradientClass","combinedClass"],"mappings":";AAYO,MAAMA,IAA8B,CAAC;AAAA,EAC1C,IAAAC,IAAK;AAAA,EACL,MAAAC,IAAO;AAAA,EACP,QAAAC,IAAS;AAAA,EACT,OAAAC,IAAQ;AAAA,EACR,UAAAC,IAAW;AAAA,EACX,QAAAC,IAAS;AAAA,EACT,UAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,GAAGC;AACL,MAAM;AACJ,QAAMC,IAAYT,GACZU,IAAgE;AAAA,IACpE,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,EAAA,GAEHC,IAAoE;AAAA,IACxE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,MAAM;AAAA,IACN,WAAW;AAAA,EAAA,GAEPC,IAAkE;AAAA,IACtE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,OAAO;AAAA,EAAA,GAEHC,IAAgBT,IAClB,2IACA,IACEU,IAAgB;AAAA,IACpB;AAAA,IACAJ,EAAaT,CAAI;AAAA,IACjBU,EAAeT,CAAM;AAAA,IACrBU,EAAcT,CAAK;AAAA,IACnBE,IAAS,WAAW;AAAA,IACpBQ;AAAA,IACAN;AAAA,EAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,2BACGE,GAAA,EAAU,WAAWK,GAAgB,GAAGN,GACtC,UAAAF,GACH;AAEJ;"}
1
+ {"version":3,"file":"Title.js","sources":["../../../src/components/Title/Title.tsx"],"sourcesContent":["import type React from 'react';\nimport { cn } from '../../utils/cn';\nimport { type TextWeight, weightClass } from '../Typography/weight';\n\nexport interface TitleProps extends React.HTMLAttributes<HTMLHeadingElement> {\n align?: 'left' | 'center' | 'right';\n as?: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\n children: React.ReactNode;\n /** `heading`: Verde Escuro (padrão). `default`: cor de texto. `inherit`: herda do pai. */\n color?: 'heading' | 'default' | 'inherit';\n italic?: boolean;\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl';\n /** Padrão: semibold (Seminegrito, brand book). */\n weight?: TextWeight;\n}\n\nconst SIZE_CLASS: Record<NonNullable<TitleProps['size']>, string> = {\n xs: 'text-sm',\n sm: 'text-base',\n md: 'text-lg',\n lg: 'text-xl',\n xl: 'text-2xl',\n '2xl': 'text-[2rem]',\n '3xl': 'text-[2.5rem]',\n '4xl': 'text-5xl',\n};\n\nconst COLOR_CLASS = {\n heading: 'text-sbk-fg-heading',\n default: 'text-sbk-fg',\n inherit: 'text-inherit',\n} as const;\nconst ALIGN_CLASS = { left: 'text-left', center: 'text-center', right: 'text-right' } as const;\n\nexport const Title = ({\n as: Tag = 'h1',\n size = '2xl',\n weight = 'semibold',\n align = 'left',\n color = 'heading',\n italic = false,\n children,\n className,\n ...props\n}: TitleProps) => (\n <Tag\n className={cn(\n 'm-0 font-sbk leading-tight tracking-[-0.01em] text-balance',\n SIZE_CLASS[size],\n weightClass(weight),\n COLOR_CLASS[color],\n ALIGN_CLASS[align],\n italic && 'italic',\n className,\n )}\n {...props}\n >\n {children}\n </Tag>\n);\n\nTitle.displayName = 'Title';\n"],"names":["SIZE_CLASS","COLOR_CLASS","ALIGN_CLASS","Title","Tag","size","weight","align","color","italic","children","className","props","jsx","cn","weightClass"],"mappings":";;;AAgBA,MAAMA,IAA8D;AAAA,EAClE,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AACT,GAEMC,IAAc;AAAA,EAClB,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AACX,GACMC,IAAc,EAAE,MAAM,aAAa,QAAQ,eAAe,OAAO,aAAA,GAE1DC,IAAQ,CAAC;AAAA,EACpB,IAAIC,IAAM;AAAA,EACV,MAAAC,IAAO;AAAA,EACP,QAAAC,IAAS;AAAA,EACT,OAAAC,IAAQ;AAAA,EACR,OAAAC,IAAQ;AAAA,EACR,QAAAC,IAAS;AAAA,EACT,UAAAC;AAAA,EACA,WAAAC;AAAA,EACA,GAAGC;AACL,MACE,gBAAAC;AAAA,EAACT;AAAA,EAAA;AAAA,IACC,WAAWU;AAAA,MACT;AAAA,MACAd,EAAWK,CAAI;AAAA,MACfU,EAAYT,CAAM;AAAA,MAClBL,EAAYO,CAAK;AAAA,MACjBN,EAAYK,CAAK;AAAA,MACjBE,KAAU;AAAA,MACVE;AAAA,IAAA;AAAA,IAED,GAAGC;AAAA,IAEH,UAAAF;AAAA,EAAA;AACH;AAGFP,EAAM,cAAc;"}
@@ -1,26 +1,54 @@
1
1
  import type React from 'react';
2
+ export type ToastTone = 'info' | 'success' | 'warning' | 'error';
2
3
  export interface ToastProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {
3
- id?: string;
4
+ /** Ação opcional (ex.: "Desfazer"). */
5
+ action?: {
6
+ label: string;
7
+ onClick: () => void;
8
+ };
4
9
  description?: React.ReactNode;
10
+ /** Tempo até fechar (ms). 0 mantém aberto. Sobrescreve o padrão do provider. */
11
+ durationMs?: number;
12
+ id?: string;
5
13
  onDismiss?: () => void;
6
14
  title: React.ReactNode;
7
- tone?: 'info' | 'success' | 'warning' | 'error';
15
+ tone?: ToastTone;
16
+ variant?: 'default' | 'glass';
8
17
  }
9
- export declare const Toast: React.FC<ToastProps>;
18
+ export declare const Toast: {
19
+ ({ tone, variant, title, description, action, onDismiss, durationMs: _durationMs, className, ...props }: ToastProps): import("react/jsx-runtime").JSX.Element;
20
+ displayName: string;
21
+ };
22
+ type ToastInput = Omit<ToastProps, 'id'> & {
23
+ id?: string;
24
+ };
25
+ type ToastItem = ToastProps & {
26
+ id: string;
27
+ };
10
28
  interface ToastContextValue {
11
29
  dismissToast: (id: string) => void;
12
- pushToast: (toast: Omit<ToastProps, 'id'> & {
13
- id?: string;
14
- }) => void;
15
- toasts: Array<ToastProps & {
16
- id: string;
17
- }>;
30
+ /** Adiciona um toast e retorna o id. */
31
+ pushToast: (toast: ToastInput) => string;
32
+ toasts: ToastItem[];
18
33
  }
34
+ export type ToastPosition = 'top-right' | 'top-center' | 'bottom-right' | 'bottom-center' | 'bottom-left';
19
35
  export interface ToastProviderProps {
20
36
  children: React.ReactNode;
37
+ /** Duração padrão (ms). Padrão: 5000. */
21
38
  durationMs?: number;
39
+ /** Quantidade máxima visível; os mais antigos saem primeiro. Padrão: 4. */
40
+ max?: number;
41
+ position?: ToastPosition;
22
42
  }
23
- export declare const ToastProvider: React.FC<ToastProviderProps>;
43
+ export declare const ToastProvider: ({ children, durationMs, max, position, }: ToastProviderProps) => import("react/jsx-runtime").JSX.Element;
24
44
  export declare const useToast: () => ToastContextValue;
25
- export declare const ToastViewport: React.FC;
45
+ export interface ToastViewportProps {
46
+ onPause?: () => void;
47
+ onResume?: () => void;
48
+ position?: ToastPosition;
49
+ }
50
+ export declare const ToastViewport: {
51
+ ({ position, onPause, onResume, }: ToastViewportProps): import("react/jsx-runtime").JSX.Element | null;
52
+ displayName: string;
53
+ };
26
54
  export {};