@wrrdev/fenix-ui 1.0.4 → 1.0.6

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.
@@ -1 +1 @@
1
- {"version":3,"file":"fenix-ui2.esm.js","sources":["../src/plugins/auto-import.ts","../src/plugins/index.ts"],"sourcesContent":["/**\r\n * Registro de tags → subpaths para o auto-import.\r\n * Mantido em um módulo próprio (sem depender de DOM) para ser usado\r\n * também no build do cliente via plugin.\r\n */\r\nexport const fenixComponentMap: Record<string, string> = {\r\n 'fx-button': '@wrrdev/fenix-ui/button',\r\n 'fx-badge': '@wrrdev/fenix-ui/badge',\r\n 'fx-spinner': '@wrrdev/fenix-ui/spinner',\r\n 'fx-select': '@wrrdev/fenix-ui/select',\r\n 'fx-multiselect': '@wrrdev/fenix-ui/multiselect',\r\n 'fx-input': '@wrrdev/fenix-ui/input',\r\n 'fx-switch': '@wrrdev/fenix-ui/switch',\r\n 'fx-calendar': '@wrrdev/fenix-ui/calendar',\r\n 'fx-datepicker': '@wrrdev/fenix-ui/datepicker',\r\n 'fx-checkbox': '@wrrdev/fenix-ui/checkbox',\r\n 'fx-radio': '@wrrdev/fenix-ui/radio',\r\n 'fx-table': '@wrrdev/fenix-ui/table',\r\n 'fx-floatlabel': '@wrrdev/fenix-ui/floatlabel',\r\n 'fx-textarea': '@wrrdev/fenix-ui/textarea',\r\n 'fx-dialog': '@wrrdev/fenix-ui/dialog',\r\n 'fx-drawer': '@wrrdev/fenix-ui/drawer',\r\n 'fx-toast': '@wrrdev/fenix-ui/toast',\r\n 'fx-tooltip': '@wrrdev/fenix-ui/tooltip',\r\n 'fx-tabs': '@wrrdev/fenix-ui/tabs',\r\n 'fx-tab-panel': '@wrrdev/fenix-ui/tabs',\r\n 'fx-progress': '@wrrdev/fenix-ui/progress',\r\n 'fx-skeleton': '@wrrdev/fenix-ui/skeleton',\r\n 'fx-alert': '@wrrdev/fenix-ui/alert',\r\n 'fx-dropdown': '@wrrdev/fenix-ui/dropdown',\r\n 'fx-dropdown-item': '@wrrdev/fenix-ui/dropdown',\r\n 'fx-pagination': '@wrrdev/fenix-ui/pagination',\r\n 'fx-autocomplete': '@wrrdev/fenix-ui/autocomplete',\r\n};\r\n\r\nconst TAG_RE = /<(fx-[a-z][a-z-]*)(?=[\\s/>])/g;\r\n\r\nexport interface AutoImportOptions {\r\n /** Prefixo do pacote (padrão '@wrrdev/fenix-ui'). */\r\n packageName?: string;\r\n}\r\n\r\n/**\r\n * Injeta `import '<subpath>'` para cada componente fx-* usado no código\r\n * que ainda não foi importado. Retorna o código transformado ou o original.\r\n */\r\nexport function transformSource(code: string, options: AutoImportOptions = {}): string {\r\n const pkg = options.packageName ?? '@wrrdev/fenix-ui';\r\n // Subpaths do mapa são reescritos quando um pacote custom é informado.\r\n const resolve = (sub: string): string =>\r\n pkg === '@wrrdev/fenix-ui' ? sub : sub.replace('@wrrdev/fenix-ui', pkg);\r\n\r\n // Componentes usados e ainda não importados explicitamente.\r\n const needed = new Set<string>();\r\n for (const m of code.matchAll(TAG_RE)) {\r\n const sub = fenixComponentMap[m[1]];\r\n if (sub) {\r\n const target = resolve(sub);\r\n if (!code.includes(`'${target}'`) && !code.includes(`\"${target}\"`)) {\r\n needed.add(target);\r\n }\r\n }\r\n }\r\n if (!needed.size) return code;\r\n\r\n const lines = [...needed].map((s) => `import '${s}';`);\r\n\r\n // Arquivo único (.vue): injeta logo após a abertura do <script>.\r\n const vueScript = /(<script[^>]*>)\\n/.exec(code);\r\n if (vueScript) {\r\n return code.replace(vueScript[0], `${vueScript[1]}\\n${lines.join('\\n')}\\n`);\r\n }\r\n\r\n // TS/JS: injeta após o último import existente (ou no topo).\r\n let lastEnd = -1;\r\n for (const m of code.matchAll(/^[ \\t]*import\\b[^;]*?['\"][^'\"]+['\"];?[^\\S\\n]*$/gm)) {\r\n lastEnd = Math.max(lastEnd, m.index + m[0].length);\r\n }\r\n if (lastEnd === -1) return `${lines.join('\\n')}\\n${code}`;\r\n return `${code.slice(0, lastEnd)}\\n${lines.join('\\n')}${code.slice(lastEnd)}`;\r\n}\r\n\r\n/** Verifica se o arquivo deve ser transformado. */\r\nexport function shouldTransform(id: string): boolean {\r\n return (\r\n !id.includes('node_modules') &&\r\n !id.endsWith('.d.ts') &&\r\n !id.endsWith('.css') &&\r\n /\\.(ts|js|tsx|jsx|vue|html|svelte)$/.test(id)\r\n );\r\n}\r\n\r\n","/**\n * Plugin de AUTO-IMPORT para Vite/Rollup.\n *\n * O usuário escreve apenas `<fx-button>`, `<fx-select>` etc. no template/código;\n * este plugin detecta as tags em tempo de build e injeta os imports dos\n * subpaths correspondentes — mantendo o tree-shaking (só entra no bundle\n * o que é usado).\n *\n * Uso no projeto do cliente (vite.config.ts):\n * import { FenixAutoImport } from '@wrrdev/fenix-ui/auto-import';\n * export default { plugins: [FenixAutoImport()] };\n */\nimport {\n transformSource,\n shouldTransform,\n type AutoImportOptions,\n} from './auto-import';\n\nexport interface FenixPlugin {\n name: string;\n enforce: 'pre';\n transform: (\n code: string,\n id: string,\n ) => { code: string; map: null } | undefined;\n}\n\nexport function FenixAutoImport(options: AutoImportOptions = {}): FenixPlugin {\n return {\n name: 'fenix-ui-auto-import',\n enforce: 'pre',\n transform(code, id) {\n if (!shouldTransform(id)) return undefined;\n const result = transformSource(code, options);\n if (result === code) return undefined;\n return { code: result, map: null };\n },\n };\n}\n\nexport { transformSource, shouldTransform, fenixComponentMap } from './auto-import';\nexport type { AutoImportOptions } from './auto-import';\n"],"names":[],"mappings":"AAKO,MAAM,oBAA4C;AAAA,EACvD,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,aAAa;AAAA,EACb,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,oBAAoB;AAAA,EAClB,iBAAiB;AAAA,EACnB,mBAAmB;AACrB;AAEA,MAAM,SAAS;AAWR,SAAS,gBAAgB,MAAc,UAA6B,IAAY;AACrF,QAAM,MAAM,QAAQ,eAAe;AAEnC,QAAM,UAAU,CAAC,QACf,QAAQ,qBAAqB,MAAM,IAAI,QAAQ,oBAAoB,GAAG;AAGxE,QAAM,6BAAa,IAAA;AACnB,aAAW,KAAK,KAAK,SAAS,MAAM,GAAG;AACrC,UAAM,MAAM,kBAAkB,EAAE,CAAC,CAAC;AAClC,QAAI,KAAK;AACP,YAAM,SAAS,QAAQ,GAAG;AAC1B,UAAI,CAAC,KAAK,SAAS,IAAI,MAAM,GAAG,KAAK,CAAC,KAAK,SAAS,IAAI,MAAM,GAAG,GAAG;AAClE,eAAO,IAAI,MAAM;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AACA,MAAI,CAAC,OAAO,KAAM,QAAO;AAEzB,QAAM,QAAQ,CAAC,GAAG,MAAM,EAAE,IAAI,CAAC,MAAM,WAAW,CAAC,IAAI;AAGrD,QAAM,YAAY,oBAAoB,KAAK,IAAI;AAC/C,MAAI,WAAW;AACb,WAAO,KAAK,QAAQ,UAAU,CAAC,GAAG,GAAG,UAAU,CAAC,CAAC;AAAA,EAAK,MAAM,KAAK,IAAI,CAAC;AAAA,CAAI;AAAA,EAC5E;AAGA,MAAI,UAAU;AACd,aAAW,KAAK,KAAK,SAAS,kDAAkD,GAAG;AACjF,cAAU,KAAK,IAAI,SAAS,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM;AAAA,EACnD;AACA,MAAI,YAAY,GAAI,QAAO,GAAG,MAAM,KAAK,IAAI,CAAC;AAAA,EAAK,IAAI;AACvD,SAAO,GAAG,KAAK,MAAM,GAAG,OAAO,CAAC;AAAA,EAAK,MAAM,KAAK,IAAI,CAAC,GAAG,KAAK,MAAM,OAAO,CAAC;AAC7E;AAGO,SAAS,gBAAgB,IAAqB;AACnD,SACE,CAAC,GAAG,SAAS,cAAc,KAC3B,CAAC,GAAG,SAAS,OAAO,KACpB,CAAC,GAAG,SAAS,MAAM,KACnB,qCAAqC,KAAK,EAAE;AAEhD;AC/DO,SAAS,gBAAgB,UAA6B,IAAiB;AAC5E,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,UAAU,MAAM,IAAI;AAClB,UAAI,CAAC,gBAAgB,EAAE,EAAG,QAAO;AACjC,YAAM,SAAS,gBAAgB,MAAM,OAAO;AAC5C,UAAI,WAAW,KAAM,QAAO;AAC5B,aAAO,EAAE,MAAM,QAAQ,KAAK,KAAA;AAAA,IAC9B;AAAA,EAAA;AAEJ;"}
1
+ {"version":3,"file":"fenix-ui2.esm.js","sources":["../src/core/tokens.ts","../src/core/theme.ts","../src/core/presets.ts","../src/core/css.ts","../src/core/base.ts","../src/core/define.ts","../src/core/jsx.ts","../src/components/button/button.ts","../src/components/button/index.ts","../src/components/badge/badge.ts","../src/components/badge/index.ts","../src/components/spinner/spinner.ts","../src/components/spinner/index.ts","../src/components/select/select.ts","../src/components/select/index.ts","../src/components/input/input.ts","../src/components/input/index.ts","../src/components/switch/switch.ts","../src/components/switch/index.ts","../src/components/multiselect/multiselect.ts","../src/components/multiselect/index.ts","../src/components/calendar/calendar.ts","../src/components/calendar/index.ts","../src/components/datepicker/datepicker.ts","../src/components/datepicker/index.ts","../src/components/checkbox/checkbox.ts","../src/components/checkbox/index.ts","../src/components/radio/radio.ts","../src/components/radio/index.ts","../src/components/table/table.ts","../src/components/table/index.ts","../src/components/floatlabel/floatlabel.ts","../src/components/floatlabel/index.ts","../src/components/textarea/textarea.ts","../src/components/textarea/index.ts","../src/components/dialog/dialog.ts","../src/components/dialog/index.ts","../src/components/toast/toast.ts","../src/components/toast/index.ts","../src/components/tooltip/tooltip.ts","../src/components/tooltip/index.ts","../src/components/tabs/tabs.ts","../src/components/tabs/index.ts","../src/components/progress/progress.ts","../src/components/progress/index.ts","../src/components/skeleton/skeleton.ts","../src/components/skeleton/index.ts","../src/components/alert/alert.ts","../src/components/alert/index.ts","../src/components/dropdown/dropdown.ts","../src/components/dropdown/index.ts","../src/components/drawer/drawer.ts","../src/components/drawer/index.ts","../src/components/pagination/pagination.ts","../src/components/pagination/index.ts","../src/components/autocomplete/autocomplete.ts","../src/components/autocomplete/index.ts"],"sourcesContent":["/**\n * Design Tokens — camada de personalização do FenixUI.\n *\n * Os componentes consomem apenas `var(--fx-*)`, nunca valores fixos.\n * Isso atravessa o Shadow DOM via CSS Custom Properties e permite\n * trocar o tema em runtime sem recompilar a biblioteca.\n */\n\nexport interface FenixTokens {\n /** Cores semânticas */ color: Record<'primary' | 'secondary' | 'success' | 'warning' | 'danger' | 'info', string>;\n /** Superfícies */ surface: Record<'background' | 'surface' | 'surface-hover', string>;\n /** Texto */ text: Record<'default' | 'muted' | 'disabled', string>;\n /** Bordas */ border: Record<'default' | 'hover', string>;\n /** Tipografia */ font: Record<'family' | 'size' | 'weight' | 'line-height', string>;\n /** Espaçamento */ space: Record<'xs' | 'sm' | 'md' | 'lg' | 'xl', string>;\n /** Radius */ radius: Record<'none' | 'sm' | 'md' | 'lg' | 'full', string>;\n /** Altura dos controles (button, input, select, switch…). Personalizável por preset. */\n size: Record<'sm' | 'md' | 'lg', string>;\n /** Sombras */ shadow: Record<'sm' | 'md' | 'lg', string>;\n /** Motion */ motion: Record<'duration-fast' | 'duration-normal' | 'easing', string>;\n /** Efeitos visuais configuráveis (ripple, anel de foco dos campos). */\n effect: { ripple: string; 'focus-ring': string };\n /** Z-index */ z: Record<'base' | 'dropdown' | 'modal' | 'toast', string>;\n}\n\n/** Tema claro (padrão). */\nexport const lightTokens: FenixTokens = {\n color: {\n primary: '#4f46e5',\n secondary: '#8b5cf6',\n success: '#10b981',\n warning: '#f59e0b',\n danger: '#f43f5e',\n info: '#0ea5e9',\n },\n surface: {\n background: '#ffffff',\n surface: '#f8fafc',\n 'surface-hover': '#eef2f7',\n },\n text: {\n default: '#0f172a',\n muted: '#64748b',\n disabled: '#94a3b8',\n },\n border: {\n default: '#e2e8f0',\n hover: '#cbd5e1',\n },\n font: {\n family: \"'Inter', system-ui, -apple-system, 'Segoe UI', sans-serif\",\n size: '14px',\n weight: '500',\n 'line-height': '1.5',\n },\n space: { xs: '4px', sm: '8px', md: '12px', lg: '16px', xl: '24px' },\n radius: { none: '0', sm: '4px', md: '8px', lg: '12px', full: '9999px' },\n size: { sm: '32px', md: '40px', lg: '48px' },\n shadow: {\n sm: '0 1px 2px rgba(15, 23, 42, 0.06)',\n md: '0 4px 12px rgba(15, 23, 42, 0.10)',\n lg: '0 12px 32px rgba(15, 23, 42, 0.18)',\n },\n motion: {\n 'duration-fast': '120ms',\n 'duration-normal': '240ms',\n easing: 'cubic-bezier(0.25, 0.1, 0.25, 1)',\n },\n effect: {\n /** '0' desativa o efeito ripple do botão. */\n ripple: '1',\n /** Anel de foco dos campos de formulário. Use 'none' para campos sem sobra. */\n 'focus-ring': '0 0 0 3px color-mix(in srgb, var(--fx-color-primary) 22%, transparent)',\n },\n z: { base: 'auto', dropdown: '1000', modal: '1100', toast: '1200' },\n};\n\n/** Tema escuro — os componentes reagem automaticamente às variáveis CSS. */\nexport const darkTokens: FenixTokens = {\n color: { ...lightTokens.color },\n surface: {\n background: '#0f172a',\n surface: '#1e293b',\n 'surface-hover': '#334155',\n },\n text: {\n default: '#f8fafc',\n muted: '#94a3b8',\n disabled: '#64748b',\n },\n border: { default: '#334155', hover: '#475569' },\n font: { ...lightTokens.font },\n space: { ...lightTokens.space },\n radius: { ...lightTokens.radius },\n size: { ...lightTokens.size },\n shadow: {\n sm: '0 1px 2px rgba(0, 0, 0, 0.4)',\n md: '0 6px 16px rgba(0, 0, 0, 0.5)',\n lg: '0 16px 40px rgba(0, 0, 0, 0.6)',\n },\n motion: { ...lightTokens.motion },\n effect: { ...lightTokens.effect },\n z: { ...lightTokens.z },\n};\n\nexport const defaultTokens: FenixTokens = lightTokens;\n\n/** Override parcial e profundo — permite customizar apenas alguns tokens por vez. */\nexport type DeepPartial<T> = { [K in keyof T]?: T[K] extends object ? DeepPartial<T[K]> : T[K] };","/**\n * Motor de Tema e API global do FenixUI.\n *\n * Aplica os Design Tokens como CSS Custom Properties (`--fx-*`) no elemento\n * raiz. Como custom properties atravessam o Shadow DOM, TODOS os componentes\n * passam a reagir ao novo tema em runtime, sem recompilar.\n */\n\nimport { defaultTokens, darkTokens, type FenixTokens, type DeepPartial } from './tokens';\n\nconst PREFIX = '--fx';\nexport const VERSION = '0.1.0';\n\nexport type ThemeName = 'light' | 'dark';\n\nlet activeTheme: ThemeName = 'light';\nlet activeOverrides: DeepPartial<FenixTokens> | null = null;\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/** Mescla tokens por grupo, permitindo override parcial (ex.: só `color.primary`). */\nexport function deepMerge<T>(base: T, override: DeepPartial<T> | null): T {\n if (!override) return base;\n const out: Record<string, unknown> = { ...(base as Record<string, unknown>) };\n for (const key of Object.keys(override)) {\n const baseValue = (base as Record<string, unknown>)[key];\n const overrideValue = (override as Record<string, unknown>)[key];\n out[key] =\n isPlainObject(baseValue) && isPlainObject(overrideValue)\n ? deepMerge(baseValue, overrideValue)\n : (overrideValue as unknown);\n }\n return out as T;\n}\n\n/** Achatamento de tokens em pares `--fx-{grupo}-{chave}` -> valor. */\nexport function tokenCssVars(tokens: FenixTokens): Record<string, string> {\n const out: Record<string, string> = {};\n for (const [group, values] of Object.entries(tokens)) {\n for (const [key, value] of Object.entries(values)) {\n out[`${PREFIX}-${group}-${key}`] = String(value);\n }\n }\n return out;\n}\n\n/** Aplica tokens no DOM (padrão: `:root`). Emite evento para notificar a aplicação. */\nexport function applyTokens(\n themeName: ThemeName,\n overrides: DeepPartial<FenixTokens> | null,\n target: HTMLElement = document.documentElement,\n): void {\n const base = themeName === 'dark' ? darkTokens : defaultTokens;\n const finalTokens = deepMerge(base, overrides);\n const vars = tokenCssVars(finalTokens);\n for (const [name, value] of Object.entries(vars)) {\n target.style.setProperty(name, value);\n }\n if (typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent('fenix:theme', { detail: { theme: themeName, tokens: finalTokens } }));\n }\n}\n\nexport interface ConfigureOptions {\n theme?: ThemeName;\n tokens?: DeepPartial<FenixTokens>;\n}\n\n/** Configura a biblioteca: tema e/ou tokens. Retorna o estado ativo. */\nexport function configure(\n options: ConfigureOptions = {},\n target: HTMLElement = document.documentElement,\n): { theme: ThemeName } {\n if (options.theme) activeTheme = options.theme;\n if (options.tokens) activeOverrides = options.tokens;\n applyTokens(activeTheme, activeOverrides, target);\n return { theme: activeTheme };\n}\n\n/** Troca o tema para claro/escuro em runtime. */\nexport function theme(name: ThemeName): { theme: ThemeName } {\n return configure({ theme: name });\n}\n\n/** Define tokens customizados (override parcial profundo). */\nexport function setTokens(tokens: DeepPartial<FenixTokens>): { theme: ThemeName } {\n return configure({ tokens });\n}\n\n/** Volta ao tema claro padrão sem overrides. */\nexport function resetTheme(): { theme: ThemeName } {\n activeTheme = 'light';\n activeOverrides = null;\n return configure({ theme: 'light' });\n}\n\n/** Namespace público (uso via ESM ou via global `FenixUI` no bundle CDN). */\nexport const FenixUI = {\n version: VERSION,\n configure,\n theme,\n setTokens,\n resetTheme,\n tokenCssVars,\n deepMerge,\n};","/**\n * Presets de tema prontos para uso.\n *\n * Cada preset é um override parcial profundo sobre os tokens base.\n * Combina com o modo claro/escuro: `applyPreset('seiya', 'dark')`.\n */\n\nimport { configure } from './theme';\nimport { type DeepPartial, type FenixTokens } from './tokens';\n\nexport interface FenixPreset {\n /** Identificador usado em `applyPreset(name)`. */\n name: string;\n /** Rótulo amigável para UIs (documentação/seletor). */\n label: string;\n /** Override parcial de tokens aplicado sobre o tema base. */\n tokens: DeepPartial<FenixTokens>;\n}\n\nconst registry = new Map<string, FenixPreset>();\n\nfunction register(preset: FenixPreset): FenixPreset {\n registry.set(preset.name, preset);\n return preset;\n}\n\n/* ------------------------------------------------------------------ */\n/* Cavaleiros do Zodíaco ✨ */\n/* ------------------------------------------------------------------ */\n\nexport const themePresets = {\n fenix: register({\n name: 'fenix',\n label: 'Fenix (padrão)',\n tokens: {},\n }),\n seiya: register({\n name: 'seiya',\n label: 'Seiya',\n tokens: {\n color: { primary: '#e11d48', secondary: '#fb7185', info: '#f43f5e', danger: '#be123c' },\n radius: { sm: '6px', md: '10px', lg: '16px' },\n },\n }),\n shiryu: register({\n name: 'shiryu',\n label: 'Shiryu',\n tokens: {\n color: { primary: '#0d9488', secondary: '#2dd4bf', success: '#059669', info: '#14b8a6' },\n radius: { sm: '4px', md: '8px', lg: '14px' },\n },\n }),\n hyoga: register({\n name: 'hyoga',\n label: 'Hyoga',\n tokens: {\n color: { primary: '#0284c7', secondary: '#38bdf8', info: '#06b6d4', danger: '#e11d48' },\n surface: { surface: '#f0f9ff', 'surface-hover': '#e0f2fe' },\n radius: { sm: '8px', md: '12px', lg: '18px' },\n },\n }),\n shun: register({\n name: 'shun',\n label: 'Shun',\n tokens: {\n color: { primary: '#db2777', secondary: '#f472b6', info: '#ec4899', warning: '#c026d3' },\n radius: { sm: '10px', md: '14px', lg: '20px' },\n },\n }),\n ikki: register({\n name: 'ikki',\n label: 'Ikki',\n tokens: {\n color: { primary: '#ea580c', secondary: '#fb923c', danger: '#dc2626', warning: '#f59e0b' },\n radius: { sm: '2px', md: '4px', lg: '6px' },\n },\n }),\n aiolia: register({\n name: 'aiolia',\n label: 'Aiolia',\n tokens: {\n color: { primary: '#b45309', secondary: '#f59e0b', warning: '#eab308', info: '#84cc16' },\n radius: { sm: '6px', md: '12px', lg: '20px' },\n },\n }),\n} as const;\n\n/** Lista todos os presets registrados (inclui os customizados). */\nexport function listPresets(): FenixPreset[] {\n return [...registry.values()];\n}\n\n/**\n * Registra um preset personalizado, tornando-o disponível em `applyPreset`.\n * Útil para o usuário criar seu próprio tema e reutilizá-lo na aplicação.\n */\nexport function defineCustomPreset(\n name: string,\n label: string,\n tokens: DeepPartial<FenixTokens>,\n): FenixPreset {\n return register({ name, label, tokens });\n}\n\n/**\n * Aplica um preset + modo de cor em runtime.\n * @returns o estado ativo ({ theme }) repassado por `configure`.\n */\nexport function applyPreset(\n presetName: string,\n mode: 'light' | 'dark' = 'light',\n): { theme: 'light' | 'dark'; preset: string } {\n const preset = registry.get(presetName) ?? registry.get('fenix')!;\n const state = configure({ theme: mode, tokens: preset.tokens });\n return { ...state, preset: preset.name };\n}","/** Utilitários CSS compartilhados. */\n\n/** Tagged template que apenas concatena — mantém nomes de classes e tokens legíveis. */\nexport function css(strings: TemplateStringsArray, ...values: unknown[]): string {\n return strings.reduce((acc, part, i) => acc + part + (i < values.length ? String(values[i]) : ''), '');\n}\n\n/** Converte `duration-fast` em `durationFast`. */\nexport function kebabToCamel(value: string): string {\n return value.replace(/-+([a-z])/g, (_, c: string) => c.toUpperCase());\n}","/**\n * Infraestrutura base de Web Component do FenixUI.\n *\n * Todo componente estende `FxElement`, que:\n * - cria o Shadow Root (isolamento de estrutura e CSS);\n * - injeta o CSS (tokens via `var(--fx-*)`) + template em cada render;\n * - re-renderiza quando atributos observados mudam.\n */\n\nexport abstract class FxElement extends HTMLElement {\n /** CSS isolado no Shadow DOM. Deve usar apenas `var(--fx-*)`. */\n static styles: string = '';\n\n static get observedAttributes(): string[] {\n return [];\n }\n\n protected readonly root: ShadowRoot;\n\n constructor() {\n super();\n this.root = this.attachShadow({ mode: 'open' });\n }\n\n /** Chamado quando um atributo observado muda. */\n protected attributeChangedCallback(): void {\n if (this.isConnected) this.render();\n }\n\n /** Chamado quando o elemento é anexado ao DOM. */\n protected connectedCallback(): void {\n this.render();\n }\n\n /** Chamado quando o elemento é removido do DOM (limpeza de recursos). */\n protected disconnectedCallback(): void {\n /* noop — sobrescreva para limpar observers/listeners. */\n }\n\n protected hasAttr(name: string): boolean {\n return this.hasAttribute(name);\n }\n\n protected getAttr(name: string, fallback = ''): string {\n return this.getAttribute(name) ?? fallback;\n }\n\n protected toggleAttr(name: string, on: boolean): void {\n if (on) this.setAttribute(name, '');\n else this.removeAttribute(name);\n }\n\n /** Injeta `<style>` + template no Shadow DOM. */\n protected setTemplate(html: string): void {\n const styles = (this.constructor as typeof FxElement).styles;\n this.root.innerHTML = `<style>${styles}</style>${html}`;\n }\n\n /** Implementado por cada componente. */\n protected abstract render(): void;\n}","/**\n * Registro seguro de Custom Elements.\n *\n * Usa `customElements.get()` antes de `define()` para que múltiplos imports\n * (index + subpath, bundler + CDN) não lancem erro de re-definição.\n */\nexport function defineElement<T extends typeof HTMLElement>(tag: string, ctor: T): T {\n if (typeof customElements !== 'undefined' && !customElements.get(tag)) {\n customElements.define(tag, ctor);\n }\n return (customElements.get(tag) as T) ?? ctor;\n}","/**\r\n * Tipagens de propriedades + augmentations JSX do FenixUI.\r\n *\r\n * Importar este módulo — diretamente (`@wrrdev/fenix-ui/jsx`) ou via o\r\n * índice principal (`@wrrdev/fenix-ui`) — habilita, no TypeScript:\r\n *\r\n * 1. autocomplete + validação de atributos em templates JSX/TSX;\r\n * 2. tipos nomeados (`FxButtonProps`, `FxInputProps`, …) para wrappers ou código imperativo.\r\n *\r\n * A biblioteca NÃO depende de React/Vue: os atributos comuns\r\n * (`className`, `onClick`, `style`, `children`, …) são aceitos via assinatura\r\n * de índice, funcionando com qualquer runtime JSX.\r\n */\r\n\r\nimport type { FxElementProps, FxSize } from './types';\r\n\r\n/** Marcador de runtime: permite `import '@wrrdev/fenix-ui/jsx'` como side-effect import. */\r\nexport const FX_JSX_TYPES = true as const;\r\n\r\n/* Uniões auxiliares (variants, enums) */\r\nexport type FxButtonVariant = 'primary' | 'secondary' | 'success' | 'warning' | 'danger' | 'ghost' | 'outline';\r\nexport type FxBadgeVariant = 'default' | 'primary' | 'success' | 'warning' | 'danger' | 'info';\r\nexport type FxAlertVariant = 'info' | 'success' | 'warning' | 'danger';\r\nexport type FxProgressVariant = 'primary' | 'success' | 'warning' | 'danger';\r\nexport type FxSkeletonVariant = 'text' | 'circle' | 'rect';\r\nexport type FxFloatlabelVariant = 'on' | 'in' | 'over';\r\nexport type FxInputType = 'text' | 'number' | 'email' | 'password' | 'search' | 'tel' | 'url';\r\nexport type FxFieldStatus = 'error' | 'invalid' | 'success' | 'valid';\r\nexport type FxToastKind = 'success' | 'error' | 'info' | 'warning';\r\nexport type FxToastPosition = 'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right';\r\nexport type FxTooltipPosition = 'top' | 'bottom' | 'left' | 'right';\r\nexport type FxDrawerPosition = 'left' | 'right' | 'top' | 'bottom';\r\nexport type FxDropdownPosition = 'left' | 'center' | 'right' | 'bottom-left' | 'bottom-right';\r\nexport type FxPaginationPosition = 'left' | 'center' | 'right';\r\n\r\n/* Props por componente */\r\nexport interface FxButtonProps extends FxElementProps {\r\n variant?: FxButtonVariant;\r\n type?: 'button' | 'submit' | 'reset';\r\n size?: FxSize;\r\n loading?: boolean;\r\n full?: boolean;\r\n}\r\nexport interface FxBadgeProps extends FxElementProps {\r\n variant?: FxBadgeVariant;\r\n round?: boolean;\r\n}\r\nexport interface FxSpinnerProps extends FxElementProps { size?: FxSize; }\r\nexport interface FxInputProps extends FxElementProps {\r\n type?: FxInputType;\r\n size?: FxSize;\r\n placeholder?: string;\r\n readonly?: boolean;\r\n min?: string | number;\r\n max?: string | number;\r\n step?: string | number;\r\n clearable?: boolean;\r\n error?: boolean;\r\n invalid?: boolean;\r\n success?: boolean;\r\n valid?: boolean;\r\n}\r\nexport interface FxSelectProps extends FxElementProps {\r\n value?: string;\r\n size?: FxSize;\r\n placeholder?: string;\r\n searchable?: boolean;\r\n clearable?: boolean;\r\n 'search-placeholder'?: string;\r\n 'no-results'?: string;\r\n error?: boolean;\r\n invalid?: boolean;\r\n success?: boolean;\r\n valid?: boolean;\r\n}\r\nexport interface FxSwitchProps extends FxElementProps { checked?: boolean; size?: FxSize; }\r\nexport interface FxCheckboxProps extends FxElementProps {\r\n checked?: boolean;\r\n indeterminate?: boolean;\r\n value?: string;\r\n size?: FxSize;\r\n}\r\nexport interface FxRadioProps extends FxElementProps {\r\n checked?: boolean;\r\n value?: string;\r\n name?: string;\r\n size?: FxSize;\r\n}\r\nexport interface FxTextareaProps extends FxElementProps {\r\n value?: string;\r\n size?: FxSize;\r\n placeholder?: string;\r\n readonly?: boolean;\r\n rows?: number;\r\n maxlength?: number;\r\n error?: boolean;\r\n invalid?: boolean;\r\n success?: boolean;\r\n valid?: boolean;\r\n}\r\nexport interface FxMultiselectProps extends FxElementProps {\r\n values?: string;\r\n size?: FxSize;\r\n placeholder?: string;\r\n searchable?: boolean;\r\n clearable?: boolean;\r\n open?: boolean;\r\n error?: boolean;\r\n invalid?: boolean;\r\n success?: boolean;\r\n valid?: boolean;\r\n}\r\nexport interface FxCalendarProps extends FxElementProps {\r\n value?: string;\r\n start?: string;\r\n end?: string;\r\n min?: string;\r\n max?: string;\r\n mode?: 'single' | 'range' | 'multiple';\r\n values?: string;\r\n locale?: string;\r\n disabled?: boolean;\r\n}\r\nexport interface FxDatepickerProps extends FxElementProps {\r\n value?: string;\r\n start?: string;\r\n end?: string;\r\n values?: string;\r\n mode?: 'single' | 'range' | 'multiple';\r\n min?: string;\r\n max?: string;\r\n placeholder?: string;\r\n size?: FxSize;\r\n format?: string;\r\n 'show-time'?: boolean;\r\n 'free-text'?: boolean;\r\n clearable?: boolean;\r\n error?: boolean;\r\n invalid?: boolean;\r\n success?: boolean;\r\n valid?: boolean;\r\n}\r\nexport interface FxTableProps extends FxElementProps {\r\n pagination?: boolean;\r\n rows?: number;\r\n 'rows-options'?: string;\r\n striped?: boolean;\r\n 'empty-message'?: string;\r\n 'pagination-position'?: FxPaginationPosition;\r\n total?: number;\r\n page?: number;\r\n}\r\nexport interface FxFloatlabelProps extends FxElementProps {\r\n variant?: FxFloatlabelVariant;\r\n error?: boolean;\r\n invalid?: boolean;\r\n success?: boolean;\r\n valid?: boolean;\r\n active?: boolean;\r\n 'error-text'?: string;\r\n}\r\nexport interface FxDialogProps extends FxElementProps { open?: boolean; size?: FxSize; heading?: string; }\r\nexport interface FxDrawerProps extends FxElementProps { open?: boolean; title?: string; position?: FxDrawerPosition; }\r\nexport interface FxToastProps extends FxElementProps {\r\n kind?: FxToastKind;\r\n title?: string;\r\n message?: string;\r\n duration?: number;\r\n position?: FxToastPosition;\r\n}\r\nexport interface FxTooltipProps extends FxElementProps { content?: string; position?: FxTooltipPosition; }\r\nexport interface FxTabsProps extends FxElementProps { value?: string; }\r\nexport interface FxTabPanelProps extends FxElementProps { tab?: string; hidden?: boolean; }\r\nexport interface FxProgressProps extends FxElementProps {\r\n value?: number;\r\n indeterminate?: boolean;\r\n variant?: FxProgressVariant;\r\n label?: string;\r\n 'hide-label'?: boolean;\r\n size?: FxSize;\r\n}\r\nexport interface FxSkeletonProps extends FxElementProps {\r\n variant?: FxSkeletonVariant;\r\n width?: string;\r\n height?: string;\r\n lines?: number;\r\n}\r\nexport interface FxAlertProps extends FxElementProps { variant?: FxAlertVariant; title?: string; dismissible?: boolean; }\r\nexport interface FxDropdownProps extends FxElementProps { label?: string; position?: FxDropdownPosition; open?: boolean; }\r\nexport interface FxDropdownItemProps extends FxElementProps { value?: string; }\r\nexport interface FxPaginationProps extends FxElementProps {\r\n page?: number;\r\n total?: number;\r\n rows?: number;\r\n 'rows-options'?: string;\r\n position?: FxPaginationPosition;\r\n}\r\nexport interface FxAutocompleteProps extends FxElementProps {\r\n value?: string;\r\n size?: FxSize;\r\n placeholder?: string;\r\n source?: string;\r\n disabled?: boolean;\r\n 'min-chars'?: number;\r\n}\r\n/* Augmentation global de JSX (React/TSX, Preact, Vue JSX, …).\r\n Cada tag fx-* recebe autocomplete + validação de atributos. */\r\ndeclare global {\r\n namespace JSX {\r\n interface IntrinsicElements {\r\n 'fx-button': FxButtonProps;\r\n 'fx-badge': FxBadgeProps;\r\n 'fx-spinner': FxSpinnerProps;\r\n 'fx-input': FxInputProps;\r\n 'fx-select': FxSelectProps;\r\n 'fx-switch': FxSwitchProps;\r\n 'fx-checkbox': FxCheckboxProps;\r\n 'fx-radio': FxRadioProps;\r\n 'fx-textarea': FxTextareaProps;\r\n 'fx-multiselect': FxMultiselectProps;\r\n 'fx-calendar': FxCalendarProps;\r\n 'fx-datepicker': FxDatepickerProps;\r\n 'fx-table': FxTableProps;\r\n 'fx-floatlabel': FxFloatlabelProps;\r\n 'fx-dialog': FxDialogProps;\r\n 'fx-drawer': FxDrawerProps;\r\n 'fx-toast': FxToastProps;\r\n 'fx-tooltip': FxTooltipProps;\r\n 'fx-tabs': FxTabsProps;\r\n 'fx-tab-panel': FxTabPanelProps;\r\n 'fx-progress': FxProgressProps;\r\n 'fx-skeleton': FxSkeletonProps;\r\n 'fx-alert': FxAlertProps;\r\n 'fx-dropdown': FxDropdownProps;\r\n 'fx-dropdown-item': FxDropdownItemProps;\r\n 'fx-pagination': FxPaginationProps;\r\n 'fx-autocomplete': FxAutocompleteProps;\r\n }\r\n }\r\n}\r\n\r\n/* Tipagem imperativa: document.createElement('fx-...').\r\n As tags abaixo não declaradas nos próprios componentes ganham tipagem aqui;\r\n as demais (alert, dialog, drawer, dropdown, pagination, progress, skeleton,\r\n tabs, textarea, toast, tooltip, autocomplete) já são tipadas com a classe\r\n concreta nos respectivos index.ts. */\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n 'fx-button': HTMLElement;\r\n 'fx-badge': HTMLElement;\r\n 'fx-spinner': HTMLElement;\r\n 'fx-input': HTMLElement;\r\n 'fx-select': HTMLElement;\r\n 'fx-switch': HTMLElement;\r\n 'fx-checkbox': HTMLElement;\r\n 'fx-radio': HTMLElement;\r\n 'fx-multiselect': HTMLElement;\r\n 'fx-calendar': HTMLElement;\r\n 'fx-datepicker': HTMLElement;\r\n 'fx-table': HTMLElement;\r\n 'fx-floatlabel': HTMLElement;\r\n }\r\n}\r\n","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\n\n/**\n * <fx-button> — Componente de ação (piloto).\n *\n * Atributos: variant, size, disabled, loading, type, full.\n * Slots: default (rótulo), `icon` (ícone opcional).\n * Evento: `click` nativo atravessa o Shadow DOM (composed) — ouça no host.\n */\nexport class FxButton extends FxElement {\n static override styles = css`\n :host {\n display: inline-block;\n vertical-align: middle;\n }\n .btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n text-align: center;\n gap: var(--fx-space-sm);\n font-family: var(--fx-font-family);\n font-size: var(--fx-font-size);\n font-weight: var(--fx-font-weight);\n line-height: var(--fx-font-line-height);\n padding: var(--fx-space-md) var(--fx-space-xl);\n border-radius: var(--fx-radius-md);\n border: 1px solid transparent;\n color: #fff;\n background: var(--fx-color-primary);\n cursor: pointer;\n user-select: none;\n text-decoration: none;\n transition:\n background-color var(--fx-motion-duration-normal) var(--fx-motion-easing),\n border-color var(--fx-motion-duration-normal) var(--fx-motion-easing),\n transform var(--fx-motion-duration-fast) var(--fx-motion-easing),\n box-shadow var(--fx-motion-duration-normal) var(--fx-motion-easing);\n }\n .btn:focus-visible {\n outline: 2px solid var(--fx-color-primary);\n outline-offset: 2px;\n }\n .btn:hover { filter: brightness(0.88); }\n .btn:active { transform: translateY(1px); }\n\n /* Tamanhos — alturas vindas dos tokens (personalizáveis por preset) */\n .btn { min-height: var(--fx-size-md); }\n :host([size='sm']) .btn { padding: var(--fx-space-sm) var(--fx-space-lg); font-size: var(--fx-font-size); min-height: var(--fx-size-sm); }\n :host([size='lg']) .btn { padding: var(--fx-space-lg) var(--fx-space-xl); font-size: calc(var(--fx-font-size) + 4px); min-height: var(--fx-size-lg); }\n\n /* Full width */\n :host([full]) .btn { width: 100%; }\n\n /* Variantes */\n :host([variant='secondary']) .btn { background: var(--fx-color-secondary); }\n :host([variant='success']) .btn { background: var(--fx-color-success); }\n :host([variant='warning']) .btn { background: var(--fx-color-warning); }\n :host([variant='danger']) .btn { background: var(--fx-color-danger); }\n :host([variant='ghost']) .btn { background: transparent; color: var(--fx-text-default); }\n :host([variant='ghost']) .btn:hover { background: var(--fx-surface-surface-hover); filter: none; }\n :host([variant='outline']) .btn { background: transparent; color: var(--fx-color-primary); border-color: var(--fx-color-primary); }\n :host([variant='outline']) .btn:hover { background: var(--fx-surface-surface-hover); filter: none; }\n\n /* Ícone e spinner */\n .btn__icon { display: inline-flex; }\n .btn__icon[hidden] { display: none; }\n .btn__label { display: inline-flex; align-items: center; justify-content: center; }\n .btn[hidden] { display: none; }\n .btn__spinner {\n width: 1em;\n height: 1em;\n border: 2px solid currentColor;\n border-top-color: transparent;\n border-radius: var(--fx-radius-full);\n animation: fx-spin var(--fx-motion-duration-normal) linear infinite;\n }\n @keyframes fx-spin { to { transform: rotate(360deg); } }\n\n /* Estados */\n :host([disabled]) .btn,\n :host([loading]) .btn {\n opacity: 0.55;\n cursor: not-allowed;\n pointer-events: none;\n }\n\n /* Efeito ripple (). Desative com effect.ripple: '0' no preset. */\n .btn {\n position: relative;\n overflow: hidden;\n }\n .btn__ripple {\n position: absolute;\n border-radius: var(--fx-radius-full);\n background: currentColor;\n opacity: 0.28;\n transform: scale(0);\n animation: fx-ripple 600ms var(--fx-motion-easing) forwards;\n pointer-events: none;\n }\n @keyframes fx-ripple {\n to {\n transform: scale(2.6);\n opacity: 0;\n }\n }\n @media (prefers-reduced-motion: reduce) {\n .btn__ripple { display: none; }\n }\n `;\n\n static override get observedAttributes(): string[] {\n return ['variant', 'size', 'disabled', 'loading', 'type', 'full'];\n }\n\n /** Tamanho. Padrão: `'md'`. */\n get size(): string {\n const s = this.getAttr('size', 'md');\n return s === 'sm' || s === 'lg' ? s : 'md';\n }\n set size(value: string) {\n this.setAttribute('size', value);\n }\n\n get disabled(): boolean {\n return this.hasAttr('disabled');\n }\n set disabled(value: boolean) {\n this.toggleAttr('disabled', Boolean(value));\n }\n\n get loading(): boolean {\n return this.hasAttr('loading');\n }\n set loading(value: boolean) {\n this.toggleAttr('loading', Boolean(value));\n }\n\n protected override render(): void {\n const loading = this.hasAttr('loading');\n const disabled = this.hasAttr('disabled') || loading;\n const btnType = this.getAttr('type', 'button');\n\n this.setTemplate(`\n <button class=\"btn\" part=\"button\" type=\"${btnType}\">\n <span class=\"btn__icon\" part=\"icon\"><slot name=\"icon\"></slot></span>\n <span class=\"btn__label\" part=\"label\"><slot></slot></span>\n ${loading ? '<span class=\"btn__spinner\" aria-hidden=\"true\"></span>' : ''}\n </button>\n `);\n\n const btn = this.root.querySelector<HTMLButtonElement>('.btn');\n if (!btn) return;\n\n // Esconde o container do ícone quando o slot está vazio,\n // evitando espaço fantasma do `gap` que descentraliza o rótulo.\n const iconSlot = btn.querySelector<HTMLSlotElement>('.btn__icon slot');\n const iconWrap = this.root.querySelector<HTMLElement>('.btn__icon');\n const hasIcon = Boolean(iconSlot?.assignedNodes({ flatten: true }).some((n) =>\n n.nodeType === Node.ELEMENT_NODE || (n.textContent ?? '').trim() !== '',\n ));\n iconWrap?.toggleAttribute('hidden', !hasIcon);\n if (disabled) {\n btn.setAttribute('disabled', '');\n btn.setAttribute('aria-disabled', 'true');\n } else {\n btn.removeAttribute('disabled');\n btn.removeAttribute('aria-disabled');\n }\n if (loading) btn.setAttribute('aria-busy', 'true');\n else btn.removeAttribute('aria-busy');\n }\n\n protected override connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener('pointerdown', this.spawnRipple);\n }\n\n protected override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener('pointerdown', this.spawnRipple);\n }\n\n /**\n * Efeito ripple : cria um círculo que expande do ponto\n * de clique e desaparece. Respeita o token `effect.ripple` ('0' desativa)\n * e `prefers-reduced-motion` (via CSS).\n */\n private spawnRipple = (event: PointerEvent): void => {\n if (this.hasAttr('disabled') || this.hasAttr('loading')) return;\n const enabled = getComputedStyle(this)\n .getPropertyValue('--fx-effect-ripple')\n .trim();\n if (enabled === '0' || enabled === 'false') return;\n\n const btn = this.root.querySelector<HTMLElement>('.btn');\n if (!btn) return;\n\n const rect = btn.getBoundingClientRect();\n const size = Math.max(rect.width, rect.height);\n const ripple = document.createElement('span');\n ripple.className = 'btn__ripple';\n ripple.style.width = ripple.style.height = `${size}px`;\n ripple.style.left = `${event.clientX - rect.left - size / 2}px`;\n ripple.style.top = `${event.clientY - rect.top - size / 2}px`;\n btn.appendChild(ripple);\n ripple.addEventListener('animationend', () => ripple.remove());\n };\n}\n\nexport function defineFxButton(): typeof FxButton {\n return defineElement('fx-button', FxButton);\n}","import { defineFxButton } from './button';\n\n// Reexporta a classe para uso programático (ex.: instanceof, herança).\nexport { FxButton } from './button';\n\n// Auto-registro: basta importar o subpath `@wrrdev/fenix-ui/button`\n// para que o componente seja definido no CustomElementRegistry.\ndefineFxButton();","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\n\n/**\n * <fx-badge> — Rótulo/contador de status.\n *\n * Atributos: variant (default|primary|success|warning|danger|info), round.\n * Slots: default (conteúdo).\n */\nexport class FxBadge extends FxElement {\n static override styles = css`\n :host {\n display: inline-flex;\n vertical-align: middle;\n }\n .badge {\n display: inline-flex;\n align-items: center;\n font-family: var(--fx-font-family);\n font-size: calc(var(--fx-font-size) - 2px);\n font-weight: var(--fx-font-weight);\n line-height: 1;\n padding: var(--fx-space-xs) var(--fx-space-sm);\n border-radius: var(--fx-radius-full);\n border: 1px solid var(--fx-border-default);\n background: var(--fx-surface-background);\n color: var(--fx-text-muted);\n white-space: nowrap;\n }\n :host([variant='primary']) .badge { background: var(--fx-color-primary); color: #fff; border-color: transparent; }\n :host([variant='success']) .badge { background: var(--fx-color-success); color: #fff; border-color: transparent; }\n :host([variant='warning']) .badge { background: var(--fx-color-warning); color: #fff; border-color: transparent; }\n :host([variant='danger']) .badge { background: var(--fx-color-danger); color: #fff; border-color: transparent; }\n :host([variant='info']) .badge { background: var(--fx-color-info); color: #fff; border-color: transparent; }\n :host(:not([round])) .badge { border-radius: var(--fx-radius-sm); }\n `;\n\n static override get observedAttributes(): string[] {\n return ['variant', 'round'];\n }\n\n protected override render(): void {\n this.setTemplate(`<span class=\"badge\" part=\"badge\"><slot></slot></span>`);\n }\n}\n\nexport function defineFxBadge(): typeof FxBadge {\n return defineElement('fx-badge', FxBadge);\n}","import { defineFxBadge } from './badge';\n\n// Reexporta a classe para uso programático (instanceof, herança).\nexport { FxBadge } from './badge';\n\n// Auto-registro ao importar o subpath `@wrrdev/fenix-ui/badge`.\ndefineFxBadge();","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\n\n/**\n * <fx-spinner> — Indicador de progresso indeterminado.\n *\n * Atributos: size (sm|md|lg).\n */\nexport class FxSpinner extends FxElement {\n static override styles = css`\n :host {\n display: inline-block;\n vertical-align: middle;\n }\n /* Escala: sm 16px · md 24px (padrão) · lg 32px */\n .spinner {\n display: inline-block;\n width: var(--fx-space-xl, 20px);\n height: var(--fx-space-xl, 20px);\n border: 2px solid var(--fx-border-default, #e2e8f0);\n border-top-color: var(--fx-color-primary, #2563eb);\n border-radius: var(--fx-radius-full, 9999px);\n animation: fx-spin 0.8s linear infinite;\n }\n :host([size='sm']) .spinner { width: var(--fx-space-lg, 16px); height: var(--fx-space-lg, 16px); }\n :host([size='lg']) .spinner { width: 32px; height: 32px; border-width: 3px; }\n @keyframes fx-spin { to { transform: rotate(360deg); } }\n @media (prefers-reduced-motion: reduce) {\n .spinner { animation-duration: 2.5s; }\n }\n `;\n\n static override get observedAttributes(): string[] {\n return ['size'];\n }\n\n /** Tamanho do spinner. Padrão: `'md'`. */\n get size(): string {\n const s = this.getAttr('size', 'md');\n return s === 'sm' || s === 'lg' ? s : 'md';\n }\n set size(value: string) {\n this.setAttribute('size', value);\n }\n\n protected override render(): void {\n this.setTemplate(`<span class=\"spinner\" part=\"spinner\" role=\"status\" aria-label=\"Carregando\"></span>`);\n }\n}\n\nexport function defineFxSpinner(): typeof FxSpinner {\n return defineElement('fx-spinner', FxSpinner);\n}","import { defineFxSpinner } from './spinner';\n\n// Reexporta a classe para uso programático.\nexport { FxSpinner } from './spinner';\n\n// Auto-registro ao importar o subpath `@wrrdev/fenix-ui/spinner`.\ndefineFxSpinner();","import { FxElement } from '../../core/base';\r\nimport { css } from '../../core/css';\r\nimport { defineElement } from '../../core/define';\r\n\r\n/**\r\n * <fx-select> — Campo de seleção com dropdown customizado.\r\n *\r\n * Escreva os filhos como `<option>` nativos no light DOM; eles são\r\n * espelhados automaticamente (MutationObserver):\r\n *\r\n * <fx-select value=\"b\" searchable clearable>\r\n * <option value=\"a\">Opção A</option>\r\n * <option value=\"b\">Opção B</option>\r\n * </fx-select>\r\n *\r\n * Atributos: value, size (sm|md|lg), disabled, placeholder,\r\n * searchable, clearable, search-placeholder, no-results.\r\n * Evento: `change` (composed, detail: { value }).\r\n */\r\nexport class FxSelect extends FxElement {\r\n static override styles = css`\r\n :host {\r\n display: inline-block;\r\n vertical-align: middle;\r\n font-family: var(--fx-font-family);\r\n font-size: var(--fx-font-size);\r\n position: relative;\r\n }\r\n .trigger {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n gap: var(--fx-space-sm);\r\n box-sizing: border-box;\r\n min-height: var(--fx-size-md);\r\n min-width: 200px;\r\n font: inherit;\r\n font-weight: var(--fx-font-weight);\r\n color: var(--fx-text-default);\r\n text-align: left;\r\n background-color: var(--fx-surface-background);\r\n border: 1px solid var(--fx-border-default);\r\n border-radius: var(--fx-radius-md);\r\n padding: var(--fx-space-xs) var(--fx-space-md);\r\n cursor: pointer;\r\n transition:\r\n border-color var(--fx-motion-duration-normal) var(--fx-motion-easing),\r\n box-shadow var(--fx-motion-duration-normal) var(--fx-motion-easing);\r\n }\r\n .trigger:hover { border-color: var(--fx-border-hover); }\r\n .trigger:focus-visible,\r\n :host([open]) .trigger {\r\n outline: none;\r\n border-color: var(--fx-color-primary);\r\n box-shadow: var(--fx-effect-focus-ring, none);\r\n }\r\n :host([size='sm']) .trigger { min-width: 180px; min-height: var(--fx-size-sm); }\r\n :host([size='lg']) .trigger { min-height: var(--fx-size-lg); font-size: calc(var(--fx-font-size) + 4px); }\r\n /* Validação */\r\n :host([error]) .trigger,\r\n :host([invalid]) .trigger {\r\n border-color: var(--fx-color-danger, #dc2626);\r\n }\r\n :host([error]) .trigger:focus-visible,\r\n :host([invalid]) .trigger:focus-visible,\r\n :host([error][open]) .trigger,\r\n :host([invalid][open]) .trigger {\r\n border-color: var(--fx-color-danger, #dc2626);\r\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--fx-color-danger, #dc2626) 18%, transparent);\r\n }\r\n :host([success]) .trigger,\r\n :host([valid]) .trigger {\r\n border-color: var(--fx-color-success, #16a34a);\r\n }\r\n :host([success]) .trigger:focus-visible,\r\n :host([valid]) .trigger:focus-visible,\r\n :host([success][open]) .trigger,\r\n :host([valid][open]) .trigger {\r\n border-color: var(--fx-color-success, #16a34a);\r\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--fx-color-success, #16a34a) 18%, transparent);\r\n }\r\n :host([disabled]) .trigger,\r\n .trigger[aria-disabled='true'] { opacity: 0.55; cursor: not-allowed; background-color: var(--fx-surface-surface-hover); }\r\n /* O rótulo encolhe (ellipsis) e os ícones NUNCA saem do campo. */\r\n .label,\r\n .placeholder {\r\n flex: 1 1 auto;\r\n min-width: 0;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n }\r\n .placeholder { color: var(--fx-text-muted); }\r\n .actions {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: var(--fx-space-xs, 8px);\r\n flex-shrink: 0;\r\n }\r\n .caret { font-size: calc(var(--fx-font-size) - 3px); color: var(--fx-text-muted); pointer-events: none; }\r\n\r\n /* Painel do dropdown */\r\n .panel {\r\n position: absolute;\r\n top: calc(100% + 4px);\r\n left: 0;\r\n z-index: var(--fx-z-dropdown, 1000);\r\n width: max(100%, 220px);\r\n max-height: 260px;\r\n overflow-y: auto;\r\n display: none;\r\n background: var(--fx-surface-background);\r\n border: 1px solid var(--fx-border-default);\r\n border-radius: var(--fx-radius-md);\r\n box-shadow: var(--fx-shadow-lg);\r\n }\r\n :host([open]) .panel { display: block; }\r\n .search {\r\n position: sticky;\r\n top: 0;\r\n width: 100%;\r\n box-sizing: border-box;\r\n font: inherit;\r\n color: var(--fx-text-default);\r\n background: var(--fx-surface-background);\r\n border: none;\r\n border-bottom: 1px solid var(--fx-border-default);\r\n padding: var(--fx-space-sm) var(--fx-space-md);\r\n outline: none;\r\n }\r\n .opt {\r\n display: block;\r\n width: 100%;\r\n text-align: left;\r\n font: inherit;\r\n color: var(--fx-text-default);\r\n background: none;\r\n border: none;\r\n padding: var(--fx-space-sm) var(--fx-space-md);\r\n cursor: pointer;\r\n }\r\n /* Hover e selecionado com a cor primária do tema (igual ao multiselect). */\r\n .opt:hover { background: color-mix(in srgb, var(--fx-color-primary) 12%, transparent); }\r\n .opt[aria-selected='true'] {\r\n background: color-mix(in srgb, var(--fx-color-primary) 18%, transparent);\r\n color: var(--fx-color-primary);\r\n font-weight: var(--fx-font-weight);\r\n }\r\n .empty { padding: var(--fx-space-sm) var(--fx-space-md); color: var(--fx-text-muted); }\r\n\r\n /* Clearable */\r\n .clear {\r\n border: none;\r\n background: transparent;\r\n color: var(--fx-text-muted);\r\n font-size: calc(var(--fx-font-size) + 2px);\r\n line-height: 1;\r\n cursor: pointer;\r\n padding: 0;\r\n }\r\n .clear:hover { color: var(--fx-color-danger); }\r\n .clear[hidden] { display: none; }\r\n `;\r\n\r\n // `value` fica FORA da observação: refleti-lo no change não pode\r\n // re-renderizar o template e fechar o dropdown.\r\n static override get observedAttributes(): string[] {\r\n return ['size', 'disabled', 'placeholder', 'searchable', 'clearable', 'error', 'success'];\r\n }\r\n\r\n private observer?: MutationObserver;\r\n private docListener?: (e: Event) => void;\r\n\r\n /** Tamanho do campo. Padrão: `'md'`. */\r\n get size(): string {\r\n const s = this.getAttr('size', 'md');\r\n return s === 'sm' || s === 'lg' ? s : 'md';\r\n }\r\n set size(value: string) {\r\n this.setAttribute('size', value);\r\n }\r\n\r\n get value(): string {\r\n return this.getAttr('value');\r\n }\r\n set value(value: string) {\r\n this.setAttribute('value', value);\r\n }\r\n\r\n get disabled(): boolean {\r\n return this.hasAttr('disabled');\r\n }\r\n set disabled(value: boolean) {\r\n this.toggleAttr('disabled', Boolean(value));\r\n }\r\n\r\n private get options(): { value: string; label: string }[] {\r\n return [...this.querySelectorAll('option')].map((o) => ({\r\n value: o.getAttribute('value') ?? o.textContent?.trim() ?? '',\r\n label: o.textContent?.trim() ?? '',\r\n }));\r\n }\r\n\r\n protected override connectedCallback(): void {\r\n super.connectedCallback();\r\n // Espelha mudanças nas <option> do light DOM.\r\n this.observer = new MutationObserver(() => this.render());\r\n this.observer.observe(this, { childList: true, subtree: true, characterData: true });\r\n // Fecha o dropdown ao clicar fora.\r\n this.docListener = (e: Event) => {\r\n if (!this.hasAttr('open')) return;\r\n if (e.composedPath().includes(this)) return;\r\n this.removeAttribute('open');\r\n this.render();\r\n };\r\n document.addEventListener('click', this.docListener);\r\n }\r\n\r\n protected override disconnectedCallback(): void {\r\n super.disconnectedCallback();\r\n this.observer?.disconnect();\r\n if (this.docListener) document.removeEventListener('click', this.docListener);\r\n }\r\n\r\n private select(value: string): void {\r\n this.value = value;\r\n this.removeAttribute('open');\r\n this.render();\r\n this.dispatchEvent(\r\n new CustomEvent('change', { bubbles: true, composed: true, detail: { value } }),\r\n );\r\n }\r\n\r\n protected override render(): void {\r\n const prevOpen = this.hasAttr('open');\r\n const prevSearch = this.root.querySelector<HTMLInputElement>('.search');\r\n // Estado do campo de busca antes de re-renderizar (valor, foco e cursor).\r\n const search = prevSearch?.value ?? '';\r\n const searchFocused =\r\n prevSearch != null && this.root.activeElement === prevSearch;\r\n const caretPos = searchFocused ? prevSearch!.selectionStart : null;\r\n\r\n const opts = this.options;\r\n let current = this.getAttr('value');\r\n if (!current) {\r\n const explicit = this.querySelector('option[selected]');\r\n current = explicit?.getAttribute('value') ?? explicit?.textContent?.trim() ?? '';\r\n }\r\n const selectedLabel = opts.find((o) => o.value === current)?.label ?? '';\r\n const placeholder = this.getAttr('placeholder', 'Selecione…');\r\n\r\n const filtered = search\r\n ? opts.filter((o) => o.label.toLowerCase().includes(search.toLowerCase()))\r\n : opts;\r\n\r\n this.setTemplate(`\r\n <span class=\"trigger\" part=\"trigger\" role=\"button\" tabindex=\"${this.disabled ? -1 : 0}\" aria-haspopup=\"listbox\" aria-expanded=\"${prevOpen}\">\r\n <span class=\"${selectedLabel ? 'label' : 'placeholder'}\">${selectedLabel || placeholder}</span>\r\n <span class=\"actions\">\r\n ${this.hasAttr('clearable') && current ? '<button type=\"button\" class=\"clear\" part=\"clear\" aria-label=\"Limpar\">×</button>' : ''}\r\n <span class=\"caret\">▼</span>\r\n </span>\r\n </span>\r\n <div class=\"panel\" part=\"panel\" role=\"listbox\">\r\n ${this.hasAttr('searchable') ? `<input class=\"search\" part=\"search\" type=\"text\" placeholder=\"${this.getAttr('search-placeholder', 'Pesquisar…')}\">` : ''}\r\n ${filtered.map((o) => `\r\n <button type=\"button\" class=\"opt\" role=\"option\" data-value=\"${o.value}\"\r\n aria-selected=\"${o.value === current}\">${o.label}</button>`).join('')}\r\n ${filtered.length === 0 ? `<div class=\"empty\">${this.getAttr('no-results', 'Nenhum resultado')}</div>` : ''}\r\n </div>\r\n `);\r\n\r\n if (prevOpen) this.setAttribute('open', '');\r\n const searchInput = this.root.querySelector<HTMLInputElement>('.search');\r\n if (searchInput) {\r\n searchInput.value = search;\r\n searchInput.addEventListener('input', () => this.render());\r\n searchInput.addEventListener('click', (e) => e.stopPropagation());\r\n // Re-render não pode roubar o foco nem perder a posição do cursor.\r\n if (searchFocused) {\r\n searchInput.focus();\r\n try { searchInput.setSelectionRange(caretPos!, caretPos!); } catch { /* type=text sempre suporta */ }\r\n }\r\n }\r\n\r\n const trigger = this.root.querySelector<HTMLElement>('.trigger');\r\n if (!trigger) return;\r\n if (this.disabled) trigger.setAttribute('aria-disabled', 'true');\r\n\r\n trigger.addEventListener('click', (e) => {\r\n if (this.disabled) return;\r\n if ((e.target as HTMLElement).closest('.clear')) return;\r\n this.toggleAttribute('open');\r\n this.render();\r\n this.root.querySelector<HTMLInputElement>('.search')?.focus();\r\n });\r\n\r\n // Teclado: Enter/Espaço abrem o dropdown.\r\n trigger.addEventListener('keydown', (e) => {\r\n if (e.key === 'Enter' || e.key === ' ') {\r\n e.preventDefault();\r\n trigger.click();\r\n }\r\n });\r\n\r\n // Limpar.\r\n this.root.querySelector('.clear')?.addEventListener('click', (e) => {\r\n e.stopPropagation();\r\n this.value = '';\r\n this.removeAttribute('open');\r\n this.render();\r\n this.dispatchEvent(\r\n new CustomEvent('change', { bubbles: true, composed: true, detail: { value: '' } }),\r\n );\r\n });\r\n\r\n // Escolher opção.\r\n this.root.querySelectorAll<HTMLElement>('.opt').forEach((opt) => {\r\n opt.addEventListener('click', () => this.select(opt.dataset.value!));\r\n });\r\n }\r\n}\r\n\r\nexport function defineFxSelect(): typeof FxSelect {\r\n return defineElement('fx-select', FxSelect);\r\n}\r\n\r\n","import { defineFxSelect } from './select';\n\n// Reexporta a classe para uso programático (instanceof, herança).\nexport { FxSelect } from './select';\n\n// Auto-registro ao importar o subpath `@wrrdev/fenix-ui/select`.\ndefineFxSelect();\n","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\n\n/**\n * <fx-input> — Campo de texto estilizado com os tokens do tema.\n *\n * Atributos: type (text|number|email|password|search|tel|url), value, size,\n * placeholder, disabled, readonly, min, max, step, clearable.\n * Eventos: `input` e `change` (composed, detail: { value }).\n */\nexport class FxInput extends FxElement {\n static override styles = css`\n :host {\n display: inline-block;\n vertical-align: middle;\n font-family: var(--fx-font-family);\n font-size: var(--fx-font-size);\n }\n .field {\n font-family: inherit;\n font-size: inherit;\n min-height: var(--fx-size-md);\n font-weight: var(--fx-font-weight);\n color: var(--fx-text-default);\n background-color: var(--fx-surface-background);\n border: 1px solid var(--fx-border-default);\n border-radius: var(--fx-radius-md);\n padding: var(--fx-space-md) var(--fx-space-lg);\n width: 260px;\n box-sizing: border-box;\n transition:\n border-color var(--fx-motion-duration-normal) var(--fx-motion-easing),\n box-shadow var(--fx-motion-duration-normal) var(--fx-motion-easing);\n }\n .field::placeholder { color: var(--fx-text-muted); opacity: 1; }\n .field:hover { border-color: var(--fx-border-hover); }\n .field:focus-visible {\n outline: none;\n border-color: var(--fx-color-primary);\n box-shadow: var(--fx-effect-focus-ring, none);\n }\n .field:disabled,\n .field[readonly] {\n opacity: 0.55;\n cursor: not-allowed;\n background-color: var(--fx-surface-surface-hover);\n }\n /* Validação: sobrescrevem a borda/foco via token do preset. */\n :host([error]) .field,\n :host([invalid]) .field,\n :host([error]) .field:focus-visible,\n :host([invalid]) .field:focus-visible {\n border-color: var(--fx-color-danger, #dc2626);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--fx-color-danger, #dc2626) 18%, transparent);\n }\n :host([success]) .field,\n :host([valid]) .field,\n :host([success]) .field:focus-visible,\n :host([valid]) .field:focus-visible {\n border-color: var(--fx-color-success, #16a34a);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--fx-color-success, #16a34a) 18%, transparent);\n }\n :host([size='sm']) .field { padding: var(--fx-space-sm) var(--fx-space-md); font-size: var(--fx-font-size); width: 220px; min-height: var(--fx-size-sm); }\n :host([size='lg']) .field { padding: var(--fx-space-lg) var(--fx-space-xl); font-size: calc(var(--fx-font-size) + 4px); width: 300px; min-height: var(--fx-size-lg); }\n /* Clearable */\n :host([clearable]) { position: relative; display: inline-flex; }\n .wrap { position: relative; display: inline-flex; align-items: center; }\n :host([clearable]) .field { padding-right: var(--fx-space-xl); }\n .clear {\n position: absolute;\n right: var(--fx-space-xs);\n border: none;\n background: transparent;\n color: var(--fx-text-muted);\n font-size: calc(var(--fx-font-size) + 4px);\n line-height: 1;\n cursor: pointer;\n padding: 0 var(--fx-space-xs);\n border-radius: var(--fx-radius-full);\n }\n .clear:hover { color: var(--fx-color-danger); }\n .clear[hidden] { display: none; }\n `;\n\n // `value` fica FORA da observação: refleti-lo a cada tecla não pode\n // re-renderizar o template, senão o campo perde o foco ao digitar.\n static override get observedAttributes(): string[] {\n return [\n 'type', 'size', 'placeholder',\n 'disabled', 'readonly', 'min', 'max', 'step',\n ];\n }\n\n /** Tamanho do campo. Padrão: `'md'`. */\n get size(): string {\n const s = this.getAttr('size', 'md');\n return s === 'sm' || s === 'lg' ? s : 'md';\n }\n set size(value: string) {\n this.setAttribute('size', value);\n }\n\n get value(): string {\n return this.getAttr('value');\n }\n set value(value: string) {\n this.setAttribute('value', value);\n }\n\n get disabled(): boolean {\n return this.hasAttr('disabled');\n }\n set disabled(value: boolean) {\n this.toggleAttr('disabled', Boolean(value));\n }\n\n protected override render(): void {\n const type = this.getAttr('type', 'text');\n const placeholder = this.getAttr('placeholder');\n const readonly = this.hasAttr('readonly');\n const disabled = this.hasAttr('disabled');\n const min = this.getAttr('min');\n const max = this.getAttr('max');\n const step = this.getAttr('step');\n\n this.setTemplate(`\n ${this.hasAttr('clearable') ? '<div class=\"wrap\">' : ''}\n <input class=\"field\" part=\"input\" type=\"${type}\"\n ${placeholder ? `placeholder=\"${placeholder}\"` : ''}\n ${min ? `min=\"${min}\"` : ''} ${max ? `max=\"${max}\"` : ''} ${step ? `step=\"${step}\"` : ''}\n />\n ${this.hasAttr('clearable') ? '<button type=\"button\" class=\"clear\" part=\"clear\" aria-label=\"Limpar\" tabindex=\"-1\">×</button></div>' : ''}\n `);\n\n const field = this.root.querySelector<HTMLInputElement>('.field');\n if (!field) return;\n field.value = this.getAttr('value');\n if (disabled) field.setAttribute('disabled', '');\n if (readonly) field.setAttribute('readonly', '');\n\n const emit = (event: string): void => {\n this.value = field.value;\n this.dispatchEvent(\n new CustomEvent(event, { bubbles: true, composed: true, detail: { value: field.value } }),\n );\n };\n // Bloqueia o evento nativo (composed, sem detail) para que só o\n // CustomEvent com detail chegue aos consumidores.\n field.addEventListener('input', (e) => { e.stopPropagation(); emit('input'); });\n field.addEventListener('change', (e) => { e.stopPropagation(); emit('change'); });\n\n // Clearable: botão × que limpa o campo e emite input/change vazios.\n const clearBtn = this.root.querySelector<HTMLButtonElement>('.clear');\n const syncClear = (): void => {\n clearBtn?.toggleAttribute('hidden', field.value === '');\n };\n syncClear();\n clearBtn?.addEventListener('click', () => {\n field.value = '';\n syncClear();\n emit('input');\n emit('change');\n field.focus();\n });\n field.addEventListener('input', syncClear);\n }\n}\n\nexport function defineFxInput(): typeof FxInput {\n return defineElement('fx-input', FxInput);\n}\n","import { defineFxInput } from './input';\n\n// Reexporta a classe para uso programático (instanceof, herança).\nexport { FxInput } from './input';\n\n// Auto-registro ao importar o subpath `@wrrdev/fenix-ui/input`.\ndefineFxInput();\n","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\n\n/**\n * <fx-switch> — Interruptor ligado/desligado (role=\"switch\").\n *\n * O texto do slot (light DOM) é o rótulo clicável.\n * Atributos: checked, disabled, size (sm|md|lg).\n * Evento: `change` (composed, detail: { checked }).\n */\nexport class FxSwitch extends FxElement {\n static override styles = css`\n :host {\n display: inline-flex;\n vertical-align: middle;\n font-family: var(--fx-font-family);\n font-size: var(--fx-font-size);\n }\n .switch {\n display: inline-flex;\n align-items: center;\n gap: var(--fx-space-sm);\n cursor: pointer;\n user-select: none;\n background: none;\n border: none;\n padding: 0;\n color: var(--fx-text-default);\n font: inherit;\n }\n .track {\n position: relative;\n width: 40px;\n height: 22px;\n border-radius: var(--fx-radius-full);\n background: var(--fx-border-default);\n flex-shrink: 0;\n transition: background-color var(--fx-motion-duration-normal) var(--fx-motion-easing);\n }\n .thumb {\n position: absolute;\n top: 3px;\n left: 3px;\n width: 16px;\n height: 16px;\n border-radius: var(--fx-radius-full);\n background: #fff;\n box-shadow: var(--fx-shadow-sm);\n transition: transform var(--fx-motion-duration-normal) var(--fx-motion-easing);\n }\n :host([checked]) .track { background: var(--fx-color-primary); }\n :host([checked]) .thumb { transform: translateX(18px); }\n .switch:focus-visible .track {\n outline: none;\n box-shadow: var(--fx-effect-focus-ring, none);\n }\n .label { display: inline-flex; align-items: center; }\n :host([disabled]) .switch { opacity: 0.55; cursor: not-allowed; pointer-events: none; }\n /* Escala: sm 32×18 · md 40×22 (padrão) · lg 48×26 */\n :host([size='sm']) .track { width: 32px; height: 18px; }\n :host([size='sm']) .thumb { top: 2px; left: 2px; width: 14px; height: 14px; }\n :host([size='sm'][checked]) .thumb { transform: translateX(14px); }\n :host([size='lg']) .track { width: 48px; height: 26px; }\n :host([size='lg']) .thumb { top: 4px; left: 4px; width: 18px; height: 18px; }\n :host([size='lg'][checked]) .thumb { transform: translateX(22px); }\n `;\n\n static override get observedAttributes(): string[] {\n return ['checked', 'disabled', 'size'];\n }\n\n /** Tamanho da trilha. Padrão: `'md'`. */\n get size(): string {\n const s = this.getAttr('size', 'md');\n return s === 'sm' || s === 'lg' ? s : 'md';\n }\n set size(value: string) {\n this.setAttribute('size', value);\n }\n\n get checked(): boolean {\n return this.hasAttr('checked');\n }\n set checked(value: boolean) {\n this.toggleAttr('checked', Boolean(value));\n }\n\n get disabled(): boolean {\n return this.hasAttr('disabled');\n }\n set disabled(value: boolean) {\n this.toggleAttr('disabled', Boolean(value));\n }\n\n protected override render(): void {\n this.setTemplate(`\n <button class=\"switch\" part=\"switch\" type=\"button\" role=\"switch\"\n aria-checked=\"${this.checked}\" ${this.hasAttr('disabled') ? 'disabled' : ''}>\n <span class=\"track\" part=\"track\"><span class=\"thumb\" part=\"thumb\"></span></span>\n <span class=\"label\" part=\"label\"><slot></slot></span>\n </button>\n `);\n\n const btn = this.root.querySelector<HTMLButtonElement>('.switch');\n if (!btn) return;\n btn.addEventListener('click', () => {\n if (this.hasAttr('disabled')) return;\n this.checked = !this.checked;\n btn.setAttribute('aria-checked', String(this.checked));\n this.dispatchEvent(\n new CustomEvent('change', {\n bubbles: true,\n composed: true,\n detail: { checked: this.checked },\n }),\n );\n });\n }\n}\n\nexport function defineFxSwitch(): typeof FxSwitch {\n return defineElement('fx-switch', FxSwitch);\n}\n","import { defineFxSwitch } from './switch';\n\n// Reexporta a classe para uso programático (instanceof, herança).\nexport { FxSwitch } from './switch';\n\n// Auto-registro ao importar o subpath `@wrrdev/fenix-ui/switch`.\ndefineFxSwitch();\n","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\n\n/**\n * <fx-multiselect> — Seleção múltipla .\n *\n * Dropdown customizado com painel (overlay), checkbox por item, pesquisa\n * opcional e ação de limpar. Opções via <option> nativos no light DOM.\n *\n * Atributos: values (CSV), searchable, clearable, disabled, placeholder,\n * size (sm|md|lg), no-results.\n * Evento: `change` (composed, detail: { values: string[] }).\n */\nexport class FxMultiselect extends FxElement {\n static override styles = css`\n :host {\n display: inline-block;\n vertical-align: middle;\n font-family: var(--fx-font-family);\n font-size: var(--fx-font-size);\n position: relative;\n }\n .trigger {\n display: inline-flex;\n align-items: center;\n flex-wrap: nowrap;\n gap: var(--fx-space-xs);\n width: 240px;\n box-sizing: border-box;\n min-height: var(--fx-size-md);\n padding: var(--fx-space-xs) var(--fx-space-md);\n font: inherit;\n color: var(--fx-text-default);\n background-color: var(--fx-surface-background);\n border: 1px solid var(--fx-border-default);\n border-radius: var(--fx-radius-md);\n cursor: pointer;\n text-align: left;\n transition: border-color var(--fx-motion-duration-normal) var(--fx-motion-easing);\n }\n /* Área dos chips: encolhe e quebra linha internamente,\n mantendo os ícones sempre dentro do componente. */\n .lead {\n display: inline-flex;\n flex-wrap: wrap;\n gap: var(--fx-space-xs);\n flex: 1;\n min-width: 0;\n overflow: hidden;\n }\n :host([size='sm']) .trigger { min-height: var(--fx-size-sm); width: 200px; }\n :host([size='lg']) .trigger { min-height: var(--fx-size-lg); width: 280px; font-size: calc(var(--fx-font-size) + 4px); }\n /* Validação */\n :host([error]) .trigger,\n :host([invalid]) .trigger {\n border-color: var(--fx-color-danger, #dc2626);\n }\n :host([error]) .trigger:focus-visible,\n :host([invalid]) .trigger:focus-visible,\n :host([error][open]) .trigger,\n :host([invalid][open]) .trigger {\n border-color: var(--fx-color-danger, #dc2626);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--fx-color-danger, #dc2626) 18%, transparent);\n }\n :host([success]) .trigger,\n :host([valid]) .trigger {\n border-color: var(--fx-color-success, #16a34a);\n }\n :host([success]) .trigger:focus-visible,\n :host([valid]) .trigger:focus-visible,\n :host([success][open]) .trigger,\n :host([valid][open]) .trigger {\n border-color: var(--fx-color-success, #16a34a);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--fx-color-success, #16a34a) 18%, transparent);\n }\n .trigger:hover { border-color: var(--fx-border-hover); }\n .trigger:focus-visible {\n outline: none;\n border-color: var(--fx-color-primary);\n box-shadow: var(--fx-effect-focus-ring, none);\n }\n .trigger[aria-expanded='true'] { border-color: var(--fx-color-primary); }\n .placeholder { color: var(--fx-text-muted); }\n .chip {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n background: color-mix(in srgb, var(--fx-color-primary) 14%, transparent);\n color: var(--fx-color-primary);\n border-radius: var(--fx-radius-sm);\n padding: 2px 6px;\n font-size: calc(var(--fx-font-size) - 2px);\n }\n .chip__x {\n border: none;\n background: none;\n color: inherit;\n cursor: pointer;\n font-size: calc(var(--fx-font-size) - 1px);\n line-height: 1;\n padding: 0;\n }\n .trigger-right {\n margin-left: auto;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n color: var(--fx-text-muted);\n }\n .icon-btn {\n border: none;\n background: none;\n color: inherit;\n cursor: pointer;\n font-size: calc(var(--fx-font-size) + 2px);\n line-height: 1;\n padding: 0 2px;\n border-radius: var(--fx-radius-full);\n }\n .icon-btn:hover { color: var(--fx-color-danger); }\n .caret {\n font-size: calc(var(--fx-font-size) - 3px);\n transition: transform var(--fx-motion-duration-normal) var(--fx-motion-easing);\n }\n :host([open]) .caret { transform: rotate(180deg); }\n\n /* Painel (overlay ) */\n .panel {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n z-index: var(--fx-z-dropdown, 1000);\n width: max(100%, 240px);\n background: var(--fx-surface-background);\n border: 1px solid var(--fx-border-default);\n border-radius: var(--fx-radius-md);\n box-shadow: var(--fx-shadow-lg);\n display: none;\n overflow: hidden;\n }\n :host([up]) .panel {\n top: auto;\n bottom: calc(100% + 4px);\n }\n :host([open]) .panel { display: block; }\n .panel-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--fx-space-sm);\n padding: var(--fx-space-xs) var(--fx-space-md);\n border-bottom: 1px solid var(--fx-border-default);\n background: var(--fx-surface-surface-hover);\n }\n .count { font-size: calc(var(--fx-font-size) - 2px); color: var(--fx-text-muted); }\n .clear-all {\n border: none;\n background: none;\n font: inherit;\n font-size: calc(var(--fx-font-size) - 2px);\n color: var(--fx-color-primary);\n cursor: pointer;\n padding: 0;\n }\n .clear-all:hover { text-decoration: underline; }\n .search {\n width: 100%;\n box-sizing: border-box;\n font: inherit;\n color: var(--fx-text-default);\n background: var(--fx-surface-background);\n border: none;\n border-bottom: 1px solid var(--fx-border-default);\n padding: var(--fx-space-sm) var(--fx-space-md);\n outline: none;\n }\n .list {\n max-height: 240px;\n overflow-y: auto;\n list-style: none;\n margin: 0;\n padding: var(--fx-space-3xs, 4px);\n }\n .opt {\n display: flex;\n align-items: center;\n gap: var(--fx-space-sm);\n width: 100%;\n padding: var(--fx-space-xs) var(--fx-space-md);\n border: none;\n background: none;\n font: inherit;\n color: var(--fx-text-default);\n cursor: pointer;\n border-radius: var(--fx-radius-sm);\n text-align: left;\n }\n .opt:hover { background: color-mix(in srgb, var(--fx-color-primary) 12%, transparent); }\n .opt[aria-selected='true'] {\n background: color-mix(in srgb, var(--fx-color-primary) 16%, transparent);\n color: var(--fx-color-primary);\n font-weight: var(--fx-font-weight);\n }\n /* Checkbox visual */\n .box {\n width: 16px;\n height: 16px;\n flex-shrink: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border: 2px solid var(--fx-border-default);\n border-radius: calc(var(--fx-radius-sm) / 2);\n font-size: 11px;\n line-height: 1;\n color: transparent;\n transition:\n background-color var(--fx-motion-duration-fast) var(--fx-motion-easing),\n border-color var(--fx-motion-duration-fast) var(--fx-motion-easing),\n color var(--fx-motion-duration-fast) var(--fx-motion-easing);\n }\n .opt[aria-selected='true'] .box {\n background: var(--fx-color-primary);\n border-color: var(--fx-color-primary);\n color: #fff;\n }\n .opt[aria-selected='true'] .box::after { content: '✓'; }\n .empty { padding: var(--fx-space-md); color: var(--fx-text-muted); text-align: center; }\n :host([disabled]) .trigger { opacity: 0.55; cursor: not-allowed; background: var(--fx-surface-surface-hover); }\n `;\n\n static override get observedAttributes(): string[] {\n return ['disabled', 'placeholder'];\n }\n\n private observer?: MutationObserver;\n private docListener?: (e: Event) => void;\n private selected = new Set<string>();\n\n /** Valores selecionados (CSV no atributo / array na propriedade). */\n get values(): string[] {\n const csv = this.getAttr('values');\n return csv ? csv.split(',').map((v) => v.trim()).filter(Boolean) : [];\n }\n set values(list: string[]) {\n this.setAttribute('values', list.join(','));\n }\n\n get disabled(): boolean {\n return this.hasAttr('disabled');\n }\n set disabled(value: boolean) {\n this.toggleAttr('disabled', Boolean(value));\n }\n\n private get options(): { value: string; label: string }[] {\n return [...this.querySelectorAll('option')].map((o) => ({\n value: o.getAttribute('value') ?? o.textContent?.trim() ?? '',\n label: o.textContent?.trim() ?? '',\n }));\n }\n\n protected override connectedCallback(): void {\n // Popula a seleção ANTES do primeiro render (super chama render).\n this.selected = new Set(this.values);\n super.connectedCallback();\n this.observer = new MutationObserver(() => this.render());\n this.observer.observe(this, { childList: true, subtree: true, characterData: true });\n this.docListener = (e: Event) => {\n if (!this.hasAttr('open')) return;\n if (e.composedPath().includes(this)) return;\n this.removeAttribute('open');\n this.render();\n };\n document.addEventListener('click', this.docListener);\n }\n\n protected override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.observer?.disconnect();\n if (this.docListener) document.removeEventListener('click', this.docListener);\n }\n\n /** Aplica a seleção, reflete e emite change. */\n private commit(): void {\n this.values = [...this.selected];\n this.render();\n this.dispatchEvent(\n new CustomEvent('change', {\n bubbles: true,\n composed: true,\n detail: { values: [...this.selected] },\n }),\n );\n }\n\n private toggleValue(value: string): void {\n if (this.selected.has(value)) this.selected.delete(value);\n else this.selected.add(value);\n this.commit();\n }\n\n protected override render(): void {\n const wasOpen = this.hasAttr('open');\n // Preserva o estado do campo de pesquisa entre re-renders.\n const search = this.root.querySelector<HTMLInputElement>('.search')?.value ?? '';\n\n const opts = this.options;\n for (const v of [...this.selected]) {\n if (!opts.some((o) => o.value === v)) this.selected.delete(v);\n }\n\n const chips = opts.filter((o) => this.selected.has(o.value));\n const placeholder = this.getAttr('placeholder', 'Selecione…');\n const filtered = search\n ? opts.filter((o) => o.label.toLowerCase().includes(search.toLowerCase()))\n : opts;\n\n this.setTemplate(`\n <span class=\"trigger\" part=\"trigger\" role=\"button\" tabindex=\"${this.disabled ? -1 : 0}\" aria-haspopup=\"listbox\" aria-expanded=\"${wasOpen}\" aria-disabled=\"${this.disabled}\">\n <span class=\"lead\">\n ${\n chips.length\n ? chips.map((c) => `\n <span class=\"chip\" data-value=\"${c.value}\">\n ${c.label}\n <span class=\"chip__x\" role=\"button\" aria-label=\"Remover ${c.label}\">×</span>\n </span>`).join('')\n : `<span class=\"placeholder\">${placeholder}</span>`\n }\n </span>\n <span class=\"trigger-right\">\n ${this.hasAttr('clearable') && chips.length ? '<button type=\"button\" class=\"icon-btn clear\" part=\"clear\" aria-label=\"Limpar seleção\">×</button>' : ''}\n <span class=\"caret\">▼</span>\n </span>\n </span>\n <div class=\"panel\" part=\"panel\" role=\"listbox\" aria-multiselectable=\"true\">\n <div class=\"panel-header\">\n <span class=\"count\">${chips.length} selecionado${chips.length === 1 ? '' : 's'}</span>\n ${this.hasAttr('clearable') && chips.length ? '<button type=\"button\" class=\"clear-all\">Limpar tudo</button>' : ''}\n </div>\n ${this.hasAttr('searchable') ? `<input class=\"search\" part=\"search\" type=\"text\" placeholder=\"${this.getAttr('search-placeholder', 'Pesquisar…')}\">` : ''}\n <ul class=\"list\">\n ${filtered.map((o) => `\n <li><button type=\"button\" class=\"opt\" role=\"option\" data-value=\"${o.value}\"\n aria-selected=\"${this.selected.has(o.value)}\">\n <span class=\"box\" aria-hidden=\"true\"></span>${o.label}\n </button></li>`).join('')}\n ${filtered.length === 0 ? `<li class=\"empty\">${this.getAttr('no-results', 'Nenhum resultado')}</li>` : ''}\n </ul>\n </div>\n `);\n\n // Reabre o painel se estava aberto antes do re-render.\n if (wasOpen) this.setAttribute('open', '');\n\n const searchInput = this.root.querySelector<HTMLInputElement>('.search');\n if (searchInput) {\n searchInput.value = search;\n // Preserva foco e posição do cursor entre os re-renders da digitação.\n searchInput.addEventListener('input', () => {\n const pos = searchInput.selectionStart ?? searchInput.value.length;\n this.render();\n const si = this.root.querySelector<HTMLInputElement>('.search');\n if (si) {\n si.focus();\n si.setSelectionRange(pos, pos);\n }\n });\n searchInput.addEventListener('click', (e) => e.stopPropagation());\n }\n\n const trigger = this.root.querySelector<HTMLElement>('.trigger');\n if (!trigger) return;\n\n trigger.addEventListener('click', (e) => {\n if (this.disabled) return;\n if ((e.target as HTMLElement).closest('.clear')) return;\n if ((e.target as HTMLElement).closest('.chip__x')) return;\n this.toggleAttribute('open');\n // Flip vertical: se não cabe abaixo, abre para cima.\n if (this.hasAttr('open')) {\n const r = this.getBoundingClientRect();\n this.toggleAttribute('up', r.bottom + 300 > window.innerHeight && r.top > 300);\n } else {\n this.removeAttribute('up');\n }\n this.render();\n });\n\n // Acessibilidade: Enter/Espaço abrem o painel (span role=button).\n trigger.addEventListener('keydown', (e) => {\n if (this.disabled) return;\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n trigger.dispatchEvent(new MouseEvent('click', { bubbles: true }));\n }\n });\n\n // × de limpar tudo no trigger.\n this.root.querySelector('.clear')?.addEventListener('click', (e) => {\n e.stopPropagation();\n this.selected.clear();\n this.commit();\n });\n\n // \"Limpar tudo\" no cabeçalho do painel.\n this.root.querySelector('.clear-all')?.addEventListener('click', (e) => {\n e.stopPropagation();\n this.selected.clear();\n this.commit();\n });\n\n // Remover chip individual.\n this.root.querySelectorAll<HTMLElement>('.chip').forEach((chip) => {\n chip.querySelector('.chip__x')?.addEventListener('click', (e) => {\n e.stopPropagation();\n this.toggleValue(chip.dataset.value!);\n });\n });\n\n // Alternar opções.\n this.root.querySelectorAll<HTMLElement>('.opt').forEach((opt) => {\n opt.addEventListener('click', () => this.toggleValue(opt.dataset.value!));\n });\n }\n}\n\nexport function defineFxMultiselect(): typeof FxMultiselect {\n return defineElement('fx-multiselect', FxMultiselect);\n}\n\n","import { defineFxMultiselect } from './multiselect';\n\n// Reexporta a classe para uso programático (instanceof, herança).\nexport { FxMultiselect } from './multiselect';\n\n// Auto-registro ao importar o subpath `@wrrdev/fenix-ui/multiselect`.\ndefineFxMultiselect();\n","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\n\n/**\n * <fx-calendar> — Calendário simples ou por período (range).\n *\n * Atributos:\n * - value=\"YYYY-MM-DD\" → seleção simples\n * - range + start/end → seleção por período\n * - min/max=\"YYYY | YYYY-MM | YYYY-MM-DD\" → limites por ano, mês ou dia\n * - locale (padrão pt-BR), disabled\n *\n * Navegação : clique no cabeçalho (mês) → grade de meses;\n * clique no ano → grade de anos; ‹ › navegam conforme a visualização.\n *\n * Evento: `change` (composed):\n * - simples: detail { value }\n * - range: detail { start, end }\n */\n\ntype View = 'days' | 'months' | 'years';\ninterface Bound {\n lo: number;\n hi: number;\n}\n\nconst key = (y: number, m1: number, d: number): number => y * 10000 + m1 * 100 + d;\n\n/** Aceita \"YYYY\", \"YYYY-MM\" ou \"YYYY-MM-DD\" e devolve [menorChave, maiorChave]. */\nfunction parseBound(raw: string): Bound | null {\n const m = /^(\\d{4})(?:-(\\d{2}))?(?:-(\\d{2}))?$/.exec(raw.trim());\n if (!m) return null;\n const y = +m[1];\n const m1 = m[2] ? +m[2] : 1;\n const d = m[3] ? +m[3] : null;\n if (d !== null) return { lo: key(y, m1, d), hi: key(y, m1, d) };\n if (m[2]) return { lo: key(y, m1, 1), hi: key(y, m1, 31) };\n return { lo: key(y, 1, 1), hi: key(y, 12, 31) };\n}\n\nexport class FxCalendar extends FxElement {\n static override styles = css`\n :host {\n display: inline-block;\n font-family: var(--fx-font-family);\n font-size: var(--fx-font-size);\n color: var(--fx-text-default);\n background: var(--fx-surface-background);\n border: 1px solid var(--fx-border-default);\n border-radius: var(--fx-radius-md);\n box-shadow: var(--fx-shadow-sm);\n padding: var(--fx-space-sm);\n user-select: none;\n }\n :host([disabled]) { opacity: 0.55; pointer-events: none; }\n .head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--fx-space-xs);\n margin-bottom: var(--fx-space-xs);\n }\n .nav,\n .title {\n border: none;\n background: none;\n color: var(--fx-text-default);\n cursor: pointer;\n font: inherit;\n border-radius: var(--fx-radius-sm);\n padding: var(--fx-space-3xs, 4px) var(--fx-space-xs);\n }\n .nav:hover, .title:hover { background: var(--fx-surface-surface-hover); }\n .title { font-weight: var(--fx-font-weight); text-transform: capitalize; flex: 1; }\n .grid {\n display: grid;\n grid-template-columns: repeat(7, 34px);\n gap: 2px;\n }\n .grid.months, .grid.years { grid-template-columns: repeat(4, minmax(52px, 1fr)); }\n .wd {\n text-align: center;\n color: var(--fx-text-muted);\n font-size: calc(var(--fx-font-size) - 2px);\n padding: var(--fx-space-3xs, 4px) 0;\n text-transform: capitalize;\n }\n .cell {\n position: relative;\n border: none;\n background: none;\n font: inherit;\n color: var(--fx-text-default);\n height: 32px;\n border-radius: var(--fx-radius-sm);\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n }\n .cell:hover { background: color-mix(in srgb, var(--fx-color-primary) 12%, transparent); }\n .cell.muted { color: var(--fx-text-disabled); }\n .cell.today::after {\n content: '';\n position: absolute;\n bottom: 3px;\n width: 4px;\n height: 4px;\n border-radius: var(--fx-radius-full);\n background: var(--fx-color-primary);\n }\n .cell.sel {\n background: var(--fx-color-primary);\n color: #fff;\n font-weight: var(--fx-font-weight);\n }\n .cell.sel::after { background: #fff; }\n .cell.in-range {\n background: color-mix(in srgb, var(--fx-color-primary) 16%, transparent);\n border-radius: 0;\n }\n .grid.months .cell, .grid.years .cell { height: 40px; }\n .cell[disabled] { opacity: 0.35; cursor: not-allowed; pointer-events: none; }\n `;\n\n static override get observedAttributes(): string[] {\n return ['value', 'start', 'end', 'min', 'max', 'range', 'mode', 'values', 'locale', 'disabled'];\n }\n\n private view: View = 'days';\n private cursor = { y: new Date().getFullYear(), m: new Date().getMonth() };\n /** Período em construção (chaves numéricas). */\n private pickStart: number | null = null;\n private pickEnd: number | null = null;\n\n /** Modo de seleção: 'single' | 'range' | 'multiple'. */\n get mode(): 'single' | 'range' | 'multiple' {\n const m = this.getAttr('mode');\n if (m === 'range' || m === 'multiple') return m;\n return this.hasAttr('range') ? 'range' : 'single';\n }\n set mode(m: 'single' | 'range' | 'multiple') {\n this.setAttribute('mode', m);\n }\n\n get range(): boolean {\n return this.mode === 'range';\n }\n set range(value: boolean) {\n this.toggleAttr('range', Boolean(value));\n }\n\n /** Datas selecionadas no modo multiple (CSV no atributo). */\n get values(): string[] {\n const csv = this.getAttr('values');\n return csv ? csv.split(',').map((v) => v.trim()).filter(Boolean) : [];\n }\n set values(list: string[]) {\n this.setAttribute('values', list.join(','));\n }\n\n get value(): string {\n return this.getAttr('value');\n }\n set value(v: string) {\n this.setAttribute('value', v);\n }\n\n private bounds(): { min: Bound | null; max: Bound | null } {\n return {\n min: parseBound(this.getAttr('min', '')),\n max: parseBound(this.getAttr('max', '')),\n };\n }\n\n private locale(): string {\n return this.getAttr('locale', 'pt-BR');\n }\n\n private fmt(opts: Intl.DateTimeFormatOptions, d: Date): string {\n try {\n return new Intl.DateTimeFormat(this.locale(), opts).format(d);\n } catch {\n return new Intl.DateTimeFormat('pt-BR', opts).format(d);\n }\n }\n\n private dayDisabled(y: number, m: number, d: number): boolean {\n const { min, max } = this.bounds();\n const k = key(y, m + 1, d);\n return (min !== null && k < min.lo) || (max !== null && k > max.hi);\n }\n\n private monthDisabled(y: number, m1: number): boolean {\n const { min, max } = this.bounds();\n const lo = key(y, m1, 1);\n const hi = key(y, m1, 31);\n return (min !== null && hi < min.lo) || (max !== null && lo > max.hi);\n }\n\n private yearDisabled(y: number): boolean {\n const { min, max } = this.bounds();\n const lo = key(y, 1, 1);\n const hi = key(y, 12, 31);\n return (min !== null && hi < min.lo) || (max !== null && lo > max.hi);\n }\n\n private dayKeyOf(date: Date): number {\n return key(date.getFullYear(), date.getMonth() + 1, date.getDate());\n }\n\n private keyToDate(k: number): Date {\n return new Date(Math.floor(k / 10000), (Math.floor(k / 100) % 100) - 1, k % 100);\n }\n\n private iso(k: number): string {\n const d = this.keyToDate(k);\n const p = (n: number): string => String(n).padStart(2, '0');\n return `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())}`;\n }\n\n /** Seleção atual para pintura (chaves). */\n private selection(): {\n start: number | null;\n end: number | null;\n single: number | null;\n multi: Set<number>;\n } {\n const multi = new Set(this.values.map((iso) => parseBound(iso)?.lo ?? 0).filter(Boolean));\n if (this.mode === 'range') {\n let s = this.pickStart;\n let e = this.pickEnd;\n const attrS = parseBound(this.getAttr('start', ''));\n const attrE = parseBound(this.getAttr('end', ''));\n if (s === null && attrS) s = attrS.lo;\n if (e === null && attrE) e = attrE.lo;\n return { start: s, end: e, single: null, multi };\n }\n if (this.mode === 'multiple') {\n return { start: null, end: null, single: null, multi };\n }\n const v = parseBound(this.getAttr('value', ''));\n return { start: null, end: null, single: v ? v.lo : null, multi };\n }\n\n private emit(): void {\n if (this.mode === 'range') {\n const detail = {\n start: this.pickStart !== null ? this.iso(this.pickStart) : this.getAttr('start', ''),\n end: this.pickEnd !== null ? this.iso(this.pickEnd) : this.getAttr('end', ''),\n };\n this.setAttribute('start', detail.start);\n this.setAttribute('end', detail.end);\n this.dispatchEvent(new CustomEvent('change', { bubbles: true, composed: true, detail }));\n } else if (this.mode === 'multiple') {\n const values = this.values;\n this.dispatchEvent(new CustomEvent('change', { bubbles: true, composed: true, detail: { values } }));\n } else {\n const value = this.getAttr('value');\n this.dispatchEvent(new CustomEvent('change', { bubbles: true, composed: true, detail: { value } }));\n }\n }\n\n private pickDay(k: number): void {\n if (this.mode === 'range') {\n if (this.pickStart === null || this.pickEnd !== null) {\n this.pickStart = k;\n this.pickEnd = null;\n this.setAttribute('start', this.iso(k));\n this.removeAttribute('end');\n this.render();\n return; // emite só ao completar o período\n }\n if (k < this.pickStart) [this.pickStart, this.pickEnd] = [k, this.pickStart];\n else this.pickEnd = k;\n this.emit();\n } else if (this.mode === 'multiple') {\n const set = new Set(this.values);\n const iso = this.iso(k);\n if (set.has(iso)) set.delete(iso);\n else set.add(iso);\n this.values = [...set].sort();\n this.emit();\n } else {\n this.value = this.iso(k);\n this.emit();\n }\n this.render();\n }\n\n private navigate(dir: -1 | 1): void {\n if (this.view === 'days') {\n const d = new Date(this.cursor.y, this.cursor.m + dir, 1);\n this.cursor = { y: d.getFullYear(), m: d.getMonth() };\n } else if (this.view === 'months') {\n this.cursor.y += dir;\n } else {\n this.cursor.y += dir * 12;\n }\n this.render();\n }\n\n protected override render(): void {\n const todayK = this.dayKeyOf(new Date());\n const sel = this.selection();\n const loc = this.locale();\n\n const titles: Record<View, string> = {\n days: this.fmt({ month: 'long', year: 'numeric' }, new Date(this.cursor.y, this.cursor.m, 1)),\n months: String(this.cursor.y),\n years: `${Math.floor(this.cursor.y / 12) * 12} – ${Math.floor(this.cursor.y / 12) * 12 + 11}`,\n };\n\n let cells = '';\n if (this.view === 'days') {\n const wds = [...Array(7)].map((_, i) =>\n this.fmt({ weekday: 'short' }, new Date(2024, 8, 1 + i)), // 01/09/2024 foi domingo\n );\n cells =\n wds.map((w) => `<span class=\"wd\">${w}</span>`).join('') +\n this.daysHtml(todayK, sel, loc);\n } else if (this.view === 'months') {\n cells = [...Array(12)]\n .map((_, i) => {\n const dis = this.monthDisabled(this.cursor.y, i + 1);\n return `<button type=\"button\" class=\"cell\" data-month=\"${i}\" ${dis ? 'disabled' : ''}>${this.fmt({ month: 'short' }, new Date(this.cursor.y, i, 1))}</button>`;\n })\n .join('');\n } else {\n const base = Math.floor(this.cursor.y / 12) * 12;\n cells = [...Array(12)]\n .map((_, i) => {\n const y = base + i;\n const dis = this.yearDisabled(y);\n return `<button type=\"button\" class=\"cell\" data-year=\"${y}\" ${dis ? 'disabled' : ''}>${y}</button>`;\n })\n .join('');\n }\n\n const titleAction =\n this.view === 'days'\n ? `data-goto=\"months\"`\n : this.view === 'months'\n ? `data-goto=\"years\"`\n : '';\n\n this.setTemplate(`\n <div class=\"head\">\n <button type=\"button\" class=\"nav\" data-nav=\"-1\" aria-label=\"Anterior\">‹</button>\n <button type=\"button\" class=\"title\" part=\"title\" ${titleAction}>${titles[this.view]}</button>\n <button type=\"button\" class=\"nav\" data-nav=\"1\" aria-label=\"Próximo\">›</button>\n </div>\n <div class=\"grid ${this.view}\">${cells}</div>\n `);\n\n this.root.querySelectorAll<HTMLButtonElement>('[data-nav]').forEach((b) =>\n b.addEventListener('click', () => this.navigate(Number(b.dataset.nav) as -1 | 1)),\n );\n const gotoBtn = this.root.querySelector<HTMLElement>('[data-goto]');\n gotoBtn?.addEventListener('click', () => {\n this.view = gotoBtn.dataset.goto as View;\n this.render();\n });\n\n this.root.querySelectorAll<HTMLButtonElement>('[data-day]').forEach((b) =>\n b.addEventListener('click', () => this.pickDay(Number(b.dataset.day!))),\n );\n this.root.querySelectorAll<HTMLButtonElement>('[data-month]').forEach((b) =>\n b.addEventListener('click', () => {\n this.cursor.m = Number(b.dataset.month!);\n this.view = 'days';\n this.render();\n }),\n );\n this.root.querySelectorAll<HTMLButtonElement>('[data-year]').forEach((b) =>\n b.addEventListener('click', () => {\n this.cursor.y = Number(b.dataset.year!);\n this.view = 'months';\n this.render();\n }),\n );\n }\n\n /** Grade de dias com preenchimento do mês anterior. */\n private daysHtml(todayK: number, sel: ReturnType<FxCalendar['selection']>, _loc: string): string {\n const { y, m } = this.cursor;\n const first = new Date(y, m, 1).getDay(); // 0=domingo\n const total = new Date(y, m + 1, 0).getDate();\n const prevTotal = new Date(y, m, 0).getDate();\n\n let html = '';\n for (let i = first - 1; i >= 0; i--) {\n html += `<span class=\"cell muted\">${prevTotal - i}</span>`;\n }\n for (let d = 1; d <= total; d++) {\n const k = key(y, m + 1, d);\n const isSel =\n sel.single === k || sel.start === k || sel.end === k || sel.multi.has(k);\n const inRange =\n sel.start !== null && sel.end !== null && k > sel.start && k < sel.end;\n const cls = ['cell', isSel ? 'sel' : '', inRange ? 'in-range' : '', k === todayK ? 'today' : '']\n .filter(Boolean)\n .join(' ');\n html += `<button type=\"button\" class=\"${cls}\" data-day=\"${k}\" ${this.dayDisabled(y, m, d) ? 'disabled' : ''}>${d}</button>`;\n }\n return html;\n }\n}\n\nexport function defineFxCalendar(): typeof FxCalendar {\n return defineElement('fx-calendar', FxCalendar);\n}\n\n","import { defineFxCalendar } from './calendar';\n\n// Reexporta a classe para uso programático (instanceof, herança).\nexport { FxCalendar } from './calendar';\n\n// Auto-registro ao importar o subpath `@wrrdev/fenix-ui/calendar`.\ndefineFxCalendar();\n","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\n\n/**\n * <fx-datepicker> — Campo de data com calendário suspenso.\n *\n * Um input com ícone de calendário no final; ao clicar, abre o\n * <fx-calendar> em um popover. As datas selecionadas aparecem no input.\n *\n * Atributos:\n * - mode=\"single\" | \"range\" | \"multiple\" (padrão: single)\n * - value=\"YYYY-MM-DD\" → single\n * - start/end → range\n * - values=\"a,b,c\" → múltiplas datas (CSV)\n * - min/max, placeholder, disabled, clearable, size (sm|md|lg)\n * - format=\"dd/mm/yyyy\" → máscara de exibição (tokens: dd mm yyyy, HH MM SS)\n * - show-time → inclui seleção de hora:minuto:segundo no popover;\n * o valor passa a ser \"YYYY-MM-DDTHH:mm:ss\"\n *\n * Evento: `change` (composed):\n * - single: { value }\n * - range: { value, start, end }\n * - multiple: { values: string[] }\n */\nexport class FxDatepicker extends FxElement {\n static override styles = css`\n :host {\n display: inline-block;\n vertical-align: middle;\n font-family: var(--fx-font-family);\n font-size: var(--fx-font-size);\n position: relative;\n }\n .field {\n display: inline-flex;\n align-items: center;\n gap: var(--fx-space-xs);\n width: 100%;\n box-sizing: border-box;\n /* Base = tamanho padrão (md): 40px */\n min-height: var(--fx-size-md, 40px);\n min-width: 150px;\n padding: var(--fx-space-xs) var(--fx-space-md);\n background-color: var(--fx-surface-background);\n border: 1px solid var(--fx-border-default);\n border-radius: var(--fx-radius-md);\n cursor: pointer;\n transition:\n border-color var(--fx-motion-duration-normal) var(--fx-motion-easing),\n box-shadow var(--fx-motion-duration-normal) var(--fx-motion-easing);\n }\n :host([size='sm']) .field { min-height: 32px; min-width: 180px; }\n :host([size='md']) .field { min-height: 40px; }\n :host([size='lg']) .field { min-height: 48px; min-width: 220px; font-size: calc(var(--fx-font-size) + 4px); }\n /* Range e multiple exibem mais de uma data: campo mais largo */\n :host([mode='range']) .field { min-width: 250px; }\n :host([mode='multiple']) .field { min-width: 220px; }\n :host([mode='range'][size='lg']) .field { min-width: 360px; }\n :host([mode='multiple'][size='lg']) .field { min-width: 320px; }\n :host([show-time]) .field { min-width: 250px; }\n /* Validação */\n :host([error]) .field,\n :host([invalid]) .field {\n border-color: var(--fx-color-danger, #dc2626);\n }\n :host([error]) .field:focus-within,\n :host([invalid]) .field:focus-within,\n :host([error][open]) .field,\n :host([invalid][open]) .field {\n border-color: var(--fx-color-danger, #dc2626);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--fx-color-danger, #dc2626) 18%, transparent);\n }\n :host([success]) .field,\n :host([valid]) .field {\n border-color: var(--fx-color-success, #16a34a);\n }\n :host([success]) .field:focus-within,\n :host([valid]) .field:focus-within,\n :host([success][open]) .field,\n :host([valid][open]) .field {\n border-color: var(--fx-color-success, #16a34a);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--fx-color-success, #16a34a) 18%, transparent);\n }\n .field:hover { border-color: var(--fx-border-hover); }\n .field:focus-within {\n outline: none;\n border-color: var(--fx-color-primary);\n box-shadow: var(--fx-effect-focus-ring, none);\n }\n .display {\n flex: 1;\n border: none;\n background: none;\n font: inherit;\n color: var(--fx-text-default);\n outline: none;\n cursor: pointer;\n text-align: left;\n padding: 0;\n min-width: 0;\n }\n .display::placeholder { color: var(--fx-text-muted); }\n .cal-icon { color: var(--fx-text-muted); display: inline-flex; pointer-events: none; }\n .clear {\n border: none;\n background: none;\n color: var(--fx-text-muted);\n cursor: pointer;\n font-size: calc(var(--fx-font-size) + 4px);\n line-height: 1;\n padding: 0 2px;\n border-radius: var(--fx-radius-full);\n }\n .clear:hover { color: var(--fx-color-danger); }\n .clear[hidden] { display: none; }\n .pop {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n z-index: var(--fx-z-dropdown, 1000);\n display: none;\n background: var(--fx-surface-background);\n border: 1px solid var(--fx-border-default);\n border-radius: var(--fx-radius-md);\n box-shadow: var(--fx-shadow-lg);\n overflow: hidden;\n }\n :host([up]) .pop {\n top: auto;\n bottom: calc(100% + 4px);\n }\n :host([open]) .pop { display: block; }\n .time-row {\n display: flex;\n align-items: center;\n gap: var(--fx-space-xs);\n padding: var(--fx-space-sm) var(--fx-space-md);\n border-top: 1px solid var(--fx-border-default);\n background: var(--fx-surface-background);\n border-radius: 0 0 var(--fx-radius-md) var(--fx-radius-md);\n font-size: calc(var(--fx-font-size) - 2px);\n color: var(--fx-text-default);\n }\n .time-row label { color: var(--fx-text-muted); }\n .time-row input {\n width: 38px;\n font: inherit;\n color: var(--fx-text-default);\n background: var(--fx-surface-background);\n border: 1px solid var(--fx-border-default);\n border-radius: var(--fx-radius-sm);\n padding: 2px 2px;\n outline: none;\n text-align: center;\n -moz-appearance: textfield;\n appearance: textfield;\n }\n .time-row input::-webkit-outer-spin-button,\n .time-row input::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }\n .time-row .sep { color: var(--fx-text-muted); font-weight: bold; padding: 0 1px; }\n .time-row input:focus {\n border-color: var(--fx-color-primary);\n box-shadow: var(--fx-effect-focus-ring, none);\n }\n :host([disabled]) .field { opacity: 0.55; cursor: not-allowed; background: var(--fx-surface-surface-hover); }\n :host([disabled]) .display { cursor: not-allowed; }\n :host([free-text]) .display { cursor: text; }\n :host([free-text]) .display.invalid { border-bottom: 2px solid var(--fx-color-danger); }\n `;\n\n static override get observedAttributes(): string[] {\n return ['value', 'start', 'end', 'values', 'mode', 'min', 'max', 'placeholder', 'disabled', 'format', 'show-time', 'free-text'];\n }\n\n private docListener?: (e: Event) => void;\n /** Hora/minuto/segundo do modo show-time. */\n private time = { h: 0, m: 0, s: 0 };\n\n get mode(): string {\n const m = this.getAttr('mode', 'single');\n return ['single', 'range', 'multiple'].includes(m) ? m : 'single';\n }\n set mode(value: string) {\n this.setAttribute('mode', value);\n }\n\n get value(): string {\n return this.getAttr('value');\n }\n set value(v: string) {\n this.setAttribute('value', v);\n }\n\n /** Datas do modo múltiplo (CSV no atributo). */\n get values(): string[] {\n const csv = this.getAttr('values');\n return csv ? csv.split(',').map((v) => v.trim()).filter(Boolean) : [];\n }\n set values(list: string[]) {\n this.setAttribute('values', list.join(','));\n }\n\n get disabled(): boolean {\n return this.hasAttr('disabled');\n }\n set disabled(value: boolean) {\n this.toggleAttr('disabled', Boolean(value));\n }\n\n protected override connectedCallback(): void {\n super.connectedCallback();\n // Fecha o popover ao clicar fora.\n this.docListener = (e: Event) => {\n if (!this.hasAttr('open')) return;\n if (e.composedPath().includes(this)) return;\n this.removeAttribute('open');\n };\n document.addEventListener('click', this.docListener);\n }\n\n protected override disconnectedCallback(): void {\n super.disconnectedCallback();\n if (this.docListener) document.removeEventListener('click', this.docListener);\n }\n\n /** Formata uma data ISO (\"YYYY-MM-DD\" ou com \"THH:mm:ss\") segundo o atributo format. */\n private formatDate(iso: string): string {\n if (!iso) return '';\n const fmt = this.getAttr('format');\n // Sem máscara: exibe apenas a parte da data (a hora entra via timeText\n // quando show-time está ativo — nunca duplicada).\n if (!fmt) return iso.split('T')[0]!;\n const [datePart, timePart] = iso.split('T');\n const [y = '', m = '', d = ''] = datePart.split('-');\n const [H = '00', M = '00', S = '00'] = (timePart ?? '').split(':');\n // Placeholders para evitar colisão entre mm (mês) e MM (minuto).\n return fmt\n .replace(/yyyy/gi, '\\u0001')\n .replace(/MM/g, '\\u0005')\n .replace(/mm/g, '\\u0002')\n .replace(/dd/gi, '\\u0003')\n .replace(/HH/g, '\\u0004')\n .replace(/SS/gi, '\\u0006')\n .replace(/\\u0001/g, y)\n .replace(/\\u0002/g, m)\n .replace(/\\u0003/g, d)\n .replace(/\\u0004/g, H)\n .replace(/\\u0005/g, M)\n .replace(/\\u0006/g, S);\n }\n\n /** Texto exibido no input conforme o modo. */\n private displayText(): string {\n if (this.mode === 'range') {\n const s = this.getAttr('start');\n const e = this.getAttr('end');\n const arrow = this.hasAttr('show-time') ? ' ' : ' → ';\n if (!s && !e) return '';\n if (this.hasAttr('show-time')) {\n const f = (iso?: string): string => (iso ? `${this.formatDate(iso)} ${this.timeText()}` : iso ? `${this.formatDate(iso)} …` : '');\n return s && e ? `${f(s)} → ${f(e)}` : f(s);\n }\n void arrow;\n return s && e ? `${this.formatDate(s)} → ${this.formatDate(e)}` : s ? `${this.formatDate(s)} → …` : '';\n }\n if (this.mode === 'multiple') {\n return this.values.map((v) => this.formatDate(v)).join(', ');\n }\n const base = this.formatDate(this.value);\n return base && this.hasAttr('show-time') ? `${base} ${this.timeText()}` : base;\n }\n\n /** \"HH:MM:SS\" do estado interno de show-time. */\n private timeText(): string {\n const p = (n: number): string => String(n).padStart(2, '0');\n return `${p(this.time.h)}:${p(this.time.m)}:${p(this.time.s)}`;\n }\n\n /** Extrai hora de um valor ISO inicial, se houver. */\n private loadTimeFromValue(): void {\n const src = this.value || this.getAttr('start') || '';\n const t = src.split('T')[1];\n if (!t) return;\n const [h, m, s] = t.split(':').map((n) => parseInt(n, 10));\n this.time = { h: h || 0, m: m || 0, s: s || 0 };\n }\n\n /** Anexa o horário interno ao ISO puro vindo do calendário. */\n private withTime(iso: string): string {\n if (!iso) return iso;\n return this.hasAttr('show-time')\n ? `${iso}T${this.timeText()}`\n : iso;\n }\n\n protected override render(): void {\n const disabled = this.disabled;\n const clearable = this.hasAttr('clearable');\n const text = this.displayText();\n const hasValue = text.length > 0;\n const showTime = this.hasAttr('show-time');\n this.loadTimeFromValue();\n\n // Atributos repassados ao calendário interno, conforme o modo.\n let calAttrs = `min=\"${this.getAttr('min')}\" max=\"${this.getAttr('max')}\"`;\n if (this.mode === 'range') {\n calAttrs += ` range start=\"${this.getAttr('start')}\" end=\"${this.getAttr('end')}\"`;\n } else if (this.mode === 'multiple') {\n // Repassa apenas as partes de data (sem hora) para o calendário pintar.\n const dates = this.values.map((v) => v.split('T')[0]).join(',');\n calAttrs += ` mode=\"multiple\" values=\"${dates}\"`;\n } else {\n const v = this.value.split('T')[0] ?? '';\n calAttrs += ` value=\"${v}\"`;\n }\n\n this.setTemplate(`\n <div class=\"field\" part=\"field\">\n <input class=\"display\" part=\"display\" type=\"text\" ${this.hasAttr('free-text') && !disabled ? '' : 'readonly'}\n placeholder=\"${this.getAttr('placeholder', 'dd/mm/aaaa')}\"\n value=\"${text}\" ${disabled ? 'disabled' : ''}>\n <button type=\"button\" class=\"clear\" part=\"clear\" aria-label=\"Limpar\"\n ${clearable && hasValue ? '' : 'hidden'}>\n ×\n </button>\n <span class=\"cal-icon\" part=\"icon\" aria-hidden=\"true\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\">\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\"/>\n <path d=\"M16 2v4M8 2v4M3 10h18\"/>\n </svg>\n </span>\n </div>\n <div class=\"pop\" part=\"popover\">\n <fx-calendar ${calAttrs}></fx-calendar>\n ${\n showTime\n ? `<div class=\"time-row\" part=\"time\">\n <input class=\"t-h\" type=\"number\" min=\"0\" max=\"23\" value=\"${this.time.h}\" aria-label=\"Hora\"><span class=\"sep\">:</span>\n <input class=\"t-m\" type=\"number\" min=\"0\" max=\"59\" value=\"${this.time.m}\" aria-label=\"Minuto\"><span class=\"sep\">:</span>\n <input class=\"t-s\" type=\"number\" min=\"0\" max=\"59\" value=\"${this.time.s}\" aria-label=\"Segundo\">\n </div>`\n : ''\n }\n </div>\n `);\n\n const field = this.root.querySelector('.field');\n if (!field) return;\n if (disabled) return;\n\n field.addEventListener('click', (e) => {\n if ((e.target as HTMLElement).closest('.clear')) return;\n // Com free-text, clicar no próprio input serve para digitar — não abre.\n if (this.hasAttr('free-text') && (e.target as HTMLElement).classList.contains('display')) return;\n this.toggleAttribute('open');\n // Flip vertical: se não cabe abaixo, abre para cima.\n if (this.hasAttr('open')) {\n const r = this.getBoundingClientRect();\n this.toggleAttribute('up', r.bottom + 340 > window.innerHeight && r.top > 340);\n } else {\n this.removeAttribute('up');\n }\n });\n\n // Limpar: zera tudo conforme o modo.\n this.root.querySelector('.clear')?.addEventListener('click', (e) => {\n e.stopPropagation();\n this.removeAttribute('value');\n this.removeAttribute('start');\n this.removeAttribute('end');\n this.removeAttribute('values');\n this.removeAttribute('open');\n this.render();\n this.emitChange({});\n });\n\n // Sincroniza seleção do calendário de volta para os atributos.\n const cal = this.root.querySelector<HTMLElement>('.pop fx-calendar');\n cal?.addEventListener('change', (e) => {\n const d = (e as CustomEvent).detail ?? {};\n if (d.start !== undefined || d.end !== undefined) {\n if (d.start) this.setAttribute('start', this.withTime(d.start));\n else this.removeAttribute('start');\n if (d.end) this.setAttribute('end', this.withTime(d.end));\n else this.removeAttribute('end');\n }\n if (d.values !== undefined) {\n this.values = d.values.map((v: string) => this.withTime(v));\n }\n if (d.value !== undefined) {\n if (d.value) this.setAttribute('value', this.withTime(d.value));\n else this.removeAttribute('value');\n // No modo single, fecha ao escolher.\n if (this.mode === 'single') this.removeAttribute('open');\n }\n this.render();\n this.emitChange(d);\n });\n\n // free-text: valida ao sair do campo ou pressionar Enter.\n const display = this.root.querySelector<HTMLInputElement>('.display');\n if (display && this.hasAttr('free-text') && !disabled) {\n display.addEventListener('keydown', (e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n this.commitTyped(display);\n }\n });\n display.addEventListener('blur', () => this.commitTyped(display));\n }\n\n // show-time: captura alterações de hora/minuto/segundo.\n if (showTime) {\n const applyTime = (): void => {\n const h = this.root.querySelector<HTMLInputElement>('.t-h');\n const m = this.root.querySelector<HTMLInputElement>('.t-m');\n const s = this.root.querySelector<HTMLInputElement>('.t-s');\n const clamp = (v: string | undefined, max: number): number =>\n Math.min(max, Math.max(0, parseInt(v ?? '0', 10) || 0));\n this.time = {\n h: clamp(h?.value, 23),\n m: clamp(m?.value, 59),\n s: clamp(s?.value, 59),\n };\n // Reanexa o horário aos valores já selecionados.\n const reattach = (iso: string): string => iso.split('T')[0] ? `${iso.split('T')[0]}T${this.timeText()}` : iso;\n if (this.value) this.setAttribute('value', reattach(this.value));\n if (this.getAttr('start')) this.setAttribute('start', reattach(this.getAttr('start')));\n if (this.getAttr('end')) this.setAttribute('end', reattach(this.getAttr('end')));\n if (this.values.length) {\n this.values = this.values.map((v) => reattach(v));\n }\n // Atualiza apenas o texto do input, sem re-render completo.\n const display = this.root.querySelector<HTMLInputElement>('.display');\n if (display) display.value = this.displayText();\n this.emitChange({ value: this.value });\n };\n ['.t-h', '.t-m', '.t-s'].forEach((sel) => {\n this.root.querySelector(sel)?.addEventListener('input', applyTime);\n });\n }\n }\n\n private emitChange(detail: Record<string, unknown>): void {\n this.dispatchEvent(\n new CustomEvent('change', { bubbles: true, composed: true, detail }),\n );\n }\n\n /**\n * Interpreta o texto digitado livremente e devolve ISO \"YYYY-MM-DD\"\n * (ou null se inválido). Aceita a máscara do atributo `format`\n * (tokens dd/mm/yyyy) ou ISO direto.\n */\n private parseTyped(raw: string): string | null {\n const text = raw.trim();\n if (!text) return null;\n const fmt = this.getAttr('format', 'dd/mm/yyyy').toLowerCase();\n\n // Ordem dos tokens conforme a máscara informada.\n const order = ['dd', 'mm', 'yyyy'].filter((t) => fmt.includes(t));\n if (order.length < 3) return null;\n\n const parts = text.split(new RegExp(`[^0-9]+`)).filter(Boolean);\n if (parts.length !== 3) return null;\n\n const map: Record<string, string> = {};\n order.forEach((t, i) => (map[t] = parts[i]!));\n const iso = `${map['yyyy']}-${(map['mm'] ?? '').padStart(2, '0')}-${(map['dd'] ?? '').padStart(2, '0')}`;\n\n // Validação de data real.\n const d = new Date(`${iso}T12:00:00`);\n if (Number.isNaN(d.getTime())) return null;\n const [y, m, day] = iso.split('-').map((n) => parseInt(n, 10));\n if (d.getFullYear() !== y || d.getMonth() + 1 !== m || d.getDate() !== day) return null;\n\n // Limites min/max (apenas a parte da data).\n const cmp = (a: string, b: string): number => a.split('T')[0]!.localeCompare(b.split('T')[0]!);\n const min = this.getAttr('min');\n const max = this.getAttr('max');\n if (min && cmp(iso, min) < 0) return null;\n if (max && cmp(iso, max) > 0) return null;\n\n return iso;\n }\n\n /** Aplica o texto digitado no modo free-text (blur/Enter). */\n private commitTyped(input: HTMLInputElement): void {\n const parsed = this.parseTyped(input.value);\n if (!parsed) {\n // Inválido: sinaliza, reverte o texto e emite evento.\n input.classList.add('invalid');\n this.dispatchEvent(\n new CustomEvent('invalid', { bubbles: true, composed: true, detail: { text: input.value } }),\n );\n input.value = this.displayText();\n setTimeout(() => input.classList.remove('invalid'), 1500);\n return;\n }\n if (this.mode === 'single') {\n this.setAttribute('value', this.withTime(parsed));\n this.emitChange({ value: this.value });\n } else if (this.mode === 'range') {\n // Primeira digitação vira start; com start preenchido, vira end.\n if (!this.getAttr('start') || (this.getAttr('start') && this.getAttr('end'))) {\n this.setAttribute('start', this.withTime(parsed));\n this.removeAttribute('end');\n } else {\n const [a, b] = [this.getAttr('start')!.split('T')[0]!, parsed].sort();\n this.setAttribute('start', this.withTime(a));\n this.setAttribute('end', this.withTime(b));\n }\n this.emitChange({ start: this.getAttr('start'), end: this.getAttr('end') });\n } else {\n const list = this.values.filter((v) => v.split('T')[0] !== parsed);\n list.push(this.withTime(parsed));\n this.values = list;\n this.emitChange({ values: this.values });\n }\n this.render();\n }\n}\n\nexport function defineFxDatepicker(): typeof FxDatepicker {\n return defineElement('fx-datepicker', FxDatepicker);\n}\n\n","import { defineFxDatepicker } from './datepicker';\nimport '../calendar';\n\n// Reexporta a classe para uso programático (instanceof, herança).\nexport { FxDatepicker } from './datepicker';\n\n// Auto-registro ao importar o subpath `@wrrdev/fenix-ui/datepicker`.\ndefineFxDatepicker();\n","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\n\n/**\n * <fx-checkbox> — Caixa de seleção com suporte a estado indeterminado.\n *\n * Atributos: checked, indeterminate, disabled, value, size (sm|md|lg).\n * Evento: `change` (composed, detail: { checked, value }).\n */\nexport class FxCheckbox extends FxElement {\n static override styles = css`\n :host {\n display: inline-flex;\n vertical-align: middle;\n font-family: var(--fx-font-family);\n font-size: var(--fx-font-size);\n }\n .box {\n display: inline-flex;\n align-items: center;\n gap: var(--fx-space-sm);\n cursor: pointer;\n user-select: none;\n color: var(--fx-text-default);\n -webkit-tap-highlight-color: transparent;\n }\n .control {\n width: var(--fx-size-checkbox, 18px);\n height: var(--fx-size-checkbox, 18px);\n flex-shrink: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border: 2px solid var(--fx-border-hover);\n border-radius: calc(var(--fx-radius-sm) + 2px);\n background: var(--fx-surface-background);\n color: #fff;\n font-size: calc(var(--fx-size-checkbox, 18px) - 6px);\n line-height: 1;\n transition:\n background-color var(--fx-motion-duration-fast) var(--fx-motion-easing),\n border-color var(--fx-motion-duration-fast) var(--fx-motion-easing),\n box-shadow var(--fx-motion-duration-fast) var(--fx-motion-easing);\n }\n .box:hover .control { border-color: var(--fx-color-primary); }\n .box:focus-visible .control {\n outline: none;\n box-shadow: var(--fx-effect-focus-ring, none);\n }\n :host([checked]) .control {\n background: var(--fx-color-primary);\n border-color: var(--fx-color-primary);\n }\n :host([indeterminate]) .control {\n background: var(--fx-color-primary);\n border-color: var(--fx-color-primary);\n }\n /* Validação */\n :host([error]) .control,\n :host([invalid]) .control { border-color: var(--fx-color-danger, #dc2626); }\n :host([success]) .control,\n :host([valid]) .control { border-color: var(--fx-color-success, #16a34a); }\n .mark { visibility: hidden; }\n :host([checked]) .mark,\n :host([indeterminate]) .mark { visibility: visible; }\n .label { display: inline-flex; align-items: center; }\n :host([disabled]) .box {\n opacity: 0.55;\n cursor: not-allowed;\n pointer-events: none;\n }\n `;\n\n static override get observedAttributes(): string[] {\n return ['checked', 'disabled', 'indeterminate'];\n }\n\n get checked(): boolean {\n return this.hasAttr('checked');\n }\n set checked(value: boolean) {\n this.toggleAttr('checked', Boolean(value));\n }\n\n get indeterminate(): boolean {\n return this.hasAttr('indeterminate');\n }\n set indeterminate(value: boolean) {\n this.toggleAttr('indeterminate', Boolean(value));\n }\n\n get disabled(): boolean {\n return this.hasAttr('disabled');\n }\n set disabled(value: boolean) {\n this.toggleAttr('disabled', Boolean(value));\n }\n\n /** Tamanho do controle. Padrão: `'md'`. */\n get size(): string {\n const s = this.getAttr('size', 'md');\n return s === 'sm' || s === 'lg' ? s : 'md';\n }\n set size(value: string) {\n this.setAttribute('size', value);\n }\n\n protected override render(): void {\n // Escala por tamanho via token local.\n const px = this.size === 'sm' ? '14px' : this.size === 'lg' ? '22px' : '18px';\n if (!this.style.getPropertyValue('--fx-size-checkbox')) {\n this.style.setProperty('--fx-size-checkbox', px);\n }\n\n this.setTemplate(`\n <span class=\"box\" part=\"box\" role=\"checkbox\" tabindex=\"0\"\n aria-checked=\"${this.indeterminate ? 'mixed' : this.checked}\"\n aria-disabled=\"${this.disabled}\">\n <span class=\"control\" part=\"control\">\n <span class=\"mark\">${this.indeterminate ? '–' : '✓'}</span>\n </span>\n <span class=\"label\" part=\"label\"><slot></slot></span>\n </span>\n `);\n\n const box = this.root.querySelector<HTMLElement>('.box');\n if (!box) return;\n box.addEventListener('click', () => this.toggle());\n box.addEventListener('keydown', (e) => {\n if ((e as KeyboardEvent).key === ' ' || (e as KeyboardEvent).key === 'Enter') {\n e.preventDefault();\n this.toggle();\n }\n });\n }\n\n private toggle(): void {\n if (this.disabled) return;\n this.indeterminate = false; // interagir resolve o estado misto\n this.checked = !this.checked;\n this.dispatchEvent(\n new CustomEvent('change', {\n bubbles: true,\n composed: true,\n detail: { checked: this.checked, value: this.getAttr('value') },\n }),\n );\n }\n}\n\nexport function defineFxCheckbox(): typeof FxCheckbox {\n return defineElement('fx-checkbox', FxCheckbox);\n}\n","import { defineFxCheckbox } from './checkbox';\n\n// Reexporta a classe para uso programático (instanceof, herança).\nexport { FxCheckbox } from './checkbox';\n\n// Auto-registro ao importar o subpath `@wrrdev/fenix-ui/checkbox`.\ndefineFxCheckbox();\n","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\n\n/**\n * <fx-radio> — Botão de opção. Radios com o mesmo `name` formam um grupo\n * (seleção exclusiva gerenciada pelo próprio componente).\n *\n * Atributos: checked, disabled, value, name, size (sm|md|lg).\n * Evento: `change` (composed, detail: { checked, value }).\n */\nexport class FxRadio extends FxElement {\n static override styles = css`\n :host {\n display: inline-flex;\n vertical-align: middle;\n font-family: var(--fx-font-family);\n font-size: var(--fx-font-size);\n }\n .box {\n display: inline-flex;\n align-items: center;\n gap: var(--fx-space-sm);\n cursor: pointer;\n user-select: none;\n color: var(--fx-text-default);\n -webkit-tap-highlight-color: transparent;\n }\n .control {\n width: var(--fx-size-radio, 18px);\n height: var(--fx-size-radio, 18px);\n flex-shrink: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border: 2px solid var(--fx-border-hover);\n border-radius: var(--fx-radius-full);\n background: var(--fx-surface-background);\n transition:\n border-color var(--fx-motion-duration-fast) var(--fx-motion-easing),\n box-shadow var(--fx-motion-duration-fast) var(--fx-motion-easing);\n }\n .box:hover .control { border-color: var(--fx-color-primary); }\n .box:focus-visible .control {\n outline: none;\n box-shadow: var(--fx-effect-focus-ring, none);\n }\n .dot {\n width: calc(100% - 8px);\n height: calc(100% - 8px);\n border-radius: var(--fx-radius-full);\n background: var(--fx-color-primary);\n transform: scale(0);\n transition: transform var(--fx-motion-duration-fast) var(--fx-motion-easing);\n }\n :host([checked]) .control { border-color: var(--fx-color-primary); }\n :host([checked]) .dot { transform: scale(1); }\n /* Validação */\n :host([error]) .control,\n :host([invalid]) .control { border-color: var(--fx-color-danger, #dc2626); }\n :host([success]) .control,\n :host([valid]) .control { border-color: var(--fx-color-success, #16a34a); }\n .label { display: inline-flex; align-items: center; }\n :host([disabled]) .box {\n opacity: 0.55;\n cursor: not-allowed;\n pointer-events: none;\n }\n `;\n\n static override get observedAttributes(): string[] {\n return ['checked', 'disabled'];\n }\n\n get checked(): boolean {\n return this.hasAttr('checked');\n }\n set checked(value: boolean) {\n this.toggleAttr('checked', Boolean(value));\n }\n\n get disabled(): boolean {\n return this.hasAttr('disabled');\n }\n set disabled(value: boolean) {\n this.toggleAttr('disabled', Boolean(value));\n }\n\n /** Tamanho do controle. Padrão: `'md'`. */\n get size(): string {\n const s = this.getAttr('size', 'md');\n return s === 'sm' || s === 'lg' ? s : 'md';\n }\n set size(value: string) {\n this.setAttribute('size', value);\n }\n\n protected override render(): void {\n const px = this.size === 'sm' ? '14px' : this.size === 'lg' ? '22px' : '18px';\n if (!this.style.getPropertyValue('--fx-size-radio')) {\n this.style.setProperty('--fx-size-radio', px);\n }\n\n this.setTemplate(`\n <span class=\"box\" part=\"box\" role=\"radio\" tabindex=\"0\"\n aria-checked=\"${this.checked}\" aria-disabled=\"${this.disabled}\">\n <span class=\"control\" part=\"control\"><span class=\"dot\" part=\"dot\"></span></span>\n <span class=\"label\" part=\"label\"><slot></slot></span>\n </span>\n `);\n\n const box = this.root.querySelector<HTMLElement>('.box');\n if (!box) return;\n box.addEventListener('click', () => this.select());\n box.addEventListener('keydown', (e) => {\n if ((e as KeyboardEvent).key === ' ' || (e as KeyboardEvent).key === 'Enter') {\n e.preventDefault();\n this.select();\n }\n });\n }\n\n private select(): void {\n if (this.disabled || this.checked) return;\n // Desmarca os outros radios do mesmo grupo (mesmo name).\n const name = this.getAttr('name');\n if (name) {\n document.querySelectorAll(`fx-radio[name=\"${name}\"]`).forEach((r) => {\n (r as FxRadio).checked = false;\n });\n }\n this.checked = true;\n this.dispatchEvent(\n new CustomEvent('change', {\n bubbles: true,\n composed: true,\n detail: { checked: true, value: this.getAttr('value') },\n }),\n );\n }\n}\n\nexport function defineFxRadio(): typeof FxRadio {\n return defineElement('fx-radio', FxRadio);\n}\n","import { defineFxRadio } from './radio';\n\n// Reexporta a classe para uso programático (instanceof, herança).\nexport { FxRadio } from './radio';\n\n// Auto-registro ao importar o subpath `@wrrdev/fenix-ui/radio`.\ndefineFxRadio();\n","import { FxElement } from '../../core/base';\r\nimport { css } from '../../core/css';\r\nimport { defineElement } from '../../core/define';\r\n\r\n/**\r\n * <fx-table> — Tabela de dados estilo DataTable (dados + colunas configuráveis,\r\n * ordenação, filtros por coluna, paginação personalizável).\r\n *\r\n * Colunas (light DOM):\r\n * <fx-column field=\"nome\" header=\"Nome\" sortable filterable align=\"left\">\r\n * opcional: <template>R$ {{value}}</template> para render customizado\r\n * </fx-column>\r\n *\r\n * Dados: propriedade `data` (array de objetos) ou atributo `data` (JSON).\r\n *\r\n * Atributos: pagination, rows, rows-options, pagination-position (left|center|right),\r\n * striped, empty-message.\r\n * Eventos: page-change, sort-change, row-click (todos composed).\r\n */\r\nexport class FxTable extends FxElement {\r\n static override styles = css`\r\n :host {\r\n display: block;\r\n font-family: var(--fx-font-family);\r\n font-size: var(--fx-font-size);\r\n color: var(--fx-text-default);\r\n }\r\n .scroll { overflow-x: auto; border: 1px solid var(--fx-border-default); border-radius: var(--fx-radius-md); }\r\n table { width: 100%; border-collapse: collapse; }\r\n th {\r\n text-align: left;\r\n padding: var(--fx-space-sm) var(--fx-space-md);\r\n background: var(--fx-surface-background);\r\n border-bottom: 2px solid var(--fx-border-default);\r\n white-space: nowrap;\r\n user-select: none;\r\n }\r\n th.sortable { cursor: pointer; }\r\n th.sortable:hover { color: var(--fx-color-primary); }\r\n .sort-ind { font-size: calc(var(--fx-font-size) - 4px); margin-left: var(--fx-space-3xs, 2px); }\r\n .filter-row th { padding: var(--fx-space-3xs, 4px) var(--fx-space-md) var(--fx-space-sm); border-bottom-width: 1px; }\r\n .filter {\r\n width: 100%;\r\n box-sizing: border-box;\r\n font: inherit;\r\n font-size: calc(var(--fx-font-size) - 2px);\r\n color: var(--fx-text-default);\r\n background: var(--fx-surface-background);\r\n border: 1px solid var(--fx-border-default);\r\n border-radius: var(--fx-radius-sm);\r\n padding: var(--fx-space-3xs, 4px) var(--fx-space-xs);\r\n outline: none;\r\n }\r\n .filter:focus { border-color: var(--fx-color-primary); box-shadow: var(--fx-effect-focus-ring, none); }\r\n td {\r\n padding: var(--fx-space-sm) var(--fx-space-md);\r\n border-bottom: 1px solid var(--fx-border-default);\r\n }\r\n tbody tr { cursor: pointer; transition: background-color var(--fx-motion-duration-fast) var(--fx-motion-easing); }\r\n tbody tr:hover { background: color-mix(in srgb, var(--fx-color-primary) 8%, transparent); }\r\n :host([striped]) tbody tr:nth-child(even) { background: var(--fx-surface-background); }\r\n :host([striped]) tbody tr:hover { background: color-mix(in srgb, var(--fx-color-primary) 8%, transparent); }\r\n .empty { text-align: center; padding: var(--fx-space-xl); color: var(--fx-text-muted); }\r\n .pager {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--fx-space-sm);\r\n flex-wrap: wrap;\r\n padding: var(--fx-space-sm) 0;\r\n }\r\n :host([pagination-position='center']) .pager { justify-content: center; }\r\n :host([pagination-position='right']) .pager { justify-content: flex-end; }\r\n .pager .info { color: var(--fx-text-muted); font-size: calc(var(--fx-font-size) - 2px); }\r\n .pg-btn {\r\n font: inherit;\r\n font-size: calc(var(--fx-font-size) - 2px);\r\n color: var(--fx-text-default);\r\n background: var(--fx-surface-background);\r\n border: 1px solid var(--fx-border-default);\r\n border-radius: var(--fx-radius-sm);\r\n padding: var(--fx-space-3xs, 4px) var(--fx-space-sm);\r\n cursor: pointer;\r\n transition: border-color var(--fx-motion-duration-fast) var(--fx-motion-easing);\r\n }\r\n .pg-btn:hover:not(:disabled) { border-color: var(--fx-color-primary); color: var(--fx-color-primary); }\r\n .pg-btn:disabled { opacity: 0.5; cursor: not-allowed; }\r\n .pg-btn[aria-current='true'] {\r\n background: var(--fx-color-primary);\r\n border-color: var(--fx-color-primary);\r\n color: #fff;\r\n font-weight: var(--fx-font-weight);\r\n }\r\n .rows-sel {\r\n font: inherit;\r\n font-size: calc(var(--fx-font-size) - 2px);\r\n color: var(--fx-text-default);\r\n background: var(--fx-surface-background);\r\n border: 1px solid var(--fx-border-default);\r\n border-radius: var(--fx-radius-sm);\r\n padding: 2px var(--fx-space-xs);\r\n outline: none;\r\n }\r\n `;\r\n\r\n static override get observedAttributes(): string[] {\r\n return ['pagination', 'rows', 'rows-options', 'striped', 'empty-message', 'pagination-position'];\r\n }\r\n\r\n /** Dados da tabela (array de objetos). */\r\n data: Record<string, unknown>[] = [];\r\n private page = 0;\r\n private sortField = '';\r\n private sortDir: 1 | -1 = 1;\r\n private filters: Record<string, string> = {};\r\n\r\n get rowsPerPage(): number {\r\n const r = Number(this.getAttr('rows', '10'));\r\n return r > 0 ? r : 10;\r\n }\r\n set rowsPerPage(value: number) {\r\n this.setAttribute('rows', String(value));\r\n }\r\n\r\n /** Colunas declaradas no light DOM (<fx-column>). */\r\n private get columns(): {\r\n field: string; header: string; sortable: boolean; filterable: boolean;\r\n align: string; template?: HTMLTemplateElement;\r\n }[] {\r\n return [...this.querySelectorAll('fx-column')].map((c) => ({\r\n field: c.getAttribute('field') ?? '',\r\n header: c.getAttribute('header') ?? c.getAttribute('field') ?? '',\r\n sortable: c.hasAttribute('sortable'),\r\n filterable: c.hasAttribute('filterable'),\r\n align: c.getAttribute('align') ?? 'left',\r\n template: c.querySelector('template') ?? undefined,\r\n }));\r\n }\r\n\r\n protected override connectedCallback(): void {\r\n super.connectedCallback();\r\n // Tenta carregar JSON do atributo data se `data` não foi setado via JS.\r\n if (!this.data.length) {\r\n try {\r\n const json = this.getAttr('data');\r\n if (json) this.data = JSON.parse(json);\r\n } catch { /* atributo inválido — ignora */ }\r\n }\r\n // Observa mudanças nas colunas (light DOM).\r\n new MutationObserver(() => this.render()).observe(this, { childList: true, subtree: true });\r\n }\r\n\r\n /** Pipeline: filtra → ordena → pagina. */\r\n private computeRows(): { rows: Record<string, unknown>[]; total: number } {\r\n let out = [...this.data];\r\n for (const [field, term] of Object.entries(this.filters)) {\r\n if (!term) continue;\r\n const t = term.toLowerCase();\r\n out = out.filter((r) => String(r[field] ?? '').toLowerCase().includes(t));\r\n }\r\n const total = out.length;\r\n if (this.sortField) {\r\n out.sort((a, b) => {\r\n const av = a[this.sortField], bv = b[this.sortField];\r\n if (typeof av === 'number' && typeof bv === 'number') return (av - bv) * this.sortDir;\r\n return String(av ?? '').localeCompare(String(bv ?? ''), 'pt-BR') * this.sortDir;\r\n });\r\n }\r\n if (this.hasAttr('pagination')) {\r\n const start = this.page * this.rowsPerPage;\r\n out = out.slice(start, start + this.rowsPerPage);\r\n }\r\n return { rows: out, total };\r\n }\r\n\r\n /** Célula: template customizado ({{value}}, {{campo}}, {{row}}) ou valor direto. */\r\n private cellHtml(col: { field: string; template?: HTMLTemplateElement }, row: Record<string, unknown>): string {\r\n const value = row[col.field];\r\n if (col.template) {\r\n return col.template.innerHTML.replace(/\\{\\{(\\w+)\\}\\}/g, (_, k: string) =>\r\n k === 'value' ? String(value ?? '') : k === 'row' ? '' : String(row[k] ?? ''));\r\n }\r\n return String(value ?? '');\r\n }\r\n\r\n protected override render(): void {\r\n const cols = this.columns.filter((c) => c.field);\r\n const { rows, total } = this.computeRows();\r\n const paginated = this.hasAttr('pagination');\r\n const pages = Math.max(1, Math.ceil(total / this.rowsPerPage));\r\n if (this.page >= pages) this.page = pages - 1;\r\n\r\n const headHtml = cols.map((c) => {\r\n const ind = this.sortField === c.field ? (this.sortDir === 1 ? '▲' : '▼') : '';\r\n return `<th part=\"header\" class=\"${c.sortable ? 'sortable' : ''}\" style=\"text-align:${c.align}\" data-field=\"${c.field}\">${c.header}${ind ? `<span class=\"sort-ind\">${ind}</span>` : ''}</th>`;\r\n }).join('');\r\n\r\n const filterRow = cols.some((c) => c.filterable)\r\n ? `<tr class=\"filter-row\">${cols.map((c) => `<th style=\"text-align:${c.align}\">${c.filterable ? `<input class=\"filter\" data-field=\"${c.field}\" placeholder=\"Filtrar…\" value=\"${this.filters[c.field] ?? ''}\">` : ''}</th>`).join('')}</tr>`\r\n : '';\r\n\r\n const bodyHtml = rows.length\r\n ? rows.map((row, i) => `<tr part=\"row\" data-index=\"${i}\">${cols.map((c) => `<td part=\"cell\" style=\"text-align:${c.align}\">${this.cellHtml(c, row)}</td>`).join('')}</tr>`).join('')\r\n : `<tr><td class=\"empty\" colspan=\"${cols.length || 1}\">${this.getAttr('empty-message', 'Nenhum registro encontrado')}</td></tr>`;\r\n\r\n const pagerHtml = !paginated ? '' : `\r\n <div class=\"pager\" part=\"pager\">\r\n <span class=\"info\">Página ${this.page + 1} de ${pages} · ${total} registros</span>\r\n <button type=\"button\" class=\"pg-btn\" data-pg=\"first\" ${this.page === 0 ? 'disabled' : ''}>«</button>\r\n <button type=\"button\" class=\"pg-btn\" data-pg=\"prev\" ${this.page === 0 ? 'disabled' : ''}>‹</button>\r\n ${Array.from({ length: pages }, (_, p) => `<button type=\"button\" class=\"pg-btn\" data-pg=\"${p}\" aria-current=\"${p === this.page}\">${p + 1}</button>`).join('')}\r\n <button type=\"button\" class=\"pg-btn\" data-pg=\"next\" ${this.page >= pages - 1 ? 'disabled' : ''}>›</button>\r\n <button type=\"button\" class=\"pg-btn\" data-pg=\"last\" ${this.page >= pages - 1 ? 'disabled' : ''}>»</button>\r\n <label class=\"info\">Por página:\r\n <select class=\"rows-sel\">${(this.getAttr('rows-options', '5,10,20,50')).split(',').map((n) => n.trim()).map((n) => `<option value=\"${n}\" ${Number(n) === this.rowsPerPage ? 'selected' : ''}>${n}</option>`).join('')}</select>\r\n </label>\r\n </div>`;\r\n\r\n this.setTemplate(`\r\n <div class=\"scroll\">\r\n <table part=\"table\">\r\n <thead><tr>${headHtml}</tr>${filterRow}</thead>\r\n <tbody>${bodyHtml}</tbody>\r\n </table>\r\n </div>\r\n ${pagerHtml}\r\n `);\r\n\r\n // Ordenação.\r\n this.root.querySelectorAll<HTMLTableCellElement>('th.sortable').forEach((th) => {\r\n th.addEventListener('click', () => {\r\n const f = th.dataset.field!;\r\n if (this.sortField === f) this.sortDir = this.sortDir === 1 ? -1 : 1;\r\n else { this.sortField = f; this.sortDir = 1; }\r\n this.render();\r\n this.dispatchEvent(new CustomEvent('sort-change', { bubbles: true, composed: true,\r\n detail: { field: this.sortField, direction: this.sortDir === 1 ? 'asc' : 'desc' } }));\r\n });\r\n });\r\n\r\n // Filtros (preserva foco/caret ao digitar).\r\n this.root.querySelectorAll<HTMLInputElement>('.filter').forEach((inp) => {\r\n inp.addEventListener('input', () => {\r\n this.filters[inp.dataset.field!] = inp.value;\r\n this.page = 0;\r\n const field = inp.dataset.field!;\r\n const pos = inp.selectionStart;\r\n this.render();\r\n const again = this.root.querySelector<HTMLInputElement>(`.filter[data-field=\"${field}\"]`);\r\n if (again) { again.focus(); again.setSelectionRange(pos, pos); }\r\n });\r\n inp.addEventListener('click', (e) => e.stopPropagation());\r\n });\r\n\r\n // Paginação.\r\n this.root.querySelectorAll<HTMLButtonElement>('.pg-btn').forEach((btn) => {\r\n btn.addEventListener('click', () => {\r\n const pg = btn.dataset.pg!;\r\n this.page = pg === 'first' ? 0 : pg === 'prev' ? Math.max(0, this.page - 1)\r\n : pg === 'next' ? Math.min(pages - 1, this.page + 1)\r\n : pg === 'last' ? pages - 1 : Number(pg);\r\n this.render();\r\n this.dispatchEvent(new CustomEvent('page-change', { bubbles: true, composed: true,\r\n detail: { page: this.page + 1, pages, rowsPerPage: this.rowsPerPage, total } }));\r\n });\r\n });\r\n this.root.querySelector<HTMLSelectElement>('.rows-sel')?.addEventListener('change', (e) => {\r\n this.rowsPerPage = Number((e.target as HTMLSelectElement).value);\r\n this.page = 0;\r\n this.render();\r\n });\r\n\r\n // Clique na linha.\r\n this.root.querySelectorAll<HTMLTableRowElement>('tbody tr[data-index]').forEach((tr) => {\r\n tr.addEventListener('click', () => {\r\n this.dispatchEvent(new CustomEvent('row-click', { bubbles: true, composed: true,\r\n detail: { row: rows[Number(tr.dataset.index)], index: Number(tr.dataset.index) } }));\r\n });\r\n });\r\n }\r\n}\r\n\r\nexport function defineFxTable(): typeof FxTable {\r\n return defineElement('fx-table', FxTable);\r\n}\r\n","import { defineFxTable } from './table';\n\nexport { FxTable } from './table';\n\ndefineFxTable();\n","import { FxElement } from \"../../core/base\";\nimport { css } from \"../../core/css\";\nimport { defineElement } from \"../../core/define\";\n\n/**\n * Rótulo flutuante .\n *\n * Envolve um campo de formulário (fx-input, fx-select, fx-multiselect,\n * fx-datepicker, ...) + um <label>. A label se comporta como placeholder\n * quando o campo está vazio e \"sobe\" quando o campo é focado, contém valor\n * ou abre dropdown.\n *\n * - variant=\"on\" (padrão): label sobre a borda superior\n * - variant=\"in\" : label como placeholder interno, sobe ao focar/valor\n * - variant=\"over\" : label estática acima do campo\n *\n * - error / invalid: label + borda em vermelho, mensagem menor abaixo.\n * - success / valid: label + borda em verde.\n *\n * A label do light DOM é MOVIDA para dentro do Shadow DOM (como `.flabel`),\n * usando classes de shadow (não `::slotted`), o que é confiável mesmo com\n * componentes aninhados que possuem shadow root próprio.\n */\nexport class FxFloatlabel extends FxElement {\n\tstatic override get observedAttributes(): string[] {\n\t\treturn [\"variant\", \"error\", \"invalid\", \"success\", \"valid\"];\n\t}\n\t// 'active' NÃO entra em observedAttributes: togglá-lo apenas atualiza CSS\n\t// via :host([active]), sem re-render destrutivo (mantém o foco do campo).\n\n\tstatic override styles = css`\n\t\t:host {\n\t\t\tdisplay: inline-block;\n\t\t\tposition: relative;\n\t\t\tfont-family: var(--fx-font-family);\n\t\t\tfont-size: var(--fx-font-size);\n\t\t\tvertical-align: middle;\n\t\t}\n\t\t.wrapper {\n\t\t\tposition: relative;\n\t\t\tdisplay: inline-block;\n\t\t\twidth: 100%;\n\t\t}\n\t\t/* Caixa do campo: referência de posicionamento da label flutuante\n (isolada da mensagem de erro, que cresce o wrapper). */\n\t\t.field-box {\n\t\t\tposition: relative;\n\t\t\tdisplay: inline-block;\n\t\t\twidth: 100%;\n\t\t}\n\t\t:host([variant=\"in\"]) .field-box {\n\t\t\tpadding-top: var(--fx-space-xs, 6px);\n\t\t}\n\n\t\t/* ---- label base (variant=\"on\", padrão): sobre a borda superior ---- */\n\t\t.flabel {\n\t\t\tposition: absolute;\n\t\t\tleft: var(--fx-space-md, 12px);\n\t\t\ttop: 0;\n\t\t\ttransform: translateY(-50%);\n\t\t\tfont-size: calc(var(--fx-font-size, 14px) - 3px);\n\t\t\tfont-weight: 600;\n\t\t\tcolor: var(--fx-text-muted, #94a3b8);\n\t\t\tbackground-color: var(--fx-surface-background, #fff);\n\t\t\tpadding: 0 4px;\n\t\t\tline-height: 1;\n\t\t\tborder-radius: 2px;\n\t\t\tpointer-events: none;\n\t\t\tz-index: 2;\n\t\t\twhite-space: nowrap;\n\t\t\ttransition:\n\t\t\t\ttop var(--fx-motion-duration-normal, 180ms)\n\t\t\t\t\tvar(--fx-motion-easing, ease-in-out),\n\t\t\t\ttransform var(--fx-motion-duration-normal, 180ms)\n\t\t\t\t\tvar(--fx-motion-easing, ease-in-out),\n\t\t\t\tfont-size var(--fx-motion-duration-normal, 180ms)\n\t\t\t\t\tvar(--fx-motion-easing, ease-in-out),\n\t\t\t\tcolor var(--fx-motion-duration-normal, 180ms)\n\t\t\t\t\tvar(--fx-motion-easing, ease-in-out);\n\t\t}\n\t\t:host([active]) .flabel {\n\t\t\tcolor: var(--fx-color-primary, #4f46e5);\n\t\t}\n\n\t\t/* ---- variant=\"in\": label como placeholder dentro, sobe ao focar/valor ---- */\n\t\t:host([variant=\"in\"]) .flabel {\n\t\t\ttop: 50%;\n\t\t\ttransform: translateY(-50%);\n\t\t\tfont-size: var(--fx-font-size, 14px);\n\t\t\tfont-weight: var(--fx-font-weight, 400);\n\t\t\tbackground: transparent;\n\t\t\tpadding: 0;\n\t\t}\n\t\t:host([variant=\"in\"][active]) .flabel {\n\t\t\ttop: 0;\n\t\t\ttransform: translateY(-50%);\n\t\t\tfont-size: calc(var(--fx-font-size, 14px) - 3px);\n\t\t\tfont-weight: 600;\n\t\t\tbackground-color: var(--fx-surface-background, #fff);\n\t\t\tpadding: 0 5px;\n\t\t\tcolor: var(--fx-color-primary, #4f46e5);\n\t\t}\n\n\t\t/* ---- variant=\"over\": label estática ACIMA do campo (fora, em fluxo) ---- */\n\t\t:host([variant=\"over\"]) {\n\t\t\tdisplay: block;\n\t\t}\n\t\t:host([variant=\"over\"]) .flabel {\n\t\t\tposition: static;\n\t\t\tdisplay: block;\n\t\t\tmargin-bottom: var(--fx-space-xs, 4px);\n\t\t\tbackground: transparent;\n\t\t\tpadding: 0;\n\t\t\tfont-size: calc(var(--fx-font-size, 14px) - 3px);\n\t\t\tfont-weight: 600;\n\t\t\twhite-space: normal;\n\t\t}\n\n\t\t/* ---- estados de erro / sucesso ---- */\n\t\t:host([error]) .flabel,\n\t\t:host([invalid]) .flabel {\n\t\t\tcolor: var(--fx-color-danger, #dc2626);\n\t\t}\n\t\t:host([success]) .flabel,\n\t\t:host([valid]) .flabel {\n\t\t\tcolor: var(--fx-color-success, #10b981);\n\t\t}\n\n\t\t/* ---- mensagem de erro sob o campo (fonte menor) ---- */\n\t\t.error-message {\n\t\t\tdisplay: none;\n\t\t\tmargin-top: var(--fx-space-xs, 4px);\n\t\t\tmargin-left: var(--fx-space-md, 12px);\n\t\t\tfont-size: calc(var(--fx-font-size, 14px) - 3px);\n\t\t\tfont-weight: 500;\n\t\t\tcolor: var(--fx-color-danger, #dc2626);\n\t\t\tline-height: 1.2;\n\t\t}\n\t\t:host([error]) .error-message,\n\t\t:host([invalid]) .error-message {\n\t\t\tdisplay: block;\n\t\t}\n\t`;\n\tprivate targetControl: HTMLElement | null = null;\n\tprivate observer: MutationObserver | null = null;\n\tprivate listenersReady = false;\n\n\tprotected render(): void {\n\t\tconst control = this.findControl();\n\t\tconst label = this.findLabel();\n\t\tconst originalLabel = label as HTMLElement | null;\n\t\tconst labelText = originalLabel\n\t\t\t? originalLabel.textContent?.replace(/\\s+/g, \" \").trim()\n\t\t\t: \"\";\n\t\tconst labelFor = originalLabel\n\t\t\t? originalLabel.getAttribute(\"for\") || \"\"\n\t\t\t: \"\";\n\t\tconst isOver = this.getAttribute(\"variant\") === \"over\";\n\n\t\tthis.setTemplate(`\n <div class=\"wrapper\" part=\"wrapper\">\n ${isOver ? `<label class=\"flabel\" part=\"label\" for=\"${labelFor}\">${labelText}</label>` : \"\"}\n <div class=\"field-box\" part=\"field\">\n <slot></slot>\n ${isOver ? \"\" : `<label class=\"flabel\" part=\"label\" for=\"${labelFor}\">${labelText}</label>`}\n </div>\n <div class=\"error-message\" part=\"error\"></div>\n </div>\n `);\n\n\t\t// Esconde a label original do light DOM (a renderizada no shadow assume o papel).\n\t\tif (originalLabel) originalLabel.setAttribute(\"hidden\", \"\");\n\n\t\tthis.attachEvents();\n\t\tthis.syncControlReference(control);\n\t\tthis.syncState();\n\t\tthis.applyError();\n\t}\n\n\tprotected override disconnectedCallback(): void {\n\t\tsuper.disconnectedCallback();\n\t\tthis.observer?.disconnect();\n\t}\n\n\t/** Campo de controle = qualquer filho direto que não seja label. */\n\tprivate findControl(): HTMLElement | null {\n\t\treturn (\n\t\t\t(Array.from(this.children).find(\n\t\t\t\t(n) => n.tagName.toLowerCase() !== \"label\",\n\t\t\t) as HTMLElement) ?? null\n\t\t);\n\t}\n\n\t/** Label = filho direto <label>. */\n\tprivate findLabel(): HTMLElement | null {\n\t\treturn (\n\t\t\t(Array.from(this.children).find(\n\t\t\t\t(n) => n.tagName.toLowerCase() === \"label\",\n\t\t\t) as HTMLElement) ?? null\n\t\t);\n\t}\n\n\tprivate attachEvents(): void {\n\t\tconst slot = this.root.querySelector(\"slot\");\n\t\tif (slot) {\n\t\t\tslot.addEventListener(\"slotchange\", () => {\n\t\t\t\t// Se o usuário trocar o controle/label em tempo de execução, re-sincroniza.\n\t\t\t\tconst control = this.findControl();\n\t\t\t\tthis.syncControlReference(control);\n\t\t\t\tthis.syncState();\n\t\t\t\tthis.applyError();\n\t\t\t});\n\t\t}\n\n\t\tif (this.listenersReady) return;\n\t\tthis.listenersReady = true;\n\n\t\tthis.addEventListener(\"focusin\", () => this.syncState());\n\t\tthis.addEventListener(\"focusout\", () =>\n\t\t\tsetTimeout(() => this.syncState(), 60),\n\t\t);\n\t\tthis.addEventListener(\"input\", () => this.syncState());\n\t\tthis.addEventListener(\"change\", () => this.syncState());\n\t}\n\n\t/** Observa mudanças de atributos do controle (value, open, values...). */\n\tprivate syncControlReference(\n\t\tcontrol: HTMLElement | null = this.targetControl,\n\t): void {\n\t\tif (control !== this.targetControl) {\n\t\t\tthis.observer?.disconnect();\n\t\t\tthis.observer = null;\n\t\t\tthis.targetControl = control;\n\t\t\tif (control) {\n\t\t\t\tthis.observer = new MutationObserver(() => this.syncState());\n\t\t\t\tthis.observer.observe(control, {\n\t\t\t\t\tattributes: true,\n\t\t\t\t\tattributeFilter: [\"value\", \"values\", \"start\", \"end\", \"open\"],\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate syncState(): void {\n\t\tif (this.targetControl && !this.targetControl.isConnected) {\n\t\t\tthis.targetControl = null;\n\t\t\tthis.observer?.disconnect();\n\t\t\tthis.observer = null;\n\t\t}\n\n\t\tif (!this.targetControl) {\n\t\t\tthis.removeAttribute(\"active\");\n\t\t\tthis.removeAttribute(\"focus\");\n\t\t\treturn;\n\t\t}\n\n\t\tconst c = this.targetControl as any;\n\t\tconst attrValue = c.getAttribute\n\t\t\t? (c.getAttribute(\"value\") ?? \"\").trim()\n\t\t\t: \"\";\n\t\tconst attrValues = c.getAttribute\n\t\t\t? (c.getAttribute(\"values\") ?? \"\").trim()\n\t\t\t: \"\";\n\t\tconst hasValue = Boolean(\n\t\t\t(typeof c.value === \"string\" && c.value.trim() !== \"\") ||\n\t\t\t(Array.isArray(c.values) && c.values.length > 0) ||\n\t\t\tattrValue !== \"\" ||\n\t\t\tattrValues !== \"\" ||\n\t\t\t(c.hasAttribute &&\n\t\t\t\t(c.hasAttribute(\"open\") || c.hasAttribute(\"start\"))),\n\t\t);\n\n\t\tconst focused = this.isFocusedInside();\n\t\tif (hasValue || focused) {\n\t\t\tthis.setAttribute(\"active\", \"\");\n\t\t\tif (focused) this.setAttribute(\"focus\", \"\");\n\t\t\telse this.removeAttribute(\"focus\");\n\t\t} else {\n\t\t\tthis.removeAttribute(\"active\");\n\t\t\tthis.removeAttribute(\"focus\");\n\t\t}\n\t}\n\n\tprivate applyError(): void {\n\t\tconst hasError = this.hasAttr(\"error\") || this.hasAttr(\"invalid\");\n\t\tconst errMsg = this.root.querySelector(\n\t\t\t\".error-message\",\n\t\t) as HTMLElement | null;\n\t\tif (errMsg) {\n\t\t\terrMsg.textContent = hasError\n\t\t\t\t? this.getAttribute(\"error-text\")?.trim() || \"Valor inválido\"\n\t\t\t\t: \"\";\n\t\t}\n\n\t\t// Espelha o estado no controle interno para que a borda também fique vermelha/verde.\n\t\tif (\n\t\t\tthis.targetControl &&\n\t\t\ttypeof this.targetControl.setAttribute === \"function\"\n\t\t) {\n\t\t\tconst t = this.targetControl;\n\t\t\tif (hasError) {\n\t\t\t\tt.setAttribute(\"error\", \"\");\n\t\t\t\tt.removeAttribute(\"success\");\n\t\t\t} else if (this.hasAttr(\"success\") || this.hasAttr(\"valid\")) {\n\t\t\t\tt.setAttribute(\"success\", \"\");\n\t\t\t\tt.removeAttribute(\"error\");\n\t\t\t} else {\n\t\t\t\tt.removeAttribute(\"error\");\n\t\t\t\tt.removeAttribute(\"success\");\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate isWithin(activeEl: Element): boolean {\n\t\tlet current: Element | null = activeEl;\n\t\twhile (current && current !== this) {\n\t\t\tcurrent = current.parentElement;\n\t\t}\n\t\treturn current === this;\n\t}\n\n\tprivate isFocusedInside(): boolean {\n\t\tconst activeEl = (document as Document).activeElement;\n\t\treturn Boolean(activeEl && this.isWithin(activeEl));\n\t}\n}\n\nexport function defineFxFloatlabel(): typeof FxFloatlabel {\n\treturn defineElement(\"fx-floatlabel\", FxFloatlabel);\n}\n","import { defineFxFloatlabel } from './floatlabel';\n\n// Reexporta a classe para uso programático (instanceof, herança).\nexport { FxFloatlabel } from './floatlabel';\n\n// Auto-registro ao importar o subpath `@wrrdev/fenix-ui/floatlabel`.\ndefineFxFloatlabel();\n","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\n\n/**\n * <fx-textarea> — Área de texto multilinha estilizada com os tokens do tema.\n *\n * Atributos: value, size (sm|md|lg), placeholder, disabled, readonly,\n * rows, maxlength.\n * Eventos: `input` e `change` (composed, detail: { value }).\n */\nexport class FxTextarea extends FxElement {\n static override styles = css`\n :host {\n display: inline-block;\n vertical-align: middle;\n font-family: var(--fx-font-family);\n font-size: var(--fx-font-size);\n }\n .field {\n font-family: inherit;\n font-size: inherit;\n font-weight: var(--fx-font-weight);\n color: var(--fx-text-default);\n background-color: var(--fx-surface-background);\n border: 1px solid var(--fx-border-default);\n border-radius: var(--fx-radius-md);\n padding: var(--fx-space-md) var(--fx-space-lg);\n width: 260px;\n min-height: calc(var(--fx-size-md) + 40px);\n resize: vertical;\n box-sizing: border-box;\n transition:\n border-color var(--fx-motion-duration-normal) var(--fx-motion-easing),\n box-shadow var(--fx-motion-duration-normal) var(--fx-motion-easing);\n }\n .field::placeholder { color: var(--fx-text-muted); opacity: 1; }\n .field:hover { border-color: var(--fx-border-hover); }\n .field:focus-visible {\n outline: none;\n border-color: var(--fx-color-primary);\n box-shadow: var(--fx-effect-focus-ring, none);\n }\n .field:disabled,\n .field[readonly] {\n opacity: 0.55;\n cursor: not-allowed;\n background-color: var(--fx-surface-surface-hover);\n }\n :host([error]) .field, :host([invalid]) .field {\n border-color: var(--fx-color-danger, #dc2626);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--fx-color-danger, #dc2626) 18%, transparent);\n }\n :host([success]) .field, :host([valid]) .field {\n border-color: var(--fx-color-success, #16a34a);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--fx-color-success, #16a34a) 18%, transparent);\n }\n :host([size='sm']) .field { width: 220px; min-height: var(--fx-size-sm); padding: var(--fx-space-sm) var(--fx-space-md); }\n :host([size='lg']) .field { width: 300px; min-height: calc(var(--fx-size-lg) + 80px); }\n `;\n\n static override get observedAttributes(): string[] {\n return ['size', 'placeholder', 'disabled', 'readonly', 'rows', 'maxlength'];\n }\n\n get size(): string {\n const s = this.getAttr('size', 'md');\n return s === 'sm' || s === 'lg' ? s : 'md';\n }\n set size(value: string) { this.setAttribute('size', value); }\n\n get value(): string { return this.getAttr('value'); }\n set value(value: string) { this.setAttribute('value', value); }\n\n protected override render(): void {\n const placeholder = this.getAttr('placeholder');\n const readonly = this.hasAttr('readonly');\n const disabled = this.hasAttr('disabled');\n const rows = this.getAttr('rows');\n const maxlength = this.getAttr('maxlength');\n\n this.setTemplate(`<textarea class=\"field\" part=\"textarea\"\n ${placeholder ? `placeholder=\"${placeholder}\"` : ''}\n ${rows ? `rows=\"${rows}\"` : ''}\n ${maxlength ? `maxlength=\"${maxlength}\"` : ''}\n ></textarea>`);\n\n const field = this.root.querySelector<HTMLTextAreaElement>('.field');\n if (!field) return;\n field.value = this.getAttr('value');\n if (disabled) field.setAttribute('disabled', '');\n if (readonly) field.setAttribute('readonly', '');\n\n const emit = (event: string): void => {\n this.value = field.value;\n this.dispatchEvent(\n new CustomEvent(event, { bubbles: true, composed: true, detail: { value: field.value } }),\n );\n };\n // Bloqueia o evento nativo (composed, sem detail) para que só o\n // CustomEvent com detail chegue aos consumidores.\n field.addEventListener('input', (e) => { e.stopPropagation(); emit('input'); });\n field.addEventListener('change', (e) => { e.stopPropagation(); emit('change'); });\n }\n}\n\nexport function defineFxTextarea(): typeof FxTextarea {\n return defineElement('fx-textarea', FxTextarea);\n}\n","import { FxTextarea, defineFxTextarea } from './textarea';\n\n// Reexporta a classe para uso programático (ex.: instanceof, herança).\nexport { FxTextarea };\n\n\n// Auto-registro: basta importar o subpath `@wrrdev/fenix-ui/textarea`\n// para que o componente seja definido no CustomElementRegistry.\ndefineFxTextarea();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'fx-textarea': FxTextarea;\n }\n}\n\r\n\r\n","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\n\n/**\n * <fx-dialog> — Janela modal com overlay, ESC para fechar e foco preso.\n *\n * Atributos: open, size (sm|md|lg), heading (título).\n * Slots: padrão (conteúdo), footer (botões de ação).\n * Eventos: `open`, `close` (composed).\n */\nexport class FxDialog extends FxElement {\n static override styles = css`\n :host { display: contents; }\n .overlay {\n position: fixed;\n inset: 0;\n background: color-mix(in srgb, var(--fx-text-default, #000) 45%, transparent);\n backdrop-filter: blur(3px);\n -webkit-backdrop-filter: blur(3px);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: var(--fx-z-modal, 1100);\n animation: fade var(--fx-motion-duration-fast) var(--fx-motion-easing);\n }\n .overlay[hidden] { display: none; }\n @keyframes fade { from { opacity: 0; } to { opacity: 1; } }\n .dialog {\n background: var(--fx-surface-background);\n border: 1px solid var(--fx-border-default);\n border-radius: var(--fx-radius-lg);\n box-shadow: var(--fx-shadow-xl);\n width: min(560px, calc(100vw - 32px));\n max-height: calc(100vh - 64px);\n display: flex;\n flex-direction: column;\n font-family: var(--fx-font-family);\n animation: pop var(--fx-motion-duration-normal) var(--fx-motion-easing);\n }\n @keyframes pop { from { opacity: 0; transform: scale(0.96); } to { opacity: 1; transform: scale(1); } }\n :host([size='sm']) .dialog { width: min(400px, calc(100vw - 32px)); }\n :host([size='lg']) .dialog { width: min(800px, calc(100vw - 32px)); }\n header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: var(--fx-space-lg) var(--fx-space-xl);\n border-bottom: 1px solid var(--fx-border-default);\n }\n h2 {\n margin: 0;\n font-size: calc(var(--fx-font-size) + 2px);\n font-weight: 600;\n color: var(--fx-text-default);\n }\n .close {\n border: none;\n background: transparent;\n color: var(--fx-text-muted);\n font-size: calc(var(--fx-font-size) + 6px);\n cursor: pointer;\n line-height: 1;\n padding: 0 var(--fx-space-xs);\n border-radius: var(--fx-radius-full);\n }\n .close:hover { color: var(--fx-color-danger); }\n .body {\n padding: var(--fx-space-lg) var(--fx-space-xl);\n overflow-y: auto;\n color: var(--fx-text-default);\n font-size: var(--fx-font-size);\n }\n footer {\n padding: var(--fx-space-md) var(--fx-space-xl);\n border-top: 1px solid var(--fx-border-default);\n display: flex;\n justify-content: flex-end;\n gap: var(--fx-space-sm);\n }\n footer[hidden] { display: none; }\n `;\n\n static override get observedAttributes(): string[] {\n return ['open', 'size', 'heading'];\n }\n\n get open(): boolean { return this.hasAttr('open'); }\n set open(value: boolean) { this.toggleAttr('open', value); }\n\n protected override render(): void {\n const isOpen = this.open;\n const heading = this.getAttr('heading');\n\n this.setTemplate(`\n <div class=\"overlay\" part=\"overlay\" ${isOpen ? '' : 'hidden'}>\n <div class=\"dialog\" role=\"dialog\" aria-modal=\"true\" aria-label=\"${heading}\">\n <header>\n <h2>${heading}</h2>\n <button type=\"button\" class=\"close\" part=\"close\" aria-label=\"Fechar\">×</button>\n </header>\n <div class=\"body\"><slot></slot></div>\n <footer part=\"footer\"><slot name=\"footer\"></slot></footer>\n </div>\n </div>\n `);\n\n if (!isOpen) return;\n\n const overlay = this.root.querySelector<HTMLElement>('.overlay');\n const closeBtn = this.root.querySelector<HTMLButtonElement>('.close');\n const close = (): void => {\n this.open = false;\n this.dispatchEvent(new CustomEvent('close', { bubbles: true, composed: true }));\n };\n overlay?.addEventListener('click', (e) => { if (e.target === overlay) close(); });\n closeBtn?.addEventListener('click', close);\n\n // ESC fecha + foco no diálogo\n const onKey = (e: KeyboardEvent): void => {\n if (e.key === 'Escape') { e.stopPropagation(); close(); }\n };\n document.addEventListener('keydown', onKey, { once: true });\n this._cleanup = () => document.removeEventListener('keydown', onKey);\n\n requestAnimationFrame(() => this.root.querySelector<HTMLElement>('.dialog')?.focus());\n this.dispatchEvent(new CustomEvent('open', { bubbles: true, composed: true }));\n }\n\n private _cleanup?: () => void;\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this._cleanup?.();\n }\n}\n\nexport function defineFxDialog(): typeof FxDialog {\n return defineElement('fx-dialog', FxDialog);\n}\n","import { FxDialog, defineFxDialog } from './dialog';\n\nexport { FxDialog };\n\n\ndefineFxDialog();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'fx-dialog': FxDialog;\n }\n}\n\r\n\r\n","/**\n * <fx-toast> — notificações imperativas com posição e duração configuráveis.\n *\n * Atributos: kind (success|error|info|warning), title, message,\n * position (top-left|top-center|top-right|bottom-left|bottom-center|bottom-right),\n * duration (ms; 0 = fixo até fechar).\n */\nconst POSITIONS = [\n 'top-left', 'top-center', 'top-right',\n 'bottom-left', 'bottom-center', 'bottom-right',\n] as const;\nexport type ToastPosition = (typeof POSITIONS)[number];\ntype ToastKind = 'success' | 'error' | 'info' | 'warning';\n\nconst KIND_COLOR: Record<ToastKind, string> = {\n success: 'var(--fx-color-success, #10b981)',\n error: 'var(--fx-color-danger, #f43f5e)',\n info: 'var(--fx-color-info, #0ea5e9)',\n warning: 'var(--fx-color-warning, #f59e0b)',\n};\n\n/** Ícone exibido no lugar da bolinha, conforme a variante. */\nconst KIND_ICON: Record<ToastKind, string> = {\n success: '✓',\n error: '✕',\n warning: '!',\n info: 'i',\n};\n\nconst CARD_CSS = `\n:host { display: contents; }\n.card {\n display: flex; align-items: flex-start; gap: 10px;\n min-width: 260px; max-width: 360px;\n background: var(--fx-surface-background, #fff);\n color: var(--fx-text-default, #1e293b);\n border: 1px solid var(--fx-border-default, #e2e8f0);\n border-left: 4px solid var(--kind);\n border-radius: var(--fx-radius-md, 8px);\n box-shadow: var(--fx-shadow-lg, 0 10px 30px rgba(0,0,0,.14));\n padding: var(--fx-space-sm, 8px) var(--fx-space-md, 12px);\n font-family: inherit;\n animation: fx-toast-in .25s ease;\n}\n@keyframes fx-toast-in { from { opacity: 0; transform: translateY(-6px); } }\n.card.leaving { opacity: 0; transition: opacity .2s ease; }\n.icon {\n width: 22px; height: 22px; border-radius: 50%;\n background: var(--kind);\n color: #fff;\n display: flex; align-items: center; justify-content: center;\n font-size: 12px; font-weight: 700;\n flex: none; margin-top: 2px;\n user-select: none;\n}\n.body { flex: 1; min-width: 0; }\n.title { font-weight: 600; font-size: 14px; }\n.msg { font-size: calc(var(--fx-font-size, 14px) - 2px); color: var(--fx-text-muted, #64748b); margin-top: 2px; word-break: break-word; white-space: pre-line; }\n.close {\n all: unset; cursor: pointer; flex: none; line-height: 1;\n color: var(--fx-text-muted, #64748b); font-size: 15px; padding: 2px 4px; border-radius: 4px;\n}\n.close:hover { color: var(--fx-color-danger, #f43f5e); background: var(--fx-surface-surface-hover, rgba(0,0,0,.05)); }\n`;\n\nexport class FxToast extends HTMLElement {\n static get observedAttributes() {\n return ['kind', 'title', 'message', 'duration'];\n }\n\n private timer: ReturnType<typeof setTimeout> | null = null;\n\n constructor() {\n super();\n this.attachShadow({ mode: 'open' });\n }\n\n connectedCallback() {\n if (!this.shadowRoot!.firstChild) this.#render();\n const dur = Number(this.getAttribute('duration') ?? '4000');\n // Durações mínimas: valores muito baixos (ex.: digitação parcial no\n // playground) são elevados para 1s; 0 permanece fixo até fechar.\n const safe = dur === 0 ? 0 : Math.max(Number.isNaN(dur) ? 4000 : dur, 1000);\n if (!Number.isNaN(safe) && safe > 0 && !this.timer) {\n this.timer = setTimeout(() => this.dismiss(), safe);\n }\n }\n\n disconnectedCallback() {\n if (this.timer) clearTimeout(this.timer);\n this.timer = null;\n }\n\n dismiss() {\n if (this.timer) clearTimeout(this.timer);\n this.timer = null;\n const card = this.shadowRoot!.querySelector('.card');\n if (card) {\n card.classList.add('leaving');\n setTimeout(() => this.remove(), 200);\n } else {\n this.remove();\n }\n }\n\n #render() {\n const kind = (this.getAttribute('kind') || 'info') as ToastKind;\n const title = this.getAttribute('title') ?? '';\n const msg = this.getAttribute('message') ?? '';\n const color = KIND_COLOR[kind] ?? KIND_COLOR.info;\n this.shadowRoot!.innerHTML = `\n <style>${CARD_CSS}</style>\n <div class=\"card\" style=\"--kind:${color}\" role=\"status\" part=\"card\">\n <span class=\"icon\">${KIND_ICON[kind] ?? KIND_ICON.info}</span>\n <div class=\"body\">\n ${title ? '<div class=\"title\"></div>' : ''}\n ${msg ? '<div class=\"msg\"></div>' : ''}\n </div>\n <button class=\"close\" aria-label=\"Fechar\">✕</button>\n </div>`;\n const t = this.shadowRoot!.querySelector<HTMLElement>('.title');\n const m = this.shadowRoot!.querySelector<HTMLElement>('.msg');\n if (t) t.textContent = title;\n if (m) m.textContent = msg;\n this.shadowRoot!.querySelector('.close')!.addEventListener('click', () => this.dismiss());\n }\n}\n\n/* ---------- Regiões por posição na tela ---------- */\nfunction regionFor(position: ToastPosition): HTMLElement {\n let region = document.querySelector<HTMLElement>(`[data-fx-toast-region=\"${position}\"]`);\n if (!region) {\n region = document.createElement('div');\n region.setAttribute('data-fx-toast-region', position);\n const [vertical, horizontal] = position.split('-') as [string, string];\n const style = region.style as CSSStyleDeclaration & Record<string, string>;\n style.position = 'fixed';\n style[vertical] = '16px';\n if (horizontal === 'center') {\n style.left = '50%';\n style.transform = 'translateX(-50%)';\n } else {\n style[horizontal] = '16px';\n }\n style.display = 'flex';\n style.flexDirection = 'column';\n style.gap = '8px';\n style.zIndex = '1100';\n style.pointerEvents = 'none';\n new MutationObserver(() => {\n region!.querySelectorAll('*').forEach((c) => ((c as HTMLElement).style.pointerEvents = 'auto'));\n }).observe(region, { childList: true });\n document.body.appendChild(region);\n }\n return region;\n}\n\nexport interface ToastOptions {\n /** Texto secundário (também aceito como 2º argumento dos métodos). */\n message?: string;\n position?: ToastPosition;\n /** Tempo em ms até sumir. 0 = fixo até fechar. Padrão: 4000 */\n duration?: number;\n}\n\nclass ToastApi {\n private seq = 0;\n private map = new Map<number, FxToast>();\n\n push(kind: ToastKind, title: string, messageOrOpts?: string | ToastOptions, opts?: ToastOptions): number {\n const id = ++this.seq;\n // Assinaturas suportadas:\n // push(kind, title, options)\n // push(kind, title, message, options) <- usada pela doc e mais intuitiva\n const message = typeof messageOrOpts === 'string' ? messageOrOpts : messageOrOpts?.message;\n const o: ToastOptions = { ...(typeof messageOrOpts === 'object' && messageOrOpts ? messageOrOpts : undefined), ...opts };\n const el = document.createElement('fx-toast') as FxToast;\n el.setAttribute('kind', kind);\n el.setAttribute('title', title);\n if (message) el.setAttribute('message', message);\n el.setAttribute('position', o.position ?? 'top-right');\n el.setAttribute('duration', String(o.duration ?? 4000));\n regionFor(o.position ?? 'top-right').appendChild(el);\n this.map.set(id, el);\n return id;\n }\n\n close(id: number) {\n this.map.get(id)?.dismiss();\n this.map.delete(id);\n }\n\n success = (t: string, m?: string, o?: ToastOptions) => this.push('success', t, m, o);\n error = (t: string, m?: string, o?: ToastOptions) => this.push('error', t, m, o);\n info = (t: string, m?: string, o?: ToastOptions) => this.push('info', t, m, o);\n warning = (t: string, m?: string, o?: ToastOptions) => this.push('warning', t, m, o);\n}\n\nexport const FenixToast = new ToastApi();\n// Exposto globalmente para uso em HTML puro (onclick=\"FenixToast.success(...)\")\n(globalThis as unknown as Record<string, unknown>).FenixToast = FenixToast;\n\nexport function defineFxToast() {\n if (!customElements.get('fx-toast')) customElements.define('fx-toast', FxToast);\n}\n\n","import { FxToast, FenixToast, defineFxToast } from './toast';\n\nexport { FxToast, FenixToast };\n\n\ndefineFxToast();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'fx-toast': FxToast;\n }\n}\n\r\n\r\n","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\n\n/**\n * <fx-tooltip> — Dica flutuante ao passar o mouse/focar no elemento.\n *\n * Atributos: content (texto da dica), position (top|bottom|left|right, padrão top).\n * Slot padrão: elemento que dispara a dica.\n */\nexport class FxTooltip extends FxElement {\n static override styles = css`\n :host {\n position: relative;\n display: inline-flex;\n font-family: var(--fx-font-family);\n }\n .bubble {\n position: absolute;\n background: var(--fx-text-default, #1e293b);\n color: var(--fx-surface-background, #fff);\n font-size: calc(var(--fx-font-size, 14px) - 2px);\n line-height: 1.45;\n padding: var(--fx-space-xs) var(--fx-space-md);\n border-radius: var(--fx-radius-sm);\n box-shadow: var(--fx-shadow-md);\n width: max-content;\n min-width: 60px;\n max-width: var(--fx-tooltip-max-width, 320px);\n white-space: normal;\n text-align: center;\n opacity: 0;\n visibility: hidden;\n transition: opacity var(--fx-motion-duration-fast) var(--fx-motion-easing);\n z-index: var(--fx-z-tooltip, 1050);\n pointer-events: none;\n }\n :host(:hover) .bubble,\n :host(:focus-within) .bubble {\n opacity: 1;\n visibility: visible;\n }\n /* position top (padrão) */\n .bubble { bottom: calc(100% + 6px); left: 50%; transform: translateX(-50%); }\n .bubble::after {\n content: '';\n position: absolute;\n top: 100%;\n left: 50%;\n transform: translateX(-50%);\n border: 5px solid transparent;\n border-top-color: var(--fx-text-default, #1e293b);\n }\n /* bottom */\n :host([position='bottom']) .bubble { bottom: auto; top: calc(100% + 6px); }\n :host([position='bottom']) .bubble::after { top: auto; bottom: 100%; border-top-color: transparent; border-bottom-color: var(--fx-text-default, #1e293b); }\n /* left */\n :host([position='left']) .bubble {\n right: calc(100% + 6px); left: auto; top: 50%; bottom: auto; transform: translateY(-50%);\n }\n :host([position='left']) .bubble::after {\n top: 50%; left: 100%; transform: translateY(-50%);\n border: 5px solid transparent; border-left-color: var(--fx-text-default, #1e293b);\n }\n /* right */\n :host([position='right']) .bubble {\n right: auto; left: calc(100% + 6px); top: 50%; bottom: auto; transform: translateY(-50%);\n }\n :host([position='right']) .bubble::after {\n top: 50%; left: auto; right: 100%; transform: translateY(-50%);\n border: 5px solid transparent; border-right-color: var(--fx-text-default, #1e293b);\n }\n `;\n\n static override get observedAttributes(): string[] {\n return ['content', 'position'];\n }\n\n protected override render(): void {\n const content = this.getAttr('content');\n this.setTemplate(`\n <slot></slot>\n <span class=\"bubble\" part=\"bubble\" role=\"tooltip\">${content}</span>\n `);\n }\n}\n\nexport function defineFxTooltip(): typeof FxTooltip {\n return defineElement('fx-tooltip', FxTooltip);\n}\n","import { FxTooltip, defineFxTooltip } from './tooltip';\n\nexport { FxTooltip };\n\n\ndefineFxTooltip();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'fx-tooltip': FxTooltip;\n }\n}\n\r\n\r\n","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\n\n/**\n * <fx-tabs> — Navegação por abas.\n *\n * Atributos: value (aba ativa, corresponde ao attr `tab` de cada fx-tab-panel).\n * Uso:\n * <fx-tabs value=\"a\">\n * <fx-tab tab=\"a\">Aba A</fx-tab>\n * <fx-tab tab=\"b\">Aba B</fx-tab>\n * </fx-tabs>\n * <fx-tab-panel tab=\"a\">…</fx-tab-panel>\n * <fx-tab-panel tab=\"b\">…</fx-tab-panel>\n * Evento: `change` (composed, detail: { value }).\n */\nexport class FxTabs extends FxElement {\n static override styles = css`\n :host {\n display: block;\n font-family: var(--fx-font-family);\n }\n .list {\n display: flex;\n gap: var(--fx-space-xs);\n border-bottom: 2px solid var(--fx-border-default);\n }\n .tab {\n border: none;\n background: transparent;\n font-family: inherit;\n font-size: var(--fx-font-size);\n color: var(--fx-text-muted);\n padding: var(--fx-space-md) var(--fx-space-lg);\n cursor: pointer;\n position: relative;\n transition: color var(--fx-motion-duration-fast) var(--fx-motion-easing);\n }\n .tab::after {\n content: '';\n position: absolute;\n left: 0; right: 0; bottom: -2px;\n height: 2px;\n background: transparent;\n transition: background var(--fx-motion-duration-fast) var(--fx-motion-easing);\n }\n .tab:hover { color: var(--fx-text-default); }\n .tab[data-disabled] {\n color: var(--fx-border-default);\n cursor: not-allowed;\n opacity: 0.6;\n }\n .tab[data-disabled]:hover { color: var(--fx-border-default); }\n .tab[aria-selected='true'] {\n color: var(--fx-color-primary);\n font-weight: 600;\n }\n .tab[aria-selected='true']::after { background: var(--fx-color-primary); }\n .tab:focus-visible {\n outline: none;\n box-shadow: var(--fx-effect-focus-ring, none);\n border-radius: var(--fx-radius-sm);\n }\n /* Os <fx-tab> originais são renderizados como botões no shadow DOM.\n Sem isto, o <slot> os projetaria de novo como texto cru abaixo das abas. */\n ::slotted(fx-tab) {\n display: none !important;\n }\n `;\n\n static override get observedAttributes(): string[] {\n return ['value'];\n }\n\n get value(): string { return this.getAttr('value'); }\n set value(value: string) { this.setAttribute('value', value); }\n\n protected override render(): void {\n const tabs = Array.from(this.querySelectorAll<HTMLElement>('fx-tab'));\n const active = this.value || tabs[0]?.getAttribute('tab') || '';\n\n this.setTemplate(`\n <div class=\"list\" role=\"tablist\">\n ${tabs.map((t) => {\n const tabId = t.getAttribute('tab') ?? '';\n const disabled = t.hasAttribute('disabled');\n return `<button type=\"button\" class=\"tab\" role=\"tab\" part=\"tab\"\n data-tab=\"${tabId}\" aria-selected=\"${tabId === active}\"\n ${disabled ? 'aria-disabled=\"true\" data-disabled=\"true\"' : ''}>${t.textContent?.trim()}</button>`;\n }).join('')}\n </div>\n <slot></slot>\n `);\n\n // Sincroniza apenas os painéis DESTE conjunto de abas\n // (dentro do host ou irmãos seguintes — nunca global).\n // IMPORTANTE: manipula o atributo `hidden` DIRETAMENTE (nunca a\n // propriedade `.visible`), porque escrever a propriedade em um\n // elemento ainda não upgradeado cria uma own property que faz\n // shadowing dos accessors do prototype para sempre.\n this.panels.forEach((p) => {\n const show = p.getAttribute('tab') === active;\n if (show) p.removeAttribute('hidden');\n else p.setAttribute('hidden', '');\n });\n\n this.root.querySelectorAll<HTMLButtonElement>('.tab').forEach((btn) => {\n btn.addEventListener('click', () => {\n if (btn.hasAttribute('data-disabled')) return;\n this.value = btn.dataset.tab ?? '';\n this.dispatchEvent(\n new CustomEvent('change', { bubbles: true, composed: true, detail: { value: this.value } }),\n );\n });\n });\n }\n\n /** Painéis associados: descendentes do host ou irmãos seguintes no DOM. */\n private get panels(): FxTabPanel[] {\n const inside = Array.from(this.querySelectorAll<FxTabPanel>('fx-tab-panel'));\n if (inside.length) return inside;\n const out: FxTabPanel[] = [];\n let el = this.nextElementSibling;\n while (el && !el.matches('fx-tabs')) {\n if (el.matches('fx-tab-panel')) out.push(el as FxTabPanel);\n else out.push(...Array.from(el.querySelectorAll<FxTabPanel>(':scope > fx-tab-panel')));\n el = el.nextElementSibling;\n }\n return out;\n }\n}\n\n/**\n * <fx-tab-panel> — Painel de conteúdo associado a uma aba.\n */\nexport class FxTabPanel extends FxElement {\n static override styles = css`\n :host { display: block; padding: var(--fx-space-lg) 0; font-family: var(--fx-font-family); color: var(--fx-text-default); }\n :host([hidden]) { display: none; }\n `;\n\n static override get observedAttributes(): string[] {\n return ['tab'];\n }\n\n get tab(): string { return this.getAttr('tab'); }\n\n get visible(): boolean { return !this.hasAttr('hidden'); }\n set visible(value: boolean) { this.toggleAttr('hidden', !value); }\n\n protected override render(): void {\n this.setTemplate('<slot></slot>');\n if (!this._initialized) {\n // Estado inicial: visível apenas se for a aba ativa do owner.\n // (usa atributo direto — ver comentário em FxTabs.render)\n const owner =\n (this.closest<FxTabs>('fx-tabs')) ??\n (() => {\n let el = this.previousElementSibling;\n while (el) {\n if (el.matches('fx-tabs')) return el as FxTabs;\n el = el.previousElementSibling;\n }\n return null;\n })();\n const active = owner ? (owner.getAttribute('value') || '') : '';\n if (this.getAttribute('tab') !== active) this.setAttribute('hidden', '');\n this._initialized = true;\n }\n }\n\n private _initialized = false;\n}\n\nexport function defineFxTabs(): typeof FxTabs {\n return defineElement('fx-tabs', FxTabs);\n}\nexport function defineFxTabPanel(): typeof FxTabPanel {\n return defineElement('fx-tab-panel', FxTabPanel);\n}\n","import { FxTabs, FxTabPanel, defineFxTabs, defineFxTabPanel } from './tabs';\n\nexport { FxTabs, FxTabPanel };\n\ndefineFxTabs();\ndefineFxTabPanel();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'fx-tabs': FxTabs;\n 'fx-tab-panel': FxTabPanel;\n }\n}\n","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\n\n/**\n * <fx-progress> — Indicador de progresso determinado/indeterminado.\n *\n * Atributos: value (0-100), indeterminate, variant (primary|success|warning|danger),\n * label (mostra %), size (sm|md|lg).\n * Evento: `complete` quando chega a 100.\n */\nexport class FxProgress extends FxElement {\n static override styles = css`\n :host {\n display: block;\n font-family: var(--fx-font-family);\n --_color: var(--fx-color-primary);\n }\n :host([variant='success']) { --_color: var(--fx-color-success); }\n :host([variant='warning']) { --_color: var(--fx-color-warning); }\n :host([variant='danger']) { --_color: var(--fx-color-danger); }\n .row {\n display: flex;\n align-items: center;\n gap: var(--fx-space-md);\n }\n .track {\n flex: 1;\n height: 8px;\n background: var(--fx-surface-surface-hover);\n border-radius: var(--fx-radius-full);\n overflow: hidden;\n }\n :host([size='sm']) .track { height: 4px; }\n :host([size='lg']) .track { height: 12px; }\n .bar {\n height: 100%;\n width: 0%;\n background: var(--_color);\n border-radius: var(--fx-radius-full);\n transition: width var(--fx-motion-duration-normal) var(--fx-motion-easing);\n }\n :host([indeterminate]) .bar {\n width: 40%;\n animation: slide 1.2s ease-in-out infinite;\n }\n @keyframes slide {\n from { transform: translateX(-100%); }\n to { transform: translateX(350%); }\n }\n .pct {\n font-size: calc(var(--fx-font-size) - 2px);\n color: var(--fx-text-default);\n font-weight: 600;\n min-width: 34px;\n text-align: right;\n }\n .caption {\n font-size: calc(var(--fx-font-size) - 2px);\n color: var(--fx-text-muted);\n margin-bottom: var(--fx-space-xs);\n }\n `;\n\n static override get observedAttributes(): string[] {\n return ['value', 'indeterminate', 'variant', 'label', 'hide-label', 'size'];\n }\n\n get value(): number { return Number(this.getAttr('value', '0')) || 0; }\n set value(v: number) { this.setAttribute('value', String(Math.min(100, Math.max(0, v)))); }\n\n protected override render(): void {\n const pct = Math.min(100, Math.max(0, this.value));\n const indeterminate = this.hasAttr('indeterminate');\n const labelText = this.getAttr('label');\n const showPct = !indeterminate && !this.hasAttr('hide-label');\n\n this.setTemplate(`\n ${labelText ? `<div class=\"caption\" part=\"caption\">${labelText}</div>` : ''}\n <div class=\"row\">\n <div class=\"track\" part=\"track\" role=\"progressbar\"\n aria-valuenow=\"${pct}\" aria-valuemin=\"0\" aria-valuemax=\"100\">\n <div class=\"bar\" part=\"bar\" style=\"width: ${indeterminate ? '40%' : `${pct}%`}\"></div>\n </div>\n ${showPct ? `<span class=\"pct\">${pct}%</span>` : ''}\n </div>\n `);\n\n if (!this._done && !this.hasAttr('indeterminate') && pct >= 100) {\n this._done = true;\n this.dispatchEvent(new CustomEvent('complete', { bubbles: true, composed: true }));\n }\n if (pct < 100) this._done = false;\n }\n\n private _done = false;\n}\n\nexport function defineFxProgress(): typeof FxProgress {\n return defineElement('fx-progress', FxProgress);\n}\n","import { FxProgress, defineFxProgress } from './progress';\n\nexport { FxProgress };\n\n\ndefineFxProgress();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'fx-progress': FxProgress;\n }\n}\n\r\n\r\n","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\n\n/**\n * <fx-skeleton> — Placeholder animado para carregamento de conteúdo.\n *\n * Atributos: variant (text|circle|rect, padrão text), width, height, lines (para text).\n */\nexport class FxSkeleton extends FxElement {\n static override styles = css`\n :host { display: block; width: 100%; min-width: 80px; font-family: var(--fx-font-family); }\n .bone {\n background: linear-gradient(\n 90deg,\n var(--fx-surface-surface-hover) 25%,\n color-mix(in srgb, var(--fx-surface-surface-hover) 55%, var(--fx-surface-background)) 50%,\n var(--fx-surface-surface-hover) 75%\n );\n background-size: 200% 100%;\n animation: shimmer 1.4s ease-in-out infinite;\n border-radius: var(--fx-radius-sm);\n }\n @keyframes shimmer { from { background-position: 200% 0; } to { background-position: -200% 0; } }\n .bone[hidden] { display: none; }\n .text { height: 12px; width: 100%; margin-bottom: var(--fx-space-sm); }\n .text:last-of-type { width: 60%; margin-bottom: 0; }\n .circle { border-radius: var(--fx-radius-full); }\n `;\n\n static override get observedAttributes(): string[] {\n return ['variant', 'width', 'height', 'lines'];\n }\n\n protected override render(): void {\n const variant = this.getAttr('variant', 'text');\n const width = this.getAttr('width');\n const height = this.getAttr('height');\n const style = `${width ? `width:${width};` : ''}${height ? `height:${height};` : ''}`;\n\n if (variant === 'circle') {\n const size = height || width || '40px';\n const diameter = !style.includes('height') ? `width:${size};height:${size};` : style;\n this.setTemplate(`<div class=\"bone circle\" part=\"bone\" style=\"${diameter}\"></div>`);\n return;\n }\n\n if (variant === 'rect') {\n const s = style || 'width:100%;height:80px;';\n this.setTemplate(`<div class=\"bone\" part=\"bone\" style=\"${s}\"></div>`);\n return;\n }\n\n // text (padrão): N linhas\n const lines = Number(this.getAttr('lines', '3')) || 3;\n this.setTemplate(`\n ${Array.from({ length: lines }, () => '<div class=\"bone text\"></div>').join('')}\n `);\n }\n}\n\nexport function defineFxSkeleton(): typeof FxSkeleton {\n return defineElement('fx-skeleton', FxSkeleton);\n}\n","import { FxSkeleton, defineFxSkeleton } from './skeleton';\n\nexport { FxSkeleton };\n\n\ndefineFxSkeleton();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'fx-skeleton': FxSkeleton;\n }\n}\n\r\n\r\n","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\n\n/**\n * <fx-alert> — Aviso inline com variantes semânticas.\n *\n * Atributos: variant (info|success|warning|danger, padrão info), title, dismissible.\n * Slot padrão: conteúdo da mensagem. Evento `dismiss`.\n */\nexport class FxAlert extends FxElement {\n static override styles = css`\n :host {\n display: block;\n font-family: var(--fx-font-family);\n --_color: var(--fx-color-primary);\n --_bg: color-mix(in srgb, var(--fx-color-primary) 10%, var(--fx-surface-background));\n }\n :host([variant='success']) { --_color: var(--fx-color-success); --_bg: color-mix(in srgb, var(--fx-color-success) 10%, var(--fx-surface-background)); }\n :host([variant='warning']) { --_color: var(--fx-color-warning); --_bg: color-mix(in srgb, var(--fx-color-warning) 12%, var(--fx-surface-background)); }\n :host([variant='danger']) { --_color: var(--fx-color-danger); --_bg: color-mix(in srgb, var(--fx-color-danger) 10%, var(--fx-surface-background)); }\n .alert {\n display: flex;\n align-items: flex-start;\n gap: var(--fx-space-md);\n background: var(--_bg);\n border: 1px solid color-mix(in srgb, var(--_color) 30%, transparent);\n border-radius: var(--fx-radius-md);\n padding: var(--fx-space-md) var(--fx-space-lg);\n font-size: var(--fx-font-size);\n color: var(--fx-text-default);\n }\n :host([hidden]) { display: none; }\n .icon { color: var(--_color); font-weight: bold; line-height: 1.4; }\n .content { flex: 1; }\n .title { font-weight: 600; }\n .body { margin-top: 2px; }\n .close {\n border: none; background: transparent; cursor: pointer;\n color: var(--fx-text-muted); font-size: calc(var(--fx-font-size) + 2px);\n line-height: 1; padding: 0; border-radius: var(--fx-radius-full);\n }\n .close:hover { color: var(--_color); }\n `;\n\n static override get observedAttributes(): string[] {\n return ['variant', 'title', 'dismissible'];\n }\n\n protected override render(): void {\n const variant = this.getAttr('variant', 'info');\n const title = this.getAttr('title');\n const icons: Record<string, string> = {\n info: 'ℹ', success: '✓', warning: '⚠', danger: '✕',\n };\n\n this.setTemplate(`\n <div class=\"alert\" part=\"alert\" role=\"alert\">\n <span class=\"icon\">${icons[variant] ?? 'ℹ'}</span>\n <div class=\"content\">\n ${title ? `<div class=\"title\">${title}</div>` : ''}\n <div class=\"body\"><slot></slot></div>\n </div>\n ${this.hasAttr('dismissible') ? '<button type=\"button\" class=\"close\" aria-label=\"Fechar\">×</button>' : ''}\n </div>\n `);\n\n this.root.querySelector('.close')?.addEventListener('click', () => {\n this.hidden = true;\n this.dispatchEvent(new CustomEvent('dismiss', { bubbles: true, composed: true }));\n });\n }\n}\n\nexport function defineFxAlert(): typeof FxAlert {\n return defineElement('fx-alert', FxAlert);\n}\n","import { FxAlert, defineFxAlert } from './alert';\n\nexport { FxAlert };\n\n\ndefineFxAlert();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'fx-alert': FxAlert;\n }\n}\n\r\n","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\n\n/**\n * <fx-dropdown> — Menu de ações em popover.\n *\n * Atributos: label (texto do trigger), position (bottom-left padrão | bottom-right).\n * Itens: <fx-dropdown-item value=\"x\">Texto</fx-dropdown-item>\n * Evento: `select` (composed, detail: { value }).\n */\nexport class FxDropdown extends FxElement {\n static override styles = css`\n :host {\n position: relative;\n display: inline-block;\n font-family: var(--fx-font-family);\n font-size: var(--fx-font-size);\n }\n .trigger { min-height: var(--fx-size-md); }\n .panel {\n position: absolute;\n top: calc(100% + 4px);\n min-width: 180px;\n background: var(--fx-surface-background);\n border: 1px solid var(--fx-border-default);\n border-radius: var(--fx-radius-md);\n box-shadow: var(--fx-shadow-lg);\n padding: var(--fx-space-xs);\n z-index: var(--fx-z-dropdown, 1000);\n display: none;\n }\n :host([open]) .panel { display: block; }\n /* left = alinhado à esquerda do trigger; right = à direita; center = centrado */\n :host([position='left']) .panel,\n :host([position='bottom-left']) .panel { left: 0; right: auto; }\n :host([position='center']) .panel {\n left: 50%;\n transform: translateX(-50%);\n }\n :host([position='right']) .panel,\n :host([position='bottom-right']) .panel { right: 0; left: auto; }\n :host(:not([position])) .panel { left: 0; right: auto; }\n ::slotted(fx-dropdown-item) { display: block; }\n .empty { color: var(--fx-text-muted); font-size: calc(var(--fx-font-size) - 2px); padding: var(--fx-space-sm); }\n `;\n\n static override get observedAttributes(): string[] {\n return ['label', 'position', 'open'];\n }\n\n get open(): boolean { return this.hasAttr('open'); }\n set open(value: boolean) { this.toggleAttr('open', value); }\n\n protected override render(): void {\n const label = this.getAttr('label', 'Ações');\n const items = Array.from(this.querySelectorAll<HTMLElement>('fx-dropdown-item'));\n\n this.setTemplate(`\n <span class=\"trigger\" role=\"button\" tabindex=\"0\" part=\"trigger\"\n aria-haspopup=\"menu\" aria-expanded=\"${this.open}\">\n ${label} ▾\n </span>\n <div class=\"panel\" role=\"menu\" part=\"panel\">\n ${items.length\n ? items.map((i) => `<div class=\"item-slot\"><slot name=\"_${i.getAttribute('value') ?? ''}\"></slot></div>`)\n : '<div class=\"empty\">Nenhuma ação</div>'}\n <slot></slot>\n </div>\n `);\n\n const trigger = this.root.querySelector<HTMLElement>('.trigger');\n trigger?.addEventListener('click', (e) => {\n e.stopPropagation();\n // Fecha outros dropdowns abertos\n document.querySelectorAll('fx-dropdown[open]').forEach((d) => {\n if (d !== this) (d as FxDropdown).open = false;\n });\n this.open = !this.open;\n });\n trigger?.addEventListener('keydown', (e) => {\n if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); this.open = !this.open; }\n });\n\n items.forEach((item) => {\n item.addEventListener('click', () => {\n this.open = false;\n this.dispatchEvent(new CustomEvent('select', {\n bubbles: true, composed: true,\n detail: { value: item.getAttribute('value') ?? '' },\n }));\n });\n });\n }\n}\n\n/**\n * <fx-dropdown-item> — Item de menu.\n */\nexport class FxDropdownItem extends FxElement {\n static override styles = css`\n :host {\n display: block;\n font-family: var(--fx-font-family);\n font-size: var(--fx-font-size);\n }\n .item {\n display: block;\n width: 100%;\n text-align: left;\n border: none;\n background: transparent;\n font-family: inherit;\n font-size: inherit;\n color: var(--fx-text-default);\n padding: var(--fx-space-sm) var(--fx-space-md);\n cursor: pointer;\n border-radius: var(--fx-radius-sm);\n transition: background var(--fx-motion-duration-fast) var(--fx-motion-easing);\n }\n .item:hover { background: color-mix(in srgb, var(--fx-color-primary) 12%, var(--fx-surface-background)); color: var(--fx-color-primary); }\n `;\n\n static override get observedAttributes(): string[] { return ['value']; }\n\n get value(): string { return this.getAttr('value'); }\n set value(v: string) { this.setAttribute('value', v); }\n\n protected override render(): void {\n this.setTemplate('<button type=\"button\" class=\"item\" part=\"item\" role=\"menuitem\"><slot></slot></button>');\n }\n}\n\nexport function defineFxDropdown(): typeof FxDropdown {\n return defineElement('fx-dropdown', FxDropdown);\n}\nexport function defineFxDropdownItem(): typeof FxDropdownItem {\n return defineElement('fx-dropdown-item', FxDropdownItem);\n}\n","import { FxDropdown, FxDropdownItem, defineFxDropdown, defineFxDropdownItem } from './dropdown';\n\nexport { FxDropdown, FxDropdownItem };\n\ndefineFxDropdown();\ndefineFxDropdownItem();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'fx-dropdown': FxDropdown;\n 'fx-dropdown-item': FxDropdownItem;\n }\n}\n","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\n\n/**\n * <fx-drawer> — Painel deslizante (drawer) com overlay.\n *\n * Atributos:\n * - position: 'left' | 'right' | 'top' | 'bottom' (padrão: right);\n * - title: texto do cabeçalho;\n * - open: exibe o drawer.\n * Conteúdo: livre, via slot.\n * Eventos: `open` e `close` (composed). Fecha por ESC ou clique no overlay.\n */\nexport class FxDrawer extends FxElement {\n\tstatic override styles = css`\n\t\t:host {\n\t\t\tdisplay: contents;\n\t\t\tfont-family: var(--fx-font-family);\n\t\t\tfont-size: var(--fx-font-size);\n\t\t\tcolor: var(--fx-text-default);\n\t\t}\n\t\t.overlay {\n\t\t\tdisplay: none;\n\t\t\tposition: fixed;\n\t\t\tinset: 0;\n\t\t\tbackground: color-mix(\n\t\t\t\tin srgb,\n\t\t\t\tvar(--fx-text-default, #000) 45%,\n\t\t\t\ttransparent\n\t\t\t);\n\t\t\tbackdrop-filter: blur(3px);\n\t\t\t-webkit-backdrop-filter: blur(3px);\n\t\t\tz-index: var(--fx-z-overlay, 1090);\n\t\t\tanimation: fade var(--fx-motion-duration-fast) var(--fx-motion-easing);\n\t\t}\n\t\t:host([open]) .overlay {\n\t\t\tdisplay: block;\n\t\t}\n\n\t\t.panel {\n\t\t\tposition: fixed;\n\t\t\tbackground: var(--fx-surface-background);\n\t\t\tbox-shadow: var(--fx-shadow-xl);\n\t\t\tz-index: var(--fx-z-modal, 1000);\n\t\t\tdisplay: flex;\n\t\t\tflex-direction: column;\n\t\t\toverflow: auto;\n\t\t}\n\t\t:host(:not([open])) .panel {\n\t\t\tdisplay: none;\n\t\t}\n\t\t:host([open]) .panel {\n\t\t\tdisplay: flex;\n\t\t}\n\t\t/* left / right — altura total, largura mínima fixa e expansível */\n\t\t:host([position=\"left\"]) .panel,\n\t\t:host(:not([position])) .panel,\n\t\t:host([position=\"right\"]) .panel {\n\t\t\ttop: 0;\n\t\t\tbottom: 0;\n\t\t\twidth: var(--fx-drawer-width, 360px);\n\t\t\tmin-width: 300px;\n\t\t\tmax-width: 90vw;\n\t\t}\n\t\t:host([position=\"left\"]) .panel {\n\t\t\tleft: 0;\n\t\t}\n\t\t:host([position=\"right\"]) .panel,\n\t\t:host(:not([position])) .panel {\n\t\t\tright: 0;\n\t\t}\n\n\t\t/* top / bottom — largura total, altura mínima fixa e expansível */\n\t\t:host([position=\"top\"]) .panel,\n\t\t:host([position=\"bottom\"]) .panel {\n\t\t\tleft: 0;\n\t\t\tright: 0;\n\t\t\theight: var(--fx-drawer-height, 280px);\n\t\t\tmin-height: 180px;\n\t\t\tmax-height: 85vh;\n\t\t}\n\t\t:host([position=\"top\"]) .panel {\n\t\t\ttop: 0;\n\t\t}\n\t\t:host([position=\"bottom\"]) .panel {\n\t\t\tbottom: 0;\n\t\t}\n\n\t\t.header {\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\tgap: var(--fx-space-sm);\n\t\t\tmin-height: var(--fx-size-lg);\n\t\t\tpadding: var(--fx-space-sm) var(--fx-space-md);\n\t\t\tborder-bottom: 1px solid var(--fx-border-default);\n\t\t\tflex: none;\n\t\t\tposition: sticky;\n\t\t\ttop: 0;\n\t\t\tbackground: var(--fx-surface-background);\n\t\t}\n\t\t.title {\n\t\t\tfont-weight: 700;\n\t\t\tflex: 1;\n\t\t\toverflow: hidden;\n\t\t\ttext-overflow: ellipsis;\n\t\t\twhite-space: nowrap;\n\t\t}\n\t\t.close {\n\t\t\tborder: none;\n\t\t\tbackground: transparent;\n\t\t\tcursor: pointer;\n\t\t\tcolor: var(--fx-text-muted);\n\t\t\twidth: 28px;\n\t\t\theight: 28px;\n\t\t\tline-height: 1;\n\t\t\tborder-radius: var(--fx-radius-sm);\n\t\t\tfont-size: 16px;\n\t\t\ttransition: background var(--fx-motion-duration-fast)\n\t\t\t\tvar(--fx-motion-easing);\n\t\t}\n\t\t.close:hover {\n\t\t\tbackground: color-mix(\n\t\t\t\tin srgb,\n\t\t\t\tvar(--fx-color-danger) 14%,\n\t\t\t\tvar(--fx-surface-background)\n\t\t\t);\n\t\t\tcolor: var(--fx-color-danger);\n\t\t}\n\t\t.body {\n\t\t\tpadding: var(--fx-space-md);\n\t\t\tflex: 1;\n\t\t}\n\t`;\n\n\tstatic override get observedAttributes(): string[] {\n\t\treturn [\"open\", \"title\", \"position\"];\n\t}\n\n\tget open(): boolean {\n\t\treturn this.hasAttr(\"open\");\n\t}\n\tset open(value: boolean) {\n\t\tthis.toggleAttr(\"open\", value);\n\t}\n\n\toverride get title(): string {\n\t\treturn this.getAttr(\"title\");\n\t}\n\toverride set title(v: string) {\n\t\tthis.setAttribute(\"title\", v);\n\t}\n\n\tget position(): string {\n\t\tconst p = this.getAttr(\"position\");\n\t\treturn [\"left\", \"right\", \"top\", \"bottom\"].includes(p) ? p : \"right\";\n\t}\n\tset position(v: string) {\n\t\tthis.setAttribute(\"position\", v);\n\t}\n\n\tprotected override render(): void {\n\t\tconst title = this.getAttr(\"title\");\n\n\t\tthis.setTemplate(`\n <div class=\"overlay\" part=\"overlay\"></div>\n <div class=\"panel\" part=\"panel\" role=\"dialog\" aria-modal=\"true\" aria-label=\"${title || \"Drawer\"}\">\n ${title !== \"\" ? `<div class=\"header\" part=\"header\"><span class=\"title\">${title}</span><button type=\"button\" class=\"close\" part=\"close\" aria-label=\"Fechar\">✕</button></div>` : \"\"}\n <div class=\"body\" part=\"body\"><slot></slot></div>\n </div>\n `);\n\n\t\tconst close = () => {\n\t\t\tif (!this.open) return;\n\t\t\tthis.open = false;\n\t\t\tthis.dispatchEvent(\n\t\t\t\tnew CustomEvent(\"close\", { bubbles: true, composed: true }),\n\t\t\t);\n\t\t};\n\t\tthis.root.querySelector(\".overlay\")?.addEventListener(\"click\", close);\n\t\tthis.root.querySelector(\".close\")?.addEventListener(\"click\", close);\n\t}\n\n\tprotected override connectedCallback(): void {\n\t\tsuper.connectedCallback?.();\n\t\tthis._onKeydown = (e: KeyboardEvent) => {\n\t\t\tif (e.key === \"Escape\" && this.open) {\n\t\t\t\tthis.open = false;\n\t\t\t\tthis.dispatchEvent(\n\t\t\t\t\tnew CustomEvent(\"close\", { bubbles: true, composed: true }),\n\t\t\t\t);\n\t\t\t}\n\t\t};\n\t\tdocument.addEventListener(\"keydown\", this._onKeydown);\n\t}\n\n\tprotected override disconnectedCallback(): void {\n\t\tdocument.removeEventListener(\"keydown\", this._onKeydown);\n\t\tsuper.disconnectedCallback?.();\n\t}\n\n\tprivate _onKeydown: (e: KeyboardEvent) => void = () => {};\n}\n\nexport function defineFxDrawer(): typeof FxDrawer {\n return defineElement('fx-drawer', FxDrawer);\n}","import { FxDrawer, defineFxDrawer } from './drawer';\n\nexport { FxDrawer };\n\ndefineFxDrawer();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'fx-drawer': FxDrawer;\n }\n}","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\n\n/**\n * <fx-pagination> — Paginação standalone.\n *\n * Atributos: page (atual), total (itens), rows (por página), rows-options,\n * position (left|center|right).\n * Evento: `page-change` (composed, detail: { page, rows }).\n */\nexport class FxPagination extends FxElement {\n static override styles = css`\n :host {\n display: flex;\n align-items: center;\n gap: var(--fx-space-sm);\n font-family: var(--fx-font-family);\n font-size: var(--fx-font-size);\n color: var(--fx-text-default);\n }\n :host([position='center']) { justify-content: center; }\n :host([position='right']) { justify-content: flex-end; }\n .nav {\n min-width: var(--fx-size-sm);\n height: var(--fx-size-sm);\n border: 1px solid var(--fx-border-default);\n background: var(--fx-surface-background);\n color: var(--fx-text-default);\n font-family: inherit;\n font-size: calc(var(--fx-font-size) - 2px);\n border-radius: var(--fx-radius-sm);\n cursor: pointer;\n padding: 0 var(--fx-space-sm);\n transition:\n border-color var(--fx-motion-duration-fast) var(--fx-motion-easing),\n background var(--fx-motion-duration-fast) var(--fx-motion-easing);\n }\n .nav:hover:not([disabled]) { border-color: var(--fx-color-primary); color: var(--fx-color-primary); }\n .nav[disabled] { opacity: 0.5; cursor: not-allowed; }\n .nav.active {\n background: var(--fx-color-primary);\n border-color: var(--fx-color-primary);\n color: #fff;\n font-weight: 600;\n }\n .info { color: var(--fx-text-muted); font-size: calc(var(--fx-font-size) - 2px); }\n select.nav { cursor: pointer; }\n `;\n\n static override get observedAttributes(): string[] {\n return ['page', 'total', 'rows', 'rows-options', 'position'];\n }\n\n get page(): number { return Number(this.getAttr('page', '1')) || 1; }\n set page(v: number) { this.setAttribute('page', String(v)); }\n get total(): number { return Number(this.getAttr('total', '0')) || 0; }\n set total(v: number) { this.setAttribute('total', String(v)); }\n get rows(): number { return Number(this.getAttr('rows', '10')) || 10; }\n set rows(v: number) { this.setAttribute('rows', String(v)); }\n\n private get pages(): number {\n return Math.max(1, Math.ceil(this.total / this.rows));\n }\n\n protected override render(): void {\n const pages = this.pages;\n const current = Math.min(Math.max(1, this.page), pages);\n const opts = (this.getAttr('rows-options', '5,10,20,50') || '').split(',').map((s) => s.trim()).filter(Boolean);\n\n // Janela de páginas: mostra até 5 com elipses simplificada\n const window_: number[] = [];\n for (let p = Math.max(1, current - 2); p <= Math.min(pages, current + 2); p++) window_.push(p);\n\n const from = total0(current, this.rows);\n const to = Math.min(current * this.rows, this.total);\n\n this.setTemplate(`\n <span class=\"info\">${this.total ? `${from}-${to} de ${this.total}` : '0 itens'}</span>\n <button type=\"button\" class=\"nav\" part=\"prev\" data-go=\"${current - 1}\" ${current <= 1 ? 'disabled' : ''}>‹</button>\n ${window_[0] !== 1 && pages > 5 ? `<button type=\"button\" class=\"nav\" data-go=\"1\">1</button>` : ''}\n ${window_.map((p) => `<button type=\"button\" class=\"nav ${p === current ? 'active' : ''}\" data-go=\"${p}\">${p}</button>`).join('')}\n ${window_[window_.length - 1] !== pages && pages > 5 ? `<button type=\"button\" class=\"nav\" data-go=\"${pages}\">${pages}</button>` : ''}\n <button type=\"button\" class=\"nav\" part=\"next\" data-go=\"${current + 1}\" ${current >= pages ? 'disabled' : ''}>›</button>\n ${opts.length ? `\n <select class=\"nav\" part=\"rows\" aria-label=\"Itens por página\">\n ${opts.map((o) => `<option value=\"${o}\" ${Number(o) === this.rows ? 'selected' : ''}>${o}</option>`).join('')}\n </select>` : ''}\n `);\n\n function total0(page: number, rows: number): number {\n return (page - 1) * rows + 1;\n }\n\n this.root.querySelectorAll<HTMLButtonElement>('.nav[data-go]').forEach((btn) => {\n btn.addEventListener('click', () => {\n const target = Number(btn.dataset.go);\n if (target >= 1 && target <= pages && target !== current) {\n this.page = target;\n this.emit();\n }\n });\n });\n const sel = this.root.querySelector<HTMLSelectElement>('select.nav');\n sel?.addEventListener('change', () => {\n this.rows = Number(sel.value);\n this.page = 1;\n this.emit();\n });\n }\n\n private emit(): void {\n this.dispatchEvent(new CustomEvent('page-change', {\n bubbles: true, composed: true,\n detail: { page: this.page, rows: this.rows },\n }));\n }\n}\n\nexport function defineFxPagination(): typeof FxPagination {\n return defineElement('fx-pagination', FxPagination);\n}\n","import { FxPagination, defineFxPagination } from './pagination';\n\nexport { FxPagination };\n\n\ndefineFxPagination();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'fx-pagination': FxPagination;\n }\n}\n\r\n","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\n\n/**\n * <fx-autocomplete> — Campo de texto com sugestões filtradas.\n *\n * Atributos: value, size, placeholder, source (JSON array de strings),\n * disabled, min-chars (padrão 1).\n * Evento: `select` (composed, detail: { value }).\n */\nexport class FxAutocomplete extends FxElement {\n static override styles = css`\n :host {\n position: relative;\n display: inline-block;\n font-family: var(--fx-font-family);\n font-size: var(--fx-font-size);\n }\n input {\n font-family: inherit;\n font-size: inherit;\n font-weight: var(--fx-font-weight);\n color: var(--fx-text-default);\n background-color: var(--fx-surface-background);\n border: 1px solid var(--fx-border-default);\n border-radius: var(--fx-radius-md);\n padding: var(--fx-space-md) var(--fx-space-lg);\n width: 260px;\n min-height: var(--fx-size-md);\n box-sizing: border-box;\n transition:\n border-color var(--fx-motion-duration-normal) var(--fx-motion-easing),\n box-shadow var(--fx-motion-duration-normal) var(--fx-motion-easing);\n }\n input::placeholder { color: var(--fx-text-muted); opacity: 1; }\n input:hover { border-color: var(--fx-border-hover); }\n input:focus-visible {\n outline: none;\n border-color: var(--fx-color-primary);\n box-shadow: var(--fx-effect-focus-ring, none);\n }\n :host([size='sm']) input { width: 220px; min-height: var(--fx-size-sm); padding: var(--fx-space-sm) var(--fx-space-md); }\n :host([size='lg']) input { width: 300px; min-height: var(--fx-size-lg); }\n .list {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n right: 0;\n background: var(--fx-surface-background);\n border: 1px solid var(--fx-border-default);\n border-radius: var(--fx-radius-md);\n box-shadow: var(--fx-shadow-lg);\n z-index: var(--fx-z-dropdown, 1000);\n max-height: 220px;\n overflow-y: auto;\n display: none;\n }\n :host([open]) .list { display: block; }\n .opt {\n display: block;\n width: 100%;\n text-align: left;\n border: none;\n background: transparent;\n font-family: inherit;\n font-size: inherit;\n color: var(--fx-text-default);\n padding: var(--fx-space-sm) var(--fx-space-md);\n cursor: pointer;\n transition: background var(--fx-motion-duration-fast) var(--fx-motion-easing);\n }\n .opt:hover { background: color-mix(in srgb, var(--fx-color-primary) 12%, var(--fx-surface-background)); color: var(--fx-color-primary); }\n .empty { color: var(--fx-text-muted); font-size: calc(var(--fx-font-size) - 2px); padding: var(--fx-space-sm) var(--fx-space-md); }\n `;\n\n static override get observedAttributes(): string[] {\n return ['size', 'placeholder', 'source', 'disabled', 'min-chars'];\n }\n\n get size(): string {\n const s = this.getAttr('size', 'md');\n return s === 'sm' || s === 'lg' ? s : 'md';\n }\n set size(v: string) { this.setAttribute('size', v); }\n get value(): string { return this.getAttr('value'); }\n set value(v: string) { this.setAttribute('value', v); }\n\n private get source(): string[] {\n try {\n const raw = JSON.parse(this.getAttr('source', '[]'));\n return Array.isArray(raw) ? raw.map(String) : [];\n } catch {\n return [];\n }\n }\n\n protected override render(): void {\n const placeholder = this.getAttr('placeholder');\n\n this.setTemplate(`\n <input class=\"field\" part=\"input\" type=\"text\"\n ${placeholder ? `placeholder=\"${placeholder}\"` : ''} autocomplete=\"off\"/>\n <div class=\"list\" part=\"list\" role=\"listbox\"></div>\n `);\n\n const field = this.root.querySelector<HTMLInputElement>('.field');\n if (!field) return;\n field.value = this.value;\n if (this.hasAttr('disabled')) field.setAttribute('disabled', '');\n\n const list = this.root.querySelector<HTMLElement>('.list');\n const minChars = Number(this.getAttr('min-chars', '1')) || 1;\n\n const openList = (): void => {\n if (!list) return;\n const q = field.value.toLowerCase();\n const matches = this.source.filter((s) => s.toLowerCase().includes(q)).slice(0, 8);\n list.innerHTML = matches.length\n ? matches.map((m) => `<button type=\"button\" class=\"opt\" role=\"option\" data-v=\"${m}\">${m}</button>`).join('')\n : '<div class=\"empty\">Nenhum resultado</div>';\n list.querySelectorAll<HTMLButtonElement>('.opt').forEach((btn) => {\n btn.addEventListener('click', () => {\n field.value = btn.dataset.v ?? '';\n this.value = field.value;\n this.toggleAttr('open', false);\n this.dispatchEvent(new CustomEvent('select', {\n bubbles: true, composed: true, detail: { value: this.value },\n }));\n });\n });\n this.toggleAttr('open', true);\n };\n\n // Reabrir com foco sem re-render (evita perder digitação)\n field.addEventListener('input', () => {\n this.value = field.value;\n openList();\n });\n field.addEventListener('focus', () => { if (field.value.length >= minChars) openList(); });\n\n document.addEventListener('click', (e) => {\n if (!this.contains(e.target as Node)) this.toggleAttr('open', false);\n });\n }\n}\n\nexport function defineFxAutocomplete(): typeof FxAutocomplete {\n return defineElement('fx-autocomplete', FxAutocomplete);\n}\n","import { FxAutocomplete, defineFxAutocomplete } from './autocomplete';\n\nexport { FxAutocomplete };\n\n\ndefineFxAutocomplete();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'fx-autocomplete': FxAutocomplete;\n }\n}\n\r\n"],"names":["key","display"],"mappings":"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"}