@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
@@ -0,0 +1,141 @@
1
+ import { jsxs as d, jsx as s, Fragment as D } from "react/jsx-runtime";
2
+ import { useId as F, useState as M } from "react";
3
+ import { ChevronDown as O } from "lucide-react";
4
+ import { cn as l } from "../../utils/cn.js";
5
+ import { transitionColors as T, buttonReset as V, inverseScope as q } from "../../utils/styles.js";
6
+ const B = {
7
+ light: "border-r border-sbk-line bg-sbk-surface text-sbk-fg",
8
+ dark: q,
9
+ glass: "sbk-glass rounded-none border-y-0 border-l-0 text-sbk-fg"
10
+ }, m = (b, a) => {
11
+ var o;
12
+ return !!a && (b.id === a || !!((o = b.children) != null && o.some((n) => m(n, a))));
13
+ }, E = ({
14
+ items: b,
15
+ sections: a,
16
+ activeId: o,
17
+ collapsed: n = !1,
18
+ defaultOpenIds: $,
19
+ onNavigate: f,
20
+ renderLink: g,
21
+ header: k,
22
+ footer: x,
23
+ variant: y = "light",
24
+ className: A,
25
+ "aria-label": j = "Navegação"
26
+ }) => {
27
+ const N = a ?? [{ id: "default", items: b ?? [] }], u = F(), [z, I] = M(
28
+ () => $ ?? N.flatMap((e) => e.items).filter((e) => e.children && m(e, o)).map((e) => e.id)
29
+ ), R = (e) => I((r) => r.includes(e) ? r.filter((t) => t !== e) : [...r, e]), v = (e, r, t) => l(
30
+ V,
31
+ "group relative flex w-full cursor-pointer items-center gap-3 rounded-sbk-sm text-left text-sm no-underline",
32
+ "focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-sbk-focus focus-visible:outline-solid",
33
+ T,
34
+ n ? "size-10 justify-center p-0" : "min-h-10 px-3 py-2",
35
+ r > 0 && !n && "pl-10",
36
+ e ? 'bg-sbk-primary-subtle font-semibold text-sbk-fg-heading before:absolute before:inset-y-2 before:left-0 before:w-0.5 before:rounded-full before:bg-sbk-primary before:content-[""]' : "font-light text-sbk-fg-muted hover:bg-sbk-surface-hover hover:text-sbk-fg",
37
+ y === "dark" && e && "bg-sbk-branco/12 before:bg-sbk-branco",
38
+ t && "pointer-events-none opacity-50"
39
+ ), w = (e, r = 0) => {
40
+ var C;
41
+ const t = e.id === o, c = /* @__PURE__ */ d(D, { children: [
42
+ e.icon && /* @__PURE__ */ s("span", { "aria-hidden": "true", className: "inline-flex shrink-0 [&_svg]:size-5", children: e.icon }),
43
+ /* @__PURE__ */ s("span", { className: l("min-w-0 flex-1 truncate", n && "sr-only"), children: e.label }),
44
+ e.badge && !n && /* @__PURE__ */ s("span", { className: "shrink-0 text-xs font-semibold", children: e.badge })
45
+ ] });
46
+ if ((C = e.children) != null && C.length && !n) {
47
+ const i = z.includes(e.id), S = `${u}-group-${e.id}`;
48
+ return /* @__PURE__ */ d("li", { children: [
49
+ /* @__PURE__ */ d(
50
+ "button",
51
+ {
52
+ "aria-controls": S,
53
+ "aria-expanded": i,
54
+ className: v(m(e, o) && !i, r, e.disabled),
55
+ disabled: e.disabled,
56
+ onClick: () => R(e.id),
57
+ type: "button",
58
+ children: [
59
+ c,
60
+ /* @__PURE__ */ s(
61
+ O,
62
+ {
63
+ "aria-hidden": "true",
64
+ className: l(
65
+ "size-4 shrink-0 transition-transform motion-reduce:transition-none",
66
+ i && "rotate-180"
67
+ )
68
+ }
69
+ )
70
+ ]
71
+ }
72
+ ),
73
+ i && /* @__PURE__ */ s("ul", { className: "m-0 mt-0.5 grid list-none gap-0.5 p-0", id: S, children: e.children.map((_) => w(_, r + 1)) })
74
+ ] }, e.id);
75
+ }
76
+ const h = () => {
77
+ var i;
78
+ (i = e.onClick) == null || i.call(e), f == null || f(e);
79
+ }, p = {
80
+ "aria-current": t ? "page" : void 0,
81
+ className: v(t, r, e.disabled),
82
+ title: n ? e.label : void 0
83
+ };
84
+ return /* @__PURE__ */ s("li", { children: e.href ? g ? g({ ...p, href: e.href, onClick: h, children: c }) : /* @__PURE__ */ s(
85
+ "a",
86
+ {
87
+ ...p,
88
+ "aria-disabled": e.disabled || void 0,
89
+ href: e.href,
90
+ onClick: h,
91
+ children: c
92
+ }
93
+ ) : /* @__PURE__ */ s("button", { ...p, disabled: e.disabled, onClick: h, type: "button", children: c }) }, e.id);
94
+ };
95
+ return /* @__PURE__ */ d(
96
+ "aside",
97
+ {
98
+ className: l(
99
+ "flex h-full shrink-0 flex-col",
100
+ n ? "w-16 items-center" : "w-64",
101
+ "transition-[width] duration-200 motion-reduce:transition-none",
102
+ B[y],
103
+ A
104
+ ),
105
+ children: [
106
+ k && /* @__PURE__ */ s("div", { className: l("shrink-0 px-4 py-4", n && "px-2"), children: k }),
107
+ /* @__PURE__ */ s(
108
+ "nav",
109
+ {
110
+ "aria-label": j,
111
+ className: l("min-h-0 flex-1 overflow-y-auto py-2", "px-3"),
112
+ children: N.map((e) => /* @__PURE__ */ d("div", { className: "mb-4 last:mb-0", children: [
113
+ e.title && (n ? /* @__PURE__ */ s("div", { "aria-hidden": "true", className: "mx-auto my-2 h-px w-6 bg-sbk-line" }) : /* @__PURE__ */ s(
114
+ "h2",
115
+ {
116
+ className: "m-0 mb-1 px-3 text-xs font-semibold uppercase tracking-wide text-sbk-fg-muted",
117
+ id: `${u}-${e.id}`,
118
+ children: e.title
119
+ }
120
+ )),
121
+ /* @__PURE__ */ s(
122
+ "ul",
123
+ {
124
+ "aria-labelledby": e.title && !n ? `${u}-${e.id}` : void 0,
125
+ className: "m-0 grid list-none gap-0.5 p-0",
126
+ children: e.items.map((r) => w(r))
127
+ }
128
+ )
129
+ ] }, e.id))
130
+ }
131
+ ),
132
+ x && /* @__PURE__ */ s("div", { className: l("shrink-0 border-t border-sbk-line px-4 py-3", n && "px-2"), children: x })
133
+ ]
134
+ }
135
+ );
136
+ };
137
+ E.displayName = "SideNav";
138
+ export {
139
+ E as SideNav
140
+ };
141
+ //# sourceMappingURL=SideNav.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SideNav.js","sources":["../../../src/components/SideNav/SideNav.tsx"],"sourcesContent":["import type React from 'react';\r\nimport { useId, useState } from 'react';\r\nimport { ChevronDown } from 'lucide-react';\r\nimport { cn } from '../../utils/cn';\r\nimport { buttonReset, inverseScope, transitionColors } from '../../utils/styles';\r\n\r\nexport interface SideNavItem {\r\n /** Contador ou etiqueta à direita (ex.: pendências). */\r\n badge?: React.ReactNode;\r\n /** Subitens: o item vira um grupo expansível. */\r\n children?: SideNavItem[];\r\n disabled?: boolean;\r\n href?: string;\r\n icon?: React.ReactNode;\r\n id: string;\r\n label: string;\r\n onClick?: () => void;\r\n}\r\n\r\nexport interface SideNavSection {\r\n id: string;\r\n items: SideNavItem[];\r\n /** Título da seção (ex.: \"Cadastros\"). */\r\n title?: string;\r\n}\r\n\r\nexport interface SideNavLinkRenderProps {\r\n 'aria-current'?: 'page';\r\n children: React.ReactNode;\r\n className: string;\r\n href: string;\r\n onClick?: () => void;\r\n title?: string;\r\n}\r\n\r\nexport interface SideNavProps {\r\n /** Item ativo (recebe aria-current=\"page\"). */\r\n activeId?: string;\r\n 'aria-label'?: string;\r\n className?: string;\r\n /** Modo compacto: somente ícones, com o label disponível como tooltip nativo e para leitores de tela. */\r\n collapsed?: boolean;\r\n /** Grupos abertos inicialmente. Por padrão, abre o grupo que contém o item ativo. */\r\n defaultOpenIds?: string[];\r\n footer?: React.ReactNode;\r\n header?: React.ReactNode;\r\n /** Itens simples, ou `sections` para agrupar com títulos. */\r\n items?: SideNavItem[];\r\n onNavigate?: (item: SideNavItem) => void;\r\n /**\r\n * Renderização customizada de links (integração com React Router, Next.js etc.).\r\n * Ex.: `renderLink={({ href, ...p }) => <NavLink to={href} {...p} />}`\r\n */\r\n renderLink?: (props: SideNavLinkRenderProps) => React.ReactNode;\r\n sections?: SideNavSection[];\r\n /** `light`: superfície clara. `dark`: verde escuro. `glass`: Liquid Glass. */\r\n variant?: 'light' | 'dark' | 'glass';\r\n}\r\n\r\nconst VARIANT_CLASS = {\r\n light: 'border-r border-sbk-line bg-sbk-surface text-sbk-fg',\r\n dark: inverseScope,\r\n glass: 'sbk-glass rounded-none border-y-0 border-l-0 text-sbk-fg',\r\n} as const;\r\n\r\nconst containsActive = (item: SideNavItem, activeId?: string): boolean =>\r\n !!activeId && (item.id === activeId || !!item.children?.some((c) => containsActive(c, activeId)));\r\n\r\n/** Menu de navegação lateral (Navigator): seções, grupos expansíveis, ícones, badges e modo compacto. */\r\nexport const SideNav = ({\r\n items,\r\n sections,\r\n activeId,\r\n collapsed = false,\r\n defaultOpenIds,\r\n onNavigate,\r\n renderLink,\r\n header,\r\n footer,\r\n variant = 'light',\r\n className,\r\n 'aria-label': ariaLabel = 'Navegação',\r\n}: SideNavProps) => {\r\n const allSections: SideNavSection[] = sections ?? [{ id: 'default', items: items ?? [] }];\r\n const baseId = useId();\r\n const [openIds, setOpenIds] = useState<string[]>(\r\n () =>\r\n defaultOpenIds ??\r\n allSections\r\n .flatMap((s) => s.items)\r\n .filter((i) => i.children && containsActive(i, activeId))\r\n .map((i) => i.id),\r\n );\r\n\r\n const toggle = (id: string) =>\r\n setOpenIds((prev) => (prev.includes(id) ? prev.filter((x) => x !== id) : [...prev, id]));\r\n\r\n const itemClass = (active: boolean, depth: number, disabled?: boolean) =>\r\n cn(\r\n buttonReset,\r\n 'group relative flex w-full cursor-pointer items-center gap-3 rounded-sbk-sm text-left text-sm no-underline',\r\n 'focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-sbk-focus focus-visible:outline-solid',\r\n transitionColors,\r\n collapsed ? 'size-10 justify-center p-0' : 'min-h-10 px-3 py-2',\r\n depth > 0 && !collapsed && 'pl-10',\r\n active\r\n ? 'bg-sbk-primary-subtle font-semibold text-sbk-fg-heading before:absolute before:inset-y-2 before:left-0 before:w-0.5 before:rounded-full before:bg-sbk-primary before:content-[\"\"]'\r\n : 'font-light text-sbk-fg-muted hover:bg-sbk-surface-hover hover:text-sbk-fg',\r\n variant === 'dark' && active && 'bg-sbk-branco/12 before:bg-sbk-branco',\r\n disabled && 'pointer-events-none opacity-50',\r\n );\r\n\r\n const renderItem = (item: SideNavItem, depth = 0): React.ReactNode => {\r\n const active = item.id === activeId;\r\n const content = (\r\n <>\r\n {item.icon && (\r\n <span aria-hidden=\"true\" className=\"inline-flex shrink-0 [&_svg]:size-5\">\r\n {item.icon}\r\n </span>\r\n )}\r\n <span className={cn('min-w-0 flex-1 truncate', collapsed && 'sr-only')}>{item.label}</span>\r\n {item.badge && !collapsed && (\r\n <span className=\"shrink-0 text-xs font-semibold\">{item.badge}</span>\r\n )}\r\n </>\r\n );\r\n\r\n if (item.children?.length && !collapsed) {\r\n const open = openIds.includes(item.id);\r\n const groupId = `${baseId}-group-${item.id}`;\r\n return (\r\n <li key={item.id}>\r\n <button\r\n aria-controls={groupId}\r\n aria-expanded={open}\r\n className={itemClass(containsActive(item, activeId) && !open, depth, item.disabled)}\r\n disabled={item.disabled}\r\n onClick={() => toggle(item.id)}\r\n type=\"button\"\r\n >\r\n {content}\r\n <ChevronDown\r\n aria-hidden=\"true\"\r\n className={cn(\r\n 'size-4 shrink-0 transition-transform motion-reduce:transition-none',\r\n open && 'rotate-180',\r\n )}\r\n />\r\n </button>\r\n {open && (\r\n <ul className=\"m-0 mt-0.5 grid list-none gap-0.5 p-0\" id={groupId}>\r\n {item.children.map((child) => renderItem(child, depth + 1))}\r\n </ul>\r\n )}\r\n </li>\r\n );\r\n }\r\n\r\n const handleClick = () => {\r\n item.onClick?.();\r\n onNavigate?.(item);\r\n };\r\n const common = {\r\n 'aria-current': active ? ('page' as const) : undefined,\r\n className: itemClass(active, depth, item.disabled),\r\n title: collapsed ? item.label : undefined,\r\n };\r\n\r\n return (\r\n <li key={item.id}>\r\n {item.href ? (\r\n renderLink ? (\r\n renderLink({ ...common, href: item.href, onClick: handleClick, children: content })\r\n ) : (\r\n <a\r\n {...common}\r\n aria-disabled={item.disabled || undefined}\r\n href={item.href}\r\n onClick={handleClick}\r\n >\r\n {content}\r\n </a>\r\n )\r\n ) : (\r\n <button {...common} disabled={item.disabled} onClick={handleClick} type=\"button\">\r\n {content}\r\n </button>\r\n )}\r\n </li>\r\n );\r\n };\r\n\r\n return (\r\n <aside\r\n className={cn(\r\n 'flex h-full shrink-0 flex-col',\r\n collapsed ? 'w-16 items-center' : 'w-64',\r\n 'transition-[width] duration-200 motion-reduce:transition-none',\r\n VARIANT_CLASS[variant],\r\n className,\r\n )}\r\n >\r\n {header && <div className={cn('shrink-0 px-4 py-4', collapsed && 'px-2')}>{header}</div>}\r\n <nav\r\n aria-label={ariaLabel}\r\n className={cn('min-h-0 flex-1 overflow-y-auto py-2', collapsed ? 'px-3' : 'px-3')}\r\n >\r\n {allSections.map((section) => (\r\n <div key={section.id} className=\"mb-4 last:mb-0\">\r\n {section.title &&\r\n (collapsed ? (\r\n <div aria-hidden=\"true\" className=\"mx-auto my-2 h-px w-6 bg-sbk-line\" />\r\n ) : (\r\n <h2\r\n className=\"m-0 mb-1 px-3 text-xs font-semibold uppercase tracking-wide text-sbk-fg-muted\"\r\n id={`${baseId}-${section.id}`}\r\n >\r\n {section.title}\r\n </h2>\r\n ))}\r\n <ul\r\n aria-labelledby={section.title && !collapsed ? `${baseId}-${section.id}` : undefined}\r\n className=\"m-0 grid list-none gap-0.5 p-0\"\r\n >\r\n {section.items.map((item) => renderItem(item))}\r\n </ul>\r\n </div>\r\n ))}\r\n </nav>\r\n {footer && (\r\n <div className={cn('shrink-0 border-t border-sbk-line px-4 py-3', collapsed && 'px-2')}>\r\n {footer}\r\n </div>\r\n )}\r\n </aside>\r\n );\r\n};\r\n\r\nSideNav.displayName = 'SideNav';\r\n"],"names":["VARIANT_CLASS","inverseScope","containsActive","item","activeId","_a","c","SideNav","items","sections","collapsed","defaultOpenIds","onNavigate","renderLink","header","footer","variant","className","ariaLabel","allSections","baseId","useId","openIds","setOpenIds","useState","s","i","toggle","id","prev","x","itemClass","active","depth","disabled","cn","buttonReset","transitionColors","renderItem","content","jsxs","Fragment","jsx","open","groupId","ChevronDown","child","handleClick","common","section"],"mappings":"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"}
@@ -1,7 +1,18 @@
1
1
  import type React from 'react';
2
2
  export interface SkeletonProps extends React.HTMLAttributes<HTMLDivElement> {
3
+ /** Atalho para `variant="circle"`. */
3
4
  circle?: boolean;
4
5
  height?: string;
6
+ /** Número de linhas quando `variant="text"`. A última fica mais curta. */
7
+ lines?: number;
8
+ variant?: 'rect' | 'circle' | 'text';
5
9
  width?: string;
6
10
  }
7
- export declare const Skeleton: React.FC<SkeletonProps>;
11
+ /**
12
+ * Placeholder de carregamento. É decorativo (`aria-hidden`): anuncie o estado
13
+ * de carregamento no container com `aria-busy="true"` ou um Spinner.
14
+ */
15
+ export declare const Skeleton: {
16
+ ({ circle, variant, lines, width, height, className, style, ...props }: SkeletonProps): import("react/jsx-runtime").JSX.Element;
17
+ displayName: string;
18
+ };
@@ -1,25 +1,40 @@
1
- import { jsx as t } from "react/jsx-runtime";
2
- import { cn as d } from "../../utils/cn.js";
3
- const l = ({
4
- circle: r = !1,
5
- width: e,
6
- height: o,
7
- className: a,
8
- style: s,
9
- ...n
10
- }) => /* @__PURE__ */ t(
1
+ import { jsx as r } from "react/jsx-runtime";
2
+ import { cn as n } from "../../utils/cn.js";
3
+ const l = "animate-pulse bg-sbk-line motion-reduce:animate-none", u = ({
4
+ circle: c = !1,
5
+ variant: t = c ? "circle" : "rect",
6
+ lines: e = 3,
7
+ width: a,
8
+ height: m,
9
+ className: d,
10
+ style: o,
11
+ ...i
12
+ }) => t === "text" ? /* @__PURE__ */ r(
11
13
  "div",
12
14
  {
13
- className: d(
14
- "animate-pulse bg-[var(--md-surface-container-high)]",
15
- r ? "rounded-full" : "rounded-[var(--border-radius-sm)]",
16
- a
17
- ),
18
- style: { width: e, height: o, ...s },
19
- ...n
15
+ "aria-hidden": "true",
16
+ className: n("grid gap-2", d),
17
+ style: { width: a, ...o },
18
+ ...i,
19
+ children: Array.from({ length: e }, (f, s) => /* @__PURE__ */ r(
20
+ "div",
21
+ {
22
+ className: n(l, "h-3 rounded-sbk-xs", s === e - 1 && e > 1 && "w-3/5")
23
+ },
24
+ s
25
+ ))
26
+ }
27
+ ) : /* @__PURE__ */ r(
28
+ "div",
29
+ {
30
+ "aria-hidden": "true",
31
+ className: n(l, t === "circle" ? "rounded-full" : "rounded-sbk-sm", d),
32
+ style: { width: a, height: m, ...o },
33
+ ...i
20
34
  }
21
35
  );
36
+ u.displayName = "Skeleton";
22
37
  export {
23
- l as Skeleton
38
+ u as Skeleton
24
39
  };
25
40
  //# sourceMappingURL=Skeleton.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Skeleton.js","sources":["../../../src/components/Skeleton/Skeleton.tsx"],"sourcesContent":["import type React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport interface SkeletonProps extends React.HTMLAttributes<HTMLDivElement> {\n circle?: boolean;\n height?: string;\n width?: string;\n}\n\nexport const Skeleton: React.FC<SkeletonProps> = ({\n circle = false,\n width,\n height,\n className,\n style,\n ...props\n}) => {\n return (\n <div\n className={cn(\n 'animate-pulse bg-[var(--md-surface-container-high)]',\n circle ? 'rounded-full' : 'rounded-[var(--border-radius-sm)]',\n className,\n )}\n style={{ width, height, ...style }}\n {...props}\n />\n );\n};\n"],"names":["Skeleton","circle","width","height","className","style","props","jsx","cn"],"mappings":";;AASO,MAAMA,IAAoC,CAAC;AAAA,EAChD,QAAAC,IAAS;AAAA,EACT,OAAAC;AAAA,EACA,QAAAC;AAAA,EACA,WAAAC;AAAA,EACA,OAAAC;AAAA,EACA,GAAGC;AACL,MAEI,gBAAAC;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,WAAWC;AAAA,MACT;AAAA,MACAP,IAAS,iBAAiB;AAAA,MAC1BG;AAAA,IAAA;AAAA,IAEF,OAAO,EAAE,OAAAF,GAAO,QAAAC,GAAQ,GAAGE,EAAA;AAAA,IAC1B,GAAGC;AAAA,EAAA;AAAA;"}
1
+ {"version":3,"file":"Skeleton.js","sources":["../../../src/components/Skeleton/Skeleton.tsx"],"sourcesContent":["import type React from 'react';\r\nimport { cn } from '../../utils/cn';\r\n\r\nexport interface SkeletonProps extends React.HTMLAttributes<HTMLDivElement> {\r\n /** Atalho para `variant=\"circle\"`. */\r\n circle?: boolean;\r\n height?: string;\r\n /** Número de linhas quando `variant=\"text\"`. A última fica mais curta. */\r\n lines?: number;\r\n variant?: 'rect' | 'circle' | 'text';\r\n width?: string;\r\n}\r\n\r\nconst base = 'animate-pulse bg-sbk-line motion-reduce:animate-none';\r\n\r\n/**\r\n * Placeholder de carregamento. É decorativo (`aria-hidden`): anuncie o estado\r\n * de carregamento no container com `aria-busy=\"true\"` ou um Spinner.\r\n */\r\nexport const Skeleton = ({\r\n circle = false,\r\n variant = circle ? 'circle' : 'rect',\r\n lines = 3,\r\n width,\r\n height,\r\n className,\r\n style,\r\n ...props\r\n}: SkeletonProps) => {\r\n if (variant === 'text') {\r\n return (\r\n <div\r\n aria-hidden=\"true\"\r\n className={cn('grid gap-2', className)}\r\n style={{ width, ...style }}\r\n {...props}\r\n >\r\n {Array.from({ length: lines }, (_, i) => (\r\n <div\r\n key={i}\r\n className={cn(base, 'h-3 rounded-sbk-xs', i === lines - 1 && lines > 1 && 'w-3/5')}\r\n />\r\n ))}\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div\r\n aria-hidden=\"true\"\r\n className={cn(base, variant === 'circle' ? 'rounded-full' : 'rounded-sbk-sm', className)}\r\n style={{ width, height, ...style }}\r\n {...props}\r\n />\r\n );\r\n};\r\n\r\nSkeleton.displayName = 'Skeleton';\r\n"],"names":["base","Skeleton","circle","variant","lines","width","height","className","style","props","jsx","cn","_","i"],"mappings":";;AAaA,MAAMA,IAAO,wDAMAC,IAAW,CAAC;AAAA,EACvB,QAAAC,IAAS;AAAA,EACT,SAAAC,IAAUD,IAAS,WAAW;AAAA,EAC9B,OAAAE,IAAQ;AAAA,EACR,OAAAC;AAAA,EACA,QAAAC;AAAA,EACA,WAAAC;AAAA,EACA,OAAAC;AAAA,EACA,GAAGC;AACL,MACMN,MAAY,SAEZ,gBAAAO;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,eAAY;AAAA,IACZ,WAAWC,EAAG,cAAcJ,CAAS;AAAA,IACrC,OAAO,EAAE,OAAAF,GAAO,GAAGG,EAAA;AAAA,IAClB,GAAGC;AAAA,IAEH,UAAA,MAAM,KAAK,EAAE,QAAQL,KAAS,CAACQ,GAAGC,MACjC,gBAAAH;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,WAAWC,EAAGX,GAAM,sBAAsBa,MAAMT,IAAQ,KAAKA,IAAQ,KAAK,OAAO;AAAA,MAAA;AAAA,MAD5ES;AAAA,IAAA,CAGR;AAAA,EAAA;AAAA,IAML,gBAAAH;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,eAAY;AAAA,IACZ,WAAWC,EAAGX,GAAMG,MAAY,WAAW,iBAAiB,kBAAkBI,CAAS;AAAA,IACvF,OAAO,EAAE,OAAAF,GAAO,QAAAC,GAAQ,GAAGE,EAAA;AAAA,IAC1B,GAAGC;AAAA,EAAA;AAAA;AAKVR,EAAS,cAAc;"}
@@ -1,7 +1,15 @@
1
1
  import type React from 'react';
2
- export interface SpinnerProps extends React.SVGAttributes<SVGSVGElement> {
3
- /** Texto anunciado para leitores de tela. Padrão: 'Carregando...' */
2
+ export interface SpinnerProps extends Omit<React.HTMLAttributes<HTMLSpanElement>, 'children'> {
3
+ /** Texto anunciado para leitores de tela. Padrão: "Carregando". */
4
4
  label?: string;
5
+ /** Exibe o label visualmente ao lado do spinner. */
6
+ showLabel?: boolean;
5
7
  size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';
8
+ /** `current` herda a cor do texto (útil dentro de botões). */
9
+ tone?: 'current' | 'primary' | 'muted' | 'inverse';
6
10
  }
7
- export declare const Spinner: React.FC<SpinnerProps>;
11
+ /** Indicador de carregamento circular. Em prefers-reduced-motion a rotação fica mais lenta. */
12
+ export declare const Spinner: {
13
+ ({ size, label, showLabel, tone, className, ...props }: SpinnerProps): import("react/jsx-runtime").JSX.Element;
14
+ displayName: string;
15
+ };
@@ -0,0 +1,57 @@
1
+ import { jsxs as t, jsx as e } from "react/jsx-runtime";
2
+ import { cn as r } from "../../utils/cn.js";
3
+ const m = {
4
+ xs: "size-3",
5
+ sm: "size-4",
6
+ md: "size-5",
7
+ lg: "size-6",
8
+ xl: "size-10"
9
+ }, l = {
10
+ current: "text-current",
11
+ primary: "text-sbk-primary",
12
+ muted: "text-sbk-fg-muted",
13
+ inverse: "text-sbk-branco"
14
+ }, d = ({
15
+ size: s = "md",
16
+ label: n = "Carregando",
17
+ showLabel: i = !1,
18
+ tone: o = "current",
19
+ className: a,
20
+ ...c
21
+ }) => /* @__PURE__ */ t(
22
+ "span",
23
+ {
24
+ className: r("inline-flex items-center gap-2", l[o], a),
25
+ role: "status",
26
+ ...c,
27
+ children: [
28
+ /* @__PURE__ */ t(
29
+ "svg",
30
+ {
31
+ "aria-hidden": "true",
32
+ className: r("animate-spin motion-reduce:[animation-duration:2.5s]", m[s]),
33
+ fill: "none",
34
+ viewBox: "0 0 24 24",
35
+ children: [
36
+ /* @__PURE__ */ e("circle", { cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeOpacity: "0.2", strokeWidth: "2.5" }),
37
+ /* @__PURE__ */ e(
38
+ "path",
39
+ {
40
+ d: "M12 2a10 10 0 0 1 10 10",
41
+ stroke: "currentColor",
42
+ strokeLinecap: "round",
43
+ strokeWidth: "2.5"
44
+ }
45
+ )
46
+ ]
47
+ }
48
+ ),
49
+ /* @__PURE__ */ e("span", { className: i ? "text-sm font-light text-sbk-fg-muted" : "sr-only", children: n })
50
+ ]
51
+ }
52
+ );
53
+ d.displayName = "Spinner";
54
+ export {
55
+ d as Spinner
56
+ };
57
+ //# sourceMappingURL=Spinner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Spinner.js","sources":["../../../src/components/Spinner/Spinner.tsx"],"sourcesContent":["import type React from 'react';\r\nimport { cn } from '../../utils/cn';\r\n\r\nexport interface SpinnerProps extends Omit<React.HTMLAttributes<HTMLSpanElement>, 'children'> {\r\n /** Texto anunciado para leitores de tela. Padrão: \"Carregando\". */\r\n label?: string;\r\n /** Exibe o label visualmente ao lado do spinner. */\r\n showLabel?: boolean;\r\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\r\n /** `current` herda a cor do texto (útil dentro de botões). */\r\n tone?: 'current' | 'primary' | 'muted' | 'inverse';\r\n}\r\n\r\nconst SIZE_CLASS: Record<NonNullable<SpinnerProps['size']>, string> = {\r\n xs: 'size-3',\r\n sm: 'size-4',\r\n md: 'size-5',\r\n lg: 'size-6',\r\n xl: 'size-10',\r\n};\r\n\r\nconst TONE_CLASS: Record<NonNullable<SpinnerProps['tone']>, string> = {\r\n current: 'text-current',\r\n primary: 'text-sbk-primary',\r\n muted: 'text-sbk-fg-muted',\r\n inverse: 'text-sbk-branco',\r\n};\r\n\r\n/** Indicador de carregamento circular. Em prefers-reduced-motion a rotação fica mais lenta. */\r\nexport const Spinner = ({\r\n size = 'md',\r\n label = 'Carregando',\r\n showLabel = false,\r\n tone = 'current',\r\n className,\r\n ...props\r\n}: SpinnerProps) => (\r\n <span\r\n className={cn('inline-flex items-center gap-2', TONE_CLASS[tone], className)}\r\n role=\"status\"\r\n {...props}\r\n >\r\n <svg\r\n aria-hidden=\"true\"\r\n className={cn('animate-spin motion-reduce:[animation-duration:2.5s]', SIZE_CLASS[size])}\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeOpacity=\"0.2\" strokeWidth=\"2.5\" />\r\n <path\r\n d=\"M12 2a10 10 0 0 1 10 10\"\r\n stroke=\"currentColor\"\r\n strokeLinecap=\"round\"\r\n strokeWidth=\"2.5\"\r\n />\r\n </svg>\r\n <span className={showLabel ? 'text-sm font-light text-sbk-fg-muted' : 'sr-only'}>{label}</span>\r\n </span>\r\n);\r\n\r\nSpinner.displayName = 'Spinner';\r\n"],"names":["SIZE_CLASS","TONE_CLASS","Spinner","size","label","showLabel","tone","className","props","jsxs","cn","jsx"],"mappings":";;AAaA,MAAMA,IAAgE;AAAA,EACpE,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN,GAEMC,IAAgE;AAAA,EACpE,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AACX,GAGaC,IAAU,CAAC;AAAA,EACtB,MAAAC,IAAO;AAAA,EACP,OAAAC,IAAQ;AAAA,EACR,WAAAC,IAAY;AAAA,EACZ,MAAAC,IAAO;AAAA,EACP,WAAAC;AAAA,EACA,GAAGC;AACL,MACE,gBAAAC;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,WAAWC,EAAG,kCAAkCT,EAAWK,CAAI,GAAGC,CAAS;AAAA,IAC3E,MAAK;AAAA,IACJ,GAAGC;AAAA,IAEJ,UAAA;AAAA,MAAA,gBAAAC;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,eAAY;AAAA,UACZ,WAAWC,EAAG,wDAAwDV,EAAWG,CAAI,CAAC;AAAA,UACtF,MAAK;AAAA,UACL,SAAQ;AAAA,UAER,UAAA;AAAA,YAAA,gBAAAQ,EAAC,UAAA,EAAO,IAAG,MAAK,IAAG,MAAK,GAAE,MAAK,QAAO,gBAAe,eAAc,OAAM,aAAY,OAAM;AAAA,YAC3F,gBAAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,GAAE;AAAA,gBACF,QAAO;AAAA,gBACP,eAAc;AAAA,gBACd,aAAY;AAAA,cAAA;AAAA,YAAA;AAAA,UACd;AAAA,QAAA;AAAA,MAAA;AAAA,wBAED,QAAA,EAAK,WAAWN,IAAY,yCAAyC,WAAY,UAAAD,EAAA,CAAM;AAAA,IAAA;AAAA,EAAA;AAC1F;AAGFF,EAAQ,cAAc;"}
@@ -1,4 +1,4 @@
1
- import React from 'react';
1
+ import type React from 'react';
2
2
  export interface StepperItem {
3
3
  description?: string;
4
4
  id: string;
@@ -1,90 +1,78 @@
1
- import { jsx as t, jsxs as o } from "react/jsx-runtime";
1
+ import { jsx as t, jsxs as n, Fragment as u } from "react/jsx-runtime";
2
+ import { Check as x } from "lucide-react";
2
3
  import { cn as r } from "../../utils/cn.js";
3
- const u = ({
4
- items: n,
5
- currentStep: c,
6
- orientation: v = "horizontal",
4
+ const g = ({
5
+ items: o,
6
+ currentStep: m,
7
+ orientation: f = "horizontal",
7
8
  className: p,
8
- ...x
9
+ ...b
9
10
  }) => {
10
- const s = n.findIndex((e) => e.id === c), l = v === "horizontal", f = (e) => e < s ? "completed" : e === s ? "active" : "pending", d = (e) => e ? "bg-[var(--md-primary)]" : "bg-[var(--md-outline-variant)]";
11
+ const l = o.findIndex((e) => e.id === m), a = f === "horizontal", h = (e) => e < l ? "completed" : e === l ? "active" : "pending", c = (e) => e ? "bg-sbk-primary" : "bg-sbk-line-strong";
11
12
  return /* @__PURE__ */ t(
12
13
  "div",
13
14
  {
14
15
  "aria-label": "Progresso",
15
- className: r(l ? "flex items-start" : "flex flex-col", p),
16
+ className: r(a ? "flex items-start" : "flex flex-col", p),
16
17
  role: "list",
17
- ...x,
18
- children: n.map((e, i) => {
19
- const a = f(i), m = i === n.length - 1;
20
- return /* @__PURE__ */ o(
18
+ ...b,
19
+ children: o.map((e, i) => {
20
+ const s = h(i), d = i === o.length - 1;
21
+ return /* @__PURE__ */ n(
21
22
  "div",
22
23
  {
23
- className: r("flex", l ? "flex-1 flex-col items-center" : "gap-4"),
24
+ className: r("flex", a ? "flex-1 flex-col items-center" : "gap-4"),
24
25
  role: "listitem",
25
26
  children: [
26
- /* @__PURE__ */ o(
27
+ /* @__PURE__ */ n(
27
28
  "div",
28
29
  {
29
30
  className: r(
30
- l ? "flex w-full items-center" : "flex flex-col items-center"
31
+ a ? "flex w-full items-center" : "flex flex-col items-center"
31
32
  ),
32
33
  children: [
33
- l && /* Conector esquerdo: espaçador no 1º item, linha colorida nos demais */
34
+ a && /* Conector esquerdo: espaçador no 1º item, linha colorida nos demais */
34
35
  (i === 0 ? /* @__PURE__ */ t("div", { className: "flex-1", "aria-hidden": "true" }) : /* @__PURE__ */ t(
35
36
  "div",
36
37
  {
37
38
  "aria-hidden": "true",
38
- className: r(
39
- "h-0.5 flex-1 transition",
40
- d(i <= s)
41
- )
39
+ className: r("h-0.5 flex-1", c(i <= l))
42
40
  }
43
41
  )),
44
42
  /* @__PURE__ */ t(
45
43
  "div",
46
44
  {
47
- "aria-current": a === "active" ? "step" : void 0,
45
+ "aria-current": s === "active" ? "step" : void 0,
48
46
  className: r(
49
- "relative z-10 flex h-9 w-9 shrink-0 items-center justify-center rounded-full border-2 text-sm font-semibold transition",
50
- a === "completed" && "border-[var(--md-primary)] bg-[var(--md-primary)] text-[var(--md-on-primary)]",
51
- a === "active" && "border-[var(--md-primary)] bg-[var(--md-surface)] text-[var(--md-primary)]",
52
- a === "pending" && "border-[var(--md-outline-variant)] bg-[var(--md-surface)] text-[var(--text-muted)]"
47
+ "relative z-10 flex size-9 shrink-0 items-center justify-center rounded-full border-2 text-sm font-semibold transition-colors motion-reduce:transition-none",
48
+ s === "completed" && "border-sbk-primary bg-sbk-primary text-sbk-on-primary",
49
+ s === "active" && "border-sbk-primary bg-sbk-surface text-sbk-primary",
50
+ s === "pending" && "border-sbk-line-strong bg-sbk-surface text-sbk-fg-muted"
53
51
  ),
54
- children: a === "completed" ? /* @__PURE__ */ t(
55
- "svg",
56
- {
57
- className: "h-4 w-4",
58
- fill: "none",
59
- stroke: "currentColor",
60
- strokeWidth: "2.5",
61
- viewBox: "0 0 24 24",
62
- children: /* @__PURE__ */ t("path", { d: "M20 6 9 17l-5-5", strokeLinecap: "round", strokeLinejoin: "round" })
63
- }
64
- ) : i + 1
52
+ children: s === "completed" ? /* @__PURE__ */ n(u, { children: [
53
+ /* @__PURE__ */ t(x, { "aria-hidden": "true", className: "size-4", strokeWidth: 2.5 }),
54
+ /* @__PURE__ */ t("span", { className: "sr-only", children: "Concluído: " })
55
+ ] }) : i + 1
65
56
  }
66
57
  ),
67
- l ? (
58
+ a ? (
68
59
  /* Conector direito: linha colorida se não for último, espaçador se for */
69
- m ? /* @__PURE__ */ t("div", { className: "flex-1", "aria-hidden": "true" }) : /* @__PURE__ */ t(
60
+ d ? /* @__PURE__ */ t("div", { className: "flex-1", "aria-hidden": "true" }) : /* @__PURE__ */ t(
70
61
  "div",
71
62
  {
72
63
  "aria-hidden": "true",
73
- className: r(
74
- "h-0.5 flex-1 transition",
75
- d(i < s)
76
- )
64
+ className: r("h-0.5 flex-1", c(i < l))
77
65
  }
78
66
  )
79
67
  ) : (
80
68
  /* Conector vertical (para orientação vertical) */
81
- !m && /* @__PURE__ */ t(
69
+ !d && /* @__PURE__ */ t(
82
70
  "div",
83
71
  {
84
72
  "aria-hidden": "true",
85
73
  className: r(
86
- "my-1 ml-[1.0625rem] w-0.5 flex-1 transition",
87
- d(i < s)
74
+ "my-1 ml-[1.0625rem] w-0.5 flex-1",
75
+ c(i < l)
88
76
  )
89
77
  }
90
78
  )
@@ -92,20 +80,20 @@ const u = ({
92
80
  ]
93
81
  }
94
82
  ),
95
- /* @__PURE__ */ o("div", { className: r("mt-2 text-center", !l && "mt-0 pb-6 text-left"), children: [
83
+ /* @__PURE__ */ n("div", { className: r("mt-2 text-center", !a && "mt-0 pb-6 text-left"), children: [
96
84
  /* @__PURE__ */ t(
97
85
  "p",
98
86
  {
99
87
  className: r(
100
- "text-sm font-medium leading-tight",
101
- a === "active" && "text-[var(--md-primary)]",
102
- a === "completed" && "text-[var(--text-primary)]",
103
- a === "pending" && "text-[var(--text-muted)]"
88
+ "m-0 text-sm font-semibold leading-tight",
89
+ s === "active" && "text-sbk-fg-heading",
90
+ s === "completed" && "text-sbk-fg",
91
+ s === "pending" && "font-light text-sbk-fg-muted"
104
92
  ),
105
93
  children: e.label
106
94
  }
107
95
  ),
108
- e.description && /* @__PURE__ */ t("p", { className: "mt-0.5 text-xs text-[var(--text-muted)]", children: e.description })
96
+ e.description && /* @__PURE__ */ t("p", { className: "m-0 mt-0.5 text-xs font-light text-sbk-fg-muted", children: e.description })
109
97
  ] })
110
98
  ]
111
99
  },
@@ -115,8 +103,8 @@ const u = ({
115
103
  }
116
104
  );
117
105
  };
118
- u.displayName = "Stepper";
106
+ g.displayName = "Stepper";
119
107
  export {
120
- u as Stepper
108
+ g as Stepper
121
109
  };
122
110
  //# sourceMappingURL=Stepper.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Stepper.js","sources":["../../../src/components/Stepper/Stepper.tsx"],"sourcesContent":["import React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport interface StepperItem {\n description?: string;\n id: string;\n label: string;\n}\n\nexport type StepStatus = 'completed' | 'active' | 'pending';\n\nexport interface StepperProps extends React.HTMLAttributes<HTMLDivElement> {\n currentStep: string;\n items: StepperItem[];\n orientation?: 'horizontal' | 'vertical';\n}\n\nexport const Stepper: React.FC<StepperProps> = ({\n items,\n currentStep,\n orientation = 'horizontal',\n className,\n ...props\n}) => {\n const currentIndex = items.findIndex((item) => item.id === currentStep);\n const isHorizontal = orientation === 'horizontal';\n\n const getStatus = (index: number): StepStatus => {\n if (index < currentIndex) return 'completed';\n if (index === currentIndex) return 'active';\n return 'pending';\n };\n\n const connectorColor = (isActive: boolean) =>\n isActive ? 'bg-[var(--md-primary)]' : 'bg-[var(--md-outline-variant)]';\n\n return (\n <div\n aria-label=\"Progresso\"\n className={cn(isHorizontal ? 'flex items-start' : 'flex flex-col', className)}\n role=\"list\"\n {...props}\n >\n {items.map((item, index) => {\n const status = getStatus(index);\n const isLast = index === items.length - 1;\n\n return (\n <div\n key={item.id}\n className={cn('flex', isHorizontal ? 'flex-1 flex-col items-center' : 'gap-4')}\n role=\"listitem\"\n >\n {/* ── Indicador + conectores ─────────────────── */}\n <div\n className={cn(\n isHorizontal ? 'flex w-full items-center' : 'flex flex-col items-center',\n )}\n >\n {isHorizontal && (\n /* Conector esquerdo: espaçador no 1º item, linha colorida nos demais */\n index === 0 ? (\n <div className=\"flex-1\" aria-hidden=\"true\" />\n ) : (\n <div\n aria-hidden=\"true\"\n className={cn(\n 'h-0.5 flex-1 transition',\n connectorColor(index <= currentIndex),\n )}\n />\n )\n )}\n\n {/* Círculo */}\n <div\n aria-current={status === 'active' ? 'step' : undefined}\n className={cn(\n 'relative z-10 flex h-9 w-9 shrink-0 items-center justify-center rounded-full border-2 text-sm font-semibold transition',\n status === 'completed' &&\n 'border-[var(--md-primary)] bg-[var(--md-primary)] text-[var(--md-on-primary)]',\n status === 'active' &&\n 'border-[var(--md-primary)] bg-[var(--md-surface)] text-[var(--md-primary)]',\n status === 'pending' &&\n 'border-[var(--md-outline-variant)] bg-[var(--md-surface)] text-[var(--text-muted)]',\n )}\n >\n {status === 'completed' ? (\n <svg\n className=\"h-4 w-4\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M20 6 9 17l-5-5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n ) : (\n index + 1\n )}\n </div>\n\n {isHorizontal ? (\n /* Conector direito: linha colorida se não for último, espaçador se for */\n isLast ? (\n <div className=\"flex-1\" aria-hidden=\"true\" />\n ) : (\n <div\n aria-hidden=\"true\"\n className={cn(\n 'h-0.5 flex-1 transition',\n connectorColor(index < currentIndex),\n )}\n />\n )\n ) : (\n /* Conector vertical (para orientação vertical) */\n !isLast && (\n <div\n aria-hidden=\"true\"\n className={cn(\n 'my-1 ml-[1.0625rem] w-0.5 flex-1 transition',\n connectorColor(index < currentIndex),\n )}\n />\n )\n )}\n </div>\n\n {/* ── Label + descrição ──────────────────────── */}\n <div className={cn('mt-2 text-center', !isHorizontal && 'mt-0 pb-6 text-left')}>\n <p\n className={cn(\n 'text-sm font-medium leading-tight',\n status === 'active' && 'text-[var(--md-primary)]',\n status === 'completed' && 'text-[var(--text-primary)]',\n status === 'pending' && 'text-[var(--text-muted)]',\n )}\n >\n {item.label}\n </p>\n {item.description && (\n <p className=\"mt-0.5 text-xs text-[var(--text-muted)]\">{item.description}</p>\n )}\n </div>\n </div>\n );\n })}\n </div>\n );\n};\n\nStepper.displayName = 'Stepper';\n"],"names":["Stepper","items","currentStep","orientation","className","props","currentIndex","item","isHorizontal","getStatus","index","connectorColor","isActive","jsx","cn","status","isLast","jsxs"],"mappings":"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"}
1
+ {"version":3,"file":"Stepper.js","sources":["../../../src/components/Stepper/Stepper.tsx"],"sourcesContent":["import type React from 'react';\r\nimport { Check } from 'lucide-react';\r\nimport { cn } from '../../utils/cn';\r\n\r\nexport interface StepperItem {\r\n description?: string;\r\n id: string;\r\n label: string;\r\n}\r\n\r\nexport type StepStatus = 'completed' | 'active' | 'pending';\r\n\r\nexport interface StepperProps extends React.HTMLAttributes<HTMLDivElement> {\r\n currentStep: string;\r\n items: StepperItem[];\r\n orientation?: 'horizontal' | 'vertical';\r\n}\r\n\r\nexport const Stepper: React.FC<StepperProps> = ({\r\n items,\r\n currentStep,\r\n orientation = 'horizontal',\r\n className,\r\n ...props\r\n}) => {\r\n const currentIndex = items.findIndex((item) => item.id === currentStep);\r\n const isHorizontal = orientation === 'horizontal';\r\n\r\n const getStatus = (index: number): StepStatus => {\r\n if (index < currentIndex) return 'completed';\r\n if (index === currentIndex) return 'active';\r\n return 'pending';\r\n };\r\n\r\n const connectorColor = (isActive: boolean) =>\r\n isActive ? 'bg-sbk-primary' : 'bg-sbk-line-strong';\r\n\r\n return (\r\n <div\r\n aria-label=\"Progresso\"\r\n className={cn(isHorizontal ? 'flex items-start' : 'flex flex-col', className)}\r\n role=\"list\"\r\n {...props}\r\n >\r\n {items.map((item, index) => {\r\n const status = getStatus(index);\r\n const isLast = index === items.length - 1;\r\n\r\n return (\r\n <div\r\n key={item.id}\r\n className={cn('flex', isHorizontal ? 'flex-1 flex-col items-center' : 'gap-4')}\r\n role=\"listitem\"\r\n >\r\n {/* ── Indicador + conectores ─────────────────── */}\r\n <div\r\n className={cn(\r\n isHorizontal ? 'flex w-full items-center' : 'flex flex-col items-center',\r\n )}\r\n >\r\n {isHorizontal &&\r\n /* Conector esquerdo: espaçador no 1º item, linha colorida nos demais */\r\n (index === 0 ? (\r\n <div className=\"flex-1\" aria-hidden=\"true\" />\r\n ) : (\r\n <div\r\n aria-hidden=\"true\"\r\n className={cn('h-0.5 flex-1', connectorColor(index <= currentIndex))}\r\n />\r\n ))}\r\n\r\n {/* Círculo */}\r\n <div\r\n aria-current={status === 'active' ? 'step' : undefined}\r\n className={cn(\r\n 'relative z-10 flex size-9 shrink-0 items-center justify-center rounded-full border-2 text-sm font-semibold transition-colors motion-reduce:transition-none',\r\n status === 'completed' && 'border-sbk-primary bg-sbk-primary text-sbk-on-primary',\r\n status === 'active' && 'border-sbk-primary bg-sbk-surface text-sbk-primary',\r\n status === 'pending' && 'border-sbk-line-strong bg-sbk-surface text-sbk-fg-muted',\r\n )}\r\n >\r\n {status === 'completed' ? (\r\n <>\r\n <Check aria-hidden=\"true\" className=\"size-4\" strokeWidth={2.5} />\r\n <span className=\"sr-only\">Concluído: </span>\r\n </>\r\n ) : (\r\n index + 1\r\n )}\r\n </div>\r\n\r\n {isHorizontal ? (\r\n /* Conector direito: linha colorida se não for último, espaçador se for */\r\n isLast ? (\r\n <div className=\"flex-1\" aria-hidden=\"true\" />\r\n ) : (\r\n <div\r\n aria-hidden=\"true\"\r\n className={cn('h-0.5 flex-1', connectorColor(index < currentIndex))}\r\n />\r\n )\r\n ) : (\r\n /* Conector vertical (para orientação vertical) */\r\n !isLast && (\r\n <div\r\n aria-hidden=\"true\"\r\n className={cn(\r\n 'my-1 ml-[1.0625rem] w-0.5 flex-1',\r\n connectorColor(index < currentIndex),\r\n )}\r\n />\r\n )\r\n )}\r\n </div>\r\n\r\n {/* ── Label + descrição ──────────────────────── */}\r\n <div className={cn('mt-2 text-center', !isHorizontal && 'mt-0 pb-6 text-left')}>\r\n <p\r\n className={cn(\r\n 'm-0 text-sm font-semibold leading-tight',\r\n status === 'active' && 'text-sbk-fg-heading',\r\n status === 'completed' && 'text-sbk-fg',\r\n status === 'pending' && 'font-light text-sbk-fg-muted',\r\n )}\r\n >\r\n {item.label}\r\n </p>\r\n {item.description && (\r\n <p className=\"m-0 mt-0.5 text-xs font-light text-sbk-fg-muted\">\r\n {item.description}\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n );\r\n};\r\n\r\nStepper.displayName = 'Stepper';\r\n"],"names":["Stepper","items","currentStep","orientation","className","props","currentIndex","item","isHorizontal","getStatus","index","connectorColor","isActive","jsx","cn","status","isLast","jsxs","Fragment","Check"],"mappings":"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"}
@@ -1,11 +1,17 @@
1
1
  import type React from 'react';
2
+ import { type TextWeight } from '../Typography/weight';
2
3
  export interface SubtitleProps extends React.HTMLAttributes<HTMLParagraphElement> {
3
4
  align?: 'left' | 'center' | 'right';
4
- as?: 'p' | 'span' | 'div';
5
+ as?: 'p' | 'span' | 'div' | 'h2' | 'h3' | 'h4';
5
6
  children: React.ReactNode;
6
7
  italic?: boolean;
8
+ /** Cor secundária (Chumbo Leve). */
7
9
  muted?: boolean;
8
10
  size?: 'xs' | 'sm' | 'md' | 'lg';
9
- weight?: 'normal' | 'medium' | 'semibold';
11
+ /** Padrão: semibold (brand book: subtítulos em Seminegrito). */
12
+ weight?: TextWeight;
10
13
  }
11
- export declare const Subtitle: React.FC<SubtitleProps>;
14
+ export declare const Subtitle: {
15
+ ({ as: Tag, size, weight, align, muted, italic, children, className, ...props }: SubtitleProps): import("react/jsx-runtime").JSX.Element;
16
+ displayName: string;
17
+ };