@snksergio/design-system 0.58.0 → 0.60.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 (92) hide show
  1. package/dist-lib/index.cjs +4461 -16
  2. package/dist-lib/index.cjs.map +1 -1
  3. package/dist-lib/index.mjs +4477 -32
  4. package/dist-lib/index.mjs.map +1 -1
  5. package/dist-lib/src/components/index.d.ts +1 -0
  6. package/dist-lib/src/components/index.d.ts.map +1 -1
  7. package/dist-lib/src/components/ui/Gantt/gantt.d.ts +21 -0
  8. package/dist-lib/src/components/ui/Gantt/gantt.d.ts.map +1 -0
  9. package/dist-lib/src/components/ui/Gantt/gantt.styles.d.ts +2985 -0
  10. package/dist-lib/src/components/ui/Gantt/gantt.styles.d.ts.map +1 -0
  11. package/dist-lib/src/components/ui/Gantt/gantt.types.d.ts +445 -0
  12. package/dist-lib/src/components/ui/Gantt/gantt.types.d.ts.map +1 -0
  13. package/dist-lib/src/components/ui/Gantt/hooks/drag.d.ts +71 -0
  14. package/dist-lib/src/components/ui/Gantt/hooks/drag.d.ts.map +1 -0
  15. package/dist-lib/src/components/ui/Gantt/hooks/filters.d.ts +79 -0
  16. package/dist-lib/src/components/ui/Gantt/hooks/filters.d.ts.map +1 -0
  17. package/dist-lib/src/components/ui/Gantt/hooks/layout.d.ts +232 -0
  18. package/dist-lib/src/components/ui/Gantt/hooks/layout.d.ts.map +1 -0
  19. package/dist-lib/src/components/ui/Gantt/hooks/links.d.ts +120 -0
  20. package/dist-lib/src/components/ui/Gantt/hooks/links.d.ts.map +1 -0
  21. package/dist-lib/src/components/ui/Gantt/hooks/week-segments.d.ts +69 -0
  22. package/dist-lib/src/components/ui/Gantt/hooks/week-segments.d.ts.map +1 -0
  23. package/dist-lib/src/components/ui/Gantt/index.d.ts +46 -0
  24. package/dist-lib/src/components/ui/Gantt/index.d.ts.map +1 -0
  25. package/dist-lib/src/components/ui/Gantt/parts/gantt-applied-filters.d.ts +20 -0
  26. package/dist-lib/src/components/ui/Gantt/parts/gantt-applied-filters.d.ts.map +1 -0
  27. package/dist-lib/src/components/ui/Gantt/parts/gantt-bar.d.ts +68 -0
  28. package/dist-lib/src/components/ui/Gantt/parts/gantt-bar.d.ts.map +1 -0
  29. package/dist-lib/src/components/ui/Gantt/parts/gantt-filter-panel.d.ts +16 -0
  30. package/dist-lib/src/components/ui/Gantt/parts/gantt-filter-panel.d.ts.map +1 -0
  31. package/dist-lib/src/components/ui/Gantt/parts/gantt-grid.d.ts +55 -0
  32. package/dist-lib/src/components/ui/Gantt/parts/gantt-grid.d.ts.map +1 -0
  33. package/dist-lib/src/components/ui/Gantt/parts/gantt-links-layer.d.ts +46 -0
  34. package/dist-lib/src/components/ui/Gantt/parts/gantt-links-layer.d.ts.map +1 -0
  35. package/dist-lib/src/components/ui/Gantt/parts/gantt-skeleton.d.ts +36 -0
  36. package/dist-lib/src/components/ui/Gantt/parts/gantt-skeleton.d.ts.map +1 -0
  37. package/dist-lib/src/components/ui/Gantt/parts/gantt-toolbar.d.ts +46 -0
  38. package/dist-lib/src/components/ui/Gantt/parts/gantt-toolbar.d.ts.map +1 -0
  39. package/dist-lib/src/components/ui/Gantt/views/calendar.d.ts +64 -0
  40. package/dist-lib/src/components/ui/Gantt/views/calendar.d.ts.map +1 -0
  41. package/dist-lib/src/components/ui/Gantt/views/list.d.ts +53 -0
  42. package/dist-lib/src/components/ui/Gantt/views/list.d.ts.map +1 -0
  43. package/dist-lib/src/components/ui/Gantt/views/timeline.d.ts +85 -0
  44. package/dist-lib/src/components/ui/Gantt/views/timeline.d.ts.map +1 -0
  45. package/dist-lib/src/components/ui/MessageBubble/index.d.ts +1 -1
  46. package/dist-lib/src/components/ui/MessageBubble/index.d.ts.map +1 -1
  47. package/dist-lib/src/components/ui/MessageBubble/message-bubble.d.ts +1 -1
  48. package/dist-lib/src/components/ui/MessageBubble/message-bubble.d.ts.map +1 -1
  49. package/dist-lib/src/components/ui/MessageBubble/message-bubble.styles.d.ts +22 -2
  50. package/dist-lib/src/components/ui/MessageBubble/message-bubble.styles.d.ts.map +1 -1
  51. package/dist-lib/src/components/ui/MessageBubble/message-bubble.types.d.ts +8 -0
  52. package/dist-lib/src/components/ui/MessageBubble/message-bubble.types.d.ts.map +1 -1
  53. package/dist-lib/theme/brand-pay.css +205 -189
  54. package/dist-lib/theme/brand-vibrant.css +162 -148
  55. package/dist-lib/theme.css +19 -0
  56. package/dist-lib/tokens/brands/blue/primitives/color-palette.d.ts +28 -0
  57. package/dist-lib/tokens/brands/blue/primitives/color-palette.d.ts.map +1 -1
  58. package/dist-lib/tokens/brands/blue/semantic/color-dark.d.ts +16 -0
  59. package/dist-lib/tokens/brands/blue/semantic/color-dark.d.ts.map +1 -1
  60. package/dist-lib/tokens/brands/blue/semantic/color-light.d.ts +16 -0
  61. package/dist-lib/tokens/brands/blue/semantic/color-light.d.ts.map +1 -1
  62. package/dist-lib/tokens/brands/default/primitives/color-palette.d.ts +29 -0
  63. package/dist-lib/tokens/brands/default/primitives/color-palette.d.ts.map +1 -1
  64. package/dist-lib/tokens/brands/default/semantic/color-dark.d.ts +16 -0
  65. package/dist-lib/tokens/brands/default/semantic/color-dark.d.ts.map +1 -1
  66. package/dist-lib/tokens/brands/default/semantic/color-light.d.ts +16 -0
  67. package/dist-lib/tokens/brands/default/semantic/color-light.d.ts.map +1 -1
  68. package/dist-lib/tokens/brands/default/semantic/elevation.d.ts +4 -0
  69. package/dist-lib/tokens/brands/default/semantic/elevation.d.ts.map +1 -1
  70. package/dist-lib/tokens/brands/green/primitives/color-palette.d.ts +28 -0
  71. package/dist-lib/tokens/brands/green/primitives/color-palette.d.ts.map +1 -1
  72. package/dist-lib/tokens/brands/green/semantic/color-dark.d.ts +16 -0
  73. package/dist-lib/tokens/brands/green/semantic/color-dark.d.ts.map +1 -1
  74. package/dist-lib/tokens/brands/green/semantic/color-light.d.ts +16 -0
  75. package/dist-lib/tokens/brands/green/semantic/color-light.d.ts.map +1 -1
  76. package/dist-lib/tokens/brands/pay/primitives/color-palette.d.ts +6 -0
  77. package/dist-lib/tokens/brands/pay/primitives/color-palette.d.ts.map +1 -1
  78. package/dist-lib/tokens/brands/pay/semantic/color-dark.d.ts +16 -0
  79. package/dist-lib/tokens/brands/pay/semantic/color-dark.d.ts.map +1 -1
  80. package/dist-lib/tokens/brands/pay/semantic/color-light.d.ts +16 -0
  81. package/dist-lib/tokens/brands/pay/semantic/color-light.d.ts.map +1 -1
  82. package/dist-lib/tokens/brands/vibrant/primitives/color-palette.d.ts +29 -1
  83. package/dist-lib/tokens/brands/vibrant/primitives/color-palette.d.ts.map +1 -1
  84. package/dist-lib/tokens/brands/vibrant/semantic/color-dark.d.ts +16 -0
  85. package/dist-lib/tokens/brands/vibrant/semantic/color-dark.d.ts.map +1 -1
  86. package/dist-lib/tokens/brands/vibrant/semantic/color-light.d.ts +16 -0
  87. package/dist-lib/tokens/brands/vibrant/semantic/color-light.d.ts.map +1 -1
  88. package/dist-lib/tokens.cjs +23 -2
  89. package/dist-lib/tokens.cjs.map +1 -1
  90. package/dist-lib/tokens.mjs +23 -2
  91. package/dist-lib/tokens.mjs.map +1 -1
  92. package/package.json +1 -1
@@ -0,0 +1,55 @@
1
+ import { Locale } from 'date-fns';
2
+ import { GanttColumn, GanttRow } from '../gantt.types';
3
+ import { GanttFlatRow } from '../hooks/layout';
4
+ /**
5
+ * Painel esquerdo — a grade de linhas.
6
+ *
7
+ * ## Grade própria, não `DataTable`
8
+ *
9
+ * Medido ao especificar: a `DataTable` são **12.187 linhas em 75 arquivos**, o
10
+ * `hierarchical` dela vive na *view de lista* e não na tabela, e a altura de
11
+ * linha dela deriva de `density`.
12
+ *
13
+ * Altura de linha é exatamente o que os dois painéis precisam compartilhar ao
14
+ * pixel; deixá-la num componente que o `Gantt` não controla é a classe de
15
+ * defeito da L-038 — default resolvido em dois render-sites que divergem.
16
+ *
17
+ * Aqui a altura vem de `GANTT_ROW_HEIGHT_PX`, passada por prop, e o canvas
18
+ * consome a MESMA constante.
19
+ *
20
+ * ## O scroll vertical NÃO é daqui
21
+ *
22
+ * Este painel é `overflow-hidden` e recebe `scrollTop` por prop, espelhado do
23
+ * canvas. Dois containers roláveis independentes dessincronizam as linhas na
24
+ * primeira rolagem — e o desalinho entre nome e barra é o defeito mais grave
25
+ * possível num Gantt, porque produz leitura errada sem parecer quebrado.
26
+ */
27
+ /** Colunas default: nome (estica) + início + fim. */
28
+ export declare const GANTT_DEFAULT_COLUMNS: GanttColumn[];
29
+ export type GanttGridProps = {
30
+ rows: GanttFlatRow[];
31
+ columns: GanttColumn[];
32
+ /**
33
+ * Alturas de cada linha, JÁ CALCULADAS pela raiz.
34
+ *
35
+ * ⚠️ Era o defeito #2: esta grade usava a constante `rowHeight` pra TODA
36
+ * linha, enquanto o canvas somava lanes. Numa linha-contêiner com 3 barras o
37
+ * canvas dava 98px e a grade 48 — as duas metades da MESMA linha com alturas
38
+ * diferentes, e o nome desalinhado das barras a partir dali pra baixo.
39
+ *
40
+ * Agora a única fonte é `rowHeights()` no núcleo, e os dois painéis a leem.
41
+ */
42
+ heights: readonly number[];
43
+ /** Espelhado do canvas — ver a nota do topo. */
44
+ scrollTop: number;
45
+ locale?: Locale;
46
+ /** Índice da linha selecionada (#7). */
47
+ selectedRow?: number | null;
48
+ /** Índice da linha sob o cursor — vem da raiz, ver #3. */
49
+ hoveredRow?: number | null;
50
+ onHoverRow?: (index: number | null) => void;
51
+ onRowToggle?: (rowId: string, collapsed: boolean) => void;
52
+ onRowClick?: (row: GanttRow, evt: React.MouseEvent) => void;
53
+ };
54
+ export declare function GanttGrid({ rows, columns, heights, scrollTop, locale, selectedRow, hoveredRow, onHoverRow, onRowToggle, onRowClick, }: GanttGridProps): import("react/jsx-runtime").JSX.Element;
55
+ //# sourceMappingURL=gantt-grid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gantt-grid.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/Gantt/parts/gantt-grid.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAgBvC,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEpD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,qDAAqD;AACrD,eAAO,MAAM,qBAAqB,EAAE,WAAW,EAI9C,CAAC;AAkGF,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,YAAY,EAAE,CAAC;IACrB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB;;;;;;;;;OASG;IACH,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,gDAAgD;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wCAAwC;IACxC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,0DAA0D;IAC1D,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC5C,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;IAC1D,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC;CAC7D,CAAC;AAEF,wBAAgB,SAAS,CAAC,EACxB,IAAI,EACJ,OAAO,EACP,OAAO,EACP,SAAS,EACT,MAAM,EACN,WAAW,EACX,UAAU,EACV,UAAU,EACV,WAAW,EACX,UAAU,GACX,EAAE,cAAc,2CA6MhB"}
@@ -0,0 +1,46 @@
1
+ import { GanttLink } from '../gantt.types';
2
+ /**
3
+ * As setas de vínculo, em SVG.
4
+ *
5
+ * ## Por que é uma camada irmã do canvas, não filha das células
6
+ *
7
+ * A seta vai de uma linha a outra, e precisa desenhar **por cima** da grade e
8
+ * **fora** dos limites da linha de origem. Filha da célula, ela seria recortada
9
+ * pelo `overflow` de qualquer ancestral — e desapareceria exatamente quando
10
+ * cruza pra outra linha, que é sempre.
11
+ *
12
+ * É o mesmo defeito que o `DragOverlay` resolveu no `Scheduler` na v0.56.0: o
13
+ * bloco arrastado sumia atrás das grades, recortado por **3** ancestrais
14
+ * diferentes, e a primeira hipótese (z-index) estava errada — era clipping.
15
+ *
16
+ * `pointer-events-none` na camada e `auto` só nos paths: sem isso a camada
17
+ * cobriria o canvas inteiro e nenhuma barra receberia clique.
18
+ *
19
+ * ## Ortogonal, não Bézier
20
+ *
21
+ * Com 40 vínculos, curvas viram um emaranhado onde não se segue nenhuma;
22
+ * segmentos retos com cotovelo se leem mesmo cruzados. É o que todas as
23
+ * referências com muitos vínculos fazem.
24
+ */
25
+ export type GanttLinkGeometry = {
26
+ link: GanttLink;
27
+ /** Âncora de saída, já em px relativos ao canvas. */
28
+ from: {
29
+ x: number;
30
+ y: number;
31
+ };
32
+ to: {
33
+ x: number;
34
+ y: number;
35
+ };
36
+ conflict: boolean;
37
+ critical: boolean;
38
+ };
39
+ export type GanttLinksLayerProps = {
40
+ links: GanttLinkGeometry[];
41
+ width: number;
42
+ height: number;
43
+ onLinkClick?: (link: GanttLink) => void;
44
+ };
45
+ export declare function GanttLinksLayer({ links, width, height, onLinkClick, }: GanttLinksLayerProps): import("react/jsx-runtime").JSX.Element | null;
46
+ //# sourceMappingURL=gantt-links-layer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gantt-links-layer.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/Gantt/parts/gantt-links-layer.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,SAAS,CAAC;IAChB,qDAAqD;IACrD,IAAI,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/B,EAAE,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7B,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,EAAE,iBAAiB,EAAE,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;CACzC,CAAC;AAEF,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,KAAK,EACL,MAAM,EACN,WAAW,GACZ,EAAE,oBAAoB,kDA6EtB"}
@@ -0,0 +1,36 @@
1
+ import { GanttView } from '../gantt.types';
2
+ /**
3
+ * Esqueleto de carregamento do `Gantt`.
4
+ *
5
+ * ## O defeito que ele existe pra evitar
6
+ *
7
+ * Sem `loading`, um consumidor que busca do servidor renderiza `rows={[]}`
8
+ * enquanto espera — e o componente responde *"Nenhuma tarefa neste período"*.
9
+ * Isso é uma **afirmação falsa**: o Gantt não sabe se não há tarefas, ele ainda
10
+ * não recebeu nenhuma. O usuário lê que o cronograma está vazio e sai antes de o
11
+ * dado chegar.
12
+ *
13
+ * ## A silhueta é a do conteúdo, e por visão
14
+ *
15
+ * Regra copiada do `DataTableLoading`: mesmo container, mesma altura de linha,
16
+ * mesma moldura — pra a chegada do dado não deslocar nada. Um esqueleto de
17
+ * silhueta diferente troca "espera" por um salto de layout, que é pior.
18
+ *
19
+ * Por isso são três, e não um genérico: a timeline tem painel + eixo, a grade de
20
+ * mês é 6×7, e a agenda é uma pilha de blocos por dia. Um esqueleto só saltaria
21
+ * em duas das três.
22
+ *
23
+ * ⚠️ **A toolbar não entra aqui.** Ela continua renderizada durante o
24
+ * carregamento, porque o período, a busca e o filtro não dependem dos dados —
25
+ * apagá-la faria a tela inteira piscar quando eles chegam. Mesmo desenho do
26
+ * `DataTable`.
27
+ */
28
+ export type GanttSkeletonProps = {
29
+ view: GanttView;
30
+ /** Largura do painel esquerdo — a MESMA do estado carregado, senão salta. */
31
+ gridWidth: number;
32
+ /** Quantas linhas fingir. */
33
+ rows?: number;
34
+ };
35
+ export declare function GanttSkeleton({ view, gridWidth, rows, }: GanttSkeletonProps): import("react/jsx-runtime").JSX.Element;
36
+ //# sourceMappingURL=gantt-skeleton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gantt-skeleton.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/Gantt/parts/gantt-skeleton.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,SAAS,CAAC;IAChB,6EAA6E;IAC7E,SAAS,EAAE,MAAM,CAAC;IAClB,6BAA6B;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAgBF,wBAAgB,aAAa,CAAC,EAC5B,IAAI,EACJ,SAAS,EACT,IAAQ,GACT,EAAE,kBAAkB,2CAkHpB"}
@@ -0,0 +1,46 @@
1
+ import { ReactNode } from 'react';
2
+ import { GanttFilterField, GanttFilterModel, GanttGranularity, GanttView } from '../gantt.types';
3
+ export type GanttToolbarProps = {
4
+ title: ReactNode;
5
+ onPrev: () => void;
6
+ onNext: () => void;
7
+ onToday: () => void;
8
+ view: GanttView;
9
+ /** As visões que EXISTEM — já resolvidas pela raiz, nunca vazia. */
10
+ views: GanttView[];
11
+ onViewChange: (v: GanttView) => void;
12
+ granularity: GanttGranularity;
13
+ onGranularityChange: (g: GanttGranularity) => void;
14
+ searchable: boolean;
15
+ search: string;
16
+ onSearchChange: (s: string) => void;
17
+ filterFields?: GanttFilterField[];
18
+ onOpenFilterPanel: () => void;
19
+ appliedCount: number;
20
+ /** O que está marcado — a linha de chips lê daqui. */
21
+ filterModel: GanttFilterModel;
22
+ /** Desliga UM campo inteiro (o `×` do chip). */
23
+ onClearField: (fieldId: string) => void;
24
+ /** Desliga todos ("Limpar todos"). */
25
+ onClearAll: () => void;
26
+ /** Marca/desmarca um valor — o popover do chip edita por aqui. */
27
+ onToggleFilterValue: (fieldId: string, value: string) => void;
28
+ /** Contagem por opção, sobre TODAS as linhas. */
29
+ filterCounts: Record<string, Record<string, number>>;
30
+ /** Formata o ISO de um filtro `date` pro chip — o `locale` mora na raiz. */
31
+ formatFilterDate: (iso: string) => string;
32
+ /**
33
+ * Só aparece quando há vínculo E o consumidor não escondeu o botão.
34
+ *
35
+ * Sem grafo não existe caminho crítico; e `criticalPathToggle={false}`
36
+ * esconde o controle quando o estado é decisão da tela.
37
+ */
38
+ hasLinks: boolean;
39
+ showCriticalToggle: boolean;
40
+ criticalPath: boolean;
41
+ onToggleCriticalPath: () => void;
42
+ toolbarActions?: ReactNode;
43
+ primaryAction?: ReactNode;
44
+ };
45
+ export declare function GanttToolbar({ title, onPrev, onNext, onToday, view, views, onViewChange, granularity, onGranularityChange, searchable, search, onSearchChange, filterFields, onOpenFilterPanel, appliedCount, filterModel, onClearField, onClearAll, onToggleFilterValue, filterCounts, formatFilterDate, hasLinks, showCriticalToggle, criticalPath, onToggleCriticalPath, toolbarActions, primaryAction, }: GanttToolbarProps): import("react/jsx-runtime").JSX.Element;
46
+ //# sourceMappingURL=gantt-toolbar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gantt-toolbar.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/Gantt/parts/gantt-toolbar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AA6CvC,OAAO,KAAK,EACV,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,SAAS,EACV,MAAM,gBAAgB,CAAC;AA+ExB,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,EAAE,SAAS,CAAC;IACjB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,OAAO,EAAE,MAAM,IAAI,CAAC;IAEpB,IAAI,EAAE,SAAS,CAAC;IAChB,oEAAoE;IACpE,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,YAAY,EAAE,CAAC,CAAC,EAAE,SAAS,KAAK,IAAI,CAAC;IAErC,WAAW,EAAE,gBAAgB,CAAC;IAC9B,mBAAmB,EAAE,CAAC,CAAC,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAEnD,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAEpC,YAAY,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAClC,iBAAiB,EAAE,MAAM,IAAI,CAAC;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,sDAAsD;IACtD,WAAW,EAAE,gBAAgB,CAAC;IAC9B,gDAAgD;IAChD,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,sCAAsC;IACtC,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,kEAAkE;IAClE,mBAAmB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9D,iDAAiD;IACjD,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACrD,4EAA4E;IAC5E,gBAAgB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;IAE1C;;;;;OAKG;IACH,QAAQ,EAAE,OAAO,CAAC;IAClB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,YAAY,EAAE,OAAO,CAAC;IACtB,oBAAoB,EAAE,MAAM,IAAI,CAAC;IAEjC,cAAc,CAAC,EAAE,SAAS,CAAC;IAC3B,aAAa,CAAC,EAAE,SAAS,CAAC;CAC3B,CAAC;AAEF,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,MAAM,EACN,MAAM,EACN,OAAO,EACP,IAAI,EACJ,KAAK,EACL,YAAY,EACZ,WAAW,EACX,mBAAmB,EACnB,UAAU,EACV,MAAM,EACN,cAAc,EACd,YAAY,EACZ,iBAAiB,EACjB,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,UAAU,EACV,mBAAmB,EACnB,YAAY,EACZ,gBAAgB,EAChB,QAAQ,EACR,kBAAkB,EAClB,YAAY,EACZ,oBAAoB,EACpB,cAAc,EACd,aAAa,GACd,EAAE,iBAAiB,2CA8TnB"}
@@ -0,0 +1,64 @@
1
+ import { MouseEvent } from 'react';
2
+ import { Locale } from 'date-fns';
3
+ import { GanttBar, GanttRow } from '../gantt.types';
4
+ import { GanttFlatRow } from '../hooks/layout';
5
+ /**
6
+ * Visão `calendar` — a grade de mês.
7
+ *
8
+ * ## O que esta visão responde, e que a `timeline` não responde
9
+ *
10
+ * A `timeline` responde *"o que depende do quê"*. Esta responde **"o que está
11
+ * acontecendo no dia 12?"** — pergunta que num eixo horizontal exige varrer 20
12
+ * linhas com o dedo na coluna. São perguntas diferentes sobre o mesmo dado.
13
+ *
14
+ * ## A barra é UM segmento contínuo, não um chip por dia
15
+ *
16
+ * ⚠️ A primeira versão desenhava um chip por dia: uma tarefa de 10 a 15 virava
17
+ * **6 chips soltos**, um em cada célula, cada um repetindo o mesmo nome. Lê como
18
+ * seis tarefas de um dia em vez de uma de seis — o oposto do que um cronograma
19
+ * precisa dizer. Foi o motivo de a estrutura da grade mudar: 42 células soltas
20
+ * num `grid` não permitem que um elemento atravesse colunas.
21
+ *
22
+ * Agora cada semana é uma linha com duas camadas — as 7 células de fundo e uma
23
+ * camada absoluta de segmentos. Uma tarefa que cruza a virada de semana produz
24
+ * dois segmentos, cada um com a ponta cortada marcada
25
+ * (`continuesBefore`/`continuesAfter`), no mesmo vocabulário da timeline.
26
+ *
27
+ * Geometria e lanes vivem em `hooks/week-segments.ts`, com 24 testes — inclusive
28
+ * a borda que me corrigiu (barra que começa no primeiro dia da semana **não** é
29
+ * `continuesBefore`).
30
+ *
31
+ * ⛔ **Sem setas de vínculo, e é decisão.** Numa grade de mês uma seta do dia 3
32
+ * ao 19 atravessaria três linhas de semana passando por cima de 16 células que
33
+ * nada têm a ver com o vínculo. O grafo continua vivo (`onLinkViolations` segue
34
+ * emitindo, o conflito segue marcado no segmento); sai o desenho, porque nesta
35
+ * geometria ele não informa.
36
+ *
37
+ * ## Grade própria, não a do `Scheduler`
38
+ *
39
+ * A spec §5 registra a decisão e o preço. Delegar criaria acoplamento por
40
+ * herança de propósito. O que a duplicação não pode causar é divergência
41
+ * silenciosa de layout, e é por isso que `buildMonthMatrix` tem teste próprio
42
+ * sobre as mesmas bordas (mês que começa no domingo, fevereiro comum, virada de
43
+ * ano).
44
+ */
45
+ export type GanttCalendarViewProps = {
46
+ /** Linhas JÁ filtradas e achatadas — mesma entrada da `timeline`. */
47
+ rows: GanttFlatRow[];
48
+ /** Mês âncora. Vem do MEIO da janela — ver a nota no `gantt.tsx`. */
49
+ anchor: Date;
50
+ weekStartsOn: 0 | 1 | 2 | 3 | 4 | 5 | 6;
51
+ now: Date;
52
+ locale?: Locale;
53
+ conflictBarIds: ReadonlySet<string>;
54
+ criticalBarIds: ReadonlySet<string>;
55
+ onBarClick?: (bar: GanttBar, row: GanttRow, evt: MouseEvent) => void;
56
+ /**
57
+ * Adicionar no dia. **Sem isto o "+" não é renderizado** — um botão que não
58
+ * adiciona nada é pior que a ausência dele, mesma regra do toggle de caminho
59
+ * crítico sem vínculo.
60
+ */
61
+ onDayAdd?: (date: Date) => void;
62
+ };
63
+ export declare function GanttCalendarView({ rows, anchor, weekStartsOn, now, locale, conflictBarIds, criticalBarIds, onBarClick, onDayAdd, }: GanttCalendarViewProps): import("react/jsx-runtime").JSX.Element;
64
+ //# sourceMappingURL=calendar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/Gantt/views/calendar.tsx"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,UAAU,EAChB,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAuBvC,OAAO,KAAK,EAAE,QAAQ,EAAiB,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEpD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAEH,MAAM,MAAM,sBAAsB,GAAG;IACnC,qEAAqE;IACrE,IAAI,EAAE,YAAY,EAAE,CAAC;IACrB,qEAAqE;IACrE,MAAM,EAAE,IAAI,CAAC;IACb,YAAY,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACxC,GAAG,EAAE,IAAI,CAAC;IACV,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,cAAc,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACpC,cAAc,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAEpC,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,UAAU,KAAK,IAAI,CAAC;IACrE;;;;OAIG;IACH,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;CACjC,CAAC;AAmBF,wBAAgB,iBAAiB,CAAC,EAChC,IAAI,EACJ,MAAM,EACN,YAAY,EACZ,GAAG,EACH,MAAM,EACN,cAAc,EACd,cAAc,EACd,UAAU,EACV,QAAQ,GACT,EAAE,sBAAsB,2CA+SxB"}
@@ -0,0 +1,53 @@
1
+ import { MouseEvent, ReactNode } from 'react';
2
+ import { Locale } from 'date-fns';
3
+ import { GanttBar, GanttRow } from '../gantt.types';
4
+ import { GanttFlatRow } from '../hooks/layout';
5
+ /**
6
+ * Visão `list` — a agenda.
7
+ *
8
+ * ## A pergunta que ela responde
9
+ *
10
+ * `timeline` responde *"o que depende do quê"*. `calendar` responde *"o que
11
+ * acontece no dia 12"*. Esta responde **"o que estou fazendo hoje, e amanhã"** —
12
+ * a leitura sequencial, sem eixo pra varrer nem grade pra achar a célula.
13
+ *
14
+ * ⚠️ **Não é uma tabela de tarefas.** Tabela de tarefas com hierarquia e filtro
15
+ * é o `DataTable` (view lista, `hierarchical`), e reimplementá-lo aqui seria a
16
+ * terceira cópia da mesma coisa no DS. O que faz esta visão diferente é o
17
+ * agrupamento por **DIA**: a mesma tarefa aparece em cada dia que ela ocupa.
18
+ *
19
+ * ## Só os dias QUE TÊM tarefa
20
+ *
21
+ * A grade do mês mostra 42 dias porque a grade *é* a informação — um dia vazio
22
+ * ali diz "nada neste terça". Aqui não: uma agenda que lista 60 dias pra mostrar
23
+ * 20 tarefas obriga a rolar por 40 blocos vazios. Dia sem tarefa não aparece, e
24
+ * o salto entre datas é o próprio sinal de que não há nada no meio.
25
+ *
26
+ * Regra copiada do `SchedulerListView`, que chegou nela pelo mesmo raciocínio.
27
+ *
28
+ * ## O metadado da direita é a POSIÇÃO no intervalo
29
+ *
30
+ * Uma agenda de eventos mostra a hora ali. Um cronograma não tem hora — mostra
31
+ * `dia 2 de 6`. E isso não é enfeite: numa tarefa repetida em 6 blocos
32
+ * consecutivos, o intervalo (`18/09 – 23/09`) seria idêntico nos seis e não diria
33
+ * nada de novo; a posição diz **onde no trabalho aquele dia está**, que é
34
+ * informação que nenhuma das outras duas visões dá sem contar colunas.
35
+ */
36
+ export type GanttListViewProps = {
37
+ /** Linhas JÁ filtradas e achatadas — mesma entrada das outras views. */
38
+ rows: GanttFlatRow[];
39
+ /**
40
+ * O período a listar — o MÊS visível, não a janela do eixo (ver a nota do
41
+ * `mesVisivel` no `gantt.tsx`). A agenda lista os dias DELE que têm tarefa.
42
+ */
43
+ windowStart: Date;
44
+ windowEnd: Date;
45
+ now: Date;
46
+ locale?: Locale;
47
+ conflictBarIds: ReadonlySet<string>;
48
+ criticalBarIds: ReadonlySet<string>;
49
+ onBarClick?: (bar: GanttBar, row: GanttRow, evt: MouseEvent) => void;
50
+ emptyState?: ReactNode;
51
+ };
52
+ export declare function GanttListView({ rows, windowStart, windowEnd, now, locale, conflictBarIds, criticalBarIds, onBarClick, emptyState, }: GanttListViewProps): import("react/jsx-runtime").JSX.Element;
53
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/Gantt/views/list.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAW,KAAK,UAAU,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACjE,OAAO,EAML,KAAK,MAAM,EACZ,MAAM,UAAU,CAAC;AAalB,OAAO,KAAK,EAAE,QAAQ,EAAiB,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEpD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,wEAAwE;IACxE,IAAI,EAAE,YAAY,EAAE,CAAC;IACrB;;;OAGG;IACH,WAAW,EAAE,IAAI,CAAC;IAClB,SAAS,EAAE,IAAI,CAAC;IAChB,GAAG,EAAE,IAAI,CAAC;IACV,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,cAAc,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACpC,cAAc,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAEpC,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,UAAU,KAAK,IAAI,CAAC;IACrE,UAAU,CAAC,EAAE,SAAS,CAAC;CACxB,CAAC;AAWF,wBAAgB,aAAa,CAAC,EAC5B,IAAI,EACJ,WAAW,EACX,SAAS,EACT,GAAG,EACH,MAAM,EACN,cAAc,EACd,cAAc,EACd,UAAU,EACV,UAAU,GACX,EAAE,kBAAkB,2CA+IpB"}
@@ -0,0 +1,85 @@
1
+ import { MouseEvent, RefObject, UIEvent } from 'react';
2
+ import { Locale } from 'date-fns';
3
+ import { GanttFlatRow } from '../hooks/layout';
4
+ import { GanttBar, GanttBarChange, GanttGranularity, GanttLink, GanttRow } from '../gantt.types';
5
+ /**
6
+ * Visão `timeline` — eixo, barras e setas.
7
+ *
8
+ * ## O cabeçalho vive DENTRO do scroller
9
+ *
10
+ * Estrutura, e a ordem importa:
11
+ *
12
+ * scroller (overflow-auto nos 2 eixos)
13
+ * └ trilho (width = larguraTotal)
14
+ * ├ cabeçalho (sticky top-0) ← rola pro LADO, prende em CIMA
15
+ * └ canvas (relative)
16
+ *
17
+ * Fora do scroller, o cabeçalho ficava imóvel na rolagem horizontal e as
18
+ * colunas do eixo desalinhavam das do canvas — o rótulo "12" ia parar em cima
19
+ * do dia 20. `sticky top-0` prende só na vertical, que é o que se quer.
20
+ *
21
+ * ## Uma passada calcula tudo
22
+ *
23
+ * A geometria de cada barra é calculada UMA vez e guardada num mapa por id. A
24
+ * camada de setas lê desse mapa em vez de recalcular: duas fontes pro mesmo
25
+ * número fariam a seta apontar pra um pixel diferente do que a barra ocupa no
26
+ * primeiro arredondamento divergente (L-038).
27
+ */
28
+ export type GanttTimelineViewProps = {
29
+ rows: GanttFlatRow[];
30
+ allRows: GanttRow[];
31
+ links: GanttLink[];
32
+ windowStart: Date;
33
+ windowEnd: Date;
34
+ granularity: GanttGranularity;
35
+ pxPerDay: number;
36
+ /**
37
+ * Alturas e offsets JÁ CALCULADOS pela raiz — ver `rowHeights` no núcleo.
38
+ *
39
+ * A view não calcula: era o defeito #2. O canvas somava lanes e a grade
40
+ * usava a constante, e numa linha-contêiner com 3 barras as duas metades da
41
+ * mesma linha saíam com alturas diferentes.
42
+ */
43
+ heights: readonly number[];
44
+ offsets: readonly number[];
45
+ now: Date;
46
+ locale?: Locale;
47
+ weekStartsOn: 0 | 1 | 2 | 3 | 4 | 5 | 6;
48
+ conflictBarIds: ReadonlySet<string>;
49
+ criticalBarIds: ReadonlySet<string>;
50
+ draggable: boolean;
51
+ resizable: boolean;
52
+ linkable: boolean;
53
+ /** Índice da linha sob o cursor — o hover cruzado vem do pai (#3). */
54
+ hoveredRow: number | null;
55
+ onHoverRow: (index: number | null) => void;
56
+ /** Início (em dias) da coluna sob o cursor. */
57
+ hoveredDay: number | null;
58
+ /** Índice da linha selecionada (#7). */
59
+ selectedRow: number | null;
60
+ /** Offset em dias da coluna selecionada por clique (#2). */
61
+ selectedDay: number | null;
62
+ onSelectDay: (dayOffset: number | null) => void;
63
+ onHoverDay: (dayOffset: number | null) => void;
64
+ /**
65
+ * Emitem a INTENÇÃO do gesto. O componente não reagenda nada — ver a nota
66
+ * do `gantt.tsx`. Ausentes, o gesto ainda dá prévia e volta ao lugar.
67
+ */
68
+ onBarMove?: (change: GanttBarChange) => void;
69
+ onBarResize?: (change: GanttBarChange) => void;
70
+ onLinkCreate?: (link: Omit<GanttLink, "id">) => void;
71
+ onScroll: (evt: UIEvent<HTMLDivElement>) => void;
72
+ /**
73
+ * O elemento que rola, exposto pra raiz.
74
+ *
75
+ * Ela precisa dele pra CENTRAR a viewport num instante do tempo ao trocar
76
+ * de escala — ver a nota do `onGranularityChange`. Sem isso, mudar pra
77
+ * trimestre deixava o usuário olhando 2024 numa janela de 5 anos cujos
78
+ * dados vivem em 2026: canvas vazio, e nada dizendo onde estava o trabalho.
79
+ */
80
+ scrollRef?: RefObject<HTMLDivElement | null>;
81
+ onBarClick?: (bar: GanttBar, row: GanttRow, evt: MouseEvent) => void;
82
+ onLinkClick?: (link: GanttLink) => void;
83
+ };
84
+ export declare function GanttTimelineView({ rows, allRows, links, windowStart, windowEnd, granularity, pxPerDay, heights, offsets, now, locale, weekStartsOn, conflictBarIds, criticalBarIds, draggable, resizable, linkable, hoveredRow, onHoverRow, hoveredDay, onHoverDay, selectedRow, selectedDay, onSelectDay, onBarMove, onBarResize, onLinkCreate, onScroll, scrollRef, onBarClick, onLinkClick, }: GanttTimelineViewProps): import("react/jsx-runtime").JSX.Element;
85
+ //# sourceMappingURL=timeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeline.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/Gantt/views/timeline.tsx"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  export { MessageBubble, MessageReplyIcon } from './message-bubble';
2
2
  export { messageBubbleStyles } from './message-bubble.styles';
3
3
  export type { MessageBubbleVariantProps } from './message-bubble.styles';
4
- export type { MessageBubbleProps, MessageSide, MessageMediaType, QuotedMessage, } from './message-bubble.types';
4
+ export type { MessageBubbleProps, MessageSide, MessageOrigin, MessageMediaType, QuotedMessage, } from './message-bubble.types';
5
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/ui/MessageBubble/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,YAAY,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACzE,YAAY,EACV,kBAAkB,EAClB,WAAW,EACX,gBAAgB,EAChB,aAAa,GACd,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/ui/MessageBubble/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,YAAY,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACzE,YAAY,EACV,kBAAkB,EAClB,WAAW,EACX,aAAa,EACb,gBAAgB,EAChB,aAAa,GACd,MAAM,wBAAwB,CAAC"}
@@ -11,7 +11,7 @@ import { MessageBubbleProps } from './message-bubble.types';
11
11
  * exceção de hardcode é `max-w-[70%]` na coluna da bolha — não há token de
12
12
  * porcentagem para largura de balão de chat.
13
13
  */
14
- export declare function MessageBubble({ side, body, createdAt, ack, ackError, mediaType, mediaUrl, media, quotedMessage, isEdited, isDeleted, tail, authorName, avatar, actions, onMediaClick, className, }: MessageBubbleProps): import("react/jsx-runtime").JSX.Element;
14
+ export declare function MessageBubble({ side, body, createdAt, ack, ackError, mediaType, mediaUrl, media, quotedMessage, isEdited, isDeleted, tail, origin, authorName, avatar, actions, onMediaClick, className, }: MessageBubbleProps): import("react/jsx-runtime").JSX.Element;
15
15
  export declare namespace MessageBubble {
16
16
  var displayName: string;
17
17
  }
@@ -1 +1 @@
1
- {"version":3,"file":"message-bubble.d.ts","sourceRoot":"","sources":["../../../../../src/components/ui/MessageBubble/message-bubble.tsx"],"names":[],"mappings":"AACA,OAAO,EAAO,KAAK,EAAgB,MAAM,cAAc,CAAC;AAaxD,OAAO,KAAK,EACV,kBAAkB,EAGnB,MAAM,wBAAwB,CAAC;AA6MhC;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,EAC5B,IAAI,EACJ,IAAI,EACJ,SAAS,EACT,GAAG,EACH,QAAQ,EACR,SAAkB,EAClB,QAAQ,EACR,KAAK,EACL,aAAa,EACb,QAAgB,EAChB,SAAiB,EACjB,IAAW,EACX,UAAU,EACV,MAAM,EACN,OAAO,EACP,YAAY,EACZ,SAAS,GACV,EAAE,kBAAkB,2CAmHpB;yBArIe,aAAa;;;AAyI7B,wEAAwE;AACxE,OAAO,EAAE,KAAK,IAAI,gBAAgB,EAAE,CAAC"}
1
+ {"version":3,"file":"message-bubble.d.ts","sourceRoot":"","sources":["../../../../../src/components/ui/MessageBubble/message-bubble.tsx"],"names":[],"mappings":"AACA,OAAO,EAAO,KAAK,EAAgB,MAAM,cAAc,CAAC;AAaxD,OAAO,KAAK,EACV,kBAAkB,EAGnB,MAAM,wBAAwB,CAAC;AA6MhC;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,EAC5B,IAAI,EACJ,IAAI,EACJ,SAAS,EACT,GAAG,EACH,QAAQ,EACR,SAAkB,EAClB,QAAQ,EACR,KAAK,EACL,aAAa,EACb,QAAgB,EAChB,SAAiB,EACjB,IAAW,EACX,MAAM,EACN,UAAU,EACV,MAAM,EACN,OAAO,EACP,YAAY,EACZ,SAAS,GACV,EAAE,kBAAkB,2CAoHpB;yBAvIe,aAAa;;;AA2I7B,wEAAwE;AACxE,OAAO,EAAE,KAAK,IAAI,gBAAgB,EAAE,CAAC"}
@@ -11,7 +11,7 @@ import { VariantProps } from '../../../utils/tv';
11
11
  * media* = container/elementos do MessageMediaRenderer
12
12
  * body = corpo markdown
13
13
  * meta = rodapé HH:mm + label editada + MessageAck
14
- * actions* = botão de ações (hover, top-right) + Popover content
14
+ * actions* = botão de ações (hover, top-right, superfície própria) + Popover content
15
15
  *
16
16
  * Cor: `sent` = `bg-bg-success-muted` (verde sutil — espelha o "balão enviado"
17
17
  * do WA, claro/escuro via token). `received` = `bg-bg-surface`. Sem hardcode.
@@ -20,7 +20,9 @@ import { VariantProps } from '../../../utils/tv';
20
20
  * largura de bolha de chat (regra do domínio: bolha nunca passa de 70% da coluna).
21
21
  *
22
22
  * disabled = n/a (bolha não é controle interativo). `tail` é o único modifier
23
- * de raio; `side` controla bg + alinhamento + lado da rabeta.
23
+ * de raio; `side` controla bg + alinhamento + lado da rabeta; `origin="ai"`
24
+ * troca a borda pela da marca (contorno sutil) — quem decide se a mensagem é
25
+ * da IA é o consumidor.
24
26
  */
25
27
  export declare const messageBubbleStyles: import('tailwind-variants').TVReturnType<{
26
28
  side: {
@@ -39,6 +41,12 @@ export declare const messageBubbleStyles: import('tailwind-variants').TVReturnTy
39
41
  true: {};
40
42
  false: {};
41
43
  };
44
+ origin: {
45
+ human: {};
46
+ ai: {
47
+ bubble: string;
48
+ };
49
+ };
42
50
  }, {
43
51
  row: string;
44
52
  avatarSlot: string;
@@ -90,6 +98,12 @@ export declare const messageBubbleStyles: import('tailwind-variants').TVReturnTy
90
98
  true: {};
91
99
  false: {};
92
100
  };
101
+ origin: {
102
+ human: {};
103
+ ai: {
104
+ bubble: string;
105
+ };
106
+ };
93
107
  }, {
94
108
  row: string;
95
109
  avatarSlot: string;
@@ -141,6 +155,12 @@ export declare const messageBubbleStyles: import('tailwind-variants').TVReturnTy
141
155
  true: {};
142
156
  false: {};
143
157
  };
158
+ origin: {
159
+ human: {};
160
+ ai: {
161
+ bubble: string;
162
+ };
163
+ };
144
164
  }, {
145
165
  row: string;
146
166
  avatarSlot: string;
@@ -1 +1 @@
1
- {"version":3,"file":"message-bubble.styles.d.ts","sourceRoot":"","sources":["../../../../../src/components/ui/MessageBubble/message-bubble.styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAM,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAEnD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2CA4G9B,CAAC;AAEH,MAAM,MAAM,yBAAyB,GAAG,YAAY,CAClD,OAAO,mBAAmB,CAC3B,CAAC"}
1
+ {"version":3,"file":"message-bubble.styles.d.ts","sourceRoot":"","sources":["../../../../../src/components/ui/MessageBubble/message-bubble.styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAM,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAEnD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2CAkH9B,CAAC;AAEH,MAAM,MAAM,yBAAyB,GAAG,YAAY,CAClD,OAAO,mBAAmB,CAC3B,CAAC"}
@@ -2,6 +2,8 @@ import { ReactNode } from 'react';
2
2
  import { MessageBubbleVariantProps } from './message-bubble.styles';
3
3
  /** Lado da bolha — quem enviou. `sent` = nós (direita), `received` = contato (esquerda). */
4
4
  export type MessageSide = NonNullable<MessageBubbleVariantProps["side"]>;
5
+ /** Origem da mensagem. `ai` = escrita pela IA (Sol); `human` = pessoa. */
6
+ export type MessageOrigin = NonNullable<MessageBubbleVariantProps["origin"]>;
5
7
  /** Tipo de mídia que a bolha carrega. `text` = sem mídia (só corpo). */
6
8
  export type MessageMediaType = "text" | "image" | "audio" | "video" | "document" | "location" | "vcard" | "contact";
7
9
  /**
@@ -63,6 +65,12 @@ export interface MessageBubbleProps {
63
65
  * `true`.
64
66
  */
65
67
  tail?: boolean;
68
+ /**
69
+ * Origem da mensagem. `ai` aplica um contorno sutil da marca na bolha para
70
+ * distinguir a resposta da IA da de um atendente; o critério de "é da IA" é
71
+ * do consumidor. Default `human` (sem mudança visual).
72
+ */
73
+ origin?: MessageOrigin;
66
74
  /** Nome do autor (exibido no topo da bolha — útil em grupos). */
67
75
  authorName?: string;
68
76
  /** Slot de avatar (renderizado ao lado da bolha). */
@@ -1 +1 @@
1
- {"version":3,"file":"message-bubble.types.d.ts","sourceRoot":"","sources":["../../../../../src/components/ui/MessageBubble/message-bubble.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAEzE,4FAA4F;AAC5F,MAAM,MAAM,WAAW,GAAG,WAAW,CAAC,yBAAyB,CAAC,MAAM,CAAC,CAAC,CAAC;AAEzE,wEAAwE;AACxE,MAAM,MAAM,gBAAgB,GACxB,MAAM,GACN,OAAO,GACP,OAAO,GACP,OAAO,GACP,UAAU,GACV,UAAU,GACV,OAAO,GACP,SAAS,CAAC;AAEd;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,+CAA+C;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4EAA4E;IAC5E,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,uEAAuE;IACvE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yEAAyE;IACzE,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,iDAAiD;IACjD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC;;;OAGG;IACH,IAAI,EAAE,WAAW,CAAC;IAClB,sEAAsE;IACtE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qEAAqE;IACrE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB;;;OAGG;IACH,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5B;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uCAAuC;IACvC,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,6DAA6D;IAC7D,aAAa,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IACrC,uDAAuD;IACvD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;OAGG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,iEAAiE;IACjE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qDAAqD;IACrD,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB;;;OAGG;IACH,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,kEAAkE;IAClE,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,oDAAoD;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,0DAA0D;AAC1D,MAAM,WAAW,yBAAyB;IACxC,SAAS,EAAE,gBAAgB,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;CAC3B"}
1
+ {"version":3,"file":"message-bubble.types.d.ts","sourceRoot":"","sources":["../../../../../src/components/ui/MessageBubble/message-bubble.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAEzE,4FAA4F;AAC5F,MAAM,MAAM,WAAW,GAAG,WAAW,CAAC,yBAAyB,CAAC,MAAM,CAAC,CAAC,CAAC;AAEzE,0EAA0E;AAC1E,MAAM,MAAM,aAAa,GAAG,WAAW,CAAC,yBAAyB,CAAC,QAAQ,CAAC,CAAC,CAAC;AAE7E,wEAAwE;AACxE,MAAM,MAAM,gBAAgB,GACxB,MAAM,GACN,OAAO,GACP,OAAO,GACP,OAAO,GACP,UAAU,GACV,UAAU,GACV,OAAO,GACP,SAAS,CAAC;AAEd;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,+CAA+C;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4EAA4E;IAC5E,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,uEAAuE;IACvE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yEAAyE;IACzE,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,iDAAiD;IACjD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC;;;OAGG;IACH,IAAI,EAAE,WAAW,CAAC;IAClB,sEAAsE;IACtE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qEAAqE;IACrE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB;;;OAGG;IACH,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5B;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uCAAuC;IACvC,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,6DAA6D;IAC7D,aAAa,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IACrC,uDAAuD;IACvD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;OAGG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;;OAIG;IACH,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,iEAAiE;IACjE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qDAAqD;IACrD,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB;;;OAGG;IACH,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,kEAAkE;IAClE,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,oDAAoD;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,0DAA0D;AAC1D,MAAM,WAAW,yBAAyB;IACxC,SAAS,EAAE,gBAAgB,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;CAC3B"}