@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 +1 @@
1
- {"version":3,"file":"FileUpload.js","sources":["../../../src/components/FileUpload/FileUpload.tsx"],"sourcesContent":["import React, { useRef, useState } from 'react';\nimport { cn } from '../../utils/cn';\n\nexport interface FileUploadProps {\n accept?: string;\n className?: string;\n disabled?: boolean;\n error?: string;\n helperText?: string;\n label?: string;\n maxSizeBytes?: number;\n multiple?: boolean;\n onChange?: (files: File[]) => void;\n}\n\nexport const FileUpload: React.FC<FileUploadProps> = ({\n label,\n helperText,\n error,\n accept,\n multiple = false,\n maxSizeBytes,\n disabled = false,\n onChange,\n className,\n}) => {\n const inputRef = useRef<HTMLInputElement>(null);\n const [isDragging, setIsDragging] = useState(false);\n const [sizeError, setSizeError] = useState<string | null>(null);\n\n const handleFiles = (fileList: FileList | null) => {\n if (!fileList) return;\n const files = Array.from(fileList);\n\n if (maxSizeBytes) {\n const oversized = files.find((f) => f.size > maxSizeBytes);\n if (oversized) {\n const mb = (maxSizeBytes / 1024 / 1024).toFixed(0);\n setSizeError(`Arquivo \"${oversized.name}\" excede o tamanho máximo de ${mb} MB.`);\n return;\n }\n }\n\n setSizeError(null);\n onChange?.(files);\n };\n\n const handleDragOver = (e: React.DragEvent) => {\n e.preventDefault();\n if (!disabled) setIsDragging(true);\n };\n\n const handleDragLeave = () => setIsDragging(false);\n\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault();\n setIsDragging(false);\n if (!disabled) handleFiles(e.dataTransfer.files);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n inputRef.current?.click();\n }\n };\n\n const displayError = error ?? sizeError;\n\n return (\n <div className={cn('flex flex-col gap-[var(--spacing-xs)]', className)}>\n {label && (\n <span className=\"text-[var(--font-size-sm)] font-[var(--font-weight-semibold)] text-[var(--md-on-surface)]\">\n {label}\n </span>\n )}\n <div\n aria-disabled={disabled}\n className={cn(\n 'flex cursor-pointer flex-col items-center justify-center gap-2 rounded-[var(--border-radius-lg)] border-2 border-dashed p-8 text-center transition',\n isDragging\n ? 'border-[var(--md-primary)] bg-[var(--md-primary-container)]'\n : 'border-[var(--md-outline-variant)] hover:border-[var(--md-primary)] hover:bg-[var(--bg-tertiary)]',\n displayError && 'border-[var(--md-error)]',\n disabled && 'pointer-events-none cursor-not-allowed opacity-60',\n )}\n onClick={() => !disabled && inputRef.current?.click()}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n onKeyDown={handleKeyDown}\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n >\n {/* Upload icon */}\n <svg\n className=\"h-8 w-8 text-[var(--md-primary)]\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n viewBox=\"0 0 24 24\"\n >\n <path\n d=\"M3 16.5v2.25A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75V16.5m-13.5-9L12 3m0 0 4.5 4.5M12 3v13.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n <div>\n <p className=\"text-sm font-medium text-[var(--text-primary)]\">\n Arraste arquivos aqui ou{' '}\n <span className=\"text-[var(--md-primary)] underline\">clique para selecionar</span>\n </p>\n {accept && (\n <p className=\"mt-0.5 text-xs text-[var(--text-muted)]\">Formatos aceitos: {accept}</p>\n )}\n {maxSizeBytes && (\n <p className=\"text-xs text-[var(--text-muted)]\">\n Tamanho máximo: {(maxSizeBytes / 1024 / 1024).toFixed(0)} MB\n </p>\n )}\n </div>\n </div>\n <input\n ref={inputRef}\n accept={accept}\n className=\"sr-only\"\n disabled={disabled}\n multiple={multiple}\n tabIndex={-1}\n type=\"file\"\n onChange={(e) => handleFiles(e.target.files)}\n />\n {displayError && (\n <span className=\"text-[var(--font-size-xs)] text-[var(--md-error)]\" role=\"alert\">\n {displayError}\n </span>\n )}\n {helperText && !displayError && (\n <span className=\"text-[var(--font-size-xs)] text-[var(--md-on-surface-variant)]\">\n {helperText}\n </span>\n )}\n </div>\n );\n};\n\nFileUpload.displayName = 'FileUpload';\n"],"names":["FileUpload","label","helperText","error","accept","multiple","maxSizeBytes","disabled","onChange","className","inputRef","useRef","isDragging","setIsDragging","useState","sizeError","setSizeError","handleFiles","fileList","files","oversized","f","mb","handleDragOver","e","handleDragLeave","handleDrop","handleKeyDown","_a","displayError","cn","jsx","jsxs"],"mappings":"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"}
1
+ {"version":3,"file":"FileUpload.js","sources":["../../../src/components/FileUpload/FileUpload.tsx"],"sourcesContent":["import React, { useId, useRef, useState } from 'react';\nimport { FileText, UploadCloud, X } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { buttonReset, focusRing, transitionColors } from '../../utils/styles';\nimport { Field } from '../Field/Field';\n\nexport interface FileUploadProps {\n accept?: string;\n className?: string;\n disabled?: boolean;\n error?: string;\n helperText?: string;\n id?: string;\n label?: React.ReactNode;\n maxSizeBytes?: number;\n multiple?: boolean;\n onChange?: (files: File[]) => void;\n /** Lista os arquivos selecionados com opção de remover. Padrão: true. */\n showFileList?: boolean;\n}\n\nconst formatSize = (bytes: number) =>\n bytes >= 1024 * 1024\n ? `${(bytes / 1024 / 1024).toFixed(1)} MB`\n : `${Math.max(1, Math.round(bytes / 1024))} KB`;\n\n/** Área de upload com arrastar e soltar, acessível por teclado. */\nexport const FileUpload = ({\n label,\n helperText,\n error,\n accept,\n multiple = false,\n maxSizeBytes,\n disabled = false,\n showFileList = true,\n onChange,\n id,\n className,\n}: FileUploadProps) => {\n const autoId = useId();\n const inputId = id ?? autoId;\n const inputRef = useRef<HTMLInputElement>(null);\n const [isDragging, setIsDragging] = useState(false);\n const [sizeError, setSizeError] = useState<string | null>(null);\n const [files, setFiles] = useState<File[]>([]);\n\n const commit = (next: File[]) => {\n setFiles(next);\n onChange?.(next);\n };\n\n const handleFiles = (fileList: FileList | null) => {\n if (!fileList || fileList.length === 0) return;\n const incoming = Array.from(fileList);\n if (maxSizeBytes) {\n const oversized = incoming.find((f) => f.size > maxSizeBytes);\n if (oversized) {\n setSizeError(\n `Arquivo \"${oversized.name}\" excede o tamanho máximo de ${formatSize(maxSizeBytes)}.`,\n );\n return;\n }\n }\n setSizeError(null);\n commit(multiple ? [...files, ...incoming] : incoming.slice(0, 1));\n };\n\n const displayError = error ?? sizeError ?? undefined;\n const hints = [\n accept && `Formatos aceitos: ${accept}`,\n maxSizeBytes && `Tamanho máximo: ${formatSize(maxSizeBytes)}`,\n ]\n .filter(Boolean)\n .join(' · ');\n\n return (\n <Field\n className={className}\n error={displayError}\n helperText={helperText}\n id={inputId}\n label={label}\n labelAs=\"span\"\n >\n <div\n aria-describedby={\n displayError ? `${inputId}-error` : helperText ? `${inputId}-helper` : undefined\n }\n aria-disabled={disabled || undefined}\n aria-labelledby={label ? `${inputId}-label` : undefined}\n className={cn(\n 'flex cursor-pointer flex-col items-center justify-center gap-2 rounded-sbk-md border-2 border-dashed p-8 text-center',\n transitionColors,\n focusRing,\n isDragging\n ? 'border-sbk-primary bg-sbk-primary-subtle'\n : 'border-sbk-line-strong bg-sbk-surface hover:border-sbk-primary hover:bg-sbk-surface-hover',\n displayError && 'border-sbk-error',\n disabled && 'pointer-events-none opacity-60',\n )}\n onClick={() => !disabled && inputRef.current?.click()}\n onDragLeave={() => setIsDragging(false)}\n onDragOver={(e) => {\n e.preventDefault();\n if (!disabled) setIsDragging(true);\n }}\n onDrop={(e) => {\n e.preventDefault();\n setIsDragging(false);\n if (!disabled) handleFiles(e.dataTransfer.files);\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n inputRef.current?.click();\n }\n }}\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n >\n <UploadCloud aria-hidden=\"true\" className=\"size-8 text-sbk-primary\" strokeWidth={1.5} />\n <p className=\"m-0 text-sm font-light text-sbk-fg\">\n Arraste arquivos aqui ou{' '}\n <span className=\"font-semibold text-sbk-primary underline\">clique para selecionar</span>\n </p>\n {hints && <p className=\"m-0 text-xs font-light text-sbk-fg-muted\">{hints}</p>}\n </div>\n <input\n ref={inputRef}\n accept={accept}\n className=\"sr-only\"\n disabled={disabled}\n id={inputId}\n multiple={multiple}\n onChange={(e) => {\n handleFiles(e.target.files);\n e.target.value = '';\n }}\n tabIndex={-1}\n type=\"file\"\n />\n {showFileList && files.length > 0 && (\n <ul aria-label=\"Arquivos selecionados\" className=\"m-0 grid list-none gap-1.5 p-0\">\n {files.map((file, index) => (\n <li\n key={`${file.name}-${index}`}\n className=\"flex items-center gap-2 rounded-sbk-sm border border-sbk-line bg-sbk-surface px-3 py-2 text-sm\"\n >\n <FileText aria-hidden=\"true\" className=\"size-4 shrink-0 text-sbk-fg-muted\" />\n <span className=\"min-w-0 flex-1 truncate font-light text-sbk-fg\">{file.name}</span>\n <span className=\"shrink-0 text-xs font-light text-sbk-fg-muted\">\n {formatSize(file.size)}\n </span>\n <button\n aria-label={`Remover ${file.name}`}\n className={cn(\n buttonReset,\n 'inline-flex size-6 cursor-pointer items-center justify-center rounded-sbk-xs text-sbk-fg-muted hover:bg-sbk-surface-hover hover:text-sbk-fg',\n focusRing,\n )}\n disabled={disabled}\n onClick={() => commit(files.filter((_, i) => i !== index))}\n type=\"button\"\n >\n <X aria-hidden=\"true\" className=\"size-4\" />\n </button>\n </li>\n ))}\n </ul>\n )}\n </Field>\n );\n};\n\nFileUpload.displayName = 'FileUpload';\n"],"names":["formatSize","bytes","FileUpload","label","helperText","error","accept","multiple","maxSizeBytes","disabled","showFileList","onChange","id","className","autoId","useId","inputId","inputRef","useRef","isDragging","setIsDragging","useState","sizeError","setSizeError","files","setFiles","commit","next","handleFiles","fileList","incoming","oversized","f","displayError","hints","jsxs","Field","cn","transitionColors","focusRing","_a","jsx","UploadCloud","file","index","FileText","buttonReset","_","i","X"],"mappings":"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"}
@@ -1,14 +1,27 @@
1
1
  import type React from 'react';
2
+ import { type LogoVariant } from '../Logo/Logo';
3
+ export interface FooterLink {
4
+ href: string;
5
+ label: React.ReactNode;
6
+ }
2
7
  export interface FooterProps {
3
- /** Classe CSS adicional */
4
8
  className?: string;
5
- /** Texto alternativo do logo */
9
+ /** Texto de copyright (ex.: "© 2026 SBK"). */
10
+ copyright?: React.ReactNode;
11
+ /** Links institucionais (privacidade, termos, suporte). */
12
+ links?: FooterLink[];
6
13
  logoAlt?: string;
7
- /** Texto exibido se a imagem do logo falhar (ex.: "SBK") */
14
+ /** @deprecated Não utilizado. Mantido por compatibilidade com a 1.x. */
8
15
  logoFallbackText?: string;
9
- /** URL da imagem do logo */
16
+ /** Imagem de logo customizada (substitui o SVG oficial). */
10
17
  logoSrc?: string;
11
- /** Texto antes do logo (ex.: "Powered by") */
18
+ logoVariant?: LogoVariant;
19
+ /** Texto antes do logo. Padrão: "Powered by". Use "" para ocultar. */
12
20
  poweredByText?: string;
21
+ /** `default`: superfície clara. `inverse`: verde escuro. `glass`: Liquid Glass. */
22
+ variant?: 'default' | 'inverse' | 'glass';
13
23
  }
14
- export declare const Footer: React.FC<FooterProps>;
24
+ export declare const Footer: {
25
+ ({ poweredByText, logoSrc, logoAlt, logoVariant, links, copyright, variant, className, }: FooterProps): import("react/jsx-runtime").JSX.Element;
26
+ displayName: string;
27
+ };
@@ -1,54 +1,51 @@
1
- import { jsx as r, jsxs as n } from "react/jsx-runtime";
2
- import { useState as c } from "react";
3
- const p = ({
4
- poweredByText: t = "Powered by",
5
- logoSrc: e,
6
- logoAlt: i = "Logo",
7
- logoFallbackText: s,
8
- className: o = ""
9
- }) => {
10
- const [a, l] = c(!0);
11
- return /* @__PURE__ */ r(
12
- "footer",
13
- {
14
- className: [
15
- "relative z-[1] flex w-full shrink-0 items-center justify-center border-t border-[var(--border-color)] bg-[var(--bg-secondary)] px-[var(--spacing-2xl)] py-[var(--spacing-lg)]",
16
- o
17
- ].filter(Boolean).join(" "),
18
- children: /* @__PURE__ */ n("div", { className: "flex items-center gap-[var(--spacing-md)]", children: [
19
- t && /* @__PURE__ */ r("span", { className: "text-[0.95rem] font-normal text-[var(--text-secondary)]", children: t }),
20
- (e || s) && /* @__PURE__ */ n("div", { className: "flex items-center", children: [
21
- e && a && /* @__PURE__ */ r(
22
- "img",
23
- {
24
- alt: i,
25
- className: "h-6 w-auto object-contain",
26
- onError: (m) => {
27
- l(!1);
28
- },
29
- src: e,
30
- style: {
31
- filter: "brightness(0)"
32
- }
33
- }
1
+ import { jsxs as n, jsx as e } from "react/jsx-runtime";
2
+ import { cn as i } from "../../utils/cn.js";
3
+ import { focusRing as c } from "../../utils/styles.js";
4
+ import { Logo as m } from "../Logo/Logo.js";
5
+ const g = {
6
+ default: "border-t border-sbk-line bg-sbk-surface",
7
+ inverse: "bg-sbk-surface-inverse text-sbk-fg-inverse [--sbk-color-fg-muted:color-mix(in_srgb,var(--sbk-color-fg-inverse)_72%,transparent)] [--sbk-color-fg-heading:var(--sbk-color-fg-inverse)]",
8
+ glass: "sbk-glass rounded-none border-x-0 border-b-0"
9
+ }, x = ({
10
+ poweredByText: a = "Powered by",
11
+ logoSrc: o,
12
+ logoAlt: f = "SBK",
13
+ logoVariant: d = "sbk",
14
+ links: r,
15
+ copyright: s,
16
+ variant: l = "default",
17
+ className: b
18
+ }) => /* @__PURE__ */ n(
19
+ "footer",
20
+ {
21
+ className: i(
22
+ "relative box-border flex w-full shrink-0 flex-wrap items-center justify-center gap-x-8 gap-y-3 px-4 py-5 md:px-8",
23
+ (r || s) && "md:justify-between",
24
+ g[l],
25
+ b
26
+ ),
27
+ children: [
28
+ /* @__PURE__ */ n("div", { className: "flex items-center gap-2.5", children: [
29
+ a && /* @__PURE__ */ e("span", { className: "text-xs font-light text-sbk-fg-muted", children: a }),
30
+ o ? /* @__PURE__ */ e("img", { alt: f, className: "h-7 w-auto object-contain", src: o }) : /* @__PURE__ */ e(m, { color: l === "inverse" ? "white" : "auto", height: 22, variant: d })
31
+ ] }),
32
+ r && r.length > 0 && /* @__PURE__ */ e("nav", { "aria-label": "Rodapé", children: /* @__PURE__ */ e("ul", { className: "m-0 flex list-none flex-wrap gap-x-5 gap-y-2 p-0", children: r.map((t) => /* @__PURE__ */ e("li", { children: /* @__PURE__ */ e(
33
+ "a",
34
+ {
35
+ className: i(
36
+ "rounded-sbk-xs text-xs font-light text-sbk-fg-muted underline-offset-4 hover:text-sbk-fg-heading hover:underline",
37
+ c
34
38
  ),
35
- s && /* @__PURE__ */ r(
36
- "span",
37
- {
38
- className: "flex items-center text-base font-bold tracking-[0.1em] text-[var(--md-primary)]",
39
- style: {
40
- display: e && a ? "none" : "flex",
41
- fontFamily: '"Orbitron", sans-serif'
42
- },
43
- children: s
44
- }
45
- )
46
- ] })
47
- ] })
48
- }
49
- );
50
- };
39
+ href: t.href,
40
+ children: t.label
41
+ }
42
+ ) }, t.href)) }) }),
43
+ s && /* @__PURE__ */ e("p", { className: "m-0 text-xs font-light text-sbk-fg-muted", children: s })
44
+ ]
45
+ }
46
+ );
47
+ x.displayName = "Footer";
51
48
  export {
52
- p as Footer
49
+ x as Footer
53
50
  };
54
51
  //# sourceMappingURL=Footer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Footer.js","sources":["../../../src/components/Footer/Footer.tsx"],"sourcesContent":["import type React from 'react';\nimport { useState } from 'react';\n\nexport interface FooterProps {\n /** Classe CSS adicional */\n className?: string;\n /** Texto alternativo do logo */\n logoAlt?: string;\n /** Texto exibido se a imagem do logo falhar (ex.: \"SBK\") */\n logoFallbackText?: string;\n /** URL da imagem do logo */\n logoSrc?: string;\n /** Texto antes do logo (ex.: \"Powered by\") */\n poweredByText?: string;\n}\n\nexport const Footer: React.FC<FooterProps> = ({\n poweredByText = 'Powered by',\n logoSrc,\n logoAlt = 'Logo',\n logoFallbackText,\n className = '',\n}) => {\n const [logoVisible, setLogoVisible] = useState(true);\n return (\n <footer\n className={[\n 'relative z-[1] flex w-full shrink-0 items-center justify-center border-t border-[var(--border-color)] bg-[var(--bg-secondary)] px-[var(--spacing-2xl)] py-[var(--spacing-lg)]',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n >\n <div className=\"flex items-center gap-[var(--spacing-md)]\">\n {poweredByText && (\n <span className=\"text-[0.95rem] font-normal text-[var(--text-secondary)]\">\n {poweredByText}\n </span>\n )}\n {(logoSrc || logoFallbackText) && (\n <div className=\"flex items-center\">\n {logoSrc && logoVisible && (\n <img\n alt={logoAlt}\n className=\"h-6 w-auto object-contain\"\n onError={(_e) => {\n setLogoVisible(false);\n }}\n src={logoSrc}\n style={{\n filter: 'brightness(0)',\n }}\n />\n )}\n {logoFallbackText && (\n <span\n className=\"flex items-center text-base font-bold tracking-[0.1em] text-[var(--md-primary)]\"\n style={{\n display: logoSrc && logoVisible ? 'none' : 'flex',\n fontFamily: '\"Orbitron\", sans-serif',\n }}\n >\n {logoFallbackText}\n </span>\n )}\n </div>\n )}\n </div>\n </footer>\n );\n};\n"],"names":["Footer","poweredByText","logoSrc","logoAlt","logoFallbackText","className","logoVisible","setLogoVisible","useState","jsx","jsxs","_e"],"mappings":";;AAgBO,MAAMA,IAAgC,CAAC;AAAA,EAC5C,eAAAC,IAAgB;AAAA,EAChB,SAAAC;AAAA,EACA,SAAAC,IAAU;AAAA,EACV,kBAAAC;AAAA,EACA,WAAAC,IAAY;AACd,MAAM;AACJ,QAAM,CAACC,GAAaC,CAAc,IAAIC,EAAS,EAAI;AACnD,SACE,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACAJ;AAAA,MAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,MAEX,UAAA,gBAAAK,EAAC,OAAA,EAAI,WAAU,6CACZ,UAAA;AAAA,QAAAT,KACC,gBAAAQ,EAAC,QAAA,EAAK,WAAU,2DACb,UAAAR,GACH;AAAA,SAEAC,KAAWE,MACX,gBAAAM,EAAC,OAAA,EAAI,WAAU,qBACZ,UAAA;AAAA,UAAAR,KAAWI,KACV,gBAAAG;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,KAAKN;AAAA,cACL,WAAU;AAAA,cACV,SAAS,CAACQ,MAAO;AACf,gBAAAJ,EAAe,EAAK;AAAA,cACtB;AAAA,cACA,KAAKL;AAAA,cACL,OAAO;AAAA,gBACL,QAAQ;AAAA,cAAA;AAAA,YACV;AAAA,UAAA;AAAA,UAGHE,KACC,gBAAAK;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAO;AAAA,gBACL,SAASP,KAAWI,IAAc,SAAS;AAAA,gBAC3C,YAAY;AAAA,cAAA;AAAA,cAGb,UAAAF;AAAA,YAAA;AAAA,UAAA;AAAA,QACH,EAAA,CAEJ;AAAA,MAAA,EAAA,CAEJ;AAAA,IAAA;AAAA,EAAA;AAGN;"}
1
+ {"version":3,"file":"Footer.js","sources":["../../../src/components/Footer/Footer.tsx"],"sourcesContent":["import type React from 'react';\nimport { cn } from '../../utils/cn';\nimport { focusRing } from '../../utils/styles';\nimport { Logo, type LogoVariant } from '../Logo/Logo';\n\nexport interface FooterLink {\n href: string;\n label: React.ReactNode;\n}\n\nexport interface FooterProps {\n className?: string;\n /** Texto de copyright (ex.: \"© 2026 SBK\"). */\n copyright?: React.ReactNode;\n /** Links institucionais (privacidade, termos, suporte). */\n links?: FooterLink[];\n logoAlt?: string;\n /** @deprecated Não utilizado. Mantido por compatibilidade com a 1.x. */\n logoFallbackText?: string;\n /** Imagem de logo customizada (substitui o SVG oficial). */\n logoSrc?: string;\n logoVariant?: LogoVariant;\n /** Texto antes do logo. Padrão: \"Powered by\". Use \"\" para ocultar. */\n poweredByText?: string;\n /** `default`: superfície clara. `inverse`: verde escuro. `glass`: Liquid Glass. */\n variant?: 'default' | 'inverse' | 'glass';\n}\n\nconst VARIANT_CLASS = {\n default: 'border-t border-sbk-line bg-sbk-surface',\n inverse:\n 'bg-sbk-surface-inverse text-sbk-fg-inverse [--sbk-color-fg-muted:color-mix(in_srgb,var(--sbk-color-fg-inverse)_72%,transparent)] [--sbk-color-fg-heading:var(--sbk-color-fg-inverse)]',\n glass: 'sbk-glass rounded-none border-x-0 border-b-0',\n} as const;\n\nexport const Footer = ({\n poweredByText = 'Powered by',\n logoSrc,\n logoAlt = 'SBK',\n logoVariant = 'sbk',\n links,\n copyright,\n variant = 'default',\n className,\n}: FooterProps) => (\n <footer\n className={cn(\n 'relative box-border flex w-full shrink-0 flex-wrap items-center justify-center gap-x-8 gap-y-3 px-4 py-5 md:px-8',\n (links || copyright) && 'md:justify-between',\n VARIANT_CLASS[variant],\n className,\n )}\n >\n <div className=\"flex items-center gap-2.5\">\n {poweredByText && (\n <span className=\"text-xs font-light text-sbk-fg-muted\">{poweredByText}</span>\n )}\n {logoSrc ? (\n <img alt={logoAlt} className=\"h-7 w-auto object-contain\" src={logoSrc} />\n ) : (\n <Logo color={variant === 'inverse' ? 'white' : 'auto'} height={22} variant={logoVariant} />\n )}\n </div>\n {links && links.length > 0 && (\n <nav aria-label=\"Rodapé\">\n <ul className=\"m-0 flex list-none flex-wrap gap-x-5 gap-y-2 p-0\">\n {links.map((link) => (\n <li key={link.href}>\n <a\n className={cn(\n 'rounded-sbk-xs text-xs font-light text-sbk-fg-muted underline-offset-4 hover:text-sbk-fg-heading hover:underline',\n focusRing,\n )}\n href={link.href}\n >\n {link.label}\n </a>\n </li>\n ))}\n </ul>\n </nav>\n )}\n {copyright && <p className=\"m-0 text-xs font-light text-sbk-fg-muted\">{copyright}</p>}\n </footer>\n);\n\nFooter.displayName = 'Footer';\n"],"names":["VARIANT_CLASS","Footer","poweredByText","logoSrc","logoAlt","logoVariant","links","copyright","variant","className","jsxs","cn","jsx","Logo","link","focusRing"],"mappings":";;;;AA4BA,MAAMA,IAAgB;AAAA,EACpB,SAAS;AAAA,EACT,SACE;AAAA,EACF,OAAO;AACT,GAEaC,IAAS,CAAC;AAAA,EACrB,eAAAC,IAAgB;AAAA,EAChB,SAAAC;AAAA,EACA,SAAAC,IAAU;AAAA,EACV,aAAAC,IAAc;AAAA,EACd,OAAAC;AAAA,EACA,WAAAC;AAAA,EACA,SAAAC,IAAU;AAAA,EACV,WAAAC;AACF,MACE,gBAAAC;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,WAAWC;AAAA,MACT;AAAA,OACCL,KAASC,MAAc;AAAA,MACxBP,EAAcQ,CAAO;AAAA,MACrBC;AAAA,IAAA;AAAA,IAGF,UAAA;AAAA,MAAA,gBAAAC,EAAC,OAAA,EAAI,WAAU,6BACZ,UAAA;AAAA,QAAAR,KACC,gBAAAU,EAAC,QAAA,EAAK,WAAU,wCAAwC,UAAAV,GAAc;AAAA,QAEvEC,sBACE,OAAA,EAAI,KAAKC,GAAS,WAAU,6BAA4B,KAAKD,GAAS,sBAEtEU,GAAA,EAAK,OAAOL,MAAY,YAAY,UAAU,QAAQ,QAAQ,IAAI,SAASH,EAAA,CAAa;AAAA,MAAA,GAE7F;AAAA,MACCC,KAASA,EAAM,SAAS,KACvB,gBAAAM,EAAC,SAAI,cAAW,UACd,UAAA,gBAAAA,EAAC,MAAA,EAAG,WAAU,oDACX,UAAAN,EAAM,IAAI,CAACQ,wBACT,MAAA,EACC,UAAA,gBAAAF;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAWD;AAAA,YACT;AAAA,YACAI;AAAA,UAAA;AAAA,UAEF,MAAMD,EAAK;AAAA,UAEV,UAAAA,EAAK;AAAA,QAAA;AAAA,MAAA,EACR,GATOA,EAAK,IAUd,CACD,GACH,EAAA,CACF;AAAA,MAEDP,KAAa,gBAAAK,EAAC,KAAA,EAAE,WAAU,4CAA4C,UAAAL,EAAA,CAAU;AAAA,IAAA;AAAA,EAAA;AACnF;AAGFN,EAAO,cAAc;"}
@@ -0,0 +1,18 @@
1
+ import React from 'react';
2
+ export interface GlassPanelProps extends React.HTMLAttributes<HTMLDivElement> {
3
+ as?: 'div' | 'section' | 'aside' | 'header' | 'nav' | 'footer';
4
+ /** Intensidade do desfoque. Padrão: md (20px). */
5
+ blur?: 'sm' | 'md' | 'lg';
6
+ padding?: 'none' | 'sm' | 'md' | 'lg';
7
+ radius?: 'sm' | 'md' | 'lg' | 'full';
8
+ /** Aumenta a opacidade do fundo para melhorar a leitura sobre imagens movimentadas. */
9
+ strong?: boolean;
10
+ }
11
+ /**
12
+ * Superfície "Liquid Glass" (inspirada no material da Apple): translucidez tingida de verde,
13
+ * desfoque com saturação, borda especular e brilho interno.
14
+ *
15
+ * Acessibilidade: em `prefers-reduced-transparency` ou sem suporte a `backdrop-filter`,
16
+ * cai para superfície opaca. Garanta contraste do texto sobre o conteúdo de fundo.
17
+ */
18
+ export declare const GlassPanel: React.ForwardRefExoticComponent<GlassPanelProps & React.RefAttributes<HTMLDivElement>>;
@@ -0,0 +1,39 @@
1
+ import { jsx as t } from "react/jsx-runtime";
2
+ import p from "react";
3
+ import { cn as f } from "../../utils/cn.js";
4
+ const g = { sm: "12px", md: "20px", lg: "32px" }, b = { none: "p-0", sm: "p-3", md: "p-5", lg: "p-8" }, c = {
5
+ sm: "rounded-sbk-sm",
6
+ md: "rounded-sbk-md",
7
+ lg: "rounded-sbk-lg",
8
+ full: "rounded-full"
9
+ }, k = p.forwardRef(
10
+ ({
11
+ as: s = "div",
12
+ blur: l = "md",
13
+ padding: m = "md",
14
+ radius: d = "md",
15
+ strong: o = !1,
16
+ className: a,
17
+ style: e,
18
+ ...r
19
+ }, n) => /* @__PURE__ */ t(
20
+ s,
21
+ {
22
+ ref: n,
23
+ className: f(
24
+ "sbk-glass text-sbk-fg",
25
+ o && "sbk-glass-strong",
26
+ b[m],
27
+ c[d],
28
+ a
29
+ ),
30
+ style: { "--sbk-glass-blur": g[l], ...e },
31
+ ...r
32
+ }
33
+ )
34
+ );
35
+ k.displayName = "GlassPanel";
36
+ export {
37
+ k as GlassPanel
38
+ };
39
+ //# sourceMappingURL=GlassPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GlassPanel.js","sources":["../../../src/components/GlassPanel/GlassPanel.tsx"],"sourcesContent":["import React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport interface GlassPanelProps extends React.HTMLAttributes<HTMLDivElement> {\n as?: 'div' | 'section' | 'aside' | 'header' | 'nav' | 'footer';\n /** Intensidade do desfoque. Padrão: md (20px). */\n blur?: 'sm' | 'md' | 'lg';\n padding?: 'none' | 'sm' | 'md' | 'lg';\n radius?: 'sm' | 'md' | 'lg' | 'full';\n /** Aumenta a opacidade do fundo para melhorar a leitura sobre imagens movimentadas. */\n strong?: boolean;\n}\n\nconst BLUR = { sm: '12px', md: '20px', lg: '32px' } as const;\nconst PADDING = { none: 'p-0', sm: 'p-3', md: 'p-5', lg: 'p-8' } as const;\nconst RADIUS = {\n sm: 'rounded-sbk-sm',\n md: 'rounded-sbk-md',\n lg: 'rounded-sbk-lg',\n full: 'rounded-full',\n} as const;\n\n/**\n * Superfície \"Liquid Glass\" (inspirada no material da Apple): translucidez tingida de verde,\n * desfoque com saturação, borda especular e brilho interno.\n *\n * Acessibilidade: em `prefers-reduced-transparency` ou sem suporte a `backdrop-filter`,\n * cai para superfície opaca. Garanta contraste do texto sobre o conteúdo de fundo.\n */\nexport const GlassPanel = React.forwardRef<HTMLDivElement, GlassPanelProps>(\n (\n {\n as: Tag = 'div',\n blur = 'md',\n padding = 'md',\n radius = 'md',\n strong = false,\n className,\n style,\n ...props\n },\n ref,\n ) => (\n <Tag\n ref={ref}\n className={cn(\n 'sbk-glass text-sbk-fg',\n strong && 'sbk-glass-strong',\n PADDING[padding],\n RADIUS[radius],\n className,\n )}\n style={{ '--sbk-glass-blur': BLUR[blur], ...style } as React.CSSProperties}\n {...props}\n />\n ),\n);\n\nGlassPanel.displayName = 'GlassPanel';\n"],"names":["BLUR","PADDING","RADIUS","GlassPanel","React","Tag","blur","padding","radius","strong","className","style","props","ref","jsx","cn"],"mappings":";;;AAaA,MAAMA,IAAO,EAAE,IAAI,QAAQ,IAAI,QAAQ,IAAI,OAAA,GACrCC,IAAU,EAAE,MAAM,OAAO,IAAI,OAAO,IAAI,OAAO,IAAI,MAAA,GACnDC,IAAS;AAAA,EACb,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,MAAM;AACR,GASaC,IAAaC,EAAM;AAAA,EAC9B,CACE;AAAA,IACE,IAAIC,IAAM;AAAA,IACV,MAAAC,IAAO;AAAA,IACP,SAAAC,IAAU;AAAA,IACV,QAAAC,IAAS;AAAA,IACT,QAAAC,IAAS;AAAA,IACT,WAAAC;AAAA,IACA,OAAAC;AAAA,IACA,GAAGC;AAAA,EAAA,GAELC,MAEA,gBAAAC;AAAA,IAACT;AAAA,IAAA;AAAA,MACC,KAAAQ;AAAA,MACA,WAAWE;AAAA,QACT;AAAA,QACAN,KAAU;AAAA,QACVR,EAAQM,CAAO;AAAA,QACfL,EAAOM,CAAM;AAAA,QACbE;AAAA,MAAA;AAAA,MAEF,OAAO,EAAE,oBAAoBV,EAAKM,CAAI,GAAG,GAAGK,EAAA;AAAA,MAC3C,GAAGC;AAAA,IAAA;AAAA,EAAA;AAGV;AAEAT,EAAW,cAAc;"}
@@ -1,23 +1,40 @@
1
1
  import type React from 'react';
2
2
  import type { Theme } from '../../theme/ThemeProvider';
3
+ import { type LogoVariant } from '../Logo/Logo';
4
+ export type HeaderVariant = 'solid' | 'light' | 'glass';
3
5
  export interface HeaderProps {
4
- /** Classe CSS adicional */
5
6
  className?: string;
6
- /** Texto alternativo do logo */
7
+ /** Texto alternativo da imagem de logo customizada. */
7
8
  logoAlt?: string;
8
- /** URL da imagem do logo (tema escuro). Se não informado, usa logoSrc. */
9
+ /** Imagem de logo para o tema escuro (substitui o SVG oficial). */
9
10
  logoDarkSrc?: string;
10
- /** URL da imagem do logo (tema claro) */
11
+ /** Imagem de logo customizada (substitui o SVG oficial). */
11
12
  logoSrc?: string;
12
- /** Callback ao clicar na área do logo/título */
13
+ /** Logo oficial usado quando não há `logoSrc`. Padrão: sbk. */
14
+ logoVariant?: LogoVariant;
15
+ /** Estado do menu lateral, anunciado no botão hamburger (aria-expanded). */
16
+ menuExpanded?: boolean;
17
+ /** Rótulo do botão hamburger. Padrão: "Abrir menu". */
18
+ menuLabel?: string;
19
+ /** Navegação principal, exibida ao centro. */
20
+ navigation?: React.ReactNode;
13
21
  onLogoClick?: () => void;
14
- /** Conteúdo da área direita (ex.: seletor de idioma, toggle tema, menu usuário) */
22
+ onMenuClick?: () => void;
23
+ /** Conteúdo à direita (ações, seletor de tema, menu do usuário). */
15
24
  rightContent?: React.ReactNode;
16
- /** Subtítulo abaixo do título */
25
+ showMenuIcon?: boolean;
26
+ /** Fixa o header no topo. Padrão: true. */
27
+ sticky?: boolean;
17
28
  subtitle?: React.ReactNode;
18
- /** Tema opcional para escolher o logo correto sem depender do ThemeProvider do UI */
29
+ /** Tema para escolher entre logoSrc e logoDarkSrc sem depender do ThemeProvider. */
19
30
  theme?: Theme;
20
- /** Título exibido ao lado do logo (ex.: "OFÍCIO.IA") */
21
31
  title?: React.ReactNode;
32
+ /** Iniciais do usuário exibidas no avatar (ex.: "CF"). */
33
+ userInitials?: string;
34
+ /** `solid`: verde escuro (padrão). `light`: superfície clara. `glass`: Liquid Glass. */
35
+ variant?: HeaderVariant;
22
36
  }
23
- export declare const Header: React.FC<HeaderProps>;
37
+ export declare const Header: {
38
+ ({ logoSrc, logoDarkSrc, logoAlt, logoVariant, title, subtitle, theme, navigation, onLogoClick, onMenuClick, menuExpanded, menuLabel, rightContent, showMenuIcon, sticky, userInitials, variant, className, }: HeaderProps): import("react/jsx-runtime").JSX.Element;
39
+ displayName: string;
40
+ };
@@ -1,114 +1,114 @@
1
- import { jsxs as a, jsx as r } from "react/jsx-runtime";
2
- import { useState as u, useEffect as x } from "react";
3
- const v = () => typeof document > "u" ? "light" : document.documentElement.getAttribute("data-theme") === "dark" ? "dark" : "light", M = ({
4
- logoSrc: h,
5
- logoDarkSrc: i,
6
- logoAlt: p = "Logo",
7
- title: l,
8
- subtitle: d,
9
- theme: s,
10
- onLogoClick: e,
11
- rightContent: m,
12
- className: b = ""
1
+ import { jsxs as t, jsx as e, Fragment as M } from "react/jsx-runtime";
2
+ import { useState as C, useEffect as F } from "react";
3
+ import { Menu as H } from "lucide-react";
4
+ import { cn as o } from "../../utils/cn.js";
5
+ import { focusRing as p, buttonReset as x, inverseScope as L } from "../../utils/styles.js";
6
+ import { Logo as O } from "../Logo/Logo.js";
7
+ const g = () => typeof document < "u" && document.documentElement.getAttribute("data-theme") === "dark" ? "dark" : "light", S = {
8
+ solid: L,
9
+ light: "border-b border-sbk-line bg-sbk-surface text-sbk-fg",
10
+ glass: "sbk-glass rounded-none border-x-0 border-t-0 text-sbk-fg"
11
+ }, B = ({
12
+ logoSrc: k,
13
+ logoDarkSrc: s,
14
+ logoAlt: N = "SBK",
15
+ logoVariant: v = "sbk",
16
+ title: r,
17
+ subtitle: i,
18
+ theme: n,
19
+ navigation: c,
20
+ onLogoClick: d,
21
+ onMenuClick: y,
22
+ menuExpanded: w,
23
+ menuLabel: j = "Abrir menu",
24
+ rightContent: z,
25
+ showMenuIcon: A = !0,
26
+ sticky: R = !0,
27
+ userInitials: a,
28
+ variant: l = "solid",
29
+ className: T
13
30
  }) => {
14
- const [o, w] = u(!1), [y, c] = u(() => s ?? v()), f = y === "dark" && i ? i : h;
15
- x(() => {
16
- const t = () => w(window.scrollY > 10);
17
- return window.addEventListener("scroll", t, { passive: !0 }), () => window.removeEventListener("scroll", t);
18
- }, []), x(() => {
19
- if (s) {
20
- c(s);
31
+ const [E, m] = C(() => n ?? g());
32
+ F(() => {
33
+ if (n) {
34
+ m(n);
21
35
  return;
22
36
  }
23
- const t = () => c(v());
24
- if (t(), typeof MutationObserver > "u")
25
- return;
26
- const n = new MutationObserver(t);
27
- return n.observe(document.documentElement, {
37
+ if (!s || typeof MutationObserver > "u") return;
38
+ const f = () => m(g());
39
+ f();
40
+ const h = new MutationObserver(f);
41
+ return h.observe(document.documentElement, {
28
42
  attributes: !0,
29
43
  attributeFilter: ["data-theme"]
30
- }), () => n.disconnect();
31
- }, [s]);
32
- const N = () => e == null ? void 0 : e(), E = (t) => {
33
- t.key === "Enter" && (e == null || e());
34
- };
35
- return /* @__PURE__ */ a(
44
+ }), () => h.disconnect();
45
+ }, [n, s]);
46
+ const u = E === "dark" && s ? s : k, b = /* @__PURE__ */ t(M, { children: [
47
+ u ? /* @__PURE__ */ e("img", { alt: N, className: "h-8 w-auto shrink-0 object-contain", src: u }) : /* @__PURE__ */ e(O, { color: l === "solid" ? "white" : "auto", height: 28, variant: v }),
48
+ (r || i) && /* @__PURE__ */ t("span", { className: "grid min-w-0 gap-px text-left", children: [
49
+ r && /* @__PURE__ */ e("span", { className: "truncate text-base font-semibold leading-tight text-sbk-fg-heading", children: r }),
50
+ i && /* @__PURE__ */ e("span", { className: "truncate text-xs font-light leading-tight text-sbk-fg-muted", children: i })
51
+ ] })
52
+ ] });
53
+ return /* @__PURE__ */ t(
36
54
  "header",
37
55
  {
38
- className: ["fixed inset-x-0 top-0 z-[1000] w-full backdrop-blur-[12px]", b].filter(Boolean).join(" "),
56
+ className: o(
57
+ "z-[var(--sbk-z-sticky)] box-border flex h-16 w-full shrink-0 items-center justify-between gap-4 px-4 md:px-8",
58
+ R && "sticky top-0",
59
+ S[l],
60
+ T
61
+ ),
39
62
  children: [
40
- /* @__PURE__ */ r("div", { className: "h-0.5 w-full bg-[var(--md-primary)]" }),
41
- /* @__PURE__ */ a(
42
- "div",
43
- {
44
- className: "flex items-center justify-between px-6 py-2 shadow-[var(--shadow-sm)] max-md:flex-col max-md:gap-3 max-md:px-4 max-md:py-3",
45
- style: {
46
- color: "var(--md-on-surface)",
47
- background: `color-mix(in srgb, var(--md-surface) ${o ? "14%" : "18%"}, transparent)`,
48
- borderBottom: `1px solid color-mix(in srgb, var(--md-outline-variant) ${o ? "22%" : "30%"}, transparent)`
49
- },
50
- children: [
51
- /* @__PURE__ */ a(
52
- "div",
53
- {
54
- className: "flex cursor-pointer items-center gap-3 transition-opacity duration-200 ease-in-out hover:opacity-80",
55
- onClick: e ? N : void 0,
56
- onKeyDown: e ? E : void 0,
57
- role: e ? "button" : void 0,
58
- tabIndex: e ? 0 : void 0,
59
- children: [
60
- f && /* @__PURE__ */ a("div", { className: "flex h-16 w-16 shrink-0 items-center justify-center", children: [
61
- /* @__PURE__ */ r(
62
- "img",
63
- {
64
- alt: p,
65
- className: "h-full w-full object-contain",
66
- onError: (t) => {
67
- t.target.style.display = "none";
68
- const n = t.target.nextElementSibling;
69
- n && (n.style.display = "block");
70
- },
71
- src: f
72
- }
73
- ),
74
- /* @__PURE__ */ a(
75
- "svg",
76
- {
77
- className: "hidden h-full w-full",
78
- fill: "none",
79
- stroke: "currentColor",
80
- strokeWidth: "2",
81
- viewBox: "0 0 24 24",
82
- children: [
83
- /* @__PURE__ */ r("path", { d: "M12 2L2 7l10 5 10-5-10-5z" }),
84
- /* @__PURE__ */ r("path", { d: "M2 17l10 5 10-5M2 12l10 5 10-5" })
85
- ]
86
- }
87
- )
88
- ] }),
89
- (l || d) && /* @__PURE__ */ a("div", { className: "flex flex-col gap-1", children: [
90
- l && /* @__PURE__ */ r(
91
- "h1",
92
- {
93
- className: "m-0 inline-flex items-baseline text-[1.375rem] font-bold leading-[1.2] tracking-[0.05em] text-[var(--md-on-surface)] max-md:text-xl",
94
- style: { fontFamily: "var(--font-logo)" },
95
- children: l
96
- }
97
- ),
98
- d && /* @__PURE__ */ r("p", { className: "m-0 text-[0.8125rem] font-normal text-[var(--md-on-surface-variant)] max-md:text-xs", children: d })
99
- ] })
100
- ]
101
- }
63
+ /* @__PURE__ */ t("div", { className: "flex min-w-0 items-center gap-3", children: [
64
+ A && /* @__PURE__ */ e(
65
+ "button",
66
+ {
67
+ "aria-expanded": w,
68
+ "aria-label": j,
69
+ className: o(
70
+ x,
71
+ "inline-flex size-10 shrink-0 cursor-pointer items-center justify-center rounded-sbk-sm text-sbk-fg hover:bg-sbk-surface-hover",
72
+ p
73
+ ),
74
+ onClick: y,
75
+ type: "button",
76
+ children: /* @__PURE__ */ e(H, { "aria-hidden": "true", className: "size-5" })
77
+ }
78
+ ),
79
+ d ? /* @__PURE__ */ e(
80
+ "button",
81
+ {
82
+ className: o(
83
+ x,
84
+ "flex min-w-0 cursor-pointer items-center gap-3 rounded-sbk-xs",
85
+ p
102
86
  ),
103
- m && /* @__PURE__ */ r("div", { className: "flex shrink-0 items-center gap-3 max-md:w-full max-md:flex-wrap max-md:justify-between", children: m })
104
- ]
105
- }
106
- )
87
+ onClick: d,
88
+ type: "button",
89
+ children: b
90
+ }
91
+ ) : /* @__PURE__ */ e("div", { className: "flex min-w-0 items-center gap-3", children: b })
92
+ ] }),
93
+ c && /* @__PURE__ */ e("nav", { "aria-label": "Principal", className: "hidden min-w-0 flex-1 justify-center md:flex", children: c }),
94
+ /* @__PURE__ */ t("div", { className: "flex shrink-0 items-center gap-2", children: [
95
+ z,
96
+ a && /* @__PURE__ */ e(
97
+ "span",
98
+ {
99
+ "aria-label": `Usuário: ${a}`,
100
+ className: "inline-flex size-9 shrink-0 select-none items-center justify-center rounded-full bg-sbk-ciano text-[0.8125rem] font-semibold text-sbk-branco",
101
+ role: "img",
102
+ children: a
103
+ }
104
+ )
105
+ ] })
107
106
  ]
108
107
  }
109
108
  );
110
109
  };
110
+ B.displayName = "Header";
111
111
  export {
112
- M as Header
112
+ B as Header
113
113
  };
114
114
  //# sourceMappingURL=Header.js.map