@snksergio/design-system 0.55.0 → 0.56.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 (43) hide show
  1. package/dist-lib/index.cjs +2517 -3
  2. package/dist-lib/index.cjs.map +1 -1
  3. package/dist-lib/index.mjs +2530 -16
  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/Scheduler/hooks/layout.d.ts +165 -0
  8. package/dist-lib/src/components/ui/Scheduler/hooks/layout.d.ts.map +1 -0
  9. package/dist-lib/src/components/ui/Scheduler/hooks/use-media-query.d.ts +21 -0
  10. package/dist-lib/src/components/ui/Scheduler/hooks/use-media-query.d.ts.map +1 -0
  11. package/dist-lib/src/components/ui/Scheduler/hooks/use-scheduler-dnd.d.ts +41 -0
  12. package/dist-lib/src/components/ui/Scheduler/hooks/use-scheduler-dnd.d.ts.map +1 -0
  13. package/dist-lib/src/components/ui/Scheduler/hooks/use-scheduler-filter.d.ts +35 -0
  14. package/dist-lib/src/components/ui/Scheduler/hooks/use-scheduler-filter.d.ts.map +1 -0
  15. package/dist-lib/src/components/ui/Scheduler/hooks/use-scheduler-keyboard.d.ts +47 -0
  16. package/dist-lib/src/components/ui/Scheduler/hooks/use-scheduler-keyboard.d.ts.map +1 -0
  17. package/dist-lib/src/components/ui/Scheduler/hooks/use-scheduler-state.d.ts +44 -0
  18. package/dist-lib/src/components/ui/Scheduler/hooks/use-scheduler-state.d.ts.map +1 -0
  19. package/dist-lib/src/components/ui/Scheduler/index.d.ts +14 -0
  20. package/dist-lib/src/components/ui/Scheduler/index.d.ts.map +1 -0
  21. package/dist-lib/src/components/ui/Scheduler/parts/draggable-event.d.ts +30 -0
  22. package/dist-lib/src/components/ui/Scheduler/parts/draggable-event.d.ts.map +1 -0
  23. package/dist-lib/src/components/ui/Scheduler/parts/mini-month.d.ts +28 -0
  24. package/dist-lib/src/components/ui/Scheduler/parts/mini-month.d.ts.map +1 -0
  25. package/dist-lib/src/components/ui/Scheduler/parts/scheduler-event.d.ts +53 -0
  26. package/dist-lib/src/components/ui/Scheduler/parts/scheduler-event.d.ts.map +1 -0
  27. package/dist-lib/src/components/ui/Scheduler/parts/scheduler-filter-panel.d.ts +41 -0
  28. package/dist-lib/src/components/ui/Scheduler/parts/scheduler-filter-panel.d.ts.map +1 -0
  29. package/dist-lib/src/components/ui/Scheduler/parts/scheduler-toolbar.d.ts +31 -0
  30. package/dist-lib/src/components/ui/Scheduler/parts/scheduler-toolbar.d.ts.map +1 -0
  31. package/dist-lib/src/components/ui/Scheduler/scheduler.d.ts +44 -0
  32. package/dist-lib/src/components/ui/Scheduler/scheduler.d.ts.map +1 -0
  33. package/dist-lib/src/components/ui/Scheduler/scheduler.styles.d.ts +820 -0
  34. package/dist-lib/src/components/ui/Scheduler/scheduler.styles.d.ts.map +1 -0
  35. package/dist-lib/src/components/ui/Scheduler/scheduler.types.d.ts +285 -0
  36. package/dist-lib/src/components/ui/Scheduler/scheduler.types.d.ts.map +1 -0
  37. package/dist-lib/src/components/ui/Scheduler/views/list.d.ts +33 -0
  38. package/dist-lib/src/components/ui/Scheduler/views/list.d.ts.map +1 -0
  39. package/dist-lib/src/components/ui/Scheduler/views/month.d.ts +47 -0
  40. package/dist-lib/src/components/ui/Scheduler/views/month.d.ts.map +1 -0
  41. package/dist-lib/src/components/ui/Scheduler/views/time-grid.d.ts +48 -0
  42. package/dist-lib/src/components/ui/Scheduler/views/time-grid.d.ts.map +1 -0
  43. package/package.json +210 -210
@@ -41,6 +41,7 @@ export * from './ui/Modal';
41
41
  export * from './ui/MonthYearPicker';
42
42
  export * from './ui/PageHeader';
43
43
  export * from './ui/Panel';
44
+ export * from './ui/Scheduler';
44
45
  export * from './ui/ScreenLoader';
45
46
  export * from './ui/SingleMenuSidebar';
46
47
  export * from './ui/Spinner';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,165 @@
1
+ import { Locale } from 'date-fns';
2
+ import { LaneBox, MonthSegment, SchedulerEvent, SchedulerResizeEdge, SchedulerSnapMinutes } from '../scheduler.types';
3
+ /**
4
+ * `hooks/layout.ts` é o núcleo puro do `Scheduler` — sem `import React`,
5
+ * sem `Date.now()` implícito (o "agora" sempre entra como argumento em
6
+ * quem consumir isto). É a condição pra ser testável sem render, e é onde
7
+ * bug de calendário mora (spec §7/§8).
8
+ */
9
+ /**
10
+ * Constrói a grade de 6 semanas × 7 dias (sempre 42 dias) que contém
11
+ * `date`, alinhada a `weekStartsOn`.
12
+ *
13
+ * Sempre 6 linhas fixas — mesmo quando o mês cabe em 5 — porque colapsar a
14
+ * 6ª linha faria a altura da grade pular entre meses (spec §1, §7 #13).
15
+ * Cada `Date` retornado é normalizado com `startOfDay` (meia-noite local),
16
+ * então comparação por `.getTime()` entre dois dias da grade é segura.
17
+ *
18
+ * `locale` é repassado pro `startOfWeek` do date-fns por completude da
19
+ * assinatura (spec §8) — hoje não muda o resultado porque `weekStartsOn`
20
+ * sempre é passado explicitamente e tem precedência sobre o default do
21
+ * locale.
22
+ */
23
+ export declare function buildMonthMatrix(date: Date, weekStartsOn: 0 | 1 | 2 | 3 | 4 | 5 | 6, locale?: Locale): Date[][];
24
+ /**
25
+ * Recorta cada evento de `events` em 1 `MonthSegment` por linha de
26
+ * `weekRows` que ele atravessa (o retorno de `buildMonthMatrix`, ou
27
+ * qualquer subconjunto de linhas contíguas dele).
28
+ *
29
+ * A comparação é por **dia**, não por hora — `allDay` e evento cronometrado
30
+ * são tratados igual aqui, porque o mês mostra datas, não horários. Um
31
+ * evento de duração 0 (`start === end`) sempre produz exatamente 1
32
+ * segmento de 1 coluna, em qualquer linha.
33
+ *
34
+ * `weekRows` pode ser só as linhas de UM mês (não a grade inteira de outro
35
+ * mês adjacente) — por isso um evento que começa antes da 1ª linha visível
36
+ * chega com `isStart: false` no segmento da 1ª linha (spec §7 #7), e um que
37
+ * termina depois da última linha chega com `isEnd: false` na última (§7
38
+ * #2/#6). "Antes"/"depois" aqui é sempre relativo às linhas recebidas, não
39
+ * ao calendário inteiro — é o chamador (a view) quem decide o que é
40
+ * "visível".
41
+ */
42
+ export declare function segmentMultiDay(events: SchedulerEvent[], weekRows: Date[][]): MonthSegment[];
43
+ /**
44
+ * Lane-packing de `events` (já restritos a uma única faixa cronometrada —
45
+ * um dia, em week/day) pra resolver sobreposição horizontal.
46
+ *
47
+ * Algoritmo: ordena por `start` asc, `end` desc como desempate (spec §7
48
+ * #3). Varre em ordem e agrupa em **grupos conexos** — um evento entra no
49
+ * grupo corrente se seu `start` for antes do maior `end` já visto no
50
+ * grupo; caso contrário fecha o grupo e abre um novo. Dentro de cada
51
+ * grupo, aloca cada evento na primeira lane cujo último evento já
52
+ * terminou (`laneEnd <= event.start`), criando lane nova quando nenhuma
53
+ * está livre.
54
+ *
55
+ * `laneCount` no resultado é o tamanho do grupo conexo, não do dia
56
+ * inteiro — dois grupos disjuntos no mesmo dia (ex: manhã com 2
57
+ * sobrepostos, tarde com 5) não compartilham `laneCount` entre si (spec
58
+ * §7 #3, caso "grupo da manhã não herda nLanes da tarde").
59
+ */
60
+ export declare function packLanes(events: SchedulerEvent[], snapMinutes: SchedulerSnapMinutes): LaneBox[];
61
+ /**
62
+ * Decide quantos eventos de `dayEvents` cabem em `availableHeight` px
63
+ * (a altura livre de UMA célula do mês) e quantos "sobram" pro indicador
64
+ * "+N mais".
65
+ *
66
+ * `N` deriva da altura disponível, nunca de uma constante fixa (spec §7
67
+ * #11). E a própria linha "+N mais" ocupa 1 slot do mesmo tamanho de um
68
+ * pill — por isso, quando nem tudo cabe, o algoritmo **sempre** reserva 1
69
+ * posição a menos do que caberia cru: célula que cabe 3 pills mostra 2 +
70
+ * "+2 mais", nunca 3 + "+1 mais" (que estouraria a altura disponível pela
71
+ * própria linha de overflow).
72
+ */
73
+ export declare function computeOverflow(dayEvents: SchedulerEvent[], availableHeight: number): {
74
+ visible: SchedulerEvent[];
75
+ overflowCount: number;
76
+ };
77
+ /**
78
+ * Arredonda `date` pro múltiplo de `snapMinutes` mais próximo (meio exato
79
+ * arredonda pra cima — `Math.round` nativo, sem regra especial) e clampa
80
+ * o resultado dentro de `dayRange` e do fim do dia.
81
+ *
82
+ * O clamp em fim de dia existe pro caso de arrastar um evento das 23:50
83
+ * pra baixo com `snapMinutes: 15`: sem ele, o snap geraria silenciosamente
84
+ * um horário no dia seguinte (spec §7 #9). Clampa sempre em `endOfDay`
85
+ * de `date`, nunca em `startOfDay` do dia seguinte — o valor clampado é o
86
+ * que a função devolve, pra quem chamar decidir se ainda quer commitar.
87
+ */
88
+ export declare function snapToGrid(date: Date, snapMinutes: SchedulerSnapMinutes, dayRange: [number, number]): Date;
89
+ /**
90
+ * Recalcula `start`/`end` de um resize por `deltaMin` minutos na alça
91
+ * `edge`. `deltaMin` chega bruto (não snapado) — esta função aplica o
92
+ * snap de `snapMinutes` sobre o delta antes de somar.
93
+ *
94
+ * Nunca emite `start > end`: arrastar a alça de cima (`edge: "start"`)
95
+ * abaixo da alça de baixo clampa em `end - snapMinutes`; arrastar a alça
96
+ * de baixo (`edge: "end"`) acima da de cima clampa em `start + snapMinutes`
97
+ * (spec §7 #10) — a duração mínima resultante é sempre 1 unidade de snap,
98
+ * nunca 0 (duração 0 é um estado válido só na criação/drag, não como
99
+ * resultado de resize).
100
+ */
101
+ export declare function resolveResize(event: SchedulerEvent, edge: SchedulerResizeEdge, deltaMin: number, snapMinutes: SchedulerSnapMinutes): {
102
+ start: Date;
103
+ end: Date;
104
+ };
105
+ /**
106
+ * Converte um deslocamento vertical em px (o `delta.y` do dnd) em minutos.
107
+ *
108
+ * Não arredonda: quem chama aplica o snap depois, via `snapToGrid` ou
109
+ * `resolveResize`. Arredondar aqui perderia a informação de qual lado do meio o
110
+ * ponteiro está, e o snap ficaria enviesado pra baixo.
111
+ */
112
+ export declare function pixelsToMinutes(px: number, hourHeight: number): number;
113
+ /**
114
+ * Novo `start`/`end` de um evento solto numa célula do mês.
115
+ *
116
+ * **Preserva a HORA e a DURAÇÃO** — arrastar no mês muda a data, não o horário:
117
+ * um evento de 14:00–15:30 largado 3 dias à frente continua 14:00–15:30. Zerar
118
+ * a hora aqui apagaria informação que o usuário não pediu pra mudar.
119
+ *
120
+ * A conta é em DIAS de calendário (`differenceInCalendarDays`), não em
121
+ * milissegundos: num dia de virada de horário de verão a diferença em ms entre
122
+ * dois "mesmos horários" não é múltiplo de 24h, e somar ms deslocaria o evento
123
+ * em 1 hora. Somar dias mantém a hora local.
124
+ *
125
+ * `allDay` cai no mesmo caminho: a duração em dias é preservada.
126
+ */
127
+ export declare function resolveMonthDrop(event: SchedulerEvent, targetDay: Date): {
128
+ start: Date;
129
+ end: Date;
130
+ };
131
+ /**
132
+ * Novo `start`/`end` de um evento movido na grade de horas.
133
+ *
134
+ * Combina os dois eixos do gesto: `dayDelta` (quantas colunas de dia o
135
+ * ponteiro atravessou, resolvido pelo droppable) e `minuteDelta` (o `delta.y`
136
+ * já convertido por `pixelsToMinutes`).
137
+ *
138
+ * **A duração é preservada** e o `end` é derivado do `start` — nunca snapado
139
+ * separadamente. Snapar as duas pontas de forma independente encurtaria ou
140
+ * esticaria o evento a cada arrasto: um evento de 50min podia virar 45 ou 60
141
+ * só por ser movido, o que é mudança de dado que o usuário não pediu.
142
+ *
143
+ * O snap é aplicado ao `start` e clampado no `dayRange` do dia de destino, pelo
144
+ * mesmo `snapToGrid` que o resto usa. Consequência aceita: arrastar pra baixo
145
+ * perto do fim da grade "encosta" no limite em vez de vazar pro dia seguinte —
146
+ * mover pro dia seguinte se faz atravessando a coluna, que é o gesto explícito.
147
+ */
148
+ export declare function resolveTimeGridMove(event: SchedulerEvent, dayDelta: number, minuteDelta: number, snapMinutes: SchedulerSnapMinutes, dayRange: [number, number]): {
149
+ start: Date;
150
+ end: Date;
151
+ };
152
+ /**
153
+ * Converte `date` num offset vertical (px) a partir do topo da grade
154
+ * (a hora `dayRange[0]`), pra `hourHeight` px por hora.
155
+ *
156
+ * Usa a diferença real em milissegundos entre `date` e o início da grade
157
+ * — nunca `24 * 60` fixo — porque um dia de virada de horário de verão
158
+ * tem 23 ou 25 horas reais, não 24 (spec §7 #8): `startOfDay`/`endOfDay`
159
+ * do date-fns respeitam a hora local, e a diferença de timestamps entre
160
+ * dois pontos do mesmo dia captura a hora real perdida ou ganha na
161
+ * virada. Precisão sub-minuto (ponto flutuante, não `differenceInMinutes`
162
+ * truncado) pro posicionamento durante drag ser pixel-perfect.
163
+ */
164
+ export declare function minutesToOffset(date: Date, dayRange: [number, number], hourHeight: number): number;
165
+ //# sourceMappingURL=layout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/Scheduler/hooks/layout.ts"],"names":[],"mappings":"AAAA,OAAO,EASL,KAAK,MAAM,EACZ,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EACV,OAAO,EACP,YAAY,EACZ,cAAc,EACd,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,oBAAoB,CAAC;AAE5B;;;;;GAKG;AAMH;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,IAAI,EACV,YAAY,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EACvC,MAAM,CAAC,EAAE,MAAM,GACd,IAAI,EAAE,EAAE,CAcV;AAMD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,cAAc,EAAE,EACxB,QAAQ,EAAE,IAAI,EAAE,EAAE,GACjB,YAAY,EAAE,CAsChB;AAoBD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,SAAS,CACvB,MAAM,EAAE,cAAc,EAAE,EACxB,WAAW,EAAE,oBAAoB,GAChC,OAAO,EAAE,CAoDX;AAWD;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,cAAc,EAAE,EAC3B,eAAe,EAAE,MAAM,GACtB;IAAE,OAAO,EAAE,cAAc,EAAE,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CAsBtD;AAMD;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,IAAI,EACV,WAAW,EAAE,oBAAoB,EACjC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,GACzB,IAAI,CAkBN;AAMD;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,cAAc,EACrB,IAAI,EAAE,mBAAmB,EACzB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,oBAAoB,GAChC;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,IAAI,CAAA;CAAE,CAe5B;AAMD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAGtE;AAMD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,cAAc,EACrB,SAAS,EAAE,IAAI,GACd;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,IAAI,CAAA;CAAE,CAY5B;AAMD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,cAAc,EACrB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,oBAAoB,EACjC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,GACzB;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,IAAI,CAAA;CAAE,CAO5B;AAMD;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAC1B,UAAU,EAAE,MAAM,GACjB,MAAM,CAIR"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Media query reativa — re-renderiza quando o resultado muda (resize,
3
+ * mudança de orientação).
4
+ *
5
+ * ⚠️ **Isto é uma cópia** de `MenuSidebar/use-media-query.ts`, byte a byte no
6
+ * comportamento. Não é descuido: importar de `../MenuSidebar` é o mesmo
7
+ * cross-import entre pastas de `ui/` que gerou o `registryDependency` dangling
8
+ * da L-049 no `DataList` — o item `scheduler` do registry passaria a depender
9
+ * de `menu-sidebar` inteiro (com nav, rotas e drawer) pra usar 20 linhas de
10
+ * `matchMedia`, e no copy-in o import não resolveria.
11
+ *
12
+ * Esta é a **segunda** duplicação que o `Scheduler` faz pelo mesmo motivo (a
13
+ * primeira é a gramática visual da toolbar). Duas já são sinal: se aparecer uma
14
+ * terceira, o certo passa a ser um item de registry compartilhado
15
+ * (`@igreen/hooks` ou similar) em vez de seguir copiando — e aí as três cópias
16
+ * convergem pra ele. Registrado como dívida no PR/handoff, não resolvido aqui,
17
+ * porque criar canal de distribuição novo é decisão de release, não de
18
+ * componente.
19
+ */
20
+ export declare function useMediaQuery(query: string): boolean;
21
+ //# sourceMappingURL=use-media-query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-media-query.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/Scheduler/hooks/use-media-query.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAgBpD"}
@@ -0,0 +1,41 @@
1
+ import { DragEndEvent, DragOverEvent, DragStartEvent } from '@dnd-kit/core';
2
+ import { SchedulerEvent, SchedulerEventChange, SchedulerResizeEdge, SchedulerSnapMinutes, SchedulerView } from '../scheduler.types';
3
+ export declare const draggableIdForMove: (eventId: string) => string;
4
+ export declare const draggableIdForResize: (eventId: string, edge: SchedulerResizeEdge) => string;
5
+ export declare const droppableIdForDay: (day: Date) => string;
6
+ type DragKind = {
7
+ kind: "move";
8
+ eventId: string;
9
+ } | {
10
+ kind: "resize";
11
+ eventId: string;
12
+ edge: SchedulerResizeEdge;
13
+ };
14
+ type UseSchedulerDndParams = {
15
+ enabled: boolean;
16
+ view: SchedulerView;
17
+ events: SchedulerEvent[];
18
+ snapMinutes: SchedulerSnapMinutes;
19
+ dayRange: [number, number];
20
+ /** Altura da hora em px — converte `delta.y` em minutos. */
21
+ hourHeight: number;
22
+ draggable: boolean;
23
+ resizable: boolean;
24
+ onEventMove?: (change: SchedulerEventChange) => void;
25
+ onEventResize?: (change: SchedulerEventChange) => void;
26
+ };
27
+ export declare function useSchedulerDnd({ enabled, view, events, snapMinutes, dayRange, hourHeight, draggable, resizable, onEventMove, onEventResize, }: UseSchedulerDndParams): {
28
+ sensors: import('@dnd-kit/core').SensorDescriptor<import('@dnd-kit/core').SensorOptions>[];
29
+ /** `move:<id>` ou `resize:<id>:<edge>` em andamento, pra pintar o estado. */
30
+ dragAtivo: DragKind | null;
31
+ /** `getTime()` do dia sob o cursor — a célula/coluna se pinta com isso. */
32
+ diaSobreposto: number | null;
33
+ podeMover: (e: SchedulerEvent) => boolean;
34
+ podeRedimensionar: (e: SchedulerEvent) => boolean;
35
+ handleDragStart: (evt: DragStartEvent) => void;
36
+ handleDragOver: (evt: DragOverEvent) => void;
37
+ handleDragEnd: (evt: DragEndEvent) => void;
38
+ handleDragCancel: () => void;
39
+ };
40
+ export {};
41
+ //# sourceMappingURL=use-scheduler-dnd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-scheduler-dnd.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/Scheduler/hooks/use-scheduler-dnd.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,cAAc,EACpB,MAAM,eAAe,CAAC;AAQvB,OAAO,KAAK,EACV,cAAc,EACd,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,aAAa,EACd,MAAM,oBAAoB,CAAC;AAmC5B,eAAO,MAAM,kBAAkB,GAAI,SAAS,MAAM,WAA+B,CAAC;AAClF,eAAO,MAAM,oBAAoB,GAC/B,SAAS,MAAM,EACf,MAAM,mBAAmB,WACc,CAAC;AAC1C,eAAO,MAAM,iBAAiB,GAAI,KAAK,IAAI,WACE,CAAC;AAS9C,KAAK,QAAQ,GACT;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,mBAAmB,CAAA;CAAE,CAAC;AAiBnE,KAAK,qBAAqB,GAAG;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,aAAa,CAAC;IACpB,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,WAAW,EAAE,oBAAoB,CAAC;IAClC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3B,4DAA4D;IAC5D,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,oBAAoB,KAAK,IAAI,CAAC;IACrD,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,oBAAoB,KAAK,IAAI,CAAC;CACxD,CAAC;AAEF,wBAAgB,eAAe,CAAC,EAC9B,OAAO,EACP,IAAI,EACJ,MAAM,EACN,WAAW,EACX,QAAQ,EACR,UAAU,EACV,SAAS,EACT,SAAS,EACT,WAAW,EACX,aAAa,GACd,EAAE,qBAAqB;;IA6KpB,6EAA6E;;IAE7E,2EAA2E;;mBAjIvE,cAAc;2BAId,cAAc;2BAWsB,cAAc;0BAKf,aAAa;yBAW9C,YAAY;;EA2GrB"}
@@ -0,0 +1,35 @@
1
+ import { SchedulerEvent, SchedulerFilterField, SchedulerFilterMode, SchedulerFilterModel } from '../scheduler.types';
2
+ /**
3
+ * Busca + filtros declarativos. O componente renderiza os chips **e aplica**
4
+ * o filtro (modo `"client"`) — nunca um form solto acima da grade (L-051): o
5
+ * chip clicável é o que deixa visível o que está filtrado e permite desfazer
6
+ * sem procurar o controle que produziu o estado.
7
+ *
8
+ * Em `"server"` nada é filtrado localmente: o hook só emite
9
+ * `onFilterModelChange`/`onSearchChange` e devolve `events` intacto. É o modo
10
+ * correto pra dado paginado — filtrar no cliente uma página já recortada
11
+ * mostraria "3 de 500" como se fossem todos.
12
+ */
13
+ type UseSchedulerFilterParams = {
14
+ events: SchedulerEvent[];
15
+ searchable: boolean;
16
+ search?: string;
17
+ onSearchChange?: (search: string) => void;
18
+ filterFields?: SchedulerFilterField[];
19
+ filterModel?: SchedulerFilterModel;
20
+ onFilterModelChange?: (model: SchedulerFilterModel) => void;
21
+ filterMode: SchedulerFilterMode;
22
+ };
23
+ export declare function useSchedulerFilter({ events, searchable, search: searchProp, onSearchChange, filterFields, filterModel: modelProp, onFilterModelChange, filterMode, }: UseSchedulerFilterParams): {
24
+ search: string;
25
+ setSearch: (next: string) => void;
26
+ filterModel: SchedulerFilterModel;
27
+ toggleValue: (fieldId: string, value: string) => void;
28
+ clearField: (fieldId: string) => void;
29
+ clearAll: () => void;
30
+ appliedCount: number;
31
+ optionCounts: Record<string, Record<string, number>>;
32
+ filteredEvents: SchedulerEvent[];
33
+ };
34
+ export {};
35
+ //# sourceMappingURL=use-scheduler-filter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-scheduler-filter.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/Scheduler/hooks/use-scheduler-filter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,cAAc,EACd,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,oBAAoB,CAAC;AAE5B;;;;;;;;;;GAUG;AAEH,KAAK,wBAAwB,GAAG;IAC9B,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,YAAY,CAAC,EAAE,oBAAoB,EAAE,CAAC;IACtC,WAAW,CAAC,EAAE,oBAAoB,CAAC;IACnC,mBAAmB,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAC5D,UAAU,EAAE,mBAAmB,CAAC;CACjC,CAAC;AAwDF,wBAAgB,kBAAkB,CAAC,EACjC,MAAM,EACN,UAAU,EACV,MAAM,EAAE,UAAU,EAClB,cAAc,EACd,YAAY,EACZ,WAAW,EAAE,SAAS,EACtB,mBAAmB,EACnB,UAAU,GACX,EAAE,wBAAwB;;sBA2BhB,MAAM;;2BAmBH,MAAM,SAAS,MAAM;0BAkBrB,MAAM;;;;;EAoFnB"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Roving tabindex pra uma grade — o padrão WAI-ARIA de `grid`.
3
+ *
4
+ * ## O problema que ele resolve
5
+ *
6
+ * Sem isso, cada célula é um `tabIndex=0` e a grade do mês custa **42 `Tab`**
7
+ * pra atravessar; a de semana custa 168. Um teclado só consegue chegar ao
8
+ * conteúdo abaixo da grade desistindo.
9
+ *
10
+ * Com roving tabindex, a grade inteira é **uma** parada de `Tab`: a célula ativa
11
+ * tem `tabIndex=0`, todas as outras `-1`, e as setas movem o foco por dentro.
12
+ * É a razão de `tabIndex` ser calculado por índice em vez de fixo.
13
+ *
14
+ * ## Por que o foco é aplicado num efeito, e não no `onKeyDown`
15
+ *
16
+ * A tecla muda o `ativo` (estado); quem chama `.focus()` é o efeito que roda
17
+ * depois do render. Chamar `.focus()` dentro do handler focaria o nó da
18
+ * renderização ANTERIOR — que em grade que troca de mês é outro elemento, ou
19
+ * nenhum.
20
+ *
21
+ * O efeito só age quando `moveuPorTeclado` está ligado: sem essa guarda, a
22
+ * grade roubaria o foco na montagem e ao receber um `ativo` novo por clique,
23
+ * arrancando o foco de onde o usuário estava.
24
+ */
25
+ type UseSchedulerKeyboardParams = {
26
+ /** Total de células navegáveis. */
27
+ count: number;
28
+ /** Quantas por linha — define o passo do ↑/↓. */
29
+ columns: number;
30
+ /**
31
+ * Chamado no Enter/Space da célula ativa. É o "abrir/criar" da grade — o
32
+ * componente decide o que isso significa (criar evento no dia, na hora…).
33
+ */
34
+ onActivate?: (index: number) => void;
35
+ enabled?: boolean;
36
+ };
37
+ export declare function useSchedulerKeyboard({ count, columns, onActivate, enabled, }: UseSchedulerKeyboardParams): {
38
+ activeIndex: number;
39
+ getCellProps: (index: number) => {
40
+ tabIndex: number;
41
+ onKeyDown: (e: React.KeyboardEvent) => void;
42
+ onFocus: () => void;
43
+ };
44
+ getCellRef: (index: number) => (el: HTMLElement | null) => void;
45
+ };
46
+ export {};
47
+ //# sourceMappingURL=use-scheduler-keyboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-scheduler-keyboard.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/Scheduler/hooks/use-scheduler-keyboard.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,KAAK,0BAA0B,GAAG;IAChC,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,iDAAiD;IACjD,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,wBAAgB,oBAAoB,CAAC,EACnC,KAAK,EACL,OAAO,EACP,UAAU,EACV,OAAc,GACf,EAAE,0BAA0B;;0BAqFjB,MAAM;;uBAzDS,KAAK,CAAC,aAAa;;;wBAmElC,MAAM,UA1EU,WAAW,GAAG,IAAI;EA+E7C"}
@@ -0,0 +1,44 @@
1
+ import { Locale } from 'date-fns';
2
+ import { SchedulerView } from '../scheduler.types';
3
+ /**
4
+ * Estado de período e de view — controlado OU não-controlado, na mesma
5
+ * gramática que `viewMode`/`defaultViewMode` do `DataTable` já usa com
6
+ * sucesso: passar o par controlado (`date` + `onDateChange`) manda; passar só
7
+ * `defaultDate` deixa o componente guardar.
8
+ *
9
+ * Passar `date` e `defaultDate` juntos é erro de uso: `date` vence e sai um
10
+ * `console.warn` em DEV. Avisar é melhor que escolher em silêncio — o sintoma
11
+ * (a navegação "não anda" porque o consumidor não conectou `onDateChange`) é
12
+ * indistinguível de um bug do componente.
13
+ */
14
+ type UseSchedulerStateParams = {
15
+ defaultDate?: Date;
16
+ date?: Date;
17
+ onDateChange?: (date: Date) => void;
18
+ defaultView?: SchedulerView;
19
+ view?: SchedulerView;
20
+ onViewChange?: (view: SchedulerView) => void;
21
+ weekStartsOn: 0 | 1 | 2 | 3 | 4 | 5 | 6;
22
+ locale?: Locale;
23
+ /**
24
+ * "Agora" entra como argumento em vez de o hook chamar `new Date()` — é o
25
+ * que torna o comportamento testável sem congelar o relógio global.
26
+ */
27
+ now: Date;
28
+ };
29
+ export declare function useSchedulerState({ defaultDate, date: dateProp, onDateChange, defaultView, view: viewProp, onViewChange, weekStartsOn, locale, now, }: UseSchedulerStateParams): {
30
+ date: Date;
31
+ view: SchedulerView;
32
+ setDate: (next: Date) => void;
33
+ setView: (next: SchedulerView) => void;
34
+ next: () => void;
35
+ prev: () => void;
36
+ goToToday: () => void;
37
+ goToDate: (target: Date) => void;
38
+ visibleRange: {
39
+ start: Date;
40
+ end: Date;
41
+ };
42
+ };
43
+ export {};
44
+ //# sourceMappingURL=use-scheduler-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-scheduler-state.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/Scheduler/hooks/use-scheduler-state.ts"],"names":[],"mappings":"AACA,OAAO,EAUL,KAAK,MAAM,EACZ,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD;;;;;;;;;;GAUG;AAEH,KAAK,uBAAuB,GAAG;IAC7B,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IACpC,WAAW,CAAC,EAAE,aAAa,CAAC;IAC5B,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,IAAI,CAAC;IAC7C,YAAY,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,GAAG,EAAE,IAAI,CAAC;CACX,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,EAChC,WAAW,EACX,IAAI,EAAE,QAAQ,EACd,YAAY,EACZ,WAAW,EACX,IAAI,EAAE,QAAQ,EACd,YAAY,EACZ,YAAY,EACZ,MAAM,EACN,GAAG,GACJ,EAAE,uBAAuB;;;oBA+Cf,IAAI;oBAQJ,aAAa;;;;uBAmCX,IAAI;;eAe2B,IAAI;aAAO,IAAI;;EAoC1D"}
@@ -0,0 +1,14 @@
1
+ export { Scheduler } from './scheduler';
2
+ /**
3
+ * O painel de filtro também é exportado solto — mesmo padrão do `TableToolbar`,
4
+ * que expõe `ToolbarSearch`, `ToolbarSegmented` e as outras partes pelo barrel.
5
+ *
6
+ * Serve pra dois casos: uma tela que queira posicionar o painel em outro lugar
7
+ * do próprio layout (e não como coluna do `Scheduler`), e a doc page, que o
8
+ * renderiza isolado pra mostrar a anatomia dele. Em uso normal você não precisa
9
+ * dele: o `Scheduler` monta e controla o seu.
10
+ */
11
+ export { SchedulerFilterPanel } from './parts/scheduler-filter-panel';
12
+ export type { SchedulerFilterPanelProps } from './parts/scheduler-filter-panel';
13
+ export type { SchedulerProps, SchedulerEvent, SchedulerEventColor, SchedulerView, SchedulerHourFormat, SchedulerSnapMinutes, SchedulerFilterMode, SchedulerFilterField, SchedulerFilterOption, SchedulerFilterModel, SchedulerEventChange, SchedulerRenderEventParams, SchedulerRef, } from './scheduler.types';
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/ui/Scheduler/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC;;;;;;;;GAQG;AACH,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,YAAY,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAChF,YAAY,EACV,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,EACpB,0BAA0B,EAC1B,YAAY,GACb,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,30 @@
1
+ import { ReactNode } from 'react';
2
+ import { SchedulerEventItemProps } from './scheduler-event';
3
+ export type DraggableEventProps = Omit<SchedulerEventItemProps, "dragAttributes" | "dragListeners" | "setDragNodeRef" | "dragTransform" | "resizeHandles"> & {
4
+ /** Liga o arraste de mover. Quando `false`, o item renderiza inerte. */
5
+ movable?: boolean;
6
+ /** Liga as alças de resize. Só faz sentido em week/day. */
7
+ resizable?: boolean;
8
+ };
9
+ export declare function DraggableEvent({ movable, resizable, ...rest }: DraggableEventProps): import("react/jsx-runtime").JSX.Element;
10
+ export declare function DroppableDay({ day, disabled, className, overClassName, children, cellRef, ...rest }: {
11
+ day: Date;
12
+ disabled?: boolean;
13
+ className: string;
14
+ /** Classe aplicada só quando o cursor está sobre este dia. */
15
+ overClassName: string;
16
+ children: ReactNode;
17
+ /**
18
+ * `ref` do roving tabindex, que precisa do MESMO nó que o droppable.
19
+ *
20
+ * ⚠️ Prop **explícita**, e não via spread: a primeira versão espalhava
21
+ * `{...getCellProps(i)}` no `<div>`, e o `ref` que vem ali **sobrescrevia** o
22
+ * `setNodeRef` do dnd-kit — spread depois de `ref=` ganha. O resultado era o
23
+ * droppable nunca receber o nó, `over` sempre `null`, e o drop não persistir:
24
+ * o overlay seguia o cursor, o usuário soltava, e nada acontecia.
25
+ *
26
+ * `Omit<HTMLAttributes>` não inclui `ref`, então o TypeScript não pegou.
27
+ */
28
+ cellRef?: (el: HTMLElement | null) => void;
29
+ } & Omit<React.HTMLAttributes<HTMLDivElement>, "className" | "children" | "ref">): import("react/jsx-runtime").JSX.Element;
30
+ //# sourceMappingURL=draggable-event.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"draggable-event.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/Scheduler/parts/draggable-event.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIvC,OAAO,EAAsB,KAAK,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAoErF,MAAM,MAAM,mBAAmB,GAAG,IAAI,CACpC,uBAAuB,EACvB,gBAAgB,GAAG,eAAe,GAAG,gBAAgB,GAAG,eAAe,GAAG,eAAe,CAC1F,GAAG;IACF,wEAAwE;IACxE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,2DAA2D;IAC3D,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,wBAAgB,cAAc,CAAC,EAC7B,OAAe,EACf,SAAiB,EACjB,GAAG,IAAI,EACR,EAAE,mBAAmB,2CAqDrB;AAMD,wBAAgB,YAAY,CAAC,EAC3B,GAAG,EACH,QAAQ,EACR,SAAS,EACT,aAAa,EACb,QAAQ,EACR,OAAO,EACP,GAAG,IAAI,EACR,EAAE;IACD,GAAG,EAAE,IAAI,CAAC;IACV,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,8DAA8D;IAC9D,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,SAAS,CAAC;IACpB;;;;;;;;;;OAUG;IACH,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAC;CAC5C,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,WAAW,GAAG,UAAU,GAAG,KAAK,CAAC,2CAkB/E"}
@@ -0,0 +1,28 @@
1
+ import { Locale } from 'date-fns';
2
+ import { SchedulerEvent } from '../scheduler.types';
3
+ /**
4
+ * Mini-calendário do painel de filtro — o mesmo papel que ele tem na barra
5
+ * lateral do Google Calendar: **saltar de data**, não filtrar.
6
+ *
7
+ * Reusa `buildMonthMatrix` de `hooks/layout.ts`, a mesma função da grade
8
+ * grande. Não é economia de linhas: é o que garante que os dois concordem
9
+ * sobre onde a semana começa e sobre a grade ter 6 linhas fixas. Uma segunda
10
+ * implementação aqui divergiria na virada de mês, e o usuário veria o
11
+ * mini-calendário marcar um dia e a grade abrir outro.
12
+ *
13
+ * O mês do mini navega **independente** da grade (estado próprio): procurar
14
+ * "aquela semana de dezembro" não deve arrastar a view principal a cada
15
+ * clique na seta. Clicar num dia é que move as duas — e ressincroniza o mini.
16
+ */
17
+ export type MiniMonthProps = {
18
+ /** Data-âncora da view principal — é o dia pintado como selecionado. */
19
+ selected: Date;
20
+ now: Date;
21
+ locale?: Locale;
22
+ weekStartsOn: 0 | 1 | 2 | 3 | 4 | 5 | 6;
23
+ /** Eventos já filtrados: o ponto de "tem coisa nesse dia" segue o filtro. */
24
+ events: SchedulerEvent[];
25
+ onSelect: (date: Date) => void;
26
+ };
27
+ export declare function MiniMonth({ selected, now, locale, weekStartsOn, events, onSelect, }: MiniMonthProps): import("react/jsx-runtime").JSX.Element;
28
+ //# sourceMappingURL=mini-month.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mini-month.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/Scheduler/parts/mini-month.tsx"],"names":[],"mappings":"AACA,OAAO,EAML,KAAK,MAAM,EACZ,MAAM,UAAU,CAAC;AAWlB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD;;;;;;;;;;;;;GAaG;AAEH,MAAM,MAAM,cAAc,GAAG;IAC3B,wEAAwE;IACxE,QAAQ,EAAE,IAAI,CAAC;IACf,GAAG,EAAE,IAAI,CAAC;IACV,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACxC,6EAA6E;IAC7E,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;CAChC,CAAC;AAEF,wBAAgB,SAAS,CAAC,EACxB,QAAQ,EACR,GAAG,EACH,MAAM,EACN,YAAY,EACZ,MAAM,EACN,QAAQ,GACT,EAAE,cAAc,2CAqGhB"}
@@ -0,0 +1,53 @@
1
+ import { CSSProperties, ReactNode } from 'react';
2
+ import { SchedulerEvent, SchedulerView } from '../scheduler.types';
3
+ /**
4
+ * Um evento renderizado. A MESMA peça serve as 3 formas (`pill` no mês,
5
+ * `block` em week/day, `row` na lista) porque o que muda entre elas é
6
+ * dimensão e densidade — não semântica. Três componentes separados
7
+ * triplicariam a superfície de foco, dnd e cor pra ganhar nada.
8
+ *
9
+ * `forwardRef` é obrigatório aqui, não decorativo: o wrapper precisa ser
10
+ * alcançável como nó DOM pelo dnd (`setNodeRef` do dnd-kit, fatia seguinte) e
11
+ * como âncora de popover/painel de detalhe. Compound component sem
12
+ * `forwardRef` foi exatamente o que ancorou o popover em `top=-506` na
13
+ * L-021.
14
+ */
15
+ export type SchedulerEventItemProps = {
16
+ event: SchedulerEvent;
17
+ view: SchedulerView;
18
+ variant: "pill" | "block" | "row";
19
+ /** Continuação truncada de evento multi-dia — perde o canto desse lado. */
20
+ truncateStart?: boolean;
21
+ truncateEnd?: boolean;
22
+ dragging?: boolean;
23
+ disabled?: boolean;
24
+ /** Rótulo de horário já formatado pelo chamador (que conhece `hourFormat`). */
25
+ timeLabel?: string;
26
+ /** Posicionamento absoluto do `block` (top/height/left/width em %/px). */
27
+ style?: CSSProperties;
28
+ /** Substitui o miolo; o wrapper (foco, cor, dnd) permanece do componente. */
29
+ renderContent?: () => ReactNode;
30
+ onClick?: (evt: React.MouseEvent | React.KeyboardEvent) => void;
31
+ className?: string;
32
+ /**
33
+ * `attributes` + `listeners` do `useDraggable`. Vêm juntos de propósito: o
34
+ * `role`/`aria-*` de `attributes` descreve o que os `listeners` fazem, e
35
+ * aplicar um sem o outro produz um elemento que arrasta sem se anunciar — ou
36
+ * que se anuncia arrastável e não arrasta.
37
+ */
38
+ dragAttributes?: Record<string, unknown>;
39
+ dragListeners?: Record<string, unknown>;
40
+ /** `setNodeRef` do dnd-kit — combinado com o `ref` externo. */
41
+ setDragNodeRef?: (el: HTMLElement | null) => void;
42
+ /** `transform` do dnd-kit; vira `translate3d` enquanto o gesto acontece. */
43
+ dragTransform?: {
44
+ x: number;
45
+ y: number;
46
+ } | null;
47
+ /** Marca "arrastável e em repouso" — cursor de mão + transição de assentamento. */
48
+ movable?: boolean;
49
+ /** Alças de resize, já ligadas ao `useDraggable` pela view. */
50
+ resizeHandles?: ReactNode;
51
+ };
52
+ export declare const SchedulerEventItem: import('react').ForwardRefExoticComponent<SchedulerEventItemProps & import('react').RefAttributes<HTMLButtonElement>>;
53
+ //# sourceMappingURL=scheduler-event.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler-event.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/Scheduler/parts/scheduler-event.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AASvE,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExE;;;;;;;;;;;GAWG;AAEH,MAAM,MAAM,uBAAuB,GAAG;IACpC,KAAK,EAAE,cAAc,CAAC;IACtB,IAAI,EAAE,aAAa,CAAC;IACpB,OAAO,EAAE,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC;IAClC,2EAA2E;IAC3E,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,+EAA+E;IAC/E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0EAA0E;IAC1E,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,6EAA6E;IAC7E,aAAa,CAAC,EAAE,MAAM,SAAS,CAAC;IAChC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,aAAa,KAAK,IAAI,CAAC;IAChE,SAAS,CAAC,EAAE,MAAM,CAAC;IAGnB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,+DAA+D;IAC/D,cAAc,CAAC,EAAE,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAC;IAClD,4EAA4E;IAC5E,aAAa,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAChD,mFAAmF;IACnF,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,+DAA+D;IAC/D,aAAa,CAAC,EAAE,SAAS,CAAC;CAC3B,CAAC;AAEF,eAAO,MAAM,kBAAkB,uHA0J7B,CAAC"}
@@ -0,0 +1,41 @@
1
+ import { Locale } from 'date-fns';
2
+ import { SchedulerEvent, SchedulerFilterField, SchedulerFilterModel } from '../scheduler.types';
3
+ /**
4
+ * Painel de filtro — uma **coluna** à direita da grade, não um overlay.
5
+ *
6
+ * Por que coluna: filtro é o controle cujo resultado você quer ver *enquanto*
7
+ * mexe. Num popover ou sheet por cima, marcar uma caixa e conferir o efeito na
8
+ * grade são dois gestos (marcar → fechar → olhar → reabrir). Como coluna, é um.
9
+ *
10
+ * A estrutura segue a barra lateral de calendário que o usuário passou como
11
+ * referência: mini-calendário no topo pra saltar de data, e abaixo os grupos de
12
+ * filtro como listas de caixas coloridas — a cor da caixa é a cor com que o
13
+ * evento aparece na grade, o que dispensa legenda separada.
14
+ *
15
+ * ⚠️ **Semântica de "nada marcado".** Num calendário de verdade, desmarcar
16
+ * todas as agendas esconde tudo. Aqui, campo sem nenhuma opção marcada
17
+ * significa **"sem filtro"** (mostra tudo), não "esconde tudo" — é a convenção
18
+ * do `filterModel` do DS, onde `fieldId` ausente = sem restrição, e a que o
19
+ * resto do sistema (DataTable, DataList) já usa. Trocar isso só neste
20
+ * componente faria o mesmo `filterModel` significar coisas opostas em telas
21
+ * diferentes. O cabeçalho do grupo diz "Todas" quando está nesse estado, pra
22
+ * não parecer que a marcação foi perdida.
23
+ */
24
+ export type SchedulerFilterPanelProps = {
25
+ filterFields: SchedulerFilterField[];
26
+ filterModel: SchedulerFilterModel;
27
+ onToggleValue: (fieldId: string, value: string) => void;
28
+ onClearAll: () => void;
29
+ appliedCount: number;
30
+ onClose: () => void;
31
+ /** Contagem por opção — vem dos eventos ANTES do filtro daquele campo. */
32
+ counts: Record<string, Record<string, number>>;
33
+ date: Date;
34
+ now: Date;
35
+ locale?: Locale;
36
+ weekStartsOn: 0 | 1 | 2 | 3 | 4 | 5 | 6;
37
+ events: SchedulerEvent[];
38
+ onDateSelect: (date: Date) => void;
39
+ };
40
+ export declare function SchedulerFilterPanel({ filterFields, filterModel, onToggleValue, onClearAll, appliedCount, onClose, counts, date, now, locale, weekStartsOn, events, onDateSelect, }: SchedulerFilterPanelProps): import("react/jsx-runtime").JSX.Element;
41
+ //# sourceMappingURL=scheduler-filter-panel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler-filter-panel.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/Scheduler/parts/scheduler-filter-panel.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAoBvC,OAAO,KAAK,EACV,cAAc,EACd,oBAAoB,EACpB,oBAAoB,EACrB,MAAM,oBAAoB,CAAC;AAE5B;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,MAAM,MAAM,yBAAyB,GAAG;IACtC,YAAY,EAAE,oBAAoB,EAAE,CAAC;IACrC,WAAW,EAAE,oBAAoB,CAAC;IAClC,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxD,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,IAAI,CAAC;IAEpB,0EAA0E;IAC1E,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAG/C,IAAI,EAAE,IAAI,CAAC;IACX,GAAG,EAAE,IAAI,CAAC;IACV,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,YAAY,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;CACpC,CAAC;AAEF,wBAAgB,oBAAoB,CAAC,EACnC,YAAY,EACZ,WAAW,EACX,aAAa,EACb,UAAU,EACV,YAAY,EACZ,OAAO,EACP,MAAM,EACN,IAAI,EACJ,GAAG,EACH,MAAM,EACN,YAAY,EACZ,MAAM,EACN,YAAY,GACb,EAAE,yBAAyB,2CAgH3B"}