@jcdecor/ui 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/README.md +6 -6
- package/dist/chat/ChatComposer.d.ts +13 -1
- package/dist/chat/ChatMessage.d.ts +5 -1
- package/dist/chat/ChatThread.d.ts +5 -1
- package/dist/chat/ConversationList.d.ts +5 -1
- package/dist/chat/types.d.ts +2 -0
- package/dist/chat.js +225 -190
- package/dist/chat.js.map +1 -1
- package/dist/components/PageHeader/PageHeader.d.ts +23 -7
- package/dist/components/TopNav/TopNav.d.ts +9 -1
- package/dist/index.js +544 -490
- package/dist/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["t","classes","dropdown","header","footer","classes","classes","classes","label","classes","classes","classes","burger","classes","classes","brand","title","classes","typography","brand","typography","toneColor","root","varsResolver","classes","root","classes","root","footer","classes","root","classes","classes","name","classes","classes","feedback","spacing","tokens","ramps","chartColors","fontFamily","typography$1","chartPalette","grid","brand$1","jcColors","formatNumber","Disclaimer","Kicker","Subheadline","formatDate","Display","formatCompact","formatPercent","formatCurrency","formatTime","LOCALE","Headline","SpartanHelmet","greekFramePaths","JcLogoAlt","logoPaths","GreekFrame","altLogoPaths","JcLogo","collaboratorPaths","Collaborator","spartanPaths","LIGHT_FAMILIES","jcVariantColorResolver","input","colorName","theme","parsed","parseThemeColor","family","variant","defaultVariantColorsResolver","base","light","isPrimary","tone","isSize","size","control","overlayProps","buttons_module_default","buttonsComponents","Button","props","c","ActionIcon","CloseButton","combobox_module_default","COMBOBOX_INPUTS","dropdownClassNames","classNamesByComponent","comboboxComponents","name","classNames","Cascader","Pill","dataDisplay_module_default","dataDisplayComponents","Accordion","Avatar","BackgroundImage","Badge","Card","DataList","Image","Indicator","Kbd","NumberFormatter","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","CheckboxIndicator","CheckboxCard","Radio","RadioIndicator","RadioCard","Switch","Chip","SegmentedControl","Fieldset","PinInput","Slider","RangeSlider","AngleSlider","Rating","ColorPicker","AlphaSlider","HueSlider","layout_module_default","layoutComponents","AppShell","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","Tooltip","Modal","Drawer","Dialog","ActionBar","FloatingWindow","Overlay","LoadingOverlay","typography_module_default","YELLOWS","typographyComponents","Blockquote","Code","List","Mark","yellow","color","getThemeColor","Table","Title","Typography","jcComponents","t","jcTheme","createTheme","kebab","s","schemeVars","staticVars","vars","step","hex","value","tagVars","semantic","lightColorVars","chartVars","colors","i","jcCssVariablesResolver","JcProvider","others","merged","mergeThemeOverrides","MantineProvider","cssVariablesResolver","toneColor$1","toneIcon","IconInfoCircle","IconCheck","IconAlertTriangle","IconX","Tag","Icon","leftSection","withIcon","PromoBanner_module_default","palette","varsResolver$1","createVarsResolver","radius","getRadius","PromoBanner","factory","useProps","_props","internalOpen","setOpen","useState","open","opened","getStyles","useStyles","Box","withCloseButton","icon","highlight","onClose","ContentCard_module_default","ContentCard","image","imageAlt","imageHeight","kicker","title","children","actions","KpiCard_module_default","getDeltaTone","delta","invert","toneColor","varsResolver","invertDelta","colorValue","KpiCard","ArrowIcon","IconMinus","IconArrowUpRight","IconArrowDownRight","label","loading","deltaLabel","chart","KpiGroup","SimpleGrid","TopNav_module_default","TopNav","LinkComponent","useDisclosure","renderLinks","links","isButton","link","Component","linkProps","event","onNavigate","index","BrandComponent","brandHref","brandProps","collapseOnMobile","brand","rightSection","toggle","Collapse","close","PageHeader","breadcrumbs","Breadcrumbs","crumb","linkComponent","Group","description","DataTable_module_default","columnId","column","compare","a","b","DataTable","controlledSort","internalSort","setInternalSort","initialSort","sort","page","setPage","setSort","next","onSortChange","toggleSort","key","sorted","useMemo","data","columns","getValue","row","result","totalPages","pageSize","currentPage","visible","header","id","isSorted","SortIcon","IconArrowUp","IconArrowDown","IconArrowsSort","body","loadingRows","empty","IconDatabaseOff","onRowClick","raw","content","rowKey","plain","tableProps","ThemeToggle","useMantineColorScheme","computed","useComputedColorScheme","setColorScheme","IconSun","IconMoon","as","TokenSwatch_module_default","TokenSwatch","clipboard","useClipboard","text","copy","cssVar","className","ColorRamp","steps","luminance","valueSize","PriceTag","oldValue","Text","unit","pixDiscount","installments","ProductCard_module_default","ProductCard","discount","oldPrice","price","href","NameComponent","onAction","imageRatio","showDiscount","badges","Fragment","badge","onFavoriteChange","favorite","jsx","IconHeartFilled","IconHeart","category","rating","reviews","IconShoppingCart","actionLabel","CouponCode","IconTicket","code","IconCopy","onCopy","copiedLabel","copyLabel"],"sources":["../src/theme/variantColorResolver.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.tsx","../src/components/Tag/Tag.tsx","../src/components/PromoBanner/PromoBanner.module.css","../src/components/PromoBanner/PromoBanner.tsx","../src/components/ContentCard/ContentCard.module.css","../src/components/ContentCard/ContentCard.tsx","../src/components/KpiCard/KpiCard.module.css","../src/components/KpiCard/KpiCard.tsx","../src/components/TopNav/TopNav.module.css","../src/components/TopNav/TopNav.tsx","../src/components/PageHeader/PageHeader.tsx","../src/components/DataTable/DataTable.module.css","../src/components/DataTable/DataTable.tsx","../src/components/ThemeToggle/ThemeToggle.tsx","../src/components/TokenSwatch/TokenSwatch.module.css","../src/components/TokenSwatch/TokenSwatch.tsx","../src/components/PriceTag/PriceTag.tsx","../src/components/ProductCard/ProductCard.module.css","../src/components/ProductCard/ProductCard.tsx","../src/components/CouponCode/CouponCode.tsx"],"sourcesContent":["import {\n defaultVariantColorsResolver,\n parseThemeColor,\n type VariantColorsResolver,\n} from '@mantine/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 { MantineSize } from '@mantine/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","/* 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 { ActionIcon, Button, CloseButton, type MantineSize, type MantineThemeComponents } from '@mantine/core';\nimport { control, isSize } from '../controls';\nimport classes from './buttons.module.css';\n\nexport const buttonsComponents: MantineThemeComponents = {\n Button: Button.extend({\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: ActionIcon.extend({ defaultProps: { variant: 'subtle' }, classNames: { root: classes.actionIcon } }),\n CloseButton: CloseButton.extend({ classNames: { root: classes.closeButton } }),\n};\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 { Cascader, Pill, type MantineThemeComponents } from '@mantine/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: MantineThemeComponents = {\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: Cascader.extend({\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: Pill.extend({ classNames: { root: classes.pill, remove: classes.pillRemove } }),\n};\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 {\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 type MantineThemeComponents,\n} from '@mantine/core';\nimport classes from './dataDisplay.module.css';\n\nexport const dataDisplayComponents: MantineThemeComponents = {\n Accordion: Accordion.extend({\n defaultProps: { chevronPosition: 'right' },\n classNames: { item: classes.accordionItem, control: classes.accordionControl, label: classes.accordionLabel, chevron: classes.accordionChevron, content: classes.accordionContent },\n }),\n Avatar: Avatar.extend({ defaultProps: { color: 'horizon', radius: 'xl' }, classNames: { root: classes.avatar } }),\n BackgroundImage: BackgroundImage.extend({ defaultProps: { radius: 'md' } }),\n Badge: Badge.extend({\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: Card.extend({ defaultProps: { radius: 'md', padding: 'lg', shadow: 'sm', withBorder: true } }),\n DataList: DataList.extend({ classNames: { root: classes.dataList, itemLabel: classes.dataListLabel, itemValue: classes.dataListValue } }),\n Image: Image.extend({ defaultProps: { radius: 'md' } }),\n Indicator: Indicator.extend({ defaultProps: { color: 'danger' }, classNames: { indicator: classes.indicator } }),\n Kbd: Kbd.extend({ classNames: { root: classes.kbd } }),\n /** Formato brasileiro por padrão: 1.234,56 */\n NumberFormatter: NumberFormatter.extend({ defaultProps: { thousandSeparator: '.', decimalSeparator: ',' } }),\n RollingNumber: RollingNumber.extend({ defaultProps: { thousandSeparator: '.', decimalSeparator: ',' } }),\n Spoiler: Spoiler.extend({ classNames: { control: classes.spoilerControl } }),\n ThemeIcon: ThemeIcon.extend({ defaultProps: { radius: 'md' } }),\n Timeline: Timeline.extend({\n defaultProps: { bulletSize: 24, lineWidth: 2 },\n classNames: { root: classes.timeline, item: classes.timelineItem, itemBullet: classes.timelineBullet, itemTitle: classes.timelineTitle },\n }),\n};\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 {\n Alert,\n EmptyState,\n Loader,\n Notification,\n Progress,\n RingProgress,\n SemiCircleProgress,\n Skeleton,\n type MantineThemeComponents,\n} from '@mantine/core';\nimport classes from './feedback.module.css';\n\nexport const feedbackComponents: MantineThemeComponents = {\n Notification: Notification.extend({\n defaultProps: { radius: 'md' },\n classNames: { root: classes.notification, title: classes.notificationTitle, description: classes.notificationDescription, icon: classes.notificationIcon },\n }),\n Alert: Alert.extend({ defaultProps: { variant: 'light' }, classNames: { root: classes.alert, wrapper: classes.alertWrapper, title: classes.alertTitle, message: classes.alertMessage } }),\n Loader: Loader.extend({ defaultProps: { type: 'oval' } }),\n Progress: Progress.extend({ defaultProps: { radius: 'xl' }, classNames: { root: classes.progress, label: classes.progressLabel } }),\n RingProgress: RingProgress.extend({ classNames: { curve: classes.ringCurve } }),\n SemiCircleProgress: SemiCircleProgress.extend({ classNames: { root: classes.semiCircle, label: classes.semiCircleLabel } }),\n Skeleton: Skeleton.extend({ classNames: { root: classes.skeleton } }),\n EmptyState: EmptyState.extend({\n classNames: { root: classes.emptyState, indicator: classes.emptyIndicator, title: classes.emptyTitle, description: classes.emptyDescription },\n }),\n};\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 {\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 type MantineThemeComponents,\n} from '@mantine/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: MantineThemeComponents = {\n ...inputDefaults,\n Input: Input.extend({\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: InputWrapper.extend({\n classNames: { label: classes.label, description: classes.description },\n }),\n /** Seta e opções do menu nativo legíveis no tema escuro. */\n NativeSelect: NativeSelect.extend({\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: Checkbox.extend({ defaultProps: { radius: 'xs' }, classNames: { input: classes.checkInput } }),\n CheckboxIndicator: CheckboxIndicator.extend({ defaultProps: { radius: 'xs' }, classNames: { indicator: classes.checkInput } }),\n CheckboxCard: CheckboxCard.extend({ defaultProps: { radius: 'md' }, classNames: { card: classes.selectCard } }),\n Radio: Radio.extend({ classNames: { radio: classes.checkInput } }),\n RadioIndicator: RadioIndicator.extend({ classNames: { indicator: classes.checkInput } }),\n RadioCard: RadioCard.extend({ defaultProps: { radius: 'md' }, classNames: { card: classes.selectCard } }),\n Switch: Switch.extend({ 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: Chip.extend({\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: SegmentedControl.extend({\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: Fieldset.extend({\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: PinInput.extend({\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: Slider.extend({ classNames: sliderClassNames }),\n RangeSlider: RangeSlider.extend({ classNames: sliderClassNames }),\n AngleSlider: AngleSlider.extend({ 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: Rating.extend({\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: ColorPicker.extend({\n classNames: { ...colorSliderClassNames, saturation: classes.colorSaturation, swatch: classes.colorSwatch },\n }),\n AlphaSlider: AlphaSlider.extend({ classNames: colorSliderClassNames }),\n HueSlider: HueSlider.extend({ classNames: colorSliderClassNames }),\n};\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 { AppShell, Container, Splitter, type MantineThemeComponents } from '@mantine/core';\nimport classes from './layout.module.css';\n\nexport const layoutComponents: MantineThemeComponents = {\n AppShell: AppShell.extend({\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: Container.extend({ 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: Splitter.extend({\n classNames: { root: classes.splitter, handle: classes.splitterHandle, thumb: classes.splitterThumb },\n }),\n};\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 { Divider, Paper, ScrollArea, type MantineThemeComponents } from '@mantine/core';\nimport classes from './misc.module.css';\n\nexport const miscComponents: MantineThemeComponents = {\n Paper: Paper.extend({ defaultProps: { radius: 'md' }, classNames: { root: classes.paper } }),\n Divider: Divider.extend({ 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: ScrollArea.extend({ classNames: { scrollbar: classes.scrollbar, thumb: classes.scrollThumb } }),\n};\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 { Anchor, Burger, NavLink, Pagination, Stepper, TableOfContents, Tabs, Tree, type MantineThemeComponents } from '@mantine/core';\nimport classes from './navigation.module.css';\n\nexport const navigationComponents: MantineThemeComponents = {\n Tabs: Tabs.extend({ classNames: { root: classes.tabs, tab: classes.tab } }),\n Anchor: Anchor.extend({ classNames: { root: classes.anchor } }),\n Burger: Burger.extend({ 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: NavLink.extend({ defaultProps: { variant: 'light' }, classNames: { root: classes.navLink } }),\n Pagination: Pagination.extend({ defaultProps: { radius: 'sm' }, classNames: { control: classes.paginationControl } }),\n Stepper: Stepper.extend({\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: TableOfContents.extend({ classNames: { control: classes.tocControl } }),\n Tree: Tree.extend({ classNames: { root: classes.tree, label: classes.treeLabel } }),\n};\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 {\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 type MantineThemeComponents,\n} from '@mantine/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: MantineThemeComponents = {\n Menu: Menu.extend({ defaultProps: { shadow: 'md', radius: 'sm' }, classNames: menuClassNames }),\n Menubar: Menubar.extend({ classNames: { root: classes.menubarRoot, target: classes.menubarTarget } }),\n Popover: Popover.extend({ defaultProps: { shadow: 'md', radius: 'sm' }, classNames: { dropdown: classes.dropdown } }),\n HoverCard: HoverCard.extend({ defaultProps: { shadow: 'md', radius: 'md' }, classNames: { dropdown: classes.dropdown } }),\n Tooltip: Tooltip.extend({ defaultProps: { radius: 'sm', withArrow: true }, classNames: { tooltip: classes.tooltip } }),\n Modal: Modal.extend({\n defaultProps: { radius: 'md', centered: true, shadow: 'lg', overlayProps },\n classNames: { content: classes.modalContent, header: classes.modalHeader, title: classes.modalTitle },\n }),\n Drawer: Drawer.extend({\n defaultProps: { shadow: 'lg', overlayProps },\n classNames: { content: classes.modalContent, header: classes.modalHeader, title: classes.modalTitle },\n }),\n Dialog: Dialog.extend({ defaultProps: { radius: 'md', shadow: 'lg' }, classNames: { root: classes.floatingSurface } }),\n ActionBar: ActionBar.extend({\n defaultProps: { radius: 'md', shadow: 'lg' },\n classNames: { root: classes.floatingSurface, divider: classes.actionBarDivider },\n }),\n FloatingWindow: FloatingWindow.extend({ 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: Overlay.extend({ defaultProps: { color: brand.obsidian } }),\n LoadingOverlay: LoadingOverlay.extend({ defaultProps: { overlayProps: { backgroundOpacity: 0.75, blur: 1 } } }),\n};\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 {\n Blockquote,\n Code,\n List,\n Mark,\n Table,\n Title,\n Typography,\n getThemeColor,\n type MantineThemeComponents,\n} from '@mantine/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: MantineThemeComponents = {\n Blockquote: Blockquote.extend({\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: Code.extend({ classNames: { root: classes.code } }),\n List: List.extend({ 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: Mark.extend({\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: Table.extend({\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: Title.extend({ classNames: { root: classes.title } }),\n Typography: Typography.extend({ classNames: { root: classes.typography } }),\n};\n","import type { MantineThemeComponents } from '@mantine/core';\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: MantineThemeComponents = {\n ...layoutComponents,\n ...inputsComponents,\n ...comboboxComponents,\n ...buttonsComponents,\n ...navigationComponents,\n ...feedbackComponents,\n ...overlaysComponents,\n ...dataDisplayComponents,\n ...typographyComponents,\n ...miscComponents,\n};\n","import { createTheme } from '@mantine/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\nexport const jcTheme = createTheme({\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/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 { MantineProvider, mergeThemeOverrides, type MantineProviderProps, type MantineThemeOverride } from '@mantine/core';\nimport { jcCssVariablesResolver } from '../theme/cssVariablesResolver';\nimport { jcTheme } from '../theme/theme';\n\nexport interface JcProviderProps extends Omit<MantineProviderProps, 'theme'> {\n /** Overrides adicionais, mesclados sobre o tema JC Decor */\n theme?: MantineThemeOverride;\n}\n\n/**\n * Provider do Design System JC Decor: MantineProvider + tema + variáveis `--ds-*`.\n *\n * ```tsx\n * import '@mantine/core/styles.css';\n * import '@jcdecor/ui/styles.css';\n * <JcProvider><App /></JcProvider>\n * ```\n */\nexport function JcProvider({ theme, defaultColorScheme = 'light', cssVariablesResolver, children, ...others }: JcProviderProps) {\n const merged = theme ? mergeThemeOverrides(jcTheme, theme) : jcTheme;\n return (\n <MantineProvider\n theme={merged}\n defaultColorScheme={defaultColorScheme}\n cssVariablesResolver={cssVariablesResolver ?? jcCssVariablesResolver}\n {...others}\n >\n {children}\n </MantineProvider>\n );\n}\nJcProvider.displayName = '@jcdecor/ui/JcProvider';\n","import { Badge, type BadgeProps } from '@mantine/core';\nimport {\n IconAlertTriangle,\n IconCheck,\n IconInfoCircle,\n IconX,\n} from '@tabler/icons-react';\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, React.ComponentType<{ size?: number; stroke?: number }> | 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 (✓ ⚠ ✕ ⓘ). Passe um nó em `leftSection` para usar outro. */\n withIcon?: boolean;\n /** `light` = selo suave (padrão) · `filled` = cor sólida · `outline` · `dot` */\n variant?: 'light' | 'filled' | 'outline' | 'dot';\n children?: React.ReactNode;\n}\n\n/** Selo / tag de status — preset de Badge com os tons do ds.css. */\nexport function Tag({ tone = 'primary', withIcon = false, variant = 'light', leftSection, ...others }: TagProps) {\n const Icon = toneIcon[tone];\n return (\n <Badge\n color={toneColor[tone]}\n variant={variant}\n leftSection={leftSection ?? (withIcon && Icon ? <Icon size={12} stroke={2.5} /> : undefined)}\n data-tone={tone}\n {...others}\n />\n );\n}\n\nTag.displayName = '@jcdecor/ui/Tag';\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","import { useState } from 'react';\nimport {\n Box,\n CloseButton,\n createVarsResolver,\n factory,\n getRadius,\n useProps,\n useStyles,\n type BoxProps,\n type ElementProps,\n type Factory,\n type MantineRadius,\n type StylesApiProps,\n} from '@mantine/core';\nimport classes from './PromoBanner.module.css';\n\nexport type PromoBannerStylesNames = 'root' | 'content' | 'highlight' | 'close';\nexport type PromoBannerCssVariables = {\n root: '--banner-bg' | '--banner-color' | '--banner-highlight' | '--banner-radius';\n};\n\nexport interface PromoBannerProps extends BoxProps, StylesApiProps<PromoBannerFactory>, ElementProps<'div'> {\n /** `horizon` = azul com destaque Electric · `electric` = amarelo com destaque Horizon · `obsidian` @default 'horizon' */\n variant?: 'horizon' | 'electric' | 'obsidian';\n /** Trecho destacado ao final (ex.: cupom). Também é possível usar `<strong>` dentro de children. */\n highlight?: React.ReactNode;\n /** Ícone/elemento à esquerda do texto */\n icon?: React.ReactNode;\n /** Exibe botão de fechar; o banner some e chama `onClose` */\n withCloseButton?: boolean;\n /** Controle externo da visibilidade (opcional) */\n opened?: boolean;\n onClose?: () => void;\n /** Arredonda os cantos (por padrão o banner é full-bleed, sem raio) */\n radius?: MantineRadius;\n}\n\nexport type PromoBannerFactory = Factory<{\n props: PromoBannerProps;\n ref: HTMLDivElement;\n stylesNames: PromoBannerStylesNames;\n vars: PromoBannerCssVariables;\n variant: 'horizon' | 'electric' | 'obsidian';\n}>;\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\nconst varsResolver = createVarsResolver<PromoBannerFactory>((_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\n/** Banner promocional (topo do site / campanhas). */\nexport const PromoBanner = factory<PromoBannerFactory>((_props) => {\n const props = useProps('PromoBanner', { variant: 'horizon' }, _props);\n const {\n classNames, className, style, styles, unstyled, vars, attributes,\n variant, highlight, icon, withCloseButton, opened, onClose, radius, children, ...others\n } = props;\n const [internalOpen, setOpen] = useState(true);\n const open = opened ?? internalOpen;\n\n const getStyles = useStyles<PromoBannerFactory>({\n name: 'PromoBanner',\n classes,\n props,\n className,\n style,\n classNames,\n styles,\n unstyled,\n attributes,\n vars,\n varsResolver,\n });\n\n if (!open) return null;\n\n return (\n <Box role=\"note\" {...getStyles('root')} variant={variant} mod={{ radius: radius !== undefined, closable: withCloseButton }} {...others}>\n <span {...getStyles('content')}>\n {icon}\n <span>{children}</span>\n {highlight && <strong {...getStyles('highlight')}>{highlight}</strong>}\n </span>\n {withCloseButton && (\n <CloseButton\n aria-label=\"Fechar\"\n size=\"sm\"\n variant=\"transparent\"\n {...getStyles('close')}\n onClick={() => {\n setOpen(false);\n onClose?.();\n }}\n />\n )}\n </Box>\n );\n});\n\nPromoBanner.classes = classes;\nPromoBanner.varsResolver = varsResolver;\nPromoBanner.displayName = '@jcdecor/ui/PromoBanner';\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","import {\n Card,\n factory,\n useProps,\n useStyles,\n type CardProps,\n type Factory,\n type StylesApiProps,\n} from '@mantine/core';\nimport { Kicker } from '../Typography';\nimport classes from './ContentCard.module.css';\n\nexport type ContentCardStylesNames = 'root' | 'image' | 'kicker' | 'title' | 'body' | 'actions';\n\nexport interface ContentCardProps extends Omit<CardProps, 'classNames' | 'styles' | 'vars' | 'attributes' | 'title'>, StylesApiProps<ContentCardFactory> {\n /** Sobretítulo em caixa-alta */\n kicker?: React.ReactNode;\n title?: React.ReactNode;\n /** Imagem de capa (URL) ou nó customizado */\n image?: string | React.ReactNode;\n imageAlt?: string;\n imageHeight?: number;\n /** Botões/links no rodapé do card */\n actions?: React.ReactNode;\n children?: React.ReactNode;\n}\n\nexport type ContentCardFactory = Factory<{\n props: ContentCardProps;\n ref: HTMLDivElement;\n stylesNames: ContentCardStylesNames;\n}>;\n\n/** Card de conteúdo: superfície branca sobre LightGray, borda suave e sombra pequena (ds-card). */\nexport const ContentCard = factory<ContentCardFactory>((_props) => {\n const props = useProps('ContentCard', { imageHeight: 180 }, _props);\n const {\n classNames, className, style, styles, unstyled, vars, attributes,\n kicker, title, image, imageAlt, imageHeight, actions, children, ...others\n } = props;\n\n const getStyles = useStyles<ContentCardFactory>({\n name: 'ContentCard',\n classes,\n props,\n className,\n style,\n classNames,\n styles,\n unstyled,\n attributes,\n vars,\n });\n\n return (\n <Card {...getStyles('root')} {...others}>\n {image && (\n <div {...getStyles('image')}>\n {typeof image === 'string' ? <img src={image} alt={imageAlt ?? ''} style={{ height: imageHeight }} /> : image}\n </div>\n )}\n {kicker && <Kicker {...getStyles('kicker')}>{kicker}</Kicker>}\n {title && <div {...getStyles('title')}>{title}</div>}\n {children && <div {...getStyles('body')}>{children}</div>}\n {actions && <div {...getStyles('actions')}>{actions}</div>}\n </Card>\n );\n});\n\nContentCard.classes = classes;\nContentCard.displayName = '@jcdecor/ui/ContentCard';\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","import {\n Box,\n SimpleGrid,\n Skeleton,\n createVarsResolver,\n factory,\n useProps,\n useStyles,\n type BoxProps,\n type ElementProps,\n type Factory,\n type SimpleGridProps,\n type StylesApiProps,\n} from '@mantine/core';\nimport { IconArrowDownRight, IconArrowUpRight, IconMinus } from '@tabler/icons-react';\nimport { formatNumber, formatPercent } from '../../utils/format';\nimport classes from './KpiCard.module.css';\n\nexport type KpiCardStylesNames = 'root' | 'header' | 'label' | 'icon' | 'value' | 'footer' | 'delta' | 'chart';\nexport type KpiCardCssVariables = { root: '--kpi-delta-color' | '--kpi-value-color' };\n\nexport interface KpiCardProps extends BoxProps, StylesApiProps<KpiCardFactory>, Omit<ElementProps<'div'>, 'title'> {\n /** Rótulo em caixa-alta (ex.: \"Acessos (60d)\") */\n label: React.ReactNode;\n /** Valor principal. Números são formatados em pt-BR. */\n value: React.ReactNode;\n /** Variação em pontos percentuais (ex.: -5.6). Cor e seta automáticas. */\n delta?: number;\n /** Texto ao lado da variação (ex.: \"vs. mês anterior\") */\n deltaLabel?: React.ReactNode;\n /** Quando queda é algo bom (ex.: taxa de rejeição), inverte as cores. */\n invertDelta?: boolean;\n /** Pinta o próprio valor com a cor da variação (como o KPI \"-5,6%\" do DS) */\n colorValue?: boolean;\n icon?: React.ReactNode;\n /** Slot para um Sparkline ou mini-gráfico */\n chart?: React.ReactNode;\n loading?: boolean;\n}\n\nexport type KpiCardFactory = Factory<{\n props: KpiCardProps;\n ref: HTMLDivElement;\n stylesNames: KpiCardStylesNames;\n vars: KpiCardCssVariables;\n}>;\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\nconst varsResolver = createVarsResolver<KpiCardFactory>((_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\n/** Tile de KPI dos dashboards (ds-kpi). */\nexport const KpiCard = factory<KpiCardFactory>((_props) => {\n const props = useProps('KpiCard', {}, _props);\n const {\n classNames, className, style, styles, unstyled, vars, attributes,\n label, value, delta, deltaLabel, invertDelta, colorValue, icon, chart, loading, ...others\n } = props;\n\n const getStyles = useStyles<KpiCardFactory>({\n name: 'KpiCard',\n classes,\n props,\n className,\n style,\n classNames,\n styles,\n unstyled,\n attributes,\n vars,\n varsResolver,\n });\n\n const tone = getDeltaTone(delta, invertDelta);\n const ArrowIcon = delta === undefined || delta === 0 ? IconMinus : delta > 0 ? IconArrowUpRight : IconArrowDownRight;\n\n return (\n <Box {...getStyles('root')} {...others}>\n <div {...getStyles('header')}>\n <span {...getStyles('label')}>{label}</span>\n {icon && <span {...getStyles('icon')}>{icon}</span>}\n </div>\n {loading ? (\n <Skeleton height={32} width=\"60%\" mt={4} />\n ) : (\n <div {...getStyles('value')}>{typeof value === 'number' ? formatNumber(value) : value}</div>\n )}\n {(delta !== undefined || deltaLabel) && !loading && (\n <div {...getStyles('footer')}>\n {delta !== undefined && (\n <span {...getStyles('delta')} data-tone={tone}>\n <ArrowIcon size={14} stroke={2.5} />\n {formatPercent(delta, { signed: true })}\n </span>\n )}\n {deltaLabel && <span>{deltaLabel}</span>}\n </div>\n )}\n {chart && <div {...getStyles('chart')}>{chart}</div>}\n </Box>\n );\n});\n\nKpiCard.classes = classes;\nKpiCard.varsResolver = varsResolver;\nKpiCard.displayName = '@jcdecor/ui/KpiCard';\n\nexport interface KpiGroupProps extends SimpleGridProps {\n children?: React.ReactNode;\n}\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 function KpiGroup({ cols = { base: 1, '440px': 2, '880px': 4 }, spacing = 'md', type = 'container', ...others }: KpiGroupProps) {\n return <SimpleGrid type={type} cols={cols} spacing={spacing} {...others} />;\n}\nKpiGroup.displayName = '@jcdecor/ui/KpiGroup';\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","import {\n Box,\n Burger,\n Collapse,\n factory,\n useProps,\n useStyles,\n type BoxProps,\n type ElementProps,\n type Factory,\n type StylesApiProps,\n} from '@mantine/core';\nimport { useDisclosure } from '@mantine/hooks';\nimport { JcLogo } from '../../brand/Brand';\nimport classes from './TopNav.module.css';\n\nexport type TopNavStylesNames = 'root' | 'brand' | 'links' | 'link' | 'right' | 'burger' | 'mobileLinks';\n\nexport interface TopNavLink {\n label: React.ReactNode;\n href?: string;\n active?: boolean;\n onClick?: (event: React.MouseEvent) => void;\n}\n\nexport interface TopNavProps extends BoxProps, StylesApiProps<TopNavFactory>, ElementProps<'div'> {\n /** Marca à esquerda @default <JcLogo variant=\"dark\" /> (a barra é navy em ambos os temas) */\n brand?: React.ReactNode;\n /** Link da marca; `null` renderiza a marca como texto @default '/' */\n brandHref?: string | null;\n links?: TopNavLink[];\n /** Componente usado nos links (ex.: `Link` do react-router, recebe `to`/`href`) @default 'a' */\n linkComponent?: React.ElementType;\n /** Conteúdo à direita (ex.: ThemeToggle, avatar) */\n rightSection?: React.ReactNode;\n /** Esconde os links em telas pequenas e mostra um hambúrguer @default true */\n collapseOnMobile?: boolean;\n}\n\nexport type TopNavFactory = Factory<{\n props: TopNavProps;\n ref: HTMLDivElement;\n stylesNames: TopNavStylesNames;\n}>;\n\n/** Barra de navegação Obsidian dos painéis (ds-nav). */\nexport const TopNav = factory<TopNavFactory>((_props) => {\n const props = useProps('TopNav', { brand: <JcLogo variant=\"dark\" size={28} />, brandHref: '/', links: [], linkComponent: 'a', collapseOnMobile: true }, _props);\n const {\n classNames, className, style, styles, unstyled, vars, attributes,\n brand, brandHref, links, linkComponent: LinkComponent = 'a', rightSection, collapseOnMobile, ...others\n } = props;\n const [opened, { toggle, close }] = useDisclosure(false);\n\n const getStyles = useStyles<TopNavFactory>({\n name: 'TopNav',\n classes,\n props,\n className,\n style,\n classNames,\n styles,\n unstyled,\n attributes,\n vars,\n });\n\n const renderLinks = (onNavigate?: () => void) =>\n links!.map((link, index) => {\n const isButton = !link.href;\n const Component: React.ElementType = isButton ? 'button' : LinkComponent;\n const linkProps = isButton ? { type: 'button' } : LinkComponent === 'a' ? { href: link.href } : { to: link.href, href: link.href };\n return (\n <Component\n key={index}\n {...linkProps}\n {...getStyles('link')}\n data-active={link.active || undefined}\n aria-current={link.active ? 'page' : undefined}\n onClick={(event: React.MouseEvent) => {\n link.onClick?.(event);\n onNavigate?.();\n }}\n >\n {link.label}\n </Component>\n );\n });\n\n const BrandComponent: React.ElementType = brandHref === null ? 'span' : LinkComponent;\n const brandProps = brandHref === null ? {} : LinkComponent === 'a' ? { href: brandHref } : { to: brandHref, href: brandHref };\n\n return (\n <header>\n <Box {...getStyles('root')} mod={{ collapse: collapseOnMobile }} {...others}>\n <BrandComponent {...brandProps} {...getStyles('brand')}>\n {brand}\n </BrandComponent>\n <nav {...getStyles('links')} aria-label=\"Principal\">\n {renderLinks()}\n </nav>\n <div {...getStyles('right')}>\n {rightSection}\n {collapseOnMobile && links!.length > 0 && (\n <Burger opened={opened} onClick={toggle} size=\"sm\" aria-label=\"Abrir menu\" {...getStyles('burger')} />\n )}\n </div>\n </Box>\n {collapseOnMobile && links!.length > 0 && (\n <Collapse expanded={opened}>\n <nav {...getStyles('mobileLinks')} aria-label=\"Principal (mobile)\">\n {renderLinks(close)}\n </nav>\n </Collapse>\n )}\n </header>\n );\n});\n\nTopNav.classes = classes;\nTopNav.displayName = '@jcdecor/ui/TopNav';\n","import { Anchor, Box, Breadcrumbs, Group, type BoxProps } from '@mantine/core';\nimport { Kicker, Headline, Subheadline } from '../Typography';\n\nexport interface PageHeaderBreadcrumb {\n label: React.ReactNode;\n href?: string;\n}\n\nexport interface PageHeaderProps extends BoxProps, Omit<React.ComponentProps<'div'>, keyof BoxProps | 'title'> {\n kicker?: React.ReactNode;\n title: React.ReactNode;\n description?: React.ReactNode;\n /** Botões à direita do título */\n actions?: React.ReactNode;\n breadcrumbs?: PageHeaderBreadcrumb[];\n /** Componente dos links do breadcrumb (ex.: Link do react-router) @default 'a' */\n linkComponent?: React.ElementType;\n /** `display` usa display-small (página principal); `headline` usa headline-large @default 'headline' */\n size?: 'display' | 'headline';\n}\n\n/** Cabeçalho de página: breadcrumbs, kicker, título, descrição e ações. */\nexport function PageHeader({\n kicker,\n title,\n description,\n actions,\n breadcrumbs,\n linkComponent = 'a',\n size = 'headline',\n ...others\n}: PageHeaderProps) {\n return (\n <Box mb=\"xl\" {...others}>\n {breadcrumbs && breadcrumbs.length > 0 && (\n <Breadcrumbs mb=\"sm\" fz=\"sm\" separatorMargin={6}>\n {breadcrumbs.map((crumb, index) =>\n crumb.href ? (\n <Anchor key={index} component={linkComponent as 'a'} href={crumb.href} {...(linkComponent !== 'a' && { to: crumb.href })} fz=\"sm\">\n {crumb.label}\n </Anchor>\n ) : (\n <Box key={index} component=\"span\" c=\"var(--ds-text-3)\" fz=\"sm\">\n {crumb.label}\n </Box>\n ),\n )}\n </Breadcrumbs>\n )}\n <Group justify=\"space-between\" align=\"flex-end\" gap=\"md\" wrap=\"wrap\">\n <div style={{ flex: '1 1 320px', minWidth: 0 }}>\n {kicker && <Kicker>{kicker}</Kicker>}\n {size === 'display' ? (\n <Headline component=\"h1\" size=\"lg\" fz=\"var(--type-display-sm)\" lh={1.15} mt={8}>\n {title}\n </Headline>\n ) : (\n <Headline component=\"h1\" size=\"lg\" mt={kicker ? 8 : 0}>\n {title}\n </Headline>\n )}\n {description && (\n <Subheadline component=\"div\" size=\"lg\" c=\"var(--ds-text-2)\" maw={640} mt={8}>\n {description}\n </Subheadline>\n )}\n </div>\n {actions && <Group gap=\"sm\">{actions}</Group>}\n </Group>\n </Box>\n );\n}\nPageHeader.displayName = '@jcdecor/ui/PageHeader';\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 { useMemo, useState } from 'react';\nimport { Box, EmptyState, Pagination, ScrollArea, Skeleton, Table, type BoxProps, type TableProps } from '@mantine/core';\nimport { IconArrowDown, IconArrowUp, IconArrowsSort, IconDatabaseOff } from '@tabler/icons-react';\nimport { formatNumber } from '../../utils/format';\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 header: React.ReactNode;\n /** Renderização customizada da célula */\n render?: (row: T, index: number) => React.ReactNode;\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\nexport interface DataTableProps<T> extends BoxProps {\n columns: DataTableColumn<T>[];\n data: T[];\n /** Chave única de cada linha @default índice */\n rowKey?: (row: T, index: number) => React.Key;\n initialSort?: DataTableSort<T>;\n /** Controle externo da ordenação */\n sort?: DataTableSort<T> | null;\n onSortChange?: (sort: DataTableSort<T> | null) => void;\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 empty?: React.ReactNode;\n onRowClick?: (row: T, index: number) => void;\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\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/** Tabela de dados com ordenação, colunas numéricas pt-BR, paginação e estados vazio/carregando. */\nexport function DataTable<T extends Record<string, any>>({\n columns,\n data,\n rowKey,\n initialSort,\n sort: controlledSort,\n onSortChange,\n pageSize,\n loading,\n loadingRows = 5,\n empty,\n onRowClick,\n plain,\n striped,\n stickyHeader,\n tableProps,\n ...others\n}: DataTableProps<T>) {\n const [internalSort, setInternalSort] = useState<DataTableSort<T> | null>(initialSort ?? null);\n const sort = controlledSort !== undefined ? controlledSort : internalSort;\n const [page, setPage] = useState(1);\n\n const setSort = (next: DataTableSort<T> | null) => {\n if (controlledSort === undefined) setInternalSort(next);\n onSortChange?.(next);\n setPage(1);\n };\n\n const toggleSort = (key: string) => {\n if (!sort || sort.key !== key) setSort({ key, direction: 'asc' });\n else if (sort.direction === 'asc') setSort({ key, direction: 'desc' });\n else setSort(null);\n };\n\n const sorted = useMemo(() => {\n if (!sort) return data;\n const column = columns.find((c) => columnId(c) === sort.key);\n const getValue = column?.sortValue ?? ((row: T) => (column?.key ? row[column.key] : undefined));\n const result = [...data].sort((a, b) => compare(getValue(a), getValue(b)));\n return sort.direction === 'desc' ? result.reverse() : result;\n }, [data, sort, columns]);\n\n const totalPages = pageSize ? Math.max(1, Math.ceil(sorted.length / pageSize)) : 1;\n const currentPage = Math.min(page, totalPages);\n const visible = pageSize ? sorted.slice((currentPage - 1) * pageSize, currentPage * pageSize) : sorted;\n\n const header = (\n <Table.Thead>\n <Table.Tr>\n {columns.map((column) => {\n const id = columnId(column);\n const isSorted = sort?.key === id;\n const SortIcon = !isSorted ? IconArrowsSort : sort!.direction === 'asc' ? IconArrowUp : IconArrowDown;\n return (\n <Table.Th\n key={id}\n className={column.numeric ? classes.num : undefined}\n style={{ width: column.width }}\n aria-sort={isSorted ? (sort!.direction === 'asc' ? 'ascending' : 'descending') : undefined}\n >\n {column.sortable ? (\n <button type=\"button\" className={classes.sortButton} data-sorted={isSorted || undefined} onClick={() => toggleSort(id)}>\n {column.header}\n <SortIcon size={12} stroke={2.5} opacity={isSorted ? 1 : 0.5} />\n </button>\n ) : (\n column.header\n )}\n </Table.Th>\n );\n })}\n </Table.Tr>\n </Table.Thead>\n );\n\n let body: React.ReactNode;\n if (loading) {\n body = Array.from({ length: loadingRows }, (_, i) => (\n <Table.Tr key={i}>\n {columns.map((column) => (\n <Table.Td key={columnId(column)}>\n <Skeleton height={14} width={column.numeric ? '50%' : '80%'} ml={column.numeric ? 'auto' : 0} />\n </Table.Td>\n ))}\n </Table.Tr>\n ));\n } else if (visible.length === 0) {\n body = (\n <Table.Tr>\n <Table.Td colSpan={columns.length}>\n {empty ?? (\n <EmptyState\n py=\"xl\"\n size=\"sm\"\n icon={<IconDatabaseOff size={22} />}\n title=\"Nenhum resultado\"\n description=\"Não há dados para exibir com os filtros atuais.\"\n />\n )}\n </Table.Td>\n </Table.Tr>\n );\n } else {\n body = visible.map((row, index) => (\n <Table.Tr\n key={rowKey ? rowKey(row, index) : index}\n className={classes.row}\n data-clickable={onRowClick ? true : undefined}\n onClick={onRowClick ? () => onRowClick(row, index) : undefined}\n tabIndex={onRowClick ? 0 : undefined}\n onKeyDown={\n onRowClick\n ? (event) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n onRowClick(row, index);\n }\n }\n : undefined\n }\n >\n {columns.map((column) => {\n const raw = column.key ? row[column.key] : undefined;\n const content = column.render\n ? column.render(row, index)\n : column.numeric && typeof raw === 'number'\n ? formatNumber(raw, column.format)\n : (raw as React.ReactNode);\n return (\n <Table.Td key={columnId(column)} className={column.numeric ? classes.num : undefined}>\n {content}\n </Table.Td>\n );\n })}\n </Table.Tr>\n ));\n }\n\n return (\n <Box className={classes.wrapper} data-plain={plain || undefined} {...others}>\n <ScrollArea type=\"auto\">\n <Table striped={striped} stickyHeader={stickyHeader} {...tableProps}>\n {header}\n <Table.Tbody>{body}</Table.Tbody>\n </Table>\n </ScrollArea>\n {pageSize && sorted.length > pageSize && (\n <div className={classes.footer}>\n <span>\n {formatNumber((currentPage - 1) * pageSize + 1)}–{formatNumber(Math.min(currentPage * pageSize, sorted.length))} de{' '}\n {formatNumber(sorted.length)}\n </span>\n <Pagination size=\"sm\" total={totalPages} value={currentPage} onChange={setPage} />\n </div>\n )}\n </Box>\n );\n}\nDataTable.displayName = '@jcdecor/ui/DataTable';\n","import { ActionIcon, Button, useComputedColorScheme, useMantineColorScheme, type ActionIconProps } from '@mantine/core';\nimport { IconMoon, IconSun } from '@tabler/icons-react';\n\nexport interface ThemeToggleProps extends Omit<ActionIconProps, 'children'> {\n /** `icon` = ActionIcon · `button` = botão \"Alternar tema\" (como no DS) @default 'icon' */\n as?: 'icon' | 'button';\n label?: string;\n}\n\n/** Alterna entre tema claro e escuro (persistido pelo colorSchemeManager do Mantine). */\nexport function ThemeToggle({ as = 'icon', label = 'Alternar tema', variant, color, size, ...others }: ThemeToggleProps) {\n const { setColorScheme } = useMantineColorScheme();\n const computed = useComputedColorScheme('light', { getInitialValueInEffect: true });\n const toggle = () => setColorScheme(computed === 'dark' ? 'light' : 'dark');\n const Icon = computed === 'dark' ? IconSun : IconMoon;\n\n if (as === 'button') {\n return (\n <Button\n variant={variant ?? 'outline'}\n color={color}\n size={(size as string) ?? 'sm'}\n leftSection={<Icon size={16} />}\n onClick={toggle}\n {...(others as Record<string, unknown>)}\n >\n {label}\n </Button>\n );\n }\n\n return (\n <ActionIcon variant={variant ?? 'subtle'} color={color} size={size ?? 'lg'} onClick={toggle} aria-label={label} title={label} {...others}>\n <Icon size={18} />\n </ActionIcon>\n );\n}\nThemeToggle.displayName = '@jcdecor/ui/ThemeToggle';\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 { Tooltip, luminance } from '@mantine/core';\nimport { useClipboard } from '@mantine/hooks';\nimport classes from './TokenSwatch.module.css';\n\nexport interface TokenSwatchProps extends Omit<React.ComponentProps<'button'>, '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 function TokenSwatch({ name, value, cssVar, copy = 'value', className, ...others }: TokenSwatchProps) {\n const clipboard = useClipboard({ timeout: 1200 });\n const text = copy === 'cssVar' && cssVar ? `var(${cssVar})` : value;\n return (\n <Tooltip label={clipboard.copied ? 'Copiado!' : `Copiar ${text}`} withArrow>\n <button type=\"button\" className={className ? `${classes.swatch} ${className}` : classes.swatch} onClick={() => clipboard.copy(text)} {...others}>\n <div className={classes.color} style={{ background: value }} />\n <div className={classes.info}>\n <div className={classes.name}>{name}</div>\n <div className={classes.hex}>{value}</div>\n {cssVar && <div className={classes.hex}>{cssVar}</div>}\n </div>\n </button>\n </Tooltip>\n );\n}\nTokenSwatch.displayName = '@jcdecor/ui/TokenSwatch';\n\nexport interface ColorRampProps extends React.ComponentProps<'div'> {\n steps: { label: string; value: string; derived?: boolean }[];\n}\n\n/** Rampa de cor horizontal (base → 50). Clique copia o hex. */\nexport function ColorRamp({ steps, className, ...others }: ColorRampProps) {\n const clipboard = useClipboard({ timeout: 1200 });\n return (\n <div className={className ? `${classes.ramp} ${className}` : classes.ramp} {...others}>\n {steps.map((step) => (\n <Tooltip key={step.label} label={clipboard.copied ? 'Copiado!' : step.value} withArrow>\n <button\n type=\"button\"\n className={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}\n {step.derived ? '*' : ''}\n </button>\n </Tooltip>\n ))}\n </div>\n );\n}\nColorRamp.displayName = '@jcdecor/ui/ColorRamp';\n","import { Box, Group, Text, type BoxProps } from '@mantine/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 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 function PriceTag({ value, oldValue, installments, pixDiscount, unit, size = 'md', ...others }: PriceTagProps) {\n return (\n <Box {...others}>\n {oldValue !== undefined && oldValue > value && (\n <Text fz=\"xs\" c=\"var(--ds-text-3)\" td=\"line-through\" aria-label={`Preço anterior ${formatCurrency(oldValue)}`}>\n {formatCurrency(oldValue)}\n </Text>\n )}\n <Group gap={4} align=\"baseline\" wrap=\"nowrap\">\n <Text component=\"span\" fz={valueSize[size]} fw={700} lh={1.2} c=\"var(--ds-primary)\" style={{ fontVariantNumeric: 'tabular-nums' }}>\n {formatCurrency(value)}\n </Text>\n {unit && (\n <Text component=\"span\" fz=\"xs\" c=\"var(--ds-text-3)\" fw={500}>\n {unit}\n </Text>\n )}\n </Group>\n {pixDiscount !== undefined && pixDiscount > 0 && (\n <Text fz=\"xs\" fw={600} c=\"var(--ds-tag-success-color)\">\n {formatCurrency(value * (1 - pixDiscount / 100))} no Pix ({pixDiscount}% off)\n </Text>\n )}\n {installments && installments.count > 1 && (\n <Text fz=\"xs\" c=\"var(--ds-text-2)\">\n ou {installments.count}x de {formatCurrency(value / installments.count)}\n {installments.interestFree !== false ? ' sem juros' : ''}\n </Text>\n )}\n </Box>\n );\n}\nPriceTag.displayName = '@jcdecor/ui/PriceTag';\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","import {\n ActionIcon,\n Button,\n Card,\n Group,\n Rating,\n Text,\n factory,\n useProps,\n useStyles,\n type CardProps,\n type Factory,\n type StylesApiProps,\n} from '@mantine/core';\nimport { Fragment } from 'react';\nimport { IconHeart, IconHeartFilled, IconShoppingCart } from '@tabler/icons-react';\nimport { PriceTag, type PriceTagProps } from '../PriceTag';\nimport { Tag } from '../Tag';\nimport classes from './ProductCard.module.css';\n\nexport type ProductCardStylesNames = 'root' | 'media' | 'badges' | 'favorite' | 'category' | 'name' | 'price' | 'action';\n\nexport interface ProductCardProps\n extends Omit<CardProps, 'classNames' | 'styles' | 'vars' | 'attributes'>,\n StylesApiProps<ProductCardFactory> {\n name: string;\n image: string;\n href?: string;\n category?: string;\n price: number;\n oldPrice?: number;\n installments?: PriceTagProps['installments'];\n pixDiscount?: number;\n unit?: string;\n /** Selos extras (ex.: \"Novo\", \"Frete grátis\") */\n badges?: React.ReactNode[];\n /** Mostra selo \"-X%\" calculado a partir de oldPrice @default true */\n showDiscount?: boolean;\n rating?: number;\n reviews?: number;\n favorite?: boolean;\n onFavoriteChange?: (favorite: boolean) => void;\n actionLabel?: string;\n onAction?: () => void;\n /** Proporção da imagem (largura/altura) @default 1 */\n imageRatio?: number;\n /** Componente do link (ex.: Link do react-router) @default 'a' */\n linkComponent?: React.ElementType;\n}\n\nexport type ProductCardFactory = Factory<{\n props: ProductCardProps;\n ref: HTMLDivElement;\n stylesNames: ProductCardStylesNames;\n}>;\n\n/** Card de produto do e-commerce: imagem, selos, nome, avaliação, preço e CTA. */\nexport const ProductCard = factory<ProductCardFactory>((_props) => {\n const props = useProps('ProductCard', { showDiscount: true, actionLabel: 'Comprar', imageRatio: 1, linkComponent: 'a' }, _props);\n const {\n classNames, className, style, styles, unstyled, vars, attributes,\n name, image, href, category, price, oldPrice, installments, pixDiscount, unit, badges, showDiscount,\n rating, reviews, favorite, onFavoriteChange, actionLabel, onAction, imageRatio, linkComponent: LinkComponent = 'a',\n ...others\n } = props;\n\n const getStyles = useStyles<ProductCardFactory>({\n name: 'ProductCard',\n classes,\n props,\n className,\n style,\n classNames,\n styles,\n unstyled,\n attributes,\n vars,\n });\n\n const discount = oldPrice && oldPrice > price ? Math.round((1 - price / oldPrice) * 100) : 0;\n const linkProps = href ? (LinkComponent === 'a' ? { href } : { to: href, href }) : {};\n const NameComponent: React.ElementType = href ? LinkComponent : 'div';\n\n return (\n <Card {...getStyles('root')} mod={{ interactive: Boolean(href || onAction) }} {...others}>\n <div {...getStyles('media')} style={{ ['--product-ratio' as string]: String(imageRatio) }}>\n <img src={image} alt={name} loading=\"lazy\" />\n <div {...getStyles('badges')}>\n {showDiscount && discount > 0 && (\n <Tag tone=\"error\" variant=\"filled\">\n -{discount}%\n </Tag>\n )}\n {badges?.map((badge, index) => <Fragment key={index}>{badge}</Fragment>)}\n </div>\n {onFavoriteChange && (\n <ActionIcon\n {...getStyles('favorite')}\n variant=\"subtle\"\n color={favorite ? 'danger' : 'obsidian'}\n radius=\"xl\"\n aria-label={favorite ? 'Remover dos favoritos' : 'Adicionar aos favoritos'}\n aria-pressed={favorite}\n onClick={() => onFavoriteChange(!favorite)}\n >\n {favorite ? <IconHeartFilled size={18} /> : <IconHeart size={18} />}\n </ActionIcon>\n )}\n </div>\n {category && <div {...getStyles('category')}>{category}</div>}\n <NameComponent {...linkProps} {...getStyles('name')}>\n {name}\n </NameComponent>\n {rating !== undefined && (\n <Group gap={6} mb=\"xs\">\n <Rating value={rating} fractions={2} readOnly size=\"xs\" color=\"electric.4\" />\n {reviews !== undefined && (\n <Text fz=\"xs\" c=\"var(--ds-text-3)\">\n ({reviews})\n </Text>\n )}\n </Group>\n )}\n <PriceTag\n {...getStyles('price')}\n value={price}\n oldValue={oldPrice}\n installments={installments}\n pixDiscount={pixDiscount}\n unit={unit}\n />\n {onAction && (\n <Button {...getStyles('action')} fullWidth leftSection={<IconShoppingCart size={18} />} onClick={onAction}>\n {actionLabel}\n </Button>\n )}\n </Card>\n );\n});\n\nProductCard.classes = classes;\nProductCard.displayName = '@jcdecor/ui/ProductCard';\n","import { Box, Button, Group, Text, type BoxProps } from '@mantine/core';\nimport { useClipboard } from '@mantine/hooks';\nimport { IconCheck, IconCopy, IconTicket } from '@tabler/icons-react';\n\nexport interface CouponCodeProps extends BoxProps {\n code: string;\n /** Texto do benefício (ex.: \"5% OFF na 1ª compra\") */\n description?: React.ReactNode;\n copyLabel?: string;\n copiedLabel?: string;\n onCopy?: (code: string) => void;\n}\n\n/** Cupom com borda tracejada e botão de copiar. */\nexport function CouponCode({ code, description, copyLabel = 'Copiar', copiedLabel = 'Copiado!', onCopy, ...others }: CouponCodeProps) {\n const clipboard = useClipboard({ timeout: 1600 });\n return (\n <Box\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 {...others}\n >\n <Group justify=\"space-between\" gap=\"sm\" wrap=\"nowrap\">\n <Group gap=\"sm\" wrap=\"nowrap\" style={{ minWidth: 0 }}>\n <IconTicket size={22} color=\"var(--ds-primary)\" style={{ flexShrink: 0 }} />\n <div style={{ minWidth: 0 }}>\n {description && (\n <Text fz=\"xs\" c=\"var(--ds-text-2)\" fw={500}>\n {description}\n </Text>\n )}\n <Text fw={700} fz=\"lg\" lts=\"0.08em\" c=\"var(--ds-primary)\" ff=\"monospace\">\n {code}\n </Text>\n </div>\n </Group>\n <Button\n size=\"sm\"\n variant={clipboard.copied ? 'filled' : 'outline'}\n color={clipboard.copied ? 'evergreen' : undefined}\n leftSection={clipboard.copied ? <IconCheck size={16} /> : <IconCopy size={16} />}\n onClick={() => {\n clipboard.copy(code);\n onCopy?.(code);\n }}\n >\n {clipboard.copied ? copiedLabel : copyLabel}\n </Button>\n </Group>\n </Box>\n );\n}\nCouponCode.displayName = '@jcdecor/ui/CouponCode';\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["t","classes","dropdown","header","footer","classes","classes","classes","label","description","classes","classes","classes","burger","classes","classes","brand","title","classes","typography","brand","typography","toneColor","root","varsResolver","classes","root","kicker","title","body","actions","classes","root","header","icon","footer","classes","root","_Fragment","classes","root","classes","classes","name","classes","Fragment","classes","feedback","spacing","tokens","ramps","chartColors","fontFamily","typography$1","chartPalette","grid","brand$1","jcColors","formatNumber","Disclaimer","Kicker","Subheadline","formatDate","Display","formatCompact","formatPercent","formatCurrency","formatTime","LOCALE","Headline","SpartanHelmet","greekFramePaths","JcLogoAlt","logoPaths","GreekFrame","altLogoPaths","JcLogo","collaboratorPaths","Collaborator","spartanPaths","Fragment$1","LIGHT_FAMILIES","jcVariantColorResolver","input","colorName","theme","parsed","parseThemeColor","family","variant","defaultVariantColorsResolver","base","light","isPrimary","tone","isSize","size","control","overlayProps","buttons_module_default","buttonsComponents","Button","props","c","ActionIcon","CloseButton","combobox_module_default","COMBOBOX_INPUTS","dropdownClassNames","classNamesByComponent","comboboxComponents","name","classNames","Cascader","Pill","dataDisplay_module_default","dataDisplayComponents","Accordion","Avatar","BackgroundImage","Badge","Card","DataList","Image","Indicator","Kbd","NumberFormatter","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","CheckboxIndicator","CheckboxCard","Radio","RadioIndicator","RadioCard","Switch","Chip","SegmentedControl","Fieldset","PinInput","Slider","RangeSlider","AngleSlider","Rating","ColorPicker","AlphaSlider","HueSlider","layout_module_default","layoutComponents","AppShell","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","Tooltip","Modal","Drawer","Dialog","ActionBar","FloatingWindow","Overlay","LoadingOverlay","typography_module_default","YELLOWS","typographyComponents","Blockquote","Code","List","Mark","yellow","color","getThemeColor","Table","Title","Typography","jcComponents","t","jcTheme","createTheme","kebab","s","schemeVars","staticVars","vars","step","hex","value","tagVars","semantic","lightColorVars","chartVars","colors","i","jcCssVariablesResolver","JcProvider","others","merged","mergeThemeOverrides","MantineProvider","cssVariablesResolver","toneColor$1","toneIcon","IconInfoCircle","IconCheck","IconAlertTriangle","IconX","Tag","Icon","leftSection","withIcon","PromoBanner_module_default","palette","varsResolver$1","createVarsResolver","radius","getRadius","PromoBanner","factory","useProps","_props","internalOpen","setOpen","useState","open","opened","getStyles","useStyles","Box","withCloseButton","icon","highlight","onClose","ContentCard_module_default","ContentCard","image","imageAlt","imageHeight","kicker","title","children","actions","KpiCard_module_default","getDeltaTone","delta","invert","toneColor","varsResolver","invertDelta","colorValue","KpiCard","ArrowIcon","IconMinus","IconArrowUpRight","IconArrowDownRight","label","loading","deltaLabel","chart","KpiGroup","SimpleGrid","TopNav_module_default","TopNav","LinkComponent","useDisclosure","renderLinks","links","isButton","link","Component","linkProps","event","onNavigate","Fragment","index","BrandComponent","brandHref","brandProps","collapseOnMobile","brand","rightSection","toggle","Collapse","close","PageHeader_module_default","defaultProps","PageHeader","rem","breadcrumbs","Breadcrumbs","crumb","linkComponent","description","DataTable_module_default","columnId","column","compare","a","b","DataTable","controlledSort","internalSort","setInternalSort","initialSort","sort","page","setPage","setSort","next","onSortChange","toggleSort","key","sorted","useMemo","data","columns","getValue","row","result","totalPages","pageSize","currentPage","visible","header","id","isSorted","SortIcon","IconArrowUp","IconArrowDown","IconArrowsSort","body","loadingRows","empty","IconDatabaseOff","onRowClick","raw","content","rowKey","plain","tableProps","ThemeToggle","useMantineColorScheme","computed","useComputedColorScheme","setColorScheme","IconSun","IconMoon","as","TokenSwatch_module_default","TokenSwatch","clipboard","useClipboard","text","copy","cssVar","className","ColorRamp","steps","luminance","valueSize","PriceTag","oldValue","Text","Group","unit","pixDiscount","installments","ProductCard_module_default","ProductCard","discount","oldPrice","price","href","NameComponent","onAction","imageRatio","showDiscount","badges","badge","onFavoriteChange","favorite","jsx","IconHeartFilled","IconHeart","category","rating","reviews","IconShoppingCart","actionLabel","CouponCode","IconTicket","code","IconCopy","onCopy","copiedLabel","copyLabel"],"sources":["../src/theme/variantColorResolver.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.tsx","../src/components/Tag/Tag.tsx","../src/components/PromoBanner/PromoBanner.module.css","../src/components/PromoBanner/PromoBanner.tsx","../src/components/ContentCard/ContentCard.module.css","../src/components/ContentCard/ContentCard.tsx","../src/components/KpiCard/KpiCard.module.css","../src/components/KpiCard/KpiCard.tsx","../src/components/TopNav/TopNav.module.css","../src/components/TopNav/TopNav.tsx","../src/components/PageHeader/PageHeader.module.css","../src/components/PageHeader/PageHeader.tsx","../src/components/DataTable/DataTable.module.css","../src/components/DataTable/DataTable.tsx","../src/components/ThemeToggle/ThemeToggle.tsx","../src/components/TokenSwatch/TokenSwatch.module.css","../src/components/TokenSwatch/TokenSwatch.tsx","../src/components/PriceTag/PriceTag.tsx","../src/components/ProductCard/ProductCard.module.css","../src/components/ProductCard/ProductCard.tsx","../src/components/CouponCode/CouponCode.tsx"],"sourcesContent":["import {\n defaultVariantColorsResolver,\n parseThemeColor,\n type VariantColorsResolver,\n} from '@mantine/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 { MantineSize } from '@mantine/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","/* 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 { ActionIcon, Button, CloseButton, type MantineSize, type MantineThemeComponents } from '@mantine/core';\nimport { control, isSize } from '../controls';\nimport classes from './buttons.module.css';\n\nexport const buttonsComponents: MantineThemeComponents = {\n Button: Button.extend({\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: ActionIcon.extend({ defaultProps: { variant: 'subtle' }, classNames: { root: classes.actionIcon } }),\n CloseButton: CloseButton.extend({ classNames: { root: classes.closeButton } }),\n};\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 { Cascader, Pill, type MantineThemeComponents } from '@mantine/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: MantineThemeComponents = {\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: Cascader.extend({\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: Pill.extend({ classNames: { root: classes.pill, remove: classes.pillRemove } }),\n};\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 {\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 type MantineThemeComponents,\n} from '@mantine/core';\nimport classes from './dataDisplay.module.css';\n\nexport const dataDisplayComponents: MantineThemeComponents = {\n Accordion: Accordion.extend({\n defaultProps: { chevronPosition: 'right' },\n classNames: { item: classes.accordionItem, control: classes.accordionControl, label: classes.accordionLabel, chevron: classes.accordionChevron, content: classes.accordionContent },\n }),\n Avatar: Avatar.extend({ defaultProps: { color: 'horizon', radius: 'xl' }, classNames: { root: classes.avatar } }),\n BackgroundImage: BackgroundImage.extend({ defaultProps: { radius: 'md' } }),\n Badge: Badge.extend({\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: Card.extend({ defaultProps: { radius: 'md', padding: 'lg', shadow: 'sm', withBorder: true } }),\n DataList: DataList.extend({ classNames: { root: classes.dataList, itemLabel: classes.dataListLabel, itemValue: classes.dataListValue } }),\n Image: Image.extend({ defaultProps: { radius: 'md' } }),\n Indicator: Indicator.extend({ defaultProps: { color: 'danger' }, classNames: { indicator: classes.indicator } }),\n Kbd: Kbd.extend({ classNames: { root: classes.kbd } }),\n /** Formato brasileiro por padrão: 1.234,56 */\n NumberFormatter: NumberFormatter.extend({ defaultProps: { thousandSeparator: '.', decimalSeparator: ',' } }),\n RollingNumber: RollingNumber.extend({ defaultProps: { thousandSeparator: '.', decimalSeparator: ',' } }),\n Spoiler: Spoiler.extend({ classNames: { control: classes.spoilerControl } }),\n ThemeIcon: ThemeIcon.extend({ defaultProps: { radius: 'md' } }),\n Timeline: Timeline.extend({\n defaultProps: { bulletSize: 24, lineWidth: 2 },\n classNames: { root: classes.timeline, item: classes.timelineItem, itemBullet: classes.timelineBullet, itemTitle: classes.timelineTitle },\n }),\n};\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 {\n Alert,\n EmptyState,\n Loader,\n Notification,\n Progress,\n RingProgress,\n SemiCircleProgress,\n Skeleton,\n type MantineThemeComponents,\n} from '@mantine/core';\nimport classes from './feedback.module.css';\n\nexport const feedbackComponents: MantineThemeComponents = {\n Notification: Notification.extend({\n defaultProps: { radius: 'md' },\n classNames: { root: classes.notification, title: classes.notificationTitle, description: classes.notificationDescription, icon: classes.notificationIcon },\n }),\n Alert: Alert.extend({ defaultProps: { variant: 'light' }, classNames: { root: classes.alert, wrapper: classes.alertWrapper, title: classes.alertTitle, message: classes.alertMessage } }),\n Loader: Loader.extend({ defaultProps: { type: 'oval' } }),\n Progress: Progress.extend({ defaultProps: { radius: 'xl' }, classNames: { root: classes.progress, label: classes.progressLabel } }),\n RingProgress: RingProgress.extend({ classNames: { curve: classes.ringCurve } }),\n SemiCircleProgress: SemiCircleProgress.extend({ classNames: { root: classes.semiCircle, label: classes.semiCircleLabel } }),\n Skeleton: Skeleton.extend({ classNames: { root: classes.skeleton } }),\n EmptyState: EmptyState.extend({\n classNames: { root: classes.emptyState, indicator: classes.emptyIndicator, title: classes.emptyTitle, description: classes.emptyDescription },\n }),\n};\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 {\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 type MantineThemeComponents,\n} from '@mantine/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: MantineThemeComponents = {\n ...inputDefaults,\n Input: Input.extend({\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: InputWrapper.extend({\n classNames: { label: classes.label, description: classes.description },\n }),\n /** Seta e opções do menu nativo legíveis no tema escuro. */\n NativeSelect: NativeSelect.extend({\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: Checkbox.extend({ defaultProps: { radius: 'xs' }, classNames: { input: classes.checkInput } }),\n CheckboxIndicator: CheckboxIndicator.extend({ defaultProps: { radius: 'xs' }, classNames: { indicator: classes.checkInput } }),\n CheckboxCard: CheckboxCard.extend({ defaultProps: { radius: 'md' }, classNames: { card: classes.selectCard } }),\n Radio: Radio.extend({ classNames: { radio: classes.checkInput } }),\n RadioIndicator: RadioIndicator.extend({ classNames: { indicator: classes.checkInput } }),\n RadioCard: RadioCard.extend({ defaultProps: { radius: 'md' }, classNames: { card: classes.selectCard } }),\n Switch: Switch.extend({ 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: Chip.extend({\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: SegmentedControl.extend({\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: Fieldset.extend({\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: PinInput.extend({\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: Slider.extend({ classNames: sliderClassNames }),\n RangeSlider: RangeSlider.extend({ classNames: sliderClassNames }),\n AngleSlider: AngleSlider.extend({ 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: Rating.extend({\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: ColorPicker.extend({\n classNames: { ...colorSliderClassNames, saturation: classes.colorSaturation, swatch: classes.colorSwatch },\n }),\n AlphaSlider: AlphaSlider.extend({ classNames: colorSliderClassNames }),\n HueSlider: HueSlider.extend({ classNames: colorSliderClassNames }),\n};\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 { AppShell, Container, Splitter, type MantineThemeComponents } from '@mantine/core';\nimport classes from './layout.module.css';\n\nexport const layoutComponents: MantineThemeComponents = {\n AppShell: AppShell.extend({\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: Container.extend({ 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: Splitter.extend({\n classNames: { root: classes.splitter, handle: classes.splitterHandle, thumb: classes.splitterThumb },\n }),\n};\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 { Divider, Paper, ScrollArea, type MantineThemeComponents } from '@mantine/core';\nimport classes from './misc.module.css';\n\nexport const miscComponents: MantineThemeComponents = {\n Paper: Paper.extend({ defaultProps: { radius: 'md' }, classNames: { root: classes.paper } }),\n Divider: Divider.extend({ 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: ScrollArea.extend({ classNames: { scrollbar: classes.scrollbar, thumb: classes.scrollThumb } }),\n};\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 { Anchor, Burger, NavLink, Pagination, Stepper, TableOfContents, Tabs, Tree, type MantineThemeComponents } from '@mantine/core';\nimport classes from './navigation.module.css';\n\nexport const navigationComponents: MantineThemeComponents = {\n Tabs: Tabs.extend({ classNames: { root: classes.tabs, tab: classes.tab } }),\n Anchor: Anchor.extend({ classNames: { root: classes.anchor } }),\n Burger: Burger.extend({ 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: NavLink.extend({ defaultProps: { variant: 'light' }, classNames: { root: classes.navLink } }),\n Pagination: Pagination.extend({ defaultProps: { radius: 'sm' }, classNames: { control: classes.paginationControl } }),\n Stepper: Stepper.extend({\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: TableOfContents.extend({ classNames: { control: classes.tocControl } }),\n Tree: Tree.extend({ classNames: { root: classes.tree, label: classes.treeLabel } }),\n};\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 {\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 type MantineThemeComponents,\n} from '@mantine/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: MantineThemeComponents = {\n Menu: Menu.extend({ defaultProps: { shadow: 'md', radius: 'sm' }, classNames: menuClassNames }),\n Menubar: Menubar.extend({ classNames: { root: classes.menubarRoot, target: classes.menubarTarget } }),\n Popover: Popover.extend({ defaultProps: { shadow: 'md', radius: 'sm' }, classNames: { dropdown: classes.dropdown } }),\n HoverCard: HoverCard.extend({ defaultProps: { shadow: 'md', radius: 'md' }, classNames: { dropdown: classes.dropdown } }),\n Tooltip: Tooltip.extend({ defaultProps: { radius: 'sm', withArrow: true }, classNames: { tooltip: classes.tooltip } }),\n Modal: Modal.extend({\n defaultProps: { radius: 'md', centered: true, shadow: 'lg', overlayProps },\n classNames: { content: classes.modalContent, header: classes.modalHeader, title: classes.modalTitle },\n }),\n Drawer: Drawer.extend({\n defaultProps: { shadow: 'lg', overlayProps },\n classNames: { content: classes.modalContent, header: classes.modalHeader, title: classes.modalTitle },\n }),\n Dialog: Dialog.extend({ defaultProps: { radius: 'md', shadow: 'lg' }, classNames: { root: classes.floatingSurface } }),\n ActionBar: ActionBar.extend({\n defaultProps: { radius: 'md', shadow: 'lg' },\n classNames: { root: classes.floatingSurface, divider: classes.actionBarDivider },\n }),\n FloatingWindow: FloatingWindow.extend({ 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: Overlay.extend({ defaultProps: { color: brand.obsidian } }),\n LoadingOverlay: LoadingOverlay.extend({ defaultProps: { overlayProps: { backgroundOpacity: 0.75, blur: 1 } } }),\n};\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 {\n Blockquote,\n Code,\n List,\n Mark,\n Table,\n Title,\n Typography,\n getThemeColor,\n type MantineThemeComponents,\n} from '@mantine/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: MantineThemeComponents = {\n Blockquote: Blockquote.extend({\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: Code.extend({ classNames: { root: classes.code } }),\n List: List.extend({ 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: Mark.extend({\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: Table.extend({\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: Title.extend({ classNames: { root: classes.title } }),\n Typography: Typography.extend({ classNames: { root: classes.typography } }),\n};\n","import type { MantineThemeComponents } from '@mantine/core';\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: MantineThemeComponents = {\n ...layoutComponents,\n ...inputsComponents,\n ...comboboxComponents,\n ...buttonsComponents,\n ...navigationComponents,\n ...feedbackComponents,\n ...overlaysComponents,\n ...dataDisplayComponents,\n ...typographyComponents,\n ...miscComponents,\n};\n","import { createTheme } from '@mantine/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\nexport const jcTheme = createTheme({\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/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 { MantineProvider, mergeThemeOverrides, type MantineProviderProps, type MantineThemeOverride } from '@mantine/core';\nimport { jcCssVariablesResolver } from '../theme/cssVariablesResolver';\nimport { jcTheme } from '../theme/theme';\n\nexport interface JcProviderProps extends Omit<MantineProviderProps, 'theme'> {\n /** Overrides adicionais, mesclados sobre o tema JC Decor */\n theme?: MantineThemeOverride;\n}\n\n/**\n * Provider do Design System JC Decor: MantineProvider + tema + variáveis `--ds-*`.\n *\n * ```tsx\n * import '@mantine/core/styles.css';\n * import '@jcdecor/ui/styles.css';\n * <JcProvider><App /></JcProvider>\n * ```\n */\nexport function JcProvider({ theme, defaultColorScheme = 'light', cssVariablesResolver, children, ...others }: JcProviderProps) {\n const merged = theme ? mergeThemeOverrides(jcTheme, theme) : jcTheme;\n return (\n <MantineProvider\n theme={merged}\n defaultColorScheme={defaultColorScheme}\n cssVariablesResolver={cssVariablesResolver ?? jcCssVariablesResolver}\n {...others}\n >\n {children}\n </MantineProvider>\n );\n}\nJcProvider.displayName = '@jcdecor/ui/JcProvider';\n","import { Badge, type BadgeProps } from '@mantine/core';\nimport {\n IconAlertTriangle,\n IconCheck,\n IconInfoCircle,\n IconX,\n} from '@tabler/icons-react';\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, React.ComponentType<{ size?: number; stroke?: number }> | 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 (✓ ⚠ ✕ ⓘ). Passe um nó em `leftSection` para usar outro. */\n withIcon?: boolean;\n /** `light` = selo suave (padrão) · `filled` = cor sólida · `outline` · `dot` */\n variant?: 'light' | 'filled' | 'outline' | 'dot';\n children?: React.ReactNode;\n}\n\n/** Selo / tag de status — preset de Badge com os tons do ds.css. */\nexport function Tag({ tone = 'primary', withIcon = false, variant = 'light', leftSection, ...others }: TagProps) {\n const Icon = toneIcon[tone];\n return (\n <Badge\n color={toneColor[tone]}\n variant={variant}\n leftSection={leftSection ?? (withIcon && Icon ? <Icon size={12} stroke={2.5} /> : undefined)}\n data-tone={tone}\n {...others}\n />\n );\n}\n\nTag.displayName = '@jcdecor/ui/Tag';\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","import { useState } from 'react';\nimport {\n Box,\n CloseButton,\n createVarsResolver,\n factory,\n getRadius,\n useProps,\n useStyles,\n type BoxProps,\n type ElementProps,\n type Factory,\n type MantineRadius,\n type StylesApiProps,\n} from '@mantine/core';\nimport classes from './PromoBanner.module.css';\n\nexport type PromoBannerStylesNames = 'root' | 'content' | 'highlight' | 'close';\nexport type PromoBannerCssVariables = {\n root: '--banner-bg' | '--banner-color' | '--banner-highlight' | '--banner-radius';\n};\n\nexport interface PromoBannerProps extends BoxProps, StylesApiProps<PromoBannerFactory>, ElementProps<'div'> {\n /** `horizon` = azul com destaque Electric · `electric` = amarelo com destaque Horizon · `obsidian` @default 'horizon' */\n variant?: 'horizon' | 'electric' | 'obsidian';\n /** Trecho destacado ao final (ex.: cupom). Também é possível usar `<strong>` dentro de children. */\n highlight?: React.ReactNode;\n /** Ícone/elemento à esquerda do texto */\n icon?: React.ReactNode;\n /** Exibe botão de fechar; o banner some e chama `onClose` */\n withCloseButton?: boolean;\n /** Controle externo da visibilidade (opcional) */\n opened?: boolean;\n onClose?: () => void;\n /** Arredonda os cantos (por padrão o banner é full-bleed, sem raio) */\n radius?: MantineRadius;\n}\n\nexport type PromoBannerFactory = Factory<{\n props: PromoBannerProps;\n ref: HTMLDivElement;\n stylesNames: PromoBannerStylesNames;\n vars: PromoBannerCssVariables;\n variant: 'horizon' | 'electric' | 'obsidian';\n}>;\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\nconst varsResolver = createVarsResolver<PromoBannerFactory>((_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\n/** Banner promocional (topo do site / campanhas). */\nexport const PromoBanner = factory<PromoBannerFactory>((_props) => {\n const props = useProps('PromoBanner', { variant: 'horizon' }, _props);\n const {\n classNames, className, style, styles, unstyled, vars, attributes,\n variant, highlight, icon, withCloseButton, opened, onClose, radius, children, ...others\n } = props;\n const [internalOpen, setOpen] = useState(true);\n const open = opened ?? internalOpen;\n\n const getStyles = useStyles<PromoBannerFactory>({\n name: 'PromoBanner',\n classes,\n props,\n className,\n style,\n classNames,\n styles,\n unstyled,\n attributes,\n vars,\n varsResolver,\n });\n\n if (!open) return null;\n\n return (\n <Box role=\"note\" {...getStyles('root')} variant={variant} mod={{ radius: radius !== undefined, closable: withCloseButton }} {...others}>\n <span {...getStyles('content')}>\n {icon}\n <span>{children}</span>\n {highlight && <strong {...getStyles('highlight')}>{highlight}</strong>}\n </span>\n {withCloseButton && (\n <CloseButton\n aria-label=\"Fechar\"\n size=\"sm\"\n variant=\"transparent\"\n {...getStyles('close')}\n onClick={() => {\n setOpen(false);\n onClose?.();\n }}\n />\n )}\n </Box>\n );\n});\n\nPromoBanner.classes = classes;\nPromoBanner.varsResolver = varsResolver;\nPromoBanner.displayName = '@jcdecor/ui/PromoBanner';\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","import {\n Card,\n factory,\n useProps,\n useStyles,\n type CardProps,\n type Factory,\n type StylesApiProps,\n} from '@mantine/core';\nimport { Kicker } from '../Typography';\nimport classes from './ContentCard.module.css';\n\nexport type ContentCardStylesNames = 'root' | 'image' | 'kicker' | 'title' | 'body' | 'actions';\n\nexport interface ContentCardProps extends Omit<CardProps, 'classNames' | 'styles' | 'vars' | 'attributes' | 'title'>, StylesApiProps<ContentCardFactory> {\n /** Sobretítulo em caixa-alta */\n kicker?: React.ReactNode;\n title?: React.ReactNode;\n /** Imagem de capa (URL) ou nó customizado */\n image?: string | React.ReactNode;\n imageAlt?: string;\n imageHeight?: number;\n /** Botões/links no rodapé do card */\n actions?: React.ReactNode;\n children?: React.ReactNode;\n}\n\nexport type ContentCardFactory = Factory<{\n props: ContentCardProps;\n ref: HTMLDivElement;\n stylesNames: ContentCardStylesNames;\n}>;\n\n/** Card de conteúdo: superfície branca sobre LightGray, borda suave e sombra pequena (ds-card). */\nexport const ContentCard = factory<ContentCardFactory>((_props) => {\n const props = useProps('ContentCard', { imageHeight: 180 }, _props);\n const {\n classNames, className, style, styles, unstyled, vars, attributes,\n kicker, title, image, imageAlt, imageHeight, actions, children, ...others\n } = props;\n\n const getStyles = useStyles<ContentCardFactory>({\n name: 'ContentCard',\n classes,\n props,\n className,\n style,\n classNames,\n styles,\n unstyled,\n attributes,\n vars,\n });\n\n return (\n <Card {...getStyles('root')} {...others}>\n {image && (\n <div {...getStyles('image')}>\n {typeof image === 'string' ? <img src={image} alt={imageAlt ?? ''} style={{ height: imageHeight }} /> : image}\n </div>\n )}\n {kicker && <Kicker {...getStyles('kicker')}>{kicker}</Kicker>}\n {title && <div {...getStyles('title')}>{title}</div>}\n {children && <div {...getStyles('body')}>{children}</div>}\n {actions && <div {...getStyles('actions')}>{actions}</div>}\n </Card>\n );\n});\n\nContentCard.classes = classes;\nContentCard.displayName = '@jcdecor/ui/ContentCard';\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","import {\n Box,\n SimpleGrid,\n Skeleton,\n createVarsResolver,\n factory,\n useProps,\n useStyles,\n type BoxProps,\n type ElementProps,\n type Factory,\n type SimpleGridProps,\n type StylesApiProps,\n} from '@mantine/core';\nimport { IconArrowDownRight, IconArrowUpRight, IconMinus } from '@tabler/icons-react';\nimport { formatNumber, formatPercent } from '../../utils/format';\nimport classes from './KpiCard.module.css';\n\nexport type KpiCardStylesNames = 'root' | 'header' | 'label' | 'icon' | 'value' | 'footer' | 'delta' | 'chart';\nexport type KpiCardCssVariables = { root: '--kpi-delta-color' | '--kpi-value-color' };\n\nexport interface KpiCardProps extends BoxProps, StylesApiProps<KpiCardFactory>, Omit<ElementProps<'div'>, 'title'> {\n /** Rótulo em caixa-alta (ex.: \"Acessos (60d)\") */\n label: React.ReactNode;\n /** Valor principal. Números são formatados em pt-BR. */\n value: React.ReactNode;\n /** Variação em pontos percentuais (ex.: -5.6). Cor e seta automáticas. */\n delta?: number;\n /** Texto ao lado da variação (ex.: \"vs. mês anterior\") */\n deltaLabel?: React.ReactNode;\n /** Quando queda é algo bom (ex.: taxa de rejeição), inverte as cores. */\n invertDelta?: boolean;\n /** Pinta o próprio valor com a cor da variação (como o KPI \"-5,6%\" do DS) */\n colorValue?: boolean;\n icon?: React.ReactNode;\n /** Slot para um Sparkline ou mini-gráfico */\n chart?: React.ReactNode;\n loading?: boolean;\n}\n\nexport type KpiCardFactory = Factory<{\n props: KpiCardProps;\n ref: HTMLDivElement;\n stylesNames: KpiCardStylesNames;\n vars: KpiCardCssVariables;\n}>;\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\nconst varsResolver = createVarsResolver<KpiCardFactory>((_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\n/** Tile de KPI dos dashboards (ds-kpi). */\nexport const KpiCard = factory<KpiCardFactory>((_props) => {\n const props = useProps('KpiCard', {}, _props);\n const {\n classNames, className, style, styles, unstyled, vars, attributes,\n label, value, delta, deltaLabel, invertDelta, colorValue, icon, chart, loading, ...others\n } = props;\n\n const getStyles = useStyles<KpiCardFactory>({\n name: 'KpiCard',\n classes,\n props,\n className,\n style,\n classNames,\n styles,\n unstyled,\n attributes,\n vars,\n varsResolver,\n });\n\n const tone = getDeltaTone(delta, invertDelta);\n const ArrowIcon = delta === undefined || delta === 0 ? IconMinus : delta > 0 ? IconArrowUpRight : IconArrowDownRight;\n\n return (\n <Box {...getStyles('root')} {...others}>\n <div {...getStyles('header')}>\n <span {...getStyles('label')}>{label}</span>\n {icon && <span {...getStyles('icon')}>{icon}</span>}\n </div>\n {loading ? (\n <Skeleton height={32} width=\"60%\" mt={4} />\n ) : (\n <div {...getStyles('value')}>{typeof value === 'number' ? formatNumber(value) : value}</div>\n )}\n {(delta !== undefined || deltaLabel) && !loading && (\n <div {...getStyles('footer')}>\n {delta !== undefined && (\n <span {...getStyles('delta')} data-tone={tone}>\n <ArrowIcon size={14} stroke={2.5} />\n {formatPercent(delta, { signed: true })}\n </span>\n )}\n {deltaLabel && <span>{deltaLabel}</span>}\n </div>\n )}\n {chart && <div {...getStyles('chart')}>{chart}</div>}\n </Box>\n );\n});\n\nKpiCard.classes = classes;\nKpiCard.varsResolver = varsResolver;\nKpiCard.displayName = '@jcdecor/ui/KpiCard';\n\nexport interface KpiGroupProps extends SimpleGridProps {\n children?: React.ReactNode;\n}\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 function KpiGroup({ cols = { base: 1, '440px': 2, '880px': 4 }, spacing = 'md', type = 'container', ...others }: KpiGroupProps) {\n return <SimpleGrid type={type} cols={cols} spacing={spacing} {...others} />;\n}\nKpiGroup.displayName = '@jcdecor/ui/KpiGroup';\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","import {\n Box,\n Burger,\n Collapse,\n factory,\n useProps,\n useStyles,\n type BoxProps,\n type ElementProps,\n type Factory,\n type StylesApiProps,\n} from '@mantine/core';\nimport { useDisclosure } from '@mantine/hooks';\nimport { JcLogo } from '../../brand/Brand';\nimport classes from './TopNav.module.css';\n\nexport type TopNavStylesNames = 'root' | 'brand' | 'links' | 'link' | 'linkSection' | 'linkLabel' | 'right' | 'burger' | 'mobileLinks';\n\nexport interface TopNavLink {\n label: React.ReactNode;\n href?: string;\n active?: boolean;\n /** Ícone/conteúdo antes do texto (como `leftSection` do Mantine) */\n leftSection?: React.ReactNode;\n /** Conteúdo depois do texto (ex.: contador, chevron) */\n rightSection?: React.ReactNode;\n /** Desabilita o link (sem navegação nem `onClick`) */\n disabled?: boolean;\n /** Nome acessível, necessário quando o link mostra só um ícone */\n 'aria-label'?: string;\n onClick?: (event: React.MouseEvent) => void;\n}\n\nexport interface TopNavProps extends BoxProps, StylesApiProps<TopNavFactory>, ElementProps<'div'> {\n /** Marca à esquerda @default <JcLogo variant=\"dark\" /> (a barra é navy em ambos os temas) */\n brand?: React.ReactNode;\n /** Link da marca; `null` renderiza a marca como texto @default '/' */\n brandHref?: string | null;\n links?: TopNavLink[];\n /** Componente usado nos links (ex.: `Link` do react-router, recebe `to`/`href`) @default 'a' */\n linkComponent?: React.ElementType;\n /** Conteúdo à direita (ex.: ThemeToggle, avatar) */\n rightSection?: React.ReactNode;\n /** Esconde os links em telas pequenas e mostra um hambúrguer @default true */\n collapseOnMobile?: boolean;\n}\n\nexport type TopNavFactory = Factory<{\n props: TopNavProps;\n ref: HTMLDivElement;\n stylesNames: TopNavStylesNames;\n}>;\n\n/** Barra de navegação Obsidian dos painéis (ds-nav). */\nexport const TopNav = factory<TopNavFactory>((_props) => {\n const props = useProps('TopNav', { brand: <JcLogo variant=\"dark\" size={28} />, brandHref: '/', links: [], linkComponent: 'a', collapseOnMobile: true }, _props);\n const {\n classNames, className, style, styles, unstyled, vars, attributes,\n brand, brandHref, links, linkComponent: LinkComponent = 'a', rightSection, collapseOnMobile, ...others\n } = props;\n const [opened, { toggle, close }] = useDisclosure(false);\n\n const getStyles = useStyles<TopNavFactory>({\n name: 'TopNav',\n classes,\n props,\n className,\n style,\n classNames,\n styles,\n unstyled,\n attributes,\n vars,\n });\n\n const renderLinks = (onNavigate?: () => void) =>\n links!.map((link, index) => {\n const isButton = !link.href || link.disabled;\n const Component: React.ElementType = isButton ? 'button' : LinkComponent;\n const linkProps = isButton\n ? { type: 'button', disabled: link.disabled || undefined }\n : LinkComponent === 'a'\n ? { href: link.href }\n : { to: link.href, href: link.href };\n return (\n <Component\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: React.MouseEvent) => {\n if (link.disabled) return;\n link.onClick?.(event);\n onNavigate?.();\n }}\n >\n {link.leftSection || link.rightSection ? (\n <>\n {link.leftSection && <span {...getStyles('linkSection')} data-position=\"left\">{link.leftSection}</span>}\n {link.label !== undefined && link.label !== null && link.label !== '' && <span {...getStyles('linkLabel')}>{link.label}</span>}\n {link.rightSection && <span {...getStyles('linkSection')} data-position=\"right\">{link.rightSection}</span>}\n </>\n ) : (\n link.label\n )}\n </Component>\n );\n });\n\n const BrandComponent: React.ElementType = brandHref === null ? 'span' : LinkComponent;\n const brandProps = brandHref === null ? {} : LinkComponent === 'a' ? { href: brandHref } : { to: brandHref, href: brandHref };\n\n return (\n <header>\n <Box {...getStyles('root')} mod={{ collapse: collapseOnMobile }} {...others}>\n <BrandComponent {...brandProps} {...getStyles('brand')}>\n {brand}\n </BrandComponent>\n <nav {...getStyles('links')} aria-label=\"Principal\">\n {renderLinks()}\n </nav>\n <div {...getStyles('right')}>\n {rightSection}\n {collapseOnMobile && links!.length > 0 && (\n <Burger opened={opened} onClick={toggle} size=\"sm\" aria-label=\"Abrir menu\" {...getStyles('burger')} />\n )}\n </div>\n </Box>\n {collapseOnMobile && links!.length > 0 && (\n <Collapse expanded={opened}>\n <nav {...getStyles('mobileLinks')} aria-label=\"Principal (mobile)\">\n {renderLinks(close)}\n </nav>\n </Collapse>\n )}\n </header>\n );\n});\n\nTopNav.classes = classes;\nTopNav.displayName = '@jcdecor/ui/TopNav';\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","import {\n Anchor,\n Box,\n Breadcrumbs,\n factory,\n rem,\n useProps,\n useStyles,\n type BoxProps,\n type ElementProps,\n type Factory,\n type StylesApiProps,\n} from '@mantine/core';\nimport { Kicker, Headline, Subheadline } from '../Typography';\nimport classes from './PageHeader.module.css';\n\nexport interface PageHeaderBreadcrumb {\n label: React.ReactNode;\n href?: string;\n}\n\nexport type PageHeaderStylesNames =\n | 'root'\n | 'breadcrumbs'\n | 'header'\n | 'main'\n | 'icon'\n | 'body'\n | 'kicker'\n | 'title'\n | 'description'\n | 'actions';\n\nexport type PageHeaderCssVariables = {\n root: '--page-header-icon-size';\n};\n\nexport interface PageHeaderProps\n extends BoxProps,\n StylesApiProps<PageHeaderFactory>,\n Omit<ElementProps<'div'>, 'title'> {\n kicker?: React.ReactNode;\n title: React.ReactNode;\n description?: React.ReactNode;\n /** Ícone à esquerda do título (ex.: `<IconUsers />`), num quadro suave na cor primária */\n icon?: React.ReactNode;\n /** Tamanho do quadro do ícone (px ou CSS) @default 48 */\n iconSize?: number | string;\n /** Botões à direita do título */\n actions?: React.ReactNode;\n breadcrumbs?: PageHeaderBreadcrumb[];\n /** Componente dos links do breadcrumb (ex.: Link do react-router) @default 'a' */\n linkComponent?: React.ElementType;\n /** `display` usa display-small (página principal); `headline` usa headline-large @default 'headline' */\n size?: 'display' | 'headline';\n}\n\nexport type PageHeaderFactory = Factory<{\n props: PageHeaderProps;\n ref: HTMLDivElement;\n stylesNames: PageHeaderStylesNames;\n vars: PageHeaderCssVariables;\n}>;\n\nconst defaultProps: Partial<PageHeaderProps> = {\n linkComponent: 'a',\n size: 'headline',\n};\n\n/** Cabeçalho de página: breadcrumbs, ícone, kicker, título, descrição e ações. */\nexport const PageHeader = factory<PageHeaderFactory>((_props) => {\n const props = useProps('PageHeader', defaultProps, _props);\n const {\n classNames, className, style, styles, unstyled, vars, attributes,\n kicker, title, description, icon, iconSize, actions, breadcrumbs, linkComponent = 'a', size, ...others\n } = props;\n\n const getStyles = useStyles<PageHeaderFactory>({\n name: 'PageHeader',\n classes,\n props,\n className,\n style,\n classNames,\n styles,\n unstyled,\n attributes,\n vars,\n varsResolver: (_theme, { iconSize: s }) => ({\n root: { '--page-header-icon-size': s === undefined ? undefined : typeof s === 'number' ? rem(s) : s },\n }),\n });\n\n return (\n <Box {...getStyles('root')} {...others}>\n {breadcrumbs && breadcrumbs.length > 0 && (\n <Breadcrumbs {...getStyles('breadcrumbs')} fz=\"sm\" separatorMargin={6}>\n {breadcrumbs.map((crumb, index) =>\n crumb.href ? (\n <Anchor key={index} component={linkComponent as 'a'} href={crumb.href} {...(linkComponent !== 'a' && { to: crumb.href })} fz=\"sm\">\n {crumb.label}\n </Anchor>\n ) : (\n <Box key={index} component=\"span\" c=\"var(--ds-text-3)\" fz=\"sm\">\n {crumb.label}\n </Box>\n ),\n )}\n </Breadcrumbs>\n )}\n <div {...getStyles('header')}>\n <div {...getStyles('main')}>\n {icon && (\n <div {...getStyles('icon')} aria-hidden>\n {icon}\n </div>\n )}\n <div {...getStyles('body')}>\n {kicker && <Kicker {...getStyles('kicker')}>{kicker}</Kicker>}\n {size === 'display' ? (\n <Headline component=\"h1\" size=\"lg\" fz=\"var(--type-display-sm)\" lh={1.15} mt={8} {...getStyles('title')}>\n {title}\n </Headline>\n ) : (\n <Headline component=\"h1\" size=\"lg\" mt={kicker ? 8 : 0} {...getStyles('title')}>\n {title}\n </Headline>\n )}\n {description && (\n <Subheadline component=\"div\" size=\"lg\" c=\"var(--ds-text-2)\" maw={640} mt={8} {...getStyles('description')}>\n {description}\n </Subheadline>\n )}\n </div>\n </div>\n {actions && <div {...getStyles('actions')}>{actions}</div>}\n </div>\n </Box>\n );\n});\n\nPageHeader.classes = classes;\nPageHeader.displayName = '@jcdecor/ui/PageHeader';\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 { useMemo, useState } from 'react';\nimport { Box, EmptyState, Pagination, ScrollArea, Skeleton, Table, type BoxProps, type TableProps } from '@mantine/core';\nimport { IconArrowDown, IconArrowUp, IconArrowsSort, IconDatabaseOff } from '@tabler/icons-react';\nimport { formatNumber } from '../../utils/format';\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 header: React.ReactNode;\n /** Renderização customizada da célula */\n render?: (row: T, index: number) => React.ReactNode;\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\nexport interface DataTableProps<T> extends BoxProps {\n columns: DataTableColumn<T>[];\n data: T[];\n /** Chave única de cada linha @default índice */\n rowKey?: (row: T, index: number) => React.Key;\n initialSort?: DataTableSort<T>;\n /** Controle externo da ordenação */\n sort?: DataTableSort<T> | null;\n onSortChange?: (sort: DataTableSort<T> | null) => void;\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 empty?: React.ReactNode;\n onRowClick?: (row: T, index: number) => void;\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\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/** Tabela de dados com ordenação, colunas numéricas pt-BR, paginação e estados vazio/carregando. */\nexport function DataTable<T extends Record<string, any>>({\n columns,\n data,\n rowKey,\n initialSort,\n sort: controlledSort,\n onSortChange,\n pageSize,\n loading,\n loadingRows = 5,\n empty,\n onRowClick,\n plain,\n striped,\n stickyHeader,\n tableProps,\n ...others\n}: DataTableProps<T>) {\n const [internalSort, setInternalSort] = useState<DataTableSort<T> | null>(initialSort ?? null);\n const sort = controlledSort !== undefined ? controlledSort : internalSort;\n const [page, setPage] = useState(1);\n\n const setSort = (next: DataTableSort<T> | null) => {\n if (controlledSort === undefined) setInternalSort(next);\n onSortChange?.(next);\n setPage(1);\n };\n\n const toggleSort = (key: string) => {\n if (!sort || sort.key !== key) setSort({ key, direction: 'asc' });\n else if (sort.direction === 'asc') setSort({ key, direction: 'desc' });\n else setSort(null);\n };\n\n const sorted = useMemo(() => {\n if (!sort) return data;\n const column = columns.find((c) => columnId(c) === sort.key);\n const getValue = column?.sortValue ?? ((row: T) => (column?.key ? row[column.key] : undefined));\n const result = [...data].sort((a, b) => compare(getValue(a), getValue(b)));\n return sort.direction === 'desc' ? result.reverse() : result;\n }, [data, sort, columns]);\n\n const totalPages = pageSize ? Math.max(1, Math.ceil(sorted.length / pageSize)) : 1;\n const currentPage = Math.min(page, totalPages);\n const visible = pageSize ? sorted.slice((currentPage - 1) * pageSize, currentPage * pageSize) : sorted;\n\n const header = (\n <Table.Thead>\n <Table.Tr>\n {columns.map((column) => {\n const id = columnId(column);\n const isSorted = sort?.key === id;\n const SortIcon = !isSorted ? IconArrowsSort : sort!.direction === 'asc' ? IconArrowUp : IconArrowDown;\n return (\n <Table.Th\n key={id}\n className={column.numeric ? classes.num : undefined}\n style={{ width: column.width }}\n aria-sort={isSorted ? (sort!.direction === 'asc' ? 'ascending' : 'descending') : undefined}\n >\n {column.sortable ? (\n <button type=\"button\" className={classes.sortButton} data-sorted={isSorted || undefined} onClick={() => toggleSort(id)}>\n {column.header}\n <SortIcon size={12} stroke={2.5} opacity={isSorted ? 1 : 0.5} />\n </button>\n ) : (\n column.header\n )}\n </Table.Th>\n );\n })}\n </Table.Tr>\n </Table.Thead>\n );\n\n let body: React.ReactNode;\n if (loading) {\n body = Array.from({ length: loadingRows }, (_, i) => (\n <Table.Tr key={i}>\n {columns.map((column) => (\n <Table.Td key={columnId(column)}>\n <Skeleton height={14} width={column.numeric ? '50%' : '80%'} ml={column.numeric ? 'auto' : 0} />\n </Table.Td>\n ))}\n </Table.Tr>\n ));\n } else if (visible.length === 0) {\n body = (\n <Table.Tr>\n <Table.Td colSpan={columns.length}>\n {empty ?? (\n <EmptyState\n py=\"xl\"\n size=\"sm\"\n icon={<IconDatabaseOff size={22} />}\n title=\"Nenhum resultado\"\n description=\"Não há dados para exibir com os filtros atuais.\"\n />\n )}\n </Table.Td>\n </Table.Tr>\n );\n } else {\n body = visible.map((row, index) => (\n <Table.Tr\n key={rowKey ? rowKey(row, index) : index}\n className={classes.row}\n data-clickable={onRowClick ? true : undefined}\n onClick={onRowClick ? () => onRowClick(row, index) : undefined}\n tabIndex={onRowClick ? 0 : undefined}\n onKeyDown={\n onRowClick\n ? (event) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n onRowClick(row, index);\n }\n }\n : undefined\n }\n >\n {columns.map((column) => {\n const raw = column.key ? row[column.key] : undefined;\n const content = column.render\n ? column.render(row, index)\n : column.numeric && typeof raw === 'number'\n ? formatNumber(raw, column.format)\n : (raw as React.ReactNode);\n return (\n <Table.Td key={columnId(column)} className={column.numeric ? classes.num : undefined}>\n {content}\n </Table.Td>\n );\n })}\n </Table.Tr>\n ));\n }\n\n return (\n <Box className={classes.wrapper} data-plain={plain || undefined} {...others}>\n <ScrollArea type=\"auto\">\n <Table striped={striped} stickyHeader={stickyHeader} {...tableProps}>\n {header}\n <Table.Tbody>{body}</Table.Tbody>\n </Table>\n </ScrollArea>\n {pageSize && sorted.length > pageSize && (\n <div className={classes.footer}>\n <span>\n {formatNumber((currentPage - 1) * pageSize + 1)}–{formatNumber(Math.min(currentPage * pageSize, sorted.length))} de{' '}\n {formatNumber(sorted.length)}\n </span>\n <Pagination size=\"sm\" total={totalPages} value={currentPage} onChange={setPage} />\n </div>\n )}\n </Box>\n );\n}\nDataTable.displayName = '@jcdecor/ui/DataTable';\n","import { ActionIcon, Button, useComputedColorScheme, useMantineColorScheme, type ActionIconProps } from '@mantine/core';\nimport { IconMoon, IconSun } from '@tabler/icons-react';\n\nexport interface ThemeToggleProps extends Omit<ActionIconProps, 'children'> {\n /** `icon` = ActionIcon · `button` = botão \"Alternar tema\" (como no DS) @default 'icon' */\n as?: 'icon' | 'button';\n label?: string;\n}\n\n/** Alterna entre tema claro e escuro (persistido pelo colorSchemeManager do Mantine). */\nexport function ThemeToggle({ as = 'icon', label = 'Alternar tema', variant, color, size, ...others }: ThemeToggleProps) {\n const { setColorScheme } = useMantineColorScheme();\n const computed = useComputedColorScheme('light', { getInitialValueInEffect: true });\n const toggle = () => setColorScheme(computed === 'dark' ? 'light' : 'dark');\n const Icon = computed === 'dark' ? IconSun : IconMoon;\n\n if (as === 'button') {\n return (\n <Button\n variant={variant ?? 'outline'}\n color={color}\n size={(size as string) ?? 'sm'}\n leftSection={<Icon size={16} />}\n onClick={toggle}\n {...(others as Record<string, unknown>)}\n >\n {label}\n </Button>\n );\n }\n\n return (\n <ActionIcon variant={variant ?? 'subtle'} color={color} size={size ?? 'lg'} onClick={toggle} aria-label={label} title={label} {...others}>\n <Icon size={18} />\n </ActionIcon>\n );\n}\nThemeToggle.displayName = '@jcdecor/ui/ThemeToggle';\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 { Tooltip, luminance } from '@mantine/core';\nimport { useClipboard } from '@mantine/hooks';\nimport classes from './TokenSwatch.module.css';\n\nexport interface TokenSwatchProps extends Omit<React.ComponentProps<'button'>, '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 function TokenSwatch({ name, value, cssVar, copy = 'value', className, ...others }: TokenSwatchProps) {\n const clipboard = useClipboard({ timeout: 1200 });\n const text = copy === 'cssVar' && cssVar ? `var(${cssVar})` : value;\n return (\n <Tooltip label={clipboard.copied ? 'Copiado!' : `Copiar ${text}`} withArrow>\n <button type=\"button\" className={className ? `${classes.swatch} ${className}` : classes.swatch} onClick={() => clipboard.copy(text)} {...others}>\n <div className={classes.color} style={{ background: value }} />\n <div className={classes.info}>\n <div className={classes.name}>{name}</div>\n <div className={classes.hex}>{value}</div>\n {cssVar && <div className={classes.hex}>{cssVar}</div>}\n </div>\n </button>\n </Tooltip>\n );\n}\nTokenSwatch.displayName = '@jcdecor/ui/TokenSwatch';\n\nexport interface ColorRampProps extends React.ComponentProps<'div'> {\n steps: { label: string; value: string; derived?: boolean }[];\n}\n\n/** Rampa de cor horizontal (base → 50). Clique copia o hex. */\nexport function ColorRamp({ steps, className, ...others }: ColorRampProps) {\n const clipboard = useClipboard({ timeout: 1200 });\n return (\n <div className={className ? `${classes.ramp} ${className}` : classes.ramp} {...others}>\n {steps.map((step) => (\n <Tooltip key={step.label} label={clipboard.copied ? 'Copiado!' : step.value} withArrow>\n <button\n type=\"button\"\n className={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}\n {step.derived ? '*' : ''}\n </button>\n </Tooltip>\n ))}\n </div>\n );\n}\nColorRamp.displayName = '@jcdecor/ui/ColorRamp';\n","import { Box, Group, Text, type BoxProps } from '@mantine/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 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 function PriceTag({ value, oldValue, installments, pixDiscount, unit, size = 'md', ...others }: PriceTagProps) {\n return (\n <Box {...others}>\n {oldValue !== undefined && oldValue > value && (\n <Text fz=\"xs\" c=\"var(--ds-text-3)\" td=\"line-through\" aria-label={`Preço anterior ${formatCurrency(oldValue)}`}>\n {formatCurrency(oldValue)}\n </Text>\n )}\n <Group gap={4} align=\"baseline\" wrap=\"nowrap\">\n <Text component=\"span\" fz={valueSize[size]} fw={700} lh={1.2} c=\"var(--ds-primary)\" style={{ fontVariantNumeric: 'tabular-nums' }}>\n {formatCurrency(value)}\n </Text>\n {unit && (\n <Text component=\"span\" fz=\"xs\" c=\"var(--ds-text-3)\" fw={500}>\n {unit}\n </Text>\n )}\n </Group>\n {pixDiscount !== undefined && pixDiscount > 0 && (\n <Text fz=\"xs\" fw={600} c=\"var(--ds-tag-success-color)\">\n {formatCurrency(value * (1 - pixDiscount / 100))} no Pix ({pixDiscount}% off)\n </Text>\n )}\n {installments && installments.count > 1 && (\n <Text fz=\"xs\" c=\"var(--ds-text-2)\">\n ou {installments.count}x de {formatCurrency(value / installments.count)}\n {installments.interestFree !== false ? ' sem juros' : ''}\n </Text>\n )}\n </Box>\n );\n}\nPriceTag.displayName = '@jcdecor/ui/PriceTag';\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","import {\n ActionIcon,\n Button,\n Card,\n Group,\n Rating,\n Text,\n factory,\n useProps,\n useStyles,\n type CardProps,\n type Factory,\n type StylesApiProps,\n} from '@mantine/core';\nimport { Fragment } from 'react';\nimport { IconHeart, IconHeartFilled, IconShoppingCart } from '@tabler/icons-react';\nimport { PriceTag, type PriceTagProps } from '../PriceTag';\nimport { Tag } from '../Tag';\nimport classes from './ProductCard.module.css';\n\nexport type ProductCardStylesNames = 'root' | 'media' | 'badges' | 'favorite' | 'category' | 'name' | 'price' | 'action';\n\nexport interface ProductCardProps\n extends Omit<CardProps, 'classNames' | 'styles' | 'vars' | 'attributes'>,\n StylesApiProps<ProductCardFactory> {\n name: string;\n image: string;\n href?: string;\n category?: string;\n price: number;\n oldPrice?: number;\n installments?: PriceTagProps['installments'];\n pixDiscount?: number;\n unit?: string;\n /** Selos extras (ex.: \"Novo\", \"Frete grátis\") */\n badges?: React.ReactNode[];\n /** Mostra selo \"-X%\" calculado a partir de oldPrice @default true */\n showDiscount?: boolean;\n rating?: number;\n reviews?: number;\n favorite?: boolean;\n onFavoriteChange?: (favorite: boolean) => void;\n actionLabel?: string;\n onAction?: () => void;\n /** Proporção da imagem (largura/altura) @default 1 */\n imageRatio?: number;\n /** Componente do link (ex.: Link do react-router) @default 'a' */\n linkComponent?: React.ElementType;\n}\n\nexport type ProductCardFactory = Factory<{\n props: ProductCardProps;\n ref: HTMLDivElement;\n stylesNames: ProductCardStylesNames;\n}>;\n\n/** Card de produto do e-commerce: imagem, selos, nome, avaliação, preço e CTA. */\nexport const ProductCard = factory<ProductCardFactory>((_props) => {\n const props = useProps('ProductCard', { showDiscount: true, actionLabel: 'Comprar', imageRatio: 1, linkComponent: 'a' }, _props);\n const {\n classNames, className, style, styles, unstyled, vars, attributes,\n name, image, href, category, price, oldPrice, installments, pixDiscount, unit, badges, showDiscount,\n rating, reviews, favorite, onFavoriteChange, actionLabel, onAction, imageRatio, linkComponent: LinkComponent = 'a',\n ...others\n } = props;\n\n const getStyles = useStyles<ProductCardFactory>({\n name: 'ProductCard',\n classes,\n props,\n className,\n style,\n classNames,\n styles,\n unstyled,\n attributes,\n vars,\n });\n\n const discount = oldPrice && oldPrice > price ? Math.round((1 - price / oldPrice) * 100) : 0;\n const linkProps = href ? (LinkComponent === 'a' ? { href } : { to: href, href }) : {};\n const NameComponent: React.ElementType = href ? LinkComponent : 'div';\n\n return (\n <Card {...getStyles('root')} mod={{ interactive: Boolean(href || onAction) }} {...others}>\n <div {...getStyles('media')} style={{ ['--product-ratio' as string]: String(imageRatio) }}>\n <img src={image} alt={name} loading=\"lazy\" />\n <div {...getStyles('badges')}>\n {showDiscount && discount > 0 && (\n <Tag tone=\"error\" variant=\"filled\">\n -{discount}%\n </Tag>\n )}\n {badges?.map((badge, index) => <Fragment key={index}>{badge}</Fragment>)}\n </div>\n {onFavoriteChange && (\n <ActionIcon\n {...getStyles('favorite')}\n variant=\"subtle\"\n color={favorite ? 'danger' : 'obsidian'}\n radius=\"xl\"\n aria-label={favorite ? 'Remover dos favoritos' : 'Adicionar aos favoritos'}\n aria-pressed={favorite}\n onClick={() => onFavoriteChange(!favorite)}\n >\n {favorite ? <IconHeartFilled size={18} /> : <IconHeart size={18} />}\n </ActionIcon>\n )}\n </div>\n {category && <div {...getStyles('category')}>{category}</div>}\n <NameComponent {...linkProps} {...getStyles('name')}>\n {name}\n </NameComponent>\n {rating !== undefined && (\n <Group gap={6} mb=\"xs\">\n <Rating value={rating} fractions={2} readOnly size=\"xs\" color=\"electric.4\" />\n {reviews !== undefined && (\n <Text fz=\"xs\" c=\"var(--ds-text-3)\">\n ({reviews})\n </Text>\n )}\n </Group>\n )}\n <PriceTag\n {...getStyles('price')}\n value={price}\n oldValue={oldPrice}\n installments={installments}\n pixDiscount={pixDiscount}\n unit={unit}\n />\n {onAction && (\n <Button {...getStyles('action')} fullWidth leftSection={<IconShoppingCart size={18} />} onClick={onAction}>\n {actionLabel}\n </Button>\n )}\n </Card>\n );\n});\n\nProductCard.classes = classes;\nProductCard.displayName = '@jcdecor/ui/ProductCard';\n","import { Box, Button, Group, Text, type BoxProps } from '@mantine/core';\nimport { useClipboard } from '@mantine/hooks';\nimport { IconCheck, IconCopy, IconTicket } from '@tabler/icons-react';\n\nexport interface CouponCodeProps extends BoxProps {\n code: string;\n /** Texto do benefício (ex.: \"5% OFF na 1ª compra\") */\n description?: React.ReactNode;\n copyLabel?: string;\n copiedLabel?: string;\n onCopy?: (code: string) => void;\n}\n\n/** Cupom com borda tracejada e botão de copiar. */\nexport function CouponCode({ code, description, copyLabel = 'Copiar', copiedLabel = 'Copiado!', onCopy, ...others }: CouponCodeProps) {\n const clipboard = useClipboard({ timeout: 1600 });\n return (\n <Box\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 {...others}\n >\n <Group justify=\"space-between\" gap=\"sm\" wrap=\"nowrap\">\n <Group gap=\"sm\" wrap=\"nowrap\" style={{ minWidth: 0 }}>\n <IconTicket size={22} color=\"var(--ds-primary)\" style={{ flexShrink: 0 }} />\n <div style={{ minWidth: 0 }}>\n {description && (\n <Text fz=\"xs\" c=\"var(--ds-text-2)\" fw={500}>\n {description}\n </Text>\n )}\n <Text fw={700} fz=\"lg\" lts=\"0.08em\" c=\"var(--ds-primary)\" ff=\"monospace\">\n {code}\n </Text>\n </div>\n </Group>\n <Button\n size=\"sm\"\n variant={clipboard.copied ? 'filled' : 'outline'}\n color={clipboard.copied ? 'evergreen' : undefined}\n leftSection={clipboard.copied ? <IconCheck size={16} /> : <IconCopy size={16} />}\n onClick={() => {\n clipboard.copy(code);\n onCopy?.(code);\n }}\n >\n {clipboard.copied ? copiedLabel : copyLabel}\n </Button>\n </Group>\n </Box>\n );\n}\nCouponCode.displayName = '@jcdecor/ui/CouponCode';\n"],"mappings":"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"}
|