@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.
- package/dist-lib/index.cjs +4461 -16
- package/dist-lib/index.cjs.map +1 -1
- package/dist-lib/index.mjs +4477 -32
- package/dist-lib/index.mjs.map +1 -1
- package/dist-lib/src/components/index.d.ts +1 -0
- package/dist-lib/src/components/index.d.ts.map +1 -1
- package/dist-lib/src/components/ui/Gantt/gantt.d.ts +21 -0
- package/dist-lib/src/components/ui/Gantt/gantt.d.ts.map +1 -0
- package/dist-lib/src/components/ui/Gantt/gantt.styles.d.ts +2985 -0
- package/dist-lib/src/components/ui/Gantt/gantt.styles.d.ts.map +1 -0
- package/dist-lib/src/components/ui/Gantt/gantt.types.d.ts +445 -0
- package/dist-lib/src/components/ui/Gantt/gantt.types.d.ts.map +1 -0
- package/dist-lib/src/components/ui/Gantt/hooks/drag.d.ts +71 -0
- package/dist-lib/src/components/ui/Gantt/hooks/drag.d.ts.map +1 -0
- package/dist-lib/src/components/ui/Gantt/hooks/filters.d.ts +79 -0
- package/dist-lib/src/components/ui/Gantt/hooks/filters.d.ts.map +1 -0
- package/dist-lib/src/components/ui/Gantt/hooks/layout.d.ts +232 -0
- package/dist-lib/src/components/ui/Gantt/hooks/layout.d.ts.map +1 -0
- package/dist-lib/src/components/ui/Gantt/hooks/links.d.ts +120 -0
- package/dist-lib/src/components/ui/Gantt/hooks/links.d.ts.map +1 -0
- package/dist-lib/src/components/ui/Gantt/hooks/week-segments.d.ts +69 -0
- package/dist-lib/src/components/ui/Gantt/hooks/week-segments.d.ts.map +1 -0
- package/dist-lib/src/components/ui/Gantt/index.d.ts +46 -0
- package/dist-lib/src/components/ui/Gantt/index.d.ts.map +1 -0
- package/dist-lib/src/components/ui/Gantt/parts/gantt-applied-filters.d.ts +20 -0
- package/dist-lib/src/components/ui/Gantt/parts/gantt-applied-filters.d.ts.map +1 -0
- package/dist-lib/src/components/ui/Gantt/parts/gantt-bar.d.ts +68 -0
- package/dist-lib/src/components/ui/Gantt/parts/gantt-bar.d.ts.map +1 -0
- package/dist-lib/src/components/ui/Gantt/parts/gantt-filter-panel.d.ts +16 -0
- package/dist-lib/src/components/ui/Gantt/parts/gantt-filter-panel.d.ts.map +1 -0
- package/dist-lib/src/components/ui/Gantt/parts/gantt-grid.d.ts +55 -0
- package/dist-lib/src/components/ui/Gantt/parts/gantt-grid.d.ts.map +1 -0
- package/dist-lib/src/components/ui/Gantt/parts/gantt-links-layer.d.ts +46 -0
- package/dist-lib/src/components/ui/Gantt/parts/gantt-links-layer.d.ts.map +1 -0
- package/dist-lib/src/components/ui/Gantt/parts/gantt-skeleton.d.ts +36 -0
- package/dist-lib/src/components/ui/Gantt/parts/gantt-skeleton.d.ts.map +1 -0
- package/dist-lib/src/components/ui/Gantt/parts/gantt-toolbar.d.ts +46 -0
- package/dist-lib/src/components/ui/Gantt/parts/gantt-toolbar.d.ts.map +1 -0
- package/dist-lib/src/components/ui/Gantt/views/calendar.d.ts +64 -0
- package/dist-lib/src/components/ui/Gantt/views/calendar.d.ts.map +1 -0
- package/dist-lib/src/components/ui/Gantt/views/list.d.ts +53 -0
- package/dist-lib/src/components/ui/Gantt/views/list.d.ts.map +1 -0
- package/dist-lib/src/components/ui/Gantt/views/timeline.d.ts +85 -0
- package/dist-lib/src/components/ui/Gantt/views/timeline.d.ts.map +1 -0
- package/dist-lib/src/components/ui/MessageBubble/index.d.ts +1 -1
- package/dist-lib/src/components/ui/MessageBubble/index.d.ts.map +1 -1
- package/dist-lib/src/components/ui/MessageBubble/message-bubble.d.ts +1 -1
- package/dist-lib/src/components/ui/MessageBubble/message-bubble.d.ts.map +1 -1
- package/dist-lib/src/components/ui/MessageBubble/message-bubble.styles.d.ts +22 -2
- package/dist-lib/src/components/ui/MessageBubble/message-bubble.styles.d.ts.map +1 -1
- package/dist-lib/src/components/ui/MessageBubble/message-bubble.types.d.ts +8 -0
- package/dist-lib/src/components/ui/MessageBubble/message-bubble.types.d.ts.map +1 -1
- package/dist-lib/theme/brand-pay.css +205 -189
- package/dist-lib/theme/brand-vibrant.css +162 -148
- package/dist-lib/theme.css +19 -0
- package/dist-lib/tokens/brands/blue/primitives/color-palette.d.ts +28 -0
- package/dist-lib/tokens/brands/blue/primitives/color-palette.d.ts.map +1 -1
- package/dist-lib/tokens/brands/blue/semantic/color-dark.d.ts +16 -0
- package/dist-lib/tokens/brands/blue/semantic/color-dark.d.ts.map +1 -1
- package/dist-lib/tokens/brands/blue/semantic/color-light.d.ts +16 -0
- package/dist-lib/tokens/brands/blue/semantic/color-light.d.ts.map +1 -1
- package/dist-lib/tokens/brands/default/primitives/color-palette.d.ts +29 -0
- package/dist-lib/tokens/brands/default/primitives/color-palette.d.ts.map +1 -1
- package/dist-lib/tokens/brands/default/semantic/color-dark.d.ts +16 -0
- package/dist-lib/tokens/brands/default/semantic/color-dark.d.ts.map +1 -1
- package/dist-lib/tokens/brands/default/semantic/color-light.d.ts +16 -0
- package/dist-lib/tokens/brands/default/semantic/color-light.d.ts.map +1 -1
- package/dist-lib/tokens/brands/default/semantic/elevation.d.ts +4 -0
- package/dist-lib/tokens/brands/default/semantic/elevation.d.ts.map +1 -1
- package/dist-lib/tokens/brands/green/primitives/color-palette.d.ts +28 -0
- package/dist-lib/tokens/brands/green/primitives/color-palette.d.ts.map +1 -1
- package/dist-lib/tokens/brands/green/semantic/color-dark.d.ts +16 -0
- package/dist-lib/tokens/brands/green/semantic/color-dark.d.ts.map +1 -1
- package/dist-lib/tokens/brands/green/semantic/color-light.d.ts +16 -0
- package/dist-lib/tokens/brands/green/semantic/color-light.d.ts.map +1 -1
- package/dist-lib/tokens/brands/pay/primitives/color-palette.d.ts +6 -0
- package/dist-lib/tokens/brands/pay/primitives/color-palette.d.ts.map +1 -1
- package/dist-lib/tokens/brands/pay/semantic/color-dark.d.ts +16 -0
- package/dist-lib/tokens/brands/pay/semantic/color-dark.d.ts.map +1 -1
- package/dist-lib/tokens/brands/pay/semantic/color-light.d.ts +16 -0
- package/dist-lib/tokens/brands/pay/semantic/color-light.d.ts.map +1 -1
- package/dist-lib/tokens/brands/vibrant/primitives/color-palette.d.ts +29 -1
- package/dist-lib/tokens/brands/vibrant/primitives/color-palette.d.ts.map +1 -1
- package/dist-lib/tokens/brands/vibrant/semantic/color-dark.d.ts +16 -0
- package/dist-lib/tokens/brands/vibrant/semantic/color-dark.d.ts.map +1 -1
- package/dist-lib/tokens/brands/vibrant/semantic/color-light.d.ts +16 -0
- package/dist-lib/tokens/brands/vibrant/semantic/color-light.d.ts.map +1 -1
- package/dist-lib/tokens.cjs +23 -2
- package/dist-lib/tokens.cjs.map +1 -1
- package/dist-lib/tokens.mjs +23 -2
- package/dist-lib/tokens.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
import { Locale } from 'date-fns';
|
|
2
|
+
import { GanttBar, GanttGranularity, GanttRow } from '../gantt.types';
|
|
3
|
+
/**
|
|
4
|
+
* Núcleo geométrico do `Gantt` — **puro**: sem React, sem DOM, sem estilo.
|
|
5
|
+
*
|
|
6
|
+
* É o que torna as bordas testáveis sem montar componente: virada de mês,
|
|
7
|
+
* barra que cruza a janela, lane packing com sobreposição parcial, `summary`
|
|
8
|
+
* derivado de filhos colapsados.
|
|
9
|
+
*
|
|
10
|
+
* ## A unidade é o DIA, e isso é decisão
|
|
11
|
+
*
|
|
12
|
+
* Todo cálculo interno converte data → **dias desde `windowStart`** e só depois
|
|
13
|
+
* multiplica por `pxPerDay`. A alternativa (converter direto pra pixel em cada
|
|
14
|
+
* lugar) espalha o arredondamento e faz duas barras com a mesma data cair em
|
|
15
|
+
* pixels diferentes dependendo de quem calculou.
|
|
16
|
+
*
|
|
17
|
+
* ⚠️ Usa `differenceInCalendarDays`, **não** subtração de timestamp: um
|
|
18
|
+
* intervalo que cruza mudança de horário de verão tem 23 ou 25 horas, e
|
|
19
|
+
* `(b - a) / 86400000` devolve 0,96 dia. O cálculo por calendário devolve 1.
|
|
20
|
+
*/
|
|
21
|
+
export type GanttTick = {
|
|
22
|
+
/** Início do tick. */
|
|
23
|
+
date: Date;
|
|
24
|
+
/** Largura em dias — varia: mês tem 28–31, trimestre 90–92. */
|
|
25
|
+
spanDays: number;
|
|
26
|
+
label: string;
|
|
27
|
+
/** Fim de semana, pra sombrear a coluna. Só em `granularity: "day"`. */
|
|
28
|
+
isWeekend: boolean;
|
|
29
|
+
};
|
|
30
|
+
export type GanttAxis = {
|
|
31
|
+
/** Linha de cima — agrupa (mês sobre dias, ano sobre meses). */
|
|
32
|
+
groups: GanttTick[];
|
|
33
|
+
/** Linha de baixo — a unidade da grade. */
|
|
34
|
+
units: GanttTick[];
|
|
35
|
+
totalDays: number;
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Eixo em DOIS níveis, porque uma linha só não situa.
|
|
39
|
+
*
|
|
40
|
+
* Todas as 13 referências fazem isso: "March | April | May" em cima e
|
|
41
|
+
* "01.03–07.03 | 08.03–14.03" embaixo. Sem o nível de cima, uma coluna "12" não
|
|
42
|
+
* diz de que mês — e o usuário precisa contar colunas pra descobrir.
|
|
43
|
+
*/
|
|
44
|
+
export declare function buildTimeAxis(windowStart: Date, windowEnd: Date, granularity: GanttGranularity, locale?: Locale, weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6): GanttAxis;
|
|
45
|
+
/** Dias desde o início da janela. Fracionário: a hora do dia conta. */
|
|
46
|
+
export declare function dateToDayOffset(date: Date, windowStart: Date): number;
|
|
47
|
+
export declare function dateToX(date: Date, windowStart: Date, pxPerDay: number): number;
|
|
48
|
+
export declare function xToDate(x: number, windowStart: Date, pxPerDay: number): Date;
|
|
49
|
+
/**
|
|
50
|
+
* Arredonda pro início do período — o snap do arraste.
|
|
51
|
+
*
|
|
52
|
+
* Sem snap, arrastar 3px muda a data em 4 horas e a barra nunca alinha com a
|
|
53
|
+
* grade. Com snap por granularidade, ela cai sempre num limite visível.
|
|
54
|
+
*/
|
|
55
|
+
export declare function snapDate(date: Date, granularity: GanttGranularity, weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6): Date;
|
|
56
|
+
export type GanttClippedBar = {
|
|
57
|
+
bar: GanttBar;
|
|
58
|
+
/** Início efetivo desenhado — pode ser a borda da janela. */
|
|
59
|
+
start: Date;
|
|
60
|
+
end: Date;
|
|
61
|
+
continuesBefore: boolean;
|
|
62
|
+
continuesAfter: boolean;
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* Recorta a barra na janela visível.
|
|
66
|
+
*
|
|
67
|
+
* Devolve `null` quando a barra está **inteiramente fora** — e é o que evita
|
|
68
|
+
* desenhar centenas de nós com `left` negativo fora da viewport.
|
|
69
|
+
*
|
|
70
|
+
* ⚠️ A comparação é por DIA, não por instante: uma barra que termina às 08:00 do
|
|
71
|
+
* `windowStart` ainda toca a janela e deve aparecer. Comparar timestamps a
|
|
72
|
+
* descartaria.
|
|
73
|
+
*/
|
|
74
|
+
export declare function clipToWindow(bar: GanttBar, windowStart: Date, windowEnd: Date): GanttClippedBar | null;
|
|
75
|
+
/**
|
|
76
|
+
* Distribui barras em lanes dentro da MESMA linha.
|
|
77
|
+
*
|
|
78
|
+
* - `stack`: uma lane por barra, na ordem recebida. Todas visíveis — é o
|
|
79
|
+
* "arco-íris" do portfólio, onde o ponto é justamente ver as 5 frentes.
|
|
80
|
+
* - `compact`: barras que não se sobrepõem dividem lane. Linha mais baixa, e o
|
|
81
|
+
* preço é que duas frentes podem cair na mesma faixa horizontal.
|
|
82
|
+
*
|
|
83
|
+
* ⚠️ Sobreposição é `<` e não `<=`: uma barra que termina no dia 5 e outra que
|
|
84
|
+
* começa no dia 5 **não** se sobrepõem — são consecutivas. Usar `<=` empurraria
|
|
85
|
+
* toda cadeia sequencial pra lanes separadas, que é o oposto de "compact".
|
|
86
|
+
*/
|
|
87
|
+
export declare function packLanes(bars: GanttClippedBar[], mode?: "stack" | "compact"): GanttClippedBar[][];
|
|
88
|
+
export type GanttFlatRow = {
|
|
89
|
+
row: GanttRow;
|
|
90
|
+
depth: number;
|
|
91
|
+
/** Tem filhos — é o que decide se o chevron aparece. */
|
|
92
|
+
hasChildren: boolean;
|
|
93
|
+
collapsed: boolean;
|
|
94
|
+
/**
|
|
95
|
+
* É o ÚLTIMO filho do seu pai — define se a vertical do conector para no meio
|
|
96
|
+
* da linha (formando o "└") ou atravessa até a base (formando o "├").
|
|
97
|
+
*/
|
|
98
|
+
isLast: boolean;
|
|
99
|
+
/**
|
|
100
|
+
* Por nível ancestral (índice = `depth` do ancestral): aquele ancestral ainda
|
|
101
|
+
* tem irmão depois dele? Controla se a guia vertical continua descendo naquela
|
|
102
|
+
* coluna de recuo.
|
|
103
|
+
*
|
|
104
|
+
* ⚠️ **A coluna `i` hospeda o cotovelo de nós em `depth i+1`**, então quem
|
|
105
|
+
* decide a continuação vertical dela é `ancestorHasNext[i + 1]`, NÃO `[i]`.
|
|
106
|
+
* Esse off-by-one é a **L-045**, e ela nasceu deste mesmo conector no `List`:
|
|
107
|
+
* com `[i]` a guia sumia no último root (`ancestorHasNext[0]` é `false`) e nos
|
|
108
|
+
* demais o root tinha irmão, o que mascarava o bug em tudo menos na borda.
|
|
109
|
+
*
|
|
110
|
+
* A forma deste campo é copiada do `flattenTree` do `List` de propósito — é a
|
|
111
|
+
* implementação que já pagou o preço de acertar.
|
|
112
|
+
*/
|
|
113
|
+
ancestorHasNext: boolean[];
|
|
114
|
+
};
|
|
115
|
+
/**
|
|
116
|
+
* Achata a árvore na ordem de exibição, respeitando collapse.
|
|
117
|
+
*
|
|
118
|
+
* Filho de linha colapsada não entra — nem os netos. É por isso que a recursão
|
|
119
|
+
* para no `collapsed` em vez de filtrar depois: filtrar deixaria neto órfão
|
|
120
|
+
* visível quando o pai colapsa e o avô não.
|
|
121
|
+
*
|
|
122
|
+
* ## Dado sujo do consumidor nunca vira tarefa invisível
|
|
123
|
+
*
|
|
124
|
+
* Duas formas de `parent` quebrado, e as DUAS terminam com a linha na tela:
|
|
125
|
+
*
|
|
126
|
+
* 1. **`parent` aponta pra id inexistente** → tratada como raiz.
|
|
127
|
+
* 2. **Ciclo em `parent`** (A pai de B, B pai de A) → o grupo inteiro é
|
|
128
|
+
* promovido a raiz, no fim da lista.
|
|
129
|
+
*
|
|
130
|
+
* ⚠️ O caso 2 **não funcionava** até este teste existir. A guarda `visitados`
|
|
131
|
+
* impedia o estouro de pilha, mas a varredura partia de `porPai.get(null)` — e
|
|
132
|
+
* num ciclo puro NENHUMA linha tem pai nulo, então o balde raiz vem vazio e a
|
|
133
|
+
* função devolvia `[]`. O Gantt renderizava **em branco**, sem erro, com todas
|
|
134
|
+
* as tarefas no `rows`.
|
|
135
|
+
*
|
|
136
|
+
* Era a L-060 na prática: este bloco de comentário já prometia "não deve virar
|
|
137
|
+
* tarefa invisível", e quem leu (eu, duas rodadas atrás) parou de investigar.
|
|
138
|
+
* Comentário que afirma garantia tem que ter a garantia verificada.
|
|
139
|
+
*/
|
|
140
|
+
export declare function flattenRows(rows: GanttRow[], collapsedIds: ReadonlySet<string>): GanttFlatRow[];
|
|
141
|
+
/**
|
|
142
|
+
* Intervalo de um `summary`, derivado dos descendentes.
|
|
143
|
+
*
|
|
144
|
+
* Devolve `null` quando não há descendente com barra — e aí o `summary` não
|
|
145
|
+
* desenha nada, em vez de desenhar uma barra de duração zero em 1970.
|
|
146
|
+
*
|
|
147
|
+
* ⚠️ Percorre TODA a descendência, não só os filhos diretos: um `summary` de
|
|
148
|
+
* fase cujos filhos são outros `summary` teria intervalo vazio se olhasse um
|
|
149
|
+
* nível só.
|
|
150
|
+
*/
|
|
151
|
+
export declare function deriveSummaryRange(rowId: string, rows: GanttRow[]): {
|
|
152
|
+
start: Date;
|
|
153
|
+
end: Date;
|
|
154
|
+
} | null;
|
|
155
|
+
/**
|
|
156
|
+
* Janela a partir dos dados, pro caso em que o consumidor não passa uma.
|
|
157
|
+
*
|
|
158
|
+
* A folga de 1 unidade em cada ponta não é estética: sem ela, a primeira e a
|
|
159
|
+
* última barra encostam na borda e ficam indistinguíveis de barras que
|
|
160
|
+
* atravessam a janela (que é o que `continuesBefore/After` sinaliza).
|
|
161
|
+
*/
|
|
162
|
+
export declare function deriveWindow(rows: GanttRow[], granularity?: GanttGranularity): {
|
|
163
|
+
start: Date;
|
|
164
|
+
end: Date;
|
|
165
|
+
};
|
|
166
|
+
/**
|
|
167
|
+
* Altura de cada linha visível — **a fonte ÚNICA, consumida pelos dois painéis**.
|
|
168
|
+
*
|
|
169
|
+
* ⚠️ Isto existe porque a primeira versão calculava a altura em DOIS lugares: o
|
|
170
|
+
* canvas somava lanes (`n * LANE + 8`) e a grade usava a constante fixa. Numa
|
|
171
|
+
* linha-contêiner com 3 barras, o canvas dava 98px e a grade 44 — e as duas
|
|
172
|
+
* metades da MESMA linha ficavam com alturas diferentes, com o nome desalinhado
|
|
173
|
+
* das barras a partir dali pra baixo.
|
|
174
|
+
*
|
|
175
|
+
* É exatamente a L-038: default resolvido em dois render-sites que divergem. A
|
|
176
|
+
* correção é resolver na fonte, não em cada lugar.
|
|
177
|
+
*/
|
|
178
|
+
export declare function rowHeights(rows: readonly GanttFlatRow[], baseHeight: number, laneHeight: number): number[];
|
|
179
|
+
/** `top` acumulado de cada linha, a partir das alturas. */
|
|
180
|
+
export declare function rowOffsets(heights: readonly number[]): number[];
|
|
181
|
+
/**
|
|
182
|
+
* Matriz do mês — 6 linhas × 7 colunas, SEMPRE.
|
|
183
|
+
*
|
|
184
|
+
* ⚠️ **Duplicado de propósito do `Scheduler`.** A spec (§5) registra a decisão:
|
|
185
|
+
* o `Gantt` é dono das suas visões porque delegar criaria acoplamento por
|
|
186
|
+
* herança de propósito — necessidade nova do Gantt viraria mudança numa API
|
|
187
|
+
* publicada que serve outros consumidores.
|
|
188
|
+
*
|
|
189
|
+
* O que a duplicação NÃO pode causar é divergência silenciosa de layout, e é
|
|
190
|
+
* por isso que esta função tem teste próprio sobre as mesmas bordas: mês que
|
|
191
|
+
* começa no domingo, fevereiro de ano comum, virada de ano.
|
|
192
|
+
*
|
|
193
|
+
* 6 linhas fixas e não "as que precisar": grade que muda de altura ao navegar
|
|
194
|
+
* de mês faz o conteúdo abaixo pular.
|
|
195
|
+
*/
|
|
196
|
+
export declare function buildMonthMatrix(anchor: Date, weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6): Date[][];
|
|
197
|
+
/**
|
|
198
|
+
* Quantos chips cabem numa célula do mês, e quantos sobram.
|
|
199
|
+
*
|
|
200
|
+
* ⚠️ Duplicado do `Scheduler` pelo mesmo motivo acima.
|
|
201
|
+
*
|
|
202
|
+
* A linha "+N mais" ocupa **um slot do mesmo tamanho de um chip** — por isso
|
|
203
|
+
* `visible` é `max - 1` quando há estouro. Ignorar isso faz o último chip ser
|
|
204
|
+
* empurrado pra fora da célula pela própria linha de estouro.
|
|
205
|
+
*
|
|
206
|
+
* E o estouro só existe a partir de `total > max`: com exatamente `max` itens,
|
|
207
|
+
* mostrar `max - 1` + "+1 mais" seria trocar um chip por um aviso.
|
|
208
|
+
*/
|
|
209
|
+
export declare function computeOverflow(total: number, max: number): {
|
|
210
|
+
visible: number;
|
|
211
|
+
overflowCount: number;
|
|
212
|
+
};
|
|
213
|
+
/**
|
|
214
|
+
* Dias que uma barra ocupa dentro de um mês — pra virar chip em cada dia.
|
|
215
|
+
*
|
|
216
|
+
* ⚠️ Duplicado do `segmentMultiDay` do `Scheduler`, mesmo motivo.
|
|
217
|
+
*
|
|
218
|
+
* A guarda de 400 iterações existe porque `end` anterior a `start` (dado sujo)
|
|
219
|
+
* faria o `while` nunca terminar. Devolve vazio nesse caso, não loop infinito.
|
|
220
|
+
*/
|
|
221
|
+
export declare function daysOfBar(bar: GanttBar): Date[];
|
|
222
|
+
/** Último dia visível da matriz, pra recortar barras na visão de mês. */
|
|
223
|
+
export declare function monthMatrixRange(weeks: Date[][]): {
|
|
224
|
+
start: Date;
|
|
225
|
+
end: Date;
|
|
226
|
+
};
|
|
227
|
+
/** Fim do mês âncora — pra distinguir dia "de fora" na grade. */
|
|
228
|
+
export declare function monthBounds(anchor: Date): {
|
|
229
|
+
start: Date;
|
|
230
|
+
end: Date;
|
|
231
|
+
};
|
|
232
|
+
//# sourceMappingURL=layout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/Gantt/hooks/layout.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { GanttBar, GanttLink, GanttLinkType, GanttLinkViolation } from '../gantt.types';
|
|
2
|
+
/**
|
|
3
|
+
* Grafo de vínculos do `Gantt` — **puro**: sem React, sem DOM.
|
|
4
|
+
*
|
|
5
|
+
* É a parte que distingue Gantt de timeline. Sem isto o componente mostra
|
|
6
|
+
* tarefas com datas; com isto mostra um modelo de como o projeto funciona.
|
|
7
|
+
*
|
|
8
|
+
* ## O componente VALIDA e SINALIZA. Não corrige.
|
|
9
|
+
*
|
|
10
|
+
* Nenhuma função aqui devolve datas novas. Vínculo violado vira
|
|
11
|
+
* `GanttLinkViolation`, que a raiz emite em `onLinkViolations` e a barra pinta
|
|
12
|
+
* com marcação de conflito.
|
|
13
|
+
*
|
|
14
|
+
* Corrigir cronograma é decisão de negócio: mover a tarefa que atrasou, cortar
|
|
15
|
+
* escopo, aceitar o atraso ou renegociar o vínculo são quatro respostas
|
|
16
|
+
* diferentes pro mesmo conflito, e o componente não tem como escolher. É a
|
|
17
|
+
* mesma posição do `onEventMove` do `Scheduler` e do `onCardMove` do `Kanban` —
|
|
18
|
+
* o DS é dumb sobre mutação por princípio, e aqui isso vale em dobro porque o
|
|
19
|
+
* erro seria invisível: datas reescritas sozinhas parecem dados.
|
|
20
|
+
*/
|
|
21
|
+
/**
|
|
22
|
+
* A borda de cada tipo de vínculo — a data que o `target` não pode violar.
|
|
23
|
+
*
|
|
24
|
+
* | Tipo | Restrição |
|
|
25
|
+
* |------|-------------------------------------|
|
|
26
|
+
* | `FS` | `target.start ≥ source.end + lag` |
|
|
27
|
+
* | `SS` | `target.start ≥ source.start + lag` |
|
|
28
|
+
* | `FF` | `target.end ≥ source.end + lag` |
|
|
29
|
+
* | `SF` | `target.end ≥ source.start + lag` |
|
|
30
|
+
*
|
|
31
|
+
* A primeira letra diz de qual ponta do `source` sai; a segunda, qual ponta do
|
|
32
|
+
* `target` é restringida. `FS` = sai do Finish, restringe o Start.
|
|
33
|
+
*/
|
|
34
|
+
export declare function constraintDates(tipo: GanttLinkType, source: GanttBar, target: GanttBar, lag?: number): {
|
|
35
|
+
limite: Date;
|
|
36
|
+
pontaAlvo: Date;
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Confere um vínculo contra as datas atuais.
|
|
40
|
+
*
|
|
41
|
+
* `null` = satisfeito. Caso contrário, `deficitDays` é o quanto o alvo teria que
|
|
42
|
+
* andar pra frente — número que a mensagem de erro usa e que o consumidor pode
|
|
43
|
+
* aplicar se quiser corrigir.
|
|
44
|
+
*
|
|
45
|
+
* ⚠️ Vínculo cujo `source` ou `target` não existe no conjunto de barras é
|
|
46
|
+
* **ignorado**, não reportado como violação. Referência pendente acontece
|
|
47
|
+
* durante paginação e durante edição otimista; tratar como conflito encheria a
|
|
48
|
+
* tela de falso positivo em estado transitório.
|
|
49
|
+
*/
|
|
50
|
+
export declare function checkLink(link: GanttLink, bars: ReadonlyMap<string, GanttBar>): GanttLinkViolation | null;
|
|
51
|
+
export declare function checkAllLinks(links: readonly GanttLink[], bars: ReadonlyMap<string, GanttBar>): GanttLinkViolation[];
|
|
52
|
+
export type TopoResult = {
|
|
53
|
+
ok: true;
|
|
54
|
+
order: string[];
|
|
55
|
+
} | {
|
|
56
|
+
ok: false;
|
|
57
|
+
cycle: string[];
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
60
|
+
* Kahn sobre o grafo de barras. Base do caminho crítico.
|
|
61
|
+
*
|
|
62
|
+
* Devolve `ok: false` com os ids que sobraram quando há ciclo — e isso é
|
|
63
|
+
* **resultado**, não exceção. Ciclo é dado do consumidor, não bug do
|
|
64
|
+
* componente; lançar mataria a tela inteira por causa de dois vínculos
|
|
65
|
+
* invertidos. A raiz encaminha pra `onGraphError` e simplesmente não pinta
|
|
66
|
+
* caminho crítico.
|
|
67
|
+
*
|
|
68
|
+
* ⚠️ Auto-vínculo (`source === target`) conta como ciclo de um nó. Parece
|
|
69
|
+
* pedante, mas acontece: duplicar uma tarefa junto com seus vínculos produz
|
|
70
|
+
* exatamente isso, e sem a checagem o nó ficaria com grau de entrada 1 pra
|
|
71
|
+
* sempre e o algoritmo devolveria ordem incompleta em silêncio.
|
|
72
|
+
*/
|
|
73
|
+
export declare function topoSort(barIds: readonly string[], links: readonly GanttLink[]): TopoResult;
|
|
74
|
+
/**
|
|
75
|
+
* Barras no caminho crítico — a sequência que determina a data final.
|
|
76
|
+
*
|
|
77
|
+
* Método: passagem pra frente calcula o começo mais cedo (`earlyStart`) de cada
|
|
78
|
+
* barra respeitando os vínculos; passagem pra trás calcula o mais tarde
|
|
79
|
+
* (`lateStart`) sem atrasar o projeto. Folga zero (`lateStart − earlyStart`) =
|
|
80
|
+
* crítica.
|
|
81
|
+
*
|
|
82
|
+
* ⚠️ **Só considera `FS`.** Os outros três tipos exigem tratar as duas pontas
|
|
83
|
+
* como nós independentes no grafo (o CPM clássico é sobre *atividade-em-nó* com
|
|
84
|
+
* início e fim separados), e implementar isso pela metade daria caminho crítico
|
|
85
|
+
* *plausível e errado* — que é pior que não ter. `SS`/`FF`/`SF` continuam sendo
|
|
86
|
+
* validados por `checkAllLinks`; só não entram no cálculo de criticidade.
|
|
87
|
+
*
|
|
88
|
+
* Registrado como limite conhecido na USAGE, não escondido.
|
|
89
|
+
*/
|
|
90
|
+
export declare function computeCriticalPath(bars: readonly GanttBar[], links: readonly GanttLink[]): {
|
|
91
|
+
critical: Set<string>;
|
|
92
|
+
} | {
|
|
93
|
+
cycle: string[];
|
|
94
|
+
};
|
|
95
|
+
export type LinkAnchor = {
|
|
96
|
+
x: number;
|
|
97
|
+
y: number;
|
|
98
|
+
};
|
|
99
|
+
/**
|
|
100
|
+
* Path SVG entre duas barras, em ortogonal (só segmentos retos).
|
|
101
|
+
*
|
|
102
|
+
* Ortogonal e não curva de Bézier porque com 40 vínculos as curvas viram um
|
|
103
|
+
* emaranhado onde não se segue nenhuma; segmentos retos com cotovelo se leem
|
|
104
|
+
* mesmo cruzados. É o que todas as referências com muitos vínculos fazem.
|
|
105
|
+
*
|
|
106
|
+
* `saiDireita`/`entraEsquerda` derivam do TIPO: um `FS` sai da ponta direita do
|
|
107
|
+
* source e entra na esquerda do target; um `SS` sai da esquerda e entra na
|
|
108
|
+
* esquerda. Sem isso a seta de um `SS` sairia do lado errado e sugeriria FS.
|
|
109
|
+
*/
|
|
110
|
+
export declare function linkPath(de: LinkAnchor, para: LinkAnchor, opts: {
|
|
111
|
+
saiDireita: boolean;
|
|
112
|
+
entraEsquerda: boolean;
|
|
113
|
+
recuo?: number;
|
|
114
|
+
}): string;
|
|
115
|
+
/** Qual ponta de cada barra o vínculo conecta. */
|
|
116
|
+
export declare function linkSides(tipo: GanttLinkType): {
|
|
117
|
+
saiDireita: boolean;
|
|
118
|
+
entraEsquerda: boolean;
|
|
119
|
+
};
|
|
120
|
+
//# sourceMappingURL=links.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"links.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/Gantt/hooks/links.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,QAAQ,EACR,SAAS,EACT,aAAa,EACb,kBAAkB,EACnB,MAAM,gBAAgB,CAAC;AAExB;;;;;;;;;;;;;;;;;;GAkBG;AAIH;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,aAAa,EACnB,MAAM,EAAE,QAAQ,EAChB,MAAM,EAAE,QAAQ,EAChB,GAAG,SAAI,GACN;IAAE,MAAM,EAAE,IAAI,CAAC;IAAC,SAAS,EAAE,IAAI,CAAA;CAAE,CAInC;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,SAAS,CACvB,IAAI,EAAE,SAAS,EACf,IAAI,EAAE,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,GAClC,kBAAkB,GAAG,IAAI,CAe3B;AAED,wBAAgB,aAAa,CAC3B,KAAK,EAAE,SAAS,SAAS,EAAE,EAC3B,IAAI,EAAE,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,GAClC,kBAAkB,EAAE,CAOtB;AAID,MAAM,MAAM,UAAU,GAClB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,GAC7B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAEnC;;;;;;;;;;;;;GAaG;AACH,wBAAgB,QAAQ,CACtB,MAAM,EAAE,SAAS,MAAM,EAAE,EACzB,KAAK,EAAE,SAAS,SAAS,EAAE,GAC1B,UAAU,CAiCZ;AAID;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,SAAS,QAAQ,EAAE,EACzB,KAAK,EAAE,SAAS,SAAS,EAAE,GAC1B;IAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAkEjD;AAWD,MAAM,MAAM,UAAU,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAElD;;;;;;;;;;GAUG;AACH,wBAAgB,QAAQ,CACtB,EAAE,EAAE,UAAU,EACd,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE;IAAE,UAAU,EAAE,OAAO,CAAC;IAAC,aAAa,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GACpE,MAAM,CAiBR;AAED,kDAAkD;AAClD,wBAAgB,SAAS,CAAC,IAAI,EAAE,aAAa,GAAG;IAC9C,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,OAAO,CAAC;CACxB,CAKA"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Núcleo puro dos **segmentos de semana** da grade de mês — sem React, sem DOM.
|
|
3
|
+
*
|
|
4
|
+
* ## O problema que isto resolve
|
|
5
|
+
*
|
|
6
|
+
* A primeira versão da visão de calendário desenhava **um chip por dia**: uma
|
|
7
|
+
* tarefa de 10 a 15 aparecia como 6 chips soltos, um em cada célula, cada um
|
|
8
|
+
* repetindo o mesmo nome. Lê como seis tarefas de um dia, não como uma de seis —
|
|
9
|
+
* o oposto do que um cronograma precisa dizer.
|
|
10
|
+
*
|
|
11
|
+
* Aqui cada barra vira **um segmento contínuo por semana**, atravessando as
|
|
12
|
+
* colunas que ocupa. Uma tarefa que cruza a virada de semana produz dois
|
|
13
|
+
* segmentos, cada um marcado com `continuesBefore`/`continuesAfter` — é o mesmo
|
|
14
|
+
* vocabulário que o `clipToWindow` usa na timeline, e pela mesma razão: a ponta
|
|
15
|
+
* cortada tem que parecer intencional.
|
|
16
|
+
*
|
|
17
|
+
* ## Por que lane e não empilhamento por ordem
|
|
18
|
+
*
|
|
19
|
+
* Duas barras que ocupam colunas sobrepostas na mesma semana não podem dividir a
|
|
20
|
+
* mesma faixa vertical. A alocação é gulosa na primeira faixa livre, com as
|
|
21
|
+
* barras ordenadas por **coluna inicial e depois por span decrescente**: barra
|
|
22
|
+
* longa primeiro faz a mais comprida ficar na faixa de cima, que é como
|
|
23
|
+
* calendário de verdade se lê — o "guarda-chuva" acima dos eventos curtos.
|
|
24
|
+
*
|
|
25
|
+
* ⛔ Não reusa o `packLanes` do `layout.ts`: aquele empacota por DATA num eixo
|
|
26
|
+
* contínuo, e aqui o eixo é discreto (7 colunas) e reinicia a cada semana. Usar
|
|
27
|
+
* o mesmo daria lanes coerentes no mês e incoerentes na linha.
|
|
28
|
+
*/
|
|
29
|
+
export type GanttSegmentInput = {
|
|
30
|
+
id: string;
|
|
31
|
+
start: Date;
|
|
32
|
+
end: Date;
|
|
33
|
+
};
|
|
34
|
+
export type GanttWeekSegment = {
|
|
35
|
+
barId: string;
|
|
36
|
+
/** Coluna onde começa nesta semana, 0–6. */
|
|
37
|
+
colStart: number;
|
|
38
|
+
/** Quantas colunas ocupa nesta semana, 1–7. */
|
|
39
|
+
colSpan: number;
|
|
40
|
+
/** Faixa vertical dentro da linha da semana, 0 = a de cima. */
|
|
41
|
+
lane: number;
|
|
42
|
+
/** Começou antes do primeiro dia desta semana. */
|
|
43
|
+
continuesBefore: boolean;
|
|
44
|
+
/** Termina depois do último dia desta semana. */
|
|
45
|
+
continuesAfter: boolean;
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Segmentos de UMA semana.
|
|
49
|
+
*
|
|
50
|
+
* `week` são os 7 dias na ordem em que a grade os mostra — vem do
|
|
51
|
+
* `buildMonthMatrix`, então `weekStartsOn` já está aplicado e esta função não
|
|
52
|
+
* precisa saber dele.
|
|
53
|
+
*/
|
|
54
|
+
export declare function buildWeekSegments(week: readonly Date[], barras: readonly GanttSegmentInput[]): GanttWeekSegment[];
|
|
55
|
+
/**
|
|
56
|
+
* Quantos segmentos ficam escondidos em cada COLUNA quando só `maxLanes` faixas
|
|
57
|
+
* cabem na altura da linha.
|
|
58
|
+
*
|
|
59
|
+
* Devolve um array de 7 contagens — é o "+N mais" de cada dia.
|
|
60
|
+
*
|
|
61
|
+
* ⚠️ A contagem é por COLUNA e não por semana: uma barra escondida que ocupa 3
|
|
62
|
+
* dias tem que aparecer no "+N" dos três, senão o usuário que olha o dia 12 não
|
|
63
|
+
* descobre que existe algo ali. Somar por semana daria um número certo no total
|
|
64
|
+
* e errado em todas as células.
|
|
65
|
+
*/
|
|
66
|
+
export declare function hiddenPerColumn(segmentos: readonly GanttWeekSegment[], maxLanes: number, colunas?: number): number[];
|
|
67
|
+
/** Quantas faixas a semana precisa pra mostrar tudo. */
|
|
68
|
+
export declare function laneCount(segmentos: readonly GanttWeekSegment[]): number;
|
|
69
|
+
//# sourceMappingURL=week-segments.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"week-segments.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/Gantt/hooks/week-segments.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,IAAI,CAAC;IACZ,GAAG,EAAE,IAAI,CAAC;CACX,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,4CAA4C;IAC5C,QAAQ,EAAE,MAAM,CAAC;IACjB,+CAA+C;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,+DAA+D;IAC/D,IAAI,EAAE,MAAM,CAAC;IACb,kDAAkD;IAClD,eAAe,EAAE,OAAO,CAAC;IACzB,iDAAiD;IACjD,cAAc,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,SAAS,IAAI,EAAE,EACrB,MAAM,EAAE,SAAS,iBAAiB,EAAE,GACnC,gBAAgB,EAAE,CAqEpB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,SAAS,gBAAgB,EAAE,EACtC,QAAQ,EAAE,MAAM,EAChB,OAAO,SAAI,GACV,MAAM,EAAE,CAUV;AAED,wDAAwD;AACxD,wBAAgB,SAAS,CAAC,SAAS,EAAE,SAAS,gBAAgB,EAAE,GAAG,MAAM,CAIxE"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export { Gantt } from './gantt';
|
|
2
|
+
/**
|
|
3
|
+
* Partes exportadas soltas — mesmo padrão do `TableToolbar` e do
|
|
4
|
+
* `SchedulerFilterPanel`.
|
|
5
|
+
*
|
|
6
|
+
* Serve pra tela que queira posicionar a grade ou a camada de setas em outro
|
|
7
|
+
* lugar do próprio layout, e pra doc page mostrar a anatomia isolada. Em uso
|
|
8
|
+
* normal você não precisa delas: o `Gantt` monta e controla as suas.
|
|
9
|
+
*/
|
|
10
|
+
export { GanttGrid, GANTT_DEFAULT_COLUMNS } from './parts/gantt-grid';
|
|
11
|
+
export type { GanttGridProps } from './parts/gantt-grid';
|
|
12
|
+
export { GanttBarView, GANTT_BAR_MIN_WIDTH_PX } from './parts/gantt-bar';
|
|
13
|
+
export type { GanttBarViewProps } from './parts/gantt-bar';
|
|
14
|
+
export { GanttFilterPanel } from './parts/gantt-filter-panel';
|
|
15
|
+
export type { GanttFilterPanelProps } from './parts/gantt-filter-panel';
|
|
16
|
+
export { GanttLinksLayer } from './parts/gantt-links-layer';
|
|
17
|
+
export type { GanttLinksLayerProps, GanttLinkGeometry, } from './parts/gantt-links-layer';
|
|
18
|
+
/**
|
|
19
|
+
* Núcleo puro. Exportado porque é útil fora do render: validar um cronograma no
|
|
20
|
+
* servidor, calcular caminho crítico num job, testar regra de negócio sem
|
|
21
|
+
* montar React.
|
|
22
|
+
*/
|
|
23
|
+
export { buildTimeAxis, buildMonthMatrix, clipToWindow, computeOverflow, dateToDayOffset, dateToX, daysOfBar, deriveSummaryRange, deriveWindow, flattenRows, monthBounds, monthMatrixRange, packLanes, rowHeights, rowOffsets, snapDate, xToDate, } from './hooks/layout';
|
|
24
|
+
export type { GanttAxis, GanttClippedBar, GanttFlatRow, GanttTick, } from './hooks/layout';
|
|
25
|
+
export { checkAllLinks, checkLink, computeCriticalPath, constraintDates, linkPath, linkSides, topoSort, } from './hooks/links';
|
|
26
|
+
export type { LinkAnchor, TopoResult } from './hooks/links';
|
|
27
|
+
export { GANTT_ROW_HEIGHT_PX, GANTT_LANE_HEIGHT_PX, GANTT_HEAD_HEIGHT_PX, GANTT_PX_PER_DAY, } from './gantt.styles';
|
|
28
|
+
/**
|
|
29
|
+
* O `tv()` do segmento da grade de mês — a "pílula" que representa a tarefa num
|
|
30
|
+
* dia, com ponto de cor, rótulo e o tingimento do `colorKey`.
|
|
31
|
+
*
|
|
32
|
+
* Exportado por um motivo específico: **prever como o item vai ficar antes de
|
|
33
|
+
* criá-lo**. Um formulário de nova tarefa que ofereça escolha de cor precisa
|
|
34
|
+
* mostrar a escolha, e desenhar isso na mão no consumidor recria o único
|
|
35
|
+
* defeito que a prévia existe pra evitar — duas definições da mesma pílula, que
|
|
36
|
+
* divergem na primeira vez que uma das duas mudar.
|
|
37
|
+
*
|
|
38
|
+
* Slots: `root` · `dot` · `label`. Variantes: `colorKey`, `continuesBefore`,
|
|
39
|
+
* `continuesAfter`, `conflict`, `critical`.
|
|
40
|
+
*
|
|
41
|
+
* ⚠️ O `root` é `absolute` porque na grade ele é posicionado por `left`/`top`
|
|
42
|
+
* dentro da semana. Fora dela, neutralize: `root({ class: "relative w-full" })`.
|
|
43
|
+
*/
|
|
44
|
+
export { ganttDaySegment } from './gantt.styles';
|
|
45
|
+
export type { GanttProps, GanttRef, GanttRow, GanttRowType, GanttBar, GanttBarChange, GanttColorKey, GanttColumn, GanttFilterField, GanttFilterModel, GanttFilterOption, GanttGranularity, GanttLink, GanttLinkType, GanttLinkViolation, GanttView, } from './gantt.types';
|
|
46
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/ui/Gantt/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhC;;;;;;;GAOG;AACH,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AACtE,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AACzE,YAAY,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,YAAY,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAExE,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,YAAY,EACV,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,2BAA2B,CAAC;AAEnC;;;;GAIG;AACH,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,YAAY,EACZ,eAAe,EACf,eAAe,EACf,OAAO,EACP,SAAS,EACT,kBAAkB,EAClB,YAAY,EACZ,WAAW,EACX,WAAW,EACX,gBAAgB,EAChB,SAAS,EACT,UAAU,EACV,UAAU,EACV,QAAQ,EACR,OAAO,GACR,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,SAAS,EACT,eAAe,EACf,YAAY,EACZ,SAAS,GACV,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,aAAa,EACb,SAAS,EACT,mBAAmB,EACnB,eAAe,EACf,QAAQ,EACR,SAAS,EACT,QAAQ,GACT,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE5D,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AAExB;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,YAAY,EACV,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,QAAQ,EACR,cAAc,EACd,aAAa,EACb,WAAW,EACX,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,SAAS,EACT,aAAa,EACb,kBAAkB,EAClB,SAAS,GACV,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { GanttFilterField, GanttFilterModel } from '../gantt.types';
|
|
2
|
+
export type GanttAppliedFiltersProps = {
|
|
3
|
+
fields: GanttFilterField[];
|
|
4
|
+
model: GanttFilterModel;
|
|
5
|
+
/** Todas as linhas — a contagem por opção é sobre elas, não sobre as filtradas. */
|
|
6
|
+
counts: Record<string, Record<string, number>>;
|
|
7
|
+
onToggleValue: (fieldId: string, value: string) => void;
|
|
8
|
+
onClearField: (fieldId: string) => void;
|
|
9
|
+
onClearAll: () => void;
|
|
10
|
+
/**
|
|
11
|
+
* Formata o ISO de um filtro `date` pro chip.
|
|
12
|
+
*
|
|
13
|
+
* Vem da raiz porque é lá que o `locale` mora — o chip não deve mostrar
|
|
14
|
+
* "2026-09-01" a um usuário pt-BR, e formatar aqui na unha significaria uma
|
|
15
|
+
* segunda decisão de formato de data no mesmo componente.
|
|
16
|
+
*/
|
|
17
|
+
formatDate?: (iso: string) => string;
|
|
18
|
+
};
|
|
19
|
+
export declare function GanttAppliedFilters({ fields, model, counts, onToggleValue, onClearField, onClearAll, formatDate, }: GanttAppliedFiltersProps): import("react/jsx-runtime").JSX.Element | null;
|
|
20
|
+
//# sourceMappingURL=gantt-applied-filters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gantt-applied-filters.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/Gantt/parts/gantt-applied-filters.tsx"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAsDzE,MAAM,MAAM,wBAAwB,GAAG;IACrC,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC3B,KAAK,EAAE,gBAAgB,CAAC;IACxB,mFAAmF;IACnF,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC/C,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxD,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;CACtC,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,EAClC,MAAM,EACN,KAAK,EACL,MAAM,EACN,aAAa,EACb,YAAY,EACZ,UAAU,EACV,UAAU,GACX,EAAE,wBAAwB,kDA4I1B"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { CSSProperties, MouseEvent, ReactNode } from 'react';
|
|
2
|
+
import { GanttBar, GanttColorKey, GanttRowType } from '../gantt.types';
|
|
3
|
+
/**
|
|
4
|
+
* A barra — e o losango do marco, que é a mesma peça noutro formato.
|
|
5
|
+
*
|
|
6
|
+
* ## Posicionada em px absoluto, não em grid
|
|
7
|
+
*
|
|
8
|
+
* `left`/`width` vêm de `dateToX`. Grid de N colunas parece mais limpo até a
|
|
9
|
+
* primeira barra que começa às 14h de um dia: ela não cai em limite de coluna, e
|
|
10
|
+
* a alternativa (arredondar pro dia) apaga informação que o consumidor passou.
|
|
11
|
+
*
|
|
12
|
+
* ## Largura mínima, e por que não é estética
|
|
13
|
+
*
|
|
14
|
+
* Uma barra de 1 dia em granularidade `quarter` tem **1,6px**. Sem piso, ela
|
|
15
|
+
* some — e "some" é indistinguível de "não existe", que é o pior modo de falha
|
|
16
|
+
* pra quem está conferindo se a tarefa entrou no plano. O piso de 6px mantém a
|
|
17
|
+
* barra clicável e visível, ao custo de exagerar a duração nessa escala.
|
|
18
|
+
*/
|
|
19
|
+
export declare const GANTT_BAR_MIN_WIDTH_PX = 6;
|
|
20
|
+
export type GanttBarViewProps = {
|
|
21
|
+
bar: GanttBar;
|
|
22
|
+
/** Posição já calculada pela view — a barra não sabe converter data. */
|
|
23
|
+
left: number;
|
|
24
|
+
width: number;
|
|
25
|
+
/** Índice da lane dentro da linha (0 na maioria dos casos). */
|
|
26
|
+
lane: number;
|
|
27
|
+
rowType: GanttRowType;
|
|
28
|
+
colorKey: GanttColorKey;
|
|
29
|
+
continuesBefore: boolean;
|
|
30
|
+
continuesAfter: boolean;
|
|
31
|
+
conflict?: boolean;
|
|
32
|
+
critical?: boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Altura em px, decidida pela VIEW e não aqui.
|
|
35
|
+
*
|
|
36
|
+
* A view é quem sabe se a linha tem uma lane ou cinco, e portanto quanto
|
|
37
|
+
* espaço a barra pode ocupar. Deixar a barra escolher faria ela precisar
|
|
38
|
+
* conhecer o `lanePacking` da linha — informação que não é dela.
|
|
39
|
+
*/
|
|
40
|
+
height: number;
|
|
41
|
+
movable?: boolean;
|
|
42
|
+
resizable?: boolean;
|
|
43
|
+
linkable?: boolean;
|
|
44
|
+
dragging?: boolean;
|
|
45
|
+
onClick?: (evt: MouseEvent) => void;
|
|
46
|
+
/**
|
|
47
|
+
* Início do gesto de MOVER — `pointerdown` no corpo da barra.
|
|
48
|
+
*
|
|
49
|
+
* ⚠️ Só no corpo: os punhos de resize e as portas de vínculo dão
|
|
50
|
+
* `stopPropagation`, senão um `pointerdown` no punho iniciaria os dois
|
|
51
|
+
* gestos ao mesmo tempo e a barra moveria enquanto redimensiona.
|
|
52
|
+
*/
|
|
53
|
+
onMoveStart?: (evt: MouseEvent) => void;
|
|
54
|
+
/** Início do gesto de resize. `side` diz qual ponta. */
|
|
55
|
+
onResizeStart?: (side: "start" | "end", evt: MouseEvent) => void;
|
|
56
|
+
/** Início do gesto de criar vínculo. */
|
|
57
|
+
onLinkStart?: (side: "start" | "end", evt: MouseEvent) => void;
|
|
58
|
+
/** Render custom do conteúdo — substitui o rótulo default. */
|
|
59
|
+
children?: ReactNode;
|
|
60
|
+
style?: CSSProperties;
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* ⚠️ `forwardRef` porque o dnd-kit precisa do nó DOM (`setNodeRef`), e porque a
|
|
64
|
+
* barra é âncora de `Tooltip`/`Popover` — sem ref, `asChild` do Radix não obtém
|
|
65
|
+
* o nó e o flutuante ancora fora do viewport (L-021, medido).
|
|
66
|
+
*/
|
|
67
|
+
export declare const GanttBarView: import('react').ForwardRefExoticComponent<GanttBarViewProps & import('react').RefAttributes<HTMLDivElement>>;
|
|
68
|
+
//# sourceMappingURL=gantt-bar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gantt-bar.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/Gantt/parts/gantt-bar.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,aAAa,EAAE,KAAK,UAAU,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAOxF,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE5E;;;;;;;;;;;;;;;GAeG;AAEH,eAAO,MAAM,sBAAsB,IAAI,CAAC;AAExC,MAAM,MAAM,iBAAiB,GAAG;IAC9B,GAAG,EAAE,QAAQ,CAAC;IACd,wEAAwE;IACxE,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,+DAA+D;IAC/D,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,YAAY,CAAC;IACtB,QAAQ,EAAE,aAAa,CAAC;IACxB,eAAe,EAAE,OAAO,CAAC;IACzB,cAAc,EAAE,OAAO,CAAC;IAExB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;;;;;OAMG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,IAAI,CAAC;IACpC;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,IAAI,CAAC;IACxC,wDAAwD;IACxD,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,GAAG,KAAK,EAAE,GAAG,EAAE,UAAU,KAAK,IAAI,CAAC;IACjE,wCAAwC;IACxC,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,GAAG,KAAK,EAAE,GAAG,EAAE,UAAU,KAAK,IAAI,CAAC;IAE/D,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,YAAY,8GAmKxB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { GanttFilterField, GanttFilterModel } from '../gantt.types';
|
|
2
|
+
export type GanttFilterPanelProps = {
|
|
3
|
+
open: boolean;
|
|
4
|
+
onOpenChange: (open: boolean) => void;
|
|
5
|
+
fields: GanttFilterField[];
|
|
6
|
+
model: GanttFilterModel;
|
|
7
|
+
onToggleValue: (fieldId: string, value: string) => void;
|
|
8
|
+
/** Marca ou desmarca o grupo inteiro de uma vez. */
|
|
9
|
+
onSetFieldValues: (fieldId: string, values: string[]) => void;
|
|
10
|
+
onClearAll: () => void;
|
|
11
|
+
appliedCount: number;
|
|
12
|
+
/** Contagem por opção — vem das linhas ANTES do filtro daquele campo. */
|
|
13
|
+
counts?: Record<string, Record<string, number>>;
|
|
14
|
+
};
|
|
15
|
+
export declare function GanttFilterPanel({ open, onOpenChange, fields, model, onToggleValue, onSetFieldValues, onClearAll, appliedCount, counts, }: GanttFilterPanelProps): import("react/jsx-runtime").JSX.Element;
|
|
16
|
+
//# sourceMappingURL=gantt-filter-panel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gantt-filter-panel.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/Gantt/parts/gantt-filter-panel.tsx"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AA8CzE,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC3B,KAAK,EAAE,gBAAgB,CAAC;IACxB,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxD,oDAAoD;IACpD,gBAAgB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAC9D,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,yEAAyE;IACzE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACjD,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,EAC/B,IAAI,EACJ,YAAY,EACZ,MAAM,EACN,KAAK,EACL,aAAa,EACb,gBAAgB,EAChB,UAAU,EACV,YAAY,EACZ,MAAM,GACP,EAAE,qBAAqB,2CA+DvB"}
|