@sbkbs/ui 1.0.5 → 2.0.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (209) hide show
  1. package/CHANGELOG.md +57 -0
  2. package/MIGRATION.md +96 -0
  3. package/README.md +221 -115
  4. package/dist/assets/favicon/apple-touch-icon.png +0 -0
  5. package/dist/assets/favicon/favicon-96x96.png +0 -0
  6. package/dist/assets/favicon/favicon.ico +0 -0
  7. package/dist/assets/favicon/favicon.svg +1 -0
  8. package/dist/assets/favicon/site.webmanifest +21 -0
  9. package/dist/assets/favicon/web-app-manifest-192x192.png +0 -0
  10. package/dist/assets/favicon/web-app-manifest-512x512.png +0 -0
  11. package/dist/base.css +38 -0
  12. package/dist/components/Accordion/Accordion.d.ts +13 -1
  13. package/dist/components/Accordion/Accordion.js +100 -52
  14. package/dist/components/Accordion/Accordion.js.map +1 -1
  15. package/dist/components/Alert/Alert.d.ts +17 -4
  16. package/dist/components/Alert/Alert.js +64 -20
  17. package/dist/components/Alert/Alert.js.map +1 -1
  18. package/dist/components/Avatar/Avatar.d.ts +17 -0
  19. package/dist/components/Avatar/Avatar.js +66 -0
  20. package/dist/components/Avatar/Avatar.js.map +1 -0
  21. package/dist/components/Badge/Badge.d.ts +11 -2
  22. package/dist/components/Badge/Badge.js +42 -30
  23. package/dist/components/Badge/Badge.js.map +1 -1
  24. package/dist/components/Breadcrumb/Breadcrumb.d.ts +5 -2
  25. package/dist/components/Breadcrumb/Breadcrumb.js +23 -16
  26. package/dist/components/Breadcrumb/Breadcrumb.js.map +1 -1
  27. package/dist/components/Button/Button.d.ts +10 -8
  28. package/dist/components/Button/Button.js +73 -114
  29. package/dist/components/Button/Button.js.map +1 -1
  30. package/dist/components/Card/Card.d.ts +33 -3
  31. package/dist/components/Card/Card.js +91 -30
  32. package/dist/components/Card/Card.js.map +1 -1
  33. package/dist/components/Checkbox/Checkbox.d.ts +4 -1
  34. package/dist/components/Checkbox/Checkbox.js +32 -31
  35. package/dist/components/Checkbox/Checkbox.js.map +1 -1
  36. package/dist/components/Chip/Chip.d.ts +7 -1
  37. package/dist/components/Chip/Chip.js +19 -9
  38. package/dist/components/Chip/Chip.js.map +1 -1
  39. package/dist/components/Combobox/Combobox.d.ts +10 -2
  40. package/dist/components/Combobox/Combobox.js +146 -133
  41. package/dist/components/Combobox/Combobox.js.map +1 -1
  42. package/dist/components/Divider/Divider.d.ts +7 -1
  43. package/dist/components/Divider/Divider.js +28 -12
  44. package/dist/components/Divider/Divider.js.map +1 -1
  45. package/dist/components/DropdownMenu/DropdownMenu.d.ts +33 -0
  46. package/dist/components/DropdownMenu/DropdownMenu.js +147 -0
  47. package/dist/components/DropdownMenu/DropdownMenu.js.map +1 -0
  48. package/dist/components/EmptyState/EmptyState.d.ts +7 -1
  49. package/dist/components/EmptyState/EmptyState.js +28 -19
  50. package/dist/components/EmptyState/EmptyState.js.map +1 -1
  51. package/dist/components/Field/Field.d.ts +21 -0
  52. package/dist/components/Field/Field.js +35 -0
  53. package/dist/components/Field/Field.js.map +1 -0
  54. package/dist/components/FileUpload/FileUpload.d.ts +9 -2
  55. package/dist/components/FileUpload/FileUpload.js +128 -102
  56. package/dist/components/FileUpload/FileUpload.js.map +1 -1
  57. package/dist/components/Footer/Footer.d.ts +19 -6
  58. package/dist/components/Footer/Footer.js +47 -50
  59. package/dist/components/Footer/Footer.js.map +1 -1
  60. package/dist/components/GlassPanel/GlassPanel.d.ts +18 -0
  61. package/dist/components/GlassPanel/GlassPanel.js +39 -0
  62. package/dist/components/GlassPanel/GlassPanel.js.map +1 -0
  63. package/dist/components/Header/Header.d.ts +27 -10
  64. package/dist/components/Header/Header.js +98 -98
  65. package/dist/components/Header/Header.js.map +1 -1
  66. package/dist/components/Highlight/Highlight.d.ts +13 -0
  67. package/dist/components/Highlight/Highlight.js +18 -0
  68. package/dist/components/Highlight/Highlight.js.map +1 -0
  69. package/dist/components/Icon/Icon.d.ts +21 -0
  70. package/dist/components/Icon/Icon.js +31 -0
  71. package/dist/components/Icon/Icon.js.map +1 -0
  72. package/dist/components/IconButton/IconButton.d.ts +12 -0
  73. package/dist/components/IconButton/IconButton.js +49 -0
  74. package/dist/components/IconButton/IconButton.js.map +1 -0
  75. package/dist/components/Input/Input.d.ts +3 -2
  76. package/dist/components/Input/Input.js +51 -69
  77. package/dist/components/Input/Input.js.map +1 -1
  78. package/dist/components/Layout/Layout.d.ts +2 -0
  79. package/dist/components/Layout/Layout.js +24 -18
  80. package/dist/components/Layout/Layout.js.map +1 -1
  81. package/dist/components/Logo/Logo.d.ts +27 -0
  82. package/dist/components/Logo/Logo.js +107 -0
  83. package/dist/components/Logo/Logo.js.map +1 -0
  84. package/dist/components/MiniCard/MiniCard.d.ts +21 -0
  85. package/dist/components/MiniCard/MiniCard.js +90 -0
  86. package/dist/components/MiniCard/MiniCard.js.map +1 -0
  87. package/dist/components/Modal/Modal.d.ts +16 -3
  88. package/dist/components/Modal/Modal.js +124 -93
  89. package/dist/components/Modal/Modal.js.map +1 -1
  90. package/dist/components/Navigation/Navigation.d.ts +1 -0
  91. package/dist/components/Navigation/Navigation.js +14 -14
  92. package/dist/components/Navigation/Navigation.js.map +1 -1
  93. package/dist/components/NumberInput/NumberInput.d.ts +5 -2
  94. package/dist/components/NumberInput/NumberInput.js +98 -128
  95. package/dist/components/NumberInput/NumberInput.js.map +1 -1
  96. package/dist/components/PageHeader/PageHeader.d.ts +8 -1
  97. package/dist/components/PageHeader/PageHeader.js +26 -25
  98. package/dist/components/PageHeader/PageHeader.js.map +1 -1
  99. package/dist/components/Pagination/Pagination.d.ts +15 -2
  100. package/dist/components/Pagination/Pagination.js +68 -34
  101. package/dist/components/Pagination/Pagination.js.map +1 -1
  102. package/dist/components/Paragraph/Paragraph.d.ts +8 -2
  103. package/dist/components/Paragraph/Paragraph.js +39 -36
  104. package/dist/components/Paragraph/Paragraph.js.map +1 -1
  105. package/dist/components/Popover/Popover.d.ts +12 -1
  106. package/dist/components/Popover/Popover.js +49 -37
  107. package/dist/components/Popover/Popover.js.map +1 -1
  108. package/dist/components/ProgressBar/ProgressBar.d.ts +18 -0
  109. package/dist/components/ProgressBar/ProgressBar.js +71 -0
  110. package/dist/components/ProgressBar/ProgressBar.js.map +1 -0
  111. package/dist/components/Radio/Radio.d.ts +2 -1
  112. package/dist/components/Radio/Radio.js +27 -31
  113. package/dist/components/Radio/Radio.js.map +1 -1
  114. package/dist/components/SectionHeader/SectionHeader.d.ts +6 -1
  115. package/dist/components/SectionHeader/SectionHeader.js +14 -12
  116. package/dist/components/SectionHeader/SectionHeader.js.map +1 -1
  117. package/dist/components/Select/Select.d.ts +6 -2
  118. package/dist/components/Select/Select.js +47 -35
  119. package/dist/components/Select/Select.js.map +1 -1
  120. package/dist/components/SideNav/SideNav.d.ts +55 -0
  121. package/dist/components/SideNav/SideNav.js +141 -0
  122. package/dist/components/SideNav/SideNav.js.map +1 -0
  123. package/dist/components/Skeleton/Skeleton.d.ts +12 -1
  124. package/dist/components/Skeleton/Skeleton.js +33 -18
  125. package/dist/components/Skeleton/Skeleton.js.map +1 -1
  126. package/dist/components/Spinner/Spinner.d.ts +15 -0
  127. package/dist/components/Spinner/Spinner.js +57 -0
  128. package/dist/components/Spinner/Spinner.js.map +1 -0
  129. package/dist/components/Stepper/Stepper.d.ts +1 -1
  130. package/dist/components/Stepper/Stepper.js +68 -55
  131. package/dist/components/Stepper/Stepper.js.map +1 -1
  132. package/dist/components/Subtitle/Subtitle.d.ts +9 -3
  133. package/dist/components/Subtitle/Subtitle.js +29 -35
  134. package/dist/components/Subtitle/Subtitle.js.map +1 -1
  135. package/dist/components/Switch/Switch.d.ts +2 -1
  136. package/dist/components/Switch/Switch.js +45 -33
  137. package/dist/components/Switch/Switch.js.map +1 -1
  138. package/dist/components/Table/Table.d.ts +19 -1
  139. package/dist/components/Table/Table.js +48 -11
  140. package/dist/components/Table/Table.js.map +1 -1
  141. package/dist/components/Tabs/Tabs.d.ts +16 -2
  142. package/dist/components/Tabs/Tabs.js +80 -44
  143. package/dist/components/Tabs/Tabs.js.map +1 -1
  144. package/dist/components/Tag/Tag.d.ts +8 -1
  145. package/dist/components/Tag/Tag.js +27 -12
  146. package/dist/components/Tag/Tag.js.map +1 -1
  147. package/dist/components/Textarea/Textarea.d.ts +3 -1
  148. package/dist/components/Textarea/Textarea.js +36 -40
  149. package/dist/components/Textarea/Textarea.js.map +1 -1
  150. package/dist/components/Title/Title.d.ts +9 -3
  151. package/dist/components/Title/Title.js +42 -42
  152. package/dist/components/Title/Title.js.map +1 -1
  153. package/dist/components/Toast/Toast.d.ts +39 -11
  154. package/dist/components/Toast/Toast.js +130 -76
  155. package/dist/components/Toast/Toast.js.map +1 -1
  156. package/dist/components/Tooltip/Tooltip.d.ts +12 -2
  157. package/dist/components/Tooltip/Tooltip.js +50 -32
  158. package/dist/components/Tooltip/Tooltip.js.map +1 -1
  159. package/dist/components/Typography/weight.d.ts +9 -0
  160. package/dist/components/Typography/weight.js +5 -0
  161. package/dist/components/Typography/weight.js.map +1 -0
  162. package/dist/fonts.css +8 -0
  163. package/dist/index.cjs +2 -0
  164. package/dist/index.cjs.map +1 -0
  165. package/dist/index.d.ts +55 -43
  166. package/dist/index.js +118 -83
  167. package/dist/index.js.map +1 -1
  168. package/dist/reset.css +9 -0
  169. package/dist/styles.css +1 -0
  170. package/dist/tailwind.css +153 -0
  171. package/dist/theme/ThemeProvider.d.ts +21 -3
  172. package/dist/theme/ThemeProvider.js +57 -18
  173. package/dist/theme/ThemeProvider.js.map +1 -1
  174. package/dist/theme/tokens.d.ts +43 -0
  175. package/dist/theme/tokens.js +39 -0
  176. package/dist/theme/tokens.js.map +1 -0
  177. package/dist/theme.css +296 -261
  178. package/dist/tokens.css +327 -0
  179. package/dist/utils/cn.d.ts +2 -2
  180. package/dist/utils/cn.js +19 -4
  181. package/dist/utils/cn.js.map +1 -1
  182. package/dist/utils/styles.d.ts +37 -0
  183. package/dist/utils/styles.js +35 -0
  184. package/dist/utils/styles.js.map +1 -0
  185. package/package.json +140 -114
  186. package/dist/components/Accordion/Accordion.stories.d.ts +0 -7
  187. package/dist/components/Alert/Alert.stories.d.ts +0 -8
  188. package/dist/components/Badge/Badge.stories.d.ts +0 -8
  189. package/dist/components/Breadcrumb/Breadcrumb.stories.d.ts +0 -8
  190. package/dist/components/Button/Button.stories.d.ts +0 -7
  191. package/dist/components/Card/Card.stories.d.ts +0 -8
  192. package/dist/components/Checkbox/Checkbox.stories.d.ts +0 -7
  193. package/dist/components/Combobox/Combobox.stories.d.ts +0 -9
  194. package/dist/components/Feedback/Feedback.stories.d.ts +0 -5
  195. package/dist/components/FileUpload/FileUpload.stories.d.ts +0 -10
  196. package/dist/components/Input/Input.stories.d.ts +0 -9
  197. package/dist/components/Modal/Modal.stories.d.ts +0 -8
  198. package/dist/components/NumberInput/NumberInput.stories.d.ts +0 -8
  199. package/dist/components/Pagination/Pagination.stories.d.ts +0 -8
  200. package/dist/components/Radio/Radio.stories.d.ts +0 -7
  201. package/dist/components/Select/Select.stories.d.ts +0 -8
  202. package/dist/components/Stepper/Stepper.stories.d.ts +0 -8
  203. package/dist/components/Switch/Switch.stories.d.ts +0 -8
  204. package/dist/components/Tabs/Tabs.stories.d.ts +0 -8
  205. package/dist/components/Textarea/Textarea.stories.d.ts +0 -7
  206. package/dist/components/Toast/Toast.stories.d.ts +0 -8
  207. package/dist/oficios-ui.css +0 -1
  208. package/dist/oficios-ui.umd.cjs +0 -2
  209. package/dist/oficios-ui.umd.cjs.map +0 -1
@@ -1,26 +1,26 @@
1
- import { jsx as o } from "react/jsx-runtime";
2
- import { cn as a } from "../../utils/cn.js";
3
- const s = ({ className: r, ...e }) => /* @__PURE__ */ o(
1
+ import { jsx as s } from "react/jsx-runtime";
2
+ import { cn as b } from "../../utils/cn.js";
3
+ const a = ({ className: e, ...r }) => /* @__PURE__ */ s(
4
4
  "aside",
5
5
  {
6
- className: a(
7
- "h-full rounded-[var(--border-radius-lg)] border border-[var(--border-color)] bg-[var(--bg-secondary)] p-4",
8
- r
6
+ className: b(
7
+ "h-full rounded-sbk-md border border-sbk-line bg-sbk-surface p-4 text-sbk-fg",
8
+ e
9
9
  ),
10
- ...e
10
+ ...r
11
11
  }
12
- ), c = ({ className: r, ...e }) => /* @__PURE__ */ o(
12
+ ), d = ({ className: e, ...r }) => /* @__PURE__ */ s(
13
13
  "header",
14
14
  {
15
- className: a(
16
- "flex min-h-14 items-center justify-between border-b border-[var(--border-color)] bg-[var(--bg-secondary)] px-4",
17
- r
15
+ className: b(
16
+ "flex min-h-14 items-center justify-between gap-4 border-b border-sbk-line bg-sbk-surface px-4 text-sbk-fg",
17
+ e
18
18
  ),
19
- ...e
19
+ ...r
20
20
  }
21
21
  );
22
22
  export {
23
- s as Sidebar,
24
- c as Topbar
23
+ a as Sidebar,
24
+ d as Topbar
25
25
  };
26
26
  //# sourceMappingURL=Navigation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Navigation.js","sources":["../../../src/components/Navigation/Navigation.tsx"],"sourcesContent":["import type React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport interface SidebarProps extends React.HTMLAttributes<HTMLElement> {}\nexport const Sidebar: React.FC<SidebarProps> = ({ className, ...props }) => (\n <aside\n className={cn(\n 'h-full rounded-[var(--border-radius-lg)] border border-[var(--border-color)] bg-[var(--bg-secondary)] p-4',\n className,\n )}\n {...props}\n />\n);\n\nexport interface TopbarProps extends React.HTMLAttributes<HTMLElement> {}\nexport const Topbar: React.FC<TopbarProps> = ({ className, ...props }) => (\n <header\n className={cn(\n 'flex min-h-14 items-center justify-between border-b border-[var(--border-color)] bg-[var(--bg-secondary)] px-4',\n className,\n )}\n {...props}\n />\n);\n"],"names":["Sidebar","className","props","jsx","cn","Topbar"],"mappings":";;AAIO,MAAMA,IAAkC,CAAC,EAAE,WAAAC,GAAW,GAAGC,QAC9D,gBAAAC;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,WAAWC;AAAA,MACT;AAAA,MACAH;AAAA,IAAA;AAAA,IAED,GAAGC;AAAA,EAAA;AACN,GAIWG,IAAgC,CAAC,EAAE,WAAAJ,GAAW,GAAGC,QAC5D,gBAAAC;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,WAAWC;AAAA,MACT;AAAA,MACAH;AAAA,IAAA;AAAA,IAED,GAAGC;AAAA,EAAA;AACN;"}
1
+ {"version":3,"file":"Navigation.js","sources":["../../../src/components/Navigation/Navigation.tsx"],"sourcesContent":["import type React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport interface SidebarProps extends React.HTMLAttributes<HTMLElement> {}\n/** Container lateral simples. Para menu de navegação completo, use SideNav. */\nexport const Sidebar: React.FC<SidebarProps> = ({ className, ...props }) => (\n <aside\n className={cn(\n 'h-full rounded-sbk-md border border-sbk-line bg-sbk-surface p-4 text-sbk-fg',\n className,\n )}\n {...props}\n />\n);\n\nexport interface TopbarProps extends React.HTMLAttributes<HTMLElement> {}\nexport const Topbar: React.FC<TopbarProps> = ({ className, ...props }) => (\n <header\n className={cn(\n 'flex min-h-14 items-center justify-between gap-4 border-b border-sbk-line bg-sbk-surface px-4 text-sbk-fg',\n className,\n )}\n {...props}\n />\n);\n"],"names":["Sidebar","className","props","jsx","cn","Topbar"],"mappings":";;AAKO,MAAMA,IAAkC,CAAC,EAAE,WAAAC,GAAW,GAAGC,QAC9D,gBAAAC;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,WAAWC;AAAA,MACT;AAAA,MACAH;AAAA,IAAA;AAAA,IAED,GAAGC;AAAA,EAAA;AACN,GAIWG,IAAgC,CAAC,EAAE,WAAAJ,GAAW,GAAGC,QAC5D,gBAAAC;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,WAAWC;AAAA,MACT;AAAA,MACAH;AAAA,IAAA;AAAA,IAED,GAAGC;AAAA,EAAA;AACN;"}
@@ -1,12 +1,15 @@
1
1
  import React from 'react';
2
- export interface NumberInputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type' | 'size' | 'onChange'> {
2
+ export interface NumberInputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type' | 'size' | 'onChange' | 'value' | 'defaultValue'> {
3
+ defaultValue?: number;
3
4
  error?: string;
4
5
  helperText?: string;
5
- label?: string;
6
+ label?: React.ReactNode;
6
7
  max?: number;
7
8
  min?: number;
8
9
  onChange?: (value: number | null) => void;
9
10
  size?: 'sm' | 'md' | 'lg';
10
11
  step?: number;
12
+ value?: number | null;
11
13
  }
14
+ /** Campo numérico com botões de incremento. Controlado via `value` + `onChange`. */
12
15
  export declare const NumberInput: React.ForwardRefExoticComponent<NumberInputProps & React.RefAttributes<HTMLInputElement>>;
@@ -1,135 +1,105 @@
1
- import { jsxs as N, jsx as o } from "react/jsx-runtime";
2
- import _ from "react";
3
- import { cn as l } from "../../utils/cn.js";
4
- const M = _.forwardRef(
1
+ import { jsx as r, jsxs as E } from "react/jsx-runtime";
2
+ import R, { useId as T } from "react";
3
+ import { Minus as _, Plus as M } from "lucide-react";
4
+ import { cn as s } from "../../utils/cn.js";
5
+ import { describedBy as P, focusRing as j, transitionColors as F, buttonReset as N } from "../../utils/styles.js";
6
+ import { Field as z } from "../Field/Field.js";
7
+ const A = { sm: "min-h-8 text-sm", md: "min-h-10 text-base", lg: "min-h-12 text-lg" }, B = {
8
+ sm: "w-8 [&_svg]:size-3.5",
9
+ md: "w-10 [&_svg]:size-4",
10
+ lg: "w-12 [&_svg]:size-5"
11
+ }, G = (c, t, o) => Math.min(o ?? Number.POSITIVE_INFINITY, Math.max(t ?? Number.NEGATIVE_INFINITY, c)), H = R.forwardRef(
5
12
  ({
6
- label: x,
7
- error: i,
8
- helperText: v,
9
- size: u = "md",
10
- min: s,
11
- max: n,
12
- step: m = 1,
13
- onChange: r,
14
- className: w,
15
- id: y,
16
- value: b,
17
- defaultValue: a,
18
- disabled: c,
19
- ...g
20
- }, z) => {
21
- const e = y || `number-input-${Math.random().toString(36).slice(2, 9)}`, p = !!i, $ = {
22
- sm: "min-h-8 text-[var(--font-size-sm)]",
23
- md: "min-h-10 text-[var(--font-size-base)]",
24
- lg: "min-h-12 text-[var(--font-size-lg)]"
25
- }, h = {
26
- sm: "h-8 w-7 text-sm",
27
- md: "h-10 w-8 text-base",
28
- lg: "h-12 w-9 text-lg"
29
- }, d = b !== void 0 ? Number(b) : void 0, j = () => {
30
- const t = (d ?? (a !== void 0 ? Number(a) : 0)) - m;
31
- (s === void 0 || t >= s) && (r == null || r(t));
32
- }, k = () => {
33
- const t = (d ?? (a !== void 0 ? Number(a) : 0)) + m;
34
- (n === void 0 || t <= n) && (r == null || r(t));
35
- }, I = (f) => {
36
- const t = f.target.value;
37
- r == null || r(t === "" ? null : Number(t));
38
- };
39
- return /* @__PURE__ */ N("div", { className: "flex flex-col gap-[var(--spacing-xs)]", children: [
40
- x && /* @__PURE__ */ o(
41
- "label",
42
- {
43
- className: "text-[var(--font-size-sm)] font-[var(--font-weight-semibold)] text-[var(--md-on-surface)]",
44
- htmlFor: e,
45
- children: x
46
- }
47
- ),
48
- /* @__PURE__ */ N(
49
- "div",
50
- {
51
- className: l(
52
- "inline-flex overflow-hidden rounded-[var(--border-radius-md)] border border-[var(--md-outline-variant)] bg-[var(--md-surface)] transition focus-within:border-[var(--border-color-focus)] focus-within:[box-shadow:0_0_0_0.1875rem_rgba(47,93,140,0.15)]",
53
- p && "border-[var(--md-error)] focus-within:border-[var(--md-error)]",
54
- c && "cursor-not-allowed opacity-60"
13
+ label: c,
14
+ error: t,
15
+ helperText: o,
16
+ size: m = "md",
17
+ min: n,
18
+ max: a,
19
+ step: p = 1,
20
+ onChange: e,
21
+ className: x,
22
+ id: w,
23
+ value: d,
24
+ defaultValue: f,
25
+ disabled: b,
26
+ required: k,
27
+ ...y
28
+ }, g) => {
29
+ const h = T(), i = w ?? h, u = d ?? f ?? 0, I = (l) => e == null ? void 0 : e(G(u + l * p, n, a)), v = s(
30
+ "flex shrink-0 cursor-pointer items-center justify-center bg-sbk-surface-sunken text-sbk-fg-muted hover:bg-sbk-surface-hover hover:text-sbk-fg disabled:cursor-not-allowed disabled:opacity-50",
31
+ F,
32
+ j,
33
+ B[m]
34
+ );
35
+ return /* @__PURE__ */ r(z, { error: t, helperText: o, id: i, label: c, required: k, children: /* @__PURE__ */ E(
36
+ "div",
37
+ {
38
+ className: s(
39
+ "inline-flex overflow-hidden rounded-sbk-sm border border-sbk-line-strong bg-sbk-surface",
40
+ "focus-within:border-sbk-primary",
41
+ t && "border-sbk-error",
42
+ b && "opacity-60"
43
+ ),
44
+ children: [
45
+ /* @__PURE__ */ r(
46
+ "button",
47
+ {
48
+ "aria-controls": i,
49
+ "aria-label": "Diminuir",
50
+ className: s(N, v, "border-r border-sbk-line"),
51
+ disabled: b || n !== void 0 && u <= n,
52
+ onClick: () => I(-1),
53
+ tabIndex: -1,
54
+ type: "button",
55
+ children: /* @__PURE__ */ r(_, { "aria-hidden": "true" })
56
+ }
55
57
  ),
56
- children: [
57
- /* @__PURE__ */ o(
58
- "button",
59
- {
60
- "aria-label": "Diminuir",
61
- className: l(
62
- "flex shrink-0 items-center justify-center border-r border-[var(--md-outline-variant)] bg-[var(--bg-tertiary)] 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-[var(--border-color-focus)]",
63
- h[u]
64
- ),
65
- disabled: c || s !== void 0 && (d ?? 0) <= s,
66
- onClick: j,
67
- type: "button",
68
- children: "−"
69
- }
70
- ),
71
- /* @__PURE__ */ o(
72
- "input",
73
- {
74
- ref: z,
75
- "aria-describedby": i ? `${e}-error` : v ? `${e}-helper` : void 0,
76
- "aria-invalid": p ? !0 : void 0,
77
- className: l(
78
- "w-full min-w-0 bg-transparent px-3 text-center text-[var(--md-on-surface)] outline-none",
79
- $[u],
80
- w
81
- ),
82
- defaultValue: a,
83
- disabled: c,
84
- id: e,
85
- max: n,
86
- min: s,
87
- step: m,
88
- type: "number",
89
- value: b,
90
- onChange: I,
91
- ...g
92
- }
93
- ),
94
- /* @__PURE__ */ o(
95
- "button",
96
- {
97
- "aria-label": "Aumentar",
98
- className: l(
99
- "flex shrink-0 items-center justify-center border-l border-[var(--md-outline-variant)] bg-[var(--bg-tertiary)] 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-[var(--border-color-focus)]",
100
- h[u]
101
- ),
102
- disabled: c || n !== void 0 && (d ?? 0) >= n,
103
- onClick: k,
104
- type: "button",
105
- children: "+"
106
- }
107
- )
108
- ]
109
- }
110
- ),
111
- i && /* @__PURE__ */ o(
112
- "span",
113
- {
114
- className: "text-[var(--font-size-xs)] text-[var(--md-error)]",
115
- id: `${e}-error`,
116
- role: "alert",
117
- children: i
118
- }
119
- ),
120
- v && !i && /* @__PURE__ */ o(
121
- "span",
122
- {
123
- className: "text-[var(--font-size-xs)] text-[var(--md-on-surface-variant)]",
124
- id: `${e}-helper`,
125
- children: v
126
- }
127
- )
128
- ] });
58
+ /* @__PURE__ */ r(
59
+ "input",
60
+ {
61
+ ref: g,
62
+ "aria-describedby": P(i, t, o),
63
+ "aria-invalid": t ? !0 : void 0,
64
+ className: s(
65
+ "w-full min-w-0 bg-transparent px-3 text-center font-light text-sbk-fg outline-none [appearance:textfield] [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none",
66
+ A[m],
67
+ x
68
+ ),
69
+ defaultValue: d === void 0 ? f : void 0,
70
+ disabled: b,
71
+ id: i,
72
+ inputMode: "decimal",
73
+ max: a,
74
+ min: n,
75
+ onChange: (l) => e == null ? void 0 : e(l.target.value === "" ? null : Number(l.target.value)),
76
+ required: k,
77
+ step: p,
78
+ type: "number",
79
+ value: d === void 0 ? void 0 : d ?? "",
80
+ ...y
81
+ }
82
+ ),
83
+ /* @__PURE__ */ r(
84
+ "button",
85
+ {
86
+ "aria-controls": i,
87
+ "aria-label": "Aumentar",
88
+ className: s(N, v, "border-l border-sbk-line"),
89
+ disabled: b || a !== void 0 && u >= a,
90
+ onClick: () => I(1),
91
+ tabIndex: -1,
92
+ type: "button",
93
+ children: /* @__PURE__ */ r(M, { "aria-hidden": "true" })
94
+ }
95
+ )
96
+ ]
97
+ }
98
+ ) });
129
99
  }
130
100
  );
131
- M.displayName = "NumberInput";
101
+ H.displayName = "NumberInput";
132
102
  export {
133
- M as NumberInput
103
+ H as NumberInput
134
104
  };
135
105
  //# sourceMappingURL=NumberInput.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"NumberInput.js","sources":["../../../src/components/NumberInput/NumberInput.tsx"],"sourcesContent":["import React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport interface NumberInputProps extends Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n 'type' | 'size' | 'onChange'\n> {\n error?: string;\n helperText?: string;\n label?: string;\n max?: number;\n min?: number;\n onChange?: (value: number | null) => void;\n size?: 'sm' | 'md' | 'lg';\n step?: number;\n}\n\nexport const NumberInput = React.forwardRef<HTMLInputElement, NumberInputProps>(\n (\n {\n label,\n error,\n helperText,\n size = 'md',\n min,\n max,\n step = 1,\n onChange,\n className,\n id,\n value,\n defaultValue,\n disabled,\n ...props\n },\n ref,\n ) => {\n const inputId = id || `number-input-${Math.random().toString(36).slice(2, 9)}`;\n const hasError = !!error;\n\n const sizeClassMap = {\n sm: 'min-h-8 text-[var(--font-size-sm)]',\n md: 'min-h-10 text-[var(--font-size-base)]',\n lg: 'min-h-12 text-[var(--font-size-lg)]',\n };\n\n const buttonSizeMap = {\n sm: 'h-8 w-7 text-sm',\n md: 'h-10 w-8 text-base',\n lg: 'h-12 w-9 text-lg',\n };\n\n const numValue = value !== undefined ? Number(value) : undefined;\n\n const handleDecrement = () => {\n const current = numValue ?? (defaultValue !== undefined ? Number(defaultValue) : 0);\n const next = current - step;\n if (min === undefined || next >= min) {\n onChange?.(next);\n }\n };\n\n const handleIncrement = () => {\n const current = numValue ?? (defaultValue !== undefined ? Number(defaultValue) : 0);\n const next = current + step;\n if (max === undefined || next <= max) {\n onChange?.(next);\n }\n };\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const raw = e.target.value;\n onChange?.(raw === '' ? null : Number(raw));\n };\n\n return (\n <div className=\"flex flex-col gap-[var(--spacing-xs)]\">\n {label && (\n <label\n className=\"text-[var(--font-size-sm)] font-[var(--font-weight-semibold)] text-[var(--md-on-surface)]\"\n htmlFor={inputId}\n >\n {label}\n </label>\n )}\n <div\n className={cn(\n 'inline-flex overflow-hidden rounded-[var(--border-radius-md)] border border-[var(--md-outline-variant)] bg-[var(--md-surface)] transition focus-within:border-[var(--border-color-focus)] focus-within:[box-shadow:0_0_0_0.1875rem_rgba(47,93,140,0.15)]',\n hasError && 'border-[var(--md-error)] focus-within:border-[var(--md-error)]',\n disabled && 'cursor-not-allowed opacity-60',\n )}\n >\n <button\n aria-label=\"Diminuir\"\n className={cn(\n 'flex shrink-0 items-center justify-center border-r border-[var(--md-outline-variant)] bg-[var(--bg-tertiary)] 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-[var(--border-color-focus)]',\n buttonSizeMap[size],\n )}\n disabled={disabled || (min !== undefined && (numValue ?? 0) <= min)}\n onClick={handleDecrement}\n type=\"button\"\n >\n −\n </button>\n <input\n ref={ref}\n aria-describedby={\n error ? `${inputId}-error` : helperText ? `${inputId}-helper` : undefined\n }\n aria-invalid={hasError ? true : undefined}\n className={cn(\n 'w-full min-w-0 bg-transparent px-3 text-center text-[var(--md-on-surface)] outline-none',\n sizeClassMap[size],\n className,\n )}\n defaultValue={defaultValue}\n disabled={disabled}\n id={inputId}\n max={max}\n min={min}\n step={step}\n type=\"number\"\n value={value}\n onChange={handleChange}\n {...props}\n />\n <button\n aria-label=\"Aumentar\"\n className={cn(\n 'flex shrink-0 items-center justify-center border-l border-[var(--md-outline-variant)] bg-[var(--bg-tertiary)] 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-[var(--border-color-focus)]',\n buttonSizeMap[size],\n )}\n disabled={disabled || (max !== undefined && (numValue ?? 0) >= max)}\n onClick={handleIncrement}\n type=\"button\"\n >\n +\n </button>\n </div>\n {error && (\n <span\n className=\"text-[var(--font-size-xs)] text-[var(--md-error)]\"\n id={`${inputId}-error`}\n role=\"alert\"\n >\n {error}\n </span>\n )}\n {helperText && !error && (\n <span\n className=\"text-[var(--font-size-xs)] text-[var(--md-on-surface-variant)]\"\n id={`${inputId}-helper`}\n >\n {helperText}\n </span>\n )}\n </div>\n );\n },\n);\n\nNumberInput.displayName = 'NumberInput';\n"],"names":["NumberInput","React","label","error","helperText","size","min","max","step","onChange","className","id","value","defaultValue","disabled","props","ref","inputId","hasError","sizeClassMap","buttonSizeMap","numValue","handleDecrement","next","handleIncrement","handleChange","e","raw","jsxs","jsx","cn"],"mappings":";;;AAiBO,MAAMA,IAAcC,EAAM;AAAA,EAC/B,CACE;AAAA,IACE,OAAAC;AAAA,IACA,OAAAC;AAAA,IACA,YAAAC;AAAA,IACA,MAAAC,IAAO;AAAA,IACP,KAAAC;AAAA,IACA,KAAAC;AAAA,IACA,MAAAC,IAAO;AAAA,IACP,UAAAC;AAAA,IACA,WAAAC;AAAA,IACA,IAAAC;AAAA,IACA,OAAAC;AAAA,IACA,cAAAC;AAAA,IACA,UAAAC;AAAA,IACA,GAAGC;AAAA,EAAA,GAELC,MACG;AACH,UAAMC,IAAUN,KAAM,gBAAgB,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC,IACtEO,IAAW,CAAC,CAACf,GAEbgB,IAAe;AAAA,MACnB,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA,GAGAC,IAAgB;AAAA,MACpB,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA,GAGAC,IAAWT,MAAU,SAAY,OAAOA,CAAK,IAAI,QAEjDU,IAAkB,MAAM;AAE5B,YAAMC,KADUF,MAAaR,MAAiB,SAAY,OAAOA,CAAY,IAAI,MAC1DL;AACvB,OAAIF,MAAQ,UAAaiB,KAAQjB,OAC/BG,KAAA,QAAAA,EAAWc;AAAA,IAEf,GAEMC,IAAkB,MAAM;AAE5B,YAAMD,KADUF,MAAaR,MAAiB,SAAY,OAAOA,CAAY,IAAI,MAC1DL;AACvB,OAAID,MAAQ,UAAagB,KAAQhB,OAC/BE,KAAA,QAAAA,EAAWc;AAAA,IAEf,GAEME,IAAe,CAACC,MAA2C;AAC/D,YAAMC,IAAMD,EAAE,OAAO;AACrB,MAAAjB,KAAA,QAAAA,EAAWkB,MAAQ,KAAK,OAAO,OAAOA,CAAG;AAAA,IAC3C;AAEA,WACE,gBAAAC,EAAC,OAAA,EAAI,WAAU,yCACZ,UAAA;AAAA,MAAA1B,KACC,gBAAA2B;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,SAASZ;AAAA,UAER,UAAAf;AAAA,QAAA;AAAA,MAAA;AAAA,MAGL,gBAAA0B;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAWE;AAAA,YACT;AAAA,YACAZ,KAAY;AAAA,YACZJ,KAAY;AAAA,UAAA;AAAA,UAGd,UAAA;AAAA,YAAA,gBAAAe;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,cAAW;AAAA,gBACX,WAAWC;AAAA,kBACT;AAAA,kBACAV,EAAcf,CAAI;AAAA,gBAAA;AAAA,gBAEpB,UAAUS,KAAaR,MAAQ,WAAce,KAAY,MAAMf;AAAA,gBAC/D,SAASgB;AAAA,gBACT,MAAK;AAAA,gBACN,UAAA;AAAA,cAAA;AAAA,YAAA;AAAA,YAGD,gBAAAO;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,KAAAb;AAAA,gBACA,oBACEb,IAAQ,GAAGc,CAAO,WAAWb,IAAa,GAAGa,CAAO,YAAY;AAAA,gBAElE,gBAAcC,IAAW,KAAO;AAAA,gBAChC,WAAWY;AAAA,kBACT;AAAA,kBACAX,EAAad,CAAI;AAAA,kBACjBK;AAAA,gBAAA;AAAA,gBAEF,cAAAG;AAAA,gBACA,UAAAC;AAAA,gBACA,IAAIG;AAAA,gBACJ,KAAAV;AAAA,gBACA,KAAAD;AAAA,gBACA,MAAAE;AAAA,gBACA,MAAK;AAAA,gBACL,OAAAI;AAAA,gBACA,UAAUa;AAAA,gBACT,GAAGV;AAAA,cAAA;AAAA,YAAA;AAAA,YAEN,gBAAAc;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,cAAW;AAAA,gBACX,WAAWC;AAAA,kBACT;AAAA,kBACAV,EAAcf,CAAI;AAAA,gBAAA;AAAA,gBAEpB,UAAUS,KAAaP,MAAQ,WAAcc,KAAY,MAAMd;AAAA,gBAC/D,SAASiB;AAAA,gBACT,MAAK;AAAA,gBACN,UAAA;AAAA,cAAA;AAAA,YAAA;AAAA,UAED;AAAA,QAAA;AAAA,MAAA;AAAA,MAEDrB,KACC,gBAAA0B;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,IAAI,GAAGZ,CAAO;AAAA,UACd,MAAK;AAAA,UAEJ,UAAAd;AAAA,QAAA;AAAA,MAAA;AAAA,MAGJC,KAAc,CAACD,KACd,gBAAA0B;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,IAAI,GAAGZ,CAAO;AAAA,UAEb,UAAAb;AAAA,QAAA;AAAA,MAAA;AAAA,IACH,GAEJ;AAAA,EAEJ;AACF;AAEAJ,EAAY,cAAc;"}
1
+ {"version":3,"file":"NumberInput.js","sources":["../../../src/components/NumberInput/NumberInput.tsx"],"sourcesContent":["import React, { useId } from 'react';\nimport { Minus, Plus } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { buttonReset, describedBy, focusRing, transitionColors } from '../../utils/styles';\nimport { Field } from '../Field/Field';\n\nexport interface NumberInputProps extends Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n 'type' | 'size' | 'onChange' | 'value' | 'defaultValue'\n> {\n defaultValue?: number;\n error?: string;\n helperText?: string;\n label?: React.ReactNode;\n max?: number;\n min?: number;\n onChange?: (value: number | null) => void;\n size?: 'sm' | 'md' | 'lg';\n step?: number;\n value?: number | null;\n}\n\nconst HEIGHT = { sm: 'min-h-8 text-sm', md: 'min-h-10 text-base', lg: 'min-h-12 text-lg' } as const;\nconst STEPPER = {\n sm: 'w-8 [&_svg]:size-3.5',\n md: 'w-10 [&_svg]:size-4',\n lg: 'w-12 [&_svg]:size-5',\n} as const;\n\nconst clamp = (n: number, min?: number, max?: number) =>\n Math.min(max ?? Number.POSITIVE_INFINITY, Math.max(min ?? Number.NEGATIVE_INFINITY, n));\n\n/** Campo numérico com botões de incremento. Controlado via `value` + `onChange`. */\nexport const NumberInput = React.forwardRef<HTMLInputElement, NumberInputProps>(\n (\n {\n label,\n error,\n helperText,\n size = 'md',\n min,\n max,\n step = 1,\n onChange,\n className,\n id,\n value,\n defaultValue,\n disabled,\n required,\n ...props\n },\n ref,\n ) => {\n const autoId = useId();\n const inputId = id ?? autoId;\n const current = value ?? defaultValue ?? 0;\n\n const stepBy = (dir: 1 | -1) => onChange?.(clamp(current + dir * step, min, max));\n\n const stepperClass = cn(\n 'flex shrink-0 cursor-pointer items-center justify-center bg-sbk-surface-sunken text-sbk-fg-muted hover:bg-sbk-surface-hover hover:text-sbk-fg disabled:cursor-not-allowed disabled:opacity-50',\n transitionColors,\n focusRing,\n STEPPER[size],\n );\n\n return (\n <Field error={error} helperText={helperText} id={inputId} label={label} required={required}>\n <div\n className={cn(\n 'inline-flex overflow-hidden rounded-sbk-sm border border-sbk-line-strong bg-sbk-surface',\n 'focus-within:border-sbk-primary',\n error && 'border-sbk-error',\n disabled && 'opacity-60',\n )}\n >\n <button\n aria-controls={inputId}\n aria-label=\"Diminuir\"\n className={cn(buttonReset, stepperClass, 'border-r border-sbk-line')}\n disabled={disabled || (min !== undefined && current <= min)}\n onClick={() => stepBy(-1)}\n tabIndex={-1}\n type=\"button\"\n >\n <Minus aria-hidden=\"true\" />\n </button>\n <input\n ref={ref}\n aria-describedby={describedBy(inputId, error, helperText)}\n aria-invalid={error ? true : undefined}\n className={cn(\n 'w-full min-w-0 bg-transparent px-3 text-center font-light text-sbk-fg outline-none [appearance:textfield] [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none',\n HEIGHT[size],\n className,\n )}\n defaultValue={value === undefined ? defaultValue : undefined}\n disabled={disabled}\n id={inputId}\n inputMode=\"decimal\"\n max={max}\n min={min}\n onChange={(e) => onChange?.(e.target.value === '' ? null : Number(e.target.value))}\n required={required}\n step={step}\n type=\"number\"\n value={value === undefined ? undefined : (value ?? '')}\n {...props}\n />\n <button\n aria-controls={inputId}\n aria-label=\"Aumentar\"\n className={cn(buttonReset, stepperClass, 'border-l border-sbk-line')}\n disabled={disabled || (max !== undefined && current >= max)}\n onClick={() => stepBy(1)}\n tabIndex={-1}\n type=\"button\"\n >\n <Plus aria-hidden=\"true\" />\n </button>\n </div>\n </Field>\n );\n },\n);\n\nNumberInput.displayName = 'NumberInput';\n"],"names":["HEIGHT","STEPPER","clamp","n","min","max","NumberInput","React","label","error","helperText","size","step","onChange","className","id","value","defaultValue","disabled","required","props","ref","autoId","useId","inputId","current","stepBy","dir","stepperClass","cn","transitionColors","focusRing","Field","jsxs","jsx","buttonReset","Minus","describedBy","e","Plus"],"mappings":"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"}
@@ -1,7 +1,14 @@
1
1
  import type React from 'react';
2
2
  export interface PageHeaderProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {
3
3
  actions?: React.ReactNode;
4
+ /** Conteúdo acima do título (ex.: Breadcrumb). */
5
+ breadcrumb?: React.ReactNode;
4
6
  subtitle?: React.ReactNode;
5
7
  title: React.ReactNode;
8
+ /** `plain`: sem caixa. `card`: superfície com borda. `inverse`: bloco verde escuro (hero). */
9
+ variant?: 'plain' | 'card' | 'inverse';
6
10
  }
7
- export declare const PageHeader: React.FC<PageHeaderProps>;
11
+ export declare const PageHeader: {
12
+ ({ title, subtitle, actions, breadcrumb, variant, className, ...props }: PageHeaderProps): import("react/jsx-runtime").JSX.Element;
13
+ displayName: string;
14
+ };
@@ -1,29 +1,30 @@
1
- import { jsx as e, jsxs as d } from "react/jsx-runtime";
2
- import { cn as c } from "../../utils/cn.js";
3
- const i = ({
4
- title: s,
5
- subtitle: r,
1
+ import { jsxs as e, jsx as r } from "react/jsx-runtime";
2
+ import { cn as d } from "../../utils/cn.js";
3
+ import { inverseScope as c } from "../../utils/styles.js";
4
+ const p = {
5
+ plain: "",
6
+ card: "rounded-sbk-md border border-sbk-line bg-sbk-surface p-5",
7
+ inverse: d("rounded-sbk-md p-6 md:p-8", c)
8
+ }, o = ({
9
+ title: i,
10
+ subtitle: s,
6
11
  actions: a,
7
- className: t,
8
- ...o
9
- }) => /* @__PURE__ */ e(
10
- "header",
11
- {
12
- className: c(
13
- "grid gap-3 rounded-[var(--border-radius-lg)] border border-[var(--border-color)] bg-[var(--bg-secondary)] p-5 shadow-[var(--shadow-sm)]",
14
- t
15
- ),
16
- ...o,
17
- children: /* @__PURE__ */ d("div", { className: "flex items-start justify-between gap-4", children: [
18
- /* @__PURE__ */ d("div", { className: "grid gap-1", children: [
19
- /* @__PURE__ */ e("h1", { className: "m-0 text-2xl font-bold text-[var(--text-primary)]", children: s }),
20
- r && /* @__PURE__ */ e("p", { className: "m-0 text-sm text-[var(--text-secondary)]", children: r })
21
- ] }),
22
- a && /* @__PURE__ */ e("div", { className: "flex items-center gap-2", children: a })
23
- ] })
24
- }
25
- );
12
+ breadcrumb: m,
13
+ variant: t = "card",
14
+ className: l,
15
+ ...n
16
+ }) => /* @__PURE__ */ e("header", { className: d("grid gap-3", p[t], l), ...n, children: [
17
+ m,
18
+ /* @__PURE__ */ e("div", { className: "flex flex-wrap items-start justify-between gap-4", children: [
19
+ /* @__PURE__ */ e("div", { className: "grid min-w-0 gap-1", children: [
20
+ /* @__PURE__ */ r("h1", { className: "m-0 text-2xl font-semibold leading-tight text-sbk-fg-heading md:text-[1.75rem]", children: i }),
21
+ s && /* @__PURE__ */ r("p", { className: "m-0 text-sm font-light text-sbk-fg-muted", children: s })
22
+ ] }),
23
+ a && /* @__PURE__ */ r("div", { className: "flex shrink-0 flex-wrap items-center gap-2", children: a })
24
+ ] })
25
+ ] });
26
+ o.displayName = "PageHeader";
26
27
  export {
27
- i as PageHeader
28
+ o as PageHeader
28
29
  };
29
30
  //# sourceMappingURL=PageHeader.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PageHeader.js","sources":["../../../src/components/PageHeader/PageHeader.tsx"],"sourcesContent":["import type React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport interface PageHeaderProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\n actions?: React.ReactNode;\n subtitle?: React.ReactNode;\n title: React.ReactNode;\n}\n\nexport const PageHeader: React.FC<PageHeaderProps> = ({\n title,\n subtitle,\n actions,\n className,\n ...props\n}) => {\n return (\n <header\n className={cn(\n 'grid gap-3 rounded-[var(--border-radius-lg)] border border-[var(--border-color)] bg-[var(--bg-secondary)] p-5 shadow-[var(--shadow-sm)]',\n className,\n )}\n {...props}\n >\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"grid gap-1\">\n <h1 className=\"m-0 text-2xl font-bold text-[var(--text-primary)]\">{title}</h1>\n {subtitle && <p className=\"m-0 text-sm text-[var(--text-secondary)]\">{subtitle}</p>}\n </div>\n {actions && <div className=\"flex items-center gap-2\">{actions}</div>}\n </div>\n </header>\n );\n};\n"],"names":["PageHeader","title","subtitle","actions","className","props","jsx","cn","jsxs"],"mappings":";;AASO,MAAMA,IAAwC,CAAC;AAAA,EACpD,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,SAAAC;AAAA,EACA,WAAAC;AAAA,EACA,GAAGC;AACL,MAEI,gBAAAC;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,WAAWC;AAAA,MACT;AAAA,MACAH;AAAA,IAAA;AAAA,IAED,GAAGC;AAAA,IAEJ,UAAA,gBAAAG,EAAC,OAAA,EAAI,WAAU,0CACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,cACb,UAAA;AAAA,QAAA,gBAAAF,EAAC,MAAA,EAAG,WAAU,qDAAqD,UAAAL,GAAM;AAAA,QACxEC,KAAY,gBAAAI,EAAC,KAAA,EAAE,WAAU,4CAA4C,UAAAJ,EAAA,CAAS;AAAA,MAAA,GACjF;AAAA,MACCC,KAAW,gBAAAG,EAAC,OAAA,EAAI,WAAU,2BAA2B,UAAAH,EAAA,CAAQ;AAAA,IAAA,EAAA,CAChE;AAAA,EAAA;AAAA;"}
1
+ {"version":3,"file":"PageHeader.js","sources":["../../../src/components/PageHeader/PageHeader.tsx"],"sourcesContent":["import type React from 'react';\nimport { cn } from '../../utils/cn';\nimport { inverseScope } from '../../utils/styles';\n\nexport interface PageHeaderProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\n actions?: React.ReactNode;\n /** Conteúdo acima do título (ex.: Breadcrumb). */\n breadcrumb?: React.ReactNode;\n subtitle?: React.ReactNode;\n title: React.ReactNode;\n /** `plain`: sem caixa. `card`: superfície com borda. `inverse`: bloco verde escuro (hero). */\n variant?: 'plain' | 'card' | 'inverse';\n}\n\nconst VARIANT_CLASS = {\n plain: '',\n card: 'rounded-sbk-md border border-sbk-line bg-sbk-surface p-5',\n inverse: cn('rounded-sbk-md p-6 md:p-8', inverseScope),\n} as const;\n\nexport const PageHeader = ({\n title,\n subtitle,\n actions,\n breadcrumb,\n variant = 'card',\n className,\n ...props\n}: PageHeaderProps) => (\n <header className={cn('grid gap-3', VARIANT_CLASS[variant], className)} {...props}>\n {breadcrumb}\n <div className=\"flex flex-wrap items-start justify-between gap-4\">\n <div className=\"grid min-w-0 gap-1\">\n <h1 className=\"m-0 text-2xl font-semibold leading-tight text-sbk-fg-heading md:text-[1.75rem]\">\n {title}\n </h1>\n {subtitle && <p className=\"m-0 text-sm font-light text-sbk-fg-muted\">{subtitle}</p>}\n </div>\n {actions && <div className=\"flex shrink-0 flex-wrap items-center gap-2\">{actions}</div>}\n </div>\n </header>\n);\n\nPageHeader.displayName = 'PageHeader';\n"],"names":["VARIANT_CLASS","cn","inverseScope","PageHeader","title","subtitle","actions","breadcrumb","variant","className","props","jsxs","jsx"],"mappings":";;;AAcA,MAAMA,IAAgB;AAAA,EACpB,OAAO;AAAA,EACP,MAAM;AAAA,EACN,SAASC,EAAG,6BAA6BC,CAAY;AACvD,GAEaC,IAAa,CAAC;AAAA,EACzB,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,SAAAC;AAAA,EACA,YAAAC;AAAA,EACA,SAAAC,IAAU;AAAA,EACV,WAAAC;AAAA,EACA,GAAGC;AACL,MACE,gBAAAC,EAAC,UAAA,EAAO,WAAWV,EAAG,cAAcD,EAAcQ,CAAO,GAAGC,CAAS,GAAI,GAAGC,GACzE,UAAA;AAAA,EAAAH;AAAA,EACD,gBAAAI,EAAC,OAAA,EAAI,WAAU,oDACb,UAAA;AAAA,IAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,sBACb,UAAA;AAAA,MAAA,gBAAAC,EAAC,MAAA,EAAG,WAAU,kFACX,UAAAR,GACH;AAAA,MACCC,KAAY,gBAAAO,EAAC,KAAA,EAAE,WAAU,4CAA4C,UAAAP,EAAA,CAAS;AAAA,IAAA,GACjF;AAAA,IACCC,KAAW,gBAAAM,EAAC,OAAA,EAAI,WAAU,8CAA8C,UAAAN,EAAA,CAAQ;AAAA,EAAA,EAAA,CACnF;AAAA,EAAA,CACF;AAGFH,EAAW,cAAc;"}
@@ -1,7 +1,20 @@
1
- import type React from 'react';
2
1
  export interface PaginationProps {
2
+ className?: string;
3
3
  currentPage: number;
4
4
  onPageChange: (page: number) => void;
5
+ /** Páginas vizinhas exibidas ao redor da atual. Padrão: 1. */
6
+ siblingCount?: number;
7
+ /**
8
+ * `numbered`: lista de páginas com reticências.
9
+ * `simple`: apenas Anterior/Próxima com "Página X de Y" (para paginação sequencial).
10
+ */
11
+ variant?: 'numbered' | 'simple';
5
12
  totalPages: number;
6
13
  }
7
- export declare const Pagination: React.FC<PaginationProps>;
14
+ type PageToken = number | 'ellipsis-start' | 'ellipsis-end';
15
+ export declare const getPageTokens: (current: number, total: number, siblings?: number) => PageToken[];
16
+ export declare const Pagination: {
17
+ ({ currentPage, totalPages, onPageChange, siblingCount, variant, className, }: PaginationProps): import("react/jsx-runtime").JSX.Element | null;
18
+ displayName: string;
19
+ };
20
+ export {};
@@ -1,50 +1,84 @@
1
- import { jsxs as b, jsx as a } from "react/jsx-runtime";
2
- import { cn as s } from "../../utils/cn.js";
3
- const l = ({
4
- currentPage: r,
5
- totalPages: d,
6
- onPageChange: e
1
+ import { jsxs as m, jsx as n } from "react/jsx-runtime";
2
+ import { ChevronLeft as f, ChevronRight as u } from "lucide-react";
3
+ import { cn as a } from "../../utils/cn.js";
4
+ import { focusRing as h, transitionColors as x, buttonReset as p } from "../../utils/styles.js";
5
+ const y = (e, i, r = 1) => {
6
+ const d = r * 2 + 5;
7
+ if (i <= d) return Array.from({ length: i }, (s, c) => c + 1);
8
+ const o = Math.max(2, e - r), l = Math.min(i - 1, e + r), t = [1];
9
+ o > 2 && t.push("ellipsis-start");
10
+ for (let s = o; s <= l; s++) t.push(s);
11
+ return l < i - 1 && t.push("ellipsis-end"), t.push(i), t;
12
+ }, b = a(
13
+ "inline-flex min-h-9 min-w-9 cursor-pointer items-center justify-center gap-1 rounded-sbk-sm border px-2.5 text-sm disabled:cursor-not-allowed disabled:opacity-50",
14
+ x,
15
+ h
16
+ ), N = ({
17
+ currentPage: e,
18
+ totalPages: i,
19
+ onPageChange: r,
20
+ siblingCount: d = 1,
21
+ variant: o = "numbered",
22
+ className: l
7
23
  }) => {
8
- if (d <= 1)
9
- return null;
10
- const t = Array.from({ length: d }, (o, i) => i + 1);
11
- return /* @__PURE__ */ b("nav", { "aria-label": "Paginação", className: "flex flex-wrap items-center gap-1", children: [
12
- /* @__PURE__ */ a(
24
+ if (i <= 1) return null;
25
+ const t = "border-sbk-line bg-sbk-surface font-light text-sbk-fg hover:bg-sbk-surface-hover";
26
+ return /* @__PURE__ */ m("nav", { "aria-label": "Paginação", className: a("flex flex-wrap items-center gap-1", l), children: [
27
+ /* @__PURE__ */ m(
13
28
  "button",
14
29
  {
15
- className: "rounded-[var(--border-radius-sm)] border border-[var(--border-color)] px-2 py-1 text-sm disabled:opacity-50",
16
- disabled: r === 1,
17
- onClick: () => e(Math.max(r - 1, 1)),
30
+ className: a(p, b, t),
31
+ disabled: e <= 1,
32
+ onClick: () => r(e - 1),
18
33
  type: "button",
19
- children: "Anterior"
34
+ children: [
35
+ /* @__PURE__ */ n(f, { "aria-hidden": "true", className: "size-4" }),
36
+ "Anterior"
37
+ ]
20
38
  }
21
39
  ),
22
- t.map((o) => /* @__PURE__ */ a(
23
- "button",
24
- {
25
- className: s(
26
- "rounded-[var(--border-radius-sm)] border px-2.5 py-1 text-sm",
27
- o === r ? "border-[var(--md-primary)] bg-[var(--md-primary)] text-[var(--md-on-primary)]" : "border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]"
28
- ),
29
- onClick: () => e(o),
30
- type: "button",
31
- children: o
32
- },
33
- o
34
- )),
35
- /* @__PURE__ */ a(
40
+ o === "simple" ? /* @__PURE__ */ m("span", { "aria-live": "polite", className: "px-3 text-sm font-light text-sbk-fg-muted", children: [
41
+ "Página ",
42
+ /* @__PURE__ */ n("strong", { className: "font-semibold text-sbk-fg", children: e }),
43
+ " de",
44
+ " ",
45
+ i
46
+ ] }) : y(e, i, d).map(
47
+ (s) => typeof s == "number" ? /* @__PURE__ */ n(
48
+ "button",
49
+ {
50
+ "aria-current": s === e ? "page" : void 0,
51
+ "aria-label": `Página ${s}`,
52
+ className: a(
53
+ p,
54
+ b,
55
+ s === e ? "border-sbk-primary bg-sbk-primary font-semibold text-sbk-on-primary" : t
56
+ ),
57
+ onClick: () => r(s),
58
+ type: "button",
59
+ children: s
60
+ },
61
+ s
62
+ ) : /* @__PURE__ */ n("span", { "aria-hidden": "true", className: "px-1 text-sm text-sbk-fg-muted", children: "…" }, s)
63
+ ),
64
+ /* @__PURE__ */ m(
36
65
  "button",
37
66
  {
38
- className: "rounded-[var(--border-radius-sm)] border border-[var(--border-color)] px-2 py-1 text-sm disabled:opacity-50",
39
- disabled: r === d,
40
- onClick: () => e(Math.min(r + 1, d)),
67
+ className: a(p, b, t),
68
+ disabled: e >= i,
69
+ onClick: () => r(e + 1),
41
70
  type: "button",
42
- children: "Próxima"
71
+ children: [
72
+ "Próxima",
73
+ /* @__PURE__ */ n(u, { "aria-hidden": "true", className: "size-4" })
74
+ ]
43
75
  }
44
76
  )
45
77
  ] });
46
78
  };
79
+ N.displayName = "Pagination";
47
80
  export {
48
- l as Pagination
81
+ N as Pagination,
82
+ y as getPageTokens
49
83
  };
50
84
  //# sourceMappingURL=Pagination.js.map