@snksergio/design-system 0.53.0 → 0.55.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.
Files changed (87) hide show
  1. package/dist-lib/chunks/{avatar-DAmZ7fBZ.cjs → avatar-CMWPg3A3.cjs} +157 -70
  2. package/dist-lib/chunks/avatar-CMWPg3A3.cjs.map +1 -0
  3. package/dist-lib/chunks/{avatar-FPbG1TRy.mjs → avatar-CZRLkTxt.mjs} +214 -127
  4. package/dist-lib/chunks/avatar-CZRLkTxt.mjs.map +1 -0
  5. package/dist-lib/chunks/{input-tjIT8HNE.mjs → input-BQABJR2N.mjs} +2 -2
  6. package/dist-lib/chunks/{input-tjIT8HNE.mjs.map → input-BQABJR2N.mjs.map} +1 -1
  7. package/dist-lib/chunks/{input-Ci_2-5Te.cjs → input-DqaLFxER.cjs} +2 -2
  8. package/dist-lib/chunks/{input-Ci_2-5Te.cjs.map → input-DqaLFxER.cjs.map} +1 -1
  9. package/dist-lib/chunks/{kpi-delta-BRTgTaO1.mjs → kpi-delta-Bfs_oVpq.mjs} +3 -3
  10. package/dist-lib/chunks/{kpi-delta-BRTgTaO1.mjs.map → kpi-delta-Bfs_oVpq.mjs.map} +1 -1
  11. package/dist-lib/chunks/{kpi-delta-1-gsPFvU.cjs → kpi-delta-wEzw5zSu.cjs} +3 -3
  12. package/dist-lib/chunks/{kpi-delta-1-gsPFvU.cjs.map → kpi-delta-wEzw5zSu.cjs.map} +1 -1
  13. package/dist-lib/chunks/{page-header-DrKDiVFN.cjs → page-header-sValhWca.cjs} +2 -2
  14. package/dist-lib/chunks/{page-header-DrKDiVFN.cjs.map → page-header-sValhWca.cjs.map} +1 -1
  15. package/dist-lib/chunks/{page-header-DdWp9c-r.mjs → page-header-t5hFIp7o.mjs} +2 -2
  16. package/dist-lib/chunks/{page-header-DdWp9c-r.mjs.map → page-header-t5hFIp7o.mjs.map} +1 -1
  17. package/dist-lib/chunks/{panel-DsOKm4Im.mjs → panel-C3puLY_V.mjs} +5 -5
  18. package/dist-lib/chunks/{panel-DsOKm4Im.mjs.map → panel-C3puLY_V.mjs.map} +1 -1
  19. package/dist-lib/chunks/{panel-CTbiCa0_.cjs → panel-DmnK2n5_.cjs} +5 -5
  20. package/dist-lib/chunks/{panel-CTbiCa0_.cjs.map → panel-DmnK2n5_.cjs.map} +1 -1
  21. package/dist-lib/chunks/{sheet-DIpYkRYS.mjs → sheet-Bjjo4ZaT.mjs} +2 -2
  22. package/dist-lib/chunks/{sheet-DIpYkRYS.mjs.map → sheet-Bjjo4ZaT.mjs.map} +1 -1
  23. package/dist-lib/chunks/{sheet-rg6uupt1.cjs → sheet-BrYriaDN.cjs} +2 -2
  24. package/dist-lib/chunks/{sheet-rg6uupt1.cjs.map → sheet-BrYriaDN.cjs.map} +1 -1
  25. package/dist-lib/chunks/{toggle-group-C9rrkkmh.cjs → toggle-group-DeoBmogo.cjs} +24 -111
  26. package/dist-lib/chunks/toggle-group-DeoBmogo.cjs.map +1 -0
  27. package/dist-lib/chunks/{toggle-group-mXbG8_Jm.mjs → toggle-group-XMgZgL-H.mjs} +111 -198
  28. package/dist-lib/chunks/toggle-group-XMgZgL-H.mjs.map +1 -0
  29. package/dist-lib/chunks/{useTheme-Dh3POjCr.cjs → useTheme-BTjHuaT2.cjs} +225 -84
  30. package/dist-lib/chunks/useTheme-BTjHuaT2.cjs.map +1 -0
  31. package/dist-lib/chunks/{useTheme-Bk8AYqLr.mjs → useTheme-caPM-I73.mjs} +267 -126
  32. package/dist-lib/chunks/useTheme-caPM-I73.mjs.map +1 -0
  33. package/dist-lib/index.cjs +647 -8
  34. package/dist-lib/index.cjs.map +1 -1
  35. package/dist-lib/index.mjs +1041 -402
  36. package/dist-lib/index.mjs.map +1 -1
  37. package/dist-lib/preview/chat.cjs +3 -3
  38. package/dist-lib/preview/chat.mjs +3 -3
  39. package/dist-lib/preview/clientes.cjs +6 -6
  40. package/dist-lib/preview/clientes.mjs +6 -6
  41. package/dist-lib/preview/dashboard.cjs +4 -4
  42. package/dist-lib/preview/dashboard.mjs +4 -4
  43. package/dist-lib/shadcn.cjs +11 -11
  44. package/dist-lib/shadcn.mjs +153 -153
  45. package/dist-lib/src/components/index.d.ts +2 -0
  46. package/dist-lib/src/components/index.d.ts.map +1 -1
  47. package/dist-lib/src/components/ui/Breadcrumb/breadcrumb-switcher.d.ts +35 -0
  48. package/dist-lib/src/components/ui/Breadcrumb/breadcrumb-switcher.d.ts.map +1 -0
  49. package/dist-lib/src/components/ui/Breadcrumb/breadcrumb-switcher.styles.d.ts +94 -0
  50. package/dist-lib/src/components/ui/Breadcrumb/breadcrumb-switcher.styles.d.ts.map +1 -0
  51. package/dist-lib/src/components/ui/Breadcrumb/breadcrumb-switcher.types.d.ts +50 -0
  52. package/dist-lib/src/components/ui/Breadcrumb/breadcrumb-switcher.types.d.ts.map +1 -0
  53. package/dist-lib/src/components/ui/Breadcrumb/breadcrumb.d.ts +32 -0
  54. package/dist-lib/src/components/ui/Breadcrumb/breadcrumb.d.ts.map +1 -0
  55. package/dist-lib/src/components/ui/Breadcrumb/breadcrumb.styles.d.ts +111 -0
  56. package/dist-lib/src/components/ui/Breadcrumb/breadcrumb.styles.d.ts.map +1 -0
  57. package/dist-lib/src/components/ui/Breadcrumb/breadcrumb.types.d.ts +40 -0
  58. package/dist-lib/src/components/ui/Breadcrumb/breadcrumb.types.d.ts.map +1 -0
  59. package/dist-lib/src/components/ui/Breadcrumb/index.d.ts +21 -0
  60. package/dist-lib/src/components/ui/Breadcrumb/index.d.ts.map +1 -0
  61. package/dist-lib/src/components/ui/DataTable/parts/data-table-cell-addons.styles.d.ts +3 -3
  62. package/dist-lib/src/components/ui/Header/header-breadcrumb.d.ts +13 -3
  63. package/dist-lib/src/components/ui/Header/header-breadcrumb.d.ts.map +1 -1
  64. package/dist-lib/src/components/ui/Header/header.styles.d.ts +12 -33
  65. package/dist-lib/src/components/ui/Header/header.styles.d.ts.map +1 -1
  66. package/dist-lib/src/components/ui/Header/header.types.d.ts +17 -0
  67. package/dist-lib/src/components/ui/Header/header.types.d.ts.map +1 -1
  68. package/dist-lib/src/components/ui/TabsNavigation/index.d.ts +5 -0
  69. package/dist-lib/src/components/ui/TabsNavigation/index.d.ts.map +1 -0
  70. package/dist-lib/src/components/ui/TabsNavigation/tabs-navigation-context.d.ts +19 -0
  71. package/dist-lib/src/components/ui/TabsNavigation/tabs-navigation-context.d.ts.map +1 -0
  72. package/dist-lib/src/components/ui/TabsNavigation/tabs-navigation.d.ts +84 -0
  73. package/dist-lib/src/components/ui/TabsNavigation/tabs-navigation.d.ts.map +1 -0
  74. package/dist-lib/src/components/ui/TabsNavigation/tabs-navigation.styles.d.ts +393 -0
  75. package/dist-lib/src/components/ui/TabsNavigation/tabs-navigation.styles.d.ts.map +1 -0
  76. package/dist-lib/src/components/ui/TabsNavigation/tabs-navigation.types.d.ts +99 -0
  77. package/dist-lib/src/components/ui/TabsNavigation/tabs-navigation.types.d.ts.map +1 -0
  78. package/dist-lib/src/components/ui/TabsNavigation/use-arrastar-para-rolar.d.ts +26 -0
  79. package/dist-lib/src/components/ui/TabsNavigation/use-arrastar-para-rolar.d.ts.map +1 -0
  80. package/dist-lib/theme.css +15 -0
  81. package/package.json +1 -1
  82. package/dist-lib/chunks/avatar-DAmZ7fBZ.cjs.map +0 -1
  83. package/dist-lib/chunks/avatar-FPbG1TRy.mjs.map +0 -1
  84. package/dist-lib/chunks/toggle-group-C9rrkkmh.cjs.map +0 -1
  85. package/dist-lib/chunks/toggle-group-mXbG8_Jm.mjs.map +0 -1
  86. package/dist-lib/chunks/useTheme-Bk8AYqLr.mjs.map +0 -1
  87. package/dist-lib/chunks/useTheme-Dh3POjCr.cjs.map +0 -1
@@ -0,0 +1,84 @@
1
+ import { ReactNode } from 'react';
2
+ import { TabsNavigationTabProps, TabsNavigationPanelProps, TabsNavigationProps } from './tabs-navigation.types';
3
+ /**
4
+ * Título da aba. Existe pra não obrigar ninguém a decorar `truncate text-body-sm` — e pra o
5
+ * peso acompanhar a seleção: na aba ativa o título vai a `font-semibold` e herda o
6
+ * `text-fg-strong` da aba (branco puro no escuro, o tom mais escuro no claro). Nas inativas
7
+ * fica `font-medium` sobre `fg-muted`, que é o contraste de "aberta, mas não é esta".
8
+ */
9
+ export declare function TabsNavigationTitle({ children, className, ...rest }: React.HTMLAttributes<HTMLSpanElement>): import("react/jsx-runtime").JSX.Element;
10
+ export declare namespace TabsNavigationTitle {
11
+ var displayName: string;
12
+ }
13
+ /** Subtítulo — some sozinho quando a tira é `density="compact"`. */
14
+ export declare function TabsNavigationSubtitle({ children, className, ...rest }: React.HTMLAttributes<HTMLSpanElement>): import("react/jsx-runtime").JSX.Element | null;
15
+ export declare namespace TabsNavigationSubtitle {
16
+ var displayName: string;
17
+ }
18
+ /**
19
+ * Ação inline da aba. 24px porque o menor `size="icon-*"` do `Button` é 32px e não cabe numa
20
+ * aba de 40px sem espremer o título — é o mesmo motivo de o `+` da tira usar `Button` e este
21
+ * não. `stopPropagation` embutido: clique na ação não pode selecionar a aba.
22
+ */
23
+ export declare const TabsNavigationAction: import('react').ForwardRefExoticComponent<import('react').ButtonHTMLAttributes<HTMLButtonElement> & {
24
+ tom?: "neutro" | "success" | "danger";
25
+ } & import('react').RefAttributes<HTMLButtonElement>>;
26
+ /** Ações GLOBAIS da tira (busca, preferências) — ficam à direita, depois de uma divisória. */
27
+ export declare function TabsNavigationActions({ children }: {
28
+ children?: ReactNode;
29
+ }): import("react/jsx-runtime").JSX.Element;
30
+ export declare namespace TabsNavigationActions {
31
+ var displayName: string;
32
+ }
33
+ /**
34
+ * Painel de conteúdo — opcional. Só faz sentido quando o conteúdo mora DENTRO da árvore do
35
+ * componente; quando mora fora (outra coluna, outra rota), use `panelId` na aba.
36
+ */
37
+ export declare function TabsNavigationPanel({ value, children, className, ...rest }: TabsNavigationPanelProps): import("react/jsx-runtime").JSX.Element | null;
38
+ export declare namespace TabsNavigationPanel {
39
+ var displayName: string;
40
+ }
41
+ export declare const TabsNavigationTab: import('react').ForwardRefExoticComponent<TabsNavigationTabProps & import('react').RefAttributes<HTMLDivElement>>;
42
+ /**
43
+ * `TabsNavigation` — tira de abas de navegação, no estilo das abas de um navegador.
44
+ *
45
+ * ## O conteúdo mora onde você quiser
46
+ *
47
+ * O componente é **sempre controlado** e não hospeda o conteúdo: ele diz qual aba está ativa
48
+ * (`value` / `onValueChange`) e o consumidor troca o que quiser, onde quiser — outra coluna,
49
+ * outra rota, outro componente. Pra fechar a acessibilidade com o painel fora, dê `panelId` à
50
+ * aba (vira `aria-controls`); com o painel dentro, use `<TabsNavigation.Panel>`.
51
+ *
52
+ * ## Composição, não configuração
53
+ *
54
+ * `leading`, `children`, `status`, `badge` e `actions` aceitam qualquer nó. `actions`
55
+ * **substitui** as ações padrão — é por ele que entram ✓/✗ de aceitar/recusar um chamado, ou
56
+ * cinco botões, ou nenhum.
57
+ *
58
+ * @example
59
+ * <TabsNavigation value={id} onValueChange={setId} aria-label="Conversas abertas" onNewTab={abrir}>
60
+ * <TabsNavigation.Tab
61
+ * value="c1"
62
+ * leading={<Avatar size="sm" colorHex="#2563EB">MS</Avatar>}
63
+ * status="success"
64
+ * badge={3}
65
+ * panelId="painel"
66
+ * onClose={() => fechar("c1")}
67
+ * >
68
+ * <TabsNavigation.Title>Maria Silva</TabsNavigation.Title>
69
+ * <TabsNavigation.Subtitle>Fatura de julho</TabsNavigation.Subtitle>
70
+ * </TabsNavigation.Tab>
71
+ * </TabsNavigation>
72
+ */
73
+ export declare const TabsNavigationRoot: import('react').ForwardRefExoticComponent<TabsNavigationProps & import('react').RefAttributes<HTMLDivElement>>;
74
+ type TabsNavigationCompound = typeof TabsNavigationRoot & {
75
+ Tab: typeof TabsNavigationTab;
76
+ Title: typeof TabsNavigationTitle;
77
+ Subtitle: typeof TabsNavigationSubtitle;
78
+ Action: typeof TabsNavigationAction;
79
+ Actions: typeof TabsNavigationActions;
80
+ Panel: typeof TabsNavigationPanel;
81
+ };
82
+ export declare const TabsNavigation: TabsNavigationCompound;
83
+ export {};
84
+ //# sourceMappingURL=tabs-navigation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tabs-navigation.d.ts","sourceRoot":"","sources":["../../../../../src/components/ui/TabsNavigation/tabs-navigation.tsx"],"names":[],"mappings":"AAAA,OAAO,EAYL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AA4Bf,OAAO,KAAK,EACV,sBAAsB,EACtB,wBAAwB,EACxB,mBAAmB,EAEpB,MAAM,yBAAyB,CAAC;AAQjC;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,eAAe,CAAC,2CAa1G;yBAbe,mBAAmB;;;AAgBnC,oEAAoE;AACpE,wBAAgB,sBAAsB,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,eAAe,CAAC,kDAW7G;yBAXe,sBAAsB;;;AActC;;;;GAIG;AACH,eAAO,MAAM,oBAAoB;UAEyB,QAAQ,GAAG,SAAS,GAAG,QAAQ;qDAcvF,CAAC;AAGH,8FAA8F;AAC9F,wBAAgB,qBAAqB,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,CAAC,EAAE,SAAS,CAAA;CAAE,2CAE3E;yBAFe,qBAAqB;;;AAKrC;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,wBAAwB,kDAcpG;yBAde,mBAAmB;;;AAmBnC,eAAO,MAAM,iBAAiB,mHA0H5B,CAAC;AAiCH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,eAAO,MAAM,kBAAkB,gHA4Q7B,CAAC;AAEH,KAAK,sBAAsB,GAAG,OAAO,kBAAkB,GAAG;IACxD,GAAG,EAAE,OAAO,iBAAiB,CAAC;IAC9B,KAAK,EAAE,OAAO,mBAAmB,CAAC;IAClC,QAAQ,EAAE,OAAO,sBAAsB,CAAC;IACxC,MAAM,EAAE,OAAO,oBAAoB,CAAC;IACpC,OAAO,EAAE,OAAO,qBAAqB,CAAC;IACtC,KAAK,EAAE,OAAO,mBAAmB,CAAC;CACnC,CAAC;AAEF,eAAO,MAAM,cAAc,EAOrB,sBAAsB,CAAC"}
@@ -0,0 +1,393 @@
1
+ import { VariantProps } from '../../../utils/tv';
2
+ /**
3
+ * TabsNavigation styles — iGreen DS
4
+ *
5
+ * Tira de abas de NAVEGAÇÃO (estilo navegador): cada aba é uma sessão aberta, não um filtro
6
+ * de conteúdo dentro da tela. A diferença pro `Tabs` do shadcn não é estética — é que aqui a
7
+ * aba ativa **se une fisicamente** ao conteúdo, e é esse detalhe que carrega o componente.
8
+ *
9
+ * ## Os dois mecanismos de união, e por que são dois
10
+ *
11
+ * - **`fill: false` (aba pousada).** A tira tem uma régua de 1px embaixo; a aba ativa desce
12
+ * 1px (`-mb-px`) e pinta essa régua com a própria cor de fundo. Sem o truque ela vira um
13
+ * botão pousado sobre uma linha — que é exatamente o `Tabs` variante `line` que já existe.
14
+ * - **`fill: true` (altura total).** A aba ocupa a faixa inteira e a tira **não tem régua**:
15
+ * a união vira continuidade de cor. O truque do `-mb-px` foi medido aqui e não serve — a
16
+ * aba parava 2px antes da régua (1px do `pb-px` do trilho + 1px da borda da faixa), e
17
+ * fresta é pior que linha nenhuma.
18
+ *
19
+ * ## A superfície é prop, não constante
20
+ *
21
+ * A aba ativa TEM que ser a mesma cor do conteúdo abaixo dela. Num card é `bg-surface`; se o
22
+ * conteúdo for a página, é `bg-canvas`. Errar isso quebra a união, que é o componente inteiro.
23
+ *
24
+ * ## O fundo recuado usa DOIS tokens, um por modo — e isso é deliberado
25
+ *
26
+ * `bg-subtle` no claro, `bg-canvas` no escuro. Medido: no claro `canvas` é branco IGUAL a
27
+ * `surface` (recuo zero) e quem recua é `subtle` (0.973); no escuro `subtle` é branco a 1%
28
+ * sobre o card (invisível) e quem recua é `canvas` (0.205 contra 0.225). Cada modo tem o seu
29
+ * token de recuo, e o par existente cobre o papel — não há token novo aqui.
30
+ */
31
+ export declare const tabsNavigationRoot: import('tailwind-variants').TVReturnType<{
32
+ /**
33
+ * O RESPIRO DO TOPO É DO COMPONENTE, não do consumidor — e isso é o que torna a peça
34
+ * independente da superfície onde ela cai.
35
+ *
36
+ * Enquanto o padding vinha de um wrapper por fora, aquela faixa de 8px acima das abas
37
+ * ficava com a cor do container (a superfície do card) enquanto a tira ficava com o
38
+ * recuo: duas cores na mesma banda, e a aba inativa parecia "um botão de outra cor
39
+ * pousado num fundo diferente". Trazendo o padding pra cá, o recuo cobre a banda inteira
40
+ * e a ÚNICA coisa com fundo próprio passa a ser a aba ativa.
41
+ */
42
+ respiro: {
43
+ comfortable: string;
44
+ compact: string;
45
+ nenhum: string;
46
+ };
47
+ /**
48
+ * `items-stretch` é o que faz a aba de altura total valer: com `items-end` ela encolheria
49
+ * pro próprio conteúdo e o `h-full` não teria contra o que medir. A régua some junto.
50
+ */
51
+ fill: {
52
+ true: string;
53
+ false: string;
54
+ };
55
+ /**
56
+ * Fundo recuado da tira — o par por modo explicado no cabeçalho deste arquivo.
57
+ *
58
+ * No claro é `bg-emphasis` (0.94), não `bg-subtle` (0.973): contra a aba ativa branca, o
59
+ * delta de 0.027 do subtle quase não se lia. Com `emphasis` o recuo é 0.06 e a aba
60
+ * selecionada salta. No escuro `emphasis` é branco a 12% **sobre** o que está atrás, ou
61
+ * seja mais CLARO que a superfície (0.28 contra 0.225) — inverteria a hierarquia; ali quem
62
+ * recua continua sendo `canvas`, e o reforço vem da sombra na aba ativa.
63
+ */
64
+ chrome: {
65
+ true: string;
66
+ false: string;
67
+ };
68
+ }, undefined, "flex gap-gp-2xs px-pad-lg", {
69
+ /**
70
+ * O RESPIRO DO TOPO É DO COMPONENTE, não do consumidor — e isso é o que torna a peça
71
+ * independente da superfície onde ela cai.
72
+ *
73
+ * Enquanto o padding vinha de um wrapper por fora, aquela faixa de 8px acima das abas
74
+ * ficava com a cor do container (a superfície do card) enquanto a tira ficava com o
75
+ * recuo: duas cores na mesma banda, e a aba inativa parecia "um botão de outra cor
76
+ * pousado num fundo diferente". Trazendo o padding pra cá, o recuo cobre a banda inteira
77
+ * e a ÚNICA coisa com fundo próprio passa a ser a aba ativa.
78
+ */
79
+ respiro: {
80
+ comfortable: string;
81
+ compact: string;
82
+ nenhum: string;
83
+ };
84
+ /**
85
+ * `items-stretch` é o que faz a aba de altura total valer: com `items-end` ela encolheria
86
+ * pro próprio conteúdo e o `h-full` não teria contra o que medir. A régua some junto.
87
+ */
88
+ fill: {
89
+ true: string;
90
+ false: string;
91
+ };
92
+ /**
93
+ * Fundo recuado da tira — o par por modo explicado no cabeçalho deste arquivo.
94
+ *
95
+ * No claro é `bg-emphasis` (0.94), não `bg-subtle` (0.973): contra a aba ativa branca, o
96
+ * delta de 0.027 do subtle quase não se lia. Com `emphasis` o recuo é 0.06 e a aba
97
+ * selecionada salta. No escuro `emphasis` é branco a 12% **sobre** o que está atrás, ou
98
+ * seja mais CLARO que a superfície (0.28 contra 0.225) — inverteria a hierarquia; ali quem
99
+ * recua continua sendo `canvas`, e o reforço vem da sombra na aba ativa.
100
+ */
101
+ chrome: {
102
+ true: string;
103
+ false: string;
104
+ };
105
+ }, undefined, import('tailwind-variants').TVReturnType<{
106
+ /**
107
+ * O RESPIRO DO TOPO É DO COMPONENTE, não do consumidor — e isso é o que torna a peça
108
+ * independente da superfície onde ela cai.
109
+ *
110
+ * Enquanto o padding vinha de um wrapper por fora, aquela faixa de 8px acima das abas
111
+ * ficava com a cor do container (a superfície do card) enquanto a tira ficava com o
112
+ * recuo: duas cores na mesma banda, e a aba inativa parecia "um botão de outra cor
113
+ * pousado num fundo diferente". Trazendo o padding pra cá, o recuo cobre a banda inteira
114
+ * e a ÚNICA coisa com fundo próprio passa a ser a aba ativa.
115
+ */
116
+ respiro: {
117
+ comfortable: string;
118
+ compact: string;
119
+ nenhum: string;
120
+ };
121
+ /**
122
+ * `items-stretch` é o que faz a aba de altura total valer: com `items-end` ela encolheria
123
+ * pro próprio conteúdo e o `h-full` não teria contra o que medir. A régua some junto.
124
+ */
125
+ fill: {
126
+ true: string;
127
+ false: string;
128
+ };
129
+ /**
130
+ * Fundo recuado da tira — o par por modo explicado no cabeçalho deste arquivo.
131
+ *
132
+ * No claro é `bg-emphasis` (0.94), não `bg-subtle` (0.973): contra a aba ativa branca, o
133
+ * delta de 0.027 do subtle quase não se lia. Com `emphasis` o recuo é 0.06 e a aba
134
+ * selecionada salta. No escuro `emphasis` é branco a 12% **sobre** o que está atrás, ou
135
+ * seja mais CLARO que a superfície (0.28 contra 0.225) — inverteria a hierarquia; ali quem
136
+ * recua continua sendo `canvas`, e o reforço vem da sombra na aba ativa.
137
+ */
138
+ chrome: {
139
+ true: string;
140
+ false: string;
141
+ };
142
+ }, undefined, "flex gap-gp-2xs px-pad-lg", unknown, unknown, undefined>>;
143
+ export declare const tabsNavigationTrilho: import('tailwind-variants').TVReturnType<{
144
+ /** o `pb-px` só existe pra o `-mb-px` da aba não ser cortado pelo overflow. */
145
+ fill: {
146
+ true: string;
147
+ false: string;
148
+ };
149
+ }, undefined, "flex min-w-0 flex-1 gap-gp-2xs overflow-x-auto scrollbar-none", {
150
+ /** o `pb-px` só existe pra o `-mb-px` da aba não ser cortado pelo overflow. */
151
+ fill: {
152
+ true: string;
153
+ false: string;
154
+ };
155
+ }, undefined, import('tailwind-variants').TVReturnType<{
156
+ /** o `pb-px` só existe pra o `-mb-px` da aba não ser cortado pelo overflow. */
157
+ fill: {
158
+ true: string;
159
+ false: string;
160
+ };
161
+ }, undefined, "flex min-w-0 flex-1 gap-gp-2xs overflow-x-auto scrollbar-none", unknown, unknown, undefined>>;
162
+ export declare const tabsNavigationTab: import('tailwind-variants').TVReturnType<{
163
+ /**
164
+ * A largura é fixa (aba que cresce com o título faz a fila dançar a cada troca) — mas
165
+ * fixa em DOIS degraus: no celular, 228px é quase a tela inteira e o usuário vê uma aba
166
+ * e meia, sem noção de que há uma fila. Abaixo de `sm` a aba cai pra ~168/148px, que
167
+ * mostra duas e meia e deixa o gesto de arrastar fazer sentido.
168
+ */
169
+ density: {
170
+ comfortable: string;
171
+ compact: string;
172
+ };
173
+ fill: {
174
+ true: string;
175
+ false: string;
176
+ };
177
+ /** A superfície da aba ATIVA — tem que casar com o conteúdo logo abaixo dela. */
178
+ surface: {
179
+ surface: string;
180
+ canvas: string;
181
+ };
182
+ ativa: {
183
+ /**
184
+ * `shadow-sh-sm` faz o trabalho que a cor não consegue no escuro: ali a ativa (0.225) e
185
+ * o recuo (0.205) distam 0.02, e mudar a cor da ativa quebraria a união com o conteúdo,
186
+ * que é o ponto do componente. A sombra separa sem mexer na cor — e no dark ela vem
187
+ * amplificada por token (L-011).
188
+ */
189
+ true: string;
190
+ false: string;
191
+ };
192
+ }, undefined, string[], {
193
+ /**
194
+ * A largura é fixa (aba que cresce com o título faz a fila dançar a cada troca) — mas
195
+ * fixa em DOIS degraus: no celular, 228px é quase a tela inteira e o usuário vê uma aba
196
+ * e meia, sem noção de que há uma fila. Abaixo de `sm` a aba cai pra ~168/148px, que
197
+ * mostra duas e meia e deixa o gesto de arrastar fazer sentido.
198
+ */
199
+ density: {
200
+ comfortable: string;
201
+ compact: string;
202
+ };
203
+ fill: {
204
+ true: string;
205
+ false: string;
206
+ };
207
+ /** A superfície da aba ATIVA — tem que casar com o conteúdo logo abaixo dela. */
208
+ surface: {
209
+ surface: string;
210
+ canvas: string;
211
+ };
212
+ ativa: {
213
+ /**
214
+ * `shadow-sh-sm` faz o trabalho que a cor não consegue no escuro: ali a ativa (0.225) e
215
+ * o recuo (0.205) distam 0.02, e mudar a cor da ativa quebraria a união com o conteúdo,
216
+ * que é o ponto do componente. A sombra separa sem mexer na cor — e no dark ela vem
217
+ * amplificada por token (L-011).
218
+ */
219
+ true: string;
220
+ false: string;
221
+ };
222
+ }, undefined, import('tailwind-variants').TVReturnType<{
223
+ /**
224
+ * A largura é fixa (aba que cresce com o título faz a fila dançar a cada troca) — mas
225
+ * fixa em DOIS degraus: no celular, 228px é quase a tela inteira e o usuário vê uma aba
226
+ * e meia, sem noção de que há uma fila. Abaixo de `sm` a aba cai pra ~168/148px, que
227
+ * mostra duas e meia e deixa o gesto de arrastar fazer sentido.
228
+ */
229
+ density: {
230
+ comfortable: string;
231
+ compact: string;
232
+ };
233
+ fill: {
234
+ true: string;
235
+ false: string;
236
+ };
237
+ /** A superfície da aba ATIVA — tem que casar com o conteúdo logo abaixo dela. */
238
+ surface: {
239
+ surface: string;
240
+ canvas: string;
241
+ };
242
+ ativa: {
243
+ /**
244
+ * `shadow-sh-sm` faz o trabalho que a cor não consegue no escuro: ali a ativa (0.225) e
245
+ * o recuo (0.205) distam 0.02, e mudar a cor da ativa quebraria a união com o conteúdo,
246
+ * que é o ponto do componente. A sombra separa sem mexer na cor — e no dark ela vem
247
+ * amplificada por token (L-011).
248
+ */
249
+ true: string;
250
+ false: string;
251
+ };
252
+ }, undefined, string[], unknown, unknown, undefined>>;
253
+ /**
254
+ * Divisória curta entre abas — 20px, não altura cheia: altura cheia transformaria a tira num
255
+ * toolbar segmentado, que é outra leitura. Centrar depende do modo, porque o eixo do flex
256
+ * muda: `items-end` no pousado (daí a margem), `items-stretch` no cheio (daí `self-center`).
257
+ */
258
+ export declare const tabsNavigationDivisoria: import('tailwind-variants').TVReturnType<{
259
+ fill: {
260
+ true: string;
261
+ false: string;
262
+ };
263
+ /** Ao lado da aba ativa some: encostada na borda dela vira uma sombra falsa. */
264
+ oculta: {
265
+ true: string;
266
+ false: string;
267
+ };
268
+ }, undefined, "w-px shrink-0 bg-border-default", {
269
+ fill: {
270
+ true: string;
271
+ false: string;
272
+ };
273
+ /** Ao lado da aba ativa some: encostada na borda dela vira uma sombra falsa. */
274
+ oculta: {
275
+ true: string;
276
+ false: string;
277
+ };
278
+ }, undefined, import('tailwind-variants').TVReturnType<{
279
+ fill: {
280
+ true: string;
281
+ false: string;
282
+ };
283
+ /** Ao lado da aba ativa some: encostada na borda dela vira uma sombra falsa. */
284
+ oculta: {
285
+ true: string;
286
+ false: string;
287
+ };
288
+ }, undefined, "w-px shrink-0 bg-border-default", unknown, unknown, undefined>>;
289
+ /**
290
+ * A faixa dos controles (setas, `+`, lista, ações globais) tem a MESMA altura da aba e
291
+ * centraliza — é isso que alinha a fileira. Medido: com 48px fixos ao lado de abas de 40px,
292
+ * ou dentro de uma faixa de 56px no modo cheio, tudo descia 4px do eixo.
293
+ */
294
+ export declare const tabsNavigationControles: import('tailwind-variants').TVReturnType<{
295
+ fill: {
296
+ true: string;
297
+ false: string;
298
+ };
299
+ density: {
300
+ comfortable: string;
301
+ compact: string;
302
+ };
303
+ }, undefined, "flex shrink-0 items-center gap-gp-2xs", {
304
+ fill: {
305
+ true: string;
306
+ false: string;
307
+ };
308
+ density: {
309
+ comfortable: string;
310
+ compact: string;
311
+ };
312
+ }, undefined, import('tailwind-variants').TVReturnType<{
313
+ fill: {
314
+ true: string;
315
+ false: string;
316
+ };
317
+ density: {
318
+ comfortable: string;
319
+ compact: string;
320
+ };
321
+ }, undefined, "flex shrink-0 items-center gap-gp-2xs", unknown, unknown, undefined>>;
322
+ /** Ação inline da aba (`⋯`, `×`, ✓/✗). 24px — o menor `icon-*` do Button é 32px e não cabe. */
323
+ export declare const tabsNavigationAcao: import('tailwind-variants').TVReturnType<{
324
+ tom: {
325
+ neutro: string;
326
+ success: string;
327
+ danger: string;
328
+ };
329
+ }, undefined, string[], {
330
+ tom: {
331
+ neutro: string;
332
+ success: string;
333
+ danger: string;
334
+ };
335
+ }, undefined, import('tailwind-variants').TVReturnType<{
336
+ tom: {
337
+ neutro: string;
338
+ success: string;
339
+ danger: string;
340
+ };
341
+ }, undefined, string[], unknown, unknown, undefined>>;
342
+ /**
343
+ * A coluna de ações CRESCE de 0fr a 1fr em vez de ficar reservada com `opacity-0`.
344
+ *
345
+ * Com opacidade os botões ocupavam 48px invisíveis e o título truncava por causa de espaço
346
+ * que ninguém usava (medido: um título que cabia em 149px vinha cortado). `0fr → 1fr` é
347
+ * interpolável em qualquer engine — `interpolate-size`/`calc-size()` fariam isso direto, mas
348
+ * ainda não são Baseline e o DS entrega pra navegador que não escolhemos.
349
+ */
350
+ export declare const tabsNavigationAcoes: import('tailwind-variants').TVReturnType<{
351
+ visivel: {
352
+ true: string;
353
+ false: string;
354
+ };
355
+ }, undefined, "grid transition-[grid-template-columns,opacity] duration-150 ease-out", {
356
+ visivel: {
357
+ true: string;
358
+ false: string;
359
+ };
360
+ }, undefined, import('tailwind-variants').TVReturnType<{
361
+ visivel: {
362
+ true: string;
363
+ false: string;
364
+ };
365
+ }, undefined, "grid transition-[grid-template-columns,opacity] duration-150 ease-out", unknown, unknown, undefined>>;
366
+ /** O ponto de status. Ponto, não Chip: 5 abas abertas = 5 chips brigando com os títulos. */
367
+ export declare const tabsNavigationStatus: import('tailwind-variants').TVReturnType<{
368
+ status: {
369
+ success: string;
370
+ warning: string;
371
+ danger: string;
372
+ info: string;
373
+ neutral: string;
374
+ };
375
+ }, undefined, "size-icon-2xs shrink-0", {
376
+ status: {
377
+ success: string;
378
+ warning: string;
379
+ danger: string;
380
+ info: string;
381
+ neutral: string;
382
+ };
383
+ }, undefined, import('tailwind-variants').TVReturnType<{
384
+ status: {
385
+ success: string;
386
+ warning: string;
387
+ danger: string;
388
+ info: string;
389
+ neutral: string;
390
+ };
391
+ }, undefined, "size-icon-2xs shrink-0", unknown, unknown, undefined>>;
392
+ export type TabsNavigationVariantProps = VariantProps<typeof tabsNavigationTab>;
393
+ //# sourceMappingURL=tabs-navigation.styles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tabs-navigation.styles.d.ts","sourceRoot":"","sources":["../../../../../src/components/ui/TabsNavigation/tabs-navigation.styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAM,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAEnD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,eAAO,MAAM,kBAAkB;IAI3B;;;;;;;;;OASG;;;;;;IAMH;;;OAGG;;;;;IAKH;;;;;;;;OAQG;;;;;;IA/BH;;;;;;;;;OASG;;;;;;IAMH;;;OAGG;;;;;IAKH;;;;;;;;OAQG;;;;;;IA/BH;;;;;;;;;OASG;;;;;;IAMH;;;OAGG;;;;;IAKH;;;;;;;;OAQG;;;;;wEAQL,CAAC;AAEH,eAAO,MAAM,oBAAoB;IAQ7B,+EAA+E;;;;;;IAA/E,+EAA+E;;;;;;IAA/E,+EAA+E;;;;;4GAQjF,CAAC;AAEH,eAAO,MAAM,iBAAiB;IAS1B;;;;;OAKG;;;;;;;;;IASH,iFAAiF;;;;;;QAM/E;;;;;WAKG;;;;;IAzBL;;;;;OAKG;;;;;;;;;IASH,iFAAiF;;;;;;QAM/E;;;;;WAKG;;;;;IAzBL;;;;;OAKG;;;;;;;;;IASH,iFAAiF;;;;;;QAM/E;;;;;WAKG;;;;qDAyBP,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,uBAAuB;;;;;IAQhC,gFAAgF;;;;;;;;;;IAAhF,gFAAgF;;;;;;;;;;IAAhF,gFAAgF;;;;;8EAQlF,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;oFAclC,CAAC;AAEH,+FAA+F;AAC/F,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;qDAe7B,CAAC;AAEH;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;oHAY9B,CAAC;AAEH,4FAA4F;AAC5F,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;qEAc/B,CAAC;AAEH,MAAM,MAAM,0BAA0B,GAAG,YAAY,CAAC,OAAO,iBAAiB,CAAC,CAAC"}
@@ -0,0 +1,99 @@
1
+ import { ReactNode } from 'react';
2
+ /** Superfície do CONTEÚDO abaixo da tira — a aba ativa precisa ser a mesma cor pra unir. */
3
+ export type TabsNavigationSurface = "surface" | "canvas";
4
+ /** `comfortable` = título + subtítulo (48px) · `compact` = só título (40px). */
5
+ export type TabsNavigationDensity = "comfortable" | "compact";
6
+ /** Tom do ponto de status. Passe um `ReactNode` em `status` pra desenhar o seu. */
7
+ export type TabsNavigationStatus = "success" | "warning" | "danger" | "info" | "neutral";
8
+ export interface TabsNavigationProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "onChange"> {
9
+ /** `value` da aba ativa. O componente é SEMPRE controlado — ver `TabsNavigationProps.onValueChange`. */
10
+ value: string;
11
+ /**
12
+ * Chamado quando o usuário escolhe outra aba (clique, teclado ou lista de overflow).
13
+ *
14
+ * O componente **não hospeda o conteúdo**: ele diz qual aba está ativa e o consumidor
15
+ * decide o que trocar. É o que permite o painel morar fora — outra coluna, outra rota,
16
+ * outro componente. Pra fechar a acessibilidade nesse caso, passe `panelId` na aba.
17
+ */
18
+ onValueChange: (value: string) => void;
19
+ /**
20
+ * Superfície do conteúdo logo abaixo da tira. A aba ativa é pintada com ela — é o que a
21
+ * une ao conteúdo. Num card `surface`; se o conteúdo for a própria página, `canvas`.
22
+ * @default "surface"
23
+ */
24
+ surface?: TabsNavigationSurface;
25
+ /**
26
+ * `compact` remove o subtítulo e baixa a aba pra 40px. É escolha de CONTEÚDO, não de
27
+ * densidade: sem subtítulo, duas conversas do mesmo cliente ficam idênticas.
28
+ * @default "comfortable"
29
+ */
30
+ density?: TabsNavigationDensity;
31
+ /**
32
+ * `true` = a aba ocupa a faixa inteira (lê como segmento, não como aba de navegador) e a
33
+ * tira perde a régua — a união passa a ser por continuidade de cor.
34
+ * @default false
35
+ */
36
+ fill?: boolean;
37
+ /**
38
+ * `persistent` mantém as ações da aba sempre visíveis. Use quando a ação exige decisão
39
+ * (aceitar/recusar um chamado): revelar no hover esconde justamente o que precisa ser visto.
40
+ * @default "hover"
41
+ */
42
+ actionsMode?: "hover" | "persistent";
43
+ /**
44
+ * Pinta o fundo recuado da tira (`bg-subtle` no claro, `bg-canvas` no escuro — cada modo tem
45
+ * o seu token de recuo). Desligue quando o container já pinta o fundo.
46
+ * @default true
47
+ */
48
+ chrome?: boolean;
49
+ /** Com isto, o `+` aparece — fora do trilho, pra não sair de alcance quando as abas rolam. */
50
+ onNewTab?: () => void;
51
+ /** Rótulo do conjunto pro leitor de tela, ex.: `"Conversas abertas"`. */
52
+ "aria-label"?: string;
53
+ /** `<TabsNavigation.Tab>`s e, opcionalmente, um `<TabsNavigation.Actions>`. */
54
+ children?: ReactNode;
55
+ }
56
+ export interface TabsNavigationTabProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "onSelect"> {
57
+ /** Identidade da aba — é o que volta em `onValueChange`. */
58
+ value: string;
59
+ /** Qualquer nó à esquerda: `Avatar`, `Icon`, imagem, sigla. */
60
+ leading?: ReactNode;
61
+ /** Ponto de status pronto, ou o seu próprio nó. */
62
+ status?: TabsNavigationStatus | ReactNode;
63
+ /** Contador (número) ou qualquer nó. Some quando a aba está ativa — o usuário já está lendo. */
64
+ badge?: number | ReactNode;
65
+ /**
66
+ * SUBSTITUI as ações padrão. Passe quantas quiser (`<TabsNavigation.Action>` ou qualquer botão) —
67
+ * é aqui que entram ✓/✗ de aceitar/recusar, "fixar", "duplicar".
68
+ */
69
+ actions?: ReactNode;
70
+ /** Sem `actions`, declarar `onClose` liga as ações padrão (`⋯` de opções + `×` de fechar). */
71
+ onClose?: () => void;
72
+ /** Itens extras do menu `⋯` das ações padrão. Ignorado quando `actions` é passado. */
73
+ menu?: ReactNode;
74
+ /**
75
+ * `id` do elemento que esta aba controla, quando o conteúdo mora FORA do componente.
76
+ * Emite `aria-controls`. Dentro, prefira `<TabsNavigation.Panel value="…">`.
77
+ */
78
+ panelId?: string;
79
+ /** Mantém as ações visíveis só nesta aba (o `pendente` do caso de chamados). */
80
+ actionsAlwaysVisible?: boolean;
81
+ /**
82
+ * Resumo mostrado ao pousar o ponteiro (500ms) — foto maior, contato, últimas informações.
83
+ * Qualquer nó; o conteúdo é seu.
84
+ *
85
+ * Existe como prop, e não envolvendo a aba num `HoverCard` por fora, porque a raiz separa os
86
+ * filhos por tipo pra montar a lista de overflow e a navegação por seta: um wrapper no lugar
87
+ * do `Tab` a faria perder a aba. ⚠️ Não é o lugar de ação nem de informação essencial —
88
+ * hover não existe no toque.
89
+ */
90
+ hoverCard?: ReactNode;
91
+ /** `<TabsNavigation.Title>` + `<TabsNavigation.Subtitle>`, ou a composição que você quiser. */
92
+ children?: ReactNode;
93
+ }
94
+ export interface TabsNavigationPanelProps extends React.HTMLAttributes<HTMLDivElement> {
95
+ /** Casa com o `value` da aba. Renderiza apenas quando ela está ativa. */
96
+ value: string;
97
+ children?: ReactNode;
98
+ }
99
+ //# sourceMappingURL=tabs-navigation.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tabs-navigation.types.d.ts","sourceRoot":"","sources":["../../../../../src/components/ui/TabsNavigation/tabs-navigation.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,4FAA4F;AAC5F,MAAM,MAAM,qBAAqB,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEzD,gFAAgF;AAChF,MAAM,MAAM,qBAAqB,GAAG,aAAa,GAAG,SAAS,CAAC;AAE9D,mFAAmF;AACnF,MAAM,MAAM,oBAAoB,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC;AAEzF,MAAM,WAAW,mBAAoB,SAAQ,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC;IACjG,wGAAwG;IACxG,KAAK,EAAE,MAAM,CAAC;IAEd;;;;;;OAMG;IACH,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAEvC;;;;OAIG;IACH,OAAO,CAAC,EAAE,qBAAqB,CAAC;IAEhC;;;;OAIG;IACH,OAAO,CAAC,EAAE,qBAAqB,CAAC;IAEhC;;;;OAIG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IAEf;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,GAAG,YAAY,CAAC;IAErC;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB,8FAA8F;IAC9F,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IAEtB,yEAAyE;IACzE,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,MAAM,WAAW,sBAAuB,SAAQ,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC;IACpG,4DAA4D;IAC5D,KAAK,EAAE,MAAM,CAAC;IAEd,+DAA+D;IAC/D,OAAO,CAAC,EAAE,SAAS,CAAC;IAEpB,mDAAmD;IACnD,MAAM,CAAC,EAAE,oBAAoB,GAAG,SAAS,CAAC;IAE1C,gGAAgG;IAChG,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAE3B;;;OAGG;IACH,OAAO,CAAC,EAAE,SAAS,CAAC;IAEpB,8FAA8F;IAC9F,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IAErB,sFAAsF;IACtF,IAAI,CAAC,EAAE,SAAS,CAAC;IAEjB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,gFAAgF;IAChF,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAE/B;;;;;;;;OAQG;IACH,SAAS,CAAC,EAAE,SAAS,CAAC;IAEtB,+FAA+F;IAC/F,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,MAAM,WAAW,wBAAyB,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;IACpF,yEAAyE;IACzE,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB"}
@@ -0,0 +1,26 @@
1
+ import { RefObject } from 'react';
2
+ /**
3
+ * `useArrastarParaRolar` — segurar e arrastar a tira pra rolar horizontalmente.
4
+ *
5
+ * ## Por que não importei o `useGrabToScroll` do DataTable
6
+ *
7
+ * Ele existe (`ui/DataTable/hooks/use-grab-to-scroll.ts`) e resolve o mesmo gesto, mas está
8
+ * dentro do item `data-table` do registry: importá-lo faria o `tabs-navigation` **depender da
9
+ * tabela inteira** no copy-in — o consumidor puxaria DataTable + TableToolbar + virtual pra
10
+ * ter aba. Metade daquele hook também é específica de tabela (pula célula editável,
11
+ * expansível, de seleção), coisas que não existem aqui. Esta versão é o mesmo comportamento
12
+ * sem a parte que não se aplica.
13
+ *
14
+ * ## O que ele faz, e o que deliberadamente NÃO faz
15
+ *
16
+ * - **Só mouse/pen.** Em `pointer: coarse` (celular, tablet) o navegador já rola a tira no
17
+ * swipe, nativamente e com inércia. Interceptar ali seria trocar um gesto bom por um pior.
18
+ * - **Limiar de 6px** antes de virar arrasto: abaixo disso o gesto continua sendo um clique, e
19
+ * selecionar aba arrastando 2px por acidente não acontece.
20
+ * - **Engole o clique seguinte** ao arrasto (fase de captura) — senão soltar o ponteiro em
21
+ * cima de uma aba a selecionaria no fim de todo arrasto.
22
+ * - **Não toca em alvo interativo** (botão, link, menu): ali o gesto é do controle, não da
23
+ * tira. Sem isso, arrastar 6px começando no `×` fecharia a aba errada ou nenhuma.
24
+ */
25
+ export declare function useArrastarParaRolar(trilho: RefObject<HTMLElement | null>, ativo?: boolean, limiarPx?: number): void;
26
+ //# sourceMappingURL=use-arrastar-para-rolar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-arrastar-para-rolar.d.ts","sourceRoot":"","sources":["../../../../../src/components/ui/TabsNavigation/use-arrastar-para-rolar.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAE1D;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,EACrC,KAAK,UAAO,EACZ,QAAQ,SAAI,GACX,IAAI,CAyFN"}
@@ -685,6 +685,21 @@ body {
685
685
  }
686
686
  }
687
687
 
688
+ /* Rola, mas sem barra visível. Existe pro caso em que a barra QUEBRA o layout, não por
689
+ estética: na tira do TabsNavigation ela ocupa 11px DENTRO do trilho e empurra as abas 11px pra
690
+ cima da régua — a união da aba ativa com o conteúdo, que é o componente inteiro, some.
691
+ Medido antes de existir esta utility; a alternativa era `[scrollbar-width:none]` +
692
+ `[&::-webkit-scrollbar]:hidden` na unha, em componente distribuído.
693
+ ⚠️ Só use quando houver outra affordance de navegação (setas, arrastar, teclado): barra
694
+ escondida sem substituto é conteúdo inalcançável pra quem só tem mouse. */
695
+ @utility scrollbar-none {
696
+ scrollbar-width: none;
697
+
698
+ &::-webkit-scrollbar {
699
+ display: none;
700
+ }
701
+ }
702
+
688
703
  /* ── Superfície flutuante (usadas por 14 componentes distribuídos) ────────── */
689
704
 
690
705
  @utility outline-float {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@snksergio/design-system",
3
- "version": "0.53.0",
3
+ "version": "0.55.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",