@roy-ui/ui 0.0.8 → 0.0.10

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/README.md CHANGED
@@ -9,7 +9,7 @@
9
9
  [![types](https://img.shields.io/npm/types/@roy-ui/ui?color=3178C6&logo=typescript&logoColor=white)](https://www.npmjs.com/package/@roy-ui/ui)
10
10
  [![license](https://img.shields.io/npm/l/@roy-ui/ui?color=22c55e)](https://github.com/DibbayajyotiRoy/RoyUI/blob/main/LICENSE)
11
11
 
12
- **[Open the live documentation →](https://royui.dev/components/data-table)**
12
+ **[Open the live documentation →](https://roy-ui-docs.vercel.app/components/data-table)**
13
13
 
14
14
  <a href="https://github.com/DibbayajyotiRoy/RoyUI/blob/main/apps/docs/lib/demo/linkedin2.mp4">
15
15
  <img
@@ -114,7 +114,7 @@ export default function OrdersTable({ orders }: { orders: Order[] }) {
114
114
 
115
115
  | Component | What it does |
116
116
  | --- | --- |
117
- | **[`DataTable<T>`](https://royui.dev/components/data-table)** | Generic, fully-featured **React data table**. Search across columns, sort, paginate, **drag headers to reorder**, **drag the right edge to resize**, **Columns menu** to hide & restore, **CSV / JSON export & import**, **per-zone typography** for headers / row-headers / cells, optional `fitColumns` to disable horizontal scroll, optional `localStorage` persistence. |
117
+ | **[`DataTable<T>`](https://roy-ui-docs.vercel.app/components/data-table)** | Generic, fully-featured **React data table**. Search across columns, sort, paginate, **drag headers to reorder**, **drag the right edge to resize**, **Columns menu** to hide & restore, **CSV / JSON export & import**, **per-zone typography** for headers / row-headers / cells, optional `fitColumns` to disable horizontal scroll, optional `localStorage` persistence. |
118
118
  | **`Table`** + parts | Standalone primitive — `Table`, `TableHeader`, `TableBody`, `TableRow`, `TableHead`, `TableCell`. Scrollable rows (`visibleRows`, default 7), sticky header, density scale (compact / cozy / comfortable), inline `Spinner`. |
119
119
  | **`TableSearch`** | Debounced search input, clear button, controlled & uncontrolled modes. |
120
120
  | **`Pagination`** | Numbered pages with text Prev / Next, ellipsis, optional `Page X of Y` summary. |
@@ -325,7 +325,7 @@ Yes. `dataIO.export.enabled` adds an Export button; `dataIO.import.enabled` adds
325
325
 
326
326
  ## Links
327
327
 
328
- - **Live documentation:** <https://royui.dev>
328
+ - **Live documentation:** <https://roy-ui-docs.vercel.app>
329
329
  - **Source code:** <https://github.com/DibbayajyotiRoy/RoyUI>
330
330
  - **Issues:** <https://github.com/DibbayajyotiRoy/RoyUI/issues>
331
331
  - **Releases:** <https://github.com/DibbayajyotiRoy/RoyUI/releases>
@@ -15,7 +15,9 @@
15
15
  --royui-tp-hand-quiet: rgba(20, 20, 20, 0.4);
16
16
  --royui-tp-hand-active: rgb(20, 20, 20);
17
17
  --royui-tp-ease: cubic-bezier(0.22, 0.61, 0.36, 1);
18
+ --royui-tp-spring: cubic-bezier(0.34, 1.4, 0.5, 1);
18
19
  --royui-tp-dur: 160ms;
20
+ --royui-tp-dur-lg: 320ms;
19
21
 
20
22
  position: relative;
21
23
  display: inline-block;
@@ -97,12 +99,31 @@
97
99
  }
98
100
 
99
101
  .royui-tp__variants {
102
+ position: relative;
100
103
  display: inline-flex;
101
104
  background: var(--royui-tp-hover-bg);
102
105
  border-radius: 7px;
103
106
  padding: 2px;
104
107
  }
108
+ /* Sliding pill — tracks the active variant. */
109
+ .royui-tp__variant-thumb {
110
+ position: absolute;
111
+ top: 2px;
112
+ bottom: 2px;
113
+ left: 2px;
114
+ width: calc(50% - 2px);
115
+ background: var(--royui-tp-bg);
116
+ border-radius: 5px;
117
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);
118
+ transition: transform var(--royui-tp-dur-lg) var(--royui-tp-spring);
119
+ pointer-events: none;
120
+ }
121
+ .royui-tp__variants[data-active='digital'] .royui-tp__variant-thumb {
122
+ transform: translateX(100%);
123
+ }
105
124
  .royui-tp__variant {
125
+ position: relative;
126
+ z-index: 1;
106
127
  background: transparent;
107
128
  border: 0;
108
129
  padding: 4px 10px;
@@ -111,17 +132,13 @@
111
132
  color: var(--royui-tp-muted);
112
133
  cursor: pointer;
113
134
  border-radius: 5px;
114
- transition:
115
- background var(--royui-tp-dur) var(--royui-tp-ease),
116
- color var(--royui-tp-dur) var(--royui-tp-ease);
135
+ transition: color var(--royui-tp-dur) var(--royui-tp-ease);
117
136
  }
118
137
  .royui-tp__variant:hover {
119
138
  color: var(--royui-tp-fg);
120
139
  }
121
140
  .royui-tp__variant--on {
122
- background: var(--royui-tp-bg);
123
141
  color: var(--royui-tp-fg);
124
- box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);
125
142
  }
126
143
 
127
144
  .royui-tp__body {
@@ -130,6 +147,38 @@
130
147
  padding: 4px 0 8px;
131
148
  }
132
149
 
150
+ /* ── Analog ↔ Digital crossfade ─────────────────────────── */
151
+
152
+ .royui-tp__switch {
153
+ position: relative;
154
+ width: 100%;
155
+ transition: height var(--royui-tp-dur-lg) var(--royui-tp-ease);
156
+ overflow: hidden;
157
+ }
158
+ .royui-tp__layer {
159
+ position: absolute;
160
+ top: 0;
161
+ left: 0;
162
+ right: 0;
163
+ display: flex;
164
+ justify-content: center;
165
+ opacity: 0;
166
+ transform: scale(0.96);
167
+ filter: blur(4px);
168
+ pointer-events: none;
169
+ transition:
170
+ opacity var(--royui-tp-dur-lg) var(--royui-tp-ease),
171
+ transform var(--royui-tp-dur-lg) var(--royui-tp-ease),
172
+ filter var(--royui-tp-dur-lg) var(--royui-tp-ease);
173
+ }
174
+ .royui-tp__layer--active {
175
+ position: relative;
176
+ opacity: 1;
177
+ transform: none;
178
+ filter: none;
179
+ pointer-events: auto;
180
+ }
181
+
133
182
  /* ── Analog ─────────────────────────────────────────────── */
134
183
 
135
184
  .royui-tp-analog {
@@ -373,6 +422,74 @@
373
422
  border: 1px solid var(--royui-tp-accent);
374
423
  }
375
424
 
425
+ /* ── Range — Start / End legs ───────────────────────────── */
426
+
427
+ .royui-trp__legs {
428
+ position: relative;
429
+ display: grid;
430
+ grid-template-columns: 1fr 1fr;
431
+ gap: 2px;
432
+ background: var(--royui-tp-hover-bg);
433
+ border-radius: 9px;
434
+ padding: 3px;
435
+ margin-bottom: 12px;
436
+ }
437
+ .royui-trp__leg-thumb {
438
+ position: absolute;
439
+ top: 3px;
440
+ bottom: 3px;
441
+ left: 3px;
442
+ width: calc(50% - 3px);
443
+ background: var(--royui-tp-bg);
444
+ border: 1px solid var(--royui-tp-border);
445
+ border-radius: 7px;
446
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.07);
447
+ transition: transform var(--royui-tp-dur-lg) var(--royui-tp-spring);
448
+ pointer-events: none;
449
+ }
450
+ .royui-trp__legs[data-active='to'] .royui-trp__leg-thumb {
451
+ transform: translateX(100%);
452
+ }
453
+ .royui-trp__leg {
454
+ position: relative;
455
+ z-index: 1;
456
+ display: flex;
457
+ flex-direction: column;
458
+ align-items: flex-start;
459
+ gap: 1px;
460
+ background: transparent;
461
+ border: 0;
462
+ padding: 6px 11px;
463
+ border-radius: 7px;
464
+ cursor: pointer;
465
+ font: inherit;
466
+ }
467
+ .royui-trp__leg-label {
468
+ font-size: 10.5px;
469
+ font-weight: 500;
470
+ letter-spacing: 0.03em;
471
+ text-transform: uppercase;
472
+ color: var(--royui-tp-subtle);
473
+ transition: color var(--royui-tp-dur) var(--royui-tp-ease);
474
+ }
475
+ .royui-trp__leg-time {
476
+ font-size: 15px;
477
+ font-weight: 500;
478
+ color: var(--royui-tp-muted);
479
+ font-variant-numeric: tabular-nums;
480
+ letter-spacing: -0.01em;
481
+ transition: color var(--royui-tp-dur) var(--royui-tp-ease);
482
+ }
483
+ .royui-trp__leg[aria-selected='true'] .royui-trp__leg-label {
484
+ color: var(--royui-tp-muted);
485
+ }
486
+ .royui-trp__leg[aria-selected='true'] .royui-trp__leg-time {
487
+ color: var(--royui-tp-fg);
488
+ }
489
+ .royui-trp__leg:hover .royui-trp__leg-time {
490
+ color: var(--royui-tp-fg);
491
+ }
492
+
376
493
  @keyframes royui-tp-in {
377
494
  from { opacity: 0; transform: translateY(-4px) scale(0.98); }
378
495
  to { opacity: 1; transform: none; }
@@ -408,4 +525,10 @@
408
525
 
409
526
  @media (prefers-reduced-motion: reduce) {
410
527
  .royui-tp__panel { animation: none; }
528
+ .royui-tp__switch,
529
+ .royui-tp__layer,
530
+ .royui-tp__variant-thumb,
531
+ .royui-trp__leg-thumb {
532
+ transition: none;
533
+ }
411
534
  }
@@ -36,4 +36,28 @@ interface TimePickerProps {
36
36
  declare function formatTime(t: TimeValue | null | undefined, hourCycle?: 12 | 24): string;
37
37
  declare function TimePicker({ value, defaultValue, onChange, variant, switchable, hourCycle, minuteStep, placeholder, align, className, style, triggerLabel, disabled, }: TimePickerProps): react_jsx_runtime.JSX.Element;
38
38
 
39
- export { AnalogClock as A, TimePicker as T, type AnalogClockProps as a, type TimePickerProps as b, type TimePickerVariant as c, type TimeValue as d, formatTime as f };
39
+ type TimeRangeValue = {
40
+ from: TimeValue | null;
41
+ to: TimeValue | null;
42
+ };
43
+ interface TimeRangePickerProps {
44
+ value?: TimeRangeValue | null;
45
+ defaultValue?: TimeRangeValue | null;
46
+ onChange?: (next: TimeRangeValue) => void;
47
+ /** Picker style. Default 'analog'. */
48
+ variant?: TimePickerVariant;
49
+ /** Allow the user to switch between variants. Default true. */
50
+ switchable?: boolean;
51
+ hourCycle?: 12 | 24;
52
+ minuteStep?: number;
53
+ placeholder?: string;
54
+ align?: 'left' | 'right';
55
+ className?: string;
56
+ style?: CSSProperties;
57
+ triggerLabel?: ReactNode;
58
+ disabled?: boolean;
59
+ }
60
+ declare function formatTimeRange(range: TimeRangeValue | null | undefined, hourCycle?: 12 | 24): string;
61
+ declare function TimeRangePicker({ value, defaultValue, onChange, variant, switchable, hourCycle, minuteStep, placeholder, align, className, style, triggerLabel, disabled, }: TimeRangePickerProps): react_jsx_runtime.JSX.Element;
62
+
63
+ export { AnalogClock as A, TimePicker as T, type AnalogClockProps as a, type TimePickerProps as b, type TimePickerVariant as c, TimeRangePicker as d, type TimeRangePickerProps as e, type TimeRangeValue as f, type TimeValue as g, formatTime as h, formatTimeRange as i };
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { Table, TableHeader, TableRow, TableHead, TableBody, TableCell } from './chunk-XERZVDIT.js';
3
3
  import { TableSearch } from './chunk-KSHKVSNK.js';
4
- import { TimePicker } from './chunk-75IGGPXL.js';
4
+ import { TimeRangePicker } from './chunk-QOSMU4DV.js';
5
5
  import { DateRangePicker, startOfDay, isBetween } from './chunk-SFENGB5N.js';
6
6
  import { Pagination } from './chunk-5CIBIH7R.js';
7
7
  import { useState, useRef, useEffect, useMemo, useCallback } from 'react';
@@ -238,16 +238,24 @@ function applyFilters(rows, columns, filters, cfg) {
238
238
  if (!isBetween(day, startOfDay(from), startOfDay(to))) return false;
239
239
  }
240
240
  }
241
- if (cfg.timeColumn && filters.time) {
241
+ if (cfg.timeColumn && (filters.timeRange.from || filters.timeRange.to)) {
242
242
  const col = columns.find((c) => c.key === cfg.timeColumn);
243
243
  if (col) {
244
244
  const raw = col.accessor(row);
245
245
  const d = raw instanceof Date ? raw : raw ? new Date(raw) : null;
246
246
  if (!d || isNaN(d.getTime())) return false;
247
247
  const rowMin = d.getHours() * 60 + d.getMinutes();
248
- const filterMin = filters.time.hours * 60 + filters.time.minutes;
249
- const tol = cfg.timeTolerance ?? 0;
250
- if (Math.abs(rowMin - filterMin) > tol) return false;
248
+ const { from, to } = filters.timeRange;
249
+ const fromMin = from ? from.hours * 60 + from.minutes : null;
250
+ const toMin = to ? to.hours * 60 + to.minutes : null;
251
+ if (fromMin != null && toMin != null) {
252
+ const inWindow = fromMin <= toMin ? rowMin >= fromMin && rowMin <= toMin : rowMin >= fromMin || rowMin <= toMin;
253
+ if (!inWindow) return false;
254
+ } else if (fromMin != null) {
255
+ if (rowMin < fromMin) return false;
256
+ } else if (toMin != null) {
257
+ if (rowMin > toMin) return false;
258
+ }
251
259
  }
252
260
  }
253
261
  return true;
@@ -458,7 +466,7 @@ function DataTable({
458
466
  const [filters, setFilters] = useState({
459
467
  search: "",
460
468
  dateRange: { from: null, to: null },
461
- time: null
469
+ timeRange: { from: null, to: null }
462
470
  });
463
471
  const [sort, setSort] = useState(null);
464
472
  const pageSize = pagination === false ? Infinity : pagination?.pageSize ?? 25;
@@ -467,10 +475,9 @@ function DataTable({
467
475
  () => applyFilters(data, columns, filters, {
468
476
  dateColumn: dateFilter?.column,
469
477
  timeColumn: timeFilter?.column,
470
- timeTolerance: timeFilter?.toleranceMinutes,
471
478
  searchPredicate: search?.predicate
472
479
  }),
473
- [data, columns, filters, dateFilter?.column, timeFilter?.column, timeFilter?.toleranceMinutes, search?.predicate]
480
+ [data, columns, filters, dateFilter?.column, timeFilter?.column, search?.predicate]
474
481
  );
475
482
  const sorted = useMemo(() => applySort(filtered, columns, sort), [filtered, columns, sort]);
476
483
  const pageCount = pagination === false ? 1 : Math.max(1, Math.ceil(sorted.length / pageSize));
@@ -615,16 +622,17 @@ function DataTable({
615
622
  }
616
623
  ),
617
624
  timeFilter && /* @__PURE__ */ jsx(
618
- TimePicker,
625
+ TimeRangePicker,
619
626
  {
620
- value: filters.time,
621
- onChange: (t) => {
622
- setFilters((f) => ({ ...f, time: t }));
627
+ value: filters.timeRange,
628
+ onChange: (r) => {
629
+ setFilters((f) => ({ ...f, timeRange: r }));
623
630
  setPage(1);
624
631
  },
625
632
  variant: timeFilter.variant ?? "analog",
626
633
  hourCycle: timeFilter.hourCycle ?? 24,
627
- placeholder: timeFilter.placeholder ?? "Time"
634
+ minuteStep: timeFilter.minuteStep ?? 1,
635
+ placeholder: timeFilter.placeholder ?? "Time range"
628
636
  }
629
637
  )
630
638
  ] }),
@@ -836,5 +844,5 @@ function DataTable({
836
844
  }
837
845
 
838
846
  export { ColumnMenu, DataTable, downloadString, fromCsv, fromJson, toCsv, toJson };
839
- //# sourceMappingURL=chunk-HUCK7AM7.js.map
840
- //# sourceMappingURL=chunk-HUCK7AM7.js.map
847
+ //# sourceMappingURL=chunk-PDUQROG2.js.map
848
+ //# sourceMappingURL=chunk-PDUQROG2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/data-table/ColumnMenu.tsx","../src/components/data-table/useTableLayout.ts","../src/components/data-table/filters.ts","../src/components/data-table/io.ts","../src/components/data-table/DataTable.tsx"],"names":["useState","useEffect","useMemo","useRef","useCallback","jsxs","jsx"],"mappings":"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","file":"chunk-PDUQROG2.js","sourcesContent":["'use client';\n\nimport { useEffect, useRef, useState } from 'react';\nimport type { Column, TableLayout } from './types';\n\nexport interface ColumnMenuProps<T> {\n columns: Column<T>[];\n layout: TableLayout;\n onToggle: (key: string) => void;\n onReset: () => void;\n}\n\nexport function ColumnMenu<T>({\n columns,\n layout,\n onToggle,\n onReset,\n}: ColumnMenuProps<T>) {\n const [open, setOpen] = useState(false);\n const wrap = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!open) return;\n function onDown(e: MouseEvent) {\n if (wrap.current && !wrap.current.contains(e.target as Node)) {\n setOpen(false);\n }\n }\n function onKey(e: KeyboardEvent) {\n if (e.key === 'Escape') setOpen(false);\n }\n document.addEventListener('mousedown', onDown);\n document.addEventListener('keydown', onKey);\n return () => {\n document.removeEventListener('mousedown', onDown);\n document.removeEventListener('keydown', onKey);\n };\n }, [open]);\n\n const hiddenCount = layout.hidden.length;\n\n return (\n <div className=\"royui-dt-colmenu\" ref={wrap}>\n <button\n type=\"button\"\n className=\"royui-dt-colmenu__trigger\"\n onClick={() => setOpen((o) => !o)}\n aria-expanded={open}\n aria-haspopup=\"menu\"\n >\n Columns\n </button>\n {hiddenCount > 0 && (\n <button\n type=\"button\"\n className=\"royui-dt-colmenu__chip\"\n onClick={() => setOpen(true)}\n >\n {hiddenCount} hidden\n </button>\n )}\n\n {open && (\n <div className=\"royui-dt-colmenu__panel\" role=\"menu\">\n <div className=\"royui-dt-colmenu__head\">\n <span className=\"royui-dt-colmenu__title\">Columns</span>\n <button\n type=\"button\"\n className=\"royui-dt-colmenu__reset\"\n onClick={() => {\n onReset();\n }}\n >\n Reset\n </button>\n </div>\n <ul className=\"royui-dt-colmenu__list\">\n {columns.map((c) => {\n const isHidden = layout.hidden.includes(c.key);\n const disabled = c.hideable === false;\n return (\n <li key={c.key}>\n <button\n type=\"button\"\n role=\"menuitemcheckbox\"\n aria-checked={!isHidden}\n className={[\n 'royui-dt-colmenu__row',\n isHidden && 'royui-dt-colmenu__row--off',\n disabled && 'royui-dt-colmenu__row--locked',\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={() => !disabled && onToggle(c.key)}\n disabled={disabled}\n >\n <span\n className={[\n 'royui-dt-colmenu__dot',\n !isHidden && 'royui-dt-colmenu__dot--on',\n ]\n .filter(Boolean)\n .join(' ')}\n aria-hidden\n />\n <span className=\"royui-dt-colmenu__label\">{c.header}</span>\n </button>\n </li>\n );\n })}\n </ul>\n </div>\n )}\n </div>\n );\n}\n","'use client';\n\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport type { Column, TableLayout } from './types';\n\nfunction defaultLayout<T>(columns: Column<T>[]): TableLayout {\n return {\n order: columns.map((c) => c.key),\n sizes: columns.reduce<Record<string, number>>((acc, c) => {\n if (c.defaultWidth != null) acc[c.key] = c.defaultWidth;\n return acc;\n }, {}),\n hidden: columns.filter((c) => c.defaultHidden).map((c) => c.key),\n };\n}\n\nfunction loadLayout(key: string | undefined): TableLayout | null {\n if (!key || typeof window === 'undefined') return null;\n try {\n const raw = window.localStorage.getItem(key);\n if (!raw) return null;\n return JSON.parse(raw) as TableLayout;\n } catch {\n return null;\n }\n}\n\nfunction saveLayout(key: string | undefined, layout: TableLayout): void {\n if (!key || typeof window === 'undefined') return;\n try {\n window.localStorage.setItem(key, JSON.stringify(layout));\n } catch {\n // ignore\n }\n}\n\nexport function useTableLayout<T>(columns: Column<T>[], storageKey?: string) {\n const initial = useMemo<TableLayout>(() => {\n return loadLayout(storageKey) ?? defaultLayout(columns);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const [layout, setLayout] = useState<TableLayout>(initial);\n\n useEffect(() => {\n // reconcile if columns change: drop unknown keys, append new ones at the end\n setLayout((prev) => {\n const known = new Set(columns.map((c) => c.key));\n const order = prev.order.filter((k) => known.has(k));\n columns.forEach((c) => {\n if (!order.includes(c.key)) order.push(c.key);\n });\n const sizes: Record<string, number> = {};\n Object.entries(prev.sizes).forEach(([k, v]) => {\n if (known.has(k)) sizes[k] = v;\n });\n const hidden = prev.hidden.filter((k) => known.has(k));\n return { order, sizes, hidden };\n });\n }, [columns]);\n\n useEffect(() => {\n saveLayout(storageKey, layout);\n }, [layout, storageKey]);\n\n const orderedColumns = useMemo(() => {\n const pinnedLeft = columns.filter((c) => c.pinned === 'left');\n const pinnedRight = columns.filter((c) => c.pinned === 'right');\n const pinnedKeys = new Set(\n [...pinnedLeft, ...pinnedRight].map((c) => c.key),\n );\n const rest = layout.order\n .filter((k) => !pinnedKeys.has(k))\n .map((k) => columns.find((c) => c.key === k))\n .filter(Boolean) as Column<T>[];\n return [...pinnedLeft, ...rest, ...pinnedRight];\n }, [columns, layout.order]);\n\n const visibleColumns = useMemo(\n () => orderedColumns.filter((c) => !layout.hidden.includes(c.key)),\n [orderedColumns, layout.hidden],\n );\n\n const reorder = useCallback((key: string, toIndex: number) => {\n setLayout((prev) => {\n const order = [...prev.order];\n const from = order.indexOf(key);\n if (from === -1 || from === toIndex) return prev;\n const item = order.splice(from, 1)[0];\n if (item === undefined) return prev;\n const insertAt = toIndex > from ? toIndex - 1 : toIndex;\n order.splice(Math.max(0, Math.min(insertAt, order.length)), 0, item);\n return { ...prev, order };\n });\n }, []);\n\n const resize = useCallback((key: string, px: number | null) => {\n setLayout((prev) => {\n const sizes = { ...prev.sizes };\n if (px == null) delete sizes[key];\n else sizes[key] = Math.max(40, Math.round(px));\n return { ...prev, sizes };\n });\n }, []);\n\n const toggleHidden = useCallback((key: string) => {\n setLayout((prev) => {\n const hidden = prev.hidden.includes(key)\n ? prev.hidden.filter((k) => k !== key)\n : [...prev.hidden, key];\n return { ...prev, hidden };\n });\n }, []);\n\n const reset = useCallback(() => {\n setLayout(defaultLayout(columns));\n }, [columns]);\n\n return {\n layout,\n orderedColumns,\n visibleColumns,\n reorder,\n resize,\n toggleHidden,\n reset,\n };\n}\n","import type { Column, FilterState, SortDir } from './types';\nimport { isBetween, startOfDay } from '../date-range-picker';\n\nexport function defaultSearchPredicate<T>(\n row: T,\n query: string,\n columns: Column<T>[],\n): boolean {\n if (!query) return true;\n const q = query.toLowerCase();\n return columns.some((c) => {\n const v = c.accessor(row);\n if (v == null) return false;\n const s = v instanceof Date ? v.toLocaleString() : String(v);\n return s.toLowerCase().includes(q);\n });\n}\n\nexport function applyFilters<T>(\n rows: T[],\n columns: Column<T>[],\n filters: FilterState,\n cfg: {\n dateColumn?: string;\n timeColumn?: string;\n searchPredicate?: (row: T, q: string, cols: Column<T>[]) => boolean;\n },\n): T[] {\n const searchFn = cfg.searchPredicate ?? defaultSearchPredicate;\n\n return rows.filter((row) => {\n if (filters.search && !searchFn(row, filters.search, columns)) return false;\n\n if (cfg.dateColumn && (filters.dateRange.from || filters.dateRange.to)) {\n const col = columns.find((c) => c.key === cfg.dateColumn);\n if (col) {\n const raw = col.accessor(row);\n const d = raw instanceof Date ? raw : raw ? new Date(raw as string | number) : null;\n if (!d || isNaN(d.getTime())) return false;\n const day = startOfDay(d);\n const from = filters.dateRange.from ?? day;\n const to = filters.dateRange.to ?? filters.dateRange.from ?? day;\n if (!isBetween(day, startOfDay(from), startOfDay(to))) return false;\n }\n }\n\n if (cfg.timeColumn && (filters.timeRange.from || filters.timeRange.to)) {\n const col = columns.find((c) => c.key === cfg.timeColumn);\n if (col) {\n const raw = col.accessor(row);\n const d = raw instanceof Date ? raw : raw ? new Date(raw as string | number) : null;\n if (!d || isNaN(d.getTime())) return false;\n const rowMin = d.getHours() * 60 + d.getMinutes();\n const { from, to } = filters.timeRange;\n const fromMin = from ? from.hours * 60 + from.minutes : null;\n const toMin = to ? to.hours * 60 + to.minutes : null;\n\n if (fromMin != null && toMin != null) {\n // from <= to is a same-day window; from > to wraps past midnight.\n const inWindow =\n fromMin <= toMin\n ? rowMin >= fromMin && rowMin <= toMin\n : rowMin >= fromMin || rowMin <= toMin;\n if (!inWindow) return false;\n } else if (fromMin != null) {\n if (rowMin < fromMin) return false;\n } else if (toMin != null) {\n if (rowMin > toMin) return false;\n }\n }\n }\n\n return true;\n });\n}\n\nexport function applySort<T>(\n rows: T[],\n columns: Column<T>[],\n sort: { key: string; dir: SortDir } | null,\n): T[] {\n if (!sort || !sort.dir) return rows;\n const col = columns.find((c) => c.key === sort.key);\n if (!col) return rows;\n const dirMul = sort.dir === 'asc' ? 1 : -1;\n const getter = col.sortBy ?? col.accessor;\n return [...rows].sort((a, b) => {\n const av = getter(a) as string | number | Date;\n const bv = getter(b) as string | number | Date;\n if (av == null && bv == null) return 0;\n if (av == null) return 1;\n if (bv == null) return -1;\n if (av instanceof Date && bv instanceof Date) {\n return (av.getTime() - bv.getTime()) * dirMul;\n }\n if (typeof av === 'number' && typeof bv === 'number') {\n return (av - bv) * dirMul;\n }\n return String(av).localeCompare(String(bv)) * dirMul;\n });\n}\n\nexport function paginate<T>(rows: T[], page: number, pageSize: number): T[] {\n const start = (page - 1) * pageSize;\n return rows.slice(start, start + pageSize);\n}\n","import type { Column } from './types';\n\n/* ────────────────────────────────────────────────────────────\n CSV (RFC 4180)\n ──────────────────────────────────────────────────────────── */\n\nfunction csvEscape(v: unknown): string {\n if (v == null) return '';\n const s = typeof v === 'string' ? v : v instanceof Date ? v.toISOString() : String(v);\n if (/[\",\\n\\r]/.test(s)) {\n return `\"${s.replace(/\"/g, '\"\"')}\"`;\n }\n return s;\n}\n\nexport function toCsv<T>(rows: T[], cols: Column<T>[]): string {\n const visible = cols.filter((c) => !c.defaultHidden);\n const header = visible.map((c) => csvEscape(c.header)).join(',');\n const body = rows\n .map((row) =>\n visible.map((c) => csvEscape(c.accessor(row))).join(','),\n )\n .join('\\n');\n return body ? `${header}\\n${body}` : header;\n}\n\nexport function fromCsv(text: string): Record<string, string>[] {\n const rows: string[][] = [];\n let cur: string[] = [];\n let field = '';\n let i = 0;\n let inQuotes = false;\n const len = text.length;\n\n while (i < len) {\n const ch = text[i];\n if (inQuotes) {\n if (ch === '\"') {\n if (text[i + 1] === '\"') {\n field += '\"';\n i += 2;\n continue;\n }\n inQuotes = false;\n i++;\n continue;\n }\n field += ch;\n i++;\n continue;\n }\n if (ch === '\"') {\n inQuotes = true;\n i++;\n continue;\n }\n if (ch === ',') {\n cur.push(field);\n field = '';\n i++;\n continue;\n }\n if (ch === '\\r') {\n i++;\n continue;\n }\n if (ch === '\\n') {\n cur.push(field);\n rows.push(cur);\n cur = [];\n field = '';\n i++;\n continue;\n }\n field += ch;\n i++;\n }\n if (field.length > 0 || cur.length > 0) {\n cur.push(field);\n rows.push(cur);\n }\n\n if (rows.length === 0) return [];\n const head = rows[0] ?? [];\n const body = rows.slice(1);\n return body.map((r) => {\n const obj: Record<string, string> = {};\n head.forEach((h, idx) => {\n obj[h] = r[idx] ?? '';\n });\n return obj;\n });\n}\n\n/* ────────────────────────────────────────────────────────────\n JSON\n ──────────────────────────────────────────────────────────── */\n\nexport function toJson<T>(rows: T[], cols: Column<T>[]): string {\n const visible = cols.filter((c) => !c.defaultHidden);\n const out = rows.map((row) => {\n const obj: Record<string, unknown> = {};\n visible.forEach((c) => {\n obj[c.key] = c.accessor(row);\n });\n return obj;\n });\n return JSON.stringify(out, null, 2);\n}\n\nexport function fromJson<T>(text: string): T[] {\n const parsed = JSON.parse(text);\n if (!Array.isArray(parsed)) {\n throw new Error('Expected a JSON array of rows');\n }\n return parsed as T[];\n}\n\n/* ────────────────────────────────────────────────────────────\n Download trigger\n ──────────────────────────────────────────────────────────── */\n\nexport function downloadString(text: string, filename: string, mime: string): void {\n if (typeof window === 'undefined') return;\n const blob = new Blob([text], { type: mime });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n a.remove();\n setTimeout(() => URL.revokeObjectURL(url), 1000);\n}\n","'use client';\n\nimport {\n useCallback,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type DragEvent,\n type PointerEvent as ReactPointerEvent,\n type ReactNode,\n} from 'react';\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n type FontSpec,\n} from '../table';\nimport { TableSearch } from '../table-search';\nimport { Pagination } from '../pagination';\nimport { DateRangePicker } from '../date-range-picker';\nimport type { DateRange } from '../date-range-picker';\nimport { TimeRangePicker, type TimeRangeValue } from '../time-picker';\nimport { ColumnMenu } from './ColumnMenu';\nimport { useTableLayout } from './useTableLayout';\nimport { applyFilters, applySort, paginate } from './filters';\nimport { downloadString, toCsv, toJson, fromCsv, fromJson } from './io';\nimport type {\n Column,\n DataTableProps,\n FilterState,\n SortDir,\n} from './types';\nimport './DataTable.css';\n\nfunction fontStyleFor(spec: FontSpec | undefined): CSSProperties | undefined {\n if (!spec) return undefined;\n if (typeof spec === 'string') return { fontFamily: spec };\n const s: CSSProperties = {};\n if (spec.family) s.fontFamily = spec.family;\n if (spec.size != null)\n s.fontSize = typeof spec.size === 'number' ? `${spec.size}px` : spec.size;\n if (spec.weight != null) s.fontWeight = spec.weight as number;\n if (spec.letterSpacing) s.letterSpacing = spec.letterSpacing;\n if (spec.featureSettings) s.fontFeatureSettings = spec.featureSettings;\n return s;\n}\n\nfunction renderCellValue(value: unknown, type?: Column<unknown>['type']): string {\n if (value == null) return '';\n if (value instanceof Date) {\n if (type === 'time') {\n return value.toLocaleTimeString([], {\n hour: '2-digit',\n minute: '2-digit',\n });\n }\n if (type === 'date') {\n return value.toLocaleDateString();\n }\n return value.toLocaleString();\n }\n return String(value);\n}\n\nexport function DataTable<T>({\n data,\n columns,\n getRowId,\n visibleRows = 7,\n rowHeight = 44,\n stickyHeader = true,\n density = 'cozy',\n loading,\n empty,\n fitColumns = false,\n search,\n dateFilter,\n timeFilter,\n pagination,\n reorderable = true,\n resizable = true,\n columnMenu = true,\n dataIO,\n headerFont,\n rowHeaderFont,\n cellFont,\n storageKey,\n className = '',\n toolbarExtras,\n}: DataTableProps<T>) {\n const {\n layout,\n orderedColumns,\n visibleColumns,\n reorder,\n resize,\n toggleHidden,\n reset,\n } = useTableLayout(columns, storageKey);\n\n /* ── filter state ─────────────────────────────────────── */\n const [filters, setFilters] = useState<FilterState>({\n search: '',\n dateRange: { from: null, to: null },\n timeRange: { from: null, to: null },\n });\n const [sort, setSort] = useState<{ key: string; dir: SortDir } | null>(null);\n const pageSize = pagination === false ? Infinity : pagination?.pageSize ?? 25;\n const [page, setPage] = useState(1);\n\n /* ── pipeline ─────────────────────────────────────────── */\n const filtered = useMemo(\n () =>\n applyFilters(data, columns, filters, {\n dateColumn: dateFilter?.column,\n timeColumn: timeFilter?.column,\n searchPredicate: search?.predicate,\n }),\n [data, columns, filters, dateFilter?.column, timeFilter?.column, search?.predicate],\n );\n\n const sorted = useMemo(() => applySort(filtered, columns, sort), [filtered, columns, sort]);\n\n const pageCount = pagination === false ? 1 : Math.max(1, Math.ceil(sorted.length / pageSize));\n const currentPage = Math.min(page, pageCount);\n\n const pageRows = useMemo(\n () => (pagination === false ? sorted : paginate(sorted, currentPage, pageSize)),\n [pagination, sorted, currentPage, pageSize],\n );\n\n /* ── column drag reorder ──────────────────────────────── */\n const [dragKey, setDragKey] = useState<string | null>(null);\n const [dropIndex, setDropIndex] = useState<number | null>(null);\n\n const onDragStart = (e: DragEvent<HTMLTableCellElement>, key: string) => {\n if (!reorderable) return;\n setDragKey(key);\n e.dataTransfer.effectAllowed = 'move';\n try {\n e.dataTransfer.setData('text/plain', key);\n } catch {\n /* IE/Safari quirks */\n }\n };\n\n const onDragOver = (e: DragEvent<HTMLTableCellElement>, idx: number) => {\n if (!reorderable || !dragKey) return;\n e.preventDefault();\n e.dataTransfer.dropEffect = 'move';\n const rect = e.currentTarget.getBoundingClientRect();\n const isRight = e.clientX - rect.left > rect.width / 2;\n setDropIndex(idx + (isRight ? 1 : 0));\n };\n\n const onDrop = (e: DragEvent<HTMLTableCellElement>) => {\n if (!reorderable || !dragKey || dropIndex == null) return;\n e.preventDefault();\n reorder(dragKey, dropIndex);\n setDragKey(null);\n setDropIndex(null);\n };\n\n const onDragEnd = () => {\n setDragKey(null);\n setDropIndex(null);\n };\n\n /* ── column resize ────────────────────────────────────── */\n const resizingKey = useRef<string | null>(null);\n const resizeStartX = useRef(0);\n const resizeStartW = useRef(0);\n\n const beginResize = (\n e: ReactPointerEvent<HTMLSpanElement>,\n key: string,\n ) => {\n if (!resizable) return;\n e.stopPropagation();\n e.preventDefault();\n const th = (e.currentTarget.parentElement as HTMLElement) ?? null;\n const startW = th ? th.getBoundingClientRect().width : 120;\n resizingKey.current = key;\n resizeStartX.current = e.clientX;\n resizeStartW.current = startW;\n window.addEventListener('pointermove', onResizeMove);\n window.addEventListener('pointerup', endResize);\n };\n\n const onResizeMove = (e: PointerEvent) => {\n if (!resizingKey.current) return;\n const dx = e.clientX - resizeStartX.current;\n const col = columns.find((c) => c.key === resizingKey.current);\n const min = col?.minWidth ?? 80;\n const max = col?.maxWidth ?? 2000;\n const next = Math.max(min, Math.min(max, resizeStartW.current + dx));\n resize(resizingKey.current, next);\n };\n\n const endResize = () => {\n resizingKey.current = null;\n window.removeEventListener('pointermove', onResizeMove);\n window.removeEventListener('pointerup', endResize);\n };\n\n const doubleClickReset = (key: string) => resize(key, null);\n\n /* ── sort handler ─────────────────────────────────────── */\n const cycleSort = useCallback((key: string) => {\n setSort((prev) => {\n if (!prev || prev.key !== key) return { key, dir: 'asc' };\n if (prev.dir === 'asc') return { key, dir: 'desc' };\n return null;\n });\n }, []);\n\n /* ── data IO ──────────────────────────────────────────── */\n const fileInput = useRef<HTMLInputElement>(null);\n const [ioFlash, setIoFlash] = useState<string | null>(null);\n const flashTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const flash = (text: string, ms = 1400) => {\n if (flashTimer.current) clearTimeout(flashTimer.current);\n setIoFlash(text);\n flashTimer.current = setTimeout(() => setIoFlash(null), ms);\n };\n\n const exportRows = (format: 'csv' | 'json') => {\n if (!dataIO?.export) return;\n const scope = dataIO.export.scope ?? 'filtered';\n let rows: T[];\n if (scope === 'all') rows = data;\n else if (scope === 'page') rows = pageRows;\n else rows = sorted;\n\n const cols = visibleColumns;\n const text = dataIO.export.serialize\n ? dataIO.export.serialize(rows, cols, format)\n : format === 'csv'\n ? toCsv(rows, cols)\n : toJson(rows, cols);\n\n const baseName =\n typeof dataIO.export.filename === 'function'\n ? dataIO.export.filename()\n : dataIO.export.filename ?? 'table-export';\n const filename = `${baseName}.${format}`;\n const mime = format === 'csv' ? 'text/csv;charset=utf-8' : 'application/json';\n downloadString(text, filename, mime);\n flash('Exported');\n };\n\n const onPickFile = async (file: File) => {\n if (!dataIO?.import) return;\n const text = await file.text();\n try {\n const parsed = dataIO.import.parse\n ? await dataIO.import.parse(text, file)\n : file.name.endsWith('.json')\n ? (fromJson(text) as T[])\n : (fromCsv(text) as unknown as T[]);\n dataIO.import.onImport(parsed as T[], {\n mode: dataIO.import.mode ?? 'replace',\n file,\n });\n flash(`Imported ${parsed.length} ${parsed.length === 1 ? 'row' : 'rows'}`);\n } catch (err) {\n dataIO.import.onError?.(err, file);\n flash(\"Couldn't read file\", 2000);\n }\n };\n\n /* ── render ───────────────────────────────────────────── */\n\n const showToolbar =\n search?.enabled ||\n !!dateFilter ||\n !!timeFilter ||\n columnMenu ||\n !!dataIO?.export?.enabled ||\n !!dataIO?.import?.enabled ||\n !!toolbarExtras;\n\n const exportFormats = dataIO?.export?.formats ?? ['csv', 'json'];\n const [exportMenuOpen, setExportMenuOpen] = useState(false);\n\n return (\n <div className={['royui-dt', className].filter(Boolean).join(' ')}>\n {showToolbar && (\n <div className=\"royui-dt__toolbar\">\n <div className=\"royui-dt__toolbar-left\">\n {search?.enabled && (\n <TableSearch\n value={filters.search}\n onChange={(v) => {\n setFilters((f) => ({ ...f, search: v }));\n setPage(1);\n }}\n placeholder={search.placeholder}\n debounceMs={search.debounceMs}\n />\n )}\n {dateFilter && (\n <DateRangePicker\n value={filters.dateRange}\n onChange={(r) => {\n setFilters((f) => ({ ...f, dateRange: r }));\n setPage(1);\n }}\n monthsVisible={dateFilter.monthsVisible ?? 2}\n placeholder={dateFilter.placeholder ?? 'Date range'}\n />\n )}\n {timeFilter && (\n <TimeRangePicker\n value={filters.timeRange}\n onChange={(r: TimeRangeValue) => {\n setFilters((f) => ({ ...f, timeRange: r }));\n setPage(1);\n }}\n variant={timeFilter.variant ?? 'analog'}\n hourCycle={timeFilter.hourCycle ?? 24}\n minuteStep={timeFilter.minuteStep ?? 1}\n placeholder={timeFilter.placeholder ?? 'Time range'}\n />\n )}\n </div>\n\n <div className=\"royui-dt__toolbar-right\">\n {toolbarExtras}\n {columnMenu && (\n <ColumnMenu\n columns={orderedColumns}\n layout={layout}\n onToggle={toggleHidden}\n onReset={reset}\n />\n )}\n {(dataIO?.export?.enabled || dataIO?.import?.enabled) && (\n <span className=\"royui-dt__sep\" aria-hidden>·</span>\n )}\n {dataIO?.export?.enabled && (\n <div className=\"royui-dt-io\">\n <button\n type=\"button\"\n className=\"royui-dt-io__btn\"\n onClick={() => {\n const only = exportFormats[0];\n if (exportFormats.length === 1 && only) {\n exportRows(only);\n } else {\n setExportMenuOpen((o) => !o);\n }\n }}\n >\n {ioFlash && ioFlash.startsWith('Export') ? ioFlash : 'Export'}\n </button>\n {exportMenuOpen && exportFormats.length > 1 && (\n <div\n className=\"royui-dt-io__menu\"\n onMouseLeave={() => setExportMenuOpen(false)}\n >\n {exportFormats.map((f) => (\n <button\n key={f}\n type=\"button\"\n className=\"royui-dt-io__menu-item\"\n onClick={() => {\n exportRows(f);\n setExportMenuOpen(false);\n }}\n >\n {f.toUpperCase()}\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n {dataIO?.import?.enabled && (\n <>\n <button\n type=\"button\"\n className=\"royui-dt-io__btn\"\n onClick={() => fileInput.current?.click()}\n >\n {ioFlash && (ioFlash.startsWith('Import') || ioFlash.startsWith(\"Couldn't\"))\n ? ioFlash\n : 'Import'}\n </button>\n <input\n ref={fileInput}\n type=\"file\"\n accept={dataIO.import.accept ?? '.csv,.json'}\n style={{ display: 'none' }}\n onChange={(e) => {\n const f = e.target.files?.[0];\n if (f) onPickFile(f);\n e.target.value = '';\n }}\n />\n </>\n )}\n </div>\n </div>\n )}\n\n <Table\n visibleRows={visibleRows}\n rowHeight={rowHeight}\n stickyHeader={stickyHeader}\n density={density}\n loading={loading}\n empty={empty}\n isEmpty={pageRows.length === 0}\n fitColumns={fitColumns}\n headerFont={headerFont}\n rowHeaderFont={rowHeaderFont}\n cellFont={cellFont}\n >\n <colgroup>\n {visibleColumns.map((c) => {\n const w = fitColumns ? undefined : layout.sizes[c.key];\n return (\n <col\n key={c.key}\n style={w ? { width: w } : undefined}\n className={dragKey === c.key ? 'royui-dt__col--dragging' : undefined}\n />\n );\n })}\n </colgroup>\n\n <TableHeader>\n <TableRow>\n {visibleColumns.map((c, idx) => {\n const isDragging = dragKey === c.key;\n const showDropBefore = dropIndex === idx;\n const sortDir =\n sort && sort.key === c.key && sort.dir ? sort.dir : null;\n const canReorder = reorderable && c.reorderable !== false && !c.pinned;\n const canResize = resizable && c.resizable !== false;\n\n return (\n <TableHead\n key={c.key}\n align={c.align ?? (c.type === 'number' ? 'right' : 'left')}\n className={[\n 'royui-dt__th',\n canReorder && 'royui-dt__th--reorderable',\n canResize && 'royui-dt__th--resizable',\n isDragging && 'royui-dt__th--dragging',\n showDropBefore && 'royui-dt__th--drop-before',\n ]\n .filter(Boolean)\n .join(' ')}\n draggable={canReorder}\n onDragStart={(e) => onDragStart(e, c.key)}\n onDragOver={(e) => onDragOver(e, idx)}\n onDrop={onDrop}\n onDragEnd={onDragEnd}\n title={\n canReorder && canResize\n ? 'Drag to reorder · drag the right edge to resize'\n : canReorder\n ? 'Drag to reorder'\n : canResize\n ? 'Drag the right edge to resize'\n : undefined\n }\n >\n <span\n className=\"royui-dt__th-inner\"\n onClick={() => cycleSort(c.key)}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n cycleSort(c.key);\n }\n }}\n >\n <span className=\"royui-dt__th-label\">{c.header}</span>\n {sortDir && (\n <span\n className={`royui-dt__sort-indicator royui-dt__sort-indicator--${sortDir}`}\n aria-hidden\n />\n )}\n </span>\n {canResize && (\n <span\n className=\"royui-dt__resize\"\n onPointerDown={(e) => beginResize(e, c.key)}\n onDoubleClick={() => doubleClickReset(c.key)}\n aria-hidden\n >\n <span className=\"royui-dt__resize-bar\" aria-hidden />\n </span>\n )}\n </TableHead>\n );\n })}\n {dropIndex === visibleColumns.length && (\n <TableHead className=\"royui-dt__th--drop-end\" aria-hidden />\n )}\n </TableRow>\n </TableHeader>\n\n <TableBody>\n {pageRows.map((row, i) => {\n const id = getRowId\n ? getRowId(row, i)\n : (row as Record<string, unknown>)?.['id'] != null\n ? String((row as Record<string, unknown>)['id'])\n : i;\n return (\n <TableRow key={id as string | number}>\n {visibleColumns.map((c) => {\n const value = c.accessor(row);\n const display = c.cell ? c.cell(value, row) : renderCellValue(value, c.type);\n const cellStyle = fontStyleFor(c.font);\n const isNum = c.type === 'number';\n return (\n <TableCell\n key={c.key}\n isRowHeader={c.isRowHeader}\n align={c.align ?? (isNum ? 'right' : 'left')}\n className={isNum ? 'royui-table__td--num' : undefined}\n style={cellStyle}\n >\n {display}\n </TableCell>\n );\n })}\n </TableRow>\n );\n })}\n </TableBody>\n </Table>\n\n {pagination !== false && pageCount > 1 && (\n <div className=\"royui-dt__pagination\">\n <Pagination\n page={currentPage}\n pageCount={pageCount}\n onPageChange={setPage}\n siblingCount={pagination?.siblingCount ?? 1}\n showSummary={pagination?.showSummary ?? true}\n summaryRender={(p, pc) =>\n `${(p - 1) * pageSize + 1}–${Math.min(p * pageSize, sorted.length)} of ${sorted.length}`\n }\n />\n </div>\n )}\n </div>\n );\n}\n"]}