@particle-academy/react-fancy 5.56.0 → 5.57.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/CHANGELOG.md +36 -0
- package/dist/{chunk-XO4UWQCU.cjs → chunk-4DL2U23D.cjs} +233 -77
- package/dist/chunk-4DL2U23D.cjs.map +1 -0
- package/dist/{chunk-SFJ5WOX5.js → chunk-MLZGGAXQ.js} +233 -77
- package/dist/chunk-MLZGGAXQ.js.map +1 -0
- package/dist/index.cjs +2 -2
- package/dist/index.js +1 -1
- package/dist/time-grid.cjs +2 -2
- package/dist/time-grid.d.cts +8 -0
- package/dist/time-grid.d.ts +8 -0
- package/dist/time-grid.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-SFJ5WOX5.js.map +0 -1
- package/dist/chunk-XO4UWQCU.cjs.map +0 -1
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { composeRefs } from './chunk-SV5BW3IA.js';
|
|
2
2
|
import { cn } from './chunk-MMW2JGKZ.js';
|
|
3
3
|
import { memo, forwardRef, useId, useRef, useMemo, useState, useCallback, useLayoutEffect, useEffect } from 'react';
|
|
4
|
+
import { flushSync } from 'react-dom';
|
|
4
5
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
5
6
|
|
|
6
7
|
// src/components/TimeGrid/TimeGrid.selection.ts
|
|
@@ -107,7 +108,7 @@ var TONE_FILL = {
|
|
|
107
108
|
zinc: "bg-zinc-500"
|
|
108
109
|
};
|
|
109
110
|
var NEUTRAL_FILL = "bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] dark:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))]";
|
|
110
|
-
var CELL_BASE = "relative m-px rounded-sm";
|
|
111
|
+
var CELL_BASE = "relative m-px h-[var(--tg-cell-h)] w-[var(--tg-cell-w)] rounded-sm";
|
|
111
112
|
var CELL_ENABLED = "cursor-pointer hover:brightness-90 dark:hover:brightness-125";
|
|
112
113
|
var CELL_DISABLED = "cursor-not-allowed opacity-40";
|
|
113
114
|
var CELL_SELECTED = "after:pointer-events-none after:absolute after:inset-0 after:rounded-sm after:bg-[color:var(--fancy-focus,var(--color-blue-500))]/50 dark:after:bg-[color:var(--fancy-focus-dark,var(--color-blue-400))]/50";
|
|
@@ -125,6 +126,11 @@ function isDev() {
|
|
|
125
126
|
}
|
|
126
127
|
}
|
|
127
128
|
var EMPTY = {};
|
|
129
|
+
var WINDOW_DEFAULT_ABOVE = 500;
|
|
130
|
+
var WINDOW_MIN_OVERSCAN = 16;
|
|
131
|
+
var CHUNK = 16;
|
|
132
|
+
var WINDOW_CHUNK = CHUNK;
|
|
133
|
+
var ROW_START = { gridColumnStart: 1 };
|
|
128
134
|
var warnedStates = /* @__PURE__ */ new Set();
|
|
129
135
|
var warnedNoStates = false;
|
|
130
136
|
var cellDomId = (baseId, r, c) => `${baseId}-${r}-${c}`;
|
|
@@ -141,23 +147,71 @@ var TypedRow = memo(function TypedRow2({
|
|
|
141
147
|
selStart,
|
|
142
148
|
selEnd,
|
|
143
149
|
activeCol,
|
|
144
|
-
onRowHeader
|
|
150
|
+
onRowHeader,
|
|
151
|
+
colStart,
|
|
152
|
+
colEnd,
|
|
153
|
+
windowed
|
|
145
154
|
}) {
|
|
146
|
-
const
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
155
|
+
const out = [];
|
|
156
|
+
out.push(
|
|
157
|
+
/* @__PURE__ */ jsx(
|
|
158
|
+
"div",
|
|
159
|
+
{
|
|
160
|
+
role: "rowheader",
|
|
161
|
+
"data-react-fancy-timegrid-row": r,
|
|
162
|
+
style: windowed ? ROW_START : void 0,
|
|
163
|
+
onClick: onRowHeader ? () => onRowHeader(r) : void 0,
|
|
164
|
+
className: onRowHeader ? `${HEADER_ROW} ${HEADER_HOVER}` : HEADER_ROW,
|
|
165
|
+
children: ctx.rows[r]
|
|
166
|
+
},
|
|
167
|
+
"h"
|
|
168
|
+
)
|
|
159
169
|
);
|
|
160
|
-
|
|
170
|
+
if (colEnd >= colStart) {
|
|
171
|
+
const k0 = Math.floor(colStart / CHUNK);
|
|
172
|
+
const k1 = Math.floor(colEnd / CHUNK);
|
|
173
|
+
for (let k = k0; k <= k1; k++) {
|
|
174
|
+
const from = Math.max(k * CHUNK, colStart);
|
|
175
|
+
const to = Math.min(k * CHUNK + CHUNK - 1, colEnd);
|
|
176
|
+
const overlaps = selEnd >= from && selStart <= to;
|
|
177
|
+
out.push(
|
|
178
|
+
/* @__PURE__ */ jsx(
|
|
179
|
+
CellChunk,
|
|
180
|
+
{
|
|
181
|
+
ctx,
|
|
182
|
+
r,
|
|
183
|
+
rowCells,
|
|
184
|
+
from,
|
|
185
|
+
to,
|
|
186
|
+
selStart: overlaps ? Math.max(selStart, from) : -1,
|
|
187
|
+
selEnd: overlaps ? Math.min(selEnd, to) : -2,
|
|
188
|
+
activeCol: activeCol >= from && activeCol <= to ? activeCol : -1,
|
|
189
|
+
place: windowed && from === colStart,
|
|
190
|
+
windowed
|
|
191
|
+
},
|
|
192
|
+
k
|
|
193
|
+
)
|
|
194
|
+
);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return /* @__PURE__ */ jsx("div", { role: "row", className: "contents", children: out });
|
|
198
|
+
});
|
|
199
|
+
var CellChunk = memo(function CellChunk2({
|
|
200
|
+
ctx,
|
|
201
|
+
r,
|
|
202
|
+
rowCells,
|
|
203
|
+
from,
|
|
204
|
+
to,
|
|
205
|
+
selStart,
|
|
206
|
+
selEnd,
|
|
207
|
+
activeCol,
|
|
208
|
+
place,
|
|
209
|
+
windowed
|
|
210
|
+
}) {
|
|
211
|
+
const { baseId, rows, cols, states, marks, stateClass } = ctx;
|
|
212
|
+
const { cellId, ariaCell } = ctx.fns.current;
|
|
213
|
+
const out = [];
|
|
214
|
+
for (let c = from; c <= to; c++) {
|
|
161
215
|
const cell = rowCells?.[c];
|
|
162
216
|
const state = cell?.state ?? "";
|
|
163
217
|
const selected = c >= selStart && c <= selEnd;
|
|
@@ -173,37 +227,40 @@ var TypedRow = memo(function TypedRow2({
|
|
|
173
227
|
let cls = stateClass(state) + " " + (cell?.disabled ? CELL_DISABLED : CELL_ENABLED);
|
|
174
228
|
if (selected) cls += " " + CELL_SELECTED;
|
|
175
229
|
if (c === activeCol) cls += " " + CELL_ACTIVE;
|
|
176
|
-
out
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
{
|
|
196
|
-
"
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
230
|
+
out.push(
|
|
231
|
+
/* @__PURE__ */ jsx(
|
|
232
|
+
"div",
|
|
233
|
+
{
|
|
234
|
+
id: cellDomId(baseId, r, c),
|
|
235
|
+
role: "gridcell",
|
|
236
|
+
"aria-colindex": windowed ? c + 2 : void 0,
|
|
237
|
+
style: place && c === from ? { gridColumnStart: c + 2 } : void 0,
|
|
238
|
+
"data-react-fancy-timegrid-cell": cellId ? cellId(r, c) : `${r}:${c}`,
|
|
239
|
+
"data-state": state,
|
|
240
|
+
"data-marks": markIds?.length ? markIds.join(" ") : void 0,
|
|
241
|
+
"aria-selected": selected,
|
|
242
|
+
"aria-disabled": cell?.disabled ? true : void 0,
|
|
243
|
+
"aria-label": label,
|
|
244
|
+
"aria-description": reasons,
|
|
245
|
+
title: reasons,
|
|
246
|
+
className: cls,
|
|
247
|
+
children: markIds?.length ? /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "pointer-events-none absolute right-0 top-0 flex gap-px", children: markIds.map((m) => {
|
|
248
|
+
const def = marks[m];
|
|
249
|
+
return def?.icon ? /* @__PURE__ */ jsx("span", { "data-react-fancy-timegrid-mark": m, className: "flex h-2.5 w-2.5 items-center justify-center [&>svg]:h-full [&>svg]:w-full", children: def.icon }, m) : /* @__PURE__ */ jsx(
|
|
250
|
+
"span",
|
|
251
|
+
{
|
|
252
|
+
"data-react-fancy-timegrid-mark": m,
|
|
253
|
+
className: `${MARK_DOT} ${def?.tone ? TONE_FILL[def.tone] : NEUTRAL_FILL}`
|
|
254
|
+
},
|
|
255
|
+
m
|
|
256
|
+
);
|
|
257
|
+
}) }) : null
|
|
258
|
+
},
|
|
259
|
+
c
|
|
260
|
+
)
|
|
204
261
|
);
|
|
205
262
|
}
|
|
206
|
-
return
|
|
263
|
+
return out;
|
|
207
264
|
});
|
|
208
265
|
var TypedTimeGrid = forwardRef(function TypedTimeGrid2({
|
|
209
266
|
rows,
|
|
@@ -225,6 +282,7 @@ var TypedTimeGrid = forwardRef(function TypedTimeGrid2({
|
|
|
225
282
|
disabledRange = "clamp",
|
|
226
283
|
onBlockedSelect,
|
|
227
284
|
onCellHover,
|
|
285
|
+
windowColumns,
|
|
228
286
|
"aria-label": ariaLabel
|
|
229
287
|
}, ref) {
|
|
230
288
|
if (!statesProp) {
|
|
@@ -252,6 +310,64 @@ var TypedTimeGrid = forwardRef(function TypedTimeGrid2({
|
|
|
252
310
|
const anchorRef = useRef(null);
|
|
253
311
|
const gestureRef = useRef(null);
|
|
254
312
|
const hoverRef = useRef("");
|
|
313
|
+
const pitchX = cellWidth + 2;
|
|
314
|
+
const windowed = windowColumns ?? nCols > WINDOW_DEFAULT_ABOVE;
|
|
315
|
+
const metrics = useRef({ left: 0, width: 0, headerW: 0 });
|
|
316
|
+
const [win, setWin] = useState(null);
|
|
317
|
+
const visibleRange = useCallback(() => {
|
|
318
|
+
const { left, width, headerW } = metrics.current;
|
|
319
|
+
const first = Math.max(0, Math.floor((left - headerW) / pitchX));
|
|
320
|
+
const last = Math.min(nCols - 1, Math.max(first, Math.ceil((left + width - headerW) / pitchX)));
|
|
321
|
+
return [first, last];
|
|
322
|
+
}, [pitchX, nCols]);
|
|
323
|
+
const measure = useCallback(() => {
|
|
324
|
+
const el = outerRef.current;
|
|
325
|
+
if (!el) return;
|
|
326
|
+
const rh = el.querySelector('[role="rowheader"]');
|
|
327
|
+
metrics.current = {
|
|
328
|
+
left: el.scrollLeft,
|
|
329
|
+
width: el.clientWidth || (typeof window !== "undefined" ? window.innerWidth : 1024),
|
|
330
|
+
headerW: rh ? rh.offsetWidth + 2 : 0
|
|
331
|
+
};
|
|
332
|
+
const [first, last] = visibleRange();
|
|
333
|
+
const over = Math.max(WINDOW_MIN_OVERSCAN, Math.ceil((last - first) / 4));
|
|
334
|
+
const start = Math.max(0, Math.floor((first - over) / WINDOW_CHUNK) * WINDOW_CHUNK);
|
|
335
|
+
const end = Math.min(nCols - 1, Math.ceil((last + over + 1) / WINDOW_CHUNK) * WINDOW_CHUNK - 1);
|
|
336
|
+
setWin((w) => w && w.start === start && w.end === end ? w : { start, end });
|
|
337
|
+
}, [visibleRange, nCols]);
|
|
338
|
+
useLayoutEffect(() => {
|
|
339
|
+
if (!windowed) return;
|
|
340
|
+
measure();
|
|
341
|
+
const el = outerRef.current;
|
|
342
|
+
if (!el || typeof ResizeObserver === "undefined") return;
|
|
343
|
+
const ro = new ResizeObserver(() => measure());
|
|
344
|
+
ro.observe(el);
|
|
345
|
+
return () => ro.disconnect();
|
|
346
|
+
}, [windowed, measure]);
|
|
347
|
+
const onScroll = useCallback(() => flushSync(measure), [measure]);
|
|
348
|
+
let colStart = 0;
|
|
349
|
+
let colEnd = nCols - 1;
|
|
350
|
+
if (windowed) {
|
|
351
|
+
colStart = win ? win.start : 0;
|
|
352
|
+
colEnd = win ? Math.min(win.end, nCols - 1) : -1;
|
|
353
|
+
}
|
|
354
|
+
const revealCol = useCallback(
|
|
355
|
+
(c) => {
|
|
356
|
+
const el = outerRef.current;
|
|
357
|
+
if (!el) return;
|
|
358
|
+
const { headerW } = metrics.current;
|
|
359
|
+
const width = el.clientWidth || metrics.current.width;
|
|
360
|
+
const x = headerW + c * pitchX;
|
|
361
|
+
let left = el.scrollLeft;
|
|
362
|
+
if (x < left + headerW) left = Math.max(0, x - headerW);
|
|
363
|
+
else if (x + pitchX > left + width) left = x + pitchX - width;
|
|
364
|
+
if (left !== el.scrollLeft) {
|
|
365
|
+
el.scrollLeft = left;
|
|
366
|
+
measure();
|
|
367
|
+
}
|
|
368
|
+
},
|
|
369
|
+
[pitchX, measure]
|
|
370
|
+
);
|
|
255
371
|
const live = useRef({ cells, selection, selectionShape, disabledRange, onSelectionChange, onSelectionCommit, onBlockedSelect, onCellHover });
|
|
256
372
|
live.current = { cells, selection, selectionShape, disabledRange, onSelectionChange, onSelectionCommit, onBlockedSelect, onCellHover };
|
|
257
373
|
const fns = useRef({});
|
|
@@ -321,6 +437,23 @@ var TypedTimeGrid = forwardRef(function TypedTimeGrid2({
|
|
|
321
437
|
},
|
|
322
438
|
[cellsOf]
|
|
323
439
|
);
|
|
440
|
+
const clampToGrid = useCallback(
|
|
441
|
+
(x, y) => {
|
|
442
|
+
const first = document.getElementById(cellDomId(baseId, 0, colStart));
|
|
443
|
+
const last = document.getElementById(cellDomId(baseId, nRows - 1, colEnd));
|
|
444
|
+
if (!first || !last) return null;
|
|
445
|
+
const a = first.getBoundingClientRect();
|
|
446
|
+
const b = last.getBoundingClientRect();
|
|
447
|
+
const w = (b.right - a.left) / (colEnd - colStart + 1);
|
|
448
|
+
const h = (b.bottom - a.top) / nRows;
|
|
449
|
+
if (!(w > 0) || !(h > 0)) return null;
|
|
450
|
+
return {
|
|
451
|
+
r: Math.min(nRows - 1, Math.max(0, Math.floor((y - a.top) / h))),
|
|
452
|
+
c: Math.min(nCols - 1, Math.max(0, colStart + Math.floor((x - a.left) / w)))
|
|
453
|
+
};
|
|
454
|
+
},
|
|
455
|
+
[baseId, nRows, nCols, colStart, colEnd]
|
|
456
|
+
);
|
|
324
457
|
const coordFromEvent = useCallback(
|
|
325
458
|
(e) => {
|
|
326
459
|
const t = e.target;
|
|
@@ -332,23 +465,8 @@ var TypedTimeGrid = forwardRef(function TypedTimeGrid2({
|
|
|
332
465
|
if (!hit) hit = clampToGrid(e.clientX, e.clientY);
|
|
333
466
|
return hit;
|
|
334
467
|
},
|
|
335
|
-
|
|
336
|
-
[baseId, nRows, nCols]
|
|
468
|
+
[baseId, clampToGrid]
|
|
337
469
|
);
|
|
338
|
-
function clampToGrid(x, y) {
|
|
339
|
-
const first = document.getElementById(cellDomId(baseId, 0, 0));
|
|
340
|
-
const last = document.getElementById(cellDomId(baseId, nRows - 1, nCols - 1));
|
|
341
|
-
if (!first || !last) return null;
|
|
342
|
-
const a = first.getBoundingClientRect();
|
|
343
|
-
const b = last.getBoundingClientRect();
|
|
344
|
-
const w = (b.right - a.left) / nCols;
|
|
345
|
-
const h = (b.bottom - a.top) / nRows;
|
|
346
|
-
if (!(w > 0) || !(h > 0)) return null;
|
|
347
|
-
return {
|
|
348
|
-
r: Math.min(nRows - 1, Math.max(0, Math.floor((y - a.top) / h))),
|
|
349
|
-
c: Math.min(nCols - 1, Math.max(0, Math.floor((x - a.left) / w)))
|
|
350
|
-
};
|
|
351
|
-
}
|
|
352
470
|
const onPointerDown = (e) => {
|
|
353
471
|
if (e.button !== 0) return;
|
|
354
472
|
const at = coordFromEvent(e);
|
|
@@ -479,13 +597,33 @@ var TypedTimeGrid = forwardRef(function TypedTimeGrid2({
|
|
|
479
597
|
const b = el.getBoundingClientRect();
|
|
480
598
|
setTipPos({ left: b.left - o.left + outer.scrollLeft, top: b.bottom - o.top + outer.scrollTop + 4 });
|
|
481
599
|
}, [activeReasons, active.r, active.c, baseId]);
|
|
600
|
+
const reveal = useRef({ revealCol, windowed: windowed && !!win, visibleRange });
|
|
601
|
+
reveal.current = { revealCol, windowed: windowed && !!win, visibleRange };
|
|
482
602
|
useEffect(() => {
|
|
483
603
|
if (!focused) return;
|
|
604
|
+
if (reveal.current.windowed) {
|
|
605
|
+
reveal.current.revealCol(active.c);
|
|
606
|
+
return;
|
|
607
|
+
}
|
|
484
608
|
const el = document.getElementById(cellDomId(baseId, active.r, active.c));
|
|
485
609
|
el?.scrollIntoView?.({ block: "nearest", inline: "nearest" });
|
|
486
610
|
}, [focused, active.r, active.c, baseId]);
|
|
611
|
+
useEffect(() => {
|
|
612
|
+
const { windowed: w, visibleRange: vr, revealCol: rc } = reveal.current;
|
|
613
|
+
if (!w || !selection || gestureRef.current) return;
|
|
614
|
+
const [f, l] = vr();
|
|
615
|
+
let s0;
|
|
616
|
+
let s1;
|
|
617
|
+
if (selection.shape === "rectangle") {
|
|
618
|
+
s0 = selection.c1;
|
|
619
|
+
s1 = selection.c2;
|
|
620
|
+
} else if (selection.from.r === selection.to.r) {
|
|
621
|
+
s0 = selection.from.c;
|
|
622
|
+
s1 = selection.to.c;
|
|
623
|
+
} else return;
|
|
624
|
+
if (s1 < f || s0 > l) rc(s0);
|
|
625
|
+
}, [selection]);
|
|
487
626
|
const colStep = Math.max(1, Math.floor(nCols / 6));
|
|
488
|
-
const pitchX = cellWidth + 2;
|
|
489
627
|
const tipId = `${baseId}-tip`;
|
|
490
628
|
const bodyRows = new Array(nRows);
|
|
491
629
|
for (let r = 0; r < nRows; r++) {
|
|
@@ -499,17 +637,41 @@ var TypedTimeGrid = forwardRef(function TypedTimeGrid2({
|
|
|
499
637
|
selStart: seg ? seg[0] : -1,
|
|
500
638
|
selEnd: seg ? seg[1] : -2,
|
|
501
639
|
activeCol: focused && active.r === r ? active.c : -1,
|
|
502
|
-
onRowHeader
|
|
640
|
+
onRowHeader,
|
|
641
|
+
colStart,
|
|
642
|
+
colEnd,
|
|
643
|
+
windowed
|
|
503
644
|
},
|
|
504
645
|
r
|
|
505
646
|
);
|
|
506
647
|
}
|
|
648
|
+
const gridTemplateColumns = `max-content repeat(${nCols}, ${pitchX}px)`;
|
|
649
|
+
const headerCols = [];
|
|
650
|
+
for (let c = colStart; c <= colEnd; c++) {
|
|
651
|
+
headerCols.push(
|
|
652
|
+
/* @__PURE__ */ jsx(
|
|
653
|
+
"div",
|
|
654
|
+
{
|
|
655
|
+
role: "columnheader",
|
|
656
|
+
"aria-colindex": windowed ? c + 2 : void 0,
|
|
657
|
+
style: windowed && c === colStart ? { gridColumnStart: c + 2 } : void 0,
|
|
658
|
+
"data-react-fancy-timegrid-col": c,
|
|
659
|
+
onClick: toggleStripsOnHeaderClick ? () => pickStrip({ r: 0, c }, { r: nRows - 1, c }) : void 0,
|
|
660
|
+
className: toggleStripsOnHeaderClick ? `${HEADER_COL} ${HEADER_HOVER}` : HEADER_COL,
|
|
661
|
+
children: sparseColLabels ? c % colStep === 0 ? cols[c] : "" : cols[c]
|
|
662
|
+
},
|
|
663
|
+
c
|
|
664
|
+
)
|
|
665
|
+
);
|
|
666
|
+
}
|
|
507
667
|
return /* @__PURE__ */ jsxs(
|
|
508
668
|
"div",
|
|
509
669
|
{
|
|
510
670
|
ref: setOuterRef,
|
|
511
671
|
"data-react-fancy-timegrid": "",
|
|
512
672
|
"data-typed": "",
|
|
673
|
+
"data-windowed": windowed ? "" : void 0,
|
|
674
|
+
onScroll: windowed ? onScroll : void 0,
|
|
513
675
|
className: cn("relative select-none overflow-x-auto", className),
|
|
514
676
|
children: [
|
|
515
677
|
/* @__PURE__ */ jsxs(
|
|
@@ -534,21 +696,15 @@ var TypedTimeGrid = forwardRef(function TypedTimeGrid2({
|
|
|
534
696
|
onFocus: () => setFocused(true),
|
|
535
697
|
onBlur: () => setFocused(false),
|
|
536
698
|
className: "inline-grid touch-none items-center outline-none focus-visible:ring-2 focus-visible:ring-[color:var(--fancy-focus,var(--color-blue-500))]/40 dark:focus-visible:ring-[color:var(--fancy-focus-dark,var(--color-blue-400))]/20",
|
|
537
|
-
style: {
|
|
699
|
+
style: {
|
|
700
|
+
gridTemplateColumns,
|
|
701
|
+
"--tg-cell-w": `${cellWidth}px`,
|
|
702
|
+
"--tg-cell-h": `${cellHeight}px`
|
|
703
|
+
},
|
|
538
704
|
children: [
|
|
539
705
|
/* @__PURE__ */ jsxs("div", { role: "row", className: "contents", children: [
|
|
540
706
|
/* @__PURE__ */ jsx("div", { role: "columnheader" }),
|
|
541
|
-
|
|
542
|
-
"div",
|
|
543
|
-
{
|
|
544
|
-
role: "columnheader",
|
|
545
|
-
"data-react-fancy-timegrid-col": c,
|
|
546
|
-
onClick: toggleStripsOnHeaderClick ? () => pickStrip({ r: 0, c }, { r: nRows - 1, c }) : void 0,
|
|
547
|
-
className: toggleStripsOnHeaderClick ? `${HEADER_COL} ${HEADER_HOVER}` : HEADER_COL,
|
|
548
|
-
children: sparseColLabels ? c % colStep === 0 ? label : "" : label
|
|
549
|
-
},
|
|
550
|
-
c
|
|
551
|
-
))
|
|
707
|
+
headerCols
|
|
552
708
|
] }),
|
|
553
709
|
bodyRows
|
|
554
710
|
]
|
|
@@ -699,5 +855,5 @@ TimeGrid.displayName = "TimeGrid";
|
|
|
699
855
|
BooleanTimeGrid.displayName = "BooleanTimeGrid";
|
|
700
856
|
|
|
701
857
|
export { TimeGrid };
|
|
702
|
-
//# sourceMappingURL=chunk-
|
|
703
|
-
//# sourceMappingURL=chunk-
|
|
858
|
+
//# sourceMappingURL=chunk-MLZGGAXQ.js.map
|
|
859
|
+
//# sourceMappingURL=chunk-MLZGGAXQ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/TimeGrid/TimeGrid.selection.ts","../src/components/TimeGrid/TypedTimeGrid.tsx","../src/components/TimeGrid/TimeGrid.tsx"],"names":["rEnd","TypedRow","CellChunk","TypedTimeGrid","forwardRef","jsx","useState","jsxs"],"mappings":"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","file":"chunk-MLZGGAXQ.js","sourcesContent":["import type {\n TimeGridCoord,\n TimeGridDisabledRange,\n TimeGridSelection,\n TimeGridSelectionShape,\n} from \"./TimeGrid.types\";\n\n/**\n * Pure selection arithmetic for the typed TimeGrid. No React, no DOM: every\n * selection is DERIVED from an anchor and a target cell, never accumulated\n * from the cells a pointer happened to visit (which is how a fast drag used to\n * leave gaps).\n */\n\nexport type IsDisabled = (r: number, c: number) => boolean;\n\n/** Rectangle from two corners, normalised; linear run from two ends, normalised. */\nexport function selectionBetween(\n shape: TimeGridSelectionShape,\n a: TimeGridCoord,\n b: TimeGridCoord,\n nCols: number,\n): TimeGridSelection {\n if (shape === \"linear\") {\n const ia = a.r * nCols + a.c;\n const ib = b.r * nCols + b.c;\n return ia <= ib\n ? { shape: \"linear\", from: { r: a.r, c: a.c }, to: { r: b.r, c: b.c } }\n : { shape: \"linear\", from: { r: b.r, c: b.c }, to: { r: a.r, c: a.c } };\n }\n return {\n shape: \"rectangle\",\n r1: Math.min(a.r, b.r),\n c1: Math.min(a.c, b.c),\n r2: Math.max(a.r, b.r),\n c2: Math.max(a.c, b.c),\n };\n}\n\n/** The columns `[start, end]` of row `r` inside `sel`, or null. */\nexport function rowSegment(\n sel: TimeGridSelection | null | undefined,\n r: number,\n nCols: number,\n): [number, number] | null {\n if (!sel) return null;\n if (sel.shape === \"rectangle\") {\n return r >= sel.r1 && r <= sel.r2 ? [sel.c1, sel.c2] : null;\n }\n const { from, to } = sel;\n if (r < from.r || r > to.r) return null;\n const start = r === from.r ? from.c : 0;\n const end = r === to.r ? to.c : nCols - 1;\n return start <= end ? [start, end] : null;\n}\n\n/** Every coordinate in `sel`, in selection order (row-major). */\nexport function selectionCoords(\n sel: TimeGridSelection | null | undefined,\n nRows: number,\n nCols: number,\n): TimeGridCoord[] {\n const out: TimeGridCoord[] = [];\n if (!sel) return out;\n const rFrom = sel.shape === \"rectangle\" ? sel.r1 : sel.from.r;\n const rTo = sel.shape === \"rectangle\" ? sel.r2 : sel.to.r;\n for (let r = Math.max(0, rFrom); r <= Math.min(nRows - 1, rTo); r++) {\n const seg = rowSegment(sel, r, nCols);\n if (!seg) continue;\n for (let c = Math.max(0, seg[0]); c <= Math.min(nCols - 1, seg[1]); c++) out.push({ r, c });\n }\n return out;\n}\n\nexport function sameSelection(\n a: TimeGridSelection | null | undefined,\n b: TimeGridSelection | null | undefined,\n): boolean {\n if (!a || !b) return !a && !b;\n if (a.shape === \"rectangle\" && b.shape === \"rectangle\") {\n return a.r1 === b.r1 && a.c1 === b.c1 && a.r2 === b.r2 && a.c2 === b.c2;\n }\n if (a.shape === \"linear\" && b.shape === \"linear\") {\n return a.from.r === b.from.r && a.from.c === b.from.c && a.to.r === b.to.r && a.to.c === b.to.c;\n }\n return false;\n}\n\nexport type ResolvedRange =\n /** Apply this selection. `blocked` lists disabled cells it was clipped by. */\n | { kind: \"select\"; selection: TimeGridSelection; blocked: TimeGridCoord[] }\n /** Leave the selection as it was; report `blocked`. */\n | { kind: \"refuse\"; blocked: TimeGridCoord[] };\n\n/**\n * Resolve anchor -> target under the `disabledRange` policy.\n *\n * - `span`: the requested range, disabled cells included. Nothing is reported.\n * - `refuse`: the requested range if it holds no disabled cell, else nothing.\n * - `clamp`: cut on the ANCHOR's side of the nearest block.\n * linear — the run stops before the first disabled cell walking from\n * the anchor toward the target, in time order.\n * rectangle — the time window (columns) ends before the nearest column,\n * from the anchor, that holds a disabled cell in any selected\n * row. If the anchor's own column is blocked, the row span is\n * cut first, before the nearest row blocked in that column.\n *\n * A disabled anchor is refused under `clamp` and `refuse` alike.\n */\nexport function resolveRange(\n shape: TimeGridSelectionShape,\n anchor: TimeGridCoord,\n target: TimeGridCoord,\n nRows: number,\n nCols: number,\n isDisabled: IsDisabled,\n policy: TimeGridDisabledRange,\n): ResolvedRange {\n const requested = selectionBetween(shape, anchor, target, nCols);\n if (policy === \"span\") return { kind: \"select\", selection: requested, blocked: [] };\n\n const blocked = selectionCoords(requested, nRows, nCols).filter(({ r, c }) => isDisabled(r, c));\n if (blocked.length === 0) return { kind: \"select\", selection: requested, blocked };\n if (policy === \"refuse\" || isDisabled(anchor.r, anchor.c)) return { kind: \"refuse\", blocked };\n\n if (shape === \"linear\") {\n const ia = anchor.r * nCols + anchor.c;\n const it = target.r * nCols + target.c;\n const step = it >= ia ? 1 : -1;\n let last = ia;\n for (let i = ia + step; step > 0 ? i <= it : i >= it; i += step) {\n if (isDisabled(Math.floor(i / nCols), i % nCols)) break;\n last = i;\n }\n const end = { r: Math.floor(last / nCols), c: last % nCols };\n return { kind: \"select\", selection: selectionBetween(\"linear\", anchor, end, nCols), blocked };\n }\n\n const rStep = target.r >= anchor.r ? 1 : -1;\n const cStep = target.c >= anchor.c ? 1 : -1;\n const colBlocked = (c: number, rEnd: number) => {\n for (let r = anchor.r; rStep > 0 ? r <= rEnd : r >= rEnd; r += rStep) {\n if (isDisabled(r, c)) return true;\n }\n return false;\n };\n\n let rEnd = target.r;\n if (colBlocked(anchor.c, rEnd)) {\n rEnd = anchor.r;\n for (let r = anchor.r + rStep; rStep > 0 ? r <= target.r : r >= target.r; r += rStep) {\n if (isDisabled(r, anchor.c)) break;\n rEnd = r;\n }\n }\n let cEnd = anchor.c;\n for (let c = anchor.c + cStep; cStep > 0 ? c <= target.c : c >= target.c; c += cStep) {\n if (colBlocked(c, rEnd)) break;\n cEnd = c;\n }\n return {\n kind: \"select\",\n selection: selectionBetween(\"rectangle\", anchor, { r: rEnd, c: cEnd }, nCols),\n blocked,\n };\n}\n","import {\n forwardRef,\n memo,\n useCallback,\n useEffect,\n useId,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type KeyboardEvent as ReactKeyboardEvent,\n type PointerEvent as ReactPointerEvent,\n type CSSProperties,\n type ReactNode,\n type RefObject,\n} from \"react\";\nimport { flushSync } from \"react-dom\";\nimport { cn } from \"../../utils/cn\";\nimport { composeRefs } from \"../../utils/compose-refs\";\nimport {\n resolveRange,\n rowSegment,\n sameSelection,\n selectionBetween,\n selectionCoords,\n} from \"./TimeGrid.selection\";\nimport type {\n TimeGridCell,\n TimeGridCoord,\n TimeGridMarkDef,\n TimeGridProps,\n TimeGridSelection,\n TimeGridStateDef,\n TimeGridTone,\n} from \"./TimeGrid.types\";\n\n/* Literal class strings so Tailwind's scanner finds them in dist. */\nconst TONE_FILL: Record<TimeGridTone, string> = {\n violet: \"bg-violet-500\",\n emerald: \"bg-emerald-500\",\n sky: \"bg-sky-500\",\n rose: \"bg-rose-500\",\n amber: \"bg-amber-500\",\n indigo: \"bg-indigo-500\",\n blue: \"bg-blue-500\",\n zinc: \"bg-zinc-500\",\n};\n\n/** A state with no tone: the neutral well, from the theme tokens. */\nconst NEUTRAL_FILL =\n \"bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] dark:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))]\";\n\nconst CELL_BASE = \"relative m-px h-[var(--tg-cell-h)] w-[var(--tg-cell-w)] rounded-sm\";\nconst CELL_ENABLED = \"cursor-pointer hover:brightness-90 dark:hover:brightness-125\";\nconst CELL_DISABLED = \"cursor-not-allowed opacity-40\";\n/** Selected: a translucent focus-colour wash over the state's own tone, so both stay readable. */\nconst CELL_SELECTED =\n \"after:pointer-events-none after:absolute after:inset-0 after:rounded-sm after:bg-[color:var(--fancy-focus,var(--color-blue-500))]/50 dark:after:bg-[color:var(--fancy-focus-dark,var(--color-blue-400))]/50\";\n/** The keyboard-focused cell, while the grid has focus. */\nconst CELL_ACTIVE =\n \"z-10 outline-2 outline-offset-1 outline-[color:var(--fancy-text,var(--color-zinc-900))] dark:outline-[color:var(--fancy-text-dark,var(--color-zinc-100))]\";\n\nconst MARK_DOT =\n \"h-1.5 w-1.5 rounded-full ring-1 ring-[color:var(--fancy-surface,var(--color-white))] dark:ring-[color:var(--fancy-surface-dark,var(--color-zinc-900))]\";\n\nconst HEADER_COL =\n \"overflow-visible whitespace-nowrap text-[10px] leading-4 text-[color:var(--fancy-text-faint,var(--color-zinc-400))] dark:text-[color:var(--fancy-text-faint-dark,var(--color-zinc-500))]\";\nconst HEADER_ROW =\n \"whitespace-nowrap pr-1 text-right text-[10px] font-medium text-[color:var(--fancy-text-muted,var(--color-zinc-500))] dark:text-[color:var(--fancy-text-muted-dark,var(--color-zinc-400))]\";\nconst HEADER_HOVER =\n \"cursor-pointer hover:text-[color:var(--fancy-text,var(--color-zinc-900))] dark:hover:text-[color:var(--fancy-text-dark,var(--color-zinc-100))]\";\n\nconst TOOLTIP =\n \"pointer-events-none absolute z-20 max-w-xs rounded-md px-2 py-1 text-xs shadow-lg bg-[color:var(--fancy-text,var(--color-zinc-900))] text-[color:var(--fancy-surface,var(--color-white))] dark:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))] dark:text-[color:var(--fancy-text-dark,var(--color-zinc-100))]\";\n\n// Bundlers replace `process.env.NODE_ENV` textually; without one, the\n// reference throws and we read that as production.\ndeclare const process: { env: Record<string, string | undefined> };\n\nfunction isDev(): boolean {\n try {\n return process.env.NODE_ENV !== \"production\";\n } catch {\n return false;\n }\n}\n\nconst EMPTY = {} as Record<string, never>;\n/** Windowing turns itself on above this many columns unless `windowColumns` says otherwise. */\nconst WINDOW_DEFAULT_ABOVE = 500;\nconst WINDOW_MIN_OVERSCAN = 16;\n/** Columns per memoised cell chunk. The window moves in whole chunks. */\nconst CHUNK = 16;\nconst WINDOW_CHUNK = CHUNK;\nconst ROW_START = { gridColumnStart: 1 } as const;\nconst warnedStates = new Set<string>();\nlet warnedNoStates = false;\n\ntype Ctx = {\n baseId: string;\n rows: string[];\n cols: string[];\n states: Record<string, TimeGridStateDef>;\n marks: Record<string, TimeGridMarkDef>;\n stateClass: (state: string) => string;\n cellWidth: number;\n cellHeight: number;\n fns: RefObject<{\n cellId?: (r: number, c: number) => string;\n ariaCell?: (r: number, c: number, on: boolean) => string;\n }>;\n};\n\nconst cellDomId = (baseId: string, r: number, c: number) => `${baseId}-${r}-${c}`;\n\nfunction parseCoord(el: Element | null, baseId: string): TimeGridCoord | null {\n const id = el?.id;\n if (!id || !id.startsWith(baseId + \"-\")) return null;\n const m = /-(\\d+)-(\\d+)$/.exec(id);\n return m ? { r: Number(m[1]), c: Number(m[2]) } : null;\n}\n\ntype RowProps = {\n ctx: Ctx;\n r: number;\n rowCells: TimeGridCell[];\n selStart: number;\n selEnd: number;\n /** Column of the keyboard-focused cell when it is in this row AND the grid has focus, else -1. */\n activeCol: number;\n onRowHeader?: (r: number) => void;\n /** Rendered column window, inclusive. The whole row when not windowed. */\n colStart: number;\n colEnd: number;\n windowed: boolean;\n};\n\n/**\n * A row renders as fixed 16-column chunks, each memoised on primitives. A\n * window shift mounts the chunks entering view and skips the rest; a selection\n * change re-renders only the chunks it touches. Before this, every shift\n * rebuilt every cell of every row (31d: p95 157 ms/frame scrolling at 4x CPU).\n */\nconst TypedRow = memo(function TypedRow({\n ctx,\n r,\n rowCells,\n selStart,\n selEnd,\n activeCol,\n onRowHeader,\n colStart,\n colEnd,\n windowed,\n}: RowProps) {\n const out: ReactNode[] = [];\n out.push(\n <div\n key=\"h\"\n role=\"rowheader\"\n data-react-fancy-timegrid-row={r}\n style={windowed ? ROW_START : undefined}\n onClick={onRowHeader ? () => onRowHeader(r) : undefined}\n className={onRowHeader ? `${HEADER_ROW} ${HEADER_HOVER}` : HEADER_ROW}\n >\n {ctx.rows[r]}\n </div>,\n );\n if (colEnd >= colStart) {\n const k0 = Math.floor(colStart / CHUNK);\n const k1 = Math.floor(colEnd / CHUNK);\n for (let k = k0; k <= k1; k++) {\n const from = Math.max(k * CHUNK, colStart);\n const to = Math.min(k * CHUNK + CHUNK - 1, colEnd);\n const overlaps = selEnd >= from && selStart <= to;\n out.push(\n <CellChunk\n key={k}\n ctx={ctx}\n r={r}\n rowCells={rowCells}\n from={from}\n to={to}\n selStart={overlaps ? Math.max(selStart, from) : -1}\n selEnd={overlaps ? Math.min(selEnd, to) : -2}\n activeCol={activeCol >= from && activeCol <= to ? activeCol : -1}\n place={windowed && from === colStart}\n windowed={windowed}\n />,\n );\n }\n }\n return (\n <div role=\"row\" className=\"contents\">\n {out}\n </div>\n );\n});\n\ntype ChunkProps = {\n ctx: Ctx;\n r: number;\n rowCells: TimeGridCell[];\n from: number;\n to: number;\n selStart: number;\n selEnd: number;\n activeCol: number;\n /** Place the first cell explicitly (the first rendered chunk of a windowed row). */\n place: boolean;\n windowed: boolean;\n};\n\nconst CellChunk = memo(function CellChunk({\n ctx,\n r,\n rowCells,\n from,\n to,\n selStart,\n selEnd,\n activeCol,\n place,\n windowed,\n}: ChunkProps) {\n const { baseId, rows, cols, states, marks, stateClass } = ctx;\n const { cellId, ariaCell } = ctx.fns.current;\n const out: ReactNode[] = [];\n for (let c = from; c <= to; c++) {\n const cell = rowCells?.[c];\n const state = cell?.state ?? \"\";\n const selected = c >= selStart && c <= selEnd;\n const reasons = cell?.reasons?.length ? cell.reasons.join(\". \") : undefined;\n const markIds = cell?.marks;\n let label: string;\n if (ariaCell) {\n label = ariaCell(r, c, selected);\n } else {\n label = `${rows[r]} ${cols[c]} ${states[state]?.label ?? state}`;\n if (markIds?.length) label += \", \" + markIds.map((m) => marks[m]?.label ?? m).join(\", \");\n }\n let cls = stateClass(state) + \" \" + (cell?.disabled ? CELL_DISABLED : CELL_ENABLED);\n if (selected) cls += \" \" + CELL_SELECTED;\n if (c === activeCol) cls += \" \" + CELL_ACTIVE;\n out.push(\n <div\n key={c}\n id={cellDomId(baseId, r, c)}\n role=\"gridcell\"\n aria-colindex={windowed ? c + 2 : undefined}\n // Windowed, the tracks stay the full grid; the row's first rendered\n // cell is placed and the rest flow after it.\n style={place && c === from ? { gridColumnStart: c + 2 } : undefined}\n data-react-fancy-timegrid-cell={cellId ? cellId(r, c) : `${r}:${c}`}\n data-state={state}\n data-marks={markIds?.length ? markIds.join(\" \") : undefined}\n aria-selected={selected}\n aria-disabled={cell?.disabled ? true : undefined}\n aria-label={label}\n aria-description={reasons}\n title={reasons}\n className={cls}\n >\n {markIds?.length ? (\n <span aria-hidden className=\"pointer-events-none absolute right-0 top-0 flex gap-px\">\n {markIds.map((m) => {\n const def = marks[m];\n return def?.icon ? (\n <span key={m} data-react-fancy-timegrid-mark={m} className=\"flex h-2.5 w-2.5 items-center justify-center [&>svg]:h-full [&>svg]:w-full\">\n {def.icon}\n </span>\n ) : (\n <span\n key={m}\n data-react-fancy-timegrid-mark={m}\n className={`${MARK_DOT} ${def?.tone ? TONE_FILL[def.tone] : NEUTRAL_FILL}`}\n />\n );\n })}\n </span>\n ) : null}\n </div>,\n );\n }\n return out;\n});\n\ntype Gesture = {\n anchor: TimeGridCoord;\n last: TimeGridCoord;\n selection: TimeGridSelection | null;\n blockedKey: string;\n};\n\nexport const TypedTimeGrid = forwardRef<HTMLDivElement, TimeGridProps>(function TypedTimeGrid(\n {\n rows,\n cols,\n cells: cellsProp,\n states: statesProp,\n marks: marksProp,\n cellWidth = 20,\n cellHeight = 16,\n sparseColLabels = true,\n toggleStripsOnHeaderClick = true,\n ariaCell,\n cellId,\n className,\n selectionShape = \"rectangle\",\n selection: selectionProp,\n onSelectionChange,\n onSelectionCommit,\n disabledRange = \"clamp\",\n onBlockedSelect,\n onCellHover,\n windowColumns,\n \"aria-label\": ariaLabel,\n },\n ref,\n) {\n if (!statesProp) {\n const msg =\n \"TimeGrid: `cells` was given without `states`. Every cell names a state id, and with no \" +\n \"vocabulary there is no tone to draw it in. Pass `states={{ open: { tone: \\\"emerald\\\", label: \\\"Open\\\" }, … }}`.\";\n if (isDev()) throw new Error(msg);\n if (!warnedNoStates) {\n warnedNoStates = true;\n console.error(msg);\n }\n }\n const states = statesProp ?? EMPTY;\n const marks = marksProp ?? EMPTY;\n const cells = cellsProp!;\n const nRows = rows.length;\n const nCols = cols.length;\n\n const baseId = useId();\n const outerRef = useRef<HTMLDivElement>(null);\n const gridRef = useRef<HTMLDivElement>(null);\n const setOuterRef = useMemo(() => composeRefs(ref, outerRef), [ref]);\n\n const controlled = selectionProp !== undefined;\n const [inner, setInner] = useState<TimeGridSelection | null>(null);\n const selection = controlled ? selectionProp : inner;\n\n const [active, setActive] = useState<TimeGridCoord>({ r: 0, c: 0 });\n const [focused, setFocused] = useState(false);\n const anchorRef = useRef<TimeGridCoord | null>(null);\n const gestureRef = useRef<Gesture | null>(null);\n const hoverRef = useRef<string>(\"\");\n\n /* ── column windowing ───────────────────────────────────────────────── */\n\n const pitchX = cellWidth + 2;\n const windowed = windowColumns ?? nCols > WINDOW_DEFAULT_ABOVE;\n // `null` until measured. Windowed, the first pass renders the frame with NO\n // cells (cheap to lay out, and identical on the server), measures, then\n // renders the real window once. Guessing a width instead cost a full extra\n // render + layout: 31d x 240 mounted slower windowed than not.\n //\n // The raw scroll metrics live in a ref; STATE holds only the chunk-snapped\n // window, so a scroll that stays inside it renders nothing at all.\n const metrics = useRef({ left: 0, width: 0, headerW: 0 });\n const [win, setWin] = useState<{ start: number; end: number } | null>(null);\n\n /** First / last column strictly in view, from the current metrics. */\n const visibleRange = useCallback((): [number, number] => {\n const { left, width, headerW } = metrics.current;\n const first = Math.max(0, Math.floor((left - headerW) / pitchX));\n const last = Math.min(nCols - 1, Math.max(first, Math.ceil((left + width - headerW) / pitchX)));\n return [first, last];\n }, [pitchX, nCols]);\n\n const measure = useCallback(() => {\n const el = outerRef.current;\n if (!el) return;\n const rh = el.querySelector<HTMLElement>('[role=\"rowheader\"]');\n metrics.current = {\n left: el.scrollLeft,\n width: el.clientWidth || (typeof window !== \"undefined\" ? window.innerWidth : 1024),\n headerW: rh ? rh.offsetWidth + 2 : 0,\n };\n // Overscan a quarter viewport each side, snapped to chunks.\n const [first, last] = visibleRange();\n const over = Math.max(WINDOW_MIN_OVERSCAN, Math.ceil((last - first) / 4));\n const start = Math.max(0, Math.floor((first - over) / WINDOW_CHUNK) * WINDOW_CHUNK);\n const end = Math.min(nCols - 1, Math.ceil((last + over + 1) / WINDOW_CHUNK) * WINDOW_CHUNK - 1);\n setWin((w) => (w && w.start === start && w.end === end ? w : { start, end }));\n }, [visibleRange, nCols]);\n\n useLayoutEffect(() => {\n if (!windowed) return;\n measure();\n const el = outerRef.current;\n if (!el || typeof ResizeObserver === \"undefined\") return;\n const ro = new ResizeObserver(() => measure());\n ro.observe(el);\n return () => ro.disconnect();\n }, [windowed, measure]);\n\n // Applied synchronously: a jump (scrollbar click, a scrolled-to cell) must be\n // in the DOM before the browser paints, or the viewport flashes blank.\n const onScroll = useCallback(() => flushSync(measure), [measure]);\n\n let colStart = 0;\n let colEnd = nCols - 1;\n if (windowed) {\n // Unmeasured: the frame only, no cells.\n colStart = win ? win.start : 0;\n colEnd = win ? Math.min(win.end, nCols - 1) : -1;\n }\n\n /** Scroll so column `c` is in view (arithmetic: it may not be rendered yet). */\n const revealCol = useCallback(\n (c: number) => {\n const el = outerRef.current;\n if (!el) return;\n const { headerW } = metrics.current;\n const width = el.clientWidth || metrics.current.width;\n const x = headerW + c * pitchX;\n let left = el.scrollLeft;\n if (x < left + headerW) left = Math.max(0, x - headerW);\n else if (x + pitchX > left + width) left = x + pitchX - width;\n if (left !== el.scrollLeft) {\n el.scrollLeft = left;\n measure();\n }\n },\n [pitchX, measure],\n );\n\n // Latest values for handlers, so they stay stable across renders.\n const live = useRef({ cells, selection, selectionShape, disabledRange, onSelectionChange, onSelectionCommit, onBlockedSelect, onCellHover });\n live.current = { cells, selection, selectionShape, disabledRange, onSelectionChange, onSelectionCommit, onBlockedSelect, onCellHover };\n\n const fns = useRef<Ctx[\"fns\"][\"current\"]>({});\n fns.current = { cellId, ariaCell };\n\n const stateClass = useMemo(() => {\n const cache = new Map<string, string>();\n return (state: string) => {\n let cls = cache.get(state);\n if (cls !== undefined) return cls;\n const def = states[state];\n if (!def && statesProp && !warnedStates.has(state)) {\n warnedStates.add(state);\n console.warn(`TimeGrid: unknown state id \"${state}\" — not a key of \\`states\\`. Rendering it neutral.`);\n }\n cls = `${CELL_BASE} ${def?.tone ? TONE_FILL[def.tone] : NEUTRAL_FILL}${def?.className ? \" \" + def.className : \"\"}`;\n cache.set(state, cls);\n return cls;\n };\n }, [states, statesProp]);\n\n const ctx = useMemo<Ctx>(\n () => ({ baseId, rows, cols, states, marks, stateClass, cellWidth, cellHeight, fns }),\n [baseId, rows, cols, states, marks, stateClass, cellWidth, cellHeight],\n );\n\n /* ── selection plumbing ─────────────────────────────────────────────── */\n\n const isDisabled = useCallback(\n (r: number, c: number) => !!live.current.cells[r]?.[c]?.disabled,\n [],\n );\n\n const cellsOf = useCallback(\n (sel: TimeGridSelection | null) =>\n selectionCoords(sel, nRows, nCols).map(({ r, c }) => live.current.cells[r]?.[c]),\n [nRows, nCols],\n );\n\n const emit = useCallback(\n (next: TimeGridSelection | null) => {\n if (!controlled) setInner(next);\n live.current.onSelectionChange?.(next, cellsOf(next));\n },\n [controlled, cellsOf],\n );\n\n const reportBlocked = useCallback((blocked: TimeGridCoord[], g: Gesture | null) => {\n if (!blocked.length) return;\n const key = blocked.map((b) => `${b.r}:${b.c}`).join(\",\");\n if (g) {\n if (g.blockedKey === key) return;\n g.blockedKey = key;\n }\n live.current.onBlockedSelect?.(\n blocked.map(({ r, c }) => {\n const reasons = live.current.cells[r]?.[c]?.reasons;\n return reasons ? { r, c, reasons } : { r, c };\n }),\n );\n }, []);\n\n /** Apply anchor -> target under the policy. Returns the selection now in force for this gesture. */\n const extend = useCallback(\n (\n anchor: TimeGridCoord,\n target: TimeGridCoord,\n g: Gesture | null,\n shape = live.current.selectionShape,\n ): TimeGridSelection | null | undefined => {\n const res = resolveRange(shape, anchor, target, nRows, nCols, isDisabled, live.current.disabledRange);\n reportBlocked(res.blocked, g);\n if (res.kind === \"refuse\") return undefined;\n const current = g ? g.selection : live.current.selection;\n if (!sameSelection(current, res.selection) || (g && g.selection === null)) emit(res.selection);\n return res.selection;\n },\n [nRows, nCols, isDisabled, reportBlocked, emit],\n );\n\n const commit = useCallback(\n (sel: TimeGridSelection | null) => {\n if (sel) live.current.onSelectionCommit?.(sel, cellsOf(sel));\n },\n [cellsOf],\n );\n\n /* ── pointer ────────────────────────────────────────────────────────── */\n\n /**\n * Outside every cell (a captured drag past the grid's edge): the nearest cell\n * by geometry, measured from the first and last RENDERED cell's boxes, so it\n * holds when the grid is windowed.\n */\n const clampToGrid = useCallback(\n (x: number, y: number): TimeGridCoord | null => {\n const first = document.getElementById(cellDomId(baseId, 0, colStart));\n const last = document.getElementById(cellDomId(baseId, nRows - 1, colEnd));\n if (!first || !last) return null;\n const a = first.getBoundingClientRect();\n const b = last.getBoundingClientRect();\n const w = (b.right - a.left) / (colEnd - colStart + 1);\n const h = (b.bottom - a.top) / nRows;\n if (!(w > 0) || !(h > 0)) return null;\n return {\n r: Math.min(nRows - 1, Math.max(0, Math.floor((y - a.top) / h))),\n c: Math.min(nCols - 1, Math.max(0, colStart + Math.floor((x - a.left) / w))),\n };\n },\n [baseId, nRows, nCols, colStart, colEnd],\n );\n\n const coordFromEvent = useCallback(\n (e: ReactPointerEvent): TimeGridCoord | null => {\n const t = e.target as Element;\n let hit = parseCoord(t?.closest?.('[role=\"gridcell\"]') ?? null, baseId);\n if (!hit && typeof document.elementFromPoint === \"function\") {\n const under = document.elementFromPoint(e.clientX, e.clientY);\n hit = parseCoord(under?.closest?.('[role=\"gridcell\"]') ?? null, baseId);\n }\n if (!hit) hit = clampToGrid(e.clientX, e.clientY);\n return hit;\n },\n [baseId, clampToGrid],\n );\n\n const onPointerDown = (e: ReactPointerEvent<HTMLDivElement>) => {\n if (e.button !== 0) return;\n const at = coordFromEvent(e);\n if (!at) return;\n e.preventDefault();\n gridRef.current?.focus({ preventScroll: true });\n try {\n e.currentTarget.setPointerCapture?.(e.pointerId);\n } catch {\n /* jsdom / synthetic pointers */\n }\n setActive(at);\n const g: Gesture = { anchor: at, last: at, selection: null, blockedKey: \"\" };\n const sel = extend(at, at, g);\n if (sel === undefined) {\n gestureRef.current = null;\n return;\n }\n g.selection = sel;\n anchorRef.current = at;\n gestureRef.current = g;\n };\n\n const onPointerMove = (e: ReactPointerEvent<HTMLDivElement>) => {\n const g = gestureRef.current;\n if (!g) return;\n const at = coordFromEvent(e);\n if (!at || (at.r === g.last.r && at.c === g.last.c)) return;\n g.last = at;\n setActive(at);\n const sel = extend(g.anchor, at, g);\n if (sel !== undefined) g.selection = sel;\n };\n\n const endGesture = () => {\n const g = gestureRef.current;\n gestureRef.current = null;\n if (g) commit(g.selection);\n };\n\n const onPointerOver = (e: ReactPointerEvent<HTMLDivElement>) => {\n if (!live.current.onCellHover) return;\n const at = parseCoord((e.target as Element)?.closest?.('[role=\"gridcell\"]') ?? null, baseId);\n if (!at) return;\n const key = `${at.r}:${at.c}`;\n if (hoverRef.current === key) return;\n hoverRef.current = key;\n live.current.onCellHover(live.current.cells[at.r]?.[at.c] ?? null, at);\n };\n\n const onPointerLeave = () => {\n if (!hoverRef.current) return;\n hoverRef.current = \"\";\n live.current.onCellHover?.(null, null);\n };\n\n /* ── keyboard: the grid holds focus; aria-activedescendant names the cell ── */\n\n const onKeyDown = (e: ReactKeyboardEvent<HTMLDivElement>) => {\n const move: Record<string, [number, number]> = {\n ArrowUp: [-1, 0],\n ArrowDown: [1, 0],\n ArrowLeft: [0, -1],\n ArrowRight: [0, 1],\n };\n const d = move[e.key];\n if (d) {\n e.preventDefault();\n const next = {\n r: Math.min(nRows - 1, Math.max(0, active.r + d[0])),\n c: Math.min(nCols - 1, Math.max(0, active.c + d[1])),\n };\n setActive(next);\n if (e.shiftKey) {\n const anchor = anchorRef.current ?? active;\n anchorRef.current = anchor;\n extend(anchor, next, null);\n }\n return;\n }\n if (e.key === \" \" || e.key === \"Spacebar\") {\n e.preventDefault();\n const sel = live.current.selection;\n const single = selectionBetween(live.current.selectionShape, active, active, nCols);\n if (sel && sameSelection(sel, single)) {\n anchorRef.current = null;\n emit(null);\n } else {\n const res = extend(active, active, null);\n if (res !== undefined) anchorRef.current = active;\n }\n return;\n }\n if (e.key === \"Enter\") {\n e.preventDefault();\n let sel = live.current.selection ?? null;\n if (!sel) {\n const res = extend(active, active, null);\n if (res === undefined) return;\n anchorRef.current = active;\n sel = res;\n }\n commit(sel);\n return;\n }\n if (e.key === \"Escape\") {\n if (live.current.selection) {\n e.preventDefault();\n anchorRef.current = null;\n emit(null);\n }\n }\n };\n\n /* ── header strips: select a whole row / column ─────────────────────── */\n\n const pickStrip = useCallback(\n (a: TimeGridCoord, b: TimeGridCoord) => {\n anchorRef.current = a;\n setActive(a);\n const sel = extend(a, b, null, \"rectangle\");\n if (sel) commit(sel);\n },\n [extend, commit],\n );\n const onRowHeader = useMemo(\n () => (toggleStripsOnHeaderClick ? (r: number) => pickStrip({ r, c: 0 }, { r, c: nCols - 1 }) : undefined),\n [toggleStripsOnHeaderClick, pickStrip, nCols],\n );\n\n /* ── focus tooltip for reasons ──────────────────────────────────────── */\n\n const activeCell = cells[active.r]?.[active.c];\n const activeReasons = focused && activeCell?.reasons?.length ? activeCell.reasons.join(\". \") : null;\n const [tipPos, setTipPos] = useState<{ left: number; top: number } | null>(null);\n useLayoutEffect(() => {\n if (!activeReasons) return;\n const outer = outerRef.current;\n const el = document.getElementById(cellDomId(baseId, active.r, active.c));\n if (!outer || !el) return;\n const o = outer.getBoundingClientRect();\n const b = el.getBoundingClientRect();\n setTipPos({ left: b.left - o.left + outer.scrollLeft, top: b.bottom - o.top + outer.scrollTop + 4 });\n }, [activeReasons, active.r, active.c, baseId]);\n\n const reveal = useRef({ revealCol, windowed: windowed && !!win, visibleRange });\n reveal.current = { revealCol, windowed: windowed && !!win, visibleRange };\n\n // Keep the active cell in view when the keyboard moves it. Windowed, the\n // cell may not exist yet, so scroll by arithmetic and let the window follow.\n useEffect(() => {\n if (!focused) return;\n if (reveal.current.windowed) {\n reveal.current.revealCol(active.c);\n return;\n }\n const el = document.getElementById(cellDomId(baseId, active.r, active.c));\n el?.scrollIntoView?.({ block: \"nearest\", inline: \"nearest\" });\n }, [focused, active.r, active.c, baseId]);\n\n // A selection set from outside (a host, an agent through a bridge) that is\n // entirely out of view is scrolled to, so what was selected can be seen.\n useEffect(() => {\n const { windowed: w, visibleRange: vr, revealCol: rc } = reveal.current;\n if (!w || !selection || gestureRef.current) return;\n const [f, l] = vr();\n let s0: number;\n let s1: number;\n if (selection.shape === \"rectangle\") {\n s0 = selection.c1;\n s1 = selection.c2;\n } else if (selection.from.r === selection.to.r) {\n s0 = selection.from.c;\n s1 = selection.to.c;\n } else return;\n if (s1 < f || s0 > l) rc(s0);\n }, [selection]);\n\n const colStep = Math.max(1, Math.floor(nCols / 6));\n const tipId = `${baseId}-tip`;\n\n const bodyRows = new Array(nRows);\n for (let r = 0; r < nRows; r++) {\n const seg = rowSegment(selection, r, nCols);\n bodyRows[r] = (\n <TypedRow\n key={r}\n ctx={ctx}\n r={r}\n rowCells={cells[r]}\n selStart={seg ? seg[0] : -1}\n selEnd={seg ? seg[1] : -2}\n activeCol={focused && active.r === r ? active.c : -1}\n onRowHeader={onRowHeader}\n colStart={colStart}\n colEnd={colEnd}\n windowed={windowed}\n />\n );\n }\n\n // Fixed for the life of the grid, windowed or not: changing the tracks on a\n // window shift re-lays out every item, every frame of a scroll.\n const gridTemplateColumns = `max-content repeat(${nCols}, ${pitchX}px)`;\n const headerCols: ReactNode[] = [];\n for (let c = colStart; c <= colEnd; c++) {\n headerCols.push(\n <div\n key={c}\n role=\"columnheader\"\n aria-colindex={windowed ? c + 2 : undefined}\n style={windowed && c === colStart ? { gridColumnStart: c + 2 } : undefined}\n data-react-fancy-timegrid-col={c}\n onClick={toggleStripsOnHeaderClick ? () => pickStrip({ r: 0, c }, { r: nRows - 1, c }) : undefined}\n className={toggleStripsOnHeaderClick ? `${HEADER_COL} ${HEADER_HOVER}` : HEADER_COL}\n >\n {sparseColLabels ? (c % colStep === 0 ? cols[c] : \"\") : cols[c]}\n </div>,\n );\n }\n\n return (\n <div\n ref={setOuterRef}\n data-react-fancy-timegrid=\"\"\n data-typed=\"\"\n data-windowed={windowed ? \"\" : undefined}\n onScroll={windowed ? onScroll : undefined}\n className={cn(\"relative select-none overflow-x-auto\", className)}\n >\n <div\n ref={gridRef}\n role=\"grid\"\n tabIndex={0}\n aria-label={ariaLabel}\n aria-multiselectable=\"true\"\n aria-rowcount={nRows + 1}\n aria-colcount={nCols + 1}\n aria-activedescendant={cellDomId(baseId, active.r, active.c)}\n aria-describedby={activeReasons ? tipId : undefined}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={endGesture}\n onPointerCancel={endGesture}\n onPointerOver={onPointerOver}\n onPointerLeave={onPointerLeave}\n onKeyDown={onKeyDown}\n onFocus={() => setFocused(true)}\n onBlur={() => setFocused(false)}\n className=\"inline-grid touch-none items-center outline-none focus-visible:ring-2 focus-visible:ring-[color:var(--fancy-focus,var(--color-blue-500))]/40 dark:focus-visible:ring-[color:var(--fancy-focus-dark,var(--color-blue-400))]/20\"\n style={\n {\n gridTemplateColumns,\n \"--tg-cell-w\": `${cellWidth}px`,\n \"--tg-cell-h\": `${cellHeight}px`,\n } as CSSProperties\n }\n >\n <div role=\"row\" className=\"contents\">\n <div role=\"columnheader\" />\n {headerCols}\n </div>\n {bodyRows}\n </div>\n {activeReasons ? (\n <div\n id={tipId}\n role=\"tooltip\"\n data-react-fancy-timegrid-tooltip=\"\"\n className={TOOLTIP}\n style={tipPos ? { left: tipPos.left, top: tipPos.top } : undefined}\n >\n {activeReasons}\n </div>\n ) : null}\n </div>\n );\n});\n","import { forwardRef, useState } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport type { TimeGridProps, TimeGridTone } from \"./TimeGrid.types\";\nimport { TypedTimeGrid } from \"./TypedTimeGrid\";\n\nconst TONE_CLASSES: Record<TimeGridTone, string> = {\n violet: \"bg-violet-500 hover:bg-violet-600\",\n emerald: \"bg-emerald-500 hover:bg-emerald-600\",\n sky: \"bg-sky-500 hover:bg-sky-600\",\n rose: \"bg-rose-500 hover:bg-rose-600\",\n amber: \"bg-amber-500 hover:bg-amber-600\",\n indigo: \"bg-indigo-500 hover:bg-indigo-600\",\n blue: \"bg-blue-500 hover:bg-blue-600\",\n zinc: \"bg-zinc-500 hover:bg-zinc-600\",\n};\n\nconst OFF_CLASSES =\n \"bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] hover:bg-zinc-200 dark:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))] dark:hover:bg-zinc-700\";\n\nconst NO_VALUE: boolean[][] = [];\nconst noop = () => {};\n\n/**\n * Two grids behind one name. `cells` (5.55.0) selects the typed grid: the\n * host's state vocabulary, range selection, keyboard. Without it this is the\n * boolean grid, unchanged since before 5.55.0.\n */\nexport const TimeGrid = forwardRef<HTMLDivElement, TimeGridProps>((props, ref) =>\n props.cells ? <TypedTimeGrid ref={ref} {...props} /> : <BooleanTimeGrid ref={ref} {...props} />,\n);\n\nconst BooleanTimeGrid = forwardRef<HTMLDivElement, TimeGridProps>(\n (\n {\n rows,\n cols,\n value = NO_VALUE,\n onChange = noop,\n toneOn = \"violet\",\n cellWidth = 20,\n cellHeight = 16,\n sparseColLabels = true,\n toggleStripsOnHeaderClick = true,\n ariaCell,\n cellId,\n className,\n },\n ref,\n ) => {\n const [drag, setDrag] = useState<boolean | null>(null);\n\n const setCell = (r: number, c: number, v: boolean) => {\n if (value[r]?.[c] === v) return;\n const next = value.map((row) => row.slice());\n next[r][c] = v;\n onChange(next);\n };\n\n const toggleRow = (r: number) => {\n if (!toggleStripsOnHeaderClick) return;\n const all = value[r].every(Boolean);\n const next = value.map((row) => row.slice());\n for (let c = 0; c < cols.length; c++) next[r][c] = !all;\n onChange(next);\n };\n\n const toggleCol = (c: number) => {\n if (!toggleStripsOnHeaderClick) return;\n const all = value.every((row) => row[c]);\n const next = value.map((row) => row.slice());\n for (let r = 0; r < rows.length; r++) next[r][c] = !all;\n onChange(next);\n };\n\n const colStep = Math.max(1, Math.floor(cols.length / 6));\n const onTone = TONE_CLASSES[toneOn];\n\n return (\n <div\n ref={ref}\n data-react-fancy-timegrid=\"\"\n className={cn(\n \"select-none overflow-x-auto\",\n className,\n )}\n onMouseLeave={() => setDrag(null)}\n onMouseUp={() => setDrag(null)}\n >\n <table className=\"text-[10px]\">\n <thead>\n <tr>\n <th />\n {cols.map((label, c) => (\n <th\n key={c}\n onClick={() => toggleCol(c)}\n style={{ width: cellWidth }}\n data-react-fancy-timegrid-col={c}\n className={cn(\n \"text-zinc-400\",\n toggleStripsOnHeaderClick &&\n \"cursor-pointer hover:text-zinc-700 dark:hover:text-zinc-200\",\n )}\n >\n {sparseColLabels ? (c % colStep === 0 ? label : \"\") : label}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((label, r) => (\n <tr key={r}>\n <th\n onClick={() => toggleRow(r)}\n data-react-fancy-timegrid-row={r}\n className={cn(\n \"pr-1 text-right font-medium text-zinc-500\",\n toggleStripsOnHeaderClick &&\n \"cursor-pointer hover:text-zinc-800 dark:hover:text-zinc-200\",\n )}\n >\n {label}\n </th>\n {cols.map((_, c) => {\n const on = value[r]?.[c] ?? false;\n return (\n <td key={c} className=\"p-px\">\n <button\n type=\"button\"\n onMouseDown={() => {\n const v = !on;\n setDrag(v);\n setCell(r, c, v);\n }}\n onMouseEnter={() => drag !== null && setCell(r, c, drag)}\n style={{ width: cellWidth, height: cellHeight }}\n data-react-fancy-timegrid-cell={\n cellId ? cellId(r, c) : `${r}:${c}`\n }\n aria-pressed={on}\n aria-label={\n ariaCell\n ? ariaCell(r, c, on)\n : `${rows[r]} ${cols[c]} ${on ? \"on\" : \"off\"}`\n }\n className={cn(\n \"block rounded-sm transition\",\n on ? onTone : OFF_CLASSES,\n )}\n />\n </td>\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n },\n);\n\nTimeGrid.displayName = \"TimeGrid\";\nBooleanTimeGrid.displayName = \"BooleanTimeGrid\";\n"]}
|
package/dist/index.cjs
CHANGED
|
@@ -18,7 +18,7 @@ var chunkATJSHM6J_cjs = require('./chunk-ATJSHM6J.cjs');
|
|
|
18
18
|
var chunkYJXP6AOL_cjs = require('./chunk-YJXP6AOL.cjs');
|
|
19
19
|
var chunkCQ54H7DZ_cjs = require('./chunk-CQ54H7DZ.cjs');
|
|
20
20
|
require('./chunk-XURQVDCN.cjs');
|
|
21
|
-
var
|
|
21
|
+
var chunk4DL2U23D_cjs = require('./chunk-4DL2U23D.cjs');
|
|
22
22
|
var chunkYH75G6SP_cjs = require('./chunk-YH75G6SP.cjs');
|
|
23
23
|
var chunkUXYFM2XT_cjs = require('./chunk-UXYFM2XT.cjs');
|
|
24
24
|
var chunk5ZNOLPIJ_cjs = require('./chunk-5ZNOLPIJ.cjs');
|
|
@@ -271,7 +271,7 @@ Object.defineProperty(exports, "useTabs", {
|
|
|
271
271
|
});
|
|
272
272
|
Object.defineProperty(exports, "TimeGrid", {
|
|
273
273
|
enumerable: true,
|
|
274
|
-
get: function () { return
|
|
274
|
+
get: function () { return chunk4DL2U23D_cjs.TimeGrid; }
|
|
275
275
|
});
|
|
276
276
|
Object.defineProperty(exports, "TimePicker", {
|
|
277
277
|
enumerable: true,
|
package/dist/index.js
CHANGED
|
@@ -16,7 +16,7 @@ export { StickyNote } from './chunk-CCG2L5EH.js';
|
|
|
16
16
|
export { Table } from './chunk-YAPGHVBZ.js';
|
|
17
17
|
export { Tabs, useTabs } from './chunk-IU5WQUUC.js';
|
|
18
18
|
import './chunk-TMR56BBE.js';
|
|
19
|
-
export { TimeGrid } from './chunk-
|
|
19
|
+
export { TimeGrid } from './chunk-MLZGGAXQ.js';
|
|
20
20
|
export { TimePicker } from './chunk-AZQXPI5S.js';
|
|
21
21
|
export { Timeline } from './chunk-QGY5FPVM.js';
|
|
22
22
|
export { Toast, useToast } from './chunk-UIE5FP3A.js';
|