@sbkbs/ui 1.0.6 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (210) hide show
  1. package/CHANGELOG.md +57 -0
  2. package/MIGRATION.md +96 -0
  3. package/README.md +221 -115
  4. package/dist/assets/favicon/apple-touch-icon.png +0 -0
  5. package/dist/assets/favicon/favicon-96x96.png +0 -0
  6. package/dist/assets/favicon/favicon.ico +0 -0
  7. package/dist/assets/favicon/favicon.svg +1 -0
  8. package/dist/assets/favicon/site.webmanifest +21 -0
  9. package/dist/assets/favicon/web-app-manifest-192x192.png +0 -0
  10. package/dist/assets/favicon/web-app-manifest-512x512.png +0 -0
  11. package/dist/base.css +38 -0
  12. package/dist/components/Accordion/Accordion.d.ts +13 -1
  13. package/dist/components/Accordion/Accordion.js +100 -52
  14. package/dist/components/Accordion/Accordion.js.map +1 -1
  15. package/dist/components/Alert/Alert.d.ts +17 -4
  16. package/dist/components/Alert/Alert.js +64 -20
  17. package/dist/components/Alert/Alert.js.map +1 -1
  18. package/dist/components/Avatar/Avatar.d.ts +12 -6
  19. package/dist/components/Avatar/Avatar.js +66 -0
  20. package/dist/components/Avatar/Avatar.js.map +1 -0
  21. package/dist/components/Badge/Badge.d.ts +11 -2
  22. package/dist/components/Badge/Badge.js +42 -30
  23. package/dist/components/Badge/Badge.js.map +1 -1
  24. package/dist/components/Breadcrumb/Breadcrumb.d.ts +5 -2
  25. package/dist/components/Breadcrumb/Breadcrumb.js +23 -16
  26. package/dist/components/Breadcrumb/Breadcrumb.js.map +1 -1
  27. package/dist/components/Button/Button.d.ts +10 -8
  28. package/dist/components/Button/Button.js +73 -114
  29. package/dist/components/Button/Button.js.map +1 -1
  30. package/dist/components/Card/Card.d.ts +33 -3
  31. package/dist/components/Card/Card.js +91 -30
  32. package/dist/components/Card/Card.js.map +1 -1
  33. package/dist/components/Checkbox/Checkbox.d.ts +4 -1
  34. package/dist/components/Checkbox/Checkbox.js +32 -31
  35. package/dist/components/Checkbox/Checkbox.js.map +1 -1
  36. package/dist/components/Chip/Chip.d.ts +7 -1
  37. package/dist/components/Chip/Chip.js +19 -9
  38. package/dist/components/Chip/Chip.js.map +1 -1
  39. package/dist/components/Combobox/Combobox.d.ts +10 -2
  40. package/dist/components/Combobox/Combobox.js +146 -133
  41. package/dist/components/Combobox/Combobox.js.map +1 -1
  42. package/dist/components/Divider/Divider.d.ts +7 -1
  43. package/dist/components/Divider/Divider.js +28 -12
  44. package/dist/components/Divider/Divider.js.map +1 -1
  45. package/dist/components/DropdownMenu/DropdownMenu.d.ts +33 -0
  46. package/dist/components/DropdownMenu/DropdownMenu.js +147 -0
  47. package/dist/components/DropdownMenu/DropdownMenu.js.map +1 -0
  48. package/dist/components/EmptyState/EmptyState.d.ts +7 -1
  49. package/dist/components/EmptyState/EmptyState.js +28 -19
  50. package/dist/components/EmptyState/EmptyState.js.map +1 -1
  51. package/dist/components/Field/Field.d.ts +21 -0
  52. package/dist/components/Field/Field.js +35 -0
  53. package/dist/components/Field/Field.js.map +1 -0
  54. package/dist/components/FileUpload/FileUpload.d.ts +9 -2
  55. package/dist/components/FileUpload/FileUpload.js +128 -102
  56. package/dist/components/FileUpload/FileUpload.js.map +1 -1
  57. package/dist/components/Footer/Footer.d.ts +19 -6
  58. package/dist/components/Footer/Footer.js +47 -115
  59. package/dist/components/Footer/Footer.js.map +1 -1
  60. package/dist/components/GlassPanel/GlassPanel.d.ts +18 -0
  61. package/dist/components/GlassPanel/GlassPanel.js +39 -0
  62. package/dist/components/GlassPanel/GlassPanel.js.map +1 -0
  63. package/dist/components/Header/Header.d.ts +25 -14
  64. package/dist/components/Header/Header.js +88 -148
  65. package/dist/components/Header/Header.js.map +1 -1
  66. package/dist/components/Highlight/Highlight.d.ts +13 -0
  67. package/dist/components/Highlight/Highlight.js +18 -0
  68. package/dist/components/Highlight/Highlight.js.map +1 -0
  69. package/dist/components/Icon/Icon.d.ts +21 -0
  70. package/dist/components/Icon/Icon.js +31 -0
  71. package/dist/components/Icon/Icon.js.map +1 -0
  72. package/dist/components/IconButton/IconButton.d.ts +12 -0
  73. package/dist/components/IconButton/IconButton.js +49 -0
  74. package/dist/components/IconButton/IconButton.js.map +1 -0
  75. package/dist/components/Input/Input.d.ts +3 -2
  76. package/dist/components/Input/Input.js +51 -69
  77. package/dist/components/Input/Input.js.map +1 -1
  78. package/dist/components/Layout/Layout.d.ts +2 -0
  79. package/dist/components/Layout/Layout.js +24 -18
  80. package/dist/components/Layout/Layout.js.map +1 -1
  81. package/dist/components/Logo/Logo.d.ts +27 -0
  82. package/dist/components/Logo/Logo.js +107 -0
  83. package/dist/components/Logo/Logo.js.map +1 -0
  84. package/dist/components/MiniCard/MiniCard.d.ts +21 -0
  85. package/dist/components/MiniCard/MiniCard.js +90 -0
  86. package/dist/components/MiniCard/MiniCard.js.map +1 -0
  87. package/dist/components/Modal/Modal.d.ts +16 -3
  88. package/dist/components/Modal/Modal.js +124 -93
  89. package/dist/components/Modal/Modal.js.map +1 -1
  90. package/dist/components/Navigation/Navigation.d.ts +1 -0
  91. package/dist/components/Navigation/Navigation.js +14 -14
  92. package/dist/components/Navigation/Navigation.js.map +1 -1
  93. package/dist/components/NumberInput/NumberInput.d.ts +5 -2
  94. package/dist/components/NumberInput/NumberInput.js +98 -128
  95. package/dist/components/NumberInput/NumberInput.js.map +1 -1
  96. package/dist/components/PageHeader/PageHeader.d.ts +8 -1
  97. package/dist/components/PageHeader/PageHeader.js +26 -25
  98. package/dist/components/PageHeader/PageHeader.js.map +1 -1
  99. package/dist/components/Pagination/Pagination.d.ts +15 -2
  100. package/dist/components/Pagination/Pagination.js +68 -34
  101. package/dist/components/Pagination/Pagination.js.map +1 -1
  102. package/dist/components/Paragraph/Paragraph.d.ts +8 -2
  103. package/dist/components/Paragraph/Paragraph.js +39 -36
  104. package/dist/components/Paragraph/Paragraph.js.map +1 -1
  105. package/dist/components/Popover/Popover.d.ts +12 -1
  106. package/dist/components/Popover/Popover.js +49 -37
  107. package/dist/components/Popover/Popover.js.map +1 -1
  108. package/dist/components/ProgressBar/ProgressBar.d.ts +12 -6
  109. package/dist/components/ProgressBar/ProgressBar.js +71 -0
  110. package/dist/components/ProgressBar/ProgressBar.js.map +1 -0
  111. package/dist/components/Radio/Radio.d.ts +2 -1
  112. package/dist/components/Radio/Radio.js +27 -31
  113. package/dist/components/Radio/Radio.js.map +1 -1
  114. package/dist/components/SectionHeader/SectionHeader.d.ts +6 -1
  115. package/dist/components/SectionHeader/SectionHeader.js +14 -12
  116. package/dist/components/SectionHeader/SectionHeader.js.map +1 -1
  117. package/dist/components/Select/Select.d.ts +6 -2
  118. package/dist/components/Select/Select.js +47 -35
  119. package/dist/components/Select/Select.js.map +1 -1
  120. package/dist/components/SideNav/SideNav.d.ts +55 -0
  121. package/dist/components/SideNav/SideNav.js +141 -0
  122. package/dist/components/SideNav/SideNav.js.map +1 -0
  123. package/dist/components/Skeleton/Skeleton.d.ts +12 -1
  124. package/dist/components/Skeleton/Skeleton.js +33 -18
  125. package/dist/components/Skeleton/Skeleton.js.map +1 -1
  126. package/dist/components/Spinner/Spinner.d.ts +11 -3
  127. package/dist/components/Spinner/Spinner.js +57 -0
  128. package/dist/components/Spinner/Spinner.js.map +1 -0
  129. package/dist/components/Stepper/Stepper.d.ts +1 -1
  130. package/dist/components/Stepper/Stepper.js +41 -53
  131. package/dist/components/Stepper/Stepper.js.map +1 -1
  132. package/dist/components/Subtitle/Subtitle.d.ts +9 -3
  133. package/dist/components/Subtitle/Subtitle.js +29 -35
  134. package/dist/components/Subtitle/Subtitle.js.map +1 -1
  135. package/dist/components/Switch/Switch.d.ts +2 -1
  136. package/dist/components/Switch/Switch.js +45 -33
  137. package/dist/components/Switch/Switch.js.map +1 -1
  138. package/dist/components/Table/Table.d.ts +19 -1
  139. package/dist/components/Table/Table.js +48 -11
  140. package/dist/components/Table/Table.js.map +1 -1
  141. package/dist/components/Tabs/Tabs.d.ts +16 -2
  142. package/dist/components/Tabs/Tabs.js +80 -44
  143. package/dist/components/Tabs/Tabs.js.map +1 -1
  144. package/dist/components/Tag/Tag.d.ts +8 -1
  145. package/dist/components/Tag/Tag.js +27 -12
  146. package/dist/components/Tag/Tag.js.map +1 -1
  147. package/dist/components/Textarea/Textarea.d.ts +3 -1
  148. package/dist/components/Textarea/Textarea.js +36 -40
  149. package/dist/components/Textarea/Textarea.js.map +1 -1
  150. package/dist/components/Title/Title.d.ts +9 -3
  151. package/dist/components/Title/Title.js +42 -42
  152. package/dist/components/Title/Title.js.map +1 -1
  153. package/dist/components/Toast/Toast.d.ts +39 -11
  154. package/dist/components/Toast/Toast.js +130 -76
  155. package/dist/components/Toast/Toast.js.map +1 -1
  156. package/dist/components/Tooltip/Tooltip.d.ts +12 -2
  157. package/dist/components/Tooltip/Tooltip.js +50 -32
  158. package/dist/components/Tooltip/Tooltip.js.map +1 -1
  159. package/dist/components/Typography/weight.d.ts +9 -0
  160. package/dist/components/Typography/weight.js +5 -0
  161. package/dist/components/Typography/weight.js.map +1 -0
  162. package/dist/fonts.css +8 -0
  163. package/dist/index.cjs +2 -0
  164. package/dist/index.cjs.map +1 -0
  165. package/dist/index.d.ts +55 -43
  166. package/dist/index.js +118 -83
  167. package/dist/index.js.map +1 -1
  168. package/dist/reset.css +9 -0
  169. package/dist/styles.css +1 -0
  170. package/dist/tailwind.css +153 -0
  171. package/dist/theme/ThemeProvider.d.ts +21 -3
  172. package/dist/theme/ThemeProvider.js +57 -18
  173. package/dist/theme/ThemeProvider.js.map +1 -1
  174. package/dist/theme/tokens.d.ts +43 -0
  175. package/dist/theme/tokens.js +39 -0
  176. package/dist/theme/tokens.js.map +1 -0
  177. package/dist/theme.css +327 -294
  178. package/dist/tokens.css +327 -0
  179. package/dist/utils/cn.d.ts +2 -2
  180. package/dist/utils/cn.js +19 -4
  181. package/dist/utils/cn.js.map +1 -1
  182. package/dist/utils/styles.d.ts +37 -0
  183. package/dist/utils/styles.js +35 -0
  184. package/dist/utils/styles.js.map +1 -0
  185. package/package.json +140 -117
  186. package/dist/components/Accordion/Accordion.stories.d.ts +0 -7
  187. package/dist/components/Alert/Alert.stories.d.ts +0 -8
  188. package/dist/components/Badge/Badge.stories.d.ts +0 -8
  189. package/dist/components/Breadcrumb/Breadcrumb.stories.d.ts +0 -8
  190. package/dist/components/Button/Button.stories.d.ts +0 -7
  191. package/dist/components/Card/Card.stories.d.ts +0 -8
  192. package/dist/components/Checkbox/Checkbox.stories.d.ts +0 -7
  193. package/dist/components/Combobox/Combobox.stories.d.ts +0 -9
  194. package/dist/components/Feedback/Feedback.stories.d.ts +0 -5
  195. package/dist/components/FileUpload/FileUpload.stories.d.ts +0 -10
  196. package/dist/components/Input/Input.stories.d.ts +0 -9
  197. package/dist/components/Modal/Modal.stories.d.ts +0 -8
  198. package/dist/components/NumberInput/NumberInput.stories.d.ts +0 -8
  199. package/dist/components/Pagination/Pagination.stories.d.ts +0 -8
  200. package/dist/components/Radio/Radio.stories.d.ts +0 -7
  201. package/dist/components/Select/Select.stories.d.ts +0 -8
  202. package/dist/components/Stepper/Stepper.stories.d.ts +0 -8
  203. package/dist/components/Switch/Switch.stories.d.ts +0 -8
  204. package/dist/components/Tabs/Tabs.stories.d.ts +0 -8
  205. package/dist/components/Textarea/Textarea.stories.d.ts +0 -7
  206. package/dist/components/Toast/Toast.stories.d.ts +0 -8
  207. package/dist/oficios-ui.css +0 -1
  208. package/dist/oficios-ui.umd.cjs +0 -2
  209. package/dist/oficios-ui.umd.cjs.map +0 -1
  210. package/dist/sbk-icon.png +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"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":"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"}
1
+ {"version":3,"file":"NumberInput.js","sources":["../../../src/components/NumberInput/NumberInput.tsx"],"sourcesContent":["import React, { useId } from 'react';\r\nimport { Minus, Plus } from 'lucide-react';\r\nimport { cn } from '../../utils/cn';\r\nimport { buttonReset, describedBy, focusRing, transitionColors } from '../../utils/styles';\r\nimport { Field } from '../Field/Field';\r\n\r\nexport interface NumberInputProps extends Omit<\r\n React.InputHTMLAttributes<HTMLInputElement>,\r\n 'type' | 'size' | 'onChange' | 'value' | 'defaultValue'\r\n> {\r\n defaultValue?: number;\r\n error?: string;\r\n helperText?: string;\r\n label?: React.ReactNode;\r\n max?: number;\r\n min?: number;\r\n onChange?: (value: number | null) => void;\r\n size?: 'sm' | 'md' | 'lg';\r\n step?: number;\r\n value?: number | null;\r\n}\r\n\r\nconst HEIGHT = { sm: 'min-h-8 text-sm', md: 'min-h-10 text-base', lg: 'min-h-12 text-lg' } as const;\r\nconst STEPPER = {\r\n sm: 'w-8 [&_svg]:size-3.5',\r\n md: 'w-10 [&_svg]:size-4',\r\n lg: 'w-12 [&_svg]:size-5',\r\n} as const;\r\n\r\nconst clamp = (n: number, min?: number, max?: number) =>\r\n Math.min(max ?? Number.POSITIVE_INFINITY, Math.max(min ?? Number.NEGATIVE_INFINITY, n));\r\n\r\n/** Campo numérico com botões de incremento. Controlado via `value` + `onChange`. */\r\nexport const NumberInput = React.forwardRef<HTMLInputElement, NumberInputProps>(\r\n (\r\n {\r\n label,\r\n error,\r\n helperText,\r\n size = 'md',\r\n min,\r\n max,\r\n step = 1,\r\n onChange,\r\n className,\r\n id,\r\n value,\r\n defaultValue,\r\n disabled,\r\n required,\r\n ...props\r\n },\r\n ref,\r\n ) => {\r\n const autoId = useId();\r\n const inputId = id ?? autoId;\r\n const current = value ?? defaultValue ?? 0;\r\n\r\n const stepBy = (dir: 1 | -1) => onChange?.(clamp(current + dir * step, min, max));\r\n\r\n const stepperClass = cn(\r\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',\r\n transitionColors,\r\n focusRing,\r\n STEPPER[size],\r\n );\r\n\r\n return (\r\n <Field error={error} helperText={helperText} id={inputId} label={label} required={required}>\r\n <div\r\n className={cn(\r\n 'inline-flex overflow-hidden rounded-sbk-sm border border-sbk-line-strong bg-sbk-surface',\r\n 'focus-within:border-sbk-primary',\r\n error && 'border-sbk-error',\r\n disabled && 'opacity-60',\r\n )}\r\n >\r\n <button\r\n aria-controls={inputId}\r\n aria-label=\"Diminuir\"\r\n className={cn(buttonReset, stepperClass, 'border-r border-sbk-line')}\r\n disabled={disabled || (min !== undefined && current <= min)}\r\n onClick={() => stepBy(-1)}\r\n tabIndex={-1}\r\n type=\"button\"\r\n >\r\n <Minus aria-hidden=\"true\" />\r\n </button>\r\n <input\r\n ref={ref}\r\n aria-describedby={describedBy(inputId, error, helperText)}\r\n aria-invalid={error ? true : undefined}\r\n className={cn(\r\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',\r\n HEIGHT[size],\r\n className,\r\n )}\r\n defaultValue={value === undefined ? defaultValue : undefined}\r\n disabled={disabled}\r\n id={inputId}\r\n inputMode=\"decimal\"\r\n max={max}\r\n min={min}\r\n onChange={(e) => onChange?.(e.target.value === '' ? null : Number(e.target.value))}\r\n required={required}\r\n step={step}\r\n type=\"number\"\r\n value={value === undefined ? undefined : (value ?? '')}\r\n {...props}\r\n />\r\n <button\r\n aria-controls={inputId}\r\n aria-label=\"Aumentar\"\r\n className={cn(buttonReset, stepperClass, 'border-l border-sbk-line')}\r\n disabled={disabled || (max !== undefined && current >= max)}\r\n onClick={() => stepBy(1)}\r\n tabIndex={-1}\r\n type=\"button\"\r\n >\r\n <Plus aria-hidden=\"true\" />\r\n </button>\r\n </div>\r\n </Field>\r\n );\r\n },\r\n);\r\n\r\nNumberInput.displayName = 'NumberInput';\r\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';\r\nimport { cn } from '../../utils/cn';\r\nimport { inverseScope } from '../../utils/styles';\r\n\r\nexport interface PageHeaderProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\r\n actions?: React.ReactNode;\r\n /** Conteúdo acima do título (ex.: Breadcrumb). */\r\n breadcrumb?: React.ReactNode;\r\n subtitle?: React.ReactNode;\r\n title: React.ReactNode;\r\n /** `plain`: sem caixa. `card`: superfície com borda. `inverse`: bloco verde escuro (hero). */\r\n variant?: 'plain' | 'card' | 'inverse';\r\n}\r\n\r\nconst VARIANT_CLASS = {\r\n plain: '',\r\n card: 'rounded-sbk-md border border-sbk-line bg-sbk-surface p-5',\r\n inverse: cn('rounded-sbk-md p-6 md:p-8', inverseScope),\r\n} as const;\r\n\r\nexport const PageHeader = ({\r\n title,\r\n subtitle,\r\n actions,\r\n breadcrumb,\r\n variant = 'card',\r\n className,\r\n ...props\r\n}: PageHeaderProps) => (\r\n <header className={cn('grid gap-3', VARIANT_CLASS[variant], className)} {...props}>\r\n {breadcrumb}\r\n <div className=\"flex flex-wrap items-start justify-between gap-4\">\r\n <div className=\"grid min-w-0 gap-1\">\r\n <h1 className=\"m-0 text-2xl font-semibold leading-tight text-sbk-fg-heading md:text-[1.75rem]\">\r\n {title}\r\n </h1>\r\n {subtitle && <p className=\"m-0 text-sm font-light text-sbk-fg-muted\">{subtitle}</p>}\r\n </div>\r\n {actions && <div className=\"flex shrink-0 flex-wrap items-center gap-2\">{actions}</div>}\r\n </div>\r\n </header>\r\n);\r\n\r\nPageHeader.displayName = 'PageHeader';\r\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
@@ -1 +1 @@
1
- {"version":3,"file":"Pagination.js","sources":["../../../src/components/Pagination/Pagination.tsx"],"sourcesContent":["import type React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport interface PaginationProps {\n currentPage: number;\n onPageChange: (page: number) => void;\n totalPages: number;\n}\n\nexport const Pagination: React.FC<PaginationProps> = ({\n currentPage,\n totalPages,\n onPageChange,\n}) => {\n if (totalPages <= 1) {\n return null;\n }\n\n const pages = Array.from({ length: totalPages }, (_, i) => i + 1);\n\n return (\n <nav aria-label=\"Paginação\" className=\"flex flex-wrap items-center gap-1\">\n <button\n className=\"rounded-[var(--border-radius-sm)] border border-[var(--border-color)] px-2 py-1 text-sm disabled:opacity-50\"\n disabled={currentPage === 1}\n onClick={() => onPageChange(Math.max(currentPage - 1, 1))}\n type=\"button\"\n >\n Anterior\n </button>\n {pages.map((page) => (\n <button\n className={cn(\n 'rounded-[var(--border-radius-sm)] border px-2.5 py-1 text-sm',\n page === currentPage\n ? 'border-[var(--md-primary)] bg-[var(--md-primary)] text-[var(--md-on-primary)]'\n : 'border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]',\n )}\n key={page}\n onClick={() => onPageChange(page)}\n type=\"button\"\n >\n {page}\n </button>\n ))}\n <button\n className=\"rounded-[var(--border-radius-sm)] border border-[var(--border-color)] px-2 py-1 text-sm disabled:opacity-50\"\n disabled={currentPage === totalPages}\n onClick={() => onPageChange(Math.min(currentPage + 1, totalPages))}\n type=\"button\"\n >\n Próxima\n </button>\n </nav>\n );\n};\n"],"names":["Pagination","currentPage","totalPages","onPageChange","pages","_","jsxs","jsx","page","cn"],"mappings":";;AASO,MAAMA,IAAwC,CAAC;AAAA,EACpD,aAAAC;AAAA,EACA,YAAAC;AAAA,EACA,cAAAC;AACF,MAAM;AACJ,MAAID,KAAc;AAChB,WAAO;AAGT,QAAME,IAAQ,MAAM,KAAK,EAAE,QAAQF,EAAA,GAAc,CAACG,GAAG,MAAM,IAAI,CAAC;AAEhE,SACE,gBAAAC,EAAC,OAAA,EAAI,cAAW,aAAY,WAAU,qCACpC,UAAA;AAAA,IAAA,gBAAAC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,UAAUN,MAAgB;AAAA,QAC1B,SAAS,MAAME,EAAa,KAAK,IAAIF,IAAc,GAAG,CAAC,CAAC;AAAA,QACxD,MAAK;AAAA,QACN,UAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAGAG,EAAM,IAAI,CAACI,MACV,gBAAAD;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAWE;AAAA,UACT;AAAA,UACAD,MAASP,IACL,kFACA;AAAA,QAAA;AAAA,QAGN,SAAS,MAAME,EAAaK,CAAI;AAAA,QAChC,MAAK;AAAA,QAEJ,UAAAA;AAAA,MAAA;AAAA,MAJIA;AAAA,IAAA,CAMR;AAAA,IACD,gBAAAD;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,UAAUN,MAAgBC;AAAA,QAC1B,SAAS,MAAMC,EAAa,KAAK,IAAIF,IAAc,GAAGC,CAAU,CAAC;AAAA,QACjE,MAAK;AAAA,QACN,UAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAED,GACF;AAEJ;"}
1
+ {"version":3,"file":"Pagination.js","sources":["../../../src/components/Pagination/Pagination.tsx"],"sourcesContent":["import { ChevronLeft, ChevronRight } from 'lucide-react';\r\nimport { cn } from '../../utils/cn';\r\nimport { buttonReset, focusRing, transitionColors } from '../../utils/styles';\r\n\r\nexport interface PaginationProps {\r\n className?: string;\r\n currentPage: number;\r\n onPageChange: (page: number) => void;\r\n /** Páginas vizinhas exibidas ao redor da atual. Padrão: 1. */\r\n siblingCount?: number;\r\n /**\r\n * `numbered`: lista de páginas com reticências.\r\n * `simple`: apenas Anterior/Próxima com \"Página X de Y\" (para paginação sequencial).\r\n */\r\n variant?: 'numbered' | 'simple';\r\n totalPages: number;\r\n}\r\n\r\ntype PageToken = number | 'ellipsis-start' | 'ellipsis-end';\r\n\r\nexport const getPageTokens = (current: number, total: number, siblings = 1): PageToken[] => {\r\n const window = siblings * 2 + 5;\r\n if (total <= window) return Array.from({ length: total }, (_, i) => i + 1);\r\n const start = Math.max(2, current - siblings);\r\n const end = Math.min(total - 1, current + siblings);\r\n const tokens: PageToken[] = [1];\r\n if (start > 2) tokens.push('ellipsis-start');\r\n for (let p = start; p <= end; p++) tokens.push(p);\r\n if (end < total - 1) tokens.push('ellipsis-end');\r\n tokens.push(total);\r\n return tokens;\r\n};\r\n\r\nconst buttonBase = cn(\r\n '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',\r\n transitionColors,\r\n focusRing,\r\n);\r\n\r\nexport const Pagination = ({\r\n currentPage,\r\n totalPages,\r\n onPageChange,\r\n siblingCount = 1,\r\n variant = 'numbered',\r\n className,\r\n}: PaginationProps) => {\r\n if (totalPages <= 1) return null;\r\n const idle = 'border-sbk-line bg-sbk-surface font-light text-sbk-fg hover:bg-sbk-surface-hover';\r\n\r\n return (\r\n <nav aria-label=\"Paginação\" className={cn('flex flex-wrap items-center gap-1', className)}>\r\n <button\r\n className={cn(buttonReset, buttonBase, idle)}\r\n disabled={currentPage <= 1}\r\n onClick={() => onPageChange(currentPage - 1)}\r\n type=\"button\"\r\n >\r\n <ChevronLeft aria-hidden=\"true\" className=\"size-4\" />\r\n Anterior\r\n </button>\r\n\r\n {variant === 'simple' ? (\r\n <span aria-live=\"polite\" className=\"px-3 text-sm font-light text-sbk-fg-muted\">\r\n Página <strong className=\"font-semibold text-sbk-fg\">{currentPage}</strong> de{' '}\r\n {totalPages}\r\n </span>\r\n ) : (\r\n getPageTokens(currentPage, totalPages, siblingCount).map((token) =>\r\n typeof token === 'number' ? (\r\n <button\r\n key={token}\r\n aria-current={token === currentPage ? 'page' : undefined}\r\n aria-label={`Página ${token}`}\r\n className={cn(\r\n buttonReset,\r\n buttonBase,\r\n token === currentPage\r\n ? 'border-sbk-primary bg-sbk-primary font-semibold text-sbk-on-primary'\r\n : idle,\r\n )}\r\n onClick={() => onPageChange(token)}\r\n type=\"button\"\r\n >\r\n {token}\r\n </button>\r\n ) : (\r\n <span key={token} aria-hidden=\"true\" className=\"px-1 text-sm text-sbk-fg-muted\">\r\n …\r\n </span>\r\n ),\r\n )\r\n )}\r\n\r\n <button\r\n className={cn(buttonReset, buttonBase, idle)}\r\n disabled={currentPage >= totalPages}\r\n onClick={() => onPageChange(currentPage + 1)}\r\n type=\"button\"\r\n >\r\n Próxima\r\n <ChevronRight aria-hidden=\"true\" className=\"size-4\" />\r\n </button>\r\n </nav>\r\n );\r\n};\r\n\r\nPagination.displayName = 'Pagination';\r\n"],"names":["getPageTokens","current","total","siblings","window","_","i","start","end","tokens","p","buttonBase","cn","transitionColors","focusRing","Pagination","currentPage","totalPages","onPageChange","siblingCount","variant","className","idle","jsxs","buttonReset","jsx","ChevronLeft","token","ChevronRight"],"mappings":";;;;AAoBO,MAAMA,IAAgB,CAACC,GAAiBC,GAAeC,IAAW,MAAmB;AAC1F,QAAMC,IAASD,IAAW,IAAI;AAC9B,MAAID,KAASE,EAAQ,QAAO,MAAM,KAAK,EAAE,QAAQF,EAAA,GAAS,CAACG,GAAGC,MAAMA,IAAI,CAAC;AACzE,QAAMC,IAAQ,KAAK,IAAI,GAAGN,IAAUE,CAAQ,GACtCK,IAAM,KAAK,IAAIN,IAAQ,GAAGD,IAAUE,CAAQ,GAC5CM,IAAsB,CAAC,CAAC;AAC9B,EAAIF,IAAQ,KAAGE,EAAO,KAAK,gBAAgB;AAC3C,WAASC,IAAIH,GAAOG,KAAKF,GAAKE,IAAK,CAAAD,EAAO,KAAKC,CAAC;AAChD,SAAIF,IAAMN,IAAQ,KAAGO,EAAO,KAAK,cAAc,GAC/CA,EAAO,KAAKP,CAAK,GACVO;AACT,GAEME,IAAaC;AAAA,EACjB;AAAA,EACAC;AAAA,EACAC;AACF,GAEaC,IAAa,CAAC;AAAA,EACzB,aAAAC;AAAA,EACA,YAAAC;AAAA,EACA,cAAAC;AAAA,EACA,cAAAC,IAAe;AAAA,EACf,SAAAC,IAAU;AAAA,EACV,WAAAC;AACF,MAAuB;AACrB,MAAIJ,KAAc,EAAG,QAAO;AAC5B,QAAMK,IAAO;AAEb,SACE,gBAAAC,EAAC,SAAI,cAAW,aAAY,WAAWX,EAAG,qCAAqCS,CAAS,GACtF,UAAA;AAAA,IAAA,gBAAAE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAWX,EAAGY,GAAab,GAAYW,CAAI;AAAA,QAC3C,UAAUN,KAAe;AAAA,QACzB,SAAS,MAAME,EAAaF,IAAc,CAAC;AAAA,QAC3C,MAAK;AAAA,QAEL,UAAA;AAAA,UAAA,gBAAAS,EAACC,GAAA,EAAY,eAAY,QAAO,WAAU,UAAS;AAAA,UAAE;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAItDN,MAAY,WACX,gBAAAG,EAAC,UAAK,aAAU,UAAS,WAAU,6CAA4C,UAAA;AAAA,MAAA;AAAA,MACtE,gBAAAE,EAAC,UAAA,EAAO,WAAU,6BAA6B,UAAAT,GAAY;AAAA,MAAS;AAAA,MAAI;AAAA,MAC9EC;AAAA,IAAA,EAAA,CACH,IAEAjB,EAAcgB,GAAaC,GAAYE,CAAY,EAAE;AAAA,MAAI,CAACQ,MACxD,OAAOA,KAAU,WACf,gBAAAF;AAAA,QAAC;AAAA,QAAA;AAAA,UAEC,gBAAcE,MAAUX,IAAc,SAAS;AAAA,UAC/C,cAAY,UAAUW,CAAK;AAAA,UAC3B,WAAWf;AAAA,YACTY;AAAA,YACAb;AAAA,YACAgB,MAAUX,IACN,wEACAM;AAAA,UAAA;AAAA,UAEN,SAAS,MAAMJ,EAAaS,CAAK;AAAA,UACjC,MAAK;AAAA,UAEJ,UAAAA;AAAA,QAAA;AAAA,QAbIA;AAAA,MAAA,sBAgBN,QAAA,EAAiB,eAAY,QAAO,WAAU,kCAAiC,iBAArEA,CAEX;AAAA,IAAA;AAAA,IAKN,gBAAAJ;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAWX,EAAGY,GAAab,GAAYW,CAAI;AAAA,QAC3C,UAAUN,KAAeC;AAAA,QACzB,SAAS,MAAMC,EAAaF,IAAc,CAAC;AAAA,QAC3C,MAAK;AAAA,QACN,UAAA;AAAA,UAAA;AAAA,UAEC,gBAAAS,EAACG,GAAA,EAAa,eAAY,QAAO,WAAU,SAAA,CAAS;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EACtD,GACF;AAEJ;AAEAb,EAAW,cAAc;"}
@@ -1,11 +1,17 @@
1
1
  import type React from 'react';
2
+ import { type TextWeight } from '../Typography/weight';
2
3
  export interface ParagraphProps extends React.HTMLAttributes<HTMLParagraphElement> {
3
4
  align?: 'left' | 'center' | 'right' | 'justify';
4
5
  as?: 'p' | 'span' | 'div';
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?: 'light' | 'normal' | 'medium';
11
+ /** Padrão: light (brand book: corpo em Leve 300, não em Regular 400). */
12
+ weight?: TextWeight;
10
13
  }
11
- export declare const Paragraph: React.FC<ParagraphProps>;
14
+ export declare const Paragraph: {
15
+ ({ as: Tag, size, weight, align, muted, italic, children, className, ...props }: ParagraphProps): import("react/jsx-runtime").JSX.Element;
16
+ displayName: string;
17
+ };
@@ -1,41 +1,44 @@
1
- import { jsx as v } from "react/jsx-runtime";
2
- const d = ({
1
+ import { jsx as g } from "react/jsx-runtime";
2
+ import { cn as f } from "../../utils/cn.js";
3
+ import { weightClass as n } from "../Typography/weight.js";
4
+ const o = {
5
+ xs: "text-xs leading-normal",
6
+ sm: "text-sm leading-normal",
7
+ md: "text-base leading-relaxed",
8
+ lg: "text-lg leading-relaxed"
9
+ }, d = {
10
+ left: "text-left",
11
+ center: "text-center",
12
+ right: "text-right",
13
+ justify: "text-justify"
14
+ }, p = ({
3
15
  as: t = "p",
4
16
  size: e = "md",
5
- weight: a = "normal",
6
- align: i = "left",
7
- muted: n = !1,
8
- italic: o = !1,
9
- children: r,
10
- className: l = "",
11
- ...s
12
- }) => {
13
- const m = t, g = {
14
- xs: "text-[var(--font-size-xs)] leading-[var(--line-height-normal)]",
15
- sm: "text-[var(--font-size-sm)] leading-[var(--line-height-normal)]",
16
- md: "text-[var(--font-size-base)] leading-[var(--line-height-relaxed)]",
17
- lg: "text-[var(--font-size-lg)] leading-[var(--line-height-loose)]"
18
- }, f = {
19
- light: "font-[var(--font-weight-light)]",
20
- normal: "font-[var(--font-weight-normal)]",
21
- medium: "font-[var(--font-weight-medium)]"
22
- }, h = {
23
- left: "text-left",
24
- center: "text-center",
25
- right: "text-right",
26
- justify: "text-justify"
27
- }, x = [
28
- "m-0 text-[var(--text-primary)] transition-[var(--transition-colors)]",
29
- g[e],
30
- f[a],
31
- h[i],
32
- o ? "italic" : "not-italic",
33
- n ? "text-[var(--text-muted)]" : "",
34
- l
35
- ].filter(Boolean).join(" ");
36
- return /* @__PURE__ */ v(m, { className: x, ...s, children: r });
37
- };
17
+ weight: a = "light",
18
+ align: s = "left",
19
+ muted: l = !1,
20
+ italic: r = !1,
21
+ children: x,
22
+ className: i,
23
+ ...m
24
+ }) => /* @__PURE__ */ g(
25
+ t,
26
+ {
27
+ className: f(
28
+ "m-0 font-sbk text-pretty",
29
+ o[e],
30
+ n(a),
31
+ d[s],
32
+ l ? "text-sbk-fg-muted" : "text-sbk-fg",
33
+ r && "italic",
34
+ i
35
+ ),
36
+ ...m,
37
+ children: x
38
+ }
39
+ );
40
+ p.displayName = "Paragraph";
38
41
  export {
39
- d as Paragraph
42
+ p as Paragraph
40
43
  };
41
44
  //# sourceMappingURL=Paragraph.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Paragraph.js","sources":["../../../src/components/Paragraph/Paragraph.tsx"],"sourcesContent":["import type React from 'react';\n\nexport interface ParagraphProps extends React.HTMLAttributes<HTMLParagraphElement> {\n align?: 'left' | 'center' | 'right' | 'justify';\n as?: 'p' | 'span' | 'div';\n children: React.ReactNode;\n italic?: boolean;\n muted?: boolean;\n size?: 'xs' | 'sm' | 'md' | 'lg';\n weight?: 'light' | 'normal' | 'medium';\n}\n\nexport const Paragraph: React.FC<ParagraphProps> = ({\n as = 'p',\n size = 'md',\n weight = 'normal',\n align = 'left',\n muted = false,\n italic = false,\n children,\n className = '',\n ...props\n}) => {\n const Component = as;\n const sizeClassMap: Record<NonNullable<ParagraphProps['size']>, string> = {\n xs: 'text-[var(--font-size-xs)] leading-[var(--line-height-normal)]',\n sm: 'text-[var(--font-size-sm)] leading-[var(--line-height-normal)]',\n md: 'text-[var(--font-size-base)] leading-[var(--line-height-relaxed)]',\n lg: 'text-[var(--font-size-lg)] leading-[var(--line-height-loose)]',\n };\n const weightClassMap: Record<NonNullable<ParagraphProps['weight']>, string> = {\n light: 'font-[var(--font-weight-light)]',\n normal: 'font-[var(--font-weight-normal)]',\n medium: 'font-[var(--font-weight-medium)]',\n };\n const alignClassMap: Record<NonNullable<ParagraphProps['align']>, string> = {\n left: 'text-left',\n center: 'text-center',\n right: 'text-right',\n justify: 'text-justify',\n };\n const combinedClass = [\n 'm-0 text-[var(--text-primary)] transition-[var(--transition-colors)]',\n sizeClassMap[size],\n weightClassMap[weight],\n alignClassMap[align],\n italic ? 'italic' : 'not-italic',\n muted ? 'text-[var(--text-muted)]' : '',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <Component className={combinedClass} {...props}>\n {children}\n </Component>\n );\n};\n"],"names":["Paragraph","as","size","weight","align","muted","italic","children","className","props","Component","sizeClassMap","weightClassMap","alignClassMap","combinedClass"],"mappings":";AAYO,MAAMA,IAAsC,CAAC;AAAA,EAClD,IAAAC,IAAK;AAAA,EACL,MAAAC,IAAO;AAAA,EACP,QAAAC,IAAS;AAAA,EACT,OAAAC,IAAQ;AAAA,EACR,OAAAC,IAAQ;AAAA,EACR,QAAAC,IAAS;AAAA,EACT,UAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,GAAGC;AACL,MAAM;AACJ,QAAMC,IAAYT,GACZU,IAAoE;AAAA,IACxE,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EAAA,GAEAC,IAAwE;AAAA,IAC5E,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EAAA,GAEJC,IAAsE;AAAA,IAC1E,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,SAAS;AAAA,EAAA,GAELC,IAAgB;AAAA,IACpB;AAAA,IACAH,EAAaT,CAAI;AAAA,IACjBU,EAAeT,CAAM;AAAA,IACrBU,EAAcT,CAAK;AAAA,IACnBE,IAAS,WAAW;AAAA,IACpBD,IAAQ,6BAA6B;AAAA,IACrCG;AAAA,EAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,2BACGE,GAAA,EAAU,WAAWI,GAAgB,GAAGL,GACtC,UAAAF,GACH;AAEJ;"}
1
+ {"version":3,"file":"Paragraph.js","sources":["../../../src/components/Paragraph/Paragraph.tsx"],"sourcesContent":["import type React from 'react';\r\nimport { cn } from '../../utils/cn';\r\nimport { type TextWeight, weightClass } from '../Typography/weight';\r\n\r\nexport interface ParagraphProps extends React.HTMLAttributes<HTMLParagraphElement> {\r\n align?: 'left' | 'center' | 'right' | 'justify';\r\n as?: 'p' | 'span' | 'div';\r\n children: React.ReactNode;\r\n italic?: boolean;\r\n /** Cor secundária (Chumbo Leve). */\r\n muted?: boolean;\r\n size?: 'xs' | 'sm' | 'md' | 'lg';\r\n /** Padrão: light (brand book: corpo em Leve 300, não em Regular 400). */\r\n weight?: TextWeight;\r\n}\r\n\r\nconst SIZE_CLASS = {\r\n xs: 'text-xs leading-normal',\r\n sm: 'text-sm leading-normal',\r\n md: 'text-base leading-relaxed',\r\n lg: 'text-lg leading-relaxed',\r\n} as const;\r\n\r\nconst ALIGN_CLASS = {\r\n left: 'text-left',\r\n center: 'text-center',\r\n right: 'text-right',\r\n justify: 'text-justify',\r\n} as const;\r\n\r\nexport const Paragraph = ({\r\n as: Tag = 'p',\r\n size = 'md',\r\n weight = 'light',\r\n align = 'left',\r\n muted = false,\r\n italic = false,\r\n children,\r\n className,\r\n ...props\r\n}: ParagraphProps) => (\r\n <Tag\r\n className={cn(\r\n 'm-0 font-sbk text-pretty',\r\n SIZE_CLASS[size],\r\n weightClass(weight),\r\n ALIGN_CLASS[align],\r\n muted ? 'text-sbk-fg-muted' : 'text-sbk-fg',\r\n italic && 'italic',\r\n className,\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n </Tag>\r\n);\r\n\r\nParagraph.displayName = 'Paragraph';\r\n"],"names":["SIZE_CLASS","ALIGN_CLASS","Paragraph","Tag","size","weight","align","muted","italic","children","className","props","jsx","cn","weightClass"],"mappings":";;;AAgBA,MAAMA,IAAa;AAAA,EACjB,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN,GAEMC,IAAc;AAAA,EAClB,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,SAAS;AACX,GAEaC,IAAY,CAAC;AAAA,EACxB,IAAIC,IAAM;AAAA,EACV,MAAAC,IAAO;AAAA,EACP,QAAAC,IAAS;AAAA,EACT,OAAAC,IAAQ;AAAA,EACR,OAAAC,IAAQ;AAAA,EACR,QAAAC,IAAS;AAAA,EACT,UAAAC;AAAA,EACA,WAAAC;AAAA,EACA,GAAGC;AACL,MACE,gBAAAC;AAAA,EAACT;AAAA,EAAA;AAAA,IACC,WAAWU;AAAA,MACT;AAAA,MACAb,EAAWI,CAAI;AAAA,MACfU,EAAYT,CAAM;AAAA,MAClBJ,EAAYK,CAAK;AAAA,MACjBC,IAAQ,sBAAsB;AAAA,MAC9BC,KAAU;AAAA,MACVE;AAAA,IAAA;AAAA,IAED,GAAGC;AAAA,IAEH,UAAAF;AAAA,EAAA;AACH;AAGFP,EAAU,cAAc;"}
@@ -1,7 +1,18 @@
1
1
  import type React from 'react';
2
2
  export interface PopoverProps {
3
+ align?: 'start' | 'center' | 'end';
3
4
  children: React.ReactNode;
5
+ /** Classe do botão gatilho. */
6
+ className?: string;
4
7
  content: React.ReactNode;
5
8
  defaultOpen?: boolean;
9
+ /** Controle externo do estado aberto. */
10
+ open?: boolean;
11
+ onOpenChange?: (open: boolean) => void;
12
+ variant?: 'default' | 'glass';
6
13
  }
7
- export declare const Popover: React.FC<PopoverProps>;
14
+ /** Painel flutuante não modal ancorado a um gatilho. Fecha com Esc e clique fora. */
15
+ export declare const Popover: {
16
+ ({ children, content, defaultOpen, open: controlledOpen, onOpenChange, align, variant, className, }: PopoverProps): import("react/jsx-runtime").JSX.Element;
17
+ displayName: string;
18
+ };
@@ -1,57 +1,69 @@
1
- import { jsxs as v, jsx as u } from "react/jsx-runtime";
2
- import { useState as b, useRef as a, useId as x, useEffect as d } from "react";
3
- import { cn as w } from "../../utils/cn.js";
4
- const E = ({ children: f, content: m, defaultOpen: p = !1 }) => {
5
- const [n, t] = b(p), i = a(null), c = a(null), o = a(null), l = x();
6
- return d(() => {
7
- const e = (s) => {
8
- var r;
9
- (r = i.current) != null && r.contains(s.target) || t(!1);
10
- };
11
- return document.addEventListener("mousedown", e), () => document.removeEventListener("mousedown", e);
12
- }, []), d(() => {
13
- if (!n || !o.current)
14
- return;
15
- const e = o.current.querySelector(
1
+ import { jsxs as I, jsx as v } from "react/jsx-runtime";
2
+ import { useState as h, useRef as o, useId as j, useEffect as z } from "react";
3
+ import { cn as k } from "../../utils/cn.js";
4
+ import { buttonReset as P } from "../../utils/styles.js";
5
+ const S = { start: "left-0", center: "left-1/2 -translate-x-1/2", end: "right-0" }, q = ({
6
+ children: x,
7
+ content: g,
8
+ defaultOpen: w = !1,
9
+ open: c,
10
+ onOpenChange: r,
11
+ align: y = "center",
12
+ variant: E = "default",
13
+ className: R
14
+ }) => {
15
+ const [L, N] = h(w), e = c ?? L, d = o(null), l = o(null), u = o(null), f = j(), s = (t) => {
16
+ c === void 0 && N(t), r == null || r(t);
17
+ }, a = o(s);
18
+ return a.current = s, z(() => {
19
+ var p, b;
20
+ if (!e) return;
21
+ (b = (p = u.current) == null ? void 0 : p.querySelector(
16
22
  'button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'
17
- );
18
- e == null || e.focus();
19
- }, [n]), d(() => {
20
- const e = (s) => {
21
- var r;
22
- s.key === "Escape" && (t(!1), (r = c.current) == null || r.focus());
23
+ )) == null || b.focus();
24
+ const t = (i) => {
25
+ var n;
26
+ (n = d.current) != null && n.contains(i.target) || a.current(!1);
27
+ }, m = (i) => {
28
+ var n;
29
+ i.key === "Escape" && (a.current(!1), (n = l.current) == null || n.focus());
30
+ };
31
+ return document.addEventListener("mousedown", t), document.addEventListener("keydown", m), () => {
32
+ document.removeEventListener("mousedown", t), document.removeEventListener("keydown", m);
23
33
  };
24
- return n && document.addEventListener("keydown", e), () => document.removeEventListener("keydown", e);
25
- }, [n]), /* @__PURE__ */ v("div", { className: "relative inline-flex", ref: i, children: [
26
- /* @__PURE__ */ u(
34
+ }, [e]), /* @__PURE__ */ I("div", { ref: d, className: "relative inline-flex", children: [
35
+ /* @__PURE__ */ v(
27
36
  "button",
28
37
  {
29
- "aria-controls": n ? l : void 0,
30
- "aria-expanded": n,
38
+ ref: l,
39
+ "aria-controls": e ? f : void 0,
40
+ "aria-expanded": e,
31
41
  "aria-haspopup": "dialog",
32
- className: "inline-flex",
33
- onClick: () => t((e) => !e),
34
- ref: c,
42
+ className: k(P, "inline-flex cursor-pointer", R),
43
+ onClick: () => s(!e),
35
44
  type: "button",
36
- children: f
45
+ children: x
37
46
  }
38
47
  ),
39
- n && /* @__PURE__ */ u(
48
+ e && /* @__PURE__ */ v(
40
49
  "div",
41
50
  {
42
- className: w(
43
- "absolute left-1/2 top-full z-30 mt-2 w-max -translate-x-1/2 rounded-[var(--border-radius-md)] border border-[var(--border-color)] bg-[var(--bg-secondary)] p-3 shadow-[var(--shadow-md)]"
51
+ ref: u,
52
+ className: k(
53
+ "absolute top-full z-[var(--sbk-z-dropdown)] mt-2 w-max max-w-sm rounded-sbk-md p-4 text-sm font-light text-sbk-fg animate-sbk-fade-in",
54
+ E === "glass" ? "sbk-glass sbk-glass-strong" : "border border-sbk-line bg-sbk-surface shadow-sbk-md",
55
+ S[y]
44
56
  ),
45
- id: l,
46
- ref: o,
57
+ id: f,
47
58
  role: "dialog",
48
59
  tabIndex: -1,
49
- children: m
60
+ children: g
50
61
  }
51
62
  )
52
63
  ] });
53
64
  };
65
+ q.displayName = "Popover";
54
66
  export {
55
- E as Popover
67
+ q as Popover
56
68
  };
57
69
  //# sourceMappingURL=Popover.js.map