@sbkbs/ui 1.0.6 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +12 -6
- 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 -115
- 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 +25 -14
- package/dist/components/Header/Header.js +88 -148
- 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 +12 -6
- 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 +11 -3
- 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 +41 -53
- 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 +327 -294
- 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 -117
- 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
- package/dist/sbk-icon.png +0 -0
|
@@ -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":";;;AAeO,MAAMA,IAAwC,CAAC;AAAA,EACpD,OAAAC;AAAA,EACA,YAAAC;AAAA,EACA,OAAAC;AAAA,EACA,QAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,cAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,UAAAC;AAAA,EACA,WAAAC;AACF,MAAM;AACJ,QAAMC,IAAWC,EAAyB,IAAI,GACxC,CAACC,GAAYC,CAAa,IAAIC,EAAS,EAAK,GAC5C,CAACC,GAAWC,CAAY,IAAIF,EAAwB,IAAI,GAExDG,IAAc,CAACC,MAA8B;AACjD,QAAI,CAACA,EAAU;AACf,UAAMC,IAAQ,MAAM,KAAKD,CAAQ;AAEjC,QAAIZ,GAAc;AAChB,YAAMc,IAAYD,EAAM,KAAK,CAACE,MAAMA,EAAE,OAAOf,CAAY;AACzD,UAAIc,GAAW;AACb,cAAME,KAAMhB,IAAe,OAAO,MAAM,QAAQ,CAAC;AACjD,QAAAU,EAAa,YAAYI,EAAU,IAAI,gCAAgCE,CAAE,MAAM;AAC/E;AAAA,MACF;AAAA,IACF;AAEA,IAAAN,EAAa,IAAI,GACjBR,KAAA,QAAAA,EAAWW;AAAA,EACb,GAEMI,IAAiB,CAACC,MAAuB;AAC7C,IAAAA,EAAE,eAAA,GACGjB,KAAUM,EAAc,EAAI;AAAA,EACnC,GAEMY,IAAkB,MAAMZ,EAAc,EAAK,GAE3Ca,IAAa,CAACF,MAAuB;AACzC,IAAAA,EAAE,eAAA,GACFX,EAAc,EAAK,GACdN,KAAUU,EAAYO,EAAE,aAAa,KAAK;AAAA,EACjD,GAEMG,IAAgB,CAACH,MAA2B;;AAChD,KAAIA,EAAE,QAAQ,WAAWA,EAAE,QAAQ,SACjCA,EAAE,eAAA,IACFI,IAAAlB,EAAS,YAAT,QAAAkB,EAAkB;AAAA,EAEtB,GAEMC,IAAe1B,KAASY;AAE9B,2BACG,OAAA,EAAI,WAAWe,EAAG,yCAAyCrB,CAAS,GAClE,UAAA;AAAA,IAAAR,KACC,gBAAA8B,EAAC,QAAA,EAAK,WAAU,6FACb,UAAA9B,GACH;AAAA,IAEF,gBAAA+B;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,iBAAezB;AAAA,QACf,WAAWuB;AAAA,UACT;AAAA,UACAlB,IACI,gEACA;AAAA,UACJiB,KAAgB;AAAA,UAChBtB,KAAY;AAAA,QAAA;AAAA,QAEd,SAAS,MAAA;;AAAM,kBAACA,OAAYqB,IAAAlB,EAAS,YAAT,gBAAAkB,EAAkB;AAAA;AAAA,QAC9C,aAAaH;AAAA,QACb,YAAYF;AAAA,QACZ,QAAQG;AAAA,QACR,WAAWC;AAAA,QACX,MAAK;AAAA,QACL,UAAUpB,IAAW,KAAK;AAAA,QAG1B,UAAA;AAAA,UAAA,gBAAAwB;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,MAAK;AAAA,cACL,QAAO;AAAA,cACP,aAAY;AAAA,cACZ,SAAQ;AAAA,cAER,UAAA,gBAAAA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,GAAE;AAAA,kBACF,eAAc;AAAA,kBACd,gBAAe;AAAA,gBAAA;AAAA,cAAA;AAAA,YACjB;AAAA,UAAA;AAAA,4BAED,OAAA,EACC,UAAA;AAAA,YAAA,gBAAAC,EAAC,KAAA,EAAE,WAAU,kDAAiD,UAAA;AAAA,cAAA;AAAA,cACnC;AAAA,cACzB,gBAAAD,EAAC,QAAA,EAAK,WAAU,sCAAqC,UAAA,yBAAA,CAAsB;AAAA,YAAA,GAC7E;AAAA,YACC3B,KACC,gBAAA4B,EAAC,KAAA,EAAE,WAAU,2CAA0C,UAAA;AAAA,cAAA;AAAA,cAAmB5B;AAAA,YAAA,GAAO;AAAA,YAElFE,KACC,gBAAA0B,EAAC,KAAA,EAAE,WAAU,oCAAmC,UAAA;AAAA,cAAA;AAAA,eAC5B1B,IAAe,OAAO,MAAM,QAAQ,CAAC;AAAA,cAAE;AAAA,YAAA,EAAA,CAC3D;AAAA,UAAA,EAAA,CAEJ;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAEF,gBAAAyB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAKrB;AAAA,QACL,QAAAN;AAAA,QACA,WAAU;AAAA,QACV,UAAAG;AAAA,QACA,UAAAF;AAAA,QACA,UAAU;AAAA,QACV,MAAK;AAAA,QACL,UAAU,CAACmB,MAAMP,EAAYO,EAAE,OAAO,KAAK;AAAA,MAAA;AAAA,IAAA;AAAA,IAE5CK,KACC,gBAAAE,EAAC,QAAA,EAAK,WAAU,qDAAoD,MAAK,SACtE,UAAAF,GACH;AAAA,IAED3B,KAAc,CAAC2B,uBACb,QAAA,EAAK,WAAU,kEACb,UAAA3B,EAAA,CACH;AAAA,EAAA,GAEJ;AAEJ;AAEAF,EAAW,cAAc;"}
|
|
1
|
+
{"version":3,"file":"FileUpload.js","sources":["../../../src/components/FileUpload/FileUpload.tsx"],"sourcesContent":["import React, { useId, useRef, useState } from 'react';\r\nimport { FileText, UploadCloud, X } from 'lucide-react';\r\nimport { cn } from '../../utils/cn';\r\nimport { buttonReset, focusRing, transitionColors } from '../../utils/styles';\r\nimport { Field } from '../Field/Field';\r\n\r\nexport interface FileUploadProps {\r\n accept?: string;\r\n className?: string;\r\n disabled?: boolean;\r\n error?: string;\r\n helperText?: string;\r\n id?: string;\r\n label?: React.ReactNode;\r\n maxSizeBytes?: number;\r\n multiple?: boolean;\r\n onChange?: (files: File[]) => void;\r\n /** Lista os arquivos selecionados com opção de remover. Padrão: true. */\r\n showFileList?: boolean;\r\n}\r\n\r\nconst formatSize = (bytes: number) =>\r\n bytes >= 1024 * 1024\r\n ? `${(bytes / 1024 / 1024).toFixed(1)} MB`\r\n : `${Math.max(1, Math.round(bytes / 1024))} KB`;\r\n\r\n/** Área de upload com arrastar e soltar, acessível por teclado. */\r\nexport const FileUpload = ({\r\n label,\r\n helperText,\r\n error,\r\n accept,\r\n multiple = false,\r\n maxSizeBytes,\r\n disabled = false,\r\n showFileList = true,\r\n onChange,\r\n id,\r\n className,\r\n}: FileUploadProps) => {\r\n const autoId = useId();\r\n const inputId = id ?? autoId;\r\n const inputRef = useRef<HTMLInputElement>(null);\r\n const [isDragging, setIsDragging] = useState(false);\r\n const [sizeError, setSizeError] = useState<string | null>(null);\r\n const [files, setFiles] = useState<File[]>([]);\r\n\r\n const commit = (next: File[]) => {\r\n setFiles(next);\r\n onChange?.(next);\r\n };\r\n\r\n const handleFiles = (fileList: FileList | null) => {\r\n if (!fileList || fileList.length === 0) return;\r\n const incoming = Array.from(fileList);\r\n if (maxSizeBytes) {\r\n const oversized = incoming.find((f) => f.size > maxSizeBytes);\r\n if (oversized) {\r\n setSizeError(\r\n `Arquivo \"${oversized.name}\" excede o tamanho máximo de ${formatSize(maxSizeBytes)}.`,\r\n );\r\n return;\r\n }\r\n }\r\n setSizeError(null);\r\n commit(multiple ? [...files, ...incoming] : incoming.slice(0, 1));\r\n };\r\n\r\n const displayError = error ?? sizeError ?? undefined;\r\n const hints = [\r\n accept && `Formatos aceitos: ${accept}`,\r\n maxSizeBytes && `Tamanho máximo: ${formatSize(maxSizeBytes)}`,\r\n ]\r\n .filter(Boolean)\r\n .join(' · ');\r\n\r\n return (\r\n <Field\r\n className={className}\r\n error={displayError}\r\n helperText={helperText}\r\n id={inputId}\r\n label={label}\r\n labelAs=\"span\"\r\n >\r\n <div\r\n aria-describedby={\r\n displayError ? `${inputId}-error` : helperText ? `${inputId}-helper` : undefined\r\n }\r\n aria-disabled={disabled || undefined}\r\n aria-labelledby={label ? `${inputId}-label` : undefined}\r\n className={cn(\r\n 'flex cursor-pointer flex-col items-center justify-center gap-2 rounded-sbk-md border-2 border-dashed p-8 text-center',\r\n transitionColors,\r\n focusRing,\r\n isDragging\r\n ? 'border-sbk-primary bg-sbk-primary-subtle'\r\n : 'border-sbk-line-strong bg-sbk-surface hover:border-sbk-primary hover:bg-sbk-surface-hover',\r\n displayError && 'border-sbk-error',\r\n disabled && 'pointer-events-none opacity-60',\r\n )}\r\n onClick={() => !disabled && inputRef.current?.click()}\r\n onDragLeave={() => setIsDragging(false)}\r\n onDragOver={(e) => {\r\n e.preventDefault();\r\n if (!disabled) setIsDragging(true);\r\n }}\r\n onDrop={(e) => {\r\n e.preventDefault();\r\n setIsDragging(false);\r\n if (!disabled) handleFiles(e.dataTransfer.files);\r\n }}\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter' || e.key === ' ') {\r\n e.preventDefault();\r\n inputRef.current?.click();\r\n }\r\n }}\r\n role=\"button\"\r\n tabIndex={disabled ? -1 : 0}\r\n >\r\n <UploadCloud aria-hidden=\"true\" className=\"size-8 text-sbk-primary\" strokeWidth={1.5} />\r\n <p className=\"m-0 text-sm font-light text-sbk-fg\">\r\n Arraste arquivos aqui ou{' '}\r\n <span className=\"font-semibold text-sbk-primary underline\">clique para selecionar</span>\r\n </p>\r\n {hints && <p className=\"m-0 text-xs font-light text-sbk-fg-muted\">{hints}</p>}\r\n </div>\r\n <input\r\n ref={inputRef}\r\n accept={accept}\r\n className=\"sr-only\"\r\n disabled={disabled}\r\n id={inputId}\r\n multiple={multiple}\r\n onChange={(e) => {\r\n handleFiles(e.target.files);\r\n e.target.value = '';\r\n }}\r\n tabIndex={-1}\r\n type=\"file\"\r\n />\r\n {showFileList && files.length > 0 && (\r\n <ul aria-label=\"Arquivos selecionados\" className=\"m-0 grid list-none gap-1.5 p-0\">\r\n {files.map((file, index) => (\r\n <li\r\n key={`${file.name}-${index}`}\r\n className=\"flex items-center gap-2 rounded-sbk-sm border border-sbk-line bg-sbk-surface px-3 py-2 text-sm\"\r\n >\r\n <FileText aria-hidden=\"true\" className=\"size-4 shrink-0 text-sbk-fg-muted\" />\r\n <span className=\"min-w-0 flex-1 truncate font-light text-sbk-fg\">{file.name}</span>\r\n <span className=\"shrink-0 text-xs font-light text-sbk-fg-muted\">\r\n {formatSize(file.size)}\r\n </span>\r\n <button\r\n aria-label={`Remover ${file.name}`}\r\n className={cn(\r\n buttonReset,\r\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',\r\n focusRing,\r\n )}\r\n disabled={disabled}\r\n onClick={() => commit(files.filter((_, i) => i !== index))}\r\n type=\"button\"\r\n >\r\n <X aria-hidden=\"true\" className=\"size-4\" />\r\n </button>\r\n </li>\r\n ))}\r\n </ul>\r\n )}\r\n </Field>\r\n );\r\n};\r\n\r\nFileUpload.displayName = 'FileUpload';\r\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,119 +1,51 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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
|
|
26
38
|
),
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
}
|
|
37
|
-
),
|
|
38
|
-
/* @__PURE__ */ e(
|
|
39
|
-
"path",
|
|
40
|
-
{
|
|
41
|
-
d: "m443.77 264.39v-150.53h13.53v150.53zm88.07 0l-73.7-81.61 67.03-68.92h18.12l-68.91 67.88 75.99 82.65z",
|
|
42
|
-
fill: t,
|
|
43
|
-
stroke: t,
|
|
44
|
-
strokeMiterlimit: 10,
|
|
45
|
-
strokeWidth: 2
|
|
46
|
-
}
|
|
47
|
-
)
|
|
48
|
-
] }),
|
|
49
|
-
/* @__PURE__ */ i("g", { children: [
|
|
50
|
-
/* @__PURE__ */ e(
|
|
51
|
-
"path",
|
|
52
|
-
{
|
|
53
|
-
d: "m99.09 118.17l-0.21 57.98-9.73 0.24 0.56-62.81c0.26-29.03 26.91-53.16 56.3-53.26l151.74-0.48c0.62 3.58 0.63 6.35 0.05 9.92l-150.35 0.22c-26.28 0.04-48.26 21.9-48.36 48.19z",
|
|
54
|
-
fill: t
|
|
55
|
-
}
|
|
56
|
-
),
|
|
57
|
-
/* @__PURE__ */ e(
|
|
58
|
-
"path",
|
|
59
|
-
{
|
|
60
|
-
d: "m419.9 315.79l0.22-9.33 149.3-0.15c25.73-0.02 48.97-20.27 49.14-45.96l0.4-60.49q4.64-0.28 9.57-0.07l0.32 52.61c0.21 33.16-23.62 63.29-57.93 63.33l-135.88 0.19z",
|
|
61
|
-
fill: t
|
|
62
|
-
}
|
|
63
|
-
)
|
|
64
|
-
] })
|
|
65
|
-
] }) })
|
|
66
|
-
}
|
|
67
|
-
);
|
|
68
|
-
}, b = ({
|
|
69
|
-
poweredByText: t = "Powered by",
|
|
70
|
-
logoSrc: r,
|
|
71
|
-
logoAlt: s = "SBK",
|
|
72
|
-
className: o = ""
|
|
73
|
-
}) => {
|
|
74
|
-
const [n, m] = h(() => d());
|
|
75
|
-
f(() => {
|
|
76
|
-
const a = () => m(d());
|
|
77
|
-
if (a(), typeof MutationObserver > "u") return;
|
|
78
|
-
const c = new MutationObserver(a);
|
|
79
|
-
return c.observe(document.documentElement, { attributes: !0, attributeFilter: ["data-theme"] }), () => c.disconnect();
|
|
80
|
-
}, []);
|
|
81
|
-
const l = n === "dark";
|
|
82
|
-
return /* @__PURE__ */ e(
|
|
83
|
-
"footer",
|
|
84
|
-
{
|
|
85
|
-
className: u(
|
|
86
|
-
"relative z-[1] w-full shrink-0 box-border",
|
|
87
|
-
"flex items-center justify-center",
|
|
88
|
-
"py-5 px-14",
|
|
89
|
-
"border-t border-[var(--border-color)]",
|
|
90
|
-
"bg-[var(--bg-secondary)]",
|
|
91
|
-
o
|
|
92
|
-
),
|
|
93
|
-
children: /* @__PURE__ */ i("div", { className: "flex items-center gap-2.5", children: [
|
|
94
|
-
t && /* @__PURE__ */ e("span", { className: "font-primary text-xs font-normal text-[var(--text-muted)]", children: t }),
|
|
95
|
-
r ? /* @__PURE__ */ e(
|
|
96
|
-
"img",
|
|
97
|
-
{
|
|
98
|
-
alt: s,
|
|
99
|
-
src: r,
|
|
100
|
-
className: "h-7 w-auto object-contain",
|
|
101
|
-
style: { opacity: l ? 0.65 : 0.75 }
|
|
102
|
-
}
|
|
103
|
-
) : /* @__PURE__ */ e(
|
|
104
|
-
p,
|
|
105
|
-
{
|
|
106
|
-
color: l ? "#ffffff" : "#1F3A3A",
|
|
107
|
-
height: 28,
|
|
108
|
-
opacity: l ? 0.65 : 0.75
|
|
109
|
-
}
|
|
110
|
-
)
|
|
111
|
-
] })
|
|
112
|
-
}
|
|
113
|
-
);
|
|
114
|
-
};
|
|
115
|
-
b.displayName = "Footer";
|
|
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";
|
|
116
48
|
export {
|
|
117
|
-
|
|
49
|
+
x as Footer
|
|
118
50
|
};
|
|
119
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';\r\nimport { cn } from '../../utils/cn';\r\nimport { focusRing } from '../../utils/styles';\r\nimport { Logo, type LogoVariant } from '../Logo/Logo';\r\n\r\nexport interface FooterLink {\r\n href: string;\r\n label: React.ReactNode;\r\n}\r\n\r\nexport interface FooterProps {\r\n className?: string;\r\n /** Texto de copyright (ex.: \"© 2026 SBK\"). */\r\n copyright?: React.ReactNode;\r\n /** Links institucionais (privacidade, termos, suporte). */\r\n links?: FooterLink[];\r\n logoAlt?: string;\r\n /** @deprecated Não utilizado. Mantido por compatibilidade com a 1.x. */\r\n logoFallbackText?: string;\r\n /** Imagem de logo customizada (substitui o SVG oficial). */\r\n logoSrc?: string;\r\n logoVariant?: LogoVariant;\r\n /** Texto antes do logo. Padrão: \"Powered by\". Use \"\" para ocultar. */\r\n poweredByText?: string;\r\n /** `default`: superfície clara. `inverse`: verde escuro. `glass`: Liquid Glass. */\r\n variant?: 'default' | 'inverse' | 'glass';\r\n}\r\n\r\nconst VARIANT_CLASS = {\r\n default: 'border-t border-sbk-line bg-sbk-surface',\r\n inverse:\r\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)]',\r\n glass: 'sbk-glass rounded-none border-x-0 border-b-0',\r\n} as const;\r\n\r\nexport const Footer = ({\r\n poweredByText = 'Powered by',\r\n logoSrc,\r\n logoAlt = 'SBK',\r\n logoVariant = 'sbk',\r\n links,\r\n copyright,\r\n variant = 'default',\r\n className,\r\n}: FooterProps) => (\r\n <footer\r\n className={cn(\r\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',\r\n (links || copyright) && 'md:justify-between',\r\n VARIANT_CLASS[variant],\r\n className,\r\n )}\r\n >\r\n <div className=\"flex items-center gap-2.5\">\r\n {poweredByText && (\r\n <span className=\"text-xs font-light text-sbk-fg-muted\">{poweredByText}</span>\r\n )}\r\n {logoSrc ? (\r\n <img alt={logoAlt} className=\"h-7 w-auto object-contain\" src={logoSrc} />\r\n ) : (\r\n <Logo color={variant === 'inverse' ? 'white' : 'auto'} height={22} variant={logoVariant} />\r\n )}\r\n </div>\r\n {links && links.length > 0 && (\r\n <nav aria-label=\"Rodapé\">\r\n <ul className=\"m-0 flex list-none flex-wrap gap-x-5 gap-y-2 p-0\">\r\n {links.map((link) => (\r\n <li key={link.href}>\r\n <a\r\n className={cn(\r\n 'rounded-sbk-xs text-xs font-light text-sbk-fg-muted underline-offset-4 hover:text-sbk-fg-heading hover:underline',\r\n focusRing,\r\n )}\r\n href={link.href}\r\n >\r\n {link.label}\r\n </a>\r\n </li>\r\n ))}\r\n </ul>\r\n </nav>\r\n )}\r\n {copyright && <p className=\"m-0 text-xs font-light text-sbk-fg-muted\">{copyright}</p>}\r\n </footer>\r\n);\r\n\r\nFooter.displayName = 'Footer';\r\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';\r\nimport { cn } from '../../utils/cn';\r\n\r\nexport interface GlassPanelProps extends React.HTMLAttributes<HTMLDivElement> {\r\n as?: 'div' | 'section' | 'aside' | 'header' | 'nav' | 'footer';\r\n /** Intensidade do desfoque. Padrão: md (20px). */\r\n blur?: 'sm' | 'md' | 'lg';\r\n padding?: 'none' | 'sm' | 'md' | 'lg';\r\n radius?: 'sm' | 'md' | 'lg' | 'full';\r\n /** Aumenta a opacidade do fundo para melhorar a leitura sobre imagens movimentadas. */\r\n strong?: boolean;\r\n}\r\n\r\nconst BLUR = { sm: '12px', md: '20px', lg: '32px' } as const;\r\nconst PADDING = { none: 'p-0', sm: 'p-3', md: 'p-5', lg: 'p-8' } as const;\r\nconst RADIUS = {\r\n sm: 'rounded-sbk-sm',\r\n md: 'rounded-sbk-md',\r\n lg: 'rounded-sbk-lg',\r\n full: 'rounded-full',\r\n} as const;\r\n\r\n/**\r\n * Superfície \"Liquid Glass\" (inspirada no material da Apple): translucidez tingida de verde,\r\n * desfoque com saturação, borda especular e brilho interno.\r\n *\r\n * Acessibilidade: em `prefers-reduced-transparency` ou sem suporte a `backdrop-filter`,\r\n * cai para superfície opaca. Garanta contraste do texto sobre o conteúdo de fundo.\r\n */\r\nexport const GlassPanel = React.forwardRef<HTMLDivElement, GlassPanelProps>(\r\n (\r\n {\r\n as: Tag = 'div',\r\n blur = 'md',\r\n padding = 'md',\r\n radius = 'md',\r\n strong = false,\r\n className,\r\n style,\r\n ...props\r\n },\r\n ref,\r\n ) => (\r\n <Tag\r\n ref={ref}\r\n className={cn(\r\n 'sbk-glass text-sbk-fg',\r\n strong && 'sbk-glass-strong',\r\n PADDING[padding],\r\n RADIUS[radius],\r\n className,\r\n )}\r\n style={{ '--sbk-glass-blur': BLUR[blur], ...style } as React.CSSProperties}\r\n {...props}\r\n />\r\n ),\r\n);\r\n\r\nGlassPanel.displayName = 'GlassPanel';\r\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,29 +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
|
-
|
|
14
|
-
/**
|
|
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;
|
|
15
21
|
onLogoClick?: () => void;
|
|
16
|
-
|
|
22
|
+
onMenuClick?: () => void;
|
|
23
|
+
/** Conteúdo à direita (ações, seletor de tema, menu do usuário). */
|
|
17
24
|
rightContent?: React.ReactNode;
|
|
18
|
-
/** Exibe o ícone hamburger à esquerda — padrão: true */
|
|
19
25
|
showMenuIcon?: boolean;
|
|
20
|
-
/**
|
|
26
|
+
/** Fixa o header no topo. Padrão: true. */
|
|
27
|
+
sticky?: boolean;
|
|
21
28
|
subtitle?: React.ReactNode;
|
|
22
|
-
/** Tema
|
|
29
|
+
/** Tema para escolher entre logoSrc e logoDarkSrc sem depender do ThemeProvider. */
|
|
23
30
|
theme?: Theme;
|
|
24
|
-
/** Título exibido ao lado do logo */
|
|
25
31
|
title?: React.ReactNode;
|
|
26
|
-
/** Iniciais do usuário no avatar
|
|
32
|
+
/** Iniciais do usuário exibidas no avatar (ex.: "CF"). */
|
|
27
33
|
userInitials?: string;
|
|
34
|
+
/** `solid`: verde escuro (padrão). `light`: superfície clara. `glass`: Liquid Glass. */
|
|
35
|
+
variant?: HeaderVariant;
|
|
28
36
|
}
|
|
29
|
-
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
|
+
};
|