@jcdecor/vue 0.1.0 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["t","classes","dropdown","header","footer","classes","Cascader","classes","Card","NumberFormatter","classes","label","classes","CheckboxIndicator","classes","classes","burger","classes","classes","Tooltip","FloatingWindow","brand","title","classes","Table","typography","brand","typography","toneColor","Text","varsResolver","root","_unref","_openBlock","_createBlock","_mergeProps","_withCtx","_createElementVNode","_normalizeProps","_guardReactiveProps","_resolveDynamicComponent","_renderSlot","_createElementBlock","_createCommentVNode","_sfc_main","PromoBannerComponent","root","_hoisted_1","_openBlock","_createBlock","_unref","_normalizeProps","_guardReactiveProps","_withCtx","_createElementBlock","_mergeProps","_normalizeStyle","_resolveDynamicComponent","_createCommentVNode","_sfc_main","ContentCardComponent","root","footer","_hoisted_1","_openBlock","_createBlock","_unref","_normalizeProps","_guardReactiveProps","_withCtx","_createElementVNode","_resolveDynamicComponent","_createElementBlock","_mergeProps","_createCommentVNode","_createTextVNode","_toDisplayString","_sfc_main","KpiCardComponent","classes","name","classes","root","_openBlock","_createBlock","_unref","_mergeProps","_withCtx","_createElementVNode","_normalizeProps","_guardReactiveProps","_createTextVNode","_toDisplayString","_createCommentVNode","_resolveDynamicComponent","_createElementBlock","_createVNode","_sfc_main","ProductCardComponent","_openBlock","_createElementBlock","_createVNode","_unref","_mergeProps","_withCtx","_createBlock","_resolveDynamicComponent","_normalizeProps","_guardReactiveProps","_createElementVNode","_createCommentVNode","_sfc_main","TopNavComponent","FileInput","NumberInput","Tooltip","withThemeDefaults","PillsInput","Cascader","FloatingWindow","CheckboxIndicator","NumberFormatter","Card","Table","feedback","spacing","tokens","ramps","chartColors","fontFamily","typography$1","chartPalette","grid","brand$1","semantic","jcColors","formatNumber","Disclaimer","Kicker","Subheadline","formatDate","Display","formatCompact","formatPercent","formatCurrency","formatTime","LOCALE","Headline","SpartanHelmet","greekFramePaths","JcLogoAlt","logoPaths","GreekFrame","altLogoPaths","JcLogo","collaboratorPaths","Collaborator","spartanPaths","Card$1","Cascader$1","CheckboxIndicator$1","FloatingWindow$1","NumberFormatter$1","Table$1","Tooltip$1","Text$1","LIGHT_FAMILIES","jcVariantColorResolver","input","colorName","theme","parsed","parseThemeColor","family","variant","defaultVariantColorsResolver","base","light","isPrimary","tone","themed","isSize","size","control","overlayProps","buttons_module_default","buttonsComponents","Button","props","c","ActionIcon","CloseButton","combobox_module_default","COMBOBOX_INPUTS","dropdownClassNames","classNamesByComponent","comboboxComponents","name","classNames","Pill","dataDisplay_module_default","dataDisplayComponents","Accordion","Avatar","BackgroundImage","Badge","DataList","Image","Indicator","Kbd","RollingNumber","Spoiler","ThemeIcon","Timeline","feedback_module_default","feedbackComponents","Notification","Alert","Loader","Progress","RingProgress","SemiCircleProgress","Skeleton","EmptyState","inputs_module_default","inputDefaults","colorSliderClassNames","sliderClassNames","inputsComponents","Input","InputWrapper","NativeSelect","Checkbox","CheckboxCard","Radio","RadioIndicator","RadioCard","Switch","Chip","SegmentedControl","Fieldset","PinInput","Slider","RangeSlider","AngleSlider","Rating","ColorPicker","AlphaSlider","HueSlider","layout_module_default","layoutComponents","Container","Splitter","misc_module_default","miscComponents","Paper","Divider","ScrollArea","navigation_module_default","navigationComponents","Tabs","Anchor","Burger","NavLink","Pagination","Stepper","TableOfContents","Tree","overlays_module_default","menuClassNames","overlaysComponents","Menu","Menubar","Popover","HoverCard","Modal","Drawer","Dialog","ActionBar","Overlay","LoadingOverlay","typography_module_default","YELLOWS","typographyComponents","Blockquote","Code","List","Mark","yellow","color","getThemeColor","Title","Typography","jcComponents","t","jcTheme","kebab","s","schemeVars","staticVars","vars","step","hex","value","tagVars","lightColorVars","chartVars","colors","i","jcCssVariablesResolver","COLOR_SCHEME_STORAGE_KEY","isScheme","readStoredScheme","key","ColorSchemePersistence","defineComponent","useMantineColorScheme","watch","colorScheme","JcProvider","computed","deepMerge","stored","h","MantineProvider","attrs","slots","toneColor$1","toneIcon","IconInfoCircle","IconCheck","IconAlertTriangle","IconX","Tag","Icon","hasCustom","leftSection","hasContent","node","child","isVNode","Comment","Fragment","resolveContent","resolveNode","prop","slot","useListenerCheck","instance","getCurrentInstance","toHandlerKey","event","camelize","nodeProp","palette","varsResolver$1","createVarsResolver","radius","getRadius","PromoBanner_module_default","PromoBanner","factory","__emit","rawProps","__props","emit","useAttrs","useSlots","useProps","open","setOpen","useUncontrolled","getStyles","useStyles","icon","highlight","close","unref","openBlock","createBlock","Box","mergeProps","withCtx","createElementVNode","normalizeProps","guardReactiveProps","resolveDynamicComponent","renderSlot","_ctx","createElementBlock","createCommentVNode","ContentCard_module_default","_hoisted_1$2","ContentCard","kicker","title","actions","body","imageUrl","imageNode","normalizeStyle","getDeltaTone","delta","invert","toneColor","varsResolver","invertDelta","colorValue","KpiCard_module_default","_hoisted_1$1","_hoisted_2","KpiCard_default","label","deltaLabel","chart","arrowIcon","IconMinus","IconArrowUpRight","IconArrowDownRight","createTextVNode","toDisplayString","KpiGroup","SimpleGrid","KpiCard","PageHeader","description","breadcrumbs","Breadcrumbs","crumb","index","linkComponent","Group","DataTable_module_default","columnId","column","compare","a","b","DataTable","sort","setSortValue","next","page","ref","setSort","toggleSort","current","sorted","getValue","row","result","hasListener","loadingRows","currentSort","total","totalPages","pageSize","currentPage","visible","clickable","header","TableThead","TableTr","columns","id","isSorted","SortIcon","IconArrowUp","IconArrowDown","IconArrowsSort","TableTh","loading","TableTd","empty","IconDatabaseOff","cellSlot","raw","content","plain","tableProps","TableTbody","ThemeToggle","useComputedColorScheme","toggle","setColorScheme","IconSun","IconMoon","TokenSwatch_module_default","TokenSwatch","clipboard","useClipboard","text","ColorRamp","luminance","valueSize","PriceTag","oldValue","Text","unit","pixDiscount","installments","ProductCard_module_default","_hoisted_1","ProductCard","discount","showFavorite","showAction","linkProps","link","nameComponent","renderBadges","badge","_cache","IconHeartFilled","IconHeart","createVNode","$event","IconShoppingCart","CouponCode","copied","IconTicket","IconCopy","TopNav_module_default","TopNav","opened","useDisclosure","RenderNode","p","hrefProps","href","withChildren","component","children","renderLinks","isButton","onNavigate","brandNode","rightNode","brandComponent","brandProps","withBurger","rootMod","Collapse","Combobox"],"sources":["../src/theme/variantColorResolver.ts","../src/theme/components/types.ts","../src/theme/controls.ts","../src/theme/components/buttons.module.css","../src/theme/components/buttons.ts","../src/theme/components/combobox.module.css","../src/theme/components/combobox.ts","../src/theme/components/dataDisplay.module.css","../src/theme/components/dataDisplay.ts","../src/theme/components/feedback.module.css","../src/theme/components/feedback.ts","../src/theme/components/inputs.module.css","../src/theme/components/inputs.ts","../src/theme/components/layout.module.css","../src/theme/components/layout.ts","../src/theme/components/misc.module.css","../src/theme/components/misc.ts","../src/theme/components/navigation.module.css","../src/theme/components/navigation.ts","../src/theme/components/overlays.module.css","../src/theme/components/overlays.ts","../src/theme/components/typography.module.css","../src/theme/components/typography.ts","../src/theme/components/index.ts","../src/theme/theme.ts","../src/theme/cssVariablesResolver.ts","../src/provider/JcProvider.ts","../src/components/Tag/Tag.ts","../src/utils/vue.ts","../src/components/PromoBanner/PromoBanner.vars.ts","../src/components/PromoBanner/PromoBanner.module.css","../src/components/PromoBanner/PromoBanner.vue","../src/components/PromoBanner/PromoBanner.vue","../src/components/PromoBanner/PromoBanner.ts","../src/components/ContentCard/ContentCard.module.css","../src/components/ContentCard/ContentCard.vue","../src/components/ContentCard/ContentCard.vue","../src/components/ContentCard/ContentCard.ts","../src/components/KpiCard/KpiCard.vars.ts","../src/components/KpiCard/KpiCard.module.css","../src/components/KpiCard/KpiCard.vue","../src/components/KpiCard/KpiCard.vue","../src/components/KpiCard/KpiGroup.ts","../src/components/KpiCard/KpiCard.ts","../src/components/PageHeader/PageHeader.ts","../src/components/DataTable/DataTable.module.css","../src/components/DataTable/DataTable.ts","../src/components/ThemeToggle/ThemeToggle.ts","../src/components/TokenSwatch/TokenSwatch.module.css","../src/components/TokenSwatch/TokenSwatch.ts","../src/components/PriceTag/PriceTag.ts","../src/components/ProductCard/ProductCard.module.css","../src/components/ProductCard/ProductCard.vue","../src/components/ProductCard/ProductCard.vue","../src/components/ProductCard/ProductCard.ts","../src/components/CouponCode/CouponCode.ts","../src/components/TopNav/TopNav.module.css","../src/components/TopNav/TopNav.vue","../src/components/TopNav/TopNav.vue","../src/components/TopNav/TopNav.ts"],"sourcesContent":["import {\n defaultVariantColorsResolver,\n parseThemeColor,\n type VariantColorsResolver,\n} from '@mantine-vue/core';\n\n/** Cores de \"tag\" (variante light) por família — variáveis definidas no cssVariablesResolver. */\nconst LIGHT_FAMILIES: Record<string, string> = {\n horizon: 'primary',\n blue: 'primary',\n evergreen: 'success',\n green: 'success',\n teal: 'success',\n electric: 'warn',\n yellow: 'warn',\n danger: 'error',\n red: 'error',\n obsidian: 'neutral',\n gray: 'neutral',\n dark: 'neutral',\n};\n\n/**\n * Resolver de variantes da marca:\n * - `accent` → botão Destaque (fundo Electric, texto Obsidian)\n * - `outline` → hover usa o fundo suave da própria cor (ds-btn-secondary)\n * - `subtle` sem cor → Ghost (texto-2, hover surface-2)\n * - `light` → selos/tags com as cores semânticas do ds.css\n */\nexport const jcVariantColorResolver: VariantColorsResolver = (input) => {\n const { variant, theme } = input;\n const colorName = input.color ?? theme.primaryColor;\n const parsed = parseThemeColor({ color: colorName, theme });\n const family = parsed.isThemeColor ? parsed.color : undefined;\n\n if (variant === 'accent') {\n return {\n background: 'var(--mantine-color-electric-3)',\n hover: 'color-mix(in oklch, var(--mantine-color-electric-3), var(--mantine-color-electric-4) 40%)',\n color: 'var(--mantine-color-obsidian-6)',\n hoverColor: 'var(--mantine-color-obsidian-6)',\n border: '1px solid transparent',\n };\n }\n\n // Electric \"cheio\" = amarelo da marca (tom 300) com texto navy, não o âmbar do tom 600.\n if (variant === 'filled' && (family === 'electric' || family === 'yellow') && parsed.shade === undefined) {\n return {\n background: 'var(--mantine-color-electric-3)',\n hover: 'color-mix(in oklch, var(--mantine-color-electric-3), var(--mantine-color-electric-4) 40%)',\n color: 'var(--mantine-color-obsidian-6)',\n hoverColor: 'var(--mantine-color-obsidian-6)',\n border: '1px solid transparent',\n };\n }\n\n // Filled em qualquer cor do tema: o Mantine calcula o contraste pelo tom do tema CLARO mesmo no escuro\n // (texto branco sobre o tom 400 = 2,6:1). --jc-on-filled é branco no claro e navy no escuro (≥ 4,6:1).\n if (variant === 'filled' && family && parsed.shade === undefined) {\n const base = defaultVariantColorsResolver(input);\n return { ...base, color: 'var(--jc-on-filled)', hoverColor: 'var(--jc-on-filled)' };\n }\n\n if (variant === 'outline') {\n const base = defaultVariantColorsResolver(input);\n const light = defaultVariantColorsResolver({ ...input, variant: 'light' });\n const isPrimary = !input.color || family === theme.primaryColor;\n return {\n ...base,\n hover: isPrimary ? 'var(--ds-primary-soft)' : light.background,\n color: isPrimary ? 'var(--ds-primary)' : base.color,\n border: isPrimary ? '1px solid var(--ds-primary)' : base.border,\n };\n }\n\n // O Mantine Vue sempre envia `color: theme.primaryColor` quando o componente não tem cor, então \"sem cor\"\n // é a cor primária pelo nome exato. Para um subtle azul de verdade use `color=\"horizon.6\"` ou `color=\"blue\"`.\n if (variant === 'subtle' && (!input.color || input.color === theme.primaryColor)) {\n return {\n background: 'transparent',\n hover: 'var(--ds-surface-2)',\n color: 'var(--ds-text-2)',\n hoverColor: 'var(--ds-text)',\n border: '1px solid transparent',\n };\n }\n\n if (variant === 'light' && family && LIGHT_FAMILIES[family]) {\n const tone = LIGHT_FAMILIES[family];\n return {\n background: `var(--ds-tag-${tone}-bg)`,\n hover: `var(--ds-tag-${tone}-hover)`,\n color: `var(--ds-tag-${tone}-color)`,\n border: '1px solid transparent',\n };\n }\n\n return defaultVariantColorsResolver(input);\n};\n","import type { MantineThemeComponent } from '@mantine-vue/core';\n\n/** `theme.components` do Mantine Vue (o pacote não exporta um tipo nomeado como o `MantineThemeComponents` do React). */\nexport type ThemeComponents = Record<string, MantineThemeComponent>;\n\n/**\n * Equivalente tipado de `Component.extend(input)`. No Mantine Vue 3.5 vários componentes\n * (Accordion, Cascader, SegmentedControl…) não têm `extend` em runtime;\n * como `extend` é só identidade, usamos o tipo dele quando existe e devolvemos o próprio input.\n */\nexport function themed<C>(\n _component: C,\n input: C extends { extend: (input: infer Input) => unknown } ? Input : MantineThemeComponent,\n): MantineThemeComponent {\n return input as MantineThemeComponent;\n}\n","import type { MantineSize } from '@mantine-vue/core';\nimport { typography as t } from './tokens';\n\nexport const isSize = (size: unknown): size is MantineSize =>\n size === 'xs' || size === 'sm' || size === 'md' || size === 'lg' || size === 'xl';\n\n/**\n * Alturas dos controles em passos de 8px (alvo de toque ≥ 40px no md; 48px no lg para mobile/checkout).\n * Botões usam 14px/600; campos usam 16px (evita zoom automático no iOS e melhora leitura).\n */\nexport const control = {\n xs: { height: '28px', px: '10px', fz: '12px', inputFz: '12px' },\n sm: { height: '32px', px: '12px', fz: '13px', inputFz: '14px' },\n md: { height: '40px', px: '16px', fz: t.button.size, inputFz: '16px' },\n lg: { height: '48px', px: '20px', fz: '16px', inputFz: '16px' },\n xl: { height: '56px', px: '24px', fz: '18px', inputFz: '18px' },\n} as const;\n\n/** Overlay padrão de modais/drawers: navy da marca. */\nexport const overlayProps = { backgroundOpacity: 0.5, blur: 2, color: '#08154B' } as const;\n","/* @generated sincronizado de packages/ui/src/theme/components/buttons.module.css — edite lá e rode `npm run sync -w @jcdecor/vue` */\n/* Buttons — Button, ActionIcon, CloseButton, CopyButton, FileButton, UnstyledButton */\n.button {\n font-weight: 600;\n line-height: 1.5;\n transition: background-color 0.15s, border-color 0.15s, color 0.15s, box-shadow 0.15s;\n}\n.button:where(:disabled:not([data-loading]), [data-disabled]:not([data-loading])) {\n background: var(--button-bg, var(--mantine-primary-color-filled));\n color: var(--button-color, var(--mantine-color-white));\n border: var(--button-bd, 1px solid transparent);\n opacity: 0.45;\n}\n\n/* ActionIcon: tamanhos em passos de 4/8px; `input-*` igual às alturas dos campos da marca */\n.actionIcon {\n --ai-size-xs: 24px;\n --ai-size-sm: 28px;\n --ai-size-md: 32px;\n --ai-size-lg: 40px;\n --ai-size-xl: 48px;\n --ai-size-input-xs: 28px;\n --ai-size-input-sm: 32px;\n --ai-size-input-md: 40px;\n --ai-size-input-lg: 48px;\n --ai-size-input-xl: 56px;\n transition: background-color 0.15s, border-color 0.15s, color 0.15s;\n}\n/* Desabilitado como no Button: mantém a cor da variante, 45% de opacidade */\n.actionIcon:where(:disabled:not([data-loading]), [data-disabled]:not([data-loading])) {\n background: var(--ai-bg);\n color: var(--ai-color);\n border: var(--ai-bd);\n opacity: 0.45;\n}\n.actionIcon:where([data-variant='default']) {\n border-color: var(--ds-border-soft);\n}\n\n/* CloseButton: ícone texto-2; hover translúcido (funciona sobre surface, primary-soft, alertas…) */\n.closeButton {\n color: var(--ds-text-2);\n transition: background-color 0.15s, color 0.15s;\n}\n@media (hover: hover) {\n .closeButton:where(:not([data-disabled], :disabled)):hover {\n color: var(--ds-text);\n }\n .closeButton:where([data-variant='subtle'], :not([data-variant])):where(:not([data-disabled], :disabled)):hover {\n background-color: color-mix(in srgb, var(--ds-text) 8%, transparent);\n }\n}\n.closeButton:focus-visible {\n outline: 2px solid var(--ds-primary);\n outline-offset: 1px;\n}\n","import { themed, type ThemeComponents } from './types';\nimport { ActionIcon, Button, CloseButton, type MantineSize } from '@mantine-vue/core';\nimport { control, isSize } from '../controls';\nimport classes from './buttons.module.css';\n\nexport const buttonsComponents: ThemeComponents = {\n Button: themed(Button, {\n classNames: { root: classes.button },\n vars: (_theme, props) => {\n if (!isSize(props.size ?? 'md')) return { root: {} };\n const c = control[(props.size ?? 'md') as MantineSize];\n return { root: { '--button-height': c.height, '--button-padding-x': c.px, '--button-fz': c.fz } };\n },\n }),\n ActionIcon: themed(ActionIcon, { defaultProps: { variant: 'subtle' }, classNames: { root: classes.actionIcon } }),\n CloseButton: themed(CloseButton, { classNames: { root: classes.closeButton } }),\n};\n","/* @generated sincronizado de packages/ui/src/theme/components/combobox.module.css — edite lá e rode `npm run sync -w @jcdecor/vue` */\n/* Combobox — Select, MultiSelect, Autocomplete, TagsInput, Pill, Cascader, TreeSelect… */\n\n/* Dropdown: mesma superfície dos popovers da marca (também no escuro) */\n.dropdown {\n background-color: var(--ds-surface);\n border-color: var(--ds-border-soft);\n box-shadow: var(--ds-shadow-md);\n}\n\n/*\n * Opções\n * - hover / navegação por teclado ([data-combobox-selected]) → surface-2 (no Mantine: azul sólido + branco)\n * - opção marcada ([data-combobox-active] / [data-checked]) → primary-soft + texto primary\n */\n.option {\n border-radius: var(--ds-radius-sm);\n color: var(--ds-text);\n transition: background-color 0.1s, color 0.1s;\n}\n.option:where([data-combobox-selected]),\n.option:where(:not([data-combobox-disabled])):hover {\n background-color: var(--ds-surface-2);\n color: var(--ds-text);\n}\n.option:where([data-combobox-active], [data-checked]) {\n background-color: var(--ds-primary-soft);\n color: var(--ds-primary);\n font-weight: 500;\n}\n.option:where([data-combobox-active], [data-checked]):where([data-combobox-selected], :hover) {\n background-color: var(--ds-tag-primary-hover);\n color: var(--ds-primary);\n}\n/* Seta de expandir do TreeSelect: não fica branca na opção navegada */\n.option:where([data-combobox-selected]) :where([data-expanded], [role='button']) {\n color: var(--ds-text-3);\n}\n\n/* Rótulo de grupo: caption 600 em texto-3, divisor suave */\n.groupLabel {\n color: var(--ds-text-3);\n font-size: var(--type-disclaimer);\n font-weight: 600;\n letter-spacing: 0.01em;\n}\n.groupLabel::after {\n background-color: var(--ds-border-soft);\n}\n\n.empty {\n color: var(--ds-text-3);\n}\n\n/* Busca, cabeçalho e rodapé: divisores suaves e fundo da superfície */\n.search,\n.search:focus {\n background-color: var(--ds-surface);\n border-color: var(--ds-border-soft);\n}\n.header,\n.footer {\n border-color: var(--ds-border-soft);\n color: var(--ds-text-2);\n}\n\n/* Pills (MultiSelect, TagsInput, TreeSelect, Pill) — tag neutra da marca */\n.pill {\n background-color: var(--ds-tag-neutral-bg);\n color: var(--ds-tag-neutral-color);\n font-weight: 500;\n}\n.pill:where([data-variant='contrast']) {\n background-color: var(--ds-tag-primary-bg);\n color: var(--ds-tag-primary-color);\n}\n.pill:where([data-disabled], :has(button:disabled)) {\n opacity: 0.6;\n}\n.pillRemove {\n color: inherit;\n}\n.pillRemove:where(:not(:disabled)):hover {\n background-color: var(--ds-tag-neutral-hover);\n}\n.pill:where([data-variant='contrast']) .pillRemove:where(:not(:disabled)):hover {\n background-color: var(--ds-tag-primary-hover);\n}\n\n/* Cascader: coluna em navegação em primary-soft (não azul sólido), trilha em surface-2 */\n.cascaderColumn {\n border-inline-end-color: var(--ds-border-soft);\n}\n.cascaderColumn:where([data-last]) {\n border-inline-end-color: transparent;\n}\n.cascaderOption {\n border-radius: var(--ds-radius-sm);\n color: var(--ds-text);\n}\n.cascaderOption:where(:not([data-disabled], [data-active])):hover,\n.cascaderOption:where([data-in-path]) {\n background-color: var(--ds-surface-2);\n}\n.cascaderOption:where([data-active]),\n.cascaderOption:where([data-active]):hover {\n background-color: var(--ds-primary-soft);\n color: var(--ds-primary);\n font-weight: 500;\n}\n.cascaderOption:where([data-selected]:not([data-active])) {\n color: var(--ds-primary);\n font-weight: 500;\n}\n.cascaderOverflow {\n color: var(--ds-text-3);\n border-inline-end-color: var(--ds-border-soft);\n}\n.cascaderOverflow:hover {\n background-color: var(--ds-surface-2);\n}\n","import { themed, type ThemeComponents } from './types';\nimport { Cascader, Pill } from '@mantine-vue/core';\nimport classes from './combobox.module.css';\n\n/** Campos baseados em Combobox: tamanho md por padrão (o Mantine 9 usa sm). */\nconst COMBOBOX_INPUTS = ['Select', 'MultiSelect', 'Autocomplete', 'TagsInput', 'PillsInput', 'Cascader', 'TreeSelect', 'Combobox'];\n\n/** Partes do dropdown comuns a todos os componentes \"combobox-like\". */\nconst dropdownClassNames = {\n dropdown: classes.dropdown,\n option: classes.option,\n groupLabel: classes.groupLabel,\n empty: classes.empty,\n};\n\n/**\n * Cada componente resolve o tema pelo próprio nome (`__staticSelector`), por isso as classes\n * são repetidas em Select, MultiSelect, … em vez de só em Combobox.\n */\nconst classNamesByComponent: Record<string, Record<string, string>> = {\n Combobox: { ...dropdownClassNames, search: classes.search, header: classes.header, footer: classes.footer },\n ComboboxPopover: { ...dropdownClassNames, search: classes.search },\n Select: dropdownClassNames,\n Autocomplete: dropdownClassNames,\n MultiSelect: { ...dropdownClassNames, pill: classes.pill },\n TagsInput: { ...dropdownClassNames, pill: classes.pill },\n TreeSelect: { ...dropdownClassNames, pill: classes.pill },\n};\n\nexport const comboboxComponents: ThemeComponents = {\n ...Object.fromEntries(COMBOBOX_INPUTS.map((name) => [name, { defaultProps: { size: 'md' } }])),\n ...Object.fromEntries(\n Object.entries(classNamesByComponent).map(([name, classNames]) => [\n name,\n { defaultProps: COMBOBOX_INPUTS.includes(name) ? { size: 'md' } : {}, classNames },\n ]),\n ),\n Cascader: themed(Cascader, {\n defaultProps: { size: 'md' },\n classNames: {\n ...dropdownClassNames,\n column: classes.cascaderColumn,\n columnOption: classes.cascaderOption,\n flatOption: classes.option,\n columnsOverflow: classes.cascaderOverflow,\n },\n }),\n Pill: themed(Pill, { classNames: { root: classes.pill, remove: classes.pillRemove } }),\n};\n","/* @generated sincronizado de packages/ui/src/theme/components/dataDisplay.module.css — edite lá e rode `npm run sync -w @jcdecor/vue` */\n/* Data display — Accordion, Avatar, Badge, Card, DataList, Indicator, Kbd, Spoiler, Timeline… */\n.badge {\n font-weight: 600;\n text-transform: none;\n letter-spacing: 0;\n}\n\n/* Accordion: divisores suaves, rótulo 600, chevron em texto-3 */\n.accordionItem {\n --item-border-color: var(--ds-border-soft);\n --item-filled-color: var(--ds-surface-2);\n}\n.accordionItem[data-active]:where([data-variant='separated']) {\n background-color: var(--ds-surface);\n}\n.accordionControl {\n color: var(--ds-text);\n}\n@media (hover: hover) {\n .accordionControl:where(:not(:disabled, [data-disabled])):hover {\n background-color: var(--ds-surface-2);\n }\n}\n.accordionLabel {\n font-weight: 600;\n font-size: var(--type-subheadline-rg);\n}\n.accordionChevron {\n color: var(--ds-text-3);\n}\n.accordionContent {\n color: var(--ds-text-2);\n font-size: var(--type-subheadline-sm);\n line-height: 1.6;\n}\n\n/* Avatar.Group: o anel acompanha a superfície (cards/painéis), não o fundo da página */\n.avatar:where([data-within-group]) {\n border-color: var(--ds-surface);\n background: var(--ds-surface);\n}\n\n/* DataList: divisor suave, rótulo texto-3, valor texto */\n.dataList[data-with-divider] > * {\n border-color: var(--ds-border-soft);\n}\n.dataListLabel {\n color: var(--ds-text-3);\n}\n.dataListValue {\n color: var(--ds-text);\n font-weight: 500;\n}\n\n/* Indicator: anel na cor da superfície, contador com peso 600 */\n.indicator {\n font-weight: 600;\n font-variant-numeric: tabular-nums;\n}\n.indicator:where([data-with-border]) {\n border-color: var(--ds-surface);\n}\n\n/* Kbd: tecla em surface-2 com borda da marca */\n.kbd {\n font-family: var(--mantine-font-family-monospace);\n font-weight: 600;\n color: var(--ds-text-2);\n background-color: var(--ds-surface-2);\n border-color: var(--ds-border-soft);\n border-bottom-color: var(--ds-border);\n border-radius: 6px;\n}\n\n/* Spoiler: controle como link da marca */\n.spoilerControl {\n color: var(--ds-link);\n font-weight: 600;\n font-size: var(--type-subheadline-sm);\n}\n\n/* Timeline: trilho suave, marcador sobre a superfície */\n.timeline {\n --tl-color: var(--mantine-primary-color-filled);\n}\n.timelineItem {\n --item-border-color: var(--ds-border-soft);\n}\n.timelineBullet {\n background-color: var(--ds-surface);\n border-color: var(--ds-border-soft);\n color: var(--ds-text-3);\n}\n.timelineBullet:where([data-active]) {\n border-color: var(--tli-color, var(--tl-color));\n}\n.timelineBullet:where([data-active][data-with-child]) {\n background-color: var(--tli-color, var(--tl-color));\n color: var(--tl-icon-color, var(--mantine-color-white));\n}\n.timelineTitle {\n font-weight: 600;\n line-height: 1.4;\n color: var(--ds-text);\n}\n/* No escuro o primário (horizon.4) é claro: ícone escuro nos marcadores sem cor própria */\n:where([data-mantine-color-scheme='dark']) .timeline:not([style*='--tl-color']) .timelineItem:not([style*='--tli-color']) .timelineBullet:where([data-active][data-with-child]) {\n color: var(--mantine-primary-color-contrast);\n}\n","import { themed, type ThemeComponents } from './types';\nimport {\n Accordion,\n Avatar,\n BackgroundImage,\n Badge,\n Card,\n DataList,\n Image,\n Indicator,\n Kbd,\n NumberFormatter,\n RollingNumber,\n Spoiler,\n ThemeIcon,\n Timeline,\n} from '@mantine-vue/core';\nimport classes from './dataDisplay.module.css';\n\nexport const dataDisplayComponents: ThemeComponents = {\n Accordion: themed(Accordion, {\n defaultProps: { chevronPosition: 'right' },\n classNames: { item: classes.accordionItem, control: classes.accordionControl, label: classes.accordionLabel, chevron: classes.accordionChevron, content: classes.accordionContent },\n }),\n Avatar: themed(Avatar, { defaultProps: { color: 'horizon', radius: 'xl' }, classNames: { root: classes.avatar } }),\n BackgroundImage: themed(BackgroundImage, { defaultProps: { radius: 'md' } }),\n Badge: themed(Badge, {\n defaultProps: { variant: 'light', radius: 'xl' },\n classNames: { root: classes.badge },\n vars: (_theme, props) =>\n (props.size ?? 'md') === 'md'\n ? { root: { '--badge-height': '24px', '--badge-fz': '12px', '--badge-padding-x': '8px' } }\n : { root: {} },\n }),\n Card: themed(Card, { defaultProps: { radius: 'md', padding: 'lg', shadow: 'sm', withBorder: true } }),\n DataList: themed(DataList, { classNames: { root: classes.dataList, itemLabel: classes.dataListLabel, itemValue: classes.dataListValue } }),\n Image: themed(Image, { defaultProps: { radius: 'md' } }),\n Indicator: themed(Indicator, { defaultProps: { color: 'danger' }, classNames: { indicator: classes.indicator } }),\n Kbd: themed(Kbd, { classNames: { root: classes.kbd } }),\n /** Formato brasileiro por padrão: 1.234,56 */\n NumberFormatter: themed(NumberFormatter, { defaultProps: { thousandSeparator: '.', decimalSeparator: ',' } }),\n RollingNumber: themed(RollingNumber, { defaultProps: { thousandSeparator: '.', decimalSeparator: ',' } }),\n Spoiler: themed(Spoiler, { classNames: { control: classes.spoilerControl } }),\n ThemeIcon: themed(ThemeIcon, { defaultProps: { radius: 'md' } }),\n Timeline: themed(Timeline, {\n defaultProps: { bulletSize: 24, lineWidth: 2 },\n classNames: { root: classes.timeline, item: classes.timelineItem, itemBullet: classes.timelineBullet, itemTitle: classes.timelineTitle },\n }),\n};\n","/* @generated sincronizado de packages/ui/src/theme/components/feedback.module.css — edite lá e rode `npm run sync -w @jcdecor/vue` */\n/* Feedback — Alert, EmptyState, Loader, Notification, Progress, RingProgress, SemiCircleProgress, Skeleton */\n\n/* ---------- Alert ---------- */\n.alert {\n border-radius: var(--ds-radius);\n}\n.alertTitle {\n font-weight: 600;\n}\n/* Corpo em --ds-text (o Mantine usa preto/branco puros); filled e white mantêm a cor própria. */\n.alertMessage:not([data-variant='filled'], [data-variant='white']) {\n color: var(--ds-text);\n}\n\n/* Filled no escuro: o fundo é o tom 400 (claro), então o texto passa a ser escuro (≥ 4,5:1). */\n:root[data-mantine-color-scheme='dark'] .alert[data-variant='filled'] .alertWrapper {\n --alert-color: var(--mantine-color-dark-8);\n}\n\n/* ---------- Notification ---------- */\n.notification {\n background-color: var(--ds-surface);\n box-shadow: var(--ds-shadow-md);\n border: 1px solid var(--ds-border-soft);\n}\n.notificationTitle {\n font-weight: 600;\n color: var(--ds-text);\n}\n.notificationDescription {\n color: var(--ds-text-2);\n}\n/* No escuro o ícone fica sobre o tom 400 da cor: texto escuro para contraste. */\n:root[data-mantine-color-scheme='dark'] .notificationIcon {\n color: var(--mantine-color-dark-8);\n}\n\n/* ---------- Progress ---------- */\n:root[data-mantine-color-scheme] .progress {\n background-color: var(--ds-surface-2);\n box-shadow: inset 0 0 0 1px var(--ds-border-soft);\n}\n.progressLabel {\n font-weight: 600;\n}\n:root[data-mantine-color-scheme='dark'] .progressLabel {\n color: var(--mantine-color-dark-8);\n}\n\n/* ---------- RingProgress / SemiCircleProgress ---------- */\n:root[data-mantine-color-scheme] .ringCurve {\n --rp-curve-root-color: var(--ds-border-soft);\n}\n:root[data-mantine-color-scheme] .semiCircle {\n --scp-empty-segment-color: var(--ds-border-soft);\n}\n.semiCircleLabel {\n font-weight: 600;\n color: var(--ds-text);\n}\n\n/* ---------- Skeleton ---------- */\n:root[data-mantine-color-scheme='light'] .skeleton[data-visible]::after {\n background-color: var(--mantine-color-gray-2);\n}\n:root[data-mantine-color-scheme='dark'] .skeleton[data-visible]::after {\n background-color: var(--mantine-color-dark-4);\n}\n\n/* ---------- EmptyState ---------- */\n:root[data-mantine-color-scheme] .emptyIndicator[data-with-background] {\n --empty-state-indicator-default-bg: var(--ds-surface-2);\n}\n:root[data-mantine-color-scheme='dark'] .emptyState[data-variant='filled'] .emptyIndicator {\n color: var(--mantine-color-dark-8);\n}\n.emptyTitle {\n color: var(--ds-text);\n}\n.emptyDescription {\n color: var(--ds-text-2);\n}\n","import { themed, type ThemeComponents } from './types';\nimport {\n Alert,\n EmptyState,\n Loader,\n Notification,\n Progress,\n RingProgress,\n SemiCircleProgress,\n Skeleton,\n} from '@mantine-vue/core';\nimport classes from './feedback.module.css';\n\nexport const feedbackComponents: ThemeComponents = {\n Notification: themed(Notification, {\n defaultProps: { radius: 'md' },\n classNames: { root: classes.notification, title: classes.notificationTitle, description: classes.notificationDescription, icon: classes.notificationIcon },\n }),\n Alert: themed(Alert, { defaultProps: { variant: 'light' }, classNames: { root: classes.alert, wrapper: classes.alertWrapper, title: classes.alertTitle, message: classes.alertMessage } }),\n Loader: themed(Loader, { defaultProps: { type: 'oval' } }),\n Progress: themed(Progress, { defaultProps: { radius: 'xl' }, classNames: { root: classes.progress, label: classes.progressLabel } }),\n RingProgress: themed(RingProgress, { classNames: { curve: classes.ringCurve } }),\n SemiCircleProgress: themed(SemiCircleProgress, { classNames: { root: classes.semiCircle, label: classes.semiCircleLabel } }),\n Skeleton: themed(Skeleton, { classNames: { root: classes.skeleton } }),\n EmptyState: themed(EmptyState, {\n classNames: { root: classes.emptyState, indicator: classes.emptyIndicator, title: classes.emptyTitle, description: classes.emptyDescription },\n }),\n};\n","/* @generated sincronizado de packages/ui/src/theme/components/inputs.module.css — edite lá e rode `npm run sync -w @jcdecor/vue` */\n/* Inputs — Input/InputWrapper (base de todos os campos), Checkbox, Radio, Switch, SegmentedControl… */\n.input {\n --input-bd: var(--ds-border);\n --input-bd-focus: var(--ds-primary);\n background-color: var(--ds-surface);\n color: var(--ds-text);\n transition: border-color 0.15s, box-shadow 0.15s;\n}\n.input:focus,\n.input:focus-within {\n border-color: var(--ds-primary);\n box-shadow: 0 0 0 3px var(--ds-primary-soft);\n}\n.input[data-error] {\n border-color: var(--ds-error);\n}\n.input[data-error]:focus,\n.input[data-error]:focus-within {\n box-shadow: 0 0 0 3px var(--ds-error-bg);\n}\n[data-success] > .input {\n border-color: var(--ds-success);\n}\n[data-success] > .input:focus,\n[data-success] > .input:focus-within {\n box-shadow: 0 0 0 3px var(--ds-success-bg);\n}\n.input[data-variant='unstyled'],\n.input[data-variant='unstyled']:focus,\n.input[data-variant='unstyled']:focus-within {\n --input-bd: transparent;\n border-color: transparent;\n background-color: transparent;\n box-shadow: none;\n}\n.input::placeholder {\n color: var(--ds-text-3);\n}\n.label {\n font-size: var(--type-subheadline-sm);\n font-weight: 500;\n color: var(--ds-text-2);\n margin-bottom: 4px;\n}\n.description {\n color: var(--ds-text-3);\n}\n.segmentedRoot {\n background-color: var(--ds-surface-2);\n}\n.segmentedIndicator {\n box-shadow: var(--ds-shadow-sm);\n}\n.segmentedLabel {\n font-weight: 500;\n}\n\n/* NativeSelect — seta neutra e opções do menu nativo nas cores do tema (no escuro o SO usaria branco) */\n.nativeSelect option,\n.nativeSelect optgroup {\n background-color: var(--ds-surface);\n color: var(--ds-text);\n}\n.nativeSelectSection {\n color: var(--ds-text-3);\n}\n\n/* Checkbox / Radio — borda desmarcada 3:1 */\n[data-mantine-color-scheme] .checkInput:not([data-checked]):not(:checked):not([data-indeterminate]):not(:disabled):not([data-disabled]):not([data-error]) {\n border-color: var(--ds-border);\n}\n/* Checkbox.Card / Radio.Card marcados: borda primária */\n[data-mantine-color-scheme] .selectCard[data-with-border] {\n border-color: var(--ds-border-soft);\n background-color: var(--ds-surface);\n transition: border-color 0.15s, background-color 0.15s;\n}\n[data-mantine-color-scheme] .selectCard[data-with-border][data-checked] {\n border-color: var(--ds-primary);\n background-color: var(--ds-primary-soft);\n}\n\n/* Switch — no escuro o trilho desligado (dark-5) some na superfície: usa --ds-border (3:1) */\n[data-mantine-color-scheme='dark'] .switchTrack {\n --switch-bg: var(--ds-border);\n --switch-disabled-color: var(--ds-surface-2);\n}\n\n/* Chip — outline marcado ganha o fundo suave da cor (--chip-bg vem do resolver light, ver inputs.ts) */\n.chipLabel {\n font-weight: 500;\n}\n[data-variant='outline'] > .chipLabel[data-checked]:not([data-disabled]) {\n background-color: var(--chip-bg);\n}\n@media (hover: hover) {\n [data-variant='outline'] > .chipLabel[data-checked]:not([data-disabled]):hover {\n background-color: var(--chip-hover);\n }\n}\n\n/* Fieldset como card */\n[data-mantine-color-scheme] .fieldset[data-variant='default'] {\n border-color: var(--ds-border-soft);\n background-color: var(--ds-surface);\n}\n[data-mantine-color-scheme] .fieldset[data-variant='filled'] {\n border-color: var(--ds-border-soft);\n background-color: var(--ds-surface-2);\n}\n.fieldsetLegend {\n font-size: var(--type-subheadline-sm);\n font-weight: 600;\n color: var(--ds-text);\n padding-inline: 4px;\n}\n.fieldset[data-variant='unstyled'] .fieldsetLegend {\n padding-inline: 0;\n}\n\n/* PinInput */\n.pinInput {\n font-weight: 600;\n}\n\n/* Slider / RangeSlider — trilho soft, thumb branco com borda primária nos dois temas, balão Obsidian */\n[data-mantine-color-scheme] .sliderRoot {\n --slider-track-bg: var(--ds-border-soft);\n}\n[data-mantine-color-scheme] .sliderThumb {\n color: var(--slider-color);\n border-color: var(--slider-color);\n background-color: var(--mantine-color-white);\n box-shadow: var(--ds-shadow-sm);\n}\n.sliderThumb:focus-visible {\n outline: none;\n box-shadow: 0 0 0 3px var(--ds-primary-soft), var(--ds-shadow-sm);\n}\n[data-mantine-color-scheme] .sliderLabel {\n background-color: var(--mantine-color-obsidian-6);\n color: var(--mantine-color-white);\n font-weight: 600;\n padding: 2px 8px;\n}\n[data-mantine-color-scheme='dark'] .sliderLabel {\n background-color: var(--ds-surface-2);\n color: var(--ds-text);\n box-shadow: var(--ds-shadow-sm);\n}\n.sliderMarkLabel {\n color: var(--ds-text-3);\n}\n\n/* AngleSlider */\n[data-mantine-color-scheme] .angleRoot {\n background-color: var(--ds-surface-2);\n box-shadow: inset 0 0 0 1px var(--ds-border-soft);\n}\n.angleRoot:focus-within {\n outline: none;\n box-shadow: inset 0 0 0 1px var(--ds-primary), 0 0 0 3px var(--ds-primary-soft);\n}\n[data-mantine-color-scheme] .angleThumb::before {\n background-color: var(--ds-primary);\n}\n.angleLabel {\n font-weight: 600;\n color: var(--ds-text);\n}\n\n/* Rating — âmbar electric (claro 4 / escuro 3); vazias em border-soft */\n.rating {\n --jc-rating-color: var(--mantine-color-electric-4);\n}\n[data-mantine-color-scheme='dark'] .rating {\n --jc-rating-color: var(--mantine-color-electric-3);\n}\n[data-mantine-color-scheme] .ratingStar:not([data-filled]) {\n fill: var(--ds-border-soft);\n stroke: var(--ds-border-soft);\n}\n[data-mantine-color-scheme='dark'] .ratingStar:not([data-filled]) {\n fill: var(--ds-border);\n stroke: var(--ds-border);\n}\n\n/* ColorPicker / AlphaSlider / HueSlider */\n.colorSlider,\n.colorSliderOverlay {\n border-radius: var(--mantine-radius-xs);\n}\n.colorThumb {\n box-shadow: var(--ds-shadow-sm), 0 0 1px rgba(0, 0, 0, 0.6);\n}\n.colorSlider:focus:focus-visible .colorThumb,\n.colorSaturation:focus:focus-visible .colorThumb {\n outline-color: var(--ds-primary);\n}\n.colorSwatch {\n border-radius: var(--mantine-radius-xs);\n}\n.colorSwatch:focus-visible {\n outline: 2px solid var(--ds-primary);\n outline-offset: 2px;\n}\n","import { themed, type ThemeComponents } from './types';\nimport {\n AlphaSlider,\n AngleSlider,\n Checkbox,\n CheckboxCard,\n CheckboxIndicator,\n Chip,\n ColorPicker,\n Fieldset,\n HueSlider,\n Input,\n InputWrapper,\n NativeSelect,\n PinInput,\n Radio,\n RadioCard,\n RadioIndicator,\n RangeSlider,\n Rating,\n SegmentedControl,\n Slider,\n Switch,\n type MantineSize,\n} from '@mantine-vue/core';\nimport { control, isSize } from '../controls';\nimport classes from './inputs.module.css';\n\n/** Mantine 9 usa `size=\"sm\"` como padrão nos campos; o DS usa md (40px, alinhado ao Button md). */\nconst INPUT_COMPONENTS = [\n 'InputBase', 'TextInput', 'PasswordInput', 'NumberInput', 'Textarea', 'JsonInput',\n 'ColorInput', 'FileInput', 'MaskInput',\n];\nconst inputDefaults = Object.fromEntries(INPUT_COMPONENTS.map((name) => [name, { defaultProps: { size: 'md' } }]));\n\n/** Thumbs/trilhos dos sliders de cor (ColorPicker, AlphaSlider e HueSlider usam seletores estáticos próprios). */\nconst colorSliderClassNames = { slider: classes.colorSlider, sliderOverlay: classes.colorSliderOverlay, thumb: classes.colorThumb };\n\n/** Slider e RangeSlider compartilham o mesmo visual. */\nconst sliderClassNames = { root: classes.sliderRoot, thumb: classes.sliderThumb, label: classes.sliderLabel, markLabel: classes.sliderMarkLabel };\n\nexport const inputsComponents: ThemeComponents = {\n ...inputDefaults,\n Input: themed(Input, {\n defaultProps: { size: 'md' },\n classNames: { input: classes.input },\n vars: (_theme, props) => {\n const size = (props.size ?? 'md') as MantineSize;\n if (!isSize(size)) return { wrapper: {} };\n return { wrapper: { '--input-height': control[size].height, '--input-fz': control[size].inputFz } };\n },\n }),\n InputWrapper: themed(InputWrapper, {\n classNames: { label: classes.label, description: classes.description },\n }),\n /** Seta e opções do menu nativo legíveis no tema escuro. */\n NativeSelect: themed(NativeSelect, {\n defaultProps: { size: 'md' },\n classNames: { input: classes.nativeSelect, section: classes.nativeSelectSection },\n }),\n\n // Seleção ---------------------------------------------------------------\n /** Borda da caixa desmarcada com --ds-border (3:1, WCAG 1.4.11); o gray-4 do Mantine fica em ~2,5:1. */\n Checkbox: themed(Checkbox, { defaultProps: { radius: 'xs' }, classNames: { input: classes.checkInput } }),\n CheckboxIndicator: themed(CheckboxIndicator, { defaultProps: { radius: 'xs' }, classNames: { indicator: classes.checkInput } }),\n CheckboxCard: themed(CheckboxCard, { defaultProps: { radius: 'md' }, classNames: { card: classes.selectCard } }),\n Radio: themed(Radio, { classNames: { radio: classes.checkInput } }),\n RadioIndicator: themed(RadioIndicator, { classNames: { indicator: classes.checkInput } }),\n RadioCard: themed(RadioCard, { defaultProps: { radius: 'md' }, classNames: { card: classes.selectCard } }),\n Switch: themed(Switch, { defaultProps: { radius: 'xl' }, classNames: { track: classes.switchTrack } }),\n /**\n * Chip de filtro da marca: `outline` por padrão; marcado = fundo suave da cor (tag light)\n * + borda e texto da cor, em vez do contorno sem fundo do Mantine.\n */\n Chip: themed(Chip, {\n defaultProps: { variant: 'outline' },\n classNames: { label: classes.chipLabel },\n vars: (theme, props) => {\n if (props.variant !== 'outline') return { root: {} };\n const light = theme.variantColorResolver({ color: props.color || theme.primaryColor, theme, variant: 'light' });\n return { root: { '--chip-bg': light.hover, '--chip-hover': light.hover } };\n },\n }),\n SegmentedControl: themed(SegmentedControl, {\n defaultProps: { radius: 'sm' },\n classNames: { root: classes.segmentedRoot, indicator: classes.segmentedIndicator, label: classes.segmentedLabel },\n }),\n\n // Agrupamento e códigos ------------------------------------------------\n /** Fieldset como card: raio 12px, borda soft, fundo surface e legenda 14/600. */\n Fieldset: themed(Fieldset, {\n defaultProps: { radius: 'md' },\n classNames: { root: classes.fieldset, legend: classes.fieldsetLegend },\n }),\n /** Caixas quadradas com a altura dos campos (md = 40px), texto 600. */\n PinInput: themed(PinInput, {\n defaultProps: { size: 'md' },\n classNames: { input: classes.pinInput },\n vars: (_theme, props) => {\n const size = (props.size ?? 'md') as MantineSize;\n return { root: isSize(size) ? { '--pin-input-size': control[size].height } : {} };\n },\n }),\n\n // Sliders --------------------------------------------------------------\n Slider: themed(Slider, { classNames: sliderClassNames }),\n RangeSlider: themed(RangeSlider, { classNames: sliderClassNames }),\n AngleSlider: themed(AngleSlider, { classNames: { root: classes.angleRoot, thumb: classes.angleThumb, label: classes.angleLabel } }),\n\n /** Estrelas âmbar (electric.4 no claro, electric.3 no escuro) em vez do yellow do Mantine. */\n Rating: themed(Rating, {\n defaultProps: { color: 'electric.4' },\n classNames: { root: classes.rating, starSymbol: classes.ratingStar },\n vars: (_theme, props) => ({ root: props.color === 'electric.4' ? { '--rating-color': 'var(--jc-rating-color)' } : {} }),\n }),\n\n // Cor ------------------------------------------------------------------\n ColorPicker: themed(ColorPicker, {\n classNames: { ...colorSliderClassNames, saturation: classes.colorSaturation, swatch: classes.colorSwatch },\n }),\n AlphaSlider: themed(AlphaSlider, { classNames: colorSliderClassNames }),\n HueSlider: themed(HueSlider, { classNames: colorSliderClassNames }),\n};\n","/* @generated sincronizado de packages/ui/src/theme/components/layout.module.css — edite lá e rode `npm run sync -w @jcdecor/vue` */\n/* Layout — AppShell, Container, Grid, Splitter… */\n.appShellMain {\n background-color: var(--ds-bg);\n}\n.appShellNavbar,\n.appShellAside {\n background-color: var(--ds-surface);\n border-color: var(--ds-border-soft);\n}\n.appShellHeader,\n.appShellFooter {\n background-color: var(--ds-surface);\n border-color: var(--ds-border-soft);\n}\n\n/* Container: xl = --grid-max (1224px) */\n.container {\n --container-size-xl: var(--grid-max);\n}\n\n/* Splitter: a linha usava o fundo da página (--mantine-color-body), invisível sobre superfícies */\n.splitter {\n --splitter-handle-color: var(--ds-border-soft);\n}\n.splitterHandle {\n transition: background-color 120ms ease;\n}\n.splitterHandle:where([data-active], :focus-visible) {\n background-color: var(--ds-primary);\n}\n@media (hover: hover) {\n .splitterHandle:hover {\n background-color: var(--ds-border);\n }\n .splitterHandle:hover .splitterThumb {\n color: var(--ds-text-2);\n }\n}\n.splitterThumb {\n background-color: var(--ds-surface);\n border: 1px solid var(--ds-border-soft);\n box-shadow: var(--ds-shadow-sm);\n color: var(--ds-text-3);\n}\n.splitterHandle:where([data-active], :focus-visible) .splitterThumb {\n border-color: var(--ds-primary);\n color: var(--ds-primary);\n box-shadow: 0 0 0 2px var(--ds-primary-soft);\n}\n","import { themed, type ThemeComponents } from './types';\nimport { Container, Splitter } from '@mantine-vue/core';\nimport classes from './layout.module.css';\n\nexport const layoutComponents: ThemeComponents = {\n // As seções (AppShellMain, AppShellNavbar…) usam o getStyles do AppShell, mas o tipo do\n // `AppShell.extend` no Mantine Vue só declara `root` — entrada simples em vez de `.extend`.\n AppShell: {\n classNames: {\n main: classes.appShellMain,\n navbar: classes.appShellNavbar,\n aside: classes.appShellAside,\n header: classes.appShellHeader,\n footer: classes.appShellFooter,\n },\n },\n // size=\"xl\" = largura máxima do grid da marca (1224px) em vez dos 1320px do Mantine\n Container: themed(Container, { classNames: { root: classes.container } }),\n // Divisória na cor de divisores da marca; alça com superfície/borda dos tokens (adapta ao escuro)\n Splitter: themed(Splitter, {\n classNames: { root: classes.splitter, handle: classes.splitterHandle, thumb: classes.splitterThumb },\n }),\n};\n","/* @generated sincronizado de packages/ui/src/theme/components/misc.module.css — edite lá e rode `npm run sync -w @jcdecor/vue` */\n/* Miscellaneous — Paper, Divider, ScrollArea, Marquee… */\n.paper {\n --paper-border-color: var(--ds-border-soft);\n background-color: var(--ds-surface);\n color: var(--ds-text);\n}\n.divider {\n --divider-color: var(--ds-border-soft);\n}\n\n/* ScrollArea */\n.scrollbar:hover,\n.scrollbar:active {\n background-color: transparent;\n}\n.scrollThumb,\n.scrollbar:hover > .scrollThumb {\n background-color: var(--ds-border);\n}\n.scrollbar:active > .scrollThumb {\n background-color: var(--ds-text-3);\n}\n","import { themed, type ThemeComponents } from './types';\nimport { Divider, Paper, ScrollArea } from '@mantine-vue/core';\nimport classes from './misc.module.css';\n\nexport const miscComponents: ThemeComponents = {\n Paper: themed(Paper, { defaultProps: { radius: 'md' }, classNames: { root: classes.paper } }),\n Divider: themed(Divider, { classNames: { root: classes.divider } }),\n // Trilho sem fundo no hover (o dark-8 do Mantine destoava das superfícies) e polegar nos tons de borda/texto da marca\n ScrollArea: themed(ScrollArea, { classNames: { scrollbar: classes.scrollbar, thumb: classes.scrollThumb } }),\n};\n","/* @generated sincronizado de packages/ui/src/theme/components/navigation.module.css — edite lá e rode `npm run sync -w @jcdecor/vue` */\n/* Navigation — Anchor, Breadcrumbs, Burger, NavLink, Pagination, Stepper, TableOfContents, Tabs, Tree */\n\n/* ---------- Tabs ---------- */\n.tabs {\n --tab-border-color: var(--ds-border-soft);\n --tab-hover-color: var(--ds-surface-2);\n}\n.tab {\n font-weight: 500;\n color: var(--ds-text-2);\n}\n/* Texto primário só nas variantes sem preenchimento: em `pills` a aba ativa já tem fundo Horizon. */\n.tabs:not([data-variant='pills']) .tab[data-active] {\n color: var(--ds-primary);\n}\n.tabs[data-variant='pills'] .tab[data-active] {\n color: var(--tab-color);\n}\n:root[data-mantine-color-scheme='dark'] .tabs[data-variant='pills'] .tab[data-active] {\n color: var(--mantine-color-dark-8);\n}\n\n/* ---------- Anchor ---------- */\n.anchor {\n color: var(--ds-link);\n font-weight: 500;\n}\n\n/* ---------- Burger ---------- */\n.burger {\n --burger-color: var(--ds-text);\n}\n\n/* ---------- NavLink ---------- */\n.navLink {\n border-radius: var(--ds-radius-sm);\n font-weight: 500;\n}\n.navLink[data-active] {\n font-weight: 600;\n}\n:root[data-mantine-color-scheme='dark'] .navLink[data-variant='filled'][data-active] {\n color: var(--mantine-color-dark-8);\n}\n@media (hover: hover) {\n .navLink:hover:not([data-active]) {\n background-color: var(--ds-surface-2);\n }\n}\n\n/* ---------- Pagination ---------- */\n.paginationControl:not([data-active]) {\n border-color: var(--ds-border-soft);\n background-color: var(--ds-surface);\n color: var(--ds-text);\n}\n@media (hover: hover) {\n .paginationControl:not([data-active]):hover:not(:disabled, [data-disabled]) {\n background-color: var(--ds-surface-2);\n }\n}\n.paginationControl[data-active] {\n font-weight: 600;\n}\n/* No escuro o preenchimento é o tom 400 (claro): texto escuro para manter contraste ≥ 4,5:1. */\n:root[data-mantine-color-scheme='dark'] .paginationControl[data-active] {\n color: var(--mantine-color-dark-8);\n}\n\n/* ---------- Stepper ---------- */\n.stepper {\n --stepper-outline-color: var(--ds-border-soft);\n}\n.stepIcon:not([data-completed]) {\n color: var(--ds-text-2);\n}\n:root[data-mantine-color-scheme='dark'] .stepIcon,\n:root[data-mantine-color-scheme='dark'] .stepCompletedIcon {\n --stepper-icon-color: var(--mantine-color-dark-8);\n}\n.stepLabel {\n font-weight: 600;\n color: var(--ds-text);\n}\n.stepDescription {\n color: var(--ds-text-3);\n}\n\n/* ---------- TableOfContents ---------- */\n.tocControl:not([data-active]) {\n color: var(--ds-text-2);\n}\n@media (hover: hover) {\n .tocControl:not([data-active]):not([data-variant='none']):hover {\n background-color: var(--ds-surface-2);\n color: var(--ds-text);\n }\n}\n.tocControl[data-active] {\n font-weight: 500;\n}\n\n/* ---------- Tree ---------- */\n.tree {\n --tree-line-color: var(--ds-border-soft);\n}\n.treeLabel {\n border-radius: var(--ds-radius-sm);\n transition: background-color 120ms ease;\n}\n@media (hover: hover) {\n .treeLabel:hover:not([data-selected]) {\n background-color: var(--ds-surface-2);\n }\n}\n.treeLabel[data-selected] {\n background-color: var(--ds-primary-soft);\n color: var(--ds-primary);\n font-weight: 500;\n}\n","import { themed, type ThemeComponents } from './types';\nimport { Anchor, Burger, NavLink, Pagination, Stepper, TableOfContents, Tabs, Tree } from '@mantine-vue/core';\nimport classes from './navigation.module.css';\n\nexport const navigationComponents: ThemeComponents = {\n Tabs: themed(Tabs, { classNames: { root: classes.tabs, tab: classes.tab } }),\n Anchor: themed(Anchor, { classNames: { root: classes.anchor } }),\n Burger: themed(Burger, { classNames: { root: classes.burger } }),\n // variant explícito: o resolver de cores aplica as cores de tag (--ds-tag-primary-*) ao item ativo\n NavLink: themed(NavLink, { defaultProps: { variant: 'light' }, classNames: { root: classes.navLink } }),\n Pagination: themed(Pagination, { defaultProps: { radius: 'sm' }, classNames: { control: classes.paginationControl } }),\n Stepper: themed(Stepper, {\n classNames: {\n root: classes.stepper,\n stepIcon: classes.stepIcon,\n stepCompletedIcon: classes.stepCompletedIcon,\n stepLabel: classes.stepLabel,\n stepDescription: classes.stepDescription,\n },\n }),\n TableOfContents: themed(TableOfContents, { classNames: { control: classes.tocControl } }),\n Tree: themed(Tree, { classNames: { root: classes.tree, label: classes.treeLabel } }),\n};\n","/* @generated sincronizado de packages/ui/src/theme/components/overlays.module.css — edite lá e rode `npm run sync -w @jcdecor/vue` */\n/* Overlays — Modal, Drawer, Menu, Popover, HoverCard, Tooltip, Dialog, Menubar, ActionBar, FloatingWindow */\n\n/* Superfície flutuante compartilhada (Popover, Menu, HoverCard, Menubar).\n A cor da borda vai na variável para que a seta (`withArrow`) acompanhe. */\n.dropdown {\n --popover-border-color: var(--ds-border-soft);\n background-color: var(--ds-surface);\n border-color: var(--ds-border-soft);\n box-shadow: var(--ds-shadow-md);\n}\n/* Itens de menu: hover em surface-2; no escuro o vermelho de perigo sobe para o tom 400 (contraste AA sobre a superfície). */\n.menuItem {\n --menu-item-hover: var(--ds-surface-2);\n}\n:where([data-mantine-color-scheme='dark']) .menuItem {\n --mantine-color-danger-6: var(--dc-danger-400);\n}\n.menuLabel {\n color: var(--ds-text-3);\n font-size: var(--type-disclaimer);\n font-weight: 600;\n}\n.menuDivider {\n border-color: var(--ds-border-soft);\n}\n\n/* Menubar: alvos com hover/aberto em surface-2 e texto da marca. */\n.menubarRoot {\n gap: 2px;\n}\n.menubarTarget {\n color: var(--ds-text);\n font-weight: 500;\n border-radius: var(--ds-radius-sm);\n}\n.menubarTarget:where(:hover, :focus-visible, [data-expanded]):where(:not(:disabled, [data-disabled])) {\n background-color: var(--ds-surface-2);\n}\n.menubarTarget:where([data-expanded]) {\n color: var(--ds-primary);\n}\n\n/* Superfícies \"janela\" (Dialog, ActionBar, FloatingWindow). */\n.floatingSurface {\n background-color: var(--ds-surface);\n border-color: var(--ds-border-soft);\n box-shadow: var(--ds-shadow-lg);\n}\n.actionBarDivider {\n background-color: var(--ds-border-soft);\n}\n\n.modalContent {\n background-color: var(--ds-surface);\n}\n.modalHeader {\n background-color: var(--ds-surface);\n}\n.modalTitle {\n font-size: var(--type-headline-sm);\n font-weight: 600;\n}\n\n/* Tooltip: Obsidian/branco no claro, Obsidian 50/Obsidian no escuro. Usa fallback das variáveis para que `color` continue funcionando. */\n.tooltip {\n background-color: var(--tooltip-bg, var(--dc-obsidian));\n color: var(--tooltip-color, var(--dc-white));\n font-size: var(--type-disclaimer);\n font-weight: 500;\n}\n:where([data-mantine-color-scheme='dark']) .tooltip {\n background-color: var(--tooltip-bg, var(--dc-obsidian-50));\n color: var(--tooltip-color, var(--dc-obsidian));\n}\n\n/* No escuro a superfície flutuante tem o mesmo tom dos cards: a borda sobe um degrau para separar as camadas. */\n:where([data-mantine-color-scheme='dark']) .dropdown,\n:where([data-mantine-color-scheme='dark']) .floatingSurface {\n --popover-border-color: color-mix(in srgb, var(--ds-border) 55%, var(--ds-border-soft));\n border-color: color-mix(in srgb, var(--ds-border) 55%, var(--ds-border-soft));\n}\n\n","import { themed, type ThemeComponents } from './types';\nimport {\n ActionBar,\n Dialog,\n Drawer,\n FloatingWindow,\n HoverCard,\n LoadingOverlay,\n Menu,\n Menubar,\n Modal,\n Overlay,\n Popover,\n Tooltip,\n} from '@mantine-vue/core';\nimport { overlayProps } from '../controls';\nimport { brand } from '../tokens';\nimport classes from './overlays.module.css';\n\nconst menuClassNames = { dropdown: classes.dropdown, item: classes.menuItem, label: classes.menuLabel, divider: classes.menuDivider };\n\nexport const overlaysComponents: ThemeComponents = {\n Menu: themed(Menu, { defaultProps: { shadow: 'md', radius: 'sm' }, classNames: menuClassNames }),\n Menubar: themed(Menubar, { classNames: { root: classes.menubarRoot, target: classes.menubarTarget } }),\n Popover: themed(Popover, { defaultProps: { shadow: 'md', radius: 'sm' }, classNames: { dropdown: classes.dropdown } }),\n HoverCard: themed(HoverCard, { defaultProps: { shadow: 'md', radius: 'md' }, classNames: { dropdown: classes.dropdown } }),\n Tooltip: themed(Tooltip, { defaultProps: { radius: 'sm', withArrow: true }, classNames: { tooltip: classes.tooltip } }),\n Modal: themed(Modal, {\n defaultProps: { radius: 'md', centered: true, shadow: 'lg', overlayProps },\n classNames: { content: classes.modalContent, header: classes.modalHeader, title: classes.modalTitle },\n }),\n Drawer: themed(Drawer, {\n defaultProps: { shadow: 'lg', overlayProps },\n classNames: { content: classes.modalContent, header: classes.modalHeader, title: classes.modalTitle },\n }),\n Dialog: themed(Dialog, { defaultProps: { radius: 'md', shadow: 'lg' }, classNames: { root: classes.floatingSurface } }),\n ActionBar: themed(ActionBar, {\n defaultProps: { radius: 'md', shadow: 'lg' },\n classNames: { root: classes.floatingSurface, divider: classes.actionBarDivider },\n }),\n FloatingWindow: themed(FloatingWindow, { defaultProps: { radius: 'md', shadow: 'lg', withBorder: true }, classNames: { root: classes.floatingSurface } }),\n /** Overlay solto (sobre imagens/cards) usa o navy da marca em vez do preto. */\n Overlay: themed(Overlay, { defaultProps: { color: brand.obsidian } }),\n LoadingOverlay: themed(LoadingOverlay, { defaultProps: { overlayProps: { backgroundOpacity: 0.75, blur: 1 } } }),\n};\n","/* @generated sincronizado de packages/ui/src/theme/components/typography.module.css — edite lá e rode `npm run sync -w @jcdecor/vue` */\n/* Typography — Table, Title, Text, Code, Blockquote, List, Mark, Highlight, Typography */\n.table {\n --table-border-color: var(--ds-border-soft);\n --table-highlight-on-hover-color: var(--ds-surface-2);\n --table-striped-color: var(--ds-surface-2);\n font-size: var(--type-subheadline-sm);\n}\n.th {\n text-align: left;\n font-weight: 600;\n color: var(--ds-text-3);\n font-size: var(--type-disclaimer);\n letter-spacing: 0.05em;\n text-transform: uppercase;\n}\n.thead .tr {\n border-bottom: 2px solid var(--ds-border);\n}\n.title {\n color: var(--ds-text);\n}\n\n/* Code: superfície 2, borda suave, mono levemente menor que o texto ao redor */\n.code {\n background-color: var(--code-bg, var(--ds-surface-2));\n color: var(--ds-text);\n border: 1px solid var(--ds-border-soft);\n border-radius: 6px;\n font-size: 0.875em;\n padding: 1px 6px;\n}\n.code[data-block] {\n border-radius: var(--ds-radius-sm);\n padding: var(--mantine-spacing-md);\n font-size: var(--type-subheadline-sm);\n line-height: 1.6;\n}\n\n/* Blockquote: borda primária e fundo primary-soft (cores da marca nos dois temas) */\n.blockquote {\n color: var(--ds-text);\n font-size: var(--type-subheadline-lg);\n line-height: 1.55;\n padding: var(--mantine-spacing-lg) var(--mantine-spacing-xl);\n}\n.blockquoteIcon {\n background-color: var(--ds-surface);\n}\n.blockquoteCite {\n color: var(--ds-text-3);\n opacity: 1;\n font-size: var(--type-subheadline-sm);\n font-style: normal;\n font-weight: 500;\n}\n\n/* Mark / Highlight */\n.mark {\n color: var(--ds-text);\n border-radius: 3px;\n padding-inline: 0.1em;\n}\n\n/* List: marcadores na cor primária */\n.list {\n color: var(--ds-text);\n}\n.listItem::marker {\n color: var(--ds-primary);\n font-weight: 600;\n}\n.listItemIcon {\n color: var(--ds-primary);\n}\n\n/* Typography: rich text (posts, políticas) com os tokens da marca */\n.typography {\n color: var(--ds-text-2);\n line-height: 1.6;\n}\n.typography :where(h1, h2, h3, h4, h5, h6) {\n color: var(--ds-text);\n font-weight: 600;\n}\n.typography :where(a) {\n color: var(--ds-link);\n font-weight: 500;\n text-decoration: underline;\n text-decoration-color: color-mix(in srgb, currentColor 35%, transparent);\n text-underline-offset: 3px;\n}\n.typography :where(a):hover {\n text-decoration-color: currentColor;\n}\n.typography :where(strong, b) {\n color: var(--ds-text);\n font-weight: 600;\n}\n.typography :where(ul, ol) :where(li)::marker {\n color: var(--ds-primary);\n font-weight: 600;\n}\n.typography :where(li) + :where(li) {\n margin-top: var(--mantine-spacing-xs);\n}\n.typography :where(code) {\n background-color: var(--ds-surface-2);\n color: var(--ds-text);\n border: 1px solid var(--ds-border-soft);\n border-radius: 6px;\n font-size: 0.875em;\n}\n.typography :where(pre) {\n background-color: var(--ds-surface-2);\n border: 1px solid var(--ds-border-soft);\n border-radius: var(--ds-radius-sm);\n padding: var(--mantine-spacing-md);\n}\n.typography :where(pre) :where(code) {\n border: 0;\n font-size: var(--type-subheadline-sm);\n}\n.typography :where(kbd) {\n color: var(--ds-text-2);\n background-color: var(--ds-surface-2);\n border-color: var(--ds-border-soft);\n border-bottom-color: var(--ds-border);\n}\n.typography :where(mark) {\n background-color: var(--dc-electric-200);\n color: var(--ds-text);\n}\n.typography :where(blockquote) {\n background-color: var(--ds-primary-soft);\n border-inline-start: 3px solid var(--ds-primary);\n border-start-start-radius: 0;\n border-end-start-radius: 0;\n color: var(--ds-text);\n}\n.typography :where(hr) {\n border-color: var(--ds-border-soft);\n}\n.typography :where(table) {\n --table-border-color: var(--ds-border-soft);\n}\n.typography :where(table) :where(th) {\n color: var(--ds-text-3);\n font-size: var(--type-disclaimer);\n font-weight: 600;\n letter-spacing: 0.05em;\n text-transform: uppercase;\n}\n.typography :where(table) :where(thead th) {\n border-bottom: 2px solid var(--ds-border);\n}\n.typography :where(table) :where(td) {\n color: var(--ds-text);\n}\n.typography :where(details) {\n --details-border-color: var(--ds-border-soft);\n --details-summary-hover: var(--ds-surface-2);\n}\n.typography :where(details) :where(summary) {\n color: var(--ds-text);\n}\n.typography :where(img) {\n border-radius: var(--ds-radius);\n}\n:where([data-mantine-color-scheme='dark']) .typography :where(mark) {\n background-color: color-mix(in srgb, var(--dc-electric-300) 32%, transparent);\n}\n","import { themed, type ThemeComponents } from './types';\nimport {\n Blockquote,\n Code,\n List,\n Mark,\n Table,\n Title,\n Typography,\n getThemeColor,\n} from '@mantine-vue/core';\nimport classes from './typography.module.css';\n\n/** Cores de destaque amarelas (fill Electric com texto da marca). */\nconst YELLOWS = [undefined, 'yellow', 'electric'];\n\nexport const typographyComponents: ThemeComponents = {\n Blockquote: themed(Blockquote, {\n defaultProps: { iconSize: 40, radius: 'sm' },\n classNames: { root: classes.blockquote, icon: classes.blockquoteIcon, cite: classes.blockquoteCite },\n vars: (_theme, props) =>\n !props.color || props.color === 'horizon' || props.color === 'blue'\n ? { root: { '--bq-bd': 'var(--ds-primary)', '--bq-bg-light': 'var(--ds-primary-soft)', '--bq-bg-dark': 'var(--ds-primary-soft)' } }\n : { root: {} },\n }),\n Code: themed(Code, { classNames: { root: classes.code } }),\n List: themed(List, { defaultProps: { spacing: 'xs' }, classNames: { root: classes.list, item: classes.listItem, itemIcon: classes.listItemIcon } }),\n /** Mark e Highlight: amarelo só como fundo (Electric 200), texto sempre --ds-text */\n Mark: themed(Mark, {\n classNames: { root: classes.mark },\n vars: (theme, props) => {\n const yellow = YELLOWS.includes(props.color);\n const color = yellow ? 'electric' : props.color!;\n return {\n root: {\n '--mark-bg-light': getThemeColor(`${color}.${yellow ? 2 : 1}`, theme),\n '--mark-bg-dark': `color-mix(in srgb, ${getThemeColor(`${color}.${yellow ? 3 : 4}`, theme)} 32%, transparent)`,\n },\n };\n },\n }),\n Table: themed(Table, {\n defaultProps: { highlightOnHover: true, verticalSpacing: 'sm', horizontalSpacing: 'sm' },\n classNames: { table: classes.table, th: classes.th, thead: classes.thead, tr: classes.tr },\n }),\n Title: themed(Title, { classNames: { root: classes.title } }),\n Typography: themed(Typography, { classNames: { root: classes.typography } }),\n};\n","import type { ThemeComponents } from './types';\nimport { buttonsComponents } from './buttons';\nimport { comboboxComponents } from './combobox';\nimport { dataDisplayComponents } from './dataDisplay';\nimport { feedbackComponents } from './feedback';\nimport { inputsComponents } from './inputs';\nimport { layoutComponents } from './layout';\nimport { miscComponents } from './misc';\nimport { navigationComponents } from './navigation';\nimport { overlaysComponents } from './overlays';\nimport { typographyComponents } from './typography';\n\n/** Overrides de componentes Mantine, um arquivo por categoria (mesmas categorias de mantine.dev). */\nexport const jcComponents: ThemeComponents = {\n ...layoutComponents,\n ...inputsComponents,\n ...comboboxComponents,\n ...buttonsComponents,\n ...navigationComponents,\n ...feedbackComponents,\n ...overlaysComponents,\n ...dataDisplayComponents,\n ...typographyComponents,\n ...miscComponents,\n};\n","import type { MantineThemeOverride } from '@mantine-vue/core';\nimport { jcColors } from './colors';\nimport { chartPalette, fontFamily, grid, spacing, typography } from './tokens';\nimport { jcVariantColorResolver } from './variantColorResolver';\nimport { jcComponents } from './components';\n\nconst t = typography;\n\n/** Tema JC Decor (o Mantine Vue não tem `createTheme`: o tema é um objeto `MantineThemeOverride`). */\nexport const jcTheme: MantineThemeOverride = {\n colors: jcColors,\n primaryColor: 'horizon',\n primaryShade: { light: 6, dark: 4 },\n autoContrast: true,\n // Acima disso o texto vira escuro: horizon.4 no escuro e electric recebem texto escuro (≥ 6:1)\n luminanceThreshold: 0.3,\n white: '#FFFFFF',\n black: '#1F2228',\n variantColorResolver: jcVariantColorResolver,\n\n fontFamily,\n fontFamilyMonospace: \"ui-monospace, 'JetBrains Mono', SFMono-Regular, Menlo, monospace\",\n headings: {\n fontFamily,\n fontWeight: '600',\n textWrap: 'balance',\n sizes: {\n h1: { fontSize: t.displaySm.size, fontWeight: '700', lineHeight: String(t.displaySm.lineHeight) },\n h2: { fontSize: t.headlineLg.size, fontWeight: '600', lineHeight: String(t.headlineLg.lineHeight) },\n h3: { fontSize: t.headlineMd.size, fontWeight: '600', lineHeight: String(t.headlineMd.lineHeight) },\n h4: { fontSize: t.headlineSm.size, fontWeight: '600', lineHeight: String(t.headlineSm.lineHeight) },\n h5: { fontSize: '18px', fontWeight: '600', lineHeight: '1.45' },\n h6: { fontSize: '16px', fontWeight: '600', lineHeight: '1.5' },\n },\n },\n fontSizes: {\n xs: t.disclaimer.size,\n sm: t.subheadlineSm.size,\n md: t.subheadlineRg.size,\n lg: t.subheadlineLg.size,\n xl: t.headlineSm.size,\n },\n lineHeights: { xs: '1.33', sm: '1.43', md: '1.5', lg: '1.55', xl: '1.4' },\n spacing: { xs: spacing[4], sm: spacing[8], md: spacing[16], lg: spacing[24], xl: spacing[32] },\n radius: { xs: '4px', sm: '8px', md: '12px', lg: '16px', xl: '99px' },\n defaultRadius: 'sm',\n shadows: {\n xs: '0 1px 2px rgba(31,34,40,.06)',\n sm: 'var(--ds-shadow-sm)',\n md: 'var(--ds-shadow-md)',\n lg: 'var(--ds-shadow-lg)',\n xl: '0 24px 56px rgba(31,34,40,.18)',\n },\n breakpoints: { xs: '36em', sm: '48em', md: '64em', lg: '85.375em', xl: '96em' },\n focusRing: 'auto',\n cursorType: 'pointer',\n defaultGradient: { from: 'horizon.6', to: 'horizon.4', deg: 135 },\n\n other: { spacing, grid, typography, chartPalette },\n\n components: jcComponents,\n};\n","import type { CSSVariablesResolver } from '@mantine-vue/core';\nimport { brand, chartColors, feedback, ramps, semantic, spacing, typography } from './tokens';\n\nconst kebab = (s: string) => s.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase();\n\nfunction schemeVars(s: (typeof semantic)['light'] | (typeof semantic)['dark']) {\n return {\n '--ds-bg': s.bg,\n '--ds-surface': s.surface,\n '--ds-surface-2': s.surface2,\n '--ds-text': s.text,\n '--ds-text-2': s.text2,\n '--ds-text-3': s.text3,\n '--ds-border': s.border,\n '--ds-border-soft': s.borderSoft,\n '--ds-primary': s.primary,\n '--ds-primary-hover': s.primaryHover,\n '--ds-primary-soft': s.primarySoft,\n '--ds-accent': s.accent,\n '--ds-link': s.link,\n '--ds-success-bg': s.successBg,\n '--ds-warn-bg': s.warnBg,\n '--ds-error-bg': s.errorBg,\n '--ds-shadow-sm': s.shadowSm,\n '--ds-shadow-md': s.shadowMd,\n '--ds-shadow-lg': s.shadowLg,\n\n // Variáveis semânticas do Mantine apontando para os tokens da marca\n '--mantine-color-body': s.bg,\n '--mantine-color-text': s.text,\n '--mantine-color-dimmed': s.text3,\n '--mantine-color-default': s.surface,\n '--mantine-color-default-hover': s.surface2,\n '--mantine-color-default-border': s.border,\n '--mantine-color-anchor': s.link,\n '--mantine-color-error': feedback.error,\n '--mantine-color-success': feedback.success,\n };\n}\n\n/** Variáveis independentes de tema: paleta crua, tipografia e spacing (`--dc-*`, `--type-*`, `--sp-*`). */\nfunction staticVars() {\n const vars: Record<string, string> = {\n '--font-body': \"'Poppins', system-ui, -apple-system, 'Segoe UI', sans-serif\",\n '--ds-radius': '12px',\n '--ds-radius-sm': '8px',\n '--ds-radius-lg': '16px',\n '--grid-gap': '24px',\n '--grid-margin': '64px',\n '--grid-max': '1224px',\n };\n (Object.keys(brand) as (keyof typeof brand)[]).forEach((name) => {\n vars[`--dc-${name}`] = brand[name];\n });\n (Object.keys(ramps) as (keyof typeof ramps)[]).forEach((name) => {\n Object.entries(ramps[name]).forEach(([step, hex]) => {\n vars[`--dc-${name}-${step}`] = hex;\n });\n });\n Object.entries(typography).forEach(([name, t]) => {\n vars[`--type-${kebab(name)}`] = t.size;\n });\n Object.entries(spacing).forEach(([step, value]) => {\n vars[`--sp-${step}`] = value;\n });\n return vars;\n}\n\n/** Selos/tags (variante `light`): fundo 50 + texto 700 da mesma cor (≥ 6:1). */\nconst tagVars = {\n light: {\n '--ds-tag-primary-bg': ramps.horizon[50],\n '--ds-tag-primary-hover': ramps.horizon[100],\n '--ds-tag-primary-color': ramps.horizon[700],\n '--ds-tag-success-bg': ramps.evergreen[50],\n '--ds-tag-success-hover': ramps.evergreen[100],\n '--ds-tag-success-color': ramps.evergreen[700],\n '--ds-tag-warn-bg': ramps.electric[50],\n '--ds-tag-warn-hover': ramps.electric[100],\n '--ds-tag-warn-color': ramps.electric[700],\n '--ds-tag-error-bg': ramps.danger[50],\n '--ds-tag-error-hover': ramps.danger[100],\n '--ds-tag-error-color': ramps.danger[700],\n '--ds-tag-neutral-bg': ramps.gray[100],\n '--ds-tag-neutral-hover': ramps.gray[200],\n '--ds-tag-neutral-color': ramps.gray[700],\n },\n dark: {\n '--ds-tag-primary-bg': 'rgba(110,159,255,.14)',\n '--ds-tag-primary-hover': 'rgba(110,159,255,.22)',\n '--ds-tag-primary-color': ramps.horizon[300],\n '--ds-tag-success-bg': 'rgba(97,184,117,.14)',\n '--ds-tag-success-hover': 'rgba(97,184,117,.22)',\n '--ds-tag-success-color': ramps.evergreen[300],\n '--ds-tag-warn-bg': 'rgba(247,215,89,.12)',\n '--ds-tag-warn-hover': 'rgba(247,215,89,.2)',\n '--ds-tag-warn-color': ramps.electric[200],\n '--ds-tag-error-bg': 'rgba(255,108,90,.14)',\n '--ds-tag-error-hover': 'rgba(255,108,90,.22)',\n '--ds-tag-error-color': ramps.danger[300],\n '--ds-tag-neutral-bg': semantic.dark.surface2,\n '--ds-tag-neutral-hover': semantic.dark.border,\n '--ds-tag-neutral-color': semantic.dark.text2,\n },\n};\n\n/**\n * O Mantine deriva `--mantine-color-<cor>-light*` (usadas por subtle, transparent, light, Alert, ThemeIcon…)\n * da rampa crua — no escuro isso gera texto quase branco e hovers estranhos. Apontamos para os tokens de tag.\n */\nconst LIGHT_TONES: Record<string, string> = {\n horizon: 'primary', blue: 'primary',\n evergreen: 'success', green: 'success', teal: 'success',\n electric: 'warn', yellow: 'warn',\n danger: 'error', red: 'error',\n obsidian: 'neutral', indigo: 'neutral', gray: 'neutral', dark: 'neutral',\n};\nconst lightColorVars = Object.fromEntries(\n Object.entries(LIGHT_TONES).flatMap(([color, tone]) => [\n [`--mantine-color-${color}-light`, `var(--ds-tag-${tone}-bg)`],\n [`--mantine-color-${color}-light-hover`, `var(--ds-tag-${tone}-hover)`],\n [`--mantine-color-${color}-light-color`, `var(--ds-tag-${tone}-color)`],\n ]),\n);\n\nconst chartVars = (colors: readonly string[]) =>\n Object.fromEntries(colors.map((color, i) => [`--jc-chart-${i + 1}`, color]));\n\nexport const jcCssVariablesResolver: CSSVariablesResolver = () => ({\n variables: staticVars(),\n light: {\n ...schemeVars(semantic.light),\n ...tagVars.light,\n ...chartVars(chartColors.light),\n ...lightColorVars,\n '--ds-success': feedback.success,\n '--ds-warn': feedback.warn,\n '--ds-error': feedback.error,\n '--jc-on-filled': '#FFFFFF',\n '--mantine-primary-color-contrast': '#FFFFFF',\n // Marca: logo original (azul do logotipo) e ilustrações (navy-púrpura dos arquivos fonte)\n '--jc-logo-shield': '#0E36E3',\n '--jc-logo-letters': '#0E36E3',\n '--jc-logo-wordmark': '#0E36E3',\n '--jc-art-primary': '#2A2758',\n '--jc-art-ink': '#0C0C0C',\n '--jc-art-paper': '#FFFFFF',\n },\n dark: {\n ...schemeVars(semantic.dark),\n ...tagVars.dark,\n ...chartVars(chartColors.dark),\n ...lightColorVars,\n '--ds-success': ramps.evergreen[400],\n '--ds-warn': ramps.electric[300],\n '--ds-error': ramps.danger[400],\n // fills no escuro usam o tom 400 (claro): texto navy\n '--jc-on-filled': brand.obsidian,\n '--mantine-primary-color-contrast': brand.obsidian,\n // Marca no escuro: logo branco; ilustrações invertidas (traço claro, face em superfície)\n '--jc-logo-shield': '#FFFFFF',\n '--jc-logo-letters': '#FFFFFF',\n '--jc-logo-wordmark': '#FFFFFF',\n '--jc-art-primary': ramps.horizon[300],\n '--jc-art-ink': semantic.dark.text,\n '--jc-art-paper': semantic.dark.surface2,\n '--mantine-color-error': ramps.danger[400],\n '--mantine-color-success': ramps.evergreen[400],\n },\n});\n","import { computed, defineComponent, h, watch, type PropType } from 'vue';\nimport {\n MantineProvider,\n useMantineColorScheme,\n type CSSVariablesResolver,\n type MantineColorScheme,\n type MantineThemeOverride,\n} from '@mantine-vue/core';\nimport { deepMerge } from '@mantine-vue/utils';\nimport { jcCssVariablesResolver } from '../theme/cssVariablesResolver';\nimport { jcTheme } from '../theme/theme';\n\n/** Mesma chave do `localStorageColorSchemeManager` do Mantine React: o tema escolhido vale nas duas libs. */\nexport const COLOR_SCHEME_STORAGE_KEY = 'mantine-color-scheme-value';\n\nconst isScheme = (value: unknown): value is MantineColorScheme => value === 'light' || value === 'dark' || value === 'auto';\n\nfunction readStoredScheme(key: string): MantineColorScheme | undefined {\n try {\n const value = typeof window !== 'undefined' ? window.localStorage.getItem(key) : null;\n return isScheme(value) ? value : undefined;\n } catch {\n return undefined;\n }\n}\n\n/** Grava o esquema de cores atual (precisa estar dentro do MantineProvider para ler o contexto). */\nconst ColorSchemePersistence = defineComponent({\n name: 'JcColorSchemePersistence',\n props: { storageKey: { type: String, required: true } },\n setup(props) {\n const { colorScheme } = useMantineColorScheme();\n watch(colorScheme, (value) => {\n try {\n window.localStorage.setItem(props.storageKey, value);\n } catch {\n // localStorage indisponível (modo privado, SSR): o tema só não é lembrado\n }\n });\n return () => null;\n },\n});\n\nexport interface JcProviderProps {\n /** Overrides adicionais, mesclados sobre o tema JC Decor */\n theme?: MantineThemeOverride;\n /** @default 'light' */\n defaultColorScheme?: MantineColorScheme;\n forceColorScheme?: 'light' | 'dark';\n cssVariablesResolver?: CSSVariablesResolver;\n /** Chave do localStorage onde o tema claro/escuro é lembrado; `false` desliga @default 'mantine-color-scheme-value' */\n colorSchemeStorageKey?: string | false;\n}\n\n/**\n * Provider do Design System JC Decor: MantineProvider + tema + variáveis `--ds-*`\n * + tema claro/escuro lembrado no localStorage. Demais props vão para o `MantineProvider`.\n *\n * ```vue\n * <script setup>\n * import '@mantine-vue/core/styles.css';\n * import '@jcdecor/vue/styles.css';\n * import { JcProvider } from '@jcdecor/vue';\n * </script>\n * <template><JcProvider><App /></JcProvider></template>\n * ```\n */\nexport const JcProvider = defineComponent({\n name: 'JcProvider',\n inheritAttrs: false,\n props: {\n theme: { type: Object as PropType<MantineThemeOverride>, default: undefined },\n defaultColorScheme: { type: String as PropType<MantineColorScheme>, default: 'light' },\n forceColorScheme: { type: String as PropType<'light' | 'dark'>, default: undefined },\n cssVariablesResolver: { type: Function as PropType<CSSVariablesResolver>, default: undefined },\n colorSchemeStorageKey: { type: [String, Boolean] as PropType<string | false>, default: COLOR_SCHEME_STORAGE_KEY },\n },\n setup(props, { attrs, slots }) {\n const theme = computed(() => (props.theme ? deepMerge(jcTheme, props.theme) : jcTheme));\n // Lido uma vez: o MantineProvider só usa o esquema inicial na montagem.\n const stored = props.colorSchemeStorageKey ? readStoredScheme(props.colorSchemeStorageKey) : undefined;\n\n return () =>\n h(\n MantineProvider,\n {\n ...attrs,\n theme: theme.value,\n defaultColorScheme: stored ?? props.defaultColorScheme,\n forceColorScheme: props.forceColorScheme,\n cssVariablesResolver: props.cssVariablesResolver ?? jcCssVariablesResolver,\n },\n () => [\n props.colorSchemeStorageKey ? h(ColorSchemePersistence, { storageKey: props.colorSchemeStorageKey }) : null,\n slots.default?.(),\n ],\n );\n },\n});\n","import { defineComponent, h, type Component, type DefineSetupFnComponent, type PropType, type SlotsType, type VNodeChild } from 'vue';\nimport { Badge, type BadgeProps } from '@mantine-vue/core';\nimport { IconAlertTriangle, IconCheck, IconInfoCircle, IconX } from '@tabler/icons-vue';\n\nexport type TagTone = 'primary' | 'success' | 'warn' | 'error' | 'neutral';\n\nconst toneColor: Record<TagTone, string> = {\n primary: 'horizon',\n success: 'evergreen',\n warn: 'electric',\n error: 'danger',\n neutral: 'obsidian',\n};\n\nconst toneIcon: Record<TagTone, Component | null> = {\n primary: IconInfoCircle,\n success: IconCheck,\n warn: IconAlertTriangle,\n error: IconX,\n neutral: null,\n};\n\nexport interface TagProps extends Omit<BadgeProps, 'color' | 'variant'> {\n /** Tom semântico (ds-tag-*) @default 'primary' */\n tone?: TagTone;\n /** Mostra o ícone padrão do tom (✓ ⚠ ✕ ⓘ). Use o slot/prop `leftSection` para outro ícone. */\n withIcon?: boolean;\n /** `light` = selo suave (padrão) · `filled` = cor sólida · `outline` · `dot` */\n variant?: 'light' | 'filled' | 'outline' | 'dot';\n}\n\nexport interface TagSlots {\n default?: () => VNodeChild;\n leftSection?: () => VNodeChild;\n rightSection?: () => VNodeChild;\n}\n\n/** Selo / tag de status — preset de Badge com os tons do ds.css. */\nexport const Tag = defineComponent({\n name: 'Tag',\n inheritAttrs: false,\n props: {\n tone: { type: String as PropType<TagTone>, default: 'primary' },\n withIcon: { type: Boolean, default: false },\n variant: { type: String as PropType<TagProps['variant']>, default: 'light' },\n },\n setup(props, { attrs, slots }) {\n return () => {\n const Icon = toneIcon[props.tone];\n // Slot ou prop `leftSection` (camelCase ou kebab-case no template) do usuário têm prioridade\n const hasCustom = slots.leftSection || attrs.leftSection !== undefined || attrs['left-section'] !== undefined;\n const leftSection = slots.leftSection ?? (!hasCustom && props.withIcon && Icon ? () => h(Icon, { size: 12, stroke: 2.5 }) : undefined);\n return h(\n Badge as any,\n { color: toneColor[props.tone], variant: props.variant, 'data-tone': props.tone, ...attrs },\n { ...slots, ...(leftSection && { leftSection }) },\n );\n };\n },\n}) as unknown as DefineSetupFnComponent<TagProps, {}, SlotsType<TagSlots>>;\n","import { Comment, Fragment, Text, camelize, getCurrentInstance, isVNode, toHandlerKey, type PropType, type VNodeChild } from 'vue';\nimport { resolveNode, type MantineNode } from '@mantine-vue/core';\n\n/**\n * Indica se há conteúdo renderizável. Diferente do `hasNode` do Mantine Vue, trata como vazio\n * um slot que só devolveu comentários (`v-if` falso), texto em branco ou arrays/fragments vazios.\n */\nexport function hasContent(node: VNodeChild): boolean {\n if (node === null || node === undefined || node === false || node === true || node === '') return false;\n if (Array.isArray(node)) return node.some((child) => hasContent(child as VNodeChild));\n if (isVNode(node)) {\n if (node.type === Comment) return false;\n if (node.type === Text) return typeof node.children === 'string' && node.children.trim() !== '';\n if (node.type === Fragment) return hasContent(node.children as VNodeChild);\n }\n return true;\n}\n\n/** `resolveNode` do Mantine Vue (slot > prop) já normalizado para `undefined` quando vazio. */\nexport function resolveContent(prop: MantineNode | undefined, slot?: () => VNodeChild): VNodeChild {\n const node = resolveNode(prop, slot);\n return hasContent(node) ? node : undefined;\n}\n\n/**\n * Equivalente ao `if (onAction)` do React: devolve uma função que diz se o pai registrou um listener\n * para o evento (`@action`, `v-model:favorite` → `onUpdate:favorite`…). Chame no setup e use a\n * função durante o render.\n *\n * Os listeners de eventos declarados em `emits` não chegam em `attrs`, então a checagem é feita nas\n * props do VNode do componente. Limitação do Vue: adicionar/remover só um listener (sem mudar\n * nenhuma prop) não re-renderiza o filho.\n */\nexport function useListenerCheck() {\n const instance = getCurrentInstance();\n return (event: string): boolean => {\n const props = instance?.vnode.props;\n if (!props) return false;\n return Boolean(props[toHandlerKey(event)] || props[toHandlerKey(camelize(event))]);\n };\n}\n\n/**\n * Declaração runtime de uma prop `MantineNode` (texto, número, VNode ou função) para `defineComponent`.\n * `type: null` aceita qualquer valor e evita o cast booleano do Vue.\n */\nexport const nodeProp = { type: null as unknown as PropType<MantineNode>, default: undefined };\n","import { createVarsResolver, getRadius } from '@mantine-vue/core';\nimport type { PromoBannerProps } from './PromoBanner.types';\n\nconst palette = {\n horizon: { bg: 'var(--dc-horizon-700)', color: '#fff', highlight: 'var(--dc-electric)' },\n electric: { bg: 'var(--dc-electric)', color: 'var(--dc-obsidian)', highlight: 'var(--dc-horizon-700)' },\n obsidian: { bg: 'var(--dc-obsidian)', color: '#fff', highlight: 'var(--dc-electric)' },\n};\n\nexport const varsResolver = createVarsResolver<PromoBannerProps>((_theme, { variant = 'horizon', radius }) => ({\n root: {\n '--banner-bg': palette[variant].bg,\n '--banner-color': palette[variant].color,\n '--banner-highlight': palette[variant].highlight,\n '--banner-radius': radius === undefined ? undefined : getRadius(radius),\n },\n}));\n","/* @generated sincronizado de packages/ui/src/components/PromoBanner/PromoBanner.module.css — edite lá e rode `npm run sync -w @jcdecor/vue` */\n.root {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--sp-8);\n padding: var(--sp-12) var(--sp-20);\n font-weight: 600;\n font-size: var(--type-subheadline-rg);\n line-height: 1.4;\n text-align: center;\n position: relative;\n background: var(--banner-bg);\n color: var(--banner-color);\n}\n.root[data-closable] {\n padding-inline: var(--sp-40);\n}\n.root[data-radius] {\n border-radius: var(--banner-radius);\n}\n.root :where(strong),\n.highlight {\n color: var(--banner-highlight);\n font-weight: 700;\n}\n.content {\n display: inline-flex;\n align-items: center;\n gap: var(--sp-8);\n flex-wrap: wrap;\n justify-content: center;\n}\n.close {\n position: absolute;\n right: var(--sp-8);\n top: 50%;\n transform: translateY(-50%);\n color: inherit;\n}\n","<script setup lang=\"ts\">\nimport { useAttrs, useSlots } from 'vue';\nimport { Box, CloseButton, useProps, useStyles } from '@mantine-vue/core';\nimport { useUncontrolled } from '@mantine-vue/hooks';\nimport { hasContent, resolveContent } from '../../utils/vue';\nimport type { PromoBannerEmits, PromoBannerOwnProps, PromoBannerSlots } from './PromoBanner.types';\nimport { varsResolver } from './PromoBanner.vars';\nimport classes from './PromoBanner.module.css';\n\ndefineOptions({ name: 'PromoBanner', inheritAttrs: false });\n\n// `undefined` explícito: os padrões vêm do useProps, e `opened` ausente (≠ false) deixa o banner não controlado.\nconst rawProps = withDefaults(defineProps<PromoBannerOwnProps>(), {\n variant: undefined,\n highlight: undefined,\n icon: undefined,\n withCloseButton: undefined,\n opened: undefined,\n radius: undefined,\n classNames: undefined,\n styles: undefined,\n vars: undefined,\n unstyled: undefined,\n});\ndefineSlots<PromoBannerSlots>();\nconst emit = defineEmits<PromoBannerEmits>();\n\nconst attrs = useAttrs();\nconst slots = useSlots();\nconst props = useProps('PromoBanner', { variant: 'horizon' }, rawProps);\n\nconst [open, setOpen] = useUncontrolled({\n value: () => props.opened,\n defaultValue: true,\n onChange: (value) => emit('update:opened', value),\n});\n\nconst getStyles = useStyles({\n name: 'PromoBanner',\n classes,\n props,\n get className() { return attrs.class; },\n get style() { return attrs.style as any; },\n get classNames() { return props.classNames as any; },\n get styles() { return props.styles as any; },\n get vars() { return props.vars as any; },\n get unstyled() { return props.unstyled; },\n varsResolver,\n});\n\nconst icon = () => resolveContent(props.icon, slots.icon);\nconst highlight = () => resolveContent(props.highlight, slots.highlight);\n\nfunction close() {\n setOpen(false);\n emit('close');\n}\n</script>\n\n<template>\n <Box\n v-if=\"open\"\n role=\"note\"\n v-bind=\"{ ...attrs, ...getStyles('root') }\"\n :variant=\"props.variant\"\n :mod=\"[{ radius: props.radius !== undefined, closable: props.withCloseButton }, (attrs as any).mod]\"\n >\n <span v-bind=\"getStyles('content')\">\n <component :is=\"icon\" />\n <span><slot /></span>\n <strong v-if=\"hasContent(highlight())\" v-bind=\"getStyles('highlight')\"><component :is=\"highlight\" /></strong>\n </span>\n <CloseButton\n v-if=\"props.withCloseButton\"\n aria-label=\"Fechar\"\n size=\"sm\"\n variant=\"transparent\"\n v-bind=\"getStyles('close')\"\n @click=\"close\"\n />\n </Box>\n</template>\n","<script setup lang=\"ts\">\nimport { useAttrs, useSlots } from 'vue';\nimport { Box, CloseButton, useProps, useStyles } from '@mantine-vue/core';\nimport { useUncontrolled } from '@mantine-vue/hooks';\nimport { hasContent, resolveContent } from '../../utils/vue';\nimport type { PromoBannerEmits, PromoBannerOwnProps, PromoBannerSlots } from './PromoBanner.types';\nimport { varsResolver } from './PromoBanner.vars';\nimport classes from './PromoBanner.module.css';\n\ndefineOptions({ name: 'PromoBanner', inheritAttrs: false });\n\n// `undefined` explícito: os padrões vêm do useProps, e `opened` ausente (≠ false) deixa o banner não controlado.\nconst rawProps = withDefaults(defineProps<PromoBannerOwnProps>(), {\n variant: undefined,\n highlight: undefined,\n icon: undefined,\n withCloseButton: undefined,\n opened: undefined,\n radius: undefined,\n classNames: undefined,\n styles: undefined,\n vars: undefined,\n unstyled: undefined,\n});\ndefineSlots<PromoBannerSlots>();\nconst emit = defineEmits<PromoBannerEmits>();\n\nconst attrs = useAttrs();\nconst slots = useSlots();\nconst props = useProps('PromoBanner', { variant: 'horizon' }, rawProps);\n\nconst [open, setOpen] = useUncontrolled({\n value: () => props.opened,\n defaultValue: true,\n onChange: (value) => emit('update:opened', value),\n});\n\nconst getStyles = useStyles({\n name: 'PromoBanner',\n classes,\n props,\n get className() { return attrs.class; },\n get style() { return attrs.style as any; },\n get classNames() { return props.classNames as any; },\n get styles() { return props.styles as any; },\n get vars() { return props.vars as any; },\n get unstyled() { return props.unstyled; },\n varsResolver,\n});\n\nconst icon = () => resolveContent(props.icon, slots.icon);\nconst highlight = () => resolveContent(props.highlight, slots.highlight);\n\nfunction close() {\n setOpen(false);\n emit('close');\n}\n</script>\n\n<template>\n <Box\n v-if=\"open\"\n role=\"note\"\n v-bind=\"{ ...attrs, ...getStyles('root') }\"\n :variant=\"props.variant\"\n :mod=\"[{ radius: props.radius !== undefined, closable: props.withCloseButton }, (attrs as any).mod]\"\n >\n <span v-bind=\"getStyles('content')\">\n <component :is=\"icon\" />\n <span><slot /></span>\n <strong v-if=\"hasContent(highlight())\" v-bind=\"getStyles('highlight')\"><component :is=\"highlight\" /></strong>\n </span>\n <CloseButton\n v-if=\"props.withCloseButton\"\n aria-label=\"Fechar\"\n size=\"sm\"\n variant=\"transparent\"\n v-bind=\"getStyles('close')\"\n @click=\"close\"\n />\n </Box>\n</template>\n","import { factory } from '@mantine-vue/core';\nimport PromoBannerComponent from './PromoBanner.vue';\nimport type { PromoBannerFactory } from './PromoBanner.types';\nimport { varsResolver } from './PromoBanner.vars';\nimport classes from './PromoBanner.module.css';\n\n/** Banner promocional (topo do site / campanhas). Suporta `v-model:opened`. */\nexport const PromoBanner = factory<PromoBannerFactory>(PromoBannerComponent, { classes, varsResolver });\n\nexport type {\n PromoBannerCssVariables,\n PromoBannerEmits,\n PromoBannerFactory,\n PromoBannerOwnProps,\n PromoBannerProps,\n PromoBannerSlots,\n PromoBannerStylesNames,\n PromoBannerVariant,\n} from './PromoBanner.types';\n","/* @generated sincronizado de packages/ui/src/components/ContentCard/ContentCard.module.css — edite lá e rode `npm run sync -w @jcdecor/vue` */\n.root {\n display: flex;\n flex-direction: column;\n}\n.image {\n margin: calc(var(--card-padding) * -1) calc(var(--card-padding) * -1) var(--sp-16);\n}\n.image img {\n display: block;\n width: 100%;\n object-fit: cover;\n}\n.kicker {}\n.title {\n font-size: var(--type-headline-sm);\n font-weight: 600;\n line-height: 1.3;\n margin: var(--sp-8) 0 var(--sp-4);\n color: var(--ds-text);\n}\n.body {\n color: var(--ds-text-2);\n flex: 1;\n}\n.actions {\n margin-top: var(--sp-16);\n display: flex;\n gap: var(--sp-8);\n flex-wrap: wrap;\n}\n","<script setup lang=\"ts\">\nimport { useAttrs, useSlots } from 'vue';\nimport { useProps, useStyles } from '@mantine-vue/core';\nimport { Card } from '../../theme/themeDefaults';\nimport { Kicker } from '../Typography';\nimport { hasContent, resolveContent } from '../../utils/vue';\nimport type { ContentCardOwnProps, ContentCardSlots } from './ContentCard.types';\nimport classes from './ContentCard.module.css';\n\ndefineOptions({ name: 'ContentCard', inheritAttrs: false });\n\n// `undefined` explícito: os padrões vêm do useProps, para que theme.components.ContentCard.defaultProps funcione.\nconst rawProps = withDefaults(defineProps<ContentCardOwnProps>(), {\n kicker: undefined,\n title: undefined,\n image: undefined,\n imageAlt: undefined,\n imageHeight: undefined,\n actions: undefined,\n classNames: undefined,\n styles: undefined,\n vars: undefined,\n unstyled: undefined,\n});\ndefineSlots<ContentCardSlots>();\n\nconst attrs = useAttrs();\nconst slots = useSlots();\nconst props = useProps('ContentCard', { imageHeight: 180 }, rawProps);\n\n// Getters: o useStyles lê o input a cada chamada, então class/style/classNames continuam reativos.\nconst getStyles = useStyles({\n name: 'ContentCard',\n classes,\n props,\n get className() { return attrs.class; },\n get style() { return attrs.style as any; },\n get classNames() { return props.classNames as any; },\n get styles() { return props.styles as any; },\n get vars() { return props.vars as any; },\n get unstyled() { return props.unstyled; },\n});\n\nconst kicker = () => resolveContent(props.kicker, slots.kicker);\nconst title = () => resolveContent(props.title, slots.title);\nconst actions = () => resolveContent(props.actions, slots.actions);\nconst body = () => resolveContent(undefined, slots.default);\n/** URL (string) vira <img>; slot ou nó customizado é renderizado como está. */\nconst imageUrl = () => (!slots.image && typeof props.image === 'string' && props.image ? props.image : undefined);\nconst imageNode = () => resolveContent(props.image, slots.image);\n</script>\n\n<template>\n <Card v-bind=\"{ ...attrs, ...getStyles('root') }\">\n <div v-if=\"imageUrl() || hasContent(imageNode())\" v-bind=\"getStyles('image')\">\n <img\n v-if=\"imageUrl()\"\n :src=\"imageUrl()\"\n :alt=\"props.imageAlt ?? ''\"\n :style=\"{ height: `${props.imageHeight}px` }\"\n />\n <component :is=\"imageNode\" v-else />\n </div>\n <Kicker v-if=\"hasContent(kicker())\" v-bind=\"getStyles('kicker')\"><component :is=\"kicker\" /></Kicker>\n <div v-if=\"hasContent(title())\" v-bind=\"getStyles('title')\"><component :is=\"title\" /></div>\n <div v-if=\"hasContent(body())\" v-bind=\"getStyles('body')\"><component :is=\"body\" /></div>\n <div v-if=\"hasContent(actions())\" v-bind=\"getStyles('actions')\"><component :is=\"actions\" /></div>\n </Card>\n</template>\n","<script setup lang=\"ts\">\nimport { useAttrs, useSlots } from 'vue';\nimport { useProps, useStyles } from '@mantine-vue/core';\nimport { Card } from '../../theme/themeDefaults';\nimport { Kicker } from '../Typography';\nimport { hasContent, resolveContent } from '../../utils/vue';\nimport type { ContentCardOwnProps, ContentCardSlots } from './ContentCard.types';\nimport classes from './ContentCard.module.css';\n\ndefineOptions({ name: 'ContentCard', inheritAttrs: false });\n\n// `undefined` explícito: os padrões vêm do useProps, para que theme.components.ContentCard.defaultProps funcione.\nconst rawProps = withDefaults(defineProps<ContentCardOwnProps>(), {\n kicker: undefined,\n title: undefined,\n image: undefined,\n imageAlt: undefined,\n imageHeight: undefined,\n actions: undefined,\n classNames: undefined,\n styles: undefined,\n vars: undefined,\n unstyled: undefined,\n});\ndefineSlots<ContentCardSlots>();\n\nconst attrs = useAttrs();\nconst slots = useSlots();\nconst props = useProps('ContentCard', { imageHeight: 180 }, rawProps);\n\n// Getters: o useStyles lê o input a cada chamada, então class/style/classNames continuam reativos.\nconst getStyles = useStyles({\n name: 'ContentCard',\n classes,\n props,\n get className() { return attrs.class; },\n get style() { return attrs.style as any; },\n get classNames() { return props.classNames as any; },\n get styles() { return props.styles as any; },\n get vars() { return props.vars as any; },\n get unstyled() { return props.unstyled; },\n});\n\nconst kicker = () => resolveContent(props.kicker, slots.kicker);\nconst title = () => resolveContent(props.title, slots.title);\nconst actions = () => resolveContent(props.actions, slots.actions);\nconst body = () => resolveContent(undefined, slots.default);\n/** URL (string) vira <img>; slot ou nó customizado é renderizado como está. */\nconst imageUrl = () => (!slots.image && typeof props.image === 'string' && props.image ? props.image : undefined);\nconst imageNode = () => resolveContent(props.image, slots.image);\n</script>\n\n<template>\n <Card v-bind=\"{ ...attrs, ...getStyles('root') }\">\n <div v-if=\"imageUrl() || hasContent(imageNode())\" v-bind=\"getStyles('image')\">\n <img\n v-if=\"imageUrl()\"\n :src=\"imageUrl()\"\n :alt=\"props.imageAlt ?? ''\"\n :style=\"{ height: `${props.imageHeight}px` }\"\n />\n <component :is=\"imageNode\" v-else />\n </div>\n <Kicker v-if=\"hasContent(kicker())\" v-bind=\"getStyles('kicker')\"><component :is=\"kicker\" /></Kicker>\n <div v-if=\"hasContent(title())\" v-bind=\"getStyles('title')\"><component :is=\"title\" /></div>\n <div v-if=\"hasContent(body())\" v-bind=\"getStyles('body')\"><component :is=\"body\" /></div>\n <div v-if=\"hasContent(actions())\" v-bind=\"getStyles('actions')\"><component :is=\"actions\" /></div>\n </Card>\n</template>\n","import { factory } from '@mantine-vue/core';\nimport ContentCardComponent from './ContentCard.vue';\nimport type { ContentCardFactory } from './ContentCard.types';\nimport classes from './ContentCard.module.css';\n\n/** Card de conteúdo: superfície branca sobre LightGray, borda suave e sombra pequena (ds-card). */\nexport const ContentCard = factory<ContentCardFactory>(ContentCardComponent, { classes });\n\nexport type {\n ContentCardFactory,\n ContentCardOwnProps,\n ContentCardProps,\n ContentCardSlots,\n ContentCardStylesNames,\n} from './ContentCard.types';\n","import { createVarsResolver } from '@mantine-vue/core';\nimport type { KpiCardProps } from './KpiCard.types';\n\nexport function getDeltaTone(delta: number | undefined, invert = false): 'up' | 'down' | 'flat' {\n if (delta === undefined || delta === 0 || Number.isNaN(delta)) return 'flat';\n const positive = delta > 0;\n return positive !== invert ? 'up' : 'down';\n}\n\nconst toneColor = { up: 'var(--ds-success)', down: 'var(--ds-error)', flat: 'var(--ds-text-3)' };\n\nexport const varsResolver = createVarsResolver<KpiCardProps>((_theme, { delta, invertDelta, colorValue }) => {\n const tone = getDeltaTone(delta, invertDelta);\n return {\n root: {\n '--kpi-delta-color': toneColor[tone],\n '--kpi-value-color': colorValue && tone !== 'flat' ? toneColor[tone] : undefined,\n },\n };\n});\n","/* @generated sincronizado de packages/ui/src/components/KpiCard/KpiCard.module.css — edite lá e rode `npm run sync -w @jcdecor/vue` */\n.root {\n background: var(--ds-surface);\n border: 1px solid var(--ds-border-soft);\n border-radius: var(--ds-radius);\n padding: var(--sp-16) var(--sp-20);\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: var(--sp-4);\n}\n.header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--sp-8);\n}\n.label {\n font-size: var(--type-disclaimer);\n font-weight: 500;\n color: var(--ds-text-3);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n}\n.icon {\n color: var(--ds-text-3);\n display: inline-flex;\n}\n.value {\n font-size: var(--type-headline-md);\n overflow-wrap: anywhere;\n font-weight: 700;\n line-height: 1.25;\n font-variant-numeric: tabular-nums;\n color: var(--kpi-value-color, var(--ds-text));\n}\n.footer {\n display: flex;\n align-items: center;\n gap: var(--sp-8);\n flex-wrap: wrap;\n font-size: var(--type-disclaimer);\n color: var(--ds-text-3);\n}\n.delta {\n display: inline-flex;\n align-items: center;\n gap: 2px;\n font-weight: 600;\n font-variant-numeric: tabular-nums;\n color: var(--kpi-delta-color);\n}\n.chart {\n margin-top: var(--sp-8);\n}\n","<script setup lang=\"ts\">\nimport { useAttrs, useSlots } from 'vue';\nimport { Box, Skeleton, useProps, useStyles } from '@mantine-vue/core';\nimport { IconArrowDownRight, IconArrowUpRight, IconMinus } from '@tabler/icons-vue';\nimport { formatNumber, formatPercent } from '../../utils/format';\nimport { hasContent, resolveContent } from '../../utils/vue';\nimport type { KpiCardOwnProps, KpiCardSlots } from './KpiCard.types';\nimport { getDeltaTone, varsResolver } from './KpiCard.vars';\nimport classes from './KpiCard.module.css';\n\ndefineOptions({ name: 'KpiCard', inheritAttrs: false });\n\n// `undefined` explícito: os padrões vêm do useProps, para que theme.components.KpiCard.defaultProps funcione.\nconst rawProps = withDefaults(defineProps<KpiCardOwnProps>(), {\n label: undefined,\n value: undefined,\n delta: undefined,\n deltaLabel: undefined,\n invertDelta: undefined,\n colorValue: undefined,\n icon: undefined,\n chart: undefined,\n loading: undefined,\n classNames: undefined,\n styles: undefined,\n vars: undefined,\n unstyled: undefined,\n});\ndefineSlots<KpiCardSlots>();\n\nconst attrs = useAttrs();\nconst slots = useSlots();\nconst props = useProps('KpiCard', {}, rawProps);\n\nconst getStyles = useStyles({\n name: 'KpiCard',\n classes,\n props,\n get className() { return attrs.class; },\n get style() { return attrs.style as any; },\n get classNames() { return props.classNames as any; },\n get styles() { return props.styles as any; },\n get vars() { return props.vars as any; },\n get unstyled() { return props.unstyled; },\n varsResolver,\n});\n\nconst label = () => resolveContent(props.label, slots.label);\nconst value = () => {\n const node = resolveContent(props.value, slots.value);\n return typeof node === 'number' ? formatNumber(node) : node;\n};\nconst deltaLabel = () => resolveContent(props.deltaLabel, slots.deltaLabel);\nconst icon = () => resolveContent(props.icon, slots.icon);\nconst chart = () => resolveContent(props.chart, slots.chart);\n\nconst tone = () => getDeltaTone(props.delta, props.invertDelta);\nconst arrowIcon = () =>\n props.delta === undefined || props.delta === 0 ? IconMinus : props.delta > 0 ? IconArrowUpRight : IconArrowDownRight;\n</script>\n\n<template>\n <Box v-bind=\"{ ...attrs, ...getStyles('root') }\">\n <div v-bind=\"getStyles('header')\">\n <span v-bind=\"getStyles('label')\"><component :is=\"label\" /></span>\n <span v-if=\"hasContent(icon())\" v-bind=\"getStyles('icon')\"><component :is=\"icon\" /></span>\n </div>\n <Skeleton v-if=\"props.loading\" :height=\"32\" width=\"60%\" :mt=\"4\" />\n <div v-else v-bind=\"getStyles('value')\"><component :is=\"value\" /></div>\n <div v-if=\"(props.delta !== undefined || hasContent(deltaLabel())) && !props.loading\" v-bind=\"getStyles('footer')\">\n <span v-if=\"props.delta !== undefined\" v-bind=\"getStyles('delta')\" :data-tone=\"tone()\">\n <component :is=\"arrowIcon()\" :size=\"14\" stroke=\"2.5\" />\n {{ formatPercent(props.delta, { signed: true }) }}\n </span>\n <span v-if=\"hasContent(deltaLabel())\"><component :is=\"deltaLabel\" /></span>\n </div>\n <div v-if=\"hasContent(chart())\" v-bind=\"getStyles('chart')\"><component :is=\"chart\" /></div>\n </Box>\n</template>\n","<script setup lang=\"ts\">\nimport { useAttrs, useSlots } from 'vue';\nimport { Box, Skeleton, useProps, useStyles } from '@mantine-vue/core';\nimport { IconArrowDownRight, IconArrowUpRight, IconMinus } from '@tabler/icons-vue';\nimport { formatNumber, formatPercent } from '../../utils/format';\nimport { hasContent, resolveContent } from '../../utils/vue';\nimport type { KpiCardOwnProps, KpiCardSlots } from './KpiCard.types';\nimport { getDeltaTone, varsResolver } from './KpiCard.vars';\nimport classes from './KpiCard.module.css';\n\ndefineOptions({ name: 'KpiCard', inheritAttrs: false });\n\n// `undefined` explícito: os padrões vêm do useProps, para que theme.components.KpiCard.defaultProps funcione.\nconst rawProps = withDefaults(defineProps<KpiCardOwnProps>(), {\n label: undefined,\n value: undefined,\n delta: undefined,\n deltaLabel: undefined,\n invertDelta: undefined,\n colorValue: undefined,\n icon: undefined,\n chart: undefined,\n loading: undefined,\n classNames: undefined,\n styles: undefined,\n vars: undefined,\n unstyled: undefined,\n});\ndefineSlots<KpiCardSlots>();\n\nconst attrs = useAttrs();\nconst slots = useSlots();\nconst props = useProps('KpiCard', {}, rawProps);\n\nconst getStyles = useStyles({\n name: 'KpiCard',\n classes,\n props,\n get className() { return attrs.class; },\n get style() { return attrs.style as any; },\n get classNames() { return props.classNames as any; },\n get styles() { return props.styles as any; },\n get vars() { return props.vars as any; },\n get unstyled() { return props.unstyled; },\n varsResolver,\n});\n\nconst label = () => resolveContent(props.label, slots.label);\nconst value = () => {\n const node = resolveContent(props.value, slots.value);\n return typeof node === 'number' ? formatNumber(node) : node;\n};\nconst deltaLabel = () => resolveContent(props.deltaLabel, slots.deltaLabel);\nconst icon = () => resolveContent(props.icon, slots.icon);\nconst chart = () => resolveContent(props.chart, slots.chart);\n\nconst tone = () => getDeltaTone(props.delta, props.invertDelta);\nconst arrowIcon = () =>\n props.delta === undefined || props.delta === 0 ? IconMinus : props.delta > 0 ? IconArrowUpRight : IconArrowDownRight;\n</script>\n\n<template>\n <Box v-bind=\"{ ...attrs, ...getStyles('root') }\">\n <div v-bind=\"getStyles('header')\">\n <span v-bind=\"getStyles('label')\"><component :is=\"label\" /></span>\n <span v-if=\"hasContent(icon())\" v-bind=\"getStyles('icon')\"><component :is=\"icon\" /></span>\n </div>\n <Skeleton v-if=\"props.loading\" :height=\"32\" width=\"60%\" :mt=\"4\" />\n <div v-else v-bind=\"getStyles('value')\"><component :is=\"value\" /></div>\n <div v-if=\"(props.delta !== undefined || hasContent(deltaLabel())) && !props.loading\" v-bind=\"getStyles('footer')\">\n <span v-if=\"props.delta !== undefined\" v-bind=\"getStyles('delta')\" :data-tone=\"tone()\">\n <component :is=\"arrowIcon()\" :size=\"14\" stroke=\"2.5\" />\n {{ formatPercent(props.delta, { signed: true }) }}\n </span>\n <span v-if=\"hasContent(deltaLabel())\"><component :is=\"deltaLabel\" /></span>\n </div>\n <div v-if=\"hasContent(chart())\" v-bind=\"getStyles('chart')\"><component :is=\"chart\" /></div>\n </Box>\n</template>\n","import { defineComponent, h, type DefineSetupFnComponent, type PropType, type SlotsType, type VNodeChild } from 'vue';\nimport { SimpleGrid, type SimpleGridProps } from '@mantine-vue/core';\n\nexport type KpiGroupProps = SimpleGridProps;\n\n/**\n * Grade responsiva de KPIs baseada na largura do CONTÊINER (container queries), não da tela:\n * 1 coluna até 440px · 2 até 880px · 4 acima. Funciona igual em página cheia, ao lado de sidebar ou dentro de card.\n */\nexport const KpiGroup = defineComponent({\n name: 'KpiGroup',\n inheritAttrs: false,\n props: {\n cols: { type: [Number, Object] as PropType<SimpleGridProps['cols']>, default: () => ({ base: 1, '440px': 2, '880px': 4 }) },\n spacing: { type: [String, Number, Object] as PropType<SimpleGridProps['spacing']>, default: 'md' },\n type: { type: String as PropType<SimpleGridProps['type']>, default: 'container' },\n },\n setup(props, { attrs, slots }) {\n return () => h(SimpleGrid as any, { type: props.type, cols: props.cols, spacing: props.spacing, ...attrs }, slots);\n },\n}) as unknown as DefineSetupFnComponent<KpiGroupProps, {}, SlotsType<{ default?: () => VNodeChild }>>;\n","import { factory } from '@mantine-vue/core';\nimport KpiCardComponent from './KpiCard.vue';\nimport type { KpiCardFactory } from './KpiCard.types';\nimport { varsResolver } from './KpiCard.vars';\nimport classes from './KpiCard.module.css';\n\n/** Tile de KPI dos dashboards (ds-kpi). */\nexport const KpiCard = factory<KpiCardFactory>(KpiCardComponent, { classes, varsResolver });\n\nexport { getDeltaTone } from './KpiCard.vars';\nexport { KpiGroup, type KpiGroupProps } from './KpiGroup';\nexport type {\n KpiCardCssVariables,\n KpiCardFactory,\n KpiCardOwnProps,\n KpiCardProps,\n KpiCardSlots,\n KpiCardStylesNames,\n} from './KpiCard.types';\n","import { defineComponent, h, type Component, type DefineSetupFnComponent, type PropType, type SlotsType, type VNodeChild } from 'vue';\nimport { Anchor, Box, Breadcrumbs, Group, resolveNode, type BoxProps, type MantineNode } from '@mantine-vue/core';\nimport { Headline, Kicker, Subheadline } from '../Typography';\nimport { nodeProp, resolveContent } from '../../utils/vue';\n\nexport interface PageHeaderBreadcrumb {\n label: MantineNode;\n href?: string;\n}\n\nexport interface PageHeaderProps extends Omit<BoxProps, 'title'> {\n /** Também aceita o slot `kicker` (o slot tem prioridade). */\n kicker?: MantineNode;\n /** Também aceita o slot `title` (o slot tem prioridade). */\n title?: MantineNode;\n /** Também aceita o slot `description` (o slot tem prioridade). */\n description?: MantineNode;\n /** Botões à direita do título. Também aceita o slot `actions` (o slot tem prioridade). */\n actions?: MantineNode;\n breadcrumbs?: PageHeaderBreadcrumb[];\n /** Componente dos links do breadcrumb (ex.: `RouterLink` do vue-router) @default 'a' */\n linkComponent?: string | Component;\n /** `display` usa display-small (página principal); `headline` usa headline-large @default 'headline' */\n size?: 'display' | 'headline';\n}\n\nexport interface PageHeaderSlots {\n kicker?: () => VNodeChild;\n title?: () => VNodeChild;\n description?: () => VNodeChild;\n actions?: () => VNodeChild;\n}\n\n/** Cabeçalho de página: breadcrumbs, kicker, título, descrição e ações. */\nexport const PageHeader = defineComponent({\n name: 'PageHeader',\n inheritAttrs: false,\n props: {\n kicker: nodeProp,\n title: nodeProp,\n description: nodeProp,\n actions: nodeProp,\n breadcrumbs: { type: Array as PropType<PageHeaderBreadcrumb[]>, default: undefined },\n linkComponent: { type: [String, Object, Function] as PropType<string | Component>, default: 'a' },\n size: { type: String as PropType<NonNullable<PageHeaderProps['size']>>, default: 'headline' },\n },\n setup(props, { attrs, slots }) {\n return () => {\n const kicker = resolveContent(props.kicker, slots.kicker);\n const title = resolveNode(props.title, slots.title);\n const description = resolveContent(props.description, slots.description);\n const actions = resolveContent(props.actions, slots.actions);\n const { breadcrumbs, linkComponent } = props;\n\n return h(Box as any, { mb: 'xl', ...attrs }, () => [\n breadcrumbs && breadcrumbs.length > 0\n ? h(Breadcrumbs as any, { mb: 'sm', fz: 'sm', separatorMargin: 6 }, () =>\n breadcrumbs.map((crumb, index) =>\n crumb.href\n ? h(\n Anchor as any,\n {\n key: index,\n component: linkComponent,\n href: crumb.href,\n ...(linkComponent !== 'a' && { to: crumb.href }),\n fz: 'sm',\n },\n () => resolveNode(crumb.label),\n )\n : h(Box as any, { key: index, component: 'span', c: 'var(--ds-text-3)', fz: 'sm' }, () => resolveNode(crumb.label)),\n ),\n )\n : null,\n h(Group as any, { justify: 'space-between', align: 'flex-end', gap: 'md', wrap: 'wrap' }, () => [\n h('div', { style: { flex: '1 1 320px', minWidth: 0 } }, [\n kicker !== undefined ? h(Kicker, null, () => kicker) : null,\n props.size === 'display'\n ? h(Headline as any, { component: 'h1', size: 'lg', fz: 'var(--type-display-sm)', lh: 1.15, mt: 8 }, () => title)\n : h(Headline as any, { component: 'h1', size: 'lg', mt: kicker !== undefined ? 8 : 0 }, () => title),\n description !== undefined\n ? h(Subheadline as any, { component: 'div', size: 'lg', c: 'var(--ds-text-2)', maw: 640, mt: 8 }, () => description)\n : null,\n ]),\n actions !== undefined ? h(Group as any, { gap: 'sm' }, () => actions) : null,\n ]),\n ]);\n };\n },\n}) as unknown as DefineSetupFnComponent<PageHeaderProps, {}, SlotsType<PageHeaderSlots>>;\n","/* @generated sincronizado de packages/ui/src/components/DataTable/DataTable.module.css — edite lá e rode `npm run sync -w @jcdecor/vue` */\n.wrapper {\n background: var(--ds-surface);\n border: 1px solid var(--ds-border-soft);\n border-radius: var(--ds-radius);\n overflow: hidden;\n}\n.wrapper[data-plain] {\n background: transparent;\n border: 0;\n border-radius: 0;\n}\n.num {\n text-align: right;\n font-variant-numeric: tabular-nums;\n}\n.sortButton {\n all: unset;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n cursor: pointer;\n font: inherit;\n color: inherit;\n text-transform: inherit;\n letter-spacing: inherit;\n}\n.sortButton:hover,\n.sortButton[data-sorted] {\n color: var(--ds-text);\n}\n.sortButton:focus-visible {\n outline: 2px solid var(--ds-primary);\n outline-offset: 2px;\n border-radius: 2px;\n}\n.row[data-clickable] {\n cursor: pointer;\n}\n.row[data-clickable]:focus-visible {\n outline: 2px solid var(--ds-primary);\n outline-offset: -2px;\n}\n.footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--sp-12);\n padding: var(--sp-12);\n border-top: 1px solid var(--ds-border-soft);\n font-size: var(--type-disclaimer);\n color: var(--ds-text-3);\n flex-wrap: wrap;\n}\n","import { computed, defineComponent, h, mergeProps, ref, type SetupContext, type SlotsType, type VNodeChild } from 'vue';\nimport {\n Box,\n EmptyState,\n Pagination,\n ScrollArea,\n Skeleton,\n TableTbody,\n TableTd,\n TableTh,\n TableThead,\n TableTr,\n resolveNode,\n type BoxProps,\n type MantineNode,\n type TableProps,\n} from '@mantine-vue/core';\nimport { useUncontrolled } from '@mantine-vue/hooks';\nimport { Table } from '../../theme/themeDefaults';\nimport { IconArrowDown, IconArrowUp, IconArrowsSort, IconDatabaseOff } from '@tabler/icons-vue';\nimport { formatNumber } from '../../utils/format';\nimport { useListenerCheck } from '../../utils/vue';\nimport classes from './DataTable.module.css';\n\nexport interface DataTableColumn<T> {\n /** Chave do campo em `T` (também usada para ordenar). Omita em colunas calculadas/de ações e use `id` + `render`. */\n key?: keyof T & string;\n /** Identificador da coluna quando não há `key` (ex.: 'acoes') */\n id?: string;\n /** Cabeçalho. Também aceita o slot `header-<id>` (o slot tem prioridade). */\n header: MantineNode;\n /** Renderização customizada da célula. O slot `cell-<id>` (`{ row, index }`) tem prioridade. */\n render?: (row: T, index: number) => VNodeChild;\n /** Coluna numérica: alinhada à direita, tabular-nums e formatada em pt-BR */\n numeric?: boolean;\n /** Opções de Intl.NumberFormat para colunas numéricas */\n format?: Intl.NumberFormatOptions;\n sortable?: boolean;\n /** Valor usado na ordenação quando diferente do campo */\n sortValue?: (row: T) => string | number;\n width?: number | string;\n}\n\nexport type SortDirection = 'asc' | 'desc';\nexport interface DataTableSort<T> {\n /** `key` ou `id` da coluna ordenada */\n key: (keyof T & string) | (string & {});\n direction: SortDirection;\n}\n\n/** Props declaradas pelo próprio DataTable. As demais (style props do Box, atributos) vão para o wrapper. */\nexport interface DataTableOwnProps<T> {\n columns: DataTableColumn<T>[];\n data: T[];\n /** Chave única de cada linha @default índice */\n rowKey?: (row: T, index: number) => PropertyKey;\n /** Ordenação inicial quando não controlada */\n initialSort?: DataTableSort<T>;\n /** Controle externo da ordenação (use `v-model:sort`; `null` = sem ordenação) */\n sort?: DataTableSort<T> | null;\n /** Ativa paginação local com N linhas por página */\n pageSize?: number;\n loading?: boolean;\n /** Linhas de skeleton durante loading @default 5 */\n loadingRows?: number;\n /** Estado vazio customizado. Também aceita o slot `empty` (o slot tem prioridade). */\n empty?: MantineNode;\n /** Remove a moldura (card) em volta da tabela */\n plain?: boolean;\n striped?: boolean;\n stickyHeader?: boolean;\n /** Props repassadas para o Table do Mantine */\n tableProps?: Omit<TableProps, 'data'>;\n}\n\nexport interface DataTableProps<T> extends Omit<BoxProps, keyof DataTableOwnProps<T>>, DataTableOwnProps<T> {\n 'onUpdate:sort'?: (sort: DataTableSort<T> | null) => void;\n /** Mudança de ordenação (controlada ou não) */\n onSortChange?: (sort: DataTableSort<T> | null) => void;\n /** Clique (ou Enter/Espaço) numa linha. Torna as linhas focáveis. */\n onRowClick?: (row: T, index: number) => void;\n}\n\nexport type DataTableSlots<T> = {\n /** Estado vazio customizado */\n empty?: () => VNodeChild;\n} & {\n /** Célula da coluna `<id>` (`key` ou `id`) */\n [K in `cell-${string}`]?: (scope: { row: T; index: number }) => VNodeChild;\n} & {\n /** Cabeçalho da coluna `<id>` */\n [K in `header-${string}`]?: () => VNodeChild;\n};\n\ntype DataTableEmits<T> = {\n 'update:sort': (sort: DataTableSort<T> | null) => void;\n 'sort-change': (sort: DataTableSort<T> | null) => void;\n 'row-click': (row: T, index: number) => void;\n};\n\nconst columnId = <T>(column: DataTableColumn<T>) => (column.id ?? column.key ?? '') as string;\n\nfunction compare(a: unknown, b: unknown) {\n if (typeof a === 'number' && typeof b === 'number') return a - b;\n return String(a ?? '').localeCompare(String(b ?? ''), 'pt-BR', { numeric: true, sensitivity: 'base' });\n}\n\n/**\n * Tabela de dados com ordenação, colunas numéricas pt-BR, paginação e estados vazio/carregando.\n *\n * - `v-model:sort` (controlado) ou `initialSort` (não controlado); `@sort-change` em ambos os casos.\n * - `@row-click=\"(row, index) => …\"` torna as linhas clicáveis/focáveis.\n * - Slots: `#cell-<coluna>=\"{ row, index }\"`, `#header-<coluna>`, `#empty`.\n */\nexport const DataTable = defineComponent(\n <T extends Record<string, any>>(\n props: DataTableProps<T>,\n { attrs, slots, emit }: SetupContext<DataTableEmits<T>, SlotsType<DataTableSlots<T>>>,\n ) => {\n const [sort, setSortValue] = useUncontrolled<DataTableSort<T> | null>({\n value: () => props.sort,\n defaultValue: props.initialSort ?? null,\n onChange: (next) => {\n emit('update:sort', next);\n emit('sort-change', next);\n },\n });\n const page = ref(1);\n\n const setSort = (next: DataTableSort<T> | null) => {\n setSortValue(next);\n page.value = 1;\n };\n\n const toggleSort = (key: string) => {\n const current = sort.value;\n if (!current || current.key !== key) setSort({ key, direction: 'asc' });\n else if (current.direction === 'asc') setSort({ key, direction: 'desc' });\n else setSort(null);\n };\n\n const sorted = computed(() => {\n const current = sort.value;\n if (!current) return props.data;\n const column = props.columns.find((c) => columnId(c) === current.key);\n const getValue = column?.sortValue ?? ((row: T) => (column?.key ? row[column.key] : undefined));\n const result = [...props.data].sort((a, b) => compare(getValue(a), getValue(b)));\n return current.direction === 'desc' ? result.reverse() : result;\n });\n\n // `row-click` está em `emits`, então o listener é procurado nas props do VNode (ver useListenerCheck).\n const hasListener = useListenerCheck();\n\n return () => {\n const { columns, pageSize, loading, plain, striped, stickyHeader, tableProps } = props;\n const loadingRows = props.loadingRows ?? 5;\n const currentSort = sort.value;\n const total = sorted.value.length;\n const totalPages = pageSize ? Math.max(1, Math.ceil(total / pageSize)) : 1;\n const currentPage = Math.min(page.value, totalPages);\n const visible = pageSize ? sorted.value.slice((currentPage - 1) * pageSize, currentPage * pageSize) : sorted.value;\n const clickable = hasListener('row-click');\n\n const header = h(TableThead as any, null, () =>\n h(TableTr as any, null, () =>\n columns.map((column) => {\n const id = columnId(column);\n const isSorted = currentSort?.key === id;\n const SortIcon = !isSorted ? IconArrowsSort : currentSort!.direction === 'asc' ? IconArrowUp : IconArrowDown;\n const label = resolveNode(column.header, slots[`header-${id}`] as (() => VNodeChild) | undefined);\n return h(\n TableTh as any,\n {\n key: id,\n class: column.numeric ? classes.num : undefined,\n style: { width: typeof column.width === 'number' ? `${column.width}px` : column.width },\n 'aria-sort': isSorted ? (currentSort!.direction === 'asc' ? 'ascending' : 'descending') : undefined,\n },\n () =>\n column.sortable\n ? h(\n 'button',\n { type: 'button', class: classes.sortButton, 'data-sorted': isSorted || undefined, onClick: () => toggleSort(id) },\n [label, h(SortIcon, { size: 12, stroke: '2.5', opacity: isSorted ? 1 : 0.5 })],\n )\n : label,\n );\n }),\n ),\n );\n\n let body: VNodeChild;\n if (loading) {\n body = Array.from({ length: loadingRows }, (_, i) =>\n h(TableTr as any, { key: i }, () =>\n columns.map((column) =>\n h(TableTd as any, { key: columnId(column) }, () =>\n h(Skeleton as any, { height: 14, width: column.numeric ? '50%' : '80%', ml: column.numeric ? 'auto' : 0 }),\n ),\n ),\n ),\n );\n } else if (visible.length === 0) {\n const empty = resolveNode(props.empty, slots.empty);\n body = h(TableTr as any, null, () =>\n h(TableTd as any, { colspan: columns.length }, () =>\n empty ??\n h(EmptyState as any, {\n py: 'xl',\n size: 'sm',\n icon: () => h(IconDatabaseOff, { size: 22 }),\n title: 'Nenhum resultado',\n description: 'Não há dados para exibir com os filtros atuais.',\n }),\n ),\n );\n } else {\n body = visible.map((row, index) =>\n h(\n TableTr as any,\n {\n key: props.rowKey ? props.rowKey(row, index) : index,\n class: classes.row,\n 'data-clickable': clickable ? true : undefined,\n tabindex: clickable ? 0 : undefined,\n onClick: clickable ? () => emit('row-click', row, index) : undefined,\n onKeydown: clickable\n ? (event: KeyboardEvent) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n emit('row-click', row, index);\n }\n }\n : undefined,\n },\n () =>\n columns.map((column) => {\n const id = columnId(column);\n const cellSlot = slots[`cell-${id}`] as ((scope: { row: T; index: number }) => VNodeChild) | undefined;\n const raw = column.key ? row[column.key] : undefined;\n const content = cellSlot\n ? cellSlot({ row, index })\n : column.render\n ? column.render(row, index)\n : column.numeric && typeof raw === 'number'\n ? formatNumber(raw, column.format)\n : (raw as VNodeChild);\n return h(TableTd as any, { key: id, class: column.numeric ? classes.num : undefined }, () => content);\n }),\n ),\n );\n }\n\n return h(Box as any, mergeProps({ class: classes.wrapper, 'data-plain': plain || undefined }, attrs), () => [\n h(ScrollArea as any, { type: 'auto' }, () =>\n h(Table as any, { striped, stickyHeader, ...tableProps }, () => [header, h(TableTbody as any, null, () => body)]),\n ),\n pageSize && total > pageSize\n ? h('div', { class: classes.footer }, [\n h(\n 'span',\n `${formatNumber((currentPage - 1) * pageSize + 1)}–${formatNumber(Math.min(currentPage * pageSize, total))} de ${formatNumber(total)}`,\n ),\n h(Pagination as any, {\n size: 'sm',\n total: totalPages,\n modelValue: currentPage,\n 'onUpdate:modelValue': (value: number) => {\n page.value = value;\n },\n }),\n ])\n : null,\n ]);\n };\n },\n {\n name: 'DataTable',\n inheritAttrs: false,\n props: [\n 'columns',\n 'data',\n 'rowKey',\n 'initialSort',\n 'sort',\n 'pageSize',\n 'loading',\n 'loadingRows',\n 'empty',\n 'plain',\n 'striped',\n 'stickyHeader',\n 'tableProps',\n ],\n emits: ['update:sort', 'sort-change', 'row-click'],\n },\n);\n","import { defineComponent, h, type DefineSetupFnComponent, type PropType } from 'vue';\nimport {\n ActionIcon,\n Button,\n useComputedColorScheme,\n useMantineColorScheme,\n type ActionIconProps,\n} from '@mantine-vue/core';\nimport { IconMoon, IconSun } from '@tabler/icons-vue';\n\nexport interface ThemeToggleProps extends ActionIconProps {\n /** `icon` = ActionIcon · `button` = botão \"Alternar tema\" (como no DS) @default 'icon' */\n as?: 'icon' | 'button';\n /** @default 'Alternar tema' */\n label?: string;\n}\n\n/** Alterna entre tema claro e escuro (persistido pelo JcProvider no localStorage). */\nexport const ThemeToggle = defineComponent({\n name: 'ThemeToggle',\n inheritAttrs: false,\n props: {\n as: { type: String as PropType<NonNullable<ThemeToggleProps['as']>>, default: 'icon' },\n label: { type: String, default: 'Alternar tema' },\n variant: { type: String as PropType<ActionIconProps['variant']>, default: undefined },\n color: { type: String as PropType<ActionIconProps['color']>, default: undefined },\n size: { type: [String, Number] as PropType<ActionIconProps['size']>, default: undefined },\n },\n setup(props, { attrs }) {\n const { setColorScheme } = useMantineColorScheme();\n const computed = useComputedColorScheme('light', { getInitialValueInEffect: true });\n const toggle = () => setColorScheme(computed.value === 'dark' ? 'light' : 'dark');\n\n return () => {\n const Icon = computed.value === 'dark' ? IconSun : IconMoon;\n\n if (props.as === 'button') {\n return h(\n Button as any,\n {\n variant: props.variant ?? 'outline',\n color: props.color,\n size: props.size ?? 'sm',\n leftSection: () => h(Icon, { size: 16 }),\n onClick: toggle,\n ...attrs,\n },\n () => props.label,\n );\n }\n\n return h(\n ActionIcon as any,\n {\n variant: props.variant ?? 'subtle',\n color: props.color,\n size: props.size ?? 'lg',\n onClick: toggle,\n 'aria-label': props.label,\n title: props.label,\n ...attrs,\n },\n () => h(Icon, { size: 18 }),\n );\n };\n },\n}) as unknown as DefineSetupFnComponent<ThemeToggleProps>;\n","/* @generated sincronizado de packages/ui/src/components/TokenSwatch/TokenSwatch.module.css — edite lá e rode `npm run sync -w @jcdecor/vue` */\n.swatch {\n width: 150px;\n border: 1px solid var(--ds-border-soft);\n border-radius: var(--ds-radius-sm);\n overflow: hidden;\n background: var(--ds-surface);\n padding: 0;\n text-align: left;\n font-family: inherit;\n color: inherit;\n cursor: pointer;\n transition: box-shadow 0.15s, transform 0.15s;\n}\n.swatch:hover {\n box-shadow: var(--ds-shadow-md);\n transform: translateY(-1px);\n}\n.color {\n height: 72px;\n}\n.info {\n padding: var(--sp-8) var(--sp-12);\n}\n.name {\n font-weight: 600;\n font-size: 13px;\n}\n.hex {\n font-size: 12px;\n color: var(--ds-text-3);\n font-variant-numeric: tabular-nums;\n}\n.ramp {\n display: flex;\n border-radius: var(--ds-radius-sm);\n overflow: hidden;\n border: 1px solid var(--ds-border-soft);\n}\n.step {\n flex: 1;\n height: 44px;\n display: flex;\n align-items: flex-end;\n justify-content: center;\n font-size: 10px;\n padding: 0 0 3px;\n border: 0;\n cursor: pointer;\n font-family: inherit;\n}\n","import { defineComponent, h, mergeProps, type ButtonHTMLAttributes, type DefineSetupFnComponent, type HTMLAttributes, type PropType } from 'vue';\nimport { luminance } from '@mantine-vue/core';\nimport { Tooltip } from '../../theme/themeDefaults';\nimport { useClipboard } from '@mantine-vue/hooks';\nimport classes from './TokenSwatch.module.css';\n\nexport interface TokenSwatchProps extends Omit<ButtonHTMLAttributes, 'value' | 'name'> {\n name: string;\n /** Cor (hex) exibida e copiada */\n value: string;\n /** Variável CSS correspondente (ex.: --dc-horizon) */\n cssVar?: string;\n /** O que copiar ao clicar @default 'value' */\n copy?: 'value' | 'cssVar';\n}\n\n/** Amostra de cor clicável (copia hex ou var CSS). */\nexport const TokenSwatch = defineComponent({\n name: 'TokenSwatch',\n inheritAttrs: false,\n props: {\n name: { type: String, required: true },\n value: { type: String, required: true },\n cssVar: { type: String, default: undefined },\n copy: { type: String as PropType<NonNullable<TokenSwatchProps['copy']>>, default: 'value' },\n },\n setup(props, { attrs }) {\n const clipboard = useClipboard({ timeout: 1200 });\n return () => {\n const text = props.copy === 'cssVar' && props.cssVar ? `var(${props.cssVar})` : props.value;\n return h(Tooltip as any, { label: clipboard.copied.value ? 'Copiado!' : `Copiar ${text}`, withArrow: true }, () =>\n h('button', mergeProps({ type: 'button', class: classes.swatch, onClick: () => clipboard.copy(text) }, attrs), [\n h('div', { class: classes.color, style: { background: props.value } }),\n h('div', { class: classes.info }, [\n h('div', { class: classes.name }, props.name),\n h('div', { class: classes.hex }, props.value),\n props.cssVar ? h('div', { class: classes.hex }, props.cssVar) : null,\n ]),\n ]),\n );\n };\n },\n}) as unknown as DefineSetupFnComponent<TokenSwatchProps>;\n\nexport interface ColorRampProps extends HTMLAttributes {\n steps: { label: string; value: string; derived?: boolean }[];\n}\n\n/** Rampa de cor horizontal (base → 50). Clique copia o hex. */\nexport const ColorRamp = defineComponent({\n name: 'ColorRamp',\n inheritAttrs: false,\n props: {\n steps: { type: Array as PropType<ColorRampProps['steps']>, required: true },\n },\n setup(props, { attrs }) {\n const clipboard = useClipboard({ timeout: 1200 });\n return () =>\n h(\n 'div',\n mergeProps({ class: classes.ramp }, attrs),\n props.steps.map((step) =>\n h(Tooltip as any, { key: step.label, label: clipboard.copied.value ? 'Copiado!' : step.value, withArrow: true }, () =>\n h(\n 'button',\n {\n type: 'button',\n class: classes.step,\n style: { background: step.value, color: luminance(step.value) > 0.3 ? 'var(--dc-obsidian)' : '#fff' },\n onClick: () => clipboard.copy(step.value),\n },\n `${step.label}${step.derived ? '*' : ''}`,\n ),\n ),\n ),\n );\n },\n}) as unknown as DefineSetupFnComponent<ColorRampProps>;\n","import { defineComponent, h, type DefineSetupFnComponent, type PropType } from 'vue';\nimport { Box, Group, Text, type BoxProps } from '@mantine-vue/core';\nimport { formatCurrency } from '../../utils/format';\n\nexport interface PriceTagProps extends BoxProps {\n /** Preço atual em reais */\n value: number;\n /** Preço \"de\" (riscado) */\n oldValue?: number;\n /** Parcelamento: `{ count: 10 }` → \"ou 10x de R$ 12,99 sem juros\" */\n installments?: { count: number; interestFree?: boolean };\n /** Desconto no Pix em % (ex.: 5) → \"R$ 94,05 no Pix\" */\n pixDiscount?: number;\n /** Unidade (ex.: \"/m²\", \"/rolo\") */\n unit?: string;\n /** @default 'md' */\n size?: 'sm' | 'md' | 'lg';\n}\n\nconst valueSize = { sm: 'var(--type-subheadline-lg)', md: 'var(--type-headline-sm)', lg: 'var(--type-headline-lg)' };\n\n/** Preço em BRL com preço antigo, parcelamento e desconto Pix. */\nexport const PriceTag = defineComponent({\n name: 'PriceTag',\n inheritAttrs: false,\n props: {\n value: { type: Number, required: true },\n oldValue: { type: Number, default: undefined },\n installments: { type: Object as PropType<PriceTagProps['installments']>, default: undefined },\n pixDiscount: { type: Number, default: undefined },\n unit: { type: String, default: undefined },\n size: { type: String as PropType<NonNullable<PriceTagProps['size']>>, default: 'md' },\n },\n setup(props, { attrs }) {\n return () => {\n const { value, oldValue, installments, pixDiscount, unit, size } = props;\n return h(Box as any, attrs, () => [\n oldValue !== undefined && oldValue > value\n ? h(\n Text as any,\n { fz: 'xs', c: 'var(--ds-text-3)', td: 'line-through', 'aria-label': `Preço anterior ${formatCurrency(oldValue)}` },\n () => formatCurrency(oldValue),\n )\n : null,\n h(Group as any, { gap: 4, align: 'baseline', wrap: 'nowrap' }, () => [\n h(\n Text as any,\n { component: 'span', fz: valueSize[size], fw: 700, lh: 1.2, c: 'var(--ds-primary)', style: { fontVariantNumeric: 'tabular-nums' } },\n () => formatCurrency(value),\n ),\n unit ? h(Text as any, { component: 'span', fz: 'xs', c: 'var(--ds-text-3)', fw: 500 }, () => unit) : null,\n ]),\n pixDiscount !== undefined && pixDiscount > 0\n ? h(\n Text as any,\n { fz: 'xs', fw: 600, c: 'var(--ds-tag-success-color)' },\n () => `${formatCurrency(value * (1 - pixDiscount / 100))} no Pix (${pixDiscount}% off)`,\n )\n : null,\n installments && installments.count > 1\n ? h(\n Text as any,\n { fz: 'xs', c: 'var(--ds-text-2)' },\n () =>\n `ou ${installments.count}x de ${formatCurrency(value / installments.count)}${installments.interestFree !== false ? ' sem juros' : ''}`,\n )\n : null,\n ]);\n };\n },\n}) as unknown as DefineSetupFnComponent<PriceTagProps>;\n","/* @generated sincronizado de packages/ui/src/components/ProductCard/ProductCard.module.css — edite lá e rode `npm run sync -w @jcdecor/vue` */\n.root {\n display: flex;\n flex-direction: column;\n height: 100%;\n transition: box-shadow 0.15s, transform 0.15s;\n}\n.root[data-interactive]:hover {\n box-shadow: var(--ds-shadow-md);\n transform: translateY(-2px);\n}\n.media {\n position: relative;\n margin: calc(var(--card-padding) * -1) calc(var(--card-padding) * -1) var(--sp-16);\n background: var(--ds-surface-2);\n aspect-ratio: var(--product-ratio, 1);\n overflow: hidden;\n}\n.media img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n transition: transform 0.3s;\n}\n.root[data-interactive]:hover .media img {\n transform: scale(1.03);\n}\n.badges {\n position: absolute;\n top: var(--sp-12);\n left: var(--sp-12);\n display: flex;\n gap: var(--sp-4);\n flex-wrap: wrap;\n}\n.favorite {\n position: absolute;\n top: var(--sp-8);\n right: var(--sp-8);\n background: var(--ds-surface);\n box-shadow: var(--ds-shadow-sm);\n}\n.category {\n font-size: var(--type-disclaimer);\n font-weight: 600;\n color: var(--ds-text-3);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n}\n.name {\n font-weight: 600;\n font-size: var(--type-subheadline-rg);\n line-height: 1.35;\n color: var(--ds-text);\n text-decoration: none;\n margin: var(--sp-4) 0 var(--sp-8);\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\na.name:hover {\n color: var(--ds-primary);\n}\n.price {\n margin-top: auto;\n}\n.action {\n margin-top: var(--sp-16);\n}\n","<script setup lang=\"ts\">\nimport { useAttrs, useSlots } from 'vue';\nimport { ActionIcon, Button, Group, Rating, Text, resolveNode, useProps, useStyles } from '@mantine-vue/core';\nimport { Card } from '../../theme/themeDefaults';\nimport { IconHeart, IconHeartFilled, IconShoppingCart } from '@tabler/icons-vue';\nimport { PriceTag } from '../PriceTag';\nimport { Tag } from '../Tag';\nimport { useListenerCheck } from '../../utils/vue';\nimport type { ProductCardEmits, ProductCardOwnProps, ProductCardSlots } from './ProductCard.types';\nimport classes from './ProductCard.module.css';\n\ndefineOptions({ name: 'ProductCard', inheritAttrs: false });\n\n// `undefined` explícito: os padrões vêm do useProps, e `favorite` ausente (≠ false) esconde o coração.\nconst rawProps = withDefaults(defineProps<ProductCardOwnProps>(), {\n href: undefined,\n category: undefined,\n oldPrice: undefined,\n installments: undefined,\n pixDiscount: undefined,\n unit: undefined,\n badges: undefined,\n showDiscount: undefined,\n rating: undefined,\n reviews: undefined,\n favorite: undefined,\n actionLabel: undefined,\n imageRatio: undefined,\n linkComponent: undefined,\n classNames: undefined,\n styles: undefined,\n vars: undefined,\n unstyled: undefined,\n});\ndefineSlots<ProductCardSlots>();\nconst emit = defineEmits<ProductCardEmits>();\n\nconst attrs = useAttrs();\nconst slots = useSlots();\nconst hasListener = useListenerCheck();\nconst props = useProps(\n 'ProductCard',\n { showDiscount: true, actionLabel: 'Comprar', imageRatio: 1, linkComponent: 'a' },\n rawProps,\n);\n\nconst getStyles = useStyles({\n name: 'ProductCard',\n classes,\n props,\n get className() { return attrs.class; },\n get style() { return attrs.style as any; },\n get classNames() { return props.classNames as any; },\n get styles() { return props.styles as any; },\n get vars() { return props.vars as any; },\n get unstyled() { return props.unstyled; },\n});\n\nconst discount = () =>\n props.oldPrice && props.oldPrice > props.price ? Math.round((1 - props.price / props.oldPrice) * 100) : 0;\n/** Equivalente a `onFavoriteChange` passado no React: `v-model:favorite`, `:favorite` ou `@update:favorite`. */\nconst showFavorite = () => props.favorite !== undefined || hasListener('update:favorite');\n/** Equivalente a `onAction` passado no React. */\nconst showAction = () => hasListener('action');\nconst linkProps = () => {\n const link = props.linkComponent ?? 'a';\n return props.href ? (link === 'a' ? { href: props.href } : { to: props.href, href: props.href }) : {};\n};\nconst nameComponent = () => (props.href ? (props.linkComponent ?? 'a') : 'div');\nconst renderBadges = () => [...(props.badges ?? []).map((badge) => resolveNode(badge)), slots.badges?.()];\n</script>\n\n<template>\n <Card v-bind=\"{ ...attrs, ...getStyles('root') }\" :mod=\"[{ interactive: Boolean(props.href || showAction()) }, (attrs as any).mod]\">\n <div v-bind=\"getStyles('media', { style: { '--product-ratio': String(props.imageRatio) } })\">\n <img :src=\"props.image\" :alt=\"props.name\" loading=\"lazy\" />\n <div v-bind=\"getStyles('badges')\">\n <Tag v-if=\"props.showDiscount && discount() > 0\" tone=\"error\" variant=\"filled\">-{{ discount() }}%</Tag>\n <component :is=\"renderBadges\" />\n </div>\n <ActionIcon\n v-if=\"showFavorite()\"\n v-bind=\"getStyles('favorite')\"\n variant=\"subtle\"\n :color=\"props.favorite ? 'danger' : 'obsidian'\"\n radius=\"xl\"\n :aria-label=\"props.favorite ? 'Remover dos favoritos' : 'Adicionar aos favoritos'\"\n :aria-pressed=\"Boolean(props.favorite)\"\n @click=\"emit('update:favorite', !props.favorite)\"\n >\n <IconHeartFilled v-if=\"props.favorite\" :size=\"18\" />\n <IconHeart v-else :size=\"18\" />\n </ActionIcon>\n </div>\n <div v-if=\"props.category\" v-bind=\"getStyles('category')\">{{ props.category }}</div>\n <component :is=\"nameComponent()\" v-bind=\"{ ...linkProps(), ...getStyles('name') }\">{{ props.name }}</component>\n <Group v-if=\"props.rating !== undefined\" :gap=\"6\" mb=\"xs\">\n <Rating :model-value=\"props.rating\" :fractions=\"2\" read-only size=\"xs\" color=\"electric.4\" />\n <Text v-if=\"props.reviews !== undefined\" fz=\"xs\" c=\"var(--ds-text-3)\">({{ props.reviews }})</Text>\n </Group>\n <PriceTag\n v-bind=\"getStyles('price')\"\n :value=\"props.price\"\n :old-value=\"props.oldPrice\"\n :installments=\"props.installments\"\n :pix-discount=\"props.pixDiscount\"\n :unit=\"props.unit\"\n />\n <Button v-if=\"showAction()\" v-bind=\"getStyles('action')\" full-width @click=\"emit('action', $event)\">\n <template #leftSection><IconShoppingCart :size=\"18\" /></template>\n {{ props.actionLabel }}\n </Button>\n </Card>\n</template>\n","<script setup lang=\"ts\">\nimport { useAttrs, useSlots } from 'vue';\nimport { ActionIcon, Button, Group, Rating, Text, resolveNode, useProps, useStyles } from '@mantine-vue/core';\nimport { Card } from '../../theme/themeDefaults';\nimport { IconHeart, IconHeartFilled, IconShoppingCart } from '@tabler/icons-vue';\nimport { PriceTag } from '../PriceTag';\nimport { Tag } from '../Tag';\nimport { useListenerCheck } from '../../utils/vue';\nimport type { ProductCardEmits, ProductCardOwnProps, ProductCardSlots } from './ProductCard.types';\nimport classes from './ProductCard.module.css';\n\ndefineOptions({ name: 'ProductCard', inheritAttrs: false });\n\n// `undefined` explícito: os padrões vêm do useProps, e `favorite` ausente (≠ false) esconde o coração.\nconst rawProps = withDefaults(defineProps<ProductCardOwnProps>(), {\n href: undefined,\n category: undefined,\n oldPrice: undefined,\n installments: undefined,\n pixDiscount: undefined,\n unit: undefined,\n badges: undefined,\n showDiscount: undefined,\n rating: undefined,\n reviews: undefined,\n favorite: undefined,\n actionLabel: undefined,\n imageRatio: undefined,\n linkComponent: undefined,\n classNames: undefined,\n styles: undefined,\n vars: undefined,\n unstyled: undefined,\n});\ndefineSlots<ProductCardSlots>();\nconst emit = defineEmits<ProductCardEmits>();\n\nconst attrs = useAttrs();\nconst slots = useSlots();\nconst hasListener = useListenerCheck();\nconst props = useProps(\n 'ProductCard',\n { showDiscount: true, actionLabel: 'Comprar', imageRatio: 1, linkComponent: 'a' },\n rawProps,\n);\n\nconst getStyles = useStyles({\n name: 'ProductCard',\n classes,\n props,\n get className() { return attrs.class; },\n get style() { return attrs.style as any; },\n get classNames() { return props.classNames as any; },\n get styles() { return props.styles as any; },\n get vars() { return props.vars as any; },\n get unstyled() { return props.unstyled; },\n});\n\nconst discount = () =>\n props.oldPrice && props.oldPrice > props.price ? Math.round((1 - props.price / props.oldPrice) * 100) : 0;\n/** Equivalente a `onFavoriteChange` passado no React: `v-model:favorite`, `:favorite` ou `@update:favorite`. */\nconst showFavorite = () => props.favorite !== undefined || hasListener('update:favorite');\n/** Equivalente a `onAction` passado no React. */\nconst showAction = () => hasListener('action');\nconst linkProps = () => {\n const link = props.linkComponent ?? 'a';\n return props.href ? (link === 'a' ? { href: props.href } : { to: props.href, href: props.href }) : {};\n};\nconst nameComponent = () => (props.href ? (props.linkComponent ?? 'a') : 'div');\nconst renderBadges = () => [...(props.badges ?? []).map((badge) => resolveNode(badge)), slots.badges?.()];\n</script>\n\n<template>\n <Card v-bind=\"{ ...attrs, ...getStyles('root') }\" :mod=\"[{ interactive: Boolean(props.href || showAction()) }, (attrs as any).mod]\">\n <div v-bind=\"getStyles('media', { style: { '--product-ratio': String(props.imageRatio) } })\">\n <img :src=\"props.image\" :alt=\"props.name\" loading=\"lazy\" />\n <div v-bind=\"getStyles('badges')\">\n <Tag v-if=\"props.showDiscount && discount() > 0\" tone=\"error\" variant=\"filled\">-{{ discount() }}%</Tag>\n <component :is=\"renderBadges\" />\n </div>\n <ActionIcon\n v-if=\"showFavorite()\"\n v-bind=\"getStyles('favorite')\"\n variant=\"subtle\"\n :color=\"props.favorite ? 'danger' : 'obsidian'\"\n radius=\"xl\"\n :aria-label=\"props.favorite ? 'Remover dos favoritos' : 'Adicionar aos favoritos'\"\n :aria-pressed=\"Boolean(props.favorite)\"\n @click=\"emit('update:favorite', !props.favorite)\"\n >\n <IconHeartFilled v-if=\"props.favorite\" :size=\"18\" />\n <IconHeart v-else :size=\"18\" />\n </ActionIcon>\n </div>\n <div v-if=\"props.category\" v-bind=\"getStyles('category')\">{{ props.category }}</div>\n <component :is=\"nameComponent()\" v-bind=\"{ ...linkProps(), ...getStyles('name') }\">{{ props.name }}</component>\n <Group v-if=\"props.rating !== undefined\" :gap=\"6\" mb=\"xs\">\n <Rating :model-value=\"props.rating\" :fractions=\"2\" read-only size=\"xs\" color=\"electric.4\" />\n <Text v-if=\"props.reviews !== undefined\" fz=\"xs\" c=\"var(--ds-text-3)\">({{ props.reviews }})</Text>\n </Group>\n <PriceTag\n v-bind=\"getStyles('price')\"\n :value=\"props.price\"\n :old-value=\"props.oldPrice\"\n :installments=\"props.installments\"\n :pix-discount=\"props.pixDiscount\"\n :unit=\"props.unit\"\n />\n <Button v-if=\"showAction()\" v-bind=\"getStyles('action')\" full-width @click=\"emit('action', $event)\">\n <template #leftSection><IconShoppingCart :size=\"18\" /></template>\n {{ props.actionLabel }}\n </Button>\n </Card>\n</template>\n","import { factory } from '@mantine-vue/core';\nimport ProductCardComponent from './ProductCard.vue';\nimport type { ProductCardFactory } from './ProductCard.types';\nimport classes from './ProductCard.module.css';\n\n/**\n * Card de produto do e-commerce: imagem, selos, nome, avaliação, preço e CTA.\n * `v-model:favorite` mostra o botão de favoritar; `@action` mostra o CTA.\n */\nexport const ProductCard = factory<ProductCardFactory>(ProductCardComponent, { classes });\n\nexport type {\n ProductCardEmits,\n ProductCardFactory,\n ProductCardOwnProps,\n ProductCardProps,\n ProductCardSlots,\n ProductCardStylesNames,\n} from './ProductCard.types';\n","import { defineComponent, h, type DefineSetupFnComponent, type SlotsType, type VNodeChild } from 'vue';\nimport { Box, Button, Group, Text, type BoxProps, type MantineNode } from '@mantine-vue/core';\nimport { useClipboard } from '@mantine-vue/hooks';\nimport { IconCheck, IconCopy, IconTicket } from '@tabler/icons-vue';\nimport { nodeProp, resolveContent } from '../../utils/vue';\n\nexport interface CouponCodeProps extends BoxProps {\n code: string;\n /** Texto do benefício (ex.: \"5% OFF na 1ª compra\"). Também aceita o slot `description` (o slot tem prioridade). */\n description?: MantineNode;\n /** @default 'Copiar' */\n copyLabel?: string;\n /** @default 'Copiado!' */\n copiedLabel?: string;\n}\n\nexport interface CouponCodeSlots {\n description?: () => VNodeChild;\n}\n\nexport type CouponCodeEmits = {\n /** Emitido ao clicar em copiar, com o código copiado */\n copy: (code: string) => void;\n};\n\n/** Cupom com borda tracejada e botão de copiar. Emite `copy` com o código. */\nexport const CouponCode = defineComponent({\n name: 'CouponCode',\n inheritAttrs: false,\n props: {\n code: { type: String, required: true },\n description: nodeProp,\n copyLabel: { type: String, default: 'Copiar' },\n copiedLabel: { type: String, default: 'Copiado!' },\n },\n emits: { copy: (_code: string) => true },\n setup(props, { attrs, slots, emit }) {\n const clipboard = useClipboard({ timeout: 1600 });\n return () => {\n const copied = clipboard.copied.value;\n const description = resolveContent(props.description, slots.description);\n return h(\n Box as any,\n {\n p: 'sm',\n style: {\n border: '2px dashed var(--ds-primary)',\n borderRadius: 'var(--ds-radius)',\n background: 'var(--ds-primary-soft)',\n },\n ...attrs,\n },\n () =>\n h(Group as any, { justify: 'space-between', gap: 'sm', wrap: 'nowrap' }, () => [\n h(Group as any, { gap: 'sm', wrap: 'nowrap', style: { minWidth: 0 } }, () => [\n h(IconTicket, { size: 22, color: 'var(--ds-primary)', style: { flexShrink: 0 } }),\n h('div', { style: { minWidth: 0 } }, [\n description !== undefined ? h(Text as any, { fz: 'xs', c: 'var(--ds-text-2)', fw: 500 }, () => description) : null,\n h(Text as any, { fw: 700, fz: 'lg', lts: '0.08em', c: 'var(--ds-primary)', ff: 'monospace' }, () => props.code),\n ]),\n ]),\n h(\n Button as any,\n {\n size: 'sm',\n variant: copied ? 'filled' : 'outline',\n color: copied ? 'evergreen' : undefined,\n leftSection: () => h(copied ? IconCheck : IconCopy, { size: 16 }),\n onClick: () => {\n clipboard.copy(props.code);\n emit('copy', props.code);\n },\n },\n () => (copied ? props.copiedLabel : props.copyLabel),\n ),\n ]),\n );\n };\n },\n}) as unknown as DefineSetupFnComponent<CouponCodeProps, CouponCodeEmits, SlotsType<CouponCodeSlots>>;\n","/* @generated sincronizado de packages/ui/src/components/TopNav/TopNav.module.css — edite lá e rode `npm run sync -w @jcdecor/vue` */\n.root {\n display: flex;\n align-items: center;\n gap: var(--sp-16);\n background: var(--dc-obsidian);\n color: #fff;\n padding: var(--sp-12) var(--sp-24);\n min-height: 56px;\n box-sizing: border-box;\n}\n.brand {\n font-weight: 700;\n font-size: var(--type-subheadline-lg);\n color: #fff;\n text-decoration: none;\n display: inline-flex;\n align-items: center;\n gap: var(--sp-8);\n white-space: nowrap;\n}\n.links {\n display: flex;\n align-items: center;\n gap: var(--sp-16);\n}\n.link {\n color: var(--dc-obsidian-300);\n text-decoration: none;\n font-size: var(--type-subheadline-sm);\n font-weight: 500;\n background: none;\n border: 0;\n padding: 0;\n cursor: pointer;\n font-family: inherit;\n transition: color 0.15s;\n}\n.link:hover,\n.link[data-active] {\n color: var(--dc-electric);\n}\n.right {\n margin-inline-start: auto;\n display: flex;\n align-items: center;\n gap: var(--sp-8);\n}\n.burger {\n --burger-color: #fff;\n}\n.mobileLinks {\n display: flex;\n flex-direction: column;\n gap: var(--sp-16);\n padding: var(--sp-16) var(--sp-24) var(--sp-20);\n background: var(--dc-obsidian);\n}\n@media (max-width: 47.99em) {\n .root[data-collapse] .links {\n display: none;\n }\n}\n@media (min-width: 48em) {\n .burger,\n .mobileLinks {\n display: none;\n }\n}\n","<script setup lang=\"ts\">\nimport { computed, h, useAttrs, useSlots, type Component, type VNodeChild } from 'vue';\nimport { Box, Burger, Collapse, resolveNode, useProps, useStyles, type MantineNode } from '@mantine-vue/core';\nimport { useDisclosure } from '@mantine-vue/hooks';\nimport { JcLogo } from '../../brand/Brand';\nimport type { TopNavFactory, TopNavLink, TopNavOwnProps, TopNavSlots } from './TopNav.types';\nimport classes from './TopNav.module.css';\n\ndefineOptions({ name: 'TopNav', inheritAttrs: false });\n\n// Tudo `undefined` aqui para que os defaults de `theme.components.TopNav` funcionem via useProps\nconst rawProps = withDefaults(defineProps<TopNavOwnProps>(), {\n brand: undefined,\n brandHref: undefined,\n links: undefined,\n linkComponent: undefined,\n rightSection: undefined,\n collapseOnMobile: undefined,\n classNames: undefined,\n styles: undefined,\n vars: undefined,\n unstyled: undefined,\n});\ndefineSlots<TopNavSlots>();\n\nconst slots = useSlots();\nconst attrs = useAttrs();\n\nconst props = useProps(\n 'TopNav',\n {\n brand: () => h(JcLogo, { variant: 'dark', size: 28 }),\n brandHref: '/',\n links: [],\n linkComponent: 'a',\n collapseOnMobile: true,\n },\n rawProps,\n);\n\nconst [opened, { toggle, close }] = useDisclosure(false);\n\n// Getters: classNames/styles/class/style continuam reativos depois do setup\nconst getStyles = useStyles<TopNavFactory>({\n name: 'TopNav',\n classes,\n props,\n get className() {\n return attrs.class;\n },\n get style() {\n return attrs.style as any;\n },\n get classNames() {\n return props.classNames as any;\n },\n get styles() {\n return props.styles as any;\n },\n get vars() {\n return props.vars as any;\n },\n get unstyled() {\n return props.unstyled;\n },\n});\n\n/** Renderiza um `MantineNode` (VNode, texto ou função) como componente estável. */\nconst RenderNode = (p: { node: VNodeChild }) => p.node;\nRenderNode.props = ['node'];\n\nconst linkComponent = computed<string | Component>(() => props.linkComponent ?? 'a');\nconst hrefProps = (href: string) => (linkComponent.value === 'a' ? { href } : { to: href, href });\n\nconst withChildren = (component: string | Component, children: VNodeChild) =>\n typeof component === 'string' ? children : { default: () => children };\n\nconst renderLinks = (onNavigate?: () => void) =>\n (props.links ?? []).map((link: TopNavLink, index: number) => {\n const isButton = !link.href;\n const component = isButton ? 'button' : linkComponent.value;\n const linkProps = isButton ? { type: 'button' } : hrefProps(link.href!);\n return h(\n component as any,\n {\n key: index,\n ...linkProps,\n ...getStyles('link'),\n 'data-active': link.active || undefined,\n 'aria-current': link.active ? 'page' : undefined,\n onClick: (event: MouseEvent) => {\n link.onClick?.(event);\n onNavigate?.();\n },\n },\n withChildren(component, resolveNode(link.label as MantineNode)) as any,\n );\n });\n\nconst brandNode = computed(() => resolveNode(props.brand, slots.brand));\nconst rightNode = computed(() => resolveNode(props.rightSection, slots.rightSection));\nconst brandComponent = computed(() => (props.brandHref === null ? 'span' : linkComponent.value));\nconst brandProps = computed(() => (props.brandHref === null ? {} : hrefProps(props.brandHref ?? '/')));\nconst withBurger = computed(() => !!props.collapseOnMobile && (props.links ?? []).length > 0);\nconst rootMod = computed(() => [{ collapse: props.collapseOnMobile }, (attrs as any).mod]);\n</script>\n\n<template>\n <header>\n <Box v-bind=\"{ ...attrs, ...getStyles('root') }\" :mod=\"rootMod\">\n <component :is=\"brandComponent\" v-bind=\"{ ...brandProps, ...getStyles('brand') }\">\n <RenderNode :node=\"brandNode\" />\n </component>\n <nav v-bind=\"getStyles('links')\" aria-label=\"Principal\">\n <RenderNode :node=\"renderLinks()\" />\n </nav>\n <div v-bind=\"getStyles('right')\">\n <RenderNode :node=\"rightNode\" />\n <Burger\n v-if=\"withBurger\"\n :opened=\"opened\"\n size=\"sm\"\n aria-label=\"Abrir menu\"\n v-bind=\"getStyles('burger')\"\n @click=\"toggle\"\n />\n </div>\n </Box>\n <Collapse v-if=\"withBurger\" :expanded=\"opened\">\n <nav v-bind=\"getStyles('mobileLinks')\" aria-label=\"Principal (mobile)\">\n <RenderNode :node=\"renderLinks(close)\" />\n </nav>\n </Collapse>\n </header>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, h, useAttrs, useSlots, type Component, type VNodeChild } from 'vue';\nimport { Box, Burger, Collapse, resolveNode, useProps, useStyles, type MantineNode } from '@mantine-vue/core';\nimport { useDisclosure } from '@mantine-vue/hooks';\nimport { JcLogo } from '../../brand/Brand';\nimport type { TopNavFactory, TopNavLink, TopNavOwnProps, TopNavSlots } from './TopNav.types';\nimport classes from './TopNav.module.css';\n\ndefineOptions({ name: 'TopNav', inheritAttrs: false });\n\n// Tudo `undefined` aqui para que os defaults de `theme.components.TopNav` funcionem via useProps\nconst rawProps = withDefaults(defineProps<TopNavOwnProps>(), {\n brand: undefined,\n brandHref: undefined,\n links: undefined,\n linkComponent: undefined,\n rightSection: undefined,\n collapseOnMobile: undefined,\n classNames: undefined,\n styles: undefined,\n vars: undefined,\n unstyled: undefined,\n});\ndefineSlots<TopNavSlots>();\n\nconst slots = useSlots();\nconst attrs = useAttrs();\n\nconst props = useProps(\n 'TopNav',\n {\n brand: () => h(JcLogo, { variant: 'dark', size: 28 }),\n brandHref: '/',\n links: [],\n linkComponent: 'a',\n collapseOnMobile: true,\n },\n rawProps,\n);\n\nconst [opened, { toggle, close }] = useDisclosure(false);\n\n// Getters: classNames/styles/class/style continuam reativos depois do setup\nconst getStyles = useStyles<TopNavFactory>({\n name: 'TopNav',\n classes,\n props,\n get className() {\n return attrs.class;\n },\n get style() {\n return attrs.style as any;\n },\n get classNames() {\n return props.classNames as any;\n },\n get styles() {\n return props.styles as any;\n },\n get vars() {\n return props.vars as any;\n },\n get unstyled() {\n return props.unstyled;\n },\n});\n\n/** Renderiza um `MantineNode` (VNode, texto ou função) como componente estável. */\nconst RenderNode = (p: { node: VNodeChild }) => p.node;\nRenderNode.props = ['node'];\n\nconst linkComponent = computed<string | Component>(() => props.linkComponent ?? 'a');\nconst hrefProps = (href: string) => (linkComponent.value === 'a' ? { href } : { to: href, href });\n\nconst withChildren = (component: string | Component, children: VNodeChild) =>\n typeof component === 'string' ? children : { default: () => children };\n\nconst renderLinks = (onNavigate?: () => void) =>\n (props.links ?? []).map((link: TopNavLink, index: number) => {\n const isButton = !link.href;\n const component = isButton ? 'button' : linkComponent.value;\n const linkProps = isButton ? { type: 'button' } : hrefProps(link.href!);\n return h(\n component as any,\n {\n key: index,\n ...linkProps,\n ...getStyles('link'),\n 'data-active': link.active || undefined,\n 'aria-current': link.active ? 'page' : undefined,\n onClick: (event: MouseEvent) => {\n link.onClick?.(event);\n onNavigate?.();\n },\n },\n withChildren(component, resolveNode(link.label as MantineNode)) as any,\n );\n });\n\nconst brandNode = computed(() => resolveNode(props.brand, slots.brand));\nconst rightNode = computed(() => resolveNode(props.rightSection, slots.rightSection));\nconst brandComponent = computed(() => (props.brandHref === null ? 'span' : linkComponent.value));\nconst brandProps = computed(() => (props.brandHref === null ? {} : hrefProps(props.brandHref ?? '/')));\nconst withBurger = computed(() => !!props.collapseOnMobile && (props.links ?? []).length > 0);\nconst rootMod = computed(() => [{ collapse: props.collapseOnMobile }, (attrs as any).mod]);\n</script>\n\n<template>\n <header>\n <Box v-bind=\"{ ...attrs, ...getStyles('root') }\" :mod=\"rootMod\">\n <component :is=\"brandComponent\" v-bind=\"{ ...brandProps, ...getStyles('brand') }\">\n <RenderNode :node=\"brandNode\" />\n </component>\n <nav v-bind=\"getStyles('links')\" aria-label=\"Principal\">\n <RenderNode :node=\"renderLinks()\" />\n </nav>\n <div v-bind=\"getStyles('right')\">\n <RenderNode :node=\"rightNode\" />\n <Burger\n v-if=\"withBurger\"\n :opened=\"opened\"\n size=\"sm\"\n aria-label=\"Abrir menu\"\n v-bind=\"getStyles('burger')\"\n @click=\"toggle\"\n />\n </div>\n </Box>\n <Collapse v-if=\"withBurger\" :expanded=\"opened\">\n <nav v-bind=\"getStyles('mobileLinks')\" aria-label=\"Principal (mobile)\">\n <RenderNode :node=\"renderLinks(close)\" />\n </nav>\n </Collapse>\n </header>\n</template>\n","import { factory } from '@mantine-vue/core';\nimport TopNavComponent from './TopNav.vue';\nimport type { TopNavFactory } from './TopNav.types';\nimport classes from './TopNav.module.css';\n\n/** Barra de navegação Obsidian dos painéis (ds-nav). */\nexport const TopNav = factory<TopNavFactory>(TopNavComponent, { classes });\n\nexport type { TopNavFactory, TopNavLink, TopNavOwnProps, TopNavProps, TopNavSlots, TopNavStylesNames } from './TopNav.types';\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["t","classes","dropdown","header","footer","classes","Cascader","classes","Card","NumberFormatter","RollingNumber","Timeline","classes","label","description","classes","NativeSelect","CheckboxIndicator","classes","classes","burger","classes","classes","Tooltip","FloatingWindow","brand","title","classes","Table","typography","brand","typography","toneColor","Text","varsResolver","root","_unref","_openBlock","_createBlock","_mergeProps","_withCtx","_createElementVNode","_normalizeProps","_guardReactiveProps","_resolveDynamicComponent","_renderSlot","_createElementBlock","_createCommentVNode","_sfc_main","PromoBannerComponent","root","kicker","title","body","actions","_hoisted_1","_openBlock","_createBlock","_unref","_normalizeProps","_guardReactiveProps","_withCtx","_createElementBlock","_mergeProps","_normalizeStyle","_resolveDynamicComponent","_createCommentVNode","_sfc_main","ContentCardComponent","varsResolver","root","header","icon","footer","_hoisted_1","_openBlock","_createBlock","_unref","_normalizeProps","_guardReactiveProps","_withCtx","_createElementVNode","_resolveDynamicComponent","_createElementBlock","_mergeProps","_createCommentVNode","_createTextVNode","_toDisplayString","_sfc_main","KpiCardComponent","root","_openBlock","_createBlock","_unref","_normalizeProps","_guardReactiveProps","_withCtx","_mergeProps","_createVNode","_createCommentVNode","_createElementVNode","_createElementBlock","_sfc_main","PageHeaderComponent","classes","name","classes","root","_openBlock","_createBlock","_unref","_mergeProps","_withCtx","_createElementVNode","_normalizeProps","_guardReactiveProps","_createTextVNode","_toDisplayString","_createCommentVNode","_resolveDynamicComponent","_createElementBlock","_createVNode","_sfc_main","ProductCardComponent","_openBlock","_createElementBlock","_createVNode","_unref","_mergeProps","_withCtx","_createBlock","_resolveDynamicComponent","_normalizeProps","_guardReactiveProps","_createElementVNode","_createCommentVNode","_sfc_main","TopNavComponent","Timeline","Combobox","withThemeDefaults","MultiSelect","NumberInput","PillsInput","TagsInput","Table","CheckboxIndicator","Select","Card","FileInput","RollingNumber","Cascader","FloatingWindow","Autocomplete","NumberFormatter","Tooltip","TreeSelect","feedback","spacing","tokens","ramps","chartColors","fontFamily","typography$1","chartPalette","grid","brand$1","semantic","jcColors","formatNumber","Disclaimer","Kicker","Subheadline","formatDate","Display","formatCompact","formatPercent","formatCurrency","formatTime","LOCALE","Headline","SpartanHelmet","greekFramePaths","JcLogoAlt","logoPaths","GreekFrame","altLogoPaths","JcLogo","collaboratorPaths","Collaborator","spartanPaths","Card$1","Cascader$1","CheckboxIndicator$1","FloatingWindow$1","NativeSelect$1","NumberFormatter$1","RollingNumber$1","Table$1","Timeline$1","Tooltip$1","MantineTransition","Text$1","LIGHT_FAMILIES","jcVariantColorResolver","input","colorName","theme","parsed","parseThemeColor","family","variant","defaultVariantColorsResolver","base","light","isPrimary","tone","themed","isSize","size","control","overlayProps","buttons_module_default","buttonsComponents","Button","props","c","ActionIcon","CloseButton","combobox_module_default","COMBOBOX_INPUTS","dropdownClassNames","classNamesByComponent","comboboxComponents","name","classNames","Pill","dataDisplay_module_default","dataDisplayComponents","Accordion","Avatar","BackgroundImage","Badge","DataList","Image","Indicator","Kbd","Spoiler","ThemeIcon","feedback_module_default","feedbackComponents","Notification","Alert","Loader","Progress","RingProgress","SemiCircleProgress","Skeleton","EmptyState","inputs_module_default","inputDefaults","colorSliderClassNames","sliderClassNames","inputsComponents","Input","InputWrapper","Checkbox","CheckboxCard","Radio","RadioIndicator","RadioCard","Switch","Chip","SegmentedControl","Fieldset","PinInput","Slider","RangeSlider","AngleSlider","Rating","ColorPicker","AlphaSlider","HueSlider","layout_module_default","layoutComponents","Container","Splitter","misc_module_default","miscComponents","Paper","Divider","ScrollArea","navigation_module_default","navigationComponents","Tabs","Anchor","Burger","NavLink","Pagination","Stepper","TableOfContents","Tree","overlays_module_default","menuClassNames","overlaysComponents","Menu","Menubar","Popover","HoverCard","Modal","Drawer","Dialog","ActionBar","Overlay","LoadingOverlay","typography_module_default","YELLOWS","typographyComponents","Blockquote","Code","List","Mark","yellow","color","getThemeColor","Title","Typography","jcComponents","t","jcTheme","kebab","s","schemeVars","staticVars","vars","step","hex","value","tagVars","lightColorVars","chartVars","colors","i","jcCssVariablesResolver","COLOR_SCHEME_STORAGE_KEY","isScheme","readStoredScheme","key","ColorSchemePersistence","defineComponent","useMantineColorScheme","watch","colorScheme","JcProvider","computed","deepMerge","stored","h","MantineProvider","attrs","slots","toneColor$1","toneIcon","IconInfoCircle","IconCheck","IconAlertTriangle","IconX","Tag","Icon","hasCustom","leftSection","hasContent","node","child","isVNode","Comment","Fragment","resolveContent","resolveNode","prop","slot","useListenerCheck","instance","getCurrentInstance","toHandlerKey","event","camelize","nodeProp","palette","varsResolver$2","createVarsResolver","radius","getRadius","PromoBanner_module_default","PromoBanner","factory","__emit","rawProps","__props","emit","useAttrs","useSlots","useProps","open","setOpen","useUncontrolled","getStyles","useStyles","icon","highlight","close","unref","openBlock","createBlock","Box","mergeProps","withCtx","createElementVNode","normalizeProps","guardReactiveProps","resolveDynamicComponent","renderSlot","_ctx","createElementBlock","createCommentVNode","ContentCard_module_default","_hoisted_1$2","ContentCard","kicker","title","actions","body","imageUrl","imageNode","normalizeStyle","getDeltaTone","delta","invert","toneColor","varsResolver$1","invertDelta","colorValue","KpiCard_module_default","_hoisted_1$1","_hoisted_2","KpiCard_default","label","deltaLabel","chart","arrowIcon","IconMinus","IconArrowUpRight","IconArrowDownRight","createTextVNode","toDisplayString","KpiGroup","SimpleGrid","KpiCard","varsResolver","iconSize","rem","PageHeader_module_default","PageHeader","RenderNode","p","linkComponent","description","rootAttrs","_class","_style","rest","crumbNode","crumb","index","Breadcrumbs","createVNode","DataTable_module_default","columnId","column","compare","a","b","DataTable","sort","setSortValue","next","page","ref","setSort","toggleSort","current","sorted","getValue","row","result","hasListener","loadingRows","currentSort","total","totalPages","pageSize","currentPage","visible","clickable","header","TableThead","TableTr","columns","id","isSorted","SortIcon","IconArrowUp","IconArrowDown","IconArrowsSort","TableTh","loading","TableTd","empty","IconDatabaseOff","cellSlot","raw","content","plain","tableProps","TableTbody","ThemeToggle","useComputedColorScheme","toggle","setColorScheme","IconSun","IconMoon","TokenSwatch_module_default","TokenSwatch","clipboard","useClipboard","text","ColorRamp","luminance","valueSize","PriceTag","oldValue","Text","Group","unit","pixDiscount","installments","ProductCard_module_default","_hoisted_1","ProductCard","discount","showFavorite","showAction","linkProps","link","nameComponent","renderBadges","badge","_cache","IconHeartFilled","IconHeart","$event","IconShoppingCart","CouponCode","copied","IconTicket","IconCopy","TopNav_module_default","TopNav","opened","useDisclosure","hrefProps","href","withChildren","component","children","renderLinks","isButton","hasLabel","onNavigate","brandNode","rightNode","brandComponent","brandProps","withBurger","rootMod","Collapse","NativeSelect"],"sources":["../src/theme/variantColorResolver.ts","../src/theme/components/types.ts","../src/theme/controls.ts","../src/theme/components/buttons.module.css","../src/theme/components/buttons.ts","../src/theme/components/combobox.module.css","../src/theme/components/combobox.ts","../src/theme/components/dataDisplay.module.css","../src/theme/components/dataDisplay.ts","../src/theme/components/feedback.module.css","../src/theme/components/feedback.ts","../src/theme/components/inputs.module.css","../src/theme/components/inputs.ts","../src/theme/components/layout.module.css","../src/theme/components/layout.ts","../src/theme/components/misc.module.css","../src/theme/components/misc.ts","../src/theme/components/navigation.module.css","../src/theme/components/navigation.ts","../src/theme/components/overlays.module.css","../src/theme/components/overlays.ts","../src/theme/components/typography.module.css","../src/theme/components/typography.ts","../src/theme/components/index.ts","../src/theme/theme.ts","../src/theme/cssVariablesResolver.ts","../src/provider/JcProvider.ts","../src/components/Tag/Tag.ts","../src/utils/vue.ts","../src/components/PromoBanner/PromoBanner.vars.ts","../src/components/PromoBanner/PromoBanner.module.css","../src/components/PromoBanner/PromoBanner.vue","../src/components/PromoBanner/PromoBanner.vue","../src/components/PromoBanner/PromoBanner.ts","../src/components/ContentCard/ContentCard.module.css","../src/components/ContentCard/ContentCard.vue","../src/components/ContentCard/ContentCard.vue","../src/components/ContentCard/ContentCard.ts","../src/components/KpiCard/KpiCard.vars.ts","../src/components/KpiCard/KpiCard.module.css","../src/components/KpiCard/KpiCard.vue","../src/components/KpiCard/KpiCard.vue","../src/components/KpiCard/KpiGroup.ts","../src/components/KpiCard/KpiCard.ts","../src/components/PageHeader/PageHeader.vars.ts","../src/components/PageHeader/PageHeader.module.css","../src/components/PageHeader/PageHeader.vue","../src/components/PageHeader/PageHeader.vue","../src/components/PageHeader/PageHeader.ts","../src/components/DataTable/DataTable.module.css","../src/components/DataTable/DataTable.ts","../src/components/ThemeToggle/ThemeToggle.ts","../src/components/TokenSwatch/TokenSwatch.module.css","../src/components/TokenSwatch/TokenSwatch.ts","../src/components/PriceTag/PriceTag.ts","../src/components/ProductCard/ProductCard.module.css","../src/components/ProductCard/ProductCard.vue","../src/components/ProductCard/ProductCard.vue","../src/components/ProductCard/ProductCard.ts","../src/components/CouponCode/CouponCode.ts","../src/components/TopNav/TopNav.module.css","../src/components/TopNav/TopNav.vue","../src/components/TopNav/TopNav.vue","../src/components/TopNav/TopNav.ts"],"sourcesContent":["import {\n defaultVariantColorsResolver,\n parseThemeColor,\n type VariantColorsResolver,\n} from '@mantine-vue/core';\n\n/** Cores de \"tag\" (variante light) por família — variáveis definidas no cssVariablesResolver. */\nconst LIGHT_FAMILIES: Record<string, string> = {\n horizon: 'primary',\n blue: 'primary',\n evergreen: 'success',\n green: 'success',\n teal: 'success',\n electric: 'warn',\n yellow: 'warn',\n danger: 'error',\n red: 'error',\n obsidian: 'neutral',\n gray: 'neutral',\n dark: 'neutral',\n};\n\n/**\n * Resolver de variantes da marca:\n * - `accent` → botão Destaque (fundo Electric, texto Obsidian)\n * - `outline` → hover usa o fundo suave da própria cor (ds-btn-secondary)\n * - `subtle` sem cor → Ghost (texto-2, hover surface-2)\n * - `light` → selos/tags com as cores semânticas do ds.css\n */\nexport const jcVariantColorResolver: VariantColorsResolver = (input) => {\n const { variant, theme } = input;\n const colorName = input.color ?? theme.primaryColor;\n const parsed = parseThemeColor({ color: colorName, theme });\n const family = parsed.isThemeColor ? parsed.color : undefined;\n\n if (variant === 'accent') {\n return {\n background: 'var(--mantine-color-electric-3)',\n hover: 'color-mix(in oklch, var(--mantine-color-electric-3), var(--mantine-color-electric-4) 40%)',\n color: 'var(--mantine-color-obsidian-6)',\n hoverColor: 'var(--mantine-color-obsidian-6)',\n border: '1px solid transparent',\n };\n }\n\n // Electric \"cheio\" = amarelo da marca (tom 300) com texto navy, não o âmbar do tom 600.\n if (variant === 'filled' && (family === 'electric' || family === 'yellow') && parsed.shade === undefined) {\n return {\n background: 'var(--mantine-color-electric-3)',\n hover: 'color-mix(in oklch, var(--mantine-color-electric-3), var(--mantine-color-electric-4) 40%)',\n color: 'var(--mantine-color-obsidian-6)',\n hoverColor: 'var(--mantine-color-obsidian-6)',\n border: '1px solid transparent',\n };\n }\n\n // Filled em qualquer cor do tema: o Mantine calcula o contraste pelo tom do tema CLARO mesmo no escuro\n // (texto branco sobre o tom 400 = 2,6:1). --jc-on-filled é branco no claro e navy no escuro (≥ 4,6:1).\n if (variant === 'filled' && family && parsed.shade === undefined) {\n const base = defaultVariantColorsResolver(input);\n return { ...base, color: 'var(--jc-on-filled)', hoverColor: 'var(--jc-on-filled)' };\n }\n\n if (variant === 'outline') {\n const base = defaultVariantColorsResolver(input);\n const light = defaultVariantColorsResolver({ ...input, variant: 'light' });\n const isPrimary = !input.color || family === theme.primaryColor;\n return {\n ...base,\n hover: isPrimary ? 'var(--ds-primary-soft)' : light.background,\n color: isPrimary ? 'var(--ds-primary)' : base.color,\n border: isPrimary ? '1px solid var(--ds-primary)' : base.border,\n };\n }\n\n if (variant === 'subtle' && !input.color) {\n return {\n background: 'transparent',\n hover: 'var(--ds-surface-2)',\n color: 'var(--ds-text-2)',\n hoverColor: 'var(--ds-text)',\n border: '1px solid transparent',\n };\n }\n\n if (variant === 'light' && family && LIGHT_FAMILIES[family]) {\n const tone = LIGHT_FAMILIES[family];\n return {\n background: `var(--ds-tag-${tone}-bg)`,\n hover: `var(--ds-tag-${tone}-hover)`,\n color: `var(--ds-tag-${tone}-color)`,\n border: '1px solid transparent',\n };\n }\n\n return defaultVariantColorsResolver(input);\n};\n","import type { MantineThemeComponent } from '@mantine-vue/core';\n\n/** `theme.components` do Mantine Vue (o pacote não exporta um tipo nomeado como o `MantineThemeComponents` do React). */\nexport type ThemeComponents = Record<string, MantineThemeComponent>;\n\n/**\n * Equivalente tipado de `Component.extend(input)`. No Mantine Vue 3.5 vários componentes\n * (Accordion, Cascader, SegmentedControl…) não têm `extend` em runtime;\n * como `extend` é só identidade, usamos o tipo dele quando existe e devolvemos o próprio input.\n */\nexport function themed<C>(\n _component: C,\n input: C extends { extend: (input: infer Input) => unknown } ? Input : MantineThemeComponent,\n): MantineThemeComponent {\n return input as MantineThemeComponent;\n}\n","import type { MantineSize } from '@mantine-vue/core';\nimport { typography as t } from './tokens';\n\nexport const isSize = (size: unknown): size is MantineSize =>\n size === 'xs' || size === 'sm' || size === 'md' || size === 'lg' || size === 'xl';\n\n/**\n * Alturas dos controles em passos de 8px (alvo de toque ≥ 40px no md; 48px no lg para mobile/checkout).\n * Botões usam 14px/600; campos usam 16px (evita zoom automático no iOS e melhora leitura).\n */\nexport const control = {\n xs: { height: '28px', px: '10px', fz: '12px', inputFz: '12px' },\n sm: { height: '32px', px: '12px', fz: '13px', inputFz: '14px' },\n md: { height: '40px', px: '16px', fz: t.button.size, inputFz: '16px' },\n lg: { height: '48px', px: '20px', fz: '16px', inputFz: '16px' },\n xl: { height: '56px', px: '24px', fz: '18px', inputFz: '18px' },\n} as const;\n\n/** Overlay padrão de modais/drawers: navy da marca. */\nexport const overlayProps = { backgroundOpacity: 0.5, blur: 2, color: '#08154B' } as const;\n","/* @generated sincronizado de packages/ui/src/theme/components/buttons.module.css — edite lá e rode `npm run sync -w @jcdecor/vue` */\n/* Buttons — Button, ActionIcon, CloseButton, CopyButton, FileButton, UnstyledButton */\n.button {\n font-weight: 600;\n line-height: 1.5;\n transition: background-color 0.15s, border-color 0.15s, color 0.15s, box-shadow 0.15s;\n}\n.button:where(:disabled:not([data-loading]), [data-disabled]:not([data-loading])) {\n background: var(--button-bg, var(--mantine-primary-color-filled));\n color: var(--button-color, var(--mantine-color-white));\n border: var(--button-bd, 1px solid transparent);\n opacity: 0.45;\n}\n\n/* ActionIcon: tamanhos em passos de 4/8px; `input-*` igual às alturas dos campos da marca */\n.actionIcon {\n --ai-size-xs: 24px;\n --ai-size-sm: 28px;\n --ai-size-md: 32px;\n --ai-size-lg: 40px;\n --ai-size-xl: 48px;\n --ai-size-input-xs: 28px;\n --ai-size-input-sm: 32px;\n --ai-size-input-md: 40px;\n --ai-size-input-lg: 48px;\n --ai-size-input-xl: 56px;\n transition: background-color 0.15s, border-color 0.15s, color 0.15s;\n}\n/* Desabilitado como no Button: mantém a cor da variante, 45% de opacidade */\n.actionIcon:where(:disabled:not([data-loading]), [data-disabled]:not([data-loading])) {\n background: var(--ai-bg);\n color: var(--ai-color);\n border: var(--ai-bd);\n opacity: 0.45;\n}\n.actionIcon:where([data-variant='default']) {\n border-color: var(--ds-border-soft);\n}\n\n/* CloseButton: ícone texto-2; hover translúcido (funciona sobre surface, primary-soft, alertas…) */\n.closeButton {\n color: var(--ds-text-2);\n transition: background-color 0.15s, color 0.15s;\n}\n@media (hover: hover) {\n .closeButton:where(:not([data-disabled], :disabled)):hover {\n color: var(--ds-text);\n }\n .closeButton:where([data-variant='subtle'], :not([data-variant])):where(:not([data-disabled], :disabled)):hover {\n background-color: color-mix(in srgb, var(--ds-text) 8%, transparent);\n }\n}\n.closeButton:focus-visible {\n outline: 2px solid var(--ds-primary);\n outline-offset: 1px;\n}\n","import { themed, type ThemeComponents } from './types';\nimport { ActionIcon, Button, CloseButton, type MantineSize } from '@mantine-vue/core';\nimport { control, isSize } from '../controls';\nimport classes from './buttons.module.css';\n\nexport const buttonsComponents: ThemeComponents = {\n Button: themed(Button, {\n classNames: { root: classes.button },\n vars: (_theme, props) => {\n if (!isSize(props.size ?? 'md')) return { root: {} };\n const c = control[(props.size ?? 'md') as MantineSize];\n return { root: { '--button-height': c.height, '--button-padding-x': c.px, '--button-fz': c.fz } };\n },\n }),\n ActionIcon: themed(ActionIcon, { defaultProps: { variant: 'subtle' }, classNames: { root: classes.actionIcon } }),\n CloseButton: themed(CloseButton, { classNames: { root: classes.closeButton } }),\n};\n","/* @generated sincronizado de packages/ui/src/theme/components/combobox.module.css — edite lá e rode `npm run sync -w @jcdecor/vue` */\n/* Combobox — Select, MultiSelect, Autocomplete, TagsInput, Pill, Cascader, TreeSelect… */\n\n/* Dropdown: mesma superfície dos popovers da marca (também no escuro) */\n.dropdown {\n background-color: var(--ds-surface);\n border-color: var(--ds-border-soft);\n box-shadow: var(--ds-shadow-md);\n}\n\n/*\n * Opções\n * - hover / navegação por teclado ([data-combobox-selected]) → surface-2 (no Mantine: azul sólido + branco)\n * - opção marcada ([data-combobox-active] / [data-checked]) → primary-soft + texto primary\n */\n.option {\n border-radius: var(--ds-radius-sm);\n color: var(--ds-text);\n transition: background-color 0.1s, color 0.1s;\n}\n.option:where([data-combobox-selected]),\n.option:where(:not([data-combobox-disabled])):hover {\n background-color: var(--ds-surface-2);\n color: var(--ds-text);\n}\n.option:where([data-combobox-active], [data-checked]) {\n background-color: var(--ds-primary-soft);\n color: var(--ds-primary);\n font-weight: 500;\n}\n.option:where([data-combobox-active], [data-checked]):where([data-combobox-selected], :hover) {\n background-color: var(--ds-tag-primary-hover);\n color: var(--ds-primary);\n}\n/* Seta de expandir do TreeSelect: não fica branca na opção navegada */\n.option:where([data-combobox-selected]) :where([data-expanded], [role='button']) {\n color: var(--ds-text-3);\n}\n\n/* Rótulo de grupo: caption 600 em texto-3, divisor suave */\n.groupLabel {\n color: var(--ds-text-3);\n font-size: var(--type-disclaimer);\n font-weight: 600;\n letter-spacing: 0.01em;\n}\n.groupLabel::after {\n background-color: var(--ds-border-soft);\n}\n\n.empty {\n color: var(--ds-text-3);\n}\n\n/* Busca, cabeçalho e rodapé: divisores suaves e fundo da superfície */\n.search,\n.search:focus {\n background-color: var(--ds-surface);\n border-color: var(--ds-border-soft);\n}\n.header,\n.footer {\n border-color: var(--ds-border-soft);\n color: var(--ds-text-2);\n}\n\n/* Pills (MultiSelect, TagsInput, TreeSelect, Pill) — tag neutra da marca */\n.pill {\n background-color: var(--ds-tag-neutral-bg);\n color: var(--ds-tag-neutral-color);\n font-weight: 500;\n}\n.pill:where([data-variant='contrast']) {\n background-color: var(--ds-tag-primary-bg);\n color: var(--ds-tag-primary-color);\n}\n.pill:where([data-disabled], :has(button:disabled)) {\n opacity: 0.6;\n}\n.pillRemove {\n color: inherit;\n}\n.pillRemove:where(:not(:disabled)):hover {\n background-color: var(--ds-tag-neutral-hover);\n}\n.pill:where([data-variant='contrast']) .pillRemove:where(:not(:disabled)):hover {\n background-color: var(--ds-tag-primary-hover);\n}\n\n/* Cascader: coluna em navegação em primary-soft (não azul sólido), trilha em surface-2 */\n.cascaderColumn {\n border-inline-end-color: var(--ds-border-soft);\n}\n.cascaderColumn:where([data-last]) {\n border-inline-end-color: transparent;\n}\n.cascaderOption {\n border-radius: var(--ds-radius-sm);\n color: var(--ds-text);\n}\n.cascaderOption:where(:not([data-disabled], [data-active])):hover,\n.cascaderOption:where([data-in-path]) {\n background-color: var(--ds-surface-2);\n}\n.cascaderOption:where([data-active]),\n.cascaderOption:where([data-active]):hover {\n background-color: var(--ds-primary-soft);\n color: var(--ds-primary);\n font-weight: 500;\n}\n.cascaderOption:where([data-selected]:not([data-active])) {\n color: var(--ds-primary);\n font-weight: 500;\n}\n.cascaderOverflow {\n color: var(--ds-text-3);\n border-inline-end-color: var(--ds-border-soft);\n}\n.cascaderOverflow:hover {\n background-color: var(--ds-surface-2);\n}\n","import { themed, type ThemeComponents } from './types';\nimport { Cascader, Pill } from '@mantine-vue/core';\nimport classes from './combobox.module.css';\n\n/** Campos baseados em Combobox: tamanho md por padrão (o Mantine 9 usa sm). */\nconst COMBOBOX_INPUTS = ['Select', 'MultiSelect', 'Autocomplete', 'TagsInput', 'PillsInput', 'Cascader', 'TreeSelect', 'Combobox'];\n\n/** Partes do dropdown comuns a todos os componentes \"combobox-like\". */\nconst dropdownClassNames = {\n dropdown: classes.dropdown,\n option: classes.option,\n groupLabel: classes.groupLabel,\n empty: classes.empty,\n};\n\n/**\n * Cada componente resolve o tema pelo próprio nome (`__staticSelector`), por isso as classes\n * são repetidas em Select, MultiSelect, … em vez de só em Combobox.\n */\nconst classNamesByComponent: Record<string, Record<string, string>> = {\n Combobox: { ...dropdownClassNames, search: classes.search, header: classes.header, footer: classes.footer },\n ComboboxPopover: { ...dropdownClassNames, search: classes.search },\n Select: dropdownClassNames,\n Autocomplete: dropdownClassNames,\n MultiSelect: { ...dropdownClassNames, pill: classes.pill },\n TagsInput: { ...dropdownClassNames, pill: classes.pill },\n TreeSelect: { ...dropdownClassNames, pill: classes.pill },\n};\n\nexport const comboboxComponents: ThemeComponents = {\n ...Object.fromEntries(COMBOBOX_INPUTS.map((name) => [name, { defaultProps: { size: 'md' } }])),\n ...Object.fromEntries(\n Object.entries(classNamesByComponent).map(([name, classNames]) => [\n name,\n { defaultProps: COMBOBOX_INPUTS.includes(name) ? { size: 'md' } : {}, classNames },\n ]),\n ),\n Cascader: themed(Cascader, {\n defaultProps: { size: 'md' },\n classNames: {\n ...dropdownClassNames,\n column: classes.cascaderColumn,\n columnOption: classes.cascaderOption,\n flatOption: classes.option,\n columnsOverflow: classes.cascaderOverflow,\n },\n }),\n Pill: themed(Pill, { classNames: { root: classes.pill, remove: classes.pillRemove } }),\n};\n","/* @generated sincronizado de packages/ui/src/theme/components/dataDisplay.module.css — edite lá e rode `npm run sync -w @jcdecor/vue` */\n/* Data display — Accordion, Avatar, Badge, Card, DataList, Indicator, Kbd, Spoiler, Timeline… */\n.badge {\n font-weight: 600;\n text-transform: none;\n letter-spacing: 0;\n}\n\n/* Accordion: divisores suaves, rótulo 600, chevron em texto-3 */\n.accordionItem {\n --item-border-color: var(--ds-border-soft);\n --item-filled-color: var(--ds-surface-2);\n}\n.accordionItem[data-active]:where([data-variant='separated']) {\n background-color: var(--ds-surface);\n}\n.accordionControl {\n color: var(--ds-text);\n}\n@media (hover: hover) {\n .accordionControl:where(:not(:disabled, [data-disabled])):hover {\n background-color: var(--ds-surface-2);\n }\n}\n.accordionLabel {\n font-weight: 600;\n font-size: var(--type-subheadline-rg);\n}\n.accordionChevron {\n color: var(--ds-text-3);\n}\n.accordionContent {\n color: var(--ds-text-2);\n font-size: var(--type-subheadline-sm);\n line-height: 1.6;\n}\n\n/* Avatar.Group: o anel acompanha a superfície (cards/painéis), não o fundo da página */\n.avatar:where([data-within-group]) {\n border-color: var(--ds-surface);\n background: var(--ds-surface);\n}\n\n/* DataList: divisor suave, rótulo texto-3, valor texto */\n.dataList[data-with-divider] > * {\n border-color: var(--ds-border-soft);\n}\n.dataListLabel {\n color: var(--ds-text-3);\n}\n.dataListValue {\n color: var(--ds-text);\n font-weight: 500;\n}\n\n/* Indicator: anel na cor da superfície, contador com peso 600 */\n.indicator {\n font-weight: 600;\n font-variant-numeric: tabular-nums;\n}\n.indicator:where([data-with-border]) {\n border-color: var(--ds-surface);\n}\n\n/* Kbd: tecla em surface-2 com borda da marca */\n.kbd {\n font-family: var(--mantine-font-family-monospace);\n font-weight: 600;\n color: var(--ds-text-2);\n background-color: var(--ds-surface-2);\n border-color: var(--ds-border-soft);\n border-bottom-color: var(--ds-border);\n border-radius: 6px;\n}\n\n/* Spoiler: controle como link da marca */\n.spoilerControl {\n color: var(--ds-link);\n font-weight: 600;\n font-size: var(--type-subheadline-sm);\n}\n\n/* Timeline: trilho suave, marcador sobre a superfície */\n.timeline {\n --tl-color: var(--mantine-primary-color-filled);\n}\n.timelineItem {\n --item-border-color: var(--ds-border-soft);\n}\n.timelineBullet {\n background-color: var(--ds-surface);\n border-color: var(--ds-border-soft);\n color: var(--ds-text-3);\n}\n.timelineBullet:where([data-active]) {\n border-color: var(--tli-color, var(--tl-color));\n}\n.timelineBullet:where([data-active][data-with-child]) {\n background-color: var(--tli-color, var(--tl-color));\n color: var(--tl-icon-color, var(--mantine-color-white));\n}\n.timelineTitle {\n font-weight: 600;\n line-height: 1.4;\n color: var(--ds-text);\n}\n/* No escuro o primário (horizon.4) é claro: ícone escuro nos marcadores sem cor própria */\n:where([data-mantine-color-scheme='dark']) .timeline:not([style*='--tl-color']) .timelineItem:not([style*='--tli-color']) .timelineBullet:where([data-active][data-with-child]) {\n color: var(--mantine-primary-color-contrast);\n}\n","import { themed, type ThemeComponents } from './types';\nimport {\n Accordion,\n Avatar,\n BackgroundImage,\n Badge,\n Card,\n DataList,\n Image,\n Indicator,\n Kbd,\n NumberFormatter,\n RollingNumber,\n Spoiler,\n ThemeIcon,\n Timeline,\n} from '@mantine-vue/core';\nimport classes from './dataDisplay.module.css';\n\nexport const dataDisplayComponents: ThemeComponents = {\n Accordion: themed(Accordion, {\n defaultProps: { chevronPosition: 'right' },\n classNames: { item: classes.accordionItem, control: classes.accordionControl, label: classes.accordionLabel, chevron: classes.accordionChevron, content: classes.accordionContent },\n }),\n Avatar: themed(Avatar, { defaultProps: { color: 'horizon', radius: 'xl' }, classNames: { root: classes.avatar } }),\n BackgroundImage: themed(BackgroundImage, { defaultProps: { radius: 'md' } }),\n Badge: themed(Badge, {\n defaultProps: { variant: 'light', radius: 'xl' },\n classNames: { root: classes.badge },\n vars: (_theme, props) =>\n (props.size ?? 'md') === 'md'\n ? { root: { '--badge-height': '24px', '--badge-fz': '12px', '--badge-padding-x': '8px' } }\n : { root: {} },\n }),\n Card: themed(Card, { defaultProps: { radius: 'md', padding: 'lg', shadow: 'sm', withBorder: true } }),\n DataList: themed(DataList, { classNames: { root: classes.dataList, itemLabel: classes.dataListLabel, itemValue: classes.dataListValue } }),\n Image: themed(Image, { defaultProps: { radius: 'md' } }),\n Indicator: themed(Indicator, { defaultProps: { color: 'danger' }, classNames: { indicator: classes.indicator } }),\n Kbd: themed(Kbd, { classNames: { root: classes.kbd } }),\n /** Formato brasileiro por padrão: 1.234,56 */\n NumberFormatter: themed(NumberFormatter, { defaultProps: { thousandSeparator: '.', decimalSeparator: ',' } }),\n RollingNumber: themed(RollingNumber, { defaultProps: { thousandSeparator: '.', decimalSeparator: ',' } }),\n Spoiler: themed(Spoiler, { classNames: { control: classes.spoilerControl } }),\n ThemeIcon: themed(ThemeIcon, { defaultProps: { radius: 'md' } }),\n Timeline: themed(Timeline, {\n defaultProps: { bulletSize: 24, lineWidth: 2 },\n classNames: { root: classes.timeline, item: classes.timelineItem, itemBullet: classes.timelineBullet, itemTitle: classes.timelineTitle },\n }),\n};\n","/* @generated sincronizado de packages/ui/src/theme/components/feedback.module.css — edite lá e rode `npm run sync -w @jcdecor/vue` */\n/* Feedback — Alert, EmptyState, Loader, Notification, Progress, RingProgress, SemiCircleProgress, Skeleton */\n\n/* ---------- Alert ---------- */\n.alert {\n border-radius: var(--ds-radius);\n}\n.alertTitle {\n font-weight: 600;\n}\n/* Corpo em --ds-text (o Mantine usa preto/branco puros); filled e white mantêm a cor própria. */\n.alertMessage:not([data-variant='filled'], [data-variant='white']) {\n color: var(--ds-text);\n}\n\n/* Filled no escuro: o fundo é o tom 400 (claro), então o texto passa a ser escuro (≥ 4,5:1). */\n:root[data-mantine-color-scheme='dark'] .alert[data-variant='filled'] .alertWrapper {\n --alert-color: var(--mantine-color-dark-8);\n}\n\n/* ---------- Notification ---------- */\n.notification {\n background-color: var(--ds-surface);\n box-shadow: var(--ds-shadow-md);\n border: 1px solid var(--ds-border-soft);\n}\n.notificationTitle {\n font-weight: 600;\n color: var(--ds-text);\n}\n.notificationDescription {\n color: var(--ds-text-2);\n}\n/* No escuro o ícone fica sobre o tom 400 da cor: texto escuro para contraste. */\n:root[data-mantine-color-scheme='dark'] .notificationIcon {\n color: var(--mantine-color-dark-8);\n}\n\n/* ---------- Progress ---------- */\n:root[data-mantine-color-scheme] .progress {\n background-color: var(--ds-surface-2);\n box-shadow: inset 0 0 0 1px var(--ds-border-soft);\n}\n.progressLabel {\n font-weight: 600;\n}\n:root[data-mantine-color-scheme='dark'] .progressLabel {\n color: var(--mantine-color-dark-8);\n}\n\n/* ---------- RingProgress / SemiCircleProgress ---------- */\n:root[data-mantine-color-scheme] .ringCurve {\n --rp-curve-root-color: var(--ds-border-soft);\n}\n:root[data-mantine-color-scheme] .semiCircle {\n --scp-empty-segment-color: var(--ds-border-soft);\n}\n.semiCircleLabel {\n font-weight: 600;\n color: var(--ds-text);\n}\n\n/* ---------- Skeleton ---------- */\n:root[data-mantine-color-scheme='light'] .skeleton[data-visible]::after {\n background-color: var(--mantine-color-gray-2);\n}\n:root[data-mantine-color-scheme='dark'] .skeleton[data-visible]::after {\n background-color: var(--mantine-color-dark-4);\n}\n\n/* ---------- EmptyState ---------- */\n:root[data-mantine-color-scheme] .emptyIndicator[data-with-background] {\n --empty-state-indicator-default-bg: var(--ds-surface-2);\n}\n:root[data-mantine-color-scheme='dark'] .emptyState[data-variant='filled'] .emptyIndicator {\n color: var(--mantine-color-dark-8);\n}\n.emptyTitle {\n color: var(--ds-text);\n}\n.emptyDescription {\n color: var(--ds-text-2);\n}\n","import { themed, type ThemeComponents } from './types';\nimport {\n Alert,\n EmptyState,\n Loader,\n Notification,\n Progress,\n RingProgress,\n SemiCircleProgress,\n Skeleton,\n} from '@mantine-vue/core';\nimport classes from './feedback.module.css';\n\nexport const feedbackComponents: ThemeComponents = {\n Notification: themed(Notification, {\n defaultProps: { radius: 'md' },\n classNames: { root: classes.notification, title: classes.notificationTitle, description: classes.notificationDescription, icon: classes.notificationIcon },\n }),\n Alert: themed(Alert, { defaultProps: { variant: 'light' }, classNames: { root: classes.alert, wrapper: classes.alertWrapper, title: classes.alertTitle, message: classes.alertMessage } }),\n Loader: themed(Loader, { defaultProps: { type: 'oval' } }),\n Progress: themed(Progress, { defaultProps: { radius: 'xl' }, classNames: { root: classes.progress, label: classes.progressLabel } }),\n RingProgress: themed(RingProgress, { classNames: { curve: classes.ringCurve } }),\n SemiCircleProgress: themed(SemiCircleProgress, { classNames: { root: classes.semiCircle, label: classes.semiCircleLabel } }),\n Skeleton: themed(Skeleton, { classNames: { root: classes.skeleton } }),\n EmptyState: themed(EmptyState, {\n classNames: { root: classes.emptyState, indicator: classes.emptyIndicator, title: classes.emptyTitle, description: classes.emptyDescription },\n }),\n};\n","/* @generated sincronizado de packages/ui/src/theme/components/inputs.module.css — edite lá e rode `npm run sync -w @jcdecor/vue` */\n/* Inputs — Input/InputWrapper (base de todos os campos), Checkbox, Radio, Switch, SegmentedControl… */\n.input {\n --input-bd: var(--ds-border);\n --input-bd-focus: var(--ds-primary);\n background-color: var(--ds-surface);\n color: var(--ds-text);\n transition: border-color 0.15s, box-shadow 0.15s;\n}\n.input:focus,\n.input:focus-within {\n border-color: var(--ds-primary);\n box-shadow: 0 0 0 3px var(--ds-primary-soft);\n}\n.input[data-error] {\n border-color: var(--ds-error);\n}\n.input[data-error]:focus,\n.input[data-error]:focus-within {\n box-shadow: 0 0 0 3px var(--ds-error-bg);\n}\n[data-success] > .input {\n border-color: var(--ds-success);\n}\n[data-success] > .input:focus,\n[data-success] > .input:focus-within {\n box-shadow: 0 0 0 3px var(--ds-success-bg);\n}\n.input[data-variant='unstyled'],\n.input[data-variant='unstyled']:focus,\n.input[data-variant='unstyled']:focus-within {\n --input-bd: transparent;\n border-color: transparent;\n background-color: transparent;\n box-shadow: none;\n}\n.input::placeholder {\n color: var(--ds-text-3);\n}\n.label {\n font-size: var(--type-subheadline-sm);\n font-weight: 500;\n color: var(--ds-text-2);\n margin-bottom: 4px;\n}\n.description {\n color: var(--ds-text-3);\n}\n.segmentedRoot {\n background-color: var(--ds-surface-2);\n}\n.segmentedIndicator {\n box-shadow: var(--ds-shadow-sm);\n}\n.segmentedLabel {\n font-weight: 500;\n}\n\n/* NativeSelect — seta neutra e opções do menu nativo nas cores do tema (no escuro o SO usaria branco) */\n.nativeSelect option,\n.nativeSelect optgroup {\n background-color: var(--ds-surface);\n color: var(--ds-text);\n}\n.nativeSelectSection {\n color: var(--ds-text-3);\n}\n\n/* Checkbox / Radio — borda desmarcada 3:1 */\n[data-mantine-color-scheme] .checkInput:not([data-checked]):not(:checked):not([data-indeterminate]):not(:disabled):not([data-disabled]):not([data-error]) {\n border-color: var(--ds-border);\n}\n/* Checkbox.Card / Radio.Card marcados: borda primária */\n[data-mantine-color-scheme] .selectCard[data-with-border] {\n border-color: var(--ds-border-soft);\n background-color: var(--ds-surface);\n transition: border-color 0.15s, background-color 0.15s;\n}\n[data-mantine-color-scheme] .selectCard[data-with-border][data-checked] {\n border-color: var(--ds-primary);\n background-color: var(--ds-primary-soft);\n}\n\n/* Switch — no escuro o trilho desligado (dark-5) some na superfície: usa --ds-border (3:1) */\n[data-mantine-color-scheme='dark'] .switchTrack {\n --switch-bg: var(--ds-border);\n --switch-disabled-color: var(--ds-surface-2);\n}\n\n/* Chip — outline marcado ganha o fundo suave da cor (--chip-bg vem do resolver light, ver inputs.ts) */\n.chipLabel {\n font-weight: 500;\n}\n[data-variant='outline'] > .chipLabel[data-checked]:not([data-disabled]) {\n background-color: var(--chip-bg);\n}\n@media (hover: hover) {\n [data-variant='outline'] > .chipLabel[data-checked]:not([data-disabled]):hover {\n background-color: var(--chip-hover);\n }\n}\n\n/* Fieldset como card */\n[data-mantine-color-scheme] .fieldset[data-variant='default'] {\n border-color: var(--ds-border-soft);\n background-color: var(--ds-surface);\n}\n[data-mantine-color-scheme] .fieldset[data-variant='filled'] {\n border-color: var(--ds-border-soft);\n background-color: var(--ds-surface-2);\n}\n.fieldsetLegend {\n font-size: var(--type-subheadline-sm);\n font-weight: 600;\n color: var(--ds-text);\n padding-inline: 4px;\n}\n.fieldset[data-variant='unstyled'] .fieldsetLegend {\n padding-inline: 0;\n}\n\n/* PinInput */\n.pinInput {\n font-weight: 600;\n}\n\n/* Slider / RangeSlider — trilho soft, thumb branco com borda primária nos dois temas, balão Obsidian */\n[data-mantine-color-scheme] .sliderRoot {\n --slider-track-bg: var(--ds-border-soft);\n}\n[data-mantine-color-scheme] .sliderThumb {\n color: var(--slider-color);\n border-color: var(--slider-color);\n background-color: var(--mantine-color-white);\n box-shadow: var(--ds-shadow-sm);\n}\n.sliderThumb:focus-visible {\n outline: none;\n box-shadow: 0 0 0 3px var(--ds-primary-soft), var(--ds-shadow-sm);\n}\n[data-mantine-color-scheme] .sliderLabel {\n background-color: var(--mantine-color-obsidian-6);\n color: var(--mantine-color-white);\n font-weight: 600;\n padding: 2px 8px;\n}\n[data-mantine-color-scheme='dark'] .sliderLabel {\n background-color: var(--ds-surface-2);\n color: var(--ds-text);\n box-shadow: var(--ds-shadow-sm);\n}\n.sliderMarkLabel {\n color: var(--ds-text-3);\n}\n\n/* AngleSlider */\n[data-mantine-color-scheme] .angleRoot {\n background-color: var(--ds-surface-2);\n box-shadow: inset 0 0 0 1px var(--ds-border-soft);\n}\n.angleRoot:focus-within {\n outline: none;\n box-shadow: inset 0 0 0 1px var(--ds-primary), 0 0 0 3px var(--ds-primary-soft);\n}\n[data-mantine-color-scheme] .angleThumb::before {\n background-color: var(--ds-primary);\n}\n.angleLabel {\n font-weight: 600;\n color: var(--ds-text);\n}\n\n/* Rating — âmbar electric (claro 4 / escuro 3); vazias em border-soft */\n.rating {\n --jc-rating-color: var(--mantine-color-electric-4);\n}\n[data-mantine-color-scheme='dark'] .rating {\n --jc-rating-color: var(--mantine-color-electric-3);\n}\n[data-mantine-color-scheme] .ratingStar:not([data-filled]) {\n fill: var(--ds-border-soft);\n stroke: var(--ds-border-soft);\n}\n[data-mantine-color-scheme='dark'] .ratingStar:not([data-filled]) {\n fill: var(--ds-border);\n stroke: var(--ds-border);\n}\n\n/* ColorPicker / AlphaSlider / HueSlider */\n.colorSlider,\n.colorSliderOverlay {\n border-radius: var(--mantine-radius-xs);\n}\n.colorThumb {\n box-shadow: var(--ds-shadow-sm), 0 0 1px rgba(0, 0, 0, 0.6);\n}\n.colorSlider:focus:focus-visible .colorThumb,\n.colorSaturation:focus:focus-visible .colorThumb {\n outline-color: var(--ds-primary);\n}\n.colorSwatch {\n border-radius: var(--mantine-radius-xs);\n}\n.colorSwatch:focus-visible {\n outline: 2px solid var(--ds-primary);\n outline-offset: 2px;\n}\n","import { themed, type ThemeComponents } from './types';\nimport {\n AlphaSlider,\n AngleSlider,\n Checkbox,\n CheckboxCard,\n CheckboxIndicator,\n Chip,\n ColorPicker,\n Fieldset,\n HueSlider,\n Input,\n InputWrapper,\n NativeSelect,\n PinInput,\n Radio,\n RadioCard,\n RadioIndicator,\n RangeSlider,\n Rating,\n SegmentedControl,\n Slider,\n Switch,\n type MantineSize,\n} from '@mantine-vue/core';\nimport { control, isSize } from '../controls';\nimport classes from './inputs.module.css';\n\n/** Mantine 9 usa `size=\"sm\"` como padrão nos campos; o DS usa md (40px, alinhado ao Button md). */\nconst INPUT_COMPONENTS = [\n 'InputBase', 'TextInput', 'PasswordInput', 'NumberInput', 'Textarea', 'JsonInput',\n 'ColorInput', 'FileInput', 'MaskInput',\n];\nconst inputDefaults = Object.fromEntries(INPUT_COMPONENTS.map((name) => [name, { defaultProps: { size: 'md' } }]));\n\n/** Thumbs/trilhos dos sliders de cor (ColorPicker, AlphaSlider e HueSlider usam seletores estáticos próprios). */\nconst colorSliderClassNames = { slider: classes.colorSlider, sliderOverlay: classes.colorSliderOverlay, thumb: classes.colorThumb };\n\n/** Slider e RangeSlider compartilham o mesmo visual. */\nconst sliderClassNames = { root: classes.sliderRoot, thumb: classes.sliderThumb, label: classes.sliderLabel, markLabel: classes.sliderMarkLabel };\n\nexport const inputsComponents: ThemeComponents = {\n ...inputDefaults,\n Input: themed(Input, {\n defaultProps: { size: 'md' },\n classNames: { input: classes.input },\n vars: (_theme, props) => {\n const size = (props.size ?? 'md') as MantineSize;\n if (!isSize(size)) return { wrapper: {} };\n return { wrapper: { '--input-height': control[size].height, '--input-fz': control[size].inputFz } };\n },\n }),\n InputWrapper: themed(InputWrapper, {\n classNames: { label: classes.label, description: classes.description },\n }),\n /** Seta e opções do menu nativo legíveis no tema escuro. */\n NativeSelect: themed(NativeSelect, {\n defaultProps: { size: 'md' },\n classNames: { input: classes.nativeSelect, section: classes.nativeSelectSection },\n }),\n\n // Seleção ---------------------------------------------------------------\n /** Borda da caixa desmarcada com --ds-border (3:1, WCAG 1.4.11); o gray-4 do Mantine fica em ~2,5:1. */\n Checkbox: themed(Checkbox, { defaultProps: { radius: 'xs' }, classNames: { input: classes.checkInput } }),\n CheckboxIndicator: themed(CheckboxIndicator, { defaultProps: { radius: 'xs' }, classNames: { indicator: classes.checkInput } }),\n CheckboxCard: themed(CheckboxCard, { defaultProps: { radius: 'md' }, classNames: { card: classes.selectCard } }),\n Radio: themed(Radio, { classNames: { radio: classes.checkInput } }),\n RadioIndicator: themed(RadioIndicator, { classNames: { indicator: classes.checkInput } }),\n RadioCard: themed(RadioCard, { defaultProps: { radius: 'md' }, classNames: { card: classes.selectCard } }),\n Switch: themed(Switch, { defaultProps: { radius: 'xl' }, classNames: { track: classes.switchTrack } }),\n /**\n * Chip de filtro da marca: `outline` por padrão; marcado = fundo suave da cor (tag light)\n * + borda e texto da cor, em vez do contorno sem fundo do Mantine.\n */\n Chip: themed(Chip, {\n defaultProps: { variant: 'outline' },\n classNames: { label: classes.chipLabel },\n vars: (theme, props) => {\n if (props.variant !== 'outline') return { root: {} };\n const light = theme.variantColorResolver({ color: props.color || theme.primaryColor, theme, variant: 'light' });\n return { root: { '--chip-bg': light.hover, '--chip-hover': light.hover } };\n },\n }),\n SegmentedControl: themed(SegmentedControl, {\n defaultProps: { radius: 'sm' },\n classNames: { root: classes.segmentedRoot, indicator: classes.segmentedIndicator, label: classes.segmentedLabel },\n }),\n\n // Agrupamento e códigos ------------------------------------------------\n /** Fieldset como card: raio 12px, borda soft, fundo surface e legenda 14/600. */\n Fieldset: themed(Fieldset, {\n defaultProps: { radius: 'md' },\n classNames: { root: classes.fieldset, legend: classes.fieldsetLegend },\n }),\n /** Caixas quadradas com a altura dos campos (md = 40px), texto 600. */\n PinInput: themed(PinInput, {\n defaultProps: { size: 'md' },\n classNames: { input: classes.pinInput },\n vars: (_theme, props) => {\n const size = (props.size ?? 'md') as MantineSize;\n return { root: isSize(size) ? { '--pin-input-size': control[size].height } : {} };\n },\n }),\n\n // Sliders --------------------------------------------------------------\n Slider: themed(Slider, { classNames: sliderClassNames }),\n RangeSlider: themed(RangeSlider, { classNames: sliderClassNames }),\n AngleSlider: themed(AngleSlider, { classNames: { root: classes.angleRoot, thumb: classes.angleThumb, label: classes.angleLabel } }),\n\n /** Estrelas âmbar (electric.4 no claro, electric.3 no escuro) em vez do yellow do Mantine. */\n Rating: themed(Rating, {\n defaultProps: { color: 'electric.4' },\n classNames: { root: classes.rating, starSymbol: classes.ratingStar },\n vars: (_theme, props) => ({ root: props.color === 'electric.4' ? { '--rating-color': 'var(--jc-rating-color)' } : {} }),\n }),\n\n // Cor ------------------------------------------------------------------\n ColorPicker: themed(ColorPicker, {\n classNames: { ...colorSliderClassNames, saturation: classes.colorSaturation, swatch: classes.colorSwatch },\n }),\n AlphaSlider: themed(AlphaSlider, { classNames: colorSliderClassNames }),\n HueSlider: themed(HueSlider, { classNames: colorSliderClassNames }),\n};\n","/* @generated sincronizado de packages/ui/src/theme/components/layout.module.css — edite lá e rode `npm run sync -w @jcdecor/vue` */\n/* Layout — AppShell, Container, Grid, Splitter… */\n.appShellMain {\n background-color: var(--ds-bg);\n}\n.appShellNavbar,\n.appShellAside {\n background-color: var(--ds-surface);\n border-color: var(--ds-border-soft);\n}\n.appShellHeader,\n.appShellFooter {\n background-color: var(--ds-surface);\n border-color: var(--ds-border-soft);\n}\n\n/* Container: xl = --grid-max (1224px) */\n.container {\n --container-size-xl: var(--grid-max);\n}\n\n/* Splitter: a linha usava o fundo da página (--mantine-color-body), invisível sobre superfícies */\n.splitter {\n --splitter-handle-color: var(--ds-border-soft);\n}\n.splitterHandle {\n transition: background-color 120ms ease;\n}\n.splitterHandle:where([data-active], :focus-visible) {\n background-color: var(--ds-primary);\n}\n@media (hover: hover) {\n .splitterHandle:hover {\n background-color: var(--ds-border);\n }\n .splitterHandle:hover .splitterThumb {\n color: var(--ds-text-2);\n }\n}\n.splitterThumb {\n background-color: var(--ds-surface);\n border: 1px solid var(--ds-border-soft);\n box-shadow: var(--ds-shadow-sm);\n color: var(--ds-text-3);\n}\n.splitterHandle:where([data-active], :focus-visible) .splitterThumb {\n border-color: var(--ds-primary);\n color: var(--ds-primary);\n box-shadow: 0 0 0 2px var(--ds-primary-soft);\n}\n","import { themed, type ThemeComponents } from './types';\nimport { Container, Splitter } from '@mantine-vue/core';\nimport classes from './layout.module.css';\n\nexport const layoutComponents: ThemeComponents = {\n // As seções (AppShellMain, AppShellNavbar…) usam o getStyles do AppShell, mas o tipo do\n // `AppShell.extend` no Mantine Vue só declara `root` — entrada simples em vez de `.extend`.\n AppShell: {\n classNames: {\n main: classes.appShellMain,\n navbar: classes.appShellNavbar,\n aside: classes.appShellAside,\n header: classes.appShellHeader,\n footer: classes.appShellFooter,\n },\n },\n // size=\"xl\" = largura máxima do grid da marca (1224px) em vez dos 1320px do Mantine\n Container: themed(Container, { classNames: { root: classes.container } }),\n // Divisória na cor de divisores da marca; alça com superfície/borda dos tokens (adapta ao escuro)\n Splitter: themed(Splitter, {\n classNames: { root: classes.splitter, handle: classes.splitterHandle, thumb: classes.splitterThumb },\n }),\n};\n","/* @generated sincronizado de packages/ui/src/theme/components/misc.module.css — edite lá e rode `npm run sync -w @jcdecor/vue` */\n/* Miscellaneous — Paper, Divider, ScrollArea, Marquee… */\n.paper {\n --paper-border-color: var(--ds-border-soft);\n background-color: var(--ds-surface);\n color: var(--ds-text);\n}\n.divider {\n --divider-color: var(--ds-border-soft);\n}\n\n/* ScrollArea */\n.scrollbar:hover,\n.scrollbar:active {\n background-color: transparent;\n}\n.scrollThumb,\n.scrollbar:hover > .scrollThumb {\n background-color: var(--ds-border);\n}\n.scrollbar:active > .scrollThumb {\n background-color: var(--ds-text-3);\n}\n","import { themed, type ThemeComponents } from './types';\nimport { Divider, Paper, ScrollArea } from '@mantine-vue/core';\nimport classes from './misc.module.css';\n\nexport const miscComponents: ThemeComponents = {\n Paper: themed(Paper, { defaultProps: { radius: 'md' }, classNames: { root: classes.paper } }),\n Divider: themed(Divider, { classNames: { root: classes.divider } }),\n // Trilho sem fundo no hover (o dark-8 do Mantine destoava das superfícies) e polegar nos tons de borda/texto da marca\n ScrollArea: themed(ScrollArea, { classNames: { scrollbar: classes.scrollbar, thumb: classes.scrollThumb } }),\n};\n","/* @generated sincronizado de packages/ui/src/theme/components/navigation.module.css — edite lá e rode `npm run sync -w @jcdecor/vue` */\n/* Navigation — Anchor, Breadcrumbs, Burger, NavLink, Pagination, Stepper, TableOfContents, Tabs, Tree */\n\n/* ---------- Tabs ---------- */\n.tabs {\n --tab-border-color: var(--ds-border-soft);\n --tab-hover-color: var(--ds-surface-2);\n}\n.tab {\n font-weight: 500;\n color: var(--ds-text-2);\n}\n/* Texto primário só nas variantes sem preenchimento: em `pills` a aba ativa já tem fundo Horizon. */\n.tabs:not([data-variant='pills']) .tab[data-active] {\n color: var(--ds-primary);\n}\n.tabs[data-variant='pills'] .tab[data-active] {\n color: var(--tab-color);\n}\n:root[data-mantine-color-scheme='dark'] .tabs[data-variant='pills'] .tab[data-active] {\n color: var(--mantine-color-dark-8);\n}\n\n/* ---------- Anchor ---------- */\n.anchor {\n color: var(--ds-link);\n font-weight: 500;\n}\n\n/* ---------- Burger ---------- */\n.burger {\n --burger-color: var(--ds-text);\n}\n\n/* ---------- NavLink ---------- */\n.navLink {\n border-radius: var(--ds-radius-sm);\n font-weight: 500;\n}\n.navLink[data-active] {\n font-weight: 600;\n}\n:root[data-mantine-color-scheme='dark'] .navLink[data-variant='filled'][data-active] {\n color: var(--mantine-color-dark-8);\n}\n@media (hover: hover) {\n .navLink:hover:not([data-active]) {\n background-color: var(--ds-surface-2);\n }\n}\n\n/* ---------- Pagination ---------- */\n.paginationControl:not([data-active]) {\n border-color: var(--ds-border-soft);\n background-color: var(--ds-surface);\n color: var(--ds-text);\n}\n@media (hover: hover) {\n .paginationControl:not([data-active]):hover:not(:disabled, [data-disabled]) {\n background-color: var(--ds-surface-2);\n }\n}\n.paginationControl[data-active] {\n font-weight: 600;\n}\n/* No escuro o preenchimento é o tom 400 (claro): texto escuro para manter contraste ≥ 4,5:1. */\n:root[data-mantine-color-scheme='dark'] .paginationControl[data-active] {\n color: var(--mantine-color-dark-8);\n}\n\n/* ---------- Stepper ---------- */\n.stepper {\n --stepper-outline-color: var(--ds-border-soft);\n}\n.stepIcon:not([data-completed]) {\n color: var(--ds-text-2);\n}\n:root[data-mantine-color-scheme='dark'] .stepIcon,\n:root[data-mantine-color-scheme='dark'] .stepCompletedIcon {\n --stepper-icon-color: var(--mantine-color-dark-8);\n}\n.stepLabel {\n font-weight: 600;\n color: var(--ds-text);\n}\n.stepDescription {\n color: var(--ds-text-3);\n}\n\n/* ---------- TableOfContents ---------- */\n.tocControl:not([data-active]) {\n color: var(--ds-text-2);\n}\n@media (hover: hover) {\n .tocControl:not([data-active]):not([data-variant='none']):hover {\n background-color: var(--ds-surface-2);\n color: var(--ds-text);\n }\n}\n.tocControl[data-active] {\n font-weight: 500;\n}\n\n/* ---------- Tree ---------- */\n.tree {\n --tree-line-color: var(--ds-border-soft);\n}\n.treeLabel {\n border-radius: var(--ds-radius-sm);\n transition: background-color 120ms ease;\n}\n@media (hover: hover) {\n .treeLabel:hover:not([data-selected]) {\n background-color: var(--ds-surface-2);\n }\n}\n.treeLabel[data-selected] {\n background-color: var(--ds-primary-soft);\n color: var(--ds-primary);\n font-weight: 500;\n}\n","import { themed, type ThemeComponents } from './types';\nimport { Anchor, Burger, NavLink, Pagination, Stepper, TableOfContents, Tabs, Tree } from '@mantine-vue/core';\nimport classes from './navigation.module.css';\n\nexport const navigationComponents: ThemeComponents = {\n Tabs: themed(Tabs, { classNames: { root: classes.tabs, tab: classes.tab } }),\n Anchor: themed(Anchor, { classNames: { root: classes.anchor } }),\n Burger: themed(Burger, { classNames: { root: classes.burger } }),\n // variant explícito: o resolver de cores aplica as cores de tag (--ds-tag-primary-*) ao item ativo\n NavLink: themed(NavLink, { defaultProps: { variant: 'light' }, classNames: { root: classes.navLink } }),\n Pagination: themed(Pagination, { defaultProps: { radius: 'sm' }, classNames: { control: classes.paginationControl } }),\n Stepper: themed(Stepper, {\n classNames: {\n root: classes.stepper,\n stepIcon: classes.stepIcon,\n stepCompletedIcon: classes.stepCompletedIcon,\n stepLabel: classes.stepLabel,\n stepDescription: classes.stepDescription,\n },\n }),\n TableOfContents: themed(TableOfContents, { classNames: { control: classes.tocControl } }),\n Tree: themed(Tree, { classNames: { root: classes.tree, label: classes.treeLabel } }),\n};\n","/* @generated sincronizado de packages/ui/src/theme/components/overlays.module.css — edite lá e rode `npm run sync -w @jcdecor/vue` */\n/* Overlays — Modal, Drawer, Menu, Popover, HoverCard, Tooltip, Dialog, Menubar, ActionBar, FloatingWindow */\n\n/* Superfície flutuante compartilhada (Popover, Menu, HoverCard, Menubar).\n A cor da borda vai na variável para que a seta (`withArrow`) acompanhe. */\n.dropdown {\n --popover-border-color: var(--ds-border-soft);\n background-color: var(--ds-surface);\n border-color: var(--ds-border-soft);\n box-shadow: var(--ds-shadow-md);\n}\n/* Itens de menu: hover em surface-2; no escuro o vermelho de perigo sobe para o tom 400 (contraste AA sobre a superfície). */\n.menuItem {\n --menu-item-hover: var(--ds-surface-2);\n}\n:where([data-mantine-color-scheme='dark']) .menuItem {\n --mantine-color-danger-6: var(--dc-danger-400);\n}\n.menuLabel {\n color: var(--ds-text-3);\n font-size: var(--type-disclaimer);\n font-weight: 600;\n}\n.menuDivider {\n border-color: var(--ds-border-soft);\n}\n\n/* Menubar: alvos com hover/aberto em surface-2 e texto da marca. */\n.menubarRoot {\n gap: 2px;\n}\n.menubarTarget {\n color: var(--ds-text);\n font-weight: 500;\n border-radius: var(--ds-radius-sm);\n}\n.menubarTarget:where(:hover, :focus-visible, [data-expanded]):where(:not(:disabled, [data-disabled])) {\n background-color: var(--ds-surface-2);\n}\n.menubarTarget:where([data-expanded]) {\n color: var(--ds-primary);\n}\n\n/* Superfícies \"janela\" (Dialog, ActionBar, FloatingWindow). */\n.floatingSurface {\n background-color: var(--ds-surface);\n border-color: var(--ds-border-soft);\n box-shadow: var(--ds-shadow-lg);\n}\n.actionBarDivider {\n background-color: var(--ds-border-soft);\n}\n\n.modalContent {\n background-color: var(--ds-surface);\n}\n.modalHeader {\n background-color: var(--ds-surface);\n}\n.modalTitle {\n font-size: var(--type-headline-sm);\n font-weight: 600;\n}\n\n/* Tooltip: Obsidian/branco no claro, Obsidian 50/Obsidian no escuro. Usa fallback das variáveis para que `color` continue funcionando. */\n.tooltip {\n background-color: var(--tooltip-bg, var(--dc-obsidian));\n color: var(--tooltip-color, var(--dc-white));\n font-size: var(--type-disclaimer);\n font-weight: 500;\n}\n:where([data-mantine-color-scheme='dark']) .tooltip {\n background-color: var(--tooltip-bg, var(--dc-obsidian-50));\n color: var(--tooltip-color, var(--dc-obsidian));\n}\n\n/* No escuro a superfície flutuante tem o mesmo tom dos cards: a borda sobe um degrau para separar as camadas. */\n:where([data-mantine-color-scheme='dark']) .dropdown,\n:where([data-mantine-color-scheme='dark']) .floatingSurface {\n --popover-border-color: color-mix(in srgb, var(--ds-border) 55%, var(--ds-border-soft));\n border-color: color-mix(in srgb, var(--ds-border) 55%, var(--ds-border-soft));\n}\n\n","import { themed, type ThemeComponents } from './types';\nimport {\n ActionBar,\n Dialog,\n Drawer,\n FloatingWindow,\n HoverCard,\n LoadingOverlay,\n Menu,\n Menubar,\n Modal,\n Overlay,\n Popover,\n Tooltip,\n} from '@mantine-vue/core';\nimport { overlayProps } from '../controls';\nimport { brand } from '../tokens';\nimport classes from './overlays.module.css';\n\nconst menuClassNames = { dropdown: classes.dropdown, item: classes.menuItem, label: classes.menuLabel, divider: classes.menuDivider };\n\nexport const overlaysComponents: ThemeComponents = {\n Menu: themed(Menu, { defaultProps: { shadow: 'md', radius: 'sm' }, classNames: menuClassNames }),\n Menubar: themed(Menubar, { classNames: { root: classes.menubarRoot, target: classes.menubarTarget } }),\n Popover: themed(Popover, { defaultProps: { shadow: 'md', radius: 'sm' }, classNames: { dropdown: classes.dropdown } }),\n HoverCard: themed(HoverCard, { defaultProps: { shadow: 'md', radius: 'md' }, classNames: { dropdown: classes.dropdown } }),\n Tooltip: themed(Tooltip, { defaultProps: { radius: 'sm', withArrow: true }, classNames: { tooltip: classes.tooltip } }),\n Modal: themed(Modal, {\n defaultProps: { radius: 'md', centered: true, shadow: 'lg', overlayProps },\n classNames: { content: classes.modalContent, header: classes.modalHeader, title: classes.modalTitle },\n }),\n Drawer: themed(Drawer, {\n defaultProps: { shadow: 'lg', overlayProps },\n classNames: { content: classes.modalContent, header: classes.modalHeader, title: classes.modalTitle },\n }),\n Dialog: themed(Dialog, { defaultProps: { radius: 'md', shadow: 'lg' }, classNames: { root: classes.floatingSurface } }),\n ActionBar: themed(ActionBar, {\n defaultProps: { radius: 'md', shadow: 'lg' },\n classNames: { root: classes.floatingSurface, divider: classes.actionBarDivider },\n }),\n FloatingWindow: themed(FloatingWindow, { defaultProps: { radius: 'md', shadow: 'lg', withBorder: true }, classNames: { root: classes.floatingSurface } }),\n /** Overlay solto (sobre imagens/cards) usa o navy da marca em vez do preto. */\n Overlay: themed(Overlay, { defaultProps: { color: brand.obsidian } }),\n LoadingOverlay: themed(LoadingOverlay, { defaultProps: { overlayProps: { backgroundOpacity: 0.75, blur: 1 } } }),\n};\n","/* @generated sincronizado de packages/ui/src/theme/components/typography.module.css — edite lá e rode `npm run sync -w @jcdecor/vue` */\n/* Typography — Table, Title, Text, Code, Blockquote, List, Mark, Highlight, Typography */\n.table {\n --table-border-color: var(--ds-border-soft);\n --table-highlight-on-hover-color: var(--ds-surface-2);\n --table-striped-color: var(--ds-surface-2);\n font-size: var(--type-subheadline-sm);\n}\n.th {\n text-align: left;\n font-weight: 600;\n color: var(--ds-text-3);\n font-size: var(--type-disclaimer);\n letter-spacing: 0.05em;\n text-transform: uppercase;\n}\n.thead .tr {\n border-bottom: 2px solid var(--ds-border);\n}\n.title {\n color: var(--ds-text);\n}\n\n/* Code: superfície 2, borda suave, mono levemente menor que o texto ao redor */\n.code {\n background-color: var(--code-bg, var(--ds-surface-2));\n color: var(--ds-text);\n border: 1px solid var(--ds-border-soft);\n border-radius: 6px;\n font-size: 0.875em;\n padding: 1px 6px;\n}\n.code[data-block] {\n border-radius: var(--ds-radius-sm);\n padding: var(--mantine-spacing-md);\n font-size: var(--type-subheadline-sm);\n line-height: 1.6;\n}\n\n/* Blockquote: borda primária e fundo primary-soft (cores da marca nos dois temas) */\n.blockquote {\n color: var(--ds-text);\n font-size: var(--type-subheadline-lg);\n line-height: 1.55;\n padding: var(--mantine-spacing-lg) var(--mantine-spacing-xl);\n}\n.blockquoteIcon {\n background-color: var(--ds-surface);\n}\n.blockquoteCite {\n color: var(--ds-text-3);\n opacity: 1;\n font-size: var(--type-subheadline-sm);\n font-style: normal;\n font-weight: 500;\n}\n\n/* Mark / Highlight */\n.mark {\n color: var(--ds-text);\n border-radius: 3px;\n padding-inline: 0.1em;\n}\n\n/* List: marcadores na cor primária */\n.list {\n color: var(--ds-text);\n}\n.listItem::marker {\n color: var(--ds-primary);\n font-weight: 600;\n}\n.listItemIcon {\n color: var(--ds-primary);\n}\n\n/* Typography: rich text (posts, políticas) com os tokens da marca */\n.typography {\n color: var(--ds-text-2);\n line-height: 1.6;\n}\n.typography :where(h1, h2, h3, h4, h5, h6) {\n color: var(--ds-text);\n font-weight: 600;\n}\n.typography :where(a) {\n color: var(--ds-link);\n font-weight: 500;\n text-decoration: underline;\n text-decoration-color: color-mix(in srgb, currentColor 35%, transparent);\n text-underline-offset: 3px;\n}\n.typography :where(a):hover {\n text-decoration-color: currentColor;\n}\n.typography :where(strong, b) {\n color: var(--ds-text);\n font-weight: 600;\n}\n.typography :where(ul, ol) :where(li)::marker {\n color: var(--ds-primary);\n font-weight: 600;\n}\n.typography :where(li) + :where(li) {\n margin-top: var(--mantine-spacing-xs);\n}\n.typography :where(code) {\n background-color: var(--ds-surface-2);\n color: var(--ds-text);\n border: 1px solid var(--ds-border-soft);\n border-radius: 6px;\n font-size: 0.875em;\n}\n.typography :where(pre) {\n background-color: var(--ds-surface-2);\n border: 1px solid var(--ds-border-soft);\n border-radius: var(--ds-radius-sm);\n padding: var(--mantine-spacing-md);\n}\n.typography :where(pre) :where(code) {\n border: 0;\n font-size: var(--type-subheadline-sm);\n}\n.typography :where(kbd) {\n color: var(--ds-text-2);\n background-color: var(--ds-surface-2);\n border-color: var(--ds-border-soft);\n border-bottom-color: var(--ds-border);\n}\n.typography :where(mark) {\n background-color: var(--dc-electric-200);\n color: var(--ds-text);\n}\n.typography :where(blockquote) {\n background-color: var(--ds-primary-soft);\n border-inline-start: 3px solid var(--ds-primary);\n border-start-start-radius: 0;\n border-end-start-radius: 0;\n color: var(--ds-text);\n}\n.typography :where(hr) {\n border-color: var(--ds-border-soft);\n}\n.typography :where(table) {\n --table-border-color: var(--ds-border-soft);\n}\n.typography :where(table) :where(th) {\n color: var(--ds-text-3);\n font-size: var(--type-disclaimer);\n font-weight: 600;\n letter-spacing: 0.05em;\n text-transform: uppercase;\n}\n.typography :where(table) :where(thead th) {\n border-bottom: 2px solid var(--ds-border);\n}\n.typography :where(table) :where(td) {\n color: var(--ds-text);\n}\n.typography :where(details) {\n --details-border-color: var(--ds-border-soft);\n --details-summary-hover: var(--ds-surface-2);\n}\n.typography :where(details) :where(summary) {\n color: var(--ds-text);\n}\n.typography :where(img) {\n border-radius: var(--ds-radius);\n}\n:where([data-mantine-color-scheme='dark']) .typography :where(mark) {\n background-color: color-mix(in srgb, var(--dc-electric-300) 32%, transparent);\n}\n","import { themed, type ThemeComponents } from './types';\nimport {\n Blockquote,\n Code,\n List,\n Mark,\n Table,\n Title,\n Typography,\n getThemeColor,\n} from '@mantine-vue/core';\nimport classes from './typography.module.css';\n\n/** Cores de destaque amarelas (fill Electric com texto da marca). */\nconst YELLOWS = [undefined, 'yellow', 'electric'];\n\nexport const typographyComponents: ThemeComponents = {\n Blockquote: themed(Blockquote, {\n defaultProps: { iconSize: 40, radius: 'sm' },\n classNames: { root: classes.blockquote, icon: classes.blockquoteIcon, cite: classes.blockquoteCite },\n vars: (_theme, props) =>\n !props.color || props.color === 'horizon' || props.color === 'blue'\n ? { root: { '--bq-bd': 'var(--ds-primary)', '--bq-bg-light': 'var(--ds-primary-soft)', '--bq-bg-dark': 'var(--ds-primary-soft)' } }\n : { root: {} },\n }),\n Code: themed(Code, { classNames: { root: classes.code } }),\n List: themed(List, { defaultProps: { spacing: 'xs' }, classNames: { root: classes.list, item: classes.listItem, itemIcon: classes.listItemIcon } }),\n /** Mark e Highlight: amarelo só como fundo (Electric 200), texto sempre --ds-text */\n Mark: themed(Mark, {\n classNames: { root: classes.mark },\n vars: (theme, props) => {\n const yellow = YELLOWS.includes(props.color);\n const color = yellow ? 'electric' : props.color!;\n return {\n root: {\n '--mark-bg-light': getThemeColor(`${color}.${yellow ? 2 : 1}`, theme),\n '--mark-bg-dark': `color-mix(in srgb, ${getThemeColor(`${color}.${yellow ? 3 : 4}`, theme)} 32%, transparent)`,\n },\n };\n },\n }),\n Table: themed(Table, {\n defaultProps: { highlightOnHover: true, verticalSpacing: 'sm', horizontalSpacing: 'sm' },\n classNames: { table: classes.table, th: classes.th, thead: classes.thead, tr: classes.tr },\n }),\n Title: themed(Title, { classNames: { root: classes.title } }),\n Typography: themed(Typography, { classNames: { root: classes.typography } }),\n};\n","import type { ThemeComponents } from './types';\nimport { buttonsComponents } from './buttons';\nimport { comboboxComponents } from './combobox';\nimport { dataDisplayComponents } from './dataDisplay';\nimport { feedbackComponents } from './feedback';\nimport { inputsComponents } from './inputs';\nimport { layoutComponents } from './layout';\nimport { miscComponents } from './misc';\nimport { navigationComponents } from './navigation';\nimport { overlaysComponents } from './overlays';\nimport { typographyComponents } from './typography';\n\n/** Overrides de componentes Mantine, um arquivo por categoria (mesmas categorias de mantine.dev). */\nexport const jcComponents: ThemeComponents = {\n ...layoutComponents,\n ...inputsComponents,\n ...comboboxComponents,\n ...buttonsComponents,\n ...navigationComponents,\n ...feedbackComponents,\n ...overlaysComponents,\n ...dataDisplayComponents,\n ...typographyComponents,\n ...miscComponents,\n};\n","import type { MantineThemeOverride } from '@mantine-vue/core';\nimport { jcColors } from './colors';\nimport { chartPalette, fontFamily, grid, spacing, typography } from './tokens';\nimport { jcVariantColorResolver } from './variantColorResolver';\nimport { jcComponents } from './components';\n\nconst t = typography;\n\n/** Tema JC Decor (o Mantine Vue não tem `createTheme`: o tema é um objeto `MantineThemeOverride`). */\nexport const jcTheme: MantineThemeOverride = {\n colors: jcColors,\n primaryColor: 'horizon',\n primaryShade: { light: 6, dark: 4 },\n autoContrast: true,\n // Acima disso o texto vira escuro: horizon.4 no escuro e electric recebem texto escuro (≥ 6:1)\n luminanceThreshold: 0.3,\n white: '#FFFFFF',\n black: '#1F2228',\n variantColorResolver: jcVariantColorResolver,\n\n fontFamily,\n fontFamilyMonospace: \"ui-monospace, 'JetBrains Mono', SFMono-Regular, Menlo, monospace\",\n headings: {\n fontFamily,\n fontWeight: '600',\n textWrap: 'balance',\n sizes: {\n h1: { fontSize: t.displaySm.size, fontWeight: '700', lineHeight: String(t.displaySm.lineHeight) },\n h2: { fontSize: t.headlineLg.size, fontWeight: '600', lineHeight: String(t.headlineLg.lineHeight) },\n h3: { fontSize: t.headlineMd.size, fontWeight: '600', lineHeight: String(t.headlineMd.lineHeight) },\n h4: { fontSize: t.headlineSm.size, fontWeight: '600', lineHeight: String(t.headlineSm.lineHeight) },\n h5: { fontSize: '18px', fontWeight: '600', lineHeight: '1.45' },\n h6: { fontSize: '16px', fontWeight: '600', lineHeight: '1.5' },\n },\n },\n fontSizes: {\n xs: t.disclaimer.size,\n sm: t.subheadlineSm.size,\n md: t.subheadlineRg.size,\n lg: t.subheadlineLg.size,\n xl: t.headlineSm.size,\n },\n lineHeights: { xs: '1.33', sm: '1.43', md: '1.5', lg: '1.55', xl: '1.4' },\n spacing: { xs: spacing[4], sm: spacing[8], md: spacing[16], lg: spacing[24], xl: spacing[32] },\n radius: { xs: '4px', sm: '8px', md: '12px', lg: '16px', xl: '99px' },\n defaultRadius: 'sm',\n shadows: {\n xs: '0 1px 2px rgba(31,34,40,.06)',\n sm: 'var(--ds-shadow-sm)',\n md: 'var(--ds-shadow-md)',\n lg: 'var(--ds-shadow-lg)',\n xl: '0 24px 56px rgba(31,34,40,.18)',\n },\n breakpoints: { xs: '36em', sm: '48em', md: '64em', lg: '85.375em', xl: '96em' },\n focusRing: 'auto',\n cursorType: 'pointer',\n defaultGradient: { from: 'horizon.6', to: 'horizon.4', deg: 135 },\n\n other: { spacing, grid, typography, chartPalette },\n\n components: jcComponents,\n};\n","import type { CSSVariablesResolver } from '@mantine-vue/core';\nimport { brand, chartColors, feedback, ramps, semantic, spacing, typography } from './tokens';\n\nconst kebab = (s: string) => s.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase();\n\nfunction schemeVars(s: (typeof semantic)['light'] | (typeof semantic)['dark']) {\n return {\n '--ds-bg': s.bg,\n '--ds-surface': s.surface,\n '--ds-surface-2': s.surface2,\n '--ds-text': s.text,\n '--ds-text-2': s.text2,\n '--ds-text-3': s.text3,\n '--ds-border': s.border,\n '--ds-border-soft': s.borderSoft,\n '--ds-primary': s.primary,\n '--ds-primary-hover': s.primaryHover,\n '--ds-primary-soft': s.primarySoft,\n '--ds-accent': s.accent,\n '--ds-link': s.link,\n '--ds-success-bg': s.successBg,\n '--ds-warn-bg': s.warnBg,\n '--ds-error-bg': s.errorBg,\n '--ds-shadow-sm': s.shadowSm,\n '--ds-shadow-md': s.shadowMd,\n '--ds-shadow-lg': s.shadowLg,\n\n // Variáveis semânticas do Mantine apontando para os tokens da marca\n '--mantine-color-body': s.bg,\n '--mantine-color-text': s.text,\n '--mantine-color-dimmed': s.text3,\n '--mantine-color-default': s.surface,\n '--mantine-color-default-hover': s.surface2,\n '--mantine-color-default-border': s.border,\n '--mantine-color-anchor': s.link,\n '--mantine-color-error': feedback.error,\n '--mantine-color-success': feedback.success,\n };\n}\n\n/** Variáveis independentes de tema: paleta crua, tipografia e spacing (`--dc-*`, `--type-*`, `--sp-*`). */\nfunction staticVars() {\n const vars: Record<string, string> = {\n '--font-body': \"'Poppins', system-ui, -apple-system, 'Segoe UI', sans-serif\",\n '--ds-radius': '12px',\n '--ds-radius-sm': '8px',\n '--ds-radius-lg': '16px',\n '--grid-gap': '24px',\n '--grid-margin': '64px',\n '--grid-max': '1224px',\n };\n (Object.keys(brand) as (keyof typeof brand)[]).forEach((name) => {\n vars[`--dc-${name}`] = brand[name];\n });\n (Object.keys(ramps) as (keyof typeof ramps)[]).forEach((name) => {\n Object.entries(ramps[name]).forEach(([step, hex]) => {\n vars[`--dc-${name}-${step}`] = hex;\n });\n });\n Object.entries(typography).forEach(([name, t]) => {\n vars[`--type-${kebab(name)}`] = t.size;\n });\n Object.entries(spacing).forEach(([step, value]) => {\n vars[`--sp-${step}`] = value;\n });\n return vars;\n}\n\n/** Selos/tags (variante `light`): fundo 50 + texto 700 da mesma cor (≥ 6:1). */\nconst tagVars = {\n light: {\n '--ds-tag-primary-bg': ramps.horizon[50],\n '--ds-tag-primary-hover': ramps.horizon[100],\n '--ds-tag-primary-color': ramps.horizon[700],\n '--ds-tag-success-bg': ramps.evergreen[50],\n '--ds-tag-success-hover': ramps.evergreen[100],\n '--ds-tag-success-color': ramps.evergreen[700],\n '--ds-tag-warn-bg': ramps.electric[50],\n '--ds-tag-warn-hover': ramps.electric[100],\n '--ds-tag-warn-color': ramps.electric[700],\n '--ds-tag-error-bg': ramps.danger[50],\n '--ds-tag-error-hover': ramps.danger[100],\n '--ds-tag-error-color': ramps.danger[700],\n '--ds-tag-neutral-bg': ramps.gray[100],\n '--ds-tag-neutral-hover': ramps.gray[200],\n '--ds-tag-neutral-color': ramps.gray[700],\n },\n dark: {\n '--ds-tag-primary-bg': 'rgba(110,159,255,.14)',\n '--ds-tag-primary-hover': 'rgba(110,159,255,.22)',\n '--ds-tag-primary-color': ramps.horizon[300],\n '--ds-tag-success-bg': 'rgba(97,184,117,.14)',\n '--ds-tag-success-hover': 'rgba(97,184,117,.22)',\n '--ds-tag-success-color': ramps.evergreen[300],\n '--ds-tag-warn-bg': 'rgba(247,215,89,.12)',\n '--ds-tag-warn-hover': 'rgba(247,215,89,.2)',\n '--ds-tag-warn-color': ramps.electric[200],\n '--ds-tag-error-bg': 'rgba(255,108,90,.14)',\n '--ds-tag-error-hover': 'rgba(255,108,90,.22)',\n '--ds-tag-error-color': ramps.danger[300],\n '--ds-tag-neutral-bg': semantic.dark.surface2,\n '--ds-tag-neutral-hover': semantic.dark.border,\n '--ds-tag-neutral-color': semantic.dark.text2,\n },\n};\n\n/**\n * O Mantine deriva `--mantine-color-<cor>-light*` (usadas por subtle, transparent, light, Alert, ThemeIcon…)\n * da rampa crua — no escuro isso gera texto quase branco e hovers estranhos. Apontamos para os tokens de tag.\n */\nconst LIGHT_TONES: Record<string, string> = {\n horizon: 'primary', blue: 'primary',\n evergreen: 'success', green: 'success', teal: 'success',\n electric: 'warn', yellow: 'warn',\n danger: 'error', red: 'error',\n obsidian: 'neutral', indigo: 'neutral', gray: 'neutral', dark: 'neutral',\n};\nconst lightColorVars = Object.fromEntries(\n Object.entries(LIGHT_TONES).flatMap(([color, tone]) => [\n [`--mantine-color-${color}-light`, `var(--ds-tag-${tone}-bg)`],\n [`--mantine-color-${color}-light-hover`, `var(--ds-tag-${tone}-hover)`],\n [`--mantine-color-${color}-light-color`, `var(--ds-tag-${tone}-color)`],\n ]),\n);\n\nconst chartVars = (colors: readonly string[]) =>\n Object.fromEntries(colors.map((color, i) => [`--jc-chart-${i + 1}`, color]));\n\nexport const jcCssVariablesResolver: CSSVariablesResolver = () => ({\n variables: staticVars(),\n light: {\n ...schemeVars(semantic.light),\n ...tagVars.light,\n ...chartVars(chartColors.light),\n ...lightColorVars,\n '--ds-success': feedback.success,\n '--ds-warn': feedback.warn,\n '--ds-error': feedback.error,\n '--jc-on-filled': '#FFFFFF',\n '--mantine-primary-color-contrast': '#FFFFFF',\n // Marca: logo original (azul do logotipo) e ilustrações (navy-púrpura dos arquivos fonte)\n '--jc-logo-shield': '#0E36E3',\n '--jc-logo-letters': '#0E36E3',\n '--jc-logo-wordmark': '#0E36E3',\n '--jc-art-primary': '#2A2758',\n '--jc-art-ink': '#0C0C0C',\n '--jc-art-paper': '#FFFFFF',\n },\n dark: {\n ...schemeVars(semantic.dark),\n ...tagVars.dark,\n ...chartVars(chartColors.dark),\n ...lightColorVars,\n '--ds-success': ramps.evergreen[400],\n '--ds-warn': ramps.electric[300],\n '--ds-error': ramps.danger[400],\n // fills no escuro usam o tom 400 (claro): texto navy\n '--jc-on-filled': brand.obsidian,\n '--mantine-primary-color-contrast': brand.obsidian,\n // Marca no escuro: logo branco; ilustrações invertidas (traço claro, face em superfície)\n '--jc-logo-shield': '#FFFFFF',\n '--jc-logo-letters': '#FFFFFF',\n '--jc-logo-wordmark': '#FFFFFF',\n '--jc-art-primary': ramps.horizon[300],\n '--jc-art-ink': semantic.dark.text,\n '--jc-art-paper': semantic.dark.surface2,\n '--mantine-color-error': ramps.danger[400],\n '--mantine-color-success': ramps.evergreen[400],\n },\n});\n","import { computed, defineComponent, h, watch, type PropType } from 'vue';\nimport {\n MantineProvider,\n useMantineColorScheme,\n type CSSVariablesResolver,\n type MantineColorScheme,\n type MantineThemeOverride,\n} from '@mantine-vue/core';\nimport { deepMerge } from '@mantine-vue/utils';\nimport { jcCssVariablesResolver } from '../theme/cssVariablesResolver';\nimport { jcTheme } from '../theme/theme';\n\n/** Mesma chave do `localStorageColorSchemeManager` do Mantine React: o tema escolhido vale nas duas libs. */\nexport const COLOR_SCHEME_STORAGE_KEY = 'mantine-color-scheme-value';\n\nconst isScheme = (value: unknown): value is MantineColorScheme => value === 'light' || value === 'dark' || value === 'auto';\n\nfunction readStoredScheme(key: string): MantineColorScheme | undefined {\n try {\n const value = typeof window !== 'undefined' ? window.localStorage.getItem(key) : null;\n return isScheme(value) ? value : undefined;\n } catch {\n return undefined;\n }\n}\n\n/** Grava o esquema de cores atual (precisa estar dentro do MantineProvider para ler o contexto). */\nconst ColorSchemePersistence = defineComponent({\n name: 'JcColorSchemePersistence',\n props: { storageKey: { type: String, required: true } },\n setup(props) {\n const { colorScheme } = useMantineColorScheme();\n watch(colorScheme, (value) => {\n try {\n window.localStorage.setItem(props.storageKey, value);\n } catch {\n // localStorage indisponível (modo privado, SSR): o tema só não é lembrado\n }\n });\n return () => null;\n },\n});\n\nexport interface JcProviderProps {\n /** Overrides adicionais, mesclados sobre o tema JC Decor */\n theme?: MantineThemeOverride;\n /** @default 'light' */\n defaultColorScheme?: MantineColorScheme;\n forceColorScheme?: 'light' | 'dark';\n cssVariablesResolver?: CSSVariablesResolver;\n /** Chave do localStorage onde o tema claro/escuro é lembrado; `false` desliga @default 'mantine-color-scheme-value' */\n colorSchemeStorageKey?: string | false;\n}\n\n/**\n * Provider do Design System JC Decor: MantineProvider + tema + variáveis `--ds-*`\n * + tema claro/escuro lembrado no localStorage. Demais props vão para o `MantineProvider`.\n *\n * ```vue\n * <script setup>\n * import '@mantine-vue/core/styles.css';\n * import '@jcdecor/vue/styles.css';\n * import { JcProvider } from '@jcdecor/vue';\n * </script>\n * <template><JcProvider><App /></JcProvider></template>\n * ```\n */\nexport const JcProvider = defineComponent({\n name: 'JcProvider',\n inheritAttrs: false,\n props: {\n theme: { type: Object as PropType<MantineThemeOverride>, default: undefined },\n defaultColorScheme: { type: String as PropType<MantineColorScheme>, default: 'light' },\n forceColorScheme: { type: String as PropType<'light' | 'dark'>, default: undefined },\n cssVariablesResolver: { type: Function as PropType<CSSVariablesResolver>, default: undefined },\n colorSchemeStorageKey: { type: [String, Boolean] as PropType<string | false>, default: COLOR_SCHEME_STORAGE_KEY },\n },\n setup(props, { attrs, slots }) {\n const theme = computed(() => (props.theme ? deepMerge(jcTheme, props.theme) : jcTheme));\n // Lido uma vez: o MantineProvider só usa o esquema inicial na montagem.\n const stored = props.colorSchemeStorageKey ? readStoredScheme(props.colorSchemeStorageKey) : undefined;\n\n return () =>\n h(\n MantineProvider,\n {\n ...attrs,\n theme: theme.value,\n defaultColorScheme: stored ?? props.defaultColorScheme,\n forceColorScheme: props.forceColorScheme,\n cssVariablesResolver: props.cssVariablesResolver ?? jcCssVariablesResolver,\n },\n () => [\n props.colorSchemeStorageKey ? h(ColorSchemePersistence, { storageKey: props.colorSchemeStorageKey }) : null,\n slots.default?.(),\n ],\n );\n },\n});\n","import { defineComponent, h, type Component, type DefineSetupFnComponent, type PropType, type SlotsType, type VNodeChild } from 'vue';\nimport { Badge, type BadgeProps } from '@mantine-vue/core';\nimport { IconAlertTriangle, IconCheck, IconInfoCircle, IconX } from '@tabler/icons-vue';\n\nexport type TagTone = 'primary' | 'success' | 'warn' | 'error' | 'neutral';\n\nconst toneColor: Record<TagTone, string> = {\n primary: 'horizon',\n success: 'evergreen',\n warn: 'electric',\n error: 'danger',\n neutral: 'obsidian',\n};\n\nconst toneIcon: Record<TagTone, Component | null> = {\n primary: IconInfoCircle,\n success: IconCheck,\n warn: IconAlertTriangle,\n error: IconX,\n neutral: null,\n};\n\nexport interface TagProps extends Omit<BadgeProps, 'color' | 'variant'> {\n /** Tom semântico (ds-tag-*) @default 'primary' */\n tone?: TagTone;\n /** Mostra o ícone padrão do tom (✓ ⚠ ✕ ⓘ). Use o slot/prop `leftSection` para outro ícone. */\n withIcon?: boolean;\n /** `light` = selo suave (padrão) · `filled` = cor sólida · `outline` · `dot` */\n variant?: 'light' | 'filled' | 'outline' | 'dot';\n}\n\nexport interface TagSlots {\n default?: () => VNodeChild;\n leftSection?: () => VNodeChild;\n rightSection?: () => VNodeChild;\n}\n\n/** Selo / tag de status — preset de Badge com os tons do ds.css. */\nexport const Tag = defineComponent({\n name: 'Tag',\n inheritAttrs: false,\n props: {\n tone: { type: String as PropType<TagTone>, default: 'primary' },\n withIcon: { type: Boolean, default: false },\n variant: { type: String as PropType<TagProps['variant']>, default: 'light' },\n },\n setup(props, { attrs, slots }) {\n return () => {\n const Icon = toneIcon[props.tone];\n // Slot ou prop `leftSection` (camelCase ou kebab-case no template) do usuário têm prioridade\n const hasCustom = slots.leftSection || attrs.leftSection !== undefined || attrs['left-section'] !== undefined;\n const leftSection = slots.leftSection ?? (!hasCustom && props.withIcon && Icon ? () => h(Icon, { size: 12, stroke: 2.5 }) : undefined);\n return h(\n Badge as any,\n { color: toneColor[props.tone], variant: props.variant, 'data-tone': props.tone, ...attrs },\n { ...slots, ...(leftSection && { leftSection }) },\n );\n };\n },\n}) as unknown as DefineSetupFnComponent<TagProps, {}, SlotsType<TagSlots>>;\n","import { Comment, Fragment, Text, camelize, getCurrentInstance, isVNode, toHandlerKey, type PropType, type VNodeChild } from 'vue';\nimport { resolveNode, type MantineNode } from '@mantine-vue/core';\n\n/**\n * Indica se há conteúdo renderizável. Diferente do `hasNode` do Mantine Vue, trata como vazio\n * um slot que só devolveu comentários (`v-if` falso), texto em branco ou arrays/fragments vazios.\n */\nexport function hasContent(node: VNodeChild): boolean {\n if (node === null || node === undefined || node === false || node === true || node === '') return false;\n if (Array.isArray(node)) return node.some((child) => hasContent(child as VNodeChild));\n if (isVNode(node)) {\n if (node.type === Comment) return false;\n if (node.type === Text) return typeof node.children === 'string' && node.children.trim() !== '';\n if (node.type === Fragment) return hasContent(node.children as VNodeChild);\n }\n return true;\n}\n\n/** `resolveNode` do Mantine Vue (slot > prop) já normalizado para `undefined` quando vazio. */\nexport function resolveContent(prop: MantineNode | undefined, slot?: () => VNodeChild): VNodeChild {\n const node = resolveNode(prop, slot);\n return hasContent(node) ? node : undefined;\n}\n\n/**\n * Equivalente ao `if (onAction)` do React: devolve uma função que diz se o pai registrou um listener\n * para o evento (`@action`, `v-model:favorite` → `onUpdate:favorite`…). Chame no setup e use a\n * função durante o render.\n *\n * Os listeners de eventos declarados em `emits` não chegam em `attrs`, então a checagem é feita nas\n * props do VNode do componente. Limitação do Vue: adicionar/remover só um listener (sem mudar\n * nenhuma prop) não re-renderiza o filho.\n */\nexport function useListenerCheck() {\n const instance = getCurrentInstance();\n return (event: string): boolean => {\n const props = instance?.vnode.props;\n if (!props) return false;\n return Boolean(props[toHandlerKey(event)] || props[toHandlerKey(camelize(event))]);\n };\n}\n\n/**\n * Declaração runtime de uma prop `MantineNode` (texto, número, VNode ou função) para `defineComponent`.\n * `type: null` aceita qualquer valor e evita o cast booleano do Vue.\n */\nexport const nodeProp = { type: null as unknown as PropType<MantineNode>, default: undefined };\n","import { createVarsResolver, getRadius } from '@mantine-vue/core';\nimport type { PromoBannerProps } from './PromoBanner.types';\n\nconst palette = {\n horizon: { bg: 'var(--dc-horizon-700)', color: '#fff', highlight: 'var(--dc-electric)' },\n electric: { bg: 'var(--dc-electric)', color: 'var(--dc-obsidian)', highlight: 'var(--dc-horizon-700)' },\n obsidian: { bg: 'var(--dc-obsidian)', color: '#fff', highlight: 'var(--dc-electric)' },\n};\n\nexport const varsResolver = createVarsResolver<PromoBannerProps>((_theme, { variant = 'horizon', radius }) => ({\n root: {\n '--banner-bg': palette[variant].bg,\n '--banner-color': palette[variant].color,\n '--banner-highlight': palette[variant].highlight,\n '--banner-radius': radius === undefined ? undefined : getRadius(radius),\n },\n}));\n","/* @generated sincronizado de packages/ui/src/components/PromoBanner/PromoBanner.module.css — edite lá e rode `npm run sync -w @jcdecor/vue` */\n.root {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--sp-8);\n padding: var(--sp-12) var(--sp-20);\n font-weight: 600;\n font-size: var(--type-subheadline-rg);\n line-height: 1.4;\n text-align: center;\n position: relative;\n background: var(--banner-bg);\n color: var(--banner-color);\n}\n.root[data-closable] {\n padding-inline: var(--sp-40);\n}\n.root[data-radius] {\n border-radius: var(--banner-radius);\n}\n.root :where(strong),\n.highlight {\n color: var(--banner-highlight);\n font-weight: 700;\n}\n.content {\n display: inline-flex;\n align-items: center;\n gap: var(--sp-8);\n flex-wrap: wrap;\n justify-content: center;\n}\n.close {\n position: absolute;\n right: var(--sp-8);\n top: 50%;\n transform: translateY(-50%);\n color: inherit;\n}\n","<script setup lang=\"ts\">\nimport { useAttrs, useSlots } from 'vue';\nimport { Box, CloseButton, useProps, useStyles } from '@mantine-vue/core';\nimport { useUncontrolled } from '@mantine-vue/hooks';\nimport { hasContent, resolveContent } from '../../utils/vue';\nimport type { PromoBannerEmits, PromoBannerOwnProps, PromoBannerSlots } from './PromoBanner.types';\nimport { varsResolver } from './PromoBanner.vars';\nimport classes from './PromoBanner.module.css';\n\ndefineOptions({ name: 'PromoBanner', inheritAttrs: false });\n\n// `undefined` explícito: os padrões vêm do useProps, e `opened` ausente (≠ false) deixa o banner não controlado.\nconst rawProps = withDefaults(defineProps<PromoBannerOwnProps>(), {\n variant: undefined,\n highlight: undefined,\n icon: undefined,\n withCloseButton: undefined,\n opened: undefined,\n radius: undefined,\n classNames: undefined,\n styles: undefined,\n vars: undefined,\n unstyled: undefined,\n});\ndefineSlots<PromoBannerSlots>();\nconst emit = defineEmits<PromoBannerEmits>();\n\nconst attrs = useAttrs();\nconst slots = useSlots();\nconst props = useProps('PromoBanner', { variant: 'horizon' }, rawProps);\n\nconst [open, setOpen] = useUncontrolled({\n value: () => props.opened,\n defaultValue: true,\n onChange: (value) => emit('update:opened', value),\n});\n\nconst getStyles = useStyles({\n name: 'PromoBanner',\n classes,\n props,\n get className() { return attrs.class; },\n get style() { return attrs.style as any; },\n get classNames() { return props.classNames as any; },\n get styles() { return props.styles as any; },\n get vars() { return props.vars as any; },\n get unstyled() { return props.unstyled; },\n varsResolver,\n});\n\nconst icon = () => resolveContent(props.icon, slots.icon);\nconst highlight = () => resolveContent(props.highlight, slots.highlight);\n\nfunction close() {\n setOpen(false);\n emit('close');\n}\n</script>\n\n<template>\n <Box\n v-if=\"open\"\n role=\"note\"\n v-bind=\"{ ...attrs, ...getStyles('root') }\"\n :variant=\"props.variant\"\n :mod=\"[{ radius: props.radius !== undefined, closable: props.withCloseButton }, (attrs as any).mod]\"\n >\n <span v-bind=\"getStyles('content')\">\n <component :is=\"icon\" />\n <span><slot /></span>\n <strong v-if=\"hasContent(highlight())\" v-bind=\"getStyles('highlight')\"><component :is=\"highlight\" /></strong>\n </span>\n <CloseButton\n v-if=\"props.withCloseButton\"\n aria-label=\"Fechar\"\n size=\"sm\"\n variant=\"transparent\"\n v-bind=\"getStyles('close')\"\n @click=\"close\"\n />\n </Box>\n</template>\n","<script setup lang=\"ts\">\nimport { useAttrs, useSlots } from 'vue';\nimport { Box, CloseButton, useProps, useStyles } from '@mantine-vue/core';\nimport { useUncontrolled } from '@mantine-vue/hooks';\nimport { hasContent, resolveContent } from '../../utils/vue';\nimport type { PromoBannerEmits, PromoBannerOwnProps, PromoBannerSlots } from './PromoBanner.types';\nimport { varsResolver } from './PromoBanner.vars';\nimport classes from './PromoBanner.module.css';\n\ndefineOptions({ name: 'PromoBanner', inheritAttrs: false });\n\n// `undefined` explícito: os padrões vêm do useProps, e `opened` ausente (≠ false) deixa o banner não controlado.\nconst rawProps = withDefaults(defineProps<PromoBannerOwnProps>(), {\n variant: undefined,\n highlight: undefined,\n icon: undefined,\n withCloseButton: undefined,\n opened: undefined,\n radius: undefined,\n classNames: undefined,\n styles: undefined,\n vars: undefined,\n unstyled: undefined,\n});\ndefineSlots<PromoBannerSlots>();\nconst emit = defineEmits<PromoBannerEmits>();\n\nconst attrs = useAttrs();\nconst slots = useSlots();\nconst props = useProps('PromoBanner', { variant: 'horizon' }, rawProps);\n\nconst [open, setOpen] = useUncontrolled({\n value: () => props.opened,\n defaultValue: true,\n onChange: (value) => emit('update:opened', value),\n});\n\nconst getStyles = useStyles({\n name: 'PromoBanner',\n classes,\n props,\n get className() { return attrs.class; },\n get style() { return attrs.style as any; },\n get classNames() { return props.classNames as any; },\n get styles() { return props.styles as any; },\n get vars() { return props.vars as any; },\n get unstyled() { return props.unstyled; },\n varsResolver,\n});\n\nconst icon = () => resolveContent(props.icon, slots.icon);\nconst highlight = () => resolveContent(props.highlight, slots.highlight);\n\nfunction close() {\n setOpen(false);\n emit('close');\n}\n</script>\n\n<template>\n <Box\n v-if=\"open\"\n role=\"note\"\n v-bind=\"{ ...attrs, ...getStyles('root') }\"\n :variant=\"props.variant\"\n :mod=\"[{ radius: props.radius !== undefined, closable: props.withCloseButton }, (attrs as any).mod]\"\n >\n <span v-bind=\"getStyles('content')\">\n <component :is=\"icon\" />\n <span><slot /></span>\n <strong v-if=\"hasContent(highlight())\" v-bind=\"getStyles('highlight')\"><component :is=\"highlight\" /></strong>\n </span>\n <CloseButton\n v-if=\"props.withCloseButton\"\n aria-label=\"Fechar\"\n size=\"sm\"\n variant=\"transparent\"\n v-bind=\"getStyles('close')\"\n @click=\"close\"\n />\n </Box>\n</template>\n","import { factory } from '@mantine-vue/core';\nimport PromoBannerComponent from './PromoBanner.vue';\nimport type { PromoBannerFactory } from './PromoBanner.types';\nimport { varsResolver } from './PromoBanner.vars';\nimport classes from './PromoBanner.module.css';\n\n/** Banner promocional (topo do site / campanhas). Suporta `v-model:opened`. */\nexport const PromoBanner = factory<PromoBannerFactory>(PromoBannerComponent, { classes, varsResolver });\n\nexport type {\n PromoBannerCssVariables,\n PromoBannerEmits,\n PromoBannerFactory,\n PromoBannerOwnProps,\n PromoBannerProps,\n PromoBannerSlots,\n PromoBannerStylesNames,\n PromoBannerVariant,\n} from './PromoBanner.types';\n","/* @generated sincronizado de packages/ui/src/components/ContentCard/ContentCard.module.css — edite lá e rode `npm run sync -w @jcdecor/vue` */\n.root {\n display: flex;\n flex-direction: column;\n}\n.image {\n margin: calc(var(--card-padding) * -1) calc(var(--card-padding) * -1) var(--sp-16);\n}\n.image img {\n display: block;\n width: 100%;\n object-fit: cover;\n}\n.kicker {}\n.title {\n font-size: var(--type-headline-sm);\n font-weight: 600;\n line-height: 1.3;\n margin: var(--sp-8) 0 var(--sp-4);\n color: var(--ds-text);\n}\n.body {\n color: var(--ds-text-2);\n flex: 1;\n}\n.actions {\n margin-top: var(--sp-16);\n display: flex;\n gap: var(--sp-8);\n flex-wrap: wrap;\n}\n","<script setup lang=\"ts\">\nimport { useAttrs, useSlots } from 'vue';\nimport { useProps, useStyles } from '@mantine-vue/core';\nimport { Card } from '../../theme/themeDefaults';\nimport { Kicker } from '../Typography';\nimport { hasContent, resolveContent } from '../../utils/vue';\nimport type { ContentCardOwnProps, ContentCardSlots } from './ContentCard.types';\nimport classes from './ContentCard.module.css';\n\ndefineOptions({ name: 'ContentCard', inheritAttrs: false });\n\n// `undefined` explícito: os padrões vêm do useProps, para que theme.components.ContentCard.defaultProps funcione.\nconst rawProps = withDefaults(defineProps<ContentCardOwnProps>(), {\n kicker: undefined,\n title: undefined,\n image: undefined,\n imageAlt: undefined,\n imageHeight: undefined,\n actions: undefined,\n classNames: undefined,\n styles: undefined,\n vars: undefined,\n unstyled: undefined,\n});\ndefineSlots<ContentCardSlots>();\n\nconst attrs = useAttrs();\nconst slots = useSlots();\nconst props = useProps('ContentCard', { imageHeight: 180 }, rawProps);\n\n// Getters: o useStyles lê o input a cada chamada, então class/style/classNames continuam reativos.\nconst getStyles = useStyles({\n name: 'ContentCard',\n classes,\n props,\n get className() { return attrs.class; },\n get style() { return attrs.style as any; },\n get classNames() { return props.classNames as any; },\n get styles() { return props.styles as any; },\n get vars() { return props.vars as any; },\n get unstyled() { return props.unstyled; },\n});\n\nconst kicker = () => resolveContent(props.kicker, slots.kicker);\nconst title = () => resolveContent(props.title, slots.title);\nconst actions = () => resolveContent(props.actions, slots.actions);\nconst body = () => resolveContent(undefined, slots.default);\n/** URL (string) vira <img>; slot ou nó customizado é renderizado como está. */\nconst imageUrl = () => (!slots.image && typeof props.image === 'string' && props.image ? props.image : undefined);\nconst imageNode = () => resolveContent(props.image, slots.image);\n</script>\n\n<template>\n <Card v-bind=\"{ ...attrs, ...getStyles('root') }\">\n <div v-if=\"imageUrl() || hasContent(imageNode())\" v-bind=\"getStyles('image')\">\n <img\n v-if=\"imageUrl()\"\n :src=\"imageUrl()\"\n :alt=\"props.imageAlt ?? ''\"\n :style=\"{ height: `${props.imageHeight}px` }\"\n />\n <component :is=\"imageNode\" v-else />\n </div>\n <Kicker v-if=\"hasContent(kicker())\" v-bind=\"getStyles('kicker')\"><component :is=\"kicker\" /></Kicker>\n <div v-if=\"hasContent(title())\" v-bind=\"getStyles('title')\"><component :is=\"title\" /></div>\n <div v-if=\"hasContent(body())\" v-bind=\"getStyles('body')\"><component :is=\"body\" /></div>\n <div v-if=\"hasContent(actions())\" v-bind=\"getStyles('actions')\"><component :is=\"actions\" /></div>\n </Card>\n</template>\n","<script setup lang=\"ts\">\nimport { useAttrs, useSlots } from 'vue';\nimport { useProps, useStyles } from '@mantine-vue/core';\nimport { Card } from '../../theme/themeDefaults';\nimport { Kicker } from '../Typography';\nimport { hasContent, resolveContent } from '../../utils/vue';\nimport type { ContentCardOwnProps, ContentCardSlots } from './ContentCard.types';\nimport classes from './ContentCard.module.css';\n\ndefineOptions({ name: 'ContentCard', inheritAttrs: false });\n\n// `undefined` explícito: os padrões vêm do useProps, para que theme.components.ContentCard.defaultProps funcione.\nconst rawProps = withDefaults(defineProps<ContentCardOwnProps>(), {\n kicker: undefined,\n title: undefined,\n image: undefined,\n imageAlt: undefined,\n imageHeight: undefined,\n actions: undefined,\n classNames: undefined,\n styles: undefined,\n vars: undefined,\n unstyled: undefined,\n});\ndefineSlots<ContentCardSlots>();\n\nconst attrs = useAttrs();\nconst slots = useSlots();\nconst props = useProps('ContentCard', { imageHeight: 180 }, rawProps);\n\n// Getters: o useStyles lê o input a cada chamada, então class/style/classNames continuam reativos.\nconst getStyles = useStyles({\n name: 'ContentCard',\n classes,\n props,\n get className() { return attrs.class; },\n get style() { return attrs.style as any; },\n get classNames() { return props.classNames as any; },\n get styles() { return props.styles as any; },\n get vars() { return props.vars as any; },\n get unstyled() { return props.unstyled; },\n});\n\nconst kicker = () => resolveContent(props.kicker, slots.kicker);\nconst title = () => resolveContent(props.title, slots.title);\nconst actions = () => resolveContent(props.actions, slots.actions);\nconst body = () => resolveContent(undefined, slots.default);\n/** URL (string) vira <img>; slot ou nó customizado é renderizado como está. */\nconst imageUrl = () => (!slots.image && typeof props.image === 'string' && props.image ? props.image : undefined);\nconst imageNode = () => resolveContent(props.image, slots.image);\n</script>\n\n<template>\n <Card v-bind=\"{ ...attrs, ...getStyles('root') }\">\n <div v-if=\"imageUrl() || hasContent(imageNode())\" v-bind=\"getStyles('image')\">\n <img\n v-if=\"imageUrl()\"\n :src=\"imageUrl()\"\n :alt=\"props.imageAlt ?? ''\"\n :style=\"{ height: `${props.imageHeight}px` }\"\n />\n <component :is=\"imageNode\" v-else />\n </div>\n <Kicker v-if=\"hasContent(kicker())\" v-bind=\"getStyles('kicker')\"><component :is=\"kicker\" /></Kicker>\n <div v-if=\"hasContent(title())\" v-bind=\"getStyles('title')\"><component :is=\"title\" /></div>\n <div v-if=\"hasContent(body())\" v-bind=\"getStyles('body')\"><component :is=\"body\" /></div>\n <div v-if=\"hasContent(actions())\" v-bind=\"getStyles('actions')\"><component :is=\"actions\" /></div>\n </Card>\n</template>\n","import { factory } from '@mantine-vue/core';\nimport ContentCardComponent from './ContentCard.vue';\nimport type { ContentCardFactory } from './ContentCard.types';\nimport classes from './ContentCard.module.css';\n\n/** Card de conteúdo: superfície branca sobre LightGray, borda suave e sombra pequena (ds-card). */\nexport const ContentCard = factory<ContentCardFactory>(ContentCardComponent, { classes });\n\nexport type {\n ContentCardFactory,\n ContentCardOwnProps,\n ContentCardProps,\n ContentCardSlots,\n ContentCardStylesNames,\n} from './ContentCard.types';\n","import { createVarsResolver } from '@mantine-vue/core';\nimport type { KpiCardProps } from './KpiCard.types';\n\nexport function getDeltaTone(delta: number | undefined, invert = false): 'up' | 'down' | 'flat' {\n if (delta === undefined || delta === 0 || Number.isNaN(delta)) return 'flat';\n const positive = delta > 0;\n return positive !== invert ? 'up' : 'down';\n}\n\nconst toneColor = { up: 'var(--ds-success)', down: 'var(--ds-error)', flat: 'var(--ds-text-3)' };\n\nexport const varsResolver = createVarsResolver<KpiCardProps>((_theme, { delta, invertDelta, colorValue }) => {\n const tone = getDeltaTone(delta, invertDelta);\n return {\n root: {\n '--kpi-delta-color': toneColor[tone],\n '--kpi-value-color': colorValue && tone !== 'flat' ? toneColor[tone] : undefined,\n },\n };\n});\n","/* @generated sincronizado de packages/ui/src/components/KpiCard/KpiCard.module.css — edite lá e rode `npm run sync -w @jcdecor/vue` */\n.root {\n background: var(--ds-surface);\n border: 1px solid var(--ds-border-soft);\n border-radius: var(--ds-radius);\n padding: var(--sp-16) var(--sp-20);\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: var(--sp-4);\n}\n.header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--sp-8);\n}\n.label {\n font-size: var(--type-disclaimer);\n font-weight: 500;\n color: var(--ds-text-3);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n}\n.icon {\n color: var(--ds-text-3);\n display: inline-flex;\n}\n.value {\n font-size: var(--type-headline-md);\n overflow-wrap: anywhere;\n font-weight: 700;\n line-height: 1.25;\n font-variant-numeric: tabular-nums;\n color: var(--kpi-value-color, var(--ds-text));\n}\n.footer {\n display: flex;\n align-items: center;\n gap: var(--sp-8);\n flex-wrap: wrap;\n font-size: var(--type-disclaimer);\n color: var(--ds-text-3);\n}\n.delta {\n display: inline-flex;\n align-items: center;\n gap: 2px;\n font-weight: 600;\n font-variant-numeric: tabular-nums;\n color: var(--kpi-delta-color);\n}\n.chart {\n margin-top: var(--sp-8);\n}\n","<script setup lang=\"ts\">\nimport { useAttrs, useSlots } from 'vue';\nimport { Box, Skeleton, useProps, useStyles } from '@mantine-vue/core';\nimport { IconArrowDownRight, IconArrowUpRight, IconMinus } from '@tabler/icons-vue';\nimport { formatNumber, formatPercent } from '../../utils/format';\nimport { hasContent, resolveContent } from '../../utils/vue';\nimport type { KpiCardOwnProps, KpiCardSlots } from './KpiCard.types';\nimport { getDeltaTone, varsResolver } from './KpiCard.vars';\nimport classes from './KpiCard.module.css';\n\ndefineOptions({ name: 'KpiCard', inheritAttrs: false });\n\n// `undefined` explícito: os padrões vêm do useProps, para que theme.components.KpiCard.defaultProps funcione.\nconst rawProps = withDefaults(defineProps<KpiCardOwnProps>(), {\n label: undefined,\n value: undefined,\n delta: undefined,\n deltaLabel: undefined,\n invertDelta: undefined,\n colorValue: undefined,\n icon: undefined,\n chart: undefined,\n loading: undefined,\n classNames: undefined,\n styles: undefined,\n vars: undefined,\n unstyled: undefined,\n});\ndefineSlots<KpiCardSlots>();\n\nconst attrs = useAttrs();\nconst slots = useSlots();\nconst props = useProps('KpiCard', {}, rawProps);\n\nconst getStyles = useStyles({\n name: 'KpiCard',\n classes,\n props,\n get className() { return attrs.class; },\n get style() { return attrs.style as any; },\n get classNames() { return props.classNames as any; },\n get styles() { return props.styles as any; },\n get vars() { return props.vars as any; },\n get unstyled() { return props.unstyled; },\n varsResolver,\n});\n\nconst label = () => resolveContent(props.label, slots.label);\nconst value = () => {\n const node = resolveContent(props.value, slots.value);\n return typeof node === 'number' ? formatNumber(node) : node;\n};\nconst deltaLabel = () => resolveContent(props.deltaLabel, slots.deltaLabel);\nconst icon = () => resolveContent(props.icon, slots.icon);\nconst chart = () => resolveContent(props.chart, slots.chart);\n\nconst tone = () => getDeltaTone(props.delta, props.invertDelta);\nconst arrowIcon = () =>\n props.delta === undefined || props.delta === 0 ? IconMinus : props.delta > 0 ? IconArrowUpRight : IconArrowDownRight;\n</script>\n\n<template>\n <Box v-bind=\"{ ...attrs, ...getStyles('root') }\">\n <div v-bind=\"getStyles('header')\">\n <span v-bind=\"getStyles('label')\"><component :is=\"label\" /></span>\n <span v-if=\"hasContent(icon())\" v-bind=\"getStyles('icon')\"><component :is=\"icon\" /></span>\n </div>\n <Skeleton v-if=\"props.loading\" :height=\"32\" width=\"60%\" :mt=\"4\" />\n <div v-else v-bind=\"getStyles('value')\"><component :is=\"value\" /></div>\n <div v-if=\"(props.delta !== undefined || hasContent(deltaLabel())) && !props.loading\" v-bind=\"getStyles('footer')\">\n <span v-if=\"props.delta !== undefined\" v-bind=\"getStyles('delta')\" :data-tone=\"tone()\">\n <component :is=\"arrowIcon()\" :size=\"14\" stroke=\"2.5\" />\n {{ formatPercent(props.delta, { signed: true }) }}\n </span>\n <span v-if=\"hasContent(deltaLabel())\"><component :is=\"deltaLabel\" /></span>\n </div>\n <div v-if=\"hasContent(chart())\" v-bind=\"getStyles('chart')\"><component :is=\"chart\" /></div>\n </Box>\n</template>\n","<script setup lang=\"ts\">\nimport { useAttrs, useSlots } from 'vue';\nimport { Box, Skeleton, useProps, useStyles } from '@mantine-vue/core';\nimport { IconArrowDownRight, IconArrowUpRight, IconMinus } from '@tabler/icons-vue';\nimport { formatNumber, formatPercent } from '../../utils/format';\nimport { hasContent, resolveContent } from '../../utils/vue';\nimport type { KpiCardOwnProps, KpiCardSlots } from './KpiCard.types';\nimport { getDeltaTone, varsResolver } from './KpiCard.vars';\nimport classes from './KpiCard.module.css';\n\ndefineOptions({ name: 'KpiCard', inheritAttrs: false });\n\n// `undefined` explícito: os padrões vêm do useProps, para que theme.components.KpiCard.defaultProps funcione.\nconst rawProps = withDefaults(defineProps<KpiCardOwnProps>(), {\n label: undefined,\n value: undefined,\n delta: undefined,\n deltaLabel: undefined,\n invertDelta: undefined,\n colorValue: undefined,\n icon: undefined,\n chart: undefined,\n loading: undefined,\n classNames: undefined,\n styles: undefined,\n vars: undefined,\n unstyled: undefined,\n});\ndefineSlots<KpiCardSlots>();\n\nconst attrs = useAttrs();\nconst slots = useSlots();\nconst props = useProps('KpiCard', {}, rawProps);\n\nconst getStyles = useStyles({\n name: 'KpiCard',\n classes,\n props,\n get className() { return attrs.class; },\n get style() { return attrs.style as any; },\n get classNames() { return props.classNames as any; },\n get styles() { return props.styles as any; },\n get vars() { return props.vars as any; },\n get unstyled() { return props.unstyled; },\n varsResolver,\n});\n\nconst label = () => resolveContent(props.label, slots.label);\nconst value = () => {\n const node = resolveContent(props.value, slots.value);\n return typeof node === 'number' ? formatNumber(node) : node;\n};\nconst deltaLabel = () => resolveContent(props.deltaLabel, slots.deltaLabel);\nconst icon = () => resolveContent(props.icon, slots.icon);\nconst chart = () => resolveContent(props.chart, slots.chart);\n\nconst tone = () => getDeltaTone(props.delta, props.invertDelta);\nconst arrowIcon = () =>\n props.delta === undefined || props.delta === 0 ? IconMinus : props.delta > 0 ? IconArrowUpRight : IconArrowDownRight;\n</script>\n\n<template>\n <Box v-bind=\"{ ...attrs, ...getStyles('root') }\">\n <div v-bind=\"getStyles('header')\">\n <span v-bind=\"getStyles('label')\"><component :is=\"label\" /></span>\n <span v-if=\"hasContent(icon())\" v-bind=\"getStyles('icon')\"><component :is=\"icon\" /></span>\n </div>\n <Skeleton v-if=\"props.loading\" :height=\"32\" width=\"60%\" :mt=\"4\" />\n <div v-else v-bind=\"getStyles('value')\"><component :is=\"value\" /></div>\n <div v-if=\"(props.delta !== undefined || hasContent(deltaLabel())) && !props.loading\" v-bind=\"getStyles('footer')\">\n <span v-if=\"props.delta !== undefined\" v-bind=\"getStyles('delta')\" :data-tone=\"tone()\">\n <component :is=\"arrowIcon()\" :size=\"14\" stroke=\"2.5\" />\n {{ formatPercent(props.delta, { signed: true }) }}\n </span>\n <span v-if=\"hasContent(deltaLabel())\"><component :is=\"deltaLabel\" /></span>\n </div>\n <div v-if=\"hasContent(chart())\" v-bind=\"getStyles('chart')\"><component :is=\"chart\" /></div>\n </Box>\n</template>\n","import { defineComponent, h, type DefineSetupFnComponent, type PropType, type SlotsType, type VNodeChild } from 'vue';\nimport { SimpleGrid, type SimpleGridProps } from '@mantine-vue/core';\n\nexport type KpiGroupProps = SimpleGridProps;\n\n/**\n * Grade responsiva de KPIs baseada na largura do CONTÊINER (container queries), não da tela:\n * 1 coluna até 440px · 2 até 880px · 4 acima. Funciona igual em página cheia, ao lado de sidebar ou dentro de card.\n */\nexport const KpiGroup = defineComponent({\n name: 'KpiGroup',\n inheritAttrs: false,\n props: {\n cols: { type: [Number, Object] as PropType<SimpleGridProps['cols']>, default: () => ({ base: 1, '440px': 2, '880px': 4 }) },\n spacing: { type: [String, Number, Object] as PropType<SimpleGridProps['spacing']>, default: 'md' },\n type: { type: String as PropType<SimpleGridProps['type']>, default: 'container' },\n },\n setup(props, { attrs, slots }) {\n return () => h(SimpleGrid as any, { type: props.type, cols: props.cols, spacing: props.spacing, ...attrs }, slots);\n },\n}) as unknown as DefineSetupFnComponent<KpiGroupProps, {}, SlotsType<{ default?: () => VNodeChild }>>;\n","import { factory } from '@mantine-vue/core';\nimport KpiCardComponent from './KpiCard.vue';\nimport type { KpiCardFactory } from './KpiCard.types';\nimport { varsResolver } from './KpiCard.vars';\nimport classes from './KpiCard.module.css';\n\n/** Tile de KPI dos dashboards (ds-kpi). */\nexport const KpiCard = factory<KpiCardFactory>(KpiCardComponent, { classes, varsResolver });\n\nexport { getDeltaTone } from './KpiCard.vars';\nexport { KpiGroup, type KpiGroupProps } from './KpiGroup';\nexport type {\n KpiCardCssVariables,\n KpiCardFactory,\n KpiCardOwnProps,\n KpiCardProps,\n KpiCardSlots,\n KpiCardStylesNames,\n} from './KpiCard.types';\n","import { createVarsResolver, rem } from '@mantine-vue/core';\nimport type { PageHeaderProps } from './PageHeader.types';\n\nexport const varsResolver = createVarsResolver<PageHeaderProps>((_theme, { iconSize }) => ({\n root: {\n '--page-header-icon-size': iconSize === undefined ? undefined : typeof iconSize === 'number' ? rem(iconSize) : iconSize,\n },\n}));\n","/* @generated sincronizado de packages/ui/src/components/PageHeader/PageHeader.module.css — edite lá e rode `npm run sync -w @jcdecor/vue` */\n.root {\n --page-header-icon-size: 48px;\n margin-bottom: var(--mantine-spacing-xl);\n}\n.breadcrumbs {\n margin-bottom: var(--mantine-spacing-sm);\n}\n.header {\n display: flex;\n flex-wrap: wrap;\n justify-content: space-between;\n align-items: flex-end;\n gap: var(--mantine-spacing-md);\n}\n.main {\n flex: 1 1 320px;\n min-width: 0;\n display: flex;\n align-items: flex-start;\n gap: var(--sp-16);\n}\n.icon {\n flex-shrink: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--page-header-icon-size);\n height: var(--page-header-icon-size);\n border-radius: var(--ds-radius);\n background: var(--ds-primary-soft);\n color: var(--ds-primary);\n}\n.icon > svg {\n width: 55%;\n height: 55%;\n}\n.body {\n flex: 1;\n min-width: 0;\n}\n.kicker {}\n.title {}\n.description {}\n.actions {\n display: flex;\n align-items: center;\n gap: var(--mantine-spacing-sm);\n}\n","<script setup lang=\"ts\">\nimport { computed, h, useAttrs, useSlots, type Component, type VNodeChild } from 'vue';\nimport { Anchor, Box, Breadcrumbs, resolveNode, useProps, useStyles } from '@mantine-vue/core';\nimport { Headline, Kicker, Subheadline } from '../Typography';\nimport { resolveContent } from '../../utils/vue';\nimport type { PageHeaderBreadcrumb, PageHeaderFactory, PageHeaderOwnProps, PageHeaderSlots } from './PageHeader.types';\nimport { varsResolver } from './PageHeader.vars';\nimport classes from './PageHeader.module.css';\n\ndefineOptions({ name: 'PageHeader', inheritAttrs: false });\n\n// Tudo `undefined` aqui para que os defaults de `theme.components.PageHeader` funcionem via useProps\nconst rawProps = withDefaults(defineProps<PageHeaderOwnProps>(), {\n kicker: undefined,\n title: undefined,\n description: undefined,\n icon: undefined,\n iconSize: undefined,\n actions: undefined,\n breadcrumbs: undefined,\n linkComponent: undefined,\n size: undefined,\n classNames: undefined,\n styles: undefined,\n vars: undefined,\n unstyled: undefined,\n});\ndefineSlots<PageHeaderSlots>();\n\nconst slots = useSlots();\nconst attrs = useAttrs();\n\nconst props = useProps('PageHeader', { linkComponent: 'a', size: 'headline' }, rawProps);\n\n// Getters: classNames/styles/class/style continuam reativos depois do setup\nconst getStyles = useStyles<PageHeaderFactory>({\n name: 'PageHeader',\n classes,\n props,\n get className() {\n return attrs.class;\n },\n get style() {\n return attrs.style as any;\n },\n get classNames() {\n return props.classNames as any;\n },\n get styles() {\n return props.styles as any;\n },\n get vars() {\n return props.vars as any;\n },\n get unstyled() {\n return props.unstyled;\n },\n varsResolver,\n});\n\n/** Renderiza um `MantineNode` (VNode, texto ou função) como componente estável. */\nconst RenderNode = (p: { node: VNodeChild }) => p.node;\nRenderNode.props = ['node'];\n\nconst linkComponent = computed<string | Component>(() => props.linkComponent ?? 'a');\nconst kicker = computed(() => resolveContent(props.kicker, slots.kicker));\nconst title = computed(() => resolveNode(props.title, slots.title));\nconst description = computed(() => resolveContent(props.description, slots.description));\nconst icon = computed(() => resolveContent(props.icon, slots.icon));\nconst actions = computed(() => resolveContent(props.actions, slots.actions));\nconst rootAttrs = computed(() => {\n const { class: _class, style: _style, ...rest } = attrs;\n return rest;\n});\n\nconst crumbNode = (crumb: PageHeaderBreadcrumb, index: number) =>\n crumb.href\n ? h(\n Anchor as any,\n {\n key: index,\n component: linkComponent.value,\n href: crumb.href,\n ...(linkComponent.value !== 'a' && { to: crumb.href }),\n fz: 'sm',\n },\n () => resolveNode(crumb.label),\n )\n : h(Box as any, { key: index, component: 'span', c: 'var(--ds-text-3)', fz: 'sm' }, () => resolveNode(crumb.label));\n</script>\n\n<template>\n <Box v-bind=\"{ ...rootAttrs, ...getStyles('root') }\">\n <Breadcrumbs\n v-if=\"props.breadcrumbs && props.breadcrumbs.length > 0\"\n v-bind=\"getStyles('breadcrumbs')\"\n fz=\"sm\"\n :separator-margin=\"6\"\n >\n <RenderNode :node=\"props.breadcrumbs.map(crumbNode)\" />\n </Breadcrumbs>\n <div v-bind=\"getStyles('header')\">\n <div v-bind=\"getStyles('main')\">\n <div v-if=\"icon !== undefined\" v-bind=\"getStyles('icon')\" aria-hidden=\"true\">\n <RenderNode :node=\"icon\" />\n </div>\n <div v-bind=\"getStyles('body')\">\n <Kicker v-if=\"kicker !== undefined\" v-bind=\"getStyles('kicker')\">\n <RenderNode :node=\"kicker\" />\n </Kicker>\n <Headline\n v-if=\"props.size === 'display'\"\n component=\"h1\"\n size=\"lg\"\n fz=\"var(--type-display-sm)\"\n :lh=\"1.15\"\n :mt=\"8\"\n v-bind=\"getStyles('title')\"\n >\n <RenderNode :node=\"title\" />\n </Headline>\n <Headline v-else component=\"h1\" size=\"lg\" :mt=\"kicker !== undefined ? 8 : 0\" v-bind=\"getStyles('title')\">\n <RenderNode :node=\"title\" />\n </Headline>\n <Subheadline\n v-if=\"description !== undefined\"\n component=\"div\"\n size=\"lg\"\n c=\"var(--ds-text-2)\"\n :maw=\"640\"\n :mt=\"8\"\n v-bind=\"getStyles('description')\"\n >\n <RenderNode :node=\"description\" />\n </Subheadline>\n </div>\n </div>\n <div v-if=\"actions !== undefined\" v-bind=\"getStyles('actions')\">\n <RenderNode :node=\"actions\" />\n </div>\n </div>\n </Box>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, h, useAttrs, useSlots, type Component, type VNodeChild } from 'vue';\nimport { Anchor, Box, Breadcrumbs, resolveNode, useProps, useStyles } from '@mantine-vue/core';\nimport { Headline, Kicker, Subheadline } from '../Typography';\nimport { resolveContent } from '../../utils/vue';\nimport type { PageHeaderBreadcrumb, PageHeaderFactory, PageHeaderOwnProps, PageHeaderSlots } from './PageHeader.types';\nimport { varsResolver } from './PageHeader.vars';\nimport classes from './PageHeader.module.css';\n\ndefineOptions({ name: 'PageHeader', inheritAttrs: false });\n\n// Tudo `undefined` aqui para que os defaults de `theme.components.PageHeader` funcionem via useProps\nconst rawProps = withDefaults(defineProps<PageHeaderOwnProps>(), {\n kicker: undefined,\n title: undefined,\n description: undefined,\n icon: undefined,\n iconSize: undefined,\n actions: undefined,\n breadcrumbs: undefined,\n linkComponent: undefined,\n size: undefined,\n classNames: undefined,\n styles: undefined,\n vars: undefined,\n unstyled: undefined,\n});\ndefineSlots<PageHeaderSlots>();\n\nconst slots = useSlots();\nconst attrs = useAttrs();\n\nconst props = useProps('PageHeader', { linkComponent: 'a', size: 'headline' }, rawProps);\n\n// Getters: classNames/styles/class/style continuam reativos depois do setup\nconst getStyles = useStyles<PageHeaderFactory>({\n name: 'PageHeader',\n classes,\n props,\n get className() {\n return attrs.class;\n },\n get style() {\n return attrs.style as any;\n },\n get classNames() {\n return props.classNames as any;\n },\n get styles() {\n return props.styles as any;\n },\n get vars() {\n return props.vars as any;\n },\n get unstyled() {\n return props.unstyled;\n },\n varsResolver,\n});\n\n/** Renderiza um `MantineNode` (VNode, texto ou função) como componente estável. */\nconst RenderNode = (p: { node: VNodeChild }) => p.node;\nRenderNode.props = ['node'];\n\nconst linkComponent = computed<string | Component>(() => props.linkComponent ?? 'a');\nconst kicker = computed(() => resolveContent(props.kicker, slots.kicker));\nconst title = computed(() => resolveNode(props.title, slots.title));\nconst description = computed(() => resolveContent(props.description, slots.description));\nconst icon = computed(() => resolveContent(props.icon, slots.icon));\nconst actions = computed(() => resolveContent(props.actions, slots.actions));\nconst rootAttrs = computed(() => {\n const { class: _class, style: _style, ...rest } = attrs;\n return rest;\n});\n\nconst crumbNode = (crumb: PageHeaderBreadcrumb, index: number) =>\n crumb.href\n ? h(\n Anchor as any,\n {\n key: index,\n component: linkComponent.value,\n href: crumb.href,\n ...(linkComponent.value !== 'a' && { to: crumb.href }),\n fz: 'sm',\n },\n () => resolveNode(crumb.label),\n )\n : h(Box as any, { key: index, component: 'span', c: 'var(--ds-text-3)', fz: 'sm' }, () => resolveNode(crumb.label));\n</script>\n\n<template>\n <Box v-bind=\"{ ...rootAttrs, ...getStyles('root') }\">\n <Breadcrumbs\n v-if=\"props.breadcrumbs && props.breadcrumbs.length > 0\"\n v-bind=\"getStyles('breadcrumbs')\"\n fz=\"sm\"\n :separator-margin=\"6\"\n >\n <RenderNode :node=\"props.breadcrumbs.map(crumbNode)\" />\n </Breadcrumbs>\n <div v-bind=\"getStyles('header')\">\n <div v-bind=\"getStyles('main')\">\n <div v-if=\"icon !== undefined\" v-bind=\"getStyles('icon')\" aria-hidden=\"true\">\n <RenderNode :node=\"icon\" />\n </div>\n <div v-bind=\"getStyles('body')\">\n <Kicker v-if=\"kicker !== undefined\" v-bind=\"getStyles('kicker')\">\n <RenderNode :node=\"kicker\" />\n </Kicker>\n <Headline\n v-if=\"props.size === 'display'\"\n component=\"h1\"\n size=\"lg\"\n fz=\"var(--type-display-sm)\"\n :lh=\"1.15\"\n :mt=\"8\"\n v-bind=\"getStyles('title')\"\n >\n <RenderNode :node=\"title\" />\n </Headline>\n <Headline v-else component=\"h1\" size=\"lg\" :mt=\"kicker !== undefined ? 8 : 0\" v-bind=\"getStyles('title')\">\n <RenderNode :node=\"title\" />\n </Headline>\n <Subheadline\n v-if=\"description !== undefined\"\n component=\"div\"\n size=\"lg\"\n c=\"var(--ds-text-2)\"\n :maw=\"640\"\n :mt=\"8\"\n v-bind=\"getStyles('description')\"\n >\n <RenderNode :node=\"description\" />\n </Subheadline>\n </div>\n </div>\n <div v-if=\"actions !== undefined\" v-bind=\"getStyles('actions')\">\n <RenderNode :node=\"actions\" />\n </div>\n </div>\n </Box>\n</template>\n","import { factory } from '@mantine-vue/core';\nimport PageHeaderComponent from './PageHeader.vue';\nimport type { PageHeaderFactory } from './PageHeader.types';\nimport { varsResolver } from './PageHeader.vars';\nimport classes from './PageHeader.module.css';\n\n/** Cabeçalho de página: breadcrumbs, ícone, kicker, título, descrição e ações. */\nexport const PageHeader = factory<PageHeaderFactory>(PageHeaderComponent, { classes, varsResolver });\n\nexport type {\n PageHeaderBreadcrumb,\n PageHeaderCssVariables,\n PageHeaderFactory,\n PageHeaderOwnProps,\n PageHeaderProps,\n PageHeaderSlots,\n PageHeaderStylesNames,\n} from './PageHeader.types';\n","/* @generated sincronizado de packages/ui/src/components/DataTable/DataTable.module.css — edite lá e rode `npm run sync -w @jcdecor/vue` */\n.wrapper {\n background: var(--ds-surface);\n border: 1px solid var(--ds-border-soft);\n border-radius: var(--ds-radius);\n overflow: hidden;\n}\n.wrapper[data-plain] {\n background: transparent;\n border: 0;\n border-radius: 0;\n}\n.num {\n text-align: right;\n font-variant-numeric: tabular-nums;\n}\n.sortButton {\n all: unset;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n cursor: pointer;\n font: inherit;\n color: inherit;\n text-transform: inherit;\n letter-spacing: inherit;\n}\n.sortButton:hover,\n.sortButton[data-sorted] {\n color: var(--ds-text);\n}\n.sortButton:focus-visible {\n outline: 2px solid var(--ds-primary);\n outline-offset: 2px;\n border-radius: 2px;\n}\n.row[data-clickable] {\n cursor: pointer;\n}\n.row[data-clickable]:focus-visible {\n outline: 2px solid var(--ds-primary);\n outline-offset: -2px;\n}\n.footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--sp-12);\n padding: var(--sp-12);\n border-top: 1px solid var(--ds-border-soft);\n font-size: var(--type-disclaimer);\n color: var(--ds-text-3);\n flex-wrap: wrap;\n}\n","import { computed, defineComponent, h, mergeProps, ref, type SetupContext, type SlotsType, type VNodeChild } from 'vue';\nimport {\n Box,\n EmptyState,\n Pagination,\n ScrollArea,\n Skeleton,\n TableTbody,\n TableTd,\n TableTh,\n TableThead,\n TableTr,\n resolveNode,\n type BoxProps,\n type MantineNode,\n type TableProps,\n} from '@mantine-vue/core';\nimport { useUncontrolled } from '@mantine-vue/hooks';\nimport { Table } from '../../theme/themeDefaults';\nimport { IconArrowDown, IconArrowUp, IconArrowsSort, IconDatabaseOff } from '@tabler/icons-vue';\nimport { formatNumber } from '../../utils/format';\nimport { useListenerCheck } from '../../utils/vue';\nimport classes from './DataTable.module.css';\n\nexport interface DataTableColumn<T> {\n /** Chave do campo em `T` (também usada para ordenar). Omita em colunas calculadas/de ações e use `id` + `render`. */\n key?: keyof T & string;\n /** Identificador da coluna quando não há `key` (ex.: 'acoes') */\n id?: string;\n /** Cabeçalho. Também aceita o slot `header-<id>` (o slot tem prioridade). */\n header: MantineNode;\n /** Renderização customizada da célula. O slot `cell-<id>` (`{ row, index }`) tem prioridade. */\n render?: (row: T, index: number) => VNodeChild;\n /** Coluna numérica: alinhada à direita, tabular-nums e formatada em pt-BR */\n numeric?: boolean;\n /** Opções de Intl.NumberFormat para colunas numéricas */\n format?: Intl.NumberFormatOptions;\n sortable?: boolean;\n /** Valor usado na ordenação quando diferente do campo */\n sortValue?: (row: T) => string | number;\n width?: number | string;\n}\n\nexport type SortDirection = 'asc' | 'desc';\nexport interface DataTableSort<T> {\n /** `key` ou `id` da coluna ordenada */\n key: (keyof T & string) | (string & {});\n direction: SortDirection;\n}\n\n/** Props declaradas pelo próprio DataTable. As demais (style props do Box, atributos) vão para o wrapper. */\nexport interface DataTableOwnProps<T> {\n columns: DataTableColumn<T>[];\n data: T[];\n /** Chave única de cada linha @default índice */\n rowKey?: (row: T, index: number) => PropertyKey;\n /** Ordenação inicial quando não controlada */\n initialSort?: DataTableSort<T>;\n /** Controle externo da ordenação (use `v-model:sort`; `null` = sem ordenação) */\n sort?: DataTableSort<T> | null;\n /** Ativa paginação local com N linhas por página */\n pageSize?: number;\n loading?: boolean;\n /** Linhas de skeleton durante loading @default 5 */\n loadingRows?: number;\n /** Estado vazio customizado. Também aceita o slot `empty` (o slot tem prioridade). */\n empty?: MantineNode;\n /** Remove a moldura (card) em volta da tabela */\n plain?: boolean;\n striped?: boolean;\n stickyHeader?: boolean;\n /** Props repassadas para o Table do Mantine */\n tableProps?: Omit<TableProps, 'data'>;\n}\n\nexport interface DataTableProps<T> extends Omit<BoxProps, keyof DataTableOwnProps<T>>, DataTableOwnProps<T> {\n 'onUpdate:sort'?: (sort: DataTableSort<T> | null) => void;\n /** Mudança de ordenação (controlada ou não) */\n onSortChange?: (sort: DataTableSort<T> | null) => void;\n /** Clique (ou Enter/Espaço) numa linha. Torna as linhas focáveis. */\n onRowClick?: (row: T, index: number) => void;\n}\n\nexport type DataTableSlots<T> = {\n /** Estado vazio customizado */\n empty?: () => VNodeChild;\n} & {\n /** Célula da coluna `<id>` (`key` ou `id`) */\n [K in `cell-${string}`]?: (scope: { row: T; index: number }) => VNodeChild;\n} & {\n /** Cabeçalho da coluna `<id>` */\n [K in `header-${string}`]?: () => VNodeChild;\n};\n\ntype DataTableEmits<T> = {\n 'update:sort': (sort: DataTableSort<T> | null) => void;\n 'sort-change': (sort: DataTableSort<T> | null) => void;\n 'row-click': (row: T, index: number) => void;\n};\n\nconst columnId = <T>(column: DataTableColumn<T>) => (column.id ?? column.key ?? '') as string;\n\nfunction compare(a: unknown, b: unknown) {\n if (typeof a === 'number' && typeof b === 'number') return a - b;\n return String(a ?? '').localeCompare(String(b ?? ''), 'pt-BR', { numeric: true, sensitivity: 'base' });\n}\n\n/**\n * Tabela de dados com ordenação, colunas numéricas pt-BR, paginação e estados vazio/carregando.\n *\n * - `v-model:sort` (controlado) ou `initialSort` (não controlado); `@sort-change` em ambos os casos.\n * - `@row-click=\"(row, index) => …\"` torna as linhas clicáveis/focáveis.\n * - Slots: `#cell-<coluna>=\"{ row, index }\"`, `#header-<coluna>`, `#empty`.\n */\nexport const DataTable = defineComponent(\n <T extends Record<string, any>>(\n props: DataTableProps<T>,\n { attrs, slots, emit }: SetupContext<DataTableEmits<T>, SlotsType<DataTableSlots<T>>>,\n ) => {\n const [sort, setSortValue] = useUncontrolled<DataTableSort<T> | null>({\n value: () => props.sort,\n defaultValue: props.initialSort ?? null,\n onChange: (next) => {\n emit('update:sort', next);\n emit('sort-change', next);\n },\n });\n const page = ref(1);\n\n const setSort = (next: DataTableSort<T> | null) => {\n setSortValue(next);\n page.value = 1;\n };\n\n const toggleSort = (key: string) => {\n const current = sort.value;\n if (!current || current.key !== key) setSort({ key, direction: 'asc' });\n else if (current.direction === 'asc') setSort({ key, direction: 'desc' });\n else setSort(null);\n };\n\n const sorted = computed(() => {\n const current = sort.value;\n if (!current) return props.data;\n const column = props.columns.find((c) => columnId(c) === current.key);\n const getValue = column?.sortValue ?? ((row: T) => (column?.key ? row[column.key] : undefined));\n const result = [...props.data].sort((a, b) => compare(getValue(a), getValue(b)));\n return current.direction === 'desc' ? result.reverse() : result;\n });\n\n // `row-click` está em `emits`, então o listener é procurado nas props do VNode (ver useListenerCheck).\n const hasListener = useListenerCheck();\n\n return () => {\n const { columns, pageSize, loading, plain, striped, stickyHeader, tableProps } = props;\n const loadingRows = props.loadingRows ?? 5;\n const currentSort = sort.value;\n const total = sorted.value.length;\n const totalPages = pageSize ? Math.max(1, Math.ceil(total / pageSize)) : 1;\n const currentPage = Math.min(page.value, totalPages);\n const visible = pageSize ? sorted.value.slice((currentPage - 1) * pageSize, currentPage * pageSize) : sorted.value;\n const clickable = hasListener('row-click');\n\n const header = h(TableThead as any, null, () =>\n h(TableTr as any, null, () =>\n columns.map((column) => {\n const id = columnId(column);\n const isSorted = currentSort?.key === id;\n const SortIcon = !isSorted ? IconArrowsSort : currentSort!.direction === 'asc' ? IconArrowUp : IconArrowDown;\n const label = resolveNode(column.header, slots[`header-${id}`] as (() => VNodeChild) | undefined);\n return h(\n TableTh as any,\n {\n key: id,\n class: column.numeric ? classes.num : undefined,\n style: { width: typeof column.width === 'number' ? `${column.width}px` : column.width },\n 'aria-sort': isSorted ? (currentSort!.direction === 'asc' ? 'ascending' : 'descending') : undefined,\n },\n () =>\n column.sortable\n ? h(\n 'button',\n { type: 'button', class: classes.sortButton, 'data-sorted': isSorted || undefined, onClick: () => toggleSort(id) },\n [label, h(SortIcon, { size: 12, stroke: '2.5', opacity: isSorted ? 1 : 0.5 })],\n )\n : label,\n );\n }),\n ),\n );\n\n let body: VNodeChild;\n if (loading) {\n body = Array.from({ length: loadingRows }, (_, i) =>\n h(TableTr as any, { key: i }, () =>\n columns.map((column) =>\n h(TableTd as any, { key: columnId(column) }, () =>\n h(Skeleton as any, { height: 14, width: column.numeric ? '50%' : '80%', ml: column.numeric ? 'auto' : 0 }),\n ),\n ),\n ),\n );\n } else if (visible.length === 0) {\n const empty = resolveNode(props.empty, slots.empty);\n body = h(TableTr as any, null, () =>\n h(TableTd as any, { colspan: columns.length }, () =>\n empty ??\n h(EmptyState as any, {\n py: 'xl',\n size: 'sm',\n icon: () => h(IconDatabaseOff, { size: 22 }),\n title: 'Nenhum resultado',\n description: 'Não há dados para exibir com os filtros atuais.',\n }),\n ),\n );\n } else {\n body = visible.map((row, index) =>\n h(\n TableTr as any,\n {\n key: props.rowKey ? props.rowKey(row, index) : index,\n class: classes.row,\n 'data-clickable': clickable ? true : undefined,\n tabindex: clickable ? 0 : undefined,\n onClick: clickable ? () => emit('row-click', row, index) : undefined,\n onKeydown: clickable\n ? (event: KeyboardEvent) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n emit('row-click', row, index);\n }\n }\n : undefined,\n },\n () =>\n columns.map((column) => {\n const id = columnId(column);\n const cellSlot = slots[`cell-${id}`] as ((scope: { row: T; index: number }) => VNodeChild) | undefined;\n const raw = column.key ? row[column.key] : undefined;\n const content = cellSlot\n ? cellSlot({ row, index })\n : column.render\n ? column.render(row, index)\n : column.numeric && typeof raw === 'number'\n ? formatNumber(raw, column.format)\n : (raw as VNodeChild);\n return h(TableTd as any, { key: id, class: column.numeric ? classes.num : undefined }, () => content);\n }),\n ),\n );\n }\n\n return h(Box as any, mergeProps({ class: classes.wrapper, 'data-plain': plain || undefined }, attrs), () => [\n h(ScrollArea as any, { type: 'auto' }, () =>\n h(Table as any, { striped, stickyHeader, ...tableProps }, () => [header, h(TableTbody as any, null, () => body)]),\n ),\n pageSize && total > pageSize\n ? h('div', { class: classes.footer }, [\n h(\n 'span',\n `${formatNumber((currentPage - 1) * pageSize + 1)}–${formatNumber(Math.min(currentPage * pageSize, total))} de ${formatNumber(total)}`,\n ),\n h(Pagination as any, {\n size: 'sm',\n total: totalPages,\n modelValue: currentPage,\n 'onUpdate:modelValue': (value: number) => {\n page.value = value;\n },\n }),\n ])\n : null,\n ]);\n };\n },\n {\n name: 'DataTable',\n inheritAttrs: false,\n props: [\n 'columns',\n 'data',\n 'rowKey',\n 'initialSort',\n 'sort',\n 'pageSize',\n 'loading',\n 'loadingRows',\n 'empty',\n 'plain',\n 'striped',\n 'stickyHeader',\n 'tableProps',\n ],\n emits: ['update:sort', 'sort-change', 'row-click'],\n },\n);\n","import { defineComponent, h, type DefineSetupFnComponent, type PropType } from 'vue';\nimport {\n ActionIcon,\n Button,\n useComputedColorScheme,\n useMantineColorScheme,\n type ActionIconProps,\n} from '@mantine-vue/core';\nimport { IconMoon, IconSun } from '@tabler/icons-vue';\n\nexport interface ThemeToggleProps extends ActionIconProps {\n /** `icon` = ActionIcon · `button` = botão \"Alternar tema\" (como no DS) @default 'icon' */\n as?: 'icon' | 'button';\n /** @default 'Alternar tema' */\n label?: string;\n}\n\n/** Alterna entre tema claro e escuro (persistido pelo JcProvider no localStorage). */\nexport const ThemeToggle = defineComponent({\n name: 'ThemeToggle',\n inheritAttrs: false,\n props: {\n as: { type: String as PropType<NonNullable<ThemeToggleProps['as']>>, default: 'icon' },\n label: { type: String, default: 'Alternar tema' },\n variant: { type: String as PropType<ActionIconProps['variant']>, default: undefined },\n color: { type: String as PropType<ActionIconProps['color']>, default: undefined },\n size: { type: [String, Number] as PropType<ActionIconProps['size']>, default: undefined },\n },\n setup(props, { attrs }) {\n const { setColorScheme } = useMantineColorScheme();\n const computed = useComputedColorScheme('light', { getInitialValueInEffect: true });\n const toggle = () => setColorScheme(computed.value === 'dark' ? 'light' : 'dark');\n\n return () => {\n const Icon = computed.value === 'dark' ? IconSun : IconMoon;\n\n if (props.as === 'button') {\n return h(\n Button as any,\n {\n variant: props.variant ?? 'outline',\n color: props.color,\n size: props.size ?? 'sm',\n leftSection: () => h(Icon, { size: 16 }),\n onClick: toggle,\n ...attrs,\n },\n () => props.label,\n );\n }\n\n return h(\n ActionIcon as any,\n {\n variant: props.variant ?? 'subtle',\n color: props.color,\n size: props.size ?? 'lg',\n onClick: toggle,\n 'aria-label': props.label,\n title: props.label,\n ...attrs,\n },\n () => h(Icon, { size: 18 }),\n );\n };\n },\n}) as unknown as DefineSetupFnComponent<ThemeToggleProps>;\n","/* @generated sincronizado de packages/ui/src/components/TokenSwatch/TokenSwatch.module.css — edite lá e rode `npm run sync -w @jcdecor/vue` */\n.swatch {\n width: 150px;\n border: 1px solid var(--ds-border-soft);\n border-radius: var(--ds-radius-sm);\n overflow: hidden;\n background: var(--ds-surface);\n padding: 0;\n text-align: left;\n font-family: inherit;\n color: inherit;\n cursor: pointer;\n transition: box-shadow 0.15s, transform 0.15s;\n}\n.swatch:hover {\n box-shadow: var(--ds-shadow-md);\n transform: translateY(-1px);\n}\n.color {\n height: 72px;\n}\n.info {\n padding: var(--sp-8) var(--sp-12);\n}\n.name {\n font-weight: 600;\n font-size: 13px;\n}\n.hex {\n font-size: 12px;\n color: var(--ds-text-3);\n font-variant-numeric: tabular-nums;\n}\n.ramp {\n display: flex;\n border-radius: var(--ds-radius-sm);\n overflow: hidden;\n border: 1px solid var(--ds-border-soft);\n}\n.step {\n flex: 1;\n height: 44px;\n display: flex;\n align-items: flex-end;\n justify-content: center;\n font-size: 10px;\n padding: 0 0 3px;\n border: 0;\n cursor: pointer;\n font-family: inherit;\n}\n","import { defineComponent, h, mergeProps, type ButtonHTMLAttributes, type DefineSetupFnComponent, type HTMLAttributes, type PropType } from 'vue';\nimport { luminance } from '@mantine-vue/core';\nimport { Tooltip } from '../../theme/themeDefaults';\nimport { useClipboard } from '@mantine-vue/hooks';\nimport classes from './TokenSwatch.module.css';\n\nexport interface TokenSwatchProps extends Omit<ButtonHTMLAttributes, 'value' | 'name'> {\n name: string;\n /** Cor (hex) exibida e copiada */\n value: string;\n /** Variável CSS correspondente (ex.: --dc-horizon) */\n cssVar?: string;\n /** O que copiar ao clicar @default 'value' */\n copy?: 'value' | 'cssVar';\n}\n\n/** Amostra de cor clicável (copia hex ou var CSS). */\nexport const TokenSwatch = defineComponent({\n name: 'TokenSwatch',\n inheritAttrs: false,\n props: {\n name: { type: String, required: true },\n value: { type: String, required: true },\n cssVar: { type: String, default: undefined },\n copy: { type: String as PropType<NonNullable<TokenSwatchProps['copy']>>, default: 'value' },\n },\n setup(props, { attrs }) {\n const clipboard = useClipboard({ timeout: 1200 });\n return () => {\n const text = props.copy === 'cssVar' && props.cssVar ? `var(${props.cssVar})` : props.value;\n return h(Tooltip as any, { label: clipboard.copied.value ? 'Copiado!' : `Copiar ${text}`, withArrow: true }, () =>\n h('button', mergeProps({ type: 'button', class: classes.swatch, onClick: () => clipboard.copy(text) }, attrs), [\n h('div', { class: classes.color, style: { background: props.value } }),\n h('div', { class: classes.info }, [\n h('div', { class: classes.name }, props.name),\n h('div', { class: classes.hex }, props.value),\n props.cssVar ? h('div', { class: classes.hex }, props.cssVar) : null,\n ]),\n ]),\n );\n };\n },\n}) as unknown as DefineSetupFnComponent<TokenSwatchProps>;\n\nexport interface ColorRampProps extends HTMLAttributes {\n steps: { label: string; value: string; derived?: boolean }[];\n}\n\n/** Rampa de cor horizontal (base → 50). Clique copia o hex. */\nexport const ColorRamp = defineComponent({\n name: 'ColorRamp',\n inheritAttrs: false,\n props: {\n steps: { type: Array as PropType<ColorRampProps['steps']>, required: true },\n },\n setup(props, { attrs }) {\n const clipboard = useClipboard({ timeout: 1200 });\n return () =>\n h(\n 'div',\n mergeProps({ class: classes.ramp }, attrs),\n props.steps.map((step) =>\n h(Tooltip as any, { key: step.label, label: clipboard.copied.value ? 'Copiado!' : step.value, withArrow: true }, () =>\n h(\n 'button',\n {\n type: 'button',\n class: classes.step,\n style: { background: step.value, color: luminance(step.value) > 0.3 ? 'var(--dc-obsidian)' : '#fff' },\n onClick: () => clipboard.copy(step.value),\n },\n `${step.label}${step.derived ? '*' : ''}`,\n ),\n ),\n ),\n );\n },\n}) as unknown as DefineSetupFnComponent<ColorRampProps>;\n","import { defineComponent, h, type DefineSetupFnComponent, type PropType } from 'vue';\nimport { Box, Group, Text, type BoxProps } from '@mantine-vue/core';\nimport { formatCurrency } from '../../utils/format';\n\nexport interface PriceTagProps extends BoxProps {\n /** Preço atual em reais */\n value: number;\n /** Preço \"de\" (riscado) */\n oldValue?: number;\n /** Parcelamento: `{ count: 10 }` → \"ou 10x de R$ 12,99 sem juros\" */\n installments?: { count: number; interestFree?: boolean };\n /** Desconto no Pix em % (ex.: 5) → \"R$ 94,05 no Pix\" */\n pixDiscount?: number;\n /** Unidade (ex.: \"/m²\", \"/rolo\") */\n unit?: string;\n /** @default 'md' */\n size?: 'sm' | 'md' | 'lg';\n}\n\nconst valueSize = { sm: 'var(--type-subheadline-lg)', md: 'var(--type-headline-sm)', lg: 'var(--type-headline-lg)' };\n\n/** Preço em BRL com preço antigo, parcelamento e desconto Pix. */\nexport const PriceTag = defineComponent({\n name: 'PriceTag',\n inheritAttrs: false,\n props: {\n value: { type: Number, required: true },\n oldValue: { type: Number, default: undefined },\n installments: { type: Object as PropType<PriceTagProps['installments']>, default: undefined },\n pixDiscount: { type: Number, default: undefined },\n unit: { type: String, default: undefined },\n size: { type: String as PropType<NonNullable<PriceTagProps['size']>>, default: 'md' },\n },\n setup(props, { attrs }) {\n return () => {\n const { value, oldValue, installments, pixDiscount, unit, size } = props;\n return h(Box as any, attrs, () => [\n oldValue !== undefined && oldValue > value\n ? h(\n Text as any,\n { fz: 'xs', c: 'var(--ds-text-3)', td: 'line-through', 'aria-label': `Preço anterior ${formatCurrency(oldValue)}` },\n () => formatCurrency(oldValue),\n )\n : null,\n h(Group as any, { gap: 4, align: 'baseline', wrap: 'nowrap' }, () => [\n h(\n Text as any,\n { component: 'span', fz: valueSize[size], fw: 700, lh: 1.2, c: 'var(--ds-primary)', style: { fontVariantNumeric: 'tabular-nums' } },\n () => formatCurrency(value),\n ),\n unit ? h(Text as any, { component: 'span', fz: 'xs', c: 'var(--ds-text-3)', fw: 500 }, () => unit) : null,\n ]),\n pixDiscount !== undefined && pixDiscount > 0\n ? h(\n Text as any,\n { fz: 'xs', fw: 600, c: 'var(--ds-tag-success-color)' },\n () => `${formatCurrency(value * (1 - pixDiscount / 100))} no Pix (${pixDiscount}% off)`,\n )\n : null,\n installments && installments.count > 1\n ? h(\n Text as any,\n { fz: 'xs', c: 'var(--ds-text-2)' },\n () =>\n `ou ${installments.count}x de ${formatCurrency(value / installments.count)}${installments.interestFree !== false ? ' sem juros' : ''}`,\n )\n : null,\n ]);\n };\n },\n}) as unknown as DefineSetupFnComponent<PriceTagProps>;\n","/* @generated sincronizado de packages/ui/src/components/ProductCard/ProductCard.module.css — edite lá e rode `npm run sync -w @jcdecor/vue` */\n.root {\n display: flex;\n flex-direction: column;\n height: 100%;\n transition: box-shadow 0.15s, transform 0.15s;\n}\n.root[data-interactive]:hover {\n box-shadow: var(--ds-shadow-md);\n transform: translateY(-2px);\n}\n.media {\n position: relative;\n margin: calc(var(--card-padding) * -1) calc(var(--card-padding) * -1) var(--sp-16);\n background: var(--ds-surface-2);\n aspect-ratio: var(--product-ratio, 1);\n overflow: hidden;\n}\n.media img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n transition: transform 0.3s;\n}\n.root[data-interactive]:hover .media img {\n transform: scale(1.03);\n}\n.badges {\n position: absolute;\n top: var(--sp-12);\n left: var(--sp-12);\n display: flex;\n gap: var(--sp-4);\n flex-wrap: wrap;\n}\n.favorite {\n position: absolute;\n top: var(--sp-8);\n right: var(--sp-8);\n background: var(--ds-surface);\n box-shadow: var(--ds-shadow-sm);\n}\n.category {\n font-size: var(--type-disclaimer);\n font-weight: 600;\n color: var(--ds-text-3);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n}\n.name {\n font-weight: 600;\n font-size: var(--type-subheadline-rg);\n line-height: 1.35;\n color: var(--ds-text);\n text-decoration: none;\n margin: var(--sp-4) 0 var(--sp-8);\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\na.name:hover {\n color: var(--ds-primary);\n}\n.price {\n margin-top: auto;\n}\n.action {\n margin-top: var(--sp-16);\n}\n","<script setup lang=\"ts\">\nimport { useAttrs, useSlots } from 'vue';\nimport { ActionIcon, Button, Group, Rating, Text, resolveNode, useProps, useStyles } from '@mantine-vue/core';\nimport { Card } from '../../theme/themeDefaults';\nimport { IconHeart, IconHeartFilled, IconShoppingCart } from '@tabler/icons-vue';\nimport { PriceTag } from '../PriceTag';\nimport { Tag } from '../Tag';\nimport { useListenerCheck } from '../../utils/vue';\nimport type { ProductCardEmits, ProductCardOwnProps, ProductCardSlots } from './ProductCard.types';\nimport classes from './ProductCard.module.css';\n\ndefineOptions({ name: 'ProductCard', inheritAttrs: false });\n\n// `undefined` explícito: os padrões vêm do useProps, e `favorite` ausente (≠ false) esconde o coração.\nconst rawProps = withDefaults(defineProps<ProductCardOwnProps>(), {\n href: undefined,\n category: undefined,\n oldPrice: undefined,\n installments: undefined,\n pixDiscount: undefined,\n unit: undefined,\n badges: undefined,\n showDiscount: undefined,\n rating: undefined,\n reviews: undefined,\n favorite: undefined,\n actionLabel: undefined,\n imageRatio: undefined,\n linkComponent: undefined,\n classNames: undefined,\n styles: undefined,\n vars: undefined,\n unstyled: undefined,\n});\ndefineSlots<ProductCardSlots>();\nconst emit = defineEmits<ProductCardEmits>();\n\nconst attrs = useAttrs();\nconst slots = useSlots();\nconst hasListener = useListenerCheck();\nconst props = useProps(\n 'ProductCard',\n { showDiscount: true, actionLabel: 'Comprar', imageRatio: 1, linkComponent: 'a' },\n rawProps,\n);\n\nconst getStyles = useStyles({\n name: 'ProductCard',\n classes,\n props,\n get className() { return attrs.class; },\n get style() { return attrs.style as any; },\n get classNames() { return props.classNames as any; },\n get styles() { return props.styles as any; },\n get vars() { return props.vars as any; },\n get unstyled() { return props.unstyled; },\n});\n\nconst discount = () =>\n props.oldPrice && props.oldPrice > props.price ? Math.round((1 - props.price / props.oldPrice) * 100) : 0;\n/** Equivalente a `onFavoriteChange` passado no React: `v-model:favorite`, `:favorite` ou `@update:favorite`. */\nconst showFavorite = () => props.favorite !== undefined || hasListener('update:favorite');\n/** Equivalente a `onAction` passado no React. */\nconst showAction = () => hasListener('action');\nconst linkProps = () => {\n const link = props.linkComponent ?? 'a';\n return props.href ? (link === 'a' ? { href: props.href } : { to: props.href, href: props.href }) : {};\n};\nconst nameComponent = () => (props.href ? (props.linkComponent ?? 'a') : 'div');\nconst renderBadges = () => [...(props.badges ?? []).map((badge) => resolveNode(badge)), slots.badges?.()];\n</script>\n\n<template>\n <Card v-bind=\"{ ...attrs, ...getStyles('root') }\" :mod=\"[{ interactive: Boolean(props.href || showAction()) }, (attrs as any).mod]\">\n <div v-bind=\"getStyles('media', { style: { '--product-ratio': String(props.imageRatio) } })\">\n <img :src=\"props.image\" :alt=\"props.name\" loading=\"lazy\" />\n <div v-bind=\"getStyles('badges')\">\n <Tag v-if=\"props.showDiscount && discount() > 0\" tone=\"error\" variant=\"filled\">-{{ discount() }}%</Tag>\n <component :is=\"renderBadges\" />\n </div>\n <ActionIcon\n v-if=\"showFavorite()\"\n v-bind=\"getStyles('favorite')\"\n variant=\"subtle\"\n :color=\"props.favorite ? 'danger' : 'obsidian'\"\n radius=\"xl\"\n :aria-label=\"props.favorite ? 'Remover dos favoritos' : 'Adicionar aos favoritos'\"\n :aria-pressed=\"Boolean(props.favorite)\"\n @click=\"emit('update:favorite', !props.favorite)\"\n >\n <IconHeartFilled v-if=\"props.favorite\" :size=\"18\" />\n <IconHeart v-else :size=\"18\" />\n </ActionIcon>\n </div>\n <div v-if=\"props.category\" v-bind=\"getStyles('category')\">{{ props.category }}</div>\n <component :is=\"nameComponent()\" v-bind=\"{ ...linkProps(), ...getStyles('name') }\">{{ props.name }}</component>\n <Group v-if=\"props.rating !== undefined\" :gap=\"6\" mb=\"xs\">\n <Rating :model-value=\"props.rating\" :fractions=\"2\" read-only size=\"xs\" color=\"electric.4\" />\n <Text v-if=\"props.reviews !== undefined\" fz=\"xs\" c=\"var(--ds-text-3)\">({{ props.reviews }})</Text>\n </Group>\n <PriceTag\n v-bind=\"getStyles('price')\"\n :value=\"props.price\"\n :old-value=\"props.oldPrice\"\n :installments=\"props.installments\"\n :pix-discount=\"props.pixDiscount\"\n :unit=\"props.unit\"\n />\n <Button v-if=\"showAction()\" v-bind=\"getStyles('action')\" full-width @click=\"emit('action', $event)\">\n <template #leftSection><IconShoppingCart :size=\"18\" /></template>\n {{ props.actionLabel }}\n </Button>\n </Card>\n</template>\n","<script setup lang=\"ts\">\nimport { useAttrs, useSlots } from 'vue';\nimport { ActionIcon, Button, Group, Rating, Text, resolveNode, useProps, useStyles } from '@mantine-vue/core';\nimport { Card } from '../../theme/themeDefaults';\nimport { IconHeart, IconHeartFilled, IconShoppingCart } from '@tabler/icons-vue';\nimport { PriceTag } from '../PriceTag';\nimport { Tag } from '../Tag';\nimport { useListenerCheck } from '../../utils/vue';\nimport type { ProductCardEmits, ProductCardOwnProps, ProductCardSlots } from './ProductCard.types';\nimport classes from './ProductCard.module.css';\n\ndefineOptions({ name: 'ProductCard', inheritAttrs: false });\n\n// `undefined` explícito: os padrões vêm do useProps, e `favorite` ausente (≠ false) esconde o coração.\nconst rawProps = withDefaults(defineProps<ProductCardOwnProps>(), {\n href: undefined,\n category: undefined,\n oldPrice: undefined,\n installments: undefined,\n pixDiscount: undefined,\n unit: undefined,\n badges: undefined,\n showDiscount: undefined,\n rating: undefined,\n reviews: undefined,\n favorite: undefined,\n actionLabel: undefined,\n imageRatio: undefined,\n linkComponent: undefined,\n classNames: undefined,\n styles: undefined,\n vars: undefined,\n unstyled: undefined,\n});\ndefineSlots<ProductCardSlots>();\nconst emit = defineEmits<ProductCardEmits>();\n\nconst attrs = useAttrs();\nconst slots = useSlots();\nconst hasListener = useListenerCheck();\nconst props = useProps(\n 'ProductCard',\n { showDiscount: true, actionLabel: 'Comprar', imageRatio: 1, linkComponent: 'a' },\n rawProps,\n);\n\nconst getStyles = useStyles({\n name: 'ProductCard',\n classes,\n props,\n get className() { return attrs.class; },\n get style() { return attrs.style as any; },\n get classNames() { return props.classNames as any; },\n get styles() { return props.styles as any; },\n get vars() { return props.vars as any; },\n get unstyled() { return props.unstyled; },\n});\n\nconst discount = () =>\n props.oldPrice && props.oldPrice > props.price ? Math.round((1 - props.price / props.oldPrice) * 100) : 0;\n/** Equivalente a `onFavoriteChange` passado no React: `v-model:favorite`, `:favorite` ou `@update:favorite`. */\nconst showFavorite = () => props.favorite !== undefined || hasListener('update:favorite');\n/** Equivalente a `onAction` passado no React. */\nconst showAction = () => hasListener('action');\nconst linkProps = () => {\n const link = props.linkComponent ?? 'a';\n return props.href ? (link === 'a' ? { href: props.href } : { to: props.href, href: props.href }) : {};\n};\nconst nameComponent = () => (props.href ? (props.linkComponent ?? 'a') : 'div');\nconst renderBadges = () => [...(props.badges ?? []).map((badge) => resolveNode(badge)), slots.badges?.()];\n</script>\n\n<template>\n <Card v-bind=\"{ ...attrs, ...getStyles('root') }\" :mod=\"[{ interactive: Boolean(props.href || showAction()) }, (attrs as any).mod]\">\n <div v-bind=\"getStyles('media', { style: { '--product-ratio': String(props.imageRatio) } })\">\n <img :src=\"props.image\" :alt=\"props.name\" loading=\"lazy\" />\n <div v-bind=\"getStyles('badges')\">\n <Tag v-if=\"props.showDiscount && discount() > 0\" tone=\"error\" variant=\"filled\">-{{ discount() }}%</Tag>\n <component :is=\"renderBadges\" />\n </div>\n <ActionIcon\n v-if=\"showFavorite()\"\n v-bind=\"getStyles('favorite')\"\n variant=\"subtle\"\n :color=\"props.favorite ? 'danger' : 'obsidian'\"\n radius=\"xl\"\n :aria-label=\"props.favorite ? 'Remover dos favoritos' : 'Adicionar aos favoritos'\"\n :aria-pressed=\"Boolean(props.favorite)\"\n @click=\"emit('update:favorite', !props.favorite)\"\n >\n <IconHeartFilled v-if=\"props.favorite\" :size=\"18\" />\n <IconHeart v-else :size=\"18\" />\n </ActionIcon>\n </div>\n <div v-if=\"props.category\" v-bind=\"getStyles('category')\">{{ props.category }}</div>\n <component :is=\"nameComponent()\" v-bind=\"{ ...linkProps(), ...getStyles('name') }\">{{ props.name }}</component>\n <Group v-if=\"props.rating !== undefined\" :gap=\"6\" mb=\"xs\">\n <Rating :model-value=\"props.rating\" :fractions=\"2\" read-only size=\"xs\" color=\"electric.4\" />\n <Text v-if=\"props.reviews !== undefined\" fz=\"xs\" c=\"var(--ds-text-3)\">({{ props.reviews }})</Text>\n </Group>\n <PriceTag\n v-bind=\"getStyles('price')\"\n :value=\"props.price\"\n :old-value=\"props.oldPrice\"\n :installments=\"props.installments\"\n :pix-discount=\"props.pixDiscount\"\n :unit=\"props.unit\"\n />\n <Button v-if=\"showAction()\" v-bind=\"getStyles('action')\" full-width @click=\"emit('action', $event)\">\n <template #leftSection><IconShoppingCart :size=\"18\" /></template>\n {{ props.actionLabel }}\n </Button>\n </Card>\n</template>\n","import { factory } from '@mantine-vue/core';\nimport ProductCardComponent from './ProductCard.vue';\nimport type { ProductCardFactory } from './ProductCard.types';\nimport classes from './ProductCard.module.css';\n\n/**\n * Card de produto do e-commerce: imagem, selos, nome, avaliação, preço e CTA.\n * `v-model:favorite` mostra o botão de favoritar; `@action` mostra o CTA.\n */\nexport const ProductCard = factory<ProductCardFactory>(ProductCardComponent, { classes });\n\nexport type {\n ProductCardEmits,\n ProductCardFactory,\n ProductCardOwnProps,\n ProductCardProps,\n ProductCardSlots,\n ProductCardStylesNames,\n} from './ProductCard.types';\n","import { defineComponent, h, type DefineSetupFnComponent, type SlotsType, type VNodeChild } from 'vue';\nimport { Box, Button, Group, Text, type BoxProps, type MantineNode } from '@mantine-vue/core';\nimport { useClipboard } from '@mantine-vue/hooks';\nimport { IconCheck, IconCopy, IconTicket } from '@tabler/icons-vue';\nimport { nodeProp, resolveContent } from '../../utils/vue';\n\nexport interface CouponCodeProps extends BoxProps {\n code: string;\n /** Texto do benefício (ex.: \"5% OFF na 1ª compra\"). Também aceita o slot `description` (o slot tem prioridade). */\n description?: MantineNode;\n /** @default 'Copiar' */\n copyLabel?: string;\n /** @default 'Copiado!' */\n copiedLabel?: string;\n}\n\nexport interface CouponCodeSlots {\n description?: () => VNodeChild;\n}\n\nexport type CouponCodeEmits = {\n /** Emitido ao clicar em copiar, com o código copiado */\n copy: (code: string) => void;\n};\n\n/** Cupom com borda tracejada e botão de copiar. Emite `copy` com o código. */\nexport const CouponCode = defineComponent({\n name: 'CouponCode',\n inheritAttrs: false,\n props: {\n code: { type: String, required: true },\n description: nodeProp,\n copyLabel: { type: String, default: 'Copiar' },\n copiedLabel: { type: String, default: 'Copiado!' },\n },\n emits: { copy: (_code: string) => true },\n setup(props, { attrs, slots, emit }) {\n const clipboard = useClipboard({ timeout: 1600 });\n return () => {\n const copied = clipboard.copied.value;\n const description = resolveContent(props.description, slots.description);\n return h(\n Box as any,\n {\n p: 'sm',\n style: {\n border: '2px dashed var(--ds-primary)',\n borderRadius: 'var(--ds-radius)',\n background: 'var(--ds-primary-soft)',\n },\n ...attrs,\n },\n () =>\n h(Group as any, { justify: 'space-between', gap: 'sm', wrap: 'nowrap' }, () => [\n h(Group as any, { gap: 'sm', wrap: 'nowrap', style: { minWidth: 0 } }, () => [\n h(IconTicket, { size: 22, color: 'var(--ds-primary)', style: { flexShrink: 0 } }),\n h('div', { style: { minWidth: 0 } }, [\n description !== undefined ? h(Text as any, { fz: 'xs', c: 'var(--ds-text-2)', fw: 500 }, () => description) : null,\n h(Text as any, { fw: 700, fz: 'lg', lts: '0.08em', c: 'var(--ds-primary)', ff: 'monospace' }, () => props.code),\n ]),\n ]),\n h(\n Button as any,\n {\n size: 'sm',\n variant: copied ? 'filled' : 'outline',\n color: copied ? 'evergreen' : undefined,\n leftSection: () => h(copied ? IconCheck : IconCopy, { size: 16 }),\n onClick: () => {\n clipboard.copy(props.code);\n emit('copy', props.code);\n },\n },\n () => (copied ? props.copiedLabel : props.copyLabel),\n ),\n ]),\n );\n };\n },\n}) as unknown as DefineSetupFnComponent<CouponCodeProps, CouponCodeEmits, SlotsType<CouponCodeSlots>>;\n","/* @generated sincronizado de packages/ui/src/components/TopNav/TopNav.module.css — edite lá e rode `npm run sync -w @jcdecor/vue` */\n.root {\n display: flex;\n align-items: center;\n gap: var(--sp-16);\n background: var(--dc-obsidian);\n color: #fff;\n padding: var(--sp-12) var(--sp-24);\n min-height: 56px;\n box-sizing: border-box;\n}\n.brand {\n font-weight: 700;\n font-size: var(--type-subheadline-lg);\n color: #fff;\n text-decoration: none;\n display: inline-flex;\n align-items: center;\n gap: var(--sp-8);\n white-space: nowrap;\n}\n.links {\n display: flex;\n align-items: center;\n gap: var(--sp-16);\n}\n.link {\n display: inline-flex;\n align-items: center;\n gap: var(--sp-8);\n color: var(--dc-obsidian-300);\n text-decoration: none;\n font-size: var(--type-subheadline-sm);\n font-weight: 500;\n background: none;\n border: 0;\n padding: 0;\n cursor: pointer;\n font-family: inherit;\n transition: color 0.15s;\n}\n.link:hover,\n.link[data-active] {\n color: var(--dc-electric);\n}\n.link[data-disabled] {\n opacity: 0.5;\n cursor: not-allowed;\n color: var(--dc-obsidian-300);\n}\n.linkSection {\n display: inline-flex;\n align-items: center;\n flex-shrink: 0;\n}\n.linkSection > svg {\n width: 18px;\n height: 18px;\n}\n.linkLabel {\n white-space: nowrap;\n}\n.right {\n margin-inline-start: auto;\n display: flex;\n align-items: center;\n gap: var(--sp-8);\n}\n.burger {\n --burger-color: #fff;\n}\n.mobileLinks {\n display: flex;\n flex-direction: column;\n gap: var(--sp-16);\n padding: var(--sp-16) var(--sp-24) var(--sp-20);\n background: var(--dc-obsidian);\n}\n@media (max-width: 47.99em) {\n .root[data-collapse] .links {\n display: none;\n }\n}\n@media (min-width: 48em) {\n .burger,\n .mobileLinks {\n display: none;\n }\n}\n","<script setup lang=\"ts\">\nimport { computed, h, useAttrs, useSlots, type Component, type VNodeChild } from 'vue';\nimport { Box, Burger, Collapse, resolveNode, useProps, useStyles, type MantineNode } from '@mantine-vue/core';\nimport { useDisclosure } from '@mantine-vue/hooks';\nimport { JcLogo } from '../../brand/Brand';\nimport type { TopNavFactory, TopNavLink, TopNavOwnProps, TopNavSlots } from './TopNav.types';\nimport classes from './TopNav.module.css';\n\ndefineOptions({ name: 'TopNav', inheritAttrs: false });\n\n// Tudo `undefined` aqui para que os defaults de `theme.components.TopNav` funcionem via useProps\nconst rawProps = withDefaults(defineProps<TopNavOwnProps>(), {\n brand: undefined,\n brandHref: undefined,\n links: undefined,\n linkComponent: undefined,\n rightSection: undefined,\n collapseOnMobile: undefined,\n classNames: undefined,\n styles: undefined,\n vars: undefined,\n unstyled: undefined,\n});\ndefineSlots<TopNavSlots>();\n\nconst slots = useSlots();\nconst attrs = useAttrs();\n\nconst props = useProps(\n 'TopNav',\n {\n brand: () => h(JcLogo, { variant: 'dark', size: 28 }),\n brandHref: '/',\n links: [],\n linkComponent: 'a',\n collapseOnMobile: true,\n },\n rawProps,\n);\n\nconst [opened, { toggle, close }] = useDisclosure(false);\n\n// Getters: classNames/styles/class/style continuam reativos depois do setup\nconst getStyles = useStyles<TopNavFactory>({\n name: 'TopNav',\n classes,\n props,\n get className() {\n return attrs.class;\n },\n get style() {\n return attrs.style as any;\n },\n get classNames() {\n return props.classNames as any;\n },\n get styles() {\n return props.styles as any;\n },\n get vars() {\n return props.vars as any;\n },\n get unstyled() {\n return props.unstyled;\n },\n});\n\n/** Renderiza um `MantineNode` (VNode, texto ou função) como componente estável. */\nconst RenderNode = (p: { node: VNodeChild }) => p.node;\nRenderNode.props = ['node'];\n\nconst linkComponent = computed<string | Component>(() => props.linkComponent ?? 'a');\nconst hrefProps = (href: string) => (linkComponent.value === 'a' ? { href } : { to: href, href });\n\nconst withChildren = (component: string | Component, children: VNodeChild) =>\n typeof component === 'string' ? children : { default: () => children };\n\nconst renderLinks = (onNavigate?: () => void) =>\n (props.links ?? []).map((link: TopNavLink, index: number) => {\n const isButton = !link.href || link.disabled;\n const component = isButton ? 'button' : linkComponent.value;\n const linkProps = isButton ? { type: 'button', disabled: link.disabled || undefined } : hrefProps(link.href!);\n const hasLabel = link.label !== undefined && link.label !== null && link.label !== '';\n const hasSections = link.leftSection != null || link.rightSection != null;\n const children = !hasSections ? resolveNode(link.label as MantineNode) : [\n link.leftSection != null\n ? h('span', { ...getStyles('linkSection'), 'data-position': 'left' }, [resolveNode(link.leftSection)])\n : null,\n hasLabel ? h('span', getStyles('linkLabel'), [resolveNode(link.label as MantineNode)]) : null,\n link.rightSection != null\n ? h('span', { ...getStyles('linkSection'), 'data-position': 'right' }, [resolveNode(link.rightSection)])\n : null,\n ];\n return h(\n component as any,\n {\n key: index,\n ...linkProps,\n ...getStyles('link'),\n 'data-active': link.active || undefined,\n 'data-disabled': link.disabled || undefined,\n 'aria-current': link.active ? 'page' : undefined,\n 'aria-label': link['aria-label'],\n onClick: (event: MouseEvent) => {\n if (link.disabled) return;\n link.onClick?.(event);\n onNavigate?.();\n },\n },\n withChildren(component, children) as any,\n );\n });\n\nconst brandNode = computed(() => resolveNode(props.brand, slots.brand));\nconst rightNode = computed(() => resolveNode(props.rightSection, slots.rightSection));\nconst brandComponent = computed(() => (props.brandHref === null ? 'span' : linkComponent.value));\nconst brandProps = computed(() => (props.brandHref === null ? {} : hrefProps(props.brandHref ?? '/')));\nconst withBurger = computed(() => !!props.collapseOnMobile && (props.links ?? []).length > 0);\nconst rootMod = computed(() => [{ collapse: props.collapseOnMobile }, (attrs as any).mod]);\n</script>\n\n<template>\n <header>\n <Box v-bind=\"{ ...attrs, ...getStyles('root') }\" :mod=\"rootMod\">\n <component :is=\"brandComponent\" v-bind=\"{ ...brandProps, ...getStyles('brand') }\">\n <RenderNode :node=\"brandNode\" />\n </component>\n <nav v-bind=\"getStyles('links')\" aria-label=\"Principal\">\n <RenderNode :node=\"renderLinks()\" />\n </nav>\n <div v-bind=\"getStyles('right')\">\n <RenderNode :node=\"rightNode\" />\n <Burger\n v-if=\"withBurger\"\n :opened=\"opened\"\n size=\"sm\"\n aria-label=\"Abrir menu\"\n v-bind=\"getStyles('burger')\"\n @click=\"toggle\"\n />\n </div>\n </Box>\n <Collapse v-if=\"withBurger\" :expanded=\"opened\">\n <nav v-bind=\"getStyles('mobileLinks')\" aria-label=\"Principal (mobile)\">\n <RenderNode :node=\"renderLinks(close)\" />\n </nav>\n </Collapse>\n </header>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, h, useAttrs, useSlots, type Component, type VNodeChild } from 'vue';\nimport { Box, Burger, Collapse, resolveNode, useProps, useStyles, type MantineNode } from '@mantine-vue/core';\nimport { useDisclosure } from '@mantine-vue/hooks';\nimport { JcLogo } from '../../brand/Brand';\nimport type { TopNavFactory, TopNavLink, TopNavOwnProps, TopNavSlots } from './TopNav.types';\nimport classes from './TopNav.module.css';\n\ndefineOptions({ name: 'TopNav', inheritAttrs: false });\n\n// Tudo `undefined` aqui para que os defaults de `theme.components.TopNav` funcionem via useProps\nconst rawProps = withDefaults(defineProps<TopNavOwnProps>(), {\n brand: undefined,\n brandHref: undefined,\n links: undefined,\n linkComponent: undefined,\n rightSection: undefined,\n collapseOnMobile: undefined,\n classNames: undefined,\n styles: undefined,\n vars: undefined,\n unstyled: undefined,\n});\ndefineSlots<TopNavSlots>();\n\nconst slots = useSlots();\nconst attrs = useAttrs();\n\nconst props = useProps(\n 'TopNav',\n {\n brand: () => h(JcLogo, { variant: 'dark', size: 28 }),\n brandHref: '/',\n links: [],\n linkComponent: 'a',\n collapseOnMobile: true,\n },\n rawProps,\n);\n\nconst [opened, { toggle, close }] = useDisclosure(false);\n\n// Getters: classNames/styles/class/style continuam reativos depois do setup\nconst getStyles = useStyles<TopNavFactory>({\n name: 'TopNav',\n classes,\n props,\n get className() {\n return attrs.class;\n },\n get style() {\n return attrs.style as any;\n },\n get classNames() {\n return props.classNames as any;\n },\n get styles() {\n return props.styles as any;\n },\n get vars() {\n return props.vars as any;\n },\n get unstyled() {\n return props.unstyled;\n },\n});\n\n/** Renderiza um `MantineNode` (VNode, texto ou função) como componente estável. */\nconst RenderNode = (p: { node: VNodeChild }) => p.node;\nRenderNode.props = ['node'];\n\nconst linkComponent = computed<string | Component>(() => props.linkComponent ?? 'a');\nconst hrefProps = (href: string) => (linkComponent.value === 'a' ? { href } : { to: href, href });\n\nconst withChildren = (component: string | Component, children: VNodeChild) =>\n typeof component === 'string' ? children : { default: () => children };\n\nconst renderLinks = (onNavigate?: () => void) =>\n (props.links ?? []).map((link: TopNavLink, index: number) => {\n const isButton = !link.href || link.disabled;\n const component = isButton ? 'button' : linkComponent.value;\n const linkProps = isButton ? { type: 'button', disabled: link.disabled || undefined } : hrefProps(link.href!);\n const hasLabel = link.label !== undefined && link.label !== null && link.label !== '';\n const hasSections = link.leftSection != null || link.rightSection != null;\n const children = !hasSections ? resolveNode(link.label as MantineNode) : [\n link.leftSection != null\n ? h('span', { ...getStyles('linkSection'), 'data-position': 'left' }, [resolveNode(link.leftSection)])\n : null,\n hasLabel ? h('span', getStyles('linkLabel'), [resolveNode(link.label as MantineNode)]) : null,\n link.rightSection != null\n ? h('span', { ...getStyles('linkSection'), 'data-position': 'right' }, [resolveNode(link.rightSection)])\n : null,\n ];\n return h(\n component as any,\n {\n key: index,\n ...linkProps,\n ...getStyles('link'),\n 'data-active': link.active || undefined,\n 'data-disabled': link.disabled || undefined,\n 'aria-current': link.active ? 'page' : undefined,\n 'aria-label': link['aria-label'],\n onClick: (event: MouseEvent) => {\n if (link.disabled) return;\n link.onClick?.(event);\n onNavigate?.();\n },\n },\n withChildren(component, children) as any,\n );\n });\n\nconst brandNode = computed(() => resolveNode(props.brand, slots.brand));\nconst rightNode = computed(() => resolveNode(props.rightSection, slots.rightSection));\nconst brandComponent = computed(() => (props.brandHref === null ? 'span' : linkComponent.value));\nconst brandProps = computed(() => (props.brandHref === null ? {} : hrefProps(props.brandHref ?? '/')));\nconst withBurger = computed(() => !!props.collapseOnMobile && (props.links ?? []).length > 0);\nconst rootMod = computed(() => [{ collapse: props.collapseOnMobile }, (attrs as any).mod]);\n</script>\n\n<template>\n <header>\n <Box v-bind=\"{ ...attrs, ...getStyles('root') }\" :mod=\"rootMod\">\n <component :is=\"brandComponent\" v-bind=\"{ ...brandProps, ...getStyles('brand') }\">\n <RenderNode :node=\"brandNode\" />\n </component>\n <nav v-bind=\"getStyles('links')\" aria-label=\"Principal\">\n <RenderNode :node=\"renderLinks()\" />\n </nav>\n <div v-bind=\"getStyles('right')\">\n <RenderNode :node=\"rightNode\" />\n <Burger\n v-if=\"withBurger\"\n :opened=\"opened\"\n size=\"sm\"\n aria-label=\"Abrir menu\"\n v-bind=\"getStyles('burger')\"\n @click=\"toggle\"\n />\n </div>\n </Box>\n <Collapse v-if=\"withBurger\" :expanded=\"opened\">\n <nav v-bind=\"getStyles('mobileLinks')\" aria-label=\"Principal (mobile)\">\n <RenderNode :node=\"renderLinks(close)\" />\n </nav>\n </Collapse>\n </header>\n</template>\n","import { factory } from '@mantine-vue/core';\nimport TopNavComponent from './TopNav.vue';\nimport type { TopNavFactory } from './TopNav.types';\nimport classes from './TopNav.module.css';\n\n/** Barra de navegação Obsidian dos painéis (ds-nav). */\nexport const TopNav = factory<TopNavFactory>(TopNavComponent, { classes });\n\nexport type { TopNavFactory, TopNavLink, TopNavOwnProps, TopNavProps, TopNavSlots, TopNavStylesNames } from './TopNav.types';\n"],"mappings":";;;;;;;;;;;;AAOA,IAAM2M,KAAyC;CAC7C,SAAS;CACT,MAAM;CACN,WAAW;CACX,OAAO;CACP,MAAM;CACN,UAAU;CACV,QAAQ;CACR,QAAQ;CACR,KAAK;CACL,UAAU;CACV,MAAM;CACN,MAAM;AACR,GASaC,MAAiD,MAAU;CACtE,IAAM,EAAE,YAAS,aAAUC,GACrBC,IAAYD,EAAM,SAASE,EAAM,cACjCC,IAASC,GAAgB;EAAE,OAAOH;EAAW;CAAM,CAAC,GACpDI,IAASF,EAAO,eAAeA,EAAO,QAAQ,KAAA;CAapD,IAXIG,MAAY,YAWZA,MAAY,aAAaD,MAAW,cAAcA,MAAW,aAAaF,EAAO,UAAU,KAAA,GAC7F,OAAO;EACL,YAAY;EACZ,OAAO;EACP,OAAO;EACP,YAAY;EACZ,QAAQ;CACV;CAKF,IAAIG,MAAY,YAAYD,KAAUF,EAAO,UAAU,KAAA,GAErD,OAAO;EAAE,GADII,GAA6BP,CAC9B;EAAM,OAAO;EAAuB,YAAY;CAAsB;CAGpF,IAAIM,MAAY,WAAW;EACzB,IAAME,IAAOD,GAA6BP,CAAK,GACzCS,IAAQF,GAA6B;GAAE,GAAGP;GAAO,SAAS;EAAQ,CAAC,GACnEU,IAAY,CAACV,EAAM,SAASK,MAAWH,EAAM;EACnD,OAAO;GACL,GAAGM;GACH,OAAOE,IAAY,2BAA2BD,EAAM;GACpD,OAAOC,IAAY,sBAAsBF,EAAK;GAC9C,QAAQE,IAAY,gCAAgCF,EAAK;EAC3D;CACF;CAEA,IAAIF,MAAY,YAAY,CAACN,EAAM,OACjC,OAAO;EACL,YAAY;EACZ,OAAO;EACP,OAAO;EACP,YAAY;EACZ,QAAQ;CACV;CAGF,IAAIM,MAAY,WAAWD,KAAUP,GAAeO,IAAS;EAC3D,IAAMM,IAAOb,GAAeO;EAC5B,OAAO;GACL,YAAY,gBAAgBM,EAAK;GACjC,OAAO,gBAAgBA,EAAK;GAC5B,OAAO,gBAAgBA,EAAK;GAC5B,QAAQ;EACV;CACF;CAEA,OAAOJ,GAA6BP,CAAK;AAC3C;;;ACtFA,SAAgBY,EACd,GACA,GACuB;CACvB,OAAOZ;AACT;;;ACZA,IAAaa,MAAU,MACrBC,MAAS,QAAQA,MAAS,QAAQA,MAAS,QAAQA,MAAS,QAAQA,MAAS,MAMlEC,KAAU;CACrB,IAAI;EAAE,QAAQ;EAAQ,IAAI;EAAQ,IAAI;EAAQ,SAAS;CAAO;CAC9D,IAAI;EAAE,QAAQ;EAAQ,IAAI;EAAQ,IAAI;EAAQ,SAAS;CAAO;CAC9D,IAAI;EAAE,QAAQ;EAAQ,IAAI;EAAQ,IAAI5N,GAAE,OAAO;EAAM,SAAS;CAAO;CACrE,IAAI;EAAE,QAAQ;EAAQ,IAAI;EAAQ,IAAI;EAAQ,SAAS;CAAO;CAC9D,IAAI;EAAE,QAAQ;EAAQ,IAAI;EAAQ,IAAI;EAAQ,SAAS;CAAO;AAChE,GAGa6N,KAAe;CAAE,mBAAmB;CAAK,MAAM;CAAG,OAAO;AAAU;;;;GEdnEE,KAAqC;CAChD,QAAQN,EAAOO,IAAQ;EACrB,YAAY,EAAE,MAAM/N,GAAQ,OAAO;EACnC,OAAO,GAAQ,MAAU;GACvB,IAAI,CAACyN,GAAOO,EAAM,QAAQ,IAAI,GAAG,OAAO,EAAE,MAAM,CAAC,EAAE;GACnD,IAAMC,IAAIN,GAASK,EAAM,QAAQ;GACjC,OAAO,EAAE,MAAM;IAAE,mBAAmBC,EAAE;IAAQ,sBAAsBA,EAAE;IAAI,eAAeA,EAAE;GAAG,EAAE;EAClG;CACF,CAAC;CACD,YAAYT,EAAOU,IAAY;EAAE,cAAc,EAAE,SAAS,SAAS;EAAG,YAAY,EAAE,MAAMlO,GAAQ,WAAW;CAAE,CAAC;CAChH,aAAawN,EAAOW,IAAa,EAAE,YAAY,EAAE,MAAMnO,GAAQ,YAAY,EAAE,CAAC;AAChF;;;;;;;;;;;;;GEXMqO,KAAkB;CAAC;CAAU;CAAe;CAAgB;CAAa;CAAc;CAAY;CAAc;AAAU,GAG3HC,IAAqB;CACzB,UAAUlO,EAAQ;CAClB,QAAQA,EAAQ;CAChB,YAAYA,EAAQ;CACpB,OAAOA,EAAQ;AACjB,GAMMmO,KAAgE;CACpE,UAAU;EAAE,GAAGD;EAAoB,QAAQlO,EAAQ;EAAQ,QAAQA,EAAQ;EAAQ,QAAQA,EAAQ;CAAO;CAC1G,iBAAiB;EAAE,GAAGkO;EAAoB,QAAQlO,EAAQ;CAAO;CACjE,QAAQkO;CACR,cAAcA;CACd,aAAa;EAAE,GAAGA;EAAoB,MAAMlO,EAAQ;CAAK;CACzD,WAAW;EAAE,GAAGkO;EAAoB,MAAMlO,EAAQ;CAAK;CACvD,YAAY;EAAE,GAAGkO;EAAoB,MAAMlO,EAAQ;CAAK;AAC1D,GAEaoO,KAAsC;CACjD,GAAG,OAAO,YAAYH,GAAgB,KAAK,MAAS,CAACI,GAAM,EAAE,cAAc,EAAE,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC;CAC7F,GAAG,OAAO,YACR,OAAO,QAAQF,EAAqB,CAAC,CAAC,KAAK,CAACE,GAAMC,OAAgB,CAChED,GACA;EAAE,cAAcJ,GAAgB,SAASI,CAAI,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;EAAG;CAAW,CACnF,CAAC,CACH;CACA,UAAUjB,EAAOnN,IAAU;EACzB,cAAc,EAAE,MAAM,KAAK;EAC3B,YAAY;GACV,GAAGiO;GACH,QAAQlO,EAAQ;GAChB,cAAcA,EAAQ;GACtB,YAAYA,EAAQ;GACpB,iBAAiBA,EAAQ;EAC3B;CACF,CAAC;CACD,MAAMoN,EAAOmB,IAAM,EAAE,YAAY;EAAE,MAAMvO,EAAQ;EAAM,QAAQA,EAAQ;CAAW,EAAE,CAAC;AACvF;;;;;;;;;;;;;;;;;;GE7BayO,KAAyC;CACpD,WAAWrB,EAAOsB,IAAW;EAC3B,cAAc,EAAE,iBAAiB,QAAQ;EACzC,YAAY;GAAE,MAAMxO,EAAQ;GAAe,SAASA,EAAQ;GAAkB,OAAOA,EAAQ;GAAgB,SAASA,EAAQ;GAAkB,SAASA,EAAQ;EAAiB;CACpL,CAAC;CACD,QAAQkN,EAAOuB,IAAQ;EAAE,cAAc;GAAE,OAAO;GAAW,QAAQ;EAAK;EAAG,YAAY,EAAE,MAAMzO,EAAQ,OAAO;CAAE,CAAC;CACjH,iBAAiBkN,EAAOwB,IAAiB,EAAE,cAAc,EAAE,QAAQ,KAAK,EAAE,CAAC;CAC3E,OAAOxB,EAAOyB,IAAO;EACnB,cAAc;GAAE,SAAS;GAAS,QAAQ;EAAK;EAC/C,YAAY,EAAE,MAAM3O,EAAQ,MAAM;EAClC,OAAO,GAAQ,OACZ0N,EAAM,QAAQ,UAAU,OACrB,EAAE,MAAM;GAAE,kBAAkB;GAAQ,cAAc;GAAQ,qBAAqB;EAAM,EAAE,IACvF,EAAE,MAAM,CAAC,EAAE;CACnB,CAAC;CACD,MAAMR,EAAOjN,IAAM,EAAE,cAAc;EAAE,QAAQ;EAAM,SAAS;EAAM,QAAQ;EAAM,YAAY;CAAK,EAAE,CAAC;CACpG,UAAUiN,EAAO0B,IAAU,EAAE,YAAY;EAAE,MAAM5O,EAAQ;EAAU,WAAWA,EAAQ;EAAe,WAAWA,EAAQ;CAAc,EAAE,CAAC;CACzI,OAAOkN,EAAO2B,IAAO,EAAE,cAAc,EAAE,QAAQ,KAAK,EAAE,CAAC;CACvD,WAAW3B,EAAO4B,IAAW;EAAE,cAAc,EAAE,OAAO,SAAS;EAAG,YAAY,EAAE,WAAW9O,EAAQ,UAAU;CAAE,CAAC;CAChH,KAAKkN,EAAO6B,IAAK,EAAE,YAAY,EAAE,MAAM/O,EAAQ,IAAI,EAAE,CAAC;CAEtD,iBAAiBkN,EAAOhN,IAAiB,EAAE,cAAc;EAAE,mBAAmB;EAAK,kBAAkB;CAAI,EAAE,CAAC;CAC5G,eAAegN,EAAO/M,IAAe,EAAE,cAAc;EAAE,mBAAmB;EAAK,kBAAkB;CAAI,EAAE,CAAC;CACxG,SAAS+M,EAAO8B,IAAS,EAAE,YAAY,EAAE,SAAShP,EAAQ,eAAe,EAAE,CAAC;CAC5E,WAAWkN,EAAO+B,IAAW,EAAE,cAAc,EAAE,QAAQ,KAAK,EAAE,CAAC;CAC/D,UAAU/B,EAAO9M,IAAU;EACzB,cAAc;GAAE,YAAY;GAAI,WAAW;EAAE;EAC7C,YAAY;GAAE,MAAMJ,EAAQ;GAAU,MAAMA,EAAQ;GAAc,YAAYA,EAAQ;GAAgB,WAAWA,EAAQ;EAAc;CACzI,CAAC;AACH;;;;;;;;;;;;;;;;;;;GEnCamP,KAAsC;CACjD,cAAcjC,EAAOkC,IAAc;EACjC,cAAc,EAAE,QAAQ,KAAK;EAC7B,YAAY;GAAE,MAAM/O,EAAQ;GAAc,OAAOA,EAAQ;GAAmB,aAAaA,EAAQ;GAAyB,MAAMA,EAAQ;EAAiB;CAC3J,CAAC;CACD,OAAO6M,EAAOmC,IAAO;EAAE,cAAc,EAAE,SAAS,QAAQ;EAAG,YAAY;GAAE,MAAMhP,EAAQ;GAAO,SAASA,EAAQ;GAAc,OAAOA,EAAQ;GAAY,SAASA,EAAQ;EAAa;CAAE,CAAC;CACzL,QAAQ6M,EAAOoC,IAAQ,EAAE,cAAc,EAAE,MAAM,OAAO,EAAE,CAAC;CACzD,UAAUpC,EAAOqC,IAAU;EAAE,cAAc,EAAE,QAAQ,KAAK;EAAG,YAAY;GAAE,MAAMlP,EAAQ;GAAU,OAAOA,EAAQ;EAAc;CAAE,CAAC;CACnI,cAAc6M,EAAOsC,IAAc,EAAE,YAAY,EAAE,OAAOnP,EAAQ,UAAU,EAAE,CAAC;CAC/E,oBAAoB6M,EAAOuC,IAAoB,EAAE,YAAY;EAAE,MAAMpP,EAAQ;EAAY,OAAOA,EAAQ;CAAgB,EAAE,CAAC;CAC3H,UAAU6M,EAAOwC,IAAU,EAAE,YAAY,EAAE,MAAMrP,EAAQ,SAAS,EAAE,CAAC;CACrE,YAAY6M,EAAOyC,IAAY,EAC7B,YAAY;EAAE,MAAMtP,EAAQ;EAAY,WAAWA,EAAQ;EAAgB,OAAOA,EAAQ;EAAY,aAAaA,EAAQ;CAAiB,EAC9I,CAAC;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GEMMwP,KAAgB,OAAO,YAAY;CAHvC;CAAa;CAAa;CAAiB;CAAe;CAAY;CACtE;CAAc;CAAa;AAEY,CAAA,CAAiB,KAAK,MAAS,CAAC1B,GAAM,EAAE,cAAc,EAAE,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,GAG3G2B,KAAwB;CAAE,QAAQtP,EAAQ;CAAa,eAAeA,EAAQ;CAAoB,OAAOA,EAAQ;AAAW,GAG5HuP,KAAmB;CAAE,MAAMvP,EAAQ;CAAY,OAAOA,EAAQ;CAAa,OAAOA,EAAQ;CAAa,WAAWA,EAAQ;AAAgB,GAEnIwP,KAAoC;CAC/C,GAAGH;CACH,OAAO3C,EAAO+C,IAAO;EACnB,cAAc,EAAE,MAAM,KAAK;EAC3B,YAAY,EAAE,OAAOzP,EAAQ,MAAM;EACnC,OAAO,GAAQ,MAAU;GACvB,IAAM4M,IAAQM,EAAM,QAAQ;GAE5B,OADKP,GAAOC,CAAI,IACT,EAAE,SAAS;IAAE,kBAAkBC,GAAQD,EAAK,CAAC;IAAQ,cAAcC,GAAQD,EAAK,CAAC;GAAQ,EAAE,IADxE,EAAE,SAAS,CAAC,EAAE;EAE1C;CACF,CAAC;CACD,cAAcF,EAAOgD,IAAc,EACjC,YAAY;EAAE,OAAO1P,EAAQ;EAAO,aAAaA,EAAQ;CAAY,EACvE,CAAC;CAED,cAAc0M,EAAOzM,IAAc;EACjC,cAAc,EAAE,MAAM,KAAK;EAC3B,YAAY;GAAE,OAAOD,EAAQ;GAAc,SAASA,EAAQ;EAAoB;CAClF,CAAC;CAID,UAAU0M,EAAOiD,IAAU;EAAE,cAAc,EAAE,QAAQ,KAAK;EAAG,YAAY,EAAE,OAAO3P,EAAQ,WAAW;CAAE,CAAC;CACxG,mBAAmB0M,EAAOxM,IAAmB;EAAE,cAAc,EAAE,QAAQ,KAAK;EAAG,YAAY,EAAE,WAAWF,EAAQ,WAAW;CAAE,CAAC;CAC9H,cAAc0M,EAAOkD,IAAc;EAAE,cAAc,EAAE,QAAQ,KAAK;EAAG,YAAY,EAAE,MAAM5P,EAAQ,WAAW;CAAE,CAAC;CAC/G,OAAO0M,EAAOmD,IAAO,EAAE,YAAY,EAAE,OAAO7P,EAAQ,WAAW,EAAE,CAAC;CAClE,gBAAgB0M,EAAOoD,IAAgB,EAAE,YAAY,EAAE,WAAW9P,EAAQ,WAAW,EAAE,CAAC;CACxF,WAAW0M,EAAOqD,IAAW;EAAE,cAAc,EAAE,QAAQ,KAAK;EAAG,YAAY,EAAE,MAAM/P,EAAQ,WAAW;CAAE,CAAC;CACzG,QAAQ0M,EAAOsD,IAAQ;EAAE,cAAc,EAAE,QAAQ,KAAK;EAAG,YAAY,EAAE,OAAOhQ,EAAQ,YAAY;CAAE,CAAC;CAKrG,MAAM0M,EAAOuD,IAAM;EACjB,cAAc,EAAE,SAAS,UAAU;EACnC,YAAY,EAAE,OAAOjQ,EAAQ,UAAU;EACvC,OAAO,GAAO,MAAU;GACtB,IAAIkN,EAAM,YAAY,WAAW,OAAO,EAAE,MAAM,CAAC,EAAE;GACnD,IAAMX,IAAQP,EAAM,qBAAqB;IAAE,OAAOkB,EAAM,SAASlB,EAAM;IAAc;IAAO,SAAS;GAAQ,CAAC;GAC9G,OAAO,EAAE,MAAM;IAAE,aAAaO,EAAM;IAAO,gBAAgBA,EAAM;GAAM,EAAE;EAC3E;CACF,CAAC;CACD,kBAAkBG,EAAOwD,IAAkB;EACzC,cAAc,EAAE,QAAQ,KAAK;EAC7B,YAAY;GAAE,MAAMlQ,EAAQ;GAAe,WAAWA,EAAQ;GAAoB,OAAOA,EAAQ;EAAe;CAClH,CAAC;CAID,UAAU0M,EAAOyD,IAAU;EACzB,cAAc,EAAE,QAAQ,KAAK;EAC7B,YAAY;GAAE,MAAMnQ,EAAQ;GAAU,QAAQA,EAAQ;EAAe;CACvE,CAAC;CAED,UAAU0M,EAAO0D,IAAU;EACzB,cAAc,EAAE,MAAM,KAAK;EAC3B,YAAY,EAAE,OAAOpQ,EAAQ,SAAS;EACtC,OAAO,GAAQ,MAAU;GACvB,IAAM4M,IAAQM,EAAM,QAAQ;GAC5B,OAAO,EAAE,MAAMP,GAAOC,CAAI,IAAI,EAAE,oBAAoBC,GAAQD,EAAK,CAAC,OAAO,IAAI,CAAC,EAAE;EAClF;CACF,CAAC;CAGD,QAAQF,EAAO2D,IAAQ,EAAE,YAAYd,GAAiB,CAAC;CACvD,aAAa7C,EAAO4D,IAAa,EAAE,YAAYf,GAAiB,CAAC;CACjE,aAAa7C,EAAO6D,IAAa,EAAE,YAAY;EAAE,MAAMvQ,EAAQ;EAAW,OAAOA,EAAQ;EAAY,OAAOA,EAAQ;CAAW,EAAE,CAAC;CAGlI,QAAQ0M,EAAO8D,IAAQ;EACrB,cAAc,EAAE,OAAO,aAAa;EACpC,YAAY;GAAE,MAAMxQ,EAAQ;GAAQ,YAAYA,EAAQ;EAAW;EACnE,OAAO,GAAQ,OAAW,EAAE,MAAMkN,EAAM,UAAU,eAAe,EAAE,kBAAkB,yBAAyB,IAAI,CAAC,EAAE;CACvH,CAAC;CAGD,aAAaR,EAAO+D,IAAa,EAC/B,YAAY;EAAE,GAAGnB;EAAuB,YAAYtP,EAAQ;EAAiB,QAAQA,EAAQ;CAAY,EAC3G,CAAC;CACD,aAAa0M,EAAOgE,IAAa,EAAE,YAAYpB,GAAsB,CAAC;CACtE,WAAW5C,EAAOiE,IAAW,EAAE,YAAYrB,GAAsB,CAAC;AACpE;;;;;;;;;;GEtHauB,KAAoC;CAG/C,UAAU,EACR,YAAY;EACV,MAAM1Q,EAAQ;EACd,QAAQA,EAAQ;EAChB,OAAOA,EAAQ;EACf,QAAQA,EAAQ;EAChB,QAAQA,EAAQ;CAClB,EACF;CAEA,WAAWuM,EAAOoE,IAAW,EAAE,YAAY,EAAE,MAAM3Q,EAAQ,UAAU,EAAE,CAAC;CAExE,UAAUuM,EAAOqE,IAAU,EACzB,YAAY;EAAE,MAAM5Q,EAAQ;EAAU,QAAQA,EAAQ;EAAgB,OAAOA,EAAQ;CAAc,EACrG,CAAC;AACH;;;;;GElBa8Q,KAAkC;CAC7C,OAAOvE,EAAOwE,IAAO;EAAE,cAAc,EAAE,QAAQ,KAAK;EAAG,YAAY,EAAE,MAAM9Q,GAAQ,MAAM;CAAE,CAAC;CAC5F,SAASsM,EAAOyE,IAAS,EAAE,YAAY,EAAE,MAAM/Q,GAAQ,QAAQ,EAAE,CAAC;CAElE,YAAYsM,EAAO0E,IAAY,EAAE,YAAY;EAAE,WAAWhR,GAAQ;EAAW,OAAOA,GAAQ;CAAY,EAAE,CAAC;AAC7G;;;;;;;;;;;;;;;GELakR,KAAwC;CACnD,MAAM5E,EAAO6E,IAAM,EAAE,YAAY;EAAE,MAAMjR,EAAQ;EAAM,KAAKA,EAAQ;CAAI,EAAE,CAAC;CAC3E,QAAQoM,EAAO8E,IAAQ,EAAE,YAAY,EAAE,MAAMlR,EAAQ,OAAO,EAAE,CAAC;CAC/D,QAAQoM,EAAO+E,IAAQ,EAAE,YAAY,EAAE,MAAMnR,EAAQ,OAAO,EAAE,CAAC;CAE/D,SAASoM,EAAOgF,IAAS;EAAE,cAAc,EAAE,SAAS,QAAQ;EAAG,YAAY,EAAE,MAAMpR,EAAQ,QAAQ;CAAE,CAAC;CACtG,YAAYoM,EAAOiF,IAAY;EAAE,cAAc,EAAE,QAAQ,KAAK;EAAG,YAAY,EAAE,SAASrR,EAAQ,kBAAkB;CAAE,CAAC;CACrH,SAASoM,EAAOkF,IAAS,EACvB,YAAY;EACV,MAAMtR,EAAQ;EACd,UAAUA,EAAQ;EAClB,mBAAmBA,EAAQ;EAC3B,WAAWA,EAAQ;EACnB,iBAAiBA,EAAQ;CAC3B,EACF,CAAC;CACD,iBAAiBoM,EAAOmF,IAAiB,EAAE,YAAY,EAAE,SAASvR,EAAQ,WAAW,EAAE,CAAC;CACxF,MAAMoM,EAAOoF,IAAM,EAAE,YAAY;EAAE,MAAMxR,EAAQ;EAAM,OAAOA,EAAQ;CAAU,EAAE,CAAC;AACrF;;;;;;;;;;;;;GEHM0R,KAAiB;CAAE,UAAUzR,EAAQ;CAAU,MAAMA,EAAQ;CAAU,OAAOA,EAAQ;CAAW,SAASA,EAAQ;AAAY,GAEvH0R,KAAsC;CACjD,MAAMvF,EAAOwF,IAAM;EAAE,cAAc;GAAE,QAAQ;GAAM,QAAQ;EAAK;EAAG,YAAYF;CAAe,CAAC;CAC/F,SAAStF,EAAOyF,IAAS,EAAE,YAAY;EAAE,MAAM5R,EAAQ;EAAa,QAAQA,EAAQ;CAAc,EAAE,CAAC;CACrG,SAASmM,EAAO0F,IAAS;EAAE,cAAc;GAAE,QAAQ;GAAM,QAAQ;EAAK;EAAG,YAAY,EAAE,UAAU7R,EAAQ,SAAS;CAAE,CAAC;CACrH,WAAWmM,EAAO2F,IAAW;EAAE,cAAc;GAAE,QAAQ;GAAM,QAAQ;EAAK;EAAG,YAAY,EAAE,UAAU9R,EAAQ,SAAS;CAAE,CAAC;CACzH,SAASmM,EAAOlM,IAAS;EAAE,cAAc;GAAE,QAAQ;GAAM,WAAW;EAAK;EAAG,YAAY,EAAE,SAASD,EAAQ,QAAQ;CAAE,CAAC;CACtH,OAAOmM,EAAO4F,IAAO;EACnB,cAAc;GAAE,QAAQ;GAAM,UAAU;GAAM,QAAQ;GAAM;EAAa;EACzE,YAAY;GAAE,SAAS/R,EAAQ;GAAc,QAAQA,EAAQ;GAAa,OAAOA,EAAQ;EAAW;CACtG,CAAC;CACD,QAAQmM,EAAO6F,IAAQ;EACrB,cAAc;GAAE,QAAQ;GAAM;EAAa;EAC3C,YAAY;GAAE,SAAShS,EAAQ;GAAc,QAAQA,EAAQ;GAAa,OAAOA,EAAQ;EAAW;CACtG,CAAC;CACD,QAAQmM,EAAO8F,IAAQ;EAAE,cAAc;GAAE,QAAQ;GAAM,QAAQ;EAAK;EAAG,YAAY,EAAE,MAAMjS,EAAQ,gBAAgB;CAAE,CAAC;CACtH,WAAWmM,EAAO+F,IAAW;EAC3B,cAAc;GAAE,QAAQ;GAAM,QAAQ;EAAK;EAC3C,YAAY;GAAE,MAAMlS,EAAQ;GAAiB,SAASA,EAAQ;EAAiB;CACjF,CAAC;CACD,gBAAgBmM,EAAOjM,IAAgB;EAAE,cAAc;GAAE,QAAQ;GAAM,QAAQ;GAAM,YAAY;EAAK;EAAG,YAAY,EAAE,MAAMF,EAAQ,gBAAgB;CAAE,CAAC;CAExJ,SAASmM,EAAOgG,IAAS,EAAE,cAAc,EAAE,OAAOhS,GAAM,SAAS,EAAE,CAAC;CACpE,gBAAgBgM,EAAOiG,IAAgB,EAAE,cAAc,EAAE,cAAc;EAAE,mBAAmB;EAAM,MAAM;CAAE,EAAE,EAAE,CAAC;AACjH;;;;;;;;;;;;;;;GE9BME,KAAU;CAAC,KAAA;CAAW;CAAU;AAAU,GAEnCC,KAAwC;CACnD,YAAYpG,EAAOqG,IAAY;EAC7B,cAAc;GAAE,UAAU;GAAI,QAAQ;EAAK;EAC3C,YAAY;GAAE,MAAMnS,EAAQ;GAAY,MAAMA,EAAQ;GAAgB,MAAMA,EAAQ;EAAe;EACnG,OAAO,GAAQ,MACb,CAACsM,EAAM,SAASA,EAAM,UAAU,aAAaA,EAAM,UAAU,SACzD,EAAE,MAAM;GAAE,WAAW;GAAqB,iBAAiB;GAA0B,gBAAgB;EAAyB,EAAE,IAChI,EAAE,MAAM,CAAC,EAAE;CACnB,CAAC;CACD,MAAMR,EAAOsG,IAAM,EAAE,YAAY,EAAE,MAAMpS,EAAQ,KAAK,EAAE,CAAC;CACzD,MAAM8L,EAAOuG,IAAM;EAAE,cAAc,EAAE,SAAS,KAAK;EAAG,YAAY;GAAE,MAAMrS,EAAQ;GAAM,MAAMA,EAAQ;GAAU,UAAUA,EAAQ;EAAa;CAAE,CAAC;CAElJ,MAAM8L,EAAOwG,IAAM;EACjB,YAAY,EAAE,MAAMtS,EAAQ,KAAK;EACjC,OAAO,GAAO,MAAU;GACtB,IAAMuS,IAASN,GAAQ,SAAS3F,EAAM,KAAK,GACrCkG,IAAQD,IAAS,aAAajG,EAAM;GAC1C,OAAO,EACL,MAAM;IACJ,mBAAmBmG,GAAc,GAAGD,EAAM,GAAGD,IAAS,IAAI,KAAKnH,CAAK;IACpE,kBAAkB,sBAAsBqH,GAAc,GAAGD,EAAM,GAAGD,IAAS,IAAI,KAAKnH,CAAK,EAAE;GAC7F,EACF;EACF;CACF,CAAC;CACD,OAAOU,EAAO7L,IAAO;EACnB,cAAc;GAAE,kBAAkB;GAAM,iBAAiB;GAAM,mBAAmB;EAAK;EACvF,YAAY;GAAE,OAAOD,EAAQ;GAAO,IAAIA,EAAQ;GAAI,OAAOA,EAAQ;GAAO,IAAIA,EAAQ;EAAG;CAC3F,CAAC;CACD,OAAO8L,EAAO4G,IAAO,EAAE,YAAY,EAAE,MAAM1S,EAAQ,MAAM,EAAE,CAAC;CAC5D,YAAY8L,EAAO6G,IAAY,EAAE,YAAY,EAAE,MAAM3S,EAAQ,WAAW,EAAE,CAAC;AAC7E,GClCa4S,KAAgC;CAC3C,GAAG3C;CACH,GAAGrB;CACH,GAAG9B;CACH,GAAGV;CACH,GAAGsE;CACH,GAAG3C;CACH,GAAGsD;CACH,GAAGlE;CACH,GAAG+E;CACH,GAAG7B;AACL,GClBMwC,IAAI3S,IAGG4S,KAAgC;CAC3C,QAAQjK;CACR,cAAc;CACd,cAAc;EAAE,OAAO;EAAG,MAAM;CAAE;CAClC,cAAc;CAEd,oBAAoB;CACpB,OAAO;CACP,OAAO;CACP,sBAAsBoC;CAEtB;CACA,qBAAqB;CACrB,UAAU;EACR;EACA,YAAY;EACZ,UAAU;EACV,OAAO;GACL,IAAI;IAAE,UAAU4H,EAAE,UAAU;IAAM,YAAY;IAAO,YAAY,OAAOA,EAAE,UAAU,UAAU;GAAE;GAChG,IAAI;IAAE,UAAUA,EAAE,WAAW;IAAM,YAAY;IAAO,YAAY,OAAOA,EAAE,WAAW,UAAU;GAAE;GAClG,IAAI;IAAE,UAAUA,EAAE,WAAW;IAAM,YAAY;IAAO,YAAY,OAAOA,EAAE,WAAW,UAAU;GAAE;GAClG,IAAI;IAAE,UAAUA,EAAE,WAAW;IAAM,YAAY;IAAO,YAAY,OAAOA,EAAE,WAAW,UAAU;GAAE;GAClG,IAAI;IAAE,UAAU;IAAQ,YAAY;IAAO,YAAY;GAAO;GAC9D,IAAI;IAAE,UAAU;IAAQ,YAAY;IAAO,YAAY;GAAM;EAC/D;CACF;CACA,WAAW;EACT,IAAIA,EAAE,WAAW;EACjB,IAAIA,EAAE,cAAc;EACpB,IAAIA,EAAE,cAAc;EACpB,IAAIA,EAAE,cAAc;EACpB,IAAIA,EAAE,WAAW;CACnB;CACA,aAAa;EAAE,IAAI;EAAQ,IAAI;EAAQ,IAAI;EAAO,IAAI;EAAQ,IAAI;CAAM;CACxE,SAAS;EAAE,IAAI1K,EAAQ;EAAI,IAAIA,EAAQ;EAAI,IAAIA,EAAQ;EAAK,IAAIA,EAAQ;EAAK,IAAIA,EAAQ;CAAI;CAC7F,QAAQ;EAAE,IAAI;EAAO,IAAI;EAAO,IAAI;EAAQ,IAAI;EAAQ,IAAI;CAAO;CACnE,eAAe;CACf,SAAS;EACP,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;CACN;CACA,aAAa;EAAE,IAAI;EAAQ,IAAI;EAAQ,IAAI;EAAQ,IAAI;EAAY,IAAI;CAAO;CAC9E,WAAW;CACX,YAAY;CACZ,iBAAiB;EAAE,MAAM;EAAa,IAAI;EAAa,KAAK;CAAI;CAEhE,OAAO;EAAE;EAAS;EAAM,YAAAK;EAAY;CAAa;CAEjD,YAAYoK;AACd,GC1DMG,MAAS,MAAcC,EAAE,QAAQ,sBAAsB,OAAO,CAAC,CAAC,YAAY;AAElF,SAASC,GAAW,GAA2D;CAC7E,OAAO;EACL,WAAWD,EAAE;EACb,gBAAgBA,EAAE;EAClB,kBAAkBA,EAAE;EACpB,aAAaA,EAAE;EACf,eAAeA,EAAE;EACjB,eAAeA,EAAE;EACjB,eAAeA,EAAE;EACjB,oBAAoBA,EAAE;EACtB,gBAAgBA,EAAE;EAClB,sBAAsBA,EAAE;EACxB,qBAAqBA,EAAE;EACvB,eAAeA,EAAE;EACjB,aAAaA,EAAE;EACf,mBAAmBA,EAAE;EACrB,gBAAgBA,EAAE;EAClB,iBAAiBA,EAAE;EACnB,kBAAkBA,EAAE;EACpB,kBAAkBA,EAAE;EACpB,kBAAkBA,EAAE;EAGpB,wBAAwBA,EAAE;EAC1B,wBAAwBA,EAAE;EAC1B,0BAA0BA,EAAE;EAC5B,2BAA2BA,EAAE;EAC7B,iCAAiCA,EAAE;EACnC,kCAAkCA,EAAE;EACpC,0BAA0BA,EAAE;EAC5B,yBAAyB9K,EAAS;EAClC,2BAA2BA,EAAS;CACtC;AACF;AAGA,SAASgL,KAAa;CACpB,IAAMC,IAA+B;EACnC,eAAe;EACf,eAAe;EACf,kBAAkB;EAClB,kBAAkB;EAClB,cAAc;EACd,iBAAiB;EACjB,cAAc;CAChB;CAeA,OAdA,OAAQ,KAAKhT,EAAK,CAAC,CAA4B,SAAS,MAAS;EAC/D,EAAK,QAAQ4M,OAAU5M,GAAM4M;CAC/B,CAAC,GACD,OAAQ,KAAK1E,CAAK,CAAC,CAA4B,SAAS,MAAS;EAC/D,OAAO,QAAQA,EAAM0E,EAAK,CAAC,CAAC,SAAS,CAACqG,GAAMC,OAAS;GACnD,EAAK,QAAQtG,EAAK,GAAGqG,OAAUC;EACjC,CAAC;CACH,CAAC,GACD,OAAO,QAAQjT,EAAU,CAAC,CAAC,SAAS,CAAC2M,GAAM8F,OAAO;EAChD,EAAK,UAAUE,GAAMhG,CAAI,OAAO8F,EAAE;CACpC,CAAC,GACD,OAAO,QAAQ1K,CAAO,CAAC,CAAC,SAAS,CAACiL,GAAME,OAAW;EACjD,EAAK,QAAQF,OAAUE;CACzB,CAAC,GACMH;AACT;AAGA,IAAMI,KAAU;CACd,OAAO;EACL,uBAAuBlL,EAAM,QAAQ;EACrC,0BAA0BA,EAAM,QAAQ;EACxC,0BAA0BA,EAAM,QAAQ;EACxC,uBAAuBA,EAAM,UAAU;EACvC,0BAA0BA,EAAM,UAAU;EAC1C,0BAA0BA,EAAM,UAAU;EAC1C,oBAAoBA,EAAM,SAAS;EACnC,uBAAuBA,EAAM,SAAS;EACtC,uBAAuBA,EAAM,SAAS;EACtC,qBAAqBA,EAAM,OAAO;EAClC,wBAAwBA,EAAM,OAAO;EACrC,wBAAwBA,EAAM,OAAO;EACrC,uBAAuBA,EAAM,KAAK;EAClC,0BAA0BA,EAAM,KAAK;EACrC,0BAA0BA,EAAM,KAAK;CACvC;CACA,MAAM;EACJ,uBAAuB;EACvB,0BAA0B;EAC1B,0BAA0BA,EAAM,QAAQ;EACxC,uBAAuB;EACvB,0BAA0B;EAC1B,0BAA0BA,EAAM,UAAU;EAC1C,oBAAoB;EACpB,uBAAuB;EACvB,uBAAuBA,EAAM,SAAS;EACtC,qBAAqB;EACrB,wBAAwB;EACxB,wBAAwBA,EAAM,OAAO;EACrC,uBAAuBO,EAAS,KAAK;EACrC,0BAA0BA,EAAS,KAAK;EACxC,0BAA0BA,EAAS,KAAK;CAC1C;AACF,GAaM4K,KAAiB,OAAO,YAC5B,OAAO,QAAQ;CAPf,SAAS;CAAW,MAAM;CAC1B,WAAW;CAAW,OAAO;CAAW,MAAM;CAC9C,UAAU;CAAQ,QAAQ;CAC1B,QAAQ;CAAS,KAAK;CACtB,UAAU;CAAW,QAAQ;CAAW,MAAM;CAAW,MAAM;AAGhD,CAAW,CAAC,CAAC,SAAS,CAAChB,GAAO3G,OAAU;CACrD,CAAC,mBAAmB2G,EAAM,SAAS,gBAAgB3G,EAAK,KAAK;CAC7D,CAAC,mBAAmB2G,EAAM,eAAe,gBAAgB3G,EAAK,QAAQ;CACtE,CAAC,mBAAmB2G,EAAM,eAAe,gBAAgB3G,EAAK,QAAQ;AACxE,CAAC,CACH,GAEM4H,MAAa,MACjB,OAAO,YAAYC,EAAO,KAAK,GAAO,MAAM,CAAC,cAAcC,IAAI,KAAKnB,CAAK,CAAC,CAAC,GAEhEoB,YAAsD;CACjE,WAAWV,GAAW;CACtB,OAAO;EACL,GAAGD,GAAWrK,EAAS,KAAK;EAC5B,GAAG2K,GAAQ;EACX,GAAGE,GAAUnL,GAAY,KAAK;EAC9B,GAAGkL;EACH,gBAAgBtL,EAAS;EACzB,aAAaA,EAAS;EACtB,cAAcA,EAAS;EACvB,kBAAkB;EAClB,oCAAoC;EAEpC,oBAAoB;EACpB,qBAAqB;EACrB,sBAAsB;EACtB,oBAAoB;EACpB,gBAAgB;EAChB,kBAAkB;CACpB;CACA,MAAM;EACJ,GAAG+K,GAAWrK,EAAS,IAAI;EAC3B,GAAG2K,GAAQ;EACX,GAAGE,GAAUnL,GAAY,IAAI;EAC7B,GAAGkL;EACH,gBAAgBnL,EAAM,UAAU;EAChC,aAAaA,EAAM,SAAS;EAC5B,cAAcA,EAAM,OAAO;EAE3B,kBAAkBlI,GAAM;EACxB,oCAAoCA,GAAM;EAE1C,oBAAoB;EACpB,qBAAqB;EACrB,sBAAsB;EACtB,oBAAoBkI,EAAM,QAAQ;EAClC,gBAAgBO,EAAS,KAAK;EAC9B,kBAAkBA,EAAS,KAAK;EAChC,yBAAyBP,EAAM,OAAO;EACtC,2BAA2BA,EAAM,UAAU;CAC7C;AACF,IC5JawL,KAA2B,8BAElCC,MAAY,MAAgDR,MAAU,WAAWA,MAAU,UAAUA,MAAU;AAErH,SAASS,GAAiB,GAA6C;CACrE,IAAI;EACF,IAAMT,IAAQ,OAAO,SAAW,MAAc,OAAO,aAAa,QAAQU,CAAG,IAAI;EACjF,OAAOF,GAASR,CAAK,IAAIA,IAAQ,KAAA;CACnC,QAAQ;EACN;CACF;AACF;AAGA,IAAMW,KAAyBC,EAAgB;CAC7C,MAAM;CACN,OAAO,EAAE,YAAY;EAAE,MAAM;EAAQ,UAAU;CAAK,EAAE;CACtD,MAAM,GAAO;EACX,IAAM,EAAE,mBAAgBC,GAAsB;EAQ9C,OAPAC,GAAMC,IAAc,MAAU;GAC5B,IAAI;IACF,OAAO,aAAa,QAAQ/H,EAAM,YAAYgH,CAAK;GACrD,QAAQ,CAER;EACF,CAAC,SACY;CACf;AACF,CAAC,GA0BYgB,KAAaJ,EAAgB;CACxC,MAAM;CACN,cAAc;CACd,OAAO;EACL,OAAO;GAAE,MAAM;GAA0C,SAAS,KAAA;EAAU;EAC5E,oBAAoB;GAAE,MAAM;GAAwC,SAAS;EAAQ;EACrF,kBAAkB;GAAE,MAAM;GAAsC,SAAS,KAAA;EAAU;EACnF,sBAAsB;GAAE,MAAM;GAA4C,SAAS,KAAA;EAAU;EAC7F,uBAAuB;GAAE,MAAM,CAAC,QAAQ,OAAO;GAA+B,SAASL;EAAyB;CAClH;CACA,MAAM,GAAO,EAAE,UAAO,YAAS;EAC7B,IAAMzI,IAAQmJ,QAAgBjI,EAAM,QAAQkI,GAAU1B,IAASxG,EAAM,KAAK,IAAIwG,EAAQ,GAEhF2B,IAASnI,EAAM,wBAAwByH,GAAiBzH,EAAM,qBAAqB,IAAI,KAAA;EAE7F,aACEoI,EACEC,IACA;GACE,GAAGC;GACH,OAAOxJ,EAAM;GACb,oBAAoBqJ,KAAUnI,EAAM;GACpC,kBAAkBA,EAAM;GACxB,sBAAsBA,EAAM,wBAAwBsH;EACtD,SACM,CACJtH,EAAM,wBAAwBoI,EAAET,IAAwB,EAAE,YAAY3H,EAAM,sBAAsB,CAAC,IAAI,MACvGuI,EAAM,UAAU,CAClB,CACF;CACJ;AACF,CAAC,GC5FKxU,KAAqC;CACzC,SAAS;CACT,SAAS;CACT,MAAM;CACN,OAAO;CACP,SAAS;AACX,GAEM0U,KAA8C;CAClD,SAASC;CACT,SAASC;CACT,MAAMC;CACN,OAAOC;CACP,SAAS;AACX,GAkBaC,KAAMlB,EAAgB;CACjC,MAAM;CACN,cAAc;CACd,OAAO;EACL,MAAM;GAAE,MAAM;GAA6B,SAAS;EAAU;EAC9D,UAAU;GAAE,MAAM;GAAS,SAAS;EAAM;EAC1C,SAAS;GAAE,MAAM;GAAyC,SAAS;EAAQ;CAC7E;CACA,MAAM,GAAO,EAAE,UAAO,YAAS;EAC7B,aAAa;GACX,IAAMmB,IAAON,GAASzI,EAAM,OAEtBgJ,IAAYT,EAAM,eAAeD,EAAM,gBAAgB,KAAA,KAAaA,EAAM,oBAAoB,KAAA,GAC9FW,IAAcV,EAAM,gBAAgB,CAACS,KAAahJ,EAAM,YAAY+I,UAAaX,EAAEW,GAAM;IAAE,MAAM;IAAI,QAAQ;GAAI,CAAC,IAAI,KAAA;GAC5H,OAAOX,EACLnH,IACA;IAAE,OAAOlN,GAAUiM,EAAM;IAAO,SAASA,EAAM;IAAS,aAAaA,EAAM;IAAM,GAAGsI;GAAM,GAC1F;IAAE,GAAGC;IAAO,GAAIU,KAAe,EAAE,eAAY;GAAG,CAClD;EACF;CACF;AACF,CAAC;;;ACpDD,SAAgBC,EAAW,GAA2B;CACpD,IAAIC,KAAS,QAA8BA,MAAS,MAASA,MAAS,MAAQA,MAAS,IAAI,OAAO;CAClG,IAAI,MAAM,QAAQA,CAAI,GAAG,OAAOA,EAAK,MAAM,MAAUD,EAAWE,CAAmB,CAAC;CACpF,IAAIC,GAAQF,CAAI,GAAG;EACjB,IAAIA,EAAK,SAASG,IAAS,OAAO;EAClC,IAAIH,EAAK,SAASnV,IAAM,OAAO,OAAOmV,EAAK,YAAa,YAAYA,EAAK,SAAS,KAAK,MAAM;EAC7F,IAAIA,EAAK,SAASI,IAAU,OAAOL,EAAWC,EAAK,QAAsB;CAC3E;CACA,OAAO;AACT;AAGA,SAAgBK,EAAe,GAA+B,GAAqC;CACjG,IAAML,IAAOM,EAAYC,GAAMC,CAAI;CACnC,OAAOT,EAAWC,CAAI,IAAIA,IAAO,KAAA;AACnC;AAWA,SAAgBS,KAAmB;CACjC,IAAMC,IAAWC,GAAmB;CACpC,QAAQ,MAA2B;EACjC,IAAM9J,IAAQ6J,GAAU,MAAM;EAE9B,OADK7J,IACE,GAAQA,EAAM+J,GAAaC,CAAK,MAAMhK,EAAM+J,GAAaE,GAASD,CAAK,CAAC,MAD5D;CAErB;AACF;AAMA,IAAaE,KAAW;CAAE,MAAM;CAA0C,SAAS,KAAA;AAAU,GC3CvFC,KAAU;CACd,SAAS;EAAE,IAAI;EAAyB,OAAO;EAAQ,WAAW;CAAqB;CACvF,UAAU;EAAE,IAAI;EAAsB,OAAO;EAAsB,WAAW;CAAwB;CACtG,UAAU;EAAE,IAAI;EAAsB,OAAO;EAAQ,WAAW;CAAqB;AACvF,GAEalW,KAAeoW,IAAsC,GAAQ,EAAE,aAAU,WAAW,iBAAc,EAC7G,MAAM;CACJ,eAAeF,GAAQjL,EAAQ,CAAC;CAChC,kBAAkBiL,GAAQjL,EAAQ,CAAC;CACnC,sBAAsBiL,GAAQjL,EAAQ,CAAC;CACvC,mBAAmBoL,MAAW,KAAA,IAAY,KAAA,IAAYC,GAAUD,CAAM;AACxE,EACF,EAAE;;;;;GITWG,KAAcC,GAA4B1V;;;;;;;;;;;;;;;;;;;;;;;;;;;EFKvD,IAAM4V,IAAWC,GAaXC,IAAOH,GAEPrC,IAAQyC,EAAS,GACjBxC,IAAQyC,EAAS,GACjBhL,IAAQiL,GAAS,eAAe,EAAE,SAAS,UAAU,GAAGL,CAAQ,GAEhE,CAACM,GAAMC,KAAWC,GAAgB;GACtC,aAAapL,EAAM;GACnB,cAAc;GACd,WAAW,MAAU8K,EAAK,iBAAiB9D,CAAK;EAClD,CAAC,GAEKqE,IAAYC,GAAU;GAC1B,MAAM;GACN,SAAAd;GACA;GACA,IAAI,YAAY;IAAE,OAAOlC,EAAM;GAAO;GACtC,IAAI,QAAQ;IAAE,OAAOA,EAAM;GAAc;GACzC,IAAI,aAAa;IAAE,OAAOtI,EAAM;GAAmB;GACnD,IAAI,SAAS;IAAE,OAAOA,EAAM;GAAe;GAC3C,IAAI,OAAO;IAAE,OAAOA,EAAM;GAAa;GACvC,IAAI,WAAW;IAAE,OAAOA,EAAM;GAAU;GACxC,cAAAoK;EACF,CAAC,GAEKmB,UAAa/B,EAAexJ,EAAM,MAAMuI,EAAM,IAAI,GAClDiD,UAAkBhC,EAAexJ,EAAM,WAAWuI,EAAM,SAAS;EAEvE,SAASkD,IAAQ;GAEf,AADAN,EAAQ,EAAK,GACbL,EAAK,OAAO;EACd;mBAKU3W,EAAA+W,CAAA,KADR9W,EAAA,GAAAC,EAoBMF,EAAA0X,CAAA,GApBNvX,EAoBM;;GAlBJ,MAAK;EACQ,GAAA;GAAA,GAAAH,EAAAmU,CAAA;GAAK,GAAKnU,EAAAkX,CAAA,CAAS,CAAA,MAAA;EAAA,GAAA;GAC/B,SAASlX,EAAA6L,CAAA,CAAK,CAAC;GACf,KAAG,CAAA;IAAA,QAAa7L,EAAA6L,CAAA,CAAK,CAAC,WAAW,KAAA;IAAS,UAAY7L,EAAA6L,CAAA,CAAK,CAAC;GAAe,GAAK7L,EAAAmU,CAAA,CAAK,CAAS,GAAG;;GAElG,SAAA/T,QAIO,CAJPC,EAIO,QAAAC,EAAAC,EAJOP,EAAAkX,CAAA,CAAS,CAAA,SAAA,CAAA,CAAA,GAAA;KACrBjX,EAAA,GAAAC,EAAwBM,EAAR4W,CAAI,CAAA;IACpB/W,EAAqB,QAAA,MAAA,CAAfI,GAAQyX,EAAA,QAAA,SAAA,CAAA,CAAA;IACAlY,EAAA+U,CAAA,CAAU,CAACsC,EAAS,CAAA,KAAlCpX,EAAA,GAAAS,EAA6G,UAAAJ,EAAAH,EAAA,EAAA,KAAA,EAAA,GAA9DH,EAAAkX,CAAA,CAAS,CAAA,WAAA,CAAA,CAAA,GAAA,EAAejX,EAAA,GAAAC,EAA6BM,EAAb6W,CAAS,CAAA,EAAA,GAAA,EAAA,KAAAe,EAAA,IAAA,EAAA;GAG1FpY,GAAAA,EAAAA,GAAAA,EAAA6L,CAAA,CAAK,CAAC,mBADd5L,EAAA,GAAAC,EAOEF,EAAAgM,EAAA,GAPF7L,EAOE;;IALA,cAAW;IACX,MAAK;IACL,SAAQ;GACA,GAAAH,EAAAkX,CAAA,CAAS,CAAA,OAAA,GAAA,EAChB,SAAOI,EAAK,CAAA,GAAA,MAAA,EAAA,KAAAc,EAAA,IAAA,EAAA,CAAA,CAAA;;;;CEvEoCvX,GAAsB;CAAE,SAAAwV;CAAS,cAAAJ;AAAa,CAAC;;;;;;;wBIDzFsC,KAAchC,GAA4BvU;;;;;;;;;;;;;;;;;;;;EFMvD,IAAMyU,IAAWC,GAcXvC,IAAQyC,EAAS,GACjBxC,IAAQyC,EAAS,GACjBhL,IAAQiL,GAAS,eAAe,EAAE,aAAa,IAAI,GAAGL,CAAQ,GAG9DS,IAAYC,GAAU;GAC1B,MAAM;GACN,SAAAkB;GACA;GACA,IAAI,YAAY;IAAE,OAAOlE,EAAM;GAAO;GACtC,IAAI,QAAQ;IAAE,OAAOA,EAAM;GAAc;GACzC,IAAI,aAAa;IAAE,OAAOtI,EAAM;GAAmB;GACnD,IAAI,SAAS;IAAE,OAAOA,EAAM;GAAe;GAC3C,IAAI,OAAO;IAAE,OAAOA,EAAM;GAAa;GACvC,IAAI,WAAW;IAAE,OAAOA,EAAM;GAAU;EAC1C,CAAC,GAEK2M,UAAenD,EAAexJ,EAAM,QAAQuI,EAAM,MAAM,GACxDqE,UAAcpD,EAAexJ,EAAM,OAAOuI,EAAM,KAAK,GACrDsE,UAAgBrD,EAAexJ,EAAM,SAASuI,EAAM,OAAO,GAC3DuE,UAAatD,EAAe,KAAA,GAAWjB,EAAM,OAAO,GAEpDwE,UAAkB,CAACxE,EAAM,SAAS,OAAOvI,EAAM,SAAU,YAAYA,EAAM,QAAQA,EAAM,QAAQ,KAAA,GACjGgN,UAAkBxD,EAAexJ,EAAM,OAAOuI,EAAM,KAAK;oBAI7DhT,EAAA,GAAAC,EAcOC,EAAA0F,CAAA,GAAAzF,EAAAC,EAAA;GAAA,GAdYF,EAAA6S,CAAA;GAAK,GAAK7S,EAAA4V,CAAA,CAAS,CAAA,MAAA;EAAA,CAAA,CAAA,GAAA;GACpC,SAAAzV,QAQM;IARKmX,EAAQ,KAAMtX,EAAAyT,CAAA,CAAU,CAAC8D,EAAS,CAAA,KAA7CzX,EAAA,GAAAM,EAQM,OAAAH,EAAAI,EAAA,EAAA,KAAA,EAAA,GARoDL,EAAA4V,CAAA,CAAS,CAAA,OAAA,CAAA,CAAA,GAAA,CAEzD0B,EAAQ,KADhBxX,EAAA,GAAAM,EAKE,OAAA;;KAHC,KAAKkX,EAAQ;KACb,KAAKtX,EAAAuK,CAAA,CAAK,CAAC,YAAQ;KACnB,OAAKjK,GAAA,EAAA,QAAA,GAAeN,EAAAuK,CAAA,CAAK,CAAC,YAAW,IAAA,CAAA;IAExCzK,GAAAA,MAAAA,IAAAA,EAAAA,MAAAA,EAAA,GAAAC,EAAoCQ,EAApBgX,CAAS,GAAA,EAAA,KAAA,EAAA,CAAA,EAAA,GAAA,EAAA,KAAAT,EAAA,IAAA,EAAA;IAEb9W,EAAAyT,CAAA,CAAU,CAACyD,EAAM,CAAA,KAA/BpX,EAAA,GAAAC,EAAoGC,EAAAiH,EAAA,GAAAhH,EAAAI,EAAA,EAAA,KAAA,EAAA,GAAxDL,EAAA4V,CAAA,CAAS,CAAA,QAAA,CAAA,CAAA,GAAA;KAAY,SAAAzV,QAA0B,EAA1BL,EAAA,GAAAC,EAA0BQ,EAAV2W,CAAM,CAAA,EAAA,CAAA;;;IAC5ElX,EAAAyT,CAAA,CAAU,CAAC0D,EAAK,CAAA,KAA3BrX,EAAA,GAAAM,EAA2F,OAAAH,EAAAI,EAAA,EAAA,KAAA,EAAA,GAAnDL,EAAA4V,CAAA,CAAS,CAAA,OAAA,CAAA,CAAA,GAAA,EAAW9V,EAAA,GAAAC,EAAyBQ,EAAT4W,CAAK,CAAA,EAAA,GAAA,EAAA,KAAAL,EAAA,IAAA,EAAA;IACtE9W,EAAAyT,CAAA,CAAU,CAAC4D,EAAI,CAAA,KAA1BvX,EAAA,GAAAM,EAAwF,OAAAH,EAAAI,EAAA,EAAA,KAAA,EAAA,GAAjDL,EAAA4V,CAAA,CAAS,CAAA,MAAA,CAAA,CAAA,GAAA,EAAU9V,EAAA,GAAAC,EAAwBQ,EAAR8W,CAAI,CAAA,EAAA,GAAA,EAAA,KAAAP,EAAA,IAAA,EAAA;IACnE9W,EAAAyT,CAAA,CAAU,CAAC2D,EAAO,CAAA,KAA7BtX,EAAA,GAAAM,EAAiG,OAAAH,EAAAI,EAAA,EAAA,KAAA,EAAA,GAAvDL,EAAA4V,CAAA,CAAS,CAAA,SAAA,CAAA,CAAA,GAAA,EAAa9V,EAAA,GAAAC,EAA2BQ,EAAX6W,CAAO,CAAA,EAAA,GAAA,EAAA,KAAAN,EAAA,IAAA,EAAA;;;;;CE5DpCpW,GAAsB,EAAE,SAAAqW,GAAQ,CAAC;;;ACHxF,SAAgBU,GAAa,GAA2B,IAAS,IAA+B;CAG9F,OAFIC,MAAU,KAAA,KAAaA,MAAU,KAAK,OAAO,MAAMA,CAAK,IAAU,SACrDA,IAAQ,MACLC,IAAgB,SAAP;AAC/B;AAEA,IAAMC,KAAY;CAAE,IAAI;CAAqB,MAAM;CAAmB,MAAM;AAAmB,GAElFjX,KAAeiU,IAAkC,GAAQ,EAAE,UAAO,gBAAa,oBAAiB;CAC3G,IAAM9K,IAAO2N,GAAaC,GAAOI,CAAW;CAC5C,OAAO,EACL,MAAM;EACJ,qBAAqBF,GAAU9N;EAC/B,qBAAqBiO,KAAcjO,MAAS,SAAS8N,GAAU9N,KAAQ,KAAA;CACzE,EACF;AACF,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EEND,IAAMqL,IAAWC,GAiBXvC,IAAQyC,EAAS,GACjBxC,IAAQyC,EAAS,GACjBhL,IAAQiL,GAAS,WAAW,CAAC,GAAGL,CAAQ,GAExCS,IAAYC,GAAU;GAC1B,MAAM;GACN,SAAAmC;GACA;GACA,IAAI,YAAY;IAAE,OAAOnF,EAAM;GAAO;GACtC,IAAI,QAAQ;IAAE,OAAOA,EAAM;GAAc;GACzC,IAAI,aAAa;IAAE,OAAOtI,EAAM;GAAmB;GACnD,IAAI,SAAS;IAAE,OAAOA,EAAM;GAAe;GAC3C,IAAI,OAAO;IAAE,OAAOA,EAAM;GAAa;GACvC,IAAI,WAAW;IAAE,OAAOA,EAAM;GAAU;GACxC,cAAAsN;EACF,CAAC,GAEKO,UAAcrE,EAAexJ,EAAM,OAAOuI,EAAM,KAAK,GACrDvB,UAAc;GAClB,IAAMmC,IAAOK,EAAexJ,EAAM,OAAOuI,EAAM,KAAK;GACpD,OAAO,OAAOY,KAAS,WAAW3M,GAAa2M,CAAI,IAAIA;EACzD,GACM2E,UAAmBtE,EAAexJ,EAAM,YAAYuI,EAAM,UAAU,GACpEgD,UAAa/B,EAAexJ,EAAM,MAAMuI,EAAM,IAAI,GAClDwF,UAAcvE,EAAexJ,EAAM,OAAOuI,EAAM,KAAK,GAErDhJ,UAAa2N,GAAalN,EAAM,OAAOA,EAAM,WAAW,GACxDgO,UACJhO,EAAM,UAAU,KAAA,KAAaA,EAAM,UAAU,IAAIiO,KAAYjO,EAAM,QAAQ,IAAIkO,KAAmBC;oBAIlGzX,EAAA,GAAAC,EAeMC,EAAAiV,CAAA,GAAAhV,EAAAC,EAAA;GAAA,GAfYF,EAAA0R,CAAA;GAAK,GAAK1R,EAAAyU,CAAA,CAAS,CAAA,MAAA;EAAA,CAAA,CAAA,GAAA;GACnC,SAAAtU,QAGM;IAHNC,EAGM,OAAAH,EAAAC,EAHOF,EAAAyU,CAAA,CAAS,CAAA,QAAA,CAAA,CAAA,GAAA,CACpBrU,EAAkE,QAAAH,EAAAC,EAApDF,EAAAyU,CAAA,CAAS,CAAA,OAAA,CAAA,CAAA,GAAA,EAAW3U,EAAA,GAAAC,EAAyBM,EAAT4W,CAAK,CAAA,EAAA,GAAA,EAAA,GAC3CjX,EAAAsS,CAAA,CAAU,CAACqC,EAAI,CAAA,KAA3B7U,EAAA,GAAAQ,EAA0F,QAAAL,EAAAM,EAAA,EAAA,KAAA,EAAA,GAAlDP,EAAAyU,CAAA,CAAS,CAAA,MAAA,CAAA,CAAA,GAAA,EAAU3U,EAAA,GAAAC,EAAwBM,EAARsU,CAAI,CAAA,EAAA,GAAA,EAAA,KAAAgB,EAAA,IAAA,EAAA,CAAA,GAAA,EAAA;IAEjE3V,EAAAoJ,CAAA,CAAK,CAAC,WAAtBtJ,EAAA,GAAAC,EAAkEC,EAAAoL,EAAA,GAAA;;KAAlC,QAAQ;KAAI,OAAM;KAAO,IAAI;IAC7DtL,CAAAA,MAAAA,EAAA,GAAAQ,EAAuE,OAAAL,EAAAM,EAAA,EAAA,KAAA,EAAA,GAAnDP,EAAAyU,CAAA,CAAS,CAAA,OAAA,CAAA,CAAA,GAAA,EAAW3U,EAAA,GAAAC,EAAyBM,EAAT+P,CAAK,CAAA,EAAA,GAAA,EAAA;KACjDpQ,EAAAoJ,CAAA,CAAK,CAAC,UAAU,KAAA,KAAapJ,EAAAsS,CAAA,CAAU,CAAC4E,EAAU,CAAA,MAAA,CAASlX,EAAAoJ,CAAA,CAAK,CAAC,WAA7EtJ,EAAA,GAAAQ,EAMM,OAAAL,EAAAM,EAAA,EAAA,KAAA,EAAA,GANwFP,EAAAyU,CAAA,CAAS,CAAA,QAAA,CAAA,CAAA,GAAA,CACzFzU,EAAAoJ,CAAA,CAAK,CAAC,UAAU,KAAA,IAEEuM,EAAA,IAAA,EAAA,KAF9B7V,EAAA,GAAAQ,EAGO,QAHPC,EAGO,EAAA,KAAA,EAAA,GAHwCP,EAAAyU,CAAA,CAAS,CAAA,OAAA,GAAA,EAAY,aAAW9L,EAAI,EAAA,CAAA,GAAA,EACjF7I,EAAA,GAAAC,EAAuDM,EAAvC+W,EAAS,CAAA,GAAA;KAAK,MAAM;KAAI,QAAO;IAAQ3W,CAAAA,IAAAA,GAAA,MACvDC,EAAGV,EAAAmG,EAAA,CAAa,CAACnG,EAAAoJ,CAAA,CAAK,CAAC,OAAK,EAAA,QAAA,GAAA,CAAA,CAAA,GAAA,CAAA,CAAA,GAAA,IAAA0N,EAAA,IAElB9W,EAAAsS,CAAA,CAAU,CAAC4E,EAAU,CAAA,KAAjCpX,EAAA,GAAAQ,EAA2E,QAAAyW,IAAA,EAArCjX,EAAA,GAAAC,EAA8BM,EAAd6W,CAAU,CAAA,EAAA,CAAA,KAAAvB,EAAA,IAAA,EAAA,CAAA,GAAA,EAAA,KAAAA,EAAA,IAAA,EAAA;IAEvD3V,EAAAsS,CAAA,CAAU,CAAC6E,EAAK,CAAA,KAA3BrX,EAAA,GAAAQ,EAA2F,OAAAL,EAAAM,EAAA,EAAA,KAAA,EAAA,GAAnDP,EAAAyU,CAAA,CAAS,CAAA,OAAA,CAAA,CAAA,GAAA,EAAW3U,EAAA,GAAAC,EAAyBM,EAAT8W,CAAK,CAAA,EAAA,GAAA,EAAA,KAAAxB,EAAA,IAAA,EAAA;;;;;IEnExE+B,KAAW1G,EAAgB;CACtC,MAAM;CACN,cAAc;CACd,OAAO;EACL,MAAM;GAAE,MAAM,CAAC,QAAQ,MAAM;GAAwC,gBAAgB;IAAE,MAAM;IAAG,SAAS;IAAG,SAAS;GAAE;EAAG;EAC1H,SAAS;GAAE,MAAM;IAAC;IAAQ;IAAQ;GAAM;GAA2C,SAAS;EAAK;EACjG,MAAM;GAAE,MAAM;GAA6C,SAAS;EAAY;CAClF;CACA,MAAM,GAAO,EAAE,UAAO,YAAS;EAC7B,aAAaQ,EAAEmG,IAAmB;GAAE,MAAMvO,EAAM;GAAM,MAAMA,EAAM;GAAM,SAASA,EAAM;GAAS,GAAGsI;EAAM,GAAGC,CAAK;CACnH;AACF,CAAC,GCbYiG,KAAU9D,GAAwBlT,IAAkB;CAAE,SAAAiW;CAAS,cAAAH;AAAa,CAAC,GCJ7EmB,KAAepE,IAAqC,GAAQ,EAAE,mBAAgB,EACzF,MAAM,EACJ,2BAA2BqE,MAAa,KAAA,IAAY,KAAA,IAAY,OAAOA,KAAa,WAAWC,GAAID,CAAQ,IAAIA,EACjH,EACF,EAAE;;;;;;;;;;;GIAWG,KAAanE,GAA2BpS;;;;;;;;;;;;;;;;;;;;;;;EFKrD,IAAMsS,IAAWC,GAiBXtC,IAAQyC,EAAS,GACjB1C,IAAQyC,EAAS,GAEjB/K,IAAQiL,GAAS,cAAc;GAAE,eAAe;GAAK,MAAM;EAAW,GAAGL,CAAQ,GAGjFS,IAAYC,GAA6B;GAC7C,MAAM;GACN,SAAAsD;GACA;GACA,IAAI,YAAY;IACd,OAAOtG,EAAM;GACf;GACA,IAAI,QAAQ;IACV,OAAOA,EAAM;GACf;GACA,IAAI,aAAa;IACf,OAAOtI,EAAM;GACf;GACA,IAAI,SAAS;IACX,OAAOA,EAAM;GACf;GACA,IAAI,OAAO;IACT,OAAOA,EAAM;GACf;GACA,IAAI,WAAW;IACb,OAAOA,EAAM;GACf;GACA;EACF,CAAC,GAGK8O,KAAc,MAA4BC,EAAE;EAClD,EAAW,QAAQ,CAAC,MAAM;EAE1B,IAAMC,IAAgB/G,QAAmCjI,EAAM,iBAAiB,GAAG,GAC7E2M,IAAS1E,QAAeuB,EAAexJ,EAAM,QAAQuI,EAAM,MAAM,CAAC,GAClEqE,IAAQ3E,QAAewB,EAAYzJ,EAAM,OAAOuI,EAAM,KAAK,CAAC,GAC5D0G,IAAchH,QAAeuB,EAAexJ,EAAM,aAAauI,EAAM,WAAW,CAAC,GACjFgD,IAAOtD,QAAeuB,EAAexJ,EAAM,MAAMuI,EAAM,IAAI,CAAC,GAC5DsE,IAAU5E,QAAeuB,EAAexJ,EAAM,SAASuI,EAAM,OAAO,CAAC,GACrE2G,KAAYjH,QAAe;GAC/B,IAAM,EAAE,OAAOkH,GAAQ,OAAOC,GAAQ,GAAGC,MAAS/G;GAClD,OAAO+G;EACT,CAAC,GAEKC,MAAa,GAA6B,MAC9CC,EAAM,OACFnH,EACE9D,IACA;GACE,KAAKkL;GACL,WAAWR,EAAc;GACzB,MAAMO,EAAM;GACZ,GAAIP,EAAc,UAAU,OAAO,EAAE,IAAIO,EAAM,KAAK;GACpD,IAAI;EACN,SACM9F,EAAY8F,EAAM,KAAK,CAC/B,IACAnH,EAAEyD,GAAY;GAAE,KAAK2D;GAAO,WAAW;GAAQ,GAAG;GAAoB,IAAI;EAAK,SAAS/F,EAAY8F,EAAM,KAAK,CAAC;oBAIpH7X,EAAA,GAAAC,EAiDMC,EAAAiU,CAAA,GAAAhU,EAAAC,EAAA;GAAA,GAjDYoX,GAAA;GAAS,GAAKtX,EAAAyT,CAAA,CAAS,CAAA,MAAA;EAAA,CAAA,CAAA,GAAA;GACvC,SAAAtT,QAOc,CANNH,EAAAoI,CAAA,CAAK,CAAC,eAAepI,EAAAoI,CAAA,CAAK,CAAC,YAAY,SAAM,KADrDtI,EAAA,GAAAC,EAOcC,EAAA6X,EAAA,GAPdzX,EAOc,EAAA,KAAA,EAAA,GALJJ,EAAAyT,CAAA,CAAS,CAAA,aAAA,GAAA;IACjB,IAAG;IACF,oBAAkB;;IAEnB,SAAAtT,QAAuD,CAAvDE,EAAuD6W,GAAA,EAA1C,MAAMlX,EAAAoI,CAAA,CAAK,CAAC,YAAY,IAAIsP,EAAS,EAAA,GAAA,MAAA,GAAA,CAAA,MAAA,CAAA,CAAA,CAAA;;GAEpDnX,GAAAA,EAAAA,KAAAA,EAAAA,IAAAA,EAAAA,GAAAA,EAuCM,OAAAN,EAAAC,EAvCOF,EAAAyT,CAAA,CAAS,CAAA,QAAA,CAAA,CAAA,GAAA,CACpBlT,EAkCM,OAAAN,EAAAC,EAlCOF,EAAAyT,CAAA,CAAS,CAAA,MAAA,CAAA,CAAA,GAAA,CACTE,EAAA,UAAS,KAAA,IACKgB,EAAA,IAAA,EAAA,KADzB7U,EAAA,GAAAU,EAEM,OAFNJ,EAEM,EAAA,KAAA,EAAA,GAFiCJ,EAAAyT,CAAA,CAAS,CAAA,MAAA,GAAA,EAAU,eAAY,OAAM,CAAA,GAAA,CAC1EpT,EAA2B6W,GAAA,EAAd,MAAMvD,EAAA,MAAI,GAAA,MAAA,GAAA,CAAA,MAAA,CAAA,CAAA,GAAA,EAAA,IAEzBpT,EA6BM,OAAAN,EAAAC,EA7BOF,EAAAyT,CAAA,CAAS,CAAA,MAAA,CAAA,CAAA,GAAA;IACNsB,EAAA,UAAW,KAAA,iBAAzBjV,EAAA,GAAAC,EAESC,EAAA8E,EAAA,GAAA7E,EAAAG,EAAA,EAAA,KAAA,EAAA,GAFmCJ,EAAAyT,CAAA,CAAS,CAAA,QAAA,CAAA,CAAA,GAAA;KACnD,SAAAtT,QAA6B,CAA7BE,EAA6B6W,GAAA,EAAhB,MAAMnC,EAAA,MAAM,GAAA,MAAA,GAAA,CAAA,MAAA,CAAA,CAAA,CAAA;;;IAGnB/U,EAAAoI,CAAA,CAAK,CAAC,SAAI,aADlBtI,EAAA,GAAAC,EAUWC,EAAAuF,EAAA,GAVXnF,EAUW;;KART,WAAU;KACV,MAAK;KACL,IAAG;KACF,IAAI;KACJ,IAAI;IACG,GAAAJ,EAAAyT,CAAA,CAAS,CAAA,OAAA,CAAA,GAAA;KAEjB,SAAAtT,QAA4B,CAA5BE,EAA4B6W,GAAA,EAAf,MAAMlC,EAAA,MAAK,GAAA,MAAA,GAAA,CAAA,MAAA,CAAA,CAAA,CAAA;;IAE1BlV,GAAAA,EAAAA,MAAAA,EAAA,GAAAC,EAEWC,EAAAuF,EAAA,GAFXnF,EAEW;;KAFM,WAAU;KAAK,MAAK;KAAM,IAAI2U,EAAA,UAAW,KAAA,IAAS,IAAA;IAAkB,GAAA/U,EAAAyT,CAAA,CAAS,CAAA,OAAA,CAAA,GAAA;KAC5F,SAAAtT,QAA4B,CAA5BE,EAA4B6W,GAAA,EAAf,MAAMlC,EAAA,MAAK,GAAA,MAAA,GAAA,CAAA,MAAA,CAAA,CAAA,CAAA;;;IAGlBqC,EAAA,UAAgB,KAAA,iBADxBvX,EAAA,GAAAC,EAUcC,EAAA+E,EAAA,GAVd3E,EAUc;;KARZ,WAAU;KACV,MAAK;KACL,GAAE;KACD,KAAK;KACL,IAAI;IACG,GAAAJ,EAAAyT,CAAA,CAAS,CAAA,aAAA,CAAA,GAAA;KAEjB,SAAAtT,QAAkC,CAAlCE,EAAkC6W,GAAA,EAArB,MAAMG,EAAA,MAAW,GAAA,MAAA,GAAA,CAAA,MAAA,CAAA,CAAA,CAAA;;;GAIzB,GAAA,EAAA,CAAA,GAAA,EAAA,GAAApC,EAAA,UAAY,KAAA,IACKN,EAAA,IAAA,EAAA,KAD5B7U,EAAA,GAAAU,EAEM,OAAAP,EAAAG,EAAA,EAAA,KAAA,EAAA,GAFoCJ,EAAAyT,CAAA,CAAS,CAAA,SAAA,CAAA,CAAA,GAAA,CACjDpT,EAA8B6W,GAAA,EAAjB,MAAMjC,EAAA,MAAO,GAAA,MAAA,GAAA,CAAA,MAAA,CAAA,CAAA,GAAA,EAAA,EAAA,GAAA,EAAA,CAAA,CAAA;;;;CEnImBvU,GAAqB;CAAE,SAAAsW;CAAS;AAAa,CAAC;;;;;;GE6F7FgB,MAAe,MAAgCC,EAAO,MAAMA,EAAO,OAAO;AAEhF,SAASC,GAAQ,GAAY,GAAY;CAEvC,OADI,OAAOC,KAAM,YAAY,OAAOC,KAAM,WAAiBD,IAAIC,IACxD,OAAOD,KAAK,EAAE,CAAC,CAAC,cAAc,OAAOC,KAAK,EAAE,GAAG,SAAS;EAAE,SAAS;EAAM,aAAa;CAAO,CAAC;AACvG;AASA,IAAaC,KAAYrI,GAErB,GACA,EAAE,UAAO,UAAO,cACb;CACH,IAAM,CAACsI,GAAMC,KAAgB/E,GAAyC;EACpE,aAAapL,EAAM;EACnB,cAAcA,EAAM,eAAe;EACnC,WAAW,MAAS;GAElB,AADA8K,EAAK,eAAesF,CAAI,GACxBtF,EAAK,eAAesF,CAAI;EAC1B;CACF,CAAC,GACKC,IAAOC,GAAI,CAAC,GAEZC,KAAW,MAAkC;EAEjD,AADAJ,EAAaC,CAAI,GACjB,EAAK,QAAQ;CACf,GAEMI,KAAc,MAAgB;EAClC,IAAMC,IAAUP,EAAK;EACrB,AAAI,CAACO,KAAWA,EAAQ,QAAQ/I,IAAK6I,EAAQ;GAAE;GAAK,WAAW;EAAM,CAAC,IAC7DE,EAAQ,cAAc,QAAOF,EAAQ;GAAE;GAAK,WAAW;EAAO,CAAC,IACnEA,EAAQ,IAAI;CACnB,GAEMG,IAASzI,QAAe;EAC5B,IAAMwI,IAAUP,EAAK;EACrB,IAAI,CAACO,GAAS,OAAOzQ,EAAM;EAC3B,IAAM6P,IAAS7P,EAAM,QAAQ,MAAM,MAAM4P,GAAS3P,CAAC,MAAMwQ,EAAQ,GAAG,GAC9DE,IAAWd,GAAQ,eAAe,MAAYA,GAAQ,MAAMe,EAAIf,EAAO,OAAO,KAAA,IAC9EgB,IAAS,CAAC,GAAG7Q,EAAM,IAAI,CAAC,CAAC,MAAM,GAAG,MAAM8P,GAAQa,EAASZ,CAAC,GAAGY,EAASX,CAAC,CAAC,CAAC;EAC/E,OAAOS,EAAQ,cAAc,SAASI,EAAO,QAAQ,IAAIA;CAC3D,CAAC,GAGKC,IAAclH,GAAiB;CAErC,aAAa;EACX,IAAM,EAAE,YAAS,aAAU,YAAS,WAAO,aAAS,kBAAc,mBAAe5J,GAC3E+Q,KAAc/Q,EAAM,eAAe,GACnCgR,IAAcd,EAAK,OACnBe,IAAQP,EAAO,MAAM,QACrBQ,IAAaC,IAAW,KAAK,IAAI,GAAG,KAAK,KAAKF,IAAQE,CAAQ,CAAC,IAAI,GACnEC,IAAc,KAAK,IAAIf,EAAK,OAAOa,CAAU,GAC7CG,KAAUF,IAAWT,EAAO,MAAM,OAAOU,IAAc,KAAKD,GAAUC,IAAcD,CAAQ,IAAIT,EAAO,OACvGY,IAAYR,EAAY,WAAW,GAEnCS,KAASnJ,EAAEoJ,IAAmB,YAClCpJ,EAAEqJ,IAAgB,YAChBC,EAAQ,KAAK,MAAW;GACtB,IAAMC,IAAK/B,GAASC,CAAM,GACpB+B,IAAWZ,GAAa,QAAQW,GAChCE,IAAYD,IAA4BZ,EAAa,cAAc,QAAQc,KAAcC,KAAlEC,IACvBnE,IAAQpE,EAAYoG,EAAO,QAAQtH,EAAM,UAAUoJ,IAAuC;GAChG,OAAOvJ,EACL6J,IACA;IACE,KAAKN;IACL,OAAO9B,EAAO,UAAUtX,GAAQ,MAAM,KAAA;IACtC,OAAO,EAAE,OAAO,OAAOsX,EAAO,SAAU,WAAW,GAAGA,EAAO,MAAM,MAAMA,EAAO,MAAM;IACtF,aAAa+B,IAAYZ,EAAa,cAAc,QAAQ,cAAc,eAAgB,KAAA;GAC5F,SAEEnB,EAAO,WACHzH,EACE,UACA;IAAE,MAAM;IAAU,OAAO7P,GAAQ;IAAY,eAAeqZ,KAAY,KAAA;IAAW,eAAepB,EAAWmB,CAAE;GAAE,GACjH,CAAC9D,GAAOzF,EAAEyJ,GAAU;IAAE,MAAM;IAAI,QAAQ;IAAO,SAASD,IAAW,IAAI;GAAI,CAAC,CAAC,CAC/E,IACA/D,CACR;EACF,CAAC,CACH,CACF,GAEIf;EACJ,IAAIoF,GACF,KAAO,MAAM,KAAK,EAAE,QAAQnB,GAAY,IAAI,GAAG,MAC7C3I,EAAEqJ,IAAgB,EAAE,KAAKpK,EAAE,SACzBqK,EAAQ,KAAK,MACXtJ,EAAE+J,IAAgB,EAAE,KAAKvC,GAASC,CAAM,EAAE,SACxCzH,EAAEpG,IAAiB;GAAE,QAAQ;GAAI,OAAO6N,EAAO,UAAU,QAAQ;GAAO,IAAIA,EAAO,UAAU,SAAS;EAAE,CAAC,CAC3G,CACF,CACF,CACF;OACK,IAAIwB,GAAQ,WAAW,GAAG;GAC/B,IAAMe,IAAQ3I,EAAYzJ,EAAM,OAAOuI,EAAM,KAAK;GAClD,KAAOH,EAAEqJ,IAAgB,YACvBrJ,EAAE+J,IAAgB,EAAE,SAAST,EAAQ,OAAO,SAC1CU,KACAhK,EAAEnG,IAAmB;IACnB,IAAI;IACJ,MAAM;IACN,YAAYmG,EAAEiK,IAAiB,EAAE,MAAM,GAAG,CAAC;IAC3C,OAAO;IACP,aAAa;GACf,CAAC,CACH,CACF;EACF,OACE,KAAOhB,GAAQ,KAAK,GAAK,MACvBjJ,EACEqJ,IACA;GACE,KAAKzR,EAAM,SAASA,EAAM,OAAO4Q,GAAKpB,CAAK,IAAIA;GAC/C,OAAOjX,GAAQ;GACf,kBAAkB+Y,IAAY,KAAO,KAAA;GACrC,UAAUA,IAAY,IAAI,KAAA;GAC1B,SAASA,UAAkBxG,EAAK,aAAa8F,GAAKpB,CAAK,IAAI,KAAA;GAC3D,WAAW8B,KACN,MAAyB;IACxB,CAAItH,EAAM,QAAQ,WAAWA,EAAM,QAAQ,SACzCA,EAAM,eAAe,GACrBc,EAAK,aAAa8F,GAAKpB,CAAK;GAEhC,IACA,KAAA;EACN,SAEEkC,EAAQ,KAAK,MAAW;GACtB,IAAMC,IAAK/B,GAASC,CAAM,GACpByC,IAAW/J,EAAM,QAAQoJ,MACzBY,IAAM1C,EAAO,MAAMe,EAAIf,EAAO,OAAO,KAAA,GACrC2C,IAAUF,IACZA,EAAS;IAAE;IAAK;GAAM,CAAC,IACvBzC,EAAO,SACLA,EAAO,OAAOe,GAAKpB,CAAK,IACxBK,EAAO,WAAW,OAAO0C,KAAQ,WAC/B/V,GAAa+V,GAAK1C,EAAO,MAAM,IAC9B0C;GACT,OAAOnK,EAAE+J,IAAgB;IAAE,KAAKR;IAAI,OAAO9B,EAAO,UAAUtX,GAAQ,MAAM,KAAA;GAAU,SAASia,CAAO;EACtG,CAAC,CACL,CACF;EAGF,OAAOpK,EAAEyD,GAAYC,EAAW;GAAE,OAAOvT,GAAQ;GAAS,cAAcka,MAAS,KAAA;EAAU,GAAGnK,CAAK,SAAS,CAC1GF,EAAElE,IAAmB,EAAE,MAAM,OAAO,SAClCkE,EAAEpN,GAAc;GAAE;GAAS;GAAc,GAAG0X;EAAW,SAAS,CAACnB,IAAQnJ,EAAEuK,IAAmB,YAAY7F,EAAI,CAAC,CAAC,CAClH,GACAqE,KAAYF,IAAQE,IAChB/I,EAAE,OAAO,EAAE,OAAO7P,GAAQ,OAAO,GAAG,CAClC6P,EACE,QACA,GAAG5L,IAAc4U,IAAc,KAAKD,IAAW,CAAC,EAAE,GAAG3U,GAAa,KAAK,IAAI4U,IAAcD,GAAUF,CAAK,CAAC,EAAE,MAAMzU,GAAayU,CAAK,GACrI,GACA7I,EAAE3D,IAAmB;GACnB,MAAM;GACN,OAAOyM;GACP,YAAYE;GACZ,wBAAwB,MAAkB;IACxC,EAAK,QAAQpK;GACf;EACF,CAAC,CACH,CAAC,IACD,IACN,CAAC;CACH;AACF,GACA;CACE,MAAM;CACN,cAAc;CACd,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,OAAO;EAAC;EAAe;EAAe;CAAW;AACnD,CACF,GCtRa4L,KAAchL,EAAgB;CACzC,MAAM;CACN,cAAc;CACd,OAAO;EACL,IAAI;GAAE,MAAM;GAAyD,SAAS;EAAO;EACrF,OAAO;GAAE,MAAM;GAAQ,SAAS;EAAgB;EAChD,SAAS;GAAE,MAAM;GAAgD,SAAS,KAAA;EAAU;EACpF,OAAO;GAAE,MAAM;GAA8C,SAAS,KAAA;EAAU;EAChF,MAAM;GAAE,MAAM,CAAC,QAAQ,MAAM;GAAwC,SAAS,KAAA;EAAU;CAC1F;CACA,MAAM,GAAO,EAAE,YAAS;EACtB,IAAM,EAAE,sBAAmBC,GAAsB,GAC3CI,IAAW4K,GAAuB,SAAS,EAAE,yBAAyB,GAAK,CAAC,GAC5EC,UAAeC,EAAe9K,EAAS,UAAU,SAAS,UAAU,MAAM;EAEhF,aAAa;GACX,IAAMc,IAAOd,EAAS,UAAU,SAAS+K,KAAUC;GAiBnD,OAfIjT,EAAM,OAAO,WACRoI,EACLrI,IACA;IACE,SAASC,EAAM,WAAW;IAC1B,OAAOA,EAAM;IACb,MAAMA,EAAM,QAAQ;IACpB,mBAAmBoI,EAAEW,GAAM,EAAE,MAAM,GAAG,CAAC;IACvC,SAAS+J;IACT,GAAGxK;GACL,SACMtI,EAAM,KACd,IAGKoI,EACLlI,IACA;IACE,SAASF,EAAM,WAAW;IAC1B,OAAOA,EAAM;IACb,MAAMA,EAAM,QAAQ;IACpB,SAAS8S;IACT,cAAc9S,EAAM;IACpB,OAAOA,EAAM;IACb,GAAGsI;GACL,SACMF,EAAEW,GAAM,EAAE,MAAM,GAAG,CAAC,CAC5B;EACF;CACF;AACF,CAAC;;;;;;;;GEjDYoK,KAAcvL,EAAgB;CACzC,MAAM;CACN,cAAc;CACd,OAAO;EACL,MAAM;GAAE,MAAM;GAAQ,UAAU;EAAK;EACrC,OAAO;GAAE,MAAM;GAAQ,UAAU;EAAK;EACtC,QAAQ;GAAE,MAAM;GAAQ,SAAS,KAAA;EAAU;EAC3C,MAAM;GAAE,MAAM;GAA2D,SAAS;EAAQ;CAC5F;CACA,MAAM,GAAO,EAAE,YAAS;EACtB,IAAMwL,IAAYC,GAAa,EAAE,SAAS,KAAK,CAAC;EAChD,aAAa;GACX,IAAMC,IAAOtT,EAAM,SAAS,YAAYA,EAAM,SAAS,OAAOA,EAAM,OAAO,KAAKA,EAAM;GACtF,OAAOoI,EAAE1M,GAAgB;IAAE,OAAO0X,EAAU,OAAO,QAAQ,aAAa,UAAUE;IAAQ,WAAW;GAAK,SACxGlL,EAAE,UAAU0D,EAAW;IAAE,MAAM;IAAU,OAAOrT,EAAQ;IAAQ,eAAe2a,EAAU,KAAKE,CAAI;GAAE,GAAGhL,CAAK,GAAG,CAC7GF,EAAE,OAAO;IAAE,OAAO3P,EAAQ;IAAO,OAAO,EAAE,YAAYuH,EAAM,MAAM;GAAE,CAAC,GACrEoI,EAAE,OAAO,EAAE,OAAO3P,EAAQ,KAAK,GAAG;IAChC2P,EAAE,OAAO,EAAE,OAAO3P,EAAQ,KAAK,GAAGuH,EAAM,IAAI;IAC5CoI,EAAE,OAAO,EAAE,OAAO3P,EAAQ,IAAI,GAAGuH,EAAM,KAAK;IAC5CA,EAAM,SAASoI,EAAE,OAAO,EAAE,OAAO3P,EAAQ,IAAI,GAAGuH,EAAM,MAAM,IAAI;GAClE,CAAC,CACH,CAAC,CACH;EACF;CACF;AACF,CAAC,GAOYuT,KAAY3L,EAAgB;CACvC,MAAM;CACN,cAAc;CACd,OAAO,EACL,OAAO;EAAE,MAAM;EAA4C,UAAU;CAAK,EAC5E;CACA,MAAM,GAAO,EAAE,YAAS;EACtB,IAAMwL,IAAYC,GAAa,EAAE,SAAS,KAAK,CAAC;EAChD,aACEjL,EACE,OACA0D,EAAW,EAAE,OAAOrT,EAAQ,KAAK,GAAG6P,CAAK,GACzCtI,EAAM,MAAM,KAAK,MACfoI,EAAE1M,GAAgB;GAAE,KAAKoL,EAAK;GAAO,OAAOsM,EAAU,OAAO,QAAQ,aAAatM,EAAK;GAAO,WAAW;EAAK,SAC5GsB,EACE,UACA;GACE,MAAM;GACN,OAAO3P,EAAQ;GACf,OAAO;IAAE,YAAYqO,EAAK;IAAO,OAAO0M,GAAU1M,EAAK,KAAK,IAAI,KAAM,uBAAuB;GAAO;GACpG,eAAesM,EAAU,KAAKtM,EAAK,KAAK;EAC1C,GACA,GAAGA,EAAK,QAAQA,EAAK,UAAU,MAAM,IACvC,CACF,CACF,CACF;CACJ;AACF,CAAC,GC1DK2M,KAAY;CAAE,IAAI;CAA8B,IAAI;CAA2B,IAAI;AAA0B,GAGtGC,KAAW9L,EAAgB;CACtC,MAAM;CACN,cAAc;CACd,OAAO;EACL,OAAO;GAAE,MAAM;GAAQ,UAAU;EAAK;EACtC,UAAU;GAAE,MAAM;GAAQ,SAAS,KAAA;EAAU;EAC7C,cAAc;GAAE,MAAM;GAAmD,SAAS,KAAA;EAAU;EAC5F,aAAa;GAAE,MAAM;GAAQ,SAAS,KAAA;EAAU;EAChD,MAAM;GAAE,MAAM;GAAQ,SAAS,KAAA;EAAU;EACzC,MAAM;GAAE,MAAM;GAAwD,SAAS;EAAK;CACtF;CACA,MAAM,GAAO,EAAE,YAAS;EACtB,aAAa;GACX,IAAM,EAAE,UAAO,aAAU,iBAAc,gBAAa,SAAM,YAAS5H;GACnE,OAAOoI,EAAEyD,GAAYvD,SAAa;IAChCqL,MAAa,KAAA,KAAaA,IAAW3M,IACjCoB,EACEwL,GACA;KAAE,IAAI;KAAM,GAAG;KAAoB,IAAI;KAAgB,cAAc,kBAAkB5W,GAAe2W,CAAQ;IAAI,SAC5G3W,GAAe2W,CAAQ,CAC/B,IACA;IACJvL,EAAEyL,IAAc;KAAE,KAAK;KAAG,OAAO;KAAY,MAAM;IAAS,SAAS,CACnEzL,EACEwL,GACA;KAAE,WAAW;KAAQ,IAAIH,GAAU/T;KAAO,IAAI;KAAK,IAAI;KAAK,GAAG;KAAqB,OAAO,EAAE,oBAAoB,eAAe;IAAE,SAC5H1C,GAAegK,CAAK,CAC5B,GACA8M,IAAO1L,EAAEwL,GAAa;KAAE,WAAW;KAAQ,IAAI;KAAM,GAAG;KAAoB,IAAI;IAAI,SAASE,CAAI,IAAI,IACvG,CAAC;IACDC,MAAgB,KAAA,KAAaA,IAAc,IACvC3L,EACEwL,GACA;KAAE,IAAI;KAAM,IAAI;KAAK,GAAG;IAA8B,SAChD,GAAG5W,GAAegK,KAAS,IAAI+M,IAAc,IAAI,EAAE,WAAWA,EAAY,OAClF,IACA;IACJC,KAAgBA,EAAa,QAAQ,IACjC5L,EACEwL,GACA;KAAE,IAAI;KAAM,GAAG;IAAmB,SAEhC,MAAMI,EAAa,MAAM,OAAOhX,GAAegK,IAAQgN,EAAa,KAAK,IAAIA,EAAa,iBAAiB,KAAuB,KAAf,cACvH,IACA;GACN,CAAC;EACH;CACF;AACF,CAAC;;;;;;;;;wBI7DYG,KAAczJ,GAA4BhR;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EFKvD,IAAMkR,IAAWC,GAqBXC,IAAOH,GAEPrC,IAAQyC,EAAS,GACjBxC,IAAQyC,EAAS,GACjB8F,IAAclH,GAAiB,GAC/B5J,IAAQiL,GACZ,eACA;GAAE,cAAc;GAAM,aAAa;GAAW,YAAY;GAAG,eAAe;EAAI,GAChFL,CACF,GAEMS,IAAYC,GAAU;GAC1B,MAAM;GACN,SAAA2I;GACA;GACA,IAAI,YAAY;IAAE,OAAO3L,EAAM;GAAO;GACtC,IAAI,QAAQ;IAAE,OAAOA,EAAM;GAAc;GACzC,IAAI,aAAa;IAAE,OAAOtI,EAAM;GAAmB;GACnD,IAAI,SAAS;IAAE,OAAOA,EAAM;GAAe;GAC3C,IAAI,OAAO;IAAE,OAAOA,EAAM;GAAa;GACvC,IAAI,WAAW;IAAE,OAAOA,EAAM;GAAU;EAC1C,CAAC,GAEKoU,UACJpU,EAAM,YAAYA,EAAM,WAAWA,EAAM,QAAQ,KAAK,OAAO,IAAIA,EAAM,QAAQA,EAAM,YAAY,GAAG,IAAI,GAEpGqU,UAAqBrU,EAAM,aAAa,KAAA,KAAa8Q,EAAY,iBAAiB,GAElFwD,UAAmBxD,EAAY,QAAQ,GACvCyD,WAAkB;GACtB,IAAMC,IAAOxU,EAAM,iBAAiB;GACpC,OAAOA,EAAM,OAAQwU,MAAS,MAAM,EAAE,MAAMxU,EAAM,KAAK,IAAI;IAAE,IAAIA,EAAM;IAAM,MAAMA,EAAM;GAAK,IAAK,CAAC;EACtG,GACMyU,WAAuBzU,EAAM,OAAQA,EAAM,iBAAiB,MAAO,OACnE0U,WAAqB,CAAC,IAAI1U,EAAM,UAAU,CAAC,EAAA,CAAG,KAAK,MAAUyJ,EAAYkL,CAAK,CAAC,GAAGpM,EAAM,SAAS,CAAC;oBAItG5P,EAAA,GAAAC,EAuCOC,EAAAsC,CAAA,GAvCPrC,EAuCO;GAAA,GAvCYD,EAAAyP,CAAA;GAAK,GAAKzP,EAAAwS,CAAA,CAAS,CAAA,MAAA;EAAA,GAAA,EAAa,KAAG,CAAA,EAAA,aAAkB,GAAQxS,EAAAmH,CAAA,CAAK,CAAC,QAAQsU,EAAU,GAAA,GAAQzb,EAAAyP,CAAA,CAAK,CAAS,GAAG,EAAA,CAAA,GAAA;GAC/H,SAAAvP,QAmBM;IAnBNC,EAmBM,OAAAC,EAAAC,EAnBOL,EAAAwS,CAAA,CAAS,CAAA,SAAA,EAAA,OAAA,EAAA,mBAAwC,OAAOxS,EAAAmH,CAAA,CAAK,CAAC,UAAU,EAAA,EAAA,CAAA,CAAA,CAAA,GAAA;KACnFhH,EAA2D,OAAA;MAArD,KAAKH,EAAAmH,CAAA,CAAK,CAAC;MAAQ,KAAKnH,EAAAmH,CAAA,CAAK,CAAC;MAAM,SAAQ;;KAClDhH,EAGM,OAAAC,EAAAC,EAHOL,EAAAwS,CAAA,CAAS,CAAA,QAAA,CAAA,CAAA,GAAA,CACTxS,EAAAmH,CAAA,CAAK,CAAC,gBAAgBoU,EAAQ,IAAA,KAAzCzb,EAAA,GAAAC,EAAuGC,EAAAiQ,EAAA,GAAA;;MAAtD,MAAK;MAAQ,SAAQ;;MAAS,SAAA/P,QAAC,CAADI,GAAA,MAACC,EAAGgb,EAAQ,CAAA,IAAK,KAAC,CAAA,CAAA,CAAA;;KACjGzb,CAAAA,KAAAA,EAAAA,IAAAA,EAAAA,IAAAA,EAAA,GAAAC,EAAgCU,EAAhBob,EAAY,CAAA,EAAA,GAAA,EAAA;KAGtBL,EAAY,KADpB1b,EAAA,GAAAC,EAYaC,EAAAqH,EAAA,GAZbpH,EAYa,EAAA,KAAA,EAAA,GAVHD,EAAAwS,CAAA,CAAS,CAAA,UAAA,GAAA;MACjB,SAAQ;MACP,OAAOxS,EAAAmH,CAAA,CAAK,CAAC,WAAQ,WAAA;MACtB,QAAO;MACN,cAAYnH,EAAAmH,CAAA,CAAK,CAAC,WAAQ,0BAAA;MAC1B,gBAAc,EAAQnH,EAAAmH,CAAA,CAAK,CAAC;MAC5B,SAAK,AAAA4U,EAAA,QAAA,MAAE9J,EAAI,mBAAA,CAAqBjS,EAAAmH,CAAA,CAAK,CAAC,QAAQ;;MAE/C,SAAAjH,QAAoD,CAA7BF,EAAAmH,CAAA,CAAK,CAAC,YAA7BrH,EAAA,GAAAC,EAAoDC,EAAAgc,EAAA,GAAA;;OAAZ,MAAM;MAC9Clc,CAAAA,MAAAA,EAAA,GAAAC,EAA+BC,EAAAic,EAAA,GAAA;;OAAZ,MAAM;;;;;;;;;IAGlBjc,EAAAmH,CAAA,CAAK,CAAC,YAAjBrH,EAAA,GAAAY,EAAoF,OAAAN,EAAAH,EAAA,EAAA,KAAA,EAAA,GAAjDD,EAAAwS,CAAA,CAAS,CAAA,UAAA,CAAA,CAAA,GAAAjS,EAAiBP,EAAAmH,CAAA,CAAK,CAAC,QAAQ,GAAA,EAAA,KAAAuM,EAAA,IAAA,EAAA;KAC3E5T,EAAA,GAAAC,EAA+GU,EAA/Fmb,GAAa,CAAA,GAAAxb,EAAAC,EAAA;KAAA,GAAiBqb,GAAS;KAAA,GAAO1b,EAAAwS,CAAA,CAAS,CAAA,MAAA;IAAA,CAAA,CAAA,GAAA;KAAY,SAAAtS,QAAgB,CAAbI,GAAAC,EAAAP,EAAAmH,CAAA,CAAK,CAAC,IAAI,GAAA,CAAA,CAAA,CAAA;;;IACnFnH,EAAAmH,CAAA,CAAK,CAAC,WAAW,KAAA,iBAA9BrH,EAAA,GAAAC,EAGQC,EAAAgb,EAAA,GAAA;;KAHkC,KAAK;KAAG,IAAG;;KACnD,SAAA9a,QAA4F,CAA5FS,EAA4FX,EAAAyK,EAAA,GAAA;MAAnF,eAAazK,EAAAmH,CAAA,CAAK,CAAC;MAAS,WAAW;MAAG,aAAA;MAAU,MAAK;MAAK,OAAM;KACjEnH,GAAAA,MAAAA,GAAAA,CAAAA,aAAAA,CAAAA,GAAAA,EAAAmH,CAAA,CAAK,CAAC,YAAY,KAAA,iBAA9BrH,EAAA,GAAAC,EAAkGC,EAAA+a,CAAA,GAAA;;MAAzD,IAAG;MAAK,GAAE;;MAAmB,SAAA7a,QAAC,CAADI,GAAA,MAACC,EAAGP,EAAAmH,CAAA,CAAK,CAAC,OAAO,IAAG,KAAC,CAAA,CAAA,CAAA;;;;;IAE7FxG,EAOEX,EAAA6a,EAAA,GAPF5a,EACUD,EAMRwS,CAAA,CANiB,CAAA,OAAA,GAAA;KAChB,OAAOxS,EAAAmH,CAAA,CAAK,CAAC;KACb,aAAWnH,EAAAmH,CAAA,CAAK,CAAC;KACjB,cAAcnH,EAAAmH,CAAA,CAAK,CAAC;KACpB,gBAAcnH,EAAAmH,CAAA,CAAK,CAAC;KACpB,MAAMnH,EAAAmH,CAAA,CAAK,CAAC;;;;;;;;IAEDsU,EAAU,KAAxB3b,EAAA,GAAAC,EAGSC,EAAAkH,EAAA,GAHTjH,EAGS,EAAA,KAAA,EAAA,GAH2BD,EAAAwS,CAAA,CAAS,CAAA,QAAA,GAAA;KAAY,cAAA;KAAY,SAAK,AAAAuJ,EAAA,QAAA,MAAE9J,EAAI,UAAWiK,CAAM;;KACpF,aAAWhc,QAAgC,CAA/BS,EAA+BX,EAAAmc,EAAA,GAAA,EAAZ,MAAM,GAAE,CAAA,CAAA,CAAA;KAAe,SAAAjc,QACjE,CADiEI,GAAA,MACjEC,EAAGP,EAAAmH,CAAA,CAAK,CAAC,WAAW,GAAA,CAAA,CAAA,CAAA;;;;;;;CErG6BtG,GAAsB,EAAE,SAAAua,GAAQ,CAAC,GCiB3EgB,KAAarN,EAAgB;CACxC,MAAM;CACN,cAAc;CACd,OAAO;EACL,MAAM;GAAE,MAAM;GAAQ,UAAU;EAAK;EACrC,aAAasC;EACb,WAAW;GAAE,MAAM;GAAQ,SAAS;EAAS;EAC7C,aAAa;GAAE,MAAM;GAAQ,SAAS;EAAW;CACnD;CACA,OAAO,EAAE,OAAO,MAAkB,GAAK;CACvC,MAAM,GAAO,EAAE,UAAO,UAAO,WAAQ;EACnC,IAAMkJ,IAAYC,GAAa,EAAE,SAAS,KAAK,CAAC;EAChD,aAAa;GACX,IAAM6B,IAAS9B,EAAU,OAAO,OAC1BnE,IAAczF,EAAexJ,EAAM,aAAauI,EAAM,WAAW;GACvE,OAAOH,EACLyD,GACA;IACE,GAAG;IACH,OAAO;KACL,QAAQ;KACR,cAAc;KACd,YAAY;IACd;IACA,GAAGvD;GACL,SAEEF,EAAEyL,IAAc;IAAE,SAAS;IAAiB,KAAK;IAAM,MAAM;GAAS,SAAS,CAC7EzL,EAAEyL,IAAc;IAAE,KAAK;IAAM,MAAM;IAAU,OAAO,EAAE,UAAU,EAAE;GAAE,SAAS,CAC3EzL,EAAE+M,IAAY;IAAE,MAAM;IAAI,OAAO;IAAqB,OAAO,EAAE,YAAY,EAAE;GAAE,CAAC,GAChF/M,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,GAAG,CACnC6G,MAAgB,KAAA,IAA8F,OAAlF7G,EAAEwL,GAAa;IAAE,IAAI;IAAM,GAAG;IAAoB,IAAI;GAAI,SAAS3E,CAAW,GAC1G7G,EAAEwL,GAAa;IAAE,IAAI;IAAK,IAAI;IAAM,KAAK;IAAU,GAAG;IAAqB,IAAI;GAAY,SAAS5T,EAAM,IAAI,CAChH,CAAC,CACH,CAAC,GACDoI,EACErI,IACA;IACE,MAAM;IACN,SAASmV,IAAS,WAAW;IAC7B,OAAOA,IAAS,cAAc,KAAA;IAC9B,mBAAmB9M,EAAE8M,IAASvM,KAAYyM,IAAU,EAAE,MAAM,GAAG,CAAC;IAChE,eAAe;KAEb,AADAhC,EAAU,KAAKpT,EAAM,IAAI,GACzB8K,EAAK,QAAQ9K,EAAM,IAAI;IACzB;GACF,SACOkV,IAASlV,EAAM,cAAcA,EAAM,SAC5C,CACF,CAAC,CACL;EACF;CACF;AACF,CAAC;;;;;;;;;;GIzEYsV,KAAS5K,GAAuBlQ;;;;;;;;;;;;;;;;;;;;;;;EFK7C,IAAMoQ,IAAWC,GAcXtC,IAAQyC,EAAS,GACjB1C,IAAQyC,EAAS,GAEjB/K,IAAQiL,GACZ,UACA;GACE,aAAa7C,EAAE1K,IAAQ;IAAE,SAAS;IAAQ,MAAM;GAAG,CAAC;GACpD,WAAW;GACX,OAAO,CAAC;GACR,eAAe;GACf,kBAAkB;EACpB,GACAkN,CACF,GAEM,CAAC2K,GAAQ,EAAE,WAAQ,cAAWC,GAAc,EAAK,GAGjDnK,IAAYC,GAAyB;GACzC,MAAM;GACN,SAAA+J;GACA;GACA,IAAI,YAAY;IACd,OAAO/M,EAAM;GACf;GACA,IAAI,QAAQ;IACV,OAAOA,EAAM;GACf;GACA,IAAI,aAAa;IACf,OAAOtI,EAAM;GACf;GACA,IAAI,SAAS;IACX,OAAOA,EAAM;GACf;GACA,IAAI,OAAO;IACT,OAAOA,EAAM;GACf;GACA,IAAI,WAAW;IACb,OAAOA,EAAM;GACf;EACF,CAAC,GAGK8O,KAAc,MAA4BC,EAAE;EAClD,EAAW,QAAQ,CAAC,MAAM;EAE1B,IAAMC,IAAgB/G,QAAmCjI,EAAM,iBAAiB,GAAG,GAC7EyV,KAAa,MAAkBzG,EAAc,UAAU,MAAM,EAAE,QAAK,IAAI;GAAE,IAAI0G;GAAM;EAAK,GAEzFC,KAAgB,GAA+B,MACnD,OAAOC,KAAc,WAAWC,IAAW,EAAE,eAAeA,EAAS,GAEjEC,MAAe,OAClB9V,EAAM,SAAS,CAAC,EAAA,CAAG,KAAK,GAAkB,MAAkB;GAC3D,IAAM+V,IAAW,CAACvB,EAAK,QAAQA,EAAK,UAC9BoB,IAAYG,IAAW,WAAW/G,EAAc,OAChDuF,IAAYwB,IAAW;IAAE,MAAM;IAAU,UAAUvB,EAAK,YAAY,KAAA;GAAU,IAAIiB,EAAUjB,EAAK,IAAK,GACtGwB,IAAWxB,EAAK,UAAU,KAAA,KAAaA,EAAK,UAAU,QAAQA,EAAK,UAAU,IAE7EqB,IADcrB,EAAK,eAAe,QAAQA,EAAK,gBAAgB,OACrC/K,EAAY+K,EAAK,KAAoB,IAAI;IACvEA,EAAK,eAAe,OAEhB,OADApM,EAAE,QAAQ;KAAE,GAAGiD,EAAU,aAAa;KAAG,iBAAiB;IAAO,GAAG,CAAC5B,EAAY+K,EAAK,WAAW,CAAC,CAAC;IAEvGwB,IAAW5N,EAAE,QAAQiD,EAAU,WAAW,GAAG,CAAC5B,EAAY+K,EAAK,KAAoB,CAAC,CAAC,IAAI;IACzFA,EAAK,gBAAgB,OAEjB,OADApM,EAAE,QAAQ;KAAE,GAAGiD,EAAU,aAAa;KAAG,iBAAiB;IAAQ,GAAG,CAAC5B,EAAY+K,EAAK,YAAY,CAAC,CAAC;GAE3G;GACA,OAAOpM,EACLwN,GACA;IACE,KAAKpG;IACL,GAAG+E;IACH,GAAGlJ,EAAU,MAAM;IACnB,eAAemJ,EAAK,UAAU,KAAA;IAC9B,iBAAiBA,EAAK,YAAY,KAAA;IAClC,gBAAgBA,EAAK,SAAS,SAAS,KAAA;IACvC,cAAcA,EAAK;IACnB,UAAU,MAAsB;KAC9B,AAAIA,EAAK,aACTA,EAAK,UAAUxK,CAAK,GACpBiM,IAAa;IACf;GACF,GACAN,EAAaC,GAAWC,CAAQ,CAClC;EACF,CAAC,GAEGK,KAAYjO,QAAewB,EAAYzJ,EAAM,OAAOuI,EAAM,KAAK,CAAC,GAChE4N,KAAYlO,QAAewB,EAAYzJ,EAAM,cAAcuI,EAAM,YAAY,CAAC,GAC9E6N,KAAiBnO,QAAgBjI,EAAM,cAAc,OAAO,SAASgP,EAAc,KAAM,GACzFqH,KAAapO,QAAgBjI,EAAM,cAAc,OAAO,CAAC,IAAIyV,EAAUzV,EAAM,aAAa,GAAG,CAAE,GAC/FsW,IAAarO,QAAe,CAAC,CAACjI,EAAM,qBAAqBA,EAAM,SAAS,CAAC,EAAA,CAAG,SAAS,CAAC,GACtFuW,IAAUtO,QAAe,CAAC,EAAE,UAAUjI,EAAM,iBAAiB,GAAIsI,EAAc,GAAG,CAAC;oBAIvF3O,EAAA,GAAAC,EAyBS,UAAA,MAAA,CAxBPC,EAkBMC,EAAA+R,CAAA,GAlBN9R,EAkBM;GAAA,GAlBYD,EAAAwO,CAAA;GAAK,GAAKxO,EAAAuR,CAAA,CAAS,CAAA,MAAA;EAAA,GAAA,EAAa,KAAKkL,EAAA,MAAO,CAAA,GAAA;GAC5D,SAAAvc,QAEY;KAFZL,EAAA,GAAAM,EAEYC,EAFIkc,GAAA,KAAc,GAAAjc,EAAAC,EAAA;KAAA,GAAeic,GAAA;KAAU,GAAKvc,EAAAuR,CAAA,CAAS,CAAA,OAAA;IAAA,CAAA,CAAA,GAAA;KACnE,SAAArR,QAAgC,CAAhCH,EAAgCiV,GAAA,EAAnB,MAAMoH,GAAA,MAAS,GAAA,MAAA,GAAA,CAAA,MAAA,CAAA,CAAA,CAAA;;;IAE9B7b,EAEM,OAFNN,EAAaD,EAEPuR,CAAA,CAFgB,CAAA,OAAA,GAAA,EAAW,cAAW,YAAW,CAAA,GAAA,CACrDxR,EAAoCiV,GAAA,EAAvB,MAAMgH,GAAW,EAAA,GAAA,MAAA,GAAA,CAAA,MAAA,CAAA,CAAA,GAAA,EAAA;IAEhCzb,EAUM,OAAAF,EAAAC,EAVON,EAAAuR,CAAA,CAAS,CAAA,OAAA,CAAA,CAAA,GAAA,CACpBxR,EAAgCiV,GAAA,EAAnB,MAAMqH,GAAA,MAAS,GAAA,MAAA,GAAA,CAAA,MAAA,CAAA,GAEpBG,EAAA,SADR3c,EAAA,GAAAM,EAOEH,EAAAyK,EAAA,GAPFxK,EAOE;;KALC,QAAQD,EAAAyb,CAAA;KACT,MAAK;KACL,cAAW;IACH,GAAAzb,EAAAuR,CAAA,CAAS,CAAA,QAAA,GAAA,EAChB,SAAOvR,EAAAgZ,CAAA,EAAM,CAAA,GAAA,MAAA,IAAA,CAAA,UAAA,SAAA,CAAA,KAAAvG,EAAA,IAAA,EAAA,CAAA,GAAA,EAAA;;;EAIJ,GAAA,IAAA,CAAA,KAAA,CAAA,GAAA+J,EAAA,SAAhB3c,EAAA,GAAAM,EAIWH,EAAA0c,EAAA,GAAA;;GAJkB,UAAU1c,EAAAyb,CAAA;;GACrC,SAAAvb,QAEM,CAFNK,EAEM,OAFNN,EAAaD,EAEPuR,CAAA,CAFgB,CAAA,aAAA,GAAA,EAAiB,cAAW,qBAAoB,CAAA,GAAA,CACpExR,EAAyCiV,GAAA,EAA5B,MAAMgH,GAAYhc,EAAA2R,CAAA,CAAK,EAAA,GAAA,MAAA,GAAA,CAAA,MAAA,CAAA,CAAA,GAAA,EAAA,CAAA,CAAA;;;;CE1ICjR,GAAiB,EAAE,SAAA6a,GAAQ,CAAC"}