@snksergio/design-system 0.67.0 → 0.68.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-lib/ai/componentes/AppShell.md +1 -1
- package/dist-lib/ai/componentes/Chip.md +11 -0
- package/dist-lib/ai/componentes/Combobox.md +23 -0
- package/dist-lib/ai/componentes/DatePicker.md +15 -0
- package/dist-lib/ai/componentes/FileUploadField.md +23 -0
- package/dist-lib/ai/componentes/Header.md +9 -0
- package/dist-lib/ai/componentes/Kpi.md +14 -1
- package/dist-lib/ai/componentes/MenuSidebar.md +3 -3
- package/dist-lib/ai/componentes/PageHeader.md +6 -0
- package/dist-lib/ai/componentes/_primitivos.md +9 -2
- package/dist-lib/ai/global/componentes.md +20 -2
- package/dist-lib/ai/manifest.json +2 -2
- package/dist-lib/shadcn.cjs +1 -0
- package/dist-lib/shadcn.cjs.map +1 -1
- package/dist-lib/shadcn.mjs +2 -1
- package/dist-lib/src/components/shadcn/alert-dialog.cjs +13 -2
- package/dist-lib/src/components/shadcn/alert-dialog.cjs.map +1 -1
- package/dist-lib/src/components/shadcn/alert-dialog.d.ts +21 -1
- package/dist-lib/src/components/shadcn/alert-dialog.d.ts.map +1 -1
- package/dist-lib/src/components/shadcn/alert-dialog.mjs +13 -2
- package/dist-lib/src/components/shadcn/alert-dialog.mjs.map +1 -1
- package/dist-lib/src/components/shadcn/card.cjs +22 -2
- package/dist-lib/src/components/shadcn/card.cjs.map +1 -1
- package/dist-lib/src/components/shadcn/card.d.ts +10 -1
- package/dist-lib/src/components/shadcn/card.d.ts.map +1 -1
- package/dist-lib/src/components/shadcn/card.mjs +22 -2
- package/dist-lib/src/components/shadcn/card.mjs.map +1 -1
- package/dist-lib/src/components/shadcn/clickable-surface.cjs +28 -4
- package/dist-lib/src/components/shadcn/clickable-surface.cjs.map +1 -1
- package/dist-lib/src/components/shadcn/clickable-surface.d.ts +26 -2
- package/dist-lib/src/components/shadcn/clickable-surface.d.ts.map +1 -1
- package/dist-lib/src/components/shadcn/clickable-surface.mjs +28 -4
- package/dist-lib/src/components/shadcn/clickable-surface.mjs.map +1 -1
- package/dist-lib/src/components/shadcn/command.cjs +26 -5
- package/dist-lib/src/components/shadcn/command.cjs.map +1 -1
- package/dist-lib/src/components/shadcn/command.d.ts +49 -2
- package/dist-lib/src/components/shadcn/command.d.ts.map +1 -1
- package/dist-lib/src/components/shadcn/command.mjs +26 -5
- package/dist-lib/src/components/shadcn/command.mjs.map +1 -1
- package/dist-lib/src/components/shadcn/input-group.d.ts +1 -1
- package/dist-lib/src/components/shadcn/input-otp.d.ts +1 -1
- package/dist-lib/src/components/shadcn/input.d.ts +1 -1
- package/dist-lib/src/components/shadcn/sheet.d.ts +1 -1
- package/dist-lib/src/components/ui/AppShell/app-shell.types.d.ts +1 -1
- package/dist-lib/src/components/ui/Chip/chip.cjs +7 -0
- package/dist-lib/src/components/ui/Chip/chip.cjs.map +1 -1
- package/dist-lib/src/components/ui/Chip/chip.d.ts.map +1 -1
- package/dist-lib/src/components/ui/Chip/chip.mjs +7 -0
- package/dist-lib/src/components/ui/Chip/chip.mjs.map +1 -1
- package/dist-lib/src/components/ui/Chip/chip.styles.cjs.map +1 -1
- package/dist-lib/src/components/ui/Chip/chip.styles.mjs.map +1 -1
- package/dist-lib/src/components/ui/Combobox/combobox.cjs +60 -22
- package/dist-lib/src/components/ui/Combobox/combobox.cjs.map +1 -1
- package/dist-lib/src/components/ui/Combobox/combobox.d.ts +2 -1
- package/dist-lib/src/components/ui/Combobox/combobox.d.ts.map +1 -1
- package/dist-lib/src/components/ui/Combobox/combobox.mjs +44 -22
- package/dist-lib/src/components/ui/Combobox/combobox.mjs.map +1 -1
- package/dist-lib/src/components/ui/Combobox/combobox.styles.cjs +5 -1
- package/dist-lib/src/components/ui/Combobox/combobox.styles.cjs.map +1 -1
- package/dist-lib/src/components/ui/Combobox/combobox.styles.d.ts +18 -0
- package/dist-lib/src/components/ui/Combobox/combobox.styles.d.ts.map +1 -1
- package/dist-lib/src/components/ui/Combobox/combobox.styles.mjs +5 -1
- package/dist-lib/src/components/ui/Combobox/combobox.styles.mjs.map +1 -1
- package/dist-lib/src/components/ui/Combobox/combobox.types.d.ts +21 -0
- package/dist-lib/src/components/ui/Combobox/combobox.types.d.ts.map +1 -1
- package/dist-lib/src/components/ui/DatePicker/datepicker.cjs +21 -3
- package/dist-lib/src/components/ui/DatePicker/datepicker.cjs.map +1 -1
- package/dist-lib/src/components/ui/DatePicker/datepicker.d.ts +10 -0
- package/dist-lib/src/components/ui/DatePicker/datepicker.d.ts.map +1 -1
- package/dist-lib/src/components/ui/DatePicker/datepicker.mjs +21 -3
- package/dist-lib/src/components/ui/DatePicker/datepicker.mjs.map +1 -1
- package/dist-lib/src/components/ui/FileUploadField/file-upload-field.cjs +1 -4
- package/dist-lib/src/components/ui/FileUploadField/file-upload-field.cjs.map +1 -1
- package/dist-lib/src/components/ui/FileUploadField/file-upload-field.d.ts.map +1 -1
- package/dist-lib/src/components/ui/FileUploadField/file-upload-field.mjs +1 -4
- package/dist-lib/src/components/ui/FileUploadField/file-upload-field.mjs.map +1 -1
- package/dist-lib/src/components/ui/FileUploadField/file-upload-field.types.d.ts +6 -0
- package/dist-lib/src/components/ui/FileUploadField/file-upload-field.types.d.ts.map +1 -1
- package/dist-lib/src/components/ui/Header/header-search.cjs +6 -4
- package/dist-lib/src/components/ui/Header/header-search.cjs.map +1 -1
- package/dist-lib/src/components/ui/Header/header-search.d.ts +14 -3
- package/dist-lib/src/components/ui/Header/header-search.d.ts.map +1 -1
- package/dist-lib/src/components/ui/Header/header-search.mjs +6 -4
- package/dist-lib/src/components/ui/Header/header-search.mjs.map +1 -1
- package/dist-lib/src/components/ui/Kpi/kpi-delta.cjs +5 -0
- package/dist-lib/src/components/ui/Kpi/kpi-delta.cjs.map +1 -1
- package/dist-lib/src/components/ui/Kpi/kpi-delta.d.ts.map +1 -1
- package/dist-lib/src/components/ui/Kpi/kpi-delta.mjs +5 -0
- package/dist-lib/src/components/ui/Kpi/kpi-delta.mjs.map +1 -1
- package/dist-lib/src/components/ui/Kpi/kpi-group.cjs.map +1 -1
- package/dist-lib/src/components/ui/Kpi/kpi-group.mjs.map +1 -1
- package/dist-lib/src/components/ui/Kpi/kpi.cjs +8 -3
- package/dist-lib/src/components/ui/Kpi/kpi.cjs.map +1 -1
- package/dist-lib/src/components/ui/Kpi/kpi.d.ts +1 -1
- package/dist-lib/src/components/ui/Kpi/kpi.d.ts.map +1 -1
- package/dist-lib/src/components/ui/Kpi/kpi.mjs +8 -3
- package/dist-lib/src/components/ui/Kpi/kpi.mjs.map +1 -1
- package/dist-lib/src/components/ui/Kpi/kpi.types.d.ts +9 -0
- package/dist-lib/src/components/ui/Kpi/kpi.types.d.ts.map +1 -1
- package/dist-lib/src/components/ui/MenuSidebar/sidebar.types.d.ts +1 -1
- package/dist-lib/src/components/ui/PageHeader/page-header.styles.cjs +4 -1
- package/dist-lib/src/components/ui/PageHeader/page-header.styles.cjs.map +1 -1
- package/dist-lib/src/components/ui/PageHeader/page-header.styles.d.ts +9 -0
- package/dist-lib/src/components/ui/PageHeader/page-header.styles.d.ts.map +1 -1
- package/dist-lib/src/components/ui/PageHeader/page-header.styles.mjs +4 -1
- package/dist-lib/src/components/ui/PageHeader/page-header.styles.mjs.map +1 -1
- package/dist-lib/src/components/ui/PageHeader/page-header.types.d.ts +11 -4
- package/dist-lib/src/components/ui/PageHeader/page-header.types.d.ts.map +1 -1
- package/dist-lib/src/components/ui/Table/table-span-row.cjs.map +1 -1
- package/dist-lib/src/components/ui/Table/table-span-row.mjs.map +1 -1
- package/dist-lib/src/lib/utils.cjs.map +1 -1
- package/dist-lib/src/lib/utils.mjs.map +1 -1
- package/dist-lib/src/utils/tv.cjs.map +1 -1
- package/dist-lib/src/utils/tv.mjs.map +1 -1
- package/dist-lib/src/utils/tw-merge-config.cjs.map +1 -1
- package/dist-lib/src/utils/tw-merge-config.mjs.map +1 -1
- package/dist-lib/src/utils/use-title-se-truncado.cjs +34 -0
- package/dist-lib/src/utils/use-title-se-truncado.cjs.map +1 -0
- package/dist-lib/src/utils/use-title-se-truncado.d.ts +30 -0
- package/dist-lib/src/utils/use-title-se-truncado.d.ts.map +1 -0
- package/dist-lib/src/utils/use-title-se-truncado.mjs +34 -0
- package/dist-lib/src/utils/use-title-se-truncado.mjs.map +1 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table-span-row.cjs","sources":["../../../../../src/components/ui/Table/table-span-row.tsx"],"sourcesContent":["\"use client\";\n\nimport { forwardRef, type ReactNode } from \"react\";\n\nimport { cn } from \"@/lib/utils\";\nimport { useTableContext } from \"./table\";\n\n/**\n * TableSpanRow — a linha que ocupa a largura inteira da tabela.\n *\n * É a resposta do `Table` ao `colSpan`: aqui a tabela é um grid de `<div>`, não um\n * `<table>`, então não existe atributo `colSpan` pra esticar uma célula. Sem esta peça,\n * \"nenhum resultado\", \"carregando\" e cabeçalho de grupo eram montados com uma `TableRow`\n * de uma célula só — que respeita a largura da PRIMEIRA coluna e deixa o texto espremido\n * num canto, com o resto da linha vazio.\n *\n * `sticky` gruda a linha à esquerda no scroll horizontal: numa tabela larga, o \"nenhum\n * resultado\" sumia de vista ao rolar pro lado.\n */\nexport type TableSpanRowProps = {\n children: ReactNode;\n /** Altura mínima. Default: `\"row\"` (a altura de linha da densidade). */\n height?: \"row\" | \"auto\";\n /**\n * Mantém o conteúdo visível na rolagem horizontal. Default `true` — numa tabela mais\n * larga que a viewport, o texto centralizado some ao rolar.\n */\n sticky?: boolean;\n /** Alinhamento horizontal do conteúdo. Default `\"center\"`. */\n align?: \"left\" | \"center\";\n className?: string;\n};\n\nconst ALTURA = {\n compact: \"min-h-[40px]\",\n standard: \"min-h-[56px]\",\n comfortable: \"min-h-[72px]\",\n} as const;\n\nexport const TableSpanRow = forwardRef<HTMLDivElement, TableSpanRowProps>(\n function TableSpanRow(\n { children, height = \"row\", sticky = true, align = \"center\", className },\n ref,\n ) {\n const { density } = useTableContext();\n\n return (\n <div\n ref={ref}\n role=\"row\"\n className={cn(\n \"flex w-full border-b border-border-table bg-bg-table last:border-b-0\",\n height === \"row\" && ALTURA[density],\n )}\n >\n <div\n role=\"cell\"\n className={cn(\n \"flex w-full items-center px-pad-2xl py-pad-xl\",\n \"text-body-sm text-fg-muted\",\n align === \"center\" ? \"justify-center\" : \"justify-start\",\n className,\n )}\n >\n {/*\n O `sticky` fica no CONTEÚDO, não na célula: a célula tem a largura total do\n grid (que pode ser bem maior que a tela), então grudá-la não adianta. É o\n texto que precisa acompanhar a rolagem lateral.\n */}\n <span className={cn(\"min-w-0\", sticky && \"sticky left-pad-2xl\")}>{children}</span>\n </div>\n </div>\n );\n },\n);\n"],"names":["forwardRef","TableSpanRow","useTableContext","jsx","cn"],"mappings":";;;;;;AAiCA,MAAM,SAAS;AAAA,EACb,SAAS;AAAA,EACT,UAAU;AAAA,EACV,aAAa;AACf;AAEO,MAAM,eAAeA,MAAAA;AAAAA,EAC1B,SAASC,cACP,EAAE,UAAU,SAAS,OAAO,SAAS,MAAM,QAAQ,UAAU,UAAA,GAC7D,KACA;AACA,UAAM,EAAE,QAAA,IAAYC,sBAAA;AAEpB,WACEC,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA,MAAK;AAAA,QACL,WAAWC,MAAAA;AAAAA,UACT;AAAA,UACA,WAAW,SAAS,OAAO,OAAO;AAAA,QAAA;AAAA,QAGpC,UAAAD,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAWC,MAAAA;AAAAA,cACT;AAAA,cACA;AAAA,cACA,UAAU,WAAW,mBAAmB;AAAA,cACxC;AAAA,YAAA;AAAA,YAQF,UAAAD,2BAAAA,IAAC,UAAK,WAAWC,SAAG,WAAW,UAAU,qBAAqB,GAAI,SAAA,CAAS;AAAA,UAAA;AAAA,QAAA;AAAA,MAC7E;AAAA,IAAA;AAAA,EAGN;AACF;;"}
|
|
1
|
+
{"version":3,"file":"table-span-row.cjs","sources":["../../../../../src/components/ui/Table/table-span-row.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport { forwardRef, type ReactNode } from \"react\";\r\n\r\nimport { cn } from \"@/lib/utils\";\r\nimport { useTableContext } from \"./table\";\r\n\r\n/**\r\n * TableSpanRow — a linha que ocupa a largura inteira da tabela.\r\n *\r\n * É a resposta do `Table` ao `colSpan`: aqui a tabela é um grid de `<div>`, não um\r\n * `<table>`, então não existe atributo `colSpan` pra esticar uma célula. Sem esta peça,\r\n * \"nenhum resultado\", \"carregando\" e cabeçalho de grupo eram montados com uma `TableRow`\r\n * de uma célula só — que respeita a largura da PRIMEIRA coluna e deixa o texto espremido\r\n * num canto, com o resto da linha vazio.\r\n *\r\n * `sticky` gruda a linha à esquerda no scroll horizontal: numa tabela larga, o \"nenhum\r\n * resultado\" sumia de vista ao rolar pro lado.\r\n */\r\nexport type TableSpanRowProps = {\r\n children: ReactNode;\r\n /** Altura mínima. Default: `\"row\"` (a altura de linha da densidade). */\r\n height?: \"row\" | \"auto\";\r\n /**\r\n * Mantém o conteúdo visível na rolagem horizontal. Default `true` — numa tabela mais\r\n * larga que a viewport, o texto centralizado some ao rolar.\r\n */\r\n sticky?: boolean;\r\n /** Alinhamento horizontal do conteúdo. Default `\"center\"`. */\r\n align?: \"left\" | \"center\";\r\n className?: string;\r\n};\r\n\r\nconst ALTURA = {\r\n compact: \"min-h-[40px]\",\r\n standard: \"min-h-[56px]\",\r\n comfortable: \"min-h-[72px]\",\r\n} as const;\r\n\r\nexport const TableSpanRow = forwardRef<HTMLDivElement, TableSpanRowProps>(\r\n function TableSpanRow(\r\n { children, height = \"row\", sticky = true, align = \"center\", className },\r\n ref,\r\n ) {\r\n const { density } = useTableContext();\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n role=\"row\"\r\n className={cn(\r\n \"flex w-full border-b border-border-table bg-bg-table last:border-b-0\",\r\n height === \"row\" && ALTURA[density],\r\n )}\r\n >\r\n <div\r\n role=\"cell\"\r\n className={cn(\r\n \"flex w-full items-center px-pad-2xl py-pad-xl\",\r\n \"text-body-sm text-fg-muted\",\r\n align === \"center\" ? \"justify-center\" : \"justify-start\",\r\n className,\r\n )}\r\n >\r\n {/*\r\n O `sticky` fica no CONTEÚDO, não na célula: a célula tem a largura total do\r\n grid (que pode ser bem maior que a tela), então grudá-la não adianta. É o\r\n texto que precisa acompanhar a rolagem lateral.\r\n */}\r\n <span className={cn(\"min-w-0\", sticky && \"sticky left-pad-2xl\")}>{children}</span>\r\n </div>\r\n </div>\r\n );\r\n },\r\n);\r\n"],"names":["forwardRef","TableSpanRow","useTableContext","jsx","cn"],"mappings":";;;;;;AAiCA,MAAM,SAAS;AAAA,EACb,SAAS;AAAA,EACT,UAAU;AAAA,EACV,aAAa;AACf;AAEO,MAAM,eAAeA,MAAAA;AAAAA,EAC1B,SAASC,cACP,EAAE,UAAU,SAAS,OAAO,SAAS,MAAM,QAAQ,UAAU,UAAA,GAC7D,KACA;AACA,UAAM,EAAE,QAAA,IAAYC,sBAAA;AAEpB,WACEC,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA,MAAK;AAAA,QACL,WAAWC,MAAAA;AAAAA,UACT;AAAA,UACA,WAAW,SAAS,OAAO,OAAO;AAAA,QAAA;AAAA,QAGpC,UAAAD,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAWC,MAAAA;AAAAA,cACT;AAAA,cACA;AAAA,cACA,UAAU,WAAW,mBAAmB;AAAA,cACxC;AAAA,YAAA;AAAA,YAQF,UAAAD,2BAAAA,IAAC,UAAK,WAAWC,SAAG,WAAW,UAAU,qBAAqB,GAAI,SAAA,CAAS;AAAA,UAAA;AAAA,QAAA;AAAA,MAC7E;AAAA,IAAA;AAAA,EAGN;AACF;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table-span-row.mjs","sources":["../../../../../src/components/ui/Table/table-span-row.tsx"],"sourcesContent":["\"use client\";\n\nimport { forwardRef, type ReactNode } from \"react\";\n\nimport { cn } from \"@/lib/utils\";\nimport { useTableContext } from \"./table\";\n\n/**\n * TableSpanRow — a linha que ocupa a largura inteira da tabela.\n *\n * É a resposta do `Table` ao `colSpan`: aqui a tabela é um grid de `<div>`, não um\n * `<table>`, então não existe atributo `colSpan` pra esticar uma célula. Sem esta peça,\n * \"nenhum resultado\", \"carregando\" e cabeçalho de grupo eram montados com uma `TableRow`\n * de uma célula só — que respeita a largura da PRIMEIRA coluna e deixa o texto espremido\n * num canto, com o resto da linha vazio.\n *\n * `sticky` gruda a linha à esquerda no scroll horizontal: numa tabela larga, o \"nenhum\n * resultado\" sumia de vista ao rolar pro lado.\n */\nexport type TableSpanRowProps = {\n children: ReactNode;\n /** Altura mínima. Default: `\"row\"` (a altura de linha da densidade). */\n height?: \"row\" | \"auto\";\n /**\n * Mantém o conteúdo visível na rolagem horizontal. Default `true` — numa tabela mais\n * larga que a viewport, o texto centralizado some ao rolar.\n */\n sticky?: boolean;\n /** Alinhamento horizontal do conteúdo. Default `\"center\"`. */\n align?: \"left\" | \"center\";\n className?: string;\n};\n\nconst ALTURA = {\n compact: \"min-h-[40px]\",\n standard: \"min-h-[56px]\",\n comfortable: \"min-h-[72px]\",\n} as const;\n\nexport const TableSpanRow = forwardRef<HTMLDivElement, TableSpanRowProps>(\n function TableSpanRow(\n { children, height = \"row\", sticky = true, align = \"center\", className },\n ref,\n ) {\n const { density } = useTableContext();\n\n return (\n <div\n ref={ref}\n role=\"row\"\n className={cn(\n \"flex w-full border-b border-border-table bg-bg-table last:border-b-0\",\n height === \"row\" && ALTURA[density],\n )}\n >\n <div\n role=\"cell\"\n className={cn(\n \"flex w-full items-center px-pad-2xl py-pad-xl\",\n \"text-body-sm text-fg-muted\",\n align === \"center\" ? \"justify-center\" : \"justify-start\",\n className,\n )}\n >\n {/*\n O `sticky` fica no CONTEÚDO, não na célula: a célula tem a largura total do\n grid (que pode ser bem maior que a tela), então grudá-la não adianta. É o\n texto que precisa acompanhar a rolagem lateral.\n */}\n <span className={cn(\"min-w-0\", sticky && \"sticky left-pad-2xl\")}>{children}</span>\n </div>\n </div>\n );\n },\n);\n"],"names":["TableSpanRow"],"mappings":";;;;AAiCA,MAAM,SAAS;AAAA,EACb,SAAS;AAAA,EACT,UAAU;AAAA,EACV,aAAa;AACf;AAEO,MAAM,eAAe;AAAA,EAC1B,SAASA,cACP,EAAE,UAAU,SAAS,OAAO,SAAS,MAAM,QAAQ,UAAU,UAAA,GAC7D,KACA;AACA,UAAM,EAAE,QAAA,IAAY,gBAAA;AAEpB,WACE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA,MAAK;AAAA,QACL,WAAW;AAAA,UACT;AAAA,UACA,WAAW,SAAS,OAAO,OAAO;AAAA,QAAA;AAAA,QAGpC,UAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAW;AAAA,cACT;AAAA,cACA;AAAA,cACA,UAAU,WAAW,mBAAmB;AAAA,cACxC;AAAA,YAAA;AAAA,YAQF,UAAA,oBAAC,UAAK,WAAW,GAAG,WAAW,UAAU,qBAAqB,GAAI,SAAA,CAAS;AAAA,UAAA;AAAA,QAAA;AAAA,MAC7E;AAAA,IAAA;AAAA,EAGN;AACF;"}
|
|
1
|
+
{"version":3,"file":"table-span-row.mjs","sources":["../../../../../src/components/ui/Table/table-span-row.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport { forwardRef, type ReactNode } from \"react\";\r\n\r\nimport { cn } from \"@/lib/utils\";\r\nimport { useTableContext } from \"./table\";\r\n\r\n/**\r\n * TableSpanRow — a linha que ocupa a largura inteira da tabela.\r\n *\r\n * É a resposta do `Table` ao `colSpan`: aqui a tabela é um grid de `<div>`, não um\r\n * `<table>`, então não existe atributo `colSpan` pra esticar uma célula. Sem esta peça,\r\n * \"nenhum resultado\", \"carregando\" e cabeçalho de grupo eram montados com uma `TableRow`\r\n * de uma célula só — que respeita a largura da PRIMEIRA coluna e deixa o texto espremido\r\n * num canto, com o resto da linha vazio.\r\n *\r\n * `sticky` gruda a linha à esquerda no scroll horizontal: numa tabela larga, o \"nenhum\r\n * resultado\" sumia de vista ao rolar pro lado.\r\n */\r\nexport type TableSpanRowProps = {\r\n children: ReactNode;\r\n /** Altura mínima. Default: `\"row\"` (a altura de linha da densidade). */\r\n height?: \"row\" | \"auto\";\r\n /**\r\n * Mantém o conteúdo visível na rolagem horizontal. Default `true` — numa tabela mais\r\n * larga que a viewport, o texto centralizado some ao rolar.\r\n */\r\n sticky?: boolean;\r\n /** Alinhamento horizontal do conteúdo. Default `\"center\"`. */\r\n align?: \"left\" | \"center\";\r\n className?: string;\r\n};\r\n\r\nconst ALTURA = {\r\n compact: \"min-h-[40px]\",\r\n standard: \"min-h-[56px]\",\r\n comfortable: \"min-h-[72px]\",\r\n} as const;\r\n\r\nexport const TableSpanRow = forwardRef<HTMLDivElement, TableSpanRowProps>(\r\n function TableSpanRow(\r\n { children, height = \"row\", sticky = true, align = \"center\", className },\r\n ref,\r\n ) {\r\n const { density } = useTableContext();\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n role=\"row\"\r\n className={cn(\r\n \"flex w-full border-b border-border-table bg-bg-table last:border-b-0\",\r\n height === \"row\" && ALTURA[density],\r\n )}\r\n >\r\n <div\r\n role=\"cell\"\r\n className={cn(\r\n \"flex w-full items-center px-pad-2xl py-pad-xl\",\r\n \"text-body-sm text-fg-muted\",\r\n align === \"center\" ? \"justify-center\" : \"justify-start\",\r\n className,\r\n )}\r\n >\r\n {/*\r\n O `sticky` fica no CONTEÚDO, não na célula: a célula tem a largura total do\r\n grid (que pode ser bem maior que a tela), então grudá-la não adianta. É o\r\n texto que precisa acompanhar a rolagem lateral.\r\n */}\r\n <span className={cn(\"min-w-0\", sticky && \"sticky left-pad-2xl\")}>{children}</span>\r\n </div>\r\n </div>\r\n );\r\n },\r\n);\r\n"],"names":["TableSpanRow"],"mappings":";;;;AAiCA,MAAM,SAAS;AAAA,EACb,SAAS;AAAA,EACT,UAAU;AAAA,EACV,aAAa;AACf;AAEO,MAAM,eAAe;AAAA,EAC1B,SAASA,cACP,EAAE,UAAU,SAAS,OAAO,SAAS,MAAM,QAAQ,UAAU,UAAA,GAC7D,KACA;AACA,UAAM,EAAE,QAAA,IAAY,gBAAA;AAEpB,WACE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA,MAAK;AAAA,QACL,WAAW;AAAA,UACT;AAAA,UACA,WAAW,SAAS,OAAO,OAAO;AAAA,QAAA;AAAA,QAGpC,UAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAW;AAAA,cACT;AAAA,cACA;AAAA,cACA,UAAU,WAAW,mBAAmB;AAAA,cACxC;AAAA,YAAA;AAAA,YAQF,UAAA,oBAAC,UAAK,WAAW,GAAG,WAAW,UAAU,qBAAqB,GAAI,SAAA,CAAS;AAAA,UAAA;AAAA,QAAA;AAAA,MAC7E;AAAA,IAAA;AAAA,EAGN;AACF;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.cjs","sources":["../../../src/lib/utils.ts"],"sourcesContent":["import { type ClassValue, clsx } from \"clsx\";\nimport { extendTailwindMerge } from \"tailwind-merge\";\n\nimport { twMergeConfig } from \"@/utils/tw-merge-config\";\n\n/**\n * `cn` — junta classes (clsx) e resolve conflito (tailwind-merge).\n *\n * A config do merge mora em `src/utils/tw-merge-config.ts` e é a MESMA usada pelo `tv()`\n * do DS. Antes cada um tinha a sua, com um comentário aqui pedindo sincronia manual que\n * nunca existiu — a de `tv` só conhecia os presets tipográficos.\n */\nconst twMerge = extendTailwindMerge(twMergeConfig);\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n"],"names":["extendTailwindMerge","twMergeConfig","clsx"],"mappings":";;;;;AAYA,MAAM,UAAUA,cAAAA,oBAAoBC,2BAAa;AAE1C,SAAS,MAAM,QAAsB;AAC1C,SAAO,QAAQC,UAAK,MAAM,CAAC;AAC7B;;"}
|
|
1
|
+
{"version":3,"file":"utils.cjs","sources":["../../../src/lib/utils.ts"],"sourcesContent":["import { type ClassValue, clsx } from \"clsx\";\r\nimport { extendTailwindMerge } from \"tailwind-merge\";\r\n\r\nimport { twMergeConfig } from \"@/utils/tw-merge-config\";\r\n\r\n/**\r\n * `cn` — junta classes (clsx) e resolve conflito (tailwind-merge).\r\n *\r\n * A config do merge mora em `src/utils/tw-merge-config.ts` e é a MESMA usada pelo `tv()`\r\n * do DS. Antes cada um tinha a sua, com um comentário aqui pedindo sincronia manual que\r\n * nunca existiu — a de `tv` só conhecia os presets tipográficos.\r\n */\r\nconst twMerge = extendTailwindMerge(twMergeConfig);\r\n\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs));\r\n}\r\n"],"names":["extendTailwindMerge","twMergeConfig","clsx"],"mappings":";;;;;AAYA,MAAM,UAAUA,cAAAA,oBAAoBC,2BAAa;AAE1C,SAAS,MAAM,QAAsB;AAC1C,SAAO,QAAQC,UAAK,MAAM,CAAC;AAC7B;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.mjs","sources":["../../../src/lib/utils.ts"],"sourcesContent":["import { type ClassValue, clsx } from \"clsx\";\nimport { extendTailwindMerge } from \"tailwind-merge\";\n\nimport { twMergeConfig } from \"@/utils/tw-merge-config\";\n\n/**\n * `cn` — junta classes (clsx) e resolve conflito (tailwind-merge).\n *\n * A config do merge mora em `src/utils/tw-merge-config.ts` e é a MESMA usada pelo `tv()`\n * do DS. Antes cada um tinha a sua, com um comentário aqui pedindo sincronia manual que\n * nunca existiu — a de `tv` só conhecia os presets tipográficos.\n */\nconst twMerge = extendTailwindMerge(twMergeConfig);\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n"],"names":[],"mappings":";;;AAYA,MAAM,UAAU,oBAAoB,aAAa;AAE1C,SAAS,MAAM,QAAsB;AAC1C,SAAO,QAAQ,KAAK,MAAM,CAAC;AAC7B;"}
|
|
1
|
+
{"version":3,"file":"utils.mjs","sources":["../../../src/lib/utils.ts"],"sourcesContent":["import { type ClassValue, clsx } from \"clsx\";\r\nimport { extendTailwindMerge } from \"tailwind-merge\";\r\n\r\nimport { twMergeConfig } from \"@/utils/tw-merge-config\";\r\n\r\n/**\r\n * `cn` — junta classes (clsx) e resolve conflito (tailwind-merge).\r\n *\r\n * A config do merge mora em `src/utils/tw-merge-config.ts` e é a MESMA usada pelo `tv()`\r\n * do DS. Antes cada um tinha a sua, com um comentário aqui pedindo sincronia manual que\r\n * nunca existiu — a de `tv` só conhecia os presets tipográficos.\r\n */\r\nconst twMerge = extendTailwindMerge(twMergeConfig);\r\n\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs));\r\n}\r\n"],"names":[],"mappings":";;;AAYA,MAAM,UAAU,oBAAoB,aAAa;AAE1C,SAAS,MAAM,QAAsB;AAC1C,SAAO,QAAQ,KAAK,MAAM,CAAC;AAC7B;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tv.cjs","sources":["../../../src/utils/tv.ts"],"sourcesContent":["// src/utils/tv.ts\n// tv() do DS — mesmo `tailwind-variants`, com a config de merge do design system.\n//\n// Importe SEMPRE daqui, nunca de \"tailwind-variants\" direto (gate: regra IMPORT do\n// ds-lint-patterns). Sem o wrapper, o merge não reconhece nenhum token do DS.\nimport { tv as tvBase, type TVConfig } from \"tailwind-variants\";\n\nimport { twMergeConfig } from \"./tw-merge-config\";\n\nexport const tv: typeof tvBase = (options, config) =>\n tvBase(options, {\n ...config,\n twMergeConfig,\n } as TVConfig);\n\nexport type { VariantProps } from \"tailwind-variants\";\n"],"names":["tvBase","twMergeConfig"],"mappings":";;;;AASO,MAAM,KAAoB,CAAC,SAAS,WACzCA,iBAAAA,GAAO,SAAS;AAAA,EACd,GAAG;AAAA,EAAA,eACHC,cAAAA;AACF,CAAa;;"}
|
|
1
|
+
{"version":3,"file":"tv.cjs","sources":["../../../src/utils/tv.ts"],"sourcesContent":["// src/utils/tv.ts\r\n// tv() do DS — mesmo `tailwind-variants`, com a config de merge do design system.\r\n//\r\n// Importe SEMPRE daqui, nunca de \"tailwind-variants\" direto (gate: regra IMPORT do\r\n// ds-lint-patterns). Sem o wrapper, o merge não reconhece nenhum token do DS.\r\nimport { tv as tvBase, type TVConfig } from \"tailwind-variants\";\r\n\r\nimport { twMergeConfig } from \"./tw-merge-config\";\r\n\r\nexport const tv: typeof tvBase = (options, config) =>\r\n tvBase(options, {\r\n ...config,\r\n twMergeConfig,\r\n } as TVConfig);\r\n\r\nexport type { VariantProps } from \"tailwind-variants\";\r\n"],"names":["tvBase","twMergeConfig"],"mappings":";;;;AASO,MAAM,KAAoB,CAAC,SAAS,WACzCA,iBAAAA,GAAO,SAAS;AAAA,EACd,GAAG;AAAA,EAAA,eACHC,cAAAA;AACF,CAAa;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tv.mjs","sources":["../../../src/utils/tv.ts"],"sourcesContent":["// src/utils/tv.ts\n// tv() do DS — mesmo `tailwind-variants`, com a config de merge do design system.\n//\n// Importe SEMPRE daqui, nunca de \"tailwind-variants\" direto (gate: regra IMPORT do\n// ds-lint-patterns). Sem o wrapper, o merge não reconhece nenhum token do DS.\nimport { tv as tvBase, type TVConfig } from \"tailwind-variants\";\n\nimport { twMergeConfig } from \"./tw-merge-config\";\n\nexport const tv: typeof tvBase = (options, config) =>\n tvBase(options, {\n ...config,\n twMergeConfig,\n } as TVConfig);\n\nexport type { VariantProps } from \"tailwind-variants\";\n"],"names":["tvBase"],"mappings":";;AASO,MAAM,KAAoB,CAAC,SAAS,WACzCA,KAAO,SAAS;AAAA,EACd,GAAG;AAAA,EACH;AACF,CAAa;"}
|
|
1
|
+
{"version":3,"file":"tv.mjs","sources":["../../../src/utils/tv.ts"],"sourcesContent":["// src/utils/tv.ts\r\n// tv() do DS — mesmo `tailwind-variants`, com a config de merge do design system.\r\n//\r\n// Importe SEMPRE daqui, nunca de \"tailwind-variants\" direto (gate: regra IMPORT do\r\n// ds-lint-patterns). Sem o wrapper, o merge não reconhece nenhum token do DS.\r\nimport { tv as tvBase, type TVConfig } from \"tailwind-variants\";\r\n\r\nimport { twMergeConfig } from \"./tw-merge-config\";\r\n\r\nexport const tv: typeof tvBase = (options, config) =>\r\n tvBase(options, {\r\n ...config,\r\n twMergeConfig,\r\n } as TVConfig);\r\n\r\nexport type { VariantProps } from \"tailwind-variants\";\r\n"],"names":["tvBase"],"mappings":";;AASO,MAAM,KAAoB,CAAC,SAAS,WACzCA,KAAO,SAAS;AAAA,EACd,GAAG;AAAA,EACH;AACF,CAAa;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tw-merge-config.cjs","sources":["../../../src/utils/tw-merge-config.ts"],"sourcesContent":["// src/utils/tw-merge-config.ts\n//\n// FONTE ÚNICA da config do `tailwind-merge` no DS.\n//\n// Existia duplicada: `cn` (src/lib/utils.ts) e `tv` (src/utils/tv.ts) mantinham cada um a\n// sua, com um comentário em `utils.ts` pedindo \"manter sincronizado com src/utils/tv.ts\".\n// Não estavam: a de `tv` tinha só `font-size`, a de `cn` tinha também pad/gap/radius/\n// shadow/form. Componente que fazia merge por `tv()` e componente que fazia por `cn()`\n// resolviam conflito de formas diferentes — e ninguém tinha como saber qual.\n//\n// ⚠️ O que o tailwind-merge NÃO sabe sozinho ele deixa passar em SILÊNCIO: as duas classes\n// sobrevivem no elemento e quem decide é a ordem do CSS, não a ordem do argumento. Nunca\n// dá erro. É a L-016 (onde a classe some) pelo avesso, e a L-072 no caso do `tv()`.\n\nimport { type ClassValidator } from \"tailwind-merge\";\n\n/** Padding/Margin spacing: pad-* (padding contexts), sp-* (geral) */\nconst isDsPad: ClassValidator = (v) => /^(pad|sp)-/.test(v);\n/** Gap: gp-* */\nconst isDsGap: ClassValidator = (v) => /^gp-/.test(v);\n/** Border-radius: radius-* */\nconst isDsRadius: ClassValidator = (v) => /^radius-/.test(v);\n/** Shadow: sh-* */\nconst isDsShadow: ClassValidator = (v) => /^sh-/.test(v);\n/** Form heights: form-* (min-h, h, w, size) */\nconst isDsForm: ClassValidator = (v) => /^form-/.test(v);\n\n/**\n * Escala de container do DS — 1:1 com a chave `container` de\n * `tokens/brands/default/components/sizing.ts`, menos `full` e `prose`, que têm os MESMOS\n * nomes e valores do Tailwind nativo e já são reconhecidos.\n *\n * Entra por `theme.container` (e não por `classGroups`) porque no Tailwind v4 a mesma var\n * `--container-*` alimenta `max-w-*`, `min-w-*`, `w-*`, `basis-*` e as variantes de\n * container query: registrar no tema cobre os cinco de uma vez.\n *\n * Sem isto, `<DialogContent className=\"max-w-modal-sm\">` NÃO vencia o `sm:max-w-[420px]`\n * da base — e nem `max-w-modal-sm` vencia `max-w-modal-lg`, token do DS contra token do\n * DS. O consumidor igreen-tickets precisou prefixar 51 overlays com `sm:` pra contornar,\n * sem saber por quê.\n *\n * Gate que impede drift com o token: `tw-merge-config.test.ts`.\n */\nexport const DS_CONTAINER_SCALE = [\n // Page containers\n \"page-xs\", \"page-sm\", \"page-md\", \"page-lg\", \"page-xl\", \"page-2xl\", \"page-3xl\",\n \"main-content-max\",\n // Component overlays\n \"tooltip-sm\", \"tooltip-md\", \"tooltip-lg\",\n \"dropdown-sm\", \"dropdown-md\", \"dropdown-lg\",\n \"sidebar-sm\", \"sidebar-md\", \"sidebar-lg\",\n \"drawer-sm\", \"drawer-md\", \"drawer-lg\",\n \"modal-xs\", \"modal-sm\", \"modal-md\", \"modal-lg\",\n] as const;\n\n/**\n * Presets tipográficos — 1:1 com `tokens/brands/default/semantic/typography.ts`.\n * Sem isto o tailwind-merge lê `text-title-md` como text-COLOR, colide com\n * `text-fg-default` e remove uma das duas em silêncio (L-016).\n *\n * Gate: `dead-typography-presets` + `tw-merge-config.test.ts`.\n */\nexport const DS_TYPOGRAPHY_PRESETS = [\n // Displays (fluid clamp)\n \"display-2xl\", \"display-xl\", \"display-lg\", \"display-md\",\n // Headings (xs estático, sm-xl fluid clamp)\n \"heading-xl\", \"heading-lg\", \"heading-md\", \"heading-sm\", \"heading-xs\",\n // Titles (weight 600 default)\n \"title-lg\", \"title-md\", \"title-sm\",\n // Body (xs/sm = weight 500 interactive; md-2xl = 400 corrido)\n \"body-2xl\", \"body-xl\", \"body-lg\", \"body-md\", \"body-sm\", \"body-xs\",\n // Captions (weight 400)\n \"caption-md\", \"caption-sm\", \"caption-xs\",\n // Stat (número de métrica/KPI — estático, bold, leading tight)\n \"stat-xl\", \"stat-lg\", \"stat-md\", \"stat-sm\",\n // Code (mono regular)\n \"code-md\", \"code-sm\",\n] as const;\n\n/**\n * Config passada a `extendTailwindMerge` (pelo `cn`) e a `tv()` (pelo wrapper do DS).\n * Os dois caminhos de merge do DS usam ESTE objeto — não há segunda cópia.\n */\nexport const twMergeConfig = {\n extend: {\n theme: {\n container: [...DS_CONTAINER_SCALE],\n },\n classGroups: {\n \"font-size\": [{ text: [...DS_TYPOGRAPHY_PRESETS] }],\n\n /* ── Padding ──────────────────────────────────────────────────────── */\n p: [{ p: [isDsPad] }],\n px: [{ px: [isDsPad] }],\n py: [{ py: [isDsPad] }],\n pt: [{ pt: [isDsPad] }],\n pr: [{ pr: [isDsPad] }],\n pb: [{ pb: [isDsPad] }],\n pl: [{ pl: [isDsPad] }],\n ps: [{ ps: [isDsPad] }],\n pe: [{ pe: [isDsPad] }],\n\n /* ── Margin (usa mesmo sp-*) ──────────────────────────────────────── */\n m: [{ m: [isDsPad] }],\n mx: [{ mx: [isDsPad] }],\n my: [{ my: [isDsPad] }],\n mt: [{ mt: [isDsPad] }],\n mr: [{ mr: [isDsPad] }],\n mb: [{ mb: [isDsPad] }],\n ml: [{ ml: [isDsPad] }],\n ms: [{ ms: [isDsPad] }],\n me: [{ me: [isDsPad] }],\n\n /* ── Inset / position (top/right/bottom/left) ─────────────────────── */\n inset: [{ inset: [isDsPad] }],\n \"inset-x\": [{ \"inset-x\": [isDsPad] }],\n \"inset-y\": [{ \"inset-y\": [isDsPad] }],\n \"top\": [{ top: [isDsPad] }],\n \"right\": [{ right: [isDsPad] }],\n \"bottom\": [{ bottom: [isDsPad] }],\n \"left\": [{ left: [isDsPad] }],\n \"start\": [{ start: [isDsPad] }],\n \"end\": [{ end: [isDsPad] }],\n\n /* ── Gap ──────────────────────────────────────────────────────────── */\n gap: [{ gap: [isDsGap] }],\n \"gap-x\": [{ \"gap-x\": [isDsGap] }],\n \"gap-y\": [{ \"gap-y\": [isDsGap] }],\n\n /* ── Rounded (todas as cantos) ────────────────────────────────────── */\n rounded: [{ rounded: [isDsRadius] }],\n \"rounded-s\": [{ \"rounded-s\": [isDsRadius] }],\n \"rounded-e\": [{ \"rounded-e\": [isDsRadius] }],\n \"rounded-t\": [{ \"rounded-t\": [isDsRadius] }],\n \"rounded-r\": [{ \"rounded-r\": [isDsRadius] }],\n \"rounded-b\": [{ \"rounded-b\": [isDsRadius] }],\n \"rounded-l\": [{ \"rounded-l\": [isDsRadius] }],\n \"rounded-ss\": [{ \"rounded-ss\": [isDsRadius] }],\n \"rounded-se\": [{ \"rounded-se\": [isDsRadius] }],\n \"rounded-ee\": [{ \"rounded-ee\": [isDsRadius] }],\n \"rounded-es\": [{ \"rounded-es\": [isDsRadius] }],\n \"rounded-tl\": [{ \"rounded-tl\": [isDsRadius] }],\n \"rounded-tr\": [{ \"rounded-tr\": [isDsRadius] }],\n \"rounded-br\": [{ \"rounded-br\": [isDsRadius] }],\n \"rounded-bl\": [{ \"rounded-bl\": [isDsRadius] }],\n\n /* ── Shadow ───────────────────────────────────────────────────────── */\n shadow: [{ shadow: [isDsShadow] }],\n\n /* ── Form sizes (min-h, h, w, size) ───────────────────────────────────\n * `w` e `size` recebem TAMBÉM a escala de container pelo `theme` acima;\n * as duas extensões convivem (validator + tema no mesmo grupo). */\n \"min-h\": [{ \"min-h\": [isDsForm] }],\n h: [{ h: [isDsForm] }],\n w: [{ w: [isDsForm] }],\n size: [{ size: [isDsForm] }],\n },\n },\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tw-merge-config.cjs","sources":["../../../src/utils/tw-merge-config.ts"],"sourcesContent":["// src/utils/tw-merge-config.ts\r\n//\r\n// FONTE ÚNICA da config do `tailwind-merge` no DS.\r\n//\r\n// Existia duplicada: `cn` (src/lib/utils.ts) e `tv` (src/utils/tv.ts) mantinham cada um a\r\n// sua, com um comentário em `utils.ts` pedindo \"manter sincronizado com src/utils/tv.ts\".\r\n// Não estavam: a de `tv` tinha só `font-size`, a de `cn` tinha também pad/gap/radius/\r\n// shadow/form. Componente que fazia merge por `tv()` e componente que fazia por `cn()`\r\n// resolviam conflito de formas diferentes — e ninguém tinha como saber qual.\r\n//\r\n// ⚠️ O que o tailwind-merge NÃO sabe sozinho ele deixa passar em SILÊNCIO: as duas classes\r\n// sobrevivem no elemento e quem decide é a ordem do CSS, não a ordem do argumento. Nunca\r\n// dá erro. É a L-016 (onde a classe some) pelo avesso, e a L-072 no caso do `tv()`.\r\n\r\nimport { type ClassValidator } from \"tailwind-merge\";\r\n\r\n/** Padding/Margin spacing: pad-* (padding contexts), sp-* (geral) */\r\nconst isDsPad: ClassValidator = (v) => /^(pad|sp)-/.test(v);\r\n/** Gap: gp-* */\r\nconst isDsGap: ClassValidator = (v) => /^gp-/.test(v);\r\n/** Border-radius: radius-* */\r\nconst isDsRadius: ClassValidator = (v) => /^radius-/.test(v);\r\n/** Shadow: sh-* */\r\nconst isDsShadow: ClassValidator = (v) => /^sh-/.test(v);\r\n/** Form heights: form-* (min-h, h, w, size) */\r\nconst isDsForm: ClassValidator = (v) => /^form-/.test(v);\r\n\r\n/**\r\n * Escala de container do DS — 1:1 com a chave `container` de\r\n * `tokens/brands/default/components/sizing.ts`, menos `full` e `prose`, que têm os MESMOS\r\n * nomes e valores do Tailwind nativo e já são reconhecidos.\r\n *\r\n * Entra por `theme.container` (e não por `classGroups`) porque no Tailwind v4 a mesma var\r\n * `--container-*` alimenta `max-w-*`, `min-w-*`, `w-*`, `basis-*` e as variantes de\r\n * container query: registrar no tema cobre os cinco de uma vez.\r\n *\r\n * Sem isto, `<DialogContent className=\"max-w-modal-sm\">` NÃO vencia o `sm:max-w-[420px]`\r\n * da base — e nem `max-w-modal-sm` vencia `max-w-modal-lg`, token do DS contra token do\r\n * DS. O consumidor igreen-tickets precisou prefixar 51 overlays com `sm:` pra contornar,\r\n * sem saber por quê.\r\n *\r\n * Gate que impede drift com o token: `tw-merge-config.test.ts`.\r\n */\r\nexport const DS_CONTAINER_SCALE = [\r\n // Page containers\r\n \"page-xs\", \"page-sm\", \"page-md\", \"page-lg\", \"page-xl\", \"page-2xl\", \"page-3xl\",\r\n \"main-content-max\",\r\n // Component overlays\r\n \"tooltip-sm\", \"tooltip-md\", \"tooltip-lg\",\r\n \"dropdown-sm\", \"dropdown-md\", \"dropdown-lg\",\r\n \"sidebar-sm\", \"sidebar-md\", \"sidebar-lg\",\r\n \"drawer-sm\", \"drawer-md\", \"drawer-lg\",\r\n \"modal-xs\", \"modal-sm\", \"modal-md\", \"modal-lg\",\r\n] as const;\r\n\r\n/**\r\n * Presets tipográficos — 1:1 com `tokens/brands/default/semantic/typography.ts`.\r\n * Sem isto o tailwind-merge lê `text-title-md` como text-COLOR, colide com\r\n * `text-fg-default` e remove uma das duas em silêncio (L-016).\r\n *\r\n * Gate: `dead-typography-presets` + `tw-merge-config.test.ts`.\r\n */\r\nexport const DS_TYPOGRAPHY_PRESETS = [\r\n // Displays (fluid clamp)\r\n \"display-2xl\", \"display-xl\", \"display-lg\", \"display-md\",\r\n // Headings (xs estático, sm-xl fluid clamp)\r\n \"heading-xl\", \"heading-lg\", \"heading-md\", \"heading-sm\", \"heading-xs\",\r\n // Titles (weight 600 default)\r\n \"title-lg\", \"title-md\", \"title-sm\",\r\n // Body (xs/sm = weight 500 interactive; md-2xl = 400 corrido)\r\n \"body-2xl\", \"body-xl\", \"body-lg\", \"body-md\", \"body-sm\", \"body-xs\",\r\n // Captions (weight 400)\r\n \"caption-md\", \"caption-sm\", \"caption-xs\",\r\n // Stat (número de métrica/KPI — estático, bold, leading tight)\r\n \"stat-xl\", \"stat-lg\", \"stat-md\", \"stat-sm\",\r\n // Code (mono regular)\r\n \"code-md\", \"code-sm\",\r\n] as const;\r\n\r\n/**\r\n * Config passada a `extendTailwindMerge` (pelo `cn`) e a `tv()` (pelo wrapper do DS).\r\n * Os dois caminhos de merge do DS usam ESTE objeto — não há segunda cópia.\r\n */\r\nexport const twMergeConfig = {\r\n extend: {\r\n theme: {\r\n container: [...DS_CONTAINER_SCALE],\r\n },\r\n classGroups: {\r\n \"font-size\": [{ text: [...DS_TYPOGRAPHY_PRESETS] }],\r\n\r\n /* ── Padding ──────────────────────────────────────────────────────── */\r\n p: [{ p: [isDsPad] }],\r\n px: [{ px: [isDsPad] }],\r\n py: [{ py: [isDsPad] }],\r\n pt: [{ pt: [isDsPad] }],\r\n pr: [{ pr: [isDsPad] }],\r\n pb: [{ pb: [isDsPad] }],\r\n pl: [{ pl: [isDsPad] }],\r\n ps: [{ ps: [isDsPad] }],\r\n pe: [{ pe: [isDsPad] }],\r\n\r\n /* ── Margin (usa mesmo sp-*) ──────────────────────────────────────── */\r\n m: [{ m: [isDsPad] }],\r\n mx: [{ mx: [isDsPad] }],\r\n my: [{ my: [isDsPad] }],\r\n mt: [{ mt: [isDsPad] }],\r\n mr: [{ mr: [isDsPad] }],\r\n mb: [{ mb: [isDsPad] }],\r\n ml: [{ ml: [isDsPad] }],\r\n ms: [{ ms: [isDsPad] }],\r\n me: [{ me: [isDsPad] }],\r\n\r\n /* ── Inset / position (top/right/bottom/left) ─────────────────────── */\r\n inset: [{ inset: [isDsPad] }],\r\n \"inset-x\": [{ \"inset-x\": [isDsPad] }],\r\n \"inset-y\": [{ \"inset-y\": [isDsPad] }],\r\n \"top\": [{ top: [isDsPad] }],\r\n \"right\": [{ right: [isDsPad] }],\r\n \"bottom\": [{ bottom: [isDsPad] }],\r\n \"left\": [{ left: [isDsPad] }],\r\n \"start\": [{ start: [isDsPad] }],\r\n \"end\": [{ end: [isDsPad] }],\r\n\r\n /* ── Gap ──────────────────────────────────────────────────────────── */\r\n gap: [{ gap: [isDsGap] }],\r\n \"gap-x\": [{ \"gap-x\": [isDsGap] }],\r\n \"gap-y\": [{ \"gap-y\": [isDsGap] }],\r\n\r\n /* ── Rounded (todas as cantos) ────────────────────────────────────── */\r\n rounded: [{ rounded: [isDsRadius] }],\r\n \"rounded-s\": [{ \"rounded-s\": [isDsRadius] }],\r\n \"rounded-e\": [{ \"rounded-e\": [isDsRadius] }],\r\n \"rounded-t\": [{ \"rounded-t\": [isDsRadius] }],\r\n \"rounded-r\": [{ \"rounded-r\": [isDsRadius] }],\r\n \"rounded-b\": [{ \"rounded-b\": [isDsRadius] }],\r\n \"rounded-l\": [{ \"rounded-l\": [isDsRadius] }],\r\n \"rounded-ss\": [{ \"rounded-ss\": [isDsRadius] }],\r\n \"rounded-se\": [{ \"rounded-se\": [isDsRadius] }],\r\n \"rounded-ee\": [{ \"rounded-ee\": [isDsRadius] }],\r\n \"rounded-es\": [{ \"rounded-es\": [isDsRadius] }],\r\n \"rounded-tl\": [{ \"rounded-tl\": [isDsRadius] }],\r\n \"rounded-tr\": [{ \"rounded-tr\": [isDsRadius] }],\r\n \"rounded-br\": [{ \"rounded-br\": [isDsRadius] }],\r\n \"rounded-bl\": [{ \"rounded-bl\": [isDsRadius] }],\r\n\r\n /* ── Shadow ───────────────────────────────────────────────────────── */\r\n shadow: [{ shadow: [isDsShadow] }],\r\n\r\n /* ── Form sizes (min-h, h, w, size) ───────────────────────────────────\r\n * `w` e `size` recebem TAMBÉM a escala de container pelo `theme` acima;\r\n * as duas extensões convivem (validator + tema no mesmo grupo). */\r\n \"min-h\": [{ \"min-h\": [isDsForm] }],\r\n h: [{ h: [isDsForm] }],\r\n w: [{ w: [isDsForm] }],\r\n size: [{ size: [isDsForm] }],\r\n },\r\n },\r\n};\r\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tw-merge-config.mjs","sources":["../../../src/utils/tw-merge-config.ts"],"sourcesContent":["// src/utils/tw-merge-config.ts\n//\n// FONTE ÚNICA da config do `tailwind-merge` no DS.\n//\n// Existia duplicada: `cn` (src/lib/utils.ts) e `tv` (src/utils/tv.ts) mantinham cada um a\n// sua, com um comentário em `utils.ts` pedindo \"manter sincronizado com src/utils/tv.ts\".\n// Não estavam: a de `tv` tinha só `font-size`, a de `cn` tinha também pad/gap/radius/\n// shadow/form. Componente que fazia merge por `tv()` e componente que fazia por `cn()`\n// resolviam conflito de formas diferentes — e ninguém tinha como saber qual.\n//\n// ⚠️ O que o tailwind-merge NÃO sabe sozinho ele deixa passar em SILÊNCIO: as duas classes\n// sobrevivem no elemento e quem decide é a ordem do CSS, não a ordem do argumento. Nunca\n// dá erro. É a L-016 (onde a classe some) pelo avesso, e a L-072 no caso do `tv()`.\n\nimport { type ClassValidator } from \"tailwind-merge\";\n\n/** Padding/Margin spacing: pad-* (padding contexts), sp-* (geral) */\nconst isDsPad: ClassValidator = (v) => /^(pad|sp)-/.test(v);\n/** Gap: gp-* */\nconst isDsGap: ClassValidator = (v) => /^gp-/.test(v);\n/** Border-radius: radius-* */\nconst isDsRadius: ClassValidator = (v) => /^radius-/.test(v);\n/** Shadow: sh-* */\nconst isDsShadow: ClassValidator = (v) => /^sh-/.test(v);\n/** Form heights: form-* (min-h, h, w, size) */\nconst isDsForm: ClassValidator = (v) => /^form-/.test(v);\n\n/**\n * Escala de container do DS — 1:1 com a chave `container` de\n * `tokens/brands/default/components/sizing.ts`, menos `full` e `prose`, que têm os MESMOS\n * nomes e valores do Tailwind nativo e já são reconhecidos.\n *\n * Entra por `theme.container` (e não por `classGroups`) porque no Tailwind v4 a mesma var\n * `--container-*` alimenta `max-w-*`, `min-w-*`, `w-*`, `basis-*` e as variantes de\n * container query: registrar no tema cobre os cinco de uma vez.\n *\n * Sem isto, `<DialogContent className=\"max-w-modal-sm\">` NÃO vencia o `sm:max-w-[420px]`\n * da base — e nem `max-w-modal-sm` vencia `max-w-modal-lg`, token do DS contra token do\n * DS. O consumidor igreen-tickets precisou prefixar 51 overlays com `sm:` pra contornar,\n * sem saber por quê.\n *\n * Gate que impede drift com o token: `tw-merge-config.test.ts`.\n */\nexport const DS_CONTAINER_SCALE = [\n // Page containers\n \"page-xs\", \"page-sm\", \"page-md\", \"page-lg\", \"page-xl\", \"page-2xl\", \"page-3xl\",\n \"main-content-max\",\n // Component overlays\n \"tooltip-sm\", \"tooltip-md\", \"tooltip-lg\",\n \"dropdown-sm\", \"dropdown-md\", \"dropdown-lg\",\n \"sidebar-sm\", \"sidebar-md\", \"sidebar-lg\",\n \"drawer-sm\", \"drawer-md\", \"drawer-lg\",\n \"modal-xs\", \"modal-sm\", \"modal-md\", \"modal-lg\",\n] as const;\n\n/**\n * Presets tipográficos — 1:1 com `tokens/brands/default/semantic/typography.ts`.\n * Sem isto o tailwind-merge lê `text-title-md` como text-COLOR, colide com\n * `text-fg-default` e remove uma das duas em silêncio (L-016).\n *\n * Gate: `dead-typography-presets` + `tw-merge-config.test.ts`.\n */\nexport const DS_TYPOGRAPHY_PRESETS = [\n // Displays (fluid clamp)\n \"display-2xl\", \"display-xl\", \"display-lg\", \"display-md\",\n // Headings (xs estático, sm-xl fluid clamp)\n \"heading-xl\", \"heading-lg\", \"heading-md\", \"heading-sm\", \"heading-xs\",\n // Titles (weight 600 default)\n \"title-lg\", \"title-md\", \"title-sm\",\n // Body (xs/sm = weight 500 interactive; md-2xl = 400 corrido)\n \"body-2xl\", \"body-xl\", \"body-lg\", \"body-md\", \"body-sm\", \"body-xs\",\n // Captions (weight 400)\n \"caption-md\", \"caption-sm\", \"caption-xs\",\n // Stat (número de métrica/KPI — estático, bold, leading tight)\n \"stat-xl\", \"stat-lg\", \"stat-md\", \"stat-sm\",\n // Code (mono regular)\n \"code-md\", \"code-sm\",\n] as const;\n\n/**\n * Config passada a `extendTailwindMerge` (pelo `cn`) e a `tv()` (pelo wrapper do DS).\n * Os dois caminhos de merge do DS usam ESTE objeto — não há segunda cópia.\n */\nexport const twMergeConfig = {\n extend: {\n theme: {\n container: [...DS_CONTAINER_SCALE],\n },\n classGroups: {\n \"font-size\": [{ text: [...DS_TYPOGRAPHY_PRESETS] }],\n\n /* ── Padding ──────────────────────────────────────────────────────── */\n p: [{ p: [isDsPad] }],\n px: [{ px: [isDsPad] }],\n py: [{ py: [isDsPad] }],\n pt: [{ pt: [isDsPad] }],\n pr: [{ pr: [isDsPad] }],\n pb: [{ pb: [isDsPad] }],\n pl: [{ pl: [isDsPad] }],\n ps: [{ ps: [isDsPad] }],\n pe: [{ pe: [isDsPad] }],\n\n /* ── Margin (usa mesmo sp-*) ──────────────────────────────────────── */\n m: [{ m: [isDsPad] }],\n mx: [{ mx: [isDsPad] }],\n my: [{ my: [isDsPad] }],\n mt: [{ mt: [isDsPad] }],\n mr: [{ mr: [isDsPad] }],\n mb: [{ mb: [isDsPad] }],\n ml: [{ ml: [isDsPad] }],\n ms: [{ ms: [isDsPad] }],\n me: [{ me: [isDsPad] }],\n\n /* ── Inset / position (top/right/bottom/left) ─────────────────────── */\n inset: [{ inset: [isDsPad] }],\n \"inset-x\": [{ \"inset-x\": [isDsPad] }],\n \"inset-y\": [{ \"inset-y\": [isDsPad] }],\n \"top\": [{ top: [isDsPad] }],\n \"right\": [{ right: [isDsPad] }],\n \"bottom\": [{ bottom: [isDsPad] }],\n \"left\": [{ left: [isDsPad] }],\n \"start\": [{ start: [isDsPad] }],\n \"end\": [{ end: [isDsPad] }],\n\n /* ── Gap ──────────────────────────────────────────────────────────── */\n gap: [{ gap: [isDsGap] }],\n \"gap-x\": [{ \"gap-x\": [isDsGap] }],\n \"gap-y\": [{ \"gap-y\": [isDsGap] }],\n\n /* ── Rounded (todas as cantos) ────────────────────────────────────── */\n rounded: [{ rounded: [isDsRadius] }],\n \"rounded-s\": [{ \"rounded-s\": [isDsRadius] }],\n \"rounded-e\": [{ \"rounded-e\": [isDsRadius] }],\n \"rounded-t\": [{ \"rounded-t\": [isDsRadius] }],\n \"rounded-r\": [{ \"rounded-r\": [isDsRadius] }],\n \"rounded-b\": [{ \"rounded-b\": [isDsRadius] }],\n \"rounded-l\": [{ \"rounded-l\": [isDsRadius] }],\n \"rounded-ss\": [{ \"rounded-ss\": [isDsRadius] }],\n \"rounded-se\": [{ \"rounded-se\": [isDsRadius] }],\n \"rounded-ee\": [{ \"rounded-ee\": [isDsRadius] }],\n \"rounded-es\": [{ \"rounded-es\": [isDsRadius] }],\n \"rounded-tl\": [{ \"rounded-tl\": [isDsRadius] }],\n \"rounded-tr\": [{ \"rounded-tr\": [isDsRadius] }],\n \"rounded-br\": [{ \"rounded-br\": [isDsRadius] }],\n \"rounded-bl\": [{ \"rounded-bl\": [isDsRadius] }],\n\n /* ── Shadow ───────────────────────────────────────────────────────── */\n shadow: [{ shadow: [isDsShadow] }],\n\n /* ── Form sizes (min-h, h, w, size) ───────────────────────────────────\n * `w` e `size` recebem TAMBÉM a escala de container pelo `theme` acima;\n * as duas extensões convivem (validator + tema no mesmo grupo). */\n \"min-h\": [{ \"min-h\": [isDsForm] }],\n h: [{ h: [isDsForm] }],\n w: [{ w: [isDsForm] }],\n size: [{ size: [isDsForm] }],\n },\n },\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tw-merge-config.mjs","sources":["../../../src/utils/tw-merge-config.ts"],"sourcesContent":["// src/utils/tw-merge-config.ts\r\n//\r\n// FONTE ÚNICA da config do `tailwind-merge` no DS.\r\n//\r\n// Existia duplicada: `cn` (src/lib/utils.ts) e `tv` (src/utils/tv.ts) mantinham cada um a\r\n// sua, com um comentário em `utils.ts` pedindo \"manter sincronizado com src/utils/tv.ts\".\r\n// Não estavam: a de `tv` tinha só `font-size`, a de `cn` tinha também pad/gap/radius/\r\n// shadow/form. Componente que fazia merge por `tv()` e componente que fazia por `cn()`\r\n// resolviam conflito de formas diferentes — e ninguém tinha como saber qual.\r\n//\r\n// ⚠️ O que o tailwind-merge NÃO sabe sozinho ele deixa passar em SILÊNCIO: as duas classes\r\n// sobrevivem no elemento e quem decide é a ordem do CSS, não a ordem do argumento. Nunca\r\n// dá erro. É a L-016 (onde a classe some) pelo avesso, e a L-072 no caso do `tv()`.\r\n\r\nimport { type ClassValidator } from \"tailwind-merge\";\r\n\r\n/** Padding/Margin spacing: pad-* (padding contexts), sp-* (geral) */\r\nconst isDsPad: ClassValidator = (v) => /^(pad|sp)-/.test(v);\r\n/** Gap: gp-* */\r\nconst isDsGap: ClassValidator = (v) => /^gp-/.test(v);\r\n/** Border-radius: radius-* */\r\nconst isDsRadius: ClassValidator = (v) => /^radius-/.test(v);\r\n/** Shadow: sh-* */\r\nconst isDsShadow: ClassValidator = (v) => /^sh-/.test(v);\r\n/** Form heights: form-* (min-h, h, w, size) */\r\nconst isDsForm: ClassValidator = (v) => /^form-/.test(v);\r\n\r\n/**\r\n * Escala de container do DS — 1:1 com a chave `container` de\r\n * `tokens/brands/default/components/sizing.ts`, menos `full` e `prose`, que têm os MESMOS\r\n * nomes e valores do Tailwind nativo e já são reconhecidos.\r\n *\r\n * Entra por `theme.container` (e não por `classGroups`) porque no Tailwind v4 a mesma var\r\n * `--container-*` alimenta `max-w-*`, `min-w-*`, `w-*`, `basis-*` e as variantes de\r\n * container query: registrar no tema cobre os cinco de uma vez.\r\n *\r\n * Sem isto, `<DialogContent className=\"max-w-modal-sm\">` NÃO vencia o `sm:max-w-[420px]`\r\n * da base — e nem `max-w-modal-sm` vencia `max-w-modal-lg`, token do DS contra token do\r\n * DS. O consumidor igreen-tickets precisou prefixar 51 overlays com `sm:` pra contornar,\r\n * sem saber por quê.\r\n *\r\n * Gate que impede drift com o token: `tw-merge-config.test.ts`.\r\n */\r\nexport const DS_CONTAINER_SCALE = [\r\n // Page containers\r\n \"page-xs\", \"page-sm\", \"page-md\", \"page-lg\", \"page-xl\", \"page-2xl\", \"page-3xl\",\r\n \"main-content-max\",\r\n // Component overlays\r\n \"tooltip-sm\", \"tooltip-md\", \"tooltip-lg\",\r\n \"dropdown-sm\", \"dropdown-md\", \"dropdown-lg\",\r\n \"sidebar-sm\", \"sidebar-md\", \"sidebar-lg\",\r\n \"drawer-sm\", \"drawer-md\", \"drawer-lg\",\r\n \"modal-xs\", \"modal-sm\", \"modal-md\", \"modal-lg\",\r\n] as const;\r\n\r\n/**\r\n * Presets tipográficos — 1:1 com `tokens/brands/default/semantic/typography.ts`.\r\n * Sem isto o tailwind-merge lê `text-title-md` como text-COLOR, colide com\r\n * `text-fg-default` e remove uma das duas em silêncio (L-016).\r\n *\r\n * Gate: `dead-typography-presets` + `tw-merge-config.test.ts`.\r\n */\r\nexport const DS_TYPOGRAPHY_PRESETS = [\r\n // Displays (fluid clamp)\r\n \"display-2xl\", \"display-xl\", \"display-lg\", \"display-md\",\r\n // Headings (xs estático, sm-xl fluid clamp)\r\n \"heading-xl\", \"heading-lg\", \"heading-md\", \"heading-sm\", \"heading-xs\",\r\n // Titles (weight 600 default)\r\n \"title-lg\", \"title-md\", \"title-sm\",\r\n // Body (xs/sm = weight 500 interactive; md-2xl = 400 corrido)\r\n \"body-2xl\", \"body-xl\", \"body-lg\", \"body-md\", \"body-sm\", \"body-xs\",\r\n // Captions (weight 400)\r\n \"caption-md\", \"caption-sm\", \"caption-xs\",\r\n // Stat (número de métrica/KPI — estático, bold, leading tight)\r\n \"stat-xl\", \"stat-lg\", \"stat-md\", \"stat-sm\",\r\n // Code (mono regular)\r\n \"code-md\", \"code-sm\",\r\n] as const;\r\n\r\n/**\r\n * Config passada a `extendTailwindMerge` (pelo `cn`) e a `tv()` (pelo wrapper do DS).\r\n * Os dois caminhos de merge do DS usam ESTE objeto — não há segunda cópia.\r\n */\r\nexport const twMergeConfig = {\r\n extend: {\r\n theme: {\r\n container: [...DS_CONTAINER_SCALE],\r\n },\r\n classGroups: {\r\n \"font-size\": [{ text: [...DS_TYPOGRAPHY_PRESETS] }],\r\n\r\n /* ── Padding ──────────────────────────────────────────────────────── */\r\n p: [{ p: [isDsPad] }],\r\n px: [{ px: [isDsPad] }],\r\n py: [{ py: [isDsPad] }],\r\n pt: [{ pt: [isDsPad] }],\r\n pr: [{ pr: [isDsPad] }],\r\n pb: [{ pb: [isDsPad] }],\r\n pl: [{ pl: [isDsPad] }],\r\n ps: [{ ps: [isDsPad] }],\r\n pe: [{ pe: [isDsPad] }],\r\n\r\n /* ── Margin (usa mesmo sp-*) ──────────────────────────────────────── */\r\n m: [{ m: [isDsPad] }],\r\n mx: [{ mx: [isDsPad] }],\r\n my: [{ my: [isDsPad] }],\r\n mt: [{ mt: [isDsPad] }],\r\n mr: [{ mr: [isDsPad] }],\r\n mb: [{ mb: [isDsPad] }],\r\n ml: [{ ml: [isDsPad] }],\r\n ms: [{ ms: [isDsPad] }],\r\n me: [{ me: [isDsPad] }],\r\n\r\n /* ── Inset / position (top/right/bottom/left) ─────────────────────── */\r\n inset: [{ inset: [isDsPad] }],\r\n \"inset-x\": [{ \"inset-x\": [isDsPad] }],\r\n \"inset-y\": [{ \"inset-y\": [isDsPad] }],\r\n \"top\": [{ top: [isDsPad] }],\r\n \"right\": [{ right: [isDsPad] }],\r\n \"bottom\": [{ bottom: [isDsPad] }],\r\n \"left\": [{ left: [isDsPad] }],\r\n \"start\": [{ start: [isDsPad] }],\r\n \"end\": [{ end: [isDsPad] }],\r\n\r\n /* ── Gap ──────────────────────────────────────────────────────────── */\r\n gap: [{ gap: [isDsGap] }],\r\n \"gap-x\": [{ \"gap-x\": [isDsGap] }],\r\n \"gap-y\": [{ \"gap-y\": [isDsGap] }],\r\n\r\n /* ── Rounded (todas as cantos) ────────────────────────────────────── */\r\n rounded: [{ rounded: [isDsRadius] }],\r\n \"rounded-s\": [{ \"rounded-s\": [isDsRadius] }],\r\n \"rounded-e\": [{ \"rounded-e\": [isDsRadius] }],\r\n \"rounded-t\": [{ \"rounded-t\": [isDsRadius] }],\r\n \"rounded-r\": [{ \"rounded-r\": [isDsRadius] }],\r\n \"rounded-b\": [{ \"rounded-b\": [isDsRadius] }],\r\n \"rounded-l\": [{ \"rounded-l\": [isDsRadius] }],\r\n \"rounded-ss\": [{ \"rounded-ss\": [isDsRadius] }],\r\n \"rounded-se\": [{ \"rounded-se\": [isDsRadius] }],\r\n \"rounded-ee\": [{ \"rounded-ee\": [isDsRadius] }],\r\n \"rounded-es\": [{ \"rounded-es\": [isDsRadius] }],\r\n \"rounded-tl\": [{ \"rounded-tl\": [isDsRadius] }],\r\n \"rounded-tr\": [{ \"rounded-tr\": [isDsRadius] }],\r\n \"rounded-br\": [{ \"rounded-br\": [isDsRadius] }],\r\n \"rounded-bl\": [{ \"rounded-bl\": [isDsRadius] }],\r\n\r\n /* ── Shadow ───────────────────────────────────────────────────────── */\r\n shadow: [{ shadow: [isDsShadow] }],\r\n\r\n /* ── Form sizes (min-h, h, w, size) ───────────────────────────────────\r\n * `w` e `size` recebem TAMBÉM a escala de container pelo `theme` acima;\r\n * as duas extensões convivem (validator + tema no mesmo grupo). */\r\n \"min-h\": [{ \"min-h\": [isDsForm] }],\r\n h: [{ h: [isDsForm] }],\r\n w: [{ w: [isDsForm] }],\r\n size: [{ size: [isDsForm] }],\r\n },\r\n },\r\n};\r\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const React = require("react");
|
|
4
|
+
function useTitleSeTruncado(texto) {
|
|
5
|
+
const elRef = React.useRef(null);
|
|
6
|
+
const [cortado, setCortado] = React.useState(false);
|
|
7
|
+
const medir = React.useCallback(() => {
|
|
8
|
+
const el = elRef.current;
|
|
9
|
+
if (!el) return;
|
|
10
|
+
setCortado(el.scrollWidth > el.clientWidth || el.scrollHeight > el.clientHeight);
|
|
11
|
+
}, []);
|
|
12
|
+
React.useEffect(() => {
|
|
13
|
+
const el = elRef.current;
|
|
14
|
+
if (!el || typeof ResizeObserver === "undefined") {
|
|
15
|
+
medir();
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
const ro = new ResizeObserver(medir);
|
|
19
|
+
ro.observe(el);
|
|
20
|
+
medir();
|
|
21
|
+
return () => ro.disconnect();
|
|
22
|
+
}, [medir, texto]);
|
|
23
|
+
const ref = React.useCallback(
|
|
24
|
+
(el) => {
|
|
25
|
+
elRef.current = el;
|
|
26
|
+
if (el) medir();
|
|
27
|
+
},
|
|
28
|
+
[medir]
|
|
29
|
+
);
|
|
30
|
+
const ehTexto = typeof texto === "string" || typeof texto === "number";
|
|
31
|
+
return { ref, title: cortado && ehTexto ? String(texto) : void 0 };
|
|
32
|
+
}
|
|
33
|
+
exports.useTitleSeTruncado = useTitleSeTruncado;
|
|
34
|
+
//# sourceMappingURL=use-title-se-truncado.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-title-se-truncado.cjs","sources":["../../../src/utils/use-title-se-truncado.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\";\r\n\r\n/**\r\n * Devolve o `title` só quando o elemento está REALMENTE cortado.\r\n *\r\n * ## Por que não `title` sempre\r\n *\r\n * A primeira versão disto punha `title={label}` incondicional. Resolve o caso do texto\r\n * cortado e cria outro: tooltip nativo do browser em TODO hover, inclusive nos 90% em que\r\n * o texto cabe inteiro. Numa grade de 8 KPIs isso é ruído constante — e ruído que o\r\n * consumidor não tem como desligar.\r\n *\r\n * ## Como decide\r\n *\r\n * `scrollWidth > clientWidth` pega `truncate` (uma linha); `scrollHeight > clientHeight`\r\n * pega `line-clamp-N` (várias). Os dois são medidas de LAYOUT, então não sofrem com\r\n * `transform` — diferente de `getBoundingClientRect`, que mente enquanto uma animação\r\n * de entrada está em curso.\r\n *\r\n * Re-mede em resize do elemento (`ResizeObserver`), porque o mesmo rótulo corta ou não\r\n * conforme a coluna — que é exatamente o caso do `KpiGroup`, cujo grid muda por\r\n * container query.\r\n *\r\n * @example\r\n * const { ref, title } = useTitleSeTruncado(label);\r\n * <h3 ref={ref} className=\"line-clamp-2\" title={title}>{label}</h3>\r\n */\r\nexport function useTitleSeTruncado<T extends HTMLElement = HTMLElement>(\r\n texto: unknown,\r\n): { ref: (el: T | null) => void; title: string | undefined } {\r\n const elRef = useRef<T | null>(null);\r\n const [cortado, setCortado] = useState(false);\r\n\r\n const medir = useCallback(() => {\r\n const el = elRef.current;\r\n if (!el) return;\r\n setCortado(el.scrollWidth > el.clientWidth || el.scrollHeight > el.clientHeight);\r\n }, []);\r\n\r\n useEffect(() => {\r\n const el = elRef.current;\r\n if (!el || typeof ResizeObserver === \"undefined\") {\r\n medir();\r\n return;\r\n }\r\n const ro = new ResizeObserver(medir);\r\n ro.observe(el);\r\n medir();\r\n return () => ro.disconnect();\r\n // `texto` entra porque trocar o conteúdo muda o corte sem mudar o tamanho do box.\r\n }, [medir, texto]);\r\n\r\n const ref = useCallback(\r\n (el: T | null) => {\r\n elRef.current = el;\r\n if (el) medir();\r\n },\r\n [medir],\r\n );\r\n\r\n const ehTexto = typeof texto === \"string\" || typeof texto === \"number\";\r\n return { ref, title: cortado && ehTexto ? String(texto) : undefined };\r\n}\r\n"],"names":["useRef","useState","useCallback","useEffect"],"mappings":";;;AA2BO,SAAS,mBACd,OAC4D;AAC5D,QAAM,QAAQA,MAAAA,OAAiB,IAAI;AACnC,QAAM,CAAC,SAAS,UAAU,IAAIC,MAAAA,SAAS,KAAK;AAE5C,QAAM,QAAQC,MAAAA,YAAY,MAAM;AAC9B,UAAM,KAAK,MAAM;AACjB,QAAI,CAAC,GAAI;AACT,eAAW,GAAG,cAAc,GAAG,eAAe,GAAG,eAAe,GAAG,YAAY;AAAA,EACjF,GAAG,CAAA,CAAE;AAELC,QAAAA,UAAU,MAAM;AACd,UAAM,KAAK,MAAM;AACjB,QAAI,CAAC,MAAM,OAAO,mBAAmB,aAAa;AAChD,YAAA;AACA;AAAA,IACF;AACA,UAAM,KAAK,IAAI,eAAe,KAAK;AACnC,OAAG,QAAQ,EAAE;AACb,UAAA;AACA,WAAO,MAAM,GAAG,WAAA;AAAA,EAElB,GAAG,CAAC,OAAO,KAAK,CAAC;AAEjB,QAAM,MAAMD,MAAAA;AAAAA,IACV,CAAC,OAAiB;AAChB,YAAM,UAAU;AAChB,UAAI,GAAI,OAAA;AAAA,IACV;AAAA,IACA,CAAC,KAAK;AAAA,EAAA;AAGR,QAAM,UAAU,OAAO,UAAU,YAAY,OAAO,UAAU;AAC9D,SAAO,EAAE,KAAK,OAAO,WAAW,UAAU,OAAO,KAAK,IAAI,OAAA;AAC5D;;"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Devolve o `title` só quando o elemento está REALMENTE cortado.
|
|
3
|
+
*
|
|
4
|
+
* ## Por que não `title` sempre
|
|
5
|
+
*
|
|
6
|
+
* A primeira versão disto punha `title={label}` incondicional. Resolve o caso do texto
|
|
7
|
+
* cortado e cria outro: tooltip nativo do browser em TODO hover, inclusive nos 90% em que
|
|
8
|
+
* o texto cabe inteiro. Numa grade de 8 KPIs isso é ruído constante — e ruído que o
|
|
9
|
+
* consumidor não tem como desligar.
|
|
10
|
+
*
|
|
11
|
+
* ## Como decide
|
|
12
|
+
*
|
|
13
|
+
* `scrollWidth > clientWidth` pega `truncate` (uma linha); `scrollHeight > clientHeight`
|
|
14
|
+
* pega `line-clamp-N` (várias). Os dois são medidas de LAYOUT, então não sofrem com
|
|
15
|
+
* `transform` — diferente de `getBoundingClientRect`, que mente enquanto uma animação
|
|
16
|
+
* de entrada está em curso.
|
|
17
|
+
*
|
|
18
|
+
* Re-mede em resize do elemento (`ResizeObserver`), porque o mesmo rótulo corta ou não
|
|
19
|
+
* conforme a coluna — que é exatamente o caso do `KpiGroup`, cujo grid muda por
|
|
20
|
+
* container query.
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* const { ref, title } = useTitleSeTruncado(label);
|
|
24
|
+
* <h3 ref={ref} className="line-clamp-2" title={title}>{label}</h3>
|
|
25
|
+
*/
|
|
26
|
+
export declare function useTitleSeTruncado<T extends HTMLElement = HTMLElement>(texto: unknown): {
|
|
27
|
+
ref: (el: T | null) => void;
|
|
28
|
+
title: string | undefined;
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=use-title-se-truncado.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-title-se-truncado.d.ts","sourceRoot":"","sources":["../../../src/utils/use-title-se-truncado.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,WAAW,GAAG,WAAW,EACpE,KAAK,EAAE,OAAO,GACb;IAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,KAAK,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAiC5D"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { useRef, useState, useCallback, useEffect } from "react";
|
|
2
|
+
function useTitleSeTruncado(texto) {
|
|
3
|
+
const elRef = useRef(null);
|
|
4
|
+
const [cortado, setCortado] = useState(false);
|
|
5
|
+
const medir = useCallback(() => {
|
|
6
|
+
const el = elRef.current;
|
|
7
|
+
if (!el) return;
|
|
8
|
+
setCortado(el.scrollWidth > el.clientWidth || el.scrollHeight > el.clientHeight);
|
|
9
|
+
}, []);
|
|
10
|
+
useEffect(() => {
|
|
11
|
+
const el = elRef.current;
|
|
12
|
+
if (!el || typeof ResizeObserver === "undefined") {
|
|
13
|
+
medir();
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
const ro = new ResizeObserver(medir);
|
|
17
|
+
ro.observe(el);
|
|
18
|
+
medir();
|
|
19
|
+
return () => ro.disconnect();
|
|
20
|
+
}, [medir, texto]);
|
|
21
|
+
const ref = useCallback(
|
|
22
|
+
(el) => {
|
|
23
|
+
elRef.current = el;
|
|
24
|
+
if (el) medir();
|
|
25
|
+
},
|
|
26
|
+
[medir]
|
|
27
|
+
);
|
|
28
|
+
const ehTexto = typeof texto === "string" || typeof texto === "number";
|
|
29
|
+
return { ref, title: cortado && ehTexto ? String(texto) : void 0 };
|
|
30
|
+
}
|
|
31
|
+
export {
|
|
32
|
+
useTitleSeTruncado
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=use-title-se-truncado.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-title-se-truncado.mjs","sources":["../../../src/utils/use-title-se-truncado.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\";\r\n\r\n/**\r\n * Devolve o `title` só quando o elemento está REALMENTE cortado.\r\n *\r\n * ## Por que não `title` sempre\r\n *\r\n * A primeira versão disto punha `title={label}` incondicional. Resolve o caso do texto\r\n * cortado e cria outro: tooltip nativo do browser em TODO hover, inclusive nos 90% em que\r\n * o texto cabe inteiro. Numa grade de 8 KPIs isso é ruído constante — e ruído que o\r\n * consumidor não tem como desligar.\r\n *\r\n * ## Como decide\r\n *\r\n * `scrollWidth > clientWidth` pega `truncate` (uma linha); `scrollHeight > clientHeight`\r\n * pega `line-clamp-N` (várias). Os dois são medidas de LAYOUT, então não sofrem com\r\n * `transform` — diferente de `getBoundingClientRect`, que mente enquanto uma animação\r\n * de entrada está em curso.\r\n *\r\n * Re-mede em resize do elemento (`ResizeObserver`), porque o mesmo rótulo corta ou não\r\n * conforme a coluna — que é exatamente o caso do `KpiGroup`, cujo grid muda por\r\n * container query.\r\n *\r\n * @example\r\n * const { ref, title } = useTitleSeTruncado(label);\r\n * <h3 ref={ref} className=\"line-clamp-2\" title={title}>{label}</h3>\r\n */\r\nexport function useTitleSeTruncado<T extends HTMLElement = HTMLElement>(\r\n texto: unknown,\r\n): { ref: (el: T | null) => void; title: string | undefined } {\r\n const elRef = useRef<T | null>(null);\r\n const [cortado, setCortado] = useState(false);\r\n\r\n const medir = useCallback(() => {\r\n const el = elRef.current;\r\n if (!el) return;\r\n setCortado(el.scrollWidth > el.clientWidth || el.scrollHeight > el.clientHeight);\r\n }, []);\r\n\r\n useEffect(() => {\r\n const el = elRef.current;\r\n if (!el || typeof ResizeObserver === \"undefined\") {\r\n medir();\r\n return;\r\n }\r\n const ro = new ResizeObserver(medir);\r\n ro.observe(el);\r\n medir();\r\n return () => ro.disconnect();\r\n // `texto` entra porque trocar o conteúdo muda o corte sem mudar o tamanho do box.\r\n }, [medir, texto]);\r\n\r\n const ref = useCallback(\r\n (el: T | null) => {\r\n elRef.current = el;\r\n if (el) medir();\r\n },\r\n [medir],\r\n );\r\n\r\n const ehTexto = typeof texto === \"string\" || typeof texto === \"number\";\r\n return { ref, title: cortado && ehTexto ? String(texto) : undefined };\r\n}\r\n"],"names":[],"mappings":";AA2BO,SAAS,mBACd,OAC4D;AAC5D,QAAM,QAAQ,OAAiB,IAAI;AACnC,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAE5C,QAAM,QAAQ,YAAY,MAAM;AAC9B,UAAM,KAAK,MAAM;AACjB,QAAI,CAAC,GAAI;AACT,eAAW,GAAG,cAAc,GAAG,eAAe,GAAG,eAAe,GAAG,YAAY;AAAA,EACjF,GAAG,CAAA,CAAE;AAEL,YAAU,MAAM;AACd,UAAM,KAAK,MAAM;AACjB,QAAI,CAAC,MAAM,OAAO,mBAAmB,aAAa;AAChD,YAAA;AACA;AAAA,IACF;AACA,UAAM,KAAK,IAAI,eAAe,KAAK;AACnC,OAAG,QAAQ,EAAE;AACb,UAAA;AACA,WAAO,MAAM,GAAG,WAAA;AAAA,EAElB,GAAG,CAAC,OAAO,KAAK,CAAC;AAEjB,QAAM,MAAM;AAAA,IACV,CAAC,OAAiB;AAChB,YAAM,UAAU;AAChB,UAAI,GAAI,OAAA;AAAA,IACV;AAAA,IACA,CAAC,KAAK;AAAA,EAAA;AAGR,QAAM,UAAU,OAAO,UAAU,YAAY,OAAO,UAAU;AAC9D,SAAO,EAAE,KAAK,OAAO,WAAW,UAAU,OAAO,KAAK,IAAI,OAAA;AAC5D;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@snksergio/design-system",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.68.0",
|
|
4
4
|
"//distribuicao": "Canal PRIMARIO = registry shadcn (copy-in) + CLI @snksergio/create-design-system; sobe sozinho no merge (Vercel). Canal SECUNDARIO = este pacote npm (@snksergio/design-system), publicado por passo MANUAL do mantenedor, entao costuma ficar atras do registry. SECUNDARIO descreve a ORDEM DE PUBLICACAO, nao o nivel de suporte: NAO e depreciado, e desde a 0.37.0 entrega 41 dos 42 componentes ui/ no barrel raiz + os 41 primitivos shadcn no subpath ./shadcn (so TabelaTeste, demo interno, fica de fora). Publish so pelo Passo 7 do .claude/skills/ds-dev/release.md (valida com `npm run lib:verify`, pede o token, publica, revoga). Ver DISTRIBUICAO.md.",
|
|
5
5
|
"description": "iGreen Design System — internal library for SaaS CRM, admin panels and dashboards. React 19 + Tailwind v4 + Shadcn + Radix.",
|
|
6
6
|
"license": "UNLICENSED",
|