@sbkbs/ui 1.0.0 → 1.0.1
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/dist/components/Button/Button.d.ts +1 -1
- package/dist/components/Card/Card.d.ts +0 -1
- package/dist/components/Footer/Footer.d.ts +0 -1
- package/dist/components/Header/Header.d.ts +0 -1
- package/dist/components/Input/Input.d.ts +0 -1
- package/dist/components/Modal/Modal.d.ts +0 -1
- package/dist/components/Paragraph/Paragraph.d.ts +0 -1
- package/dist/components/Subtitle/Subtitle.d.ts +0 -1
- package/dist/components/Title/Title.d.ts +0 -1
- package/dist/oficios-ui.css +1 -1
- package/dist/oficios-ui.js +504 -261
- package/dist/oficios-ui.js.map +1 -1
- package/dist/oficios-ui.umd.cjs +1 -1
- package/dist/oficios-ui.umd.cjs.map +1 -1
- package/dist/theme.css +1 -0
- package/package.json +1 -1
package/dist/oficios-ui.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oficios-ui.js","sources":["../src/components/Button/Button.tsx","../src/components/Card/Card.tsx","../src/components/Footer/Footer.tsx","../src/components/Header/Header.tsx","../src/components/Input/Input.tsx","../src/components/Modal/Modal.tsx","../src/components/Paragraph/Paragraph.tsx","../src/components/Subtitle/Subtitle.tsx","../src/components/Title/Title.tsx","../src/theme/ThemeProvider.tsx"],"sourcesContent":["import type React from 'react';\nimport './Button.css';\n\n/** Paletas do guia de marca (só afeta variant primary). Use para escolher o modelo de cor do botão. */\nexport type ButtonPalette =\n | 'verde-vibrante'\n | 'verde-profundo'\n | 'grafite-azulado'\n | 'azul-acinzentado'\n | 'cinza-medio'\n | 'cinza-escuro'\n | 'off-white';\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n children: React.ReactNode;\n fullWidth?: boolean;\n isLoading?: boolean;\n leftIcon?: React.ReactNode;\n /** Paleta de cor do guia de marca (aplica-se ao primary). Ignorado em outros variants. */\n palette?: ButtonPalette;\n rightIcon?: React.ReactNode;\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n variant?:\n | 'primary'\n | 'secondary'\n | 'success'\n | 'error'\n | 'warning'\n | 'info'\n | 'neutral'\n | 'ghost';\n}\n\nexport const Button: React.FC<ButtonProps> = ({\n variant = 'primary',\n size = 'md',\n fullWidth = false,\n isLoading = false,\n leftIcon,\n rightIcon,\n children,\n className = '',\n disabled,\n palette,\n ...props\n}) => {\n const baseClass = 'btn';\n const variantClass = `btn--${variant}`;\n const sizeClass = `btn--${size}`;\n const fullWidthClass = fullWidth ? 'btn--full-width' : '';\n const loadingClass = isLoading ? 'btn--loading' : '';\n const paletteClass =\n palette && variant === 'primary' ? `btn--palette-${palette}` : '';\n const combinedClass =\n `${baseClass} ${variantClass} ${sizeClass} ${fullWidthClass} ${loadingClass} ${paletteClass} ${className}`.trim();\n\n return (\n <button\n className={combinedClass}\n disabled={disabled || isLoading}\n {...props}\n >\n {isLoading && (\n <span aria-hidden=\"true\" className=\"btn__spinner\">\n <svg\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" strokeOpacity=\"0.25\" />\n <path d=\"M12 2 A10 10 0 0 1 22 12\" strokeLinecap=\"round\" />\n </svg>\n </span>\n )}\n {!isLoading && leftIcon && (\n <span className=\"btn__icon btn__icon--left\">{leftIcon}</span>\n )}\n <span className=\"btn__content\">{children}</span>\n {!isLoading && rightIcon && (\n <span className=\"btn__icon btn__icon--right\">{rightIcon}</span>\n )}\n </button>\n );\n};\n","import type React from 'react';\nimport './Card.css';\n\nexport interface CardProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n hoverable?: boolean;\n padding?: 'none' | 'sm' | 'md' | 'lg' | 'xl';\n variant?: 'default' | 'elevated' | 'outlined' | 'flat';\n}\n\nexport const Card: React.FC<CardProps> = ({\n variant = 'default',\n padding = 'md',\n hoverable = false,\n children,\n className = '',\n ...props\n}) => {\n const baseClass = 'card';\n const variantClass = `card--${variant}`;\n const paddingClass = `card--padding-${padding}`;\n const hoverableClass = hoverable ? 'card--hoverable' : '';\n const combinedClass =\n `${baseClass} ${variantClass} ${paddingClass} ${hoverableClass} ${className}`.trim();\n\n return (\n <div className={combinedClass} {...props}>\n {children}\n </div>\n );\n};\n","import type React from 'react';\nimport './Footer.css';\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 return (\n <footer className={`app-footer ${className}`.trim()}>\n <div className=\"app-footer-powered\">\n {poweredByText && (\n <span className=\"app-footer-powered-text\">{poweredByText}</span>\n )}\n {(logoSrc || logoFallbackText) && (\n <div className=\"app-footer-logo-wrap\">\n {logoSrc && (\n <img\n alt={logoAlt}\n className=\"app-footer-logo\"\n onError={(e) => {\n (e.target as HTMLImageElement).style.display = 'none';\n const next = (e.target as HTMLElement)\n .nextElementSibling as HTMLElement;\n if (next) {\n next.style.display = 'flex';\n }\n }}\n src={logoSrc}\n />\n )}\n {logoFallbackText && (\n <span\n className=\"app-footer-logo-fallback\"\n style={{ display: logoSrc ? 'none' : 'flex' }}\n >\n {logoFallbackText}\n </span>\n )}\n </div>\n )}\n </div>\n </footer>\n );\n};\n","import type React from 'react';\nimport { useEffect, useState } from 'react';\nimport type { Theme } from '../../theme/ThemeProvider';\nimport './Header.css';\n\nexport interface HeaderProps {\n /** Classe CSS adicional */\n className?: string;\n /** Texto alternativo do logo */\n logoAlt?: string;\n /** URL da imagem do logo (tema escuro). Se não informado, usa logoSrc. */\n logoDarkSrc?: string;\n /** URL da imagem do logo (tema claro) */\n logoSrc?: string;\n /** Callback ao clicar na área do logo/título */\n onLogoClick?: () => void;\n /** Conteúdo da área direita (ex.: seletor de idioma, toggle tema, menu usuário) */\n rightContent?: React.ReactNode;\n /** Subtítulo abaixo do título */\n subtitle?: React.ReactNode;\n /** Tema opcional para escolher o logo correto sem depender do ThemeProvider do UI */\n theme?: Theme;\n /** Título exibido ao lado do logo (ex.: \"OFÍCIO.IA\") */\n title?: React.ReactNode;\n}\n\nconst detectTheme = (): Theme => {\n if (typeof document === 'undefined') {\n return 'light';\n }\n\n return document.documentElement.getAttribute('data-theme') === 'dark'\n ? 'dark'\n : 'light';\n};\n\nexport const Header: React.FC<HeaderProps> = ({\n logoSrc,\n logoDarkSrc,\n logoAlt = 'Logo',\n title,\n subtitle,\n theme,\n onLogoClick,\n rightContent,\n className = '',\n}) => {\n const [isScrolled, setIsScrolled] = useState(false);\n const [resolvedTheme, setResolvedTheme] = useState<Theme>(\n () => theme ?? detectTheme()\n );\n\n const logoSrcResolved =\n resolvedTheme === 'dark' && logoDarkSrc ? logoDarkSrc : logoSrc;\n\n useEffect(() => {\n const handleScroll = () => setIsScrolled(window.scrollY > 10);\n window.addEventListener('scroll', handleScroll, { passive: true });\n return () => window.removeEventListener('scroll', handleScroll);\n }, []);\n\n useEffect(() => {\n if (theme) {\n setResolvedTheme(theme);\n return;\n }\n\n const syncTheme = () => setResolvedTheme(detectTheme());\n syncTheme();\n\n if (typeof MutationObserver === 'undefined') {\n return;\n }\n\n const observer = new MutationObserver(syncTheme);\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['data-theme'],\n });\n\n return () => observer.disconnect();\n }, [theme]);\n\n const handleClick = () => onLogoClick?.();\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter') {\n onLogoClick?.();\n }\n };\n\n return (\n <header\n className={`app-header ${isScrolled ? 'scrolled' : ''} ${className}`.trim()}\n >\n <div className=\"app-header-top-bar\" />\n <div className=\"app-header-content\">\n <div\n className=\"app-header-left\"\n onClick={onLogoClick ? handleClick : undefined}\n onKeyDown={onLogoClick ? handleKeyDown : undefined}\n role={onLogoClick ? 'button' : undefined}\n tabIndex={onLogoClick ? 0 : undefined}\n >\n {logoSrcResolved && (\n <div className=\"app-header-logo\">\n <img\n alt={logoAlt}\n onError={(e) => {\n (e.target as HTMLImageElement).style.display = 'none';\n const next = (e.target as HTMLElement)\n .nextElementSibling as HTMLElement;\n if (next) {\n next.style.display = 'block';\n }\n }}\n src={logoSrcResolved}\n />\n <svg\n className=\"logo-icon-fallback\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M12 2L2 7l10 5 10-5-10-5z\" />\n <path d=\"M2 17l10 5 10-5M2 12l10 5 10-5\" />\n </svg>\n </div>\n )}\n {(title || subtitle) && (\n <div className=\"app-header-title\">\n {title && <h1>{title}</h1>}\n {subtitle && <p>{subtitle}</p>}\n </div>\n )}\n </div>\n {rightContent && <div className=\"app-header-right\">{rightContent}</div>}\n </div>\n </header>\n );\n};\n","import type React from 'react';\nimport './Input.css';\n\nexport interface InputProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> {\n error?: string;\n fullWidth?: boolean;\n helperText?: string;\n label?: string;\n leftIcon?: React.ReactNode;\n rightIcon?: React.ReactNode;\n size?: 'sm' | 'md' | 'lg';\n}\n\nexport const Input: React.FC<InputProps> = ({\n label,\n error,\n helperText,\n leftIcon,\n rightIcon,\n fullWidth = false,\n size = 'md',\n className = '',\n id,\n ...props\n}) => {\n const inputId = id || `input-${Math.random().toString(36).substring(2, 9)}`;\n const hasError = !!error;\n const baseClass = 'input';\n const sizeClass = `input--${size}`;\n const errorClass = hasError ? 'input--error' : '';\n const fullWidthClass = fullWidth ? 'input--full-width' : '';\n const hasLeftIconClass = leftIcon ? 'input--has-left-icon' : '';\n const hasRightIconClass = rightIcon ? 'input--has-right-icon' : '';\n const combinedClass =\n `${baseClass} ${sizeClass} ${errorClass} ${fullWidthClass} ${hasLeftIconClass} ${hasRightIconClass} ${className}`.trim();\n\n return (\n <div\n className={`input-wrapper ${fullWidth ? 'input-wrapper--full-width' : ''}`}\n >\n {label && (\n <label className=\"input-label\" htmlFor={inputId}>\n {label}\n </label>\n )}\n <div className=\"input-container\">\n {leftIcon && (\n <span className=\"input-icon input-icon--left\">{leftIcon}</span>\n )}\n <input\n aria-describedby={\n error\n ? `${inputId}-error`\n : helperText\n ? `${inputId}-helper`\n : undefined\n }\n aria-invalid={hasError ? true : undefined}\n className={combinedClass}\n id={inputId}\n {...props}\n />\n {rightIcon && (\n <span className=\"input-icon input-icon--right\">{rightIcon}</span>\n )}\n </div>\n {error && (\n <span className=\"input-error\" id={`${inputId}-error`} role=\"alert\">\n {error}\n </span>\n )}\n {helperText && !error && (\n <span className=\"input-helper\" id={`${inputId}-helper`}>\n {helperText}\n </span>\n )}\n </div>\n );\n};\n","import type React from 'react';\nimport { useEffect } from 'react';\nimport './Modal.css';\n\nexport interface ModalProps {\n children: React.ReactNode;\n className?: string;\n closeOnOverlayClick?: boolean;\n isOpen: boolean;\n onClose: () => void;\n showCloseButton?: boolean;\n size?: 'sm' | 'md' | 'lg' | 'xl' | 'full';\n subtitle?: string;\n title?: string | React.ReactNode;\n}\n\nexport const Modal: React.FC<ModalProps> = ({\n isOpen,\n onClose,\n title,\n subtitle,\n children,\n size = 'md',\n showCloseButton = true,\n closeOnOverlayClick = true,\n className = '',\n}) => {\n useEffect(() => {\n if (isOpen) {\n document.body.style.overflow = 'hidden';\n } else {\n document.body.style.overflow = '';\n }\n return () => {\n document.body.style.overflow = '';\n };\n }, [isOpen]);\n\n useEffect(() => {\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && isOpen) {\n onClose();\n }\n };\n if (isOpen) {\n document.addEventListener('keydown', handleEscape);\n }\n return () => document.removeEventListener('keydown', handleEscape);\n }, [isOpen, onClose]);\n\n if (!isOpen) {\n return null;\n }\n\n const handleOverlayClick = (e: React.MouseEvent<HTMLDivElement>) => {\n if (closeOnOverlayClick && e.target === e.currentTarget) {\n onClose();\n }\n };\n\n const sizeClass = `modal--${size}`;\n const combinedClass = `modal ${sizeClass} ${className}`.trim();\n\n return (\n <div\n aria-labelledby={title ? 'modal-title' : undefined}\n aria-modal=\"true\"\n className=\"modal-overlay\"\n onClick={handleOverlayClick}\n role=\"dialog\"\n >\n <div className={combinedClass}>\n {(title || subtitle || showCloseButton) && (\n <div className=\"modal-header\">\n {(title || subtitle) && (\n <div className=\"modal-header-content\">\n {title && (\n <h2 className=\"modal-title\" id=\"modal-title\">\n {title}\n </h2>\n )}\n {subtitle && <p className=\"modal-subtitle\">{subtitle}</p>}\n </div>\n )}\n {showCloseButton && (\n <button\n aria-label=\"Fechar modal\"\n className=\"modal-close\"\n onClick={onClose}\n type=\"button\"\n >\n <svg\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n >\n <line x1=\"18\" x2=\"6\" y1=\"6\" y2=\"18\" />\n <line x1=\"6\" x2=\"18\" y1=\"6\" y2=\"18\" />\n </svg>\n </button>\n )}\n </div>\n )}\n <div className=\"modal-content\">{children}</div>\n </div>\n </div>\n );\n};\n","import type React from 'react';\nimport './Paragraph.css';\n\nexport interface ParagraphProps\n extends React.HTMLAttributes<HTMLParagraphElement> {\n align?: 'left' | 'center' | 'right' | 'justify';\n as?: 'p' | 'span' | 'div';\n children: React.ReactNode;\n muted?: boolean;\n size?: 'xs' | 'sm' | 'md' | 'lg';\n weight?: 'light' | 'normal' | 'medium';\n}\n\nexport const Paragraph: React.FC<ParagraphProps> = ({\n as = 'p',\n size = 'md',\n weight = 'normal',\n align = 'left',\n muted = false,\n children,\n className = '',\n ...props\n}) => {\n const Component = as;\n const baseClass = 'paragraph';\n const sizeClass = `paragraph--${size}`;\n const weightClass = `paragraph--${weight}`;\n const alignClass = `paragraph--align-${align}`;\n const mutedClass = muted ? 'paragraph--muted' : '';\n const combinedClass =\n `${baseClass} ${sizeClass} ${weightClass} ${alignClass} ${mutedClass} ${className}`.trim();\n\n return (\n <Component className={combinedClass} {...props}>\n {children}\n </Component>\n );\n};\n","import type React from 'react';\nimport './Subtitle.css';\n\nexport interface SubtitleProps\n extends React.HTMLAttributes<HTMLParagraphElement> {\n align?: 'left' | 'center' | 'right';\n as?: 'p' | 'span' | 'div';\n children: React.ReactNode;\n muted?: boolean;\n size?: 'xs' | 'sm' | 'md' | 'lg';\n weight?: 'normal' | 'medium' | 'semibold';\n}\n\nexport const Subtitle: React.FC<SubtitleProps> = ({\n as = 'p',\n size = 'md',\n weight = 'normal',\n align = 'left',\n muted = false,\n children,\n className = '',\n ...props\n}) => {\n const Component = as;\n const baseClass = 'subtitle';\n const sizeClass = `subtitle--${size}`;\n const weightClass = `subtitle--${weight}`;\n const alignClass = `subtitle--align-${align}`;\n const mutedClass = muted ? 'subtitle--muted' : '';\n const combinedClass =\n `${baseClass} ${sizeClass} ${weightClass} ${alignClass} ${mutedClass} ${className}`.trim();\n\n return (\n <Component className={combinedClass} {...props}>\n {children}\n </Component>\n );\n};\n","import type React from 'react';\nimport './Title.css';\n\nexport interface TitleProps extends React.HTMLAttributes<HTMLHeadingElement> {\n align?: 'left' | 'center' | 'right';\n as?: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\n children: React.ReactNode;\n gradient?: boolean;\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl';\n weight?: 'light' | 'normal' | 'medium' | 'semibold' | 'bold' | 'extrabold';\n}\n\nexport const Title: React.FC<TitleProps> = ({\n as = 'h1',\n size = '2xl',\n weight = 'bold',\n align = 'left',\n gradient = false,\n children,\n className = '',\n ...props\n}) => {\n const Component = as;\n const baseClass = 'title';\n const sizeClass = `title--${size}`;\n const weightClass = `title--${weight}`;\n const alignClass = `title--align-${align}`;\n const gradientClass = gradient ? 'title--gradient' : '';\n const combinedClass =\n `${baseClass} ${sizeClass} ${weightClass} ${alignClass} ${gradientClass} ${className}`.trim();\n\n return (\n <Component className={combinedClass} {...props}>\n {children}\n </Component>\n );\n};\n","import {\n createContext,\n type ReactNode,\n useContext,\n useEffect,\n useState,\n} from 'react';\n\nexport type Theme = 'light' | 'dark';\n\ninterface ThemeContextType {\n theme: Theme;\n toggleTheme: () => void;\n}\n\nconst ThemeContext = createContext<ThemeContextType | undefined>(undefined);\n\nexport const useTheme = (): ThemeContextType => {\n const context = useContext(ThemeContext);\n if (!context) {\n throw new Error('useTheme must be used within a ThemeProvider');\n }\n return context;\n};\n\ninterface ThemeProviderProps {\n children: ReactNode;\n defaultTheme?: Theme;\n}\n\nexport const ThemeProvider = ({\n children,\n defaultTheme = 'light',\n}: ThemeProviderProps) => {\n const [theme, setTheme] = useState<Theme>(() => {\n if (typeof window === 'undefined') {\n return defaultTheme;\n }\n const saved = window.localStorage.getItem('theme');\n return (saved as Theme) || defaultTheme;\n });\n\n useEffect(() => {\n if (typeof window === 'undefined') {\n return;\n }\n window.localStorage.setItem('theme', theme);\n document.documentElement.setAttribute('data-theme', theme);\n }, [theme]);\n\n const toggleTheme = (): void => {\n setTheme((prev) => (prev === 'dark' ? 'light' : 'dark'));\n };\n\n return (\n <ThemeContext.Provider value={{ theme, toggleTheme }}>\n {children}\n </ThemeContext.Provider>\n );\n};\n"],"names":["Button","variant","size","fullWidth","isLoading","leftIcon","rightIcon","children","className","disabled","palette","props","variantClass","sizeClass","fullWidthClass","loadingClass","paletteClass","combinedClass","jsxs","jsx","Card","padding","hoverable","baseClass","paddingClass","Footer","poweredByText","logoSrc","logoAlt","logoFallbackText","e","next","detectTheme","Header","logoDarkSrc","title","subtitle","theme","onLogoClick","rightContent","isScrolled","setIsScrolled","useState","resolvedTheme","setResolvedTheme","logoSrcResolved","useEffect","handleScroll","syncTheme","observer","handleClick","handleKeyDown","Input","label","error","helperText","id","inputId","hasError","Modal","isOpen","onClose","showCloseButton","closeOnOverlayClick","handleEscape","handleOverlayClick","Paragraph","as","weight","align","muted","Component","weightClass","alignClass","Subtitle","Title","gradient","ThemeContext","createContext","useTheme","context","useContext","ThemeProvider","defaultTheme","setTheme","toggleTheme","prev"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"oficios-ui.js","sources":["../src/components/Button/Button.tsx","../src/components/Card/Card.tsx","../src/components/Footer/Footer.tsx","../src/components/Header/Header.tsx","../src/components/Input/Input.tsx","../src/components/Modal/Modal.tsx","../src/components/Paragraph/Paragraph.tsx","../src/components/Subtitle/Subtitle.tsx","../src/components/Title/Title.tsx","../src/theme/ThemeProvider.tsx"],"sourcesContent":["import type React from 'react';\nimport type { CSSProperties } from 'react';\n\n/** Paletas do guia de marca (só afeta variant primary). Use para escolher o modelo de cor do botão. */\nexport type ButtonPalette =\n | 'verde-vibrante'\n | 'verde-profundo'\n | 'grafite-azulado'\n | 'azul-acinzentado'\n | 'cinza-medio'\n | 'cinza-escuro'\n | 'off-white';\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n children: React.ReactNode;\n compact?: boolean;\n fullWidth?: boolean;\n isLoading?: boolean;\n leftIcon?: React.ReactNode;\n /** Paleta de cor do guia de marca (aplica-se ao primary). Ignorado em outros variants. */\n palette?: ButtonPalette;\n rightIcon?: React.ReactNode;\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n variant?:\n | 'primary'\n | 'secondary'\n | 'success'\n | 'error'\n | 'warning'\n | 'info'\n | 'neutral'\n | 'ghost';\n}\n\nexport const Button: React.FC<ButtonProps> = ({\n variant = 'primary',\n size = 'md',\n compact = false,\n fullWidth = false,\n isLoading = false,\n leftIcon,\n rightIcon,\n children,\n className = '',\n disabled,\n palette,\n style,\n ...props\n}) => {\n const baseClass =\n 'relative inline-flex select-none items-center justify-center overflow-hidden whitespace-nowrap border border-transparent font-semibold leading-none tracking-[0.01em] transition-[all_var(--transition-base)]';\n const focusClass =\n 'focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--md-primary)]';\n const disabledClass = 'disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-60';\n const fullWidthClass = fullWidth ? 'w-full' : '';\n const loadingClass = isLoading ? '[&_.btn__content]:opacity-0' : '';\n\n const sizeClassMap: Record<NonNullable<ButtonProps['size']>, string> = {\n xs: compact\n ? 'min-h-[1.75rem] min-w-[1.75rem] gap-1 px-2 py-1 text-[var(--font-size-xs)]'\n : 'min-h-8 min-w-8 gap-1.5 px-3 py-1.5 text-[var(--font-size-xs)]',\n sm: compact\n ? 'min-h-8 min-w-8 gap-[0.3125rem] px-2.5 py-1.5 text-[var(--font-size-sm)]'\n : 'min-h-9 min-w-9 gap-[0.4375rem] px-3.5 py-2 text-[var(--font-size-sm)]',\n md: compact\n ? 'min-h-[2.375rem] min-w-[2.375rem] gap-1.5 px-3 py-2 text-[var(--font-size-base)]'\n : 'min-h-11 min-w-11 gap-2 px-4 py-2.5 text-[var(--font-size-base)]',\n lg: compact\n ? 'min-h-[2.625rem] min-w-[2.625rem] gap-[0.4375rem] px-3.5 py-[0.5625rem] text-[var(--font-size-lg)]'\n : 'min-h-12 min-w-12 gap-[0.5625rem] px-6 py-4 text-[var(--font-size-lg)]',\n xl: compact\n ? 'min-h-12 min-w-12 gap-2 px-4 py-3 text-[var(--font-size-xl)]'\n : 'min-h-14 min-w-14 gap-2.5 px-8 py-6 text-[var(--font-size-xl)]',\n };\n\n const variantClassMap: Record<NonNullable<ButtonProps['variant']>, string> = {\n primary:\n 'bg-[var(--md-primary)] text-[var(--md-on-primary)] shadow-[var(--shadow-sm)] hover:translate-y-[-0.125rem] hover:bg-[var(--primary-color-hover)] hover:shadow-[var(--shadow-md)]',\n secondary:\n 'bg-[var(--md-secondary)] text-[var(--md-on-secondary)] shadow-[var(--shadow-sm)] hover:translate-y-[-0.125rem] hover:bg-[var(--secondary-color-light)] hover:shadow-[var(--shadow-md)]',\n success:\n 'bg-[var(--success-color)] text-white shadow-[var(--shadow-sm)] hover:translate-y-[-0.125rem] hover:bg-[var(--success-color-light)] hover:shadow-[var(--shadow-md)]',\n error:\n 'bg-[var(--md-error)] text-[var(--md-on-error)] shadow-[var(--shadow-sm)] hover:translate-y-[-0.125rem] hover:bg-[var(--error-color-light)] hover:shadow-[var(--shadow-md)]',\n warning:\n 'bg-[var(--warning-color)] text-white shadow-[var(--shadow-sm)] hover:translate-y-[-0.125rem] hover:bg-[var(--warning-color-light)] hover:shadow-[var(--shadow-md)]',\n info: 'bg-[var(--info-color)] text-white shadow-[var(--shadow-sm)] hover:translate-y-[-0.125rem] hover:bg-[var(--info-color-light)] hover:shadow-[var(--shadow-md)]',\n neutral:\n 'bg-[var(--neutral-color)] text-white shadow-[var(--shadow-sm)] hover:translate-y-[-0.125rem] hover:bg-[var(--neutral-color-light)] hover:shadow-[var(--shadow-md)]',\n ghost:\n 'border-[var(--md-outline-variant)] bg-transparent text-[var(--md-on-surface)] hover:bg-[var(--bg-hover)] hover:text-[var(--md-primary)] hover:border-[var(--border-color-hover)]',\n };\n\n const iconSizeClassMap: Record<NonNullable<ButtonProps['size']>, string> = {\n xs: compact ? 'h-3 w-3' : 'h-3.5 w-3.5',\n sm: compact ? 'h-3.5 w-3.5' : 'h-4 w-4',\n md: 'h-[1.125rem] w-[1.125rem]',\n lg: 'h-5 w-5',\n xl: 'h-5 w-5',\n };\n\n const paletteVars: Record<\n ButtonPalette,\n { primary: string; hover: string; onPrimary?: string }\n > = {\n 'verde-vibrante': {\n primary: 'var(--brand-verde-vibrante)',\n hover: 'var(--brand-verde-profundo)',\n },\n 'verde-profundo': {\n primary: 'var(--brand-verde-profundo)',\n hover: 'var(--brand-grafite-azulado)',\n },\n 'grafite-azulado': {\n primary: 'var(--brand-grafite-azulado)',\n hover: 'var(--brand-cinza-escuro)',\n },\n 'azul-acinzentado': {\n primary: 'var(--brand-azul-acinzentado)',\n hover: 'var(--brand-grafite-azulado)',\n },\n 'cinza-medio': {\n primary: 'var(--brand-cinza-medio)',\n hover: 'var(--brand-cinza-escuro)',\n },\n 'cinza-escuro': {\n primary: 'var(--brand-cinza-escuro)',\n hover: 'var(--brand-preto)',\n },\n 'off-white': {\n primary: 'var(--brand-off-white)',\n hover: 'var(--brand-branco)',\n onPrimary: 'var(--brand-grafite-azulado)',\n },\n };\n\n type ButtonCssVars = CSSProperties & {\n '--md-primary'?: string;\n '--primary-color-hover'?: string;\n '--md-on-primary'?: string;\n };\n const paletteStyle: ButtonCssVars = {};\n if (palette && variant === 'primary') {\n paletteStyle['--md-primary'] = paletteVars[palette].primary;\n paletteStyle['--primary-color-hover'] = paletteVars[palette].hover;\n if (paletteVars[palette].onPrimary) {\n paletteStyle['--md-on-primary'] = paletteVars[palette].onPrimary;\n }\n }\n\n const combinedClass = [\n baseClass,\n focusClass,\n disabledClass,\n sizeClassMap[size],\n variantClassMap[variant],\n fullWidthClass,\n loadingClass,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <button\n className={combinedClass}\n disabled={disabled || isLoading}\n style={{ ...paletteStyle, ...style }}\n {...props}\n >\n {isLoading && (\n <span\n aria-hidden=\"true\"\n className=\"absolute inline-flex h-[1em] w-[1em] animate-spin items-center justify-center\"\n >\n <svg fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" viewBox=\"0 0 24 24\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" strokeOpacity=\"0.25\" />\n <path d=\"M12 2 A10 10 0 0 1 22 12\" strokeLinecap=\"round\" />\n </svg>\n </span>\n )}\n {!isLoading && leftIcon && (\n <span\n className={`mr-1 inline-flex shrink-0 items-center justify-center leading-none ${iconSizeClassMap[size]}`}\n >\n {leftIcon}\n </span>\n )}\n <span className=\"btn__content inline-flex items-center justify-center\">\n {children}\n </span>\n {!isLoading && rightIcon && (\n <span\n className={`ml-1 inline-flex shrink-0 items-center justify-center leading-none ${iconSizeClassMap[size]}`}\n >\n {rightIcon}\n </span>\n )}\n </button>\n );\n};\n","import type React from 'react';\n\nexport interface CardProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n hoverable?: boolean;\n padding?: 'none' | 'sm' | 'md' | 'lg' | 'xl';\n variant?: 'default' | 'elevated' | 'outlined' | 'flat';\n}\n\nexport const Card: React.FC<CardProps> = ({\n variant = 'default',\n padding = 'md',\n hoverable = false,\n children,\n className = '',\n ...props\n}) => {\n const baseClass =\n 'relative overflow-hidden rounded-[var(--border-radius-lg)] transition-[var(--transition-all)]';\n const variantClassMap: Record<NonNullable<CardProps['variant']>, string> = {\n default:\n 'bg-[var(--md-surface)] border border-[var(--md-outline-variant)] shadow-[var(--shadow-sm)]',\n elevated:\n 'bg-[var(--md-surface)] border border-[var(--md-outline-variant)] shadow-[var(--shadow-lg)]',\n outlined: 'bg-transparent border border-[var(--md-outline-variant)] shadow-none',\n flat: 'bg-[var(--md-surface)] border-0 shadow-none',\n };\n const paddingClassMap: Record<NonNullable<CardProps['padding']>, string> = {\n none: 'p-0',\n sm: 'p-[var(--spacing-md)]',\n md: 'p-[var(--spacing-lg)]',\n lg: 'p-[var(--spacing-xl)]',\n xl: 'p-[var(--spacing-2xl)]',\n };\n const hoverableClass = hoverable ? 'hover:shadow-[var(--shadow-md)]' : '';\n const combinedClass = [\n baseClass,\n variantClassMap[variant],\n paddingClassMap[padding],\n hoverableClass,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div className={combinedClass} {...props}>\n {children}\n </div>\n );\n};\n","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","import type React from 'react';\nimport { useEffect, useState } from 'react';\nimport type { Theme } from '../../theme/ThemeProvider';\n\nexport interface HeaderProps {\n /** Classe CSS adicional */\n className?: string;\n /** Texto alternativo do logo */\n logoAlt?: string;\n /** URL da imagem do logo (tema escuro). Se não informado, usa logoSrc. */\n logoDarkSrc?: string;\n /** URL da imagem do logo (tema claro) */\n logoSrc?: string;\n /** Callback ao clicar na área do logo/título */\n onLogoClick?: () => void;\n /** Conteúdo da área direita (ex.: seletor de idioma, toggle tema, menu usuário) */\n rightContent?: React.ReactNode;\n /** Subtítulo abaixo do título */\n subtitle?: React.ReactNode;\n /** Tema opcional para escolher o logo correto sem depender do ThemeProvider do UI */\n theme?: Theme;\n /** Título exibido ao lado do logo (ex.: \"OFÍCIO.IA\") */\n title?: React.ReactNode;\n}\n\nconst detectTheme = (): Theme => {\n if (typeof document === 'undefined') {\n return 'light';\n }\n\n return document.documentElement.getAttribute('data-theme') === 'dark'\n ? 'dark'\n : 'light';\n};\n\nexport const Header: React.FC<HeaderProps> = ({\n logoSrc,\n logoDarkSrc,\n logoAlt = 'Logo',\n title,\n subtitle,\n theme,\n onLogoClick,\n rightContent,\n className = '',\n}) => {\n const [isScrolled, setIsScrolled] = useState(false);\n const [resolvedTheme, setResolvedTheme] = useState<Theme>(\n () => theme ?? detectTheme()\n );\n\n const logoSrcResolved =\n resolvedTheme === 'dark' && logoDarkSrc ? logoDarkSrc : logoSrc;\n\n useEffect(() => {\n const handleScroll = () => setIsScrolled(window.scrollY > 10);\n window.addEventListener('scroll', handleScroll, { passive: true });\n return () => window.removeEventListener('scroll', handleScroll);\n }, []);\n\n useEffect(() => {\n if (theme) {\n setResolvedTheme(theme);\n return;\n }\n\n const syncTheme = () => setResolvedTheme(detectTheme());\n syncTheme();\n\n if (typeof MutationObserver === 'undefined') {\n return;\n }\n\n const observer = new MutationObserver(syncTheme);\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['data-theme'],\n });\n\n return () => observer.disconnect();\n }, [theme]);\n\n const handleClick = () => onLogoClick?.();\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter') {\n onLogoClick?.();\n }\n };\n\n return (\n <header\n className={[\n 'fixed inset-x-0 top-0 z-[1000] w-full backdrop-blur-[12px]',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n >\n <div className=\"h-0.5 w-full bg-[var(--md-primary)]\" />\n <div\n 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\"\n style={{\n color: 'var(--md-on-surface)',\n background: `color-mix(in srgb, var(--md-surface) ${\n isScrolled ? '14%' : '18%'\n }, transparent)`,\n borderBottom: `1px solid color-mix(in srgb, var(--md-outline-variant) ${\n isScrolled ? '22%' : '30%'\n }, transparent)`,\n }}\n >\n <div\n className=\"flex cursor-pointer items-center gap-3 transition-opacity duration-200 ease-in-out hover:opacity-80\"\n onClick={onLogoClick ? handleClick : undefined}\n onKeyDown={onLogoClick ? handleKeyDown : undefined}\n role={onLogoClick ? 'button' : undefined}\n tabIndex={onLogoClick ? 0 : undefined}\n >\n {logoSrcResolved && (\n <div className=\"flex h-16 w-16 shrink-0 items-center justify-center\">\n <img\n alt={logoAlt}\n className=\"h-full w-full object-contain\"\n onError={(e) => {\n (e.target as HTMLImageElement).style.display = 'none';\n const next = (e.target as HTMLElement)\n .nextElementSibling as HTMLElement;\n if (next) {\n next.style.display = 'block';\n }\n }}\n src={logoSrcResolved}\n />\n <svg\n className=\"hidden h-full w-full\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M12 2L2 7l10 5 10-5-10-5z\" />\n <path d=\"M2 17l10 5 10-5M2 12l10 5 10-5\" />\n </svg>\n </div>\n )}\n {(title || subtitle) && (\n <div className=\"flex flex-col gap-1\">\n {title && (\n <h1\n 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\"\n style={{ fontFamily: '\"Orbitron\", sans-serif' }}\n >\n {title}\n </h1>\n )}\n {subtitle && (\n <p className=\"m-0 text-[0.8125rem] font-normal text-[var(--md-on-surface-variant)] max-md:text-xs\">\n {subtitle}\n </p>\n )}\n </div>\n )}\n </div>\n {rightContent && (\n <div className=\"flex shrink-0 items-center gap-3 max-md:w-full max-md:flex-wrap max-md:justify-between\">\n {rightContent}\n </div>\n )}\n </div>\n </header>\n );\n};\n","import type React from 'react';\n\nexport interface InputProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> {\n error?: string;\n fullWidth?: boolean;\n helperText?: string;\n label?: string;\n leftIcon?: React.ReactNode;\n rightIcon?: React.ReactNode;\n size?: 'sm' | 'md' | 'lg';\n}\n\nexport const Input: React.FC<InputProps> = ({\n label,\n error,\n helperText,\n leftIcon,\n rightIcon,\n fullWidth = false,\n size = 'md',\n className = '',\n id,\n ...props\n}) => {\n const inputId = id || `input-${Math.random().toString(36).substring(2, 9)}`;\n const hasError = !!error;\n const sizeClassMap: Record<NonNullable<InputProps['size']>, string> = {\n sm: 'min-h-8 px-[var(--spacing-md)] py-[var(--spacing-sm)] text-[var(--font-size-sm)]',\n md: 'min-h-10 px-[var(--spacing-lg)] py-[var(--spacing-md)] text-[var(--font-size-base)]',\n lg: 'min-h-12 px-[var(--spacing-xl)] py-[var(--spacing-lg)] text-[var(--font-size-lg)]',\n };\n const combinedClass = [\n 'w-full rounded-[var(--border-radius-md)] border border-[var(--md-outline-variant)] bg-[var(--md-surface)] font-inherit text-[var(--md-on-surface)] outline-none transition-[var(--transition-all)] placeholder:text-[var(--md-on-surface-variant)] placeholder:opacity-70 hover:not-disabled:not-focus:border-[var(--border-color-hover)] focus:border-[var(--border-color-focus)] focus:[box-shadow:0_0_0_0.1875rem_rgba(47,93,140,0.15)] disabled:cursor-not-allowed disabled:bg-[var(--md-surface-container-high)] disabled:opacity-60',\n hasError\n ? 'border-[var(--md-error)] focus:border-[var(--md-error)] focus:[box-shadow:0_0_0_0.1875rem_rgba(186,26,26,0.2)]'\n : '',\n leftIcon ? 'pl-10' : '',\n rightIcon ? 'pr-10' : '',\n sizeClassMap[size],\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div className={`flex flex-col gap-[var(--spacing-xs)] ${fullWidth ? 'w-full' : ''}`}>\n {label && (\n <label\n className=\"text-[var(--font-size-sm)] font-[var(--font-weight-semibold)] text-[var(--md-on-surface)]\"\n htmlFor={inputId}\n >\n {label}\n </label>\n )}\n <div className=\"group relative flex w-full items-center\">\n {leftIcon && (\n <span className=\"pointer-events-none absolute left-[var(--spacing-md)] z-[1] flex items-center justify-center text-[var(--md-on-surface-variant)] group-focus-within:text-[var(--md-primary)] [&_svg]:h-[1.125rem] [&_svg]:w-[1.125rem]\">\n {leftIcon}\n </span>\n )}\n <input\n aria-describedby={\n error\n ? `${inputId}-error`\n : helperText\n ? `${inputId}-helper`\n : undefined\n }\n aria-invalid={hasError ? true : undefined}\n className={combinedClass}\n id={inputId}\n {...props}\n />\n {rightIcon && (\n <span className=\"pointer-events-none absolute right-[var(--spacing-md)] z-[1] flex items-center justify-center text-[var(--md-on-surface-variant)] group-focus-within:text-[var(--md-primary)] [&_svg]:h-[1.125rem] [&_svg]:w-[1.125rem]\">\n {rightIcon}\n </span>\n )}\n </div>\n {error && (\n <span\n className=\"mt-[var(--spacing-xs)] block text-[var(--font-size-xs)] text-[var(--md-error)]\"\n id={`${inputId}-error`}\n role=\"alert\"\n >\n {error}\n </span>\n )}\n {helperText && !error && (\n <span\n className=\"mt-[var(--spacing-xs)] block text-[var(--font-size-xs)] text-[var(--md-on-surface-variant)]\"\n id={`${inputId}-helper`}\n >\n {helperText}\n </span>\n )}\n </div>\n );\n};\n","import type React from 'react';\nimport { useEffect } from 'react';\n\nexport interface ModalProps {\n children: React.ReactNode;\n className?: string;\n closeOnOverlayClick?: boolean;\n isOpen: boolean;\n onClose: () => void;\n showCloseButton?: boolean;\n size?: 'sm' | 'md' | 'lg' | 'xl' | 'full';\n subtitle?: string;\n title?: string | React.ReactNode;\n}\n\nexport const Modal: React.FC<ModalProps> = ({\n isOpen,\n onClose,\n title,\n subtitle,\n children,\n size = 'md',\n showCloseButton = true,\n closeOnOverlayClick = true,\n className = '',\n}) => {\n useEffect(() => {\n if (isOpen) {\n document.body.style.overflow = 'hidden';\n } else {\n document.body.style.overflow = '';\n }\n return () => {\n document.body.style.overflow = '';\n };\n }, [isOpen]);\n\n useEffect(() => {\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && isOpen) {\n onClose();\n }\n };\n if (isOpen) {\n document.addEventListener('keydown', handleEscape);\n }\n return () => document.removeEventListener('keydown', handleEscape);\n }, [isOpen, onClose]);\n\n if (!isOpen) {\n return null;\n }\n\n const handleOverlayClick = (e: React.MouseEvent<HTMLDivElement>) => {\n if (closeOnOverlayClick && e.target === e.currentTarget) {\n onClose();\n }\n };\n\n const sizeClassMap: Record<NonNullable<ModalProps['size']>, string> = {\n sm: 'max-w-[25rem]',\n md: 'max-w-[31.25rem]',\n lg: 'max-w-[43.75rem]',\n xl: 'max-w-[56.25rem]',\n full: 'max-h-[90vh] max-w-[90vw]',\n };\n const combinedClass = [\n 'relative z-[var(--z-index-modal)] m-auto flex w-full max-h-[90vh] max-w-full flex-col overflow-hidden rounded-[var(--border-radius-2xl)] border border-[var(--md-outline-variant)] bg-[var(--md-surface)] shadow-[var(--shadow-2xl)]',\n sizeClassMap[size],\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div\n aria-labelledby={title ? 'modal-title' : undefined}\n aria-modal=\"true\"\n className=\"fixed inset-0 z-[var(--z-index-modal-backdrop)] flex min-h-[100dvh] items-center justify-center overflow-y-auto bg-black/50 p-[var(--spacing-lg)] backdrop-blur-[8px]\"\n onClick={handleOverlayClick}\n role=\"dialog\"\n >\n <div className={combinedClass}>\n {(title || subtitle || showCloseButton) && (\n <div className=\"flex shrink-0 items-start justify-between gap-[var(--spacing-lg)] border-b border-[var(--md-outline-variant)] p-[var(--spacing-2xl)]\">\n {(title || subtitle) && (\n <div className=\"flex-1\">\n {title && (\n <h2\n className=\"mb-[var(--spacing-xs)] mt-0 text-[var(--font-size-2xl)] font-[var(--font-weight-semibold)] leading-[var(--line-height-tight)] text-[var(--md-on-surface)]\"\n id=\"modal-title\"\n >\n {title}\n </h2>\n )}\n {subtitle && (\n <p className=\"m-0 text-[var(--font-size-base)] leading-[var(--line-height-normal)] text-[var(--md-on-surface-variant)]\">\n {subtitle}\n </p>\n )}\n </div>\n )}\n {showCloseButton && (\n <button\n aria-label=\"Fechar modal\"\n className=\"flex h-9 w-9 shrink-0 items-center justify-center rounded-[var(--border-radius-md)] border-0 bg-[var(--md-surface-container-high)] text-[var(--md-on-surface)] transition-[var(--transition-all)] hover:bg-[color:color-mix(in_srgb,var(--md-error)_15%,var(--md-surface))] hover:text-[var(--md-error)]\"\n onClick={onClose}\n type=\"button\"\n >\n <svg\n fill=\"none\"\n className=\"h-5 w-5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n >\n <line x1=\"18\" x2=\"6\" y1=\"6\" y2=\"18\" />\n <line x1=\"6\" x2=\"18\" y1=\"6\" y2=\"18\" />\n </svg>\n </button>\n )}\n </div>\n )}\n <div className=\"flex min-h-0 flex-1 flex-col overflow-x-hidden overflow-y-auto p-[var(--spacing-2xl)]\">\n {children}\n </div>\n </div>\n </div>\n );\n};\n","import type React from 'react';\n\nexport interface ParagraphProps\n extends React.HTMLAttributes<HTMLParagraphElement> {\n align?: 'left' | 'center' | 'right' | 'justify';\n as?: 'p' | 'span' | 'div';\n children: React.ReactNode;\n muted?: boolean;\n size?: 'xs' | 'sm' | 'md' | 'lg';\n weight?: 'light' | 'normal' | 'medium';\n}\n\nexport const Paragraph: React.FC<ParagraphProps> = ({\n as = 'p',\n size = 'md',\n weight = 'normal',\n align = 'left',\n muted = false,\n children,\n className = '',\n ...props\n}) => {\n const Component = as;\n const sizeClassMap: Record<NonNullable<ParagraphProps['size']>, string> = {\n xs: 'text-[var(--font-size-xs)] leading-[var(--line-height-normal)]',\n sm: 'text-[var(--font-size-sm)] leading-[var(--line-height-normal)]',\n md: 'text-[var(--font-size-base)] leading-[var(--line-height-relaxed)]',\n lg: 'text-[var(--font-size-lg)] leading-[var(--line-height-loose)]',\n };\n const weightClassMap: Record<NonNullable<ParagraphProps['weight']>, string> = {\n light: 'font-[var(--font-weight-light)]',\n normal: 'font-[var(--font-weight-normal)]',\n medium: 'font-[var(--font-weight-medium)]',\n };\n const alignClassMap: Record<NonNullable<ParagraphProps['align']>, string> = {\n left: 'text-left',\n center: 'text-center',\n right: 'text-right',\n justify: 'text-justify',\n };\n const combinedClass = [\n 'm-0 text-[var(--text-primary)] transition-[var(--transition-colors)]',\n sizeClassMap[size],\n weightClassMap[weight],\n alignClassMap[align],\n muted ? 'text-[var(--text-muted)]' : '',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <Component className={combinedClass} {...props}>\n {children}\n </Component>\n );\n};\n","import type React from 'react';\n\nexport interface SubtitleProps\n extends React.HTMLAttributes<HTMLParagraphElement> {\n align?: 'left' | 'center' | 'right';\n as?: 'p' | 'span' | 'div';\n children: React.ReactNode;\n muted?: boolean;\n size?: 'xs' | 'sm' | 'md' | 'lg';\n weight?: 'normal' | 'medium' | 'semibold';\n}\n\nexport const Subtitle: React.FC<SubtitleProps> = ({\n as = 'p',\n size = 'md',\n weight = 'normal',\n align = 'left',\n muted = false,\n children,\n className = '',\n ...props\n}) => {\n const Component = as;\n const sizeClassMap: Record<NonNullable<SubtitleProps['size']>, string> = {\n xs: 'text-[var(--font-size-xs)]',\n sm: 'text-[var(--font-size-sm)]',\n md: 'text-[var(--font-size-base)]',\n lg: 'text-[var(--font-size-lg)]',\n };\n const weightClassMap: Record<NonNullable<SubtitleProps['weight']>, string> = {\n normal: 'font-[var(--font-weight-normal)]',\n medium: 'font-[var(--font-weight-medium)]',\n semibold: 'font-[var(--font-weight-semibold)]',\n };\n const alignClassMap: Record<NonNullable<SubtitleProps['align']>, string> = {\n left: 'text-left',\n center: 'text-center',\n right: 'text-right',\n };\n const combinedClass = [\n 'm-0 leading-[var(--line-height-normal)] text-[var(--text-secondary)] transition-[var(--transition-colors)]',\n sizeClassMap[size],\n weightClassMap[weight],\n alignClassMap[align],\n muted ? 'text-[var(--text-muted)] opacity-80' : '',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <Component className={combinedClass} {...props}>\n {children}\n </Component>\n );\n};\n","import type React from 'react';\n\nexport interface TitleProps extends React.HTMLAttributes<HTMLHeadingElement> {\n align?: 'left' | 'center' | 'right';\n as?: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\n children: React.ReactNode;\n gradient?: boolean;\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl';\n weight?: 'light' | 'normal' | 'medium' | 'semibold' | 'bold' | 'extrabold';\n}\n\nexport const Title: React.FC<TitleProps> = ({\n as = 'h1',\n size = '2xl',\n weight = 'bold',\n align = 'left',\n gradient = false,\n children,\n className = '',\n ...props\n}) => {\n const Component = as;\n const sizeClassMap: Record<NonNullable<TitleProps['size']>, string> = {\n xs: 'text-[var(--font-size-sm)]',\n sm: 'text-[var(--font-size-base)]',\n md: 'text-[var(--font-size-lg)]',\n lg: 'text-[var(--font-size-xl)]',\n xl: 'text-[var(--font-size-2xl)]',\n '2xl': 'text-[var(--font-size-3xl)]',\n '3xl': 'text-[var(--font-size-4xl)]',\n '4xl': 'text-[3rem]',\n };\n const weightClassMap: Record<NonNullable<TitleProps['weight']>, string> = {\n light: 'font-[var(--font-weight-light)]',\n normal: 'font-[var(--font-weight-normal)]',\n medium: 'font-[var(--font-weight-medium)]',\n semibold: 'font-[var(--font-weight-semibold)]',\n bold: 'font-[var(--font-weight-bold)]',\n extrabold: 'font-extrabold',\n };\n const alignClassMap: Record<NonNullable<TitleProps['align']>, string> = {\n left: 'text-left',\n center: 'text-center',\n right: 'text-right',\n };\n const gradientClass = gradient\n ? 'bg-[linear-gradient(135deg,var(--text-primary)_0%,var(--primary-color)_50%,var(--secondary-color)_100%)] bg-clip-text text-transparent'\n : '';\n const combinedClass = [\n 'm-0 leading-[var(--line-height-tight)] text-[var(--text-primary)] transition-[var(--transition-colors)]',\n sizeClassMap[size],\n weightClassMap[weight],\n alignClassMap[align],\n gradientClass,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <Component className={combinedClass} {...props}>\n {children}\n </Component>\n );\n};\n","import {\n createContext,\n type ReactNode,\n useContext,\n useEffect,\n useState,\n} from 'react';\n\nexport type Theme = 'light' | 'dark';\n\ninterface ThemeContextType {\n theme: Theme;\n toggleTheme: () => void;\n}\n\nconst ThemeContext = createContext<ThemeContextType | undefined>(undefined);\n\nexport const useTheme = (): ThemeContextType => {\n const context = useContext(ThemeContext);\n if (!context) {\n throw new Error('useTheme must be used within a ThemeProvider');\n }\n return context;\n};\n\ninterface ThemeProviderProps {\n children: ReactNode;\n defaultTheme?: Theme;\n}\n\nexport const ThemeProvider = ({\n children,\n defaultTheme = 'light',\n}: ThemeProviderProps) => {\n const [theme, setTheme] = useState<Theme>(() => {\n if (typeof window === 'undefined') {\n return defaultTheme;\n }\n const saved = window.localStorage.getItem('theme');\n return (saved as Theme) || defaultTheme;\n });\n\n useEffect(() => {\n if (typeof window === 'undefined') {\n return;\n }\n window.localStorage.setItem('theme', theme);\n document.documentElement.setAttribute('data-theme', theme);\n }, [theme]);\n\n const toggleTheme = (): void => {\n setTheme((prev) => (prev === 'dark' ? 'light' : 'dark'));\n };\n\n return (\n <ThemeContext.Provider value={{ theme, toggleTheme }}>\n {children}\n </ThemeContext.Provider>\n );\n};\n"],"names":["Button","variant","size","compact","fullWidth","isLoading","leftIcon","rightIcon","children","className","disabled","palette","style","props","baseClass","focusClass","disabledClass","fullWidthClass","loadingClass","sizeClassMap","variantClassMap","iconSizeClassMap","paletteVars","paletteStyle","combinedClass","jsxs","jsx","Card","padding","hoverable","paddingClassMap","hoverableClass","Footer","poweredByText","logoSrc","logoAlt","logoFallbackText","logoVisible","setLogoVisible","useState","e","detectTheme","Header","logoDarkSrc","title","subtitle","theme","onLogoClick","rightContent","isScrolled","setIsScrolled","resolvedTheme","setResolvedTheme","logoSrcResolved","useEffect","handleScroll","syncTheme","observer","handleClick","handleKeyDown","next","Input","label","error","helperText","id","inputId","hasError","Modal","isOpen","onClose","showCloseButton","closeOnOverlayClick","handleEscape","handleOverlayClick","Paragraph","as","weight","align","muted","Component","weightClassMap","alignClassMap","Subtitle","Title","gradient","gradientClass","ThemeContext","createContext","useTheme","context","useContext","ThemeProvider","defaultTheme","setTheme","toggleTheme","prev"],"mappings":"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"}
|
package/dist/oficios-ui.umd.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
(function(c,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("react/jsx-runtime"),require("react")):typeof define=="function"&&define.amd?define(["exports","react/jsx-runtime","react"],e):(c=typeof globalThis<"u"?globalThis:c||self,e(c.OficiosUI={},c.jsxRuntime,c.React))})(this,(function(c,e,$){"use strict";const w=({variant:t="primary",size:a="md",fullWidth:n=!1,isLoading:s=!1,leftIcon:r,rightIcon:l,children:o,className:h="",disabled:p,palette:m,...d})=>{const i=`btn--${t}`,b=`btn--${a}`,v=n?"btn--full-width":"",g=s?"btn--loading":"",u=m&&t==="primary"?`btn--palette-${m}`:"",C=`btn ${i} ${b} ${v} ${g} ${u} ${h}`.trim();return e.jsxs("button",{className:C,disabled:p||s,...d,children:[s&&e.jsx("span",{"aria-hidden":"true",className:"btn__spinner",children:e.jsxs("svg",{fill:"none",stroke:"currentColor",strokeWidth:"2",viewBox:"0 0 24 24",children:[e.jsx("circle",{cx:"12",cy:"12",r:"10",strokeOpacity:"0.25"}),e.jsx("path",{d:"M12 2 A10 10 0 0 1 22 12",strokeLinecap:"round"})]})}),!s&&r&&e.jsx("span",{className:"btn__icon btn__icon--left",children:r}),e.jsx("span",{className:"btn__content",children:o}),!s&&l&&e.jsx("span",{className:"btn__icon btn__icon--right",children:l})]})},E=({variant:t="default",padding:a="md",hoverable:n=!1,children:s,className:r="",...l})=>{const o="card",h=`card--${t}`,p=`card--padding-${a}`,d=`${o} ${h} ${p} ${n?"card--hoverable":""} ${r}`.trim();return e.jsx("div",{className:d,...l,children:s})},k=({poweredByText:t="Powered by",logoSrc:a,logoAlt:n="Logo",logoFallbackText:s,className:r=""})=>e.jsx("footer",{className:`app-footer ${r}`.trim(),children:e.jsxs("div",{className:"app-footer-powered",children:[t&&e.jsx("span",{className:"app-footer-powered-text",children:t}),(a||s)&&e.jsxs("div",{className:"app-footer-logo-wrap",children:[a&&e.jsx("img",{alt:n,className:"app-footer-logo",onError:l=>{l.target.style.display="none";const o=l.target.nextElementSibling;o&&(o.style.display="flex")},src:a}),s&&e.jsx("span",{className:"app-footer-logo-fallback",style:{display:a?"none":"flex"},children:s})]})]})}),y=()=>typeof document>"u"?"light":document.documentElement.getAttribute("data-theme")==="dark"?"dark":"light",T=({logoSrc:t,logoDarkSrc:a,logoAlt:n="Logo",title:s,subtitle:r,theme:l,onLogoClick:o,rightContent:h,className:p=""})=>{const[m,d]=$.useState(!1),[f,i]=$.useState(()=>l??y()),b=f==="dark"&&a?a:t;$.useEffect(()=>{const u=()=>d(window.scrollY>10);return window.addEventListener("scroll",u,{passive:!0}),()=>window.removeEventListener("scroll",u)},[]),$.useEffect(()=>{if(l){i(l);return}const u=()=>i(y());if(u(),typeof MutationObserver>"u")return;const C=new MutationObserver(u);return C.observe(document.documentElement,{attributes:!0,attributeFilter:["data-theme"]}),()=>C.disconnect()},[l]);const v=()=>o?.(),g=u=>{u.key==="Enter"&&o?.()};return e.jsxs("header",{className:`app-header ${m?"scrolled":""} ${p}`.trim(),children:[e.jsx("div",{className:"app-header-top-bar"}),e.jsxs("div",{className:"app-header-content",children:[e.jsxs("div",{className:"app-header-left",onClick:o?v:void 0,onKeyDown:o?g:void 0,role:o?"button":void 0,tabIndex:o?0:void 0,children:[b&&e.jsxs("div",{className:"app-header-logo",children:[e.jsx("img",{alt:n,onError:u=>{u.target.style.display="none";const C=u.target.nextElementSibling;C&&(C.style.display="block")},src:b}),e.jsxs("svg",{className:"logo-icon-fallback",fill:"none",stroke:"currentColor",strokeWidth:"2",viewBox:"0 0 24 24",children:[e.jsx("path",{d:"M12 2L2 7l10 5 10-5-10-5z"}),e.jsx("path",{d:"M2 17l10 5 10-5M2 12l10 5 10-5"})]})]}),(s||r)&&e.jsxs("div",{className:"app-header-title",children:[s&&e.jsx("h1",{children:s}),r&&e.jsx("p",{children:r})]})]}),h&&e.jsx("div",{className:"app-header-right",children:h})]})]})},x=({label:t,error:a,helperText:n,leftIcon:s,rightIcon:r,fullWidth:l=!1,size:o="md",className:h="",id:p,...m})=>{const d=p||`input-${Math.random().toString(36).substring(2,9)}`,f=!!a,i="input",b=`input--${o}`,I=`${i} ${b} ${f?"input--error":""} ${l?"input--full-width":""} ${s?"input--has-left-icon":""} ${r?"input--has-right-icon":""} ${h}`.trim();return e.jsxs("div",{className:`input-wrapper ${l?"input-wrapper--full-width":""}`,children:[t&&e.jsx("label",{className:"input-label",htmlFor:d,children:t}),e.jsxs("div",{className:"input-container",children:[s&&e.jsx("span",{className:"input-icon input-icon--left",children:s}),e.jsx("input",{"aria-describedby":a?`${d}-error`:n?`${d}-helper`:void 0,"aria-invalid":f?!0:void 0,className:I,id:d,...m}),r&&e.jsx("span",{className:"input-icon input-icon--right",children:r})]}),a&&e.jsx("span",{className:"input-error",id:`${d}-error`,role:"alert",children:a}),n&&!a&&e.jsx("span",{className:"input-helper",id:`${d}-helper`,children:n})]})},S=({isOpen:t,onClose:a,title:n,subtitle:s,children:r,size:l="md",showCloseButton:o=!0,closeOnOverlayClick:h=!0,className:p=""})=>{if($.useEffect(()=>(t?document.body.style.overflow="hidden":document.body.style.overflow="",()=>{document.body.style.overflow=""}),[t]),$.useEffect(()=>{const i=b=>{b.key==="Escape"&&t&&a()};return t&&document.addEventListener("keydown",i),()=>document.removeEventListener("keydown",i)},[t,a]),!t)return null;const m=i=>{h&&i.target===i.currentTarget&&a()},f=`modal ${`modal--${l}`} ${p}`.trim();return e.jsx("div",{"aria-labelledby":n?"modal-title":void 0,"aria-modal":"true",className:"modal-overlay",onClick:m,role:"dialog",children:e.jsxs("div",{className:f,children:[(n||s||o)&&e.jsxs("div",{className:"modal-header",children:[(n||s)&&e.jsxs("div",{className:"modal-header-content",children:[n&&e.jsx("h2",{className:"modal-title",id:"modal-title",children:n}),s&&e.jsx("p",{className:"modal-subtitle",children:s})]}),o&&e.jsx("button",{"aria-label":"Fechar modal",className:"modal-close",onClick:a,type:"button",children:e.jsxs("svg",{fill:"none",stroke:"currentColor",strokeWidth:"2",viewBox:"0 0 24 24",children:[e.jsx("line",{x1:"18",x2:"6",y1:"6",y2:"18"}),e.jsx("line",{x1:"6",x2:"18",y1:"6",y2:"18"})]})})]}),e.jsx("div",{className:"modal-content",children:r})]})})},_=({as:t="p",size:a="md",weight:n="normal",align:s="left",muted:r=!1,children:l,className:o="",...h})=>{const p=t,m="paragraph",d=`paragraph--${a}`,f=`paragraph--${n}`,i=`paragraph--align-${s}`,v=`${m} ${d} ${f} ${i} ${r?"paragraph--muted":""} ${o}`.trim();return e.jsx(p,{className:v,...h,children:l})},M=({as:t="p",size:a="md",weight:n="normal",align:s="left",muted:r=!1,children:l,className:o="",...h})=>{const p=t,m="subtitle",d=`subtitle--${a}`,f=`subtitle--${n}`,i=`subtitle--align-${s}`,v=`${m} ${d} ${f} ${i} ${r?"subtitle--muted":""} ${o}`.trim();return e.jsx(p,{className:v,...h,children:l})},z=({as:t="h1",size:a="2xl",weight:n="bold",align:s="left",gradient:r=!1,children:l,className:o="",...h})=>{const p=t,m="title",d=`title--${a}`,f=`title--${n}`,i=`title--align-${s}`,v=`${m} ${d} ${f} ${i} ${r?"title--gradient":""} ${o}`.trim();return e.jsx(p,{className:v,...h,children:l})},N=$.createContext(void 0),P=()=>{const t=$.useContext(N);if(!t)throw new Error("useTheme must be used within a ThemeProvider");return t},j=({children:t,defaultTheme:a="light"})=>{const[n,s]=$.useState(()=>typeof window>"u"?a:window.localStorage.getItem("theme")||a);$.useEffect(()=>{typeof window>"u"||(window.localStorage.setItem("theme",n),document.documentElement.setAttribute("data-theme",n))},[n]);const r=()=>{s(l=>l==="dark"?"light":"dark")};return e.jsx(N.Provider,{value:{theme:n,toggleTheme:r},children:t})};c.Button=w,c.Card=E,c.Footer=k,c.Header=T,c.Input=x,c.Modal=S,c.Paragraph=_,c.Subtitle=M,c.ThemeProvider=j,c.Title=z,c.useTheme=P,Object.defineProperty(c,Symbol.toStringTag,{value:"Module"})}));
|
|
1
|
+
(function(d,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("react/jsx-runtime"),require("react")):typeof define=="function"&&define.amd?define(["exports","react/jsx-runtime","react"],e):(d=typeof globalThis<"u"?globalThis:d||self,e(d.OficiosUI={},d.jsxRuntime,d.React))})(this,(function(d,e,g){"use strict";const k=({variant:t="primary",size:a="md",compact:r=!1,fullWidth:o=!1,isLoading:s=!1,leftIcon:n,rightIcon:i,children:c,className:h="",disabled:v,palette:l,style:f,...m})=>{const p="relative inline-flex select-none items-center justify-center overflow-hidden whitespace-nowrap border border-transparent font-semibold leading-none tracking-[0.01em] transition-[all_var(--transition-base)]",y="focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--md-primary)]",z="disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-60",x=o?"w-full":"",b=s?"[&_.btn__content]:opacity-0":"",A={xs:r?"min-h-[1.75rem] min-w-[1.75rem] gap-1 px-2 py-1 text-[var(--font-size-xs)]":"min-h-8 min-w-8 gap-1.5 px-3 py-1.5 text-[var(--font-size-xs)]",sm:r?"min-h-8 min-w-8 gap-[0.3125rem] px-2.5 py-1.5 text-[var(--font-size-sm)]":"min-h-9 min-w-9 gap-[0.4375rem] px-3.5 py-2 text-[var(--font-size-sm)]",md:r?"min-h-[2.375rem] min-w-[2.375rem] gap-1.5 px-3 py-2 text-[var(--font-size-base)]":"min-h-11 min-w-11 gap-2 px-4 py-2.5 text-[var(--font-size-base)]",lg:r?"min-h-[2.625rem] min-w-[2.625rem] gap-[0.4375rem] px-3.5 py-[0.5625rem] text-[var(--font-size-lg)]":"min-h-12 min-w-12 gap-[0.5625rem] px-6 py-4 text-[var(--font-size-lg)]",xl:r?"min-h-12 min-w-12 gap-2 px-4 py-3 text-[var(--font-size-xl)]":"min-h-14 min-w-14 gap-2.5 px-8 py-6 text-[var(--font-size-xl)]"},O={primary:"bg-[var(--md-primary)] text-[var(--md-on-primary)] shadow-[var(--shadow-sm)] hover:translate-y-[-0.125rem] hover:bg-[var(--primary-color-hover)] hover:shadow-[var(--shadow-md)]",secondary:"bg-[var(--md-secondary)] text-[var(--md-on-secondary)] shadow-[var(--shadow-sm)] hover:translate-y-[-0.125rem] hover:bg-[var(--secondary-color-light)] hover:shadow-[var(--shadow-md)]",success:"bg-[var(--success-color)] text-white shadow-[var(--shadow-sm)] hover:translate-y-[-0.125rem] hover:bg-[var(--success-color-light)] hover:shadow-[var(--shadow-md)]",error:"bg-[var(--md-error)] text-[var(--md-on-error)] shadow-[var(--shadow-sm)] hover:translate-y-[-0.125rem] hover:bg-[var(--error-color-light)] hover:shadow-[var(--shadow-md)]",warning:"bg-[var(--warning-color)] text-white shadow-[var(--shadow-sm)] hover:translate-y-[-0.125rem] hover:bg-[var(--warning-color-light)] hover:shadow-[var(--shadow-md)]",info:"bg-[var(--info-color)] text-white shadow-[var(--shadow-sm)] hover:translate-y-[-0.125rem] hover:bg-[var(--info-color-light)] hover:shadow-[var(--shadow-md)]",neutral:"bg-[var(--neutral-color)] text-white shadow-[var(--shadow-sm)] hover:translate-y-[-0.125rem] hover:bg-[var(--neutral-color-light)] hover:shadow-[var(--shadow-md)]",ghost:"border-[var(--md-outline-variant)] bg-transparent text-[var(--md-on-surface)] hover:bg-[var(--bg-hover)] hover:text-[var(--md-primary)] hover:border-[var(--border-color-hover)]"},j={xs:r?"h-3 w-3":"h-3.5 w-3.5",sm:r?"h-3.5 w-3.5":"h-4 w-4",md:"h-[1.125rem] w-[1.125rem]",lg:"h-5 w-5",xl:"h-5 w-5"},u={"verde-vibrante":{primary:"var(--brand-verde-vibrante)",hover:"var(--brand-verde-profundo)"},"verde-profundo":{primary:"var(--brand-verde-profundo)",hover:"var(--brand-grafite-azulado)"},"grafite-azulado":{primary:"var(--brand-grafite-azulado)",hover:"var(--brand-cinza-escuro)"},"azul-acinzentado":{primary:"var(--brand-azul-acinzentado)",hover:"var(--brand-grafite-azulado)"},"cinza-medio":{primary:"var(--brand-cinza-medio)",hover:"var(--brand-cinza-escuro)"},"cinza-escuro":{primary:"var(--brand-cinza-escuro)",hover:"var(--brand-preto)"},"off-white":{primary:"var(--brand-off-white)",hover:"var(--brand-branco)",onPrimary:"var(--brand-grafite-azulado)"}},w={};l&&t==="primary"&&(w["--md-primary"]=u[l].primary,w["--primary-color-hover"]=u[l].hover,u[l].onPrimary&&(w["--md-on-primary"]=u[l].onPrimary));const V=[p,y,z,A[a],O[t],x,b,h].filter(Boolean).join(" ");return e.jsxs("button",{className:V,disabled:v||s,style:{...w,...f},...m,children:[s&&e.jsx("span",{"aria-hidden":"true",className:"absolute inline-flex h-[1em] w-[1em] animate-spin items-center justify-center",children:e.jsxs("svg",{fill:"none",stroke:"currentColor",strokeWidth:"2",viewBox:"0 0 24 24",children:[e.jsx("circle",{cx:"12",cy:"12",r:"10",strokeOpacity:"0.25"}),e.jsx("path",{d:"M12 2 A10 10 0 0 1 22 12",strokeLinecap:"round"})]})}),!s&&n&&e.jsx("span",{className:`mr-1 inline-flex shrink-0 items-center justify-center leading-none ${j[a]}`,children:n}),e.jsx("span",{className:"btn__content inline-flex items-center justify-center",children:c}),!s&&i&&e.jsx("span",{className:`ml-1 inline-flex shrink-0 items-center justify-center leading-none ${j[a]}`,children:i})]})},M=({variant:t="default",padding:a="md",hoverable:r=!1,children:o,className:s="",...n})=>{const i="relative overflow-hidden rounded-[var(--border-radius-lg)] transition-[var(--transition-all)]",c={default:"bg-[var(--md-surface)] border border-[var(--md-outline-variant)] shadow-[var(--shadow-sm)]",elevated:"bg-[var(--md-surface)] border border-[var(--md-outline-variant)] shadow-[var(--shadow-lg)]",outlined:"bg-transparent border border-[var(--md-outline-variant)] shadow-none",flat:"bg-[var(--md-surface)] border-0 shadow-none"},h={none:"p-0",sm:"p-[var(--spacing-md)]",md:"p-[var(--spacing-lg)]",lg:"p-[var(--spacing-xl)]",xl:"p-[var(--spacing-2xl)]"},v=r?"hover:shadow-[var(--shadow-md)]":"",l=[i,c[t],h[a],v,s].filter(Boolean).join(" ");return e.jsx("div",{className:l,...n,children:o})},_=({poweredByText:t="Powered by",logoSrc:a,logoAlt:r="Logo",logoFallbackText:o,className:s=""})=>{const[n,i]=g.useState(!0);return e.jsx("footer",{className:["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)]",s].filter(Boolean).join(" "),children:e.jsxs("div",{className:"flex items-center gap-[var(--spacing-md)]",children:[t&&e.jsx("span",{className:"text-[0.95rem] font-normal text-[var(--text-secondary)]",children:t}),(a||o)&&e.jsxs("div",{className:"flex items-center",children:[a&&n&&e.jsx("img",{alt:r,className:"h-6 w-auto object-contain",onError:c=>{i(!1)},src:a,style:{filter:"brightness(0)"}}),o&&e.jsx("span",{className:"flex items-center text-base font-bold tracking-[0.1em] text-[var(--md-primary)]",style:{display:a&&n?"none":"flex",fontFamily:'"Orbitron", sans-serif'},children:o})]})]})})},N=()=>typeof document>"u"?"light":document.documentElement.getAttribute("data-theme")==="dark"?"dark":"light",E=({logoSrc:t,logoDarkSrc:a,logoAlt:r="Logo",title:o,subtitle:s,theme:n,onLogoClick:i,rightContent:c,className:h=""})=>{const[v,l]=g.useState(!1),[f,m]=g.useState(()=>n??N()),p=f==="dark"&&a?a:t;g.useEffect(()=>{const x=()=>l(window.scrollY>10);return window.addEventListener("scroll",x,{passive:!0}),()=>window.removeEventListener("scroll",x)},[]),g.useEffect(()=>{if(n){m(n);return}const x=()=>m(N());if(x(),typeof MutationObserver>"u")return;const b=new MutationObserver(x);return b.observe(document.documentElement,{attributes:!0,attributeFilter:["data-theme"]}),()=>b.disconnect()},[n]);const y=()=>i?.(),z=x=>{x.key==="Enter"&&i?.()};return e.jsxs("header",{className:["fixed inset-x-0 top-0 z-[1000] w-full backdrop-blur-[12px]",h].filter(Boolean).join(" "),children:[e.jsx("div",{className:"h-0.5 w-full bg-[var(--md-primary)]"}),e.jsxs("div",{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",style:{color:"var(--md-on-surface)",background:`color-mix(in srgb, var(--md-surface) ${v?"14%":"18%"}, transparent)`,borderBottom:`1px solid color-mix(in srgb, var(--md-outline-variant) ${v?"22%":"30%"}, transparent)`},children:[e.jsxs("div",{className:"flex cursor-pointer items-center gap-3 transition-opacity duration-200 ease-in-out hover:opacity-80",onClick:i?y:void 0,onKeyDown:i?z:void 0,role:i?"button":void 0,tabIndex:i?0:void 0,children:[p&&e.jsxs("div",{className:"flex h-16 w-16 shrink-0 items-center justify-center",children:[e.jsx("img",{alt:r,className:"h-full w-full object-contain",onError:x=>{x.target.style.display="none";const b=x.target.nextElementSibling;b&&(b.style.display="block")},src:p}),e.jsxs("svg",{className:"hidden h-full w-full",fill:"none",stroke:"currentColor",strokeWidth:"2",viewBox:"0 0 24 24",children:[e.jsx("path",{d:"M12 2L2 7l10 5 10-5-10-5z"}),e.jsx("path",{d:"M2 17l10 5 10-5M2 12l10 5 10-5"})]})]}),(o||s)&&e.jsxs("div",{className:"flex flex-col gap-1",children:[o&&e.jsx("h1",{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",style:{fontFamily:'"Orbitron", sans-serif'},children:o}),s&&e.jsx("p",{className:"m-0 text-[0.8125rem] font-normal text-[var(--md-on-surface-variant)] max-md:text-xs",children:s})]})]}),c&&e.jsx("div",{className:"flex shrink-0 items-center gap-3 max-md:w-full max-md:flex-wrap max-md:justify-between",children:c})]})]})},S=({label:t,error:a,helperText:r,leftIcon:o,rightIcon:s,fullWidth:n=!1,size:i="md",className:c="",id:h,...v})=>{const l=h||`input-${Math.random().toString(36).substring(2,9)}`,f=!!a,p=["w-full rounded-[var(--border-radius-md)] border border-[var(--md-outline-variant)] bg-[var(--md-surface)] font-inherit text-[var(--md-on-surface)] outline-none transition-[var(--transition-all)] placeholder:text-[var(--md-on-surface-variant)] placeholder:opacity-70 hover:not-disabled:not-focus:border-[var(--border-color-hover)] focus:border-[var(--border-color-focus)] focus:[box-shadow:0_0_0_0.1875rem_rgba(47,93,140,0.15)] disabled:cursor-not-allowed disabled:bg-[var(--md-surface-container-high)] disabled:opacity-60",f?"border-[var(--md-error)] focus:border-[var(--md-error)] focus:[box-shadow:0_0_0_0.1875rem_rgba(186,26,26,0.2)]":"",o?"pl-10":"",s?"pr-10":"",{sm:"min-h-8 px-[var(--spacing-md)] py-[var(--spacing-sm)] text-[var(--font-size-sm)]",md:"min-h-10 px-[var(--spacing-lg)] py-[var(--spacing-md)] text-[var(--font-size-base)]",lg:"min-h-12 px-[var(--spacing-xl)] py-[var(--spacing-lg)] text-[var(--font-size-lg)]"}[i],c].filter(Boolean).join(" ");return e.jsxs("div",{className:`flex flex-col gap-[var(--spacing-xs)] ${n?"w-full":""}`,children:[t&&e.jsx("label",{className:"text-[var(--font-size-sm)] font-[var(--font-weight-semibold)] text-[var(--md-on-surface)]",htmlFor:l,children:t}),e.jsxs("div",{className:"group relative flex w-full items-center",children:[o&&e.jsx("span",{className:"pointer-events-none absolute left-[var(--spacing-md)] z-[1] flex items-center justify-center text-[var(--md-on-surface-variant)] group-focus-within:text-[var(--md-primary)] [&_svg]:h-[1.125rem] [&_svg]:w-[1.125rem]",children:o}),e.jsx("input",{"aria-describedby":a?`${l}-error`:r?`${l}-helper`:void 0,"aria-invalid":f?!0:void 0,className:p,id:l,...v}),s&&e.jsx("span",{className:"pointer-events-none absolute right-[var(--spacing-md)] z-[1] flex items-center justify-center text-[var(--md-on-surface-variant)] group-focus-within:text-[var(--md-primary)] [&_svg]:h-[1.125rem] [&_svg]:w-[1.125rem]",children:s})]}),a&&e.jsx("span",{className:"mt-[var(--spacing-xs)] block text-[var(--font-size-xs)] text-[var(--md-error)]",id:`${l}-error`,role:"alert",children:a}),r&&!a&&e.jsx("span",{className:"mt-[var(--spacing-xs)] block text-[var(--font-size-xs)] text-[var(--md-on-surface-variant)]",id:`${l}-helper`,children:r})]})},B=({isOpen:t,onClose:a,title:r,subtitle:o,children:s,size:n="md",showCloseButton:i=!0,closeOnOverlayClick:c=!0,className:h=""})=>{if(g.useEffect(()=>(t?document.body.style.overflow="hidden":document.body.style.overflow="",()=>{document.body.style.overflow=""}),[t]),g.useEffect(()=>{const m=p=>{p.key==="Escape"&&t&&a()};return t&&document.addEventListener("keydown",m),()=>document.removeEventListener("keydown",m)},[t,a]),!t)return null;const v=m=>{c&&m.target===m.currentTarget&&a()},f=["relative z-[var(--z-index-modal)] m-auto flex w-full max-h-[90vh] max-w-full flex-col overflow-hidden rounded-[var(--border-radius-2xl)] border border-[var(--md-outline-variant)] bg-[var(--md-surface)] shadow-[var(--shadow-2xl)]",{sm:"max-w-[25rem]",md:"max-w-[31.25rem]",lg:"max-w-[43.75rem]",xl:"max-w-[56.25rem]",full:"max-h-[90vh] max-w-[90vw]"}[n],h].filter(Boolean).join(" ");return e.jsx("div",{"aria-labelledby":r?"modal-title":void 0,"aria-modal":"true",className:"fixed inset-0 z-[var(--z-index-modal-backdrop)] flex min-h-[100dvh] items-center justify-center overflow-y-auto bg-black/50 p-[var(--spacing-lg)] backdrop-blur-[8px]",onClick:v,role:"dialog",children:e.jsxs("div",{className:f,children:[(r||o||i)&&e.jsxs("div",{className:"flex shrink-0 items-start justify-between gap-[var(--spacing-lg)] border-b border-[var(--md-outline-variant)] p-[var(--spacing-2xl)]",children:[(r||o)&&e.jsxs("div",{className:"flex-1",children:[r&&e.jsx("h2",{className:"mb-[var(--spacing-xs)] mt-0 text-[var(--font-size-2xl)] font-[var(--font-weight-semibold)] leading-[var(--line-height-tight)] text-[var(--md-on-surface)]",id:"modal-title",children:r}),o&&e.jsx("p",{className:"m-0 text-[var(--font-size-base)] leading-[var(--line-height-normal)] text-[var(--md-on-surface-variant)]",children:o})]}),i&&e.jsx("button",{"aria-label":"Fechar modal",className:"flex h-9 w-9 shrink-0 items-center justify-center rounded-[var(--border-radius-md)] border-0 bg-[var(--md-surface-container-high)] text-[var(--md-on-surface)] transition-[var(--transition-all)] hover:bg-[color:color-mix(in_srgb,var(--md-error)_15%,var(--md-surface))] hover:text-[var(--md-error)]",onClick:a,type:"button",children:e.jsxs("svg",{fill:"none",className:"h-5 w-5",stroke:"currentColor",strokeWidth:"2",viewBox:"0 0 24 24",children:[e.jsx("line",{x1:"18",x2:"6",y1:"6",y2:"18"}),e.jsx("line",{x1:"6",x2:"18",y1:"6",y2:"18"})]})})]}),e.jsx("div",{className:"flex min-h-0 flex-1 flex-col overflow-x-hidden overflow-y-auto p-[var(--spacing-2xl)]",children:s})]})})},T=({as:t="p",size:a="md",weight:r="normal",align:o="left",muted:s=!1,children:n,className:i="",...c})=>{const h=t,v={xs:"text-[var(--font-size-xs)] leading-[var(--line-height-normal)]",sm:"text-[var(--font-size-sm)] leading-[var(--line-height-normal)]",md:"text-[var(--font-size-base)] leading-[var(--line-height-relaxed)]",lg:"text-[var(--font-size-lg)] leading-[var(--line-height-loose)]"},l={light:"font-[var(--font-weight-light)]",normal:"font-[var(--font-weight-normal)]",medium:"font-[var(--font-weight-medium)]"},f={left:"text-left",center:"text-center",right:"text-right",justify:"text-justify"},m=["m-0 text-[var(--text-primary)] transition-[var(--transition-colors)]",v[a],l[r],f[o],s?"text-[var(--text-muted)]":"",i].filter(Boolean).join(" ");return e.jsx(h,{className:m,...c,children:n})},P=({as:t="p",size:a="md",weight:r="normal",align:o="left",muted:s=!1,children:n,className:i="",...c})=>{const h=t,v={xs:"text-[var(--font-size-xs)]",sm:"text-[var(--font-size-sm)]",md:"text-[var(--font-size-base)]",lg:"text-[var(--font-size-lg)]"},l={normal:"font-[var(--font-weight-normal)]",medium:"font-[var(--font-weight-medium)]",semibold:"font-[var(--font-weight-semibold)]"},f={left:"text-left",center:"text-center",right:"text-right"},m=["m-0 leading-[var(--line-height-normal)] text-[var(--text-secondary)] transition-[var(--transition-colors)]",v[a],l[r],f[o],s?"text-[var(--text-muted)] opacity-80":"",i].filter(Boolean).join(" ");return e.jsx(h,{className:m,...c,children:n})},$=({as:t="h1",size:a="2xl",weight:r="bold",align:o="left",gradient:s=!1,children:n,className:i="",...c})=>{const h=t,v={xs:"text-[var(--font-size-sm)]",sm:"text-[var(--font-size-base)]",md:"text-[var(--font-size-lg)]",lg:"text-[var(--font-size-xl)]",xl:"text-[var(--font-size-2xl)]","2xl":"text-[var(--font-size-3xl)]","3xl":"text-[var(--font-size-4xl)]","4xl":"text-[3rem]"},l={light:"font-[var(--font-weight-light)]",normal:"font-[var(--font-weight-normal)]",medium:"font-[var(--font-weight-medium)]",semibold:"font-[var(--font-weight-semibold)]",bold:"font-[var(--font-weight-bold)]",extrabold:"font-extrabold"},f={left:"text-left",center:"text-center",right:"text-right"},m=s?"bg-[linear-gradient(135deg,var(--text-primary)_0%,var(--primary-color)_50%,var(--secondary-color)_100%)] bg-clip-text text-transparent":"",p=["m-0 leading-[var(--line-height-tight)] text-[var(--text-primary)] transition-[var(--transition-colors)]",v[a],l[r],f[o],m,i].filter(Boolean).join(" ");return e.jsx(h,{className:p,...c,children:n})},C=g.createContext(void 0),F=()=>{const t=g.useContext(C);if(!t)throw new Error("useTheme must be used within a ThemeProvider");return t},W=({children:t,defaultTheme:a="light"})=>{const[r,o]=g.useState(()=>typeof window>"u"?a:window.localStorage.getItem("theme")||a);g.useEffect(()=>{typeof window>"u"||(window.localStorage.setItem("theme",r),document.documentElement.setAttribute("data-theme",r))},[r]);const s=()=>{o(n=>n==="dark"?"light":"dark")};return e.jsx(C.Provider,{value:{theme:r,toggleTheme:s},children:t})};d.Button=k,d.Card=M,d.Footer=_,d.Header=E,d.Input=S,d.Modal=B,d.Paragraph=T,d.Subtitle=P,d.ThemeProvider=W,d.Title=$,d.useTheme=F,Object.defineProperty(d,Symbol.toStringTag,{value:"Module"})}));
|
|
2
2
|
//# sourceMappingURL=oficios-ui.umd.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oficios-ui.umd.cjs","sources":["../src/components/Button/Button.tsx","../src/components/Card/Card.tsx","../src/components/Footer/Footer.tsx","../src/components/Header/Header.tsx","../src/components/Input/Input.tsx","../src/components/Modal/Modal.tsx","../src/components/Paragraph/Paragraph.tsx","../src/components/Subtitle/Subtitle.tsx","../src/components/Title/Title.tsx","../src/theme/ThemeProvider.tsx"],"sourcesContent":["import type React from 'react';\nimport './Button.css';\n\n/** Paletas do guia de marca (só afeta variant primary). Use para escolher o modelo de cor do botão. */\nexport type ButtonPalette =\n | 'verde-vibrante'\n | 'verde-profundo'\n | 'grafite-azulado'\n | 'azul-acinzentado'\n | 'cinza-medio'\n | 'cinza-escuro'\n | 'off-white';\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n children: React.ReactNode;\n fullWidth?: boolean;\n isLoading?: boolean;\n leftIcon?: React.ReactNode;\n /** Paleta de cor do guia de marca (aplica-se ao primary). Ignorado em outros variants. */\n palette?: ButtonPalette;\n rightIcon?: React.ReactNode;\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n variant?:\n | 'primary'\n | 'secondary'\n | 'success'\n | 'error'\n | 'warning'\n | 'info'\n | 'neutral'\n | 'ghost';\n}\n\nexport const Button: React.FC<ButtonProps> = ({\n variant = 'primary',\n size = 'md',\n fullWidth = false,\n isLoading = false,\n leftIcon,\n rightIcon,\n children,\n className = '',\n disabled,\n palette,\n ...props\n}) => {\n const baseClass = 'btn';\n const variantClass = `btn--${variant}`;\n const sizeClass = `btn--${size}`;\n const fullWidthClass = fullWidth ? 'btn--full-width' : '';\n const loadingClass = isLoading ? 'btn--loading' : '';\n const paletteClass =\n palette && variant === 'primary' ? `btn--palette-${palette}` : '';\n const combinedClass =\n `${baseClass} ${variantClass} ${sizeClass} ${fullWidthClass} ${loadingClass} ${paletteClass} ${className}`.trim();\n\n return (\n <button\n className={combinedClass}\n disabled={disabled || isLoading}\n {...props}\n >\n {isLoading && (\n <span aria-hidden=\"true\" className=\"btn__spinner\">\n <svg\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" strokeOpacity=\"0.25\" />\n <path d=\"M12 2 A10 10 0 0 1 22 12\" strokeLinecap=\"round\" />\n </svg>\n </span>\n )}\n {!isLoading && leftIcon && (\n <span className=\"btn__icon btn__icon--left\">{leftIcon}</span>\n )}\n <span className=\"btn__content\">{children}</span>\n {!isLoading && rightIcon && (\n <span className=\"btn__icon btn__icon--right\">{rightIcon}</span>\n )}\n </button>\n );\n};\n","import type React from 'react';\nimport './Card.css';\n\nexport interface CardProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n hoverable?: boolean;\n padding?: 'none' | 'sm' | 'md' | 'lg' | 'xl';\n variant?: 'default' | 'elevated' | 'outlined' | 'flat';\n}\n\nexport const Card: React.FC<CardProps> = ({\n variant = 'default',\n padding = 'md',\n hoverable = false,\n children,\n className = '',\n ...props\n}) => {\n const baseClass = 'card';\n const variantClass = `card--${variant}`;\n const paddingClass = `card--padding-${padding}`;\n const hoverableClass = hoverable ? 'card--hoverable' : '';\n const combinedClass =\n `${baseClass} ${variantClass} ${paddingClass} ${hoverableClass} ${className}`.trim();\n\n return (\n <div className={combinedClass} {...props}>\n {children}\n </div>\n );\n};\n","import type React from 'react';\nimport './Footer.css';\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 return (\n <footer className={`app-footer ${className}`.trim()}>\n <div className=\"app-footer-powered\">\n {poweredByText && (\n <span className=\"app-footer-powered-text\">{poweredByText}</span>\n )}\n {(logoSrc || logoFallbackText) && (\n <div className=\"app-footer-logo-wrap\">\n {logoSrc && (\n <img\n alt={logoAlt}\n className=\"app-footer-logo\"\n onError={(e) => {\n (e.target as HTMLImageElement).style.display = 'none';\n const next = (e.target as HTMLElement)\n .nextElementSibling as HTMLElement;\n if (next) {\n next.style.display = 'flex';\n }\n }}\n src={logoSrc}\n />\n )}\n {logoFallbackText && (\n <span\n className=\"app-footer-logo-fallback\"\n style={{ display: logoSrc ? 'none' : 'flex' }}\n >\n {logoFallbackText}\n </span>\n )}\n </div>\n )}\n </div>\n </footer>\n );\n};\n","import type React from 'react';\nimport { useEffect, useState } from 'react';\nimport type { Theme } from '../../theme/ThemeProvider';\nimport './Header.css';\n\nexport interface HeaderProps {\n /** Classe CSS adicional */\n className?: string;\n /** Texto alternativo do logo */\n logoAlt?: string;\n /** URL da imagem do logo (tema escuro). Se não informado, usa logoSrc. */\n logoDarkSrc?: string;\n /** URL da imagem do logo (tema claro) */\n logoSrc?: string;\n /** Callback ao clicar na área do logo/título */\n onLogoClick?: () => void;\n /** Conteúdo da área direita (ex.: seletor de idioma, toggle tema, menu usuário) */\n rightContent?: React.ReactNode;\n /** Subtítulo abaixo do título */\n subtitle?: React.ReactNode;\n /** Tema opcional para escolher o logo correto sem depender do ThemeProvider do UI */\n theme?: Theme;\n /** Título exibido ao lado do logo (ex.: \"OFÍCIO.IA\") */\n title?: React.ReactNode;\n}\n\nconst detectTheme = (): Theme => {\n if (typeof document === 'undefined') {\n return 'light';\n }\n\n return document.documentElement.getAttribute('data-theme') === 'dark'\n ? 'dark'\n : 'light';\n};\n\nexport const Header: React.FC<HeaderProps> = ({\n logoSrc,\n logoDarkSrc,\n logoAlt = 'Logo',\n title,\n subtitle,\n theme,\n onLogoClick,\n rightContent,\n className = '',\n}) => {\n const [isScrolled, setIsScrolled] = useState(false);\n const [resolvedTheme, setResolvedTheme] = useState<Theme>(\n () => theme ?? detectTheme()\n );\n\n const logoSrcResolved =\n resolvedTheme === 'dark' && logoDarkSrc ? logoDarkSrc : logoSrc;\n\n useEffect(() => {\n const handleScroll = () => setIsScrolled(window.scrollY > 10);\n window.addEventListener('scroll', handleScroll, { passive: true });\n return () => window.removeEventListener('scroll', handleScroll);\n }, []);\n\n useEffect(() => {\n if (theme) {\n setResolvedTheme(theme);\n return;\n }\n\n const syncTheme = () => setResolvedTheme(detectTheme());\n syncTheme();\n\n if (typeof MutationObserver === 'undefined') {\n return;\n }\n\n const observer = new MutationObserver(syncTheme);\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['data-theme'],\n });\n\n return () => observer.disconnect();\n }, [theme]);\n\n const handleClick = () => onLogoClick?.();\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter') {\n onLogoClick?.();\n }\n };\n\n return (\n <header\n className={`app-header ${isScrolled ? 'scrolled' : ''} ${className}`.trim()}\n >\n <div className=\"app-header-top-bar\" />\n <div className=\"app-header-content\">\n <div\n className=\"app-header-left\"\n onClick={onLogoClick ? handleClick : undefined}\n onKeyDown={onLogoClick ? handleKeyDown : undefined}\n role={onLogoClick ? 'button' : undefined}\n tabIndex={onLogoClick ? 0 : undefined}\n >\n {logoSrcResolved && (\n <div className=\"app-header-logo\">\n <img\n alt={logoAlt}\n onError={(e) => {\n (e.target as HTMLImageElement).style.display = 'none';\n const next = (e.target as HTMLElement)\n .nextElementSibling as HTMLElement;\n if (next) {\n next.style.display = 'block';\n }\n }}\n src={logoSrcResolved}\n />\n <svg\n className=\"logo-icon-fallback\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M12 2L2 7l10 5 10-5-10-5z\" />\n <path d=\"M2 17l10 5 10-5M2 12l10 5 10-5\" />\n </svg>\n </div>\n )}\n {(title || subtitle) && (\n <div className=\"app-header-title\">\n {title && <h1>{title}</h1>}\n {subtitle && <p>{subtitle}</p>}\n </div>\n )}\n </div>\n {rightContent && <div className=\"app-header-right\">{rightContent}</div>}\n </div>\n </header>\n );\n};\n","import type React from 'react';\nimport './Input.css';\n\nexport interface InputProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> {\n error?: string;\n fullWidth?: boolean;\n helperText?: string;\n label?: string;\n leftIcon?: React.ReactNode;\n rightIcon?: React.ReactNode;\n size?: 'sm' | 'md' | 'lg';\n}\n\nexport const Input: React.FC<InputProps> = ({\n label,\n error,\n helperText,\n leftIcon,\n rightIcon,\n fullWidth = false,\n size = 'md',\n className = '',\n id,\n ...props\n}) => {\n const inputId = id || `input-${Math.random().toString(36).substring(2, 9)}`;\n const hasError = !!error;\n const baseClass = 'input';\n const sizeClass = `input--${size}`;\n const errorClass = hasError ? 'input--error' : '';\n const fullWidthClass = fullWidth ? 'input--full-width' : '';\n const hasLeftIconClass = leftIcon ? 'input--has-left-icon' : '';\n const hasRightIconClass = rightIcon ? 'input--has-right-icon' : '';\n const combinedClass =\n `${baseClass} ${sizeClass} ${errorClass} ${fullWidthClass} ${hasLeftIconClass} ${hasRightIconClass} ${className}`.trim();\n\n return (\n <div\n className={`input-wrapper ${fullWidth ? 'input-wrapper--full-width' : ''}`}\n >\n {label && (\n <label className=\"input-label\" htmlFor={inputId}>\n {label}\n </label>\n )}\n <div className=\"input-container\">\n {leftIcon && (\n <span className=\"input-icon input-icon--left\">{leftIcon}</span>\n )}\n <input\n aria-describedby={\n error\n ? `${inputId}-error`\n : helperText\n ? `${inputId}-helper`\n : undefined\n }\n aria-invalid={hasError ? true : undefined}\n className={combinedClass}\n id={inputId}\n {...props}\n />\n {rightIcon && (\n <span className=\"input-icon input-icon--right\">{rightIcon}</span>\n )}\n </div>\n {error && (\n <span className=\"input-error\" id={`${inputId}-error`} role=\"alert\">\n {error}\n </span>\n )}\n {helperText && !error && (\n <span className=\"input-helper\" id={`${inputId}-helper`}>\n {helperText}\n </span>\n )}\n </div>\n );\n};\n","import type React from 'react';\nimport { useEffect } from 'react';\nimport './Modal.css';\n\nexport interface ModalProps {\n children: React.ReactNode;\n className?: string;\n closeOnOverlayClick?: boolean;\n isOpen: boolean;\n onClose: () => void;\n showCloseButton?: boolean;\n size?: 'sm' | 'md' | 'lg' | 'xl' | 'full';\n subtitle?: string;\n title?: string | React.ReactNode;\n}\n\nexport const Modal: React.FC<ModalProps> = ({\n isOpen,\n onClose,\n title,\n subtitle,\n children,\n size = 'md',\n showCloseButton = true,\n closeOnOverlayClick = true,\n className = '',\n}) => {\n useEffect(() => {\n if (isOpen) {\n document.body.style.overflow = 'hidden';\n } else {\n document.body.style.overflow = '';\n }\n return () => {\n document.body.style.overflow = '';\n };\n }, [isOpen]);\n\n useEffect(() => {\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && isOpen) {\n onClose();\n }\n };\n if (isOpen) {\n document.addEventListener('keydown', handleEscape);\n }\n return () => document.removeEventListener('keydown', handleEscape);\n }, [isOpen, onClose]);\n\n if (!isOpen) {\n return null;\n }\n\n const handleOverlayClick = (e: React.MouseEvent<HTMLDivElement>) => {\n if (closeOnOverlayClick && e.target === e.currentTarget) {\n onClose();\n }\n };\n\n const sizeClass = `modal--${size}`;\n const combinedClass = `modal ${sizeClass} ${className}`.trim();\n\n return (\n <div\n aria-labelledby={title ? 'modal-title' : undefined}\n aria-modal=\"true\"\n className=\"modal-overlay\"\n onClick={handleOverlayClick}\n role=\"dialog\"\n >\n <div className={combinedClass}>\n {(title || subtitle || showCloseButton) && (\n <div className=\"modal-header\">\n {(title || subtitle) && (\n <div className=\"modal-header-content\">\n {title && (\n <h2 className=\"modal-title\" id=\"modal-title\">\n {title}\n </h2>\n )}\n {subtitle && <p className=\"modal-subtitle\">{subtitle}</p>}\n </div>\n )}\n {showCloseButton && (\n <button\n aria-label=\"Fechar modal\"\n className=\"modal-close\"\n onClick={onClose}\n type=\"button\"\n >\n <svg\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n >\n <line x1=\"18\" x2=\"6\" y1=\"6\" y2=\"18\" />\n <line x1=\"6\" x2=\"18\" y1=\"6\" y2=\"18\" />\n </svg>\n </button>\n )}\n </div>\n )}\n <div className=\"modal-content\">{children}</div>\n </div>\n </div>\n );\n};\n","import type React from 'react';\nimport './Paragraph.css';\n\nexport interface ParagraphProps\n extends React.HTMLAttributes<HTMLParagraphElement> {\n align?: 'left' | 'center' | 'right' | 'justify';\n as?: 'p' | 'span' | 'div';\n children: React.ReactNode;\n muted?: boolean;\n size?: 'xs' | 'sm' | 'md' | 'lg';\n weight?: 'light' | 'normal' | 'medium';\n}\n\nexport const Paragraph: React.FC<ParagraphProps> = ({\n as = 'p',\n size = 'md',\n weight = 'normal',\n align = 'left',\n muted = false,\n children,\n className = '',\n ...props\n}) => {\n const Component = as;\n const baseClass = 'paragraph';\n const sizeClass = `paragraph--${size}`;\n const weightClass = `paragraph--${weight}`;\n const alignClass = `paragraph--align-${align}`;\n const mutedClass = muted ? 'paragraph--muted' : '';\n const combinedClass =\n `${baseClass} ${sizeClass} ${weightClass} ${alignClass} ${mutedClass} ${className}`.trim();\n\n return (\n <Component className={combinedClass} {...props}>\n {children}\n </Component>\n );\n};\n","import type React from 'react';\nimport './Subtitle.css';\n\nexport interface SubtitleProps\n extends React.HTMLAttributes<HTMLParagraphElement> {\n align?: 'left' | 'center' | 'right';\n as?: 'p' | 'span' | 'div';\n children: React.ReactNode;\n muted?: boolean;\n size?: 'xs' | 'sm' | 'md' | 'lg';\n weight?: 'normal' | 'medium' | 'semibold';\n}\n\nexport const Subtitle: React.FC<SubtitleProps> = ({\n as = 'p',\n size = 'md',\n weight = 'normal',\n align = 'left',\n muted = false,\n children,\n className = '',\n ...props\n}) => {\n const Component = as;\n const baseClass = 'subtitle';\n const sizeClass = `subtitle--${size}`;\n const weightClass = `subtitle--${weight}`;\n const alignClass = `subtitle--align-${align}`;\n const mutedClass = muted ? 'subtitle--muted' : '';\n const combinedClass =\n `${baseClass} ${sizeClass} ${weightClass} ${alignClass} ${mutedClass} ${className}`.trim();\n\n return (\n <Component className={combinedClass} {...props}>\n {children}\n </Component>\n );\n};\n","import type React from 'react';\nimport './Title.css';\n\nexport interface TitleProps extends React.HTMLAttributes<HTMLHeadingElement> {\n align?: 'left' | 'center' | 'right';\n as?: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\n children: React.ReactNode;\n gradient?: boolean;\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl';\n weight?: 'light' | 'normal' | 'medium' | 'semibold' | 'bold' | 'extrabold';\n}\n\nexport const Title: React.FC<TitleProps> = ({\n as = 'h1',\n size = '2xl',\n weight = 'bold',\n align = 'left',\n gradient = false,\n children,\n className = '',\n ...props\n}) => {\n const Component = as;\n const baseClass = 'title';\n const sizeClass = `title--${size}`;\n const weightClass = `title--${weight}`;\n const alignClass = `title--align-${align}`;\n const gradientClass = gradient ? 'title--gradient' : '';\n const combinedClass =\n `${baseClass} ${sizeClass} ${weightClass} ${alignClass} ${gradientClass} ${className}`.trim();\n\n return (\n <Component className={combinedClass} {...props}>\n {children}\n </Component>\n );\n};\n","import {\n createContext,\n type ReactNode,\n useContext,\n useEffect,\n useState,\n} from 'react';\n\nexport type Theme = 'light' | 'dark';\n\ninterface ThemeContextType {\n theme: Theme;\n toggleTheme: () => void;\n}\n\nconst ThemeContext = createContext<ThemeContextType | undefined>(undefined);\n\nexport const useTheme = (): ThemeContextType => {\n const context = useContext(ThemeContext);\n if (!context) {\n throw new Error('useTheme must be used within a ThemeProvider');\n }\n return context;\n};\n\ninterface ThemeProviderProps {\n children: ReactNode;\n defaultTheme?: Theme;\n}\n\nexport const ThemeProvider = ({\n children,\n defaultTheme = 'light',\n}: ThemeProviderProps) => {\n const [theme, setTheme] = useState<Theme>(() => {\n if (typeof window === 'undefined') {\n return defaultTheme;\n }\n const saved = window.localStorage.getItem('theme');\n return (saved as Theme) || defaultTheme;\n });\n\n useEffect(() => {\n if (typeof window === 'undefined') {\n return;\n }\n window.localStorage.setItem('theme', theme);\n document.documentElement.setAttribute('data-theme', theme);\n }, [theme]);\n\n const toggleTheme = (): void => {\n setTheme((prev) => (prev === 'dark' ? 'light' : 'dark'));\n };\n\n return (\n <ThemeContext.Provider value={{ theme, toggleTheme }}>\n {children}\n </ThemeContext.Provider>\n );\n};\n"],"names":["Button","variant","size","fullWidth","isLoading","leftIcon","rightIcon","children","className","disabled","palette","props","variantClass","sizeClass","fullWidthClass","loadingClass","paletteClass","combinedClass","jsxs","jsx","Card","padding","hoverable","baseClass","paddingClass","Footer","poweredByText","logoSrc","logoAlt","logoFallbackText","e","next","detectTheme","Header","logoDarkSrc","title","subtitle","theme","onLogoClick","rightContent","isScrolled","setIsScrolled","useState","resolvedTheme","setResolvedTheme","logoSrcResolved","useEffect","handleScroll","syncTheme","observer","handleClick","handleKeyDown","Input","label","error","helperText","id","inputId","hasError","Modal","isOpen","onClose","showCloseButton","closeOnOverlayClick","handleEscape","handleOverlayClick","Paragraph","as","weight","align","muted","Component","weightClass","alignClass","Subtitle","Title","gradient","ThemeContext","createContext","useTheme","context","useContext","ThemeProvider","defaultTheme","setTheme","toggleTheme","prev"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"oficios-ui.umd.cjs","sources":["../src/components/Button/Button.tsx","../src/components/Card/Card.tsx","../src/components/Footer/Footer.tsx","../src/components/Header/Header.tsx","../src/components/Input/Input.tsx","../src/components/Modal/Modal.tsx","../src/components/Paragraph/Paragraph.tsx","../src/components/Subtitle/Subtitle.tsx","../src/components/Title/Title.tsx","../src/theme/ThemeProvider.tsx"],"sourcesContent":["import type React from 'react';\nimport type { CSSProperties } from 'react';\n\n/** Paletas do guia de marca (só afeta variant primary). Use para escolher o modelo de cor do botão. */\nexport type ButtonPalette =\n | 'verde-vibrante'\n | 'verde-profundo'\n | 'grafite-azulado'\n | 'azul-acinzentado'\n | 'cinza-medio'\n | 'cinza-escuro'\n | 'off-white';\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n children: React.ReactNode;\n compact?: boolean;\n fullWidth?: boolean;\n isLoading?: boolean;\n leftIcon?: React.ReactNode;\n /** Paleta de cor do guia de marca (aplica-se ao primary). Ignorado em outros variants. */\n palette?: ButtonPalette;\n rightIcon?: React.ReactNode;\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n variant?:\n | 'primary'\n | 'secondary'\n | 'success'\n | 'error'\n | 'warning'\n | 'info'\n | 'neutral'\n | 'ghost';\n}\n\nexport const Button: React.FC<ButtonProps> = ({\n variant = 'primary',\n size = 'md',\n compact = false,\n fullWidth = false,\n isLoading = false,\n leftIcon,\n rightIcon,\n children,\n className = '',\n disabled,\n palette,\n style,\n ...props\n}) => {\n const baseClass =\n 'relative inline-flex select-none items-center justify-center overflow-hidden whitespace-nowrap border border-transparent font-semibold leading-none tracking-[0.01em] transition-[all_var(--transition-base)]';\n const focusClass =\n 'focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--md-primary)]';\n const disabledClass = 'disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-60';\n const fullWidthClass = fullWidth ? 'w-full' : '';\n const loadingClass = isLoading ? '[&_.btn__content]:opacity-0' : '';\n\n const sizeClassMap: Record<NonNullable<ButtonProps['size']>, string> = {\n xs: compact\n ? 'min-h-[1.75rem] min-w-[1.75rem] gap-1 px-2 py-1 text-[var(--font-size-xs)]'\n : 'min-h-8 min-w-8 gap-1.5 px-3 py-1.5 text-[var(--font-size-xs)]',\n sm: compact\n ? 'min-h-8 min-w-8 gap-[0.3125rem] px-2.5 py-1.5 text-[var(--font-size-sm)]'\n : 'min-h-9 min-w-9 gap-[0.4375rem] px-3.5 py-2 text-[var(--font-size-sm)]',\n md: compact\n ? 'min-h-[2.375rem] min-w-[2.375rem] gap-1.5 px-3 py-2 text-[var(--font-size-base)]'\n : 'min-h-11 min-w-11 gap-2 px-4 py-2.5 text-[var(--font-size-base)]',\n lg: compact\n ? 'min-h-[2.625rem] min-w-[2.625rem] gap-[0.4375rem] px-3.5 py-[0.5625rem] text-[var(--font-size-lg)]'\n : 'min-h-12 min-w-12 gap-[0.5625rem] px-6 py-4 text-[var(--font-size-lg)]',\n xl: compact\n ? 'min-h-12 min-w-12 gap-2 px-4 py-3 text-[var(--font-size-xl)]'\n : 'min-h-14 min-w-14 gap-2.5 px-8 py-6 text-[var(--font-size-xl)]',\n };\n\n const variantClassMap: Record<NonNullable<ButtonProps['variant']>, string> = {\n primary:\n 'bg-[var(--md-primary)] text-[var(--md-on-primary)] shadow-[var(--shadow-sm)] hover:translate-y-[-0.125rem] hover:bg-[var(--primary-color-hover)] hover:shadow-[var(--shadow-md)]',\n secondary:\n 'bg-[var(--md-secondary)] text-[var(--md-on-secondary)] shadow-[var(--shadow-sm)] hover:translate-y-[-0.125rem] hover:bg-[var(--secondary-color-light)] hover:shadow-[var(--shadow-md)]',\n success:\n 'bg-[var(--success-color)] text-white shadow-[var(--shadow-sm)] hover:translate-y-[-0.125rem] hover:bg-[var(--success-color-light)] hover:shadow-[var(--shadow-md)]',\n error:\n 'bg-[var(--md-error)] text-[var(--md-on-error)] shadow-[var(--shadow-sm)] hover:translate-y-[-0.125rem] hover:bg-[var(--error-color-light)] hover:shadow-[var(--shadow-md)]',\n warning:\n 'bg-[var(--warning-color)] text-white shadow-[var(--shadow-sm)] hover:translate-y-[-0.125rem] hover:bg-[var(--warning-color-light)] hover:shadow-[var(--shadow-md)]',\n info: 'bg-[var(--info-color)] text-white shadow-[var(--shadow-sm)] hover:translate-y-[-0.125rem] hover:bg-[var(--info-color-light)] hover:shadow-[var(--shadow-md)]',\n neutral:\n 'bg-[var(--neutral-color)] text-white shadow-[var(--shadow-sm)] hover:translate-y-[-0.125rem] hover:bg-[var(--neutral-color-light)] hover:shadow-[var(--shadow-md)]',\n ghost:\n 'border-[var(--md-outline-variant)] bg-transparent text-[var(--md-on-surface)] hover:bg-[var(--bg-hover)] hover:text-[var(--md-primary)] hover:border-[var(--border-color-hover)]',\n };\n\n const iconSizeClassMap: Record<NonNullable<ButtonProps['size']>, string> = {\n xs: compact ? 'h-3 w-3' : 'h-3.5 w-3.5',\n sm: compact ? 'h-3.5 w-3.5' : 'h-4 w-4',\n md: 'h-[1.125rem] w-[1.125rem]',\n lg: 'h-5 w-5',\n xl: 'h-5 w-5',\n };\n\n const paletteVars: Record<\n ButtonPalette,\n { primary: string; hover: string; onPrimary?: string }\n > = {\n 'verde-vibrante': {\n primary: 'var(--brand-verde-vibrante)',\n hover: 'var(--brand-verde-profundo)',\n },\n 'verde-profundo': {\n primary: 'var(--brand-verde-profundo)',\n hover: 'var(--brand-grafite-azulado)',\n },\n 'grafite-azulado': {\n primary: 'var(--brand-grafite-azulado)',\n hover: 'var(--brand-cinza-escuro)',\n },\n 'azul-acinzentado': {\n primary: 'var(--brand-azul-acinzentado)',\n hover: 'var(--brand-grafite-azulado)',\n },\n 'cinza-medio': {\n primary: 'var(--brand-cinza-medio)',\n hover: 'var(--brand-cinza-escuro)',\n },\n 'cinza-escuro': {\n primary: 'var(--brand-cinza-escuro)',\n hover: 'var(--brand-preto)',\n },\n 'off-white': {\n primary: 'var(--brand-off-white)',\n hover: 'var(--brand-branco)',\n onPrimary: 'var(--brand-grafite-azulado)',\n },\n };\n\n type ButtonCssVars = CSSProperties & {\n '--md-primary'?: string;\n '--primary-color-hover'?: string;\n '--md-on-primary'?: string;\n };\n const paletteStyle: ButtonCssVars = {};\n if (palette && variant === 'primary') {\n paletteStyle['--md-primary'] = paletteVars[palette].primary;\n paletteStyle['--primary-color-hover'] = paletteVars[palette].hover;\n if (paletteVars[palette].onPrimary) {\n paletteStyle['--md-on-primary'] = paletteVars[palette].onPrimary;\n }\n }\n\n const combinedClass = [\n baseClass,\n focusClass,\n disabledClass,\n sizeClassMap[size],\n variantClassMap[variant],\n fullWidthClass,\n loadingClass,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <button\n className={combinedClass}\n disabled={disabled || isLoading}\n style={{ ...paletteStyle, ...style }}\n {...props}\n >\n {isLoading && (\n <span\n aria-hidden=\"true\"\n className=\"absolute inline-flex h-[1em] w-[1em] animate-spin items-center justify-center\"\n >\n <svg fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" viewBox=\"0 0 24 24\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" strokeOpacity=\"0.25\" />\n <path d=\"M12 2 A10 10 0 0 1 22 12\" strokeLinecap=\"round\" />\n </svg>\n </span>\n )}\n {!isLoading && leftIcon && (\n <span\n className={`mr-1 inline-flex shrink-0 items-center justify-center leading-none ${iconSizeClassMap[size]}`}\n >\n {leftIcon}\n </span>\n )}\n <span className=\"btn__content inline-flex items-center justify-center\">\n {children}\n </span>\n {!isLoading && rightIcon && (\n <span\n className={`ml-1 inline-flex shrink-0 items-center justify-center leading-none ${iconSizeClassMap[size]}`}\n >\n {rightIcon}\n </span>\n )}\n </button>\n );\n};\n","import type React from 'react';\n\nexport interface CardProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n hoverable?: boolean;\n padding?: 'none' | 'sm' | 'md' | 'lg' | 'xl';\n variant?: 'default' | 'elevated' | 'outlined' | 'flat';\n}\n\nexport const Card: React.FC<CardProps> = ({\n variant = 'default',\n padding = 'md',\n hoverable = false,\n children,\n className = '',\n ...props\n}) => {\n const baseClass =\n 'relative overflow-hidden rounded-[var(--border-radius-lg)] transition-[var(--transition-all)]';\n const variantClassMap: Record<NonNullable<CardProps['variant']>, string> = {\n default:\n 'bg-[var(--md-surface)] border border-[var(--md-outline-variant)] shadow-[var(--shadow-sm)]',\n elevated:\n 'bg-[var(--md-surface)] border border-[var(--md-outline-variant)] shadow-[var(--shadow-lg)]',\n outlined: 'bg-transparent border border-[var(--md-outline-variant)] shadow-none',\n flat: 'bg-[var(--md-surface)] border-0 shadow-none',\n };\n const paddingClassMap: Record<NonNullable<CardProps['padding']>, string> = {\n none: 'p-0',\n sm: 'p-[var(--spacing-md)]',\n md: 'p-[var(--spacing-lg)]',\n lg: 'p-[var(--spacing-xl)]',\n xl: 'p-[var(--spacing-2xl)]',\n };\n const hoverableClass = hoverable ? 'hover:shadow-[var(--shadow-md)]' : '';\n const combinedClass = [\n baseClass,\n variantClassMap[variant],\n paddingClassMap[padding],\n hoverableClass,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div className={combinedClass} {...props}>\n {children}\n </div>\n );\n};\n","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","import type React from 'react';\nimport { useEffect, useState } from 'react';\nimport type { Theme } from '../../theme/ThemeProvider';\n\nexport interface HeaderProps {\n /** Classe CSS adicional */\n className?: string;\n /** Texto alternativo do logo */\n logoAlt?: string;\n /** URL da imagem do logo (tema escuro). Se não informado, usa logoSrc. */\n logoDarkSrc?: string;\n /** URL da imagem do logo (tema claro) */\n logoSrc?: string;\n /** Callback ao clicar na área do logo/título */\n onLogoClick?: () => void;\n /** Conteúdo da área direita (ex.: seletor de idioma, toggle tema, menu usuário) */\n rightContent?: React.ReactNode;\n /** Subtítulo abaixo do título */\n subtitle?: React.ReactNode;\n /** Tema opcional para escolher o logo correto sem depender do ThemeProvider do UI */\n theme?: Theme;\n /** Título exibido ao lado do logo (ex.: \"OFÍCIO.IA\") */\n title?: React.ReactNode;\n}\n\nconst detectTheme = (): Theme => {\n if (typeof document === 'undefined') {\n return 'light';\n }\n\n return document.documentElement.getAttribute('data-theme') === 'dark'\n ? 'dark'\n : 'light';\n};\n\nexport const Header: React.FC<HeaderProps> = ({\n logoSrc,\n logoDarkSrc,\n logoAlt = 'Logo',\n title,\n subtitle,\n theme,\n onLogoClick,\n rightContent,\n className = '',\n}) => {\n const [isScrolled, setIsScrolled] = useState(false);\n const [resolvedTheme, setResolvedTheme] = useState<Theme>(\n () => theme ?? detectTheme()\n );\n\n const logoSrcResolved =\n resolvedTheme === 'dark' && logoDarkSrc ? logoDarkSrc : logoSrc;\n\n useEffect(() => {\n const handleScroll = () => setIsScrolled(window.scrollY > 10);\n window.addEventListener('scroll', handleScroll, { passive: true });\n return () => window.removeEventListener('scroll', handleScroll);\n }, []);\n\n useEffect(() => {\n if (theme) {\n setResolvedTheme(theme);\n return;\n }\n\n const syncTheme = () => setResolvedTheme(detectTheme());\n syncTheme();\n\n if (typeof MutationObserver === 'undefined') {\n return;\n }\n\n const observer = new MutationObserver(syncTheme);\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['data-theme'],\n });\n\n return () => observer.disconnect();\n }, [theme]);\n\n const handleClick = () => onLogoClick?.();\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter') {\n onLogoClick?.();\n }\n };\n\n return (\n <header\n className={[\n 'fixed inset-x-0 top-0 z-[1000] w-full backdrop-blur-[12px]',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n >\n <div className=\"h-0.5 w-full bg-[var(--md-primary)]\" />\n <div\n 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\"\n style={{\n color: 'var(--md-on-surface)',\n background: `color-mix(in srgb, var(--md-surface) ${\n isScrolled ? '14%' : '18%'\n }, transparent)`,\n borderBottom: `1px solid color-mix(in srgb, var(--md-outline-variant) ${\n isScrolled ? '22%' : '30%'\n }, transparent)`,\n }}\n >\n <div\n className=\"flex cursor-pointer items-center gap-3 transition-opacity duration-200 ease-in-out hover:opacity-80\"\n onClick={onLogoClick ? handleClick : undefined}\n onKeyDown={onLogoClick ? handleKeyDown : undefined}\n role={onLogoClick ? 'button' : undefined}\n tabIndex={onLogoClick ? 0 : undefined}\n >\n {logoSrcResolved && (\n <div className=\"flex h-16 w-16 shrink-0 items-center justify-center\">\n <img\n alt={logoAlt}\n className=\"h-full w-full object-contain\"\n onError={(e) => {\n (e.target as HTMLImageElement).style.display = 'none';\n const next = (e.target as HTMLElement)\n .nextElementSibling as HTMLElement;\n if (next) {\n next.style.display = 'block';\n }\n }}\n src={logoSrcResolved}\n />\n <svg\n className=\"hidden h-full w-full\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M12 2L2 7l10 5 10-5-10-5z\" />\n <path d=\"M2 17l10 5 10-5M2 12l10 5 10-5\" />\n </svg>\n </div>\n )}\n {(title || subtitle) && (\n <div className=\"flex flex-col gap-1\">\n {title && (\n <h1\n 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\"\n style={{ fontFamily: '\"Orbitron\", sans-serif' }}\n >\n {title}\n </h1>\n )}\n {subtitle && (\n <p className=\"m-0 text-[0.8125rem] font-normal text-[var(--md-on-surface-variant)] max-md:text-xs\">\n {subtitle}\n </p>\n )}\n </div>\n )}\n </div>\n {rightContent && (\n <div className=\"flex shrink-0 items-center gap-3 max-md:w-full max-md:flex-wrap max-md:justify-between\">\n {rightContent}\n </div>\n )}\n </div>\n </header>\n );\n};\n","import type React from 'react';\n\nexport interface InputProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> {\n error?: string;\n fullWidth?: boolean;\n helperText?: string;\n label?: string;\n leftIcon?: React.ReactNode;\n rightIcon?: React.ReactNode;\n size?: 'sm' | 'md' | 'lg';\n}\n\nexport const Input: React.FC<InputProps> = ({\n label,\n error,\n helperText,\n leftIcon,\n rightIcon,\n fullWidth = false,\n size = 'md',\n className = '',\n id,\n ...props\n}) => {\n const inputId = id || `input-${Math.random().toString(36).substring(2, 9)}`;\n const hasError = !!error;\n const sizeClassMap: Record<NonNullable<InputProps['size']>, string> = {\n sm: 'min-h-8 px-[var(--spacing-md)] py-[var(--spacing-sm)] text-[var(--font-size-sm)]',\n md: 'min-h-10 px-[var(--spacing-lg)] py-[var(--spacing-md)] text-[var(--font-size-base)]',\n lg: 'min-h-12 px-[var(--spacing-xl)] py-[var(--spacing-lg)] text-[var(--font-size-lg)]',\n };\n const combinedClass = [\n 'w-full rounded-[var(--border-radius-md)] border border-[var(--md-outline-variant)] bg-[var(--md-surface)] font-inherit text-[var(--md-on-surface)] outline-none transition-[var(--transition-all)] placeholder:text-[var(--md-on-surface-variant)] placeholder:opacity-70 hover:not-disabled:not-focus:border-[var(--border-color-hover)] focus:border-[var(--border-color-focus)] focus:[box-shadow:0_0_0_0.1875rem_rgba(47,93,140,0.15)] disabled:cursor-not-allowed disabled:bg-[var(--md-surface-container-high)] disabled:opacity-60',\n hasError\n ? 'border-[var(--md-error)] focus:border-[var(--md-error)] focus:[box-shadow:0_0_0_0.1875rem_rgba(186,26,26,0.2)]'\n : '',\n leftIcon ? 'pl-10' : '',\n rightIcon ? 'pr-10' : '',\n sizeClassMap[size],\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div className={`flex flex-col gap-[var(--spacing-xs)] ${fullWidth ? 'w-full' : ''}`}>\n {label && (\n <label\n className=\"text-[var(--font-size-sm)] font-[var(--font-weight-semibold)] text-[var(--md-on-surface)]\"\n htmlFor={inputId}\n >\n {label}\n </label>\n )}\n <div className=\"group relative flex w-full items-center\">\n {leftIcon && (\n <span className=\"pointer-events-none absolute left-[var(--spacing-md)] z-[1] flex items-center justify-center text-[var(--md-on-surface-variant)] group-focus-within:text-[var(--md-primary)] [&_svg]:h-[1.125rem] [&_svg]:w-[1.125rem]\">\n {leftIcon}\n </span>\n )}\n <input\n aria-describedby={\n error\n ? `${inputId}-error`\n : helperText\n ? `${inputId}-helper`\n : undefined\n }\n aria-invalid={hasError ? true : undefined}\n className={combinedClass}\n id={inputId}\n {...props}\n />\n {rightIcon && (\n <span className=\"pointer-events-none absolute right-[var(--spacing-md)] z-[1] flex items-center justify-center text-[var(--md-on-surface-variant)] group-focus-within:text-[var(--md-primary)] [&_svg]:h-[1.125rem] [&_svg]:w-[1.125rem]\">\n {rightIcon}\n </span>\n )}\n </div>\n {error && (\n <span\n className=\"mt-[var(--spacing-xs)] block text-[var(--font-size-xs)] text-[var(--md-error)]\"\n id={`${inputId}-error`}\n role=\"alert\"\n >\n {error}\n </span>\n )}\n {helperText && !error && (\n <span\n className=\"mt-[var(--spacing-xs)] block text-[var(--font-size-xs)] text-[var(--md-on-surface-variant)]\"\n id={`${inputId}-helper`}\n >\n {helperText}\n </span>\n )}\n </div>\n );\n};\n","import type React from 'react';\nimport { useEffect } from 'react';\n\nexport interface ModalProps {\n children: React.ReactNode;\n className?: string;\n closeOnOverlayClick?: boolean;\n isOpen: boolean;\n onClose: () => void;\n showCloseButton?: boolean;\n size?: 'sm' | 'md' | 'lg' | 'xl' | 'full';\n subtitle?: string;\n title?: string | React.ReactNode;\n}\n\nexport const Modal: React.FC<ModalProps> = ({\n isOpen,\n onClose,\n title,\n subtitle,\n children,\n size = 'md',\n showCloseButton = true,\n closeOnOverlayClick = true,\n className = '',\n}) => {\n useEffect(() => {\n if (isOpen) {\n document.body.style.overflow = 'hidden';\n } else {\n document.body.style.overflow = '';\n }\n return () => {\n document.body.style.overflow = '';\n };\n }, [isOpen]);\n\n useEffect(() => {\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && isOpen) {\n onClose();\n }\n };\n if (isOpen) {\n document.addEventListener('keydown', handleEscape);\n }\n return () => document.removeEventListener('keydown', handleEscape);\n }, [isOpen, onClose]);\n\n if (!isOpen) {\n return null;\n }\n\n const handleOverlayClick = (e: React.MouseEvent<HTMLDivElement>) => {\n if (closeOnOverlayClick && e.target === e.currentTarget) {\n onClose();\n }\n };\n\n const sizeClassMap: Record<NonNullable<ModalProps['size']>, string> = {\n sm: 'max-w-[25rem]',\n md: 'max-w-[31.25rem]',\n lg: 'max-w-[43.75rem]',\n xl: 'max-w-[56.25rem]',\n full: 'max-h-[90vh] max-w-[90vw]',\n };\n const combinedClass = [\n 'relative z-[var(--z-index-modal)] m-auto flex w-full max-h-[90vh] max-w-full flex-col overflow-hidden rounded-[var(--border-radius-2xl)] border border-[var(--md-outline-variant)] bg-[var(--md-surface)] shadow-[var(--shadow-2xl)]',\n sizeClassMap[size],\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div\n aria-labelledby={title ? 'modal-title' : undefined}\n aria-modal=\"true\"\n className=\"fixed inset-0 z-[var(--z-index-modal-backdrop)] flex min-h-[100dvh] items-center justify-center overflow-y-auto bg-black/50 p-[var(--spacing-lg)] backdrop-blur-[8px]\"\n onClick={handleOverlayClick}\n role=\"dialog\"\n >\n <div className={combinedClass}>\n {(title || subtitle || showCloseButton) && (\n <div className=\"flex shrink-0 items-start justify-between gap-[var(--spacing-lg)] border-b border-[var(--md-outline-variant)] p-[var(--spacing-2xl)]\">\n {(title || subtitle) && (\n <div className=\"flex-1\">\n {title && (\n <h2\n className=\"mb-[var(--spacing-xs)] mt-0 text-[var(--font-size-2xl)] font-[var(--font-weight-semibold)] leading-[var(--line-height-tight)] text-[var(--md-on-surface)]\"\n id=\"modal-title\"\n >\n {title}\n </h2>\n )}\n {subtitle && (\n <p className=\"m-0 text-[var(--font-size-base)] leading-[var(--line-height-normal)] text-[var(--md-on-surface-variant)]\">\n {subtitle}\n </p>\n )}\n </div>\n )}\n {showCloseButton && (\n <button\n aria-label=\"Fechar modal\"\n className=\"flex h-9 w-9 shrink-0 items-center justify-center rounded-[var(--border-radius-md)] border-0 bg-[var(--md-surface-container-high)] text-[var(--md-on-surface)] transition-[var(--transition-all)] hover:bg-[color:color-mix(in_srgb,var(--md-error)_15%,var(--md-surface))] hover:text-[var(--md-error)]\"\n onClick={onClose}\n type=\"button\"\n >\n <svg\n fill=\"none\"\n className=\"h-5 w-5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n >\n <line x1=\"18\" x2=\"6\" y1=\"6\" y2=\"18\" />\n <line x1=\"6\" x2=\"18\" y1=\"6\" y2=\"18\" />\n </svg>\n </button>\n )}\n </div>\n )}\n <div className=\"flex min-h-0 flex-1 flex-col overflow-x-hidden overflow-y-auto p-[var(--spacing-2xl)]\">\n {children}\n </div>\n </div>\n </div>\n );\n};\n","import type React from 'react';\n\nexport interface ParagraphProps\n extends React.HTMLAttributes<HTMLParagraphElement> {\n align?: 'left' | 'center' | 'right' | 'justify';\n as?: 'p' | 'span' | 'div';\n children: React.ReactNode;\n muted?: boolean;\n size?: 'xs' | 'sm' | 'md' | 'lg';\n weight?: 'light' | 'normal' | 'medium';\n}\n\nexport const Paragraph: React.FC<ParagraphProps> = ({\n as = 'p',\n size = 'md',\n weight = 'normal',\n align = 'left',\n muted = false,\n children,\n className = '',\n ...props\n}) => {\n const Component = as;\n const sizeClassMap: Record<NonNullable<ParagraphProps['size']>, string> = {\n xs: 'text-[var(--font-size-xs)] leading-[var(--line-height-normal)]',\n sm: 'text-[var(--font-size-sm)] leading-[var(--line-height-normal)]',\n md: 'text-[var(--font-size-base)] leading-[var(--line-height-relaxed)]',\n lg: 'text-[var(--font-size-lg)] leading-[var(--line-height-loose)]',\n };\n const weightClassMap: Record<NonNullable<ParagraphProps['weight']>, string> = {\n light: 'font-[var(--font-weight-light)]',\n normal: 'font-[var(--font-weight-normal)]',\n medium: 'font-[var(--font-weight-medium)]',\n };\n const alignClassMap: Record<NonNullable<ParagraphProps['align']>, string> = {\n left: 'text-left',\n center: 'text-center',\n right: 'text-right',\n justify: 'text-justify',\n };\n const combinedClass = [\n 'm-0 text-[var(--text-primary)] transition-[var(--transition-colors)]',\n sizeClassMap[size],\n weightClassMap[weight],\n alignClassMap[align],\n muted ? 'text-[var(--text-muted)]' : '',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <Component className={combinedClass} {...props}>\n {children}\n </Component>\n );\n};\n","import type React from 'react';\n\nexport interface SubtitleProps\n extends React.HTMLAttributes<HTMLParagraphElement> {\n align?: 'left' | 'center' | 'right';\n as?: 'p' | 'span' | 'div';\n children: React.ReactNode;\n muted?: boolean;\n size?: 'xs' | 'sm' | 'md' | 'lg';\n weight?: 'normal' | 'medium' | 'semibold';\n}\n\nexport const Subtitle: React.FC<SubtitleProps> = ({\n as = 'p',\n size = 'md',\n weight = 'normal',\n align = 'left',\n muted = false,\n children,\n className = '',\n ...props\n}) => {\n const Component = as;\n const sizeClassMap: Record<NonNullable<SubtitleProps['size']>, string> = {\n xs: 'text-[var(--font-size-xs)]',\n sm: 'text-[var(--font-size-sm)]',\n md: 'text-[var(--font-size-base)]',\n lg: 'text-[var(--font-size-lg)]',\n };\n const weightClassMap: Record<NonNullable<SubtitleProps['weight']>, string> = {\n normal: 'font-[var(--font-weight-normal)]',\n medium: 'font-[var(--font-weight-medium)]',\n semibold: 'font-[var(--font-weight-semibold)]',\n };\n const alignClassMap: Record<NonNullable<SubtitleProps['align']>, string> = {\n left: 'text-left',\n center: 'text-center',\n right: 'text-right',\n };\n const combinedClass = [\n 'm-0 leading-[var(--line-height-normal)] text-[var(--text-secondary)] transition-[var(--transition-colors)]',\n sizeClassMap[size],\n weightClassMap[weight],\n alignClassMap[align],\n muted ? 'text-[var(--text-muted)] opacity-80' : '',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <Component className={combinedClass} {...props}>\n {children}\n </Component>\n );\n};\n","import type React from 'react';\n\nexport interface TitleProps extends React.HTMLAttributes<HTMLHeadingElement> {\n align?: 'left' | 'center' | 'right';\n as?: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\n children: React.ReactNode;\n gradient?: boolean;\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl';\n weight?: 'light' | 'normal' | 'medium' | 'semibold' | 'bold' | 'extrabold';\n}\n\nexport const Title: React.FC<TitleProps> = ({\n as = 'h1',\n size = '2xl',\n weight = 'bold',\n align = 'left',\n gradient = false,\n children,\n className = '',\n ...props\n}) => {\n const Component = as;\n const sizeClassMap: Record<NonNullable<TitleProps['size']>, string> = {\n xs: 'text-[var(--font-size-sm)]',\n sm: 'text-[var(--font-size-base)]',\n md: 'text-[var(--font-size-lg)]',\n lg: 'text-[var(--font-size-xl)]',\n xl: 'text-[var(--font-size-2xl)]',\n '2xl': 'text-[var(--font-size-3xl)]',\n '3xl': 'text-[var(--font-size-4xl)]',\n '4xl': 'text-[3rem]',\n };\n const weightClassMap: Record<NonNullable<TitleProps['weight']>, string> = {\n light: 'font-[var(--font-weight-light)]',\n normal: 'font-[var(--font-weight-normal)]',\n medium: 'font-[var(--font-weight-medium)]',\n semibold: 'font-[var(--font-weight-semibold)]',\n bold: 'font-[var(--font-weight-bold)]',\n extrabold: 'font-extrabold',\n };\n const alignClassMap: Record<NonNullable<TitleProps['align']>, string> = {\n left: 'text-left',\n center: 'text-center',\n right: 'text-right',\n };\n const gradientClass = gradient\n ? 'bg-[linear-gradient(135deg,var(--text-primary)_0%,var(--primary-color)_50%,var(--secondary-color)_100%)] bg-clip-text text-transparent'\n : '';\n const combinedClass = [\n 'm-0 leading-[var(--line-height-tight)] text-[var(--text-primary)] transition-[var(--transition-colors)]',\n sizeClassMap[size],\n weightClassMap[weight],\n alignClassMap[align],\n gradientClass,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <Component className={combinedClass} {...props}>\n {children}\n </Component>\n );\n};\n","import {\n createContext,\n type ReactNode,\n useContext,\n useEffect,\n useState,\n} from 'react';\n\nexport type Theme = 'light' | 'dark';\n\ninterface ThemeContextType {\n theme: Theme;\n toggleTheme: () => void;\n}\n\nconst ThemeContext = createContext<ThemeContextType | undefined>(undefined);\n\nexport const useTheme = (): ThemeContextType => {\n const context = useContext(ThemeContext);\n if (!context) {\n throw new Error('useTheme must be used within a ThemeProvider');\n }\n return context;\n};\n\ninterface ThemeProviderProps {\n children: ReactNode;\n defaultTheme?: Theme;\n}\n\nexport const ThemeProvider = ({\n children,\n defaultTheme = 'light',\n}: ThemeProviderProps) => {\n const [theme, setTheme] = useState<Theme>(() => {\n if (typeof window === 'undefined') {\n return defaultTheme;\n }\n const saved = window.localStorage.getItem('theme');\n return (saved as Theme) || defaultTheme;\n });\n\n useEffect(() => {\n if (typeof window === 'undefined') {\n return;\n }\n window.localStorage.setItem('theme', theme);\n document.documentElement.setAttribute('data-theme', theme);\n }, [theme]);\n\n const toggleTheme = (): void => {\n setTheme((prev) => (prev === 'dark' ? 'light' : 'dark'));\n };\n\n return (\n <ThemeContext.Provider value={{ theme, toggleTheme }}>\n {children}\n </ThemeContext.Provider>\n );\n};\n"],"names":["Button","variant","size","compact","fullWidth","isLoading","leftIcon","rightIcon","children","className","disabled","palette","style","props","baseClass","focusClass","disabledClass","fullWidthClass","loadingClass","sizeClassMap","variantClassMap","iconSizeClassMap","paletteVars","paletteStyle","combinedClass","jsxs","jsx","Card","padding","hoverable","paddingClassMap","hoverableClass","Footer","poweredByText","logoSrc","logoAlt","logoFallbackText","logoVisible","setLogoVisible","useState","e","detectTheme","Header","logoDarkSrc","title","subtitle","theme","onLogoClick","rightContent","isScrolled","setIsScrolled","resolvedTheme","setResolvedTheme","logoSrcResolved","useEffect","handleScroll","syncTheme","observer","handleClick","handleKeyDown","next","Input","label","error","helperText","id","inputId","hasError","Modal","isOpen","onClose","showCloseButton","closeOnOverlayClick","handleEscape","handleOverlayClick","Paragraph","as","weight","align","muted","Component","weightClassMap","alignClassMap","Subtitle","Title","gradient","gradientClass","ThemeContext","createContext","useTheme","context","useContext","ThemeProvider","defaultTheme","setTheme","toggleTheme","prev"],"mappings":"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"}
|
package/dist/theme.css
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
============================================================ */
|
|
5
5
|
|
|
6
6
|
@import url("https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:ital,wght@0,300;0,400;0,500;0,600;0,700;0,800;1,400;1,500&display=swap");
|
|
7
|
+
@import url("https://fonts.googleapis.com/css2?family=Orbitron:wght@400;500;600;700;800;900&display=swap");
|
|
7
8
|
|
|
8
9
|
/* ============================================================
|
|
9
10
|
GUIA DE MARCA - CORES (paleta fixa para referência e paletas)
|