@wrrdev/fenix-ui 1.1.6 → 1.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/README.md +23 -3
  2. package/dist/assets/{base-css-Be_r8aTo.js → font-CF0TXsAP.js} +39 -3
  3. package/dist/assets/font-CF0TXsAP.js.map +1 -0
  4. package/dist/components/autocomplete/autocomplete.d.ts.map +1 -1
  5. package/dist/components/autocomplete/autocomplete.js +9 -6
  6. package/dist/components/autocomplete/autocomplete.js.map +1 -1
  7. package/dist/components/button/button.d.ts.map +1 -1
  8. package/dist/components/button/button.js +5 -3
  9. package/dist/components/button/button.js.map +1 -1
  10. package/dist/components/datepicker/datepicker.d.ts.map +1 -1
  11. package/dist/components/datepicker/datepicker.js +11 -6
  12. package/dist/components/datepicker/datepicker.js.map +1 -1
  13. package/dist/components/fileupload/fileupload.d.ts +1 -1
  14. package/dist/components/fileupload/fileupload.d.ts.map +1 -1
  15. package/dist/components/fileupload/fileupload.js +5 -3
  16. package/dist/components/fileupload/fileupload.js.map +1 -1
  17. package/dist/components/icon/icon.d.ts +40 -0
  18. package/dist/components/icon/icon.d.ts.map +1 -0
  19. package/dist/components/icon/icon.js +79 -0
  20. package/dist/components/icon/icon.js.map +1 -0
  21. package/dist/components/icon/index.d.ts +8 -0
  22. package/dist/components/icon/index.d.ts.map +1 -0
  23. package/dist/components/icon/index.js +7 -0
  24. package/dist/components/icon/index.js.map +1 -0
  25. package/dist/components/input/input.d.ts.map +1 -1
  26. package/dist/components/input/input.js +12 -6
  27. package/dist/components/input/input.js.map +1 -1
  28. package/dist/components/knob/knob.d.ts +1 -1
  29. package/dist/components/knob/knob.d.ts.map +1 -1
  30. package/dist/components/knob/knob.js +3 -1
  31. package/dist/components/knob/knob.js.map +1 -1
  32. package/dist/components/multiselect/multiselect.d.ts.map +1 -1
  33. package/dist/components/multiselect/multiselect.js +8 -3
  34. package/dist/components/multiselect/multiselect.js.map +1 -1
  35. package/dist/components/orderlist/orderlist.js +2 -2
  36. package/dist/components/orderlist/orderlist.js.map +1 -1
  37. package/dist/components/picklist/picklist.js +2 -2
  38. package/dist/components/picklist/picklist.js.map +1 -1
  39. package/dist/components/select/select.d.ts.map +1 -1
  40. package/dist/components/select/select.js +9 -3
  41. package/dist/components/select/select.js.map +1 -1
  42. package/dist/components/textarea/textarea.d.ts.map +1 -1
  43. package/dist/components/textarea/textarea.js +7 -3
  44. package/dist/components/textarea/textarea.js.map +1 -1
  45. package/dist/components/toggle-button-group/toggle-button-group.d.ts.map +1 -1
  46. package/dist/components/toggle-button-group/toggle-button-group.js +3 -1
  47. package/dist/components/toggle-button-group/toggle-button-group.js.map +1 -1
  48. package/dist/core/jsx.d.ts +22 -0
  49. package/dist/core/jsx.d.ts.map +1 -1
  50. package/dist/core/jsx.js.map +1 -1
  51. package/dist/core/theme.d.ts.map +1 -1
  52. package/dist/core/theme.js +12 -0
  53. package/dist/core/theme.js.map +1 -1
  54. package/dist/core/tokens.d.ts +4 -0
  55. package/dist/core/tokens.d.ts.map +1 -1
  56. package/dist/core/tokens.js +9 -1
  57. package/dist/core/tokens.js.map +1 -1
  58. package/dist/core/vue.d.ts +3 -1
  59. package/dist/core/vue.d.ts.map +1 -1
  60. package/dist/core/vue.js.map +1 -1
  61. package/dist/docs/app.d.ts.map +1 -1
  62. package/dist/docs/componentes/icon.doc.d.ts +9 -0
  63. package/dist/docs/componentes/icon.doc.d.ts.map +1 -0
  64. package/dist/docs/componentes/index.d.ts.map +1 -1
  65. package/dist/fenix-ui.umd.min.js +195 -138
  66. package/dist/fenix-ui2.esm.js.map +1 -1
  67. package/dist/fenix-ui3.esm.js +10 -14
  68. package/dist/fenix-ui3.esm.js.map +1 -1
  69. package/dist/fenix-ui4.esm.js +187 -60
  70. package/dist/fenix-ui4.esm.js.map +1 -1
  71. package/dist/fenix-ui5.esm.js +41 -15
  72. package/dist/fenix-ui5.esm.js.map +1 -1
  73. package/dist/icons/font.d.ts +26 -0
  74. package/dist/icons/font.d.ts.map +1 -0
  75. package/dist/icons/font.js +42 -0
  76. package/dist/icons/font.js.map +1 -0
  77. package/dist/icons/index.d.ts +3 -1
  78. package/dist/icons/index.d.ts.map +1 -1
  79. package/dist/icons/index.js +11 -13
  80. package/dist/icons/index.js.map +1 -1
  81. package/dist/icons/name-union.d.ts +11 -0
  82. package/dist/icons/name-union.d.ts.map +1 -0
  83. package/dist/icons/names.d.ts +0 -1
  84. package/dist/icons/names.d.ts.map +1 -1
  85. package/dist/icons/names.js.map +1 -1
  86. package/dist/icons/types.d.ts +14 -0
  87. package/dist/icons/types.d.ts.map +1 -0
  88. package/dist/index.d.ts +2 -0
  89. package/dist/index.d.ts.map +1 -1
  90. package/dist/index.js +3 -0
  91. package/dist/index.js.map +1 -1
  92. package/dist/plugins/auto-import.d.ts +19 -2
  93. package/dist/plugins/auto-import.d.ts.map +1 -1
  94. package/dist/plugins/auto-import.js +40 -14
  95. package/dist/plugins/auto-import.js.map +1 -1
  96. package/dist/plugins/index.d.ts +5 -0
  97. package/dist/plugins/index.d.ts.map +1 -1
  98. package/dist/plugins/index.js +1 -1
  99. package/dist/plugins/index.js.map +1 -1
  100. package/package.json +5 -1
  101. package/dist/assets/base-css-Be_r8aTo.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"mappings":"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","names":["key","s","b","display"],"ignoreList":[],"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/expr.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/confirmpopup/confirmpopup.ts","../src/components/confirmpopup/index.ts","../src/components/fileupload/fileupload.ts","../src/components/fileupload/index.ts","../src/components/slider/slider.ts","../src/components/slider/index.ts","../src/components/chip/chip.ts","../src/components/chip/index.ts","../src/components/avatar/avatar.ts","../src/components/avatar/index.ts","../src/components/card/card.ts","../src/components/card/index.ts","../src/components/breadcrumb/breadcrumb.ts","../src/components/breadcrumb/index.ts","../src/components/popover/popover.ts","../src/components/popover/index.ts","../src/components/stepper/stepper.ts","../src/components/stepper/index.ts","../src/components/rating/rating.ts","../src/components/rating/index.ts","../src/components/menu/menu.ts","../src/components/menu/index.ts","../src/components/toggle-button-group/toggle-button-group.ts","../src/components/toggle-button-group/index.ts","../src/components/empty-state/empty-state.ts","../src/components/empty-state/index.ts","../src/components/password-strength/password-strength.ts","../src/components/password-strength/index.ts","../src/components/timeline/timeline.ts","../src/components/timeline/index.ts","../src/components/carousel/carousel.ts","../src/components/carousel/index.ts","../src/components/tree/tree.ts","../src/components/tree/index.ts","../src/components/toast/toast.ts","../src/components/toast/index.ts","../src/components/tooltip/tooltip.ts","../src/components/tooltip/directive.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","../src/components/knob/knob.ts","../src/components/knob/index.ts","../src/components/orderlist/orderlist.ts","../src/components/orderlist/index.ts","../src/components/picklist/picklist.ts","../src/components/picklist/index.ts","../src/components/accordion/accordion.ts","../src/components/accordion/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\tcolor: {\n\t\tprimary: \"#c2410c\",\n\t\tsecondary: \"#991B1B\",\n\t\tsuccess: \"#10b972\",\n\t\twarning: \"#f59e0b\",\n\t\tdanger: \"#f43f5e\",\n\t\tinfo: \"#0ea5e9\",\n\t},\n\tsurface: {\n\t\tbackground: \"#ffffff\",\n\t\tsurface: \"#f8fafc\",\n\t\t\"surface-hover\": \"#eef2f7\",\n\t},\n\ttext: {\n\t\tdefault: \"#10182c\",\n\t\tmuted: \"#64748b\",\n\t\tdisabled: \"#94a3b8\",\n\t},\n\tborder: {\n\t\tdefault: \"#e2e8f0\",\n\t\thover: \"#cbd5e1\",\n\t},\n\tfont: {\n\t\tfamily: \"'Inter', system-ui, -apple-system, 'Segoe UI', sans-serif\",\n\t\tsize: \"14px\",\n\t\tweight: \"500\",\n\t\t\"line-height\": \"1.5\",\n\t},\n\tspace: { xs: \"4px\", sm: \"8px\", md: \"12px\", lg: \"16px\", xl: \"24px\" },\n\tradius: { none: \"0\", sm: \"4px\", md: \"8px\", lg: \"12px\", full: \"9999px\" },\n\tsize: { sm: \"32px\", md: \"40px\", lg: \"48px\" },\n\tshadow: {\n\t\tsm: \"0 1px 2px rgba(15, 23, 42, 0.06)\",\n\t\tmd: \"0 4px 12px rgba(15, 23, 42, 0.10)\",\n\t\tlg: \"0 12px 32px rgba(15, 23, 42, 0.18)\",\n\t},\n\tmotion: {\n\t\t\"duration-fast\": \"120ms\",\n\t\t\"duration-normal\": \"240ms\",\n\t\teasing: \"cubic-bezier(0.25, 0.1, 0.25, 1)\",\n\t},\n\teffect: {\n\t\t/** '0' desativa o efeito ripple do botão. */\n\t\tripple: \"1\",\n\t\t/** Anel de foco dos campos de formulário. Use 'none' para campos sem sobra. */\n\t\t\"focus-ring\":\n\t\t\t\"0 0 0 3px color-mix(in srgb, var(--fx-color-primary) 22%, transparent)\",\n\t},\n\tz: { 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\tfenix: register({\n\t\tname: \"fenix\",\n\t\tlabel: \"Fenix (padrão)\",\n\t\ttokens: { effect: { \"focus-ring\": \"none\" } },\n\t}),\n\tseiya: register({\n\t\tname: \"seiya\",\n\t\tlabel: \"Seiya\",\n\t\ttokens: {\n\t\t\tcolor: {\n\t\t\t\tprimary: \"#e11d48\",\n\t\t\t\tsecondary: \"#fb7185\",\n\t\t\t\tinfo: \"#f43f5e\",\n\t\t\t\tdanger: \"#be123c\",\n\t\t\t},\n\t\t\tradius: { sm: \"6px\", md: \"10px\", lg: \"16px\" },\n\t\t\teffect: {\n\t\t\t\t\"focus-ring\": \"none\",\n\t\t\t},\n\t\t},\n\t}),\n\tshiryu: register({\n\t\tname: \"shiryu\",\n\t\tlabel: \"Shiryu\",\n\t\ttokens: {\n\t\t\tcolor: {\n\t\t\t\tprimary: \"#0d9488\",\n\t\t\t\tsecondary: \"#2dd4bf\",\n\t\t\t\tsuccess: \"#059669\",\n\t\t\t\tinfo: \"#14b8a6\",\n\t\t\t},\n\t\t\tradius: { sm: \"4px\", md: \"8px\", lg: \"14px\" },\n\t\t\teffect: {\n\t\t\t\t\"focus-ring\": \"none\",\n\t\t\t},\n\t\t},\n\t}),\n\thyoga: register({\n\t\tname: \"hyoga\",\n\t\tlabel: \"Hyoga\",\n\t\ttokens: {\n\t\t\tcolor: {\n\t\t\t\tprimary: \"#0284c7\",\n\t\t\t\tsecondary: \"#38bdf8\",\n\t\t\t\tinfo: \"#06b6d4\",\n\t\t\t\tdanger: \"#e11d48\",\n\t\t\t},\n\t\t\tsurface: { surface: \"#f0f9ff\", \"surface-hover\": \"#e0f2fe\" },\n\t\t\tradius: { sm: \"8px\", md: \"12px\", lg: \"18px\" },\n\t\t},\n\t}),\n\tshun: register({\n\t\tname: \"shun\",\n\t\tlabel: \"Shun\",\n\t\ttokens: {\n\t\t\tcolor: {\n\t\t\t\tprimary: \"#db2777\",\n\t\t\t\tsecondary: \"#f472b6\",\n\t\t\t\tinfo: \"#ec4899\",\n\t\t\t\twarning: \"#c026d3\",\n\t\t\t},\n\t\t\tradius: { sm: \"10px\", md: \"14px\", lg: \"20px\" },\n\t\t},\n\t}),\n\tikki: register({\n\t\tname: \"ikki\",\n\t\tlabel: \"Ikki\",\n\t\ttokens: {\n\t\t\tcolor: {\n\t\t\t\tprimary: \"#ea580c\",\n\t\t\t\tsecondary: \"#fb923c\",\n\t\t\t\tdanger: \"#dc2626\",\n\t\t\t\twarning: \"#f59e0b\",\n\t\t\t},\n\t\t\tradius: { sm: \"2px\", md: \"4px\", lg: \"6px\" },\n\t\t},\n\t}),\n\taiolia: register({\n\t\tname: \"aiolia\",\n\t\tlabel: \"Aiolia\",\n\t\ttokens: {\n\t\t\tcolor: {\n\t\t\t\tprimary: \"#b45309\",\n\t\t\t\tsecondary: \"#f59e0b\",\n\t\t\t\twarning: \"#eab308\",\n\t\t\t\tinfo: \"#84cc16\",\n\t\t\t},\n\t\t\tradius: { sm: \"6px\", md: \"12px\", lg: \"20px\" },\n\t\t\teffect: {\n\t\t\t\t\"focus-ring\": \"none\",\n\t\t\t},\n\t\t},\n\t}),\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(_name: string, _oldValue: string | null, _newValue: string | null): 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}","/**\n * Tipagens de propriedades + augmentations JSX do FenixUI.\n *\n * Importar este módulo — diretamente (`@wrrdev/fenix-ui/jsx`) ou via o\n * índice principal (`@wrrdev/fenix-ui`) — habilita, no TypeScript:\n *\n * 1. autocomplete + validação de atributos em templates JSX/TSX;\n * 2. tipos nomeados (`FxButtonProps`, `FxInputProps`, …) para wrappers ou código imperativo.\n *\n * A biblioteca NÃO depende de React/Vue: os atributos comuns\n * (`className`, `onClick`, `style`, `children`, …) são aceitos via assinatura\n * de índice, funcionando com qualquer runtime JSX.\n */\n\nimport type { FxElementProps, FxSize } from './types';\n\n/** Marcador de runtime: permite `import '@wrrdev/fenix-ui/jsx'` como side-effect import. */\nexport const FX_JSX_TYPES = true as const;\n\n/* Uniões auxiliares (variants, enums) */\nexport type FxButtonVariant = 'primary' | 'secondary' | 'success' | 'warning' | 'danger' | 'info' | 'ghost' | 'outline';\nexport type FxBadgeVariant = 'default' | 'primary' | 'success' | 'warning' | 'danger' | 'info';\nexport type FxAlertVariant = 'info' | 'success' | 'warning' | 'danger';\nexport type FxProgressVariant = 'primary' | 'success' | 'warning' | 'danger';\nexport type FxSkeletonVariant = 'text' | 'circle' | 'rect';\nexport type FxFloatlabelVariant = 'on' | 'in' | 'over';\nexport type FxInputType = 'text' | 'number' | 'email' | 'password' | 'search' | 'tel' | 'url';\nexport type FxFieldStatus = 'error' | 'invalid' | 'success' | 'valid';\nexport type FxToastKind = 'success' | 'error' | 'info' | 'warning';\nexport type FxToastPosition = 'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right';\nexport type FxTooltipPosition = 'top' | 'bottom' | 'left' | 'right';\nexport type FxDrawerPosition = 'left' | 'right' | 'top' | 'bottom';\nexport type FxDropdownPosition = 'left' | 'center' | 'right' | 'bottom-left' | 'bottom-right';\nexport type FxPaginationPosition = 'left' | 'center' | 'right';\nexport type FxChipVariant = 'primary' | 'secondary' | 'success' | 'warning' | 'danger' | 'info';\nexport type FxAvatarVariant = 'image' | 'text' | 'icon';\nexport type FxAvatarShape = 'circle' | 'rounded' | 'square';\nexport type FxCardVariant = 'elevated' | 'flat' | 'outline' | 'ghost';\n/** Arredondamento do container do card. */\nexport type FxCardRadius = 'sm' | 'md' | 'lg';\nexport type FxPopoverTrigger = 'click' | 'hover';\nexport type FxPopoverPosition = 'auto' | 'top' | 'bottom';\nexport type FxMenuOrientation = 'horizontal' | 'vertical';\nexport type FxTimelineOrientation = 'vertical' | 'horizontal';\nexport type FxSelectionMode = 'single' | 'multiple';\n\n/* Props por componente */\nexport interface FxButtonProps extends FxElementProps {\n variant?: FxButtonVariant;\n type?: 'button' | 'submit' | 'reset';\n size?: FxSize;\n loading?: boolean;\n full?: boolean;\n icon?: string;\n 'icon-pos'?: 'left' | 'right';\n}\nexport interface FxBadgeProps extends FxElementProps {\n variant?: FxBadgeVariant;\n round?: boolean;\n}\nexport interface FxSpinnerProps extends FxElementProps { size?: FxSize; }\nexport interface FxInputProps extends FxElementProps {\n type?: FxInputType;\n size?: FxSize;\n placeholder?: string;\n readonly?: boolean;\n min?: string | number;\n max?: string | number;\n step?: string | number;\n clearable?: boolean;\n full?: boolean;\n icon?: string;\n 'icon-pos'?: 'left' | 'right';\n error?: boolean;\n invalid?: boolean;\n success?: boolean;\n valid?: boolean;\n}\nexport interface FxSelectProps extends FxElementProps {\n value?: string;\n size?: FxSize;\n placeholder?: string;\n searchable?: boolean;\n clearable?: boolean;\n 'search-placeholder'?: string;\n 'no-results'?: string;\n full?: boolean;\n error?: boolean;\n invalid?: boolean;\n success?: boolean;\n valid?: boolean;\n}\nexport interface FxSwitchProps extends FxElementProps { checked?: boolean; size?: FxSize; }\nexport interface FxCheckboxProps extends FxElementProps {\n checked?: boolean;\n indeterminate?: boolean;\n value?: string;\n size?: FxSize;\n}\nexport interface FxRadioProps extends FxElementProps {\n checked?: boolean;\n value?: string;\n name?: string;\n size?: FxSize;\n}\nexport interface FxTextareaProps extends FxElementProps {\n value?: string;\n size?: FxSize;\n placeholder?: string;\n readonly?: boolean;\n rows?: number;\n maxlength?: number;\n full?: boolean;\n error?: boolean;\n invalid?: boolean;\n success?: boolean;\n valid?: boolean;\n}\nexport interface FxMultiselectProps extends FxElementProps {\n values?: string;\n size?: FxSize;\n placeholder?: string;\n searchable?: boolean;\n clearable?: boolean;\n open?: boolean;\n full?: boolean;\n error?: boolean;\n invalid?: boolean;\n success?: boolean;\n valid?: boolean;\n}\nexport interface FxCalendarProps extends FxElementProps {\n value?: string;\n start?: string;\n end?: string;\n min?: string;\n max?: string;\n mode?: 'single' | 'range' | 'multiple';\n values?: string;\n locale?: string;\n disabled?: boolean;\n}\nexport interface FxDatepickerProps extends FxElementProps {\n value?: string;\n start?: string;\n end?: string;\n values?: string;\n mode?: 'single' | 'range' | 'multiple';\n min?: string;\n max?: string;\n placeholder?: string;\n size?: FxSize;\n format?: string;\n 'show-time'?: boolean;\n 'free-text'?: boolean;\n clearable?: boolean;\n full?: boolean;\n error?: boolean;\n invalid?: boolean;\n success?: boolean;\n valid?: boolean;\n}\nexport interface FxTableProps extends FxElementProps {\n pagination?: boolean;\n rows?: number;\n 'rows-options'?: string;\n striped?: boolean;\n 'empty-message'?: string;\n 'pagination-position'?: FxPaginationPosition;\n total?: number;\n page?: number;\n}\nexport interface FxFloatlabelProps extends FxElementProps {\n variant?: FxFloatlabelVariant;\n full?: boolean;\n error?: boolean;\n invalid?: boolean;\n success?: boolean;\n valid?: boolean;\n active?: boolean;\n 'error-text'?: string;\n}\nexport interface FxDialogProps extends FxElementProps { open?: boolean; size?: FxSize; heading?: string; }\nexport interface FxDrawerProps extends FxElementProps { open?: boolean; title?: string; position?: FxDrawerPosition; }\nexport interface FxToastProps extends FxElementProps {\n kind?: FxToastKind;\n title?: string;\n message?: string;\n duration?: number;\n position?: FxToastPosition;\n /** Força o esquema de cores do card independentemente do tema global. */\n mode?: 'light' | 'dark';\n}\nexport interface FxTooltipProps extends FxElementProps { content?: string; position?: FxTooltipPosition; }\nexport interface FxTabsProps extends FxElementProps { value?: string; }\nexport interface FxTabPanelProps extends FxElementProps { tab?: string; hidden?: boolean; }\nexport interface FxProgressProps extends FxElementProps {\n value?: number;\n indeterminate?: boolean;\n variant?: FxProgressVariant;\n label?: string;\n 'hide-label'?: boolean;\n size?: FxSize;\n}\nexport interface FxSkeletonProps extends FxElementProps {\n variant?: FxSkeletonVariant;\n width?: string;\n height?: string;\n lines?: number;\n}\nexport interface FxAlertProps extends FxElementProps { variant?: FxAlertVariant; title?: string; dismissible?: boolean; }\nexport interface FxDropdownProps extends FxElementProps { label?: string; position?: FxDropdownPosition; open?: boolean; }\nexport interface FxDropdownItemProps extends FxElementProps { value?: string; }\nexport interface FxPaginationProps extends FxElementProps {\n page?: number;\n total?: number;\n rows?: number;\n 'rows-options'?: string;\n position?: FxPaginationPosition;\n}\nexport interface FxAutocompleteProps extends FxElementProps {\n value?: string;\n size?: FxSize;\n placeholder?: string;\n source?: string;\n disabled?: boolean;\n 'min-chars'?: number;\n full?: boolean;\n}\nexport interface FxFileUploadProps extends FxElementProps {\n mode?: 'basic' | 'advanced';\n size?: FxSize;\n severity?: 'primary' | 'secondary' | 'success' | 'warning' | 'danger' | 'info';\n label?: string;\n icon?: string;\n accept?: string;\n multiple?: boolean;\n disabled?: boolean;\n 'show-progress'?: boolean;\n progress?: number;\n full?: boolean;\n}\n\n/* Props dos componentes de layout/dados/navegação/feedback */\nexport interface FxSliderProps extends FxElementProps {\n value?: number;\n min?: number;\n max?: number;\n step?: number;\n size?: FxSize;\n 'show-value'?: boolean;\n}\nexport interface FxStepperProps extends FxElementProps {\n active?: number;\n linear?: boolean;\n 'show-numbers'?: boolean;\n}\nexport interface FxChipProps extends FxElementProps {\n variant?: FxChipVariant;\n size?: FxSize;\n icon?: string;\n removable?: boolean;\n selectable?: boolean;\n selected?: boolean;\n}\nexport interface FxAvatarProps extends FxElementProps {\n variant?: FxAvatarVariant;\n src?: string;\n alt?: string;\n size?: FxSize;\n shape?: FxAvatarShape;\n}\nexport interface FxCardProps extends FxElementProps {\n variant?: FxCardVariant;\n /** Arredondamento do container (radius sm/md/lg). */\n radius?: FxCardRadius;\n /** @deprecated use `radius`. */\n size?: FxSize;\n padded?: boolean;\n heading?: string;\n}\nexport interface FxBreadcrumbProps extends FxElementProps {\n size?: FxSize;\n separator?: string;\n}\nexport interface FxPopoverProps extends FxElementProps {\n open?: boolean;\n target?: string;\n trigger?: FxPopoverTrigger;\n position?: FxPopoverPosition;\n dismissible?: boolean;\n}\nexport interface FxRatingProps extends FxElementProps {\n value?: number;\n max?: number;\n readonly?: boolean;\n 'allow-half'?: boolean;\n size?: FxSize;\n}\nexport interface FxMenuProps extends FxElementProps {\n orientation?: FxMenuOrientation;\n size?: FxSize;\n titles?: string;\n}\nexport interface FxToggleButtonGroupProps extends FxElementProps {\n multiple?: boolean;\n value?: string;\n size?: FxSize;\n}\nexport interface FxEmptyStateProps extends FxElementProps {\n icon?: string;\n heading?: string;\n description?: string;\n}\nexport interface FxPasswordStrengthProps extends FxElementProps {\n value?: string;\n size?: FxSize;\n}\nexport interface FxTimelineProps extends FxElementProps {\n orientation?: FxTimelineOrientation;\n size?: FxSize;\n marker?: string;\n}\nexport interface FxCarouselProps extends FxElementProps {\n active?: number;\n 'show-arrows'?: boolean;\n 'show-indicators'?: boolean;\n loop?: boolean;\n autoplay?: number;\n}\nexport interface FxTreeProps extends FxElementProps {\n data?: string;\n 'expand-all'?: boolean;\n size?: FxSize;\n}\nexport interface FxConfirmPopupProps extends FxElementProps {\n open?: boolean;\n target?: string;\n message?: string;\n icon?: string;\n 'accept-label'?: string;\n 'reject-label'?: string;\n position?: FxPopoverPosition;\n}\nexport interface FxKnobProps extends FxElementProps {\n value?: number;\n min?: number;\n max?: number;\n step?: number;\n size?: FxSize;\n 'stroke-width'?: number;\n 'value-color'?: string;\n 'range-color'?: string;\n 'value-template'?: string;\n readonly?: boolean;\n}\nexport interface FxAccordionProps extends FxElementProps {\n value?: string;\n multiple?: boolean;\n}\nexport interface FxAccordionPanelProps extends FxElementProps {\n value?: string;\n header?: string;\n}\nexport interface FxOrderListProps extends FxElementProps {\n data?: string;\n 'data-key'?: string;\n filter?: boolean;\n 'filter-by'?: string;\n 'filter-placeholder'?: string;\n dragdrop?: boolean;\n striped?: boolean;\n 'selection-mode'?: FxSelectionMode;\n 'show-select-all'?: boolean;\n}\nexport interface FxPickListProps extends FxElementProps {\n source?: string;\n target?: string;\n 'source-key'?: string;\n 'target-key'?: string;\n filter?: boolean;\n 'filter-by'?: string;\n 'source-label'?: string;\n 'target-label'?: string;\n 'selection-mode'?: FxSelectionMode;\n 'show-select-all'?: boolean;\n striped?: boolean;\n}\n/* Augmentation global de JSX (React clássico/TSX, Preact, Vue JSX, …).\n Cada tag fx-* recebe autocomplete + validação de atributos.\n A interface é exportada para que o módulo opt-in `@wrrdev/fenix-ui/react`\n também registre as tags em React.JSX (usado quando \"jsx\": \"react-jsx\"). */\nexport interface FxJsxIntrinsicElements {\n 'fx-button': FxButtonProps;\n 'fx-badge': FxBadgeProps;\n 'fx-spinner': FxSpinnerProps;\n 'fx-input': FxInputProps;\n 'fx-select': FxSelectProps;\n 'fx-switch': FxSwitchProps;\n 'fx-checkbox': FxCheckboxProps;\n 'fx-radio': FxRadioProps;\n 'fx-textarea': FxTextareaProps;\n 'fx-multiselect': FxMultiselectProps;\n 'fx-calendar': FxCalendarProps;\n 'fx-datepicker': FxDatepickerProps;\n 'fx-table': FxTableProps;\n 'fx-floatlabel': FxFloatlabelProps;\n 'fx-dialog': FxDialogProps;\n 'fx-drawer': FxDrawerProps;\n 'fx-toast': FxToastProps;\n 'fx-tooltip': FxTooltipProps;\n 'fx-tabs': FxTabsProps;\n 'fx-tab-panel': FxTabPanelProps;\n 'fx-progress': FxProgressProps;\n 'fx-skeleton': FxSkeletonProps;\n 'fx-alert': FxAlertProps;\n 'fx-dropdown': FxDropdownProps;\n 'fx-dropdown-item': FxDropdownItemProps;\n 'fx-pagination': FxPaginationProps;\n 'fx-autocomplete': FxAutocompleteProps;\n 'fx-fileupload': FxFileUploadProps;\n 'fx-slider': FxSliderProps;\n 'fx-chip': FxChipProps;\n 'fx-avatar': FxAvatarProps;\n 'fx-card': FxCardProps;\n 'fx-breadcrumb': FxBreadcrumbProps;\n 'fx-popover': FxPopoverProps;\n 'fx-stepper': FxStepperProps;\n 'fx-rating': FxRatingProps;\n 'fx-menu': FxMenuProps;\n 'fx-toggle-button-group': FxToggleButtonGroupProps;\n 'fx-empty-state': FxEmptyStateProps;\n 'fx-password-strength': FxPasswordStrengthProps;\n 'fx-timeline': FxTimelineProps;\n 'fx-carousel': FxCarouselProps;\n 'fx-tree': FxTreeProps;\n 'fx-confirmpopup': FxConfirmPopupProps;\n 'fx-knob': FxKnobProps;\n 'fx-accordion': FxAccordionProps;\n 'fx-accordion-panel': FxAccordionPanelProps;\n 'fx-orderlist': FxOrderListProps;\n 'fx-picklist': FxPickListProps;\n}\ndeclare global {\n namespace JSX {\n interface IntrinsicElements extends FxJsxIntrinsicElements {}\n }\n}\n\n/* Tipagem imperativa: document.createElement('fx-...').\n As tags abaixo não declaradas nos próprios componentes ganham tipagem aqui;\n as demais (alert, dialog, drawer, dropdown, pagination, progress, skeleton,\n tabs, textarea, toast, tooltip, autocomplete) já são tipadas com a classe\n concreta nos respectivos index.ts. */\ndeclare global {\n interface HTMLElementTagNameMap {\n 'fx-button': HTMLElement;\n 'fx-badge': HTMLElement;\n 'fx-spinner': HTMLElement;\n 'fx-input': HTMLElement;\n 'fx-select': HTMLElement;\n 'fx-switch': HTMLElement;\n 'fx-checkbox': HTMLElement;\n 'fx-radio': HTMLElement;\n 'fx-multiselect': HTMLElement;\n 'fx-calendar': HTMLElement;\n 'fx-datepicker': HTMLElement;\n 'fx-table': HTMLElement;\n 'fx-floatlabel': HTMLElement;\n 'fx-accordion': HTMLElement;\n 'fx-accordion-panel': HTMLElement;\n 'fx-orderlist': HTMLElement;\n 'fx-picklist': HTMLElement;\n }\n}\n","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\nimport { FENIX_ICON_BASE_CSS, fenixIconHtml } from '../../icons/base-css';\n\n/**\n * <fx-button> — Componente de ação (piloto).\n *\n * Atributos: variant, size, disabled, loading, type, full (largura 100%\n * acompanhando o elemento pai), icon (nome do glifo Fenix Icons ou\n * emoji/texto livre) e icon-pos (left|right, padrão left).\n * Slots: default (rótulo), `icon` (ícone customizado — vence o atributo).\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 ${FENIX_ICON_BASE_CSS}\n :host {\n display: inline-block;\n vertical-align: middle;\n }\n /* Full width: o host inline-block é shrink-to-fit, então precisa virar\n block para o 100% do .btn interno ter contra o que esticar. */\n :host([full]) {\n display: block;\n width: 100%;\n max-width: 100%;\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: none;\n box-shadow: var(--fx-effect-focus-ring, none);\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='info']) .btn { background: var(--fx-color-info); }\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; align-items: center; font-size: var(--fx-button-icon-size, calc(var(--fx-font-size) + 6px)); line-height: 1; }\n .btn__icon[hidden] { display: none; }\n .btn__label { display: inline-flex; align-items: center; justify-content: center; }\n /* Icon-only: a label some (o gap do flex some junto) e o botão vira\n quadrado com padding simétrico — ícone perfeitamente centralizado. */\n .btn--icon-only { padding-left: var(--fx-space-md); padding-right: var(--fx-space-md); }\n .btn--icon-only .btn__label { display: none; }\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', 'icon', 'icon-pos'];\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 const icon = this.getAttr('icon');\n const iconRight = this.getAttr('icon-pos', 'left') === 'right';\n // Slot `icon` vence o atributo `icon`; sem nenhum dos dois, sem ícone.\n const slottedIcon = this.querySelector<HTMLElement>('[slot=\"icon\"]');\n const iconContent = slottedIcon\n ? '<slot name=\"icon\"></slot>'\n : (icon ? fenixIconHtml(icon) : '');\n\n this.setTemplate(`\n <button class=\"btn\" part=\"button\" type=\"${btnType}\">\n ${!iconRight ? `<span class=\"btn__icon\" part=\"icon\">${iconContent}</span>` : ''}\n <span class=\"btn__label\" part=\"label\"><slot></slot></span>\n ${iconRight ? `<span class=\"btn__icon\" part=\"icon\">${iconContent}</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 vazio, evitando espaço fantasma\n // do `gap` que descentraliza o rótulo.\n const hasIcon = iconContent.trim() !== '';\n for (const wrap of this.root.querySelectorAll<HTMLElement>('.btn__icon')) {\n wrap.toggleAttribute('hidden', !hasIcon);\n }\n\n // Icon-only: sem texto no slot default, o botão vira quadrado\n // (padding simétrico) em vez de retangular largo.\n const hasLabel = [...(this.childNodes ?? [])].some((n) =>\n n.nodeType === Node.ELEMENT_NODE\n ? (n as Element).getAttribute?.('slot') !== 'icon'\n : (n.textContent ?? '').trim() !== '',\n );\n btn.classList.toggle('btn--icon-only', !hasLabel && 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';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\nimport { esc } from '../../core/sanitize';\n\n/**\n * <fx-select> — Campo de seleção com dropdown customizado.\n *\n * Escreva os filhos como `<option>` nativos no light DOM; eles são\n * espelhados automaticamente (MutationObserver):\n *\n * <fx-select value=\"b\" searchable clearable>\n * <option value=\"a\">Opção A</option>\n * <option value=\"b\">Opção B</option>\n * </fx-select>\n *\n * Atributos: value, size (sm|md|lg), disabled, placeholder,\n * searchable, clearable, search-placeholder, no-results.\n * Evento: `change` (composed, detail: { value }).\n */\nexport class FxSelect 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 /* Largura no HOST (padrão: conteúdo com mín. 200px). CSS externo, classes\n e style inline no elemento definem a largura sem precisar do full. */\n width: var(--fx-select-width, max-content);\n min-width: var(--fx-select-min-width, 200px);\n }\n .trigger {\n display: inline-flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--fx-space-sm);\n box-sizing: border-box;\n min-height: var(--fx-size-md);\n /* Acompanha a largura definida no :host. */\n width: 100%;\n font: inherit;\n font-weight: var(--fx-font-weight);\n color: var(--fx-text-default);\n text-align: left;\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-xs) var(--fx-space-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 .trigger:hover { border-color: var(--fx-border-hover); }\n .trigger:focus-visible,\n :host([open]) .trigger {\n outline: none;\n border-color: var(--fx-color-primary);\n box-shadow: var(--fx-effect-focus-ring, none);\n }\n :host([size='sm']) { min-width: var(--fx-select-min-width-sm, 180px); }\n :host([size='sm']) .trigger { min-height: var(--fx-size-sm); }\n :host([size='lg']) .trigger { min-height: var(--fx-size-lg); font-size: calc(var(--fx-font-size) + 4px); }\n /* Full width: o host estica até o pai e o trigger acompanha. */\n :host([full]) { display: block; width: 100%; }\n :host([full]) { min-width: 0; }\n :host([full]) .trigger { width: 100%; min-width: 0; }\n :host([full]) .panel { width: 100%; }\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 :host([disabled]) .trigger,\n .trigger[aria-disabled='true'] { opacity: 0.55; cursor: not-allowed; background-color: var(--fx-surface-surface-hover); }\n /* O rótulo encolhe (ellipsis) e os ícones NUNCA saem do campo. */\n .label,\n .placeholder {\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .placeholder { color: var(--fx-text-muted); }\n .actions {\n display: inline-flex;\n align-items: center;\n gap: var(--fx-space-xs, 8px);\n flex-shrink: 0;\n }\n .caret { font-size: calc(var(--fx-font-size) - 3px); color: var(--fx-text-muted); pointer-events: none; }\n\n /* Painel do dropdown */\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%, 220px);\n max-height: 260px;\n overflow-y: auto;\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 }\n :host([open]) .panel { display: block; }\n .search {\n position: sticky;\n top: 0;\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 .opt {\n display: block;\n width: 100%;\n text-align: left;\n font: inherit;\n color: var(--fx-text-default);\n background: none;\n border: none;\n padding: var(--fx-space-sm) var(--fx-space-md);\n cursor: pointer;\n }\n /* Hover e selecionado com a cor primária do tema (igual ao multiselect). */\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) 18%, transparent);\n color: var(--fx-color-primary);\n font-weight: var(--fx-font-weight);\n }\n .empty { padding: var(--fx-space-sm) var(--fx-space-md); color: var(--fx-text-muted); }\n\n /* Clearable */\n .clear {\n border: none;\n background: transparent;\n color: var(--fx-text-muted);\n font-size: calc(var(--fx-font-size) + 2px);\n line-height: 1;\n cursor: pointer;\n padding: 0;\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 no change não pode\n // re-renderizar o template e fechar o dropdown.\n static override get observedAttributes(): string[] {\n // `invalid`/`valid` são aliases aceitos no CSS; sem observá-los o\n // setAttribute no submit não re-renderiza.\n return ['size', 'disabled', 'placeholder', 'searchable', 'clearable', 'error', 'invalid', 'success', 'valid'];\n }\n\n private observer?: MutationObserver;\n private docListener?: (e: Event) => void;\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 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 super.connectedCallback();\n // Espelha mudanças nas <option> do light DOM.\n this.observer = new MutationObserver(() => this.render());\n this.observer.observe(this, { childList: true, subtree: true, characterData: true });\n // Fecha o dropdown 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 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 private select(value: string): void {\n this.value = value;\n this.removeAttribute('open');\n this.render();\n this.dispatchEvent(\n new CustomEvent('change', { bubbles: true, composed: true, detail: { value } }),\n );\n }\n\n /** Navegação por teclado entre as opções do listbox (WCAG 2.1.1). */\n private _navigateOptions(e: KeyboardEvent): void {\n e.preventDefault();\n if (!this.hasAttr('open')) {\n this.toggleAttribute('open');\n this.render();\n }\n const opts = Array.from(this.root.querySelectorAll<HTMLButtonElement>('.opt'));\n if (!opts.length) return;\n const current = opts.indexOf(this.root.activeElement as HTMLButtonElement);\n let next = 0;\n if (e.key === 'ArrowDown') next = current === -1 ? 0 : Math.min(current + 1, opts.length - 1);\n else if (e.key === 'ArrowUp') next = current === -1 ? opts.length - 1 : Math.max(current - 1, 0);\n else if (e.key === 'Home') next = 0;\n else if (e.key === 'End') next = opts.length - 1;\n opts[next]?.focus();\n }\n\n protected override render(): void {\n const prevOpen = this.hasAttr('open');\n const prevSearch = this.root.querySelector<HTMLInputElement>('.search');\n // Estado do campo de busca antes de re-renderizar (valor, foco e cursor).\n const search = prevSearch?.value ?? '';\n const searchFocused =\n prevSearch != null && this.root.activeElement === prevSearch;\n const caretPos = searchFocused ? prevSearch!.selectionStart : null;\n\n const opts = this.options;\n let current = this.getAttr('value');\n if (!current) {\n const explicit = this.querySelector('option[selected]');\n current = explicit?.getAttribute('value') ?? explicit?.textContent?.trim() ?? '';\n }\n const selectedLabel = opts.find((o) => o.value === current)?.label ?? '';\n const placeholder = this.getAttr('placeholder', 'Selecione…');\n\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=\"${prevOpen}\">\n <span class=\"${selectedLabel ? 'label' : 'placeholder'}\">${esc(selectedLabel) || esc(placeholder)}</span>\n <span class=\"actions\">\n ${this.hasAttr('clearable') && current ? '<button type=\"button\" class=\"clear\" part=\"clear\" aria-label=\"Limpar\">×</button>' : ''}\n <span class=\"caret\">▼</span>\n </span>\n </span>\n <div class=\"panel\" part=\"panel\" role=\"listbox\">\n ${this.hasAttr('searchable') ? `<input class=\"search\" part=\"search\" type=\"text\" placeholder=\"${esc(this.getAttr('search-placeholder', 'Pesquisar…'))}\">` : ''}\n ${filtered.map((o) => `\n <button type=\"button\" class=\"opt\" role=\"option\" data-value=\"${esc(o.value)}\"\n aria-selected=\"${o.value === current}\">${esc(o.label)}</button>`).join('')}\n ${filtered.length === 0 ? `<div class=\"empty\">${esc(this.getAttr('no-results', 'Nenhum resultado'))}</div>` : ''}\n </div>\n `);\n\n if (prevOpen) this.setAttribute('open', '');\n const searchInput = this.root.querySelector<HTMLInputElement>('.search');\n if (searchInput) {\n searchInput.value = search;\n searchInput.addEventListener('input', () => this.render());\n searchInput.addEventListener('click', (e) => e.stopPropagation());\n // Re-render não pode roubar o foco nem perder a posição do cursor.\n if (searchFocused) {\n searchInput.focus();\n try { searchInput.setSelectionRange(caretPos!, caretPos!); } catch { /* type=text sempre suporta */ }\n }\n }\n\n const trigger = this.root.querySelector<HTMLElement>('.trigger');\n if (!trigger) return;\n if (this.disabled) trigger.setAttribute('aria-disabled', 'true');\n\n trigger.addEventListener('click', (e) => {\n if (this.disabled) return;\n if ((e.target as HTMLElement).closest('.clear')) return;\n this.toggleAttribute('open');\n this.render();\n this.root.querySelector<HTMLInputElement>('.search')?.focus();\n });\n\n // Teclado: Enter/Espaço abrem o dropdown; setas/Home/End/Escape navegam.\n trigger.addEventListener('keydown', (e) => {\n if (this.disabled) return;\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n trigger.click();\n return;\n }\n if (e.key === 'Escape') {\n if (this.hasAttr('open')) {\n this.removeAttribute('open');\n this.render();\n this.root.querySelector<HTMLElement>('.trigger')?.focus();\n }\n return;\n }\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp' || e.key === 'Home' || e.key === 'End') {\n this._navigateOptions(e);\n }\n });\n\n // Limpar.\n this.root.querySelector('.clear')?.addEventListener('click', (e) => {\n e.stopPropagation();\n this.value = '';\n this.removeAttribute('open');\n this.render();\n this.dispatchEvent(\n new CustomEvent('change', { bubbles: true, composed: true, detail: { value: '' } }),\n );\n });\n\n // Escolher opção.\n this.root.querySelectorAll<HTMLElement>('.opt').forEach((opt) => {\n opt.addEventListener('click', () => this.select(opt.dataset.value!));\n });\n }\n}\n\nexport function defineFxSelect(): typeof FxSelect {\n return defineElement('fx-select', FxSelect);\n}\n\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';\nimport { esc } from '../../core/sanitize';\nimport { FENIX_ICON_BASE_CSS, fenixIconHtml } from '../../icons/base-css';\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 * full (largura 100% acompanhando o elemento pai), icon (nome do glifo Fenix Icons\n * ou emoji/texto livre) e icon-pos (left|right, padrão left).\n * Largura: o default (260px; sm 220px / lg 300px) fica no HOST via tokens\n * --fx-input-width(-sm|-lg) — CSS externo, classes e style inline no elemento\n * vencem o default sem precisar de atributo.\n * Slots: `icon` (ícone customizado no lugar do atributo).\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 /* Largura padrão no HOST (e não no .field interno): assim CSS externo,\n classes do framework (ex.: w-full) e style inline no elemento vencem\n este default naturalmente — regras do documento têm precedência sobre\n :host. Default global trocável via token: --fx-input-width (-sm/-lg). */\n width: var(--fx-input-width, 260px);\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 /* Acompanha a largura definida no :host. */\n width: 100%;\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']) { width: var(--fx-input-width-sm, 220px); }\n :host([size='sm']) .field { padding: var(--fx-space-sm) var(--fx-space-md); font-size: var(--fx-font-size); min-height: var(--fx-size-sm); }\n :host([size='lg']) { width: var(--fx-input-width-lg, 300px); }\n :host([size='lg']) .field { padding: var(--fx-space-lg) var(--fx-space-xl); font-size: calc(var(--fx-font-size) + 4px); min-height: var(--fx-size-lg); }\n /* Full width: o host estica até o pai e o campo interno acompanha\n (usar com um container de largura controlada, ex. w-full no Vue). */\n :host([full]) { display: block; width: 100%; }\n :host([full]) .field { width: 100%; }\n /* Clearable */\n :host([clearable]) { position: relative; display: inline-flex; }\n :host([clearable][full]) { display: block; }\n .wrap { position: relative; display: inline-flex; align-items: center; width: 100%; }\n :host([full]) .wrap { display: flex; width: 100%; }\n :host([clearable]) .field { padding-right: var(--fx-space-xl); }\n :host([clearable][full]) .field { flex: 1 1 auto; }\n /* Ícones (attr icon + slot icon) — DENTRO do campo, sobre o padding\n (padrão Material/PrimeVue). Tamanho ajustável via --fx-input-icon-size. */\n .field-icon {\n position: relative;\n display: inline-flex;\n box-sizing: border-box;\n width: 100%;\n }\n .field-icon .field { flex: 1 1 auto; min-width: 0; }\n :host([full]) .field-icon { display: flex; width: 100%; }\n .field-icon .fx-icon,\n .field-icon ::slotted([slot='icon']) {\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-size: var(--fx-input-icon-size, calc(var(--fx-font-size) + 6px));\n line-height: 1;\n color: var(--fx-text-muted);\n pointer-events: none;\n z-index: 1;\n }\n .field-icon.icon-left .fx-icon,\n .field-icon.icon-left ::slotted([slot='icon']) { left: var(--fx-space-md); }\n .field-icon.icon-right .fx-icon,\n .field-icon.icon-right ::slotted([slot='icon']) { right: var(--fx-space-md); }\n /* padding = posição do ícone + largura + folga extra para o texto\n não colar no glifo. */\n .field-icon.icon-left .field {\n padding-left: calc(var(--fx-input-icon-size, calc(var(--fx-font-size) + 6px)) + var(--fx-space-md) + var(--fx-space-sm));\n }\n .field-icon.icon-right .field {\n padding-right: calc(var(--fx-input-icon-size, calc(var(--fx-font-size) + 6px)) + var(--fx-space-md) + var(--fx-space-sm));\n }\n /* icon-pos right + clearable: desloca o × para não sobrepor o ícone. */\n .field-icon.icon-right + .clear {\n right: calc(var(--fx-input-icon-size, calc(var(--fx-font-size) + 6px)) + var(--fx-space-lg));\n }\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 /* Base dos glifos Fenix Icons (o @font-face vem de @wrrdev/fenix-ui/icons). */\n ${FENIX_ICON_BASE_CSS}\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 // `error`/`success` (+ aliases `invalid`/`valid`) PRECISAM ser observados:\n // é assim que o toggle no playground / setAttribute no submit re-renderiza.\n static override get observedAttributes(): string[] {\n return [\n 'type', 'size', 'placeholder',\n 'disabled', 'readonly', 'min', 'max', 'step',\n 'icon', 'icon-pos', 'error', 'invalid', 'success', 'valid',\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 const icon = this.getAttr('icon');\n const iconPos = this.getAttr('icon-pos', 'left') === 'right' ? 'right' : 'left';\n // Slot `icon` vence o atributo `icon`; sem nenhum dos dois, sem ícone.\n const slottedIcon = this.querySelector<HTMLElement>('[slot=\"icon\"]');\n const iconContent = slottedIcon\n ? '<slot name=\"icon\" part=\"icon\"></slot>'\n : (icon ? fenixIconHtml(icon) : '');\n const useIconBox = Boolean(iconContent);\n\n this.setTemplate(`\n ${this.hasAttr('clearable') ? '<div class=\"wrap\" part=\"wrap\">' : ''}\n ${useIconBox ? `<div class=\"field-icon icon-${iconPos}\">` : ''}\n ${useIconBox && iconPos === 'left' ? iconContent : ''}\n <input class=\"field\" part=\"input\" type=\"${esc(type)}\"\n ${placeholder ? `placeholder=\"${esc(placeholder)}\"` : ''}\n ${min ? `min=\"${esc(min)}\"` : ''} ${max ? `max=\"${esc(max)}\"` : ''} ${step ? `step=\"${esc(step)}\"` : ''}\n />\n ${useIconBox && iconPos === 'right' ? iconContent : ''}\n ${useIconBox ? '</div>' : ''}\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';\nimport { esc } from '../../core/sanitize';\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 /* Largura padrão no HOST: CSS externo, classes e style inline no elemento\n vencem este default naturalmente (regras do documento > :host). */\n width: var(--fx-multiselect-width, 240px);\n }\n .trigger {\n display: inline-flex;\n align-items: center;\n flex-wrap: nowrap;\n gap: var(--fx-space-xs);\n /* Acompanha a largura definida no :host. */\n width: 100%;\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']) { width: var(--fx-multiselect-width-sm, 200px); }\n :host([size='sm']) .trigger { min-height: var(--fx-size-sm); }\n :host([size='lg']) { width: var(--fx-multiselect-width-lg, 280px); }\n :host([size='lg']) .trigger { min-height: var(--fx-size-lg); font-size: calc(var(--fx-font-size) + 4px); }\n /* Full width: o host estica até o pai e o trigger acompanha. */\n :host([full]) { display: block; width: 100%; }\n :host([full]) .trigger { width: 100%; }\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 // `error`/`success` (+ aliases `invalid`/`valid`) PRECISAM ser observados:\n // é assim que o toggle no playground / setAttribute no submit re-renderiza.\n return ['disabled', 'placeholder', 'error', 'invalid', 'success', 'valid'];\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 /** Navegação por teclado entre as opções do listbox (WCAG 2.1.1). */\n private _navigateOptions(e: KeyboardEvent): void {\n e.preventDefault();\n if (!this.hasAttr('open')) {\n this.toggleAttribute('open');\n this.render();\n }\n const opts = Array.from(this.root.querySelectorAll<HTMLButtonElement>('.opt'));\n if (!opts.length) return;\n const current = opts.indexOf(this.root.activeElement as HTMLButtonElement);\n let next = 0;\n if (e.key === 'ArrowDown') next = current === -1 ? 0 : Math.min(current + 1, opts.length - 1);\n else if (e.key === 'ArrowUp') next = current === -1 ? opts.length - 1 : Math.max(current - 1, 0);\n else if (e.key === 'Home') next = 0;\n else if (e.key === 'End') next = opts.length - 1;\n opts[next]?.focus();\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=\"${esc(c.value)}\">\n ${esc(c.label)}\n <span class=\"chip__x\" role=\"button\" aria-label=\"Remover ${esc(c.label)}\">×</span>\n </span>`).join('')\n : `<span class=\"placeholder\">${esc(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=\"${esc(this.getAttr('search-placeholder', 'Pesquisar…'))}\">` : ''}\n <ul class=\"list\">\n ${filtered.map((o) => `\n <li><button type=\"button\" class=\"opt\" role=\"option\" data-value=\"${esc(o.value)}\"\n aria-selected=\"${this.selected.has(o.value)}\">\n <span class=\"box\" aria-hidden=\"true\"></span>${esc(o.label)}\n </button></li>`).join('')}\n ${filtered.length === 0 ? `<li class=\"empty\">${esc(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); setas navegam.\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 return;\n }\n if (e.key === 'Escape') {\n if (this.hasAttr('open')) {\n this.removeAttribute('open');\n this.render();\n this.root.querySelector<HTMLElement>('.trigger')?.focus();\n }\n return;\n }\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp' || e.key === 'Home' || e.key === 'End') {\n this._navigateOptions(e);\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\tstatic override styles = css`\n\t\t:host {\n\t\t\tdisplay: inline-block;\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\tbackground: var(--fx-surface-background);\n\t\t\tborder: 1px solid var(--fx-border-default);\n\t\t\tborder-radius: var(--fx-radius-md);\n\t\t\tbox-shadow: var(--fx-shadow-sm);\n\t\t\tpadding: var(--fx-space-sm);\n\t\t\tuser-select: none;\n\t\t}\n\t\t:host([disabled]) {\n\t\t\topacity: 0.55;\n\t\t\tpointer-events: none;\n\t\t}\n\t\t.head {\n\t\t\tdisplay: flex;\n\t\t\theight: 48px;\n\t\t\talign-items: center;\n\t\t\tjustify-content: space-between;\n\t\t\tgap: var(--fx-space-xs);\n\t\t\tmargin-bottom: var(--fx-space-xs);\n\t\t\tborder-bottom: 1px solid var(--fx-border-default);\n\t\t}\n\n\t\t.title {\n\t\t\tmin-width: 24px;\n\t\t\tborder: none;\n\t\t\tbackground: none;\n\t\t\tcolor: var(--fx-text-default);\n\t\t\tcursor: pointer;\n\t\t\tfont: inherit;\n\t\t\tborder-radius: var(--fx-radius-sm);\n\t\t}\n .nav {\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 20px;\n border: none;\n\t\t\tbackground: none;\n\t\t\tcolor: var(--fx-text-muted);\n\t\t\tcursor: pointer;\n\t\t\tborder-radius: var(--fx-radius-sm);\n }\n\t\t.nav:hover,\n\t\t.title:hover {\n\t\t\tbackground: var(--fx-surface-surface-hover);\n\t\t}\n\t\t.title {\n \tpadding: var(--fx-space-3xs, 4px) var(--fx-space-xs);\n\t\t\tfont-weight: var(--fx-font-weight);\n\t\t\ttext-transform: capitalize;\n\t\t\tflex: 1;\n\t\t}\n\t\t.grid {\n\t\t\tdisplay: grid;\n\t\t\tgrid-template-columns: repeat(7, 34px);\n\t\t\tgap: 2px;\n\t\t}\n\t\t.grid.months,\n\t\t.grid.years {\n\t\t\tgrid-template-columns: repeat(4, minmax(52px, 1fr));\n\t\t}\n\t\t.wd {\n\t\t\ttext-align: center;\n\t\t\tcolor: var(--fx-text-muted);\n\t\t\tfont-size: calc(var(--fx-font-size) - 2px);\n\t\t\tpadding: var(--fx-space-3xs, 4px) 0;\n\t\t\ttext-transform: capitalize;\n\t\t}\n\t\t.cell {\n\t\t\tposition: relative;\n\t\t\tborder: none;\n\t\t\tbackground: none;\n\t\t\tfont: inherit;\n\t\t\tcolor: var(--fx-text-default);\n\t\t\theight: 32px;\n\t\t\tborder-radius: var(--fx-radius-sm);\n\t\t\tcursor: pointer;\n\t\t\tdisplay: inline-flex;\n\t\t\talign-items: center;\n\t\t\tjustify-content: center;\n\t\t}\n\t\t.cell:hover {\n\t\t\tbackground: color-mix(\n\t\t\t\tin srgb,\n\t\t\t\tvar(--fx-color-primary) 12%,\n\t\t\t\ttransparent\n\t\t\t);\n\t\t}\n\t\t.cell.muted {\n\t\t\tcolor: var(--fx-text-disabled);\n\t\t}\n\t\t.cell.today::after {\n\t\t\tcontent: \"\";\n\t\t\tposition: absolute;\n\t\t\tbottom: 3px;\n\t\t\twidth: 4px;\n\t\t\theight: 4px;\n\t\t\tborder-radius: var(--fx-radius-full);\n\t\t\tbackground: var(--fx-color-primary);\n\t\t}\n\t\t.cell.sel {\n\t\t\tbackground: var(--fx-color-primary);\n\t\t\tcolor: #fff;\n\t\t\tfont-weight: var(--fx-font-weight);\n\t\t}\n\t\t.cell.sel::after {\n\t\t\tbackground: #fff;\n\t\t}\n\t\t.cell.in-range {\n\t\t\tbackground: color-mix(\n\t\t\t\tin srgb,\n\t\t\t\tvar(--fx-color-primary) 16%,\n\t\t\t\ttransparent\n\t\t\t);\n\t\t\tborder-radius: 0;\n\t\t}\n\t\t.grid.months .cell,\n\t\t.grid.years .cell {\n\t\t\theight: 40px;\n\t\t}\n\t\t.cell[disabled] {\n\t\t\topacity: 0.35;\n\t\t\tcursor: not-allowed;\n\t\t\tpointer-events: none;\n\t\t}\n\t`;\n\n\tstatic override get observedAttributes(): string[] {\n\t\treturn [\n\t\t\t\"value\",\n\t\t\t\"start\",\n\t\t\t\"end\",\n\t\t\t\"min\",\n\t\t\t\"max\",\n\t\t\t\"range\",\n\t\t\t\"mode\",\n\t\t\t\"values\",\n\t\t\t\"locale\",\n\t\t\t\"disabled\",\n\t\t];\n\t}\n\n\tprivate view: View = \"days\";\n\tprivate cursor = { y: new Date().getFullYear(), m: new Date().getMonth() };\n\t/** Período em construção (chaves numéricas). */\n\tprivate pickStart: number | null = null;\n\tprivate pickEnd: number | null = null;\n\n\t/** Modo de seleção: 'single' | 'range' | 'multiple'. */\n\tget mode(): \"single\" | \"range\" | \"multiple\" {\n\t\tconst m = this.getAttr(\"mode\");\n\t\tif (m === \"range\" || m === \"multiple\") return m;\n\t\treturn this.hasAttr(\"range\") ? \"range\" : \"single\";\n\t}\n\tset mode(m: \"single\" | \"range\" | \"multiple\") {\n\t\tthis.setAttribute(\"mode\", m);\n\t}\n\n\tget range(): boolean {\n\t\treturn this.mode === \"range\";\n\t}\n\tset range(value: boolean) {\n\t\tthis.toggleAttr(\"range\", Boolean(value));\n\t}\n\n\t/** Datas selecionadas no modo multiple (CSV no atributo). */\n\tget values(): string[] {\n\t\tconst csv = this.getAttr(\"values\");\n\t\treturn csv\n\t\t\t? csv\n\t\t\t\t\t.split(\",\")\n\t\t\t\t\t.map((v) => v.trim())\n\t\t\t\t\t.filter(Boolean)\n\t\t\t: [];\n\t}\n\tset values(list: string[]) {\n\t\tthis.setAttribute(\"values\", list.join(\",\"));\n\t}\n\n\tget value(): string {\n\t\treturn this.getAttr(\"value\");\n\t}\n\tset value(v: string) {\n\t\tthis.setAttribute(\"value\", v);\n\t}\n\n\tprivate bounds(): { min: Bound | null; max: Bound | null } {\n\t\treturn {\n\t\t\tmin: parseBound(this.getAttr(\"min\", \"\")),\n\t\t\tmax: parseBound(this.getAttr(\"max\", \"\")),\n\t\t};\n\t}\n\n\tprivate locale(): string {\n\t\treturn this.getAttr(\"locale\", \"pt-BR\");\n\t}\n\n\tprivate fmt(opts: Intl.DateTimeFormatOptions, d: Date): string {\n\t\ttry {\n\t\t\treturn new Intl.DateTimeFormat(this.locale(), opts).format(d);\n\t\t} catch {\n\t\t\treturn new Intl.DateTimeFormat(\"pt-BR\", opts).format(d);\n\t\t}\n\t}\n\n\tprivate dayDisabled(y: number, m: number, d: number): boolean {\n\t\tconst { min, max } = this.bounds();\n\t\tconst k = key(y, m + 1, d);\n\t\treturn (min !== null && k < min.lo) || (max !== null && k > max.hi);\n\t}\n\n\tprivate monthDisabled(y: number, m1: number): boolean {\n\t\tconst { min, max } = this.bounds();\n\t\tconst lo = key(y, m1, 1);\n\t\tconst hi = key(y, m1, 31);\n\t\treturn (min !== null && hi < min.lo) || (max !== null && lo > max.hi);\n\t}\n\n\tprivate yearDisabled(y: number): boolean {\n\t\tconst { min, max } = this.bounds();\n\t\tconst lo = key(y, 1, 1);\n\t\tconst hi = key(y, 12, 31);\n\t\treturn (min !== null && hi < min.lo) || (max !== null && lo > max.hi);\n\t}\n\n\tprivate dayKeyOf(date: Date): number {\n\t\treturn key(date.getFullYear(), date.getMonth() + 1, date.getDate());\n\t}\n\n\tprivate keyToDate(k: number): Date {\n\t\treturn new Date(\n\t\t\tMath.floor(k / 10000),\n\t\t\t(Math.floor(k / 100) % 100) - 1,\n\t\t\tk % 100,\n\t\t);\n\t}\n\n\tprivate iso(k: number): string {\n\t\tconst d = this.keyToDate(k);\n\t\tconst p = (n: number): string => String(n).padStart(2, \"0\");\n\t\treturn `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())}`;\n\t}\n\n\t/** Seleção atual para pintura (chaves). */\n\tprivate selection(): {\n\t\tstart: number | null;\n\t\tend: number | null;\n\t\tsingle: number | null;\n\t\tmulti: Set<number>;\n\t} {\n\t\tconst multi = new Set(\n\t\t\tthis.values.map((iso) => parseBound(iso)?.lo ?? 0).filter(Boolean),\n\t\t);\n\t\tif (this.mode === \"range\") {\n\t\t\tlet s = this.pickStart;\n\t\t\tlet e = this.pickEnd;\n\t\t\tconst attrS = parseBound(this.getAttr(\"start\", \"\"));\n\t\t\tconst attrE = parseBound(this.getAttr(\"end\", \"\"));\n\t\t\tif (s === null && attrS) s = attrS.lo;\n\t\t\tif (e === null && attrE) e = attrE.lo;\n\t\t\treturn { start: s, end: e, single: null, multi };\n\t\t}\n\t\tif (this.mode === \"multiple\") {\n\t\t\treturn { start: null, end: null, single: null, multi };\n\t\t}\n\t\tconst v = parseBound(this.getAttr(\"value\", \"\"));\n\t\treturn { start: null, end: null, single: v ? v.lo : null, multi };\n\t}\n\n\tprivate emit(): void {\n\t\tif (this.mode === \"range\") {\n\t\t\tconst detail = {\n\t\t\t\tstart:\n\t\t\t\t\tthis.pickStart !== null\n\t\t\t\t\t\t? this.iso(this.pickStart)\n\t\t\t\t\t\t: this.getAttr(\"start\", \"\"),\n\t\t\t\tend:\n\t\t\t\t\tthis.pickEnd !== null\n\t\t\t\t\t\t? this.iso(this.pickEnd)\n\t\t\t\t\t\t: this.getAttr(\"end\", \"\"),\n\t\t\t};\n\t\t\tthis.setAttribute(\"start\", detail.start);\n\t\t\tthis.setAttribute(\"end\", detail.end);\n\t\t\tthis.dispatchEvent(\n\t\t\t\tnew CustomEvent(\"change\", {\n\t\t\t\t\tbubbles: true,\n\t\t\t\t\tcomposed: true,\n\t\t\t\t\tdetail,\n\t\t\t\t}),\n\t\t\t);\n\t\t} else if (this.mode === \"multiple\") {\n\t\t\tconst values = this.values;\n\t\t\tthis.dispatchEvent(\n\t\t\t\tnew CustomEvent(\"change\", {\n\t\t\t\t\tbubbles: true,\n\t\t\t\t\tcomposed: true,\n\t\t\t\t\tdetail: { values },\n\t\t\t\t}),\n\t\t\t);\n\t\t} else {\n\t\t\tconst value = this.getAttr(\"value\");\n\t\t\tthis.dispatchEvent(\n\t\t\t\tnew CustomEvent(\"change\", {\n\t\t\t\t\tbubbles: true,\n\t\t\t\t\tcomposed: true,\n\t\t\t\t\tdetail: { value },\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate pickDay(k: number): void {\n\t\tif (this.mode === \"range\") {\n\t\t\tif (this.pickStart === null || this.pickEnd !== null) {\n\t\t\t\tthis.pickStart = k;\n\t\t\t\tthis.pickEnd = null;\n\t\t\t\tthis.setAttribute(\"start\", this.iso(k));\n\t\t\t\tthis.removeAttribute(\"end\");\n\t\t\t\tthis.render();\n\t\t\t\treturn; // emite só ao completar o período\n\t\t\t}\n\t\t\tif (k < this.pickStart)\n\t\t\t\t[this.pickStart, this.pickEnd] = [k, this.pickStart];\n\t\t\telse this.pickEnd = k;\n\t\t\tthis.emit();\n\t\t} else if (this.mode === \"multiple\") {\n\t\t\tconst set = new Set(this.values);\n\t\t\tconst iso = this.iso(k);\n\t\t\tif (set.has(iso)) set.delete(iso);\n\t\t\telse set.add(iso);\n\t\t\tthis.values = [...set].sort();\n\t\t\tthis.emit();\n\t\t} else {\n\t\t\tthis.value = this.iso(k);\n\t\t\tthis.emit();\n\t\t}\n\t\tthis.render();\n\t}\n\n\tprivate navigate(dir: -1 | 1): void {\n\t\tif (this.view === \"days\") {\n\t\t\tconst d = new Date(this.cursor.y, this.cursor.m + dir, 1);\n\t\t\tthis.cursor = { y: d.getFullYear(), m: d.getMonth() };\n\t\t} else if (this.view === \"months\") {\n\t\t\tthis.cursor.y += dir;\n\t\t} else {\n\t\t\tthis.cursor.y += dir * 12;\n\t\t}\n\t\tthis.render();\n\t}\n\n\tprotected override render(): void {\n\t\tconst todayK = this.dayKeyOf(new Date());\n\t\tconst sel = this.selection();\n\t\tconst loc = this.locale();\n\n\t\tconst titles: Record<View, string> = {\n\t\t\tdays: this.fmt(\n\t\t\t\t{ month: \"long\", year: \"numeric\" },\n\t\t\t\tnew Date(this.cursor.y, this.cursor.m, 1),\n\t\t\t),\n\t\t\tmonths: String(this.cursor.y),\n\t\t\tyears: `${Math.floor(this.cursor.y / 12) * 12} – ${Math.floor(this.cursor.y / 12) * 12 + 11}`,\n\t\t};\n\n\t\tlet cells = \"\";\n\t\tif (this.view === \"days\") {\n\t\t\tconst wds = [...Array(7)].map(\n\t\t\t\t(_, i) => this.fmt({ weekday: \"short\" }, new Date(2024, 8, 1 + i)), // 01/09/2024 foi domingo\n\t\t\t);\n\t\t\tcells =\n\t\t\t\twds.map((w) => `<span class=\"wd\">${w}</span>`).join(\"\") +\n\t\t\t\tthis.daysHtml(todayK, sel, loc);\n\t\t} else if (this.view === \"months\") {\n\t\t\tcells = [...Array(12)]\n\t\t\t\t.map((_, i) => {\n\t\t\t\t\tconst dis = this.monthDisabled(this.cursor.y, i + 1);\n\t\t\t\t\treturn `<button type=\"button\" class=\"cell\" data-month=\"${i}\" ${dis ? \"disabled\" : \"\"}>${this.fmt({ month: \"short\" }, new Date(this.cursor.y, i, 1))}</button>`;\n\t\t\t\t})\n\t\t\t\t.join(\"\");\n\t\t} else {\n\t\t\tconst base = Math.floor(this.cursor.y / 12) * 12;\n\t\t\tcells = [...Array(12)]\n\t\t\t\t.map((_, i) => {\n\t\t\t\t\tconst y = base + i;\n\t\t\t\t\tconst dis = this.yearDisabled(y);\n\t\t\t\t\treturn `<button type=\"button\" class=\"cell\" data-year=\"${y}\" ${dis ? \"disabled\" : \"\"}>${y}</button>`;\n\t\t\t\t})\n\t\t\t\t.join(\"\");\n\t\t}\n\n\t\tconst titleAction =\n\t\t\tthis.view === \"days\"\n\t\t\t\t? `data-goto=\"months\"`\n\t\t\t\t: this.view === \"months\"\n\t\t\t\t\t? `data-goto=\"years\"`\n\t\t\t\t\t: \"\";\n\n\t\tthis.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\t\tthis.root\n\t\t\t.querySelectorAll<HTMLButtonElement>(\"[data-nav]\")\n\t\t\t.forEach((b) =>\n\t\t\t\tb.addEventListener(\"click\", () =>\n\t\t\t\t\tthis.navigate(Number(b.dataset.nav) as -1 | 1),\n\t\t\t\t),\n\t\t\t);\n\t\tconst gotoBtn = this.root.querySelector<HTMLElement>(\"[data-goto]\");\n\t\tgotoBtn?.addEventListener(\"click\", () => {\n\t\t\tthis.view = gotoBtn.dataset.goto as View;\n\t\t\tthis.render();\n\t\t});\n\n\t\tthis.root\n\t\t\t.querySelectorAll<HTMLButtonElement>(\"[data-day]\")\n\t\t\t.forEach((b) =>\n\t\t\t\tb.addEventListener(\"click\", () =>\n\t\t\t\t\tthis.pickDay(Number(b.dataset.day!)),\n\t\t\t\t),\n\t\t\t);\n\t\tthis.root\n\t\t\t.querySelectorAll<HTMLButtonElement>(\"[data-month]\")\n\t\t\t.forEach((b) =>\n\t\t\t\tb.addEventListener(\"click\", () => {\n\t\t\t\t\tthis.cursor.m = Number(b.dataset.month!);\n\t\t\t\t\tthis.view = \"days\";\n\t\t\t\t\tthis.render();\n\t\t\t\t}),\n\t\t\t);\n\t\tthis.root\n\t\t\t.querySelectorAll<HTMLButtonElement>(\"[data-year]\")\n\t\t\t.forEach((b) =>\n\t\t\t\tb.addEventListener(\"click\", () => {\n\t\t\t\t\tthis.cursor.y = Number(b.dataset.year!);\n\t\t\t\t\tthis.view = \"months\";\n\t\t\t\t\tthis.render();\n\t\t\t\t}),\n\t\t\t);\n\t}\n\n\t/** Grade de dias com preenchimento do mês anterior. */\n\tprivate daysHtml(\n\t\ttodayK: number,\n\t\tsel: ReturnType<FxCalendar[\"selection\"]>,\n\t\t_loc: string,\n\t): string {\n\t\tconst { y, m } = this.cursor;\n\t\tconst first = new Date(y, m, 1).getDay(); // 0=domingo\n\t\tconst total = new Date(y, m + 1, 0).getDate();\n\t\tconst prevTotal = new Date(y, m, 0).getDate();\n\n\t\tlet html = \"\";\n\t\tfor (let i = first - 1; i >= 0; i--) {\n\t\t\thtml += `<span class=\"cell muted\">${prevTotal - i}</span>`;\n\t\t}\n\t\tfor (let d = 1; d <= total; d++) {\n\t\t\tconst k = key(y, m + 1, d);\n\t\t\tconst isSel =\n\t\t\t\tsel.single === k ||\n\t\t\t\tsel.start === k ||\n\t\t\t\tsel.end === k ||\n\t\t\t\tsel.multi.has(k);\n\t\t\tconst inRange =\n\t\t\t\tsel.start !== null &&\n\t\t\t\tsel.end !== null &&\n\t\t\t\tk > sel.start &&\n\t\t\t\tk < sel.end;\n\t\t\tconst cls = [\n\t\t\t\t\"cell\",\n\t\t\t\tisSel ? \"sel\" : \"\",\n\t\t\t\tinRange ? \"in-range\" : \"\",\n\t\t\t\tk === todayK ? \"today\" : \"\",\n\t\t\t]\n\t\t\t\t.filter(Boolean)\n\t\t\t\t.join(\" \");\n\t\t\thtml += `<button type=\"button\" class=\"${cls}\" data-day=\"${k}\" ${this.dayDisabled(y, m, d) ? \"disabled\" : \"\"}>${d}</button>`;\n\t\t}\n\t\treturn html;\n\t}\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';\nimport { esc } from '../../core/sanitize';\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 /* Full width: o host estica até o pai (os min-width dos modos são\n descartados para permitir layouts estreitos sob controle do pai). */\n :host([full]) { display: block; width: 100%; }\n :host([full]) .field { min-width: 0; }\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', 'error', 'invalid', 'success', 'valid'];\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=\"${esc(this.getAttr('min'))}\" max=\"${esc(this.getAttr('max'))}\"`;\n if (this.mode === 'range') {\n calAttrs += ` range start=\"${esc(this.getAttr('start'))}\" end=\"${esc(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=\"${esc(dates)}\"`;\n } else {\n const v = this.value.split('T')[0] ?? '';\n calAttrs += ` value=\"${esc(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=\"${esc(this.getAttr('placeholder', 'dd/mm/aaaa'))}\"\n value=\"${esc(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=\"${CSS.escape(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","/**\n * Avaliador de expressões **seguro** (sem `eval`/`Function`) usado pelos\n * templates de célula do `<fx-table>`.\n *\n * Permite personalizar o conteúdo de uma coluna:\n *\n * ```html\n * <fx-column field=\"preco\" header=\"Preço\">\n * <template>R$ {{ value | currency }}</template>\n * </fx-column>\n *\n * <fx-column field=\"status\" header=\"Situação\">\n * <template>\n * <i class=\"pi pi-{{ row.status === 'ativo' ? 'check' : 'times' }}\"></i>\n * </template>\n * </fx-column>\n * ```\n *\n * Contexto de variáveis dentro de `{{ }}`:\n * - `value` — valor do campo da coluna (row[field])\n * - `row` — objeto completo da linha\n * - `row.campo` — acesso a qualquer campo da linha\n *\n * Pipes: `value | currency`, `value | date`, `value | date: 'short'`,\n * `value | dateTime`, `value | number`, `value | number: 2`\n */\n\ntype Row = Record<string, unknown>;\nexport type EvalCtx = { value: unknown; row: Row };\n\nimport { esc } from '../../core/sanitize';\n\n/* ------------------------------------------------------------------ *\n * Pipes built-in\n * ------------------------------------------------------------------ */\nconst LOCALE = 'pt-BR';\n\nexport const PIPES: Record<string, (v: unknown, arg?: string) => string> = {\n /** Formata como moeda brasileira (R$). */\n currency: (v) => {\n if (v == null || v === '') return '';\n try {\n return new Intl.NumberFormat(LOCALE, {\n style: 'currency',\n currency: 'BRL',\n }).format(Number(v));\n } catch {\n return String(v);\n }\n },\n\n /** Formata como data. Estilos: short | medium | long | full (default medium). */\n date: (v, arg) => {\n const d = toDate(v);\n if (!d) return String(v ?? '');\n const styles: Record<string, Intl.DateTimeFormatOptions> = {\n short: { dateStyle: 'short' },\n medium: { dateStyle: 'medium' },\n long: { dateStyle: 'long' },\n full: { dateStyle: 'full' },\n };\n const opts = arg && styles[arg] ? styles[arg] : styles.medium;\n try {\n return new Intl.DateTimeFormat(LOCALE, opts).format(d);\n } catch {\n return d.toLocaleDateString(LOCALE);\n }\n },\n\n /** Formata como data + hora (medium/short). */\n dateTime: (v) => {\n const d = toDate(v);\n if (!d) return String(v ?? '');\n try {\n return new Intl.DateTimeFormat(LOCALE, {\n dateStyle: 'medium',\n timeStyle: 'short',\n }).format(d);\n } catch {\n return d.toLocaleString(LOCALE);\n }\n },\n\n /** Formata como número (pt-BR). Opcional: `number: 2` (casas decimais). */\n number: (v, arg) => {\n if (v == null || v === '') return '';\n try {\n const opt: Intl.NumberFormatOptions = {};\n if (arg !== undefined) {\n const dec = Number(arg);\n opt.minimumFractionDigits = dec;\n opt.maximumFractionDigits = dec;\n }\n return new Intl.NumberFormat(LOCALE, opt).format(Number(v));\n } catch {\n return String(v);\n }\n },\n};\n\nfunction toDate(v: unknown): Date | null {\n if (v == null || v === '') return null;\n if (v instanceof Date) return isNaN(v.getTime()) ? null : v;\n if (typeof v === 'number') {\n const d = new Date(v);\n return isNaN(d.getTime()) ? null : d;\n }\n if (typeof v === 'string') {\n const d = new Date(v);\n return isNaN(d.getTime()) ? null : d;\n }\n return null;\n}\n\n/* ------------------------------------------------------------------ *\n * Tokenizer\n * ------------------------------------------------------------------ */\ntype TType =\n | 'str' // 'texto' ou \"texto\"\n | 'num' // 42, 3.14\n | 'id' // value, row, nome, status\n | 'kw' // true, false, null\n | 'op' // + - * /\n | 'cmp' // == != > < >= <=\n | 'pipe' // |\n | 'qm' // ?\n | 'colon' // :\n | 'lparen' // (\n | 'rparen' // )\n | 'dot'; // .\n\ninterface Token {\n type: TType;\n value: string;\n}\n\nconst IDENT_START = (ch: string) => /[a-z_$]/i.test(ch);\nconst IDENT_PART = (ch: string) => /[a-z0-9_$]/i.test(ch);\n\nfunction tokenize(expr: string): Token[] {\n const tokens: Token[] = [];\n let i = 0;\n\n while (i < expr.length) {\n const ch = expr[i];\n\n // Whitespace\n if (/\\s/.test(ch)) { i++; continue; }\n\n // String literals: '...' ou \"...\"\n if (ch === \"'\" || ch === '\"') {\n const quote = ch;\n let str = '';\n i++;\n while (i < expr.length && expr[i] !== quote) {\n if (expr[i] === '\\\\' && i + 1 < expr.length) {\n str += expr[i + 1];\n i += 2;\n } else {\n str += expr[i];\n i++;\n }\n }\n i++; // skip closing quote\n tokens.push({ type: 'str', value: str });\n continue;\n }\n\n // Numbers (apenas se começar com dígito — evita ambiguidade com .)\n if (ch >= '0' && ch <= '9') {\n let numStr = '';\n while (i < expr.length && (expr[i] >= '0' && expr[i] <= '9' || expr[i] === '.')) {\n numStr += expr[i];\n i++;\n }\n tokens.push({ type: 'num', value: numStr });\n continue;\n }\n\n // Identifiers / keywords\n if (IDENT_START(ch)) {\n let ident = '';\n while (i < expr.length && IDENT_PART(expr[i])) {\n ident += expr[i];\n i++;\n }\n if (ident === 'true' || ident === 'false' || ident === 'null') {\n tokens.push({ type: 'kw', value: ident });\n } else {\n tokens.push({ type: 'id', value: ident });\n }\n continue;\n }\n\n // Two-char comparison operators\n const two = expr.slice(i, i + 2);\n if (two === '==' || two === '!=' || two === '>=' || two === '<=') {\n tokens.push({ type: 'cmp', value: two });\n i += 2;\n continue;\n }\n\n // Single-char arithmetic / comparison\n if (ch === '+') { tokens.push({ type: 'op', value: '+' }); i++; continue; }\n if (ch === '-') { tokens.push({ type: 'op', value: '-' }); i++; continue; }\n if (ch === '*') { tokens.push({ type: 'op', value: '*' }); i++; continue; }\n if (ch === '/') { tokens.push({ type: 'op', value: '/' }); i++; continue; }\n if (ch === '>') { tokens.push({ type: 'cmp', value: '>' }); i++; continue; }\n if (ch === '<') { tokens.push({ type: 'cmp', value: '<' }); i++; continue; }\n if (ch === '!') { tokens.push({ type: 'op', value: '!' }); i++; continue; }\n if (ch === '?') { tokens.push({ type: 'qm', value: '?' }); i++; continue; }\n if (ch === ':') { tokens.push({ type: 'colon', value: ':' }); i++; continue; }\n if (ch === '|') { tokens.push({ type: 'pipe', value: '|' }); i++; continue; }\n if (ch === '(') { tokens.push({ type: 'lparen', value: '(' }); i++; continue; }\n if (ch === ')') { tokens.push({ type: 'rparen', value: ')' }); i++; continue; }\n if (ch === '.') { tokens.push({ type: 'dot', value: '.' }); i++; continue; }\n\n // Unknown — skip silently\n i++;\n }\n\n return tokens;\n}\n\n/* ------------------------------------------------------------------ *\n * Parser — recursive descent, avalia durante o parsing\n * ------------------------------------------------------------------ */\n\nclass Parser {\n private pos = 0;\n\n constructor(\n private tokens: Token[],\n private ctx: EvalCtx,\n ) {}\n\n private peek(): Token | null {\n return this.pos < this.tokens.length ? this.tokens[this.pos] : null;\n }\n\n private next(): Token | null {\n return this.pos < this.tokens.length ? this.tokens[this.pos++] : null;\n }\n\n private matchType(type: TType): Token | null {\n if (this.peek()?.type === type) return this.next();\n return null;\n }\n\n parse(): unknown {\n return this.parsePipe();\n }\n\n /* pipeExpr := ternary ('|' IDENT (':' pipeArg)? )* */\n private parsePipe(): unknown {\n let val = this.parseTernary();\n\n while (this.peek()?.type === 'pipe') {\n this.next(); // consume |\n const nameTok = this.matchType('id');\n if (!nameTok) break;\n\n let arg: string | undefined;\n if (this.peek()?.type === 'colon') {\n this.next(); // consume :\n const argTok = this.peek();\n if (argTok && (argTok.type === 'str' || argTok.type === 'num' || argTok.type === 'id')) {\n arg = argTok.type === 'str' ? argTok.value : String(argTok.value);\n this.next();\n }\n }\n\n val = this.applyPipe(nameTok.value, arg, val);\n }\n return val;\n }\n\n /* ternary := comparison ('?' pipeExpr ':' pipeExpr)? */\n private parseTernary(): unknown {\n const cond = this.parseComparison();\n if (this.peek()?.type === 'qm') {\n this.next(); // consume ?\n const trueVal = this.parsePipe();\n if (this.peek()?.type === 'colon') {\n this.next(); // consume :\n const falseVal = this.parsePipe();\n return cond ? trueVal : falseVal;\n }\n return trueVal;\n }\n return cond;\n }\n\n /* comparison := additive (COMP_OP additive)? */\n private parseComparison(): unknown {\n const left = this.parseAdditive();\n const tok = this.peek();\n if (tok?.type === 'cmp') {\n this.next();\n const right = this.parseAdditive();\n return this.compare(left, tok.value, right);\n }\n return left;\n }\n\n private compare(left: unknown, op: string, right: unknown): boolean {\n const l = toComparable(left);\n const r = toComparable(right);\n switch (op) {\n case '==': return l == r;\n case '!=': return l != r;\n case '>': return l > r;\n case '<': return l < r;\n case '>=': return l >= r;\n case '<=': return l <= r;\n }\n return false;\n }\n\n /* additive := multiplicative (('+' | '-') multiplicative)* */\n private parseAdditive(): unknown {\n let left = this.parseMultiplicative();\n for (;;) {\n const tok = this.peek();\n if (tok?.type === 'op' && (tok.value === '+' || tok.value === '-')) {\n this.next();\n const right = this.parseMultiplicative();\n left = tok.value === '+' ? this.add(left, right) : this.subtract(left, right);\n } else break;\n }\n return left;\n }\n\n private add(l: unknown, r: unknown): unknown {\n if (typeof l === 'string' || typeof r === 'string') {\n return String(l ?? '') + String(r ?? '');\n }\n return Number(l) + Number(r);\n }\n\n private subtract(l: unknown, r: unknown): unknown {\n return Number(l) - Number(r);\n }\n\n /* multiplicative := unary (('*' | '/') unary)* */\n private parseMultiplicative(): unknown {\n let left = this.parseUnary();\n for (;;) {\n const tok = this.peek();\n if (tok?.type === 'op' && (tok.value === '*' || tok.value === '/')) {\n this.next();\n const right = this.parseUnary();\n left = tok.value === '*' ? Number(left) * Number(right) : Number(left) / Number(right);\n } else break;\n }\n return left;\n }\n\n /* unary := ('+' | '-' | '!') unary | primary */\n private parseUnary(): unknown {\n const tok = this.peek();\n if (tok?.type === 'op' && (tok.value === '+' || tok.value === '-')) {\n this.next();\n const val = Number(this.parseUnary());\n return tok.value === '-' ? -val : val;\n }\n if (tok?.type === 'op' && tok.value === '!') {\n this.next();\n return !this.parseUnary();\n }\n return this.parsePrimary();\n }\n\n /* primary := STRING | NUMBER | kw | id ( '.' id )* | '(' pipeExpr ')' */\n private parsePrimary(): unknown {\n const tok = this.peek();\n if (!tok) return undefined;\n\n if (tok.type === 'lparen') {\n this.next();\n const val = this.parsePipe();\n this.matchType('rparen');\n return val;\n }\n\n if (tok.type === 'str') { this.next(); return tok.value; }\n if (tok.type === 'num') { this.next(); return Number(tok.value); }\n\n if (tok.type === 'kw') {\n this.next();\n return tok.value === 'true' ? true\n : tok.value === 'false' ? false\n : null;\n }\n\n if (tok.type === 'id') {\n this.next();\n let result: unknown = this.resolveId(tok.value);\n\n while (this.peek()?.type === 'dot') {\n this.next(); // consume .\n const propTok = this.peek();\n if (propTok?.type === 'id') {\n this.next();\n result = result == null\n ? undefined\n : (result as Record<string, unknown>)[propTok.value];\n } else break;\n }\n return result;\n }\n\n this.next(); // skip token inesperado\n return undefined;\n }\n\n private resolveId(name: string): unknown {\n switch (name) {\n case 'value': return this.ctx.value;\n case 'row': return this.ctx.row;\n case 'true': return true;\n case 'false': return false;\n case 'null': return null;\n default: return this.ctx.row[name];\n }\n }\n\n private applyPipe(name: string, arg: string | undefined, input: unknown): string {\n const pipe = PIPES[name];\n if (!pipe) return formatDefault(input);\n try {\n return pipe(input, arg);\n } catch {\n return formatDefault(input);\n }\n }\n}\n\nfunction toComparable(v: unknown): number | string {\n if (typeof v === 'number') return v;\n if (typeof v === 'boolean') return v ? 1 : 0;\n return String(v ?? '');\n}\n\nfunction formatDefault(v: unknown): string {\n if (v == null) return '';\n if (typeof v === 'object') return '[object Object]';\n return String(v);\n}\n\n/* ------------------------------------------------------------------ *\n * API pública\n * ------------------------------------------------------------------ */\n\n/** Avalia uma única expressão `{{ }}` retornando uma string. */\nexport function evaluate(expr: string, ctx: EvalCtx): string {\n try {\n const tokens = tokenize(expr);\n const parser = new Parser(tokens, ctx);\n const result = parser.parse();\n return formatDefault(result);\n } catch {\n return '';\n }\n}\n\n/** Processa um template HTML substituindo todas as ocorrências `{{ expr }}`. */\nexport function renderCell(template: string, row: Row, field: string): string {\n const ctx: EvalCtx = { value: row[field], row };\n return template.replace(/\\{\\{([^}]+)\\}\\}/g, (_, expr: string) =>\n esc(evaluate(decodeEntities(expr.trim()), ctx)));\n}\n\n/** Decodifica entidades HTML que o serializador do innerHTML pode inserir (ex: &gt; &lt; &amp;). */\nfunction decodeEntities(str: string): string {\n return str\n .replace(/&amp;/g, '&')\n .replace(/&gt;/g, '>')\n .replace(/&lt;/g, '<')\n .replace(/&quot;/g, '\"')\n .replace(/&#39;/g, \"'\");\n}\n","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\nimport { esc } from \"../../core/sanitize\";\nimport { renderCell } from \"./expr\";\nimport \"../select\";\n\n/**\n * <fx-table> — Tabela de dados estilo DataTable (dados + colunas configuráveis,\n * ordenação, filtros por coluna, paginação personalizável, busca global na toolbar\n * e modo lazy para busca no servidor).\n *\n * Colunas (light DOM):\n * <fx-column field=\"nome\" header=\"Nome\" sortable filterable align=\"left\">\n * opcional: <template>R$ {{value}}</template> para render customizado\n * ou conteúdo direto (HTML + {{ }}) como template alternativo\n * </fx-column>\n *\n * Toolbar (opcional):\n * <template slot=\"toolbar\">\n * <input data-search-fields=\"nome,cargo\" placeholder=\"Buscar…\">\n * <button>Nova ação</button>\n * </template>\n *\n * Dados: propriedade `data` (array de objetos) ou atributo `data` (JSON).\n *\n * Atributos: pagination, rows, rows-options, pagination-position (left|center|right),\n * striped, empty-message, lazy, total, loading, loading-message.\n * Eventos: page-change, sort-change, row-click, filter-change (todos composed).\n */\nexport class FxTable extends FxElement {\n\tstatic override styles = css`\n\t\t:host {\n\t\t\tdisplay: block;\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\tbackground: var(--fx-surface-background);\n\t\t}\n\t\t.table-wrap {\n\t\t\tposition: relative;\n\t\t}\n\t\t.scroll {\n\t\t\toverflow-x: auto;\n\t\t\tborder: 1px solid var(--fx-border-default);\n\t\t\tborder-radius: var(--fx-radius-md);\n\t\t}\n\t\ttable {\n\t\t\twidth: 100%;\n\t\t\tborder-collapse: collapse;\n\t\t}\n\t\tth {\n\t\t\ttext-align: left;\n\t\t\tpadding: var(--fx-space-sm) var(--fx-space-md);\n\t\t\tbackground: var(--fx-surface-surface);\n\t\t\tborder-bottom: 2px solid var(--fx-border-default);\n\t\t\twhite-space: nowrap;\n\t\t\tuser-select: none;\n\t\t}\n\t\tth.sortable {\n\t\t\tcursor: pointer;\n\t\t}\n\t\tth.sortable:hover {\n\t\t\tcolor: var(--fx-color-primary);\n\t\t}\n\t\t.sort-ind {\n\t\t\tfont-size: calc(var(--fx-font-size) - 4px);\n\t\t\tmargin-left: var(--fx-space-3xs, 2px);\n\t\t\topacity: 0.45;\n\t\t\ttransition: opacity var(--fx-motion-duration-fast)\n\t\t\t\tvar(--fx-motion-easing);\n\t\t}\n\t\tth.sortable:hover .sort-ind {\n\t\t\topacity: 0.85;\n\t\t}\n\t\t.sort-ind.active {\n\t\t\topacity: 1;\n\t\t\tcolor: var(--fx-color-primary);\n\t\t}\n\t\t.filter-row th {\n\t\t\tpadding: var(--fx-space-3xs, 4px) var(--fx-space-md) var(--fx-space-sm);\n\t\t\tborder-bottom-width: 1px;\n\t\t}\n\t\t.filter {\n\t\t\twidth: 100%;\n\t\t\tbox-sizing: border-box;\n\t\t\tfont: inherit;\n\t\t\tfont-size: calc(var(--fx-font-size) - 2px);\n\t\t\tcolor: var(--fx-text-default);\n\t\t\tbackground: var(--fx-surface-background);\n\t\t\tborder: 1px solid var(--fx-border-default);\n\t\t\tborder-radius: var(--fx-radius-sm);\n\t\t\tpadding: var(--fx-space-3xs, 4px) var(--fx-space-xs);\n\t\t\toutline: none;\n\t\t}\n\t\t.filter:focus {\n\t\t\tborder-color: var(--fx-color-primary);\n\t\t\tbox-shadow: var(--fx-effect-focus-ring, none);\n\t\t}\n\t\ttd {\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}\n\t\ttbody tr {\n\t\t\tcursor: pointer;\n\t\t\ttransition: background-color var(--fx-motion-duration-fast)\n\t\t\t\tvar(--fx-motion-easing);\n\t\t}\n\t\ttbody tr:hover {\n\t\t\tbackground: color-mix(\n\t\t\t\tin srgb,\n\t\t\t\tvar(--fx-color-primary) 8%,\n\t\t\t\ttransparent\n\t\t\t);\n\t\t}\n\t\t:host([striped]) tbody tr:nth-child(even) {\n\t\t\tbackground: var(--fx-surface-background);\n\t\t}\n\t\t:host([striped]) tbody tr:hover {\n\t\t\tbackground: color-mix(\n\t\t\t\tin srgb,\n\t\t\t\tvar(--fx-color-primary) 8%,\n\t\t\t\ttransparent\n\t\t\t);\n\t\t}\n\t\t.empty {\n\t\t\ttext-align: center;\n\t\t\tpadding: var(--fx-space-xl);\n\t\t\tcolor: var(--fx-text-muted);\n\t\t}\n\t\t.pager {\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\tgap: var(--fx-space-sm);\n\t\t\tflex-wrap: wrap;\n\t\t\tpadding: var(--fx-space-sm) 0;\n\t\t}\n\t\t:host([pagination-position=\"center\"]) .pager {\n\t\t\tjustify-content: center;\n\t\t}\n\t\t:host([pagination-position=\"right\"]) .pager {\n\t\t\tjustify-content: flex-end;\n\t\t}\n\t\t.pager .info {\n\t\t\tcolor: var(--fx-text-muted);\n\t\t\tfont-size: calc(var(--fx-font-size) - 2px);\n\t\t}\n\t\t.pg-btn {\n\t\t\tmin-width: var(--fx-size-sm);\n\t\t\theight: var(--fx-size-sm);\n\t\t\tfont: inherit;\n\t\t\tfont-size: calc(var(--fx-font-size) - 2px);\n\t\t\tcolor: var(--fx-text-default);\n\t\t\tbackground: var(--fx-surface-background);\n\t\t\tborder: 1px solid var(--fx-border-default);\n\t\t\tborder-radius: var(--fx-radius-sm);\n\t\t\tpadding: var(--fx-space-3xs, 4px) var(--fx-space-sm);\n\t\t\tcursor: pointer;\n\t\t\ttransition: border-color var(--fx-motion-duration-fast)\n\t\t\t\tvar(--fx-motion-easing);\n\t\t}\n\t\t.pg-btn:hover:not(:disabled):not([aria-current=\"true\"]) {\n\t\t\tborder-color: var(--fx-color-primary);\n\t\t\tcolor: var(--fx-color-primary);\n\t\t}\n\t\t.pg-btn:disabled {\n\t\t\topacity: 0.5;\n\t\t\tcursor: not-allowed;\n\t\t}\n\t\t.pg-btn[aria-current=\"true\"] {\n\t\t\tbackground: var(--fx-color-primary);\n\t\t\tborder-color: var(--fx-color-primary);\n\t\t\tcolor: #fff;\n\t\t\tfont-weight: var(--fx-font-weight);\n\t\t}\n\t\tfx-select {\n\t\t\tvertical-align: middle;\n\t\t}\n\t\tfx-select::part(trigger) {\n\t\t\tmin-width: 64px !important;\n\t\t\tmin-height: var(--fx-size-sm) !important;\n\t\t\tpadding: 0 var(--fx-space-sm) !important;\n\t\t\tborder-radius: var(--fx-radius-sm) !important;\n\t\t\tfont-size: calc(var(--fx-font-size) - 2px) !important;\n\t\t}\n\t\t.toolbar {\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\tgap: var(--fx-space-sm);\n\t\t\tflex-wrap: wrap;\n\t\t\tpadding: var(--fx-space-sm) var(--fx-space-md);\n\t\t\tborder: 1px solid var(--fx-border-default);\n\t\t\tborder-bottom: none;\n\t\t\tborder-radius: var(--fx-radius-md) var(--fx-radius-md) 0 0;\n\t\t\tbackground: var(--fx-surface-background);\n\t\t}\n\t\t.toolbar:empty {\n\t\t\tdisplay: none;\n\t\t}\n\t\t.loading-overlay {\n\t\t\tposition: absolute;\n\t\t\tinset: 0;\n\t\t\tdisplay: flex;\n\t\t\tflex-direction: column;\n\t\t\talign-items: center;\n\t\t\tjustify-content: center;\n\t\t\tgap: var(--fx-space-sm);\n\t\t\tbackground: color-mix(\n\t\t\t\tin srgb,\n\t\t\t\tvar(--fx-surface-background) 85%,\n\t\t\t\ttransparent\n\t\t\t);\n\t\t\tbackdrop-filter: blur(2px);\n\t\t\tz-index: 10;\n\t\t\tborder-radius: var(--fx-radius-md);\n\t\t}\n\t\t.tbl-spinner {\n\t\t\twidth: 32px;\n\t\t\theight: 32px;\n\t\t\tborder: 3px solid var(--fx-border-default);\n\t\t\tborder-top-color: var(--fx-color-primary);\n\t\t\tborder-radius: 50%;\n\t\t\tanimation: tbl-spin 1s linear infinite;\n\t\t}\n\t\t@keyframes tbl-spin {\n\t\t\tto {\n\t\t\t\ttransform: rotate(360deg);\n\t\t\t}\n\t\t}\n\t\t.loading-text {\n\t\t\tcolor: var(--fx-text-muted);\n\t\t\tfont-size: calc(var(--fx-font-size) - 1px);\n\t\t}\n\t`;\n\n\tstatic override get observedAttributes(): string[] {\n\t\treturn [\n\t\t\t\"pagination\",\n\t\t\t\"rows\",\n\t\t\t\"rows-options\",\n\t\t\t\"striped\",\n\t\t\t\"empty-message\",\n\t\t\t\"pagination-position\",\n\t\t\t\"lazy\",\n\t\t\t\"total\",\n\t\t\t\"loading\",\n\t\t\t\"loading-message\",\n\t\t];\n\t}\n\n\tprivate _data: Record<string, unknown>[] = [];\n\tprivate _total?: number;\n\tprivate page = 0;\n\tprivate sortField = \"\";\n\tprivate sortDir: 1 | -1 = 1;\n\tprivate filters: Record<string, string> = {};\n\tprivate globalSearch = \"\";\n\tprivate _columnObserver?: MutationObserver;\n\n\tget data(): Record<string, unknown>[] {\n\t\treturn this._data;\n\t}\n\tset data(value: Record<string, unknown>[]) {\n\t\tthis._data = Array.isArray(value) ? value : [];\n\t\tthis.render();\n\t}\n\n\tget total(): number {\n\t\treturn this._total ?? this._data.length;\n\t}\n\tset total(value: number) {\n\t\tthis._total = value;\n\t\tthis.setAttribute(\"total\", String(value));\n\t}\n\n\tget rowsPerPage(): number {\n\t\tconst r = Number(this.getAttr(\"rows\", \"10\"));\n\t\treturn r > 0 ? r : 10;\n\t}\n\tset rowsPerPage(value: number) {\n\t\tthis.setAttribute(\"rows\", String(value));\n\t}\n\n\tget lazy(): boolean {\n\t\treturn this.hasAttr(\"lazy\");\n\t}\n\n\tprivate get columns(): {\n\t\tfield: string;\n\t\theader: string;\n\t\tsortable: boolean;\n\t\tfilterable: boolean;\n\t\talign: string;\n\t\ttemplate?: HTMLTemplateElement;\n\t\tdirectTemplate?: string;\n\t}[] {\n\t\treturn [...this.querySelectorAll(\"fx-column\")].map((c) => {\n\t\t\tconst tpl = c.querySelector(\"template\");\n\t\t\tconst direct = tpl ? undefined : c.innerHTML.trim();\n\t\t\tconst align = c.getAttribute(\"align\") ?? \"left\";\n\t\t\treturn {\n\t\t\t\tfield: c.getAttribute(\"field\") ?? \"\",\n\t\t\t\theader: c.getAttribute(\"header\") ?? c.getAttribute(\"field\") ?? \"\",\n\t\t\t\tsortable: c.hasAttribute(\"sortable\"),\n\t\t\t\tfilterable: c.hasAttribute(\"filterable\"),\n\t\t\t\talign: [\"left\", \"center\", \"right\", \"justify\", \"start\", \"end\"].includes(align) ? align : \"left\",\n\t\t\t\ttemplate: tpl ?? undefined,\n\t\t\t\tdirectTemplate: direct || undefined,\n\t\t\t};\n\t\t});\n\t}\n\n\tprivate get toolbarTemplate(): HTMLTemplateElement | null {\n\t\treturn this.querySelector(\n\t\t\t'template[slot=\"toolbar\"]',\n\t\t) as HTMLTemplateElement | null;\n\t}\n\n\tprotected override connectedCallback(): void {\n\t\tthis._parseDataAttribute();\n\t\tsuper.connectedCallback();\n\t\tthis._columnObserver = new MutationObserver(() => this.render());\n\t\tthis._columnObserver.observe(this, { childList: true, subtree: true });\n\t}\n\n\tprotected override disconnectedCallback(): void {\n\t\tthis._columnObserver?.disconnect();\n\t\tsuper.disconnectedCallback();\n\t}\n\n\tprivate _parseDataAttribute(): void {\n\t\tif (!this._data.length) {\n\t\t\ttry {\n\t\t\t\tconst json = this.getAttr(\"data\");\n\t\t\t\tif (json) this._data = JSON.parse(json);\n\t\t\t} catch {\n\t\t\t\t/* atributo invalido - ignora */\n\t\t\t}\n\t\t}\n\t\tconst totalAttr = this.getAttr(\"total\");\n\t\tif (totalAttr) {\n\t\t\tconst n = Number(totalAttr);\n\t\t\tif (!isNaN(n)) this._total = n;\n\t\t}\n\t}\n\n\tprivate computeRows(): { rows: Record<string, unknown>[]; total: number } {\n\t\tlet out = [...this._data];\n\n\t\tfor (const [field, term] of Object.entries(this.filters)) {\n\t\t\tif (!term) continue;\n\t\t\tconst t = term.toLowerCase();\n\t\t\tout = out.filter((r) =>\n\t\t\t\tString(r[field] ?? \"\")\n\t\t\t\t\t.toLowerCase()\n\t\t\t\t\t.includes(t),\n\t\t\t);\n\t\t}\n\n\t\tif (this.globalSearch) {\n\t\t\tconst t = this.globalSearch.toLowerCase();\n\t\t\tconst searchFields = this._getSearchFields();\n\t\t\tout = out.filter((r) => {\n\t\t\t\tconst fields = searchFields.length ? searchFields : Object.keys(r);\n\t\t\t\treturn fields.some((f) =>\n\t\t\t\t\tString(r[f] ?? \"\")\n\t\t\t\t\t\t.toLowerCase()\n\t\t\t\t\t\t.includes(t),\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\n\t\tconst total = this.lazy ? this.total : out.length;\n\n\t\tif (this.sortField) {\n\t\t\tout.sort((a, b) => {\n\t\t\t\tconst av = a[this.sortField],\n\t\t\t\t\tbv = b[this.sortField];\n\t\t\t\tif (typeof av === \"number\" && typeof bv === \"number\")\n\t\t\t\t\treturn (av - bv) * this.sortDir;\n\t\t\t\treturn (\n\t\t\t\t\tString(av ?? \"\").localeCompare(String(bv ?? \"\"), \"pt-BR\") *\n\t\t\t\t\tthis.sortDir\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\n\t\tif (this.hasAttr(\"pagination\") && !this.lazy) {\n\t\t\tconst start = this.page * this.rowsPerPage;\n\t\t\tout = out.slice(start, start + this.rowsPerPage);\n\t\t}\n\n\t\treturn { rows: out, total };\n\t}\n\n\tprivate _getSearchFields(): string[] {\n\t\tconst input = this.root.querySelector<HTMLInputElement>(\n\t\t\t\"[data-search-fields]\",\n\t\t);\n\t\tif (!input) return [];\n\t\tconst attr = input.getAttribute(\"data-search-fields\");\n\t\tif (attr === null) return [];\n\t\treturn attr\n\t\t\t.split(\",\")\n\t\t\t.map((s) => s.trim())\n\t\t\t.filter(Boolean);\n\t}\n\n\tprivate cellHtml(\n\t\tcol: {\n\t\t\tfield: string;\n\t\t\ttemplate?: HTMLTemplateElement;\n\t\t\tdirectTemplate?: string;\n\t\t},\n\t\trow: Record<string, unknown>,\n\t): string {\n\t\tconst template = col.template?.innerHTML ?? col.directTemplate;\n\t\tif (template) return renderCell(template, row, col.field);\n\t\treturn esc(String(row[col.field] ?? \"\"));\n\t}\n\n\tprotected override render(): void {\n\t\tconst cols = this.columns.filter((c) => c.field);\n\t\tconst { rows, total } = this.computeRows();\n\t\tconst paginated = this.hasAttr(\"pagination\");\n\t\tconst pages = Math.max(1, Math.ceil(total / this.rowsPerPage));\n\t\tif (this.page >= pages) this.page = pages - 1;\n\n\t\tconst toolbar = this.toolbarTemplate;\n\t\tconst toolbarHtml = toolbar\n\t\t\t? `<div class=\"toolbar\" part=\"toolbar\">${toolbar.innerHTML}</div>`\n\t\t\t: \"\";\n\n\t\tconst headHtml = cols\n\t\t\t.map((c) => {\n\t\t\t\tconst isSorted = this.sortField === c.field;\n\t\t\t\tconst ind = isSorted\n\t\t\t\t\t? this.sortDir === 1\n\t\t\t\t\t\t? \"▲\"\n\t\t\t\t\t\t: \"▼\"\n\t\t\t\t\t: c.sortable\n\t\t\t\t\t\t? \"⇅\"\n\t\t\t\t\t\t: \"\";\n\t\t\t\tconst activeClass = isSorted ? \"active\" : \"\";\n\t\t\t\treturn `<th part=\"header\" class=\"${c.sortable ? \"sortable\" : \"\"}\" style=\"text-align:${c.align}\" data-field=\"${esc(c.field)}\">${esc(c.header)}${ind ? `<span class=\"sort-ind ${activeClass}\">${ind}</span>` : \"\"}</th>`;\n\t\t\t})\n\t\t\t.join(\"\");\n\n\t\tconst filterRow = cols.some((c) => c.filterable)\n\t\t\t? `<tr class=\"filter-row\">${cols.map((c) => `<th style=\"text-align:${c.align}\">${c.filterable ? `<input class=\"filter\" data-field=\"${esc(c.field)}\" placeholder=\"${esc(\"Filtrar…\")}\" value=\"${esc(this.filters[c.field] ?? \"\")}\">` : \"\"}</th>`).join(\"\")}</tr>`\n\t\t\t: \"\";\n\n\t\tconst bodyHtml = rows.length\n\t\t\t? rows\n\t\t\t\t\t.map(\n\t\t\t\t\t\t(row, i) =>\n\t\t\t\t\t\t\t`<tr part=\"row\" data-index=\"${i}\">${cols.map((c) => `<td part=\"cell\" style=\"text-align:${c.align}\">${this.cellHtml(c, row)}</td>`).join(\"\")}</tr>`,\n\t\t\t\t\t)\n\t\t\t\t\t.join(\"\")\n\t\t\t: `<tr><td class=\"empty\" colspan=\"${cols.length || 1}\">${esc(this.getAttr(\"empty-message\", \"Nenhum registro encontrado\"))}</td></tr>`;\n\n\t\tconst pagerHtml = !paginated\n\t\t\t? \"\"\n\t\t\t: `\n <div class=\"pager\" part=\"pager\">\n <span class=\"info\">Página ${this.page + 1} de ${pages} · ${total} registros</span>\n <button type=\"button\" class=\"pg-btn\" data-pg=\"first\" ${this.page === 0 ? \"disabled\" : \"\"}>«</button>\n <button type=\"button\" class=\"pg-btn\" data-pg=\"prev\" ${this.page === 0 ? \"disabled\" : \"\"}>‹</button>\n ${Array.from({ length: pages }, (_, p) => `<button type=\"button\" class=\"pg-btn\" data-pg=\"${p}\" aria-current=\"${p === this.page}\">${p + 1}</button>`).join(\"\")}\n <button type=\"button\" class=\"pg-btn\" data-pg=\"next\" ${this.page >= pages - 1 ? \"disabled\" : \"\"}>›</button>\n <button type=\"button\" class=\"pg-btn\" data-pg=\"last\" ${this.page >= pages - 1 ? \"disabled\" : \"\"}>»</button>\n <label class=\"info\">${esc(\"Por página:\")}\n <fx-select class=\"rows-sel\" size=\"sm\" value=\"${this.rowsPerPage}\" aria-label=\"Itens por página\">${this.getAttr(\n\t\t\t\t\t\"rows-options\",\n\t\t\t\t\t\"5,10,20,50\",\n\t\t\t\t)\n\t\t\t\t\t.split(\",\")\n\t\t\t\t\t.map((n) => n.trim())\n\t\t\t\t\t.map((n) => `<option value=\"${esc(n)}\">${esc(n)}</option>`)\n\t\t\t\t\t.join(\"\")}</fx-select>\n </label>\n </div>`;\n\n\t\tconst loading = this.hasAttr(\"loading\");\n\t\tconst loadingHtml = loading\n\t\t\t? `<div class=\"loading-overlay\" part=\"loading-overlay\"><div class=\"tbl-spinner\" part=\"spinner\"></div><span class=\"loading-text\">${esc(this.getAttr(\"loading-message\", \"Carregando…\"))}</span></div>`\n\t\t\t: \"\";\n\n\t\tthis.setTemplate(`\n ${toolbarHtml}\n <div class=\"table-wrap\">\n <div class=\"scroll\">\n <table part=\"table\">\n <thead><tr>${headHtml}</tr>${filterRow}</thead>\n <tbody>${bodyHtml}</tbody>\n </table>\n </div>\n ${loadingHtml}\n </div>\n ${pagerHtml}\n `);\n\n\t\t// Ordenação.\n\t\tthis.root\n\t\t\t.querySelectorAll<HTMLTableCellElement>(\"th.sortable\")\n\t\t\t.forEach((th) => {\n\t\t\t\tth.addEventListener(\"click\", () => {\n\t\t\t\t\tconst f = th.dataset.field!;\n\t\t\t\t\tif (this.sortField === f)\n\t\t\t\t\t\tthis.sortDir = this.sortDir === 1 ? -1 : 1;\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis.sortField = f;\n\t\t\t\t\t\tthis.sortDir = 1;\n\t\t\t\t\t}\n\t\t\t\t\tthis.render();\n\t\t\t\t\tthis.dispatchEvent(\n\t\t\t\t\t\tnew CustomEvent(\"sort-change\", {\n\t\t\t\t\t\t\tbubbles: true,\n\t\t\t\t\t\t\tcomposed: true,\n\t\t\t\t\t\t\tdetail: {\n\t\t\t\t\t\t\t\tfield: this.sortField,\n\t\t\t\t\t\t\t\tdirection: this.sortDir === 1 ? \"asc\" : \"desc\",\n\t\t\t\t\t\t\t\tlazy: this.lazy,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t});\n\n\t\t// Filtros (preserva foco/caret ao digitar).\n\t\tthis.root.querySelectorAll<HTMLInputElement>(\".filter\").forEach((inp) => {\n\t\t\tinp.addEventListener(\"input\", () => {\n\t\t\t\tconst field = inp.dataset.field!;\n\t\t\t\tconst value = inp.value;\n\t\t\t\tconst pos = inp.selectionStart;\n\t\t\t\tthis.filters[field] = value;\n\t\t\t\tthis.page = 0;\n\t\t\t\tthis.render();\n\t\t\t\tthis.dispatchEvent(\n\t\t\t\t\tnew CustomEvent(\"filter-change\", {\n\t\t\t\t\t\tbubbles: true,\n\t\t\t\t\t\tcomposed: true,\n\t\t\t\t\t\tdetail: { field, value, lazy: this.lazy },\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\tconst again = this.root.querySelector<HTMLInputElement>(\n\t\t\t\t\t`.filter[data-field=\"${esc(field)}\"]`,\n\t\t\t\t);\n\t\t\t\tif (again) {\n\t\t\t\t\tagain.focus();\n\t\t\t\t\tagain.setSelectionRange(pos, pos);\n\t\t\t\t}\n\t\t\t});\n\t\t\tinp.addEventListener(\"click\", (e) => e.stopPropagation());\n\t\t});\n\n\t\t// Busca global da toolbar.\n\t\tthis.root\n\t\t\t.querySelectorAll<HTMLInputElement>(\"[data-search-fields]\")\n\t\t\t.forEach((inp) => {\n\t\t\t\tinp.addEventListener(\"input\", () => {\n\t\t\t\t\tthis.globalSearch = inp.value;\n\t\t\t\t\tthis.page = 0;\n\t\t\t\t\tconst pos = inp.selectionStart;\n\t\t\t\t\tthis.render();\n\t\t\t\t\tconst again = this.root.querySelector<HTMLInputElement>(\n\t\t\t\t\t\t\"[data-search-fields]\",\n\t\t\t\t\t);\n\t\t\t\t\tif (again) {\n\t\t\t\t\t\tagain.focus();\n\t\t\t\t\t\tagain.setSelectionRange(pos, pos);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\n\t\t// Paginação.\n\t\tthis.root\n\t\t\t.querySelectorAll<HTMLButtonElement>(\".pg-btn\")\n\t\t\t.forEach((btn) => {\n\t\t\t\tbtn.addEventListener(\"click\", () => {\n\t\t\t\t\tconst pg = btn.dataset.pg!;\n\t\t\t\t\tthis.page =\n\t\t\t\t\t\tpg === \"first\"\n\t\t\t\t\t\t\t? 0\n\t\t\t\t\t\t\t: pg === \"prev\"\n\t\t\t\t\t\t\t\t? Math.max(0, this.page - 1)\n\t\t\t\t\t\t\t\t: pg === \"next\"\n\t\t\t\t\t\t\t\t\t? Math.min(pages - 1, this.page + 1)\n\t\t\t\t\t\t\t\t\t: pg === \"last\"\n\t\t\t\t\t\t\t\t\t\t? pages - 1\n\t\t\t\t\t\t\t\t\t\t: Number(pg);\n\t\t\t\t\tthis.render();\n\t\t\t\t\tthis.dispatchEvent(\n\t\t\t\t\t\tnew CustomEvent(\"page-change\", {\n\t\t\t\t\t\t\tbubbles: true,\n\t\t\t\t\t\t\tcomposed: true,\n\t\t\t\t\t\t\tdetail: {\n\t\t\t\t\t\t\t\tpage: this.page + 1,\n\t\t\t\t\t\t\t\tpages,\n\t\t\t\t\t\t\t\trowsPerPage: this.rowsPerPage,\n\t\t\t\t\t\t\t\ttotal,\n\t\t\t\t\t\t\t\tlazy: this.lazy,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t});\n\t\tthis.root\n\t\t\t.querySelector<HTMLElement>(\"fx-select.rows-sel\")\n\t\t\t?.addEventListener(\"change\", (e) => {\n\t\t\t\tconst value = Number((e as CustomEvent).detail?.value);\n\t\t\t\tif (!value || value === this.rowsPerPage) return;\n\t\t\t\tthis.rowsPerPage = value;\n\t\t\t\tthis.page = 0;\n\t\t\t\tthis.render();\n\t\t\t});\n\n\t\t// Clique na linha.\n\t\tthis.root\n\t\t\t.querySelectorAll<HTMLTableRowElement>(\"tbody tr[data-index]\")\n\t\t\t.forEach((tr) => {\n\t\t\t\ttr.addEventListener(\"click\", () => {\n\t\t\t\t\tthis.dispatchEvent(\n\t\t\t\t\t\tnew CustomEvent(\"row-click\", {\n\t\t\t\t\t\t\tbubbles: true,\n\t\t\t\t\t\t\tcomposed: true,\n\t\t\t\t\t\t\tdetail: {\n\t\t\t\t\t\t\t\trow: rows[Number(tr.dataset.index)],\n\t\t\t\t\t\t\t\tindex: Number(tr.dataset.index),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t});\n\n\t\tthis._restoreToolbarSearch();\n\t}\n\n\tprivate _restoreToolbarSearch(): void {\n\t\tconst input = this.root.querySelector<HTMLInputElement>(\n\t\t\t\"[data-search-fields]\",\n\t\t);\n\t\tif (input && this.globalSearch) input.value = this.globalSearch;\n\t}\n}\n\nexport function defineFxTable(): typeof FxTable {\n return defineElement('fx-table', FxTable);\n}\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\", \"full\", \"icon\", \"icon-pos\"];\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/* Full width: o host estica até o pai; o controle interno com\n\t\t atributo full (ou largura herdada) acompanha. */\n\t\t:host([full]) {\n\t\t\tdisplay: block;\n\t\t\twidth: 100%;\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=\"in\" com ícone dentro do campo (fx-input icon):\n\t\t enquanto a label funciona como placeholder (sem foco/valor), ela\n\t\t começa DEPOIS do glifo (mesma métrica de padding do fx-input).\n\t\t Ao subir (active), volta ao offset padrão da borda. ---- */\n\t\t:host([variant=\"in\"]) .flabel.icon-indent {\n\t\t\tleft: calc(\n\t\t\t\tvar(--fx-space-md, 12px) +\n\t\t\t\tvar(--fx-input-icon-size, calc(var(--fx-font-size, 14px) + 6px)) +\n\t\t\t\tvar(--fx-space-sm, 8px)\n\t\t\t);\n\t\t}\n\t\t:host([variant=\"in\"][active]) .flabel.icon-indent {\n\t\t\tleft: var(--fx-space-md, 12px);\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\tthis.applyFull();\n\t\tthis.applyIcon();\n\t\tthis.syncIconIndent();\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\tthis.applyFull();\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(() => {\n\t\t\t\t\tthis.syncState();\n\t\t\t\t\tthis.syncIconIndent();\n\t\t\t\t});\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\", \"icon\", \"icon-pos\"],\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\t/**\n\t * variant=\"in\" + ícone à esquerda dentro do campo (fx-input icon):\n\t * enquanto a label é placeholder ela precisa começar depois do glifo.\n\t * Detecta via atributos icon/icon-pos (ou slot icon) do controle.\n\t */\n\tprivate syncIconIndent(): void {\n\t\tconst label = this.root.querySelector(\".flabel\");\n\t\tif (!label) return;\n\t\tconst c = this.targetControl;\n\t\tconst hasLeftIcon = Boolean(\n\t\t\tc &&\n\t\t\t(c.hasAttribute(\"icon\") || c.querySelector(':scope > [slot=\"icon\"]')) &&\n\t\t\tc.getAttribute(\"icon-pos\") !== \"right\",\n\t\t);\n\t\tlabel.classList.toggle(\"icon-indent\", hasLeftIcon);\n\t}\n\n\tprivate applyFull(): void {\n\t\t// Espelha o full no controle interno: o CSS :host([full]) do floatlabel\n\t\t// estica apenas o HOST — sem isso o campo interno (ex.: fx-input com\n\t\t// width 260px fixa) não acompanharia o container.\n\t\tif (\n\t\t\tthis.targetControl &&\n\t\t\ttypeof this.targetControl.setAttribute === \"function\"\n\t\t) {\n\t\t\tif (this.hasAttr(\"full\")) {\n\t\t\t\tthis.targetControl.setAttribute(\"full\", \"\");\n\t\t\t} else {\n\t\t\t\tthis.targetControl.removeAttribute(\"full\");\n\t\t\t}\n\t\t\t}\n\t}\n\n\tprivate applyIcon(): void {\n\t\tif (\n\t\t\tthis.targetControl &&\n\t\t\ttypeof this.targetControl.setAttribute === \"function\"\n\t\t) {\n\t\t\t// Só propaga icon/icon-pos se o FLOATLABEL possuir o atributo.\n\t\t\t// Se o ícone foi pondo diretamente no controle (ex.: <fx-input icon=\"lock\">),\n\t\t\t// não remove — deixa o controle manter o seu próprio ícone.\n\t\t\tif (this.hasAttr(\"icon\")) {\n\t\t\t\tconst icon = this.getAttr(\"icon\");\n\t\t\t\tconst iconPos = this.getAttr(\"icon-pos\");\n\t\t\t\tif (icon !== \"\") this.targetControl.setAttribute(\"icon\", icon);\n\t\t\t\telse this.targetControl.setAttribute(\"icon\", \"\");\n\t\t\t\tif (iconPos && iconPos !== \"left\") this.targetControl.setAttribute(\"icon-pos\", iconPos);\n\t\t\t\telse this.targetControl.removeAttribute(\"icon-pos\");\n\t\t\t}\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';\nimport { esc } from '../../core/sanitize';\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 /* Largura padrão no HOST: CSS externo, classes e style inline no elemento\n vencem este default naturalmente (regras do documento > :host). */\n width: var(--fx-textarea-width, 260px);\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 /* Acompanha a largura definida no :host. */\n width: 100%;\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']) { width: var(--fx-textarea-width-sm, 220px); }\n :host([size='sm']) .field { min-height: var(--fx-size-sm); padding: var(--fx-space-sm) var(--fx-space-md); }\n :host([size='lg']) { width: var(--fx-textarea-width-lg, 300px); }\n :host([size='lg']) .field { min-height: calc(var(--fx-size-lg) + 80px); }\n /* Full width: o host estica até o pai e o campo interno acompanha. */\n :host([full]) { display: block; width: 100%; }\n :host([full]) .field { width: 100%; }\n `;\n\n static override get observedAttributes(): string[] {\n return ['size', 'placeholder', 'disabled', 'readonly', 'rows', 'maxlength', 'error', 'invalid', 'success', 'valid'];\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=\"${esc(placeholder)}\"` : ''}\n ${rows ? `rows=\"${esc(rows)}\"` : ''}\n ${maxlength ? `maxlength=\"${esc(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\n\n","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\nimport { esc } from '../../core/sanitize';\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 /* Largura customizável por instância: defina --fx-dialog-width no elemento. */\n width: min(var(--fx-dialog-width, 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(var(--fx-dialog-width, 400px), calc(100vw - 32px)); }\n :host([size='lg']) .dialog { width: min(var(--fx-dialog-width, 800px), calc(100vw - 32px)); }\n /* Mobile: dialog ocupa praticamente toda a largura da tela. */\n @media (max-width: 640px) {\n .dialog, :host([size='sm']) .dialog, :host([size='lg']) .dialog {\n width: calc(100vw - 16px);\n max-width: calc(100vw - 16px);\n }\n }\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=\"${esc(heading)}\" tabindex=\"-1\">\n <header>\n <h2>${esc(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 // Evita listeners duplicados em re-renders enquanto aberto\n // (ex.: mudança de heading/size com o dialog aberto sobrescreveria\n // o _cleanup anterior, deixando listeners de document órfãos).\n this._cleanup?.();\n this._cleanup = undefined;\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._cleanup?.();\n this._cleanup = undefined;\n this._restoreFocus();\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 preso no diálogo\n const onKey = (e: KeyboardEvent): void => {\n if (e.key === 'Escape') { e.stopPropagation(); close(); return; }\n if (e.key === 'Tab') this._trapFocus(e);\n };\n document.addEventListener('keydown', onKey);\n this._cleanup = () => document.removeEventListener('keydown', onKey);\n\n requestAnimationFrame(() => {\n this._previouslyFocused = document.activeElement as HTMLElement | null;\n this.root.querySelector<HTMLElement>('.dialog')?.focus();\n });\n this.dispatchEvent(new CustomEvent('open', { bubbles: true, composed: true }));\n }\n\n private _cleanup?: () => void;\n private _previouslyFocused: HTMLElement | null = null;\n\n /** Mantém o foco dentro do modal (WCAG 2.4.3 / 2.1.2). */\n private _trapFocus(e: KeyboardEvent): void {\n const dialog = this.root.querySelector<HTMLElement>('.dialog');\n if (!dialog) return;\n const focusables = dialog.querySelectorAll<HTMLElement>(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])',\n );\n if (!focusables.length) return;\n const first = focusables[0];\n const last = focusables[focusables.length - 1];\n const active = this.root.activeElement;\n if (e.shiftKey && (active === first || active === dialog)) {\n e.preventDefault();\n last.focus();\n } else if (!e.shiftKey && active === last) {\n e.preventDefault();\n first.focus();\n }\n }\n\n private _restoreFocus(): void {\n if (this._previouslyFocused?.isConnected) this._previouslyFocused.focus();\n this._previouslyFocused = null;\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this._cleanup?.();\n this._cleanup = undefined;\n this._restoreFocus();\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\n\n","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\nimport { esc } from '../../core/sanitize';\nimport { FENIX_ICON_BASE_CSS, isFenixIconName } from '../../icons/base-css';\n\n/**\n * <fx-confirmpopup> — Popup de confirmação não-modal ancorado em um elemento,\n * exibido acima ou abaixo dinamicamente (com flip automático quando não há\n * espaço na viewport), no estilo ConfirmPopup do PrimeVue.\n *\n * Atributos:\n * - target (seletor CSS do elemento âncora — obrigatório para abrir);\n * - message (texto da mensagem, quando o slot padrão não é usado);\n * - icon (emoji/glifo exibido antes da mensagem; se for um nome da Fenix Icons,\n * ex.: icon=\"help\", é renderizado com a fonte de ícones);\n * - accept-label / reject-label (textos dos botões padrão);\n * - position (top|bottom|auto — padrão `auto`, que faz flip conforme o espaço);\n * - open (exibe o popup).\n *\n * Slots:\n * - padrão: corpo da mensagem (template \"message\");\n * - `accept`: conteúdo do botão de confirmação (template \"accept\");\n * - `reject`: conteúdo do botão de rejeição (template \"reject\").\n *\n * Eventos (composed): `accept` e `reject` — ambos fecham o popup.\n */\nexport class FxConfirmPopup extends FxElement {\n static override styles = css`\n :host { display: contents; }\n .popup {\n position: fixed;\n margin: 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 padding: var(--fx-space-md) var(--fx-space-lg);\n min-width: 220px;\n max-width: min(380px, calc(100vw - 24px));\n font-family: var(--fx-font-family);\n font-size: var(--fx-font-size);\n color: var(--fx-text-default);\n z-index: var(--fx-z-modal, 1100);\n animation: fxcp-pop var(--fx-motion-duration-fast, 150ms) var(--fx-motion-easing, ease);\n }\n .popup[hidden] { display: none; }\n @keyframes fxcp-pop { from { opacity: 0; transform: scale(0.96); } to { opacity: 1; transform: scale(1); } }\n /* seta indicadora */\n .popup::before {\n content: '';\n position: absolute;\n left: var(--fxcp-arrow-x, 50%);\n border: 7px solid transparent;\n }\n .popup[data-side='bottom']::before {\n top: -14px;\n border-bottom-color: var(--fx-border-default);\n }\n .popup[data-side='top']::before {\n bottom: -14px;\n border-top-color: var(--fx-border-default);\n }\n .popup::after {\n content: '';\n position: absolute;\n left: var(--fxcp-arrow-x, 50%);\n border: 6px solid transparent;\n }\n .popup[data-side='bottom']::after {\n top: -12px;\n border-bottom-color: var(--fx-surface-background);\n }\n .popup[data-side='top']::after {\n bottom: -12px;\n border-top-color: var(--fx-surface-background);\n }\n .message {\n display: flex;\n align-items: flex-start;\n gap: var(--fx-space-sm);\n }\n .icon { font-size: calc(var(--fx-font-size) + 4px); line-height: 1.2; }\n ${FENIX_ICON_BASE_CSS}\n .icon.fx-icon { font-size: calc(var(--fx-font-size) + 6px); color: var(--fx-color-primary); }\n .text { margin: 0; }\n footer {\n display: flex;\n justify-content: flex-end;\n gap: var(--fx-space-sm);\n margin-top: var(--fx-space-md);\n }\n footer button {\n font-family: var(--fx-font-family);\n font-size: calc(var(--fx-font-size) - 2px);\n padding: var(--fx-space-xs) var(--fx-space-md);\n border-radius: var(--fx-radius-sm);\n border: 1px solid var(--fx-border-default);\n background: var(--fx-surface-background);\n color: var(--fx-text-default);\n cursor: pointer;\n transition: background var(--fx-motion-duration-fast) var(--fx-motion-easing);\n }\n footer button:hover { background: var(--fx-surface-surface-hover, rgba(0, 0, 0, 0.04)); }\n footer button.accept {\n background: var(--fx-color-primary);\n border-color: var(--fx-color-primary);\n color: #fff;\n }\n footer button.accept:hover { filter: brightness(0.92); background: var(--fx-color-primary); }\n `;\n\n static override get observedAttributes(): string[] {\n return ['open', 'target', 'message', 'icon', 'accept-label', 'reject-label', 'position'];\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 message = this.getAttr('message');\n const icon = this.getAttr('icon');\n const iconIsFx = isFenixIconName(icon);\n if (iconIsFx) void import('../../icons');\n const acceptLabel = this.getAttr('accept-label', 'Sim');\n const rejectLabel = this.getAttr('reject-label', 'Não');\n\n this.setTemplate(`\n <div class=\"popup\" part=\"popup\" role=\"alertdialog\" aria-modal=\"false\" ${this.open ? '' : 'hidden'}>\n <div class=\"message\" part=\"message\">\n ${icon ? `<span class=\"icon${iconIsFx ? ' fx-icon' : ''}\" aria-hidden=\"true\">${esc(icon)}</span>` : ''}\n <p class=\"text\"><slot>${esc(message)}</slot></p>\n </div>\n <footer part=\"footer\">\n <slot name=\"reject\">\n <button type=\"button\" class=\"reject\" part=\"reject-button\">${esc(rejectLabel)}</button>\n </slot>\n <slot name=\"accept\">\n <button type=\"button\" class=\"accept\" part=\"accept-button\">${esc(acceptLabel)}</button>\n </slot>\n </footer>\n </div>\n `);\n\n if (!this.open) return;\n\n const popup = this.root.querySelector<HTMLElement>('.popup');\n if (!popup) return;\n\n // Evita listeners duplicados em re-renders enquanto aberto\n // (ex.: mudança de message/icon/accept-label com o popup aberto).\n this._cleanup?.();\n this._cleanup = undefined;\n\n const close = (event: 'accept' | 'reject'): void => {\n this.open = false;\n this._cleanup?.();\n this._cleanup = undefined;\n this._restoreFocus();\n this.dispatchEvent(new CustomEvent(event, { bubbles: true, composed: true }));\n };\n\n this.root.querySelector('.reject')?.addEventListener('click', () => close('reject'));\n this.root.querySelector('.accept')?.addEventListener('click', () => close('accept'));\n\n // ESC fecha (reject) — clique fora fecha (reject)\n const onKey = (e: KeyboardEvent): void => {\n if (e.key === 'Escape') { e.stopPropagation(); close('reject'); }\n };\n const onPointerDown = (e: MouseEvent): void => {\n const path = e.composedPath();\n const anchor = this._anchor();\n const hitAnchor = anchor ? path.includes(anchor) : false;\n if (!path.includes(popup) && !hitAnchor) close('reject');\n };\n document.addEventListener('keydown', onKey);\n document.addEventListener('pointerdown', onPointerDown, true);\n this._cleanup = () => {\n document.removeEventListener('keydown', onKey);\n document.removeEventListener('pointerdown', onPointerDown, true);\n };\n\n this._position(popup);\n this._previouslyFocused = document.activeElement as HTMLElement | null;\n requestAnimationFrame(() => {\n this.root.querySelector<HTMLElement>('button.accept')?.focus();\n });\n }\n\n private _cleanup?: () => void;\n private _previouslyFocused: HTMLElement | null = null;\n\n private _anchor(): HTMLElement | null {\n const selector = this.getAttr('target');\n if (!selector) return null;\n try {\n return document.querySelector<HTMLElement>(selector);\n } catch {\n return null;\n }\n }\n\n /**\n * Posiciona o popup fixo junto ao âncora, acima ou abaixo dinamicamente:\n * `position=\"auto\"` (padrão) prefere abaixo e faz flip para cima quando\n * não há espaço; `top`/`bottom` forçam o lado.\n */\n private _position(popup: HTMLElement): void {\n const anchor = this._anchor();\n if (!anchor) return;\n popup.hidden = false;\n\n const a = anchor.getBoundingClientRect();\n const p = popup.getBoundingClientRect();\n const gap = 8;\n const margin = 8;\n\n let side: 'top' | 'bottom';\n const pos = this.getAttr('position', 'auto');\n if (pos === 'top') side = 'top';\n else if (pos === 'bottom') side = 'bottom';\n else side = a.bottom + gap + p.height <= window.innerHeight - margin ? 'bottom' : 'top';\n\n // clamp horizontal para nunca sair da viewport\n const left = Math.min(\n Math.max(margin, a.left + a.width / 2 - p.width / 2),\n window.innerWidth - p.width - margin,\n );\n const top = side === 'bottom' ? a.bottom + gap : a.top - gap - p.height;\n\n popup.dataset.side = side;\n popup.style.left = `${Math.round(left)}px`;\n popup.style.top = `${Math.round(Math.max(margin, top))}px`;\n // posição da seta relativa ao popup\n const arrowX = Math.min(Math.max(a.left + a.width / 2 - left, 16), p.width - 16);\n popup.style.setProperty('--fxcp-arrow-x', `${Math.round(arrowX)}px`);\n }\n\n private _restoreFocus(): void {\n if (this._previouslyFocused?.isConnected) this._previouslyFocused.focus();\n this._previouslyFocused = null;\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n // reposiciona em scroll/resize enquanto aberto\n window.addEventListener('scroll', this._onReposition, true);\n window.addEventListener('resize', this._onReposition);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n window.removeEventListener('scroll', this._onReposition, true);\n window.removeEventListener('resize', this._onReposition);\n this._cleanup?.();\n this._cleanup = undefined;\n this._restoreFocus();\n }\n\n private _onReposition = (): void => {\n if (!this.open) return;\n const popup = this.root.querySelector<HTMLElement>('.popup');\n if (popup && !popup.hidden) this._position(popup);\n };\n}\n\nexport function defineFxConfirmPopup(): typeof FxConfirmPopup {\n return defineElement('fx-confirmpopup', FxConfirmPopup);\n}\n\n","import { FxConfirmPopup, defineFxConfirmPopup } from './confirmpopup';\n\nexport { FxConfirmPopup };\n\ndefineFxConfirmPopup();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'fx-confirmpopup': FxConfirmPopup;\n }\n}\n","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\nimport { esc } from '../../core/sanitize';\nimport { FENIX_ICON_BASE_CSS, fenixIconHtml } from '../../icons/base-css';\n\n/**\n * <fx-fileupload> — Seletor de arquivos com upload e progresso (estilo FileUpload do PrimeVue).\n *\n * Atributos:\n * - mode (basic|advanced — `basic`: botão; `advanced`: dropzone com drag & drop);\n * - size (sm|md|lg, padrão md);\n * - severity (primary|secondary|success|warning|danger|info — cor do botão no modo basic);\n * - label (texto do botão/área, padrão 'Escolher arquivo');\n * - icon (glifo/emoji exibido antes do texto — sem o atributo, sem ícone);\n * - accept, multiple, disabled (como no <input type=\"file\">);\n * - show-progress (exibe barra + % de upload);\n * - progress (0-100 — o consumidor atualiza durante o upload real);\n * - value (nome(s) do(s) arquivo(s) carregado(s), somente leitura/espelho).\n *\n * Eventos (composed): `select` (detail: { files: File[] }), `remove`, `complete`.\n */\nexport class FxFileUpload 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 }\n :host([disabled]) { opacity: 0.55; pointer-events: none; }\n input[type='file'] { display: none; }\n\n /* ---- botão (basic) ---- */\n .btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--fx-space-sm);\n /* Largura acompanha o host: CSS externo/classe/inline no elemento esticam\n o botão sem precisar do full (host é shrink-to-fit por padrão). */\n width: 100%;\n min-height: var(--fx-size-md);\n padding: var(--fx-space-md) var(--fx-space-lg);\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 cursor: pointer;\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 background var(--fx-motion-duration-normal) var(--fx-motion-easing);\n }\n .btn:hover { border-color: var(--fx-border-hover); background: var(--fx-surface-surface-hover, rgba(0,0,0,0.03)); }\n .btn:focus-visible {\n outline: none;\n border-color: var(--fx-color-primary);\n box-shadow: var(--fx-effect-focus-ring, none);\n }\n /* Severities (como no <fx-button>) — aplicam-se ao botão do modo basic */\n :host([severity='primary']) .btn { background: var(--fx-color-primary); border-color: transparent; color: #fff; }\n :host([severity='secondary']) .btn { background: var(--fx-color-secondary); border-color: transparent; color: #fff; }\n :host([severity='success']) .btn { background: var(--fx-color-success); border-color: transparent; color: #fff; }\n :host([severity='warning']) .btn { background: var(--fx-color-warning); border-color: transparent; color: #fff; }\n :host([severity='danger']) .btn { background: var(--fx-color-danger); border-color: transparent; color: #fff; }\n :host([severity='info']) .btn { background: var(--fx-color-info); border-color: transparent; color: #fff; }\n :host([severity]) .btn:hover { filter: brightness(0.88); }\n :host([severity]) .btn:focus-visible { border-color: transparent; }\n :host([size='sm']) .btn { min-height: var(--fx-size-sm); padding: var(--fx-space-sm) var(--fx-space-md); font-size: calc(var(--fx-font-size) - 2px); }\n :host([size='lg']) .btn { min-height: var(--fx-size-lg); padding: var(--fx-space-lg) var(--fx-space-xl); font-size: calc(var(--fx-font-size) + 4px); }\n :host([size='sm']) .drop { min-height: 72px; }\n :host([size='lg']) .drop { min-height: 132px; }\n\n /* ---- dropzone (advanced) ---- */\n .drop {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: var(--fx-space-sm);\n /* Acompanha a largura do host (definida por CSS externo/classe/inline). */\n width: 100%;\n min-height: 100px;\n padding: var(--fx-space-lg);\n border: 2px dashed var(--fx-border-default);\n border-radius: var(--fx-radius-md);\n color: var(--fx-text-muted);\n cursor: pointer;\n text-align: center;\n transition: border-color var(--fx-motion-duration-normal) var(--fx-motion-easing), background var(--fx-motion-duration-normal) var(--fx-motion-easing);\n }\n .drop:hover, .drop.over {\n border-color: var(--fx-color-primary);\n background: color-mix(in srgb, var(--fx-color-primary) 6%, transparent);\n }\n .drop .icon { font-size: calc(var(--fx-font-size) + 12px); line-height: 1; }\n .drop .hint { font-size: calc(var(--fx-font-size) - 2px); }\n\n /* ---- ícone comum ---- */\n .icon { line-height: 1; }\n\n /* ---- arquivo(s) selecionado(s) ---- */\n .files { display: flex; flex-direction: column; gap: var(--fx-space-xs); margin-top: var(--fx-space-sm); }\n .file {\n display: flex;\n align-items: center;\n gap: var(--fx-space-sm);\n padding: var(--fx-space-xs) var(--fx-space-sm);\n border: 1px solid var(--fx-border-default);\n border-radius: var(--fx-radius-sm);\n font-size: calc(var(--fx-font-size) - 2px);\n color: var(--fx-text-default);\n }\n .file .name { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n .file .size { color: var(--fx-text-muted); white-space: nowrap; }\n .file .remove {\n border: none;\n background: transparent;\n color: var(--fx-text-muted);\n cursor: pointer;\n font-size: calc(var(--fx-font-size) + 2px);\n line-height: 1;\n padding: 0 var(--fx-space-xs);\n border-radius: var(--fx-radius-full);\n }\n .file .remove:hover { color: var(--fx-color-danger); }\n\n /* ---- progresso ---- */\n .progress-row { display: flex; align-items: center; gap: var(--fx-space-sm); margin-top: var(--fx-space-sm); }\n .track {\n flex: 1;\n height: 6px;\n background: var(--fx-surface-surface-hover);\n border-radius: var(--fx-radius-full);\n overflow: hidden;\n }\n .bar {\n height: 100%;\n width: 0%;\n background: var(--fx-color-primary);\n border-radius: var(--fx-radius-full);\n transition: width var(--fx-motion-duration-normal) var(--fx-motion-easing);\n }\n :host([progress='100']) .bar { background: var(--fx-color-success); }\n .pct {\n font-size: calc(var(--fx-font-size) - 2px);\n font-weight: 600;\n color: var(--fx-text-default);\n min-width: 34px;\n text-align: right;\n }\n /* Full width: o host estica até o pai e o botão/dropzone acompanha. */\n :host([full]) { display: block; width: 100%; }\n :host([full]) .btn { width: 100%; }\n :host([full]) .drop { width: 100%; }\n /* Base dos glifos Fenix Icons (o @font-face vem de @wrrdev/fenix-ui/icons). */\n ${FENIX_ICON_BASE_CSS}\n `;\n\n static override get observedAttributes(): string[] {\n return ['mode', 'size', 'severity', 'label', 'icon', 'accept', 'multiple', 'disabled', 'show-progress', 'progress', 'value', 'full'];\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 /** Nomes dos arquivos selecionados (espelho em `value`). */\n get value(): string { return this.getAttr('value'); }\n set value(v: string) { this.setAttribute('value', v); }\n\n get progress(): number { return Math.min(100, Math.max(0, Number(this.getAttr('progress', '0')) || 0)); }\n set progress(v: number) { this.setAttribute('progress', String(v)); }\n\n /** Arquivos selecionados (não serializável em atributo). */\n get files(): File[] { return this._files; }\n set files(files: File[]) {\n this._files = Array.from(files);\n this.value = this._files.map((f) => f.name).join(', ');\n this._syncFilesArea();\n }\n\n protected override render(): void {\n const mode = this.getAttr('mode', 'basic');\n const advanced = mode === 'advanced';\n const label = this.getAttr('label', 'Escolher arquivo');\n const icon = this.getAttr('icon');\n const accept = this.getAttr('accept');\n const multiple = this.hasAttr('multiple');\n const disabled = this.hasAttr('disabled');\n const showProgress = this.hasAttr('show-progress');\n const pct = this.progress;\n\n const fileInput = `<input type=\"file\" class=\"picker\" ${accept ? `accept=\"${esc(accept)}\"` : ''} ${multiple ? 'multiple' : ''} ${disabled ? 'disabled' : ''} />`;\n\n this.setTemplate(`\n ${advanced\n ? `<div class=\"drop\" part=\"dropzone\" role=\"button\" tabindex=\"0\" aria-label=\"${esc(label)}\">\n ${icon ? `<span class=\"icon\" part=\"icon\" aria-hidden=\"true\">${fenixIconHtml(icon)}</span>` : ''}\n <span>${esc(label)}</span>\n <span class=\"hint\">ou arraste e solte aqui</span>\n </div>`\n : `<button type=\"button\" class=\"btn\" part=\"button\">\n ${icon ? `<span class=\"icon\" part=\"icon\" aria-hidden=\"true\">${fenixIconHtml(icon)}</span>` : ''}\n <span>${esc(label)}</span>\n </button>`}\n ${fileInput}\n <div class=\"files\" part=\"files\"></div>\n ${showProgress ? `\n <div class=\"progress-row\" part=\"progress\">\n <div class=\"track\" role=\"progressbar\" aria-valuenow=\"${pct}\" aria-valuemin=\"0\" aria-valuemax=\"100\">\n <div class=\"bar\" style=\"width: ${pct}%\"></div>\n </div>\n <span class=\"pct\">${pct}%</span>\n </div>` : ''}\n `);\n\n this._bindPicker();\n this._syncFilesArea();\n\n if (!this._done && showProgress && pct >= 100 && this._files.length) {\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 _files: File[] = [];\n private _done = false;\n\n private _picker(): HTMLInputElement | null {\n return this.root.querySelector<HTMLInputElement>('.picker');\n }\n\n private _bindPicker(): void {\n const picker = this._picker();\n if (!picker) return;\n const trigger = this.root.querySelector('.btn') ?? this.root.querySelector('.drop');\n trigger?.addEventListener('click', () => picker.click());\n trigger?.addEventListener('keydown', (e) => {\n if ((e as KeyboardEvent).key === 'Enter' || (e as KeyboardEvent).key === ' ') {\n e.preventDefault();\n picker.click();\n }\n });\n picker.addEventListener('change', () => this._acceptFiles(picker.files ?? []));\n\n // drag & drop (advanced)\n const drop = this.root.querySelector<HTMLElement>('.drop');\n if (!drop) return;\n drop.addEventListener('dragover', (e) => { e.preventDefault(); drop.classList.add('over'); });\n drop.addEventListener('dragleave', () => drop.classList.remove('over'));\n drop.addEventListener('drop', (e) => {\n e.preventDefault();\n drop.classList.remove('over');\n if (e.dataTransfer?.files.length) this._acceptFiles(e.dataTransfer.files);\n });\n }\n\n private _acceptFiles(list: FileList | File[]): void {\n const picked = this.hasAttr('multiple') ? Array.from(list) : [list[0]].filter(Boolean);\n this.files = picked;\n const picker = this._picker();\n if (picker) picker.value = '';\n this.dispatchEvent(\n new CustomEvent('select', { bubbles: true, composed: true, detail: { files: picked } }),\n );\n }\n\n private _fmtSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n }\n\n /** Renderiza a lista de arquivos sem re-renderizar o template (mantém estado). */\n private _syncFilesArea(): void {\n const area = this.root?.querySelector?.('.files') as HTMLElement | null;\n if (!area) return;\n area.innerHTML = this._files\n .map(\n (f, i) => `\n <div class=\"file\" part=\"file\">\n <span class=\"name\">${esc(f.name)}</span>\n <span class=\"size\">${this._fmtSize(f.size)}</span>\n <button type=\"button\" class=\"remove\" data-i=\"${i}\" part=\"remove\" aria-label=\"Remover ${esc(f.name)}\">×</button>\n </div>`,\n )\n .join('');\n area.querySelectorAll<HTMLButtonElement>('.remove').forEach((btn) =>\n btn.addEventListener('click', () => {\n const removed = this._files.splice(Number(btn.dataset.i), 1)[0];\n this.value = this._files.map((f) => f.name).join(', ');\n this.progress = 0;\n this._syncFilesArea();\n this.dispatchEvent(\n new CustomEvent('remove', { bubbles: true, composed: true, detail: { file: removed } }),\n );\n }),\n );\n }\n}\n\nexport function defineFxFileUpload(): typeof FxFileUpload {\n return defineElement('fx-fileupload', FxFileUpload);\n}\n\n\n","import { FxFileUpload, defineFxFileUpload } from './fileupload';\n\nexport { FxFileUpload };\n\ndefineFxFileUpload();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'fx-fileupload': FxFileUpload;\n }\n}\n","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\n\n/**\n * <fx-slider> — Controle deslizante para seleção de valor numérico em um intervalo.\n *\n * Atributos: min, max, step, value, size (sm|md|lg), disabled, show-value,\n * label (rótulo acima do trilho).\n * Eventos (composed): `input` (durante o arraste) e `change` (ao soltar) —\n * ambos com `detail: { value: number }`.\n */\nexport class FxSlider 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 --_track-h: 6px;\n --_thumb: 18px;\n }\n :host([size='sm']) { --_track-h: 4px; --_thumb: 14px; }\n :host([size='lg']) { --_track-h: 8px; --_thumb: 22px; }\n :host([disabled]) { opacity: 0.55; pointer-events: none; }\n\n .label {\n font-size: calc(var(--fx-font-size) - 2px);\n color: var(--fx-text-muted);\n margin-bottom: var(--fx-space-xs);\n display: flex;\n justify-content: space-between;\n gap: var(--fx-space-md);\n align-items: center;\n }\n .track-wrap {\n position: relative;\n display: flex;\n align-items: center;\n height: var(--_thumb);\n cursor: pointer;\n touch-action: none;\n }\n .track {\n width: 100%;\n height: var(--_track-h);\n border-radius: var(--fx-radius-full);\n background: var(--fx-surface-surface-hover, rgba(0, 0, 0, 0.08));\n overflow: hidden;\n }\n .fill {\n height: 100%;\n background: var(--fx-color-primary);\n border-radius: var(--fx-radius-full);\n }\n .thumb {\n position: absolute;\n top: 50%;\n width: var(--_thumb);\n height: var(--_thumb);\n border-radius: var(--fx-radius-full);\n background: var(--fx-surface-background);\n border: 2px solid var(--fx-color-primary);\n box-shadow: var(--fx-shadow-sm);\n transform: translate(-50%, -50%);\n transition: box-shadow var(--fx-motion-duration-fast) var(--fx-motion-easing);\n box-sizing: border-box;\n }\n .track-wrap:hover .thumb,\n .track-wrap.dragging .thumb { box-shadow: var(--fx-effect-focus-ring, none); }\n .track-wrap:focus-visible { outline: none; }\n .track-wrap:focus-visible .thumb {\n box-shadow: var(--fx-effect-focus-ring, none);\n }\n .value {\n position: absolute;\n bottom: calc(100% + 6px);\n transform: translateX(-50%);\n background: var(--fx-text-default, #1e293b);\n color: var(--fx-surface-background, #fff);\n font-size: calc(var(--fx-font-size) - 3px);\n font-weight: 600;\n padding: 2px var(--fx-space-xs);\n border-radius: var(--fx-radius-sm);\n white-space: nowrap;\n pointer-events: none;\n opacity: 0;\n transition: opacity var(--fx-motion-duration-fast) var(--fx-motion-easing);\n }\n .track-wrap:hover .value,\n .track-wrap.dragging .value,\n .track-wrap:focus-visible .value { opacity: 1; }\n `;\n\n static override get observedAttributes(): string[] {\n return ['min', 'max', 'step', 'size', 'disabled', 'show-value', 'label'];\n }\n\n get min(): number { return this._num('min', 0); }\n get max(): number { return this._num('max', 100); }\n get step(): number { return this._num('step', 1); }\n\n get value(): number {\n return this._clamp(this._num('value', this.min));\n }\n set value(v: number) {\n const snapped = this._snap(v);\n this.setAttribute('value', String(snapped));\n // atualiza visual sem re-render (preserva estado de drag/foco)\n if (this.isConnected) this._syncVisual();\n }\n\n private _num(attr: string, fallback: number): number {\n const raw = this.getAttribute(attr);\n if (raw === null || raw === '') return fallback;\n const n = Number(raw);\n return Number.isFinite(n) ? n : fallback;\n }\n\n private _clamp(v: number): number {\n return Math.min(this.max, Math.max(this.min, v));\n }\n\n /** Arredonda para o múltiplo de `step` mais próximo dentro do intervalo. */\n private _snap(v: number): number {\n const step = this.step || 1;\n const snapped = Math.round((this._clamp(v) - this.min) / step) * step + this.min;\n return Number(this._clamp(snapped).toFixed(10));\n }\n\n /** Percentual (0-100) do valor atual dentro do intervalo. */\n private _pct(): number {\n const span = this.max - this.min;\n return span <= 0 ? 0 : ((this.value - this.min) / span) * 100;\n }\n\n protected override render(): void {\n const pct = this._pct();\n const label = this.getAttr('label');\n const showValue = this.hasAttr('show-value');\n\n this.setTemplate(`\n ${label ? `<div class=\"label\" part=\"label\"><span>${label}</span>${showValue ? `<span>${this.value}</span>` : ''}</div>` : ''}\n <div class=\"track-wrap\" part=\"track\" tabindex=\"0\" role=\"slider\"\n aria-valuemin=\"${this.min}\" aria-valuemax=\"${this.max}\" aria-valuenow=\"${this.value}\"\n aria-label=\"${label || 'Slider'}\" ${this.hasAttr('disabled') ? 'aria-disabled=\"true\"' : ''}>\n <div class=\"track\"><div class=\"fill\" part=\"fill\" style=\"width: ${pct}%\"></div></div>\n <div class=\"thumb\" part=\"thumb\" style=\"left: ${pct}%\"></div>\n ${showValue ? `<span class=\"value\" style=\"left: ${pct}%\">${this.value}</span>` : ''}\n </div>\n `);\n\n this._bindPointer();\n this._bindKeyboard();\n }\n\n private _dragging = false;\n private _onMove?: (e: PointerEvent) => void;\n private _onUp?: (e: PointerEvent) => void;\n\n protected override disconnectedCallback(): void {\n super.disconnectedCallback();\n // Limpa listeners de janela se o elemento for removido durante um drag.\n if (this._dragging) {\n this._dragging = false;\n if (this._onMove) window.removeEventListener('pointermove', this._onMove);\n if (this._onUp) window.removeEventListener('pointerup', this._onUp);\n }\n }\n\n private _wrap(): HTMLElement | null {\n return this.root.querySelector<HTMLElement>('.track-wrap');\n }\n\n private _bindPointer(): void {\n const wrap = this._wrap();\n if (!wrap) return;\n\n const valueFromEvent = (e: PointerEvent): number => {\n const rect = wrap.getBoundingClientRect();\n const ratio = rect.width <= 0 ? 0 : (e.clientX - rect.left) / rect.width;\n return this.min + ratio * (this.max - this.min);\n };\n\n const move = (e: PointerEvent): void => {\n if (!this._dragging) return;\n this.value = valueFromEvent(e);\n this._syncVisual();\n this.dispatchEvent(\n new CustomEvent('input', { bubbles: true, composed: true, detail: { value: this.value } }),\n );\n };\n this._onMove = move;\n const up = (e: PointerEvent): void => {\n if (!this._dragging) return;\n this._dragging = false;\n wrap.classList.remove('dragging');\n window.removeEventListener('pointermove', move);\n window.removeEventListener('pointerup', up);\n this.value = valueFromEvent(e);\n this._syncVisual();\n this.dispatchEvent(\n new CustomEvent('change', { bubbles: true, composed: true, detail: { value: this.value } }),\n );\n };\n this._onUp = up;\n\n wrap.addEventListener('pointerdown', (e) => {\n if (this.hasAttr('disabled')) return;\n this._dragging = true;\n wrap.classList.add('dragging');\n wrap.focus();\n this.value = valueFromEvent(e);\n this._syncVisual();\n this.dispatchEvent(\n new CustomEvent('input', { bubbles: true, composed: true, detail: { value: this.value } }),\n );\n window.addEventListener('pointermove', move);\n window.addEventListener('pointerup', up);\n });\n }\n\n private _bindKeyboard(): void {\n const wrap = this._wrap();\n if (!wrap) return;\n wrap.addEventListener('keydown', (e) => {\n if (this.hasAttr('disabled')) return;\n const ev = e as KeyboardEvent;\n const big = (this.max - this.min) / 10;\n let next: number | null = null;\n switch (ev.key) {\n case 'ArrowRight': case 'ArrowUp': next = this.value + this.step; break;\n case 'ArrowLeft': case 'ArrowDown': next = this.value - this.step; break;\n case 'PageUp': next = this.value + big; break;\n case 'PageDown': next = this.value - big; break;\n case 'Home': next = this.min; break;\n case 'End': next = this.max; break;\n default: return;\n }\n ev.preventDefault();\n this.value = next;\n this._syncVisual();\n this.dispatchEvent(\n new CustomEvent('input', { bubbles: true, composed: true, detail: { value: this.value } }),\n );\n this.dispatchEvent(\n new CustomEvent('change', { bubbles: true, composed: true, detail: { value: this.value } }),\n );\n });\n }\n\n /** Atualiza fill/thumb/tooltip/aria sem re-renderizar o template (evita perder o drag). */\n private _syncVisual(): void {\n const pct = this._pct();\n const wrap = this._wrap();\n if (!wrap) return;\n const fill = wrap.querySelector<HTMLElement>('.fill');\n const thumb = wrap.querySelector<HTMLElement>('.thumb');\n const tip = wrap.querySelector<HTMLElement>('.value');\n if (fill) fill.style.width = `${pct}%`;\n if (thumb) thumb.style.left = `${pct}%`;\n if (tip) {\n tip.style.left = `${pct}%`;\n tip.textContent = String(this.value);\n }\n wrap.setAttribute('aria-valuenow', String(this.value));\n const labelPct = this.root.querySelector<HTMLElement>('.label span:last-child');\n if (labelPct) labelPct.textContent = String(this.value);\n }\n}\n\nexport function defineFxSlider(): typeof FxSlider {\n return defineElement('fx-slider', FxSlider);\n}\n\n","import { FxSlider, defineFxSlider } from './slider';\n\nexport { FxSlider };\n\ndefineFxSlider();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'fx-slider': FxSlider;\n }\n}\n","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\nimport { FENIX_ICON_BASE_CSS, fenixIconHtml } from '../../icons/base-css';\n\n/**\n * <fx-chip> — Chip/Tag compacto para labels, filtros e seleções.\n *\n * Atributos: variant (primary|secondary|success|warning|danger|info),\n * size (sm|md|lg), removable (mostra o botão ×), selectable (clica alterna\n * o estado selected), selected, disabled, icon (glifo/emoji).\n * Slot padrão: texto do chip.\n * Eventos (composed): `remove` (ao clicar em ×) e `chip-click` (ao clicar).\n */\nexport class FxChip 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 }\n .chip {\n display: inline-flex;\n align-items: center;\n gap: var(--fx-space-xs);\n padding: var(--fx-space-xs) var(--fx-space-md);\n min-height: var(--fx-size-sm);\n box-sizing: border-box;\n font-size: calc(var(--fx-font-size) - 2px);\n font-weight: var(--fx-font-weight);\n color: var(--fx-text-default);\n background: var(--fx-surface-surface-hover, rgba(0, 0, 0, 0.06));\n border: 1px solid transparent;\n border-radius: var(--fx-radius-full);\n user-select: none;\n transition:\n background var(--fx-motion-duration-fast) var(--fx-motion-easing),\n border-color var(--fx-motion-duration-fast) var(--fx-motion-easing),\n filter var(--fx-motion-duration-fast) var(--fx-motion-easing);\n }\n :host([size='md']) .chip { min-height: var(--fx-size-md); padding: var(--fx-space-xs) var(--fx-space-lg); }\n :host([size='lg']) .chip { min-height: var(--fx-size-lg); font-size: var(--fx-font-size); padding: var(--fx-space-sm) var(--fx-space-xl); }\n\n :host([variant='primary']) .chip { background: color-mix(in srgb, var(--fx-color-primary) 14%, transparent); color: var(--fx-color-primary); }\n :host([variant='secondary']) .chip { background: color-mix(in srgb, var(--fx-color-secondary) 14%, transparent); color: var(--fx-color-secondary); }\n :host([variant='success']) .chip { background: color-mix(in srgb, var(--fx-color-success) 14%, transparent); color: var(--fx-color-success); }\n :host([variant='warning']) .chip { background: color-mix(in srgb, var(--fx-color-warning) 14%, transparent); color: var(--fx-color-warning); }\n :host([variant='danger']) .chip { background: color-mix(in srgb, var(--fx-color-danger) 14%, transparent); color: var(--fx-color-danger); }\n :host([variant='info']) .chip { background: color-mix(in srgb, var(--fx-color-info) 14%, transparent); color: var(--fx-color-info); }\n\n .chip.clickable { cursor: pointer; }\n .chip.clickable:hover { filter: brightness(0.95); }\n :host([selected]) .chip {\n background: var(--fx-color-primary);\n color: #fff;\n }\n :host([selected]) .chip:hover { filter: brightness(0.92); }\n :host([disabled]) .chip { opacity: 0.55; cursor: not-allowed; }\n .chip.clickable:active { transform: scale(0.97); }\n\n .icon { line-height: 1; }\n /* Base dos glifos Fenix Icons (o @font-face vem de @wrrdev/fenix-ui/icons). */\n ${FENIX_ICON_BASE_CSS}\n .remove {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n border: none;\n border-radius: var(--fx-radius-full);\n background: transparent;\n color: inherit;\n font-size: calc(var(--fx-font-size) + 2px);\n line-height: 1;\n cursor: pointer;\n padding: 0;\n }\n .remove:hover { background: rgba(0, 0, 0, 0.18); }\n .remove[hidden] { display: none; }\n `;\n\n static override get observedAttributes(): string[] {\n return ['variant', 'size', 'removable', 'selectable', 'selected', 'disabled', 'icon'];\n }\n\n get selected(): boolean { return this.hasAttr('selected'); }\n set selected(v: boolean) { this.toggleAttr('selected', v); }\n\n protected override render(): void {\n const icon = this.getAttr('icon');\n const removable = this.hasAttr('removable');\n const disabled = this.hasAttr('disabled');\n const clickable = (this.hasAttr('selectable') || this.hasAttr('href')) && !disabled;\n\n this.setTemplate(`\n <span class=\"chip ${clickable ? 'clickable' : ''}\" part=\"chip\" role=\"${clickable ? 'button' : 'status'}\"\n ${clickable ? `tabindex=\"0\" aria-pressed=\"${this.selected}\"` : ''} ${disabled ? 'aria-disabled=\"true\"' : ''}>\n ${icon ? `<span class=\"icon\" aria-hidden=\"true\">${fenixIconHtml(icon)}</span>` : ''}\n <slot></slot>\n <button type=\"button\" class=\"remove\" part=\"remove\" aria-label=\"Remover\" ${removable ? '' : 'hidden'}>×</button>\n </span>\n `);\n\n const chip = this.root.querySelector<HTMLElement>('.chip');\n const remove = this.root.querySelector<HTMLButtonElement>('.remove');\n if (!chip || !remove) return;\n\n remove.addEventListener('click', (e) => {\n e.stopPropagation();\n this.dispatchEvent(new CustomEvent('remove', { bubbles: true, composed: true }));\n });\n\n if (clickable) {\n const toggle = (): void => {\n if (this.hasAttr('selectable')) {\n this.selected = !this.selected;\n chip.setAttribute('aria-pressed', String(this.selected));\n }\n this.dispatchEvent(new CustomEvent('chip-click', { bubbles: true, composed: true }));\n };\n chip.addEventListener('click', toggle);\n chip.addEventListener('keydown', (e) => {\n const ev = e as KeyboardEvent;\n if (ev.key === 'Enter' || ev.key === ' ') {\n ev.preventDefault();\n toggle();\n }\n });\n }\n }\n}\n\nexport function defineFxChip(): typeof FxChip {\n return defineElement('fx-chip', FxChip);\n}\n","import { FxChip, defineFxChip } from './chip';\n\nexport { FxChip };\n\ndefineFxChip();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'fx-chip': FxChip;\n }\n}\n","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\nimport { esc } from '../../core/sanitize';\n\n/**\n * <fx-avatar> — Representação visual de usuário/item.\n *\n * Atributos: size (number px / sm|md|lg), shape (circle|rounded|square),\n * variant (image|text|icon), src (imagem), alt (acessibilidade).\n * Slots: `icon` (glifo/emoji quando variant=icon) e padrão (iniciais).\n *\n * Uso em grupo: posicione vários `<fx-avatar>` em um container com a classe\n * `avatar-group` (empilha com overlap automático).\n */\nexport class FxAvatar 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 --_size: var(--fx-size-md, 36px);\n --_bg: var(--fx-surface-surface-hover, rgba(0, 0, 0, 0.08));\n --_color: var(--fx-text-default, #1e293b);\n }\n :host([size='sm']) { --_size: var(--fx-size-sm, 24px); }\n :host([size='lg']) { --_size: var(--fx-size-lg, 48px); }\n\n .avatar {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--_size);\n height: var(--_size);\n min-width: var(--_size);\n box-sizing: border-box;\n background: var(--_bg);\n color: var(--_color);\n font-weight: 700;\n font-size: calc(var(--_size) / 2.2);\n line-height: 1;\n overflow: hidden;\n text-decoration: none;\n /* border-radius definido por shape abaixo */\n }\n :host([shape='square']) .avatar { border-radius: var(--fx-radius-sm); }\n :host([shape='rounded']) .avatar { border-radius: var(--fx-radius-md); }\n :host([shape='circle']) .avatar, :host([shape='']) .avatar { border-radius: var(--fx-radius-full); }\n\n .avatar img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n }\n .avatar.text { font-size: calc(var(--_size) / 2.6); }\n .avatar .slot-icon { font-size: calc(var(--_size) / 2.4); }\n\n /* grupo empilhado */\n :host(.avatar-group) { display: inline-flex; }\n :host(.avatar-group) > .avatar {\n border: 2px solid var(--fx-surface-background);\n margin-left: calc(var(--_size) / -3);\n z-index: 1;\n }\n :host(.avatar-group) > .avatar:last-child { margin-left: 0; }\n :host(.avatar-group) > .avatar:hover { z-index: 2; }\n `;\n\n static override get observedAttributes(): string[] {\n return ['size', 'shape', 'variant', 'src', 'alt'];\n }\n\n get variant(): string { return this.getAttr('variant', 'text'); }\n get src(): string { return this.getAttr('src'); }\n set src(v: string) { this.setAttribute('src', v); }\n\n protected override render(): void {\n const variant = this.variant;\n const src = this.getAttr('src');\n const alt = this.getAttr('alt', '');\n const isIcon = variant === 'icon';\n const isImage = variant === 'image' && src;\n\n this.setTemplate(`\n <span class=\"avatar${isImage ? ' image' : isIcon ? ' icon-slot' : ' text'}\" part=\"avatar\" aria-label=\"${esc(alt)}\" role=\"img\">\n ${isImage\n ? `<img src=\"${esc(src)}\" alt=\"${esc(alt)}\">`\n : isIcon\n ? `<slot name=\"icon\" class=\"slot-icon\"></slot>`\n : `<slot></slot>`}\n </span>\n `);\n }\n}\n\nexport function defineFxAvatar(): typeof FxAvatar {\n return defineElement('fx-avatar', FxAvatar);\n}\n","import { FxAvatar, defineFxAvatar } from './avatar';\n\nexport { FxAvatar };\n\ndefineFxAvatar();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'fx-avatar': FxAvatar;\n }\n}\n","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\nimport { esc } from '../../core/sanitize';\n\n/**\n * <fx-card> — Container de conteúdo com cabeçalho, corpo e rodapé.\n *\n * Atributos: variant (elevated|flat|outline|ghost, padrão elevated),\n * radius (sm|md|lg — arredondamento; `size` segue aceito como alias legado),\n * padded (exibe padding interno), heading (rótulo opcional no cabeçalho).\n * Slots: `header`, padrão (conteúdo), `footer`.\n */\nexport class FxCard 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 box-sizing: border-box;\n }\n .card {\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-sm);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n transition: box-shadow var(--fx-motion-duration-normal) var(--fx-motion-easing);\n }\n /* Elevado: sombra principal; Flat: sem sombra mas cor plana; Outline: sem sombra e borda sólida */\n :host([variant='elevated']) .card { box-shadow: var(--fx-shadow-md); }\n :host([variant='elevated']) .card:hover { box-shadow: var(--fx-shadow-xl); }\n :host([variant='flat']) .card { box-shadow: none; border-color: transparent; }\n :host([variant='outline']) .card { box-shadow: none; border-style: solid; border-width: 1px; }\n :host([variant='ghost']) .card { box-shadow: none; border-color: transparent; background: transparent; }\n\n /* Raio do container: radius (nome atual) — size continua aceito\n como alias legado para não quebrar quem já usava o atributo. */\n :host([radius='sm']) .card,\n :host([size='sm']) .card { border-radius: var(--fx-radius-sm); }\n :host([radius='lg']) .card,\n :host([size='lg']) .card { border-radius: var(--fx-radius-xl); }\n\n header {\n padding: var(--fx-space-md) var(--fx-space-xl);\n border-bottom: 1px solid var(--fx-border-default);\n font-weight: 600;\n color: var(--fx-text-default);\n font-size: calc(var(--fx-font-size) + 2px);\n }\n header[hidden] { display: none; }\n\n .body {\n flex: 1 1 auto;\n }\n :host([padded]) .body { padding: var(--fx-space-lg) var(--fx-space-xl); }\n :host([padded]) .body:empty { padding: 0; }\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 ['variant', 'radius', 'size', 'padded', 'heading'];\n }\n\n protected override render(): void {\n const heading = this.getAttr('heading');\n this.setTemplate(`\n <div class=\"card\" part=\"card\">\n <header part=\"header\" ${heading ? '' : 'hidden'}>${esc(heading)}<slot name=\"header\"></slot></header>\n <div class=\"body\" part=\"content\"><slot></slot></div>\n <footer part=\"footer\"><slot name=\"footer\"></slot></footer>\n </div>\n `);\n }\n}\n\nexport function defineFxCard(): typeof FxCard {\n return defineElement('fx-card', FxCard);\n}\n","import { FxCard, defineFxCard } from './card';\n\nexport { FxCard };\n\ndefineFxCard();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'fx-card': FxCard;\n }\n}\n","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\nimport { esc } from '../../core/sanitize';\n\n/**\n * <fx-breadcrumb> — Trilha de navegação hierárquica.\n *\n * Atributos: size (sm|md|lg), separator (glifo entre itens, padrão '/'),\n * label (acessibilidade, padrão 'Breadcrumb').\n * Slots: `item` (repetível — cada <fx-breadcrumb-item> ou elemento com\n * [slot=\"item\"] vira um passo) e `separator` (customiza o separador).\n *\n * Marcação declarativa recomendada:\n * <fx-breadcrumb>\n * <fx-breadcrumb-item href=\"/\">Home</fx-breadcrumb-item>\n * <fx-breadcrumb-item href=\"/produtos\">Produtos</fx-breadcrumb-item>\n * <fx-breadcrumb-item>Detalhe</fx-breadcrumb-item>\n * </fx-breadcrumb>\n *\n * Eventos (composed): `select` (detail: { item, index }) ao clicar num item.\n */\nexport class FxBreadcrumb 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 nav {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: var(--fx-space-xs);\n }\n :host([size='sm']) nav { font-size: calc(var(--fx-font-size) - 2px); }\n :host([size='lg']) nav { font-size: calc(var(--fx-font-size) + 2px); }\n\n /* itens (movidos para o nav no shadow DOM) */\n nav [slot='item'] {\n display: inline-flex;\n align-items: center;\n gap: var(--fx-space-xs);\n color: var(--fx-text-muted);\n text-decoration: none;\n cursor: pointer;\n transition: color var(--fx-motion-duration-fast) var(--fx-motion-easing);\n }\n nav [slot='item']:hover { color: var(--fx-color-primary); }\n nav [slot='item'][aria-current='page'] {\n color: var(--fx-text-default);\n font-weight: 600;\n cursor: default;\n }\n nav [slot='item'][aria-current='page']:hover { color: var(--fx-text-default); }\n\n .sep {\n color: var(--fx-text-muted);\n user-select: none;\n display: inline-flex;\n align-items: center;\n }\n `;\n\n static override get observedAttributes(): string[] {\n return ['size', 'separator', 'label'];\n }\n\n protected override render(): void {\n const label = this.getAttr('label', 'Breadcrumb');\n\n this.setTemplate(`\n <nav part=\"nav\" aria-label=\"${esc(label)}\"></nav>\n `);\n\n this._decorateItems();\n }\n\n /**\n * Move os itens do light DOM para o nav e intercala separadores.\n * Como o playground atribui innerHTML (filhos chegam assincronamente) e\n * re-renders posteriores já terão os itens no nav, a lógica abaixo é\n * idempotente: coleta filhos do light DOM apenas na 1ª chamada.\n */\n private _decorateItems(): void {\n const nav = this.shadowRoot?.querySelector('nav');\n if (!nav) return;\n const sep = this.getAttr('separator', '/');\n\n // 1ª vez: captura itens do light DOM (idempotente — só coleta uma vez)\n if (this._items.length === 0) {\n this._items = Array.from(this.children).filter((el) =>\n el.matches('[slot=\"item\"]'),\n );\n }\n\n // limpa nav e reconstrói com os itens armazenados\n nav.innerHTML = '';\n this._items.forEach((item, i) => {\n const isLast = i === this._items.length - 1;\n item.setAttribute('aria-current', isLast ? 'page' : 'false');\n nav.appendChild(item);\n if (isLast) return;\n const s = document.createElement('span');\n s.className = 'sep';\n s.setAttribute('part', 'separator');\n s.setAttribute('aria-hidden', 'true');\n s.textContent = sep;\n nav.appendChild(s);\n });\n }\n\n private _items: Element[] = [];\n\n protected override connectedCallback(): void {\n super.connectedCallback();\n // filhos podem não estar disponíveis ainda (innerHTML do playground)\n const obs = new MutationObserver(() => {\n if (this.children.length > 0) {\n obs.disconnect();\n this._decorateItems();\n }\n });\n obs.observe(this, { childList: true });\n // se já tem filhos, decora na hora\n if (this.children.length > 0) this._decorateItems();\n }\n\n protected override disconnectedCallback(): void {\n super.disconnectedCallback();\n this._items = [];\n }\n}\n\nexport function defineFxBreadcrumb(): typeof FxBreadcrumb {\n return defineElement('fx-breadcrumb', FxBreadcrumb);\n}\n","import { FxBreadcrumb, defineFxBreadcrumb } from './breadcrumb';\n\nexport { FxBreadcrumb };\n\ndefineFxBreadcrumb();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'fx-breadcrumb': FxBreadcrumb;\n }\n}\n","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\n\n/**\n * <fx-popover> — Painel flutuante ancorado em um elemento, com posicionamento\n * automático (flip para cima quando não há espaço abaixo), no estilo Popover do PrimeVue.\n *\n * Atributos:\n * - target (seletor CSS do elemento âncora — obrigatório);\n * - trigger (click|hover, padrão click);\n * - position (top|bottom|auto, padrão auto — faz flip conforme o espaço);\n * - open (exibe o popover);\n * - dismissible (fecha ao clicar fora, padrão true).\n *\n * Slots: `header`, padrão (conteúdo), `footer`.\n *\n * Eventos (composed): `show` e `hide`.\n */\nexport class FxPopover extends FxElement {\n static override styles = css`\n :host { display: contents; }\n .popup {\n position: fixed;\n margin: 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 padding: 0;\n min-width: 220px;\n max-width: min(380px, calc(100vw - 24px));\n font-family: var(--fx-font-family);\n font-size: var(--fx-font-size);\n color: var(--fx-text-default);\n z-index: var(--fx-z-modal, 1100);\n animation: fxpp-pop var(--fx-motion-duration-fast, 150ms) var(--fx-motion-easing, ease);\n overflow: hidden;\n }\n .popup[hidden] { display: none; }\n @keyframes fxpp-pop { from { opacity: 0; transform: scale(0.96); } to { opacity: 1; transform: scale(1); } }\n .popup::before, .popup::after {\n content: '';\n position: absolute;\n border: 7px solid transparent;\n }\n .popup[data-side='bottom']::before {\n top: -14px; left: var(--fxpp-arrow-x, 50%);\n border-bottom-color: var(--fx-border-default);\n }\n .popup[data-side='bottom']::after {\n top: -12px; left: var(--fxpp-arrow-x, 50%);\n border-bottom-color: var(--fx-surface-background);\n }\n .popup[data-side='top']::before {\n bottom: -14px; left: var(--fxpp-arrow-x, 50%);\n border-top-color: var(--fx-border-default);\n }\n .popup[data-side='top']::after {\n bottom: -12px; left: var(--fxpp-arrow-x, 50%);\n border-top-color: var(--fx-surface-background);\n }\n header {\n padding: var(--fx-space-md) var(--fx-space-lg);\n border-bottom: 1px solid var(--fx-border-default);\n font-weight: 600;\n font-size: calc(var(--fx-font-size) + 1px);\n color: var(--fx-text-default);\n }\n header[hidden] { display: none; }\n .body { padding: var(--fx-space-md) var(--fx-space-lg); }\n footer {\n padding: var(--fx-space-md) var(--fx-space-lg);\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', 'target', 'trigger', 'position', 'dismissible'];\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 this.setTemplate(`\n <div class=\"popup\" part=\"popover\" role=\"dialog\" aria-modal=\"false\" ${this.open ? '' : 'hidden'}>\n <header part=\"header\" hidden><slot name=\"header\"></slot></header>\n <div class=\"body\" part=\"content\"><slot></slot></div>\n <footer part=\"footer\" hidden><slot name=\"footer\"></slot></footer>\n </div>\n `);\n\n if (!this.open) return;\n const popup = this.root.querySelector<HTMLElement>('.popup');\n if (!popup) return;\n\n // Evita listeners duplicados em re-renders enquanto aberto\n // (ex.: mudança de target/position/trigger com o popover aberto).\n this._cleanup?.();\n this._cleanup = undefined;\n\n const close = (): void => {\n this.open = false;\n this._cleanup?.();\n this._cleanup = undefined;\n this._restoreFocus();\n this.dispatchEvent(new CustomEvent('hide', { bubbles: true, composed: true }));\n };\n\n const onKey = (e: KeyboardEvent): void => {\n if (e.key === 'Escape') { e.stopPropagation(); close(); }\n };\n const onPointerDown = (e: MouseEvent): void => {\n if (!this.hasAttr('dismissible')) return;\n const path = e.composedPath();\n const anchor = this._anchor();\n const hitAnchor = anchor ? path.includes(anchor) : false;\n if (!path.includes(popup) && !hitAnchor) close();\n };\n document.addEventListener('keydown', onKey);\n document.addEventListener('pointerdown', onPointerDown, true);\n this._cleanup = () => {\n document.removeEventListener('keydown', onKey);\n document.removeEventListener('pointerdown', onPointerDown, true);\n };\n\n // sincroniza slots ANTES de posicionar (header/footer alteram a altura)\n this._syncSlots();\n this._position(popup);\n this._previouslyFocused = document.activeElement as HTMLElement | null;\n requestAnimationFrame(() => popup.focus({ preventScroll: true }));\n this.dispatchEvent(new CustomEvent('show', { bubbles: true, composed: true }));\n }\n\n private _cleanup?: () => void;\n private _previouslyFocused: HTMLElement | null = null;\n\n private _anchor(): HTMLElement | null {\n const selector = this.getAttr('target');\n if (!selector) return null;\n try { return document.querySelector<HTMLElement>(selector); }\n catch { return null; }\n }\n\n private _syncSlots(): void {\n const header = this.root.querySelector<HTMLSlotElement>('slot[name=\"header\"]');\n const footer = this.root.querySelector<HTMLSlotElement>('slot[name=\"footer\"]');\n const headerWrap = this.root.querySelector<HTMLElement>('header');\n const footerWrap = this.root.querySelector<HTMLElement>('footer');\n const hasHeader = !!header && header.assignedNodes().length > 0;\n const hasFooter = !!footer && footer.assignedNodes().length > 0;\n headerWrap?.toggleAttribute('hidden', !hasHeader);\n footerWrap?.toggleAttribute('hidden', !hasFooter);\n }\n\n private _position(popup: HTMLElement): void {\n const anchor = this._anchor();\n if (!anchor) return;\n popup.hidden = false;\n\n const a = anchor.getBoundingClientRect();\n const p = popup.getBoundingClientRect();\n const gap = 8;\n const margin = 8;\n\n let side: 'top' | 'bottom';\n const pos = this.getAttr('position', 'auto');\n if (pos === 'top') side = 'top';\n else if (pos === 'bottom') side = 'bottom';\n else side = a.bottom + gap + p.height <= window.innerHeight - margin ? 'bottom' : 'top';\n\n // flip quando o lado forçado não cabe (evita sobrepor o anchor)\n if (side === 'top' && a.top - gap - p.height < margin && a.bottom + gap + p.height <= window.innerHeight - margin) {\n side = 'bottom';\n } else if (side === 'bottom' && a.bottom + gap + p.height > window.innerHeight - margin && a.top - gap - p.height >= margin) {\n side = 'top';\n }\n\n const left = Math.min(\n Math.max(margin, a.left + a.width / 2 - p.width / 2),\n window.innerWidth - p.width - margin,\n );\n const top = side === 'bottom' ? a.bottom + gap : a.top - gap - p.height;\n\n popup.dataset.side = side;\n popup.style.left = `${Math.round(left)}px`;\n popup.style.top = `${Math.round(Math.max(margin, top))}px`;\n const arrowX = Math.min(Math.max(a.left + a.width / 2 - left, 16), p.width - 16);\n popup.style.setProperty('--fxpp-arrow-x', `${Math.round(arrowX)}px`);\n }\n\n private _restoreFocus(): void {\n if (this._previouslyFocused?.isConnected) this._previouslyFocused.focus();\n this._previouslyFocused = null;\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n window.addEventListener('scroll', this._onReposition, true);\n window.addEventListener('resize', this._onReposition);\n this._bindTrigger();\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n window.removeEventListener('scroll', this._onReposition, true);\n window.removeEventListener('resize', this._onReposition);\n this._triggerCleanup?.();\n this._triggerCleanup = undefined;\n this._cleanup?.();\n this._cleanup = undefined;\n this._restoreFocus();\n }\n\n private _onReposition = (): void => {\n if (!this.open) return;\n const popup = this.root.querySelector<HTMLElement>('.popup');\n if (popup && !popup.hidden) this._position(popup);\n };\n\n private _bindTrigger(): void {\n const anchor = this._anchor();\n if (!anchor) return;\n const trigger = this.getAttr('trigger', 'click');\n\n if (trigger === 'hover') {\n anchor.addEventListener('mouseenter', this._onEnter);\n anchor.addEventListener('mouseleave', this._onLeave);\n this._triggerCleanup = () => {\n anchor.removeEventListener('mouseenter', this._onEnter);\n anchor.removeEventListener('mouseleave', this._onLeave);\n };\n } else {\n anchor.addEventListener('pointerdown', this._onClick);\n this._triggerCleanup = () => anchor.removeEventListener('pointerdown', this._onClick);\n }\n }\n\n private _triggerCleanup?: () => void;\n private _onEnter = (): void => { this.open = true; };\n private _onLeave = (): void => { this.open = false; };\n private _onClick = (): void => { this.open = !this.open; };\n}\n\nexport function defineFxPopover(): typeof FxPopover {\n return defineElement('fx-popover', FxPopover);\n}\n","import { FxPopover, defineFxPopover } from './popover';\n\nexport { FxPopover };\n\ndefineFxPopover();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'fx-popover': FxPopover;\n }\n}\n","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\nimport { esc } from '../../core/sanitize';\n\n/**\n * <fx-stepper> — Asistente de pasos (wizard) para flujos multi-etapa.\n *\n * Uso declarativo: cada hijo directo con el atributo `step` define un paso.\n * Uso imperativo: leer/escribir la propiedad `active` para navegar.\n *\n * Atributos: active (índice del paso activo), linear (solo avanzar en orden),\n * show-numbers (muestra el número en el indicador).\n * Slots: `header` (customiza el indicador de pasos), un slot por paso\n * (slot=\"step-0\", slot=\"step-1\", ...).\n *\n * Eventos (composed): `change` (detail: { index }) y `complete` al llegar al último.\n */\nexport class FxStepper extends FxElement {\n static override styles = css`\n :host { display: block; font-family: var(--fx-font-family); font-size: var(--fx-font-size); }\n :host([linear]) .step-num.activated { cursor: not-allowed; }\n\n .steps {\n display: flex;\n align-items: center;\n gap: var(--fx-space-md);\n flex-wrap: wrap;\n padding: var(--fx-space-md) var(--fx-space-lg);\n }\n .step {\n display: inline-flex;\n align-items: center;\n gap: var(--fx-space-sm);\n padding: var(--fx-space-xs) var(--fx-space-md);\n border-radius: var(--fx-radius-full);\n color: var(--fx-text-muted);\n font-weight: 600;\n user-select: none;\n cursor: pointer;\n transition: background var(--fx-motion-duration-fast) var(--fx-motion-easing), color var(--fx-motion-duration-fast) var(--fx-motion-easing);\n }\n .step.active { background: var(--fx-color-primary); color: #fff; }\n .step.done { color: var(--fx-color-primary); }\n .step[hidden] { display: none; }\n .num {\n display: inline-flex; align-items: center; justify-content: center;\n width: 24px; height: 24px; min-width: 24px;\n border: 1.5px solid currentColor;\n border-radius: var(--fx-radius-full);\n font-size: calc(var(--fx-font-size) - 2px);\n line-height: 1;\n }\n\n .panel { padding: var(--fx-space-lg) var(--fx-space-xl); min-height: 80px; }\n .actions {\n display: flex;\n justify-content: space-between;\n gap: var(--fx-space-sm);\n padding: var(--fx-space-md) var(--fx-space-lg);\n border-top: 1px solid var(--fx-border-default);\n }\n .nav-btn {\n font-family: var(--fx-font-family);\n font-size: calc(var(--fx-font-size) - 2px);\n padding: var(--fx-space-xs) var(--fx-space-lg);\n min-height: var(--fx-size-sm);\n border-radius: var(--fx-radius-sm);\n border: 1px solid var(--fx-border-default);\n background: var(--fx-surface-background);\n color: var(--fx-text-default);\n cursor: pointer;\n transition: background var(--fx-motion-duration-fast) var(--fx-motion-easing);\n }\n .nav-btn:hover:not(:disabled) { background: var(--fx-surface-surface-hover, rgba(0, 0, 0, 0.04)); }\n .nav-btn:disabled { opacity: 0.5; cursor: not-allowed; }\n .nav-btn.primary {\n background: var(--fx-color-primary);\n border-color: var(--fx-color-primary);\n color: #fff;\n }\n .nav-btn.primary:hover:not(:disabled) { filter: brightness(0.92); background: var(--fx-color-primary); }\n `;\n\n static override get observedAttributes(): string[] {\n return ['active', 'linear', 'show-numbers'];\n }\n\n get stepCount(): number { return this._titles.length; }\n get active(): number {\n const n = Number(this.getAttr('active', '0'));\n return Math.min(this.stepCount - 1, Math.max(0, Number.isFinite(n) ? n : 0));\n }\n set active(v: number) {\n this.setAttribute('active', String(Math.min(this.stepCount - 1, Math.max(0, v))));\n }\n\n get isLast(): boolean { return this.active >= this.stepCount - 1; }\n\n /** Navega al paso (emite change). Con linear, solo permite avanzar de a uno. */\n goTo(index: number): void {\n const target = Math.min(this.stepCount - 1, Math.max(0, index));\n if (this.hasAttr('linear') && target > this.active + 1) return;\n this.active = target;\n this.dispatchEvent(new CustomEvent('change', { bubbles: true, composed: true, detail: { index: this.active } }));\n if (this.isLast) {\n this.dispatchEvent(new CustomEvent('complete', { bubbles: true, composed: true }));\n }\n }\n\n next(): void { this.goTo(this.active + 1); }\n prev(): void { this.goTo(this.active - 1); }\n\n private _titles: string[] = [];\n private _panels: Element[] = [];\n\n protected override render(): void {\n this._panels = Array.from(this.children).filter((el) =>\n el.matches('[slot^=\"step-\"]'),\n );\n this._titles = this._panels.map((p, i) =>\n p.getAttribute('step-title') || `Paso ${i + 1}`,\n );\n const active = Math.min(this.active, Math.max(0, this._titles.length - 1));\n\n const stepsHtml = this._titles\n .map((title, i) => {\n const state = i === active ? 'active' : i < active ? 'done' : '';\n // sem show-numbers: passos concluídos exibem ✓; com show-numbers: sempre número\n const marker = i < active && !this.hasAttr('show-numbers') ? '✓' : String(i + 1);\n return `<span class=\"step ${state}\" part=\"step\" data-i=\"${i}\"><span class=\"num\">${marker}</span>${esc(title)}</span>`;\n })\n .join('');\n\n const panelsHtml = this._panels\n .map((p, i) => `<section class=\"panel\" part=\"panel\" ${i === active ? '' : 'hidden'}>${p.innerHTML}</section>`)\n .join('');\n\n this.setTemplate(`\n <div class=\"steps\" part=\"steps\">${stepsHtml}</div>\n <div class=\"panel-wrap\">${panelsHtml}</div>\n <div class=\"actions\" part=\"actions\">\n <button type=\"button\" class=\"nav-btn prev\" part=\"prev\" ${active === 0 ? 'disabled' : ''}>Anterior</button>\n <button type=\"button\" class=\"nav-btn primary next\" part=\"next\">${active === this._titles.length - 1 ? 'Concluir' : 'Próximo'}</button>\n </div>\n `);\n\n this._bindSteps();\n }\n\n private _bindSteps(): void {\n const steps = Array.from(this.root.querySelectorAll<HTMLElement>('.step'));\n steps.forEach((step) => {\n const i = Number(step.dataset.i);\n step.addEventListener('click', () => {\n if (this.hasAttr('linear') && i > this.active + 1) return;\n this.goTo(i);\n });\n step.addEventListener('keydown', (e) => {\n if ((e as KeyboardEvent).key === 'Enter') {\n e.preventDefault();\n this.goTo(i);\n }\n });\n });\n\n this.root.querySelector<HTMLElement>('.nav-btn.prev')?.addEventListener('click', () => this.prev());\n this.root.querySelector<HTMLElement>('.nav-btn.next')?.addEventListener('click', () => this.next());\n }\n\n protected override connectedCallback(): void {\n super.connectedCallback();\n if (this._titles.length === 0) this.render();\n }\n}\n\nexport function defineFxStepper(): typeof FxStepper {\n return defineElement('fx-stepper', FxStepper);\n}","import { FxStepper, defineFxStepper } from './stepper';\n\nexport { FxStepper };\n\ndefineFxStepper();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'fx-stepper': FxStepper;\n }\n}","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\n\n/**\n * <fx-rating> — Evaluación por estrellas.\n *\n * Atributos: value (0 a max), max (número de estrellas, default 5),\n * readonly, disabled, allow-half (permite medias estrellas),\n * size (sm|md|lg).\n * Eventos (composed): `change` (detail: { value }).\n */\nexport class FxRating extends FxElement {\n static override styles = css`\n :host {\n display: inline-flex;\n font-family: var(--fx-font-family);\n font-size: var(--fx-font-size);\n --_star: calc(var(--fx-font-size) + 8px);\n }\n :host([size='sm']) { --_star: calc(var(--fx-font-size) + 4px); }\n :host([size='lg']) { --_star: calc(var(--fx-font-size) + 14px); }\n :host([disabled]) { opacity: 0.55; }\n :host([disabled]) .stars { pointer-events: none; }\n :host([readonly]) .stars { pointer-events: none; }\n\n .stars {\n display: inline-flex;\n align-items: center;\n gap: 2px;\n cursor: pointer;\n }\n .star {\n position: relative;\n display: inline-flex;\n width: var(--_star);\n height: var(--_star);\n font-size: var(--_star);\n line-height: 1;\n color: var(--fx-text-muted);\n cursor: pointer;\n user-select: none;\n transition: transform var(--fx-motion-duration-fast) var(--fx-motion-easing), color var(--fx-motion-duration-fast) var(--fx-motion-easing);\n }\n .star:hover { transform: scale(1.1); }\n .star[hidden] { display: none; }\n .star.filled { color: var(--fx-color-warning); }\n .star.hovered { color: var(--fx-color-warning); }\n `;\n\n static override get observedAttributes(): string[] {\n return ['value', 'max', 'readonly', 'disabled', 'allow-half', 'size'];\n }\n\n get value(): number {\n const n = Number(this.getAttr('value', '0'));\n return Number.isFinite(n) ? Math.min(this.max, Math.max(0, n)) : 0;\n }\n set value(v: number) {\n this.setAttribute('value', String(Math.min(this.max, Math.max(0, v))));\n this._syncVisual();\n }\n\n get max(): number {\n const n = Number(this.getAttr('max', '5'));\n const m = Number.isFinite(n) ? Math.round(n) : 5;\n return Math.min(10, Math.max(1, m));\n }\n set max(v: number) { this.setAttribute('max', String(v)); }\n\n protected override render(): void {\n const stars = this.max;\n const starsHtml = Array.from({ length: stars }, (_, i) => i + 1)\n .map((n) => `<span class=\"star\" data-n=\"${n}\" part=\"star\" title=\"${n} ${this._label(n)}\">★</span>`)\n .join('');\n\n this.setTemplate(`\n <span class=\"stars\" part=\"stars\" role=\"radiogroup\">\n ${starsHtml}\n </span>\n `);\n\n this._bindStars();\n this._syncVisual();\n }\n\n private _starNodes(): HTMLElement[] {\n return Array.from(this.root.querySelectorAll<HTMLElement>('.star'));\n }\n\n private _label(n: number): string {\n return n === 1 ? 'estrella' : 'estrellas';\n }\n\n private _syncVisual(): void {\n const v = this.value;\n this._starNodes().forEach((star) => {\n const n = Number(star.dataset.n);\n star.classList.toggle('filled', v >= n);\n });\n }\n\n private _bindStars(): void {\n const stars = this._starNodes();\n stars.forEach((star) => {\n const n = Number(star.dataset.n);\n star.addEventListener('click', () => {\n if (this.hasAttr('readonly') || this.hasAttr('disabled')) return;\n let next = n;\n if (this.hasAttr('allow-half')) next += -0.5; // para simplificar, valor entero\n this.value = next;\n this.dispatchEvent(\n new CustomEvent('change', { bubbles: true, composed: true, detail: { value: this.value } }),\n );\n });\n star.addEventListener('mouseenter', () => {\n if (this.hasAttr('readonly') || this.hasAttr('disabled')) return;\n this._hover(n);\n });\n star.addEventListener('mouseleave', () => this._syncVisual());\n });\n }\n\n private _hover(n: number): void {\n this._starNodes().forEach((star) => {\n const nn = Number(star.dataset.n);\n star.classList.toggle('hovered', nn <= n);\n });\n }\n}\n\nexport function defineFxRating(): typeof FxRating {\n return defineElement('fx-rating', FxRating);\n}","import { FxRating, defineFxRating } from './rating';\n\nexport { FxRating };\n\ndefineFxRating();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'fx-rating': FxRating;\n }\n}","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\nimport { esc } from '../../core/sanitize';\n\n/**\n * <fx-menu> — Menú de navegación (horizontal o vertical) con ítems y submenús.\n *\n * Atributos: orientation (horizontal|vertical), size (sm|md|lg),\n * dense (reduce el alto), titles (separado por `,` para navegación).\n * Slots `item`: cada ítem de menú con [slot=\"item\"].\n * Evento (composed): `select` (detail: { index, label }).\n */\nexport class FxMenu extends FxElement {\n static override styles = css`\n :host { display: block; font-family: var(--fx-font-family); font-size: var(--fx-font-size); }\n :host([orientation='vertical']) { border: 1px solid var(--fx-border-default); border-radius: var(--fx-radius-md); }\n nav {\n display: flex;\n align-items: center;\n gap: var(--fx-space-xs);\n flex-wrap: wrap;\n background: var(--fx-surface-background);\n }\n :host([orientation='vertical']) nav { flex-direction: column; align-items: stretch; }\n .item {\n display: inline-flex;\n align-items: center;\n gap: var(--fx-space-xs);\n padding: var(--fx-space-sm) var(--fx-space-md);\n min-height: var(--fx-size-sm);\n border-radius: var(--fx-radius-sm);\n color: var(--fx-text-default);\n cursor: pointer;\n user-select: none;\n white-space: nowrap;\n transition: background var(--fx-motion-duration-fast) var(--fx-motion-easing), color var(--fx-motion-duration-fast) var(--fx-motion-easing);\n }\n :host([size='sm']) .item { min-height: var(--fx-size-sm); padding: var(--fx-space-xs) var(--fx-space-sm); font-size: calc(var(--fx-font-size) - 2px); }\n :host([size='lg']) .item { min-height: var(--fx-size-lg); padding: var(--fx-space-md) var(--fx-space-lg); font-size: calc(var(--fx-font-size) + 1px); }\n .item:hover { background: var(--fx-surface-surface-hover, rgba(0,0,0,0.06)); }\n .item.active { background: var(--fx-color-primary); color: #fff; font-weight: 600; }\n .item[aria-disabled='true'] { opacity: 0.5; cursor: not-allowed; }\n .item[aria-disabled='true']:hover { background: none; }\n .item .caret { font-size: calc(var(--fx-font-size) - 2px); color: var(--fx-text-muted); }\n\n /* submenú ancorado ao item */\n .submenu-wrap { position: relative; display: inline-flex; }\n :host([orientation='vertical']) .submenu-wrap { width: 100%; }\n .dropdown {\n position: absolute;\n left: 0;\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-sm);\n box-shadow: var(--fx-shadow-lg);\n padding: var(--fx-space-xs);\n z-index: var(--fx-z-dropdown, 1060);\n display: none;\n flex-direction: column;\n }\n .dropdown.open { display: flex; }\n :host([orientation='vertical']) .dropdown { left: 100%; top: 0; }\n `;\n\n static override get observedAttributes(): string[] {\n return ['orientation', 'size', 'dense', 'titles'];\n }\n\n get orientation(): string { return this.getAttr('orientation', 'horizontal'); }\n\n get items(): HTMLElement[] {\n return Array.from(this.children).filter((el) => el.matches('[slot=\"item\"]')).map((el) => el as HTMLElement);\n }\n\n protected override render(): void {\n const titleAttr = this.getAttr('titles');\n const titles = titleAttr ? titleAttr.split(',').map((s) => s.trim()) : [];\n\n const items = this.items;\n const itemsHtml = items\n .map((it, i) => {\n const label = titles[i] || it.textContent?.trim() || `Item ${i + 1}`;\n const hasSub = it.matches('[submenu]');\n const disabled = it.hasAttribute('disabled');\n const item = `\n <span class=\"item\" part=\"item\" data-i=\"${i}\" ${disabled ? 'aria-disabled=\"true\"' : ''}>\n ${esc(label)}${hasSub ? `<span class=\"caret\">▾</span>` : ''}\n </span>`;\n if (!hasSub) return item;\n return `\n <span class=\"submenu-wrap\" part=\"submenu-wrap\">\n ${item}\n <div class=\"dropdown\" part=\"submenu\"><slot name=\"submenu-${i}\"></slot></div>\n </span>`;\n })\n .join('');\n\n this.setTemplate(`\n <nav part=\"menu\" aria-label=\"Menu\">\n ${itemsHtml}\n </nav>\n `);\n\n this._bindItems();\n }\n\n private _bindItems(): void {\n const items = Array.from(this.root.querySelectorAll<HTMLElement>('.item'));\n items.forEach((item) => {\n const i = Number(item.dataset.i);\n item.addEventListener('click', () => {\n if (item.getAttribute('aria-disabled') === 'true') return;\n const source = this.items[i];\n const hasSub = source?.hasAttribute('submenu');\n if (hasSub) {\n // fecha outros dropdowns e alterna o deste item\n this.root.querySelectorAll<HTMLElement>('.dropdown.open').forEach((d) => {\n if (d !== item.parentElement?.querySelector('.dropdown')) d.classList.remove('open');\n });\n item.parentElement?.querySelector('.dropdown')?.classList.toggle('open');\n return;\n }\n this._setActive(item);\n this.dispatchEvent(new CustomEvent('select', {\n bubbles: true, composed: true,\n detail: { index: i, label: item.textContent?.trim() ?? '' },\n }));\n });\n item.addEventListener('keydown', (e) => {\n const ev = e as KeyboardEvent;\n if (ev.key === 'Enter' || ev.key === ' ') {\n ev.preventDefault();\n item.click();\n }\n });\n });\n }\n\n protected override connectedCallback(): void {\n super.connectedCallback();\n document.addEventListener('pointerdown', this._onOutside);\n }\n\n protected override disconnectedCallback(): void {\n super.disconnectedCallback();\n document.removeEventListener('pointerdown', this._onOutside);\n }\n\n private _onOutside = (e: MouseEvent): void => {\n const path = e.composedPath();\n this.root.querySelectorAll<HTMLElement>('.dropdown.open').forEach((d) => {\n if (!path.includes(d)) d.classList.remove('open');\n });\n };\n\n private _setActive(active: HTMLElement): void {\n Array.from(this.root.querySelectorAll<HTMLElement>('.item')).forEach((it) => {\n it.classList.toggle('active', it === active);\n });\n }\n}\n\nexport function defineFxMenu(): typeof FxMenu {\n return defineElement('fx-menu', FxMenu);\n}","import { FxMenu, defineFxMenu } from './menu';\n\nexport { FxMenu };\n\ndefineFxMenu();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'fx-menu': FxMenu;\n }\n}","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\nimport { esc } from '../../core/sanitize';\n\n/**\n * <fx-toggle-button-group> — Grupo de botones de selección múltiple o única.\n *\n * Atributos: multiple (permite varios seleccionados), value (lista), size.\n * Slots `option`: cada botón con [slot=\"option\" value=\"...\"].\n * Evento (composed): `change` (detail: { value: string[] }).\n */\nexport class FxToggleButtonGroup extends FxElement {\n static override styles = css`\n :host { display: inline-flex; font-family: var(--fx-font-family); font-size: var(--fx-font-size); gap: var(--fx-space-xs); }\n .option {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--fx-space-xs);\n min-height: var(--fx-size-md);\n padding: var(--fx-space-sm) var(--fx-space-lg);\n font-weight: var(--fx-font-weight);\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 cursor: pointer;\n user-select: none;\n transition: background var(--fx-motion-duration-fast) var(--fx-motion-easing), border-color var(--fx-motion-duration-fast) var(--fx-motion-easing), color var(--fx-motion-duration-fast) var(--fx-motion-easing);\n }\n :host([size='sm']) .option { min-height: var(--fx-size-sm); padding: var(--fx-space-xs) var(--fx-space-md); font-size: calc(var(--fx-font-size) - 2px); }\n :host([size='lg']) .option { min-height: var(--fx-size-lg); padding: var(--fx-space-md) var(--fx-space-xl); font-size: calc(var(--fx-font-size) + 2px); }\n .option:hover { border-color: var(--fx-color-primary); }\n .option.active {\n background: var(--fx-color-primary);\n border-color: var(--fx-color-primary);\n color: #fff;\n }\n .option.active:hover { filter: brightness(0.92); }\n `;\n\n static override get observedAttributes(): string[] {\n return ['multiple', 'size'];\n }\n\n get value(): string[] {\n const raw = this.getAttr('value');\n return raw ? raw.split(',').map((s) => s.trim()).filter(Boolean) : [];\n }\n set value(v: string[]) { this.setAttribute('value', v.join(',')); }\n\n get multiple(): boolean { return this.hasAttr('multiple'); }\n\n get options(): HTMLElement[] {\n return Array.from(this.children).filter((el) => el.matches('[slot=\"option\"]')).map((el) => el as HTMLElement);\n }\n\n protected override render(): void {\n const opts = this.options;\n const selected = this.value;\n\n const html = opts\n .map((o, i) => {\n const val = o.getAttribute('value') ?? '';\n const active = selected.includes(val);\n return `<button type=\"button\" class=\"option ${active ? 'active' : ''}\" part=\"option\" data-v=\"${esc(val)}\" aria-pressed=\"${active}\">${esc(o.textContent?.trim() || `Opción ${i + 1}`)}</button>`;\n })\n .join('');\n\n this.setTemplate(`\n <div class=\"options\" part=\"options\" role=\"group\" aria-label=\"Toggle buttons\">\n ${html}\n </div>\n `);\n\n this._bindOptions();\n }\n\n private _bindOptions(): void {\n Array.from(this.root.querySelectorAll<HTMLElement>('.option') || []).forEach((opt) => {\n opt.addEventListener('click', () => this._toggle(opt));\n opt.addEventListener('keydown', (e) => {\n const ev = e as KeyboardEvent;\n if (ev.key === 'Enter' || ev.key === ' ') {\n ev.preventDefault();\n this._toggle(opt);\n }\n });\n });\n }\n\n private _toggle(opt: HTMLElement): void {\n const val = opt.dataset.v ?? '';\n let current = this.value;\n\n if (this.multiple) {\n if (current.includes(val)) current = current.filter((v) => v !== val);\n else current.push(val);\n } else {\n current = current.includes(val) ? [] : [val];\n }\n\n this.value = current;\n this.root.querySelectorAll<HTMLElement>('.option').forEach((o) => {\n const on = current.includes(o.dataset.v ?? '');\n o.classList.toggle('active', on);\n o.setAttribute('aria-pressed', String(on));\n });\n this.dispatchEvent(new CustomEvent('change', { bubbles: true, composed: true, detail: { value: current } }));\n }\n}\n\nexport function defineFxToggleButtonGroup(): typeof FxToggleButtonGroup {\n return defineElement('fx-toggle-button-group', FxToggleButtonGroup);\n}","import { FxToggleButtonGroup, defineFxToggleButtonGroup } from './toggle-button-group';\n\nexport { FxToggleButtonGroup };\n\ndefineFxToggleButtonGroup();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'fx-toggle-button-group': FxToggleButtonGroup;\n }\n}","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\nimport { esc } from '../../core/sanitize';\nimport { FENIX_ICON_BASE_CSS, fenixIconHtml } from '../../icons/base-css';\n\n/**\n * <fx-empty-state> — Estado vazio/ilustrativo para listas e telas sem dados.\n *\n * Atributos: icon (glifo/emoji), heading (título), description (texto de apoio).\n * Slots: `icon` (customiza o ícone), `action` (botão/chamada para ação).\n */\nexport class FxEmptyState extends FxElement {\n static override styles = css`\n :host {\n display: flex;\n justify-content: center;\n font-family: var(--fx-font-family);\n font-size: var(--fx-font-size);\n }\n .wrap {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--fx-space-sm);\n padding: var(--fx-space-2xl, 48px) var(--fx-space-xl);\n text-align: center;\n max-width: 420px;\n }\n .icon {\n font-size: calc(var(--fx-font-size) + 28px);\n line-height: 1;\n color: var(--fx-text-muted);\n }\n .icon[hidden] { display: none; }\n h4 {\n margin: 0;\n font-size: calc(var(--fx-font-size) + 3px);\n font-weight: 600;\n color: var(--fx-text-default);\n }\n h4[hidden] { display: none; }\n p {\n margin: 0;\n font-size: calc(var(--fx-font-size) - 1px);\n color: var(--fx-text-muted);\n line-height: 1.5;\n }\n p[hidden] { display: none; }\n .action { margin-top: var(--fx-space-sm); }\n .action:empty { display: none; }\n /* Base dos glifos Fenix Icons (o @font-face vem de @wrrdev/fenix-ui/icons). */\n ${FENIX_ICON_BASE_CSS}\n `;\n\n static override get observedAttributes(): string[] {\n return ['icon', 'heading', 'description'];\n }\n\n protected override render(): void {\n const icon = this.getAttr('icon', '📭');\n const heading = this.getAttr('heading');\n const description = this.getAttr('description');\n\n this.setTemplate(`\n <div class=\"wrap\" part=\"wrap\">\n <span class=\"icon\" part=\"icon\" aria-hidden=\"true\">${fenixIconHtml(icon)}</span>\n <h4 part=\"heading\" ${heading ? '' : 'hidden'}>${esc(heading)}</h4>\n <p part=\"description\" ${description ? '' : 'hidden'}>${esc(description)}</p>\n <slot name=\"icon\"></slot>\n <span class=\"action\"><slot name=\"action\"></slot></span>\n </div>\n `);\n }\n}\n\nexport function defineFxEmptyState(): typeof FxEmptyState {\n return defineElement('fx-empty-state', FxEmptyState);\n}","import { FxEmptyState, defineFxEmptyState } from './empty-state';\n\nexport { FxEmptyState };\n\ndefineFxEmptyState();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'fx-empty-state': FxEmptyState;\n }\n}","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\n\n/**\n * <fx-password-strength> — Medidor de força de senha.\n *\n * Atributos: value (a senha a avaliar), label (rótulo acima), size (sm|md|lg).\n * A força (0-4) é calculada por comprimento e variedade de caracteres.\n * Evento (composed): `change` (detail: { score: 0-4, value }).\n */\nexport class FxPasswordStrength 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 .label {\n font-size: calc(var(--fx-font-size) - 2px);\n color: var(--fx-text-muted);\n margin-bottom: var(--fx-space-xs);\n display: flex;\n justify-content: space-between;\n gap: var(--fx-space-md);\n }\n .label strong { color: var(--_color); }\n .bars {\n display: flex;\n gap: 4px;\n --_color: var(--fx-text-muted);\n }\n .bar {\n flex: 1;\n height: 6px;\n border-radius: var(--fx-radius-full);\n background: var(--fx-surface-surface-hover, rgba(0, 0, 0, 0.08));\n transition: background var(--fx-motion-duration-normal) var(--fx-motion-easing);\n }\n .bar.on { background: var(--_color); }\n :host([size='sm']) .bar { height: 4px; }\n :host([size='lg']) .bar { height: 8px; }\n /* cores por nível via data-score no host */\n :host([data-score='1']) { --_color: var(--fx-color-danger); }\n :host([data-score='2']) { --_color: var(--fx-color-warning); }\n :host([data-score='3']) { --_color: var(--fx-color-info); }\n :host([data-score='4']) { --_color: var(--fx-color-success); }\n `;\n\n static override get observedAttributes(): string[] {\n return ['value', 'label', 'size'];\n }\n\n get value(): string { return this.getAttr('value'); }\n set value(v: string) { this.setAttribute('value', v); }\n\n /** Calcula a força da senha (0-4). */\n private _score(): number {\n const v = this.value;\n if (!v) return 0;\n let score = 0;\n if (v.length >= 6) score++;\n if (v.length >= 10) score++;\n if (/[A-Z]/.test(v) && /[a-z]/.test(v)) score++;\n if (/\\d/.test(v) && /[^A-Za-z0-9]/.test(v)) score++;\n return Math.min(4, score);\n }\n\n private _labelFor(score: number): string {\n return ['Muito fraca', 'Fraca', 'Razoável', 'Forte', 'Muito forte'][score];\n }\n\n protected override render(): void {\n this._paint();\n }\n\n private _paint(): void {\n const score = this._score();\n const label = this.getAttr('label', 'Força da senha');\n\n this.setTemplate(`\n <div class=\"label\" part=\"label\">\n <span>${label}</span>\n <strong>${score > 0 ? this._labelFor(score) : ''}</strong>\n </div>\n <div class=\"bars\" part=\"bars\" role=\"progressbar\" aria-valuemin=\"0\" aria-valuemax=\"4\" aria-valuenow=\"${score}\">\n ${Array.from({ length: 4 }, (_, i) => `<span class=\"bar ${i < score ? 'on' : ''}\" part=\"bar\"></span>`).join('')}\n </div>\n `);\n this.dataset.score = String(score);\n }\n\n protected override attributeChangedCallback(): void {\n if (this.isConnected) {\n const prev = this._prevScore;\n this._paint();\n const score = this._score();\n if (score !== prev) {\n this.dispatchEvent(new CustomEvent('change', {\n bubbles: true, composed: true,\n detail: { score, value: this.value },\n }));\n this._prevScore = score;\n }\n }\n }\n\n private _prevScore = -1;\n}\n\nexport function defineFxPasswordStrength(): typeof FxPasswordStrength {\n return defineElement('fx-password-strength', FxPasswordStrength);\n}","import { FxPasswordStrength, defineFxPasswordStrength } from './password-strength';\n\nexport { FxPasswordStrength };\n\ndefineFxPasswordStrength();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'fx-password-strength': FxPasswordStrength;\n }\n}","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\nimport { esc } from '../../core/sanitize';\n\n/**\n * <fx-timeline> — Linha do tempo vertical com eventos.\n *\n * Atributos: marker (glifo do marcador, padrão '●'), size (sm|md|lg).\n * Slot `item`: cada elemento com [slot=\"item\"] vira um evento. Use os\n * atributos `time` (texto do horário/data), `title` e `icon` (glifo da\n * fonte Fenix Icons, ex.: \"check_circle\") no item.\n *\n * Exemplo:\n * <fx-timeline>\n * <div slot=\"item\" time=\"09:00\" title=\"Reunião\">Detalhes…</div>\n * <div slot=\"item\" time=\"14:00\" title=\"Deploy\">Detalhes…</div>\n * </fx-timeline>\n */\nexport class FxTimeline 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 --_marker: calc(var(--fx-font-size) + 6px);\n }\n :host([size='sm']) { --_marker: calc(var(--fx-font-size) - 2px); }\n :host([size='lg']) { --_marker: calc(var(--fx-font-size) + 14px); }\n\n .tl {\n list-style: none;\n margin: 0;\n padding: 0;\n position: relative;\n }\n /* linha vertical centralizada no eixo dos marcadores */\n .tl::before {\n content: '';\n position: absolute;\n left: calc(var(--_marker) / 2 - 1px);\n top: calc(var(--_marker) / 2);\n bottom: 6px;\n width: 2px;\n background: var(--fx-border-default);\n }\n .event {\n position: relative;\n padding: 0 0 var(--fx-space-lg) calc(var(--_marker) + var(--fx-space-lg));\n }\n .event:last-child { padding-bottom: 0; }\n /* marcador circular centralizado no eixo da linha */\n .dot {\n position: absolute;\n left: 0;\n top: 0;\n width: var(--_marker);\n height: var(--_marker);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-size: calc(var(--_marker) * 0.5);\n color: var(--fx-color-primary);\n line-height: 1;\n }\n /* marcador com ícone da fonte Fenix Icons (atributo icon no item) */\n .dot.fx-icon {\n font-family: var(--fx-icon-font, 'Fenix Icons');\n font-weight: normal;\n font-style: normal;\n font-variation-settings: 'FILL' 0, 'wght' 500, 'GRAD' 0, 'opsz' 24;\n -webkit-font-smoothing: antialiased;\n user-select: none;\n background: color-mix(in srgb, var(--fx-color-primary) 14%, transparent);\n border-radius: 50%;\n font-size: calc(var(--_marker) * 0.55);\n }\n .head {\n display: flex;\n align-items: baseline;\n gap: var(--fx-space-sm);\n flex-wrap: wrap;\n min-height: var(--_marker);\n }\n .time {\n font-size: calc(var(--fx-font-size) - 2px);\n color: var(--fx-text-muted);\n white-space: nowrap;\n }\n .title {\n font-weight: 600;\n color: var(--fx-text-default);\n }\n .content {\n margin-top: 2px;\n color: var(--fx-text-default);\n line-height: 1.5;\n }\n .event[hidden] { display: none; }\n\n /* ---- modo horizontal ---- */\n :host([orientation='horizontal']) .tl {\n display: flex;\n }\n :host([orientation='horizontal']) .tl::before {\n left: calc(var(--_marker) / 2 - 1px);\n right: calc(var(--_marker) / 2);\n top: calc(var(--_marker) / 2 - 1px);\n bottom: auto;\n width: auto;\n height: 2px;\n }\n :host([orientation='horizontal']) .event {\n flex: 1;\n display: flex;\n flex-direction: column;\n padding: 0 var(--fx-space-lg) 0 0;\n }\n :host([orientation='horizontal']) .event:last-child { padding-right: 0; }\n :host([orientation='horizontal']) .event .dot {\n position: static;\n margin-bottom: var(--fx-space-sm);\n }\n `;\n\n static override get observedAttributes(): string[] {\n return ['marker', 'size', 'orientation'];\n }\n\n protected override render(): void {\n this.setTemplate(`<ol class=\"tl\" part=\"timeline\"></ol>`);\n this._decorate();\n }\n\n /**\n * Monta os eventos a partir dos itens do light DOM.\n * Os itens permanecem no light DOM (sem slot correspondente, não são\n * renderizados) — assim a decoração é idempotente e sobrevive a re-renders.\n */\n private _decorate(): void {\n const list = this.shadowRoot?.querySelector('ol');\n if (!list) return;\n const marker = this.getAttr('marker', '●');\n const items = Array.from(this.querySelectorAll('[slot=\"item\"]'));\n if (!items.length) return;\n\n list.innerHTML = items\n .map((item) => {\n const time = item.getAttribute('time') ?? '';\n const title = item.getAttribute('title') ?? '';\n const head = [\n time ? `<span class=\"time\">${esc(time)}</span>` : '',\n title ? `<span class=\"title\">${esc(title)}</span>` : '',\n ].join('');\n // Ícone por item (atributo icon) tem prioridade sobre o glifo global (marker).\n const icon = item.getAttribute('icon');\n const dot = icon\n ? `<span class=\"dot fx-icon\" part=\"marker\" aria-hidden=\"true\">${esc(icon)}</span>`\n : `<span class=\"dot\" part=\"marker\" aria-hidden=\"true\">${esc(marker)}</span>`;\n return `<li class=\"event\" part=\"event\">${dot}<div class=\"head\">${head}</div><div class=\"content\">${item.innerHTML}</div></li>`;\n })\n .join('');\n // Garante a fonte de ícones quando algum item usa icon=\"…\" (auto-injeção única).\n if (items.some((item) => item.hasAttribute('icon'))) void import('../../icons');\n }\n\n private _observer?: MutationObserver;\n\n protected override connectedCallback(): void {\n super.connectedCallback();\n // filhos podem chegar depois (innerHTML do playground)\n this._observer = new MutationObserver(() => this._decorate());\n this._observer.observe(this, { childList: true, subtree: false });\n this._decorate();\n }\n\n protected override disconnectedCallback(): void {\n super.disconnectedCallback();\n this._observer?.disconnect();\n this._observer = undefined;\n }\n}\n\nexport function defineFxTimeline(): typeof FxTimeline {\n return defineElement('fx-timeline', FxTimeline);\n}","import { FxTimeline, defineFxTimeline } from './timeline';\n\nexport { FxTimeline };\n\ndefineFxTimeline();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'fx-timeline': FxTimeline;\n }\n}","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\n\n/**\n * <fx-carousel> — Carrossel de slides com navegação e indicadores.\n *\n * Atributos: active (índice do slide), autoplay (ms), loop, show-arrows,\n * show-indicators.\n * Slot `slide`: cada elemento com [slot=\"slide\"] vira um slide.\n * Eventos (composed): `change` (detail: { index }).\n */\nexport class FxCarousel 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 .viewport {\n position: relative;\n overflow: hidden;\n border-radius: var(--fx-radius-lg);\n border: 1px solid var(--fx-border-default);\n background: var(--fx-surface-surface-hover, rgba(0, 0, 0, 0.04));\n }\n .slide {\n min-height: 200px;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--fx-space-xl);\n box-sizing: border-box;\n color: var(--fx-text-default);\n }\n .slide[hidden] { display: none; }\n .arrow {\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n width: 34px;\n height: 34px;\n border: 1px solid var(--fx-border-default);\n border-radius: var(--fx-radius-full);\n background: color-mix(in srgb, var(--fx-surface-background, #fff) 82%, transparent);\n color: var(--fx-text-default);\n font-size: calc(var(--fx-font-size) + 4px);\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n backdrop-filter: blur(2px);\n transition: background var(--fx-motion-duration-fast) var(--fx-motion-easing), border-color var(--fx-motion-duration-fast) var(--fx-motion-easing), color var(--fx-motion-duration-fast) var(--fx-motion-easing), transform var(--fx-motion-duration-fast) var(--fx-motion-easing);\n }\n .arrow:hover {\n background: var(--fx-color-primary);\n border-color: var(--fx-color-primary);\n color: #fff;\n transform: translateY(-50%) scale(1.08);\n }\n .arrow[hidden] { display: none; }\n .arrow.prev { left: var(--fx-space-md); }\n .arrow.next { right: var(--fx-space-md); }\n .indicators {\n display: flex;\n justify-content: center;\n gap: 6px;\n padding: var(--fx-space-md) 0 var(--fx-space-xs);\n }\n .indicators[hidden] { display: none; }\n .dot {\n width: 8px;\n height: 8px;\n border-radius: var(--fx-radius-full);\n border: none;\n padding: 0;\n background: var(--fx-surface-surface-hover, rgba(0, 0, 0, 0.15));\n cursor: pointer;\n transition: background var(--fx-motion-duration-fast) var(--fx-motion-easing), width var(--fx-motion-duration-fast) var(--fx-motion-easing);\n }\n .dot.on { background: var(--fx-color-primary); width: 20px; }\n `;\n\n static override get observedAttributes(): string[] {\n return ['active', 'autoplay', 'loop', 'show-arrows', 'show-indicators'];\n }\n\n get active(): number {\n const n = Number(this.getAttr('active', '0'));\n return Math.min(this.slideCount - 1, Math.max(0, Number.isFinite(n) ? n : 0));\n }\n set active(v: number) {\n this.setAttribute('active', String(Math.min(this.slideCount - 1, Math.max(0, v))));\n }\n\n get slideCount(): number { return this._slides.length; }\n\n private _slides: Element[] = [];\n private _timer?: ReturnType<typeof setInterval>;\n\n protected override render(): void {\n this._slides = Array.from(this.children).filter((el) => el.matches('[slot=\"slide\"]'));\n\n const contentsHtml = this._slides\n .map((s, i) => `<div class=\"slide\" part=\"slide\" data-i=\"${i}\" ${i === this.active ? '' : 'hidden'}>${s.innerHTML}</div>`)\n .join('');\n\n this.setTemplate(`\n <div class=\"viewport\" part=\"viewport\">\n ${contentsHtml}\n <button type=\"button\" class=\"arrow prev\" part=\"arrow\" aria-label=\"Anterior\" ${this.hasAttr('show-arrows') ? '' : 'hidden'}>‹</button>\n <button type=\"button\" class=\"arrow next\" part=\"arrow\" aria-label=\"Próximo\" ${this.hasAttr('show-arrows') ? '' : 'hidden'}>›</button>\n </div>\n <div class=\"indicators\" part=\"indicators\" ${this.hasAttr('show-indicators') ? '' : 'hidden'}>\n ${this._slides.map((_, i) => `<button type=\"button\" class=\"dot ${i === this.active ? 'on' : ''}\" data-i=\"${i}\" aria-label=\"Slide ${i + 1}\"></button>`).join('')}\n </div>\n `);\n\n this._bind();\n this._restartAutoplay();\n }\n\n protected override attributeChangedCallback(\n name: string,\n oldValue: string | null,\n newValue: string | null,\n ): void {\n if (!this.isConnected || oldValue === newValue) return;\n // só o índice ativo evita re-render total (preserva autoplay)\n if (name === 'active' && this._slides.length) {\n this._go(this.active, false);\n this._restartAutoplay();\n return;\n }\n // show-arrows/show-indicators/loop/autoplay: re-render estrutural\n this.render();\n }\n\n private _go(index: number, emit = true): void {\n const count = this._slides.length;\n if (!count) return;\n let target: number;\n if (this.hasAttr('loop')) {\n // wrap nas duas direções (permite voltar do primeiro ao último)\n target = ((index % count) + count) % count;\n } else {\n target = Math.min(count - 1, Math.max(0, index));\n }\n // guarda: evita recursão infinita (setAttribute → attributeChangedCallback → _go)\n if (String(target) === this.getAttribute('active')) return;\n this.active = target;\n\n this.root.querySelectorAll<HTMLElement>('.slide').forEach((s) => {\n s.toggleAttribute('hidden', Number(s.dataset.i) !== target);\n });\n this.root.querySelectorAll<HTMLElement>('.dot').forEach((d) => {\n d.classList.toggle('on', Number(d.dataset.i) === target);\n });\n if (emit) {\n this.dispatchEvent(new CustomEvent('change', { bubbles: true, composed: true, detail: { index: target } }));\n }\n }\n\n next(): void { this._go(this.active + 1); }\n prev(): void { this._go(this.active - 1); }\n\n private _bind(): void {\n this.root.querySelector('.arrow.prev')?.addEventListener('click', () => this.prev());\n this.root.querySelector('.arrow.next')?.addEventListener('click', () => this.next());\n this.root.querySelectorAll<HTMLElement>('.dot').forEach((d) => {\n d.addEventListener('click', () => this._go(Number(d.dataset.i)));\n });\n }\n\n private _restartAutoplay(): void {\n if (this._timer) { clearInterval(this._timer); this._timer = undefined; }\n const ms = Number(this.getAttr('autoplay', '0'));\n if (ms > 0) {\n this._timer = setInterval(() => this._go(this.active + 1), ms);\n }\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n if (this._timer) { clearInterval(this._timer); this._timer = undefined; }\n }\n}\n\nexport function defineFxCarousel(): typeof FxCarousel {\n return defineElement('fx-carousel', FxCarousel);\n}\n","import { FxCarousel, defineFxCarousel } from './carousel';\n\nexport { FxCarousel };\n\ndefineFxCarousel();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'fx-carousel': FxCarousel;\n }\n}","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\nimport { esc } from '../../core/sanitize';\n\n/**\n * <fx-tree> — Árvore hierárquica com expandir/recolher e seleção.\n *\n * Dados via atributo `data` (JSON):\n * [{ label: 'Item', icon: '📁', children: [{ label: 'Filho' }] }]\n *\n * Atributos: data (JSON), expand-all (expande tudo), size (sm|md|lg).\n * Eventos (composed): `select` (detail: { node }).\n */\ninterface TreeNode {\n label: string;\n icon?: string;\n children?: TreeNode[];\n}\n\nexport class FxTree 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 ul { list-style: none; margin: 0; padding: 0; }\n ul ul { padding-left: var(--fx-space-xl); }\n li { margin: 2px 0; }\n .row {\n display: inline-flex;\n align-items: center;\n gap: var(--fx-space-xs);\n padding: var(--fx-space-xs) var(--fx-space-sm);\n border-radius: var(--fx-radius-sm);\n color: var(--fx-text-default);\n cursor: pointer;\n user-select: none;\n width: 100%;\n box-sizing: border-box;\n transition: background var(--fx-motion-duration-fast) var(--fx-motion-easing);\n }\n .row:hover { background: var(--fx-surface-surface-hover, rgba(0, 0, 0, 0.05)); }\n .row.selected { background: color-mix(in srgb, var(--fx-color-primary) 12%, transparent); color: var(--fx-color-primary); font-weight: 600; }\n .caret {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n min-width: 16px;\n font-size: calc(var(--fx-font-size) - 2px);\n color: var(--fx-text-muted);\n cursor: pointer;\n transition: transform var(--fx-motion-duration-fast) var(--fx-motion-easing);\n user-select: none;\n }\n .caret.open { transform: rotate(90deg); }\n .caret.leaf { visibility: hidden; }\n .icon { line-height: 1; }\n .children[hidden] { display: none; }\n :host([size='sm']) .row { padding: 2px var(--fx-space-xs); font-size: calc(var(--fx-font-size) - 2px); }\n :host([size='lg']) .row { padding: var(--fx-space-sm) var(--fx-space-md); font-size: calc(var(--fx-font-size) + 1px); }\n `;\n\n static override get observedAttributes(): string[] {\n return ['data', 'expand-all', 'size'];\n }\n\n private _expanded = new Set<string>();\n private _selected: string | null = null;\n\n protected override render(): void {\n this.setTemplate(`<ul part=\"tree\">${this._renderNodes(this.data, '')}</ul>`);\n this._bind();\n }\n\n private _path(i: number, parent: string): string {\n return parent ? `${parent}.${i}` : `${i}`;\n }\n\n private _renderNodes(nodes: TreeNode[], parent: string): string {\n const expandAll = this.hasAttr('expand-all');\n return nodes\n .map((node, i) => {\n const path = this._path(i, parent);\n const hasChildren = Array.isArray(node.children) && node.children.length > 0;\n const isOpen = expandAll || this._expanded.has(path);\n const selected = this._selected === path ? ' selected' : '';\n const children = hasChildren\n ? `<ul class=\"children\" ${isOpen ? '' : 'hidden'}>${this._renderNodes(node.children!, path)}</ul>`\n : '';\n return `<li><span class=\"row${selected}\" data-path=\"${path}\" role=\"treeitem\" tabindex=\"0\"><span class=\"caret ${hasChildren ? (isOpen ? 'open' : '') : 'leaf'}\" data-toggle=\"${hasChildren ? path : ''}\">▸</span>${node.icon ? `<span class=\"icon\">${esc(node.icon)}</span>` : ''}<span class=\"label\">${esc(node.label)}</span></span>${children}</li>`;\n })\n .join('');\n }\n\n\n get data(): TreeNode[] {\n try {\n const parsed = JSON.parse(this.getAttr('data', '[]'));\n return Array.isArray(parsed) ? parsed : [];\n } catch {\n return [];\n }\n }\n set data(v: TreeNode[]) { this.setAttribute('data', JSON.stringify(v)); }\n\n private _bind(): void {\n this.root.querySelectorAll<HTMLElement>('.caret[data-toggle]').forEach((caret) => {\n const path = caret.dataset.toggle;\n if (!path) return;\n caret.addEventListener('click', (e) => {\n e.stopPropagation();\n this._toggle(path, caret);\n });\n });\n this.root.querySelectorAll<HTMLElement>('.row').forEach((row) => {\n const path = row.dataset.path ?? '';\n row.addEventListener('click', () => {\n this._selected = path;\n this.root.querySelectorAll<HTMLElement>('.row').forEach((r) =>\n r.classList.toggle('selected', r === row),\n );\n this.dispatchEvent(new CustomEvent('select', {\n bubbles: true, composed: true, detail: { node: this._findNode(path) },\n }));\n });\n row.addEventListener('keydown', (e) => {\n if ((e as KeyboardEvent).key === 'Enter') row.click();\n });\n });\n }\n\n private _toggle(path: string, caret: HTMLElement): void {\n if (this._expanded.has(path)) this._expanded.delete(path);\n else this._expanded.add(path);\n const isOpen = this._expanded.has(path);\n caret.classList.toggle('open', isOpen);\n const li = caret.closest('li');\n li?.querySelector<HTMLElement>(':scope > ul.children')?.toggleAttribute('hidden', !isOpen);\n }\n\n private _findNode(path: string): TreeNode | undefined {\n let nodes = this.data;\n let node: TreeNode | undefined;\n for (const part of path.split('.')) {\n node = nodes[Number(part)];\n if (!node) return undefined;\n nodes = node.children ?? [];\n }\n return node;\n }\n\n /** Expande ou recolhe todos os nós. */\n setAllExpanded(open: boolean): void {\n if (open) this.setAttribute('expand-all', '');\n else { this.removeAttribute('expand-all'); this._expanded.clear(); }\n this.render();\n }\n}\n\nexport function defineFxTree(): typeof FxTree {\n return defineElement('fx-tree', FxTree);\n}\n","import { FxTree, defineFxTree } from './tree';\n\nexport { FxTree };\n\ndefineFxTree();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'fx-tree': FxTree;\n }\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), mode ('light'|'dark' — força o esquema de\n * cores do card independentemente do tema global).\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; pointer-events: auto; }\n/* Modo explícito: sobrepõe os tokens herdados do tema global SOMENTE neste card. */\n:host([mode='dark']) {\n --fx-surface-background: #1e293b;\n --fx-text-default: #f1f5f9;\n --fx-text-muted: #94a3b8;\n --fx-border-default: #334155;\n --fx-shadow-lg: 0 10px 30px rgba(0, 0, 0, .5);\n --fx-surface-surface-hover: rgba(255, 255, 255, .08);\n}\n:host([mode='light']) {\n --fx-surface-background: #ffffff;\n --fx-text-default: #1e293b;\n --fx-text-muted: #64748b;\n --fx-border-default: #e2e8f0;\n --fx-shadow-lg: 0 10px 30px rgba(0, 0, 0, .14);\n --fx-surface-surface-hover: rgba(0, 0, 0, .05);\n}\n.fx-icon {\n font-family: var(--fx-icon-font, 'Fenix Icons');\n font-weight: normal;\n font-style: normal;\n line-height: 1;\n letter-spacing: normal;\n display: inline-block;\n white-space: nowrap;\n direction: ltr;\n font-variation-settings: 'FILL' 0, 'wght' 500, 'GRAD' 0, 'opsz' 24;\n -webkit-font-smoothing: antialiased;\n user-select: none;\n}\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', 'icon', 'mode'];\n }\n\n /** Esquema de cores forçado do card: 'light' | 'dark' | undefined (segue o tema). */\n get mode(): 'light' | 'dark' | undefined {\n const m = this.getAttribute('mode');\n return m === 'light' || m === 'dark' ? m : undefined;\n }\n set mode(value: 'light' | 'dark' | undefined) {\n if (value) this.setAttribute('mode', value);\n else this.removeAttribute('mode');\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 const iconName = this.getAttribute('icon');\n const isFxIcon = !!iconName && /^[a-z][a-z0-9_]*$/.test(iconName);\n if (isFxIcon) void import('../../icons');\n const iconContent = isFxIcon ? iconName : KIND_ICON[kind] ?? KIND_ICON.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${isFxIcon ? ' fx-icon' : ''}\">${iconContent}</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 // Os cards reabilitam pointer-events via `:host { pointer-events: auto }` (herança),\n // sem necessidade de MutationObserver.\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 /** Força o esquema de cores do card, independentemente do tema global. */\n mode?: 'light' | 'dark';\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 if (o.mode) el.setAttribute('mode', o.mode);\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\n\n","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\nimport { esc } from '../../core/sanitize';\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\">${esc(content)}</span>\n `);\n }\n}\n\nexport function defineFxTooltip(): typeof FxTooltip {\n return defineElement('fx-tooltip', FxTooltip);\n}\n","/**\n * Diretiva fx-tooltip — Aplica tooltip em qualquer elemento HTML.\n *\n * Uso:\n * <div fx-tooltip=\"Texto simples\">Div com tooltip</div>\n * <button fx-tooltip=\"Clique\" fx-tooltip-position=\"bottom\">Botão</button>\n * <span fx-tooltip=\"<strong>HTML</strong>\" fx-tooltip-html>Texto</span>\n *\n * Atributos:\n * fx-tooltip — Conteúdo do tooltip (texto ou HTML)\n * fx-tooltip-position — Posição: top | bottom | left | right (padrão: top)\n * fx-tooltip-html — Se presente, trata o conteúdo como HTML\n */\n\nexport interface FxTooltipConfig {\n position: 'top' | 'bottom' | 'left' | 'right';\n html: boolean;\n}\n\nconst DEFAULT_CONFIG: FxTooltipConfig = {\n position: 'top',\n html: false,\n};\n\n/**\n * Classe que gerencia o comportamento de tooltip em um elemento.\n */\nclass TooltipBehavior {\n private element: HTMLElement;\n private tooltipElement: HTMLSpanElement | null = null;\n private config: FxTooltipConfig;\n private showTimeout: number | null = null;\n private hideTimeout: number | null = null;\n\n constructor(element: HTMLElement) {\n this.element = element;\n this.config = this.parseConfig();\n this.init();\n }\n\n private parseConfig(): FxTooltipConfig {\n const position = this.element.getAttribute('fx-tooltip-position') as FxTooltipConfig['position'];\n return {\n position: position && ['top', 'bottom', 'left', 'right'].includes(position) ? position : DEFAULT_CONFIG.position,\n html: this.element.hasAttribute('fx-tooltip-html'),\n };\n }\n\n private init(): void {\n const computedStyle = window.getComputedStyle(this.element);\n if (computedStyle.position === 'static') {\n this.element.style.position = 'relative';\n }\n this.createTooltipElement();\n this.element.addEventListener('mouseenter', this.show);\n this.element.addEventListener('mouseleave', this.hide);\n this.element.addEventListener('focus', this.show);\n this.element.addEventListener('blur', this.hide);\n }\n\n private createTooltipElement(): void {\n const content = this.element.getAttribute('fx-tooltip');\n if (!content) return;\n this.tooltipElement = document.createElement('span');\n this.tooltipElement.setAttribute('role', 'tooltip');\n this.tooltipElement.setAttribute('data-fx-tooltip', '');\n this.tooltipElement.className = `fx-tooltip-bubble fx-tooltip-${this.config.position}`;\n if (this.config.html) {\n this.tooltipElement.innerHTML = content;\n } else {\n this.tooltipElement.textContent = content;\n }\n this.element.appendChild(this.tooltipElement);\n }\n\n private show = (): void => {\n if (this.hideTimeout) {\n clearTimeout(this.hideTimeout);\n this.hideTimeout = null;\n }\n this.showTimeout = window.setTimeout(() => {\n if (this.tooltipElement) {\n this.tooltipElement.classList.add('fx-tooltip-visible');\n }\n }, 100);\n };\n\n private hide = (): void => {\n if (this.showTimeout) {\n clearTimeout(this.showTimeout);\n this.showTimeout = null;\n }\n this.hideTimeout = window.setTimeout(() => {\n if (this.tooltipElement) {\n this.tooltipElement.classList.remove('fx-tooltip-visible');\n }\n }, 50);\n };\n\n public update(): void {\n this.config = this.parseConfig();\n if (this.tooltipElement) {\n this.tooltipElement.remove();\n this.tooltipElement = null;\n }\n this.createTooltipElement();\n }\n\n public destroy(): void {\n this.element.removeEventListener('mouseenter', this.show);\n this.element.removeEventListener('mouseleave', this.hide);\n this.element.removeEventListener('focus', this.show);\n this.element.removeEventListener('blur', this.hide);\n if (this.showTimeout) clearTimeout(this.showTimeout);\n if (this.hideTimeout) clearTimeout(this.hideTimeout);\n if (this.tooltipElement) {\n this.tooltipElement.remove();\n this.tooltipElement = null;\n }\n }\n}\n\n/**\n * Gerencia todas as instâncias de tooltip no documento.\n */\nclass FxTooltipManager {\n private static instance: FxTooltipManager | null = null;\n private observer: MutationObserver | null = null;\n private behaviors: Map<HTMLElement, TooltipBehavior> = new Map();\n private injectedStyles: HTMLStyleElement | null = null;\n\n private constructor() {\n this.injectStyles();\n this.observe();\n this.processExistingElements();\n }\n\n public static getInstance(): FxTooltipManager {\n if (!FxTooltipManager.instance) {\n FxTooltipManager.instance = new FxTooltipManager();\n }\n return FxTooltipManager.instance;\n }\n\n private injectStyles(): void {\n if (document.getElementById('fx-tooltip-directive-styles')) return;\n this.injectedStyles = document.createElement('style');\n this.injectedStyles.id = 'fx-tooltip-directive-styles';\n this.injectedStyles.textContent = getTooltipStyles();\n document.head.appendChild(this.injectedStyles);\n }\n\n private observe(): void {\n this.observer = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n if (mutation.type === 'childList') {\n mutation.addedNodes.forEach((node) => {\n if (node instanceof HTMLElement) {\n this.processElement(node);\n node.querySelectorAll<HTMLElement>('[fx-tooltip]').forEach((el) => this.processElement(el));\n }\n });\n }\n if (mutation.type === 'attributes' && mutation.target instanceof HTMLElement) {\n const target = mutation.target;\n if (target.hasAttribute('fx-tooltip')) {\n this.processElement(target);\n } else if (this.behaviors.has(target)) {\n this.removeBehavior(target);\n }\n }\n }\n });\n this.observer.observe(document.body, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['fx-tooltip', 'fx-tooltip-position', 'fx-tooltip-html'],\n });\n }\n\n private processExistingElements(): void {\n document.querySelectorAll<HTMLElement>('[fx-tooltip]').forEach((el) => this.processElement(el));\n }\n\n private processElement(element: HTMLElement): void {\n if (!element.hasAttribute('fx-tooltip')) {\n this.removeBehavior(element);\n return;\n }\n if (this.behaviors.has(element)) {\n this.behaviors.get(element)!.update();\n } else {\n this.behaviors.set(element, new TooltipBehavior(element));\n }\n }\n\n private removeBehavior(element: HTMLElement): void {\n const behavior = this.behaviors.get(element);\n if (behavior) {\n behavior.destroy();\n this.behaviors.delete(element);\n }\n }\n\n public destroy(): void {\n if (this.observer) {\n this.observer.disconnect();\n this.observer = null;\n }\n this.behaviors.forEach((behavior) => behavior.destroy());\n this.behaviors.clear();\n if (this.injectedStyles) {\n this.injectedStyles.remove();\n this.injectedStyles = null;\n }\n FxTooltipManager.instance = null;\n }\n}\n\n/**\n * Retorna os estilos CSS para os tooltips.\n */\nfunction getTooltipStyles(): string {\n return /* css */ `\n [fx-tooltip] {\n position: relative;\n }\n\n .fx-tooltip-bubble {\n position: absolute;\n background: var(--fx-text-default, #1e293b);\n color: var(--fx-surface-background, #fff);\n font-family: var(--fx-font-family, system-ui, -apple-system, sans-serif);\n font-size: calc(var(--fx-font-size, 14px) - 2px);\n line-height: 1.45;\n padding: var(--fx-space-xs, 4px) var(--fx-space-md, 12px);\n border-radius: var(--fx-radius-sm, 4px);\n box-shadow: var(--fx-shadow-md, 0 4px 6px -1px rgba(0, 0, 0, 0.1));\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, 150ms) var(--fx-motion-easing, ease);\n z-index: var(--fx-z-tooltip, 1050);\n pointer-events: none;\n }\n\n .fx-tooltip-bubble.fx-tooltip-visible {\n opacity: 1;\n visibility: visible;\n }\n\n .fx-tooltip-top {\n bottom: calc(100% + 6px);\n left: 50%;\n transform: translateX(-50%);\n }\n .fx-tooltip-top::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\n .fx-tooltip-bottom {\n top: calc(100% + 6px);\n left: 50%;\n transform: translateX(-50%);\n bottom: auto;\n }\n .fx-tooltip-bottom::after {\n content: '';\n position: absolute;\n bottom: 100%;\n left: 50%;\n transform: translateX(-50%);\n border: 5px solid transparent;\n border-bottom-color: var(--fx-text-default, #1e293b);\n }\n\n .fx-tooltip-left {\n right: calc(100% + 6px);\n top: 50%;\n transform: translateY(-50%);\n left: auto;\n bottom: auto;\n }\n .fx-tooltip-left::after {\n content: '';\n position: absolute;\n top: 50%;\n left: 100%;\n transform: translateY(-50%);\n border: 5px solid transparent;\n border-left-color: var(--fx-text-default, #1e293b);\n }\n\n .fx-tooltip-right {\n left: calc(100% + 6px);\n top: 50%;\n transform: translateY(-50%);\n right: auto;\n bottom: auto;\n }\n .fx-tooltip-right::after {\n content: '';\n position: absolute;\n top: 50%;\n right: 100%;\n transform: translateY(-50%);\n border: 5px solid transparent;\n border-right-color: var(--fx-text-default, #1e293b);\n }\n `;\n}\n\n/**\n * Inicializa a diretiva fx-tooltip.\n * Deve ser chamado uma vez na aplicação.\n *\n * @example\n * import { defineFxTooltipDirective } from '@wrrdev/fenix-ui/tooltip';\n * defineFxTooltipDirective();\n */\nexport function defineFxTooltipDirective(): void {\n if (typeof window === 'undefined') return;\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', () => {\n FxTooltipManager.getInstance();\n });\n } else {\n FxTooltipManager.getInstance();\n }\n}\n\n/**\n * Destrói a diretiva fx-tooltip e limpa todos os recursos.\n */\nexport function destroyFxTooltipDirective(): void {\n FxTooltipManager.getInstance().destroy();\n}\n\n","import { FxTooltip, defineFxTooltip } from './tooltip';\nimport { defineFxTooltipDirective, destroyFxTooltipDirective } from './directive';\n\nexport { FxTooltip, defineFxTooltipDirective, destroyFxTooltipDirective };\n\ndefineFxTooltip();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'fx-tooltip': FxTooltip;\n }\n}\n","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\nimport { esc } from '../../core/sanitize';\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=\"${esc(tabId)}\" aria-selected=\"${tabId === active}\"\n ${disabled ? 'aria-disabled=\"true\" data-disabled=\"true\"' : ''}>${esc(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 /** Setter necessário: o Vue (patchDOMProp) seta `tab` como PROPRIEDADE\n * (pois o getter existe no prototype) — sem ele o atributo nunca é\n * aplicado e o painel nunca é exibido. */\n set tab(value: string) { this.setAttribute('tab', value); }\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';\nimport { esc } from '../../core/sanitize';\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\">${esc(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\n\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 /** Valida um valor de dimensão CSS, retornando-o seguro ou vazio. */\n private safeSize(value: string): string {\n const v = value.trim();\n return /^-?\\d*\\.?\\d+(px|em|rem|%|vw|vh|vmin|vmax|ch|ex|cm|mm|in|pt|pc)$/.test(v) ? v : '';\n }\n\n protected override render(): void {\n const variant = this.getAttr('variant', 'text');\n const width = this.safeSize(this.getAttr('width'));\n const height = this.safeSize(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\n\n","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\nimport { esc } from '../../core/sanitize';\nimport { FENIX_ICON_BASE_CSS, isFenixIconName } from '../../icons/base-css';\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 * icon (nome da Fenix Icons, ex.: icon=\"notification\" — substitui o glifo padrão).\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='info']) { --_color: var(--fx-color-info); --_bg: color-mix(in srgb, var(--fx-color-info) 10%, var(--fx-surface-background)); }\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 ${FENIX_ICON_BASE_CSS}\n .icon.fx-icon { font-size: 20px; line-height: 1.2; }\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', 'icon'];\n }\n\n protected override render(): void {\n const variant = this.getAttr('variant', 'info');\n const title = this.getAttr('title');\n const iconName = this.getAttr('icon');\n if (isFenixIconName(iconName)) void import('../../icons');\n const icons: Record<string, string> = {\n info: 'ℹ', success: '✓', warning: '⚠', danger: '✕',\n };\n const iconHtml = iconName\n ? `<span class=\"icon${isFenixIconName(iconName) ? ' fx-icon' : ''}\" part=\"icon\" aria-hidden=\"true\">${esc(iconName)}</span>`\n : `<span class=\"icon\">${icons[variant] ?? 'ℹ'}</span>`;\n\n this.setTemplate(`\n <div class=\"alert\" part=\"alert\" role=\"alert\">\n ${iconHtml}\n <div class=\"content\">\n ${title ? `<div class=\"title\">${esc(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\n","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\nimport { esc } from '../../core/sanitize';\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 ${esc(label)} ▾\n </span>\n <div class=\"panel\" role=\"menu\" part=\"panel\">\n ${items.length ? '' : '<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 === ' ') {\n e.preventDefault();\n this.open = !this.open;\n } else if (e.key === 'Escape') {\n this.open = false;\n }\n });\n\n this._attachDelegatedListeners();\n }\n\n private docListener?: (e: Event) => void;\n private _listenersAttached = false;\n\n /** Delegação de cliques nos itens + fechamento ao clicar fora (registrado uma vez). */\n private _attachDelegatedListeners(): void {\n if (this._listenersAttached) return;\n this._listenersAttached = true;\n\n this.addEventListener('click', (e) => {\n const item = (e.composedPath() as HTMLElement[]).find(\n (n) => n.tagName?.toLowerCase() === 'fx-dropdown-item',\n );\n if (!item) return;\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 this.docListener = (e: Event) => {\n if (!this.contains(e.target as Node)) this.open = false;\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 this.docListener = undefined;\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';\nimport { esc } from '../../core/sanitize';\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=\"${esc(title || \"Drawer\")}\" tabindex=\"-1\">\n ${title !== \"\" ? `<div class=\"header\" part=\"header\"><span class=\"title\">${esc(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\tthis.root.querySelector(\".overlay\")?.addEventListener(\"click\", this._close);\n\t\tthis.root.querySelector(\".close\")?.addEventListener(\"click\", this._close);\n\n\t\tif (this.open) {\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tif (this._previouslyFocused === null) {\n\t\t\t\t\tthis._previouslyFocused = document.activeElement as HTMLElement | null;\n\t\t\t\t}\n\t\t\t\tthis.root.querySelector<HTMLElement>(\".panel\")?.focus();\n\t\t\t});\n\t\t}\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._close();\n\t\t\t} else if (e.key === \"Tab\" && this.open) {\n\t\t\t\tthis._trapFocus(e);\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\tthis._restoreFocus();\n\t\tsuper.disconnectedCallback?.();\n\t}\n\n\tprivate _onKeydown: (e: KeyboardEvent) => void = () => {};\n\tprivate _previouslyFocused: HTMLElement | null = null;\n\n\tprivate _close = (): void => {\n\t\tif (!this.open) return;\n\t\tthis.open = false;\n\t\tthis._restoreFocus();\n\t\tthis.dispatchEvent(\n\t\t\tnew CustomEvent(\"close\", { bubbles: true, composed: true }),\n\t\t);\n\t};\n\n\t/** Mantém o foco dentro do drawer (WCAG 2.4.3 / 2.1.2). */\n\tprivate _trapFocus(e: KeyboardEvent): void {\n\t\tconst panel = this.root.querySelector<HTMLElement>(\".panel\");\n\t\tif (!panel) return;\n\t\tconst focusables = panel.querySelectorAll<HTMLElement>(\n\t\t\t'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])',\n\t\t);\n\t\tif (!focusables.length) return;\n\t\tconst first = focusables[0];\n\t\tconst last = focusables[focusables.length - 1];\n\t\tconst active = this.root.activeElement;\n\t\tif (e.shiftKey && (active === first || active === panel)) {\n\t\t\te.preventDefault();\n\t\t\tlast.focus();\n\t\t} else if (!e.shiftKey && active === last) {\n\t\t\te.preventDefault();\n\t\t\tfirst.focus();\n\t\t}\n\t}\n\n\tprivate _restoreFocus(): void {\n\t\tif (this._previouslyFocused?.isConnected) this._previouslyFocused.focus();\n\t\tthis._previouslyFocused = null;\n\t}\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';\nimport { esc } from '../../core/sanitize';\nimport '../select';\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]):not(.active) { 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 fx-select { vertical-align: middle; }\n fx-select::part(trigger) {\n min-width: 64px !important;\n min-height: var(--fx-size-sm) !important;\n padding: 0 var(--fx-space-sm) !important;\n border-radius: var(--fx-radius-sm) !important;\n font-size: calc(var(--fx-font-size) - 2px) !important;\n }\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 <fx-select class=\"rows-sel\" part=\"rows\" size=\"sm\" value=\"${this.rows}\" aria-label=\"Itens por página\">\n ${opts.map((o) => `<option value=\"${esc(o)}\">${esc(o)}</option>`).join('')}\n </fx-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<HTMLElement>('fx-select.rows-sel');\n sel?.addEventListener('change', (e) => {\n const value = Number((e as CustomEvent).detail?.value);\n if (!value || value === this.rows) return;\n this.rows = 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\n","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\nimport { esc } from '../../core/sanitize';\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 /* Largura padrão no HOST: CSS externo, classes e style inline no elemento\n vencem este default naturalmente (regras do documento > :host). */\n width: var(--fx-autocomplete-width, 260px);\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 /* Acompanha a largura definida no :host. */\n width: 100%;\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 .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 :host([size='sm']) { width: var(--fx-autocomplete-width-sm, 220px); }\n :host([size='sm']) .field { min-height: var(--fx-size-sm); padding: var(--fx-space-sm) var(--fx-space-md); }\n :host([size='lg']) { width: var(--fx-autocomplete-width-lg, 300px); }\n :host([size='lg']) .field { min-height: var(--fx-size-lg); }\n /* Full width: o host estica até o pai e o campo interno acompanha. */\n :host([full]) { display: block; width: 100%; }\n :host([full]) .field { width: 100%; }\n /* Validação: sobrescrevem a borda/foco via token do preset. */\n :host([error]) .field,\n :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,\n :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 .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 // `error`/`success` (+ aliases `invalid`/`valid`) PRECISAM ser observados:\n // é assim que o toggle no playground / setAttribute no submit re-renderiza.\n return ['size', 'placeholder', 'source', 'disabled', 'min-chars', 'error', 'invalid', 'success', 'valid'];\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 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 /** Setter necessário para o Vue (patchDOMProp seta `source` como\n * propriedade, pois o getter existe no prototype). */\n set source(value: string | string[]) {\n this.setAttribute('source', typeof value === 'string' ? value : JSON.stringify(value));\n }\n\n private docListener?: (e: Event) => void;\n\n protected override connectedCallback(): void {\n super.connectedCallback();\n this.docListener = (e: Event) => {\n if (!this.contains(e.target as Node)) this.toggleAttr('open', false);\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 this.docListener = undefined;\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=\"${esc(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=\"${esc(m)}\">${esc(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 // Navegação por teclado: setas movem o foco entre as sugestões; ESC fecha.\n field.addEventListener('keydown', (e) => {\n if (e.key === 'Escape') {\n this.toggleAttr('open', false);\n return;\n }\n if (e.key !== 'ArrowDown' && e.key !== 'ArrowUp') return;\n e.preventDefault();\n if (!this.hasAttr('open')) openList();\n const opts = Array.from(this.root.querySelectorAll<HTMLButtonElement>('.opt'));\n if (!opts.length) return;\n const current = opts.indexOf(this.root.activeElement as HTMLButtonElement);\n const next = e.key === 'ArrowDown'\n ? (current === -1 ? 0 : Math.min(current + 1, opts.length - 1))\n : (current === -1 ? opts.length - 1 : Math.max(current - 1, 0));\n opts[next]?.focus();\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\n","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\nimport { esc } from '../../core/sanitize';\n\n/**\n * <fx-knob> - Controle giratorio circular para ajuste de valor.\n *\n * Similar ao Knob do PrimeVue, permite ajustar um valor arrastando o mouse\n * ou usando as setas do teclado. Exibe um arco de progresso circular com\n * o valor central configuravel via valueTemplate.\n *\n * Atributos: value, min, max, step, size, strokeWidth, valueColor, rangeColor,\n * readonly, disabled, valueTemplate.\n * Evento: `change` (composed, detail: { value }).\n */\nexport class FxKnob extends FxElement {\n static override styles = css`\n :host {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-family: var(--fx-font-family);\n font-size: var(--fx-font-size);\n --_size: 100px;\n --_stroke-width: 8px;\n --_value-color: var(--fx-color-primary);\n --_range-color: var(--fx-border-default);\n }\n :host([size='sm']) { --_size: 60px; }\n :host([size='lg']) { --_size: 140px; }\n .knob {\n position: relative;\n width: var(--_size);\n height: var(--_size);\n cursor: pointer;\n user-select: none;\n touch-action: none;\n }\n :host([readonly]) .knob,\n :host([disabled]) .knob {\n cursor: default;\n pointer-events: none;\n }\n :host([disabled]) .knob {\n opacity: 0.55;\n }\n svg {\n width: 100%;\n height: 100%;\n transform: rotate(-90deg);\n }\n .track {\n fill: none;\n stroke: var(--_range-color);\n stroke-width: var(--_stroke-width);\n }\n .value {\n fill: none;\n stroke: var(--_value-color);\n stroke-width: var(--_stroke-width);\n stroke-linecap: round;\n transition: stroke-dashoffset var(--fx-motion-duration-fast) var(--fx-motion-easing);\n }\n .label {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n font-weight: 600;\n color: var(--fx-text-default);\n pointer-events: none;\n }\n :host([size='sm']) .label { font-size: 11px; }\n :host([size='md']) .label { font-size: 14px; }\n :host([size='lg']) .label { font-size: 18px; }\n .knob:focus-visible {\n outline: none;\n }\n .knob:focus-visible svg {\n filter: drop-shadow(var(--fx-effect-focus-ring, 0 0 0 3px color-mix(in srgb, var(--fx-color-primary) 22%, transparent)));\n }\n `;\n\n static override get observedAttributes(): string[] {\n return [\n 'value',\n 'min',\n 'max',\n 'step',\n 'size',\n 'stroke-width',\n 'value-color',\n 'range-color',\n 'readonly',\n 'disabled',\n 'value-template',\n ];\n }\n\n get value(): number {\n return this.clampValue(Number(this.getAttr('value', '0')) || 0);\n }\n set value(v: number) {\n if (this.readonly || this.disabled) return;\n const clamped = this.clampValue(v);\n const current = this.clampValue(Number(this.getAttr('value', '0')) || 0);\n if (clamped !== current) {\n this.setAttribute('value', String(clamped));\n this.dispatchEvent(\n new CustomEvent('change', {\n bubbles: true,\n composed: true,\n detail: { value: clamped },\n }),\n );\n }\n }\n\n get min(): number {\n return Number(this.getAttr('min', '0')) || 0;\n }\n set min(v: number) {\n this.setAttribute('min', String(v));\n }\n\n get max(): number {\n return Number(this.getAttr('max', '100')) || 100;\n }\n set max(v: number) {\n this.setAttribute('max', String(v));\n }\n\n get step(): number {\n return Number(this.getAttr('step', '1')) || 1;\n }\n set step(v: number) {\n this.setAttribute('step', String(v));\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) {\n this.setAttribute('size', v);\n }\n\n get strokeWidth(): number {\n return Number(this.getAttr('stroke-width', '8')) || 8;\n }\n set strokeWidth(v: number) {\n this.setAttribute('stroke-width', String(v));\n }\n\n get valueColor(): string {\n return this.getAttr('value-color', '');\n }\n set valueColor(v: string) {\n this.setAttribute('value-color', v);\n }\n\n get rangeColor(): string {\n return this.getAttr('range-color', '');\n }\n set rangeColor(v: string) {\n this.setAttribute('range-color', v);\n }\n\n get readonly(): boolean {\n return this.hasAttr('readonly');\n }\n set readonly(v: boolean) {\n this.toggleAttr('readonly', Boolean(v));\n }\n\n get disabled(): boolean {\n return this.hasAttr('disabled');\n }\n set disabled(v: boolean) {\n this.toggleAttr('disabled', Boolean(v));\n }\n\n get valueTemplate(): string {\n return this.getAttr('value-template', '{value}');\n }\n set valueTemplate(v: string) {\n this.setAttribute('value-template', v);\n }\n\n private _isDragging = false;\n private _startY = 0;\n private _startValue = 0;\n\n protected override render(): void {\n const min = this.min;\n const max = this.max;\n const value = this.clampValue(this.value);\n const range = max - min;\n const pct = range > 0 ? (value - min) / range : 0;\n\n const sizeNum = this.getSizeNum();\n const strokeW = this.strokeWidth;\n const radius = (sizeNum - strokeW) / 2;\n const circumference = 2 * Math.PI * radius;\n const offset = circumference * (1 - pct);\n\n const vc = this.valueColor ? this.safeColor(this.valueColor) : '';\n const rc = this.rangeColor ? this.safeColor(this.rangeColor) : '';\n const valueColorStyle = vc ? `--_value-color: ${vc};` : '';\n const rangeColorStyle = rc ? `--_range-color: ${rc};` : '';\n\n const displayValue = this.valueTemplate.replace('{value}', String(Math.round(value)));\n\n this.setTemplate(`\n <div class=\"knob\" part=\"knob\" tabindex=\"${this.disabled ? '-1' : '0'}\"\n role=\"slider\" aria-valuenow=\"${value}\" aria-valuemin=\"${min}\" aria-valuemax=\"${max}\"\n aria-readonly=\"${this.readonly}\" aria-disabled=\"${this.disabled}\"\n style=\"${valueColorStyle}${rangeColorStyle}\">\n <svg viewBox=\"0 0 ${sizeNum} ${sizeNum}\" part=\"svg\">\n <circle class=\"track\" part=\"track\"\n cx=\"${sizeNum / 2}\" cy=\"${sizeNum / 2}\" r=\"${radius}\" />\n <circle class=\"value\" part=\"value\"\n cx=\"${sizeNum / 2}\" cy=\"${sizeNum / 2}\" r=\"${radius}\"\n stroke-dasharray=\"${circumference}\"\n stroke-dashoffset=\"${offset}\" />\n </svg>\n <div class=\"label\" part=\"label\">${esc(displayValue)}</div>\n </div>\n `);\n\n this.attachListeners();\n }\n\n private getSizeNum(): number {\n const s = this.size;\n if (s === 'sm') return 60;\n if (s === 'lg') return 140;\n return 100;\n }\n\n /** Valida um valor de cor CSS, retornando-o seguro ou vazio. */\n private safeColor(value: string): string {\n const v = value.trim();\n if (/^#[0-9a-fA-F]{3,8}$/.test(v)) return v;\n if (/^(rgb|rgba|hsl|hsla)\\([\\d\\s.,%()]+\\)$/i.test(v)) return v;\n if (/^var\\(--[\\w-]+(,\\s*[^)]*)?\\)$/.test(v)) return v;\n if (/^[a-zA-Z]+$/.test(v)) return v;\n return '';\n }\n\n private clampValue(v: number): number {\n const min = this.min;\n const max = this.max;\n const step = this.step;\n let clamped = Math.min(max, Math.max(min, v));\n if (step > 0) {\n clamped = Math.round((clamped - min) / step) * step + min;\n clamped = Math.min(max, Math.max(min, clamped));\n }\n return clamped;\n }\n\n private emitChange(newValue: number): void {\n const clamped = this.clampValue(newValue);\n if (clamped !== this.value) {\n this.value = clamped;\n this.dispatchEvent(\n new CustomEvent('change', {\n bubbles: true,\n composed: true,\n detail: { value: clamped },\n }),\n );\n }\n }\n\n private attachListeners(): void {\n const knob = this.root.querySelector<HTMLElement>('.knob');\n if (!knob) return;\n\n knob.addEventListener('mousedown', (e: MouseEvent) => {\n if (this.readonly || this.disabled) return;\n e.preventDefault();\n this._isDragging = true;\n this._startY = e.clientY;\n this._startValue = this.value;\n knob.focus();\n document.addEventListener('mousemove', this._onMouseMove);\n document.addEventListener('mouseup', this._onMouseUp);\n });\n\n knob.addEventListener('touchstart', (e: TouchEvent) => {\n if (this.readonly || this.disabled) return;\n e.preventDefault();\n this._isDragging = true;\n this._startY = e.touches[0].clientY;\n this._startValue = this.value;\n knob.focus();\n }, { passive: false });\n\n knob.addEventListener('touchmove', (e: TouchEvent) => {\n if (!this._isDragging || this.readonly || this.disabled) return;\n e.preventDefault();\n const deltaY = this._startY - e.touches[0].clientY;\n const sensitivity = (this.max - this.min) / 100;\n this.emitChange(this._startValue + deltaY * sensitivity);\n }, { passive: false });\n\n knob.addEventListener('touchend', () => {\n this._isDragging = false;\n });\n\n knob.addEventListener('keydown', (e: KeyboardEvent) => {\n if (this.readonly || this.disabled) return;\n const step = this.step;\n switch (e.key) {\n case 'ArrowUp':\n case 'ArrowRight':\n e.preventDefault();\n this.emitChange(this.value + step);\n break;\n case 'ArrowDown':\n case 'ArrowLeft':\n e.preventDefault();\n this.emitChange(this.value - step);\n break;\n case 'Home':\n e.preventDefault();\n this.emitChange(this.min);\n break;\n case 'End':\n e.preventDefault();\n this.emitChange(this.max);\n break;\n case 'PageUp':\n e.preventDefault();\n this.emitChange(this.value + step * 10);\n break;\n case 'PageDown':\n e.preventDefault();\n this.emitChange(this.value - step * 10);\n break;\n }\n });\n }\n\n private _onMouseMove = (e: MouseEvent): void => {\n if (!this._isDragging) return;\n const deltaY = this._startY - e.clientY;\n const sensitivity = (this.max - this.min) / 100;\n this.emitChange(this._startValue + deltaY * sensitivity);\n };\n\n private _onMouseUp = (): void => {\n this._isDragging = false;\n document.removeEventListener('mousemove', this._onMouseMove);\n document.removeEventListener('mouseup', this._onMouseUp);\n };\n\n protected override disconnectedCallback(): void {\n document.removeEventListener('mousemove', this._onMouseMove);\n document.removeEventListener('mouseup', this._onMouseUp);\n super.disconnectedCallback();\n }\n}\n\nexport function defineFxKnob(): typeof FxKnob {\n return defineElement('fx-knob', FxKnob);\n}","import { FxKnob, defineFxKnob } from './knob';\n\nexport { FxKnob };\n\ndefineFxKnob();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'fx-knob': FxKnob;\n }\n}","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\nimport { esc } from '../../core/sanitize';\n\nexport interface OrderListItem {\n [key: string]: unknown;\n}\n\n/**\n * <fx-orderlist> - Componente para ordenar uma colecao de itens.\n *\n * Permite reordenar itens arrastando ou usando botoes de controle.\n * Suporta filtro, selecao, checkbox e templates customizados.\n *\n * Atributos: data, data-key, filter, filter-by, filter-placeholder, breakpoint,\n * dragdrop, selection-mode, striped, show-select-all.\n * Evento: `reorder` (composed, detail: { items }).\n * Evento: `selection-change` (composed, detail: { selection }).\n */\nexport class FxOrderList extends FxElement {\n static override styles = css`\n\n :host {\n display: block;\n font-family: var(--fx-font-family);\n font-size: var(--fx-font-size);\n --orderlist-primary: var(--fx-color-primary, #3b82f6);\n --orderlist-border: var(--fx-border-default, #e2e8f0);\n --orderlist-bg: var(--fx-surface-background, #ffffff);\n --orderlist-bg-hover: var(--fx-surface-surface-hover, #f1f5f9);\n --orderlist-text: var(--fx-text-default, #1e293b);\n --orderlist-text-muted: var(--fx-text-muted, #64748b);\n --orderlist-radius: var(--fx-radius-md, 8px);\n --orderlist-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n --orderlist-transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n }\n * { box-sizing: border-box; }\n .container { display: flex; flex-direction: column; gap: var(--fx-space-md, 16px); }\n .list-wrapper { display: flex; flex-direction: column; gap: var(--fx-space-sm, 8px); flex: 1; min-width: 0; }\n .select-all-bar { display: flex; align-items: center; justify-content: space-between; padding: var(--fx-space-sm, 10px) var(--fx-space-md, 14px); background: linear-gradient(135deg, var(--orderlist-bg), var(--orderlist-bg-hover)); border: 1px solid var(--orderlist-border); border-radius: var(--orderlist-radius); font-size: 0.9em; font-weight: 500; }\n .select-all-bar label { display: flex; align-items: center; gap: var(--fx-space-sm, 10px); cursor: pointer; user-select: none; color: var(--orderlist-text); }\n .select-all-bar input[type=\"checkbox\"] { width: 18px; height: 18px; accent-color: var(--orderlist-primary); cursor: pointer; }\n .filter-wrapper { margin-bottom: var(--fx-space-xs, 4px); }\n .filter-input { width: 100%; padding: var(--fx-space-sm, 10px) var(--fx-space-md, 14px); padding-left: 42px; border: 1.5px solid var(--orderlist-border); border-radius: var(--orderlist-radius); font-family: inherit; font-size: inherit; color: var(--orderlist-text); background: var(--orderlist-bg) url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%2394a3b8' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'%3E%3C/circle%3E%3Cline x1='21' y1='21' x2='16.65' y2='16.65'%3E%3C/line%3E%3C/svg%3E\") no-repeat 14px center; transition: var(--orderlist-transition); }\n .filter-input:focus { outline: none; border-color: var(--orderlist-primary); box-shadow: 0 0 0 3px color-mix(in srgb, var(--orderlist-primary) 20%, transparent); }\n .filter-input::placeholder { color: var(--orderlist-text-muted); }\n .main-row { display: flex; align-items: stretch; gap: var(--fx-space-sm, 8px); }\n .list { list-style: none; margin: 0; padding: 0; border: 1px solid var(--orderlist-border); border-radius: var(--orderlist-radius); overflow: hidden; box-shadow: var(--orderlist-shadow); max-height: 450px; overflow-y: auto; flex: 1; }\n .list::-webkit-scrollbar { width: 6px; }\n .list::-webkit-scrollbar-track { background: transparent; }\n .list::-webkit-scrollbar-thumb { background: var(--orderlist-border); border-radius: 3px; }\n .list::-webkit-scrollbar-thumb:hover { background: var(--orderlist-text-muted); }\n .selection-count { font-size: 0.85em; color: var(--orderlist-primary); background: color-mix(in srgb, var(--orderlist-primary) 12%, transparent); padding: 4px 12px; border-radius: 20px; font-weight: 600; }\n :host([striped]) .list-item:nth-child(even) { background: var(--fx-surface-surface, #f8fafc); }\n .list-item { display: flex; align-items: center; gap: var(--fx-space-sm, 10px); padding: var(--fx-space-sm, 10px) var(--fx-space-md, 14px); background: var(--orderlist-bg); border-bottom: 1px solid var(--orderlist-border); cursor: pointer; user-select: none; transition: var(--orderlist-transition); }\n .list-item:last-child { border-bottom: none; }\n .list-item:hover { background: var(--orderlist-bg-hover); }\n .list-item.selected { background: color-mix(in srgb, var(--orderlist-primary) 8%, transparent); border-left: 3px solid var(--orderlist-primary); padding-left: 11px; }\n .list-item:focus-visible { outline: none; background: color-mix(in srgb, var(--orderlist-primary) 15%, transparent); }\n .list-item.dragging { opacity: 0.5; background: var(--orderlist-bg-hover); }\n .list-item.drag-over { border-top: 2px solid var(--orderlist-primary); }\n .drag-handle { color: var(--orderlist-text-muted); cursor: grab; flex-shrink: 0; font-size: 1.2em; opacity: 0.6; transition: var(--orderlist-transition); }\n .drag-handle:hover { opacity: 1; }\n .drag-handle:active { cursor: grabbing; }\n .item-content { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n .checkbox { flex-shrink: 0; width: 18px; height: 18px; accent-color: var(--orderlist-primary); cursor: pointer; transition: var(--orderlist-transition); }\n .checkbox:hover { transform: scale(1.1); }\n .empty-message { padding: var(--fx-space-xl, 32px); text-align: center; color: var(--orderlist-text-muted); font-style: italic; }\n .controls-bar {\n display: flex;\n flex-direction: column;\n gap: 4px;\n padding: var(--fx-space-xs, 6px);\n background: var(--orderlist-bg);\n border: 1px solid var(--orderlist-border);\n border-radius: var(--orderlist-radius);\n box-shadow: var(--orderlist-shadow);\n height: fit-content;\n position: sticky;\n top: 0;\n align-self: flex-start;\n }\n .control-group { display: flex; flex-direction: column; gap: 3px; }\n .control-group + .control-group { margin-top: 4px; padding-top: 6px; border-top: 1px solid var(--orderlist-border); }\n button.control-btn { display: flex; align-items: center; justify-content: center; width: 42px; height: 38px; padding: 0; border: none; border-radius: 8px; background: transparent; color: var(--orderlist-text-muted); cursor: pointer; font-size: 16px; line-height: 1; transition: var(--orderlist-transition); position: relative; }\n button.control-btn:hover:not(:disabled) { background: var(--orderlist-bg-hover); color: var(--orderlist-primary); transform: scale(1.1); }\n button.control-btn:active:not(:disabled) { transform: scale(0.92); background: color-mix(in srgb, var(--orderlist-primary) 15%, transparent); }\n button.control-btn:focus-visible { outline: none; box-shadow: 0 0 0 3px color-mix(in srgb, var(--orderlist-primary) 30%, transparent); }\n button.control-btn:disabled { opacity: 0.3; cursor: not-allowed; transform: none; }\n .control-btn-icon { font-size: 18px; line-height: 1; }\n /* Tooltip nos botoes */\n button.control-btn:hover::after { opacity: 1; transform: translateY(-50%) translateX(0); }\n @media (max-width: 640px) { .main-row { flex-direction: column; } .controls-bar { flex-direction: row; flex-wrap: wrap; justify-content: center; position: relative; } .control-group { flex-direction: row; } .control-group + .control-group { margin-top: 0; margin-left: 4px; padding-top: 0; padding-left: 4px; border-top: none; border-left: 1px solid var(--orderlist-border); } button.control-btn { width: 44px; height: 40px; } button.control-btn::after { display: none; } .list { max-height: 300px; } }\n @keyframes slideIn { from { opacity: 0; transform: translateX(-10px); } to { opacity: 1; transform: translateX(0); } }\n .list-item { animation: slideIn 0.2s ease-out; }\n `;\n\n static override get observedAttributes(): string[] {\n return [\n 'data',\n 'data-key',\n 'filter',\n 'filter-by',\n 'filter-placeholder',\n 'breakpoint',\n 'controls-location',\n 'dragdrop',\n 'striped',\n 'selection-mode',\n 'show-select-all',\n ]\n }\n\n set data(value: OrderListItem[]) {\n this._data = value;\n this._filteredData = null;\n this.render();\n }\n get data(): OrderListItem[] {\n return this._data;\n }\n private _data: OrderListItem[] = [];\n private _filteredData: OrderListItem[] | null = null;\n\n set selection(value: OrderListItem[]) {\n this._selection = value;\n this.render();\n }\n get selection(): OrderListItem[] {\n return this._selection;\n }\n private _selection: OrderListItem[] = [];\n\n get dataKey(): string {\n return this.getAttr('data-key', '');\n }\n set dataKey(v: string) {\n this.setAttribute('data-key', v);\n }\n\n get filter(): boolean {\n return this.hasAttr('filter');\n }\n set filter(v: boolean) {\n this.toggleAttr('filter', v);\n }\n\n get filterBy(): string {\n return this.getAttr('filter-by', 'label');\n }\n set filterBy(v: string) {\n this.setAttribute('filter-by', v);\n }\n\n get filterPlaceholder(): string {\n return this.getAttr('filter-placeholder', 'Buscar...');\n }\n set filterPlaceholder(v: string) {\n this.setAttribute('filter-placeholder', v);\n }\n\n get breakpoint(): string {\n return this.getAttr('breakpoint', '960px');\n }\n set breakpoint(v: string) {\n this.setAttribute('breakpoint', v);\n }\n\n get dragdrop(): boolean {\n return this.hasAttr('dragdrop');\n }\n set dragdrop(v: boolean) {\n this.toggleAttr('dragdrop', v);\n }\n\n get striped(): boolean {\n return this.hasAttr('striped');\n }\n set striped(v: boolean) {\n this.toggleAttr('striped', v);\n }\n\n get selectionMode(): string {\n const s = this.getAttr('selection-mode', '');\n return s === 'single' || s === 'multiple' ? s : '';\n }\n set selectionMode(v: string) {\n this.setAttribute('selection-mode', v);\n }\n\n get showSelectAll(): boolean {\n return this.hasAttr('show-select-all');\n }\n set showSelectAll(v: boolean) {\n this.toggleAttr('show-select-all', v);\n }\n\n get filterValue(): string {\n return this._filterValue;\n }\n set filterValue(v: string) {\n this._filterValue = v;\n this._applyFilter();\n this._updateListDisplay();\n }\n private _filterValue = '';\n\n private _draggedIndex: number | null = null;\n private _listenersAttached = false;\n private _optionTemplate: ((item: OrderListItem) => string) | null = null;\n\n setOptionTemplate(template: (item: OrderListItem) => string): void {\n this._optionTemplate = template;\n this.render();\n }\n\n protected override connectedCallback(): void {\n this._parseDataAttribute();\n super.connectedCallback();\n }\n\n protected override attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void {\n if (this.getAttr('data', '') !== '') {\n this._parseDataAttribute();\n }\n super.attributeChangedCallback(name, oldValue, newValue);\n }\n\n private _parseDataAttribute(): void {\n const dataAttr = this.getAttr('data', '');\n if (dataAttr) {\n try {\n this._data = JSON.parse(dataAttr);\n this._filteredData = null;\n } catch {\n this._data = [];\n }\n }\n }\n\n private _applyFilter(): void {\n if (!this._filterValue) {\n this._filteredData = null;\n return;\n }\n const filterFields = this.filterBy.split(',').map(f => f.trim());\n this._filteredData = this._data.filter(item => {\n return filterFields.some(field => {\n const value = item[field];\n if (value == null) return false;\n return String(value).toLowerCase().includes(this._filterValue.toLowerCase());\n });\n });\n }\n\n private _getDisplayData(): OrderListItem[] {\n return this._filteredData || this._data;\n }\n\n private _getItemKey(item: OrderListItem, index: number): string {\n if (this.dataKey && item[this.dataKey] != null) {\n return String(item[this.dataKey]);\n }\n if (item['id'] != null) return String(item['id']);\n if (item['key'] != null) return String(item['key']);\n if (item['label'] != null) return String(item['label']);\n if (item['name'] != null) return String(item['name']);\n if (item['value'] != null) return String(item['value']);\n return String(index);\n }\n\n private _getItemLabel(item: OrderListItem): string {\n const fields = ['label', 'name', 'title', 'text', 'value'];\n for (const field of fields) {\n if (item[field] != null) {\n return String(item[field]);\n }\n }\n return JSON.stringify(item);\n }\n\n private _isSelected(item: OrderListItem): boolean {\n return this._selection.some(s => this._getItemKey(s, -1) === this._getItemKey(item, -1));\n }\n\n private _moveItem(fromIndex: number, toIndex: number): void {\n const actualFrom = this._getActualIndex(fromIndex);\n const actualTo = this._getActualIndex(toIndex);\n if (actualFrom === -1 || actualTo === -1) return;\n const item = this._data.splice(actualFrom, 1)[0];\n this._data.splice(actualTo, 0, item);\n this._applyFilter();\n this._updateListDisplay();\n this._updateControlsState();\n this._emitReorder();\n }\n\n private _getActualIndex(displayIndex: number): number {\n if (this._filteredData) {\n const item = this._filteredData[displayIndex];\n return this._data.findIndex(d => this._getItemKey(d, -1) === this._getItemKey(item, -1));\n }\n return displayIndex;\n }\n\n private _emitReorder(): void {\n this.dispatchEvent(new CustomEvent('reorder', {\n bubbles: true,\n composed: true,\n detail: { items: [...this._data] },\n }));\n }\n\n private _emitSelectionChange(): void {\n this.dispatchEvent(new CustomEvent('selection-change', {\n bubbles: true,\n composed: true,\n detail: { selection: [...this._selection] },\n }));\n }\n\n private _toggleSelection(item: OrderListItem): void {\n const key = this._getItemKey(item, -1);\n const index = this._selection.findIndex(s => this._getItemKey(s, -1) === key);\n if (index >= 0) {\n this._selection.splice(index, 1);\n } else if (this.selectionMode === 'multiple') {\n this._selection.push(item);\n } else {\n this._selection = [item];\n }\n this._emitSelectionChange();\n this._updateListDisplay();\n this._updateControlsState();\n }\n\n private _selectAll(): void {\n const displayData = this._getDisplayData();\n this._selection = [...displayData];\n this._emitSelectionChange();\n this._updateListDisplay();\n this._updateControlsState();\n }\n\n private _deselectAll(): void {\n this._selection = [];\n this._emitSelectionChange();\n this._updateListDisplay();\n this._updateControlsState();\n }\n\n private _toggleSelectAll(): void {\n const displayData = this._getDisplayData();\n if (this._selection.length === displayData.length) {\n this._deselectAll();\n } else {\n this._selectAll();\n }\n }\n\n protected override render(): void {\n const displayData = this._getDisplayData();\n const hasSelection = this.selectionMode;\n const hasMultipleSelection = this.selectionMode === 'multiple';\n const allSelected = hasMultipleSelection && displayData.length > 0 && this._selection.length === displayData.length;\n\n this.setTemplate(`\n <div class=\"container\" part=\"container\">\n ${this.filter ? `\n <div class=\"filter-wrapper\" part=\"filter-wrapper\">\n <input type=\"text\" class=\"filter-input\" part=\"filter-input\"\n placeholder=\"${this.filterPlaceholder}\"\n value=\"${esc(this._filterValue)}\"\n aria-label=\"Filtrar lista\" />\n </div>\n ` : ''}\n <div class=\"main-row\" part=\"main-row\">\n <div class=\"controls-bar\" part=\"controls-bar\">\n <div class=\"control-group\">\n <button class=\"control-btn\" data-action=\"top\" part=\"control-btn\" aria-label=\"Mover para o inicio\">\n <span class=\"control-btn-icon\">\\u00AB</span>\n </button>\n <button class=\"control-btn\" data-action=\"up\" part=\"control-btn\" aria-label=\"Mover para cima\">\n <span class=\"control-btn-icon\">\\u2191</span>\n </button>\n </div>\n <div class=\"control-group\">\n <button class=\"control-btn\" data-action=\"down\" part=\"control-btn\" aria-label=\"Mover para baixo\">\n <span class=\"control-btn-icon\">\\u2193</span>\n </button>\n <button class=\"control-btn\" data-action=\"bottom\" part=\"control-btn\" aria-label=\"Mover para o fim\">\n <span class=\"control-btn-icon\">\\u00BB</span>\n </button>\n </div>\n </div>\n <div class=\"list-wrapper\" part=\"list-wrapper\">\n ${hasMultipleSelection && this.showSelectAll ? `\n <div class=\"select-all-bar\" part=\"select-all-bar\">\n <label>\n <input type=\"checkbox\" class=\"select-all-checkbox\"\n ${allSelected ? 'checked' : ''}\n aria-label=\"Selecionar todos\" />\n Selecionar Todos\n </label>\n <span class=\"selection-count\">${this._selection.length} selecionado(s)</span>\n </div>\n ` : ''}\n <ul class=\"list\" part=\"list\" role=\"listbox\"\n aria-multiselectable=\"${hasMultipleSelection}\"\n tabindex=\"0\">\n ${displayData.length === 0 ? `\n <li class=\"empty-message\" part=\"empty-message\">\n ${this.filter ? 'Nenhum resultado encontrado' : 'Nenhum item disponivel'}\n </li>\n ` : displayData.map((item, index) => {\n const key = this._getItemKey(item, index);\n const label = this._getItemLabel(item);\n const isSelected = this._isSelected(item);\n const content = this._optionTemplate ? this._optionTemplate(item) : esc(label);\n return `\n <li class=\"list-item${isSelected ? ' selected' : ''}\" part=\"list-item\"\n data-index=\"${index}\" data-key=\"${esc(key)}\"\n role=\"option\" aria-selected=\"${isSelected}\"\n ${this.dragdrop ? 'draggable=\"true\"' : ''}\n tabindex=\"0\">\n ${this.dragdrop ? '<span class=\"drag-handle\" part=\"drag-handle\" aria-label=\"Arrastar\">\\u22EE\\u22EE</span>' : ''}\n ${hasSelection ? `\n <input type=\"checkbox\" class=\"checkbox\" part=\"checkbox\"\n ${isSelected ? 'checked' : ''}\n aria-label=\"Selecionar ${esc(label)}\" />\n ` : ''}\n <span class=\"item-content\" part=\"item-content\">${content}</span>\n </li>\n `;\n }).join('')}\n </ul>\n </div>\n </div>\n </div>\n `);\n\n this._attachListeners();\n this._attachItemListeners(this.root.querySelector('.list') as HTMLElement);\n this._updateControlsState();\n }\n\n private _attachListeners(): void {\n if (this._listenersAttached) return;\n this._listenersAttached = true;\n const root = this.root;\n\n // Filtro - delega input\n root.addEventListener('input', (e) => {\n const t = e.target as HTMLElement;\n if (t.classList.contains('filter-input')) {\n this.filterValue = (t as HTMLInputElement).value;\n }\n });\n\n // Selecionar todos - delega change\n root.addEventListener('change', (e) => {\n const t = e.target as HTMLElement;\n if (t.classList.contains('select-all-checkbox')) {\n this._toggleSelectAll();\n }\n });\n\n // Clique - delega click nos botoes (itens anexados direto em cada render)\n root.addEventListener('click', (e) => {\n const target = e.target as HTMLElement;\n const btn = target.closest('.control-btn') as HTMLButtonElement;\n if (btn) {\n this._handleMoveAction(btn.dataset.action);\n }\n });\n\n // Drag and drop\n // Drag and drop - delega no root\n let dragOverElement: HTMLElement | null = null;\n root.addEventListener('dragstart', (e) => {\n const target = (e.target as HTMLElement).closest('.list-item') as HTMLElement;\n if (!target) return;\n this._draggedIndex = Number(target.dataset.index);\n target.classList.add('dragging');\n (e as DragEvent).dataTransfer!.effectAllowed = 'move';\n });\n root.addEventListener('dragend', (e) => {\n const target = e.target as HTMLElement;\n target.classList.remove('dragging');\n this._draggedIndex = null;\n root.querySelectorAll('.drag-over').forEach(el => el.classList.remove('drag-over'));\n dragOverElement = null;\n });\n root.addEventListener('dragover', (e) => {\n e.preventDefault();\n const target = (e.target as HTMLElement).closest('.list-item') as HTMLElement;\n if (!target || target.classList.contains('dragging')) return;\n if (dragOverElement) dragOverElement.classList.remove('drag-over');\n target.classList.add('drag-over');\n dragOverElement = target;\n });\n root.addEventListener('drop', (e) => {\n e.preventDefault();\n if (this._draggedIndex === null) return;\n const target = (e.target as HTMLElement).closest('.list-item') as HTMLElement;\n if (!target) return;\n const toIndex = Number(target.dataset.index);\n target.classList.remove('drag-over');\n dragOverElement = null;\n this._moveItem(this._draggedIndex, toIndex);\n this._draggedIndex = null;\n });\n this._updateControlsState();\n }\n\n private _attachItemListeners(list: HTMLElement): void {\n if (!list) return;\n list.addEventListener('click', (e) => {\n const target = e.target as HTMLElement;\n const itemEl = target.closest('.list-item') as HTMLElement;\n if (!itemEl) return;\n if (target.classList.contains('checkbox')) {\n e.stopPropagation();\n const idxC = Number(itemEl.dataset.index);\n this._toggleSelection(this._getDisplayData()[idxC]);\n return;\n }\n const idxI = Number(itemEl.dataset.index);\n this._toggleSelection(this._getDisplayData()[idxI]);\n });\n list.addEventListener('keydown', (e) => {\n const target = e.target as HTMLElement;\n if (!target.classList.contains('list-item')) return;\n const items = Array.from(list.querySelectorAll('.list-item')) as HTMLElement[];\n const currentIndex = items.indexOf(target);\n const ke = e as KeyboardEvent;\n switch (ke.key) {\n case 'ArrowUp':\n e.preventDefault();\n if (currentIndex > 0) items[currentIndex - 1].focus();\n break;\n case 'ArrowDown':\n e.preventDefault();\n if (currentIndex < items.length - 1) items[currentIndex + 1].focus();\n break;\n case ' ':\n case 'Enter':\n e.preventDefault();\n if (this.selectionMode) {\n const index = Number(target.dataset.index);\n this._toggleSelection(this._getDisplayData()[index]);\n }\n break;\n }\n });\n }\n private _updateListDisplay(): void {\n const listWrapper = this.root.querySelector('.list-wrapper');\n if (!listWrapper) {\n this.render();\n return;\n }\n const displayData = this._getDisplayData();\n const hasSelection = this.selectionMode;\n const hasMultipleSelection = this.selectionMode === 'multiple';\n const allSelected = hasMultipleSelection && displayData.length > 0 && this._selection.length === displayData.length;\n\n listWrapper.innerHTML = `\n ${hasMultipleSelection && this.showSelectAll ? `\n <div class=\"select-all-bar\" part=\"select-all-bar\">\n <label>\n <input type=\"checkbox\" class=\"select-all-checkbox\"\n ${allSelected ? 'checked' : ''}\n aria-label=\"Selecionar todos\" />\n Selecionar Todos\n </label>\n <span class=\"selection-count\">${this._selection.length} selecionado(s)</span>\n </div>\n ` : ''}\n <ul class=\"list\" part=\"list\" role=\"listbox\"\n aria-multiselectable=\"${hasMultipleSelection}\"\n tabindex=\"0\">\n ${displayData.length === 0 ? `\n <li class=\"empty-message\" part=\"empty-message\">\n ${this.filter ? 'Nenhum resultado encontrado' : 'Nenhum item disponivel'}\n </li>\n ` : displayData.map((item, index) => {\n const key = this._getItemKey(item, index);\n const label = this._getItemLabel(item);\n const isSelected = this._isSelected(item);\n const content = this._optionTemplate ? this._optionTemplate(item) : esc(label);\n return `\n <li class=\"list-item${isSelected ? ' selected' : ''}\" part=\"list-item\"\n data-index=\"${index}\" data-key=\"${esc(key)}\"\n role=\"option\" aria-selected=\"${isSelected}\"\n ${this.dragdrop ? 'draggable=\"true\"' : ''}\n tabindex=\"0\">\n ${this.dragdrop ? '<span class=\"drag-handle\" part=\"drag-handle\" aria-label=\"Arrastar\">\\u22EE\\u22EE</span>' : ''}\n ${hasSelection ? `\n <input type=\"checkbox\" class=\"checkbox\" part=\"checkbox\"\n ${isSelected ? 'checked' : ''}\n aria-label=\"Selecionar ${esc(label)}\" />\n ` : ''}\n <span class=\"item-content\" part=\"item-content\">${content}</span>\n </li>\n `;\n }).join('')}\n </ul>\n `;\n this._attachListeners();\n this._attachItemListeners(this.root.querySelector('.list') as HTMLElement);\n }\n\n\n private _handleMoveAction(action: string | undefined): void {\n if (!this._selection.length) return;\n const displayData = this._getDisplayData();\n const selectedIndices = this._selection\n .map(s => displayData.findIndex(d => this._getItemKey(d, -1) === this._getItemKey(s, -1)))\n .filter(i => i >= 0)\n .sort((a, b) => a - b);\n\n if (selectedIndices.length === 0) return;\n\n switch (action) {\n case 'top':\n this._moveSelectedToStart(selectedIndices);\n break;\n case 'up':\n this._moveSelectedByOne(selectedIndices, -1);\n break;\n case 'down':\n this._moveSelectedByOne(selectedIndices, 1);\n break;\n case 'bottom':\n this._moveSelectedToEnd(selectedIndices);\n break;\n }\n }\n\n private _moveSelectedToStart(indices: number[]): void {\n const items: OrderListItem[] = [];\n const actualIndices: number[] = [];\n\n for (const idx of indices) {\n const actualIdx = this._getActualIndex(idx);\n items.push(this._data[actualIdx]);\n actualIndices.push(actualIdx);\n }\n\n actualIndices.sort((a, b) => b - a).forEach(i => this._data.splice(i, 1));\n\n const insertIdx = this._getActualIndex(0);\n this._data.splice(insertIdx, 0, ...items);\n\n this._applyFilter();\n this._updateListDisplay();\n this._updateControlsState();\n this._emitReorder();\n }\n\n private _moveSelectedToEnd(indices: number[]): void {\n const items: OrderListItem[] = [];\n const actualIndices: number[] = [];\n\n for (const idx of indices) {\n const actualIdx = this._getActualIndex(idx);\n items.push(this._data[actualIdx]);\n actualIndices.push(actualIdx);\n }\n\n actualIndices.sort((a, b) => b - a).forEach(i => this._data.splice(i, 1));\n\n const displayData = this._getDisplayData();\n const insertIdx = this._getActualIndex(displayData.length - 1);\n this._data.splice(insertIdx + 1, 0, ...items);\n\n this._applyFilter();\n this._updateListDisplay();\n this._updateControlsState();\n this._emitReorder();\n }\n\n private _moveSelectedByOne(indices: number[], delta: number): void {\n const displayData = this._getDisplayData();\n if (displayData.length === 0) return;\n\n // Get actual indices in _data array and sort them\n const actualIndices = indices\n .map(idx => this._getActualIndex(idx))\n .filter(idx => idx >= 0)\n .sort((a, b) => a - b);\n\n if (actualIndices.length === 0) return;\n\n // Check if movement is possible\n if (delta < 0 && actualIndices[0] <= 0) return;\n if (delta > 0 && actualIndices[actualIndices.length - 1] >= this._data.length - 1) return;\n\n // Extract selected items in order\n const selectedItems = actualIndices.map(idx => this._data[idx]);\n\n // Remove selected items from data (from highest to lowest to preserve indices)\n for (let i = actualIndices.length - 1; i >= 0; i--) {\n this._data.splice(actualIndices[i], 1);\n }\n\n // Calculate new insertion point\n let insertIndex: number;\n if (delta < 0) {\n // Moving up: insert before the first selected item position\n insertIndex = actualIndices[0] - 1;\n } else {\n // Moving down: insert after the last selected item position\n // Since we removed items, we need to adjust\n insertIndex = actualIndices[actualIndices.length - 1] - actualIndices.length + 1 + 1;\n }\n\n // Ensure insertIndex is within bounds\n insertIndex = Math.max(0, Math.min(insertIndex, this._data.length));\n\n // Insert items at new position\n this._data.splice(insertIndex, 0, ...selectedItems);\n\n this._applyFilter();\n this._updateListDisplay();\n this._updateControlsState();\n this._emitReorder();\n }\n\n private _updateControlsState(): void {\n const displayData = this._getDisplayData();\n const selectedIndices = this._selection\n .map(s => displayData.findIndex(d => this._getItemKey(d, -1) === this._getItemKey(s, -1)))\n .filter(i => i >= 0);\n\n const buttons = this.root.querySelectorAll<HTMLButtonElement>('.control-btn');\n buttons.forEach(btn => {\n const action = btn.dataset.action;\n let disabled = selectedIndices.length === 0;\n\n if (!disabled) {\n switch (action) {\n case 'top':\n case 'up':\n disabled = selectedIndices[0] === 0;\n break;\n case 'bottom':\n case 'down':\n disabled = selectedIndices[selectedIndices.length - 1] === displayData.length - 1;\n break;\n }\n }\n\n btn.disabled = disabled;\n });\n }\n}\n\nexport function defineFxOrderList(): typeof FxOrderList {\n return defineElement('fx-orderlist', FxOrderList);\n}","import { defineFxOrderList } from './orderlist';\n\n// Reexporta a classe para uso programático (ex.: instanceof, herança).\nexport { FxOrderList } from './orderlist';\nexport type { OrderListItem } from './orderlist';\n\n// Auto-registro: basta importar o subpath `@wrrdev/fenix-ui/orderlist`\n// para que o componente seja definido no CustomElementRegistry.\ndefineFxOrderList();\n\n","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\nimport { esc } from '../../core/sanitize';\n\nexport interface PickListItem {\n [key: string]: unknown;\n}\n\n/**\n * <fx-picklist> - Componente para transferir itens entre duas listas.\n *\n * Permite mover itens entre uma lista de origem e uma lista de destino.\n * Suporta filtro, seleção múltipla, checkbox e templates customizados.\n *\n * Atributos: source, target, source-key, target-key, filter, filter-by,\n * filter-placeholder, dragdrop, striped, selection-mode, source-label, target-label.\n * Evento: `move-to-target` (composed, detail: { items }).\n * Evento: `move-to-source` (composed, detail: { items }).\n * Evento: `selection-change-source` (composed, detail: { selection }).\n * Evento: `selection-change-target` (composed, detail: { selection }).\n */\nexport class FxPickList 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 --picklist-primary: var(--fx-color-primary, #3b82f6);\n --picklist-border: var(--fx-border-default, #e2e8f0);\n --picklist-bg: var(--fx-surface-background, #ffffff);\n --picklist-bg-hover: var(--fx-surface-surface-hover, #f1f5f9);\n --picklist-text: var(--fx-text-default, #1e293b);\n --picklist-text-muted: var(--fx-text-muted, #64748b);\n --picklist-radius: var(--fx-radius-md, 8px);\n --picklist-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n --picklist-transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n }\n * { box-sizing: border-box; }\n .container {\n display: flex;\n gap: var(--fx-space-sm, 8px);\n align-items: stretch;\n }\n .list-container {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: var(--fx-space-sm, 8px);\n min-width: 0;\n }\n .list-label {\n font-weight: 600;\n color: var(--picklist-text);\n font-size: calc(var(--fx-font-size) - 1px);\n }\n .select-all-bar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: var(--fx-space-sm, 10px) var(--fx-space-md, 14px);\n background: linear-gradient(135deg, var(--picklist-bg), var(--picklist-bg-hover));\n border: 1px solid var(--picklist-border);\n border-radius: var(--picklist-radius);\n font-size: 0.9em;\n font-weight: 500;\n }\n .select-all-bar label {\n display: flex;\n align-items: center;\n gap: var(--fx-space-sm, 10px);\n cursor: pointer;\n user-select: none;\n color: var(--picklist-text);\n }\n .select-all-bar input[type=\"checkbox\"] {\n width: 18px;\n height: 18px;\n accent-color: var(--picklist-primary);\n cursor: pointer;\n }\n .selection-count {\n font-size: 0.85em;\n color: var(--picklist-primary);\n background: color-mix(in srgb, var(--picklist-primary) 12%, transparent);\n padding: 4px 12px;\n border-radius: 20px;\n font-weight: 600;\n }\n .controls {\n display: flex;\n flex-direction: column;\n gap: 4px;\n justify-content: center;\n padding: var(--fx-space-xs, 6px);\n background: var(--picklist-bg);\n border: 1px solid var(--picklist-border);\n border-radius: var(--picklist-radius);\n box-shadow: var(--picklist-shadow);\n height: fit-content;\n position: sticky;\n top: 0;\n align-self: center;\n }\n .control-group {\n display: flex;\n flex-direction: column;\n gap: 3px;\n }\n .control-group + .control-group {\n margin-top: 4px;\n padding-top: 6px;\n border-top: 1px solid var(--picklist-border);\n }\n .list-wrapper {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: var(--fx-space-sm, 8px);\n }\n .filter-wrapper {\n margin-bottom: var(--fx-space-xs, 4px);\n }\n .filter-input {\n width: 100%;\n box-sizing: border-box;\n padding: var(--fx-space-sm, 10px) var(--fx-space-md, 14px);\n padding-left: 42px;\n border: 1.5px solid var(--picklist-border);\n border-radius: var(--picklist-radius);\n font-family: inherit;\n font-size: inherit;\n color: var(--picklist-text);\n background: var(--picklist-bg) url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%2394a3b8' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'%3E%3C/circle%3E%3Cline x1='21' y1='21' x2='16.65' y2='16.65'%3E%3C/line%3E%3C/svg%3E\") no-repeat 14px center;\n transition: var(--picklist-transition);\n }\n .filter-input:focus {\n outline: none;\n border-color: var(--picklist-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--picklist-primary) 20%, transparent);\n }\n .filter-input::placeholder {\n color: var(--picklist-text-muted);\n }\n .list {\n list-style: none;\n margin: 0;\n padding: 0;\n border: 1px solid var(--picklist-border);\n border-radius: var(--picklist-radius);\n overflow: hidden;\n box-shadow: var(--picklist-shadow);\n min-height: 200px;\n max-height: 450px;\n overflow-y: auto;\n flex: 1;\n }\n .list::-webkit-scrollbar { width: 6px; }\n .list::-webkit-scrollbar-track { background: transparent; }\n .list::-webkit-scrollbar-thumb { background: var(--picklist-border); border-radius: 3px; }\n .list::-webkit-scrollbar-thumb:hover { background: var(--picklist-text-muted); }\n :host([striped]) .list-item:nth-child(even) {\n background: var(--fx-surface-surface, #f8fafc);\n }\n .list-item {\n display: flex;\n align-items: center;\n gap: var(--fx-space-sm, 10px);\n padding: var(--fx-space-sm, 10px) var(--fx-space-md, 14px);\n background: var(--picklist-bg);\n border-bottom: 1px solid var(--picklist-border);\n cursor: pointer;\n user-select: none;\n transition: var(--picklist-transition);\n }\n .list-item:last-child { border-bottom: none; }\n .list-item:hover { background: var(--picklist-bg-hover); }\n .list-item.selected {\n background: color-mix(in srgb, var(--picklist-primary) 8%, transparent);\n border-left: 3px solid var(--picklist-primary);\n padding-left: 11px;\n }\n .list-item:focus-visible {\n outline: none;\n background: color-mix(in srgb, var(--picklist-primary) 15%, transparent);\n }\n .checkbox {\n flex-shrink: 0;\n width: 18px;\n height: 18px;\n accent-color: var(--picklist-primary);\n cursor: pointer;\n transition: var(--picklist-transition);\n }\n .checkbox:hover { transform: scale(1.1); }\n .item-content {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .empty-message {\n padding: var(--fx-space-xl, 32px);\n text-align: center;\n color: var(--picklist-text-muted);\n font-style: italic;\n }\n button.control-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 42px;\n height: 38px;\n padding: 0;\n border: none;\n border-radius: 8px;\n background: transparent;\n color: var(--picklist-text-muted);\n cursor: pointer;\n font-size: 16px;\n line-height: 1;\n transition: var(--picklist-transition);\n position: relative;\n }\n button.control-btn:hover:not(:disabled) {\n background: var(--picklist-bg-hover);\n color: var(--picklist-primary);\n transform: scale(1.1);\n }\n button.control-btn:active:not(:disabled) {\n transform: scale(0.92);\n background: color-mix(in srgb, var(--picklist-primary) 15%, transparent);\n }\n button.control-btn:focus-visible {\n outline: none;\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--picklist-primary) 30%, transparent);\n }\n button.control-btn:disabled {\n opacity: 0.3;\n cursor: not-allowed;\n transform: none;\n }\n .control-btn-icon { font-size: 18px; line-height: 1; }\n\n button.control-btn:hover::after {\n opacity: 1;\n transform: translateX(-50%) translateY(0);\n }\n @media (max-width: 640px) {\n .container { flex-direction: column; }\n .controls {\n flex-direction: row;\n flex-wrap: wrap;\n justify-content: center;\n position: relative;\n }\n .control-group { flex-direction: row; }\n .control-group + .control-group {\n margin-top: 0;\n margin-left: 4px;\n padding-top: 0;\n padding-left: 4px;\n border-top: none;\n border-left: 1px solid var(--picklist-border);\n }\n button.control-btn { width: 44px; height: 40px; }\n button.control-btn::after { display: none; }\n .list { max-height: 300px; min-height: 150px; }\n }\n @keyframes slideIn {\n from { opacity: 0; transform: translateX(-10px); }\n to { opacity: 1; transform: translateX(0); }\n }\n .list-item { animation: slideIn 0.2s ease-out; }\n `;\n\n static override get observedAttributes(): string[] {\n return [\n 'source',\n 'target',\n 'source-key',\n 'target-key',\n 'filter',\n 'filter-by',\n 'filter-placeholder',\n 'dragdrop',\n 'striped',\n 'selection-mode',\n 'show-select-all',\n 'source-label',\n 'target-label',\n ];\n }\n\n set source(value: PickListItem[]) {\n this._source = value;\n this._filteredSource = null;\n this.render();\n }\n get source(): PickListItem[] {\n return this._source;\n }\n private _source: PickListItem[] = [];\n private _filteredSource: PickListItem[] | null = null;\n\n set target(value: PickListItem[]) {\n this._target = value;\n this._filteredTarget = null;\n this.render();\n }\n get target(): PickListItem[] {\n return this._target;\n }\n private _target: PickListItem[] = [];\n private _filteredTarget: PickListItem[] | null = null;\n\n set sourceSelection(value: PickListItem[]) {\n this._sourceSelection = value;\n this.render();\n }\n get sourceSelection(): PickListItem[] {\n return this._sourceSelection;\n }\n private _sourceSelection: PickListItem[] = [];\n\n set targetSelection(value: PickListItem[]) {\n this._targetSelection = value;\n this.render();\n }\n get targetSelection(): PickListItem[] {\n return this._targetSelection;\n }\n private _targetSelection: PickListItem[] = [];\n\n get sourceKey(): string {\n return this.getAttr('source-key', '');\n }\n set sourceKey(v: string) {\n this.setAttribute('source-key', v);\n }\n\n get targetKey(): string {\n return this.getAttr('target-key', '');\n }\n set targetKey(v: string) {\n this.setAttribute('target-key', v);\n }\n\n get filter(): boolean {\n return this.hasAttr('filter');\n }\n set filter(v: boolean) {\n this.toggleAttr('filter', v);\n }\n\n get filterBy(): string {\n return this.getAttr('filter-by', 'label');\n }\n set filterBy(v: string) {\n this.setAttribute('filter-by', v);\n }\n\n get filterPlaceholder(): string {\n return this.getAttr('filter-placeholder', 'Buscar...');\n }\n set filterPlaceholder(v: string) {\n this.setAttribute('filter-placeholder', v);\n }\n\n get dragdrop(): boolean {\n return this.hasAttr('dragdrop');\n }\n set dragdrop(v: boolean) {\n this.toggleAttr('dragdrop', v);\n }\n\n get striped(): boolean {\n return this.hasAttr('striped');\n }\n set striped(v: boolean) {\n this.toggleAttr('striped', v);\n }\n\n get selectionMode(): string {\n const s = this.getAttr('selection-mode', '');\n return s === 'single' || s === 'multiple' ? s : '';\n }\n set selectionMode(v: string) {\n this.setAttribute('selection-mode', v);\n }\n\n get showSelectAll(): boolean {\n return this.hasAttr('show-select-all');\n }\n set showSelectAll(v: boolean) {\n this.toggleAttr('show-select-all', v);\n }\n\n get sourceLabel(): string {\n return this.getAttr('source-label', 'Disponíveis');\n }\n set sourceLabel(v: string) {\n this.setAttribute('source-label', v);\n }\n\n get targetLabel(): string {\n return this.getAttr('target-label', 'Selecionados');\n }\n set targetLabel(v: string) {\n this.setAttribute('target-label', v);\n }\n\n get sourceFilterValue(): string {\n return this._sourceFilterValue;\n }\n set sourceFilterValue(v: string) {\n this._sourceFilterValue = v;\n this._applySourceFilter();\n this._updateListDisplay();\n }\n private _sourceFilterValue = '';\n\n get targetFilterValue(): string {\n return this._targetFilterValue;\n }\n set targetFilterValue(v: string) {\n this._targetFilterValue = v;\n this._applyTargetFilter();\n this._updateListDisplay();\n }\n private _targetFilterValue = '';\n private _filterListenersAttached = false;\n\n private _optionTemplate: ((item: PickListItem) => string) | null = null;\n\n setOptionTemplate(template: (item: PickListItem) => string): void {\n this._optionTemplate = template;\n this.render();\n }\n\n protected override connectedCallback(): void {\n this._parseSourceAttribute();\n this._parseTargetAttribute();\n super.connectedCallback();\n }\n\n protected override attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void {\n if (this.getAttr('source', '') !== '') {\n this._parseSourceAttribute();\n }\n if (this.getAttr('target', '') !== '') {\n this._parseTargetAttribute();\n }\n super.attributeChangedCallback(name, oldValue, newValue);\n }\n\n private _parseSourceAttribute(): void {\n const dataAttr = this.getAttr('source', '');\n if (dataAttr) {\n try {\n this._source = JSON.parse(dataAttr);\n this._filteredSource = null;\n } catch {\n this._source = [];\n }\n }\n }\n\n private _parseTargetAttribute(): void {\n const dataAttr = this.getAttr('target', '');\n if (dataAttr) {\n try {\n this._target = JSON.parse(dataAttr);\n this._filteredTarget = null;\n } catch {\n this._target = [];\n }\n }\n }\n\n private _applySourceFilter(): void {\n if (!this._sourceFilterValue) {\n this._filteredSource = null;\n return;\n }\n const filterFields = this.filterBy.split(',').map(f => f.trim());\n this._filteredSource = this._source.filter(item => {\n return filterFields.some(field => {\n const value = item[field];\n if (value == null) return false;\n return String(value).toLowerCase().includes(this._sourceFilterValue.toLowerCase());\n });\n });\n }\n\n private _applyTargetFilter(): void {\n if (!this._targetFilterValue) {\n this._filteredTarget = null;\n return;\n }\n const filterFields = this.filterBy.split(',').map(f => f.trim());\n this._filteredTarget = this._target.filter(item => {\n return filterFields.some(field => {\n const value = item[field];\n if (value == null) return false;\n return String(value).toLowerCase().includes(this._targetFilterValue.toLowerCase());\n });\n });\n }\n\n private _getDisplaySource(): PickListItem[] {\n return this._filteredSource || this._source;\n }\n\n private _getDisplayTarget(): PickListItem[] {\n return this._filteredTarget || this._target;\n }\n\n private _getItemKey(item: PickListItem, index: number, isSource: boolean): string {\n const keyField = isSource ? this.sourceKey : this.targetKey;\n if (keyField && item[keyField] != null) {\n return String(item[keyField]);\n }\n if (item['id'] != null) return String(item['id']);\n if (item['key'] != null) return String(item['key']);\n if (item['label'] != null) return String(item['label']);\n if (item['name'] != null) return String(item['name']);\n if (item['value'] != null) return String(item['value']);\n return String(index);\n }\n\n private _getItemLabel(item: PickListItem): string {\n const fields = ['label', 'name', 'title', 'text', 'value'];\n for (const field of fields) {\n if (item[field] != null) {\n return String(item[field]);\n }\n }\n return JSON.stringify(item);\n }\n\n private _isSourceSelected(item: PickListItem, index: number): boolean {\n return this._sourceSelection.some(s => this._getItemKey(s, -1, true) === this._getItemKey(item, index, true));\n }\n\n private _isTargetSelected(item: PickListItem, index: number): boolean {\n return this._targetSelection.some(s => this._getItemKey(s, -1, false) === this._getItemKey(item, index, false));\n }\n\n private _emitMoveToTarget(): void {\n this.dispatchEvent(new CustomEvent('move-to-target', {\n bubbles: true,\n composed: true,\n detail: { items: [...this._sourceSelection], source: [...this._source], target: [...this._target] },\n }));\n }\n\n private _emitMoveToSource(): void {\n this.dispatchEvent(new CustomEvent('move-to-source', {\n bubbles: true,\n composed: true,\n detail: { items: [...this._targetSelection], source: [...this._source], target: [...this._target] },\n }));\n }\n\n private _emitSelectionChangeSource(): void {\n this.dispatchEvent(new CustomEvent('selection-change-source', {\n bubbles: true,\n composed: true,\n detail: { selection: [...this._sourceSelection] },\n }));\n }\n\n private _emitSelectionChangeTarget(): void {\n this.dispatchEvent(new CustomEvent('selection-change-target', {\n bubbles: true,\n composed: true,\n detail: { selection: [...this._targetSelection] },\n }));\n }\n\n protected override render(): void {\n const dSrc = this._getDisplaySource();\n const dTgt = this._getDisplayTarget();\n const hasSel = this.selectionMode;\n const showAll = hasSel === 'multiple' && this.showSelectAll;\n const srcItems = dSrc.length === 0 ? `<li class=\"empty-message\">${this.filter ? 'Nenhum resultado' : 'Nenhum item'}</li>` : dSrc.map((item, i) => `<li class=\"list-item${this._isSourceSelected(item, i) ? ' selected' : ''}\" data-index=\"${i}\" data-list=\"source\" tabindex=\"0\">${hasSel ? '<input type=\"checkbox\" class=\"checkbox\"' + (this._isSourceSelected(item, i) ? ' checked' : '') + ' />' : ''}<span class=\"item-content\">${this._optionTemplate ? this._optionTemplate(item) : esc(this._getItemLabel(item))}</span></li>`).join('');\n const tgtItems = dTgt.length === 0 ? `<li class=\"empty-message\">${this.filter ? 'Nenhum resultado' : 'Nenhum selecionado'}</li>` : dTgt.map((item, i) => `<li class=\"list-item${this._isTargetSelected(item, i) ? ' selected' : ''}\" data-index=\"${i}\" data-list=\"target\" tabindex=\"0\">${hasSel ? '<input type=\"checkbox\" class=\"checkbox\"' + (this._isTargetSelected(item, i) ? ' checked' : '') + ' />' : ''}<span class=\"item-content\">${this._optionTemplate ? this._optionTemplate(item) : esc(this._getItemLabel(item))}</span></li>`).join('');\n const srcAllBar = showAll ? `<div class=\"select-all-bar\" part=\"select-all-bar\"><label><input type=\"checkbox\" class=\"select-all-checkbox\" data-list=\"source\" ${this._sourceSelection.length > 0 && this._sourceSelection.length === this._source.length ? 'checked' : ''} aria-label=\"Selecionar todos da origem\" /> Selecionar Todos</label><span class=\"selection-count\">${this._sourceSelection.length} selecionado(s)</span></div>` : '';\n const tgtAllBar = showAll ? `<div class=\"select-all-bar\" part=\"select-all-bar\"><label><input type=\"checkbox\" class=\"select-all-checkbox\" data-list=\"target\" ${this._targetSelection.length > 0 && this._targetSelection.length === this._target.length ? 'checked' : ''} aria-label=\"Selecionar todos do destino\" /> Selecionar Todos</label><span class=\"selection-count\">${this._targetSelection.length} selecionado(s)</span></div>` : '';\n\n this.setTemplate(`<div class=\"container\"><div class=\"list-container\"><div class=\"list-label\">${esc(this.sourceLabel)} (${this._source.length})</div>${this.filter ? '<div class=\"filter-wrapper\"><input type=\"text\" class=\"filter-input source-filter\" placeholder=\"' + this.filterPlaceholder + '\" value=\"' + esc(this._sourceFilterValue) + '\" /></div>' : ''}${srcAllBar}<div class=\"list-wrapper\"><ul class=\"list source-list\" role=\"listbox\" tabindex=\"0\">${srcItems}</ul></div></div><div class=\"controls\"><div class=\"control-group\"><button class=\"control-btn\" data-action=\"move-all-target\" part=\"control-btn\" aria-label=\"Mover todos para destino\"><span class=\"control-btn-icon\">»</span></button><button class=\"control-btn\" data-action=\"move-target\" part=\"control-btn\" aria-label=\"Mover para destino\"><span class=\"control-btn-icon\">→</span></button></div><div class=\"control-group\"><button class=\"control-btn\" data-action=\"move-source\" part=\"control-btn\" aria-label=\"Mover para origem\"><span class=\"control-btn-icon\">←</span></button><button class=\"control-btn\" data-action=\"move-all-source\" part=\"control-btn\" aria-label=\"Mover todos para origem\"><span class=\"control-btn-icon\">«</span></button></div></div><div class=\"list-container\"><div class=\"list-label\">${esc(this.targetLabel)} (${this._target.length})</div>${this.filter ? '<div class=\"filter-wrapper\"><input type=\"text\" class=\"filter-input target-filter\" placeholder=\"' + this.filterPlaceholder + '\" value=\"' + esc(this._targetFilterValue) + '\" /></div>' : ''}${tgtAllBar}<div class=\"list-wrapper\"><ul class=\"list target-list\" role=\"listbox\" tabindex=\"0\">${tgtItems}</ul></div></div></div>`);\n\n this._attachListeners();\n }\n\n private _attachListeners(): void {\n // Listeners delegados no root, anexados uma unica vez (sobrevivem a re-renders)\n if (!this._filterListenersAttached) {\n this._filterListenersAttached = true;\n\n this.root.addEventListener('input', (e) => {\n const t = e.target as HTMLElement;\n if (t.classList.contains('select-all-checkbox')) {\n this._handleSelectAll(t as HTMLInputElement);\n return;\n }\n if (t.classList.contains('source-filter')) {\n this.sourceFilterValue = (t as HTMLInputElement).value;\n } else if (t.classList.contains('target-filter')) {\n this.targetFilterValue = (t as HTMLInputElement).value;\n }\n });\n\n this.root.addEventListener('click', (e) => {\n const t = e.target as HTMLElement;\n const btn = t.closest('.control-btn') as HTMLButtonElement | null;\n if (btn) {\n switch (btn.dataset.action) {\n case 'move-target': this._moveToTarget(); break;\n case 'move-all-target': this._moveAllToTarget(); break;\n case 'move-source': this._moveToSource(); break;\n case 'move-all-source': this._moveAllToSource(); break;\n }\n return;\n }\n const el = t.closest('.list-item') as HTMLElement | null;\n if (!el) return;\n const isSrc = el.dataset.list === 'source';\n const idx = Number(el.dataset.index);\n const item = (isSrc ? this._getDisplaySource() : this._getDisplayTarget())[idx];\n if (isSrc) this._toggleSourceSelection(item, idx); else this._toggleTargetSelection(item, idx);\n });\n }\n this._updateControlsState();\n }\n\n private _handleSelectAll(checkbox: HTMLInputElement): void {\n const isSrc = checkbox.dataset.list === 'source';\n if (isSrc) {\n this._sourceSelection = checkbox.checked ? [...this._getDisplaySource()] : [];\n this._emitSelectionChangeSource();\n } else {\n this._targetSelection = checkbox.checked ? [...this._getDisplayTarget()] : [];\n this._emitSelectionChangeTarget();\n }\n this._updateSelectionDisplay();\n this._updateControlsState();\n }\n\n /**\n * Atualiza a selecao visual in-place (classes e checkboxes dos itens existentes),\n * sem recriar o DOM — mantendo referencias de elementos validas durante cliques.\n */\n private _updateSelectionDisplay(): void {\n const updateList = (listSel: HTMLElement | null, isSelFn: (item: PickListItem, i: number) => boolean, getData: () => PickListItem[]): void => {\n if (!listSel) return;\n listSel.querySelectorAll<HTMLElement>('.list-item').forEach(el => {\n const idx = Number(el.dataset.index);\n const selected = isSelFn(getData()[idx], idx);\n el.classList.toggle('selected', selected);\n el.setAttribute('aria-selected', String(selected));\n const cb = el.querySelector<HTMLInputElement>('.checkbox');\n if (cb) cb.checked = selected;\n });\n };\n updateList(this.root.querySelector('.source-list'), (it, i) => this._isSourceSelected(it, i), () => this._getDisplaySource());\n updateList(this.root.querySelector('.target-list'), (it, i) => this._isTargetSelected(it, i), () => this._getDisplayTarget());\n this._updateSelectAllBars();\n }\n\n /** Sincroniza as barras \"Selecionar Todos\" (checkbox + contador) sem re-render completo. */\n private _updateSelectAllBars(): void {\n if (!(this.selectionMode === 'multiple' && this.showSelectAll)) return;\n const bars = [\n { el: this.root.querySelector<HTMLInputElement>('.select-all-checkbox[data-list=\"source\"]'), total: this._source.length, sel: this._sourceSelection.length },\n { el: this.root.querySelector<HTMLInputElement>('.select-all-checkbox[data-list=\"target\"]'), total: this._target.length, sel: this._targetSelection.length },\n ];\n bars.forEach(({ el, total, sel }) => {\n if (!el) return;\n el.checked = total > 0 && sel === total;\n const count = el.closest('.select-all-bar')?.querySelector('.selection-count');\n if (count) count.textContent = `${sel} selecionado(s)`;\n });\n }\n\n private _updateControlsState(): void {\n this.root.querySelectorAll<HTMLButtonElement>('.control-btn').forEach(btn => {\n const a = btn.dataset.action;\n btn.disabled = (a === 'move-target' && this._sourceSelection.length === 0) || (a === 'move-all-target' && this._source.length === 0) || (a === 'move-source' && this._targetSelection.length === 0) || (a === 'move-all-source' && this._target.length === 0);\n });\n }\n\n private _moveToTarget(): void {\n if (!this._sourceSelection.length) return;\n const items = [...this._sourceSelection];\n this._source = this._source.filter(s => !items.some(i => this._getItemKey(i, -1, true) === this._getItemKey(s, -1, true)));\n this._target = [...this._target, ...items];\n this._sourceSelection = [];\n this._filteredSource = null;\n this._filteredTarget = null;\n this._updateListDisplay();\n this._updateControlsState();\n this._emitMoveToTarget();\n }\n\n private _moveToSource(): void {\n if (!this._targetSelection.length) return;\n const items = [...this._targetSelection];\n this._target = this._target.filter(t => !items.some(i => this._getItemKey(i, -1, false) === this._getItemKey(t, -1, false)));\n this._source = [...this._source, ...items];\n this._targetSelection = [];\n this._filteredSource = null;\n this._filteredTarget = null;\n this._updateListDisplay();\n this._updateControlsState();\n this._emitMoveToSource();\n }\n\n private _moveAllToTarget(): void {\n const items = [...this._source];\n this._source = [];\n this._target = [...this._target, ...items];\n this._sourceSelection = [];\n this._filteredSource = null;\n this._filteredTarget = null;\n this._updateListDisplay();\n this._updateControlsState();\n this._emitMoveToTarget();\n }\n\n private _moveAllToSource(): void {\n const items = [...this._target];\n this._target = [];\n this._source = [...this._source, ...items];\n this._targetSelection = [];\n this._filteredSource = null;\n this._filteredTarget = null;\n this._updateListDisplay();\n this._updateControlsState();\n this._emitMoveToSource();\n }\n\n private _toggleSourceSelection(item: PickListItem, index: number): void {\n // Sem selection-mode definido, permite selecao simples (um item por vez)\n const mode = this.selectionMode || 'single';\n const key = this._getItemKey(item, index, true);\n const idx = this._sourceSelection.findIndex(s => this._getItemKey(s, -1, true) === key);\n if (idx >= 0) {\n this._sourceSelection.splice(idx, 1);\n } else if (mode === 'multiple') {\n this._sourceSelection.push(item);\n } else {\n this._sourceSelection = [item];\n }\n this._emitSelectionChangeSource();\n this._updateSelectionDisplay();\n this._updateControlsState();\n }\n\n private _toggleTargetSelection(item: PickListItem, index: number): void {\n // Sem selection-mode definido, permite selecao simples (um item por vez)\n const mode = this.selectionMode || 'single';\n const key = this._getItemKey(item, index, false);\n const idx = this._targetSelection.findIndex(s => this._getItemKey(s, -1, false) === key);\n if (idx >= 0) {\n this._targetSelection.splice(idx, 1);\n } else if (mode === 'multiple') {\n this._targetSelection.push(item);\n } else {\n this._targetSelection = [item];\n }\n this._emitSelectionChangeTarget();\n this._updateSelectionDisplay();\n this._updateControlsState();\n }\n\n private _updateListDisplay(): void {\n const srcWrapper = this.root.querySelector('.source-list')?.parentElement;\n const tgtWrapper = this.root.querySelector('.target-list')?.parentElement;\n const srcLabel = this.root.querySelector('.list-container:first-of-type .list-label');\n const tgtLabel = this.root.querySelector('.list-container:last-of-type .list-label');\n if (!srcWrapper || !tgtWrapper) { this.render(); return; }\n const dSrc = this._getDisplaySource();\n const dTgt = this._getDisplayTarget();\n const hasSel = this.selectionMode;\n const srcItems = dSrc.length === 0 ? `<li class=\"empty-message\" part=\"empty-message\">${this.filter ? 'Nenhum resultado' : 'Nenhum item'}</li>` : dSrc.map((item, i) => `<li class=\"list-item${this._isSourceSelected(item, i) ? ' selected' : ''}\" part=\"list-item\" data-index=\"${i}\" data-list=\"source\" role=\"option\" aria-selected=\"${this._isSourceSelected(item, i)}\" tabindex=\"0\">${hasSel ? '<input type=\"checkbox\" class=\"checkbox\" part=\"checkbox\"' + (this._isSourceSelected(item, i) ? ' checked' : '') + ' />' : ''}<span class=\"item-content\" part=\"item-content\">${this._optionTemplate ? this._optionTemplate(item) : esc(this._getItemLabel(item))}</span></li>`).join('');\n const tgtItems = dTgt.length === 0 ? `<li class=\"empty-message\" part=\"empty-message\">${this.filter ? 'Nenhum resultado' : 'Nenhum selecionado'}</li>` : dTgt.map((item, i) => `<li class=\"list-item${this._isTargetSelected(item, i) ? ' selected' : ''}\" part=\"list-item\" data-index=\"${i}\" data-list=\"target\" role=\"option\" aria-selected=\"${this._isTargetSelected(item, i)}\" tabindex=\"0\">${hasSel ? '<input type=\"checkbox\" class=\"checkbox\" part=\"checkbox\"' + (this._isTargetSelected(item, i) ? ' checked' : '') + ' />' : ''}<span class=\"item-content\" part=\"item-content\">${this._optionTemplate ? this._optionTemplate(item) : esc(this._getItemLabel(item))}</span></li>`).join('');\n srcWrapper.innerHTML = `<ul class=\"list source-list\" role=\"listbox\" tabindex=\"0\">${srcItems}</ul>`;\n tgtWrapper.innerHTML = `<ul class=\"list target-list\" role=\"listbox\" tabindex=\"0\">${tgtItems}</ul>`;\n if (srcLabel) srcLabel.textContent = `${this.sourceLabel} (${this._source.length})`;\n if (tgtLabel) tgtLabel.textContent = `${this.targetLabel} (${this._target.length})`;\n this._updateSelectAllBars();\n this._attachListeners();\n }\n}\n\nexport function defineFxPickList(): typeof FxPickList {\n return defineElement('fx-picklist', FxPickList);\n}","import { defineFxPickList } from './picklist';\n\n// Reexporta a classe para uso programático (ex.: instanceof, herança).\nexport { FxPickList } from './picklist';\nexport type { PickListItem } from './picklist';\n\n// Auto-registro: basta importar o subpath `@wrrdev/fenix-ui/picklist`\n// para que o componente seja definido no CustomElementRegistry.\ndefineFxPickList();\n\n","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\nimport { esc } from '../../core/sanitize';\n\n/**\n * <fx-accordion-panel> — Painel individual do accordion.\n *\n * Atributos:\n * - header: titulo exibido no cabecalho (ou use o slot \"header\").\n * - value: identificador unico do painel (usado pelo fx-accordion).\n * - expanded: presenca indica painel aberto (controlado pelo fx-accordion).\n * - disabled: impede a abertura do painel.\n */\nexport class FxAccordionPanel 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 color: var(--fx-text-default);\n }\n /* A borda fica no wrapper interno (nao no :host): regras do documento\n externo (ex.: preflight do Tailwind com border-width: 0) vencem as\n regras :host do shadow tree, o que apagaria a linha divisoria. */\n .panel {\n border-bottom: 1px solid var(--fx-border-default);\n }\n :host(:last-child) .panel { border-bottom: none; }\n :host([disabled]) { opacity: 0.6; pointer-events: none; }\n .header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--fx-space-md);\n width: 100%;\n box-sizing: border-box;\n padding: var(--fx-space-lg, 20px) var(--fx-space-md, 14px);\n border: none;\n background: transparent;\n font-family: inherit;\n font-size: inherit;\n font-weight: 500;\n color: var(--fx-text-muted);\n text-align: left;\n cursor: pointer;\n transition: color var(--fx-motion-duration-fast, 150ms) var(--fx-motion-easing, ease),\n background var(--fx-motion-duration-fast, 150ms) var(--fx-motion-easing, ease);\n }\n .header:hover { color: var(--fx-text-default); }\n .header:focus-visible {\n outline: none;\n box-shadow: var(--fx-effect-focus-ring, none);\n border-radius: var(--fx-radius-sm, 4px);\n }\n :host([expanded]) .header {\n color: var(--fx-text-default);\n font-weight: 700;\n }\n .header-text { flex: 1; min-width: 0; }\n .chevron {\n flex-shrink: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n color: var(--fx-text-muted);\n transition: transform var(--fx-motion-duration-normal, 250ms) var(--fx-motion-easing, ease);\n }\n :host([expanded]) .chevron { transform: rotate(180deg); color: var(--fx-color-primary); }\n .content {\n display: grid;\n grid-template-rows: 0fr;\n transition: grid-template-rows var(--fx-motion-duration-normal, 250ms) var(--fx-motion-easing, ease);\n }\n :host([expanded]) .content { grid-template-rows: 1fr; }\n .content-inner { overflow: hidden; }\n .content-pad {\n padding: 0 var(--fx-space-md, 14px) var(--fx-space-lg, 20px);\n color: var(--fx-text-muted);\n line-height: 1.6;\n }\n `;\n\n static override get observedAttributes(): string[] {\n return ['header', 'expanded', 'disabled'];\n }\n\n get header(): string {\n return this.getAttr('header', '');\n }\n set header(v: string) {\n this.setAttribute('header', v);\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 get expanded(): boolean {\n return this.hasAttr('expanded');\n }\n set expanded(v: boolean) {\n this.toggleAttr('expanded', v);\n }\n\n get disabled(): boolean {\n return this.hasAttr('disabled');\n }\n set disabled(v: boolean) {\n this.toggleAttr('disabled', v);\n }\n\n protected override connectedCallback(): void {\n super.connectedCallback();\n // O clique vem do shadow root; composedPath() revela o alvo real.\n if (!this._clickListenerAttached) {\n this._clickListenerAttached = true;\n this.addEventListener('click', (e) => {\n const path = e.composedPath() as HTMLElement[];\n if (!path.some((el) => el.classList?.contains('header'))) return;\n if (this.disabled) return;\n this.dispatchEvent(\n new CustomEvent('fx-accordion-toggle', {\n bubbles: true,\n composed: true,\n detail: { panel: this },\n }),\n );\n });\n }\n // Re-render quando o atributo expanded muda (para aria-expanded).\n this._mo = new MutationObserver(() => this.render());\n this._mo.observe(this, { attributes: true, attributeFilter: ['expanded', 'header', 'disabled'] });\n }\n\n protected override disconnectedCallback(): void {\n this._mo?.disconnect();\n this._mo = null;\n super.disconnectedCallback();\n }\n\n private _mo: MutationObserver | null = null;\n private _clickListenerAttached = false;\n\n protected override render(): void {\n this.setTemplate(`\n <div class=\"panel\" part=\"panel\">\n <button type=\"button\" class=\"header\" part=\"header\" role=\"button\"\n aria-expanded=\"${this.expanded}\"\n ${this.disabled ? 'aria-disabled=\"true\"' : ''}>\n <span class=\"header-text\" part=\"header-text\">\n <slot name=\"header\">${esc(this.header)}</slot>\n </span>\n <span class=\"chevron\" part=\"chevron\" aria-hidden=\"true\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"6 9 12 15 18 9\"></polyline>\n </svg>\n </span>\n </button>\n <div class=\"content\" part=\"content\" role=\"region\">\n <div class=\"content-inner\">\n <div class=\"content-pad\" part=\"content-pad\"><slot></slot></div>\n </div>\n </div>\n </div>\n `);\n }\n}\n\n/**\n * <fx-accordion> — Conjunto de paineis expansivos (estilo PrimeVue).\n *\n * Por padrao (modo single) abrir um painel fecha os outros.\n * Adicione o atributo `multiple` para permitir varios paineis abertos.\n *\n * Uso:\n * <fx-accordion value=\"p1\">\n * <fx-accordion-panel value=\"p1\" header=\"Titulo 1\">Conteudo…</fx-accordion-panel>\n * <fx-accordion-panel value=\"p2\" header=\"Titulo 2\">Conteudo…</fx-accordion-panel>\n * </fx-accordion>\n *\n * Atributos:\n * - value: valor(es) ativo(s), separados por virgula no modo multiple.\n * - multiple: permite manter varios paineis abertos ao mesmo tempo.\n *\n * Evento: `change` (composed, detail: { value: string[] }).\n */\nexport class FxAccordion 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 .accordion {\n background: var(--fx-surface-background, #ffffff);\n border: 1px solid var(--fx-border-default);\n border-radius: var(--fx-radius-md, 8px);\n overflow: hidden;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.06);\n }\n `;\n\n static override get observedAttributes(): string[] {\n return ['value', 'multiple'];\n }\n\n get multiple(): boolean {\n return this.hasAttr('multiple');\n }\n set multiple(v: boolean) {\n this.toggleAttr('multiple', v);\n }\n\n /** Valores ativos como array. */\n get values(): string[] {\n return this.getAttr('value', '').split(',').map(s => s.trim()).filter(Boolean);\n }\n set values(v: string[]) {\n this.setAttribute('value', v.join(','));\n }\n\n protected override connectedCallback(): void {\n this._observer = new MutationObserver(() => this._sync());\n this._observer.observe(this, { childList: true, subtree: true });\n super.connectedCallback();\n // Os paineis filhos podem ainda nao estar upgradados no primeiro sync;\n // reagenda para depois da fila de upgrade de custom elements.\n queueMicrotask(() => this._sync());\n }\n\n protected override disconnectedCallback(): void {\n this._observer?.disconnect();\n this._observer = null;\n }\n\n private _observer: MutationObserver | null = null;\n\n protected override render(): void {\n this.setTemplate(`\n <div class=\"accordion\" part=\"accordion\">\n <slot></slot>\n </div>\n `);\n this._sync();\n this._attachListeners();\n }\n\n /** Painéis do accordion (filhos diretos ou descendentes). */\n private get panels(): FxAccordionPanel[] {\n return Array.from(this.querySelectorAll<FxAccordionPanel>('fx-accordion-panel'));\n }\n\n private _sync(): void {\n const actives = this.values;\n // Leitura via getAttribute (nao via getters) porque os paineis filhos\n // podem ainda nao estar upgradados quando o accordion conecta.\n const panels = Array.from(this.querySelectorAll('fx-accordion-panel'));\n // Apenas na conexao inicial (sem valor definido): abre o primeiro painel.\n if (!this._initialized && actives.length === 0 && panels.length > 0) {\n this._initialized = true;\n const first = panels.find((p) => !p.hasAttribute('disabled'));\n if (first) {\n this.values = [first.getAttribute('value') || '0'];\n return;\n }\n }\n this._initialized = true;\n panels.forEach((p, i) => {\n const v = p.getAttribute('value') || String(i);\n if (!p.hasAttribute('value')) p.setAttribute('value', v);\n p.toggleAttribute('expanded', actives.includes(v));\n });\n }\n\n private _initialized = false;\n\n private _attachListeners(): void {\n if (this._listenersAttached) return;\n this._listenersAttached = true;\n // O painel emite 'fx-accordion-toggle' a partir do proprio host\n // (event retargeting do Shadow DOM impede usar closest('.header') aqui).\n this.addEventListener('fx-accordion-toggle', (e) => {\n const panel = (e as CustomEvent).detail?.panel as FxAccordionPanel | undefined;\n if (!panel || panel.disabled) return;\n this.toggle(panel);\n });\n }\n\n private _listenersAttached = false;\n\n /** Abre/fecha um painel respeitando o modo (single | multiple). */\n toggle(panel: FxAccordionPanel): void {\n const v = panel.value;\n let actives = this.values;\n if (panel.expanded) {\n actives = actives.filter(a => a !== v);\n } else if (this.multiple) {\n actives = [...actives, v];\n } else {\n actives = [v];\n }\n this.values = actives;\n this._sync();\n this.dispatchEvent(\n new CustomEvent('change', {\n bubbles: true,\n composed: true,\n detail: { value: actives },\n }),\n );\n }\n\n /** Abre um painel pelo valor. */\n open(value: string): void {\n const panel = this.panels.find((p, i) => (p.value || String(i)) === value);\n if (panel && !panel.expanded) this.toggle(panel);\n }\n\n /** Fecha um painel pelo valor. */\n close(value: string): void {\n const panel = this.panels.find((p, i) => (p.value || String(i)) === value);\n if (panel && panel.expanded) this.toggle(panel);\n }\n}\n\nexport function defineFxAccordion(): typeof FxAccordion {\n return defineElement('fx-accordion', FxAccordion);\n}\n\nexport function defineFxAccordionPanel(): typeof FxAccordionPanel {\n return defineElement('fx-accordion-panel', FxAccordionPanel);\n}\n","import { defineFxAccordion, defineFxAccordionPanel } from './accordion';\n\n// Reexporta as classes para uso programático (ex.: instanceof, herança).\nexport { FxAccordion, FxAccordionPanel } from './accordion';\n\n// Auto-registro: basta importar o subpath `@wrrdev/fenix-ui/accordion`\n// para que os componentes sejam definidos no CustomElementRegistry.\ndefineFxAccordion();\ndefineFxAccordionPanel();\n"],"file":"fenix-ui4.esm.js"}
1
+ {"version":3,"mappings":"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","names":["key","s","display"],"ignoreList":[],"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/expr.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/confirmpopup/confirmpopup.ts","../src/components/confirmpopup/index.ts","../src/components/fileupload/fileupload.ts","../src/components/fileupload/index.ts","../src/components/slider/slider.ts","../src/components/slider/index.ts","../src/components/chip/chip.ts","../src/components/chip/index.ts","../src/components/avatar/avatar.ts","../src/components/avatar/index.ts","../src/components/icon/icon.ts","../src/components/icon/index.ts","../src/components/card/card.ts","../src/components/card/index.ts","../src/components/breadcrumb/breadcrumb.ts","../src/components/breadcrumb/index.ts","../src/components/popover/popover.ts","../src/components/popover/index.ts","../src/components/stepper/stepper.ts","../src/components/stepper/index.ts","../src/components/rating/rating.ts","../src/components/rating/index.ts","../src/components/menu/menu.ts","../src/components/menu/index.ts","../src/components/toggle-button-group/toggle-button-group.ts","../src/components/toggle-button-group/index.ts","../src/components/empty-state/empty-state.ts","../src/components/empty-state/index.ts","../src/components/password-strength/password-strength.ts","../src/components/password-strength/index.ts","../src/components/timeline/timeline.ts","../src/components/timeline/index.ts","../src/components/carousel/carousel.ts","../src/components/carousel/index.ts","../src/components/tree/tree.ts","../src/components/tree/index.ts","../src/components/toast/toast.ts","../src/components/toast/index.ts","../src/components/tooltip/tooltip.ts","../src/components/tooltip/directive.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","../src/components/knob/knob.ts","../src/components/knob/index.ts","../src/components/orderlist/orderlist.ts","../src/components/orderlist/index.ts","../src/components/picklist/picklist.ts","../src/components/picklist/index.ts","../src/components/accordion/accordion.ts","../src/components/accordion/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: {\n ripple: string;\n 'focus-ring': string;\n /** Brilho/anel dos estados de validação — acompanha `focus-ring` (ver applyTokens). */\n 'error-ring': string;\n /** Brilho/anel do estado de sucesso — acompanha `focus-ring` (ver applyTokens). */\n 'success-ring': string;\n };\n /** Z-index */ z: Record<'base' | 'dropdown' | 'modal' | 'toast', string>;\n}\n\n/** Tema claro (padrão). */\nexport const lightTokens: FenixTokens = {\n\tcolor: {\n\t\tprimary: \"#c2410c\",\n\t\tsecondary: \"#991B1B\",\n\t\tsuccess: \"#10b972\",\n\t\twarning: \"#f59e0b\",\n\t\tdanger: \"#f43f5e\",\n\t\tinfo: \"#0ea5e9\",\n\t},\n\tsurface: {\n\t\tbackground: \"#ffffff\",\n\t\tsurface: \"#f8fafc\",\n\t\t\"surface-hover\": \"#eef2f7\",\n\t},\n\ttext: {\n\t\tdefault: \"#10182c\",\n\t\tmuted: \"#64748b\",\n\t\tdisabled: \"#94a3b8\",\n\t},\n\tborder: {\n\t\tdefault: \"#e2e8f0\",\n\t\thover: \"#cbd5e1\",\n\t},\n\tfont: {\n\t\tfamily: \"'Inter', system-ui, -apple-system, 'Segoe UI', sans-serif\",\n\t\tsize: \"14px\",\n\t\tweight: \"500\",\n\t\t\"line-height\": \"1.5\",\n\t},\n\tspace: { xs: \"4px\", sm: \"8px\", md: \"12px\", lg: \"16px\", xl: \"24px\" },\n\tradius: { none: \"0\", sm: \"4px\", md: \"8px\", lg: \"12px\", full: \"9999px\" },\n\tsize: { sm: \"32px\", md: \"40px\", lg: \"48px\" },\n\tshadow: {\n\t\tsm: \"0 1px 2px rgba(15, 23, 42, 0.06)\",\n\t\tmd: \"0 4px 12px rgba(15, 23, 42, 0.10)\",\n\t\tlg: \"0 12px 32px rgba(15, 23, 42, 0.18)\",\n\t},\n\tmotion: {\n\t\t\"duration-fast\": \"120ms\",\n\t\t\"duration-normal\": \"240ms\",\n\t\teasing: \"cubic-bezier(0.25, 0.1, 0.25, 1)\",\n\t},\n\teffect: {\n\t\t/** '0' desativa o efeito ripple do botão. */\n\t\tripple: \"1\",\n\t\t/** Anel de foco dos campos de formulário. Use 'none' para campos sem sobra. */\n\t\t\"focus-ring\":\n\t\t\t\"0 0 0 3px color-mix(in srgb, var(--fx-color-primary) 22%, transparent)\",\n\t\t/**\n\t\t * Brilho dos estados `error`/`invalid`. Acompanha `focus-ring`: quando o\n\t\t * anel de foco está desligado, `applyTokens` força 'none' — o erro segue\n\t\t * visível pela borda (border-color) e pela mensagem, mas sem o anel.\n\t\t */\n\t\t\"error-ring\":\n\t\t\t\"0 0 0 3px color-mix(in srgb, var(--fx-color-danger, #dc2626) 18%, transparent)\",\n\t\t/** Brilho dos estados `success`/`valid` — acompanha `focus-ring` igualmente. */\n\t\t\"success-ring\":\n\t\t\t\"0 0 0 3px color-mix(in srgb, var(--fx-color-success, #16a34a) 18%, transparent)\",\n\t},\n\tz: { 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 syncValidationRings(finalTokens, 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\n/** Valores de `effect['focus-ring']` que significam \"anel de foco desligado\". */\nconst RING_OFF_VALUES = new Set(['', 'none', '0', 'unset', 'initial']);\n\n/**\n * Os anéis de validação (`error-ring`/`success-ring`) acompanham `focus-ring`:\n * - anel de foco LIGADO → estados error/success exibem o brilho junto da borda;\n * - anel de foco DESLIGADO → o erro/sucesso continua visível (border-color +\n * mensagem/alerta), mas SEM o anel/brilho ao redor do campo.\n * Um override explícito de `error-ring`/`success-ring` tem prioridade sobre a\n * derivação. Nunca muta os tokens base (referência compartilhada com lightTokens).\n */\nfunction syncValidationRings(\n tokens: FenixTokens,\n overrides: DeepPartial<FenixTokens> | null,\n): void {\n const focusRing = String(tokens.effect['focus-ring'] ?? '').trim();\n if (!RING_OFF_VALUES.has(focusRing)) return;\n const explicit = (key: 'error-ring' | 'success-ring'): boolean =>\n Boolean(overrides?.effect && Object.prototype.hasOwnProperty.call(overrides.effect, key));\n tokens.effect = {\n ...tokens.effect,\n 'error-ring': explicit('error-ring') ? tokens.effect['error-ring'] : 'none',\n 'success-ring': explicit('success-ring') ? tokens.effect['success-ring'] : 'none',\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\tfenix: register({\n\t\tname: \"fenix\",\n\t\tlabel: \"Fenix (padrão)\",\n\t\ttokens: { effect: { \"focus-ring\": \"none\" } },\n\t}),\n\tseiya: register({\n\t\tname: \"seiya\",\n\t\tlabel: \"Seiya\",\n\t\ttokens: {\n\t\t\tcolor: {\n\t\t\t\tprimary: \"#e11d48\",\n\t\t\t\tsecondary: \"#fb7185\",\n\t\t\t\tinfo: \"#f43f5e\",\n\t\t\t\tdanger: \"#be123c\",\n\t\t\t},\n\t\t\tradius: { sm: \"6px\", md: \"10px\", lg: \"16px\" },\n\t\t\teffect: {\n\t\t\t\t\"focus-ring\": \"none\",\n\t\t\t},\n\t\t},\n\t}),\n\tshiryu: register({\n\t\tname: \"shiryu\",\n\t\tlabel: \"Shiryu\",\n\t\ttokens: {\n\t\t\tcolor: {\n\t\t\t\tprimary: \"#0d9488\",\n\t\t\t\tsecondary: \"#2dd4bf\",\n\t\t\t\tsuccess: \"#059669\",\n\t\t\t\tinfo: \"#14b8a6\",\n\t\t\t},\n\t\t\tradius: { sm: \"4px\", md: \"8px\", lg: \"14px\" },\n\t\t\teffect: {\n\t\t\t\t\"focus-ring\": \"none\",\n\t\t\t},\n\t\t},\n\t}),\n\thyoga: register({\n\t\tname: \"hyoga\",\n\t\tlabel: \"Hyoga\",\n\t\ttokens: {\n\t\t\tcolor: {\n\t\t\t\tprimary: \"#0284c7\",\n\t\t\t\tsecondary: \"#38bdf8\",\n\t\t\t\tinfo: \"#06b6d4\",\n\t\t\t\tdanger: \"#e11d48\",\n\t\t\t},\n\t\t\tsurface: { surface: \"#f0f9ff\", \"surface-hover\": \"#e0f2fe\" },\n\t\t\tradius: { sm: \"8px\", md: \"12px\", lg: \"18px\" },\n\t\t},\n\t}),\n\tshun: register({\n\t\tname: \"shun\",\n\t\tlabel: \"Shun\",\n\t\ttokens: {\n\t\t\tcolor: {\n\t\t\t\tprimary: \"#db2777\",\n\t\t\t\tsecondary: \"#f472b6\",\n\t\t\t\tinfo: \"#ec4899\",\n\t\t\t\twarning: \"#c026d3\",\n\t\t\t},\n\t\t\tradius: { sm: \"10px\", md: \"14px\", lg: \"20px\" },\n\t\t},\n\t}),\n\tikki: register({\n\t\tname: \"ikki\",\n\t\tlabel: \"Ikki\",\n\t\ttokens: {\n\t\t\tcolor: {\n\t\t\t\tprimary: \"#ea580c\",\n\t\t\t\tsecondary: \"#fb923c\",\n\t\t\t\tdanger: \"#dc2626\",\n\t\t\t\twarning: \"#f59e0b\",\n\t\t\t},\n\t\t\tradius: { sm: \"2px\", md: \"4px\", lg: \"6px\" },\n\t\t},\n\t}),\n\taiolia: register({\n\t\tname: \"aiolia\",\n\t\tlabel: \"Aiolia\",\n\t\ttokens: {\n\t\t\tcolor: {\n\t\t\t\tprimary: \"#b45309\",\n\t\t\t\tsecondary: \"#f59e0b\",\n\t\t\t\twarning: \"#eab308\",\n\t\t\t\tinfo: \"#84cc16\",\n\t\t\t},\n\t\t\tradius: { sm: \"6px\", md: \"12px\", lg: \"20px\" },\n\t\t\teffect: {\n\t\t\t\t\"focus-ring\": \"none\",\n\t\t\t},\n\t\t},\n\t}),\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(_name: string, _oldValue: string | null, _newValue: string | null): 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}","/**\n * Tipagens de propriedades + augmentations JSX do FenixUI.\n *\n * Importar este módulo — diretamente (`@wrrdev/fenix-ui/jsx`) ou via o\n * índice principal (`@wrrdev/fenix-ui`) — habilita, no TypeScript:\n *\n * 1. autocomplete + validação de atributos em templates JSX/TSX;\n * 2. tipos nomeados (`FxButtonProps`, `FxInputProps`, …) para wrappers ou código imperativo.\n *\n * A biblioteca NÃO depende de React/Vue: os atributos comuns\n * (`className`, `onClick`, `style`, `children`, …) são aceitos via assinatura\n * de índice, funcionando com qualquer runtime JSX.\n */\n\nimport type { FxElementProps, FxSize } from './types';\nimport type { FenixIconName } from '../icons/types';\n\n/** Marcador de runtime: permite `import '@wrrdev/fenix-ui/jsx'` como side-effect import. */\nexport const FX_JSX_TYPES = true as const;\n\n/* Uniões auxiliares (variants, enums) */\nexport type FxButtonVariant = 'primary' | 'secondary' | 'success' | 'warning' | 'danger' | 'info' | 'ghost' | 'outline';\nexport type FxBadgeVariant = 'default' | 'primary' | 'success' | 'warning' | 'danger' | 'info';\nexport type FxAlertVariant = 'info' | 'success' | 'warning' | 'danger';\nexport type FxProgressVariant = 'primary' | 'success' | 'warning' | 'danger';\nexport type FxSkeletonVariant = 'text' | 'circle' | 'rect';\nexport type FxFloatlabelVariant = 'on' | 'in' | 'over';\nexport type FxInputType = 'text' | 'number' | 'email' | 'password' | 'search' | 'tel' | 'url';\nexport type FxFieldStatus = 'error' | 'invalid' | 'success' | 'valid';\nexport type FxToastKind = 'success' | 'error' | 'info' | 'warning';\nexport type FxToastPosition = 'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right';\nexport type FxTooltipPosition = 'top' | 'bottom' | 'left' | 'right';\nexport type FxDrawerPosition = 'left' | 'right' | 'top' | 'bottom';\nexport type FxDropdownPosition = 'left' | 'center' | 'right' | 'bottom-left' | 'bottom-right';\nexport type FxPaginationPosition = 'left' | 'center' | 'right';\nexport type FxChipVariant = 'primary' | 'secondary' | 'success' | 'warning' | 'danger' | 'info';\nexport type FxAvatarVariant = 'image' | 'text' | 'icon';\nexport type FxAvatarShape = 'circle' | 'rounded' | 'square';\nexport type FxCardVariant = 'elevated' | 'flat' | 'outline' | 'ghost';\n/** Arredondamento do container do card. */\nexport type FxCardRadius = 'sm' | 'md' | 'lg';\nexport type FxPopoverTrigger = 'click' | 'hover';\nexport type FxPopoverPosition = 'auto' | 'top' | 'bottom';\nexport type FxMenuOrientation = 'horizontal' | 'vertical';\nexport type FxTimelineOrientation = 'vertical' | 'horizontal';\nexport type FxSelectionMode = 'single' | 'multiple';\n\n/* Props por componente */\nexport interface FxButtonProps extends FxElementProps {\n variant?: FxButtonVariant;\n type?: 'button' | 'submit' | 'reset';\n size?: FxSize;\n loading?: boolean;\n full?: boolean;\n icon?: string;\n 'icon-pos'?: 'left' | 'right';\n}\nexport interface FxBadgeProps extends FxElementProps {\n variant?: FxBadgeVariant;\n round?: boolean;\n}\nexport interface FxSpinnerProps extends FxElementProps { size?: FxSize; }\nexport interface FxInputProps extends FxElementProps {\n type?: FxInputType;\n size?: FxSize;\n placeholder?: string;\n readonly?: boolean;\n min?: string | number;\n max?: string | number;\n step?: string | number;\n clearable?: boolean;\n full?: boolean;\n icon?: string;\n 'icon-pos'?: 'left' | 'right';\n error?: boolean;\n invalid?: boolean;\n success?: boolean;\n valid?: boolean;\n}\nexport interface FxSelectProps extends FxElementProps {\n value?: string;\n size?: FxSize;\n placeholder?: string;\n searchable?: boolean;\n clearable?: boolean;\n 'search-placeholder'?: string;\n 'no-results'?: string;\n full?: boolean;\n error?: boolean;\n invalid?: boolean;\n success?: boolean;\n valid?: boolean;\n}\nexport interface FxSwitchProps extends FxElementProps { checked?: boolean; size?: FxSize; }\nexport interface FxCheckboxProps extends FxElementProps {\n checked?: boolean;\n indeterminate?: boolean;\n value?: string;\n size?: FxSize;\n}\nexport interface FxRadioProps extends FxElementProps {\n checked?: boolean;\n value?: string;\n name?: string;\n size?: FxSize;\n}\nexport interface FxTextareaProps extends FxElementProps {\n value?: string;\n size?: FxSize;\n placeholder?: string;\n readonly?: boolean;\n rows?: number;\n maxlength?: number;\n full?: boolean;\n error?: boolean;\n invalid?: boolean;\n success?: boolean;\n valid?: boolean;\n}\nexport interface FxMultiselectProps extends FxElementProps {\n values?: string;\n size?: FxSize;\n placeholder?: string;\n searchable?: boolean;\n clearable?: boolean;\n open?: boolean;\n full?: boolean;\n error?: boolean;\n invalid?: boolean;\n success?: boolean;\n valid?: boolean;\n}\nexport interface FxCalendarProps extends FxElementProps {\n value?: string;\n start?: string;\n end?: string;\n min?: string;\n max?: string;\n mode?: 'single' | 'range' | 'multiple';\n values?: string;\n locale?: string;\n disabled?: boolean;\n}\nexport interface FxDatepickerProps extends FxElementProps {\n value?: string;\n start?: string;\n end?: string;\n values?: string;\n mode?: 'single' | 'range' | 'multiple';\n min?: string;\n max?: string;\n placeholder?: string;\n size?: FxSize;\n format?: string;\n 'show-time'?: boolean;\n 'free-text'?: boolean;\n clearable?: boolean;\n full?: boolean;\n error?: boolean;\n invalid?: boolean;\n success?: boolean;\n valid?: boolean;\n}\nexport interface FxTableProps extends FxElementProps {\n pagination?: boolean;\n rows?: number;\n 'rows-options'?: string;\n striped?: boolean;\n 'empty-message'?: string;\n 'pagination-position'?: FxPaginationPosition;\n total?: number;\n page?: number;\n}\nexport interface FxFloatlabelProps extends FxElementProps {\n variant?: FxFloatlabelVariant;\n full?: boolean;\n error?: boolean;\n invalid?: boolean;\n success?: boolean;\n valid?: boolean;\n active?: boolean;\n 'error-text'?: string;\n}\nexport interface FxDialogProps extends FxElementProps { open?: boolean; size?: FxSize; heading?: string; }\nexport interface FxDrawerProps extends FxElementProps { open?: boolean; title?: string; position?: FxDrawerPosition; }\nexport interface FxToastProps extends FxElementProps {\n kind?: FxToastKind;\n title?: string;\n message?: string;\n duration?: number;\n position?: FxToastPosition;\n /** Força o esquema de cores do card independentemente do tema global. */\n mode?: 'light' | 'dark';\n}\nexport interface FxTooltipProps extends FxElementProps { content?: string; position?: FxTooltipPosition; }\nexport interface FxTabsProps extends FxElementProps { value?: string; }\nexport interface FxTabPanelProps extends FxElementProps { tab?: string; hidden?: boolean; }\nexport interface FxProgressProps extends FxElementProps {\n value?: number;\n indeterminate?: boolean;\n variant?: FxProgressVariant;\n label?: string;\n 'hide-label'?: boolean;\n size?: FxSize;\n}\nexport interface FxSkeletonProps extends FxElementProps {\n variant?: FxSkeletonVariant;\n width?: string;\n height?: string;\n lines?: number;\n}\nexport interface FxAlertProps extends FxElementProps { variant?: FxAlertVariant; title?: string; dismissible?: boolean; }\nexport interface FxDropdownProps extends FxElementProps { label?: string; position?: FxDropdownPosition; open?: boolean; }\nexport interface FxDropdownItemProps extends FxElementProps { value?: string; }\nexport interface FxPaginationProps extends FxElementProps {\n page?: number;\n total?: number;\n rows?: number;\n 'rows-options'?: string;\n position?: FxPaginationPosition;\n}\nexport interface FxAutocompleteProps extends FxElementProps {\n value?: string;\n size?: FxSize;\n placeholder?: string;\n source?: string;\n disabled?: boolean;\n 'min-chars'?: number;\n full?: boolean;\n}\nexport interface FxFileUploadProps extends FxElementProps {\n mode?: 'basic' | 'advanced';\n size?: FxSize;\n severity?: 'primary' | 'secondary' | 'success' | 'warning' | 'danger' | 'info';\n label?: string;\n icon?: string;\n accept?: string;\n multiple?: boolean;\n disabled?: boolean;\n 'show-progress'?: boolean;\n progress?: number;\n full?: boolean;\n}\n\n/* Props dos componentes de layout/dados/navegação/feedback */\nexport interface FxSliderProps extends FxElementProps {\n value?: number;\n min?: number;\n max?: number;\n step?: number;\n size?: FxSize;\n 'show-value'?: boolean;\n}\nexport interface FxStepperProps extends FxElementProps {\n active?: number;\n linear?: boolean;\n 'show-numbers'?: boolean;\n}\nexport interface FxChipProps extends FxElementProps {\n variant?: FxChipVariant;\n size?: FxSize;\n icon?: string;\n removable?: boolean;\n selectable?: boolean;\n selected?: boolean;\n}\nexport interface FxAvatarProps extends FxElementProps {\n variant?: FxAvatarVariant;\n src?: string;\n alt?: string;\n size?: FxSize;\n shape?: FxAvatarShape;\n}\n/**\n * <fx-icon> — glifo da Fenix Icons com autocomplete no editor.\n *\n * `name` é uma união literal com TODOS os nomes da fonte (+4.000): o editor\n * (Volar/vue-tsc, React/TSX) sugere os válidos ao digitar. A tipagem aceita\n * qualquer string (escotilha `(string & {})`), então nomes montados por\n * variável/dynamic imports continuam compilando sem erro.\n */\nexport interface FxIconProps extends FxElementProps {\n /** Nome do glifo (ex.: `home`). Texto livre/emoji também é aceito. */\n name?: FenixIconName;\n /** Tamanho do glifo. Sem atributo, herda o tamanho do texto (1em). */\n size?: 'sm' | 'md' | 'lg' | 'xl';\n /** Nome acessível; sem label o ícone é aria-hidden (decorativo). */\n label?: string;\n /** Variante preenchida. */\n fill?: boolean;\n /** Traço mais pesado. */\n bold?: boolean;\n}\nexport interface FxCardProps extends FxElementProps {\n variant?: FxCardVariant;\n /** Arredondamento do container (radius sm/md/lg). */\n radius?: FxCardRadius;\n /** @deprecated use `radius`. */\n size?: FxSize;\n padded?: boolean;\n heading?: string;\n}\nexport interface FxBreadcrumbProps extends FxElementProps {\n size?: FxSize;\n separator?: string;\n}\nexport interface FxPopoverProps extends FxElementProps {\n open?: boolean;\n target?: string;\n trigger?: FxPopoverTrigger;\n position?: FxPopoverPosition;\n dismissible?: boolean;\n}\nexport interface FxRatingProps extends FxElementProps {\n value?: number;\n max?: number;\n readonly?: boolean;\n 'allow-half'?: boolean;\n size?: FxSize;\n}\nexport interface FxMenuProps extends FxElementProps {\n orientation?: FxMenuOrientation;\n size?: FxSize;\n titles?: string;\n}\nexport interface FxToggleButtonGroupProps extends FxElementProps {\n multiple?: boolean;\n value?: string;\n size?: FxSize;\n}\nexport interface FxEmptyStateProps extends FxElementProps {\n icon?: string;\n heading?: string;\n description?: string;\n}\nexport interface FxPasswordStrengthProps extends FxElementProps {\n value?: string;\n size?: FxSize;\n}\nexport interface FxTimelineProps extends FxElementProps {\n orientation?: FxTimelineOrientation;\n size?: FxSize;\n marker?: string;\n}\nexport interface FxCarouselProps extends FxElementProps {\n active?: number;\n 'show-arrows'?: boolean;\n 'show-indicators'?: boolean;\n loop?: boolean;\n autoplay?: number;\n}\nexport interface FxTreeProps extends FxElementProps {\n data?: string;\n 'expand-all'?: boolean;\n size?: FxSize;\n}\nexport interface FxConfirmPopupProps extends FxElementProps {\n open?: boolean;\n target?: string;\n message?: string;\n icon?: string;\n 'accept-label'?: string;\n 'reject-label'?: string;\n position?: FxPopoverPosition;\n}\nexport interface FxKnobProps extends FxElementProps {\n value?: number;\n min?: number;\n max?: number;\n step?: number;\n size?: FxSize;\n 'stroke-width'?: number;\n 'value-color'?: string;\n 'range-color'?: string;\n 'value-template'?: string;\n readonly?: boolean;\n}\nexport interface FxAccordionProps extends FxElementProps {\n value?: string;\n multiple?: boolean;\n}\nexport interface FxAccordionPanelProps extends FxElementProps {\n value?: string;\n header?: string;\n}\nexport interface FxOrderListProps extends FxElementProps {\n data?: string;\n 'data-key'?: string;\n filter?: boolean;\n 'filter-by'?: string;\n 'filter-placeholder'?: string;\n dragdrop?: boolean;\n striped?: boolean;\n 'selection-mode'?: FxSelectionMode;\n 'show-select-all'?: boolean;\n}\nexport interface FxPickListProps extends FxElementProps {\n source?: string;\n target?: string;\n 'source-key'?: string;\n 'target-key'?: string;\n filter?: boolean;\n 'filter-by'?: string;\n 'source-label'?: string;\n 'target-label'?: string;\n 'selection-mode'?: FxSelectionMode;\n 'show-select-all'?: boolean;\n striped?: boolean;\n}\n/* Augmentation global de JSX (React clássico/TSX, Preact, Vue JSX, …).\n Cada tag fx-* recebe autocomplete + validação de atributos.\n A interface é exportada para que o módulo opt-in `@wrrdev/fenix-ui/react`\n também registre as tags em React.JSX (usado quando \"jsx\": \"react-jsx\"). */\nexport interface FxJsxIntrinsicElements {\n 'fx-button': FxButtonProps;\n 'fx-badge': FxBadgeProps;\n 'fx-spinner': FxSpinnerProps;\n 'fx-input': FxInputProps;\n 'fx-select': FxSelectProps;\n 'fx-switch': FxSwitchProps;\n 'fx-checkbox': FxCheckboxProps;\n 'fx-radio': FxRadioProps;\n 'fx-textarea': FxTextareaProps;\n 'fx-multiselect': FxMultiselectProps;\n 'fx-calendar': FxCalendarProps;\n 'fx-datepicker': FxDatepickerProps;\n 'fx-table': FxTableProps;\n 'fx-floatlabel': FxFloatlabelProps;\n 'fx-dialog': FxDialogProps;\n 'fx-drawer': FxDrawerProps;\n 'fx-toast': FxToastProps;\n 'fx-tooltip': FxTooltipProps;\n 'fx-tabs': FxTabsProps;\n 'fx-tab-panel': FxTabPanelProps;\n 'fx-progress': FxProgressProps;\n 'fx-skeleton': FxSkeletonProps;\n 'fx-alert': FxAlertProps;\n 'fx-dropdown': FxDropdownProps;\n 'fx-dropdown-item': FxDropdownItemProps;\n 'fx-pagination': FxPaginationProps;\n 'fx-autocomplete': FxAutocompleteProps;\n 'fx-fileupload': FxFileUploadProps;\n 'fx-slider': FxSliderProps;\n 'fx-chip': FxChipProps;\n 'fx-avatar': FxAvatarProps;\n 'fx-icon': FxIconProps;\n 'fx-card': FxCardProps;\n 'fx-breadcrumb': FxBreadcrumbProps;\n 'fx-popover': FxPopoverProps;\n 'fx-stepper': FxStepperProps;\n 'fx-rating': FxRatingProps;\n 'fx-menu': FxMenuProps;\n 'fx-toggle-button-group': FxToggleButtonGroupProps;\n 'fx-empty-state': FxEmptyStateProps;\n 'fx-password-strength': FxPasswordStrengthProps;\n 'fx-timeline': FxTimelineProps;\n 'fx-carousel': FxCarouselProps;\n 'fx-tree': FxTreeProps;\n 'fx-confirmpopup': FxConfirmPopupProps;\n 'fx-knob': FxKnobProps;\n 'fx-accordion': FxAccordionProps;\n 'fx-accordion-panel': FxAccordionPanelProps;\n 'fx-orderlist': FxOrderListProps;\n 'fx-picklist': FxPickListProps;\n}\ndeclare global {\n namespace JSX {\n interface IntrinsicElements extends FxJsxIntrinsicElements {}\n }\n}\n\n/* Tipagem imperativa: document.createElement('fx-...').\n As tags abaixo não declaradas nos próprios componentes ganham tipagem aqui;\n as demais (alert, dialog, drawer, dropdown, pagination, progress, skeleton,\n tabs, textarea, toast, tooltip, autocomplete) já são tipadas com a classe\n concreta nos respectivos index.ts. */\ndeclare global {\n interface HTMLElementTagNameMap {\n 'fx-button': HTMLElement;\n 'fx-badge': HTMLElement;\n 'fx-spinner': HTMLElement;\n 'fx-input': HTMLElement;\n 'fx-select': HTMLElement;\n 'fx-switch': HTMLElement;\n 'fx-checkbox': HTMLElement;\n 'fx-radio': HTMLElement;\n 'fx-multiselect': HTMLElement;\n 'fx-calendar': HTMLElement;\n 'fx-datepicker': HTMLElement;\n 'fx-table': HTMLElement;\n 'fx-floatlabel': HTMLElement;\n 'fx-accordion': HTMLElement;\n 'fx-accordion-panel': HTMLElement;\n 'fx-orderlist': HTMLElement;\n 'fx-picklist': HTMLElement;\n }\n}\n","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\nimport { FENIX_ICON_BASE_CSS, fenixIconHtml } from '../../icons/base-css';\n\n/**\n * <fx-button> — Componente de ação (piloto).\n *\n * Atributos: variant, size, disabled, loading, type, full (largura 100%\n * acompanhando o elemento pai), icon (nome do glifo Fenix Icons ou\n * emoji/texto livre) e icon-pos (left|right, padrão left).\n * Slots: default (rótulo), `icon` (ícone customizado — vence o atributo).\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 ${FENIX_ICON_BASE_CSS}\n :host {\n display: inline-block;\n vertical-align: middle;\n }\n /* Full width: o host inline-block é shrink-to-fit, então precisa virar\n block para o 100% do .btn interno ter contra o que esticar. */\n :host([full]) {\n display: block;\n width: 100%;\n max-width: 100%;\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 vertical limitado ao orçamento do token --fx-size-*: a altura\n fica EXATAMENTE em sm 32 / md 40 / lg 48 (mesma medida dos campos). */\n padding: var(--fx-space-sm) 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: none;\n box-shadow: var(--fx-effect-focus-ring, none);\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-xs) 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-sm) 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='info']) .btn { background: var(--fx-color-info); }\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; align-items: center; font-size: var(--fx-button-icon-size, calc(var(--fx-font-size) + 6px)); line-height: 1; }\n .btn__icon[hidden] { display: none; }\n .btn__label { display: inline-flex; align-items: center; justify-content: center; }\n /* Icon-only: a label some (o gap do flex some junto) e o botão vira\n quadrado com padding simétrico — ícone perfeitamente centralizado. */\n .btn--icon-only { padding-left: var(--fx-space-md); padding-right: var(--fx-space-md); }\n .btn--icon-only .btn__label { display: none; }\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', 'icon', 'icon-pos'];\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 const icon = this.getAttr('icon');\n const iconRight = this.getAttr('icon-pos', 'left') === 'right';\n // Slot `icon` vence o atributo `icon`; sem nenhum dos dois, sem ícone.\n const slottedIcon = this.querySelector<HTMLElement>('[slot=\"icon\"]');\n const iconContent = slottedIcon\n ? '<slot name=\"icon\"></slot>'\n : (icon ? fenixIconHtml(icon) : '');\n\n this.setTemplate(`\n <button class=\"btn\" part=\"button\" type=\"${btnType}\">\n ${!iconRight ? `<span class=\"btn__icon\" part=\"icon\">${iconContent}</span>` : ''}\n <span class=\"btn__label\" part=\"label\"><slot></slot></span>\n ${iconRight ? `<span class=\"btn__icon\" part=\"icon\">${iconContent}</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 vazio, evitando espaço fantasma\n // do `gap` que descentraliza o rótulo.\n const hasIcon = iconContent.trim() !== '';\n for (const wrap of this.root.querySelectorAll<HTMLElement>('.btn__icon')) {\n wrap.toggleAttribute('hidden', !hasIcon);\n }\n\n // Icon-only: sem texto no slot default, o botão vira quadrado\n // (padding simétrico) em vez de retangular largo.\n const hasLabel = [...(this.childNodes ?? [])].some((n) =>\n n.nodeType === Node.ELEMENT_NODE\n ? (n as Element).getAttribute?.('slot') !== 'icon'\n : (n.textContent ?? '').trim() !== '',\n );\n btn.classList.toggle('btn--icon-only', !hasLabel && 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';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\nimport { esc } from '../../core/sanitize';\n\n/**\n * <fx-select> — Campo de seleção com dropdown customizado.\n *\n * Escreva os filhos como `<option>` nativos no light DOM; eles são\n * espelhados automaticamente (MutationObserver):\n *\n * <fx-select value=\"b\" searchable clearable>\n * <option value=\"a\">Opção A</option>\n * <option value=\"b\">Opção B</option>\n * </fx-select>\n *\n * Atributos: value, size (sm|md|lg), disabled, placeholder,\n * searchable, clearable, search-placeholder, no-results.\n * Evento: `change` (composed, detail: { value }).\n */\nexport class FxSelect 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 /* Largura no HOST (padrão: conteúdo com mín. 200px). CSS externo, classes\n e style inline no elemento definem a largura sem precisar do full. */\n width: var(--fx-select-width, max-content);\n min-width: var(--fx-select-min-width, 200px);\n }\n .trigger {\n display: inline-flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--fx-space-sm);\n box-sizing: border-box;\n min-height: var(--fx-size-md);\n /* Acompanha a largura definida no :host. */\n width: 100%;\n font: inherit;\n /* Altura/linha determinísticas: a caixa fica no token --fx-size-*\n (o line-height fixo impede que a herança da página estoure o min-height). */\n line-height: var(--fx-font-line-height);\n font-weight: var(--fx-font-weight);\n color: var(--fx-text-default);\n text-align: left;\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-xs) var(--fx-space-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 .trigger:hover { border-color: var(--fx-border-hover); }\n .trigger:focus-visible,\n :host([open]) .trigger {\n outline: none;\n border-color: var(--fx-color-primary);\n box-shadow: var(--fx-effect-focus-ring, none);\n }\n :host([size='sm']) { min-width: var(--fx-select-min-width-sm, 180px); }\n :host([size='sm']) .trigger { min-height: var(--fx-size-sm); }\n :host([size='lg']) .trigger { min-height: var(--fx-size-lg); font-size: calc(var(--fx-font-size) + 4px); }\n /* Full width: o host estica até o pai e o trigger acompanha. */\n :host([full]) { display: block; width: 100%; }\n :host([full]) { min-width: 0; }\n :host([full]) .trigger { width: 100%; min-width: 0; }\n :host([full]) .panel { width: 100%; }\n /* Validação — borda e brilho JÁ EM REPOUSO (igual ao fx-input); o\n brilho segue --fx-effect-error-ring, que acompanha effect.focus-ring. */\n :host([error]) .trigger,\n :host([invalid]) .trigger {\n border-color: var(--fx-color-danger, #dc2626);\n box-shadow: var(--fx-effect-error-ring, 0 0 0 3px color-mix(in srgb, var(--fx-color-danger, #dc2626) 18%, transparent));\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: var(--fx-effect-error-ring, 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 box-shadow: var(--fx-effect-success-ring, 0 0 0 3px color-mix(in srgb, var(--fx-color-success, #16a34a) 18%, transparent));\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: var(--fx-effect-success-ring, 0 0 0 3px color-mix(in srgb, var(--fx-color-success, #16a34a) 18%, transparent));\n }\n :host([disabled]) .trigger,\n .trigger[aria-disabled='true'] { opacity: 0.55; cursor: not-allowed; background-color: var(--fx-surface-surface-hover); }\n /* O rótulo encolhe (ellipsis) e os ícones NUNCA saem do campo. */\n .label,\n .placeholder {\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .placeholder { color: var(--fx-text-muted); }\n .actions {\n display: inline-flex;\n align-items: center;\n gap: var(--fx-space-xs, 8px);\n flex-shrink: 0;\n }\n .caret { font-size: calc(var(--fx-font-size) - 3px); color: var(--fx-text-muted); pointer-events: none; }\n\n /* Painel do dropdown */\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%, 220px);\n max-height: 260px;\n overflow-y: auto;\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 }\n :host([open]) .panel { display: block; }\n .search {\n position: sticky;\n top: 0;\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 .opt {\n display: block;\n width: 100%;\n text-align: left;\n font: inherit;\n color: var(--fx-text-default);\n background: none;\n border: none;\n padding: var(--fx-space-sm) var(--fx-space-md);\n cursor: pointer;\n }\n /* Hover e selecionado com a cor primária do tema (igual ao multiselect). */\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) 18%, transparent);\n color: var(--fx-color-primary);\n font-weight: var(--fx-font-weight);\n }\n .empty { padding: var(--fx-space-sm) var(--fx-space-md); color: var(--fx-text-muted); }\n\n /* Clearable */\n .clear {\n border: none;\n background: transparent;\n color: var(--fx-text-muted);\n font-size: calc(var(--fx-font-size) + 2px);\n line-height: 1;\n cursor: pointer;\n padding: 0;\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 no change não pode\n // re-renderizar o template e fechar o dropdown.\n static override get observedAttributes(): string[] {\n // `invalid`/`valid` são aliases aceitos no CSS; sem observá-los o\n // setAttribute no submit não re-renderiza.\n return ['size', 'disabled', 'placeholder', 'searchable', 'clearable', 'error', 'invalid', 'success', 'valid'];\n }\n\n private observer?: MutationObserver;\n private docListener?: (e: Event) => void;\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 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 super.connectedCallback();\n // Espelha mudanças nas <option> do light DOM.\n this.observer = new MutationObserver(() => this.render());\n this.observer.observe(this, { childList: true, subtree: true, characterData: true });\n // Fecha o dropdown 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 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 private select(value: string): void {\n this.value = value;\n this.removeAttribute('open');\n this.render();\n this.dispatchEvent(\n new CustomEvent('change', { bubbles: true, composed: true, detail: { value } }),\n );\n }\n\n /** Navegação por teclado entre as opções do listbox (WCAG 2.1.1). */\n private _navigateOptions(e: KeyboardEvent): void {\n e.preventDefault();\n if (!this.hasAttr('open')) {\n this.toggleAttribute('open');\n this.render();\n }\n const opts = Array.from(this.root.querySelectorAll<HTMLButtonElement>('.opt'));\n if (!opts.length) return;\n const current = opts.indexOf(this.root.activeElement as HTMLButtonElement);\n let next = 0;\n if (e.key === 'ArrowDown') next = current === -1 ? 0 : Math.min(current + 1, opts.length - 1);\n else if (e.key === 'ArrowUp') next = current === -1 ? opts.length - 1 : Math.max(current - 1, 0);\n else if (e.key === 'Home') next = 0;\n else if (e.key === 'End') next = opts.length - 1;\n opts[next]?.focus();\n }\n\n protected override render(): void {\n const prevOpen = this.hasAttr('open');\n const prevSearch = this.root.querySelector<HTMLInputElement>('.search');\n // Estado do campo de busca antes de re-renderizar (valor, foco e cursor).\n const search = prevSearch?.value ?? '';\n const searchFocused =\n prevSearch != null && this.root.activeElement === prevSearch;\n const caretPos = searchFocused ? prevSearch!.selectionStart : null;\n\n const opts = this.options;\n let current = this.getAttr('value');\n if (!current) {\n const explicit = this.querySelector('option[selected]');\n current = explicit?.getAttribute('value') ?? explicit?.textContent?.trim() ?? '';\n }\n const selectedLabel = opts.find((o) => o.value === current)?.label ?? '';\n const placeholder = this.getAttr('placeholder', 'Selecione…');\n\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=\"${prevOpen}\">\n <span class=\"${selectedLabel ? 'label' : 'placeholder'}\">${esc(selectedLabel) || esc(placeholder)}</span>\n <span class=\"actions\">\n ${this.hasAttr('clearable') && current ? '<button type=\"button\" class=\"clear\" part=\"clear\" aria-label=\"Limpar\">×</button>' : ''}\n <span class=\"caret\">▼</span>\n </span>\n </span>\n <div class=\"panel\" part=\"panel\" role=\"listbox\">\n ${this.hasAttr('searchable') ? `<input class=\"search\" part=\"search\" type=\"text\" placeholder=\"${esc(this.getAttr('search-placeholder', 'Pesquisar…'))}\">` : ''}\n ${filtered.map((o) => `\n <button type=\"button\" class=\"opt\" role=\"option\" data-value=\"${esc(o.value)}\"\n aria-selected=\"${o.value === current}\">${esc(o.label)}</button>`).join('')}\n ${filtered.length === 0 ? `<div class=\"empty\">${esc(this.getAttr('no-results', 'Nenhum resultado'))}</div>` : ''}\n </div>\n `);\n\n if (prevOpen) this.setAttribute('open', '');\n const searchInput = this.root.querySelector<HTMLInputElement>('.search');\n if (searchInput) {\n searchInput.value = search;\n searchInput.addEventListener('input', () => this.render());\n searchInput.addEventListener('click', (e) => e.stopPropagation());\n // Re-render não pode roubar o foco nem perder a posição do cursor.\n if (searchFocused) {\n searchInput.focus();\n try { searchInput.setSelectionRange(caretPos!, caretPos!); } catch { /* type=text sempre suporta */ }\n }\n }\n\n const trigger = this.root.querySelector<HTMLElement>('.trigger');\n if (!trigger) return;\n if (this.disabled) trigger.setAttribute('aria-disabled', 'true');\n\n trigger.addEventListener('click', (e) => {\n if (this.disabled) return;\n if ((e.target as HTMLElement).closest('.clear')) return;\n this.toggleAttribute('open');\n this.render();\n this.root.querySelector<HTMLInputElement>('.search')?.focus();\n });\n\n // Teclado: Enter/Espaço abrem o dropdown; setas/Home/End/Escape navegam.\n trigger.addEventListener('keydown', (e) => {\n if (this.disabled) return;\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n trigger.click();\n return;\n }\n if (e.key === 'Escape') {\n if (this.hasAttr('open')) {\n this.removeAttribute('open');\n this.render();\n this.root.querySelector<HTMLElement>('.trigger')?.focus();\n }\n return;\n }\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp' || e.key === 'Home' || e.key === 'End') {\n this._navigateOptions(e);\n }\n });\n\n // Limpar.\n this.root.querySelector('.clear')?.addEventListener('click', (e) => {\n e.stopPropagation();\n this.value = '';\n this.removeAttribute('open');\n this.render();\n this.dispatchEvent(\n new CustomEvent('change', { bubbles: true, composed: true, detail: { value: '' } }),\n );\n });\n\n // Escolher opção.\n this.root.querySelectorAll<HTMLElement>('.opt').forEach((opt) => {\n opt.addEventListener('click', () => this.select(opt.dataset.value!));\n });\n }\n}\n\nexport function defineFxSelect(): typeof FxSelect {\n return defineElement('fx-select', FxSelect);\n}\n\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';\nimport { esc } from '../../core/sanitize';\nimport { FENIX_ICON_BASE_CSS, fenixIconHtml } from '../../icons/base-css';\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 * full (largura 100% acompanhando o elemento pai), icon (nome do glifo Fenix Icons\n * ou emoji/texto livre) e icon-pos (left|right, padrão left).\n * Largura: o default (260px; sm 220px / lg 300px) fica no HOST via tokens\n * --fx-input-width(-sm|-lg) — CSS externo, classes e style inline no elemento\n * vencem o default sem precisar de atributo.\n * Slots: `icon` (ícone customizado no lugar do atributo).\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 /* Largura padrão no HOST (e não no .field interno): assim CSS externo,\n classes do framework (ex.: w-full) e style inline no elemento vencem\n este default naturalmente — regras do documento têm precedência sobre\n :host. Default global trocável via token: --fx-input-width (-sm/-lg). */\n width: var(--fx-input-width, 260px);\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 /* Altura determinística: com line-height fixo, o padding vertical cabe no\n token --fx-size-* e a caixa fica EXATAMENTE no tamanho padrão\n (sm 32 / md 40 / lg 48), igual para todos os campos. */\n line-height: var(--fx-font-line-height);\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-sm) var(--fx-space-lg);\n /* Acompanha a largura definida no :host. */\n width: 100%;\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: borda sempre; o brilho (anel) segue o token do preset\n --fx-effect-error-ring, que acompanha effect.focus-ring — anel\n desligado ⇒ erro só com a borda vermelha, ligado ⇒ soma o brilho. */\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: var(--fx-effect-error-ring, 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: var(--fx-effect-success-ring, 0 0 0 3px color-mix(in srgb, var(--fx-color-success, #16a34a) 18%, transparent));\n }\n :host([size='sm']) { width: var(--fx-input-width-sm, 220px); }\n :host([size='sm']) .field { padding: var(--fx-space-xs) var(--fx-space-md); font-size: var(--fx-font-size); min-height: var(--fx-size-sm); }\n :host([size='lg']) { width: var(--fx-input-width-lg, 300px); }\n :host([size='lg']) .field { padding: var(--fx-space-sm) var(--fx-space-xl); font-size: calc(var(--fx-font-size) + 4px); min-height: var(--fx-size-lg); }\n /* Full width: o host estica até o pai e o campo interno acompanha\n (usar com um container de largura controlada, ex. w-full no Vue). */\n :host([full]) { display: block; width: 100%; }\n :host([full]) .field { width: 100%; }\n /* Clearable */\n :host([clearable]) { position: relative; display: inline-flex; }\n :host([clearable][full]) { display: block; }\n .wrap { position: relative; display: inline-flex; align-items: center; width: 100%; }\n :host([full]) .wrap { display: flex; width: 100%; }\n :host([clearable]) .field { padding-right: var(--fx-space-xl); }\n :host([clearable][full]) .field { flex: 1 1 auto; }\n /* Ícones (attr icon + slot icon) — DENTRO do campo, sobre o padding\n (padrão Material/PrimeVue). Tamanho ajustável via --fx-input-icon-size. */\n .field-icon {\n position: relative;\n display: inline-flex;\n box-sizing: border-box;\n width: 100%;\n }\n .field-icon .field { flex: 1 1 auto; min-width: 0; }\n :host([full]) .field-icon { display: flex; width: 100%; }\n .field-icon .fx-icon,\n .field-icon ::slotted([slot='icon']) {\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-size: var(--fx-input-icon-size, calc(var(--fx-font-size) + 6px));\n line-height: 1;\n color: var(--fx-text-muted);\n pointer-events: none;\n z-index: 1;\n }\n .field-icon.icon-left .fx-icon,\n .field-icon.icon-left ::slotted([slot='icon']) { left: var(--fx-space-md); }\n .field-icon.icon-right .fx-icon,\n .field-icon.icon-right ::slotted([slot='icon']) { right: var(--fx-space-md); }\n /* padding = posição do ícone + largura + folga extra para o texto\n não colar no glifo. */\n .field-icon.icon-left .field {\n padding-left: calc(var(--fx-input-icon-size, calc(var(--fx-font-size) + 6px)) + var(--fx-space-md) + var(--fx-space-sm));\n }\n .field-icon.icon-right .field {\n padding-right: calc(var(--fx-input-icon-size, calc(var(--fx-font-size) + 6px)) + var(--fx-space-md) + var(--fx-space-sm));\n }\n /* icon-pos right + clearable: desloca o × para não sobrepor o ícone. */\n .field-icon.icon-right + .clear {\n right: calc(var(--fx-input-icon-size, calc(var(--fx-font-size) + 6px)) + var(--fx-space-lg));\n }\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 /* Base dos glifos Fenix Icons (o @font-face vem de @wrrdev/fenix-ui/icons). */\n ${FENIX_ICON_BASE_CSS}\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 // `error`/`success` (+ aliases `invalid`/`valid`) PRECISAM ser observados:\n // é assim que o toggle no playground / setAttribute no submit re-renderiza.\n static override get observedAttributes(): string[] {\n return [\n 'type', 'size', 'placeholder',\n 'disabled', 'readonly', 'min', 'max', 'step',\n 'icon', 'icon-pos', 'error', 'invalid', 'success', 'valid',\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 const icon = this.getAttr('icon');\n const iconPos = this.getAttr('icon-pos', 'left') === 'right' ? 'right' : 'left';\n // Slot `icon` vence o atributo `icon`; sem nenhum dos dois, sem ícone.\n const slottedIcon = this.querySelector<HTMLElement>('[slot=\"icon\"]');\n const iconContent = slottedIcon\n ? '<slot name=\"icon\" part=\"icon\"></slot>'\n : (icon ? fenixIconHtml(icon) : '');\n const useIconBox = Boolean(iconContent);\n\n this.setTemplate(`\n ${this.hasAttr('clearable') ? '<div class=\"wrap\" part=\"wrap\">' : ''}\n ${useIconBox ? `<div class=\"field-icon icon-${iconPos}\">` : ''}\n ${useIconBox && iconPos === 'left' ? iconContent : ''}\n <input class=\"field\" part=\"input\" type=\"${esc(type)}\"\n ${placeholder ? `placeholder=\"${esc(placeholder)}\"` : ''}\n ${min ? `min=\"${esc(min)}\"` : ''} ${max ? `max=\"${esc(max)}\"` : ''} ${step ? `step=\"${esc(step)}\"` : ''}\n />\n ${useIconBox && iconPos === 'right' ? iconContent : ''}\n ${useIconBox ? '</div>' : ''}\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';\nimport { esc } from '../../core/sanitize';\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 /* Largura padrão no HOST: CSS externo, classes e style inline no elemento\n vencem este default naturalmente (regras do documento > :host). */\n width: var(--fx-multiselect-width, 240px);\n }\n .trigger {\n display: inline-flex;\n align-items: center;\n flex-wrap: nowrap;\n gap: var(--fx-space-xs);\n /* Acompanha a largura definida no :host. */\n width: 100%;\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 /* Altura determinística: a caixa fica no token --fx-size-*. */\n line-height: var(--fx-font-line-height);\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']) { width: var(--fx-multiselect-width-sm, 200px); }\n :host([size='sm']) .trigger { min-height: var(--fx-size-sm); }\n :host([size='lg']) { width: var(--fx-multiselect-width-lg, 280px); }\n :host([size='lg']) .trigger { min-height: var(--fx-size-lg); font-size: calc(var(--fx-font-size) + 4px); }\n /* Full width: o host estica até o pai e o trigger acompanha. */\n :host([full]) { display: block; width: 100%; }\n :host([full]) .trigger { width: 100%; }\n /* Validação — borda e brilho JÁ EM REPOUSO (igual ao fx-input); o brilho\n segue o token --fx-effect-error-ring, que acompanha effect.focus-ring. */\n :host([error]) .trigger,\n :host([invalid]) .trigger {\n border-color: var(--fx-color-danger, #dc2626);\n box-shadow: var(--fx-effect-error-ring, 0 0 0 3px color-mix(in srgb, var(--fx-color-danger, #dc2626) 18%, transparent));\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: var(--fx-effect-error-ring, 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 box-shadow: var(--fx-effect-success-ring, 0 0 0 3px color-mix(in srgb, var(--fx-color-success, #16a34a) 18%, transparent));\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: var(--fx-effect-success-ring, 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 // `error`/`success` (+ aliases `invalid`/`valid`) PRECISAM ser observados:\n // é assim que o toggle no playground / setAttribute no submit re-renderiza.\n return ['disabled', 'placeholder', 'error', 'invalid', 'success', 'valid'];\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 /** Navegação por teclado entre as opções do listbox (WCAG 2.1.1). */\n private _navigateOptions(e: KeyboardEvent): void {\n e.preventDefault();\n if (!this.hasAttr('open')) {\n this.toggleAttribute('open');\n this.render();\n }\n const opts = Array.from(this.root.querySelectorAll<HTMLButtonElement>('.opt'));\n if (!opts.length) return;\n const current = opts.indexOf(this.root.activeElement as HTMLButtonElement);\n let next = 0;\n if (e.key === 'ArrowDown') next = current === -1 ? 0 : Math.min(current + 1, opts.length - 1);\n else if (e.key === 'ArrowUp') next = current === -1 ? opts.length - 1 : Math.max(current - 1, 0);\n else if (e.key === 'Home') next = 0;\n else if (e.key === 'End') next = opts.length - 1;\n opts[next]?.focus();\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=\"${esc(c.value)}\">\n ${esc(c.label)}\n <span class=\"chip__x\" role=\"button\" aria-label=\"Remover ${esc(c.label)}\">×</span>\n </span>`).join('')\n : `<span class=\"placeholder\">${esc(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=\"${esc(this.getAttr('search-placeholder', 'Pesquisar…'))}\">` : ''}\n <ul class=\"list\">\n ${filtered.map((o) => `\n <li><button type=\"button\" class=\"opt\" role=\"option\" data-value=\"${esc(o.value)}\"\n aria-selected=\"${this.selected.has(o.value)}\">\n <span class=\"box\" aria-hidden=\"true\"></span>${esc(o.label)}\n </button></li>`).join('')}\n ${filtered.length === 0 ? `<li class=\"empty\">${esc(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); setas navegam.\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 return;\n }\n if (e.key === 'Escape') {\n if (this.hasAttr('open')) {\n this.removeAttribute('open');\n this.render();\n this.root.querySelector<HTMLElement>('.trigger')?.focus();\n }\n return;\n }\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp' || e.key === 'Home' || e.key === 'End') {\n this._navigateOptions(e);\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\tstatic override styles = css`\n\t\t:host {\n\t\t\tdisplay: inline-block;\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\tbackground: var(--fx-surface-background);\n\t\t\tborder: 1px solid var(--fx-border-default);\n\t\t\tborder-radius: var(--fx-radius-md);\n\t\t\tbox-shadow: var(--fx-shadow-sm);\n\t\t\tpadding: var(--fx-space-sm);\n\t\t\tuser-select: none;\n\t\t}\n\t\t:host([disabled]) {\n\t\t\topacity: 0.55;\n\t\t\tpointer-events: none;\n\t\t}\n\t\t.head {\n\t\t\tdisplay: flex;\n\t\t\theight: 48px;\n\t\t\talign-items: center;\n\t\t\tjustify-content: space-between;\n\t\t\tgap: var(--fx-space-xs);\n\t\t\tmargin-bottom: var(--fx-space-xs);\n\t\t\tborder-bottom: 1px solid var(--fx-border-default);\n\t\t}\n\n\t\t.title {\n\t\t\tmin-width: 24px;\n\t\t\tborder: none;\n\t\t\tbackground: none;\n\t\t\tcolor: var(--fx-text-default);\n\t\t\tcursor: pointer;\n\t\t\tfont: inherit;\n\t\t\tborder-radius: var(--fx-radius-sm);\n\t\t}\n .nav {\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 20px;\n border: none;\n\t\t\tbackground: none;\n\t\t\tcolor: var(--fx-text-muted);\n\t\t\tcursor: pointer;\n\t\t\tborder-radius: var(--fx-radius-sm);\n }\n\t\t.nav:hover,\n\t\t.title:hover {\n\t\t\tbackground: var(--fx-surface-surface-hover);\n\t\t}\n\t\t.title {\n \tpadding: var(--fx-space-3xs, 4px) var(--fx-space-xs);\n\t\t\tfont-weight: var(--fx-font-weight);\n\t\t\ttext-transform: capitalize;\n\t\t\tflex: 1;\n\t\t}\n\t\t.grid {\n\t\t\tdisplay: grid;\n\t\t\tgrid-template-columns: repeat(7, 34px);\n\t\t\tgap: 2px;\n\t\t}\n\t\t.grid.months,\n\t\t.grid.years {\n\t\t\tgrid-template-columns: repeat(4, minmax(52px, 1fr));\n\t\t}\n\t\t.wd {\n\t\t\ttext-align: center;\n\t\t\tcolor: var(--fx-text-muted);\n\t\t\tfont-size: calc(var(--fx-font-size) - 2px);\n\t\t\tpadding: var(--fx-space-3xs, 4px) 0;\n\t\t\ttext-transform: capitalize;\n\t\t}\n\t\t.cell {\n\t\t\tposition: relative;\n\t\t\tborder: none;\n\t\t\tbackground: none;\n\t\t\tfont: inherit;\n\t\t\tcolor: var(--fx-text-default);\n\t\t\theight: 32px;\n\t\t\tborder-radius: var(--fx-radius-sm);\n\t\t\tcursor: pointer;\n\t\t\tdisplay: inline-flex;\n\t\t\talign-items: center;\n\t\t\tjustify-content: center;\n\t\t}\n\t\t.cell:hover {\n\t\t\tbackground: color-mix(\n\t\t\t\tin srgb,\n\t\t\t\tvar(--fx-color-primary) 12%,\n\t\t\t\ttransparent\n\t\t\t);\n\t\t}\n\t\t.cell.muted {\n\t\t\tcolor: var(--fx-text-disabled);\n\t\t}\n\t\t.cell.today::after {\n\t\t\tcontent: \"\";\n\t\t\tposition: absolute;\n\t\t\tbottom: 3px;\n\t\t\twidth: 4px;\n\t\t\theight: 4px;\n\t\t\tborder-radius: var(--fx-radius-full);\n\t\t\tbackground: var(--fx-color-primary);\n\t\t}\n\t\t.cell.sel {\n\t\t\tbackground: var(--fx-color-primary);\n\t\t\tcolor: #fff;\n\t\t\tfont-weight: var(--fx-font-weight);\n\t\t}\n\t\t.cell.sel::after {\n\t\t\tbackground: #fff;\n\t\t}\n\t\t.cell.in-range {\n\t\t\tbackground: color-mix(\n\t\t\t\tin srgb,\n\t\t\t\tvar(--fx-color-primary) 16%,\n\t\t\t\ttransparent\n\t\t\t);\n\t\t\tborder-radius: 0;\n\t\t}\n\t\t.grid.months .cell,\n\t\t.grid.years .cell {\n\t\t\theight: 40px;\n\t\t}\n\t\t.cell[disabled] {\n\t\t\topacity: 0.35;\n\t\t\tcursor: not-allowed;\n\t\t\tpointer-events: none;\n\t\t}\n\t`;\n\n\tstatic override get observedAttributes(): string[] {\n\t\treturn [\n\t\t\t\"value\",\n\t\t\t\"start\",\n\t\t\t\"end\",\n\t\t\t\"min\",\n\t\t\t\"max\",\n\t\t\t\"range\",\n\t\t\t\"mode\",\n\t\t\t\"values\",\n\t\t\t\"locale\",\n\t\t\t\"disabled\",\n\t\t];\n\t}\n\n\tprivate view: View = \"days\";\n\tprivate cursor = { y: new Date().getFullYear(), m: new Date().getMonth() };\n\t/** Período em construção (chaves numéricas). */\n\tprivate pickStart: number | null = null;\n\tprivate pickEnd: number | null = null;\n\n\t/** Modo de seleção: 'single' | 'range' | 'multiple'. */\n\tget mode(): \"single\" | \"range\" | \"multiple\" {\n\t\tconst m = this.getAttr(\"mode\");\n\t\tif (m === \"range\" || m === \"multiple\") return m;\n\t\treturn this.hasAttr(\"range\") ? \"range\" : \"single\";\n\t}\n\tset mode(m: \"single\" | \"range\" | \"multiple\") {\n\t\tthis.setAttribute(\"mode\", m);\n\t}\n\n\tget range(): boolean {\n\t\treturn this.mode === \"range\";\n\t}\n\tset range(value: boolean) {\n\t\tthis.toggleAttr(\"range\", Boolean(value));\n\t}\n\n\t/** Datas selecionadas no modo multiple (CSV no atributo). */\n\tget values(): string[] {\n\t\tconst csv = this.getAttr(\"values\");\n\t\treturn csv\n\t\t\t? csv\n\t\t\t\t\t.split(\",\")\n\t\t\t\t\t.map((v) => v.trim())\n\t\t\t\t\t.filter(Boolean)\n\t\t\t: [];\n\t}\n\tset values(list: string[]) {\n\t\tthis.setAttribute(\"values\", list.join(\",\"));\n\t}\n\n\tget value(): string {\n\t\treturn this.getAttr(\"value\");\n\t}\n\tset value(v: string) {\n\t\tthis.setAttribute(\"value\", v);\n\t}\n\n\tprivate bounds(): { min: Bound | null; max: Bound | null } {\n\t\treturn {\n\t\t\tmin: parseBound(this.getAttr(\"min\", \"\")),\n\t\t\tmax: parseBound(this.getAttr(\"max\", \"\")),\n\t\t};\n\t}\n\n\tprivate locale(): string {\n\t\treturn this.getAttr(\"locale\", \"pt-BR\");\n\t}\n\n\tprivate fmt(opts: Intl.DateTimeFormatOptions, d: Date): string {\n\t\ttry {\n\t\t\treturn new Intl.DateTimeFormat(this.locale(), opts).format(d);\n\t\t} catch {\n\t\t\treturn new Intl.DateTimeFormat(\"pt-BR\", opts).format(d);\n\t\t}\n\t}\n\n\tprivate dayDisabled(y: number, m: number, d: number): boolean {\n\t\tconst { min, max } = this.bounds();\n\t\tconst k = key(y, m + 1, d);\n\t\treturn (min !== null && k < min.lo) || (max !== null && k > max.hi);\n\t}\n\n\tprivate monthDisabled(y: number, m1: number): boolean {\n\t\tconst { min, max } = this.bounds();\n\t\tconst lo = key(y, m1, 1);\n\t\tconst hi = key(y, m1, 31);\n\t\treturn (min !== null && hi < min.lo) || (max !== null && lo > max.hi);\n\t}\n\n\tprivate yearDisabled(y: number): boolean {\n\t\tconst { min, max } = this.bounds();\n\t\tconst lo = key(y, 1, 1);\n\t\tconst hi = key(y, 12, 31);\n\t\treturn (min !== null && hi < min.lo) || (max !== null && lo > max.hi);\n\t}\n\n\tprivate dayKeyOf(date: Date): number {\n\t\treturn key(date.getFullYear(), date.getMonth() + 1, date.getDate());\n\t}\n\n\tprivate keyToDate(k: number): Date {\n\t\treturn new Date(\n\t\t\tMath.floor(k / 10000),\n\t\t\t(Math.floor(k / 100) % 100) - 1,\n\t\t\tk % 100,\n\t\t);\n\t}\n\n\tprivate iso(k: number): string {\n\t\tconst d = this.keyToDate(k);\n\t\tconst p = (n: number): string => String(n).padStart(2, \"0\");\n\t\treturn `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())}`;\n\t}\n\n\t/** Seleção atual para pintura (chaves). */\n\tprivate selection(): {\n\t\tstart: number | null;\n\t\tend: number | null;\n\t\tsingle: number | null;\n\t\tmulti: Set<number>;\n\t} {\n\t\tconst multi = new Set(\n\t\t\tthis.values.map((iso) => parseBound(iso)?.lo ?? 0).filter(Boolean),\n\t\t);\n\t\tif (this.mode === \"range\") {\n\t\t\tlet s = this.pickStart;\n\t\t\tlet e = this.pickEnd;\n\t\t\tconst attrS = parseBound(this.getAttr(\"start\", \"\"));\n\t\t\tconst attrE = parseBound(this.getAttr(\"end\", \"\"));\n\t\t\tif (s === null && attrS) s = attrS.lo;\n\t\t\tif (e === null && attrE) e = attrE.lo;\n\t\t\treturn { start: s, end: e, single: null, multi };\n\t\t}\n\t\tif (this.mode === \"multiple\") {\n\t\t\treturn { start: null, end: null, single: null, multi };\n\t\t}\n\t\tconst v = parseBound(this.getAttr(\"value\", \"\"));\n\t\treturn { start: null, end: null, single: v ? v.lo : null, multi };\n\t}\n\n\tprivate emit(): void {\n\t\tif (this.mode === \"range\") {\n\t\t\tconst detail = {\n\t\t\t\tstart:\n\t\t\t\t\tthis.pickStart !== null\n\t\t\t\t\t\t? this.iso(this.pickStart)\n\t\t\t\t\t\t: this.getAttr(\"start\", \"\"),\n\t\t\t\tend:\n\t\t\t\t\tthis.pickEnd !== null\n\t\t\t\t\t\t? this.iso(this.pickEnd)\n\t\t\t\t\t\t: this.getAttr(\"end\", \"\"),\n\t\t\t};\n\t\t\tthis.setAttribute(\"start\", detail.start);\n\t\t\tthis.setAttribute(\"end\", detail.end);\n\t\t\tthis.dispatchEvent(\n\t\t\t\tnew CustomEvent(\"change\", {\n\t\t\t\t\tbubbles: true,\n\t\t\t\t\tcomposed: true,\n\t\t\t\t\tdetail,\n\t\t\t\t}),\n\t\t\t);\n\t\t} else if (this.mode === \"multiple\") {\n\t\t\tconst values = this.values;\n\t\t\tthis.dispatchEvent(\n\t\t\t\tnew CustomEvent(\"change\", {\n\t\t\t\t\tbubbles: true,\n\t\t\t\t\tcomposed: true,\n\t\t\t\t\tdetail: { values },\n\t\t\t\t}),\n\t\t\t);\n\t\t} else {\n\t\t\tconst value = this.getAttr(\"value\");\n\t\t\tthis.dispatchEvent(\n\t\t\t\tnew CustomEvent(\"change\", {\n\t\t\t\t\tbubbles: true,\n\t\t\t\t\tcomposed: true,\n\t\t\t\t\tdetail: { value },\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate pickDay(k: number): void {\n\t\tif (this.mode === \"range\") {\n\t\t\tif (this.pickStart === null || this.pickEnd !== null) {\n\t\t\t\tthis.pickStart = k;\n\t\t\t\tthis.pickEnd = null;\n\t\t\t\tthis.setAttribute(\"start\", this.iso(k));\n\t\t\t\tthis.removeAttribute(\"end\");\n\t\t\t\tthis.render();\n\t\t\t\treturn; // emite só ao completar o período\n\t\t\t}\n\t\t\tif (k < this.pickStart)\n\t\t\t\t[this.pickStart, this.pickEnd] = [k, this.pickStart];\n\t\t\telse this.pickEnd = k;\n\t\t\tthis.emit();\n\t\t} else if (this.mode === \"multiple\") {\n\t\t\tconst set = new Set(this.values);\n\t\t\tconst iso = this.iso(k);\n\t\t\tif (set.has(iso)) set.delete(iso);\n\t\t\telse set.add(iso);\n\t\t\tthis.values = [...set].sort();\n\t\t\tthis.emit();\n\t\t} else {\n\t\t\tthis.value = this.iso(k);\n\t\t\tthis.emit();\n\t\t}\n\t\tthis.render();\n\t}\n\n\tprivate navigate(dir: -1 | 1): void {\n\t\tif (this.view === \"days\") {\n\t\t\tconst d = new Date(this.cursor.y, this.cursor.m + dir, 1);\n\t\t\tthis.cursor = { y: d.getFullYear(), m: d.getMonth() };\n\t\t} else if (this.view === \"months\") {\n\t\t\tthis.cursor.y += dir;\n\t\t} else {\n\t\t\tthis.cursor.y += dir * 12;\n\t\t}\n\t\tthis.render();\n\t}\n\n\tprotected override render(): void {\n\t\tconst todayK = this.dayKeyOf(new Date());\n\t\tconst sel = this.selection();\n\t\tconst loc = this.locale();\n\n\t\tconst titles: Record<View, string> = {\n\t\t\tdays: this.fmt(\n\t\t\t\t{ month: \"long\", year: \"numeric\" },\n\t\t\t\tnew Date(this.cursor.y, this.cursor.m, 1),\n\t\t\t),\n\t\t\tmonths: String(this.cursor.y),\n\t\t\tyears: `${Math.floor(this.cursor.y / 12) * 12} – ${Math.floor(this.cursor.y / 12) * 12 + 11}`,\n\t\t};\n\n\t\tlet cells = \"\";\n\t\tif (this.view === \"days\") {\n\t\t\tconst wds = [...Array(7)].map(\n\t\t\t\t(_, i) => this.fmt({ weekday: \"short\" }, new Date(2024, 8, 1 + i)), // 01/09/2024 foi domingo\n\t\t\t);\n\t\t\tcells =\n\t\t\t\twds.map((w) => `<span class=\"wd\">${w}</span>`).join(\"\") +\n\t\t\t\tthis.daysHtml(todayK, sel, loc);\n\t\t} else if (this.view === \"months\") {\n\t\t\tcells = [...Array(12)]\n\t\t\t\t.map((_, i) => {\n\t\t\t\t\tconst dis = this.monthDisabled(this.cursor.y, i + 1);\n\t\t\t\t\treturn `<button type=\"button\" class=\"cell\" data-month=\"${i}\" ${dis ? \"disabled\" : \"\"}>${this.fmt({ month: \"short\" }, new Date(this.cursor.y, i, 1))}</button>`;\n\t\t\t\t})\n\t\t\t\t.join(\"\");\n\t\t} else {\n\t\t\tconst base = Math.floor(this.cursor.y / 12) * 12;\n\t\t\tcells = [...Array(12)]\n\t\t\t\t.map((_, i) => {\n\t\t\t\t\tconst y = base + i;\n\t\t\t\t\tconst dis = this.yearDisabled(y);\n\t\t\t\t\treturn `<button type=\"button\" class=\"cell\" data-year=\"${y}\" ${dis ? \"disabled\" : \"\"}>${y}</button>`;\n\t\t\t\t})\n\t\t\t\t.join(\"\");\n\t\t}\n\n\t\tconst titleAction =\n\t\t\tthis.view === \"days\"\n\t\t\t\t? `data-goto=\"months\"`\n\t\t\t\t: this.view === \"months\"\n\t\t\t\t\t? `data-goto=\"years\"`\n\t\t\t\t\t: \"\";\n\n\t\tthis.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\t\tthis.root\n\t\t\t.querySelectorAll<HTMLButtonElement>(\"[data-nav]\")\n\t\t\t.forEach((b) =>\n\t\t\t\tb.addEventListener(\"click\", () =>\n\t\t\t\t\tthis.navigate(Number(b.dataset.nav) as -1 | 1),\n\t\t\t\t),\n\t\t\t);\n\t\tconst gotoBtn = this.root.querySelector<HTMLElement>(\"[data-goto]\");\n\t\tgotoBtn?.addEventListener(\"click\", () => {\n\t\t\tthis.view = gotoBtn.dataset.goto as View;\n\t\t\tthis.render();\n\t\t});\n\n\t\tthis.root\n\t\t\t.querySelectorAll<HTMLButtonElement>(\"[data-day]\")\n\t\t\t.forEach((b) =>\n\t\t\t\tb.addEventListener(\"click\", () =>\n\t\t\t\t\tthis.pickDay(Number(b.dataset.day!)),\n\t\t\t\t),\n\t\t\t);\n\t\tthis.root\n\t\t\t.querySelectorAll<HTMLButtonElement>(\"[data-month]\")\n\t\t\t.forEach((b) =>\n\t\t\t\tb.addEventListener(\"click\", () => {\n\t\t\t\t\tthis.cursor.m = Number(b.dataset.month!);\n\t\t\t\t\tthis.view = \"days\";\n\t\t\t\t\tthis.render();\n\t\t\t\t}),\n\t\t\t);\n\t\tthis.root\n\t\t\t.querySelectorAll<HTMLButtonElement>(\"[data-year]\")\n\t\t\t.forEach((b) =>\n\t\t\t\tb.addEventListener(\"click\", () => {\n\t\t\t\t\tthis.cursor.y = Number(b.dataset.year!);\n\t\t\t\t\tthis.view = \"months\";\n\t\t\t\t\tthis.render();\n\t\t\t\t}),\n\t\t\t);\n\t}\n\n\t/** Grade de dias com preenchimento do mês anterior. */\n\tprivate daysHtml(\n\t\ttodayK: number,\n\t\tsel: ReturnType<FxCalendar[\"selection\"]>,\n\t\t_loc: string,\n\t): string {\n\t\tconst { y, m } = this.cursor;\n\t\tconst first = new Date(y, m, 1).getDay(); // 0=domingo\n\t\tconst total = new Date(y, m + 1, 0).getDate();\n\t\tconst prevTotal = new Date(y, m, 0).getDate();\n\n\t\tlet html = \"\";\n\t\tfor (let i = first - 1; i >= 0; i--) {\n\t\t\thtml += `<span class=\"cell muted\">${prevTotal - i}</span>`;\n\t\t}\n\t\tfor (let d = 1; d <= total; d++) {\n\t\t\tconst k = key(y, m + 1, d);\n\t\t\tconst isSel =\n\t\t\t\tsel.single === k ||\n\t\t\t\tsel.start === k ||\n\t\t\t\tsel.end === k ||\n\t\t\t\tsel.multi.has(k);\n\t\t\tconst inRange =\n\t\t\t\tsel.start !== null &&\n\t\t\t\tsel.end !== null &&\n\t\t\t\tk > sel.start &&\n\t\t\t\tk < sel.end;\n\t\t\tconst cls = [\n\t\t\t\t\"cell\",\n\t\t\t\tisSel ? \"sel\" : \"\",\n\t\t\t\tinRange ? \"in-range\" : \"\",\n\t\t\t\tk === todayK ? \"today\" : \"\",\n\t\t\t]\n\t\t\t\t.filter(Boolean)\n\t\t\t\t.join(\" \");\n\t\t\thtml += `<button type=\"button\" class=\"${cls}\" data-day=\"${k}\" ${this.dayDisabled(y, m, d) ? \"disabled\" : \"\"}>${d}</button>`;\n\t\t}\n\t\treturn html;\n\t}\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';\nimport { esc } from '../../core/sanitize';\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 /* Altura determinística: a caixa fica EXATAMENTE no token --fx-size-*. */\n line-height: var(--fx-font-line-height);\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: var(--fx-size-sm); min-width: 180px; }\n :host([size='md']) .field { min-height: var(--fx-size-md); }\n :host([size='lg']) .field { min-height: var(--fx-size-lg); 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 /* Full width: o host estica até o pai (os min-width dos modos são\n descartados para permitir layouts estreitos sob controle do pai). */\n :host([full]) { display: block; width: 100%; }\n :host([full]) .field { min-width: 0; }\n /* Validação — borda e brilho JÁ EM REPOUSO (igual ao fx-input); o brilho\n segue o token --fx-effect-error-ring, que acompanha effect.focus-ring. */\n :host([error]) .field,\n :host([invalid]) .field {\n border-color: var(--fx-color-danger, #dc2626);\n box-shadow: var(--fx-effect-error-ring, 0 0 0 3px color-mix(in srgb, var(--fx-color-danger, #dc2626) 18%, transparent));\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: var(--fx-effect-error-ring, 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 box-shadow: var(--fx-effect-success-ring, 0 0 0 3px color-mix(in srgb, var(--fx-color-success, #16a34a) 18%, transparent));\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: var(--fx-effect-success-ring, 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', 'error', 'invalid', 'success', 'valid'];\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=\"${esc(this.getAttr('min'))}\" max=\"${esc(this.getAttr('max'))}\"`;\n if (this.mode === 'range') {\n calAttrs += ` range start=\"${esc(this.getAttr('start'))}\" end=\"${esc(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=\"${esc(dates)}\"`;\n } else {\n const v = this.value.split('T')[0] ?? '';\n calAttrs += ` value=\"${esc(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=\"${esc(this.getAttr('placeholder', 'dd/mm/aaaa'))}\"\n value=\"${esc(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=\"${CSS.escape(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","/**\n * Avaliador de expressões **seguro** (sem `eval`/`Function`) usado pelos\n * templates de célula do `<fx-table>`.\n *\n * Permite personalizar o conteúdo de uma coluna:\n *\n * ```html\n * <fx-column field=\"preco\" header=\"Preço\">\n * <template>R$ {{ value | currency }}</template>\n * </fx-column>\n *\n * <fx-column field=\"status\" header=\"Situação\">\n * <template>\n * <i class=\"pi pi-{{ row.status === 'ativo' ? 'check' : 'times' }}\"></i>\n * </template>\n * </fx-column>\n * ```\n *\n * Contexto de variáveis dentro de `{{ }}`:\n * - `value` — valor do campo da coluna (row[field])\n * - `row` — objeto completo da linha\n * - `row.campo` — acesso a qualquer campo da linha\n *\n * Pipes: `value | currency`, `value | date`, `value | date: 'short'`,\n * `value | dateTime`, `value | number`, `value | number: 2`\n */\n\ntype Row = Record<string, unknown>;\nexport type EvalCtx = { value: unknown; row: Row };\n\nimport { esc } from '../../core/sanitize';\n\n/* ------------------------------------------------------------------ *\n * Pipes built-in\n * ------------------------------------------------------------------ */\nconst LOCALE = 'pt-BR';\n\nexport const PIPES: Record<string, (v: unknown, arg?: string) => string> = {\n /** Formata como moeda brasileira (R$). */\n currency: (v) => {\n if (v == null || v === '') return '';\n try {\n return new Intl.NumberFormat(LOCALE, {\n style: 'currency',\n currency: 'BRL',\n }).format(Number(v));\n } catch {\n return String(v);\n }\n },\n\n /** Formata como data. Estilos: short | medium | long | full (default medium). */\n date: (v, arg) => {\n const d = toDate(v);\n if (!d) return String(v ?? '');\n const styles: Record<string, Intl.DateTimeFormatOptions> = {\n short: { dateStyle: 'short' },\n medium: { dateStyle: 'medium' },\n long: { dateStyle: 'long' },\n full: { dateStyle: 'full' },\n };\n const opts = arg && styles[arg] ? styles[arg] : styles.medium;\n try {\n return new Intl.DateTimeFormat(LOCALE, opts).format(d);\n } catch {\n return d.toLocaleDateString(LOCALE);\n }\n },\n\n /** Formata como data + hora (medium/short). */\n dateTime: (v) => {\n const d = toDate(v);\n if (!d) return String(v ?? '');\n try {\n return new Intl.DateTimeFormat(LOCALE, {\n dateStyle: 'medium',\n timeStyle: 'short',\n }).format(d);\n } catch {\n return d.toLocaleString(LOCALE);\n }\n },\n\n /** Formata como número (pt-BR). Opcional: `number: 2` (casas decimais). */\n number: (v, arg) => {\n if (v == null || v === '') return '';\n try {\n const opt: Intl.NumberFormatOptions = {};\n if (arg !== undefined) {\n const dec = Number(arg);\n opt.minimumFractionDigits = dec;\n opt.maximumFractionDigits = dec;\n }\n return new Intl.NumberFormat(LOCALE, opt).format(Number(v));\n } catch {\n return String(v);\n }\n },\n};\n\nfunction toDate(v: unknown): Date | null {\n if (v == null || v === '') return null;\n if (v instanceof Date) return isNaN(v.getTime()) ? null : v;\n if (typeof v === 'number') {\n const d = new Date(v);\n return isNaN(d.getTime()) ? null : d;\n }\n if (typeof v === 'string') {\n const d = new Date(v);\n return isNaN(d.getTime()) ? null : d;\n }\n return null;\n}\n\n/* ------------------------------------------------------------------ *\n * Tokenizer\n * ------------------------------------------------------------------ */\ntype TType =\n | 'str' // 'texto' ou \"texto\"\n | 'num' // 42, 3.14\n | 'id' // value, row, nome, status\n | 'kw' // true, false, null\n | 'op' // + - * /\n | 'cmp' // == != > < >= <=\n | 'pipe' // |\n | 'qm' // ?\n | 'colon' // :\n | 'lparen' // (\n | 'rparen' // )\n | 'dot'; // .\n\ninterface Token {\n type: TType;\n value: string;\n}\n\nconst IDENT_START = (ch: string) => /[a-z_$]/i.test(ch);\nconst IDENT_PART = (ch: string) => /[a-z0-9_$]/i.test(ch);\n\nfunction tokenize(expr: string): Token[] {\n const tokens: Token[] = [];\n let i = 0;\n\n while (i < expr.length) {\n const ch = expr[i];\n\n // Whitespace\n if (/\\s/.test(ch)) { i++; continue; }\n\n // String literals: '...' ou \"...\"\n if (ch === \"'\" || ch === '\"') {\n const quote = ch;\n let str = '';\n i++;\n while (i < expr.length && expr[i] !== quote) {\n if (expr[i] === '\\\\' && i + 1 < expr.length) {\n str += expr[i + 1];\n i += 2;\n } else {\n str += expr[i];\n i++;\n }\n }\n i++; // skip closing quote\n tokens.push({ type: 'str', value: str });\n continue;\n }\n\n // Numbers (apenas se começar com dígito — evita ambiguidade com .)\n if (ch >= '0' && ch <= '9') {\n let numStr = '';\n while (i < expr.length && (expr[i] >= '0' && expr[i] <= '9' || expr[i] === '.')) {\n numStr += expr[i];\n i++;\n }\n tokens.push({ type: 'num', value: numStr });\n continue;\n }\n\n // Identifiers / keywords\n if (IDENT_START(ch)) {\n let ident = '';\n while (i < expr.length && IDENT_PART(expr[i])) {\n ident += expr[i];\n i++;\n }\n if (ident === 'true' || ident === 'false' || ident === 'null') {\n tokens.push({ type: 'kw', value: ident });\n } else {\n tokens.push({ type: 'id', value: ident });\n }\n continue;\n }\n\n // Two-char comparison operators\n const two = expr.slice(i, i + 2);\n if (two === '==' || two === '!=' || two === '>=' || two === '<=') {\n tokens.push({ type: 'cmp', value: two });\n i += 2;\n continue;\n }\n\n // Single-char arithmetic / comparison\n if (ch === '+') { tokens.push({ type: 'op', value: '+' }); i++; continue; }\n if (ch === '-') { tokens.push({ type: 'op', value: '-' }); i++; continue; }\n if (ch === '*') { tokens.push({ type: 'op', value: '*' }); i++; continue; }\n if (ch === '/') { tokens.push({ type: 'op', value: '/' }); i++; continue; }\n if (ch === '>') { tokens.push({ type: 'cmp', value: '>' }); i++; continue; }\n if (ch === '<') { tokens.push({ type: 'cmp', value: '<' }); i++; continue; }\n if (ch === '!') { tokens.push({ type: 'op', value: '!' }); i++; continue; }\n if (ch === '?') { tokens.push({ type: 'qm', value: '?' }); i++; continue; }\n if (ch === ':') { tokens.push({ type: 'colon', value: ':' }); i++; continue; }\n if (ch === '|') { tokens.push({ type: 'pipe', value: '|' }); i++; continue; }\n if (ch === '(') { tokens.push({ type: 'lparen', value: '(' }); i++; continue; }\n if (ch === ')') { tokens.push({ type: 'rparen', value: ')' }); i++; continue; }\n if (ch === '.') { tokens.push({ type: 'dot', value: '.' }); i++; continue; }\n\n // Unknown — skip silently\n i++;\n }\n\n return tokens;\n}\n\n/* ------------------------------------------------------------------ *\n * Parser — recursive descent, avalia durante o parsing\n * ------------------------------------------------------------------ */\n\nclass Parser {\n private pos = 0;\n\n constructor(\n private tokens: Token[],\n private ctx: EvalCtx,\n ) {}\n\n private peek(): Token | null {\n return this.pos < this.tokens.length ? this.tokens[this.pos] : null;\n }\n\n private next(): Token | null {\n return this.pos < this.tokens.length ? this.tokens[this.pos++] : null;\n }\n\n private matchType(type: TType): Token | null {\n if (this.peek()?.type === type) return this.next();\n return null;\n }\n\n parse(): unknown {\n return this.parsePipe();\n }\n\n /* pipeExpr := ternary ('|' IDENT (':' pipeArg)? )* */\n private parsePipe(): unknown {\n let val = this.parseTernary();\n\n while (this.peek()?.type === 'pipe') {\n this.next(); // consume |\n const nameTok = this.matchType('id');\n if (!nameTok) break;\n\n let arg: string | undefined;\n if (this.peek()?.type === 'colon') {\n this.next(); // consume :\n const argTok = this.peek();\n if (argTok && (argTok.type === 'str' || argTok.type === 'num' || argTok.type === 'id')) {\n arg = argTok.type === 'str' ? argTok.value : String(argTok.value);\n this.next();\n }\n }\n\n val = this.applyPipe(nameTok.value, arg, val);\n }\n return val;\n }\n\n /* ternary := comparison ('?' pipeExpr ':' pipeExpr)? */\n private parseTernary(): unknown {\n const cond = this.parseComparison();\n if (this.peek()?.type === 'qm') {\n this.next(); // consume ?\n const trueVal = this.parsePipe();\n if (this.peek()?.type === 'colon') {\n this.next(); // consume :\n const falseVal = this.parsePipe();\n return cond ? trueVal : falseVal;\n }\n return trueVal;\n }\n return cond;\n }\n\n /* comparison := additive (COMP_OP additive)? */\n private parseComparison(): unknown {\n const left = this.parseAdditive();\n const tok = this.peek();\n if (tok?.type === 'cmp') {\n this.next();\n const right = this.parseAdditive();\n return this.compare(left, tok.value, right);\n }\n return left;\n }\n\n private compare(left: unknown, op: string, right: unknown): boolean {\n const l = toComparable(left);\n const r = toComparable(right);\n switch (op) {\n case '==': return l == r;\n case '!=': return l != r;\n case '>': return l > r;\n case '<': return l < r;\n case '>=': return l >= r;\n case '<=': return l <= r;\n }\n return false;\n }\n\n /* additive := multiplicative (('+' | '-') multiplicative)* */\n private parseAdditive(): unknown {\n let left = this.parseMultiplicative();\n for (;;) {\n const tok = this.peek();\n if (tok?.type === 'op' && (tok.value === '+' || tok.value === '-')) {\n this.next();\n const right = this.parseMultiplicative();\n left = tok.value === '+' ? this.add(left, right) : this.subtract(left, right);\n } else break;\n }\n return left;\n }\n\n private add(l: unknown, r: unknown): unknown {\n if (typeof l === 'string' || typeof r === 'string') {\n return String(l ?? '') + String(r ?? '');\n }\n return Number(l) + Number(r);\n }\n\n private subtract(l: unknown, r: unknown): unknown {\n return Number(l) - Number(r);\n }\n\n /* multiplicative := unary (('*' | '/') unary)* */\n private parseMultiplicative(): unknown {\n let left = this.parseUnary();\n for (;;) {\n const tok = this.peek();\n if (tok?.type === 'op' && (tok.value === '*' || tok.value === '/')) {\n this.next();\n const right = this.parseUnary();\n left = tok.value === '*' ? Number(left) * Number(right) : Number(left) / Number(right);\n } else break;\n }\n return left;\n }\n\n /* unary := ('+' | '-' | '!') unary | primary */\n private parseUnary(): unknown {\n const tok = this.peek();\n if (tok?.type === 'op' && (tok.value === '+' || tok.value === '-')) {\n this.next();\n const val = Number(this.parseUnary());\n return tok.value === '-' ? -val : val;\n }\n if (tok?.type === 'op' && tok.value === '!') {\n this.next();\n return !this.parseUnary();\n }\n return this.parsePrimary();\n }\n\n /* primary := STRING | NUMBER | kw | id ( '.' id )* | '(' pipeExpr ')' */\n private parsePrimary(): unknown {\n const tok = this.peek();\n if (!tok) return undefined;\n\n if (tok.type === 'lparen') {\n this.next();\n const val = this.parsePipe();\n this.matchType('rparen');\n return val;\n }\n\n if (tok.type === 'str') { this.next(); return tok.value; }\n if (tok.type === 'num') { this.next(); return Number(tok.value); }\n\n if (tok.type === 'kw') {\n this.next();\n return tok.value === 'true' ? true\n : tok.value === 'false' ? false\n : null;\n }\n\n if (tok.type === 'id') {\n this.next();\n let result: unknown = this.resolveId(tok.value);\n\n while (this.peek()?.type === 'dot') {\n this.next(); // consume .\n const propTok = this.peek();\n if (propTok?.type === 'id') {\n this.next();\n result = result == null\n ? undefined\n : (result as Record<string, unknown>)[propTok.value];\n } else break;\n }\n return result;\n }\n\n this.next(); // skip token inesperado\n return undefined;\n }\n\n private resolveId(name: string): unknown {\n switch (name) {\n case 'value': return this.ctx.value;\n case 'row': return this.ctx.row;\n case 'true': return true;\n case 'false': return false;\n case 'null': return null;\n default: return this.ctx.row[name];\n }\n }\n\n private applyPipe(name: string, arg: string | undefined, input: unknown): string {\n const pipe = PIPES[name];\n if (!pipe) return formatDefault(input);\n try {\n return pipe(input, arg);\n } catch {\n return formatDefault(input);\n }\n }\n}\n\nfunction toComparable(v: unknown): number | string {\n if (typeof v === 'number') return v;\n if (typeof v === 'boolean') return v ? 1 : 0;\n return String(v ?? '');\n}\n\nfunction formatDefault(v: unknown): string {\n if (v == null) return '';\n if (typeof v === 'object') return '[object Object]';\n return String(v);\n}\n\n/* ------------------------------------------------------------------ *\n * API pública\n * ------------------------------------------------------------------ */\n\n/** Avalia uma única expressão `{{ }}` retornando uma string. */\nexport function evaluate(expr: string, ctx: EvalCtx): string {\n try {\n const tokens = tokenize(expr);\n const parser = new Parser(tokens, ctx);\n const result = parser.parse();\n return formatDefault(result);\n } catch {\n return '';\n }\n}\n\n/** Processa um template HTML substituindo todas as ocorrências `{{ expr }}`. */\nexport function renderCell(template: string, row: Row, field: string): string {\n const ctx: EvalCtx = { value: row[field], row };\n return template.replace(/\\{\\{([^}]+)\\}\\}/g, (_, expr: string) =>\n esc(evaluate(decodeEntities(expr.trim()), ctx)));\n}\n\n/** Decodifica entidades HTML que o serializador do innerHTML pode inserir (ex: &gt; &lt; &amp;). */\nfunction decodeEntities(str: string): string {\n return str\n .replace(/&amp;/g, '&')\n .replace(/&gt;/g, '>')\n .replace(/&lt;/g, '<')\n .replace(/&quot;/g, '\"')\n .replace(/&#39;/g, \"'\");\n}\n","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\nimport { esc } from \"../../core/sanitize\";\nimport { renderCell } from \"./expr\";\nimport \"../select\";\n\n/**\n * <fx-table> — Tabela de dados estilo DataTable (dados + colunas configuráveis,\n * ordenação, filtros por coluna, paginação personalizável, busca global na toolbar\n * e modo lazy para busca no servidor).\n *\n * Colunas (light DOM):\n * <fx-column field=\"nome\" header=\"Nome\" sortable filterable align=\"left\">\n * opcional: <template>R$ {{value}}</template> para render customizado\n * ou conteúdo direto (HTML + {{ }}) como template alternativo\n * </fx-column>\n *\n * Toolbar (opcional):\n * <template slot=\"toolbar\">\n * <input data-search-fields=\"nome,cargo\" placeholder=\"Buscar…\">\n * <button>Nova ação</button>\n * </template>\n *\n * Dados: propriedade `data` (array de objetos) ou atributo `data` (JSON).\n *\n * Atributos: pagination, rows, rows-options, pagination-position (left|center|right),\n * striped, empty-message, lazy, total, loading, loading-message.\n * Eventos: page-change, sort-change, row-click, filter-change (todos composed).\n */\nexport class FxTable extends FxElement {\n\tstatic override styles = css`\n\t\t:host {\n\t\t\tdisplay: block;\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\tbackground: var(--fx-surface-background);\n\t\t}\n\t\t.table-wrap {\n\t\t\tposition: relative;\n\t\t}\n\t\t.scroll {\n\t\t\toverflow-x: auto;\n\t\t\tborder: 1px solid var(--fx-border-default);\n\t\t\tborder-radius: var(--fx-radius-md);\n\t\t}\n\t\ttable {\n\t\t\twidth: 100%;\n\t\t\tborder-collapse: collapse;\n\t\t}\n\t\tth {\n\t\t\ttext-align: left;\n\t\t\tpadding: var(--fx-space-sm) var(--fx-space-md);\n\t\t\tbackground: var(--fx-surface-surface);\n\t\t\tborder-bottom: 2px solid var(--fx-border-default);\n\t\t\twhite-space: nowrap;\n\t\t\tuser-select: none;\n\t\t}\n\t\tth.sortable {\n\t\t\tcursor: pointer;\n\t\t}\n\t\tth.sortable:hover {\n\t\t\tcolor: var(--fx-color-primary);\n\t\t}\n\t\t.sort-ind {\n\t\t\tfont-size: calc(var(--fx-font-size) - 4px);\n\t\t\tmargin-left: var(--fx-space-3xs, 2px);\n\t\t\topacity: 0.45;\n\t\t\ttransition: opacity var(--fx-motion-duration-fast)\n\t\t\t\tvar(--fx-motion-easing);\n\t\t}\n\t\tth.sortable:hover .sort-ind {\n\t\t\topacity: 0.85;\n\t\t}\n\t\t.sort-ind.active {\n\t\t\topacity: 1;\n\t\t\tcolor: var(--fx-color-primary);\n\t\t}\n\t\t.filter-row th {\n\t\t\tpadding: var(--fx-space-3xs, 4px) var(--fx-space-md) var(--fx-space-sm);\n\t\t\tborder-bottom-width: 1px;\n\t\t}\n\t\t.filter {\n\t\t\twidth: 100%;\n\t\t\tbox-sizing: border-box;\n\t\t\tfont: inherit;\n\t\t\tfont-size: calc(var(--fx-font-size) - 2px);\n\t\t\tcolor: var(--fx-text-default);\n\t\t\tbackground: var(--fx-surface-background);\n\t\t\tborder: 1px solid var(--fx-border-default);\n\t\t\tborder-radius: var(--fx-radius-sm);\n\t\t\tpadding: var(--fx-space-3xs, 4px) var(--fx-space-xs);\n\t\t\toutline: none;\n\t\t}\n\t\t.filter:focus {\n\t\t\tborder-color: var(--fx-color-primary);\n\t\t\tbox-shadow: var(--fx-effect-focus-ring, none);\n\t\t}\n\t\ttd {\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}\n\t\ttbody tr {\n\t\t\tcursor: pointer;\n\t\t\ttransition: background-color var(--fx-motion-duration-fast)\n\t\t\t\tvar(--fx-motion-easing);\n\t\t}\n\t\ttbody tr:hover {\n\t\t\tbackground: color-mix(\n\t\t\t\tin srgb,\n\t\t\t\tvar(--fx-color-primary) 8%,\n\t\t\t\ttransparent\n\t\t\t);\n\t\t}\n\t\t:host([striped]) tbody tr:nth-child(even) {\n\t\t\tbackground: var(--fx-surface-background);\n\t\t}\n\t\t:host([striped]) tbody tr:hover {\n\t\t\tbackground: color-mix(\n\t\t\t\tin srgb,\n\t\t\t\tvar(--fx-color-primary) 8%,\n\t\t\t\ttransparent\n\t\t\t);\n\t\t}\n\t\t.empty {\n\t\t\ttext-align: center;\n\t\t\tpadding: var(--fx-space-xl);\n\t\t\tcolor: var(--fx-text-muted);\n\t\t}\n\t\t.pager {\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\tgap: var(--fx-space-sm);\n\t\t\tflex-wrap: wrap;\n\t\t\tpadding: var(--fx-space-sm) 0;\n\t\t}\n\t\t:host([pagination-position=\"center\"]) .pager {\n\t\t\tjustify-content: center;\n\t\t}\n\t\t:host([pagination-position=\"right\"]) .pager {\n\t\t\tjustify-content: flex-end;\n\t\t}\n\t\t.pager .info {\n\t\t\tcolor: var(--fx-text-muted);\n\t\t\tfont-size: calc(var(--fx-font-size) - 2px);\n\t\t}\n\t\t.pg-btn {\n\t\t\tmin-width: var(--fx-size-sm);\n\t\t\theight: var(--fx-size-sm);\n\t\t\tfont: inherit;\n\t\t\tfont-size: calc(var(--fx-font-size) - 2px);\n\t\t\tcolor: var(--fx-text-default);\n\t\t\tbackground: var(--fx-surface-background);\n\t\t\tborder: 1px solid var(--fx-border-default);\n\t\t\tborder-radius: var(--fx-radius-sm);\n\t\t\tpadding: var(--fx-space-3xs, 4px) var(--fx-space-sm);\n\t\t\tcursor: pointer;\n\t\t\ttransition: border-color var(--fx-motion-duration-fast)\n\t\t\t\tvar(--fx-motion-easing);\n\t\t}\n\t\t.pg-btn:hover:not(:disabled):not([aria-current=\"true\"]) {\n\t\t\tborder-color: var(--fx-color-primary);\n\t\t\tcolor: var(--fx-color-primary);\n\t\t}\n\t\t.pg-btn:disabled {\n\t\t\topacity: 0.5;\n\t\t\tcursor: not-allowed;\n\t\t}\n\t\t.pg-btn[aria-current=\"true\"] {\n\t\t\tbackground: var(--fx-color-primary);\n\t\t\tborder-color: var(--fx-color-primary);\n\t\t\tcolor: #fff;\n\t\t\tfont-weight: var(--fx-font-weight);\n\t\t}\n\t\tfx-select {\n\t\t\tvertical-align: middle;\n\t\t}\n\t\tfx-select::part(trigger) {\n\t\t\tmin-width: 64px !important;\n\t\t\tmin-height: var(--fx-size-sm) !important;\n\t\t\tpadding: 0 var(--fx-space-sm) !important;\n\t\t\tborder-radius: var(--fx-radius-sm) !important;\n\t\t\tfont-size: calc(var(--fx-font-size) - 2px) !important;\n\t\t}\n\t\t.toolbar {\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\tgap: var(--fx-space-sm);\n\t\t\tflex-wrap: wrap;\n\t\t\tpadding: var(--fx-space-sm) var(--fx-space-md);\n\t\t\tborder: 1px solid var(--fx-border-default);\n\t\t\tborder-bottom: none;\n\t\t\tborder-radius: var(--fx-radius-md) var(--fx-radius-md) 0 0;\n\t\t\tbackground: var(--fx-surface-background);\n\t\t}\n\t\t.toolbar:empty {\n\t\t\tdisplay: none;\n\t\t}\n\t\t.loading-overlay {\n\t\t\tposition: absolute;\n\t\t\tinset: 0;\n\t\t\tdisplay: flex;\n\t\t\tflex-direction: column;\n\t\t\talign-items: center;\n\t\t\tjustify-content: center;\n\t\t\tgap: var(--fx-space-sm);\n\t\t\tbackground: color-mix(\n\t\t\t\tin srgb,\n\t\t\t\tvar(--fx-surface-background) 85%,\n\t\t\t\ttransparent\n\t\t\t);\n\t\t\tbackdrop-filter: blur(2px);\n\t\t\tz-index: 10;\n\t\t\tborder-radius: var(--fx-radius-md);\n\t\t}\n\t\t.tbl-spinner {\n\t\t\twidth: 32px;\n\t\t\theight: 32px;\n\t\t\tborder: 3px solid var(--fx-border-default);\n\t\t\tborder-top-color: var(--fx-color-primary);\n\t\t\tborder-radius: 50%;\n\t\t\tanimation: tbl-spin 1s linear infinite;\n\t\t}\n\t\t@keyframes tbl-spin {\n\t\t\tto {\n\t\t\t\ttransform: rotate(360deg);\n\t\t\t}\n\t\t}\n\t\t.loading-text {\n\t\t\tcolor: var(--fx-text-muted);\n\t\t\tfont-size: calc(var(--fx-font-size) - 1px);\n\t\t}\n\t`;\n\n\tstatic override get observedAttributes(): string[] {\n\t\treturn [\n\t\t\t\"pagination\",\n\t\t\t\"rows\",\n\t\t\t\"rows-options\",\n\t\t\t\"striped\",\n\t\t\t\"empty-message\",\n\t\t\t\"pagination-position\",\n\t\t\t\"lazy\",\n\t\t\t\"total\",\n\t\t\t\"loading\",\n\t\t\t\"loading-message\",\n\t\t];\n\t}\n\n\tprivate _data: Record<string, unknown>[] = [];\n\tprivate _total?: number;\n\tprivate page = 0;\n\tprivate sortField = \"\";\n\tprivate sortDir: 1 | -1 = 1;\n\tprivate filters: Record<string, string> = {};\n\tprivate globalSearch = \"\";\n\tprivate _columnObserver?: MutationObserver;\n\n\tget data(): Record<string, unknown>[] {\n\t\treturn this._data;\n\t}\n\tset data(value: Record<string, unknown>[]) {\n\t\tthis._data = Array.isArray(value) ? value : [];\n\t\tthis.render();\n\t}\n\n\tget total(): number {\n\t\treturn this._total ?? this._data.length;\n\t}\n\tset total(value: number) {\n\t\tthis._total = value;\n\t\tthis.setAttribute(\"total\", String(value));\n\t}\n\n\tget rowsPerPage(): number {\n\t\tconst r = Number(this.getAttr(\"rows\", \"10\"));\n\t\treturn r > 0 ? r : 10;\n\t}\n\tset rowsPerPage(value: number) {\n\t\tthis.setAttribute(\"rows\", String(value));\n\t}\n\n\tget lazy(): boolean {\n\t\treturn this.hasAttr(\"lazy\");\n\t}\n\n\tprivate get columns(): {\n\t\tfield: string;\n\t\theader: string;\n\t\tsortable: boolean;\n\t\tfilterable: boolean;\n\t\talign: string;\n\t\ttemplate?: HTMLTemplateElement;\n\t\tdirectTemplate?: string;\n\t}[] {\n\t\treturn [...this.querySelectorAll(\"fx-column\")].map((c) => {\n\t\t\tconst tpl = c.querySelector(\"template\");\n\t\t\tconst direct = tpl ? undefined : c.innerHTML.trim();\n\t\t\tconst align = c.getAttribute(\"align\") ?? \"left\";\n\t\t\treturn {\n\t\t\t\tfield: c.getAttribute(\"field\") ?? \"\",\n\t\t\t\theader: c.getAttribute(\"header\") ?? c.getAttribute(\"field\") ?? \"\",\n\t\t\t\tsortable: c.hasAttribute(\"sortable\"),\n\t\t\t\tfilterable: c.hasAttribute(\"filterable\"),\n\t\t\t\talign: [\"left\", \"center\", \"right\", \"justify\", \"start\", \"end\"].includes(align) ? align : \"left\",\n\t\t\t\ttemplate: tpl ?? undefined,\n\t\t\t\tdirectTemplate: direct || undefined,\n\t\t\t};\n\t\t});\n\t}\n\n\tprivate get toolbarTemplate(): HTMLTemplateElement | null {\n\t\treturn this.querySelector(\n\t\t\t'template[slot=\"toolbar\"]',\n\t\t) as HTMLTemplateElement | null;\n\t}\n\n\tprotected override connectedCallback(): void {\n\t\tthis._parseDataAttribute();\n\t\tsuper.connectedCallback();\n\t\tthis._columnObserver = new MutationObserver(() => this.render());\n\t\tthis._columnObserver.observe(this, { childList: true, subtree: true });\n\t}\n\n\tprotected override disconnectedCallback(): void {\n\t\tthis._columnObserver?.disconnect();\n\t\tsuper.disconnectedCallback();\n\t}\n\n\tprivate _parseDataAttribute(): void {\n\t\tif (!this._data.length) {\n\t\t\ttry {\n\t\t\t\tconst json = this.getAttr(\"data\");\n\t\t\t\tif (json) this._data = JSON.parse(json);\n\t\t\t} catch {\n\t\t\t\t/* atributo invalido - ignora */\n\t\t\t}\n\t\t}\n\t\tconst totalAttr = this.getAttr(\"total\");\n\t\tif (totalAttr) {\n\t\t\tconst n = Number(totalAttr);\n\t\t\tif (!isNaN(n)) this._total = n;\n\t\t}\n\t}\n\n\tprivate computeRows(): { rows: Record<string, unknown>[]; total: number } {\n\t\tlet out = [...this._data];\n\n\t\tfor (const [field, term] of Object.entries(this.filters)) {\n\t\t\tif (!term) continue;\n\t\t\tconst t = term.toLowerCase();\n\t\t\tout = out.filter((r) =>\n\t\t\t\tString(r[field] ?? \"\")\n\t\t\t\t\t.toLowerCase()\n\t\t\t\t\t.includes(t),\n\t\t\t);\n\t\t}\n\n\t\tif (this.globalSearch) {\n\t\t\tconst t = this.globalSearch.toLowerCase();\n\t\t\tconst searchFields = this._getSearchFields();\n\t\t\tout = out.filter((r) => {\n\t\t\t\tconst fields = searchFields.length ? searchFields : Object.keys(r);\n\t\t\t\treturn fields.some((f) =>\n\t\t\t\t\tString(r[f] ?? \"\")\n\t\t\t\t\t\t.toLowerCase()\n\t\t\t\t\t\t.includes(t),\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\n\t\tconst total = this.lazy ? this.total : out.length;\n\n\t\tif (this.sortField) {\n\t\t\tout.sort((a, b) => {\n\t\t\t\tconst av = a[this.sortField],\n\t\t\t\t\tbv = b[this.sortField];\n\t\t\t\tif (typeof av === \"number\" && typeof bv === \"number\")\n\t\t\t\t\treturn (av - bv) * this.sortDir;\n\t\t\t\treturn (\n\t\t\t\t\tString(av ?? \"\").localeCompare(String(bv ?? \"\"), \"pt-BR\") *\n\t\t\t\t\tthis.sortDir\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\n\t\tif (this.hasAttr(\"pagination\") && !this.lazy) {\n\t\t\tconst start = this.page * this.rowsPerPage;\n\t\t\tout = out.slice(start, start + this.rowsPerPage);\n\t\t}\n\n\t\treturn { rows: out, total };\n\t}\n\n\tprivate _getSearchFields(): string[] {\n\t\tconst input = this.root.querySelector<HTMLInputElement>(\n\t\t\t\"[data-search-fields]\",\n\t\t);\n\t\tif (!input) return [];\n\t\tconst attr = input.getAttribute(\"data-search-fields\");\n\t\tif (attr === null) return [];\n\t\treturn attr\n\t\t\t.split(\",\")\n\t\t\t.map((s) => s.trim())\n\t\t\t.filter(Boolean);\n\t}\n\n\tprivate cellHtml(\n\t\tcol: {\n\t\t\tfield: string;\n\t\t\ttemplate?: HTMLTemplateElement;\n\t\t\tdirectTemplate?: string;\n\t\t},\n\t\trow: Record<string, unknown>,\n\t): string {\n\t\tconst template = col.template?.innerHTML ?? col.directTemplate;\n\t\tif (template) return renderCell(template, row, col.field);\n\t\treturn esc(String(row[col.field] ?? \"\"));\n\t}\n\n\tprotected override render(): void {\n\t\tconst cols = this.columns.filter((c) => c.field);\n\t\tconst { rows, total } = this.computeRows();\n\t\tconst paginated = this.hasAttr(\"pagination\");\n\t\tconst pages = Math.max(1, Math.ceil(total / this.rowsPerPage));\n\t\tif (this.page >= pages) this.page = pages - 1;\n\n\t\tconst toolbar = this.toolbarTemplate;\n\t\tconst toolbarHtml = toolbar\n\t\t\t? `<div class=\"toolbar\" part=\"toolbar\">${toolbar.innerHTML}</div>`\n\t\t\t: \"\";\n\n\t\tconst headHtml = cols\n\t\t\t.map((c) => {\n\t\t\t\tconst isSorted = this.sortField === c.field;\n\t\t\t\tconst ind = isSorted\n\t\t\t\t\t? this.sortDir === 1\n\t\t\t\t\t\t? \"▲\"\n\t\t\t\t\t\t: \"▼\"\n\t\t\t\t\t: c.sortable\n\t\t\t\t\t\t? \"⇅\"\n\t\t\t\t\t\t: \"\";\n\t\t\t\tconst activeClass = isSorted ? \"active\" : \"\";\n\t\t\t\treturn `<th part=\"header\" class=\"${c.sortable ? \"sortable\" : \"\"}\" style=\"text-align:${c.align}\" data-field=\"${esc(c.field)}\">${esc(c.header)}${ind ? `<span class=\"sort-ind ${activeClass}\">${ind}</span>` : \"\"}</th>`;\n\t\t\t})\n\t\t\t.join(\"\");\n\n\t\tconst filterRow = cols.some((c) => c.filterable)\n\t\t\t? `<tr class=\"filter-row\">${cols.map((c) => `<th style=\"text-align:${c.align}\">${c.filterable ? `<input class=\"filter\" data-field=\"${esc(c.field)}\" placeholder=\"${esc(\"Filtrar…\")}\" value=\"${esc(this.filters[c.field] ?? \"\")}\">` : \"\"}</th>`).join(\"\")}</tr>`\n\t\t\t: \"\";\n\n\t\tconst bodyHtml = rows.length\n\t\t\t? rows\n\t\t\t\t\t.map(\n\t\t\t\t\t\t(row, i) =>\n\t\t\t\t\t\t\t`<tr part=\"row\" data-index=\"${i}\">${cols.map((c) => `<td part=\"cell\" style=\"text-align:${c.align}\">${this.cellHtml(c, row)}</td>`).join(\"\")}</tr>`,\n\t\t\t\t\t)\n\t\t\t\t\t.join(\"\")\n\t\t\t: `<tr><td class=\"empty\" colspan=\"${cols.length || 1}\">${esc(this.getAttr(\"empty-message\", \"Nenhum registro encontrado\"))}</td></tr>`;\n\n\t\tconst pagerHtml = !paginated\n\t\t\t? \"\"\n\t\t\t: `\n <div class=\"pager\" part=\"pager\">\n <span class=\"info\">Página ${this.page + 1} de ${pages} · ${total} registros</span>\n <button type=\"button\" class=\"pg-btn\" data-pg=\"first\" ${this.page === 0 ? \"disabled\" : \"\"}>«</button>\n <button type=\"button\" class=\"pg-btn\" data-pg=\"prev\" ${this.page === 0 ? \"disabled\" : \"\"}>‹</button>\n ${Array.from({ length: pages }, (_, p) => `<button type=\"button\" class=\"pg-btn\" data-pg=\"${p}\" aria-current=\"${p === this.page}\">${p + 1}</button>`).join(\"\")}\n <button type=\"button\" class=\"pg-btn\" data-pg=\"next\" ${this.page >= pages - 1 ? \"disabled\" : \"\"}>›</button>\n <button type=\"button\" class=\"pg-btn\" data-pg=\"last\" ${this.page >= pages - 1 ? \"disabled\" : \"\"}>»</button>\n <label class=\"info\">${esc(\"Por página:\")}\n <fx-select class=\"rows-sel\" size=\"sm\" value=\"${this.rowsPerPage}\" aria-label=\"Itens por página\">${this.getAttr(\n\t\t\t\t\t\"rows-options\",\n\t\t\t\t\t\"5,10,20,50\",\n\t\t\t\t)\n\t\t\t\t\t.split(\",\")\n\t\t\t\t\t.map((n) => n.trim())\n\t\t\t\t\t.map((n) => `<option value=\"${esc(n)}\">${esc(n)}</option>`)\n\t\t\t\t\t.join(\"\")}</fx-select>\n </label>\n </div>`;\n\n\t\tconst loading = this.hasAttr(\"loading\");\n\t\tconst loadingHtml = loading\n\t\t\t? `<div class=\"loading-overlay\" part=\"loading-overlay\"><div class=\"tbl-spinner\" part=\"spinner\"></div><span class=\"loading-text\">${esc(this.getAttr(\"loading-message\", \"Carregando…\"))}</span></div>`\n\t\t\t: \"\";\n\n\t\tthis.setTemplate(`\n ${toolbarHtml}\n <div class=\"table-wrap\">\n <div class=\"scroll\">\n <table part=\"table\">\n <thead><tr>${headHtml}</tr>${filterRow}</thead>\n <tbody>${bodyHtml}</tbody>\n </table>\n </div>\n ${loadingHtml}\n </div>\n ${pagerHtml}\n `);\n\n\t\t// Ordenação.\n\t\tthis.root\n\t\t\t.querySelectorAll<HTMLTableCellElement>(\"th.sortable\")\n\t\t\t.forEach((th) => {\n\t\t\t\tth.addEventListener(\"click\", () => {\n\t\t\t\t\tconst f = th.dataset.field!;\n\t\t\t\t\tif (this.sortField === f)\n\t\t\t\t\t\tthis.sortDir = this.sortDir === 1 ? -1 : 1;\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis.sortField = f;\n\t\t\t\t\t\tthis.sortDir = 1;\n\t\t\t\t\t}\n\t\t\t\t\tthis.render();\n\t\t\t\t\tthis.dispatchEvent(\n\t\t\t\t\t\tnew CustomEvent(\"sort-change\", {\n\t\t\t\t\t\t\tbubbles: true,\n\t\t\t\t\t\t\tcomposed: true,\n\t\t\t\t\t\t\tdetail: {\n\t\t\t\t\t\t\t\tfield: this.sortField,\n\t\t\t\t\t\t\t\tdirection: this.sortDir === 1 ? \"asc\" : \"desc\",\n\t\t\t\t\t\t\t\tlazy: this.lazy,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t});\n\n\t\t// Filtros (preserva foco/caret ao digitar).\n\t\tthis.root.querySelectorAll<HTMLInputElement>(\".filter\").forEach((inp) => {\n\t\t\tinp.addEventListener(\"input\", () => {\n\t\t\t\tconst field = inp.dataset.field!;\n\t\t\t\tconst value = inp.value;\n\t\t\t\tconst pos = inp.selectionStart;\n\t\t\t\tthis.filters[field] = value;\n\t\t\t\tthis.page = 0;\n\t\t\t\tthis.render();\n\t\t\t\tthis.dispatchEvent(\n\t\t\t\t\tnew CustomEvent(\"filter-change\", {\n\t\t\t\t\t\tbubbles: true,\n\t\t\t\t\t\tcomposed: true,\n\t\t\t\t\t\tdetail: { field, value, lazy: this.lazy },\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\tconst again = this.root.querySelector<HTMLInputElement>(\n\t\t\t\t\t`.filter[data-field=\"${esc(field)}\"]`,\n\t\t\t\t);\n\t\t\t\tif (again) {\n\t\t\t\t\tagain.focus();\n\t\t\t\t\tagain.setSelectionRange(pos, pos);\n\t\t\t\t}\n\t\t\t});\n\t\t\tinp.addEventListener(\"click\", (e) => e.stopPropagation());\n\t\t});\n\n\t\t// Busca global da toolbar.\n\t\tthis.root\n\t\t\t.querySelectorAll<HTMLInputElement>(\"[data-search-fields]\")\n\t\t\t.forEach((inp) => {\n\t\t\t\tinp.addEventListener(\"input\", () => {\n\t\t\t\t\tthis.globalSearch = inp.value;\n\t\t\t\t\tthis.page = 0;\n\t\t\t\t\tconst pos = inp.selectionStart;\n\t\t\t\t\tthis.render();\n\t\t\t\t\tconst again = this.root.querySelector<HTMLInputElement>(\n\t\t\t\t\t\t\"[data-search-fields]\",\n\t\t\t\t\t);\n\t\t\t\t\tif (again) {\n\t\t\t\t\t\tagain.focus();\n\t\t\t\t\t\tagain.setSelectionRange(pos, pos);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\n\t\t// Paginação.\n\t\tthis.root\n\t\t\t.querySelectorAll<HTMLButtonElement>(\".pg-btn\")\n\t\t\t.forEach((btn) => {\n\t\t\t\tbtn.addEventListener(\"click\", () => {\n\t\t\t\t\tconst pg = btn.dataset.pg!;\n\t\t\t\t\tthis.page =\n\t\t\t\t\t\tpg === \"first\"\n\t\t\t\t\t\t\t? 0\n\t\t\t\t\t\t\t: pg === \"prev\"\n\t\t\t\t\t\t\t\t? Math.max(0, this.page - 1)\n\t\t\t\t\t\t\t\t: pg === \"next\"\n\t\t\t\t\t\t\t\t\t? Math.min(pages - 1, this.page + 1)\n\t\t\t\t\t\t\t\t\t: pg === \"last\"\n\t\t\t\t\t\t\t\t\t\t? pages - 1\n\t\t\t\t\t\t\t\t\t\t: Number(pg);\n\t\t\t\t\tthis.render();\n\t\t\t\t\tthis.dispatchEvent(\n\t\t\t\t\t\tnew CustomEvent(\"page-change\", {\n\t\t\t\t\t\t\tbubbles: true,\n\t\t\t\t\t\t\tcomposed: true,\n\t\t\t\t\t\t\tdetail: {\n\t\t\t\t\t\t\t\tpage: this.page + 1,\n\t\t\t\t\t\t\t\tpages,\n\t\t\t\t\t\t\t\trowsPerPage: this.rowsPerPage,\n\t\t\t\t\t\t\t\ttotal,\n\t\t\t\t\t\t\t\tlazy: this.lazy,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t});\n\t\tthis.root\n\t\t\t.querySelector<HTMLElement>(\"fx-select.rows-sel\")\n\t\t\t?.addEventListener(\"change\", (e) => {\n\t\t\t\tconst value = Number((e as CustomEvent).detail?.value);\n\t\t\t\tif (!value || value === this.rowsPerPage) return;\n\t\t\t\tthis.rowsPerPage = value;\n\t\t\t\tthis.page = 0;\n\t\t\t\tthis.render();\n\t\t\t});\n\n\t\t// Clique na linha.\n\t\tthis.root\n\t\t\t.querySelectorAll<HTMLTableRowElement>(\"tbody tr[data-index]\")\n\t\t\t.forEach((tr) => {\n\t\t\t\ttr.addEventListener(\"click\", () => {\n\t\t\t\t\tthis.dispatchEvent(\n\t\t\t\t\t\tnew CustomEvent(\"row-click\", {\n\t\t\t\t\t\t\tbubbles: true,\n\t\t\t\t\t\t\tcomposed: true,\n\t\t\t\t\t\t\tdetail: {\n\t\t\t\t\t\t\t\trow: rows[Number(tr.dataset.index)],\n\t\t\t\t\t\t\t\tindex: Number(tr.dataset.index),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t});\n\n\t\tthis._restoreToolbarSearch();\n\t}\n\n\tprivate _restoreToolbarSearch(): void {\n\t\tconst input = this.root.querySelector<HTMLInputElement>(\n\t\t\t\"[data-search-fields]\",\n\t\t);\n\t\tif (input && this.globalSearch) input.value = this.globalSearch;\n\t}\n}\n\nexport function defineFxTable(): typeof FxTable {\n return defineElement('fx-table', FxTable);\n}\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\", \"full\", \"icon\", \"icon-pos\"];\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/* Full width: o host estica até o pai; o controle interno com\n\t\t atributo full (ou largura herdada) acompanha. */\n\t\t:host([full]) {\n\t\t\tdisplay: block;\n\t\t\twidth: 100%;\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=\"in\" com ícone dentro do campo (fx-input icon):\n\t\t enquanto a label funciona como placeholder (sem foco/valor), ela\n\t\t começa DEPOIS do glifo (mesma métrica de padding do fx-input).\n\t\t Ao subir (active), volta ao offset padrão da borda. ---- */\n\t\t:host([variant=\"in\"]) .flabel.icon-indent {\n\t\t\tleft: calc(\n\t\t\t\tvar(--fx-space-md, 12px) +\n\t\t\t\tvar(--fx-input-icon-size, calc(var(--fx-font-size, 14px) + 6px)) +\n\t\t\t\tvar(--fx-space-sm, 8px)\n\t\t\t);\n\t\t}\n\t\t:host([variant=\"in\"][active]) .flabel.icon-indent {\n\t\t\tleft: var(--fx-space-md, 12px);\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\tthis.applyFull();\n\t\tthis.applyIcon();\n\t\tthis.syncIconIndent();\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\tthis.applyFull();\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(() => {\n\t\t\t\t\tthis.syncState();\n\t\t\t\t\tthis.syncIconIndent();\n\t\t\t\t});\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\", \"icon\", \"icon-pos\"],\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\t/**\n\t * variant=\"in\" + ícone à esquerda dentro do campo (fx-input icon):\n\t * enquanto a label é placeholder ela precisa começar depois do glifo.\n\t * Detecta via atributos icon/icon-pos (ou slot icon) do controle.\n\t */\n\tprivate syncIconIndent(): void {\n\t\tconst label = this.root.querySelector(\".flabel\");\n\t\tif (!label) return;\n\t\tconst c = this.targetControl;\n\t\tconst hasLeftIcon = Boolean(\n\t\t\tc &&\n\t\t\t(c.hasAttribute(\"icon\") || c.querySelector(':scope > [slot=\"icon\"]')) &&\n\t\t\tc.getAttribute(\"icon-pos\") !== \"right\",\n\t\t);\n\t\tlabel.classList.toggle(\"icon-indent\", hasLeftIcon);\n\t}\n\n\tprivate applyFull(): void {\n\t\t// Espelha o full no controle interno: o CSS :host([full]) do floatlabel\n\t\t// estica apenas o HOST — sem isso o campo interno (ex.: fx-input com\n\t\t// width 260px fixa) não acompanharia o container.\n\t\tif (\n\t\t\tthis.targetControl &&\n\t\t\ttypeof this.targetControl.setAttribute === \"function\"\n\t\t) {\n\t\t\tif (this.hasAttr(\"full\")) {\n\t\t\t\tthis.targetControl.setAttribute(\"full\", \"\");\n\t\t\t} else {\n\t\t\t\tthis.targetControl.removeAttribute(\"full\");\n\t\t\t}\n\t\t\t}\n\t}\n\n\tprivate applyIcon(): void {\n\t\tif (\n\t\t\tthis.targetControl &&\n\t\t\ttypeof this.targetControl.setAttribute === \"function\"\n\t\t) {\n\t\t\t// Só propaga icon/icon-pos se o FLOATLABEL possuir o atributo.\n\t\t\t// Se o ícone foi pondo diretamente no controle (ex.: <fx-input icon=\"lock\">),\n\t\t\t// não remove — deixa o controle manter o seu próprio ícone.\n\t\t\tif (this.hasAttr(\"icon\")) {\n\t\t\t\tconst icon = this.getAttr(\"icon\");\n\t\t\t\tconst iconPos = this.getAttr(\"icon-pos\");\n\t\t\t\tif (icon !== \"\") this.targetControl.setAttribute(\"icon\", icon);\n\t\t\t\telse this.targetControl.setAttribute(\"icon\", \"\");\n\t\t\t\tif (iconPos && iconPos !== \"left\") this.targetControl.setAttribute(\"icon-pos\", iconPos);\n\t\t\t\telse this.targetControl.removeAttribute(\"icon-pos\");\n\t\t\t}\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';\nimport { esc } from '../../core/sanitize';\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 /* Largura padrão no HOST: CSS externo, classes e style inline no elemento\n vencem este default naturalmente (regras do documento > :host). */\n width: var(--fx-textarea-width, 260px);\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 /* Altura determinística: a caixa fica EXATAMENTE no token --fx-size-*. */\n line-height: var(--fx-font-line-height);\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 /* Acompanha a largura definida no :host. */\n width: 100%;\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 /* Validação: borda sempre; brilho (anel) via token que acompanha\n effect.focus-ring — desligado ⇒ erro só com a borda vermelha. */\n :host([error]) .field, :host([invalid]) .field {\n border-color: var(--fx-color-danger, #dc2626);\n box-shadow: var(--fx-effect-error-ring, 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: var(--fx-effect-success-ring, 0 0 0 3px color-mix(in srgb, var(--fx-color-success, #16a34a) 18%, transparent));\n }\n :host([size='sm']) { width: var(--fx-textarea-width-sm, 220px); }\n :host([size='sm']) .field { min-height: var(--fx-size-sm); padding: var(--fx-space-xs) var(--fx-space-md); }\n :host([size='lg']) { width: var(--fx-textarea-width-lg, 300px); }\n :host([size='lg']) .field { min-height: calc(var(--fx-size-lg) + 80px); }\n /* Full width: o host estica até o pai e o campo interno acompanha. */\n :host([full]) { display: block; width: 100%; }\n :host([full]) .field { width: 100%; }\n `;\n\n static override get observedAttributes(): string[] {\n return ['size', 'placeholder', 'disabled', 'readonly', 'rows', 'maxlength', 'error', 'invalid', 'success', 'valid'];\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=\"${esc(placeholder)}\"` : ''}\n ${rows ? `rows=\"${esc(rows)}\"` : ''}\n ${maxlength ? `maxlength=\"${esc(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\n\n","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\nimport { esc } from '../../core/sanitize';\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 /* Largura customizável por instância: defina --fx-dialog-width no elemento. */\n width: min(var(--fx-dialog-width, 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(var(--fx-dialog-width, 400px), calc(100vw - 32px)); }\n :host([size='lg']) .dialog { width: min(var(--fx-dialog-width, 800px), calc(100vw - 32px)); }\n /* Mobile: dialog ocupa praticamente toda a largura da tela. */\n @media (max-width: 640px) {\n .dialog, :host([size='sm']) .dialog, :host([size='lg']) .dialog {\n width: calc(100vw - 16px);\n max-width: calc(100vw - 16px);\n }\n }\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=\"${esc(heading)}\" tabindex=\"-1\">\n <header>\n <h2>${esc(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 // Evita listeners duplicados em re-renders enquanto aberto\n // (ex.: mudança de heading/size com o dialog aberto sobrescreveria\n // o _cleanup anterior, deixando listeners de document órfãos).\n this._cleanup?.();\n this._cleanup = undefined;\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._cleanup?.();\n this._cleanup = undefined;\n this._restoreFocus();\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 preso no diálogo\n const onKey = (e: KeyboardEvent): void => {\n if (e.key === 'Escape') { e.stopPropagation(); close(); return; }\n if (e.key === 'Tab') this._trapFocus(e);\n };\n document.addEventListener('keydown', onKey);\n this._cleanup = () => document.removeEventListener('keydown', onKey);\n\n requestAnimationFrame(() => {\n this._previouslyFocused = document.activeElement as HTMLElement | null;\n this.root.querySelector<HTMLElement>('.dialog')?.focus();\n });\n this.dispatchEvent(new CustomEvent('open', { bubbles: true, composed: true }));\n }\n\n private _cleanup?: () => void;\n private _previouslyFocused: HTMLElement | null = null;\n\n /** Mantém o foco dentro do modal (WCAG 2.4.3 / 2.1.2). */\n private _trapFocus(e: KeyboardEvent): void {\n const dialog = this.root.querySelector<HTMLElement>('.dialog');\n if (!dialog) return;\n const focusables = dialog.querySelectorAll<HTMLElement>(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])',\n );\n if (!focusables.length) return;\n const first = focusables[0];\n const last = focusables[focusables.length - 1];\n const active = this.root.activeElement;\n if (e.shiftKey && (active === first || active === dialog)) {\n e.preventDefault();\n last.focus();\n } else if (!e.shiftKey && active === last) {\n e.preventDefault();\n first.focus();\n }\n }\n\n private _restoreFocus(): void {\n if (this._previouslyFocused?.isConnected) this._previouslyFocused.focus();\n this._previouslyFocused = null;\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this._cleanup?.();\n this._cleanup = undefined;\n this._restoreFocus();\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\n\n","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\nimport { esc } from '../../core/sanitize';\nimport { FENIX_ICON_BASE_CSS, isFenixIconName } from '../../icons/base-css';\n\n/**\n * <fx-confirmpopup> — Popup de confirmação não-modal ancorado em um elemento,\n * exibido acima ou abaixo dinamicamente (com flip automático quando não há\n * espaço na viewport), no estilo ConfirmPopup do PrimeVue.\n *\n * Atributos:\n * - target (seletor CSS do elemento âncora — obrigatório para abrir);\n * - message (texto da mensagem, quando o slot padrão não é usado);\n * - icon (emoji/glifo exibido antes da mensagem; se for um nome da Fenix Icons,\n * ex.: icon=\"help\", é renderizado com a fonte de ícones);\n * - accept-label / reject-label (textos dos botões padrão);\n * - position (top|bottom|auto — padrão `auto`, que faz flip conforme o espaço);\n * - open (exibe o popup).\n *\n * Slots:\n * - padrão: corpo da mensagem (template \"message\");\n * - `accept`: conteúdo do botão de confirmação (template \"accept\");\n * - `reject`: conteúdo do botão de rejeição (template \"reject\").\n *\n * Eventos (composed): `accept` e `reject` — ambos fecham o popup.\n */\nexport class FxConfirmPopup extends FxElement {\n static override styles = css`\n :host { display: contents; }\n .popup {\n position: fixed;\n margin: 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 padding: var(--fx-space-md) var(--fx-space-lg);\n min-width: 220px;\n max-width: min(380px, calc(100vw - 24px));\n font-family: var(--fx-font-family);\n font-size: var(--fx-font-size);\n color: var(--fx-text-default);\n z-index: var(--fx-z-modal, 1100);\n animation: fxcp-pop var(--fx-motion-duration-fast, 150ms) var(--fx-motion-easing, ease);\n }\n .popup[hidden] { display: none; }\n @keyframes fxcp-pop { from { opacity: 0; transform: scale(0.96); } to { opacity: 1; transform: scale(1); } }\n /* seta indicadora */\n .popup::before {\n content: '';\n position: absolute;\n left: var(--fxcp-arrow-x, 50%);\n border: 7px solid transparent;\n }\n .popup[data-side='bottom']::before {\n top: -14px;\n border-bottom-color: var(--fx-border-default);\n }\n .popup[data-side='top']::before {\n bottom: -14px;\n border-top-color: var(--fx-border-default);\n }\n .popup::after {\n content: '';\n position: absolute;\n left: var(--fxcp-arrow-x, 50%);\n border: 6px solid transparent;\n }\n .popup[data-side='bottom']::after {\n top: -12px;\n border-bottom-color: var(--fx-surface-background);\n }\n .popup[data-side='top']::after {\n bottom: -12px;\n border-top-color: var(--fx-surface-background);\n }\n .message {\n display: flex;\n align-items: flex-start;\n gap: var(--fx-space-sm);\n }\n .icon { font-size: calc(var(--fx-font-size) + 4px); line-height: 1.2; }\n ${FENIX_ICON_BASE_CSS}\n .icon.fx-icon { font-size: calc(var(--fx-font-size) + 6px); color: var(--fx-color-primary); }\n .text { margin: 0; }\n footer {\n display: flex;\n justify-content: flex-end;\n gap: var(--fx-space-sm);\n margin-top: var(--fx-space-md);\n }\n footer button {\n font-family: var(--fx-font-family);\n font-size: calc(var(--fx-font-size) - 2px);\n padding: var(--fx-space-xs) var(--fx-space-md);\n border-radius: var(--fx-radius-sm);\n border: 1px solid var(--fx-border-default);\n background: var(--fx-surface-background);\n color: var(--fx-text-default);\n cursor: pointer;\n transition: background var(--fx-motion-duration-fast) var(--fx-motion-easing);\n }\n footer button:hover { background: var(--fx-surface-surface-hover, rgba(0, 0, 0, 0.04)); }\n footer button.accept {\n background: var(--fx-color-primary);\n border-color: var(--fx-color-primary);\n color: #fff;\n }\n footer button.accept:hover { filter: brightness(0.92); background: var(--fx-color-primary); }\n `;\n\n static override get observedAttributes(): string[] {\n return ['open', 'target', 'message', 'icon', 'accept-label', 'reject-label', 'position'];\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 message = this.getAttr('message');\n const icon = this.getAttr('icon');\n const iconIsFx = isFenixIconName(icon);\n if (iconIsFx) void import('../../icons');\n const acceptLabel = this.getAttr('accept-label', 'Sim');\n const rejectLabel = this.getAttr('reject-label', 'Não');\n\n this.setTemplate(`\n <div class=\"popup\" part=\"popup\" role=\"alertdialog\" aria-modal=\"false\" ${this.open ? '' : 'hidden'}>\n <div class=\"message\" part=\"message\">\n ${icon ? `<span class=\"icon${iconIsFx ? ' fx-icon' : ''}\" aria-hidden=\"true\">${esc(icon)}</span>` : ''}\n <p class=\"text\"><slot>${esc(message)}</slot></p>\n </div>\n <footer part=\"footer\">\n <slot name=\"reject\">\n <button type=\"button\" class=\"reject\" part=\"reject-button\">${esc(rejectLabel)}</button>\n </slot>\n <slot name=\"accept\">\n <button type=\"button\" class=\"accept\" part=\"accept-button\">${esc(acceptLabel)}</button>\n </slot>\n </footer>\n </div>\n `);\n\n if (!this.open) return;\n\n const popup = this.root.querySelector<HTMLElement>('.popup');\n if (!popup) return;\n\n // Evita listeners duplicados em re-renders enquanto aberto\n // (ex.: mudança de message/icon/accept-label com o popup aberto).\n this._cleanup?.();\n this._cleanup = undefined;\n\n const close = (event: 'accept' | 'reject'): void => {\n this.open = false;\n this._cleanup?.();\n this._cleanup = undefined;\n this._restoreFocus();\n this.dispatchEvent(new CustomEvent(event, { bubbles: true, composed: true }));\n };\n\n this.root.querySelector('.reject')?.addEventListener('click', () => close('reject'));\n this.root.querySelector('.accept')?.addEventListener('click', () => close('accept'));\n\n // ESC fecha (reject) — clique fora fecha (reject)\n const onKey = (e: KeyboardEvent): void => {\n if (e.key === 'Escape') { e.stopPropagation(); close('reject'); }\n };\n const onPointerDown = (e: MouseEvent): void => {\n const path = e.composedPath();\n const anchor = this._anchor();\n const hitAnchor = anchor ? path.includes(anchor) : false;\n if (!path.includes(popup) && !hitAnchor) close('reject');\n };\n document.addEventListener('keydown', onKey);\n document.addEventListener('pointerdown', onPointerDown, true);\n this._cleanup = () => {\n document.removeEventListener('keydown', onKey);\n document.removeEventListener('pointerdown', onPointerDown, true);\n };\n\n this._position(popup);\n this._previouslyFocused = document.activeElement as HTMLElement | null;\n requestAnimationFrame(() => {\n this.root.querySelector<HTMLElement>('button.accept')?.focus();\n });\n }\n\n private _cleanup?: () => void;\n private _previouslyFocused: HTMLElement | null = null;\n\n private _anchor(): HTMLElement | null {\n const selector = this.getAttr('target');\n if (!selector) return null;\n try {\n return document.querySelector<HTMLElement>(selector);\n } catch {\n return null;\n }\n }\n\n /**\n * Posiciona o popup fixo junto ao âncora, acima ou abaixo dinamicamente:\n * `position=\"auto\"` (padrão) prefere abaixo e faz flip para cima quando\n * não há espaço; `top`/`bottom` forçam o lado.\n */\n private _position(popup: HTMLElement): void {\n const anchor = this._anchor();\n if (!anchor) return;\n popup.hidden = false;\n\n const a = anchor.getBoundingClientRect();\n const p = popup.getBoundingClientRect();\n const gap = 8;\n const margin = 8;\n\n let side: 'top' | 'bottom';\n const pos = this.getAttr('position', 'auto');\n if (pos === 'top') side = 'top';\n else if (pos === 'bottom') side = 'bottom';\n else side = a.bottom + gap + p.height <= window.innerHeight - margin ? 'bottom' : 'top';\n\n // clamp horizontal para nunca sair da viewport\n const left = Math.min(\n Math.max(margin, a.left + a.width / 2 - p.width / 2),\n window.innerWidth - p.width - margin,\n );\n const top = side === 'bottom' ? a.bottom + gap : a.top - gap - p.height;\n\n popup.dataset.side = side;\n popup.style.left = `${Math.round(left)}px`;\n popup.style.top = `${Math.round(Math.max(margin, top))}px`;\n // posição da seta relativa ao popup\n const arrowX = Math.min(Math.max(a.left + a.width / 2 - left, 16), p.width - 16);\n popup.style.setProperty('--fxcp-arrow-x', `${Math.round(arrowX)}px`);\n }\n\n private _restoreFocus(): void {\n if (this._previouslyFocused?.isConnected) this._previouslyFocused.focus();\n this._previouslyFocused = null;\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n // reposiciona em scroll/resize enquanto aberto\n window.addEventListener('scroll', this._onReposition, true);\n window.addEventListener('resize', this._onReposition);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n window.removeEventListener('scroll', this._onReposition, true);\n window.removeEventListener('resize', this._onReposition);\n this._cleanup?.();\n this._cleanup = undefined;\n this._restoreFocus();\n }\n\n private _onReposition = (): void => {\n if (!this.open) return;\n const popup = this.root.querySelector<HTMLElement>('.popup');\n if (popup && !popup.hidden) this._position(popup);\n };\n}\n\nexport function defineFxConfirmPopup(): typeof FxConfirmPopup {\n return defineElement('fx-confirmpopup', FxConfirmPopup);\n}\n\n","import { FxConfirmPopup, defineFxConfirmPopup } from './confirmpopup';\n\nexport { FxConfirmPopup };\n\ndefineFxConfirmPopup();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'fx-confirmpopup': FxConfirmPopup;\n }\n}\n","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\nimport { esc } from '../../core/sanitize';\nimport { FENIX_ICON_BASE_CSS, fenixIconHtml } from '../../icons/base-css';\n\n/**\n * <fx-fileupload> — Seletor de arquivos com upload e progresso.\n *\n * Atributos:\n * - mode (basic|advanced — `basic`: botão; `advanced`: dropzone com drag & drop);\n * - size (sm|md|lg, padrão md);\n * - severity (primary|secondary|success|warning|danger|info — cor do botão no modo basic);\n * - label (texto do botão/área, padrão 'Escolher arquivo');\n * - icon (glifo/emoji exibido antes do texto — sem o atributo, sem ícone);\n * - accept, multiple, disabled (como no <input type=\"file\">);\n * - show-progress (exibe barra + % de upload);\n * - progress (0-100 — o consumidor atualiza durante o upload real);\n * - value (nome(s) do(s) arquivo(s) carregado(s), somente leitura/espelho).\n *\n * Eventos (composed): `select` (detail: { files: File[] }), `remove`, `complete`.\n */\nexport class FxFileUpload 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 }\n :host([disabled]) { opacity: 0.55; pointer-events: none; }\n input[type='file'] { display: none; }\n\n /* ---- botão (basic) ---- */\n .btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--fx-space-sm);\n /* Largura acompanha o host: CSS externo/classe/inline no elemento esticam\n o botão sem precisar do full (host é shrink-to-fit por padrão). */\n width: 100%;\n min-height: var(--fx-size-md);\n /* Padding vertical no orçamento do token --fx-size-* ⇒ altura padrão. */\n padding: var(--fx-space-sm) var(--fx-space-lg);\n font-family: inherit;\n font-size: inherit;\n font-weight: var(--fx-font-weight);\n line-height: var(--fx-font-line-height);\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 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 background var(--fx-motion-duration-normal) var(--fx-motion-easing);\n }\n .btn:hover { border-color: var(--fx-border-hover); background: var(--fx-surface-surface-hover, rgba(0,0,0,0.03)); }\n .btn:focus-visible {\n outline: none;\n border-color: var(--fx-color-primary);\n box-shadow: var(--fx-effect-focus-ring, none);\n }\n /* Severities (como no <fx-button>) — aplicam-se ao botão do modo basic */\n :host([severity='primary']) .btn { background: var(--fx-color-primary); border-color: transparent; color: #fff; }\n :host([severity='secondary']) .btn { background: var(--fx-color-secondary); border-color: transparent; color: #fff; }\n :host([severity='success']) .btn { background: var(--fx-color-success); border-color: transparent; color: #fff; }\n :host([severity='warning']) .btn { background: var(--fx-color-warning); border-color: transparent; color: #fff; }\n :host([severity='danger']) .btn { background: var(--fx-color-danger); border-color: transparent; color: #fff; }\n :host([severity='info']) .btn { background: var(--fx-color-info); border-color: transparent; color: #fff; }\n :host([severity]) .btn:hover { filter: brightness(0.88); }\n :host([severity]) .btn:focus-visible { border-color: transparent; }\n :host([size='sm']) .btn { min-height: var(--fx-size-sm); padding: var(--fx-space-xs) var(--fx-space-md); font-size: calc(var(--fx-font-size) - 2px); }\n :host([size='lg']) .btn { min-height: var(--fx-size-lg); padding: var(--fx-space-sm) var(--fx-space-xl); font-size: calc(var(--fx-font-size) + 4px); }\n :host([size='sm']) .drop { min-height: 72px; }\n :host([size='lg']) .drop { min-height: 132px; }\n\n /* ---- dropzone (advanced) ---- */\n .drop {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: var(--fx-space-sm);\n /* Acompanha a largura do host (definida por CSS externo/classe/inline). */\n width: 100%;\n min-height: 100px;\n padding: var(--fx-space-lg);\n border: 2px dashed var(--fx-border-default);\n border-radius: var(--fx-radius-md);\n color: var(--fx-text-muted);\n cursor: pointer;\n text-align: center;\n transition: border-color var(--fx-motion-duration-normal) var(--fx-motion-easing), background var(--fx-motion-duration-normal) var(--fx-motion-easing);\n }\n .drop:hover, .drop.over {\n border-color: var(--fx-color-primary);\n background: color-mix(in srgb, var(--fx-color-primary) 6%, transparent);\n }\n .drop .icon { font-size: calc(var(--fx-font-size) + 12px); line-height: 1; }\n .drop .hint { font-size: calc(var(--fx-font-size) - 2px); }\n\n /* ---- ícone comum ---- */\n .icon { line-height: 1; }\n\n /* ---- arquivo(s) selecionado(s) ---- */\n .files { display: flex; flex-direction: column; gap: var(--fx-space-xs); margin-top: var(--fx-space-sm); }\n .file {\n display: flex;\n align-items: center;\n gap: var(--fx-space-sm);\n padding: var(--fx-space-xs) var(--fx-space-sm);\n border: 1px solid var(--fx-border-default);\n border-radius: var(--fx-radius-sm);\n font-size: calc(var(--fx-font-size) - 2px);\n color: var(--fx-text-default);\n }\n .file .name { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n .file .size { color: var(--fx-text-muted); white-space: nowrap; }\n .file .remove {\n border: none;\n background: transparent;\n color: var(--fx-text-muted);\n cursor: pointer;\n font-size: calc(var(--fx-font-size) + 2px);\n line-height: 1;\n padding: 0 var(--fx-space-xs);\n border-radius: var(--fx-radius-full);\n }\n .file .remove:hover { color: var(--fx-color-danger); }\n\n /* ---- progresso ---- */\n .progress-row { display: flex; align-items: center; gap: var(--fx-space-sm); margin-top: var(--fx-space-sm); }\n .track {\n flex: 1;\n height: 6px;\n background: var(--fx-surface-surface-hover);\n border-radius: var(--fx-radius-full);\n overflow: hidden;\n }\n .bar {\n height: 100%;\n width: 0%;\n background: var(--fx-color-primary);\n border-radius: var(--fx-radius-full);\n transition: width var(--fx-motion-duration-normal) var(--fx-motion-easing);\n }\n :host([progress='100']) .bar { background: var(--fx-color-success); }\n .pct {\n font-size: calc(var(--fx-font-size) - 2px);\n font-weight: 600;\n color: var(--fx-text-default);\n min-width: 34px;\n text-align: right;\n }\n /* Full width: o host estica até o pai e o botão/dropzone acompanha. */\n :host([full]) { display: block; width: 100%; }\n :host([full]) .btn { width: 100%; }\n :host([full]) .drop { width: 100%; }\n /* Base dos glifos Fenix Icons (o @font-face vem de @wrrdev/fenix-ui/icons). */\n ${FENIX_ICON_BASE_CSS}\n `;\n\n static override get observedAttributes(): string[] {\n return ['mode', 'size', 'severity', 'label', 'icon', 'accept', 'multiple', 'disabled', 'show-progress', 'progress', 'value', 'full'];\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 /** Nomes dos arquivos selecionados (espelho em `value`). */\n get value(): string { return this.getAttr('value'); }\n set value(v: string) { this.setAttribute('value', v); }\n\n get progress(): number { return Math.min(100, Math.max(0, Number(this.getAttr('progress', '0')) || 0)); }\n set progress(v: number) { this.setAttribute('progress', String(v)); }\n\n /** Arquivos selecionados (não serializável em atributo). */\n get files(): File[] { return this._files; }\n set files(files: File[]) {\n this._files = Array.from(files);\n this.value = this._files.map((f) => f.name).join(', ');\n this._syncFilesArea();\n }\n\n protected override render(): void {\n const mode = this.getAttr('mode', 'basic');\n const advanced = mode === 'advanced';\n const label = this.getAttr('label', 'Escolher arquivo');\n const icon = this.getAttr('icon');\n const accept = this.getAttr('accept');\n const multiple = this.hasAttr('multiple');\n const disabled = this.hasAttr('disabled');\n const showProgress = this.hasAttr('show-progress');\n const pct = this.progress;\n\n const fileInput = `<input type=\"file\" class=\"picker\" ${accept ? `accept=\"${esc(accept)}\"` : ''} ${multiple ? 'multiple' : ''} ${disabled ? 'disabled' : ''} />`;\n\n this.setTemplate(`\n ${advanced\n ? `<div class=\"drop\" part=\"dropzone\" role=\"button\" tabindex=\"0\" aria-label=\"${esc(label)}\">\n ${icon ? `<span class=\"icon\" part=\"icon\" aria-hidden=\"true\">${fenixIconHtml(icon)}</span>` : ''}\n <span>${esc(label)}</span>\n <span class=\"hint\">ou arraste e solte aqui</span>\n </div>`\n : `<button type=\"button\" class=\"btn\" part=\"button\">\n ${icon ? `<span class=\"icon\" part=\"icon\" aria-hidden=\"true\">${fenixIconHtml(icon)}</span>` : ''}\n <span>${esc(label)}</span>\n </button>`}\n ${fileInput}\n <div class=\"files\" part=\"files\"></div>\n ${showProgress ? `\n <div class=\"progress-row\" part=\"progress\">\n <div class=\"track\" role=\"progressbar\" aria-valuenow=\"${pct}\" aria-valuemin=\"0\" aria-valuemax=\"100\">\n <div class=\"bar\" style=\"width: ${pct}%\"></div>\n </div>\n <span class=\"pct\">${pct}%</span>\n </div>` : ''}\n `);\n\n this._bindPicker();\n this._syncFilesArea();\n\n if (!this._done && showProgress && pct >= 100 && this._files.length) {\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 _files: File[] = [];\n private _done = false;\n\n private _picker(): HTMLInputElement | null {\n return this.root.querySelector<HTMLInputElement>('.picker');\n }\n\n private _bindPicker(): void {\n const picker = this._picker();\n if (!picker) return;\n const trigger = this.root.querySelector('.btn') ?? this.root.querySelector('.drop');\n trigger?.addEventListener('click', () => picker.click());\n trigger?.addEventListener('keydown', (e) => {\n if ((e as KeyboardEvent).key === 'Enter' || (e as KeyboardEvent).key === ' ') {\n e.preventDefault();\n picker.click();\n }\n });\n picker.addEventListener('change', () => this._acceptFiles(picker.files ?? []));\n\n // drag & drop (advanced)\n const drop = this.root.querySelector<HTMLElement>('.drop');\n if (!drop) return;\n drop.addEventListener('dragover', (e) => { e.preventDefault(); drop.classList.add('over'); });\n drop.addEventListener('dragleave', () => drop.classList.remove('over'));\n drop.addEventListener('drop', (e) => {\n e.preventDefault();\n drop.classList.remove('over');\n if (e.dataTransfer?.files.length) this._acceptFiles(e.dataTransfer.files);\n });\n }\n\n private _acceptFiles(list: FileList | File[]): void {\n const picked = this.hasAttr('multiple') ? Array.from(list) : [list[0]].filter(Boolean);\n this.files = picked;\n const picker = this._picker();\n if (picker) picker.value = '';\n this.dispatchEvent(\n new CustomEvent('select', { bubbles: true, composed: true, detail: { files: picked } }),\n );\n }\n\n private _fmtSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n }\n\n /** Renderiza a lista de arquivos sem re-renderizar o template (mantém estado). */\n private _syncFilesArea(): void {\n const area = this.root?.querySelector?.('.files') as HTMLElement | null;\n if (!area) return;\n area.innerHTML = this._files\n .map(\n (f, i) => `\n <div class=\"file\" part=\"file\">\n <span class=\"name\">${esc(f.name)}</span>\n <span class=\"size\">${this._fmtSize(f.size)}</span>\n <button type=\"button\" class=\"remove\" data-i=\"${i}\" part=\"remove\" aria-label=\"Remover ${esc(f.name)}\">×</button>\n </div>`,\n )\n .join('');\n area.querySelectorAll<HTMLButtonElement>('.remove').forEach((btn) =>\n btn.addEventListener('click', () => {\n const removed = this._files.splice(Number(btn.dataset.i), 1)[0];\n this.value = this._files.map((f) => f.name).join(', ');\n this.progress = 0;\n this._syncFilesArea();\n this.dispatchEvent(\n new CustomEvent('remove', { bubbles: true, composed: true, detail: { file: removed } }),\n );\n }),\n );\n }\n}\n\nexport function defineFxFileUpload(): typeof FxFileUpload {\n return defineElement('fx-fileupload', FxFileUpload);\n}\n\n\n","import { FxFileUpload, defineFxFileUpload } from './fileupload';\n\nexport { FxFileUpload };\n\ndefineFxFileUpload();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'fx-fileupload': FxFileUpload;\n }\n}\n","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\n\n/**\n * <fx-slider> — Controle deslizante para seleção de valor numérico em um intervalo.\n *\n * Atributos: min, max, step, value, size (sm|md|lg), disabled, show-value,\n * label (rótulo acima do trilho).\n * Eventos (composed): `input` (durante o arraste) e `change` (ao soltar) —\n * ambos com `detail: { value: number }`.\n */\nexport class FxSlider 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 --_track-h: 6px;\n --_thumb: 18px;\n }\n :host([size='sm']) { --_track-h: 4px; --_thumb: 14px; }\n :host([size='lg']) { --_track-h: 8px; --_thumb: 22px; }\n :host([disabled]) { opacity: 0.55; pointer-events: none; }\n\n .label {\n font-size: calc(var(--fx-font-size) - 2px);\n color: var(--fx-text-muted);\n margin-bottom: var(--fx-space-xs);\n display: flex;\n justify-content: space-between;\n gap: var(--fx-space-md);\n align-items: center;\n }\n .track-wrap {\n position: relative;\n display: flex;\n align-items: center;\n height: var(--_thumb);\n cursor: pointer;\n touch-action: none;\n }\n .track {\n width: 100%;\n height: var(--_track-h);\n border-radius: var(--fx-radius-full);\n background: var(--fx-surface-surface-hover, rgba(0, 0, 0, 0.08));\n overflow: hidden;\n }\n .fill {\n height: 100%;\n background: var(--fx-color-primary);\n border-radius: var(--fx-radius-full);\n }\n .thumb {\n position: absolute;\n top: 50%;\n width: var(--_thumb);\n height: var(--_thumb);\n border-radius: var(--fx-radius-full);\n background: var(--fx-surface-background);\n border: 2px solid var(--fx-color-primary);\n box-shadow: var(--fx-shadow-sm);\n transform: translate(-50%, -50%);\n transition: box-shadow var(--fx-motion-duration-fast) var(--fx-motion-easing);\n box-sizing: border-box;\n }\n .track-wrap:hover .thumb,\n .track-wrap.dragging .thumb { box-shadow: var(--fx-effect-focus-ring, none); }\n .track-wrap:focus-visible { outline: none; }\n .track-wrap:focus-visible .thumb {\n box-shadow: var(--fx-effect-focus-ring, none);\n }\n .value {\n position: absolute;\n bottom: calc(100% + 6px);\n transform: translateX(-50%);\n background: var(--fx-text-default, #1e293b);\n color: var(--fx-surface-background, #fff);\n font-size: calc(var(--fx-font-size) - 3px);\n font-weight: 600;\n padding: 2px var(--fx-space-xs);\n border-radius: var(--fx-radius-sm);\n white-space: nowrap;\n pointer-events: none;\n opacity: 0;\n transition: opacity var(--fx-motion-duration-fast) var(--fx-motion-easing);\n }\n .track-wrap:hover .value,\n .track-wrap.dragging .value,\n .track-wrap:focus-visible .value { opacity: 1; }\n `;\n\n static override get observedAttributes(): string[] {\n return ['min', 'max', 'step', 'size', 'disabled', 'show-value', 'label'];\n }\n\n get min(): number { return this._num('min', 0); }\n get max(): number { return this._num('max', 100); }\n get step(): number { return this._num('step', 1); }\n\n get value(): number {\n return this._clamp(this._num('value', this.min));\n }\n set value(v: number) {\n const snapped = this._snap(v);\n this.setAttribute('value', String(snapped));\n // atualiza visual sem re-render (preserva estado de drag/foco)\n if (this.isConnected) this._syncVisual();\n }\n\n private _num(attr: string, fallback: number): number {\n const raw = this.getAttribute(attr);\n if (raw === null || raw === '') return fallback;\n const n = Number(raw);\n return Number.isFinite(n) ? n : fallback;\n }\n\n private _clamp(v: number): number {\n return Math.min(this.max, Math.max(this.min, v));\n }\n\n /** Arredonda para o múltiplo de `step` mais próximo dentro do intervalo. */\n private _snap(v: number): number {\n const step = this.step || 1;\n const snapped = Math.round((this._clamp(v) - this.min) / step) * step + this.min;\n return Number(this._clamp(snapped).toFixed(10));\n }\n\n /** Percentual (0-100) do valor atual dentro do intervalo. */\n private _pct(): number {\n const span = this.max - this.min;\n return span <= 0 ? 0 : ((this.value - this.min) / span) * 100;\n }\n\n protected override render(): void {\n const pct = this._pct();\n const label = this.getAttr('label');\n const showValue = this.hasAttr('show-value');\n\n this.setTemplate(`\n ${label ? `<div class=\"label\" part=\"label\"><span>${label}</span>${showValue ? `<span>${this.value}</span>` : ''}</div>` : ''}\n <div class=\"track-wrap\" part=\"track\" tabindex=\"0\" role=\"slider\"\n aria-valuemin=\"${this.min}\" aria-valuemax=\"${this.max}\" aria-valuenow=\"${this.value}\"\n aria-label=\"${label || 'Slider'}\" ${this.hasAttr('disabled') ? 'aria-disabled=\"true\"' : ''}>\n <div class=\"track\"><div class=\"fill\" part=\"fill\" style=\"width: ${pct}%\"></div></div>\n <div class=\"thumb\" part=\"thumb\" style=\"left: ${pct}%\"></div>\n ${showValue ? `<span class=\"value\" style=\"left: ${pct}%\">${this.value}</span>` : ''}\n </div>\n `);\n\n this._bindPointer();\n this._bindKeyboard();\n }\n\n private _dragging = false;\n private _onMove?: (e: PointerEvent) => void;\n private _onUp?: (e: PointerEvent) => void;\n\n protected override disconnectedCallback(): void {\n super.disconnectedCallback();\n // Limpa listeners de janela se o elemento for removido durante um drag.\n if (this._dragging) {\n this._dragging = false;\n if (this._onMove) window.removeEventListener('pointermove', this._onMove);\n if (this._onUp) window.removeEventListener('pointerup', this._onUp);\n }\n }\n\n private _wrap(): HTMLElement | null {\n return this.root.querySelector<HTMLElement>('.track-wrap');\n }\n\n private _bindPointer(): void {\n const wrap = this._wrap();\n if (!wrap) return;\n\n const valueFromEvent = (e: PointerEvent): number => {\n const rect = wrap.getBoundingClientRect();\n const ratio = rect.width <= 0 ? 0 : (e.clientX - rect.left) / rect.width;\n return this.min + ratio * (this.max - this.min);\n };\n\n const move = (e: PointerEvent): void => {\n if (!this._dragging) return;\n this.value = valueFromEvent(e);\n this._syncVisual();\n this.dispatchEvent(\n new CustomEvent('input', { bubbles: true, composed: true, detail: { value: this.value } }),\n );\n };\n this._onMove = move;\n const up = (e: PointerEvent): void => {\n if (!this._dragging) return;\n this._dragging = false;\n wrap.classList.remove('dragging');\n window.removeEventListener('pointermove', move);\n window.removeEventListener('pointerup', up);\n this.value = valueFromEvent(e);\n this._syncVisual();\n this.dispatchEvent(\n new CustomEvent('change', { bubbles: true, composed: true, detail: { value: this.value } }),\n );\n };\n this._onUp = up;\n\n wrap.addEventListener('pointerdown', (e) => {\n if (this.hasAttr('disabled')) return;\n this._dragging = true;\n wrap.classList.add('dragging');\n wrap.focus();\n this.value = valueFromEvent(e);\n this._syncVisual();\n this.dispatchEvent(\n new CustomEvent('input', { bubbles: true, composed: true, detail: { value: this.value } }),\n );\n window.addEventListener('pointermove', move);\n window.addEventListener('pointerup', up);\n });\n }\n\n private _bindKeyboard(): void {\n const wrap = this._wrap();\n if (!wrap) return;\n wrap.addEventListener('keydown', (e) => {\n if (this.hasAttr('disabled')) return;\n const ev = e as KeyboardEvent;\n const big = (this.max - this.min) / 10;\n let next: number | null = null;\n switch (ev.key) {\n case 'ArrowRight': case 'ArrowUp': next = this.value + this.step; break;\n case 'ArrowLeft': case 'ArrowDown': next = this.value - this.step; break;\n case 'PageUp': next = this.value + big; break;\n case 'PageDown': next = this.value - big; break;\n case 'Home': next = this.min; break;\n case 'End': next = this.max; break;\n default: return;\n }\n ev.preventDefault();\n this.value = next;\n this._syncVisual();\n this.dispatchEvent(\n new CustomEvent('input', { bubbles: true, composed: true, detail: { value: this.value } }),\n );\n this.dispatchEvent(\n new CustomEvent('change', { bubbles: true, composed: true, detail: { value: this.value } }),\n );\n });\n }\n\n /** Atualiza fill/thumb/tooltip/aria sem re-renderizar o template (evita perder o drag). */\n private _syncVisual(): void {\n const pct = this._pct();\n const wrap = this._wrap();\n if (!wrap) return;\n const fill = wrap.querySelector<HTMLElement>('.fill');\n const thumb = wrap.querySelector<HTMLElement>('.thumb');\n const tip = wrap.querySelector<HTMLElement>('.value');\n if (fill) fill.style.width = `${pct}%`;\n if (thumb) thumb.style.left = `${pct}%`;\n if (tip) {\n tip.style.left = `${pct}%`;\n tip.textContent = String(this.value);\n }\n wrap.setAttribute('aria-valuenow', String(this.value));\n const labelPct = this.root.querySelector<HTMLElement>('.label span:last-child');\n if (labelPct) labelPct.textContent = String(this.value);\n }\n}\n\nexport function defineFxSlider(): typeof FxSlider {\n return defineElement('fx-slider', FxSlider);\n}\n\n","import { FxSlider, defineFxSlider } from './slider';\n\nexport { FxSlider };\n\ndefineFxSlider();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'fx-slider': FxSlider;\n }\n}\n","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\nimport { FENIX_ICON_BASE_CSS, fenixIconHtml } from '../../icons/base-css';\n\n/**\n * <fx-chip> — Chip/Tag compacto para labels, filtros e seleções.\n *\n * Atributos: variant (primary|secondary|success|warning|danger|info),\n * size (sm|md|lg), removable (mostra o botão ×), selectable (clica alterna\n * o estado selected), selected, disabled, icon (glifo/emoji).\n * Slot padrão: texto do chip.\n * Eventos (composed): `remove` (ao clicar em ×) e `chip-click` (ao clicar).\n */\nexport class FxChip 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 }\n .chip {\n display: inline-flex;\n align-items: center;\n gap: var(--fx-space-xs);\n padding: var(--fx-space-xs) var(--fx-space-md);\n min-height: var(--fx-size-sm);\n box-sizing: border-box;\n font-size: calc(var(--fx-font-size) - 2px);\n font-weight: var(--fx-font-weight);\n color: var(--fx-text-default);\n background: var(--fx-surface-surface-hover, rgba(0, 0, 0, 0.06));\n border: 1px solid transparent;\n border-radius: var(--fx-radius-full);\n user-select: none;\n transition:\n background var(--fx-motion-duration-fast) var(--fx-motion-easing),\n border-color var(--fx-motion-duration-fast) var(--fx-motion-easing),\n filter var(--fx-motion-duration-fast) var(--fx-motion-easing);\n }\n :host([size='md']) .chip { min-height: var(--fx-size-md); padding: var(--fx-space-xs) var(--fx-space-lg); }\n :host([size='lg']) .chip { min-height: var(--fx-size-lg); font-size: var(--fx-font-size); padding: var(--fx-space-sm) var(--fx-space-xl); }\n\n :host([variant='primary']) .chip { background: color-mix(in srgb, var(--fx-color-primary) 14%, transparent); color: var(--fx-color-primary); }\n :host([variant='secondary']) .chip { background: color-mix(in srgb, var(--fx-color-secondary) 14%, transparent); color: var(--fx-color-secondary); }\n :host([variant='success']) .chip { background: color-mix(in srgb, var(--fx-color-success) 14%, transparent); color: var(--fx-color-success); }\n :host([variant='warning']) .chip { background: color-mix(in srgb, var(--fx-color-warning) 14%, transparent); color: var(--fx-color-warning); }\n :host([variant='danger']) .chip { background: color-mix(in srgb, var(--fx-color-danger) 14%, transparent); color: var(--fx-color-danger); }\n :host([variant='info']) .chip { background: color-mix(in srgb, var(--fx-color-info) 14%, transparent); color: var(--fx-color-info); }\n\n .chip.clickable { cursor: pointer; }\n .chip.clickable:hover { filter: brightness(0.95); }\n :host([selected]) .chip {\n background: var(--fx-color-primary);\n color: #fff;\n }\n :host([selected]) .chip:hover { filter: brightness(0.92); }\n :host([disabled]) .chip { opacity: 0.55; cursor: not-allowed; }\n .chip.clickable:active { transform: scale(0.97); }\n\n .icon { line-height: 1; }\n /* Base dos glifos Fenix Icons (o @font-face vem de @wrrdev/fenix-ui/icons). */\n ${FENIX_ICON_BASE_CSS}\n .remove {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n border: none;\n border-radius: var(--fx-radius-full);\n background: transparent;\n color: inherit;\n font-size: calc(var(--fx-font-size) + 2px);\n line-height: 1;\n cursor: pointer;\n padding: 0;\n }\n .remove:hover { background: rgba(0, 0, 0, 0.18); }\n .remove[hidden] { display: none; }\n `;\n\n static override get observedAttributes(): string[] {\n return ['variant', 'size', 'removable', 'selectable', 'selected', 'disabled', 'icon'];\n }\n\n get selected(): boolean { return this.hasAttr('selected'); }\n set selected(v: boolean) { this.toggleAttr('selected', v); }\n\n protected override render(): void {\n const icon = this.getAttr('icon');\n const removable = this.hasAttr('removable');\n const disabled = this.hasAttr('disabled');\n const clickable = (this.hasAttr('selectable') || this.hasAttr('href')) && !disabled;\n\n this.setTemplate(`\n <span class=\"chip ${clickable ? 'clickable' : ''}\" part=\"chip\" role=\"${clickable ? 'button' : 'status'}\"\n ${clickable ? `tabindex=\"0\" aria-pressed=\"${this.selected}\"` : ''} ${disabled ? 'aria-disabled=\"true\"' : ''}>\n ${icon ? `<span class=\"icon\" aria-hidden=\"true\">${fenixIconHtml(icon)}</span>` : ''}\n <slot></slot>\n <button type=\"button\" class=\"remove\" part=\"remove\" aria-label=\"Remover\" ${removable ? '' : 'hidden'}>×</button>\n </span>\n `);\n\n const chip = this.root.querySelector<HTMLElement>('.chip');\n const remove = this.root.querySelector<HTMLButtonElement>('.remove');\n if (!chip || !remove) return;\n\n remove.addEventListener('click', (e) => {\n e.stopPropagation();\n this.dispatchEvent(new CustomEvent('remove', { bubbles: true, composed: true }));\n });\n\n if (clickable) {\n const toggle = (): void => {\n if (this.hasAttr('selectable')) {\n this.selected = !this.selected;\n chip.setAttribute('aria-pressed', String(this.selected));\n }\n this.dispatchEvent(new CustomEvent('chip-click', { bubbles: true, composed: true }));\n };\n chip.addEventListener('click', toggle);\n chip.addEventListener('keydown', (e) => {\n const ev = e as KeyboardEvent;\n if (ev.key === 'Enter' || ev.key === ' ') {\n ev.preventDefault();\n toggle();\n }\n });\n }\n }\n}\n\nexport function defineFxChip(): typeof FxChip {\n return defineElement('fx-chip', FxChip);\n}\n","import { FxChip, defineFxChip } from './chip';\n\nexport { FxChip };\n\ndefineFxChip();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'fx-chip': FxChip;\n }\n}\n","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\nimport { esc } from '../../core/sanitize';\n\n/**\n * <fx-avatar> — Representação visual de usuário/item.\n *\n * Atributos: size (number px / sm|md|lg), shape (circle|rounded|square),\n * variant (image|text|icon), src (imagem), alt (acessibilidade).\n * Slots: `icon` (glifo/emoji quando variant=icon) e padrão (iniciais).\n *\n * Uso em grupo: posicione vários `<fx-avatar>` em um container com a classe\n * `avatar-group` (empilha com overlap automático).\n */\nexport class FxAvatar 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 --_size: var(--fx-size-md, 36px);\n --_bg: var(--fx-surface-surface-hover, rgba(0, 0, 0, 0.08));\n --_color: var(--fx-text-default, #1e293b);\n }\n :host([size='sm']) { --_size: var(--fx-size-sm, 24px); }\n :host([size='lg']) { --_size: var(--fx-size-lg, 48px); }\n\n .avatar {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--_size);\n height: var(--_size);\n min-width: var(--_size);\n box-sizing: border-box;\n background: var(--_bg);\n color: var(--_color);\n font-weight: 700;\n font-size: calc(var(--_size) / 2.2);\n line-height: 1;\n overflow: hidden;\n text-decoration: none;\n /* border-radius definido por shape abaixo */\n }\n :host([shape='square']) .avatar { border-radius: var(--fx-radius-sm); }\n :host([shape='rounded']) .avatar { border-radius: var(--fx-radius-md); }\n :host([shape='circle']) .avatar, :host([shape='']) .avatar { border-radius: var(--fx-radius-full); }\n\n .avatar img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n }\n .avatar.text { font-size: calc(var(--_size) / 2.6); }\n .avatar .slot-icon { font-size: calc(var(--_size) / 2.4); }\n\n /* grupo empilhado */\n :host(.avatar-group) { display: inline-flex; }\n :host(.avatar-group) > .avatar {\n border: 2px solid var(--fx-surface-background);\n margin-left: calc(var(--_size) / -3);\n z-index: 1;\n }\n :host(.avatar-group) > .avatar:last-child { margin-left: 0; }\n :host(.avatar-group) > .avatar:hover { z-index: 2; }\n `;\n\n static override get observedAttributes(): string[] {\n return ['size', 'shape', 'variant', 'src', 'alt'];\n }\n\n get variant(): string { return this.getAttr('variant', 'text'); }\n get src(): string { return this.getAttr('src'); }\n set src(v: string) { this.setAttribute('src', v); }\n\n protected override render(): void {\n const variant = this.variant;\n const src = this.getAttr('src');\n const alt = this.getAttr('alt', '');\n const isIcon = variant === 'icon';\n const isImage = variant === 'image' && src;\n\n this.setTemplate(`\n <span class=\"avatar${isImage ? ' image' : isIcon ? ' icon-slot' : ' text'}\" part=\"avatar\" aria-label=\"${esc(alt)}\" role=\"img\">\n ${isImage\n ? `<img src=\"${esc(src)}\" alt=\"${esc(alt)}\">`\n : isIcon\n ? `<slot name=\"icon\" class=\"slot-icon\"></slot>`\n : `<slot></slot>`}\n </span>\n `);\n }\n}\n\nexport function defineFxAvatar(): typeof FxAvatar {\n return defineElement('fx-avatar', FxAvatar);\n}\n","import { FxAvatar, defineFxAvatar } from './avatar';\n\nexport { FxAvatar };\n\ndefineFxAvatar();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'fx-avatar': FxAvatar;\n }\n}\n","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\nimport { esc } from '../../core/sanitize';\nimport { FENIX_ICON_BASE_CSS, isFenixIconName } from '../../icons/base-css';\nimport { loadFenixIconsFont } from '../../icons/font';\n\n/**\n * <fx-icon> — Glifo da Fenix Icons com AUTOCOMPLETE no editor.\n *\n * Por que existe: a forma antiga (`<i class=\"fx-icon fx-icon-home\">`) é CSS\n * puro — o TypeScript não valida nem sugere nada enquanto você digita, e o\n * auto-import só injeta o import. Com o elemento, o atributo `name` é tipado\n * como `FenixIconName`, então Volar/vue-tsc, React e TSX listam os +4.000\n * glifos válidos (e o hover mostra a assinatura do atributo).\n *\n * Atributos:\n * - name → nome do glifo (ex.: `home`); texto livre/emoji também funciona\n * - size → sm | md | lg | xl (default: 1em, herda o texto ao redor)\n * - label → nome acessível; sem label o ícone é aria-hidden (decorativo)\n * - fill → variante preenchida\n * - bold → traço mais pesado\n *\n * O glifo sai por LIGADURA (o nome vira o conteúdo de texto com a\n * font-family de ícones) — por isso funciona dentro do Shadow DOM, onde as\n * classes `fx-icon-<nome>` do documento não atravessam a fronteira.\n *\n * Tamanho via CSS: --fx-icon-size (-sm/-md/-lg/-xl).\n */\nexport class FxIcon extends FxElement {\n static override styles = css`\n :host {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n vertical-align: middle;\n line-height: 1;\n color: currentColor;\n font-size: var(--fx-icon-size, 1em);\n }\n :host([size='sm']) { font-size: var(--fx-icon-size-sm, 16px); }\n :host([size='md']) { font-size: var(--fx-icon-size-md, 20px); }\n :host([size='lg']) { font-size: var(--fx-icon-size-lg, 24px); }\n :host([size='xl']) { font-size: var(--fx-icon-size-xl, 32px); }\n :host([hidden]) { display: none; }\n .icon { display: inline-block; }\n /* Variantes da fonte (FILL/wght): vencem a classe base .fx-icon. */\n :host([fill]) .icon { font-variation-settings: 'FILL' 1, 'wght' 400, 'GRAD' 0, 'opsz' 24; }\n :host([bold]) .icon { font-variation-settings: 'FILL' 0, 'wght' 600, 'GRAD' 0, 'opsz' 24; }\n ${FENIX_ICON_BASE_CSS}\n `;\n\n static override get observedAttributes(): string[] {\n return ['name', 'size', 'label', 'fill', 'bold'];\n }\n\n /** Nome do glifo (ou texto livre/emoji). */\n get name(): string {\n return this.getAttr('name');\n }\n set name(value: string) {\n this.setAttribute('name', value);\n }\n\n /** Tamanho: '' (herda 1em) | 'sm' | 'md' | 'lg' | 'xl'. */\n get size(): string {\n return this.getAttr('size');\n }\n set size(value: string) {\n if (value) this.setAttribute('size', value);\n else this.removeAttribute('size');\n }\n\n /** Nome acessível; vazio = ícone decorativo (aria-hidden). */\n get label(): string {\n return this.getAttr('label');\n }\n set label(value: string) {\n if (value) this.setAttribute('label', value);\n else this.removeAttribute('label');\n }\n\n protected override connectedCallback(): void {\n // O glifo depende do @font-face: garante o CSS leve (sem as 4k classes).\n loadFenixIconsFont();\n super.connectedCallback();\n }\n\n protected override render(): void {\n const name = this.getAttr('name').trim();\n const label = this.getAttr('label').trim();\n const a11y = label ? `role=\"img\" aria-label=\"${esc(label)}\"` : 'aria-hidden=\"true\"';\n if (!name) {\n this.setTemplate(`<span class=\"icon\" part=\"icon\" ${a11y}></span>`);\n return;\n }\n // Nome válido → ligadura (glifo). Emoji/texto livre → texto puro.\n const inner = isFenixIconName(name)\n ? `<i class=\"icon fx-icon\" part=\"icon\" ${a11y}>${esc(name)}</i>`\n : `<span class=\"icon\" part=\"icon\" ${a11y}>${esc(name)}</span>`;\n this.setTemplate(inner);\n }\n}\n\nexport function defineFxIcon(): typeof FxIcon {\n return defineElement('fx-icon', FxIcon);\n}\n","import { FxIcon, defineFxIcon } from './icon';\n\nexport { FxIcon };\n\ndefineFxIcon();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'fx-icon': FxIcon;\n }\n}\n","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\nimport { esc } from '../../core/sanitize';\n\n/**\n * <fx-card> — Container de conteúdo com cabeçalho, corpo e rodapé.\n *\n * Atributos: variant (elevated|flat|outline|ghost, padrão elevated),\n * radius (sm|md|lg — arredondamento; `size` segue aceito como alias legado),\n * padded (exibe padding interno), heading (rótulo opcional no cabeçalho).\n * Slots: `header`, padrão (conteúdo), `footer`.\n */\nexport class FxCard 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 box-sizing: border-box;\n }\n .card {\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-sm);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n transition: box-shadow var(--fx-motion-duration-normal) var(--fx-motion-easing);\n }\n /* Elevado: sombra principal; Flat: sem sombra mas cor plana; Outline: sem sombra e borda sólida */\n :host([variant='elevated']) .card { box-shadow: var(--fx-shadow-md); }\n :host([variant='elevated']) .card:hover { box-shadow: var(--fx-shadow-xl); }\n :host([variant='flat']) .card { box-shadow: none; border-color: transparent; }\n :host([variant='outline']) .card { box-shadow: none; border-style: solid; border-width: 1px; }\n :host([variant='ghost']) .card { box-shadow: none; border-color: transparent; background: transparent; }\n\n /* Raio do container: radius (nome atual) — size continua aceito\n como alias legado para não quebrar quem já usava o atributo. */\n :host([radius='sm']) .card,\n :host([size='sm']) .card { border-radius: var(--fx-radius-sm); }\n :host([radius='lg']) .card,\n :host([size='lg']) .card { border-radius: var(--fx-radius-xl); }\n\n header {\n padding: var(--fx-space-md) var(--fx-space-xl);\n border-bottom: 1px solid var(--fx-border-default);\n font-weight: 600;\n color: var(--fx-text-default);\n font-size: calc(var(--fx-font-size) + 2px);\n }\n header[hidden] { display: none; }\n\n .body {\n flex: 1 1 auto;\n }\n :host([padded]) .body { padding: var(--fx-space-lg) var(--fx-space-xl); }\n :host([padded]) .body:empty { padding: 0; }\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 ['variant', 'radius', 'size', 'padded', 'heading'];\n }\n\n protected override render(): void {\n const heading = this.getAttr('heading');\n this.setTemplate(`\n <div class=\"card\" part=\"card\">\n <header part=\"header\" ${heading ? '' : 'hidden'}>${esc(heading)}<slot name=\"header\"></slot></header>\n <div class=\"body\" part=\"content\"><slot></slot></div>\n <footer part=\"footer\"><slot name=\"footer\"></slot></footer>\n </div>\n `);\n }\n}\n\nexport function defineFxCard(): typeof FxCard {\n return defineElement('fx-card', FxCard);\n}\n","import { FxCard, defineFxCard } from './card';\n\nexport { FxCard };\n\ndefineFxCard();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'fx-card': FxCard;\n }\n}\n","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\nimport { esc } from '../../core/sanitize';\n\n/**\n * <fx-breadcrumb> — Trilha de navegação hierárquica.\n *\n * Atributos: size (sm|md|lg), separator (glifo entre itens, padrão '/'),\n * label (acessibilidade, padrão 'Breadcrumb').\n * Slots: `item` (repetível — cada <fx-breadcrumb-item> ou elemento com\n * [slot=\"item\"] vira um passo) e `separator` (customiza o separador).\n *\n * Marcação declarativa recomendada:\n * <fx-breadcrumb>\n * <fx-breadcrumb-item href=\"/\">Home</fx-breadcrumb-item>\n * <fx-breadcrumb-item href=\"/produtos\">Produtos</fx-breadcrumb-item>\n * <fx-breadcrumb-item>Detalhe</fx-breadcrumb-item>\n * </fx-breadcrumb>\n *\n * Eventos (composed): `select` (detail: { item, index }) ao clicar num item.\n */\nexport class FxBreadcrumb 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 nav {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: var(--fx-space-xs);\n }\n :host([size='sm']) nav { font-size: calc(var(--fx-font-size) - 2px); }\n :host([size='lg']) nav { font-size: calc(var(--fx-font-size) + 2px); }\n\n /* itens (movidos para o nav no shadow DOM) */\n nav [slot='item'] {\n display: inline-flex;\n align-items: center;\n gap: var(--fx-space-xs);\n color: var(--fx-text-muted);\n text-decoration: none;\n cursor: pointer;\n transition: color var(--fx-motion-duration-fast) var(--fx-motion-easing);\n }\n nav [slot='item']:hover { color: var(--fx-color-primary); }\n nav [slot='item'][aria-current='page'] {\n color: var(--fx-text-default);\n font-weight: 600;\n cursor: default;\n }\n nav [slot='item'][aria-current='page']:hover { color: var(--fx-text-default); }\n\n .sep {\n color: var(--fx-text-muted);\n user-select: none;\n display: inline-flex;\n align-items: center;\n }\n `;\n\n static override get observedAttributes(): string[] {\n return ['size', 'separator', 'label'];\n }\n\n protected override render(): void {\n const label = this.getAttr('label', 'Breadcrumb');\n\n this.setTemplate(`\n <nav part=\"nav\" aria-label=\"${esc(label)}\"></nav>\n `);\n\n this._decorateItems();\n }\n\n /**\n * Move os itens do light DOM para o nav e intercala separadores.\n * Como o playground atribui innerHTML (filhos chegam assincronamente) e\n * re-renders posteriores já terão os itens no nav, a lógica abaixo é\n * idempotente: coleta filhos do light DOM apenas na 1ª chamada.\n */\n private _decorateItems(): void {\n const nav = this.shadowRoot?.querySelector('nav');\n if (!nav) return;\n const sep = this.getAttr('separator', '/');\n\n // 1ª vez: captura itens do light DOM (idempotente — só coleta uma vez)\n if (this._items.length === 0) {\n this._items = Array.from(this.children).filter((el) =>\n el.matches('[slot=\"item\"]'),\n );\n }\n\n // limpa nav e reconstrói com os itens armazenados\n nav.innerHTML = '';\n this._items.forEach((item, i) => {\n const isLast = i === this._items.length - 1;\n item.setAttribute('aria-current', isLast ? 'page' : 'false');\n nav.appendChild(item);\n if (isLast) return;\n const s = document.createElement('span');\n s.className = 'sep';\n s.setAttribute('part', 'separator');\n s.setAttribute('aria-hidden', 'true');\n s.textContent = sep;\n nav.appendChild(s);\n });\n }\n\n private _items: Element[] = [];\n\n protected override connectedCallback(): void {\n super.connectedCallback();\n // filhos podem não estar disponíveis ainda (innerHTML do playground)\n const obs = new MutationObserver(() => {\n if (this.children.length > 0) {\n obs.disconnect();\n this._decorateItems();\n }\n });\n obs.observe(this, { childList: true });\n // se já tem filhos, decora na hora\n if (this.children.length > 0) this._decorateItems();\n }\n\n protected override disconnectedCallback(): void {\n super.disconnectedCallback();\n this._items = [];\n }\n}\n\nexport function defineFxBreadcrumb(): typeof FxBreadcrumb {\n return defineElement('fx-breadcrumb', FxBreadcrumb);\n}\n","import { FxBreadcrumb, defineFxBreadcrumb } from './breadcrumb';\n\nexport { FxBreadcrumb };\n\ndefineFxBreadcrumb();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'fx-breadcrumb': FxBreadcrumb;\n }\n}\n","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\n\n/**\n * <fx-popover> — Painel flutuante ancorado em um elemento, com posicionamento\n * automático (flip para cima quando não há espaço abaixo), no estilo Popover do PrimeVue.\n *\n * Atributos:\n * - target (seletor CSS do elemento âncora — obrigatório);\n * - trigger (click|hover, padrão click);\n * - position (top|bottom|auto, padrão auto — faz flip conforme o espaço);\n * - open (exibe o popover);\n * - dismissible (fecha ao clicar fora, padrão true).\n *\n * Slots: `header`, padrão (conteúdo), `footer`.\n *\n * Eventos (composed): `show` e `hide`.\n */\nexport class FxPopover extends FxElement {\n static override styles = css`\n :host { display: contents; }\n .popup {\n position: fixed;\n margin: 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 padding: 0;\n min-width: 220px;\n max-width: min(380px, calc(100vw - 24px));\n font-family: var(--fx-font-family);\n font-size: var(--fx-font-size);\n color: var(--fx-text-default);\n z-index: var(--fx-z-modal, 1100);\n animation: fxpp-pop var(--fx-motion-duration-fast, 150ms) var(--fx-motion-easing, ease);\n overflow: hidden;\n }\n .popup[hidden] { display: none; }\n @keyframes fxpp-pop { from { opacity: 0; transform: scale(0.96); } to { opacity: 1; transform: scale(1); } }\n .popup::before, .popup::after {\n content: '';\n position: absolute;\n border: 7px solid transparent;\n }\n .popup[data-side='bottom']::before {\n top: -14px; left: var(--fxpp-arrow-x, 50%);\n border-bottom-color: var(--fx-border-default);\n }\n .popup[data-side='bottom']::after {\n top: -12px; left: var(--fxpp-arrow-x, 50%);\n border-bottom-color: var(--fx-surface-background);\n }\n .popup[data-side='top']::before {\n bottom: -14px; left: var(--fxpp-arrow-x, 50%);\n border-top-color: var(--fx-border-default);\n }\n .popup[data-side='top']::after {\n bottom: -12px; left: var(--fxpp-arrow-x, 50%);\n border-top-color: var(--fx-surface-background);\n }\n header {\n padding: var(--fx-space-md) var(--fx-space-lg);\n border-bottom: 1px solid var(--fx-border-default);\n font-weight: 600;\n font-size: calc(var(--fx-font-size) + 1px);\n color: var(--fx-text-default);\n }\n header[hidden] { display: none; }\n .body { padding: var(--fx-space-md) var(--fx-space-lg); }\n footer {\n padding: var(--fx-space-md) var(--fx-space-lg);\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', 'target', 'trigger', 'position', 'dismissible'];\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 this.setTemplate(`\n <div class=\"popup\" part=\"popover\" role=\"dialog\" aria-modal=\"false\" ${this.open ? '' : 'hidden'}>\n <header part=\"header\" hidden><slot name=\"header\"></slot></header>\n <div class=\"body\" part=\"content\"><slot></slot></div>\n <footer part=\"footer\" hidden><slot name=\"footer\"></slot></footer>\n </div>\n `);\n\n if (!this.open) return;\n const popup = this.root.querySelector<HTMLElement>('.popup');\n if (!popup) return;\n\n // Evita listeners duplicados em re-renders enquanto aberto\n // (ex.: mudança de target/position/trigger com o popover aberto).\n this._cleanup?.();\n this._cleanup = undefined;\n\n const close = (): void => {\n this.open = false;\n this._cleanup?.();\n this._cleanup = undefined;\n this._restoreFocus();\n this.dispatchEvent(new CustomEvent('hide', { bubbles: true, composed: true }));\n };\n\n const onKey = (e: KeyboardEvent): void => {\n if (e.key === 'Escape') { e.stopPropagation(); close(); }\n };\n const onPointerDown = (e: MouseEvent): void => {\n if (!this.hasAttr('dismissible')) return;\n const path = e.composedPath();\n const anchor = this._anchor();\n const hitAnchor = anchor ? path.includes(anchor) : false;\n if (!path.includes(popup) && !hitAnchor) close();\n };\n document.addEventListener('keydown', onKey);\n document.addEventListener('pointerdown', onPointerDown, true);\n this._cleanup = () => {\n document.removeEventListener('keydown', onKey);\n document.removeEventListener('pointerdown', onPointerDown, true);\n };\n\n // sincroniza slots ANTES de posicionar (header/footer alteram a altura)\n this._syncSlots();\n this._position(popup);\n this._previouslyFocused = document.activeElement as HTMLElement | null;\n requestAnimationFrame(() => popup.focus({ preventScroll: true }));\n this.dispatchEvent(new CustomEvent('show', { bubbles: true, composed: true }));\n }\n\n private _cleanup?: () => void;\n private _previouslyFocused: HTMLElement | null = null;\n\n private _anchor(): HTMLElement | null {\n const selector = this.getAttr('target');\n if (!selector) return null;\n try { return document.querySelector<HTMLElement>(selector); }\n catch { return null; }\n }\n\n private _syncSlots(): void {\n const header = this.root.querySelector<HTMLSlotElement>('slot[name=\"header\"]');\n const footer = this.root.querySelector<HTMLSlotElement>('slot[name=\"footer\"]');\n const headerWrap = this.root.querySelector<HTMLElement>('header');\n const footerWrap = this.root.querySelector<HTMLElement>('footer');\n const hasHeader = !!header && header.assignedNodes().length > 0;\n const hasFooter = !!footer && footer.assignedNodes().length > 0;\n headerWrap?.toggleAttribute('hidden', !hasHeader);\n footerWrap?.toggleAttribute('hidden', !hasFooter);\n }\n\n private _position(popup: HTMLElement): void {\n const anchor = this._anchor();\n if (!anchor) return;\n popup.hidden = false;\n\n const a = anchor.getBoundingClientRect();\n const p = popup.getBoundingClientRect();\n const gap = 8;\n const margin = 8;\n\n let side: 'top' | 'bottom';\n const pos = this.getAttr('position', 'auto');\n if (pos === 'top') side = 'top';\n else if (pos === 'bottom') side = 'bottom';\n else side = a.bottom + gap + p.height <= window.innerHeight - margin ? 'bottom' : 'top';\n\n // flip quando o lado forçado não cabe (evita sobrepor o anchor)\n if (side === 'top' && a.top - gap - p.height < margin && a.bottom + gap + p.height <= window.innerHeight - margin) {\n side = 'bottom';\n } else if (side === 'bottom' && a.bottom + gap + p.height > window.innerHeight - margin && a.top - gap - p.height >= margin) {\n side = 'top';\n }\n\n const left = Math.min(\n Math.max(margin, a.left + a.width / 2 - p.width / 2),\n window.innerWidth - p.width - margin,\n );\n const top = side === 'bottom' ? a.bottom + gap : a.top - gap - p.height;\n\n popup.dataset.side = side;\n popup.style.left = `${Math.round(left)}px`;\n popup.style.top = `${Math.round(Math.max(margin, top))}px`;\n const arrowX = Math.min(Math.max(a.left + a.width / 2 - left, 16), p.width - 16);\n popup.style.setProperty('--fxpp-arrow-x', `${Math.round(arrowX)}px`);\n }\n\n private _restoreFocus(): void {\n if (this._previouslyFocused?.isConnected) this._previouslyFocused.focus();\n this._previouslyFocused = null;\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n window.addEventListener('scroll', this._onReposition, true);\n window.addEventListener('resize', this._onReposition);\n this._bindTrigger();\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n window.removeEventListener('scroll', this._onReposition, true);\n window.removeEventListener('resize', this._onReposition);\n this._triggerCleanup?.();\n this._triggerCleanup = undefined;\n this._cleanup?.();\n this._cleanup = undefined;\n this._restoreFocus();\n }\n\n private _onReposition = (): void => {\n if (!this.open) return;\n const popup = this.root.querySelector<HTMLElement>('.popup');\n if (popup && !popup.hidden) this._position(popup);\n };\n\n private _bindTrigger(): void {\n const anchor = this._anchor();\n if (!anchor) return;\n const trigger = this.getAttr('trigger', 'click');\n\n if (trigger === 'hover') {\n anchor.addEventListener('mouseenter', this._onEnter);\n anchor.addEventListener('mouseleave', this._onLeave);\n this._triggerCleanup = () => {\n anchor.removeEventListener('mouseenter', this._onEnter);\n anchor.removeEventListener('mouseleave', this._onLeave);\n };\n } else {\n anchor.addEventListener('pointerdown', this._onClick);\n this._triggerCleanup = () => anchor.removeEventListener('pointerdown', this._onClick);\n }\n }\n\n private _triggerCleanup?: () => void;\n private _onEnter = (): void => { this.open = true; };\n private _onLeave = (): void => { this.open = false; };\n private _onClick = (): void => { this.open = !this.open; };\n}\n\nexport function defineFxPopover(): typeof FxPopover {\n return defineElement('fx-popover', FxPopover);\n}\n","import { FxPopover, defineFxPopover } from './popover';\n\nexport { FxPopover };\n\ndefineFxPopover();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'fx-popover': FxPopover;\n }\n}\n","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\nimport { esc } from '../../core/sanitize';\n\n/**\n * <fx-stepper> — Asistente de pasos (wizard) para flujos multi-etapa.\n *\n * Uso declarativo: cada hijo directo con el atributo `step` define un paso.\n * Uso imperativo: leer/escribir la propiedad `active` para navegar.\n *\n * Atributos: active (índice del paso activo), linear (solo avanzar en orden),\n * show-numbers (muestra el número en el indicador).\n * Slots: `header` (customiza el indicador de pasos), un slot por paso\n * (slot=\"step-0\", slot=\"step-1\", ...).\n *\n * Eventos (composed): `change` (detail: { index }) y `complete` al llegar al último.\n */\nexport class FxStepper extends FxElement {\n static override styles = css`\n :host { display: block; font-family: var(--fx-font-family); font-size: var(--fx-font-size); }\n :host([linear]) .step-num.activated { cursor: not-allowed; }\n\n .steps {\n display: flex;\n align-items: center;\n gap: var(--fx-space-md);\n flex-wrap: wrap;\n padding: var(--fx-space-md) var(--fx-space-lg);\n }\n .step {\n display: inline-flex;\n align-items: center;\n gap: var(--fx-space-sm);\n padding: var(--fx-space-xs) var(--fx-space-md);\n border-radius: var(--fx-radius-full);\n color: var(--fx-text-muted);\n font-weight: 600;\n user-select: none;\n cursor: pointer;\n transition: background var(--fx-motion-duration-fast) var(--fx-motion-easing), color var(--fx-motion-duration-fast) var(--fx-motion-easing);\n }\n .step.active { background: var(--fx-color-primary); color: #fff; }\n .step.done { color: var(--fx-color-primary); }\n .step[hidden] { display: none; }\n .num {\n display: inline-flex; align-items: center; justify-content: center;\n width: 24px; height: 24px; min-width: 24px;\n border: 1.5px solid currentColor;\n border-radius: var(--fx-radius-full);\n font-size: calc(var(--fx-font-size) - 2px);\n line-height: 1;\n }\n\n .panel { padding: var(--fx-space-lg) var(--fx-space-xl); min-height: 80px; }\n .actions {\n display: flex;\n justify-content: space-between;\n gap: var(--fx-space-sm);\n padding: var(--fx-space-md) var(--fx-space-lg);\n border-top: 1px solid var(--fx-border-default);\n }\n .nav-btn {\n font-family: var(--fx-font-family);\n font-size: calc(var(--fx-font-size) - 2px);\n padding: var(--fx-space-xs) var(--fx-space-lg);\n min-height: var(--fx-size-sm);\n border-radius: var(--fx-radius-sm);\n border: 1px solid var(--fx-border-default);\n background: var(--fx-surface-background);\n color: var(--fx-text-default);\n cursor: pointer;\n transition: background var(--fx-motion-duration-fast) var(--fx-motion-easing);\n }\n .nav-btn:hover:not(:disabled) { background: var(--fx-surface-surface-hover, rgba(0, 0, 0, 0.04)); }\n .nav-btn:disabled { opacity: 0.5; cursor: not-allowed; }\n .nav-btn.primary {\n background: var(--fx-color-primary);\n border-color: var(--fx-color-primary);\n color: #fff;\n }\n .nav-btn.primary:hover:not(:disabled) { filter: brightness(0.92); background: var(--fx-color-primary); }\n `;\n\n static override get observedAttributes(): string[] {\n return ['active', 'linear', 'show-numbers'];\n }\n\n get stepCount(): number { return this._titles.length; }\n get active(): number {\n const n = Number(this.getAttr('active', '0'));\n return Math.min(this.stepCount - 1, Math.max(0, Number.isFinite(n) ? n : 0));\n }\n set active(v: number) {\n this.setAttribute('active', String(Math.min(this.stepCount - 1, Math.max(0, v))));\n }\n\n get isLast(): boolean { return this.active >= this.stepCount - 1; }\n\n /** Navega al paso (emite change). Con linear, solo permite avanzar de a uno. */\n goTo(index: number): void {\n const target = Math.min(this.stepCount - 1, Math.max(0, index));\n if (this.hasAttr('linear') && target > this.active + 1) return;\n this.active = target;\n this.dispatchEvent(new CustomEvent('change', { bubbles: true, composed: true, detail: { index: this.active } }));\n if (this.isLast) {\n this.dispatchEvent(new CustomEvent('complete', { bubbles: true, composed: true }));\n }\n }\n\n next(): void { this.goTo(this.active + 1); }\n prev(): void { this.goTo(this.active - 1); }\n\n private _titles: string[] = [];\n private _panels: Element[] = [];\n\n protected override render(): void {\n this._panels = Array.from(this.children).filter((el) =>\n el.matches('[slot^=\"step-\"]'),\n );\n this._titles = this._panels.map((p, i) =>\n p.getAttribute('step-title') || `Paso ${i + 1}`,\n );\n const active = Math.min(this.active, Math.max(0, this._titles.length - 1));\n\n const stepsHtml = this._titles\n .map((title, i) => {\n const state = i === active ? 'active' : i < active ? 'done' : '';\n // sem show-numbers: passos concluídos exibem ✓; com show-numbers: sempre número\n const marker = i < active && !this.hasAttr('show-numbers') ? '✓' : String(i + 1);\n return `<span class=\"step ${state}\" part=\"step\" data-i=\"${i}\"><span class=\"num\">${marker}</span>${esc(title)}</span>`;\n })\n .join('');\n\n const panelsHtml = this._panels\n .map((p, i) => `<section class=\"panel\" part=\"panel\" ${i === active ? '' : 'hidden'}>${p.innerHTML}</section>`)\n .join('');\n\n this.setTemplate(`\n <div class=\"steps\" part=\"steps\">${stepsHtml}</div>\n <div class=\"panel-wrap\">${panelsHtml}</div>\n <div class=\"actions\" part=\"actions\">\n <button type=\"button\" class=\"nav-btn prev\" part=\"prev\" ${active === 0 ? 'disabled' : ''}>Anterior</button>\n <button type=\"button\" class=\"nav-btn primary next\" part=\"next\">${active === this._titles.length - 1 ? 'Concluir' : 'Próximo'}</button>\n </div>\n `);\n\n this._bindSteps();\n }\n\n private _bindSteps(): void {\n const steps = Array.from(this.root.querySelectorAll<HTMLElement>('.step'));\n steps.forEach((step) => {\n const i = Number(step.dataset.i);\n step.addEventListener('click', () => {\n if (this.hasAttr('linear') && i > this.active + 1) return;\n this.goTo(i);\n });\n step.addEventListener('keydown', (e) => {\n if ((e as KeyboardEvent).key === 'Enter') {\n e.preventDefault();\n this.goTo(i);\n }\n });\n });\n\n this.root.querySelector<HTMLElement>('.nav-btn.prev')?.addEventListener('click', () => this.prev());\n this.root.querySelector<HTMLElement>('.nav-btn.next')?.addEventListener('click', () => this.next());\n }\n\n protected override connectedCallback(): void {\n super.connectedCallback();\n if (this._titles.length === 0) this.render();\n }\n}\n\nexport function defineFxStepper(): typeof FxStepper {\n return defineElement('fx-stepper', FxStepper);\n}","import { FxStepper, defineFxStepper } from './stepper';\n\nexport { FxStepper };\n\ndefineFxStepper();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'fx-stepper': FxStepper;\n }\n}","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\n\n/**\n * <fx-rating> — Evaluación por estrellas.\n *\n * Atributos: value (0 a max), max (número de estrellas, default 5),\n * readonly, disabled, allow-half (permite medias estrellas),\n * size (sm|md|lg).\n * Eventos (composed): `change` (detail: { value }).\n */\nexport class FxRating extends FxElement {\n static override styles = css`\n :host {\n display: inline-flex;\n font-family: var(--fx-font-family);\n font-size: var(--fx-font-size);\n --_star: calc(var(--fx-font-size) + 8px);\n }\n :host([size='sm']) { --_star: calc(var(--fx-font-size) + 4px); }\n :host([size='lg']) { --_star: calc(var(--fx-font-size) + 14px); }\n :host([disabled]) { opacity: 0.55; }\n :host([disabled]) .stars { pointer-events: none; }\n :host([readonly]) .stars { pointer-events: none; }\n\n .stars {\n display: inline-flex;\n align-items: center;\n gap: 2px;\n cursor: pointer;\n }\n .star {\n position: relative;\n display: inline-flex;\n width: var(--_star);\n height: var(--_star);\n font-size: var(--_star);\n line-height: 1;\n color: var(--fx-text-muted);\n cursor: pointer;\n user-select: none;\n transition: transform var(--fx-motion-duration-fast) var(--fx-motion-easing), color var(--fx-motion-duration-fast) var(--fx-motion-easing);\n }\n .star:hover { transform: scale(1.1); }\n .star[hidden] { display: none; }\n .star.filled { color: var(--fx-color-warning); }\n .star.hovered { color: var(--fx-color-warning); }\n `;\n\n static override get observedAttributes(): string[] {\n return ['value', 'max', 'readonly', 'disabled', 'allow-half', 'size'];\n }\n\n get value(): number {\n const n = Number(this.getAttr('value', '0'));\n return Number.isFinite(n) ? Math.min(this.max, Math.max(0, n)) : 0;\n }\n set value(v: number) {\n this.setAttribute('value', String(Math.min(this.max, Math.max(0, v))));\n this._syncVisual();\n }\n\n get max(): number {\n const n = Number(this.getAttr('max', '5'));\n const m = Number.isFinite(n) ? Math.round(n) : 5;\n return Math.min(10, Math.max(1, m));\n }\n set max(v: number) { this.setAttribute('max', String(v)); }\n\n protected override render(): void {\n const stars = this.max;\n const starsHtml = Array.from({ length: stars }, (_, i) => i + 1)\n .map((n) => `<span class=\"star\" data-n=\"${n}\" part=\"star\" title=\"${n} ${this._label(n)}\">★</span>`)\n .join('');\n\n this.setTemplate(`\n <span class=\"stars\" part=\"stars\" role=\"radiogroup\">\n ${starsHtml}\n </span>\n `);\n\n this._bindStars();\n this._syncVisual();\n }\n\n private _starNodes(): HTMLElement[] {\n return Array.from(this.root.querySelectorAll<HTMLElement>('.star'));\n }\n\n private _label(n: number): string {\n return n === 1 ? 'estrella' : 'estrellas';\n }\n\n private _syncVisual(): void {\n const v = this.value;\n this._starNodes().forEach((star) => {\n const n = Number(star.dataset.n);\n star.classList.toggle('filled', v >= n);\n });\n }\n\n private _bindStars(): void {\n const stars = this._starNodes();\n stars.forEach((star) => {\n const n = Number(star.dataset.n);\n star.addEventListener('click', () => {\n if (this.hasAttr('readonly') || this.hasAttr('disabled')) return;\n let next = n;\n if (this.hasAttr('allow-half')) next += -0.5; // para simplificar, valor entero\n this.value = next;\n this.dispatchEvent(\n new CustomEvent('change', { bubbles: true, composed: true, detail: { value: this.value } }),\n );\n });\n star.addEventListener('mouseenter', () => {\n if (this.hasAttr('readonly') || this.hasAttr('disabled')) return;\n this._hover(n);\n });\n star.addEventListener('mouseleave', () => this._syncVisual());\n });\n }\n\n private _hover(n: number): void {\n this._starNodes().forEach((star) => {\n const nn = Number(star.dataset.n);\n star.classList.toggle('hovered', nn <= n);\n });\n }\n}\n\nexport function defineFxRating(): typeof FxRating {\n return defineElement('fx-rating', FxRating);\n}","import { FxRating, defineFxRating } from './rating';\n\nexport { FxRating };\n\ndefineFxRating();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'fx-rating': FxRating;\n }\n}","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\nimport { esc } from '../../core/sanitize';\n\n/**\n * <fx-menu> — Menú de navegación (horizontal o vertical) con ítems y submenús.\n *\n * Atributos: orientation (horizontal|vertical), size (sm|md|lg),\n * dense (reduce el alto), titles (separado por `,` para navegación).\n * Slots `item`: cada ítem de menú con [slot=\"item\"].\n * Evento (composed): `select` (detail: { index, label }).\n */\nexport class FxMenu extends FxElement {\n static override styles = css`\n :host { display: block; font-family: var(--fx-font-family); font-size: var(--fx-font-size); }\n :host([orientation='vertical']) { border: 1px solid var(--fx-border-default); border-radius: var(--fx-radius-md); }\n nav {\n display: flex;\n align-items: center;\n gap: var(--fx-space-xs);\n flex-wrap: wrap;\n background: var(--fx-surface-background);\n }\n :host([orientation='vertical']) nav { flex-direction: column; align-items: stretch; }\n .item {\n display: inline-flex;\n align-items: center;\n gap: var(--fx-space-xs);\n padding: var(--fx-space-sm) var(--fx-space-md);\n min-height: var(--fx-size-sm);\n border-radius: var(--fx-radius-sm);\n color: var(--fx-text-default);\n cursor: pointer;\n user-select: none;\n white-space: nowrap;\n transition: background var(--fx-motion-duration-fast) var(--fx-motion-easing), color var(--fx-motion-duration-fast) var(--fx-motion-easing);\n }\n :host([size='sm']) .item { min-height: var(--fx-size-sm); padding: var(--fx-space-xs) var(--fx-space-sm); font-size: calc(var(--fx-font-size) - 2px); }\n :host([size='lg']) .item { min-height: var(--fx-size-lg); padding: var(--fx-space-md) var(--fx-space-lg); font-size: calc(var(--fx-font-size) + 1px); }\n .item:hover { background: var(--fx-surface-surface-hover, rgba(0,0,0,0.06)); }\n .item.active { background: var(--fx-color-primary); color: #fff; font-weight: 600; }\n .item[aria-disabled='true'] { opacity: 0.5; cursor: not-allowed; }\n .item[aria-disabled='true']:hover { background: none; }\n .item .caret { font-size: calc(var(--fx-font-size) - 2px); color: var(--fx-text-muted); }\n\n /* submenú ancorado ao item */\n .submenu-wrap { position: relative; display: inline-flex; }\n :host([orientation='vertical']) .submenu-wrap { width: 100%; }\n .dropdown {\n position: absolute;\n left: 0;\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-sm);\n box-shadow: var(--fx-shadow-lg);\n padding: var(--fx-space-xs);\n z-index: var(--fx-z-dropdown, 1060);\n display: none;\n flex-direction: column;\n }\n .dropdown.open { display: flex; }\n :host([orientation='vertical']) .dropdown { left: 100%; top: 0; }\n `;\n\n static override get observedAttributes(): string[] {\n return ['orientation', 'size', 'dense', 'titles'];\n }\n\n get orientation(): string { return this.getAttr('orientation', 'horizontal'); }\n\n get items(): HTMLElement[] {\n return Array.from(this.children).filter((el) => el.matches('[slot=\"item\"]')).map((el) => el as HTMLElement);\n }\n\n protected override render(): void {\n const titleAttr = this.getAttr('titles');\n const titles = titleAttr ? titleAttr.split(',').map((s) => s.trim()) : [];\n\n const items = this.items;\n const itemsHtml = items\n .map((it, i) => {\n const label = titles[i] || it.textContent?.trim() || `Item ${i + 1}`;\n const hasSub = it.matches('[submenu]');\n const disabled = it.hasAttribute('disabled');\n const item = `\n <span class=\"item\" part=\"item\" data-i=\"${i}\" ${disabled ? 'aria-disabled=\"true\"' : ''}>\n ${esc(label)}${hasSub ? `<span class=\"caret\">▾</span>` : ''}\n </span>`;\n if (!hasSub) return item;\n return `\n <span class=\"submenu-wrap\" part=\"submenu-wrap\">\n ${item}\n <div class=\"dropdown\" part=\"submenu\"><slot name=\"submenu-${i}\"></slot></div>\n </span>`;\n })\n .join('');\n\n this.setTemplate(`\n <nav part=\"menu\" aria-label=\"Menu\">\n ${itemsHtml}\n </nav>\n `);\n\n this._bindItems();\n }\n\n private _bindItems(): void {\n const items = Array.from(this.root.querySelectorAll<HTMLElement>('.item'));\n items.forEach((item) => {\n const i = Number(item.dataset.i);\n item.addEventListener('click', () => {\n if (item.getAttribute('aria-disabled') === 'true') return;\n const source = this.items[i];\n const hasSub = source?.hasAttribute('submenu');\n if (hasSub) {\n // fecha outros dropdowns e alterna o deste item\n this.root.querySelectorAll<HTMLElement>('.dropdown.open').forEach((d) => {\n if (d !== item.parentElement?.querySelector('.dropdown')) d.classList.remove('open');\n });\n item.parentElement?.querySelector('.dropdown')?.classList.toggle('open');\n return;\n }\n this._setActive(item);\n this.dispatchEvent(new CustomEvent('select', {\n bubbles: true, composed: true,\n detail: { index: i, label: item.textContent?.trim() ?? '' },\n }));\n });\n item.addEventListener('keydown', (e) => {\n const ev = e as KeyboardEvent;\n if (ev.key === 'Enter' || ev.key === ' ') {\n ev.preventDefault();\n item.click();\n }\n });\n });\n }\n\n protected override connectedCallback(): void {\n super.connectedCallback();\n document.addEventListener('pointerdown', this._onOutside);\n }\n\n protected override disconnectedCallback(): void {\n super.disconnectedCallback();\n document.removeEventListener('pointerdown', this._onOutside);\n }\n\n private _onOutside = (e: MouseEvent): void => {\n const path = e.composedPath();\n this.root.querySelectorAll<HTMLElement>('.dropdown.open').forEach((d) => {\n if (!path.includes(d)) d.classList.remove('open');\n });\n };\n\n private _setActive(active: HTMLElement): void {\n Array.from(this.root.querySelectorAll<HTMLElement>('.item')).forEach((it) => {\n it.classList.toggle('active', it === active);\n });\n }\n}\n\nexport function defineFxMenu(): typeof FxMenu {\n return defineElement('fx-menu', FxMenu);\n}","import { FxMenu, defineFxMenu } from './menu';\n\nexport { FxMenu };\n\ndefineFxMenu();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'fx-menu': FxMenu;\n }\n}","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\nimport { esc } from '../../core/sanitize';\n\n/**\n * <fx-toggle-button-group> — Grupo de botones de selección múltiple o única.\n *\n * Atributos: multiple (permite varios seleccionados), value (lista), size.\n * Slots `option`: cada botón con [slot=\"option\" value=\"...\"].\n * Evento (composed): `change` (detail: { value: string[] }).\n */\nexport class FxToggleButtonGroup extends FxElement {\n static override styles = css`\n :host { display: inline-flex; font-family: var(--fx-font-family); font-size: var(--fx-font-size); gap: var(--fx-space-xs); }\n .option {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--fx-space-xs);\n min-height: var(--fx-size-md);\n padding: var(--fx-space-sm) var(--fx-space-lg);\n font-weight: var(--fx-font-weight);\n /* Altura determinística: a caixa fica EXATAMENTE no token --fx-size-*. */\n line-height: var(--fx-font-line-height);\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 cursor: pointer;\n user-select: none;\n transition: background var(--fx-motion-duration-fast) var(--fx-motion-easing), border-color var(--fx-motion-duration-fast) var(--fx-motion-easing), color var(--fx-motion-duration-fast) var(--fx-motion-easing);\n }\n :host([size='sm']) .option { min-height: var(--fx-size-sm); padding: var(--fx-space-xs) var(--fx-space-md); font-size: calc(var(--fx-font-size) - 2px); }\n :host([size='lg']) .option { min-height: var(--fx-size-lg); padding: var(--fx-space-sm) var(--fx-space-xl); font-size: calc(var(--fx-font-size) + 2px); }\n .option:hover { border-color: var(--fx-color-primary); }\n .option.active {\n background: var(--fx-color-primary);\n border-color: var(--fx-color-primary);\n color: #fff;\n }\n .option.active:hover { filter: brightness(0.92); }\n `;\n\n static override get observedAttributes(): string[] {\n return ['multiple', 'size'];\n }\n\n get value(): string[] {\n const raw = this.getAttr('value');\n return raw ? raw.split(',').map((s) => s.trim()).filter(Boolean) : [];\n }\n set value(v: string[]) { this.setAttribute('value', v.join(',')); }\n\n get multiple(): boolean { return this.hasAttr('multiple'); }\n\n get options(): HTMLElement[] {\n return Array.from(this.children).filter((el) => el.matches('[slot=\"option\"]')).map((el) => el as HTMLElement);\n }\n\n protected override render(): void {\n const opts = this.options;\n const selected = this.value;\n\n const html = opts\n .map((o, i) => {\n const val = o.getAttribute('value') ?? '';\n const active = selected.includes(val);\n return `<button type=\"button\" class=\"option ${active ? 'active' : ''}\" part=\"option\" data-v=\"${esc(val)}\" aria-pressed=\"${active}\">${esc(o.textContent?.trim() || `Opción ${i + 1}`)}</button>`;\n })\n .join('');\n\n this.setTemplate(`\n <div class=\"options\" part=\"options\" role=\"group\" aria-label=\"Toggle buttons\">\n ${html}\n </div>\n `);\n\n this._bindOptions();\n }\n\n private _bindOptions(): void {\n Array.from(this.root.querySelectorAll<HTMLElement>('.option') || []).forEach((opt) => {\n opt.addEventListener('click', () => this._toggle(opt));\n opt.addEventListener('keydown', (e) => {\n const ev = e as KeyboardEvent;\n if (ev.key === 'Enter' || ev.key === ' ') {\n ev.preventDefault();\n this._toggle(opt);\n }\n });\n });\n }\n\n private _toggle(opt: HTMLElement): void {\n const val = opt.dataset.v ?? '';\n let current = this.value;\n\n if (this.multiple) {\n if (current.includes(val)) current = current.filter((v) => v !== val);\n else current.push(val);\n } else {\n current = current.includes(val) ? [] : [val];\n }\n\n this.value = current;\n this.root.querySelectorAll<HTMLElement>('.option').forEach((o) => {\n const on = current.includes(o.dataset.v ?? '');\n o.classList.toggle('active', on);\n o.setAttribute('aria-pressed', String(on));\n });\n this.dispatchEvent(new CustomEvent('change', { bubbles: true, composed: true, detail: { value: current } }));\n }\n}\n\nexport function defineFxToggleButtonGroup(): typeof FxToggleButtonGroup {\n return defineElement('fx-toggle-button-group', FxToggleButtonGroup);\n}","import { FxToggleButtonGroup, defineFxToggleButtonGroup } from './toggle-button-group';\n\nexport { FxToggleButtonGroup };\n\ndefineFxToggleButtonGroup();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'fx-toggle-button-group': FxToggleButtonGroup;\n }\n}","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\nimport { esc } from '../../core/sanitize';\nimport { FENIX_ICON_BASE_CSS, fenixIconHtml } from '../../icons/base-css';\n\n/**\n * <fx-empty-state> — Estado vazio/ilustrativo para listas e telas sem dados.\n *\n * Atributos: icon (glifo/emoji), heading (título), description (texto de apoio).\n * Slots: `icon` (customiza o ícone), `action` (botão/chamada para ação).\n */\nexport class FxEmptyState extends FxElement {\n static override styles = css`\n :host {\n display: flex;\n justify-content: center;\n font-family: var(--fx-font-family);\n font-size: var(--fx-font-size);\n }\n .wrap {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--fx-space-sm);\n padding: var(--fx-space-2xl, 48px) var(--fx-space-xl);\n text-align: center;\n max-width: 420px;\n }\n .icon {\n font-size: calc(var(--fx-font-size) + 28px);\n line-height: 1;\n color: var(--fx-text-muted);\n }\n .icon[hidden] { display: none; }\n h4 {\n margin: 0;\n font-size: calc(var(--fx-font-size) + 3px);\n font-weight: 600;\n color: var(--fx-text-default);\n }\n h4[hidden] { display: none; }\n p {\n margin: 0;\n font-size: calc(var(--fx-font-size) - 1px);\n color: var(--fx-text-muted);\n line-height: 1.5;\n }\n p[hidden] { display: none; }\n .action { margin-top: var(--fx-space-sm); }\n .action:empty { display: none; }\n /* Base dos glifos Fenix Icons (o @font-face vem de @wrrdev/fenix-ui/icons). */\n ${FENIX_ICON_BASE_CSS}\n `;\n\n static override get observedAttributes(): string[] {\n return ['icon', 'heading', 'description'];\n }\n\n protected override render(): void {\n const icon = this.getAttr('icon', '📭');\n const heading = this.getAttr('heading');\n const description = this.getAttr('description');\n\n this.setTemplate(`\n <div class=\"wrap\" part=\"wrap\">\n <span class=\"icon\" part=\"icon\" aria-hidden=\"true\">${fenixIconHtml(icon)}</span>\n <h4 part=\"heading\" ${heading ? '' : 'hidden'}>${esc(heading)}</h4>\n <p part=\"description\" ${description ? '' : 'hidden'}>${esc(description)}</p>\n <slot name=\"icon\"></slot>\n <span class=\"action\"><slot name=\"action\"></slot></span>\n </div>\n `);\n }\n}\n\nexport function defineFxEmptyState(): typeof FxEmptyState {\n return defineElement('fx-empty-state', FxEmptyState);\n}","import { FxEmptyState, defineFxEmptyState } from './empty-state';\n\nexport { FxEmptyState };\n\ndefineFxEmptyState();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'fx-empty-state': FxEmptyState;\n }\n}","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\n\n/**\n * <fx-password-strength> — Medidor de força de senha.\n *\n * Atributos: value (a senha a avaliar), label (rótulo acima), size (sm|md|lg).\n * A força (0-4) é calculada por comprimento e variedade de caracteres.\n * Evento (composed): `change` (detail: { score: 0-4, value }).\n */\nexport class FxPasswordStrength 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 .label {\n font-size: calc(var(--fx-font-size) - 2px);\n color: var(--fx-text-muted);\n margin-bottom: var(--fx-space-xs);\n display: flex;\n justify-content: space-between;\n gap: var(--fx-space-md);\n }\n .label strong { color: var(--_color); }\n .bars {\n display: flex;\n gap: 4px;\n --_color: var(--fx-text-muted);\n }\n .bar {\n flex: 1;\n height: 6px;\n border-radius: var(--fx-radius-full);\n background: var(--fx-surface-surface-hover, rgba(0, 0, 0, 0.08));\n transition: background var(--fx-motion-duration-normal) var(--fx-motion-easing);\n }\n .bar.on { background: var(--_color); }\n :host([size='sm']) .bar { height: 4px; }\n :host([size='lg']) .bar { height: 8px; }\n /* cores por nível via data-score no host */\n :host([data-score='1']) { --_color: var(--fx-color-danger); }\n :host([data-score='2']) { --_color: var(--fx-color-warning); }\n :host([data-score='3']) { --_color: var(--fx-color-info); }\n :host([data-score='4']) { --_color: var(--fx-color-success); }\n `;\n\n static override get observedAttributes(): string[] {\n return ['value', 'label', 'size'];\n }\n\n get value(): string { return this.getAttr('value'); }\n set value(v: string) { this.setAttribute('value', v); }\n\n /** Calcula a força da senha (0-4). */\n private _score(): number {\n const v = this.value;\n if (!v) return 0;\n let score = 0;\n if (v.length >= 6) score++;\n if (v.length >= 10) score++;\n if (/[A-Z]/.test(v) && /[a-z]/.test(v)) score++;\n if (/\\d/.test(v) && /[^A-Za-z0-9]/.test(v)) score++;\n return Math.min(4, score);\n }\n\n private _labelFor(score: number): string {\n return ['Muito fraca', 'Fraca', 'Razoável', 'Forte', 'Muito forte'][score];\n }\n\n protected override render(): void {\n this._paint();\n }\n\n private _paint(): void {\n const score = this._score();\n const label = this.getAttr('label', 'Força da senha');\n\n this.setTemplate(`\n <div class=\"label\" part=\"label\">\n <span>${label}</span>\n <strong>${score > 0 ? this._labelFor(score) : ''}</strong>\n </div>\n <div class=\"bars\" part=\"bars\" role=\"progressbar\" aria-valuemin=\"0\" aria-valuemax=\"4\" aria-valuenow=\"${score}\">\n ${Array.from({ length: 4 }, (_, i) => `<span class=\"bar ${i < score ? 'on' : ''}\" part=\"bar\"></span>`).join('')}\n </div>\n `);\n this.dataset.score = String(score);\n }\n\n protected override attributeChangedCallback(): void {\n if (this.isConnected) {\n const prev = this._prevScore;\n this._paint();\n const score = this._score();\n if (score !== prev) {\n this.dispatchEvent(new CustomEvent('change', {\n bubbles: true, composed: true,\n detail: { score, value: this.value },\n }));\n this._prevScore = score;\n }\n }\n }\n\n private _prevScore = -1;\n}\n\nexport function defineFxPasswordStrength(): typeof FxPasswordStrength {\n return defineElement('fx-password-strength', FxPasswordStrength);\n}","import { FxPasswordStrength, defineFxPasswordStrength } from './password-strength';\n\nexport { FxPasswordStrength };\n\ndefineFxPasswordStrength();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'fx-password-strength': FxPasswordStrength;\n }\n}","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\nimport { esc } from '../../core/sanitize';\n\n/**\n * <fx-timeline> — Linha do tempo vertical com eventos.\n *\n * Atributos: marker (glifo do marcador, padrão '●'), size (sm|md|lg).\n * Slot `item`: cada elemento com [slot=\"item\"] vira um evento. Use os\n * atributos `time` (texto do horário/data), `title` e `icon` (glifo da\n * fonte Fenix Icons, ex.: \"check_circle\") no item.\n *\n * Exemplo:\n * <fx-timeline>\n * <div slot=\"item\" time=\"09:00\" title=\"Reunião\">Detalhes…</div>\n * <div slot=\"item\" time=\"14:00\" title=\"Deploy\">Detalhes…</div>\n * </fx-timeline>\n */\nexport class FxTimeline 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 --_marker: calc(var(--fx-font-size) + 6px);\n }\n :host([size='sm']) { --_marker: calc(var(--fx-font-size) - 2px); }\n :host([size='lg']) { --_marker: calc(var(--fx-font-size) + 14px); }\n\n .tl {\n list-style: none;\n margin: 0;\n padding: 0;\n position: relative;\n }\n /* linha vertical centralizada no eixo dos marcadores */\n .tl::before {\n content: '';\n position: absolute;\n left: calc(var(--_marker) / 2 - 1px);\n top: calc(var(--_marker) / 2);\n bottom: 6px;\n width: 2px;\n background: var(--fx-border-default);\n }\n .event {\n position: relative;\n padding: 0 0 var(--fx-space-lg) calc(var(--_marker) + var(--fx-space-lg));\n }\n .event:last-child { padding-bottom: 0; }\n /* marcador circular centralizado no eixo da linha */\n .dot {\n position: absolute;\n left: 0;\n top: 0;\n width: var(--_marker);\n height: var(--_marker);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-size: calc(var(--_marker) * 0.5);\n color: var(--fx-color-primary);\n line-height: 1;\n }\n /* marcador com ícone da fonte Fenix Icons (atributo icon no item) */\n .dot.fx-icon {\n font-family: var(--fx-icon-font, 'Fenix Icons');\n font-weight: normal;\n font-style: normal;\n font-variation-settings: 'FILL' 0, 'wght' 500, 'GRAD' 0, 'opsz' 24;\n -webkit-font-smoothing: antialiased;\n user-select: none;\n background: color-mix(in srgb, var(--fx-color-primary) 14%, transparent);\n border-radius: 50%;\n font-size: calc(var(--_marker) * 0.55);\n }\n .head {\n display: flex;\n align-items: baseline;\n gap: var(--fx-space-sm);\n flex-wrap: wrap;\n min-height: var(--_marker);\n }\n .time {\n font-size: calc(var(--fx-font-size) - 2px);\n color: var(--fx-text-muted);\n white-space: nowrap;\n }\n .title {\n font-weight: 600;\n color: var(--fx-text-default);\n }\n .content {\n margin-top: 2px;\n color: var(--fx-text-default);\n line-height: 1.5;\n }\n .event[hidden] { display: none; }\n\n /* ---- modo horizontal ---- */\n :host([orientation='horizontal']) .tl {\n display: flex;\n }\n :host([orientation='horizontal']) .tl::before {\n left: calc(var(--_marker) / 2 - 1px);\n right: calc(var(--_marker) / 2);\n top: calc(var(--_marker) / 2 - 1px);\n bottom: auto;\n width: auto;\n height: 2px;\n }\n :host([orientation='horizontal']) .event {\n flex: 1;\n display: flex;\n flex-direction: column;\n padding: 0 var(--fx-space-lg) 0 0;\n }\n :host([orientation='horizontal']) .event:last-child { padding-right: 0; }\n :host([orientation='horizontal']) .event .dot {\n position: static;\n margin-bottom: var(--fx-space-sm);\n }\n `;\n\n static override get observedAttributes(): string[] {\n return ['marker', 'size', 'orientation'];\n }\n\n protected override render(): void {\n this.setTemplate(`<ol class=\"tl\" part=\"timeline\"></ol>`);\n this._decorate();\n }\n\n /**\n * Monta os eventos a partir dos itens do light DOM.\n * Os itens permanecem no light DOM (sem slot correspondente, não são\n * renderizados) — assim a decoração é idempotente e sobrevive a re-renders.\n */\n private _decorate(): void {\n const list = this.shadowRoot?.querySelector('ol');\n if (!list) return;\n const marker = this.getAttr('marker', '●');\n const items = Array.from(this.querySelectorAll('[slot=\"item\"]'));\n if (!items.length) return;\n\n list.innerHTML = items\n .map((item) => {\n const time = item.getAttribute('time') ?? '';\n const title = item.getAttribute('title') ?? '';\n const head = [\n time ? `<span class=\"time\">${esc(time)}</span>` : '',\n title ? `<span class=\"title\">${esc(title)}</span>` : '',\n ].join('');\n // Ícone por item (atributo icon) tem prioridade sobre o glifo global (marker).\n const icon = item.getAttribute('icon');\n const dot = icon\n ? `<span class=\"dot fx-icon\" part=\"marker\" aria-hidden=\"true\">${esc(icon)}</span>`\n : `<span class=\"dot\" part=\"marker\" aria-hidden=\"true\">${esc(marker)}</span>`;\n return `<li class=\"event\" part=\"event\">${dot}<div class=\"head\">${head}</div><div class=\"content\">${item.innerHTML}</div></li>`;\n })\n .join('');\n // Garante a fonte de ícones quando algum item usa icon=\"…\" (auto-injeção única).\n if (items.some((item) => item.hasAttribute('icon'))) void import('../../icons');\n }\n\n private _observer?: MutationObserver;\n\n protected override connectedCallback(): void {\n super.connectedCallback();\n // filhos podem chegar depois (innerHTML do playground)\n this._observer = new MutationObserver(() => this._decorate());\n this._observer.observe(this, { childList: true, subtree: false });\n this._decorate();\n }\n\n protected override disconnectedCallback(): void {\n super.disconnectedCallback();\n this._observer?.disconnect();\n this._observer = undefined;\n }\n}\n\nexport function defineFxTimeline(): typeof FxTimeline {\n return defineElement('fx-timeline', FxTimeline);\n}","import { FxTimeline, defineFxTimeline } from './timeline';\n\nexport { FxTimeline };\n\ndefineFxTimeline();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'fx-timeline': FxTimeline;\n }\n}","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\n\n/**\n * <fx-carousel> — Carrossel de slides com navegação e indicadores.\n *\n * Atributos: active (índice do slide), autoplay (ms), loop, show-arrows,\n * show-indicators.\n * Slot `slide`: cada elemento com [slot=\"slide\"] vira um slide.\n * Eventos (composed): `change` (detail: { index }).\n */\nexport class FxCarousel 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 .viewport {\n position: relative;\n overflow: hidden;\n border-radius: var(--fx-radius-lg);\n border: 1px solid var(--fx-border-default);\n background: var(--fx-surface-surface-hover, rgba(0, 0, 0, 0.04));\n }\n .slide {\n min-height: 200px;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--fx-space-xl);\n box-sizing: border-box;\n color: var(--fx-text-default);\n }\n .slide[hidden] { display: none; }\n .arrow {\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n width: 34px;\n height: 34px;\n border: 1px solid var(--fx-border-default);\n border-radius: var(--fx-radius-full);\n background: color-mix(in srgb, var(--fx-surface-background, #fff) 82%, transparent);\n color: var(--fx-text-default);\n font-size: calc(var(--fx-font-size) + 4px);\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n backdrop-filter: blur(2px);\n transition: background var(--fx-motion-duration-fast) var(--fx-motion-easing), border-color var(--fx-motion-duration-fast) var(--fx-motion-easing), color var(--fx-motion-duration-fast) var(--fx-motion-easing), transform var(--fx-motion-duration-fast) var(--fx-motion-easing);\n }\n .arrow:hover {\n background: var(--fx-color-primary);\n border-color: var(--fx-color-primary);\n color: #fff;\n transform: translateY(-50%) scale(1.08);\n }\n .arrow[hidden] { display: none; }\n .arrow.prev { left: var(--fx-space-md); }\n .arrow.next { right: var(--fx-space-md); }\n .indicators {\n display: flex;\n justify-content: center;\n gap: 6px;\n padding: var(--fx-space-md) 0 var(--fx-space-xs);\n }\n .indicators[hidden] { display: none; }\n .dot {\n width: 8px;\n height: 8px;\n border-radius: var(--fx-radius-full);\n border: none;\n padding: 0;\n background: var(--fx-surface-surface-hover, rgba(0, 0, 0, 0.15));\n cursor: pointer;\n transition: background var(--fx-motion-duration-fast) var(--fx-motion-easing), width var(--fx-motion-duration-fast) var(--fx-motion-easing);\n }\n .dot.on { background: var(--fx-color-primary); width: 20px; }\n `;\n\n static override get observedAttributes(): string[] {\n return ['active', 'autoplay', 'loop', 'show-arrows', 'show-indicators'];\n }\n\n get active(): number {\n const n = Number(this.getAttr('active', '0'));\n return Math.min(this.slideCount - 1, Math.max(0, Number.isFinite(n) ? n : 0));\n }\n set active(v: number) {\n this.setAttribute('active', String(Math.min(this.slideCount - 1, Math.max(0, v))));\n }\n\n get slideCount(): number { return this._slides.length; }\n\n private _slides: Element[] = [];\n private _timer?: ReturnType<typeof setInterval>;\n\n protected override render(): void {\n this._slides = Array.from(this.children).filter((el) => el.matches('[slot=\"slide\"]'));\n\n const contentsHtml = this._slides\n .map((s, i) => `<div class=\"slide\" part=\"slide\" data-i=\"${i}\" ${i === this.active ? '' : 'hidden'}>${s.innerHTML}</div>`)\n .join('');\n\n this.setTemplate(`\n <div class=\"viewport\" part=\"viewport\">\n ${contentsHtml}\n <button type=\"button\" class=\"arrow prev\" part=\"arrow\" aria-label=\"Anterior\" ${this.hasAttr('show-arrows') ? '' : 'hidden'}>‹</button>\n <button type=\"button\" class=\"arrow next\" part=\"arrow\" aria-label=\"Próximo\" ${this.hasAttr('show-arrows') ? '' : 'hidden'}>›</button>\n </div>\n <div class=\"indicators\" part=\"indicators\" ${this.hasAttr('show-indicators') ? '' : 'hidden'}>\n ${this._slides.map((_, i) => `<button type=\"button\" class=\"dot ${i === this.active ? 'on' : ''}\" data-i=\"${i}\" aria-label=\"Slide ${i + 1}\"></button>`).join('')}\n </div>\n `);\n\n this._bind();\n this._restartAutoplay();\n }\n\n protected override attributeChangedCallback(\n name: string,\n oldValue: string | null,\n newValue: string | null,\n ): void {\n if (!this.isConnected || oldValue === newValue) return;\n // só o índice ativo evita re-render total (preserva autoplay)\n if (name === 'active' && this._slides.length) {\n this._go(this.active, false);\n this._restartAutoplay();\n return;\n }\n // show-arrows/show-indicators/loop/autoplay: re-render estrutural\n this.render();\n }\n\n private _go(index: number, emit = true): void {\n const count = this._slides.length;\n if (!count) return;\n let target: number;\n if (this.hasAttr('loop')) {\n // wrap nas duas direções (permite voltar do primeiro ao último)\n target = ((index % count) + count) % count;\n } else {\n target = Math.min(count - 1, Math.max(0, index));\n }\n // guarda: evita recursão infinita (setAttribute → attributeChangedCallback → _go)\n if (String(target) === this.getAttribute('active')) return;\n this.active = target;\n\n this.root.querySelectorAll<HTMLElement>('.slide').forEach((s) => {\n s.toggleAttribute('hidden', Number(s.dataset.i) !== target);\n });\n this.root.querySelectorAll<HTMLElement>('.dot').forEach((d) => {\n d.classList.toggle('on', Number(d.dataset.i) === target);\n });\n if (emit) {\n this.dispatchEvent(new CustomEvent('change', { bubbles: true, composed: true, detail: { index: target } }));\n }\n }\n\n next(): void { this._go(this.active + 1); }\n prev(): void { this._go(this.active - 1); }\n\n private _bind(): void {\n this.root.querySelector('.arrow.prev')?.addEventListener('click', () => this.prev());\n this.root.querySelector('.arrow.next')?.addEventListener('click', () => this.next());\n this.root.querySelectorAll<HTMLElement>('.dot').forEach((d) => {\n d.addEventListener('click', () => this._go(Number(d.dataset.i)));\n });\n }\n\n private _restartAutoplay(): void {\n if (this._timer) { clearInterval(this._timer); this._timer = undefined; }\n const ms = Number(this.getAttr('autoplay', '0'));\n if (ms > 0) {\n this._timer = setInterval(() => this._go(this.active + 1), ms);\n }\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n if (this._timer) { clearInterval(this._timer); this._timer = undefined; }\n }\n}\n\nexport function defineFxCarousel(): typeof FxCarousel {\n return defineElement('fx-carousel', FxCarousel);\n}\n","import { FxCarousel, defineFxCarousel } from './carousel';\n\nexport { FxCarousel };\n\ndefineFxCarousel();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'fx-carousel': FxCarousel;\n }\n}","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\nimport { esc } from '../../core/sanitize';\n\n/**\n * <fx-tree> — Árvore hierárquica com expandir/recolher e seleção.\n *\n * Dados via atributo `data` (JSON):\n * [{ label: 'Item', icon: '📁', children: [{ label: 'Filho' }] }]\n *\n * Atributos: data (JSON), expand-all (expande tudo), size (sm|md|lg).\n * Eventos (composed): `select` (detail: { node }).\n */\ninterface TreeNode {\n label: string;\n icon?: string;\n children?: TreeNode[];\n}\n\nexport class FxTree 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 ul { list-style: none; margin: 0; padding: 0; }\n ul ul { padding-left: var(--fx-space-xl); }\n li { margin: 2px 0; }\n .row {\n display: inline-flex;\n align-items: center;\n gap: var(--fx-space-xs);\n padding: var(--fx-space-xs) var(--fx-space-sm);\n border-radius: var(--fx-radius-sm);\n color: var(--fx-text-default);\n cursor: pointer;\n user-select: none;\n width: 100%;\n box-sizing: border-box;\n transition: background var(--fx-motion-duration-fast) var(--fx-motion-easing);\n }\n .row:hover { background: var(--fx-surface-surface-hover, rgba(0, 0, 0, 0.05)); }\n .row.selected { background: color-mix(in srgb, var(--fx-color-primary) 12%, transparent); color: var(--fx-color-primary); font-weight: 600; }\n .caret {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n min-width: 16px;\n font-size: calc(var(--fx-font-size) - 2px);\n color: var(--fx-text-muted);\n cursor: pointer;\n transition: transform var(--fx-motion-duration-fast) var(--fx-motion-easing);\n user-select: none;\n }\n .caret.open { transform: rotate(90deg); }\n .caret.leaf { visibility: hidden; }\n .icon { line-height: 1; }\n .children[hidden] { display: none; }\n :host([size='sm']) .row { padding: 2px var(--fx-space-xs); font-size: calc(var(--fx-font-size) - 2px); }\n :host([size='lg']) .row { padding: var(--fx-space-sm) var(--fx-space-md); font-size: calc(var(--fx-font-size) + 1px); }\n `;\n\n static override get observedAttributes(): string[] {\n return ['data', 'expand-all', 'size'];\n }\n\n private _expanded = new Set<string>();\n private _selected: string | null = null;\n\n protected override render(): void {\n this.setTemplate(`<ul part=\"tree\">${this._renderNodes(this.data, '')}</ul>`);\n this._bind();\n }\n\n private _path(i: number, parent: string): string {\n return parent ? `${parent}.${i}` : `${i}`;\n }\n\n private _renderNodes(nodes: TreeNode[], parent: string): string {\n const expandAll = this.hasAttr('expand-all');\n return nodes\n .map((node, i) => {\n const path = this._path(i, parent);\n const hasChildren = Array.isArray(node.children) && node.children.length > 0;\n const isOpen = expandAll || this._expanded.has(path);\n const selected = this._selected === path ? ' selected' : '';\n const children = hasChildren\n ? `<ul class=\"children\" ${isOpen ? '' : 'hidden'}>${this._renderNodes(node.children!, path)}</ul>`\n : '';\n return `<li><span class=\"row${selected}\" data-path=\"${path}\" role=\"treeitem\" tabindex=\"0\"><span class=\"caret ${hasChildren ? (isOpen ? 'open' : '') : 'leaf'}\" data-toggle=\"${hasChildren ? path : ''}\">▸</span>${node.icon ? `<span class=\"icon\">${esc(node.icon)}</span>` : ''}<span class=\"label\">${esc(node.label)}</span></span>${children}</li>`;\n })\n .join('');\n }\n\n\n get data(): TreeNode[] {\n try {\n const parsed = JSON.parse(this.getAttr('data', '[]'));\n return Array.isArray(parsed) ? parsed : [];\n } catch {\n return [];\n }\n }\n set data(v: TreeNode[]) { this.setAttribute('data', JSON.stringify(v)); }\n\n private _bind(): void {\n this.root.querySelectorAll<HTMLElement>('.caret[data-toggle]').forEach((caret) => {\n const path = caret.dataset.toggle;\n if (!path) return;\n caret.addEventListener('click', (e) => {\n e.stopPropagation();\n this._toggle(path, caret);\n });\n });\n this.root.querySelectorAll<HTMLElement>('.row').forEach((row) => {\n const path = row.dataset.path ?? '';\n row.addEventListener('click', () => {\n this._selected = path;\n this.root.querySelectorAll<HTMLElement>('.row').forEach((r) =>\n r.classList.toggle('selected', r === row),\n );\n this.dispatchEvent(new CustomEvent('select', {\n bubbles: true, composed: true, detail: { node: this._findNode(path) },\n }));\n });\n row.addEventListener('keydown', (e) => {\n if ((e as KeyboardEvent).key === 'Enter') row.click();\n });\n });\n }\n\n private _toggle(path: string, caret: HTMLElement): void {\n if (this._expanded.has(path)) this._expanded.delete(path);\n else this._expanded.add(path);\n const isOpen = this._expanded.has(path);\n caret.classList.toggle('open', isOpen);\n const li = caret.closest('li');\n li?.querySelector<HTMLElement>(':scope > ul.children')?.toggleAttribute('hidden', !isOpen);\n }\n\n private _findNode(path: string): TreeNode | undefined {\n let nodes = this.data;\n let node: TreeNode | undefined;\n for (const part of path.split('.')) {\n node = nodes[Number(part)];\n if (!node) return undefined;\n nodes = node.children ?? [];\n }\n return node;\n }\n\n /** Expande ou recolhe todos os nós. */\n setAllExpanded(open: boolean): void {\n if (open) this.setAttribute('expand-all', '');\n else { this.removeAttribute('expand-all'); this._expanded.clear(); }\n this.render();\n }\n}\n\nexport function defineFxTree(): typeof FxTree {\n return defineElement('fx-tree', FxTree);\n}\n","import { FxTree, defineFxTree } from './tree';\n\nexport { FxTree };\n\ndefineFxTree();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'fx-tree': FxTree;\n }\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), mode ('light'|'dark' — força o esquema de\n * cores do card independentemente do tema global).\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; pointer-events: auto; }\n/* Modo explícito: sobrepõe os tokens herdados do tema global SOMENTE neste card. */\n:host([mode='dark']) {\n --fx-surface-background: #1e293b;\n --fx-text-default: #f1f5f9;\n --fx-text-muted: #94a3b8;\n --fx-border-default: #334155;\n --fx-shadow-lg: 0 10px 30px rgba(0, 0, 0, .5);\n --fx-surface-surface-hover: rgba(255, 255, 255, .08);\n}\n:host([mode='light']) {\n --fx-surface-background: #ffffff;\n --fx-text-default: #1e293b;\n --fx-text-muted: #64748b;\n --fx-border-default: #e2e8f0;\n --fx-shadow-lg: 0 10px 30px rgba(0, 0, 0, .14);\n --fx-surface-surface-hover: rgba(0, 0, 0, .05);\n}\n.fx-icon {\n font-family: var(--fx-icon-font, 'Fenix Icons');\n font-weight: normal;\n font-style: normal;\n line-height: 1;\n letter-spacing: normal;\n display: inline-block;\n white-space: nowrap;\n direction: ltr;\n font-variation-settings: 'FILL' 0, 'wght' 500, 'GRAD' 0, 'opsz' 24;\n -webkit-font-smoothing: antialiased;\n user-select: none;\n}\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', 'icon', 'mode'];\n }\n\n /** Esquema de cores forçado do card: 'light' | 'dark' | undefined (segue o tema). */\n get mode(): 'light' | 'dark' | undefined {\n const m = this.getAttribute('mode');\n return m === 'light' || m === 'dark' ? m : undefined;\n }\n set mode(value: 'light' | 'dark' | undefined) {\n if (value) this.setAttribute('mode', value);\n else this.removeAttribute('mode');\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 const iconName = this.getAttribute('icon');\n const isFxIcon = !!iconName && /^[a-z][a-z0-9_]*$/.test(iconName);\n if (isFxIcon) void import('../../icons');\n const iconContent = isFxIcon ? iconName : KIND_ICON[kind] ?? KIND_ICON.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${isFxIcon ? ' fx-icon' : ''}\">${iconContent}</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 // Os cards reabilitam pointer-events via `:host { pointer-events: auto }` (herança),\n // sem necessidade de MutationObserver.\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 /** Força o esquema de cores do card, independentemente do tema global. */\n mode?: 'light' | 'dark';\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 if (o.mode) el.setAttribute('mode', o.mode);\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\n\n","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\nimport { esc } from '../../core/sanitize';\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\">${esc(content)}</span>\n `);\n }\n}\n\nexport function defineFxTooltip(): typeof FxTooltip {\n return defineElement('fx-tooltip', FxTooltip);\n}\n","/**\n * Diretiva fx-tooltip — Aplica tooltip em qualquer elemento HTML.\n *\n * Uso:\n * <div fx-tooltip=\"Texto simples\">Div com tooltip</div>\n * <button fx-tooltip=\"Clique\" fx-tooltip-position=\"bottom\">Botão</button>\n * <span fx-tooltip=\"<strong>HTML</strong>\" fx-tooltip-html>Texto</span>\n *\n * Atributos:\n * fx-tooltip — Conteúdo do tooltip (texto ou HTML)\n * fx-tooltip-position — Posição: top | bottom | left | right (padrão: top)\n * fx-tooltip-html — Se presente, trata o conteúdo como HTML\n */\n\nexport interface FxTooltipConfig {\n position: 'top' | 'bottom' | 'left' | 'right';\n html: boolean;\n}\n\nconst DEFAULT_CONFIG: FxTooltipConfig = {\n position: 'top',\n html: false,\n};\n\n/**\n * Classe que gerencia o comportamento de tooltip em um elemento.\n */\nclass TooltipBehavior {\n private element: HTMLElement;\n private tooltipElement: HTMLSpanElement | null = null;\n private config: FxTooltipConfig;\n private showTimeout: number | null = null;\n private hideTimeout: number | null = null;\n\n constructor(element: HTMLElement) {\n this.element = element;\n this.config = this.parseConfig();\n this.init();\n }\n\n private parseConfig(): FxTooltipConfig {\n const position = this.element.getAttribute('fx-tooltip-position') as FxTooltipConfig['position'];\n return {\n position: position && ['top', 'bottom', 'left', 'right'].includes(position) ? position : DEFAULT_CONFIG.position,\n html: this.element.hasAttribute('fx-tooltip-html'),\n };\n }\n\n private init(): void {\n const computedStyle = window.getComputedStyle(this.element);\n if (computedStyle.position === 'static') {\n this.element.style.position = 'relative';\n }\n this.createTooltipElement();\n this.element.addEventListener('mouseenter', this.show);\n this.element.addEventListener('mouseleave', this.hide);\n this.element.addEventListener('focus', this.show);\n this.element.addEventListener('blur', this.hide);\n }\n\n private createTooltipElement(): void {\n const content = this.element.getAttribute('fx-tooltip');\n if (!content) return;\n this.tooltipElement = document.createElement('span');\n this.tooltipElement.setAttribute('role', 'tooltip');\n this.tooltipElement.setAttribute('data-fx-tooltip', '');\n this.tooltipElement.className = `fx-tooltip-bubble fx-tooltip-${this.config.position}`;\n if (this.config.html) {\n this.tooltipElement.innerHTML = content;\n } else {\n this.tooltipElement.textContent = content;\n }\n this.element.appendChild(this.tooltipElement);\n }\n\n private show = (): void => {\n if (this.hideTimeout) {\n clearTimeout(this.hideTimeout);\n this.hideTimeout = null;\n }\n this.showTimeout = window.setTimeout(() => {\n if (this.tooltipElement) {\n this.tooltipElement.classList.add('fx-tooltip-visible');\n }\n }, 100);\n };\n\n private hide = (): void => {\n if (this.showTimeout) {\n clearTimeout(this.showTimeout);\n this.showTimeout = null;\n }\n this.hideTimeout = window.setTimeout(() => {\n if (this.tooltipElement) {\n this.tooltipElement.classList.remove('fx-tooltip-visible');\n }\n }, 50);\n };\n\n public update(): void {\n this.config = this.parseConfig();\n if (this.tooltipElement) {\n this.tooltipElement.remove();\n this.tooltipElement = null;\n }\n this.createTooltipElement();\n }\n\n public destroy(): void {\n this.element.removeEventListener('mouseenter', this.show);\n this.element.removeEventListener('mouseleave', this.hide);\n this.element.removeEventListener('focus', this.show);\n this.element.removeEventListener('blur', this.hide);\n if (this.showTimeout) clearTimeout(this.showTimeout);\n if (this.hideTimeout) clearTimeout(this.hideTimeout);\n if (this.tooltipElement) {\n this.tooltipElement.remove();\n this.tooltipElement = null;\n }\n }\n}\n\n/**\n * Gerencia todas as instâncias de tooltip no documento.\n */\nclass FxTooltipManager {\n private static instance: FxTooltipManager | null = null;\n private observer: MutationObserver | null = null;\n private behaviors: Map<HTMLElement, TooltipBehavior> = new Map();\n private injectedStyles: HTMLStyleElement | null = null;\n\n private constructor() {\n this.injectStyles();\n this.observe();\n this.processExistingElements();\n }\n\n public static getInstance(): FxTooltipManager {\n if (!FxTooltipManager.instance) {\n FxTooltipManager.instance = new FxTooltipManager();\n }\n return FxTooltipManager.instance;\n }\n\n private injectStyles(): void {\n if (document.getElementById('fx-tooltip-directive-styles')) return;\n this.injectedStyles = document.createElement('style');\n this.injectedStyles.id = 'fx-tooltip-directive-styles';\n this.injectedStyles.textContent = getTooltipStyles();\n document.head.appendChild(this.injectedStyles);\n }\n\n private observe(): void {\n this.observer = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n if (mutation.type === 'childList') {\n mutation.addedNodes.forEach((node) => {\n if (node instanceof HTMLElement) {\n this.processElement(node);\n node.querySelectorAll<HTMLElement>('[fx-tooltip]').forEach((el) => this.processElement(el));\n }\n });\n }\n if (mutation.type === 'attributes' && mutation.target instanceof HTMLElement) {\n const target = mutation.target;\n if (target.hasAttribute('fx-tooltip')) {\n this.processElement(target);\n } else if (this.behaviors.has(target)) {\n this.removeBehavior(target);\n }\n }\n }\n });\n this.observer.observe(document.body, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['fx-tooltip', 'fx-tooltip-position', 'fx-tooltip-html'],\n });\n }\n\n private processExistingElements(): void {\n document.querySelectorAll<HTMLElement>('[fx-tooltip]').forEach((el) => this.processElement(el));\n }\n\n private processElement(element: HTMLElement): void {\n if (!element.hasAttribute('fx-tooltip')) {\n this.removeBehavior(element);\n return;\n }\n if (this.behaviors.has(element)) {\n this.behaviors.get(element)!.update();\n } else {\n this.behaviors.set(element, new TooltipBehavior(element));\n }\n }\n\n private removeBehavior(element: HTMLElement): void {\n const behavior = this.behaviors.get(element);\n if (behavior) {\n behavior.destroy();\n this.behaviors.delete(element);\n }\n }\n\n public destroy(): void {\n if (this.observer) {\n this.observer.disconnect();\n this.observer = null;\n }\n this.behaviors.forEach((behavior) => behavior.destroy());\n this.behaviors.clear();\n if (this.injectedStyles) {\n this.injectedStyles.remove();\n this.injectedStyles = null;\n }\n FxTooltipManager.instance = null;\n }\n}\n\n/**\n * Retorna os estilos CSS para os tooltips.\n */\nfunction getTooltipStyles(): string {\n return /* css */ `\n [fx-tooltip] {\n position: relative;\n }\n\n .fx-tooltip-bubble {\n position: absolute;\n background: var(--fx-text-default, #1e293b);\n color: var(--fx-surface-background, #fff);\n font-family: var(--fx-font-family, system-ui, -apple-system, sans-serif);\n font-size: calc(var(--fx-font-size, 14px) - 2px);\n line-height: 1.45;\n padding: var(--fx-space-xs, 4px) var(--fx-space-md, 12px);\n border-radius: var(--fx-radius-sm, 4px);\n box-shadow: var(--fx-shadow-md, 0 4px 6px -1px rgba(0, 0, 0, 0.1));\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, 150ms) var(--fx-motion-easing, ease);\n z-index: var(--fx-z-tooltip, 1050);\n pointer-events: none;\n }\n\n .fx-tooltip-bubble.fx-tooltip-visible {\n opacity: 1;\n visibility: visible;\n }\n\n .fx-tooltip-top {\n bottom: calc(100% + 6px);\n left: 50%;\n transform: translateX(-50%);\n }\n .fx-tooltip-top::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\n .fx-tooltip-bottom {\n top: calc(100% + 6px);\n left: 50%;\n transform: translateX(-50%);\n bottom: auto;\n }\n .fx-tooltip-bottom::after {\n content: '';\n position: absolute;\n bottom: 100%;\n left: 50%;\n transform: translateX(-50%);\n border: 5px solid transparent;\n border-bottom-color: var(--fx-text-default, #1e293b);\n }\n\n .fx-tooltip-left {\n right: calc(100% + 6px);\n top: 50%;\n transform: translateY(-50%);\n left: auto;\n bottom: auto;\n }\n .fx-tooltip-left::after {\n content: '';\n position: absolute;\n top: 50%;\n left: 100%;\n transform: translateY(-50%);\n border: 5px solid transparent;\n border-left-color: var(--fx-text-default, #1e293b);\n }\n\n .fx-tooltip-right {\n left: calc(100% + 6px);\n top: 50%;\n transform: translateY(-50%);\n right: auto;\n bottom: auto;\n }\n .fx-tooltip-right::after {\n content: '';\n position: absolute;\n top: 50%;\n right: 100%;\n transform: translateY(-50%);\n border: 5px solid transparent;\n border-right-color: var(--fx-text-default, #1e293b);\n }\n `;\n}\n\n/**\n * Inicializa a diretiva fx-tooltip.\n * Deve ser chamado uma vez na aplicação.\n *\n * @example\n * import { defineFxTooltipDirective } from '@wrrdev/fenix-ui/tooltip';\n * defineFxTooltipDirective();\n */\nexport function defineFxTooltipDirective(): void {\n if (typeof window === 'undefined') return;\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', () => {\n FxTooltipManager.getInstance();\n });\n } else {\n FxTooltipManager.getInstance();\n }\n}\n\n/**\n * Destrói a diretiva fx-tooltip e limpa todos os recursos.\n */\nexport function destroyFxTooltipDirective(): void {\n FxTooltipManager.getInstance().destroy();\n}\n\n","import { FxTooltip, defineFxTooltip } from './tooltip';\nimport { defineFxTooltipDirective, destroyFxTooltipDirective } from './directive';\n\nexport { FxTooltip, defineFxTooltipDirective, destroyFxTooltipDirective };\n\ndefineFxTooltip();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'fx-tooltip': FxTooltip;\n }\n}\n","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\nimport { esc } from '../../core/sanitize';\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=\"${esc(tabId)}\" aria-selected=\"${tabId === active}\"\n ${disabled ? 'aria-disabled=\"true\" data-disabled=\"true\"' : ''}>${esc(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 /** Setter necessário: o Vue (patchDOMProp) seta `tab` como PROPRIEDADE\n * (pois o getter existe no prototype) — sem ele o atributo nunca é\n * aplicado e o painel nunca é exibido. */\n set tab(value: string) { this.setAttribute('tab', value); }\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';\nimport { esc } from '../../core/sanitize';\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\">${esc(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\n\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 /** Valida um valor de dimensão CSS, retornando-o seguro ou vazio. */\n private safeSize(value: string): string {\n const v = value.trim();\n return /^-?\\d*\\.?\\d+(px|em|rem|%|vw|vh|vmin|vmax|ch|ex|cm|mm|in|pt|pc)$/.test(v) ? v : '';\n }\n\n protected override render(): void {\n const variant = this.getAttr('variant', 'text');\n const width = this.safeSize(this.getAttr('width'));\n const height = this.safeSize(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\n\n","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\nimport { esc } from '../../core/sanitize';\nimport { FENIX_ICON_BASE_CSS, isFenixIconName } from '../../icons/base-css';\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 * icon (nome da Fenix Icons, ex.: icon=\"notification\" — substitui o glifo padrão).\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='info']) { --_color: var(--fx-color-info); --_bg: color-mix(in srgb, var(--fx-color-info) 10%, var(--fx-surface-background)); }\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 ${FENIX_ICON_BASE_CSS}\n .icon.fx-icon { font-size: 20px; line-height: 1.2; }\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', 'icon'];\n }\n\n protected override render(): void {\n const variant = this.getAttr('variant', 'info');\n const title = this.getAttr('title');\n const iconName = this.getAttr('icon');\n if (isFenixIconName(iconName)) void import('../../icons');\n const icons: Record<string, string> = {\n info: 'ℹ', success: '✓', warning: '⚠', danger: '✕',\n };\n const iconHtml = iconName\n ? `<span class=\"icon${isFenixIconName(iconName) ? ' fx-icon' : ''}\" part=\"icon\" aria-hidden=\"true\">${esc(iconName)}</span>`\n : `<span class=\"icon\">${icons[variant] ?? 'ℹ'}</span>`;\n\n this.setTemplate(`\n <div class=\"alert\" part=\"alert\" role=\"alert\">\n ${iconHtml}\n <div class=\"content\">\n ${title ? `<div class=\"title\">${esc(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\n","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\nimport { esc } from '../../core/sanitize';\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 ${esc(label)} ▾\n </span>\n <div class=\"panel\" role=\"menu\" part=\"panel\">\n ${items.length ? '' : '<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 === ' ') {\n e.preventDefault();\n this.open = !this.open;\n } else if (e.key === 'Escape') {\n this.open = false;\n }\n });\n\n this._attachDelegatedListeners();\n }\n\n private docListener?: (e: Event) => void;\n private _listenersAttached = false;\n\n /** Delegação de cliques nos itens + fechamento ao clicar fora (registrado uma vez). */\n private _attachDelegatedListeners(): void {\n if (this._listenersAttached) return;\n this._listenersAttached = true;\n\n this.addEventListener('click', (e) => {\n const item = (e.composedPath() as HTMLElement[]).find(\n (n) => n.tagName?.toLowerCase() === 'fx-dropdown-item',\n );\n if (!item) return;\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 this.docListener = (e: Event) => {\n if (!this.contains(e.target as Node)) this.open = false;\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 this.docListener = undefined;\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';\nimport { esc } from '../../core/sanitize';\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=\"${esc(title || \"Drawer\")}\" tabindex=\"-1\">\n ${title !== \"\" ? `<div class=\"header\" part=\"header\"><span class=\"title\">${esc(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\tthis.root.querySelector(\".overlay\")?.addEventListener(\"click\", this._close);\n\t\tthis.root.querySelector(\".close\")?.addEventListener(\"click\", this._close);\n\n\t\tif (this.open) {\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tif (this._previouslyFocused === null) {\n\t\t\t\t\tthis._previouslyFocused = document.activeElement as HTMLElement | null;\n\t\t\t\t}\n\t\t\t\tthis.root.querySelector<HTMLElement>(\".panel\")?.focus();\n\t\t\t});\n\t\t}\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._close();\n\t\t\t} else if (e.key === \"Tab\" && this.open) {\n\t\t\t\tthis._trapFocus(e);\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\tthis._restoreFocus();\n\t\tsuper.disconnectedCallback?.();\n\t}\n\n\tprivate _onKeydown: (e: KeyboardEvent) => void = () => {};\n\tprivate _previouslyFocused: HTMLElement | null = null;\n\n\tprivate _close = (): void => {\n\t\tif (!this.open) return;\n\t\tthis.open = false;\n\t\tthis._restoreFocus();\n\t\tthis.dispatchEvent(\n\t\t\tnew CustomEvent(\"close\", { bubbles: true, composed: true }),\n\t\t);\n\t};\n\n\t/** Mantém o foco dentro do drawer (WCAG 2.4.3 / 2.1.2). */\n\tprivate _trapFocus(e: KeyboardEvent): void {\n\t\tconst panel = this.root.querySelector<HTMLElement>(\".panel\");\n\t\tif (!panel) return;\n\t\tconst focusables = panel.querySelectorAll<HTMLElement>(\n\t\t\t'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])',\n\t\t);\n\t\tif (!focusables.length) return;\n\t\tconst first = focusables[0];\n\t\tconst last = focusables[focusables.length - 1];\n\t\tconst active = this.root.activeElement;\n\t\tif (e.shiftKey && (active === first || active === panel)) {\n\t\t\te.preventDefault();\n\t\t\tlast.focus();\n\t\t} else if (!e.shiftKey && active === last) {\n\t\t\te.preventDefault();\n\t\t\tfirst.focus();\n\t\t}\n\t}\n\n\tprivate _restoreFocus(): void {\n\t\tif (this._previouslyFocused?.isConnected) this._previouslyFocused.focus();\n\t\tthis._previouslyFocused = null;\n\t}\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';\nimport { esc } from '../../core/sanitize';\nimport '../select';\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]):not(.active) { 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 fx-select { vertical-align: middle; }\n fx-select::part(trigger) {\n min-width: 64px !important;\n min-height: var(--fx-size-sm) !important;\n padding: 0 var(--fx-space-sm) !important;\n border-radius: var(--fx-radius-sm) !important;\n font-size: calc(var(--fx-font-size) - 2px) !important;\n }\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 <fx-select class=\"rows-sel\" part=\"rows\" size=\"sm\" value=\"${this.rows}\" aria-label=\"Itens por página\">\n ${opts.map((o) => `<option value=\"${esc(o)}\">${esc(o)}</option>`).join('')}\n </fx-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<HTMLElement>('fx-select.rows-sel');\n sel?.addEventListener('change', (e) => {\n const value = Number((e as CustomEvent).detail?.value);\n if (!value || value === this.rows) return;\n this.rows = 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\n","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\nimport { esc } from '../../core/sanitize';\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 /* Largura padrão no HOST: CSS externo, classes e style inline no elemento\n vencem este default naturalmente (regras do documento > :host). */\n width: var(--fx-autocomplete-width, 260px);\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 /* Altura determinística: a caixa fica EXATAMENTE no token --fx-size-*. */\n line-height: var(--fx-font-line-height);\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-sm) var(--fx-space-lg);\n /* Acompanha a largura definida no :host. */\n width: 100%;\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 .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 :host([size='sm']) { width: var(--fx-autocomplete-width-sm, 220px); }\n :host([size='sm']) .field { min-height: var(--fx-size-sm); padding: var(--fx-space-xs) var(--fx-space-md); }\n :host([size='lg']) { width: var(--fx-autocomplete-width-lg, 300px); }\n :host([size='lg']) .field { min-height: var(--fx-size-lg); padding: var(--fx-space-sm) var(--fx-space-lg); }\n /* Full width: o host estica até o pai e o campo interno acompanha. */\n :host([full]) { display: block; width: 100%; }\n :host([full]) .field { width: 100%; }\n /* Validação: borda sempre; brilho (anel) via token que acompanha\n effect.focus-ring — desligado ⇒ erro só com a borda vermelha. */\n :host([error]) .field,\n :host([invalid]) .field {\n border-color: var(--fx-color-danger, #dc2626);\n box-shadow: var(--fx-effect-error-ring, 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 box-shadow: var(--fx-effect-success-ring, 0 0 0 3px color-mix(in srgb, var(--fx-color-success, #16a34a) 18%, transparent));\n }\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 // `error`/`success` (+ aliases `invalid`/`valid`) PRECISAM ser observados:\n // é assim que o toggle no playground / setAttribute no submit re-renderiza.\n return ['size', 'placeholder', 'source', 'disabled', 'min-chars', 'error', 'invalid', 'success', 'valid'];\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 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 /** Setter necessário para o Vue (patchDOMProp seta `source` como\n * propriedade, pois o getter existe no prototype). */\n set source(value: string | string[]) {\n this.setAttribute('source', typeof value === 'string' ? value : JSON.stringify(value));\n }\n\n private docListener?: (e: Event) => void;\n\n protected override connectedCallback(): void {\n super.connectedCallback();\n this.docListener = (e: Event) => {\n if (!this.contains(e.target as Node)) this.toggleAttr('open', false);\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 this.docListener = undefined;\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=\"${esc(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=\"${esc(m)}\">${esc(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 // Navegação por teclado: setas movem o foco entre as sugestões; ESC fecha.\n field.addEventListener('keydown', (e) => {\n if (e.key === 'Escape') {\n this.toggleAttr('open', false);\n return;\n }\n if (e.key !== 'ArrowDown' && e.key !== 'ArrowUp') return;\n e.preventDefault();\n if (!this.hasAttr('open')) openList();\n const opts = Array.from(this.root.querySelectorAll<HTMLButtonElement>('.opt'));\n if (!opts.length) return;\n const current = opts.indexOf(this.root.activeElement as HTMLButtonElement);\n const next = e.key === 'ArrowDown'\n ? (current === -1 ? 0 : Math.min(current + 1, opts.length - 1))\n : (current === -1 ? opts.length - 1 : Math.max(current - 1, 0));\n opts[next]?.focus();\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\n","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\nimport { esc } from '../../core/sanitize';\n\n/**\n * <fx-knob> - Controle giratorio circular para ajuste de valor.\n *\n * permite ajustar um valor arrastando o mouse\n * ou usando as setas do teclado. Exibe um arco de progresso circular com\n * o valor central configuravel via valueTemplate.\n *\n * Atributos: value, min, max, step, size, strokeWidth, valueColor, rangeColor,\n * readonly, disabled, valueTemplate.\n * Evento: `change` (composed, detail: { value }).\n */\nexport class FxKnob extends FxElement {\n static override styles = css`\n :host {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-family: var(--fx-font-family);\n font-size: var(--fx-font-size);\n --_size: 100px;\n --_stroke-width: 8px;\n --_value-color: var(--fx-color-primary);\n --_range-color: var(--fx-border-default);\n }\n :host([size='sm']) { --_size: 60px; }\n :host([size='lg']) { --_size: 140px; }\n .knob {\n position: relative;\n width: var(--_size);\n height: var(--_size);\n cursor: pointer;\n user-select: none;\n touch-action: none;\n }\n :host([readonly]) .knob,\n :host([disabled]) .knob {\n cursor: default;\n pointer-events: none;\n }\n :host([disabled]) .knob {\n opacity: 0.55;\n }\n svg {\n width: 100%;\n height: 100%;\n transform: rotate(-90deg);\n }\n .track {\n fill: none;\n stroke: var(--_range-color);\n stroke-width: var(--_stroke-width);\n }\n .value {\n fill: none;\n stroke: var(--_value-color);\n stroke-width: var(--_stroke-width);\n stroke-linecap: round;\n transition: stroke-dashoffset var(--fx-motion-duration-fast) var(--fx-motion-easing);\n }\n .label {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n font-weight: 600;\n color: var(--fx-text-default);\n pointer-events: none;\n }\n :host([size='sm']) .label { font-size: 11px; }\n :host([size='md']) .label { font-size: 14px; }\n :host([size='lg']) .label { font-size: 18px; }\n .knob:focus-visible {\n outline: none;\n }\n .knob:focus-visible svg {\n /* Mesmo fallback none dos demais componentes: sem motor de tema (ou com\n effect.focus-ring desligado) não há anel de foco. */\n filter: drop-shadow(var(--fx-effect-focus-ring, none));\n }\n `;\n\n static override get observedAttributes(): string[] {\n return [\n 'value',\n 'min',\n 'max',\n 'step',\n 'size',\n 'stroke-width',\n 'value-color',\n 'range-color',\n 'readonly',\n 'disabled',\n 'value-template',\n ];\n }\n\n get value(): number {\n return this.clampValue(Number(this.getAttr('value', '0')) || 0);\n }\n set value(v: number) {\n if (this.readonly || this.disabled) return;\n const clamped = this.clampValue(v);\n const current = this.clampValue(Number(this.getAttr('value', '0')) || 0);\n if (clamped !== current) {\n this.setAttribute('value', String(clamped));\n this.dispatchEvent(\n new CustomEvent('change', {\n bubbles: true,\n composed: true,\n detail: { value: clamped },\n }),\n );\n }\n }\n\n get min(): number {\n return Number(this.getAttr('min', '0')) || 0;\n }\n set min(v: number) {\n this.setAttribute('min', String(v));\n }\n\n get max(): number {\n return Number(this.getAttr('max', '100')) || 100;\n }\n set max(v: number) {\n this.setAttribute('max', String(v));\n }\n\n get step(): number {\n return Number(this.getAttr('step', '1')) || 1;\n }\n set step(v: number) {\n this.setAttribute('step', String(v));\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) {\n this.setAttribute('size', v);\n }\n\n get strokeWidth(): number {\n return Number(this.getAttr('stroke-width', '8')) || 8;\n }\n set strokeWidth(v: number) {\n this.setAttribute('stroke-width', String(v));\n }\n\n get valueColor(): string {\n return this.getAttr('value-color', '');\n }\n set valueColor(v: string) {\n this.setAttribute('value-color', v);\n }\n\n get rangeColor(): string {\n return this.getAttr('range-color', '');\n }\n set rangeColor(v: string) {\n this.setAttribute('range-color', v);\n }\n\n get readonly(): boolean {\n return this.hasAttr('readonly');\n }\n set readonly(v: boolean) {\n this.toggleAttr('readonly', Boolean(v));\n }\n\n get disabled(): boolean {\n return this.hasAttr('disabled');\n }\n set disabled(v: boolean) {\n this.toggleAttr('disabled', Boolean(v));\n }\n\n get valueTemplate(): string {\n return this.getAttr('value-template', '{value}');\n }\n set valueTemplate(v: string) {\n this.setAttribute('value-template', v);\n }\n\n private _isDragging = false;\n private _startY = 0;\n private _startValue = 0;\n\n protected override render(): void {\n const min = this.min;\n const max = this.max;\n const value = this.clampValue(this.value);\n const range = max - min;\n const pct = range > 0 ? (value - min) / range : 0;\n\n const sizeNum = this.getSizeNum();\n const strokeW = this.strokeWidth;\n const radius = (sizeNum - strokeW) / 2;\n const circumference = 2 * Math.PI * radius;\n const offset = circumference * (1 - pct);\n\n const vc = this.valueColor ? this.safeColor(this.valueColor) : '';\n const rc = this.rangeColor ? this.safeColor(this.rangeColor) : '';\n const valueColorStyle = vc ? `--_value-color: ${vc};` : '';\n const rangeColorStyle = rc ? `--_range-color: ${rc};` : '';\n\n const displayValue = this.valueTemplate.replace('{value}', String(Math.round(value)));\n\n this.setTemplate(`\n <div class=\"knob\" part=\"knob\" tabindex=\"${this.disabled ? '-1' : '0'}\"\n role=\"slider\" aria-valuenow=\"${value}\" aria-valuemin=\"${min}\" aria-valuemax=\"${max}\"\n aria-readonly=\"${this.readonly}\" aria-disabled=\"${this.disabled}\"\n style=\"${valueColorStyle}${rangeColorStyle}\">\n <svg viewBox=\"0 0 ${sizeNum} ${sizeNum}\" part=\"svg\">\n <circle class=\"track\" part=\"track\"\n cx=\"${sizeNum / 2}\" cy=\"${sizeNum / 2}\" r=\"${radius}\" />\n <circle class=\"value\" part=\"value\"\n cx=\"${sizeNum / 2}\" cy=\"${sizeNum / 2}\" r=\"${radius}\"\n stroke-dasharray=\"${circumference}\"\n stroke-dashoffset=\"${offset}\" />\n </svg>\n <div class=\"label\" part=\"label\">${esc(displayValue)}</div>\n </div>\n `);\n\n this.attachListeners();\n }\n\n private getSizeNum(): number {\n const s = this.size;\n if (s === 'sm') return 60;\n if (s === 'lg') return 140;\n return 100;\n }\n\n /** Valida um valor de cor CSS, retornando-o seguro ou vazio. */\n private safeColor(value: string): string {\n const v = value.trim();\n if (/^#[0-9a-fA-F]{3,8}$/.test(v)) return v;\n if (/^(rgb|rgba|hsl|hsla)\\([\\d\\s.,%()]+\\)$/i.test(v)) return v;\n if (/^var\\(--[\\w-]+(,\\s*[^)]*)?\\)$/.test(v)) return v;\n if (/^[a-zA-Z]+$/.test(v)) return v;\n return '';\n }\n\n private clampValue(v: number): number {\n const min = this.min;\n const max = this.max;\n const step = this.step;\n let clamped = Math.min(max, Math.max(min, v));\n if (step > 0) {\n clamped = Math.round((clamped - min) / step) * step + min;\n clamped = Math.min(max, Math.max(min, clamped));\n }\n return clamped;\n }\n\n private emitChange(newValue: number): void {\n const clamped = this.clampValue(newValue);\n if (clamped !== this.value) {\n this.value = clamped;\n this.dispatchEvent(\n new CustomEvent('change', {\n bubbles: true,\n composed: true,\n detail: { value: clamped },\n }),\n );\n }\n }\n\n private attachListeners(): void {\n const knob = this.root.querySelector<HTMLElement>('.knob');\n if (!knob) return;\n\n knob.addEventListener('mousedown', (e: MouseEvent) => {\n if (this.readonly || this.disabled) return;\n e.preventDefault();\n this._isDragging = true;\n this._startY = e.clientY;\n this._startValue = this.value;\n knob.focus();\n document.addEventListener('mousemove', this._onMouseMove);\n document.addEventListener('mouseup', this._onMouseUp);\n });\n\n knob.addEventListener('touchstart', (e: TouchEvent) => {\n if (this.readonly || this.disabled) return;\n e.preventDefault();\n this._isDragging = true;\n this._startY = e.touches[0].clientY;\n this._startValue = this.value;\n knob.focus();\n }, { passive: false });\n\n knob.addEventListener('touchmove', (e: TouchEvent) => {\n if (!this._isDragging || this.readonly || this.disabled) return;\n e.preventDefault();\n const deltaY = this._startY - e.touches[0].clientY;\n const sensitivity = (this.max - this.min) / 100;\n this.emitChange(this._startValue + deltaY * sensitivity);\n }, { passive: false });\n\n knob.addEventListener('touchend', () => {\n this._isDragging = false;\n });\n\n knob.addEventListener('keydown', (e: KeyboardEvent) => {\n if (this.readonly || this.disabled) return;\n const step = this.step;\n switch (e.key) {\n case 'ArrowUp':\n case 'ArrowRight':\n e.preventDefault();\n this.emitChange(this.value + step);\n break;\n case 'ArrowDown':\n case 'ArrowLeft':\n e.preventDefault();\n this.emitChange(this.value - step);\n break;\n case 'Home':\n e.preventDefault();\n this.emitChange(this.min);\n break;\n case 'End':\n e.preventDefault();\n this.emitChange(this.max);\n break;\n case 'PageUp':\n e.preventDefault();\n this.emitChange(this.value + step * 10);\n break;\n case 'PageDown':\n e.preventDefault();\n this.emitChange(this.value - step * 10);\n break;\n }\n });\n }\n\n private _onMouseMove = (e: MouseEvent): void => {\n if (!this._isDragging) return;\n const deltaY = this._startY - e.clientY;\n const sensitivity = (this.max - this.min) / 100;\n this.emitChange(this._startValue + deltaY * sensitivity);\n };\n\n private _onMouseUp = (): void => {\n this._isDragging = false;\n document.removeEventListener('mousemove', this._onMouseMove);\n document.removeEventListener('mouseup', this._onMouseUp);\n };\n\n protected override disconnectedCallback(): void {\n document.removeEventListener('mousemove', this._onMouseMove);\n document.removeEventListener('mouseup', this._onMouseUp);\n super.disconnectedCallback();\n }\n}\n\nexport function defineFxKnob(): typeof FxKnob {\n return defineElement('fx-knob', FxKnob);\n}","import { FxKnob, defineFxKnob } from './knob';\n\nexport { FxKnob };\n\ndefineFxKnob();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'fx-knob': FxKnob;\n }\n}","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\nimport { esc } from '../../core/sanitize';\n\nexport interface OrderListItem {\n [key: string]: unknown;\n}\n\n/**\n * <fx-orderlist> - Componente para ordenar uma colecao de itens.\n *\n * Permite reordenar itens arrastando ou usando botoes de controle.\n * Suporta filtro, selecao, checkbox e templates customizados.\n *\n * Atributos: data, data-key, filter, filter-by, filter-placeholder, breakpoint,\n * dragdrop, selection-mode, striped, show-select-all.\n * Evento: `reorder` (composed, detail: { items }).\n * Evento: `selection-change` (composed, detail: { selection }).\n */\nexport class FxOrderList extends FxElement {\n static override styles = css`\n\n :host {\n display: block;\n font-family: var(--fx-font-family);\n font-size: var(--fx-font-size);\n --orderlist-primary: var(--fx-color-primary, #3b82f6);\n --orderlist-border: var(--fx-border-default, #e2e8f0);\n --orderlist-bg: var(--fx-surface-background, #ffffff);\n --orderlist-bg-hover: var(--fx-surface-surface-hover, #f1f5f9);\n --orderlist-text: var(--fx-text-default, #1e293b);\n --orderlist-text-muted: var(--fx-text-muted, #64748b);\n --orderlist-radius: var(--fx-radius-md, 8px);\n --orderlist-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n --orderlist-transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n }\n * { box-sizing: border-box; }\n .container { display: flex; flex-direction: column; gap: var(--fx-space-md, 16px); }\n .list-wrapper { display: flex; flex-direction: column; gap: var(--fx-space-sm, 8px); flex: 1; min-width: 0; }\n .select-all-bar { display: flex; align-items: center; justify-content: space-between; padding: var(--fx-space-sm, 10px) var(--fx-space-md, 14px); background: linear-gradient(135deg, var(--orderlist-bg), var(--orderlist-bg-hover)); border: 1px solid var(--orderlist-border); border-radius: var(--orderlist-radius); font-size: 0.9em; font-weight: 500; }\n .select-all-bar label { display: flex; align-items: center; gap: var(--fx-space-sm, 10px); cursor: pointer; user-select: none; color: var(--orderlist-text); }\n .select-all-bar input[type=\"checkbox\"] { width: 18px; height: 18px; accent-color: var(--orderlist-primary); cursor: pointer; }\n .filter-wrapper { margin-bottom: var(--fx-space-xs, 4px); }\n .filter-input { width: 100%; padding: var(--fx-space-sm, 10px) var(--fx-space-md, 14px); padding-left: 42px; border: 1.5px solid var(--orderlist-border); border-radius: var(--orderlist-radius); font-family: inherit; font-size: inherit; color: var(--orderlist-text); background: var(--orderlist-bg) url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%2394a3b8' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'%3E%3C/circle%3E%3Cline x1='21' y1='21' x2='16.65' y2='16.65'%3E%3C/line%3E%3C/svg%3E\") no-repeat 14px center; transition: var(--orderlist-transition); }\n .filter-input:focus { outline: none; border-color: var(--orderlist-primary); box-shadow: var(--fx-effect-focus-ring, none); }\n .filter-input::placeholder { color: var(--orderlist-text-muted); }\n .main-row { display: flex; align-items: stretch; gap: var(--fx-space-sm, 8px); }\n .list { list-style: none; margin: 0; padding: 0; border: 1px solid var(--orderlist-border); border-radius: var(--orderlist-radius); overflow: hidden; box-shadow: var(--orderlist-shadow); max-height: 450px; overflow-y: auto; flex: 1; }\n .list::-webkit-scrollbar { width: 6px; }\n .list::-webkit-scrollbar-track { background: transparent; }\n .list::-webkit-scrollbar-thumb { background: var(--orderlist-border); border-radius: 3px; }\n .list::-webkit-scrollbar-thumb:hover { background: var(--orderlist-text-muted); }\n .selection-count { font-size: 0.85em; color: var(--orderlist-primary); background: color-mix(in srgb, var(--orderlist-primary) 12%, transparent); padding: 4px 12px; border-radius: 20px; font-weight: 600; }\n :host([striped]) .list-item:nth-child(even) { background: var(--fx-surface-surface, #f8fafc); }\n .list-item { display: flex; align-items: center; gap: var(--fx-space-sm, 10px); padding: var(--fx-space-sm, 10px) var(--fx-space-md, 14px); background: var(--orderlist-bg); border-bottom: 1px solid var(--orderlist-border); cursor: pointer; user-select: none; transition: var(--orderlist-transition); }\n .list-item:last-child { border-bottom: none; }\n .list-item:hover { background: var(--orderlist-bg-hover); }\n .list-item.selected { background: color-mix(in srgb, var(--orderlist-primary) 8%, transparent); border-left: 3px solid var(--orderlist-primary); padding-left: 11px; }\n .list-item:focus-visible { outline: none; background: color-mix(in srgb, var(--orderlist-primary) 15%, transparent); }\n .list-item.dragging { opacity: 0.5; background: var(--orderlist-bg-hover); }\n .list-item.drag-over { border-top: 2px solid var(--orderlist-primary); }\n .drag-handle { color: var(--orderlist-text-muted); cursor: grab; flex-shrink: 0; font-size: 1.2em; opacity: 0.6; transition: var(--orderlist-transition); }\n .drag-handle:hover { opacity: 1; }\n .drag-handle:active { cursor: grabbing; }\n .item-content { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n .checkbox { flex-shrink: 0; width: 18px; height: 18px; accent-color: var(--orderlist-primary); cursor: pointer; transition: var(--orderlist-transition); }\n .checkbox:hover { transform: scale(1.1); }\n .empty-message { padding: var(--fx-space-xl, 32px); text-align: center; color: var(--orderlist-text-muted); font-style: italic; }\n .controls-bar {\n display: flex;\n flex-direction: column;\n gap: 4px;\n padding: var(--fx-space-xs, 6px);\n background: var(--orderlist-bg);\n border: 1px solid var(--orderlist-border);\n border-radius: var(--orderlist-radius);\n box-shadow: var(--orderlist-shadow);\n height: fit-content;\n position: sticky;\n top: 0;\n align-self: flex-start;\n }\n .control-group { display: flex; flex-direction: column; gap: 3px; }\n .control-group + .control-group { margin-top: 4px; padding-top: 6px; border-top: 1px solid var(--orderlist-border); }\n button.control-btn { display: flex; align-items: center; justify-content: center; width: 42px; height: 38px; padding: 0; border: none; border-radius: 8px; background: transparent; color: var(--orderlist-text-muted); cursor: pointer; font-size: 16px; line-height: 1; transition: var(--orderlist-transition); position: relative; }\n button.control-btn:hover:not(:disabled) { background: var(--orderlist-bg-hover); color: var(--orderlist-primary); transform: scale(1.1); }\n button.control-btn:active:not(:disabled) { transform: scale(0.92); background: color-mix(in srgb, var(--orderlist-primary) 15%, transparent); }\n button.control-btn:focus-visible { outline: none; box-shadow: var(--fx-effect-focus-ring, none); }\n button.control-btn:disabled { opacity: 0.3; cursor: not-allowed; transform: none; }\n .control-btn-icon { font-size: 18px; line-height: 1; }\n /* Tooltip nos botoes */\n button.control-btn:hover::after { opacity: 1; transform: translateY(-50%) translateX(0); }\n @media (max-width: 640px) { .main-row { flex-direction: column; } .controls-bar { flex-direction: row; flex-wrap: wrap; justify-content: center; position: relative; } .control-group { flex-direction: row; } .control-group + .control-group { margin-top: 0; margin-left: 4px; padding-top: 0; padding-left: 4px; border-top: none; border-left: 1px solid var(--orderlist-border); } button.control-btn { width: 44px; height: 40px; } button.control-btn::after { display: none; } .list { max-height: 300px; } }\n @keyframes slideIn { from { opacity: 0; transform: translateX(-10px); } to { opacity: 1; transform: translateX(0); } }\n .list-item { animation: slideIn 0.2s ease-out; }\n `;\n\n static override get observedAttributes(): string[] {\n return [\n 'data',\n 'data-key',\n 'filter',\n 'filter-by',\n 'filter-placeholder',\n 'breakpoint',\n 'controls-location',\n 'dragdrop',\n 'striped',\n 'selection-mode',\n 'show-select-all',\n ]\n }\n\n set data(value: OrderListItem[]) {\n this._data = value;\n this._filteredData = null;\n this.render();\n }\n get data(): OrderListItem[] {\n return this._data;\n }\n private _data: OrderListItem[] = [];\n private _filteredData: OrderListItem[] | null = null;\n\n set selection(value: OrderListItem[]) {\n this._selection = value;\n this.render();\n }\n get selection(): OrderListItem[] {\n return this._selection;\n }\n private _selection: OrderListItem[] = [];\n\n get dataKey(): string {\n return this.getAttr('data-key', '');\n }\n set dataKey(v: string) {\n this.setAttribute('data-key', v);\n }\n\n get filter(): boolean {\n return this.hasAttr('filter');\n }\n set filter(v: boolean) {\n this.toggleAttr('filter', v);\n }\n\n get filterBy(): string {\n return this.getAttr('filter-by', 'label');\n }\n set filterBy(v: string) {\n this.setAttribute('filter-by', v);\n }\n\n get filterPlaceholder(): string {\n return this.getAttr('filter-placeholder', 'Buscar...');\n }\n set filterPlaceholder(v: string) {\n this.setAttribute('filter-placeholder', v);\n }\n\n get breakpoint(): string {\n return this.getAttr('breakpoint', '960px');\n }\n set breakpoint(v: string) {\n this.setAttribute('breakpoint', v);\n }\n\n get dragdrop(): boolean {\n return this.hasAttr('dragdrop');\n }\n set dragdrop(v: boolean) {\n this.toggleAttr('dragdrop', v);\n }\n\n get striped(): boolean {\n return this.hasAttr('striped');\n }\n set striped(v: boolean) {\n this.toggleAttr('striped', v);\n }\n\n get selectionMode(): string {\n const s = this.getAttr('selection-mode', '');\n return s === 'single' || s === 'multiple' ? s : '';\n }\n set selectionMode(v: string) {\n this.setAttribute('selection-mode', v);\n }\n\n get showSelectAll(): boolean {\n return this.hasAttr('show-select-all');\n }\n set showSelectAll(v: boolean) {\n this.toggleAttr('show-select-all', v);\n }\n\n get filterValue(): string {\n return this._filterValue;\n }\n set filterValue(v: string) {\n this._filterValue = v;\n this._applyFilter();\n this._updateListDisplay();\n }\n private _filterValue = '';\n\n private _draggedIndex: number | null = null;\n private _listenersAttached = false;\n private _optionTemplate: ((item: OrderListItem) => string) | null = null;\n\n setOptionTemplate(template: (item: OrderListItem) => string): void {\n this._optionTemplate = template;\n this.render();\n }\n\n protected override connectedCallback(): void {\n this._parseDataAttribute();\n super.connectedCallback();\n }\n\n protected override attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void {\n if (this.getAttr('data', '') !== '') {\n this._parseDataAttribute();\n }\n super.attributeChangedCallback(name, oldValue, newValue);\n }\n\n private _parseDataAttribute(): void {\n const dataAttr = this.getAttr('data', '');\n if (dataAttr) {\n try {\n this._data = JSON.parse(dataAttr);\n this._filteredData = null;\n } catch {\n this._data = [];\n }\n }\n }\n\n private _applyFilter(): void {\n if (!this._filterValue) {\n this._filteredData = null;\n return;\n }\n const filterFields = this.filterBy.split(',').map(f => f.trim());\n this._filteredData = this._data.filter(item => {\n return filterFields.some(field => {\n const value = item[field];\n if (value == null) return false;\n return String(value).toLowerCase().includes(this._filterValue.toLowerCase());\n });\n });\n }\n\n private _getDisplayData(): OrderListItem[] {\n return this._filteredData || this._data;\n }\n\n private _getItemKey(item: OrderListItem, index: number): string {\n if (this.dataKey && item[this.dataKey] != null) {\n return String(item[this.dataKey]);\n }\n if (item['id'] != null) return String(item['id']);\n if (item['key'] != null) return String(item['key']);\n if (item['label'] != null) return String(item['label']);\n if (item['name'] != null) return String(item['name']);\n if (item['value'] != null) return String(item['value']);\n return String(index);\n }\n\n private _getItemLabel(item: OrderListItem): string {\n const fields = ['label', 'name', 'title', 'text', 'value'];\n for (const field of fields) {\n if (item[field] != null) {\n return String(item[field]);\n }\n }\n return JSON.stringify(item);\n }\n\n private _isSelected(item: OrderListItem): boolean {\n return this._selection.some(s => this._getItemKey(s, -1) === this._getItemKey(item, -1));\n }\n\n private _moveItem(fromIndex: number, toIndex: number): void {\n const actualFrom = this._getActualIndex(fromIndex);\n const actualTo = this._getActualIndex(toIndex);\n if (actualFrom === -1 || actualTo === -1) return;\n const item = this._data.splice(actualFrom, 1)[0];\n this._data.splice(actualTo, 0, item);\n this._applyFilter();\n this._updateListDisplay();\n this._updateControlsState();\n this._emitReorder();\n }\n\n private _getActualIndex(displayIndex: number): number {\n if (this._filteredData) {\n const item = this._filteredData[displayIndex];\n return this._data.findIndex(d => this._getItemKey(d, -1) === this._getItemKey(item, -1));\n }\n return displayIndex;\n }\n\n private _emitReorder(): void {\n this.dispatchEvent(new CustomEvent('reorder', {\n bubbles: true,\n composed: true,\n detail: { items: [...this._data] },\n }));\n }\n\n private _emitSelectionChange(): void {\n this.dispatchEvent(new CustomEvent('selection-change', {\n bubbles: true,\n composed: true,\n detail: { selection: [...this._selection] },\n }));\n }\n\n private _toggleSelection(item: OrderListItem): void {\n const key = this._getItemKey(item, -1);\n const index = this._selection.findIndex(s => this._getItemKey(s, -1) === key);\n if (index >= 0) {\n this._selection.splice(index, 1);\n } else if (this.selectionMode === 'multiple') {\n this._selection.push(item);\n } else {\n this._selection = [item];\n }\n this._emitSelectionChange();\n this._updateListDisplay();\n this._updateControlsState();\n }\n\n private _selectAll(): void {\n const displayData = this._getDisplayData();\n this._selection = [...displayData];\n this._emitSelectionChange();\n this._updateListDisplay();\n this._updateControlsState();\n }\n\n private _deselectAll(): void {\n this._selection = [];\n this._emitSelectionChange();\n this._updateListDisplay();\n this._updateControlsState();\n }\n\n private _toggleSelectAll(): void {\n const displayData = this._getDisplayData();\n if (this._selection.length === displayData.length) {\n this._deselectAll();\n } else {\n this._selectAll();\n }\n }\n\n protected override render(): void {\n const displayData = this._getDisplayData();\n const hasSelection = this.selectionMode;\n const hasMultipleSelection = this.selectionMode === 'multiple';\n const allSelected = hasMultipleSelection && displayData.length > 0 && this._selection.length === displayData.length;\n\n this.setTemplate(`\n <div class=\"container\" part=\"container\">\n ${this.filter ? `\n <div class=\"filter-wrapper\" part=\"filter-wrapper\">\n <input type=\"text\" class=\"filter-input\" part=\"filter-input\"\n placeholder=\"${this.filterPlaceholder}\"\n value=\"${esc(this._filterValue)}\"\n aria-label=\"Filtrar lista\" />\n </div>\n ` : ''}\n <div class=\"main-row\" part=\"main-row\">\n <div class=\"controls-bar\" part=\"controls-bar\">\n <div class=\"control-group\">\n <button class=\"control-btn\" data-action=\"top\" part=\"control-btn\" aria-label=\"Mover para o inicio\">\n <span class=\"control-btn-icon\">\\u00AB</span>\n </button>\n <button class=\"control-btn\" data-action=\"up\" part=\"control-btn\" aria-label=\"Mover para cima\">\n <span class=\"control-btn-icon\">\\u2191</span>\n </button>\n </div>\n <div class=\"control-group\">\n <button class=\"control-btn\" data-action=\"down\" part=\"control-btn\" aria-label=\"Mover para baixo\">\n <span class=\"control-btn-icon\">\\u2193</span>\n </button>\n <button class=\"control-btn\" data-action=\"bottom\" part=\"control-btn\" aria-label=\"Mover para o fim\">\n <span class=\"control-btn-icon\">\\u00BB</span>\n </button>\n </div>\n </div>\n <div class=\"list-wrapper\" part=\"list-wrapper\">\n ${hasMultipleSelection && this.showSelectAll ? `\n <div class=\"select-all-bar\" part=\"select-all-bar\">\n <label>\n <input type=\"checkbox\" class=\"select-all-checkbox\"\n ${allSelected ? 'checked' : ''}\n aria-label=\"Selecionar todos\" />\n Selecionar Todos\n </label>\n <span class=\"selection-count\">${this._selection.length} selecionado(s)</span>\n </div>\n ` : ''}\n <ul class=\"list\" part=\"list\" role=\"listbox\"\n aria-multiselectable=\"${hasMultipleSelection}\"\n tabindex=\"0\">\n ${displayData.length === 0 ? `\n <li class=\"empty-message\" part=\"empty-message\">\n ${this.filter ? 'Nenhum resultado encontrado' : 'Nenhum item disponivel'}\n </li>\n ` : displayData.map((item, index) => {\n const key = this._getItemKey(item, index);\n const label = this._getItemLabel(item);\n const isSelected = this._isSelected(item);\n const content = this._optionTemplate ? this._optionTemplate(item) : esc(label);\n return `\n <li class=\"list-item${isSelected ? ' selected' : ''}\" part=\"list-item\"\n data-index=\"${index}\" data-key=\"${esc(key)}\"\n role=\"option\" aria-selected=\"${isSelected}\"\n ${this.dragdrop ? 'draggable=\"true\"' : ''}\n tabindex=\"0\">\n ${this.dragdrop ? '<span class=\"drag-handle\" part=\"drag-handle\" aria-label=\"Arrastar\">\\u22EE\\u22EE</span>' : ''}\n ${hasSelection ? `\n <input type=\"checkbox\" class=\"checkbox\" part=\"checkbox\"\n ${isSelected ? 'checked' : ''}\n aria-label=\"Selecionar ${esc(label)}\" />\n ` : ''}\n <span class=\"item-content\" part=\"item-content\">${content}</span>\n </li>\n `;\n }).join('')}\n </ul>\n </div>\n </div>\n </div>\n `);\n\n this._attachListeners();\n this._attachItemListeners(this.root.querySelector('.list') as HTMLElement);\n this._updateControlsState();\n }\n\n private _attachListeners(): void {\n if (this._listenersAttached) return;\n this._listenersAttached = true;\n const root = this.root;\n\n // Filtro - delega input\n root.addEventListener('input', (e) => {\n const t = e.target as HTMLElement;\n if (t.classList.contains('filter-input')) {\n this.filterValue = (t as HTMLInputElement).value;\n }\n });\n\n // Selecionar todos - delega change\n root.addEventListener('change', (e) => {\n const t = e.target as HTMLElement;\n if (t.classList.contains('select-all-checkbox')) {\n this._toggleSelectAll();\n }\n });\n\n // Clique - delega click nos botoes (itens anexados direto em cada render)\n root.addEventListener('click', (e) => {\n const target = e.target as HTMLElement;\n const btn = target.closest('.control-btn') as HTMLButtonElement;\n if (btn) {\n this._handleMoveAction(btn.dataset.action);\n }\n });\n\n // Drag and drop\n // Drag and drop - delega no root\n let dragOverElement: HTMLElement | null = null;\n root.addEventListener('dragstart', (e) => {\n const target = (e.target as HTMLElement).closest('.list-item') as HTMLElement;\n if (!target) return;\n this._draggedIndex = Number(target.dataset.index);\n target.classList.add('dragging');\n (e as DragEvent).dataTransfer!.effectAllowed = 'move';\n });\n root.addEventListener('dragend', (e) => {\n const target = e.target as HTMLElement;\n target.classList.remove('dragging');\n this._draggedIndex = null;\n root.querySelectorAll('.drag-over').forEach(el => el.classList.remove('drag-over'));\n dragOverElement = null;\n });\n root.addEventListener('dragover', (e) => {\n e.preventDefault();\n const target = (e.target as HTMLElement).closest('.list-item') as HTMLElement;\n if (!target || target.classList.contains('dragging')) return;\n if (dragOverElement) dragOverElement.classList.remove('drag-over');\n target.classList.add('drag-over');\n dragOverElement = target;\n });\n root.addEventListener('drop', (e) => {\n e.preventDefault();\n if (this._draggedIndex === null) return;\n const target = (e.target as HTMLElement).closest('.list-item') as HTMLElement;\n if (!target) return;\n const toIndex = Number(target.dataset.index);\n target.classList.remove('drag-over');\n dragOverElement = null;\n this._moveItem(this._draggedIndex, toIndex);\n this._draggedIndex = null;\n });\n this._updateControlsState();\n }\n\n private _attachItemListeners(list: HTMLElement): void {\n if (!list) return;\n list.addEventListener('click', (e) => {\n const target = e.target as HTMLElement;\n const itemEl = target.closest('.list-item') as HTMLElement;\n if (!itemEl) return;\n if (target.classList.contains('checkbox')) {\n e.stopPropagation();\n const idxC = Number(itemEl.dataset.index);\n this._toggleSelection(this._getDisplayData()[idxC]);\n return;\n }\n const idxI = Number(itemEl.dataset.index);\n this._toggleSelection(this._getDisplayData()[idxI]);\n });\n list.addEventListener('keydown', (e) => {\n const target = e.target as HTMLElement;\n if (!target.classList.contains('list-item')) return;\n const items = Array.from(list.querySelectorAll('.list-item')) as HTMLElement[];\n const currentIndex = items.indexOf(target);\n const ke = e as KeyboardEvent;\n switch (ke.key) {\n case 'ArrowUp':\n e.preventDefault();\n if (currentIndex > 0) items[currentIndex - 1].focus();\n break;\n case 'ArrowDown':\n e.preventDefault();\n if (currentIndex < items.length - 1) items[currentIndex + 1].focus();\n break;\n case ' ':\n case 'Enter':\n e.preventDefault();\n if (this.selectionMode) {\n const index = Number(target.dataset.index);\n this._toggleSelection(this._getDisplayData()[index]);\n }\n break;\n }\n });\n }\n private _updateListDisplay(): void {\n const listWrapper = this.root.querySelector('.list-wrapper');\n if (!listWrapper) {\n this.render();\n return;\n }\n const displayData = this._getDisplayData();\n const hasSelection = this.selectionMode;\n const hasMultipleSelection = this.selectionMode === 'multiple';\n const allSelected = hasMultipleSelection && displayData.length > 0 && this._selection.length === displayData.length;\n\n listWrapper.innerHTML = `\n ${hasMultipleSelection && this.showSelectAll ? `\n <div class=\"select-all-bar\" part=\"select-all-bar\">\n <label>\n <input type=\"checkbox\" class=\"select-all-checkbox\"\n ${allSelected ? 'checked' : ''}\n aria-label=\"Selecionar todos\" />\n Selecionar Todos\n </label>\n <span class=\"selection-count\">${this._selection.length} selecionado(s)</span>\n </div>\n ` : ''}\n <ul class=\"list\" part=\"list\" role=\"listbox\"\n aria-multiselectable=\"${hasMultipleSelection}\"\n tabindex=\"0\">\n ${displayData.length === 0 ? `\n <li class=\"empty-message\" part=\"empty-message\">\n ${this.filter ? 'Nenhum resultado encontrado' : 'Nenhum item disponivel'}\n </li>\n ` : displayData.map((item, index) => {\n const key = this._getItemKey(item, index);\n const label = this._getItemLabel(item);\n const isSelected = this._isSelected(item);\n const content = this._optionTemplate ? this._optionTemplate(item) : esc(label);\n return `\n <li class=\"list-item${isSelected ? ' selected' : ''}\" part=\"list-item\"\n data-index=\"${index}\" data-key=\"${esc(key)}\"\n role=\"option\" aria-selected=\"${isSelected}\"\n ${this.dragdrop ? 'draggable=\"true\"' : ''}\n tabindex=\"0\">\n ${this.dragdrop ? '<span class=\"drag-handle\" part=\"drag-handle\" aria-label=\"Arrastar\">\\u22EE\\u22EE</span>' : ''}\n ${hasSelection ? `\n <input type=\"checkbox\" class=\"checkbox\" part=\"checkbox\"\n ${isSelected ? 'checked' : ''}\n aria-label=\"Selecionar ${esc(label)}\" />\n ` : ''}\n <span class=\"item-content\" part=\"item-content\">${content}</span>\n </li>\n `;\n }).join('')}\n </ul>\n `;\n this._attachListeners();\n this._attachItemListeners(this.root.querySelector('.list') as HTMLElement);\n }\n\n\n private _handleMoveAction(action: string | undefined): void {\n if (!this._selection.length) return;\n const displayData = this._getDisplayData();\n const selectedIndices = this._selection\n .map(s => displayData.findIndex(d => this._getItemKey(d, -1) === this._getItemKey(s, -1)))\n .filter(i => i >= 0)\n .sort((a, b) => a - b);\n\n if (selectedIndices.length === 0) return;\n\n switch (action) {\n case 'top':\n this._moveSelectedToStart(selectedIndices);\n break;\n case 'up':\n this._moveSelectedByOne(selectedIndices, -1);\n break;\n case 'down':\n this._moveSelectedByOne(selectedIndices, 1);\n break;\n case 'bottom':\n this._moveSelectedToEnd(selectedIndices);\n break;\n }\n }\n\n private _moveSelectedToStart(indices: number[]): void {\n const items: OrderListItem[] = [];\n const actualIndices: number[] = [];\n\n for (const idx of indices) {\n const actualIdx = this._getActualIndex(idx);\n items.push(this._data[actualIdx]);\n actualIndices.push(actualIdx);\n }\n\n actualIndices.sort((a, b) => b - a).forEach(i => this._data.splice(i, 1));\n\n const insertIdx = this._getActualIndex(0);\n this._data.splice(insertIdx, 0, ...items);\n\n this._applyFilter();\n this._updateListDisplay();\n this._updateControlsState();\n this._emitReorder();\n }\n\n private _moveSelectedToEnd(indices: number[]): void {\n const items: OrderListItem[] = [];\n const actualIndices: number[] = [];\n\n for (const idx of indices) {\n const actualIdx = this._getActualIndex(idx);\n items.push(this._data[actualIdx]);\n actualIndices.push(actualIdx);\n }\n\n actualIndices.sort((a, b) => b - a).forEach(i => this._data.splice(i, 1));\n\n const displayData = this._getDisplayData();\n const insertIdx = this._getActualIndex(displayData.length - 1);\n this._data.splice(insertIdx + 1, 0, ...items);\n\n this._applyFilter();\n this._updateListDisplay();\n this._updateControlsState();\n this._emitReorder();\n }\n\n private _moveSelectedByOne(indices: number[], delta: number): void {\n const displayData = this._getDisplayData();\n if (displayData.length === 0) return;\n\n // Get actual indices in _data array and sort them\n const actualIndices = indices\n .map(idx => this._getActualIndex(idx))\n .filter(idx => idx >= 0)\n .sort((a, b) => a - b);\n\n if (actualIndices.length === 0) return;\n\n // Check if movement is possible\n if (delta < 0 && actualIndices[0] <= 0) return;\n if (delta > 0 && actualIndices[actualIndices.length - 1] >= this._data.length - 1) return;\n\n // Extract selected items in order\n const selectedItems = actualIndices.map(idx => this._data[idx]);\n\n // Remove selected items from data (from highest to lowest to preserve indices)\n for (let i = actualIndices.length - 1; i >= 0; i--) {\n this._data.splice(actualIndices[i], 1);\n }\n\n // Calculate new insertion point\n let insertIndex: number;\n if (delta < 0) {\n // Moving up: insert before the first selected item position\n insertIndex = actualIndices[0] - 1;\n } else {\n // Moving down: insert after the last selected item position\n // Since we removed items, we need to adjust\n insertIndex = actualIndices[actualIndices.length - 1] - actualIndices.length + 1 + 1;\n }\n\n // Ensure insertIndex is within bounds\n insertIndex = Math.max(0, Math.min(insertIndex, this._data.length));\n\n // Insert items at new position\n this._data.splice(insertIndex, 0, ...selectedItems);\n\n this._applyFilter();\n this._updateListDisplay();\n this._updateControlsState();\n this._emitReorder();\n }\n\n private _updateControlsState(): void {\n const displayData = this._getDisplayData();\n const selectedIndices = this._selection\n .map(s => displayData.findIndex(d => this._getItemKey(d, -1) === this._getItemKey(s, -1)))\n .filter(i => i >= 0);\n\n const buttons = this.root.querySelectorAll<HTMLButtonElement>('.control-btn');\n buttons.forEach(btn => {\n const action = btn.dataset.action;\n let disabled = selectedIndices.length === 0;\n\n if (!disabled) {\n switch (action) {\n case 'top':\n case 'up':\n disabled = selectedIndices[0] === 0;\n break;\n case 'bottom':\n case 'down':\n disabled = selectedIndices[selectedIndices.length - 1] === displayData.length - 1;\n break;\n }\n }\n\n btn.disabled = disabled;\n });\n }\n}\n\nexport function defineFxOrderList(): typeof FxOrderList {\n return defineElement('fx-orderlist', FxOrderList);\n}","import { defineFxOrderList } from './orderlist';\n\n// Reexporta a classe para uso programático (ex.: instanceof, herança).\nexport { FxOrderList } from './orderlist';\nexport type { OrderListItem } from './orderlist';\n\n// Auto-registro: basta importar o subpath `@wrrdev/fenix-ui/orderlist`\n// para que o componente seja definido no CustomElementRegistry.\ndefineFxOrderList();\n\n","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\nimport { esc } from '../../core/sanitize';\n\nexport interface PickListItem {\n [key: string]: unknown;\n}\n\n/**\n * <fx-picklist> - Componente para transferir itens entre duas listas.\n *\n * Permite mover itens entre uma lista de origem e uma lista de destino.\n * Suporta filtro, seleção múltipla, checkbox e templates customizados.\n *\n * Atributos: source, target, source-key, target-key, filter, filter-by,\n * filter-placeholder, dragdrop, striped, selection-mode, source-label, target-label.\n * Evento: `move-to-target` (composed, detail: { items }).\n * Evento: `move-to-source` (composed, detail: { items }).\n * Evento: `selection-change-source` (composed, detail: { selection }).\n * Evento: `selection-change-target` (composed, detail: { selection }).\n */\nexport class FxPickList 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 --picklist-primary: var(--fx-color-primary, #3b82f6);\n --picklist-border: var(--fx-border-default, #e2e8f0);\n --picklist-bg: var(--fx-surface-background, #ffffff);\n --picklist-bg-hover: var(--fx-surface-surface-hover, #f1f5f9);\n --picklist-text: var(--fx-text-default, #1e293b);\n --picklist-text-muted: var(--fx-text-muted, #64748b);\n --picklist-radius: var(--fx-radius-md, 8px);\n --picklist-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n --picklist-transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n }\n * { box-sizing: border-box; }\n .container {\n display: flex;\n gap: var(--fx-space-sm, 8px);\n align-items: stretch;\n }\n .list-container {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: var(--fx-space-sm, 8px);\n min-width: 0;\n }\n .list-label {\n font-weight: 600;\n color: var(--picklist-text);\n font-size: calc(var(--fx-font-size) - 1px);\n }\n .select-all-bar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: var(--fx-space-sm, 10px) var(--fx-space-md, 14px);\n background: linear-gradient(135deg, var(--picklist-bg), var(--picklist-bg-hover));\n border: 1px solid var(--picklist-border);\n border-radius: var(--picklist-radius);\n font-size: 0.9em;\n font-weight: 500;\n }\n .select-all-bar label {\n display: flex;\n align-items: center;\n gap: var(--fx-space-sm, 10px);\n cursor: pointer;\n user-select: none;\n color: var(--picklist-text);\n }\n .select-all-bar input[type=\"checkbox\"] {\n width: 18px;\n height: 18px;\n accent-color: var(--picklist-primary);\n cursor: pointer;\n }\n .selection-count {\n font-size: 0.85em;\n color: var(--picklist-primary);\n background: color-mix(in srgb, var(--picklist-primary) 12%, transparent);\n padding: 4px 12px;\n border-radius: 20px;\n font-weight: 600;\n }\n .controls {\n display: flex;\n flex-direction: column;\n gap: 4px;\n justify-content: center;\n padding: var(--fx-space-xs, 6px);\n background: var(--picklist-bg);\n border: 1px solid var(--picklist-border);\n border-radius: var(--picklist-radius);\n box-shadow: var(--picklist-shadow);\n height: fit-content;\n position: sticky;\n top: 0;\n align-self: center;\n }\n .control-group {\n display: flex;\n flex-direction: column;\n gap: 3px;\n }\n .control-group + .control-group {\n margin-top: 4px;\n padding-top: 6px;\n border-top: 1px solid var(--picklist-border);\n }\n .list-wrapper {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: var(--fx-space-sm, 8px);\n }\n .filter-wrapper {\n margin-bottom: var(--fx-space-xs, 4px);\n }\n .filter-input {\n width: 100%;\n box-sizing: border-box;\n padding: var(--fx-space-sm, 10px) var(--fx-space-md, 14px);\n padding-left: 42px;\n border: 1.5px solid var(--picklist-border);\n border-radius: var(--picklist-radius);\n font-family: inherit;\n font-size: inherit;\n color: var(--picklist-text);\n background: var(--picklist-bg) url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%2394a3b8' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'%3E%3C/circle%3E%3Cline x1='21' y1='21' x2='16.65' y2='16.65'%3E%3C/line%3E%3C/svg%3E\") no-repeat 14px center;\n transition: var(--picklist-transition);\n }\n .filter-input:focus {\n outline: none;\n border-color: var(--picklist-primary);\n box-shadow: var(--fx-effect-focus-ring, none);\n }\n .filter-input::placeholder {\n color: var(--picklist-text-muted);\n }\n .list {\n list-style: none;\n margin: 0;\n padding: 0;\n border: 1px solid var(--picklist-border);\n border-radius: var(--picklist-radius);\n overflow: hidden;\n box-shadow: var(--picklist-shadow);\n min-height: 200px;\n max-height: 450px;\n overflow-y: auto;\n flex: 1;\n }\n .list::-webkit-scrollbar { width: 6px; }\n .list::-webkit-scrollbar-track { background: transparent; }\n .list::-webkit-scrollbar-thumb { background: var(--picklist-border); border-radius: 3px; }\n .list::-webkit-scrollbar-thumb:hover { background: var(--picklist-text-muted); }\n :host([striped]) .list-item:nth-child(even) {\n background: var(--fx-surface-surface, #f8fafc);\n }\n .list-item {\n display: flex;\n align-items: center;\n gap: var(--fx-space-sm, 10px);\n padding: var(--fx-space-sm, 10px) var(--fx-space-md, 14px);\n background: var(--picklist-bg);\n border-bottom: 1px solid var(--picklist-border);\n cursor: pointer;\n user-select: none;\n transition: var(--picklist-transition);\n }\n .list-item:last-child { border-bottom: none; }\n .list-item:hover { background: var(--picklist-bg-hover); }\n .list-item.selected {\n background: color-mix(in srgb, var(--picklist-primary) 8%, transparent);\n border-left: 3px solid var(--picklist-primary);\n padding-left: 11px;\n }\n .list-item:focus-visible {\n outline: none;\n background: color-mix(in srgb, var(--picklist-primary) 15%, transparent);\n }\n .checkbox {\n flex-shrink: 0;\n width: 18px;\n height: 18px;\n accent-color: var(--picklist-primary);\n cursor: pointer;\n transition: var(--picklist-transition);\n }\n .checkbox:hover { transform: scale(1.1); }\n .item-content {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .empty-message {\n padding: var(--fx-space-xl, 32px);\n text-align: center;\n color: var(--picklist-text-muted);\n font-style: italic;\n }\n button.control-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 42px;\n height: 38px;\n padding: 0;\n border: none;\n border-radius: 8px;\n background: transparent;\n color: var(--picklist-text-muted);\n cursor: pointer;\n font-size: 16px;\n line-height: 1;\n transition: var(--picklist-transition);\n position: relative;\n }\n button.control-btn:hover:not(:disabled) {\n background: var(--picklist-bg-hover);\n color: var(--picklist-primary);\n transform: scale(1.1);\n }\n button.control-btn:active:not(:disabled) {\n transform: scale(0.92);\n background: color-mix(in srgb, var(--picklist-primary) 15%, transparent);\n }\n button.control-btn:focus-visible {\n outline: none;\n box-shadow: var(--fx-effect-focus-ring, none);\n }\n button.control-btn:disabled {\n opacity: 0.3;\n cursor: not-allowed;\n transform: none;\n }\n .control-btn-icon { font-size: 18px; line-height: 1; }\n\n button.control-btn:hover::after {\n opacity: 1;\n transform: translateX(-50%) translateY(0);\n }\n @media (max-width: 640px) {\n .container { flex-direction: column; }\n .controls {\n flex-direction: row;\n flex-wrap: wrap;\n justify-content: center;\n position: relative;\n }\n .control-group { flex-direction: row; }\n .control-group + .control-group {\n margin-top: 0;\n margin-left: 4px;\n padding-top: 0;\n padding-left: 4px;\n border-top: none;\n border-left: 1px solid var(--picklist-border);\n }\n button.control-btn { width: 44px; height: 40px; }\n button.control-btn::after { display: none; }\n .list { max-height: 300px; min-height: 150px; }\n }\n @keyframes slideIn {\n from { opacity: 0; transform: translateX(-10px); }\n to { opacity: 1; transform: translateX(0); }\n }\n .list-item { animation: slideIn 0.2s ease-out; }\n `;\n\n static override get observedAttributes(): string[] {\n return [\n 'source',\n 'target',\n 'source-key',\n 'target-key',\n 'filter',\n 'filter-by',\n 'filter-placeholder',\n 'dragdrop',\n 'striped',\n 'selection-mode',\n 'show-select-all',\n 'source-label',\n 'target-label',\n ];\n }\n\n set source(value: PickListItem[]) {\n this._source = value;\n this._filteredSource = null;\n this.render();\n }\n get source(): PickListItem[] {\n return this._source;\n }\n private _source: PickListItem[] = [];\n private _filteredSource: PickListItem[] | null = null;\n\n set target(value: PickListItem[]) {\n this._target = value;\n this._filteredTarget = null;\n this.render();\n }\n get target(): PickListItem[] {\n return this._target;\n }\n private _target: PickListItem[] = [];\n private _filteredTarget: PickListItem[] | null = null;\n\n set sourceSelection(value: PickListItem[]) {\n this._sourceSelection = value;\n this.render();\n }\n get sourceSelection(): PickListItem[] {\n return this._sourceSelection;\n }\n private _sourceSelection: PickListItem[] = [];\n\n set targetSelection(value: PickListItem[]) {\n this._targetSelection = value;\n this.render();\n }\n get targetSelection(): PickListItem[] {\n return this._targetSelection;\n }\n private _targetSelection: PickListItem[] = [];\n\n get sourceKey(): string {\n return this.getAttr('source-key', '');\n }\n set sourceKey(v: string) {\n this.setAttribute('source-key', v);\n }\n\n get targetKey(): string {\n return this.getAttr('target-key', '');\n }\n set targetKey(v: string) {\n this.setAttribute('target-key', v);\n }\n\n get filter(): boolean {\n return this.hasAttr('filter');\n }\n set filter(v: boolean) {\n this.toggleAttr('filter', v);\n }\n\n get filterBy(): string {\n return this.getAttr('filter-by', 'label');\n }\n set filterBy(v: string) {\n this.setAttribute('filter-by', v);\n }\n\n get filterPlaceholder(): string {\n return this.getAttr('filter-placeholder', 'Buscar...');\n }\n set filterPlaceholder(v: string) {\n this.setAttribute('filter-placeholder', v);\n }\n\n get dragdrop(): boolean {\n return this.hasAttr('dragdrop');\n }\n set dragdrop(v: boolean) {\n this.toggleAttr('dragdrop', v);\n }\n\n get striped(): boolean {\n return this.hasAttr('striped');\n }\n set striped(v: boolean) {\n this.toggleAttr('striped', v);\n }\n\n get selectionMode(): string {\n const s = this.getAttr('selection-mode', '');\n return s === 'single' || s === 'multiple' ? s : '';\n }\n set selectionMode(v: string) {\n this.setAttribute('selection-mode', v);\n }\n\n get showSelectAll(): boolean {\n return this.hasAttr('show-select-all');\n }\n set showSelectAll(v: boolean) {\n this.toggleAttr('show-select-all', v);\n }\n\n get sourceLabel(): string {\n return this.getAttr('source-label', 'Disponíveis');\n }\n set sourceLabel(v: string) {\n this.setAttribute('source-label', v);\n }\n\n get targetLabel(): string {\n return this.getAttr('target-label', 'Selecionados');\n }\n set targetLabel(v: string) {\n this.setAttribute('target-label', v);\n }\n\n get sourceFilterValue(): string {\n return this._sourceFilterValue;\n }\n set sourceFilterValue(v: string) {\n this._sourceFilterValue = v;\n this._applySourceFilter();\n this._updateListDisplay();\n }\n private _sourceFilterValue = '';\n\n get targetFilterValue(): string {\n return this._targetFilterValue;\n }\n set targetFilterValue(v: string) {\n this._targetFilterValue = v;\n this._applyTargetFilter();\n this._updateListDisplay();\n }\n private _targetFilterValue = '';\n private _filterListenersAttached = false;\n\n private _optionTemplate: ((item: PickListItem) => string) | null = null;\n\n setOptionTemplate(template: (item: PickListItem) => string): void {\n this._optionTemplate = template;\n this.render();\n }\n\n protected override connectedCallback(): void {\n this._parseSourceAttribute();\n this._parseTargetAttribute();\n super.connectedCallback();\n }\n\n protected override attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void {\n if (this.getAttr('source', '') !== '') {\n this._parseSourceAttribute();\n }\n if (this.getAttr('target', '') !== '') {\n this._parseTargetAttribute();\n }\n super.attributeChangedCallback(name, oldValue, newValue);\n }\n\n private _parseSourceAttribute(): void {\n const dataAttr = this.getAttr('source', '');\n if (dataAttr) {\n try {\n this._source = JSON.parse(dataAttr);\n this._filteredSource = null;\n } catch {\n this._source = [];\n }\n }\n }\n\n private _parseTargetAttribute(): void {\n const dataAttr = this.getAttr('target', '');\n if (dataAttr) {\n try {\n this._target = JSON.parse(dataAttr);\n this._filteredTarget = null;\n } catch {\n this._target = [];\n }\n }\n }\n\n private _applySourceFilter(): void {\n if (!this._sourceFilterValue) {\n this._filteredSource = null;\n return;\n }\n const filterFields = this.filterBy.split(',').map(f => f.trim());\n this._filteredSource = this._source.filter(item => {\n return filterFields.some(field => {\n const value = item[field];\n if (value == null) return false;\n return String(value).toLowerCase().includes(this._sourceFilterValue.toLowerCase());\n });\n });\n }\n\n private _applyTargetFilter(): void {\n if (!this._targetFilterValue) {\n this._filteredTarget = null;\n return;\n }\n const filterFields = this.filterBy.split(',').map(f => f.trim());\n this._filteredTarget = this._target.filter(item => {\n return filterFields.some(field => {\n const value = item[field];\n if (value == null) return false;\n return String(value).toLowerCase().includes(this._targetFilterValue.toLowerCase());\n });\n });\n }\n\n private _getDisplaySource(): PickListItem[] {\n return this._filteredSource || this._source;\n }\n\n private _getDisplayTarget(): PickListItem[] {\n return this._filteredTarget || this._target;\n }\n\n private _getItemKey(item: PickListItem, index: number, isSource: boolean): string {\n const keyField = isSource ? this.sourceKey : this.targetKey;\n if (keyField && item[keyField] != null) {\n return String(item[keyField]);\n }\n if (item['id'] != null) return String(item['id']);\n if (item['key'] != null) return String(item['key']);\n if (item['label'] != null) return String(item['label']);\n if (item['name'] != null) return String(item['name']);\n if (item['value'] != null) return String(item['value']);\n return String(index);\n }\n\n private _getItemLabel(item: PickListItem): string {\n const fields = ['label', 'name', 'title', 'text', 'value'];\n for (const field of fields) {\n if (item[field] != null) {\n return String(item[field]);\n }\n }\n return JSON.stringify(item);\n }\n\n private _isSourceSelected(item: PickListItem, index: number): boolean {\n return this._sourceSelection.some(s => this._getItemKey(s, -1, true) === this._getItemKey(item, index, true));\n }\n\n private _isTargetSelected(item: PickListItem, index: number): boolean {\n return this._targetSelection.some(s => this._getItemKey(s, -1, false) === this._getItemKey(item, index, false));\n }\n\n private _emitMoveToTarget(): void {\n this.dispatchEvent(new CustomEvent('move-to-target', {\n bubbles: true,\n composed: true,\n detail: { items: [...this._sourceSelection], source: [...this._source], target: [...this._target] },\n }));\n }\n\n private _emitMoveToSource(): void {\n this.dispatchEvent(new CustomEvent('move-to-source', {\n bubbles: true,\n composed: true,\n detail: { items: [...this._targetSelection], source: [...this._source], target: [...this._target] },\n }));\n }\n\n private _emitSelectionChangeSource(): void {\n this.dispatchEvent(new CustomEvent('selection-change-source', {\n bubbles: true,\n composed: true,\n detail: { selection: [...this._sourceSelection] },\n }));\n }\n\n private _emitSelectionChangeTarget(): void {\n this.dispatchEvent(new CustomEvent('selection-change-target', {\n bubbles: true,\n composed: true,\n detail: { selection: [...this._targetSelection] },\n }));\n }\n\n protected override render(): void {\n const dSrc = this._getDisplaySource();\n const dTgt = this._getDisplayTarget();\n const hasSel = this.selectionMode;\n const showAll = hasSel === 'multiple' && this.showSelectAll;\n const srcItems = dSrc.length === 0 ? `<li class=\"empty-message\">${this.filter ? 'Nenhum resultado' : 'Nenhum item'}</li>` : dSrc.map((item, i) => `<li class=\"list-item${this._isSourceSelected(item, i) ? ' selected' : ''}\" data-index=\"${i}\" data-list=\"source\" tabindex=\"0\">${hasSel ? '<input type=\"checkbox\" class=\"checkbox\"' + (this._isSourceSelected(item, i) ? ' checked' : '') + ' />' : ''}<span class=\"item-content\">${this._optionTemplate ? this._optionTemplate(item) : esc(this._getItemLabel(item))}</span></li>`).join('');\n const tgtItems = dTgt.length === 0 ? `<li class=\"empty-message\">${this.filter ? 'Nenhum resultado' : 'Nenhum selecionado'}</li>` : dTgt.map((item, i) => `<li class=\"list-item${this._isTargetSelected(item, i) ? ' selected' : ''}\" data-index=\"${i}\" data-list=\"target\" tabindex=\"0\">${hasSel ? '<input type=\"checkbox\" class=\"checkbox\"' + (this._isTargetSelected(item, i) ? ' checked' : '') + ' />' : ''}<span class=\"item-content\">${this._optionTemplate ? this._optionTemplate(item) : esc(this._getItemLabel(item))}</span></li>`).join('');\n const srcAllBar = showAll ? `<div class=\"select-all-bar\" part=\"select-all-bar\"><label><input type=\"checkbox\" class=\"select-all-checkbox\" data-list=\"source\" ${this._sourceSelection.length > 0 && this._sourceSelection.length === this._source.length ? 'checked' : ''} aria-label=\"Selecionar todos da origem\" /> Selecionar Todos</label><span class=\"selection-count\">${this._sourceSelection.length} selecionado(s)</span></div>` : '';\n const tgtAllBar = showAll ? `<div class=\"select-all-bar\" part=\"select-all-bar\"><label><input type=\"checkbox\" class=\"select-all-checkbox\" data-list=\"target\" ${this._targetSelection.length > 0 && this._targetSelection.length === this._target.length ? 'checked' : ''} aria-label=\"Selecionar todos do destino\" /> Selecionar Todos</label><span class=\"selection-count\">${this._targetSelection.length} selecionado(s)</span></div>` : '';\n\n this.setTemplate(`<div class=\"container\"><div class=\"list-container\"><div class=\"list-label\">${esc(this.sourceLabel)} (${this._source.length})</div>${this.filter ? '<div class=\"filter-wrapper\"><input type=\"text\" class=\"filter-input source-filter\" placeholder=\"' + this.filterPlaceholder + '\" value=\"' + esc(this._sourceFilterValue) + '\" /></div>' : ''}${srcAllBar}<div class=\"list-wrapper\"><ul class=\"list source-list\" role=\"listbox\" tabindex=\"0\">${srcItems}</ul></div></div><div class=\"controls\"><div class=\"control-group\"><button class=\"control-btn\" data-action=\"move-all-target\" part=\"control-btn\" aria-label=\"Mover todos para destino\"><span class=\"control-btn-icon\">»</span></button><button class=\"control-btn\" data-action=\"move-target\" part=\"control-btn\" aria-label=\"Mover para destino\"><span class=\"control-btn-icon\">→</span></button></div><div class=\"control-group\"><button class=\"control-btn\" data-action=\"move-source\" part=\"control-btn\" aria-label=\"Mover para origem\"><span class=\"control-btn-icon\">←</span></button><button class=\"control-btn\" data-action=\"move-all-source\" part=\"control-btn\" aria-label=\"Mover todos para origem\"><span class=\"control-btn-icon\">«</span></button></div></div><div class=\"list-container\"><div class=\"list-label\">${esc(this.targetLabel)} (${this._target.length})</div>${this.filter ? '<div class=\"filter-wrapper\"><input type=\"text\" class=\"filter-input target-filter\" placeholder=\"' + this.filterPlaceholder + '\" value=\"' + esc(this._targetFilterValue) + '\" /></div>' : ''}${tgtAllBar}<div class=\"list-wrapper\"><ul class=\"list target-list\" role=\"listbox\" tabindex=\"0\">${tgtItems}</ul></div></div></div>`);\n\n this._attachListeners();\n }\n\n private _attachListeners(): void {\n // Listeners delegados no root, anexados uma unica vez (sobrevivem a re-renders)\n if (!this._filterListenersAttached) {\n this._filterListenersAttached = true;\n\n this.root.addEventListener('input', (e) => {\n const t = e.target as HTMLElement;\n if (t.classList.contains('select-all-checkbox')) {\n this._handleSelectAll(t as HTMLInputElement);\n return;\n }\n if (t.classList.contains('source-filter')) {\n this.sourceFilterValue = (t as HTMLInputElement).value;\n } else if (t.classList.contains('target-filter')) {\n this.targetFilterValue = (t as HTMLInputElement).value;\n }\n });\n\n this.root.addEventListener('click', (e) => {\n const t = e.target as HTMLElement;\n const btn = t.closest('.control-btn') as HTMLButtonElement | null;\n if (btn) {\n switch (btn.dataset.action) {\n case 'move-target': this._moveToTarget(); break;\n case 'move-all-target': this._moveAllToTarget(); break;\n case 'move-source': this._moveToSource(); break;\n case 'move-all-source': this._moveAllToSource(); break;\n }\n return;\n }\n const el = t.closest('.list-item') as HTMLElement | null;\n if (!el) return;\n const isSrc = el.dataset.list === 'source';\n const idx = Number(el.dataset.index);\n const item = (isSrc ? this._getDisplaySource() : this._getDisplayTarget())[idx];\n if (isSrc) this._toggleSourceSelection(item, idx); else this._toggleTargetSelection(item, idx);\n });\n }\n this._updateControlsState();\n }\n\n private _handleSelectAll(checkbox: HTMLInputElement): void {\n const isSrc = checkbox.dataset.list === 'source';\n if (isSrc) {\n this._sourceSelection = checkbox.checked ? [...this._getDisplaySource()] : [];\n this._emitSelectionChangeSource();\n } else {\n this._targetSelection = checkbox.checked ? [...this._getDisplayTarget()] : [];\n this._emitSelectionChangeTarget();\n }\n this._updateSelectionDisplay();\n this._updateControlsState();\n }\n\n /**\n * Atualiza a selecao visual in-place (classes e checkboxes dos itens existentes),\n * sem recriar o DOM — mantendo referencias de elementos validas durante cliques.\n */\n private _updateSelectionDisplay(): void {\n const updateList = (listSel: HTMLElement | null, isSelFn: (item: PickListItem, i: number) => boolean, getData: () => PickListItem[]): void => {\n if (!listSel) return;\n listSel.querySelectorAll<HTMLElement>('.list-item').forEach(el => {\n const idx = Number(el.dataset.index);\n const selected = isSelFn(getData()[idx], idx);\n el.classList.toggle('selected', selected);\n el.setAttribute('aria-selected', String(selected));\n const cb = el.querySelector<HTMLInputElement>('.checkbox');\n if (cb) cb.checked = selected;\n });\n };\n updateList(this.root.querySelector('.source-list'), (it, i) => this._isSourceSelected(it, i), () => this._getDisplaySource());\n updateList(this.root.querySelector('.target-list'), (it, i) => this._isTargetSelected(it, i), () => this._getDisplayTarget());\n this._updateSelectAllBars();\n }\n\n /** Sincroniza as barras \"Selecionar Todos\" (checkbox + contador) sem re-render completo. */\n private _updateSelectAllBars(): void {\n if (!(this.selectionMode === 'multiple' && this.showSelectAll)) return;\n const bars = [\n { el: this.root.querySelector<HTMLInputElement>('.select-all-checkbox[data-list=\"source\"]'), total: this._source.length, sel: this._sourceSelection.length },\n { el: this.root.querySelector<HTMLInputElement>('.select-all-checkbox[data-list=\"target\"]'), total: this._target.length, sel: this._targetSelection.length },\n ];\n bars.forEach(({ el, total, sel }) => {\n if (!el) return;\n el.checked = total > 0 && sel === total;\n const count = el.closest('.select-all-bar')?.querySelector('.selection-count');\n if (count) count.textContent = `${sel} selecionado(s)`;\n });\n }\n\n private _updateControlsState(): void {\n this.root.querySelectorAll<HTMLButtonElement>('.control-btn').forEach(btn => {\n const a = btn.dataset.action;\n btn.disabled = (a === 'move-target' && this._sourceSelection.length === 0) || (a === 'move-all-target' && this._source.length === 0) || (a === 'move-source' && this._targetSelection.length === 0) || (a === 'move-all-source' && this._target.length === 0);\n });\n }\n\n private _moveToTarget(): void {\n if (!this._sourceSelection.length) return;\n const items = [...this._sourceSelection];\n this._source = this._source.filter(s => !items.some(i => this._getItemKey(i, -1, true) === this._getItemKey(s, -1, true)));\n this._target = [...this._target, ...items];\n this._sourceSelection = [];\n this._filteredSource = null;\n this._filteredTarget = null;\n this._updateListDisplay();\n this._updateControlsState();\n this._emitMoveToTarget();\n }\n\n private _moveToSource(): void {\n if (!this._targetSelection.length) return;\n const items = [...this._targetSelection];\n this._target = this._target.filter(t => !items.some(i => this._getItemKey(i, -1, false) === this._getItemKey(t, -1, false)));\n this._source = [...this._source, ...items];\n this._targetSelection = [];\n this._filteredSource = null;\n this._filteredTarget = null;\n this._updateListDisplay();\n this._updateControlsState();\n this._emitMoveToSource();\n }\n\n private _moveAllToTarget(): void {\n const items = [...this._source];\n this._source = [];\n this._target = [...this._target, ...items];\n this._sourceSelection = [];\n this._filteredSource = null;\n this._filteredTarget = null;\n this._updateListDisplay();\n this._updateControlsState();\n this._emitMoveToTarget();\n }\n\n private _moveAllToSource(): void {\n const items = [...this._target];\n this._target = [];\n this._source = [...this._source, ...items];\n this._targetSelection = [];\n this._filteredSource = null;\n this._filteredTarget = null;\n this._updateListDisplay();\n this._updateControlsState();\n this._emitMoveToSource();\n }\n\n private _toggleSourceSelection(item: PickListItem, index: number): void {\n // Sem selection-mode definido, permite selecao simples (um item por vez)\n const mode = this.selectionMode || 'single';\n const key = this._getItemKey(item, index, true);\n const idx = this._sourceSelection.findIndex(s => this._getItemKey(s, -1, true) === key);\n if (idx >= 0) {\n this._sourceSelection.splice(idx, 1);\n } else if (mode === 'multiple') {\n this._sourceSelection.push(item);\n } else {\n this._sourceSelection = [item];\n }\n this._emitSelectionChangeSource();\n this._updateSelectionDisplay();\n this._updateControlsState();\n }\n\n private _toggleTargetSelection(item: PickListItem, index: number): void {\n // Sem selection-mode definido, permite selecao simples (um item por vez)\n const mode = this.selectionMode || 'single';\n const key = this._getItemKey(item, index, false);\n const idx = this._targetSelection.findIndex(s => this._getItemKey(s, -1, false) === key);\n if (idx >= 0) {\n this._targetSelection.splice(idx, 1);\n } else if (mode === 'multiple') {\n this._targetSelection.push(item);\n } else {\n this._targetSelection = [item];\n }\n this._emitSelectionChangeTarget();\n this._updateSelectionDisplay();\n this._updateControlsState();\n }\n\n private _updateListDisplay(): void {\n const srcWrapper = this.root.querySelector('.source-list')?.parentElement;\n const tgtWrapper = this.root.querySelector('.target-list')?.parentElement;\n const srcLabel = this.root.querySelector('.list-container:first-of-type .list-label');\n const tgtLabel = this.root.querySelector('.list-container:last-of-type .list-label');\n if (!srcWrapper || !tgtWrapper) { this.render(); return; }\n const dSrc = this._getDisplaySource();\n const dTgt = this._getDisplayTarget();\n const hasSel = this.selectionMode;\n const srcItems = dSrc.length === 0 ? `<li class=\"empty-message\" part=\"empty-message\">${this.filter ? 'Nenhum resultado' : 'Nenhum item'}</li>` : dSrc.map((item, i) => `<li class=\"list-item${this._isSourceSelected(item, i) ? ' selected' : ''}\" part=\"list-item\" data-index=\"${i}\" data-list=\"source\" role=\"option\" aria-selected=\"${this._isSourceSelected(item, i)}\" tabindex=\"0\">${hasSel ? '<input type=\"checkbox\" class=\"checkbox\" part=\"checkbox\"' + (this._isSourceSelected(item, i) ? ' checked' : '') + ' />' : ''}<span class=\"item-content\" part=\"item-content\">${this._optionTemplate ? this._optionTemplate(item) : esc(this._getItemLabel(item))}</span></li>`).join('');\n const tgtItems = dTgt.length === 0 ? `<li class=\"empty-message\" part=\"empty-message\">${this.filter ? 'Nenhum resultado' : 'Nenhum selecionado'}</li>` : dTgt.map((item, i) => `<li class=\"list-item${this._isTargetSelected(item, i) ? ' selected' : ''}\" part=\"list-item\" data-index=\"${i}\" data-list=\"target\" role=\"option\" aria-selected=\"${this._isTargetSelected(item, i)}\" tabindex=\"0\">${hasSel ? '<input type=\"checkbox\" class=\"checkbox\" part=\"checkbox\"' + (this._isTargetSelected(item, i) ? ' checked' : '') + ' />' : ''}<span class=\"item-content\" part=\"item-content\">${this._optionTemplate ? this._optionTemplate(item) : esc(this._getItemLabel(item))}</span></li>`).join('');\n srcWrapper.innerHTML = `<ul class=\"list source-list\" role=\"listbox\" tabindex=\"0\">${srcItems}</ul>`;\n tgtWrapper.innerHTML = `<ul class=\"list target-list\" role=\"listbox\" tabindex=\"0\">${tgtItems}</ul>`;\n if (srcLabel) srcLabel.textContent = `${this.sourceLabel} (${this._source.length})`;\n if (tgtLabel) tgtLabel.textContent = `${this.targetLabel} (${this._target.length})`;\n this._updateSelectAllBars();\n this._attachListeners();\n }\n}\n\nexport function defineFxPickList(): typeof FxPickList {\n return defineElement('fx-picklist', FxPickList);\n}","import { defineFxPickList } from './picklist';\n\n// Reexporta a classe para uso programático (ex.: instanceof, herança).\nexport { FxPickList } from './picklist';\nexport type { PickListItem } from './picklist';\n\n// Auto-registro: basta importar o subpath `@wrrdev/fenix-ui/picklist`\n// para que o componente seja definido no CustomElementRegistry.\ndefineFxPickList();\n\n","import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\nimport { esc } from '../../core/sanitize';\n\n/**\n * <fx-accordion-panel> — Painel individual do accordion.\n *\n * Atributos:\n * - header: titulo exibido no cabecalho (ou use o slot \"header\").\n * - value: identificador unico do painel (usado pelo fx-accordion).\n * - expanded: presenca indica painel aberto (controlado pelo fx-accordion).\n * - disabled: impede a abertura do painel.\n */\nexport class FxAccordionPanel 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 color: var(--fx-text-default);\n }\n /* A borda fica no wrapper interno (nao no :host): regras do documento\n externo (ex.: preflight do Tailwind com border-width: 0) vencem as\n regras :host do shadow tree, o que apagaria a linha divisoria. */\n .panel {\n border-bottom: 1px solid var(--fx-border-default);\n }\n :host(:last-child) .panel { border-bottom: none; }\n :host([disabled]) { opacity: 0.6; pointer-events: none; }\n .header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--fx-space-md);\n width: 100%;\n box-sizing: border-box;\n padding: var(--fx-space-lg, 20px) var(--fx-space-md, 14px);\n border: none;\n background: transparent;\n font-family: inherit;\n font-size: inherit;\n font-weight: 500;\n color: var(--fx-text-muted);\n text-align: left;\n cursor: pointer;\n transition: color var(--fx-motion-duration-fast, 150ms) var(--fx-motion-easing, ease),\n background var(--fx-motion-duration-fast, 150ms) var(--fx-motion-easing, ease);\n }\n .header:hover { color: var(--fx-text-default); }\n .header:focus-visible {\n outline: none;\n box-shadow: var(--fx-effect-focus-ring, none);\n border-radius: var(--fx-radius-sm, 4px);\n }\n :host([expanded]) .header {\n color: var(--fx-text-default);\n font-weight: 700;\n }\n .header-text { flex: 1; min-width: 0; }\n .chevron {\n flex-shrink: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n color: var(--fx-text-muted);\n transition: transform var(--fx-motion-duration-normal, 250ms) var(--fx-motion-easing, ease);\n }\n :host([expanded]) .chevron { transform: rotate(180deg); color: var(--fx-color-primary); }\n .content {\n display: grid;\n grid-template-rows: 0fr;\n transition: grid-template-rows var(--fx-motion-duration-normal, 250ms) var(--fx-motion-easing, ease);\n }\n :host([expanded]) .content { grid-template-rows: 1fr; }\n .content-inner { overflow: hidden; }\n .content-pad {\n padding: 0 var(--fx-space-md, 14px) var(--fx-space-lg, 20px);\n color: var(--fx-text-muted);\n line-height: 1.6;\n }\n `;\n\n static override get observedAttributes(): string[] {\n return ['header', 'expanded', 'disabled'];\n }\n\n get header(): string {\n return this.getAttr('header', '');\n }\n set header(v: string) {\n this.setAttribute('header', v);\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 get expanded(): boolean {\n return this.hasAttr('expanded');\n }\n set expanded(v: boolean) {\n this.toggleAttr('expanded', v);\n }\n\n get disabled(): boolean {\n return this.hasAttr('disabled');\n }\n set disabled(v: boolean) {\n this.toggleAttr('disabled', v);\n }\n\n protected override connectedCallback(): void {\n super.connectedCallback();\n // O clique vem do shadow root; composedPath() revela o alvo real.\n if (!this._clickListenerAttached) {\n this._clickListenerAttached = true;\n this.addEventListener('click', (e) => {\n const path = e.composedPath() as HTMLElement[];\n if (!path.some((el) => el.classList?.contains('header'))) return;\n if (this.disabled) return;\n this.dispatchEvent(\n new CustomEvent('fx-accordion-toggle', {\n bubbles: true,\n composed: true,\n detail: { panel: this },\n }),\n );\n });\n }\n // Re-render quando o atributo expanded muda (para aria-expanded).\n this._mo = new MutationObserver(() => this.render());\n this._mo.observe(this, { attributes: true, attributeFilter: ['expanded', 'header', 'disabled'] });\n }\n\n protected override disconnectedCallback(): void {\n this._mo?.disconnect();\n this._mo = null;\n super.disconnectedCallback();\n }\n\n private _mo: MutationObserver | null = null;\n private _clickListenerAttached = false;\n\n protected override render(): void {\n this.setTemplate(`\n <div class=\"panel\" part=\"panel\">\n <button type=\"button\" class=\"header\" part=\"header\" role=\"button\"\n aria-expanded=\"${this.expanded}\"\n ${this.disabled ? 'aria-disabled=\"true\"' : ''}>\n <span class=\"header-text\" part=\"header-text\">\n <slot name=\"header\">${esc(this.header)}</slot>\n </span>\n <span class=\"chevron\" part=\"chevron\" aria-hidden=\"true\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"6 9 12 15 18 9\"></polyline>\n </svg>\n </span>\n </button>\n <div class=\"content\" part=\"content\" role=\"region\">\n <div class=\"content-inner\">\n <div class=\"content-pad\" part=\"content-pad\"><slot></slot></div>\n </div>\n </div>\n </div>\n `);\n }\n}\n\n/**\n * <fx-accordion> — Conjunto de paineis expansivos (estilo PrimeVue).\n *\n * Por padrao (modo single) abrir um painel fecha os outros.\n * Adicione o atributo `multiple` para permitir varios paineis abertos.\n *\n * Uso:\n * <fx-accordion value=\"p1\">\n * <fx-accordion-panel value=\"p1\" header=\"Titulo 1\">Conteudo…</fx-accordion-panel>\n * <fx-accordion-panel value=\"p2\" header=\"Titulo 2\">Conteudo…</fx-accordion-panel>\n * </fx-accordion>\n *\n * Atributos:\n * - value: valor(es) ativo(s), separados por virgula no modo multiple.\n * - multiple: permite manter varios paineis abertos ao mesmo tempo.\n *\n * Evento: `change` (composed, detail: { value: string[] }).\n */\nexport class FxAccordion 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 .accordion {\n background: var(--fx-surface-background, #ffffff);\n border: 1px solid var(--fx-border-default);\n border-radius: var(--fx-radius-md, 8px);\n overflow: hidden;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.06);\n }\n `;\n\n static override get observedAttributes(): string[] {\n return ['value', 'multiple'];\n }\n\n get multiple(): boolean {\n return this.hasAttr('multiple');\n }\n set multiple(v: boolean) {\n this.toggleAttr('multiple', v);\n }\n\n /** Valores ativos como array. */\n get values(): string[] {\n return this.getAttr('value', '').split(',').map(s => s.trim()).filter(Boolean);\n }\n set values(v: string[]) {\n this.setAttribute('value', v.join(','));\n }\n\n protected override connectedCallback(): void {\n this._observer = new MutationObserver(() => this._sync());\n this._observer.observe(this, { childList: true, subtree: true });\n super.connectedCallback();\n // Os paineis filhos podem ainda nao estar upgradados no primeiro sync;\n // reagenda para depois da fila de upgrade de custom elements.\n queueMicrotask(() => this._sync());\n }\n\n protected override disconnectedCallback(): void {\n this._observer?.disconnect();\n this._observer = null;\n }\n\n private _observer: MutationObserver | null = null;\n\n protected override render(): void {\n this.setTemplate(`\n <div class=\"accordion\" part=\"accordion\">\n <slot></slot>\n </div>\n `);\n this._sync();\n this._attachListeners();\n }\n\n /** Painéis do accordion (filhos diretos ou descendentes). */\n private get panels(): FxAccordionPanel[] {\n return Array.from(this.querySelectorAll<FxAccordionPanel>('fx-accordion-panel'));\n }\n\n private _sync(): void {\n const actives = this.values;\n // Leitura via getAttribute (nao via getters) porque os paineis filhos\n // podem ainda nao estar upgradados quando o accordion conecta.\n const panels = Array.from(this.querySelectorAll('fx-accordion-panel'));\n // Apenas na conexao inicial (sem valor definido): abre o primeiro painel.\n if (!this._initialized && actives.length === 0 && panels.length > 0) {\n this._initialized = true;\n const first = panels.find((p) => !p.hasAttribute('disabled'));\n if (first) {\n this.values = [first.getAttribute('value') || '0'];\n return;\n }\n }\n this._initialized = true;\n panels.forEach((p, i) => {\n const v = p.getAttribute('value') || String(i);\n if (!p.hasAttribute('value')) p.setAttribute('value', v);\n p.toggleAttribute('expanded', actives.includes(v));\n });\n }\n\n private _initialized = false;\n\n private _attachListeners(): void {\n if (this._listenersAttached) return;\n this._listenersAttached = true;\n // O painel emite 'fx-accordion-toggle' a partir do proprio host\n // (event retargeting do Shadow DOM impede usar closest('.header') aqui).\n this.addEventListener('fx-accordion-toggle', (e) => {\n const panel = (e as CustomEvent).detail?.panel as FxAccordionPanel | undefined;\n if (!panel || panel.disabled) return;\n this.toggle(panel);\n });\n }\n\n private _listenersAttached = false;\n\n /** Abre/fecha um painel respeitando o modo (single | multiple). */\n toggle(panel: FxAccordionPanel): void {\n const v = panel.value;\n let actives = this.values;\n if (panel.expanded) {\n actives = actives.filter(a => a !== v);\n } else if (this.multiple) {\n actives = [...actives, v];\n } else {\n actives = [v];\n }\n this.values = actives;\n this._sync();\n this.dispatchEvent(\n new CustomEvent('change', {\n bubbles: true,\n composed: true,\n detail: { value: actives },\n }),\n );\n }\n\n /** Abre um painel pelo valor. */\n open(value: string): void {\n const panel = this.panels.find((p, i) => (p.value || String(i)) === value);\n if (panel && !panel.expanded) this.toggle(panel);\n }\n\n /** Fecha um painel pelo valor. */\n close(value: string): void {\n const panel = this.panels.find((p, i) => (p.value || String(i)) === value);\n if (panel && panel.expanded) this.toggle(panel);\n }\n}\n\nexport function defineFxAccordion(): typeof FxAccordion {\n return defineElement('fx-accordion', FxAccordion);\n}\n\nexport function defineFxAccordionPanel(): typeof FxAccordionPanel {\n return defineElement('fx-accordion-panel', FxAccordionPanel);\n}\n","import { defineFxAccordion, defineFxAccordionPanel } from './accordion';\n\n// Reexporta as classes para uso programático (ex.: instanceof, herança).\nexport { FxAccordion, FxAccordionPanel } from './accordion';\n\n// Auto-registro: basta importar o subpath `@wrrdev/fenix-ui/accordion`\n// para que os componentes sejam definidos no CustomElementRegistry.\ndefineFxAccordion();\ndefineFxAccordionPanel();\n"],"file":"fenix-ui4.esm.js"}