@particle-academy/react-fancy 5.54.2 → 5.55.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +51 -0
- package/dist/chunk-SFJ5WOX5.js +703 -0
- package/dist/chunk-SFJ5WOX5.js.map +1 -0
- package/dist/chunk-XO4UWQCU.cjs +705 -0
- package/dist/chunk-XO4UWQCU.cjs.map +1 -0
- package/dist/index.cjs +2 -2
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/time-grid.cjs +3 -2
- package/dist/time-grid.d.cts +120 -17
- package/dist/time-grid.d.ts +120 -17
- package/dist/time-grid.js +2 -1
- package/package.json +1 -1
- package/dist/chunk-GF23UBOT.js +0 -129
- package/dist/chunk-GF23UBOT.js.map +0 -1
- package/dist/chunk-WFHK2DKG.cjs +0 -131
- package/dist/chunk-WFHK2DKG.cjs.map +0 -1
|
@@ -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","memo","TypedRow","jsx","forwardRef","TypedTimeGrid","useId","useRef","useMemo","composeRefs","useState","useCallback","useLayoutEffect","useEffect","jsxs","cn"],"mappings":"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","file":"chunk-XO4UWQCU.cjs","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 RefObject,\n} from \"react\";\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 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>;\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};\n\nconst TypedRow = memo(function TypedRow({\n ctx,\n r,\n rowCells,\n selStart,\n selEnd,\n activeCol,\n onRowHeader,\n}: RowProps) {\n const { baseId, rows, cols, states, marks, stateClass, cellWidth, cellHeight } = ctx;\n const { cellId, ariaCell } = ctx.fns.current;\n const out = new Array(cols.length + 1);\n out[0] = (\n <div\n key=\"h\"\n role=\"rowheader\"\n data-react-fancy-timegrid-row={r}\n onClick={onRowHeader ? () => onRowHeader(r) : undefined}\n className={onRowHeader ? `${HEADER_ROW} ${HEADER_HOVER}` : HEADER_ROW}\n >\n {rows[r]}\n </div>\n );\n for (let c = 0; c < cols.length; 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[c + 1] = (\n <div\n key={c}\n id={cellDomId(baseId, r, c)}\n role=\"gridcell\"\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 style={{ width: cellWidth, height: cellHeight }}\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 (\n <div role=\"row\" className=\"contents\">\n {out}\n </div>\n );\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 \"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 // 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 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 // eslint-disable-next-line react-hooks/exhaustive-deps\n [baseId, nRows, nCols],\n );\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 cell's boxes.\n */\n function clampToGrid(x: number, y: number): TimeGridCoord | null {\n const first = document.getElementById(cellDomId(baseId, 0, 0));\n const last = document.getElementById(cellDomId(baseId, nRows - 1, nCols - 1));\n if (!first || !last) return null;\n const a = first.getBoundingClientRect();\n const b = last.getBoundingClientRect();\n const w = (b.right - a.left) / nCols;\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, Math.floor((x - a.left) / w))),\n };\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 // Keep the active cell in view when the keyboard moves it.\n useEffect(() => {\n if (!focused) return;\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 const colStep = Math.max(1, Math.floor(nCols / 6));\n const pitchX = cellWidth + 2;\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 />\n );\n }\n\n return (\n <div\n ref={setOuterRef}\n data-react-fancy-timegrid=\"\"\n data-typed=\"\"\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={{ gridTemplateColumns: `max-content repeat(${nCols}, ${pitchX}px)` }}\n >\n <div role=\"row\" className=\"contents\">\n <div role=\"columnheader\" />\n {cols.map((label, c) => (\n <div\n key={c}\n role=\"columnheader\"\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 ? label : \"\") : label}\n </div>\n ))}\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 chunkXO4UWQCU_cjs = require('./chunk-XO4UWQCU.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 chunkXO4UWQCU_cjs.TimeGrid; }
|
|
275
275
|
});
|
|
276
276
|
Object.defineProperty(exports, "TimePicker", {
|
|
277
277
|
enumerable: true,
|
package/dist/index.d.cts
CHANGED
|
@@ -47,7 +47,7 @@ export { FauxClient } from './faux-client.cjs';
|
|
|
47
47
|
export { F as FauxClientProps } from './FauxClient.types-Dtk9aRs6.cjs';
|
|
48
48
|
export { StickyNote, StickyNoteColor, StickyNoteProps } from './sticky-note.cjs';
|
|
49
49
|
export { b as Timeline, a as TimelineBlockProps, c as TimelineEvent, T as TimelineItemProps, d as TimelineOrientation, e as TimelineProps, f as TimelineVariant } from './Timeline-BSk0X2nV.cjs';
|
|
50
|
-
export { TimeGrid, TimeGridProps, TimeGridTone } from './time-grid.cjs';
|
|
50
|
+
export { TimeGrid, TimeGridBlockedCell, TimeGridCell, TimeGridCoord, TimeGridDisabledRange, TimeGridMarkDef, TimeGridProps, TimeGridSelection, TimeGridSelectionShape, TimeGridStateDef, TimeGridTone } from './time-grid.cjs';
|
|
51
51
|
export { Marquee, MarqueeDirection, MarqueeProps } from './marquee.cjs';
|
|
52
52
|
export { Tooltip, TooltipProps } from './tooltip.cjs';
|
|
53
53
|
export { Popover, PopoverContentProps, PopoverContextValue, PopoverProps, PopoverTriggerProps, usePopover } from './popover.cjs';
|
package/dist/index.d.ts
CHANGED
|
@@ -47,7 +47,7 @@ export { FauxClient } from './faux-client.js';
|
|
|
47
47
|
export { F as FauxClientProps } from './FauxClient.types-Dtk9aRs6.js';
|
|
48
48
|
export { StickyNote, StickyNoteColor, StickyNoteProps } from './sticky-note.js';
|
|
49
49
|
export { b as Timeline, a as TimelineBlockProps, c as TimelineEvent, T as TimelineItemProps, d as TimelineOrientation, e as TimelineProps, f as TimelineVariant } from './Timeline-B-3JFX43.js';
|
|
50
|
-
export { TimeGrid, TimeGridProps, TimeGridTone } from './time-grid.js';
|
|
50
|
+
export { TimeGrid, TimeGridBlockedCell, TimeGridCell, TimeGridCoord, TimeGridDisabledRange, TimeGridMarkDef, TimeGridProps, TimeGridSelection, TimeGridSelectionShape, TimeGridStateDef, TimeGridTone } from './time-grid.js';
|
|
51
51
|
export { Marquee, MarqueeDirection, MarqueeProps } from './marquee.js';
|
|
52
52
|
export { Tooltip, TooltipProps } from './tooltip.js';
|
|
53
53
|
export { Popover, PopoverContentProps, PopoverContextValue, PopoverProps, PopoverTriggerProps, usePopover } from './popover.js';
|
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-SFJ5WOX5.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';
|
package/dist/time-grid.cjs
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkXO4UWQCU_cjs = require('./chunk-XO4UWQCU.cjs');
|
|
4
|
+
require('./chunk-I27K6NLX.cjs');
|
|
4
5
|
require('./chunk-ZU5Q77OT.cjs');
|
|
5
6
|
|
|
6
7
|
|
|
7
8
|
|
|
8
9
|
Object.defineProperty(exports, "TimeGrid", {
|
|
9
10
|
enumerable: true,
|
|
10
|
-
get: function () { return
|
|
11
|
+
get: function () { return chunkXO4UWQCU_cjs.TimeGrid; }
|
|
11
12
|
});
|
|
12
13
|
//# sourceMappingURL=time-grid.cjs.map
|
|
13
14
|
//# sourceMappingURL=time-grid.cjs.map
|
package/dist/time-grid.d.cts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import * as react from 'react';
|
|
2
|
+
import { ReactNode } from 'react';
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* Subset of palette colors the TimeGrid offers for the "cell-on" tone —
|
|
@@ -6,20 +7,88 @@ import * as react from 'react';
|
|
|
6
7
|
* use cases.
|
|
7
8
|
*/
|
|
8
9
|
type TimeGridTone = "violet" | "emerald" | "sky" | "rose" | "amber" | "indigo" | "blue" | "zinc";
|
|
10
|
+
/**
|
|
11
|
+
* One typed cell. The kit declares the SHAPE; the host declares the
|
|
12
|
+
* vocabulary through `states` and `marks`.
|
|
13
|
+
*/
|
|
14
|
+
type TimeGridCell = {
|
|
15
|
+
/** A key of `states`. The exclusive dimension (open / closed / booked …). */
|
|
16
|
+
state: string;
|
|
17
|
+
/** Blocks selection. Distinct from a state that merely looks unavailable. */
|
|
18
|
+
disabled?: boolean;
|
|
19
|
+
/** Why — surfaced in the title, the cell's aria-description and `onBlockedSelect`. */
|
|
20
|
+
reasons?: string[];
|
|
21
|
+
/** Keys of `marks`. Overlays drawn on top of the state tone. Non-exclusive. */
|
|
22
|
+
marks?: string[];
|
|
23
|
+
/** Passed back verbatim in every callback. The kit never reads it. */
|
|
24
|
+
meta?: unknown;
|
|
25
|
+
};
|
|
26
|
+
/** A state in the host's vocabulary. */
|
|
27
|
+
type TimeGridStateDef = {
|
|
28
|
+
/** Fill tone. Omit for the neutral surface (`--fancy-surface-muted`). */
|
|
29
|
+
tone?: TimeGridTone;
|
|
30
|
+
/** What a screen reader hears for this state. Default: the state id. */
|
|
31
|
+
label?: string;
|
|
32
|
+
/** Extra classes on every cell in this state — the host's own styling. */
|
|
33
|
+
className?: string;
|
|
34
|
+
};
|
|
35
|
+
/** An overlay mark: a tone dot or an icon, plus the label a screen reader gets. */
|
|
36
|
+
type TimeGridMarkDef = {
|
|
37
|
+
tone?: TimeGridTone;
|
|
38
|
+
/**
|
|
39
|
+
* Drawn instead of the tone dot, in a 10px box — e.g. `<Icon name="lock" />`.
|
|
40
|
+
* A node rather than an icon name on purpose: resolving names would make
|
|
41
|
+
* TimeGrid import the whole Lucide set into every bundle that uses it.
|
|
42
|
+
*/
|
|
43
|
+
icon?: ReactNode;
|
|
44
|
+
label?: string;
|
|
45
|
+
};
|
|
46
|
+
/** A cell coordinate: row index, column index. */
|
|
47
|
+
type TimeGridCoord = {
|
|
48
|
+
r: number;
|
|
49
|
+
c: number;
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* Both shapes are real and they are NOT the same value:
|
|
53
|
+
*
|
|
54
|
+
* - `rectangle`: the same window across several rows — 09:00-17:00 Mon-Fri.
|
|
55
|
+
* Normalised so r1 <= r2 and c1 <= c2.
|
|
56
|
+
* - `linear`: ONE continuous run in reading order (row-major), which may cross
|
|
57
|
+
* a row end and keep going — 23:54 Monday through 00:06 Tuesday. Normalised
|
|
58
|
+
* so `from` precedes `to`.
|
|
59
|
+
*/
|
|
60
|
+
type TimeGridSelection = {
|
|
61
|
+
shape: "rectangle";
|
|
62
|
+
r1: number;
|
|
63
|
+
c1: number;
|
|
64
|
+
r2: number;
|
|
65
|
+
c2: number;
|
|
66
|
+
} | {
|
|
67
|
+
shape: "linear";
|
|
68
|
+
from: TimeGridCoord;
|
|
69
|
+
to: TimeGridCoord;
|
|
70
|
+
};
|
|
71
|
+
type TimeGridSelectionShape = TimeGridSelection["shape"];
|
|
72
|
+
/** What a range that crosses a disabled cell does. */
|
|
73
|
+
type TimeGridDisabledRange = "clamp" | "refuse" | "span";
|
|
74
|
+
type TimeGridBlockedCell = {
|
|
75
|
+
r: number;
|
|
76
|
+
c: number;
|
|
77
|
+
reasons?: string[];
|
|
78
|
+
};
|
|
9
79
|
interface TimeGridProps {
|
|
10
|
-
/** Row labels, one per row
|
|
80
|
+
/** Row labels, one per row (e.g. ["Sun","Mon",…]). */
|
|
11
81
|
rows: string[];
|
|
12
|
-
/** Column labels, one per column
|
|
82
|
+
/** Column labels, one per column (e.g. ["0","1",…,"23"]). */
|
|
13
83
|
cols: string[];
|
|
14
84
|
/**
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* produces a new array passed to `onChange`.
|
|
85
|
+
* Boolean grid: controlled cell state, a rectangular
|
|
86
|
+
* `rows.length × cols.length` matrix. Ignored when `cells` is given.
|
|
18
87
|
*/
|
|
19
|
-
value
|
|
20
|
-
/**
|
|
21
|
-
onChange
|
|
22
|
-
/**
|
|
88
|
+
value?: boolean[][];
|
|
89
|
+
/** Boolean grid: called with the next matrix whenever a cell, row, or column toggles. */
|
|
90
|
+
onChange?: (next: boolean[][]) => void;
|
|
91
|
+
/** Boolean grid: cell-on tone. Default `"violet"`. */
|
|
23
92
|
toneOn?: TimeGridTone;
|
|
24
93
|
/** Cell width in px. Default `20`. */
|
|
25
94
|
cellWidth?: number;
|
|
@@ -30,24 +99,58 @@ interface TimeGridProps {
|
|
|
30
99
|
* top axis legible at small `cellWidth`. Set false to show all labels.
|
|
31
100
|
*/
|
|
32
101
|
sparseColLabels?: boolean;
|
|
33
|
-
/**
|
|
102
|
+
/**
|
|
103
|
+
* If true (default), clicking a row/column header toggles that strip
|
|
104
|
+
* (boolean grid) or selects it (typed grid).
|
|
105
|
+
*/
|
|
34
106
|
toggleStripsOnHeaderClick?: boolean;
|
|
35
107
|
/**
|
|
36
|
-
* Optional accessible label per cell.
|
|
37
|
-
* `${rows[r]} ${cols[c]} on|off
|
|
38
|
-
*
|
|
108
|
+
* Optional accessible label per cell. Boolean grid default:
|
|
109
|
+
* `${rows[r]} ${cols[c]} on|off`; `on` is the cell value. Typed grid default:
|
|
110
|
+
* `${rows[r]} ${cols[c]} ${state label}[, mark labels]`; `on` is whether the
|
|
111
|
+
* cell is selected.
|
|
39
112
|
*/
|
|
40
113
|
ariaCell?: (rowIdx: number, colIdx: number, on: boolean) => string;
|
|
41
114
|
/**
|
|
42
|
-
* Stable per-cell identifier
|
|
43
|
-
*
|
|
44
|
-
*
|
|
115
|
+
* Stable per-cell identifier, emitted as `data-react-fancy-timegrid-cell` so
|
|
116
|
+
* MCP bridges can address a specific cell without DOM walking. Default
|
|
117
|
+
* `${row}:${col}`.
|
|
45
118
|
*/
|
|
46
119
|
cellId?: (rowIdx: number, colIdx: number) => string;
|
|
47
120
|
/** Additional CSS classes on the outer scroll container. */
|
|
48
121
|
className?: string;
|
|
122
|
+
/** Host's state vocabulary: id -> tone + label. Required with `cells`. */
|
|
123
|
+
states?: Record<string, TimeGridStateDef>;
|
|
124
|
+
/** Host's overlay vocabulary: id -> tone/icon + label. */
|
|
125
|
+
marks?: Record<string, TimeGridMarkDef>;
|
|
126
|
+
/**
|
|
127
|
+
* Typed cells, `rows.length × cols.length`. When present the grid renders
|
|
128
|
+
* these (with `states`) and `value`/`onChange` are ignored.
|
|
129
|
+
*/
|
|
130
|
+
cells?: TimeGridCell[][];
|
|
131
|
+
/** Which shape a drag / Shift+arrow produces. Default `"rectangle"`. */
|
|
132
|
+
selectionShape?: TimeGridSelectionShape;
|
|
133
|
+
/** Controlled selection. `null` = nothing selected. Omit for uncontrolled. */
|
|
134
|
+
selection?: TimeGridSelection | null;
|
|
135
|
+
/** `cells` arrive in SELECTION ORDER — row-major, so time order for a linear run. */
|
|
136
|
+
onSelectionChange?: (next: TimeGridSelection | null, cells: TimeGridCell[]) => void;
|
|
137
|
+
/** A drag ended, or Enter was pressed. Same arguments as `onSelectionChange`. */
|
|
138
|
+
onSelectionCommit?: (selection: TimeGridSelection, cells: TimeGridCell[]) => void;
|
|
139
|
+
/** What a range that crosses a disabled cell does. Default `"clamp"`. */
|
|
140
|
+
disabledRange?: TimeGridDisabledRange;
|
|
141
|
+
/** Fires when a selection was refused or clipped by disabled cells. */
|
|
142
|
+
onBlockedSelect?: (blocked: TimeGridBlockedCell[]) => void;
|
|
143
|
+
/** Hover, for a host-owned detail panel. `null, null` when the pointer leaves. */
|
|
144
|
+
onCellHover?: (cell: TimeGridCell | null, at: TimeGridCoord | null) => void;
|
|
145
|
+
/** Accessible name of the grid (typed grid). */
|
|
146
|
+
"aria-label"?: string;
|
|
49
147
|
}
|
|
50
148
|
|
|
149
|
+
/**
|
|
150
|
+
* Two grids behind one name. `cells` (5.55.0) selects the typed grid: the
|
|
151
|
+
* host's state vocabulary, range selection, keyboard. Without it this is the
|
|
152
|
+
* boolean grid, unchanged since before 5.55.0.
|
|
153
|
+
*/
|
|
51
154
|
declare const TimeGrid: react.ForwardRefExoticComponent<TimeGridProps & react.RefAttributes<HTMLDivElement>>;
|
|
52
155
|
|
|
53
|
-
export { TimeGrid, type TimeGridProps, type TimeGridTone };
|
|
156
|
+
export { TimeGrid, type TimeGridBlockedCell, type TimeGridCell, type TimeGridCoord, type TimeGridDisabledRange, type TimeGridMarkDef, type TimeGridProps, type TimeGridSelection, type TimeGridSelectionShape, type TimeGridStateDef, type TimeGridTone };
|
package/dist/time-grid.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import * as react from 'react';
|
|
2
|
+
import { ReactNode } from 'react';
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* Subset of palette colors the TimeGrid offers for the "cell-on" tone —
|
|
@@ -6,20 +7,88 @@ import * as react from 'react';
|
|
|
6
7
|
* use cases.
|
|
7
8
|
*/
|
|
8
9
|
type TimeGridTone = "violet" | "emerald" | "sky" | "rose" | "amber" | "indigo" | "blue" | "zinc";
|
|
10
|
+
/**
|
|
11
|
+
* One typed cell. The kit declares the SHAPE; the host declares the
|
|
12
|
+
* vocabulary through `states` and `marks`.
|
|
13
|
+
*/
|
|
14
|
+
type TimeGridCell = {
|
|
15
|
+
/** A key of `states`. The exclusive dimension (open / closed / booked …). */
|
|
16
|
+
state: string;
|
|
17
|
+
/** Blocks selection. Distinct from a state that merely looks unavailable. */
|
|
18
|
+
disabled?: boolean;
|
|
19
|
+
/** Why — surfaced in the title, the cell's aria-description and `onBlockedSelect`. */
|
|
20
|
+
reasons?: string[];
|
|
21
|
+
/** Keys of `marks`. Overlays drawn on top of the state tone. Non-exclusive. */
|
|
22
|
+
marks?: string[];
|
|
23
|
+
/** Passed back verbatim in every callback. The kit never reads it. */
|
|
24
|
+
meta?: unknown;
|
|
25
|
+
};
|
|
26
|
+
/** A state in the host's vocabulary. */
|
|
27
|
+
type TimeGridStateDef = {
|
|
28
|
+
/** Fill tone. Omit for the neutral surface (`--fancy-surface-muted`). */
|
|
29
|
+
tone?: TimeGridTone;
|
|
30
|
+
/** What a screen reader hears for this state. Default: the state id. */
|
|
31
|
+
label?: string;
|
|
32
|
+
/** Extra classes on every cell in this state — the host's own styling. */
|
|
33
|
+
className?: string;
|
|
34
|
+
};
|
|
35
|
+
/** An overlay mark: a tone dot or an icon, plus the label a screen reader gets. */
|
|
36
|
+
type TimeGridMarkDef = {
|
|
37
|
+
tone?: TimeGridTone;
|
|
38
|
+
/**
|
|
39
|
+
* Drawn instead of the tone dot, in a 10px box — e.g. `<Icon name="lock" />`.
|
|
40
|
+
* A node rather than an icon name on purpose: resolving names would make
|
|
41
|
+
* TimeGrid import the whole Lucide set into every bundle that uses it.
|
|
42
|
+
*/
|
|
43
|
+
icon?: ReactNode;
|
|
44
|
+
label?: string;
|
|
45
|
+
};
|
|
46
|
+
/** A cell coordinate: row index, column index. */
|
|
47
|
+
type TimeGridCoord = {
|
|
48
|
+
r: number;
|
|
49
|
+
c: number;
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* Both shapes are real and they are NOT the same value:
|
|
53
|
+
*
|
|
54
|
+
* - `rectangle`: the same window across several rows — 09:00-17:00 Mon-Fri.
|
|
55
|
+
* Normalised so r1 <= r2 and c1 <= c2.
|
|
56
|
+
* - `linear`: ONE continuous run in reading order (row-major), which may cross
|
|
57
|
+
* a row end and keep going — 23:54 Monday through 00:06 Tuesday. Normalised
|
|
58
|
+
* so `from` precedes `to`.
|
|
59
|
+
*/
|
|
60
|
+
type TimeGridSelection = {
|
|
61
|
+
shape: "rectangle";
|
|
62
|
+
r1: number;
|
|
63
|
+
c1: number;
|
|
64
|
+
r2: number;
|
|
65
|
+
c2: number;
|
|
66
|
+
} | {
|
|
67
|
+
shape: "linear";
|
|
68
|
+
from: TimeGridCoord;
|
|
69
|
+
to: TimeGridCoord;
|
|
70
|
+
};
|
|
71
|
+
type TimeGridSelectionShape = TimeGridSelection["shape"];
|
|
72
|
+
/** What a range that crosses a disabled cell does. */
|
|
73
|
+
type TimeGridDisabledRange = "clamp" | "refuse" | "span";
|
|
74
|
+
type TimeGridBlockedCell = {
|
|
75
|
+
r: number;
|
|
76
|
+
c: number;
|
|
77
|
+
reasons?: string[];
|
|
78
|
+
};
|
|
9
79
|
interface TimeGridProps {
|
|
10
|
-
/** Row labels, one per row
|
|
80
|
+
/** Row labels, one per row (e.g. ["Sun","Mon",…]). */
|
|
11
81
|
rows: string[];
|
|
12
|
-
/** Column labels, one per column
|
|
82
|
+
/** Column labels, one per column (e.g. ["0","1",…,"23"]). */
|
|
13
83
|
cols: string[];
|
|
14
84
|
/**
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* produces a new array passed to `onChange`.
|
|
85
|
+
* Boolean grid: controlled cell state, a rectangular
|
|
86
|
+
* `rows.length × cols.length` matrix. Ignored when `cells` is given.
|
|
18
87
|
*/
|
|
19
|
-
value
|
|
20
|
-
/**
|
|
21
|
-
onChange
|
|
22
|
-
/**
|
|
88
|
+
value?: boolean[][];
|
|
89
|
+
/** Boolean grid: called with the next matrix whenever a cell, row, or column toggles. */
|
|
90
|
+
onChange?: (next: boolean[][]) => void;
|
|
91
|
+
/** Boolean grid: cell-on tone. Default `"violet"`. */
|
|
23
92
|
toneOn?: TimeGridTone;
|
|
24
93
|
/** Cell width in px. Default `20`. */
|
|
25
94
|
cellWidth?: number;
|
|
@@ -30,24 +99,58 @@ interface TimeGridProps {
|
|
|
30
99
|
* top axis legible at small `cellWidth`. Set false to show all labels.
|
|
31
100
|
*/
|
|
32
101
|
sparseColLabels?: boolean;
|
|
33
|
-
/**
|
|
102
|
+
/**
|
|
103
|
+
* If true (default), clicking a row/column header toggles that strip
|
|
104
|
+
* (boolean grid) or selects it (typed grid).
|
|
105
|
+
*/
|
|
34
106
|
toggleStripsOnHeaderClick?: boolean;
|
|
35
107
|
/**
|
|
36
|
-
* Optional accessible label per cell.
|
|
37
|
-
* `${rows[r]} ${cols[c]} on|off
|
|
38
|
-
*
|
|
108
|
+
* Optional accessible label per cell. Boolean grid default:
|
|
109
|
+
* `${rows[r]} ${cols[c]} on|off`; `on` is the cell value. Typed grid default:
|
|
110
|
+
* `${rows[r]} ${cols[c]} ${state label}[, mark labels]`; `on` is whether the
|
|
111
|
+
* cell is selected.
|
|
39
112
|
*/
|
|
40
113
|
ariaCell?: (rowIdx: number, colIdx: number, on: boolean) => string;
|
|
41
114
|
/**
|
|
42
|
-
* Stable per-cell identifier
|
|
43
|
-
*
|
|
44
|
-
*
|
|
115
|
+
* Stable per-cell identifier, emitted as `data-react-fancy-timegrid-cell` so
|
|
116
|
+
* MCP bridges can address a specific cell without DOM walking. Default
|
|
117
|
+
* `${row}:${col}`.
|
|
45
118
|
*/
|
|
46
119
|
cellId?: (rowIdx: number, colIdx: number) => string;
|
|
47
120
|
/** Additional CSS classes on the outer scroll container. */
|
|
48
121
|
className?: string;
|
|
122
|
+
/** Host's state vocabulary: id -> tone + label. Required with `cells`. */
|
|
123
|
+
states?: Record<string, TimeGridStateDef>;
|
|
124
|
+
/** Host's overlay vocabulary: id -> tone/icon + label. */
|
|
125
|
+
marks?: Record<string, TimeGridMarkDef>;
|
|
126
|
+
/**
|
|
127
|
+
* Typed cells, `rows.length × cols.length`. When present the grid renders
|
|
128
|
+
* these (with `states`) and `value`/`onChange` are ignored.
|
|
129
|
+
*/
|
|
130
|
+
cells?: TimeGridCell[][];
|
|
131
|
+
/** Which shape a drag / Shift+arrow produces. Default `"rectangle"`. */
|
|
132
|
+
selectionShape?: TimeGridSelectionShape;
|
|
133
|
+
/** Controlled selection. `null` = nothing selected. Omit for uncontrolled. */
|
|
134
|
+
selection?: TimeGridSelection | null;
|
|
135
|
+
/** `cells` arrive in SELECTION ORDER — row-major, so time order for a linear run. */
|
|
136
|
+
onSelectionChange?: (next: TimeGridSelection | null, cells: TimeGridCell[]) => void;
|
|
137
|
+
/** A drag ended, or Enter was pressed. Same arguments as `onSelectionChange`. */
|
|
138
|
+
onSelectionCommit?: (selection: TimeGridSelection, cells: TimeGridCell[]) => void;
|
|
139
|
+
/** What a range that crosses a disabled cell does. Default `"clamp"`. */
|
|
140
|
+
disabledRange?: TimeGridDisabledRange;
|
|
141
|
+
/** Fires when a selection was refused or clipped by disabled cells. */
|
|
142
|
+
onBlockedSelect?: (blocked: TimeGridBlockedCell[]) => void;
|
|
143
|
+
/** Hover, for a host-owned detail panel. `null, null` when the pointer leaves. */
|
|
144
|
+
onCellHover?: (cell: TimeGridCell | null, at: TimeGridCoord | null) => void;
|
|
145
|
+
/** Accessible name of the grid (typed grid). */
|
|
146
|
+
"aria-label"?: string;
|
|
49
147
|
}
|
|
50
148
|
|
|
149
|
+
/**
|
|
150
|
+
* Two grids behind one name. `cells` (5.55.0) selects the typed grid: the
|
|
151
|
+
* host's state vocabulary, range selection, keyboard. Without it this is the
|
|
152
|
+
* boolean grid, unchanged since before 5.55.0.
|
|
153
|
+
*/
|
|
51
154
|
declare const TimeGrid: react.ForwardRefExoticComponent<TimeGridProps & react.RefAttributes<HTMLDivElement>>;
|
|
52
155
|
|
|
53
|
-
export { TimeGrid, type TimeGridProps, type TimeGridTone };
|
|
156
|
+
export { TimeGrid, type TimeGridBlockedCell, type TimeGridCell, type TimeGridCoord, type TimeGridDisabledRange, type TimeGridMarkDef, type TimeGridProps, type TimeGridSelection, type TimeGridSelectionShape, type TimeGridStateDef, type TimeGridTone };
|
package/dist/time-grid.js
CHANGED