@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.
- package/CHANGELOG.md +57 -0
- package/MIGRATION.md +96 -0
- package/README.md +221 -115
- package/dist/assets/favicon/apple-touch-icon.png +0 -0
- package/dist/assets/favicon/favicon-96x96.png +0 -0
- package/dist/assets/favicon/favicon.ico +0 -0
- package/dist/assets/favicon/favicon.svg +1 -0
- package/dist/assets/favicon/site.webmanifest +21 -0
- package/dist/assets/favicon/web-app-manifest-192x192.png +0 -0
- package/dist/assets/favicon/web-app-manifest-512x512.png +0 -0
- package/dist/base.css +38 -0
- package/dist/components/Accordion/Accordion.d.ts +13 -1
- package/dist/components/Accordion/Accordion.js +100 -52
- package/dist/components/Accordion/Accordion.js.map +1 -1
- package/dist/components/Alert/Alert.d.ts +17 -4
- package/dist/components/Alert/Alert.js +64 -20
- package/dist/components/Alert/Alert.js.map +1 -1
- package/dist/components/Avatar/Avatar.d.ts +17 -0
- package/dist/components/Avatar/Avatar.js +66 -0
- package/dist/components/Avatar/Avatar.js.map +1 -0
- package/dist/components/Badge/Badge.d.ts +11 -2
- package/dist/components/Badge/Badge.js +42 -30
- package/dist/components/Badge/Badge.js.map +1 -1
- package/dist/components/Breadcrumb/Breadcrumb.d.ts +5 -2
- package/dist/components/Breadcrumb/Breadcrumb.js +23 -16
- package/dist/components/Breadcrumb/Breadcrumb.js.map +1 -1
- package/dist/components/Button/Button.d.ts +10 -8
- package/dist/components/Button/Button.js +73 -114
- package/dist/components/Button/Button.js.map +1 -1
- package/dist/components/Card/Card.d.ts +33 -3
- package/dist/components/Card/Card.js +91 -30
- package/dist/components/Card/Card.js.map +1 -1
- package/dist/components/Checkbox/Checkbox.d.ts +4 -1
- package/dist/components/Checkbox/Checkbox.js +32 -31
- package/dist/components/Checkbox/Checkbox.js.map +1 -1
- package/dist/components/Chip/Chip.d.ts +7 -1
- package/dist/components/Chip/Chip.js +19 -9
- package/dist/components/Chip/Chip.js.map +1 -1
- package/dist/components/Combobox/Combobox.d.ts +10 -2
- package/dist/components/Combobox/Combobox.js +146 -133
- package/dist/components/Combobox/Combobox.js.map +1 -1
- package/dist/components/Divider/Divider.d.ts +7 -1
- package/dist/components/Divider/Divider.js +28 -12
- package/dist/components/Divider/Divider.js.map +1 -1
- package/dist/components/DropdownMenu/DropdownMenu.d.ts +33 -0
- package/dist/components/DropdownMenu/DropdownMenu.js +147 -0
- package/dist/components/DropdownMenu/DropdownMenu.js.map +1 -0
- package/dist/components/EmptyState/EmptyState.d.ts +7 -1
- package/dist/components/EmptyState/EmptyState.js +28 -19
- package/dist/components/EmptyState/EmptyState.js.map +1 -1
- package/dist/components/Field/Field.d.ts +21 -0
- package/dist/components/Field/Field.js +35 -0
- package/dist/components/Field/Field.js.map +1 -0
- package/dist/components/FileUpload/FileUpload.d.ts +9 -2
- package/dist/components/FileUpload/FileUpload.js +128 -102
- package/dist/components/FileUpload/FileUpload.js.map +1 -1
- package/dist/components/Footer/Footer.d.ts +19 -6
- package/dist/components/Footer/Footer.js +47 -50
- package/dist/components/Footer/Footer.js.map +1 -1
- package/dist/components/GlassPanel/GlassPanel.d.ts +18 -0
- package/dist/components/GlassPanel/GlassPanel.js +39 -0
- package/dist/components/GlassPanel/GlassPanel.js.map +1 -0
- package/dist/components/Header/Header.d.ts +27 -10
- package/dist/components/Header/Header.js +98 -98
- package/dist/components/Header/Header.js.map +1 -1
- package/dist/components/Highlight/Highlight.d.ts +13 -0
- package/dist/components/Highlight/Highlight.js +18 -0
- package/dist/components/Highlight/Highlight.js.map +1 -0
- package/dist/components/Icon/Icon.d.ts +21 -0
- package/dist/components/Icon/Icon.js +31 -0
- package/dist/components/Icon/Icon.js.map +1 -0
- package/dist/components/IconButton/IconButton.d.ts +12 -0
- package/dist/components/IconButton/IconButton.js +49 -0
- package/dist/components/IconButton/IconButton.js.map +1 -0
- package/dist/components/Input/Input.d.ts +3 -2
- package/dist/components/Input/Input.js +51 -69
- package/dist/components/Input/Input.js.map +1 -1
- package/dist/components/Layout/Layout.d.ts +2 -0
- package/dist/components/Layout/Layout.js +24 -18
- package/dist/components/Layout/Layout.js.map +1 -1
- package/dist/components/Logo/Logo.d.ts +27 -0
- package/dist/components/Logo/Logo.js +107 -0
- package/dist/components/Logo/Logo.js.map +1 -0
- package/dist/components/MiniCard/MiniCard.d.ts +21 -0
- package/dist/components/MiniCard/MiniCard.js +90 -0
- package/dist/components/MiniCard/MiniCard.js.map +1 -0
- package/dist/components/Modal/Modal.d.ts +16 -3
- package/dist/components/Modal/Modal.js +124 -93
- package/dist/components/Modal/Modal.js.map +1 -1
- package/dist/components/Navigation/Navigation.d.ts +1 -0
- package/dist/components/Navigation/Navigation.js +14 -14
- package/dist/components/Navigation/Navigation.js.map +1 -1
- package/dist/components/NumberInput/NumberInput.d.ts +5 -2
- package/dist/components/NumberInput/NumberInput.js +98 -128
- package/dist/components/NumberInput/NumberInput.js.map +1 -1
- package/dist/components/PageHeader/PageHeader.d.ts +8 -1
- package/dist/components/PageHeader/PageHeader.js +26 -25
- package/dist/components/PageHeader/PageHeader.js.map +1 -1
- package/dist/components/Pagination/Pagination.d.ts +15 -2
- package/dist/components/Pagination/Pagination.js +68 -34
- package/dist/components/Pagination/Pagination.js.map +1 -1
- package/dist/components/Paragraph/Paragraph.d.ts +8 -2
- package/dist/components/Paragraph/Paragraph.js +39 -36
- package/dist/components/Paragraph/Paragraph.js.map +1 -1
- package/dist/components/Popover/Popover.d.ts +12 -1
- package/dist/components/Popover/Popover.js +49 -37
- package/dist/components/Popover/Popover.js.map +1 -1
- package/dist/components/ProgressBar/ProgressBar.d.ts +18 -0
- package/dist/components/ProgressBar/ProgressBar.js +71 -0
- package/dist/components/ProgressBar/ProgressBar.js.map +1 -0
- package/dist/components/Radio/Radio.d.ts +2 -1
- package/dist/components/Radio/Radio.js +27 -31
- package/dist/components/Radio/Radio.js.map +1 -1
- package/dist/components/SectionHeader/SectionHeader.d.ts +6 -1
- package/dist/components/SectionHeader/SectionHeader.js +14 -12
- package/dist/components/SectionHeader/SectionHeader.js.map +1 -1
- package/dist/components/Select/Select.d.ts +6 -2
- package/dist/components/Select/Select.js +47 -35
- package/dist/components/Select/Select.js.map +1 -1
- package/dist/components/SideNav/SideNav.d.ts +55 -0
- package/dist/components/SideNav/SideNav.js +141 -0
- package/dist/components/SideNav/SideNav.js.map +1 -0
- package/dist/components/Skeleton/Skeleton.d.ts +12 -1
- package/dist/components/Skeleton/Skeleton.js +33 -18
- package/dist/components/Skeleton/Skeleton.js.map +1 -1
- package/dist/components/Spinner/Spinner.d.ts +15 -0
- package/dist/components/Spinner/Spinner.js +57 -0
- package/dist/components/Spinner/Spinner.js.map +1 -0
- package/dist/components/Stepper/Stepper.d.ts +1 -1
- package/dist/components/Stepper/Stepper.js +68 -55
- package/dist/components/Stepper/Stepper.js.map +1 -1
- package/dist/components/Subtitle/Subtitle.d.ts +9 -3
- package/dist/components/Subtitle/Subtitle.js +29 -35
- package/dist/components/Subtitle/Subtitle.js.map +1 -1
- package/dist/components/Switch/Switch.d.ts +2 -1
- package/dist/components/Switch/Switch.js +45 -33
- package/dist/components/Switch/Switch.js.map +1 -1
- package/dist/components/Table/Table.d.ts +19 -1
- package/dist/components/Table/Table.js +48 -11
- package/dist/components/Table/Table.js.map +1 -1
- package/dist/components/Tabs/Tabs.d.ts +16 -2
- package/dist/components/Tabs/Tabs.js +80 -44
- package/dist/components/Tabs/Tabs.js.map +1 -1
- package/dist/components/Tag/Tag.d.ts +8 -1
- package/dist/components/Tag/Tag.js +27 -12
- package/dist/components/Tag/Tag.js.map +1 -1
- package/dist/components/Textarea/Textarea.d.ts +3 -1
- package/dist/components/Textarea/Textarea.js +36 -40
- package/dist/components/Textarea/Textarea.js.map +1 -1
- package/dist/components/Title/Title.d.ts +9 -3
- package/dist/components/Title/Title.js +42 -42
- package/dist/components/Title/Title.js.map +1 -1
- package/dist/components/Toast/Toast.d.ts +39 -11
- package/dist/components/Toast/Toast.js +130 -76
- package/dist/components/Toast/Toast.js.map +1 -1
- package/dist/components/Tooltip/Tooltip.d.ts +12 -2
- package/dist/components/Tooltip/Tooltip.js +50 -32
- package/dist/components/Tooltip/Tooltip.js.map +1 -1
- package/dist/components/Typography/weight.d.ts +9 -0
- package/dist/components/Typography/weight.js +5 -0
- package/dist/components/Typography/weight.js.map +1 -0
- package/dist/fonts.css +8 -0
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +55 -43
- package/dist/index.js +118 -83
- package/dist/index.js.map +1 -1
- package/dist/reset.css +9 -0
- package/dist/styles.css +1 -0
- package/dist/tailwind.css +153 -0
- package/dist/theme/ThemeProvider.d.ts +21 -3
- package/dist/theme/ThemeProvider.js +57 -18
- package/dist/theme/ThemeProvider.js.map +1 -1
- package/dist/theme/tokens.d.ts +43 -0
- package/dist/theme/tokens.js +39 -0
- package/dist/theme/tokens.js.map +1 -0
- package/dist/theme.css +296 -261
- package/dist/tokens.css +327 -0
- package/dist/utils/cn.d.ts +2 -2
- package/dist/utils/cn.js +19 -4
- package/dist/utils/cn.js.map +1 -1
- package/dist/utils/styles.d.ts +37 -0
- package/dist/utils/styles.js +35 -0
- package/dist/utils/styles.js.map +1 -0
- package/package.json +140 -114
- package/dist/components/Accordion/Accordion.stories.d.ts +0 -7
- package/dist/components/Alert/Alert.stories.d.ts +0 -8
- package/dist/components/Badge/Badge.stories.d.ts +0 -8
- package/dist/components/Breadcrumb/Breadcrumb.stories.d.ts +0 -8
- package/dist/components/Button/Button.stories.d.ts +0 -7
- package/dist/components/Card/Card.stories.d.ts +0 -8
- package/dist/components/Checkbox/Checkbox.stories.d.ts +0 -7
- package/dist/components/Combobox/Combobox.stories.d.ts +0 -9
- package/dist/components/Feedback/Feedback.stories.d.ts +0 -5
- package/dist/components/FileUpload/FileUpload.stories.d.ts +0 -10
- package/dist/components/Input/Input.stories.d.ts +0 -9
- package/dist/components/Modal/Modal.stories.d.ts +0 -8
- package/dist/components/NumberInput/NumberInput.stories.d.ts +0 -8
- package/dist/components/Pagination/Pagination.stories.d.ts +0 -8
- package/dist/components/Radio/Radio.stories.d.ts +0 -7
- package/dist/components/Select/Select.stories.d.ts +0 -8
- package/dist/components/Stepper/Stepper.stories.d.ts +0 -8
- package/dist/components/Switch/Switch.stories.d.ts +0 -8
- package/dist/components/Tabs/Tabs.stories.d.ts +0 -8
- package/dist/components/Textarea/Textarea.stories.d.ts +0 -7
- package/dist/components/Toast/Toast.stories.d.ts +0 -8
- package/dist/oficios-ui.css +0 -1
- package/dist/oficios-ui.umd.cjs +0 -2
- 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
|
|
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
|
-
/**
|
|
14
|
+
/** @deprecated Não utilizado. Mantido por compatibilidade com a 1.x. */
|
|
8
15
|
logoFallbackText?: string;
|
|
9
|
-
/**
|
|
16
|
+
/** Imagem de logo customizada (substitui o SVG oficial). */
|
|
10
17
|
logoSrc?: string;
|
|
11
|
-
|
|
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:
|
|
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 {
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
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
|
-
|
|
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 {
|
|
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
|
|
7
|
+
/** Texto alternativo da imagem de logo customizada. */
|
|
7
8
|
logoAlt?: string;
|
|
8
|
-
/**
|
|
9
|
+
/** Imagem de logo para o tema escuro (substitui o SVG oficial). */
|
|
9
10
|
logoDarkSrc?: string;
|
|
10
|
-
/**
|
|
11
|
+
/** Imagem de logo customizada (substitui o SVG oficial). */
|
|
11
12
|
logoSrc?: string;
|
|
12
|
-
/**
|
|
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
|
-
|
|
22
|
+
onMenuClick?: () => void;
|
|
23
|
+
/** Conteúdo à direita (ações, seletor de tema, menu do usuário). */
|
|
15
24
|
rightContent?: React.ReactNode;
|
|
16
|
-
|
|
25
|
+
showMenuIcon?: boolean;
|
|
26
|
+
/** Fixa o header no topo. Padrão: true. */
|
|
27
|
+
sticky?: boolean;
|
|
17
28
|
subtitle?: React.ReactNode;
|
|
18
|
-
/** Tema
|
|
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:
|
|
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
|
|
2
|
-
import { useState as
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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 [
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
const
|
|
27
|
-
return
|
|
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
|
-
}), () =>
|
|
31
|
-
}, [s]);
|
|
32
|
-
const
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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:
|
|
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__ */
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
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
|
-
|
|
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
|
-
|
|
112
|
+
B as Header
|
|
113
113
|
};
|
|
114
114
|
//# sourceMappingURL=Header.js.map
|