@sbkbs/ui 1.0.6 → 2.0.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 (210) 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 +12 -6
  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 -115
  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 +25 -14
  64. package/dist/components/Header/Header.js +88 -148
  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 +12 -6
  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 +11 -3
  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 +41 -53
  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 +327 -294
  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 -117
  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
  210. package/dist/sbk-icon.png +0 -0
@@ -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';\r\nimport { X } from 'lucide-react';\r\nimport { cn } from '../../utils/cn';\r\nimport { buttonReset, focusRing } from '../../utils/styles';\r\n\r\nexport interface TagProps extends React.HTMLAttributes<HTMLSpanElement> {\r\n icon?: React.ReactNode;\r\n onRemove?: () => void;\r\n /** Rótulo acessível do botão de remover. Padrão: \"Remover\". */\r\n removeLabel?: string;\r\n}\r\n\r\n/** Etiqueta de metadado, opcionalmente removível. */\r\nexport const Tag = ({\r\n className,\r\n children,\r\n icon,\r\n onRemove,\r\n removeLabel = 'Remover',\r\n ...props\r\n}: TagProps) => (\r\n <span\r\n className={cn(\r\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',\r\n className,\r\n )}\r\n {...props}\r\n >\r\n {icon && (\r\n <span aria-hidden=\"true\" className=\"inline-flex text-sbk-fg-muted\">\r\n {icon}\r\n </span>\r\n )}\r\n {children}\r\n {onRemove && (\r\n <button\r\n aria-label={typeof children === 'string' ? `${removeLabel} ${children}` : removeLabel}\r\n className={cn(\r\n buttonReset,\r\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',\r\n focusRing,\r\n )}\r\n onClick={onRemove}\r\n type=\"button\"\r\n >\r\n <X aria-hidden=\"true\" />\r\n </button>\r\n )}\r\n </span>\r\n);\r\n\r\nTag.displayName = 'Tag';\r\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';\r\nimport { cn } from '../../utils/cn';\r\nimport { describedBy, fieldControl } from '../../utils/styles';\r\nimport { Field } from '../Field/Field';\r\n\r\nexport interface TextareaProps extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {\r\n error?: string;\r\n helperText?: string;\r\n label?: React.ReactNode;\r\n /** Permite redimensionar verticalmente. Padrão: true. */\r\n resizable?: boolean;\r\n}\r\n\r\nexport const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\r\n ({ label, helperText, error, resizable = true, className, id, required, ...props }, ref) => {\r\n const autoId = useId();\r\n const textareaId = id ?? autoId;\r\n\r\n return (\r\n <Field\r\n error={error}\r\n helperText={helperText}\r\n id={textareaId}\r\n label={label}\r\n required={required}\r\n >\r\n <textarea\r\n ref={ref}\r\n aria-describedby={describedBy(textareaId, error, helperText)}\r\n aria-invalid={error ? true : undefined}\r\n className={cn(\r\n fieldControl,\r\n 'min-h-24 px-3.5 py-2 text-base',\r\n resizable ? 'resize-y' : 'resize-none',\r\n className,\r\n )}\r\n id={textareaId}\r\n required={required}\r\n {...props}\r\n />\r\n </Field>\r\n );\r\n },\r\n);\r\n\r\nTextarea.displayName = 'Textarea';\r\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';\r\nimport { cn } from '../../utils/cn';\r\nimport { type TextWeight, weightClass } from '../Typography/weight';\r\n\r\nexport interface TitleProps extends React.HTMLAttributes<HTMLHeadingElement> {\r\n align?: 'left' | 'center' | 'right';\r\n as?: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\r\n children: React.ReactNode;\r\n /** `heading`: Verde Escuro (padrão). `default`: cor de texto. `inherit`: herda do pai. */\r\n color?: 'heading' | 'default' | 'inherit';\r\n italic?: boolean;\r\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl';\r\n /** Padrão: semibold (Seminegrito, brand book). */\r\n weight?: TextWeight;\r\n}\r\n\r\nconst SIZE_CLASS: Record<NonNullable<TitleProps['size']>, string> = {\r\n xs: 'text-sm',\r\n sm: 'text-base',\r\n md: 'text-lg',\r\n lg: 'text-xl',\r\n xl: 'text-2xl',\r\n '2xl': 'text-[2rem]',\r\n '3xl': 'text-[2.5rem]',\r\n '4xl': 'text-5xl',\r\n};\r\n\r\nconst COLOR_CLASS = {\r\n heading: 'text-sbk-fg-heading',\r\n default: 'text-sbk-fg',\r\n inherit: 'text-inherit',\r\n} as const;\r\nconst ALIGN_CLASS = { left: 'text-left', center: 'text-center', right: 'text-right' } as const;\r\n\r\nexport const Title = ({\r\n as: Tag = 'h1',\r\n size = '2xl',\r\n weight = 'semibold',\r\n align = 'left',\r\n color = 'heading',\r\n italic = false,\r\n children,\r\n className,\r\n ...props\r\n}: TitleProps) => (\r\n <Tag\r\n className={cn(\r\n 'm-0 font-sbk leading-tight tracking-[-0.01em] text-balance',\r\n SIZE_CLASS[size],\r\n weightClass(weight),\r\n COLOR_CLASS[color],\r\n ALIGN_CLASS[align],\r\n italic && 'italic',\r\n className,\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n </Tag>\r\n);\r\n\r\nTitle.displayName = 'Title';\r\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 {};
@@ -1,110 +1,164 @@
1
- import { jsxs as v, jsx as a } from "react/jsx-runtime";
2
- import { useState as x, useRef as p, useCallback as b, useEffect as w, useMemo as g, useContext as h, createContext as T } from "react";
3
- import { cn as y } from "../../utils/cn.js";
4
- const N = ({
5
- tone: e = "info",
6
- title: o,
7
- description: c,
8
- onDismiss: s,
9
- className: n,
10
- ...i
1
+ import { jsxs as x, jsx as o } from "react/jsx-runtime";
2
+ import { useState as E, useRef as M, useCallback as k, useEffect as z, useMemo as P, useContext as N, createContext as j } from "react";
3
+ import { XCircle as O, AlertTriangle as R, CheckCircle2 as F, Info as S, X as V } from "lucide-react";
4
+ import { cn as b } from "../../utils/cn.js";
5
+ import { focusRing as T, buttonReset as w } from "../../utils/styles.js";
6
+ const X = {
7
+ info: { bar: "bg-sbk-info", icon: "text-sbk-info-fg", Icon: S },
8
+ success: { bar: "bg-sbk-success", icon: "text-sbk-success-fg", Icon: F },
9
+ warning: { bar: "bg-sbk-warning", icon: "text-sbk-warning-fg", Icon: R },
10
+ error: { bar: "bg-sbk-error", icon: "text-sbk-error-fg", Icon: O }
11
+ }, C = ({
12
+ tone: s = "info",
13
+ variant: a = "default",
14
+ title: c,
15
+ description: r,
16
+ action: t,
17
+ onDismiss: i,
18
+ durationMs: l,
19
+ className: u,
20
+ ...d
11
21
  }) => {
12
- const d = {
13
- info: "border-[var(--info-color)]/40",
14
- success: "border-[var(--success-color)]/40",
15
- warning: "border-[var(--warning-color)]/40",
16
- error: "border-[var(--md-error)]/40"
17
- }[e], l = e === "error" || e === "warning" ? "assertive" : "polite", r = e === "error" || e === "warning" ? "alert" : "status";
18
- return /* @__PURE__ */ v(
22
+ const { bar: f, icon: g, Icon: h } = X[s], m = s === "error" || s === "warning";
23
+ return /* @__PURE__ */ x(
19
24
  "div",
20
25
  {
21
- className: y(
22
- "w-[22rem] rounded-[var(--border-radius-md)] border bg-[var(--bg-secondary)] p-3 shadow-[var(--shadow-lg)]",
23
- d,
24
- n
25
- ),
26
26
  "aria-atomic": "true",
27
- "aria-live": l,
28
- onKeyDown: (t) => {
29
- t.key === "Escape" && (s == null || s());
30
- },
31
- role: r,
27
+ "aria-live": m ? "assertive" : "polite",
28
+ className: b(
29
+ "relative flex w-[22rem] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-sbk-focus focus-visible:outline-solid max-w-[calc(100vw-2rem)] items-start gap-3 overflow-hidden rounded-sbk-sm py-3 pl-4 pr-3 text-sbk-fg animate-sbk-scale-in motion-reduce:animate-none",
30
+ a === "glass" ? "sbk-glass sbk-glass-strong" : "border border-sbk-line bg-sbk-surface shadow-sbk-md",
31
+ u
32
+ ),
33
+ onKeyDown: (e) => e.key === "Escape" && (i == null ? void 0 : i()),
34
+ role: m ? "alert" : "status",
32
35
  tabIndex: 0,
33
- ...i,
36
+ ...d,
34
37
  children: [
35
- /* @__PURE__ */ v("div", { className: "flex items-start justify-between gap-2", children: [
36
- /* @__PURE__ */ a("p", { className: "m-0 text-sm font-semibold text-[var(--text-primary)]", children: o }),
37
- s && /* @__PURE__ */ a(
38
+ /* @__PURE__ */ o("span", { "aria-hidden": "true", className: b("absolute inset-y-0 left-0 w-1", f) }),
39
+ /* @__PURE__ */ o(h, { "aria-hidden": "true", className: b("mt-0.5 size-5 shrink-0", g), strokeWidth: 1.75 }),
40
+ /* @__PURE__ */ x("div", { className: "grid min-w-0 flex-1 gap-0.5", children: [
41
+ /* @__PURE__ */ o("p", { className: "m-0 text-sm font-semibold text-sbk-fg-heading", children: c }),
42
+ r && /* @__PURE__ */ o("p", { className: "m-0 text-sm font-light text-sbk-fg-muted", children: r }),
43
+ t && /* @__PURE__ */ o(
38
44
  "button",
39
45
  {
40
- "aria-label": "Fechar notificação",
41
- className: "inline-flex h-6 w-6 shrink-0 items-center justify-center rounded-[var(--border-radius-sm)] text-[var(--text-secondary)] transition hover:bg-[var(--bg-hover)] hover:text-[var(--text-primary)] focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--border-color-focus)]",
42
- onClick: s,
46
+ className: b(
47
+ w,
48
+ "mt-1 w-fit cursor-pointer text-sm font-semibold text-sbk-primary underline-offset-4 hover:underline",
49
+ T
50
+ ),
51
+ onClick: t.onClick,
43
52
  type: "button",
44
- children: /* @__PURE__ */ a("span", { "aria-hidden": !0, children: "×" })
53
+ children: t.label
45
54
  }
46
55
  )
47
56
  ] }),
48
- c && /* @__PURE__ */ a("p", { className: "mt-1 text-sm text-[var(--text-secondary)]", children: c })
57
+ i && /* @__PURE__ */ o(
58
+ "button",
59
+ {
60
+ "aria-label": "Fechar notificação",
61
+ className: b(
62
+ w,
63
+ "inline-flex size-7 shrink-0 cursor-pointer items-center justify-center rounded-sbk-xs text-sbk-fg-muted hover:bg-sbk-surface-hover hover:text-sbk-fg",
64
+ T
65
+ ),
66
+ onClick: i,
67
+ type: "button",
68
+ children: /* @__PURE__ */ o(V, { "aria-hidden": "true", className: "size-4" })
69
+ }
70
+ )
49
71
  ]
50
72
  }
51
73
  );
52
- }, f = T(void 0), I = ({ children: e, durationMs: o = 4e3 }) => {
53
- const [c, s] = x([]), n = p(/* @__PURE__ */ new Map()), i = b((r) => {
54
- const t = n.current.get(r);
55
- t && (window.clearTimeout(t), n.current.delete(r)), s((u) => u.filter((m) => m.id !== r));
56
- }, []), d = b(
57
- (r) => {
58
- const t = r.id ?? `toast-${Math.random().toString(36).slice(2, 9)}`;
59
- s((m) => [...m, { ...r, id: t }]);
60
- const u = window.setTimeout(() => i(t), o);
61
- n.current.set(t, u);
74
+ };
75
+ C.displayName = "Toast";
76
+ const v = j(void 0);
77
+ let A = 0;
78
+ const q = ({
79
+ children: s,
80
+ durationMs: a = 5e3,
81
+ max: c = 4,
82
+ position: r = "bottom-right"
83
+ }) => {
84
+ const [t, i] = E([]), l = M(/* @__PURE__ */ new Map()), u = k((e) => {
85
+ clearTimeout(l.current.get(e)), l.current.delete(e), i((n) => n.filter((p) => p.id !== e));
86
+ }, []), d = k(
87
+ (e, n) => {
88
+ n > 0 && l.current.set(
89
+ e,
90
+ setTimeout(() => u(e), n)
91
+ );
62
92
  },
63
- [i, o]
93
+ [u]
94
+ ), f = k(
95
+ (e) => {
96
+ const n = e.id ?? `sbk-toast-${++A}`;
97
+ return i((p) => [...p.filter((I) => I.id !== n), { ...e, id: n }].slice(-c)), d(n, e.durationMs ?? a), n;
98
+ },
99
+ [a, c, d]
64
100
  );
65
- w(() => {
66
- const r = n.current;
101
+ z(() => {
102
+ const e = l.current;
67
103
  return () => {
68
- r.forEach((t) => window.clearTimeout(t)), r.clear();
104
+ e.forEach(clearTimeout), e.clear();
69
105
  };
70
106
  }, []);
71
- const l = g(
72
- () => ({ toasts: c, pushToast: d, dismissToast: i }),
73
- [c, d, i]
107
+ const g = () => {
108
+ l.current.forEach(clearTimeout), l.current.clear();
109
+ }, h = () => t.forEach((e) => d(e.id, e.durationMs ?? a)), m = P(
110
+ () => ({ toasts: t, pushToast: f, dismissToast: u }),
111
+ [t, f, u]
74
112
  );
75
- return /* @__PURE__ */ v(f.Provider, { value: l, children: [
76
- e,
77
- /* @__PURE__ */ a(C, {})
113
+ return /* @__PURE__ */ x(v.Provider, { value: m, children: [
114
+ s,
115
+ /* @__PURE__ */ o(y, { onPause: g, onResume: h, position: r })
78
116
  ] });
79
- }, M = () => {
80
- const e = h(f);
81
- if (!e)
82
- throw new Error("useToast must be used inside ToastProvider");
83
- return e;
84
- }, C = () => {
85
- const e = h(f);
86
- return !e || e.toasts.length === 0 ? null : /* @__PURE__ */ a(
87
- "div",
117
+ }, G = () => {
118
+ const s = N(v);
119
+ if (!s) throw new Error("useToast deve ser usado dentro de ToastProvider");
120
+ return s;
121
+ }, B = {
122
+ "top-right": "top-4 right-4",
123
+ "top-center": "top-4 left-1/2 -translate-x-1/2",
124
+ "bottom-right": "bottom-4 right-4",
125
+ "bottom-center": "bottom-4 left-1/2 -translate-x-1/2",
126
+ "bottom-left": "bottom-4 left-4"
127
+ }, y = ({
128
+ position: s = "bottom-right",
129
+ onPause: a,
130
+ onResume: c
131
+ }) => {
132
+ const r = N(v);
133
+ return !r || r.toasts.length === 0 ? null : /* @__PURE__ */ o(
134
+ "section",
88
135
  {
89
136
  "aria-label": "Notificações",
90
- className: "pointer-events-none fixed bottom-4 right-4 z-[1200] grid gap-2",
91
- role: "region",
92
- children: e.toasts.map((o) => /* @__PURE__ */ a(
93
- N,
137
+ className: b(
138
+ "pointer-events-none fixed z-[var(--sbk-z-toast)] grid gap-2",
139
+ B[s]
140
+ ),
141
+ onBlur: c,
142
+ onFocus: a,
143
+ onMouseEnter: a,
144
+ onMouseLeave: c,
145
+ children: r.toasts.map((t) => /* @__PURE__ */ o(
146
+ C,
94
147
  {
95
- ...o,
148
+ ...t,
96
149
  className: "pointer-events-auto",
97
- onDismiss: () => e.dismissToast(o.id)
150
+ onDismiss: () => r.dismissToast(t.id)
98
151
  },
99
- o.id
152
+ t.id
100
153
  ))
101
154
  }
102
155
  );
103
156
  };
157
+ y.displayName = "ToastViewport";
104
158
  export {
105
- N as Toast,
106
- I as ToastProvider,
107
- C as ToastViewport,
108
- M as useToast
159
+ C as Toast,
160
+ q as ToastProvider,
161
+ y as ToastViewport,
162
+ G as useToast
109
163
  };
110
164
  //# sourceMappingURL=Toast.js.map