@roy-ui/ui 0.0.7 → 0.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{Button-XBBWB5ZT.css → Button-OZLAH5NO.css} +60 -13
- package/dist/Table-qVdGZkB4.d.ts +42 -0
- package/dist/TimePicker-BhRta4MK.d.ts +39 -0
- package/dist/chunk-4SGMAZBG.js +161 -0
- package/dist/chunk-4SGMAZBG.js.map +1 -0
- package/dist/chunk-5CIBIH7R.js +98 -0
- package/dist/chunk-5CIBIH7R.js.map +1 -0
- package/dist/chunk-75IGGPXL.js +518 -0
- package/dist/chunk-75IGGPXL.js.map +1 -0
- package/dist/chunk-C5X3TE5U.js +87 -0
- package/dist/chunk-C5X3TE5U.js.map +1 -0
- package/dist/chunk-HUCK7AM7.js +840 -0
- package/dist/chunk-HUCK7AM7.js.map +1 -0
- package/dist/chunk-KSHKVSNK.js +82 -0
- package/dist/chunk-KSHKVSNK.js.map +1 -0
- package/dist/chunk-M6HB6BMA.js +101 -0
- package/dist/chunk-M6HB6BMA.js.map +1 -0
- package/dist/chunk-MDPMEW4K.js +58 -0
- package/dist/chunk-MDPMEW4K.js.map +1 -0
- package/dist/chunk-PGV55XSZ.js +107 -0
- package/dist/chunk-PGV55XSZ.js.map +1 -0
- package/dist/chunk-RLBVY3DG.js +64 -0
- package/dist/chunk-RLBVY3DG.js.map +1 -0
- package/dist/chunk-SFENGB5N.js +410 -0
- package/dist/chunk-SFENGB5N.js.map +1 -0
- package/dist/chunk-XERZVDIT.js +194 -0
- package/dist/chunk-XERZVDIT.js.map +1 -0
- package/dist/components/button/index.d.ts +37 -0
- package/dist/components/button/index.js +4 -0
- package/dist/components/button/index.js.map +1 -0
- package/dist/components/data-table/index.d.ts +145 -0
- package/dist/components/data-table/index.js +9 -0
- package/dist/components/data-table/index.js.map +1 -0
- package/dist/components/date-range-picker/index.d.ts +30 -0
- package/dist/components/date-range-picker/index.js +4 -0
- package/dist/components/date-range-picker/index.js.map +1 -0
- package/dist/components/gradient-button/index.d.ts +12 -0
- package/dist/components/gradient-button/index.js +4 -0
- package/dist/components/gradient-button/index.js.map +1 -0
- package/dist/components/made-by/index.d.ts +23 -0
- package/dist/components/made-by/index.js +4 -0
- package/dist/components/made-by/index.js.map +1 -0
- package/dist/components/pagination/index.d.ts +23 -0
- package/dist/components/pagination/index.js +4 -0
- package/dist/components/pagination/index.js.map +1 -0
- package/dist/components/popover/index.d.ts +18 -0
- package/dist/components/popover/index.js +4 -0
- package/dist/components/popover/index.js.map +1 -0
- package/dist/components/table/index.d.ts +28 -0
- package/dist/components/table/index.js +4 -0
- package/dist/components/table/index.js.map +1 -0
- package/dist/components/table-search/index.d.ts +19 -0
- package/dist/components/table-search/index.js +4 -0
- package/dist/components/table-search/index.js.map +1 -0
- package/dist/components/text-morph/index.d.ts +28 -0
- package/dist/components/text-morph/index.js +4 -0
- package/dist/components/text-morph/index.js.map +1 -0
- package/dist/components/time-picker/index.d.ts +14 -0
- package/dist/components/time-picker/index.js +4 -0
- package/dist/components/time-picker/index.js.map +1 -0
- package/dist/components/tree-nav/index.d.ts +30 -0
- package/dist/components/tree-nav/index.js +4 -0
- package/dist/components/tree-nav/index.js.map +1 -0
- package/dist/dateUtils-B_m_EICl.d.ts +14 -0
- package/dist/index.d.ts +17 -422
- package/dist/index.js +12 -2519
- package/dist/index.js.map +1 -1
- package/package.json +51 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/gradient-button/GradientButton.tsx"],"names":[],"mappings":";;;;;AAYA,IAAM,iBAAiB,sBACrB,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAwB,aAAA,EAAY,MAAA,EAClD,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAQ,WAAA,EAAY,KAAA,EAAM,MAAK,MAAA,EAAO,IAAA,EAAK,MAAK,MAAA,EACnD,QAAA,EAAA;AAAA,kBAAA,GAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,EAAA,EAAG,IAAA;AAAA,MACH,EAAA,EAAG,IAAA;AAAA,MACH,CAAA,EAAE,GAAA;AAAA,MACF,MAAA,EAAO,cAAA;AAAA,MACP,aAAA,EAAc,KAAA;AAAA,MACd,WAAA,EAAY;AAAA;AAAA,GACd;AAAA,kBACA,GAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,CAAA,EAAE,sBAAA;AAAA,MACF,MAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAY,KAAA;AAAA,MACZ,aAAA,EAAc;AAAA;AAAA;AAChB,CAAA,EACF,CAAA,EACF,CAAA;AAGK,IAAM,cAAA,GAAiB,UAAA;AAAA,EAC5B,CACE;AAAA,IACE,OAAA,GAAU,KAAA;AAAA,IACV,YAAA;AAAA,IACA,SAAA,GAAY,IAAA;AAAA,IACZ,QAAA;AAAA,IACA,SAAA,GAAY,EAAA;AAAA,IACZ,QAAA;AAAA,IACA,IAAA,GAAO,QAAA;AAAA,IACP,GAAG;AAAA,KAEL,GAAA,KACG;AACH,IAAA,MAAM,OAAA,GAAU;AAAA,MACd,cAAA;AAAA,MACA,YAAY,oBAAA,GAAuB,EAAA;AAAA,MACnC,UAAU,uBAAA,GAA0B,EAAA;AAAA,MACpC;AAAA,KACF,CACG,MAAA,CAAO,OAAO,CAAA,CACd,KAAK,GAAG,CAAA;AAEX,IAAA,uBACE,GAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,IAAA;AAAA,QACA,UAAU,QAAA,IAAY,OAAA;AAAA,QACtB,SAAA,EAAW,OAAA;AAAA,QACX,aAAW,OAAA,IAAW,MAAA;AAAA,QACrB,GAAG,IAAA;AAAA,QAEH,QAAA,EAAA,OAAA,GAAW,YAAA,oBAAgB,GAAA,CAAC,cAAA,EAAA,EAAe,CAAA,GAAM;AAAA;AAAA,KACpD;AAAA,EAEJ;AACF;AAEA,cAAA,CAAe,WAAA,GAAc,gBAAA","file":"chunk-RLBVY3DG.js","sourcesContent":["'use client';\n\nimport { forwardRef, type ButtonHTMLAttributes, type ReactNode } from 'react';\nimport './GradientButton.css';\n\nexport interface GradientButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n loading?: boolean;\n loadingLabel?: ReactNode;\n fullWidth?: boolean;\n children: ReactNode;\n}\n\nconst DefaultSpinner = () => (\n <span className=\"gradient-btn__spinner\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"none\">\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"9\"\n stroke=\"currentColor\"\n strokeOpacity=\"0.3\"\n strokeWidth=\"2.5\"\n />\n <path\n d=\"M21 12a9 9 0 0 0-9-9\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n </span>\n);\n\nexport const GradientButton = forwardRef<HTMLButtonElement, GradientButtonProps>(\n (\n {\n loading = false,\n loadingLabel,\n fullWidth = true,\n disabled,\n className = '',\n children,\n type = 'button',\n ...rest\n },\n ref,\n ) => {\n const classes = [\n 'gradient-btn',\n fullWidth ? 'gradient-btn--full' : '',\n loading ? 'gradient-btn--loading' : '',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <button\n ref={ref}\n type={type}\n disabled={disabled || loading}\n className={classes}\n aria-busy={loading || undefined}\n {...rest}\n >\n {loading ? (loadingLabel ?? <DefaultSpinner />) : children}\n </button>\n );\n },\n);\n\nGradientButton.displayName = 'GradientButton';\n"]}
|
|
@@ -0,0 +1,410 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useState, useRef, useEffect, useMemo } from 'react';
|
|
3
|
+
import './DateRangePicker-BCP26AOC.css';
|
|
4
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
// src/components/date-range-picker/DateRangePicker.tsx
|
|
7
|
+
|
|
8
|
+
// src/components/date-range-picker/dateUtils.ts
|
|
9
|
+
var MONTHS = [
|
|
10
|
+
"January",
|
|
11
|
+
"February",
|
|
12
|
+
"March",
|
|
13
|
+
"April",
|
|
14
|
+
"May",
|
|
15
|
+
"June",
|
|
16
|
+
"July",
|
|
17
|
+
"August",
|
|
18
|
+
"September",
|
|
19
|
+
"October",
|
|
20
|
+
"November",
|
|
21
|
+
"December"
|
|
22
|
+
];
|
|
23
|
+
var SHORT_MONTHS = [
|
|
24
|
+
"Jan",
|
|
25
|
+
"Feb",
|
|
26
|
+
"Mar",
|
|
27
|
+
"Apr",
|
|
28
|
+
"May",
|
|
29
|
+
"Jun",
|
|
30
|
+
"Jul",
|
|
31
|
+
"Aug",
|
|
32
|
+
"Sep",
|
|
33
|
+
"Oct",
|
|
34
|
+
"Nov",
|
|
35
|
+
"Dec"
|
|
36
|
+
];
|
|
37
|
+
var WEEKDAYS = ["S", "M", "T", "W", "T", "F", "S"];
|
|
38
|
+
function startOfDay(d) {
|
|
39
|
+
const n = new Date(d);
|
|
40
|
+
n.setHours(0, 0, 0, 0);
|
|
41
|
+
return n;
|
|
42
|
+
}
|
|
43
|
+
function isSameDay(a, b) {
|
|
44
|
+
if (!a || !b) return false;
|
|
45
|
+
return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();
|
|
46
|
+
}
|
|
47
|
+
function isSameMonth(a, b) {
|
|
48
|
+
return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth();
|
|
49
|
+
}
|
|
50
|
+
function addMonths(d, n) {
|
|
51
|
+
const x = new Date(d);
|
|
52
|
+
x.setDate(1);
|
|
53
|
+
x.setMonth(x.getMonth() + n);
|
|
54
|
+
return x;
|
|
55
|
+
}
|
|
56
|
+
function addDays(d, n) {
|
|
57
|
+
const x = new Date(d);
|
|
58
|
+
x.setDate(x.getDate() + n);
|
|
59
|
+
return x;
|
|
60
|
+
}
|
|
61
|
+
function isBefore(a, b) {
|
|
62
|
+
return a.getTime() < b.getTime();
|
|
63
|
+
}
|
|
64
|
+
function isAfter(a, b) {
|
|
65
|
+
return a.getTime() > b.getTime();
|
|
66
|
+
}
|
|
67
|
+
function isBetween(d, from, to) {
|
|
68
|
+
const t = d.getTime();
|
|
69
|
+
const a = Math.min(from.getTime(), to.getTime());
|
|
70
|
+
const b = Math.max(from.getTime(), to.getTime());
|
|
71
|
+
return t >= a && t <= b;
|
|
72
|
+
}
|
|
73
|
+
function clampToBounds(d, min, max) {
|
|
74
|
+
let r = d;
|
|
75
|
+
if (min && isBefore(r, min)) r = min;
|
|
76
|
+
if (max && isAfter(r, max)) r = max;
|
|
77
|
+
return r;
|
|
78
|
+
}
|
|
79
|
+
function getMonthGrid(year, month, weekStartsOn = 0) {
|
|
80
|
+
const first = new Date(year, month, 1);
|
|
81
|
+
const firstDow = first.getDay();
|
|
82
|
+
const offset = (firstDow - weekStartsOn + 7) % 7;
|
|
83
|
+
const gridStart = addDays(first, -offset);
|
|
84
|
+
const cells = [];
|
|
85
|
+
for (let i = 0; i < 42; i++) {
|
|
86
|
+
const date = addDays(gridStart, i);
|
|
87
|
+
cells.push({
|
|
88
|
+
date,
|
|
89
|
+
inMonth: date.getMonth() === month,
|
|
90
|
+
iso: date.toISOString().slice(0, 10)
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
return cells;
|
|
94
|
+
}
|
|
95
|
+
function getWeekdayLabels(weekStartsOn = 0) {
|
|
96
|
+
return Array.from({ length: 7 }, (_, i) => WEEKDAYS[(weekStartsOn + i) % 7] ?? "");
|
|
97
|
+
}
|
|
98
|
+
function formatMonthYear(d) {
|
|
99
|
+
return `${MONTHS[d.getMonth()] ?? ""} ${d.getFullYear()}`;
|
|
100
|
+
}
|
|
101
|
+
function formatShort(d) {
|
|
102
|
+
if (!d) return "";
|
|
103
|
+
const m = SHORT_MONTHS[d.getMonth()] ?? "";
|
|
104
|
+
const sameYear = d.getFullYear() === (/* @__PURE__ */ new Date()).getFullYear();
|
|
105
|
+
return sameYear ? `${m} ${d.getDate()}` : `${m} ${d.getDate()}, ${d.getFullYear()}`;
|
|
106
|
+
}
|
|
107
|
+
function formatRange(range) {
|
|
108
|
+
if (!range.from && !range.to) return "";
|
|
109
|
+
if (range.from && !range.to) return formatShort(range.from);
|
|
110
|
+
if (!range.from && range.to) return formatShort(range.to);
|
|
111
|
+
if (isSameDay(range.from, range.to)) return formatShort(range.from);
|
|
112
|
+
return `${formatShort(range.from)} \u2013 ${formatShort(range.to)}`;
|
|
113
|
+
}
|
|
114
|
+
var today = () => startOfDay(/* @__PURE__ */ new Date());
|
|
115
|
+
var DEFAULT_PRESETS = [
|
|
116
|
+
{ label: "Today", range: () => ({ from: today(), to: today() }) },
|
|
117
|
+
{
|
|
118
|
+
label: "Last 7 days",
|
|
119
|
+
range: () => ({ from: addDays(today(), -6), to: today() })
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
label: "Last 30 days",
|
|
123
|
+
range: () => ({ from: addDays(today(), -29), to: today() })
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
label: "This month",
|
|
127
|
+
range: () => {
|
|
128
|
+
const t = today();
|
|
129
|
+
return {
|
|
130
|
+
from: new Date(t.getFullYear(), t.getMonth(), 1),
|
|
131
|
+
to: t
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
label: "Last month",
|
|
137
|
+
range: () => {
|
|
138
|
+
const t = today();
|
|
139
|
+
const first = new Date(t.getFullYear(), t.getMonth() - 1, 1);
|
|
140
|
+
const last = new Date(t.getFullYear(), t.getMonth(), 0);
|
|
141
|
+
return { from: first, to: last };
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
];
|
|
145
|
+
function DateRangePicker({
|
|
146
|
+
value,
|
|
147
|
+
defaultValue,
|
|
148
|
+
onChange,
|
|
149
|
+
monthsVisible = 2,
|
|
150
|
+
weekStartsOn = 0,
|
|
151
|
+
minDate,
|
|
152
|
+
maxDate,
|
|
153
|
+
placeholder = "Pick a range",
|
|
154
|
+
presets = DEFAULT_PRESETS,
|
|
155
|
+
align = "left",
|
|
156
|
+
className = "",
|
|
157
|
+
style,
|
|
158
|
+
triggerLabel,
|
|
159
|
+
disabled
|
|
160
|
+
}) {
|
|
161
|
+
const controlled = value !== void 0;
|
|
162
|
+
const [internal, setInternal] = useState(
|
|
163
|
+
defaultValue ?? { from: null, to: null }
|
|
164
|
+
);
|
|
165
|
+
const current = controlled ? value : internal;
|
|
166
|
+
const [open, setOpen] = useState(false);
|
|
167
|
+
const [draft, setDraft] = useState(current);
|
|
168
|
+
const [hover, setHover] = useState(null);
|
|
169
|
+
const [anchorMonth, setAnchorMonth] = useState(
|
|
170
|
+
() => startOfDay(current.from ?? today())
|
|
171
|
+
);
|
|
172
|
+
const wrap = useRef(null);
|
|
173
|
+
useEffect(() => {
|
|
174
|
+
if (!open) return;
|
|
175
|
+
function onDown(e) {
|
|
176
|
+
if (wrap.current && !wrap.current.contains(e.target)) {
|
|
177
|
+
setOpen(false);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
function onKey(e) {
|
|
181
|
+
if (e.key === "Escape") setOpen(false);
|
|
182
|
+
}
|
|
183
|
+
document.addEventListener("mousedown", onDown);
|
|
184
|
+
document.addEventListener("keydown", onKey);
|
|
185
|
+
return () => {
|
|
186
|
+
document.removeEventListener("mousedown", onDown);
|
|
187
|
+
document.removeEventListener("keydown", onKey);
|
|
188
|
+
};
|
|
189
|
+
}, [open]);
|
|
190
|
+
useEffect(() => {
|
|
191
|
+
if (open) {
|
|
192
|
+
setDraft(current);
|
|
193
|
+
setHover(null);
|
|
194
|
+
setAnchorMonth(startOfDay(current.from ?? today()));
|
|
195
|
+
}
|
|
196
|
+
}, [open]);
|
|
197
|
+
const months = useMemo(() => {
|
|
198
|
+
return Array.from({ length: monthsVisible }, (_, i) => addMonths(anchorMonth, i));
|
|
199
|
+
}, [anchorMonth, monthsVisible]);
|
|
200
|
+
const commit = (next) => {
|
|
201
|
+
if (!controlled) setInternal(next);
|
|
202
|
+
onChange?.(next);
|
|
203
|
+
};
|
|
204
|
+
const apply = () => {
|
|
205
|
+
commit(draft);
|
|
206
|
+
setOpen(false);
|
|
207
|
+
};
|
|
208
|
+
const clear = () => {
|
|
209
|
+
setDraft({ from: null, to: null });
|
|
210
|
+
setHover(null);
|
|
211
|
+
};
|
|
212
|
+
const selectDay = (d) => {
|
|
213
|
+
const day = startOfDay(d);
|
|
214
|
+
const { from, to } = draft;
|
|
215
|
+
if (!from || from && to) {
|
|
216
|
+
setDraft({ from: day, to: null });
|
|
217
|
+
setHover(day);
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
if (isBefore(day, from)) {
|
|
221
|
+
setDraft({ from: day, to: from });
|
|
222
|
+
} else {
|
|
223
|
+
setDraft({ from, to: day });
|
|
224
|
+
}
|
|
225
|
+
};
|
|
226
|
+
const isDisabled = (d) => {
|
|
227
|
+
if (minDate && isBefore(d, startOfDay(minDate))) return true;
|
|
228
|
+
if (maxDate && isAfter(d, startOfDay(maxDate))) return true;
|
|
229
|
+
return false;
|
|
230
|
+
};
|
|
231
|
+
const previewTo = !draft.to && draft.from && hover ? hover : draft.to;
|
|
232
|
+
const previewRange = { from: draft.from, to: previewTo };
|
|
233
|
+
return /* @__PURE__ */ jsxs(
|
|
234
|
+
"div",
|
|
235
|
+
{
|
|
236
|
+
ref: wrap,
|
|
237
|
+
className: ["royui-drp", className].filter(Boolean).join(" "),
|
|
238
|
+
style,
|
|
239
|
+
children: [
|
|
240
|
+
/* @__PURE__ */ jsxs(
|
|
241
|
+
"button",
|
|
242
|
+
{
|
|
243
|
+
type: "button",
|
|
244
|
+
className: "royui-drp__trigger",
|
|
245
|
+
onClick: () => !disabled && setOpen((o) => !o),
|
|
246
|
+
"aria-haspopup": "dialog",
|
|
247
|
+
"aria-expanded": open,
|
|
248
|
+
disabled,
|
|
249
|
+
children: [
|
|
250
|
+
/* @__PURE__ */ jsx("span", { className: "royui-drp__trigger-dot", "aria-hidden": true }),
|
|
251
|
+
/* @__PURE__ */ jsx("span", { className: "royui-drp__trigger-label", children: triggerLabel ?? (formatRange(current) || placeholder) })
|
|
252
|
+
]
|
|
253
|
+
}
|
|
254
|
+
),
|
|
255
|
+
open && /* @__PURE__ */ jsxs(
|
|
256
|
+
"div",
|
|
257
|
+
{
|
|
258
|
+
className: `royui-drp__panel royui-drp__panel--${align}`,
|
|
259
|
+
role: "dialog",
|
|
260
|
+
"aria-label": "Choose date range",
|
|
261
|
+
children: [
|
|
262
|
+
presets.length > 0 && /* @__PURE__ */ jsx("div", { className: "royui-drp__presets", children: presets.map((p) => {
|
|
263
|
+
const r = p.range();
|
|
264
|
+
const isActive = isSameDay(draft.from, r.from) && isSameDay(draft.to, r.to);
|
|
265
|
+
return /* @__PURE__ */ jsx(
|
|
266
|
+
"button",
|
|
267
|
+
{
|
|
268
|
+
type: "button",
|
|
269
|
+
className: [
|
|
270
|
+
"royui-drp__preset",
|
|
271
|
+
isActive && "royui-drp__preset--active"
|
|
272
|
+
].filter(Boolean).join(" "),
|
|
273
|
+
onClick: () => {
|
|
274
|
+
const next = {
|
|
275
|
+
from: r.from ? startOfDay(clampToBounds(r.from, minDate, maxDate)) : null,
|
|
276
|
+
to: r.to ? startOfDay(clampToBounds(r.to, minDate, maxDate)) : null
|
|
277
|
+
};
|
|
278
|
+
setDraft(next);
|
|
279
|
+
if (next.from) setAnchorMonth(next.from);
|
|
280
|
+
},
|
|
281
|
+
children: p.label
|
|
282
|
+
},
|
|
283
|
+
p.label
|
|
284
|
+
);
|
|
285
|
+
}) }),
|
|
286
|
+
/* @__PURE__ */ jsxs("div", { className: "royui-drp__main", children: [
|
|
287
|
+
/* @__PURE__ */ jsxs("div", { className: "royui-drp__nav", children: [
|
|
288
|
+
/* @__PURE__ */ jsx(
|
|
289
|
+
"button",
|
|
290
|
+
{
|
|
291
|
+
type: "button",
|
|
292
|
+
className: "royui-drp__nav-btn",
|
|
293
|
+
onClick: () => setAnchorMonth(addMonths(anchorMonth, -1)),
|
|
294
|
+
"aria-label": "Previous month",
|
|
295
|
+
children: "Prev"
|
|
296
|
+
}
|
|
297
|
+
),
|
|
298
|
+
/* @__PURE__ */ jsx(
|
|
299
|
+
"button",
|
|
300
|
+
{
|
|
301
|
+
type: "button",
|
|
302
|
+
className: "royui-drp__nav-btn",
|
|
303
|
+
onClick: () => setAnchorMonth(addMonths(anchorMonth, 1)),
|
|
304
|
+
"aria-label": "Next month",
|
|
305
|
+
children: "Next"
|
|
306
|
+
}
|
|
307
|
+
)
|
|
308
|
+
] }),
|
|
309
|
+
/* @__PURE__ */ jsx("div", { className: "royui-drp__months", children: months.map((m) => /* @__PURE__ */ jsx(
|
|
310
|
+
MonthGrid,
|
|
311
|
+
{
|
|
312
|
+
month: m,
|
|
313
|
+
range: previewRange,
|
|
314
|
+
hover,
|
|
315
|
+
weekStartsOn,
|
|
316
|
+
isDisabled,
|
|
317
|
+
onSelect: selectDay,
|
|
318
|
+
onHover: (d) => setHover(d)
|
|
319
|
+
},
|
|
320
|
+
`${m.getFullYear()}-${m.getMonth()}`
|
|
321
|
+
)) }),
|
|
322
|
+
/* @__PURE__ */ jsxs("div", { className: "royui-drp__foot", children: [
|
|
323
|
+
/* @__PURE__ */ jsx("div", { className: "royui-drp__readout", children: formatRange(draft) || "Select start and end" }),
|
|
324
|
+
/* @__PURE__ */ jsxs("div", { className: "royui-drp__foot-actions", children: [
|
|
325
|
+
/* @__PURE__ */ jsx(
|
|
326
|
+
"button",
|
|
327
|
+
{
|
|
328
|
+
type: "button",
|
|
329
|
+
className: "royui-drp__ghost",
|
|
330
|
+
onClick: clear,
|
|
331
|
+
children: "Clear"
|
|
332
|
+
}
|
|
333
|
+
),
|
|
334
|
+
/* @__PURE__ */ jsx(
|
|
335
|
+
"button",
|
|
336
|
+
{
|
|
337
|
+
type: "button",
|
|
338
|
+
className: "royui-drp__primary",
|
|
339
|
+
onClick: apply,
|
|
340
|
+
disabled: !draft.from,
|
|
341
|
+
children: "Apply"
|
|
342
|
+
}
|
|
343
|
+
)
|
|
344
|
+
] })
|
|
345
|
+
] })
|
|
346
|
+
] })
|
|
347
|
+
]
|
|
348
|
+
}
|
|
349
|
+
)
|
|
350
|
+
]
|
|
351
|
+
}
|
|
352
|
+
);
|
|
353
|
+
}
|
|
354
|
+
function MonthGrid({
|
|
355
|
+
month,
|
|
356
|
+
range,
|
|
357
|
+
hover,
|
|
358
|
+
weekStartsOn,
|
|
359
|
+
isDisabled,
|
|
360
|
+
onSelect,
|
|
361
|
+
onHover
|
|
362
|
+
}) {
|
|
363
|
+
const grid = useMemo(
|
|
364
|
+
() => getMonthGrid(month.getFullYear(), month.getMonth(), weekStartsOn),
|
|
365
|
+
[month, weekStartsOn]
|
|
366
|
+
);
|
|
367
|
+
const labels = useMemo(() => getWeekdayLabels(weekStartsOn), [weekStartsOn]);
|
|
368
|
+
const todayD = today();
|
|
369
|
+
return /* @__PURE__ */ jsxs("div", { className: "royui-drp__month", children: [
|
|
370
|
+
/* @__PURE__ */ jsx("div", { className: "royui-drp__month-title", children: formatMonthYear(month) }),
|
|
371
|
+
/* @__PURE__ */ jsx("div", { className: "royui-drp__weekdays", children: labels.map((l, i) => /* @__PURE__ */ jsx("span", { className: "royui-drp__weekday", children: l }, i)) }),
|
|
372
|
+
/* @__PURE__ */ jsx("div", { className: "royui-drp__grid", onMouseLeave: () => onHover(null), children: grid.map((c) => {
|
|
373
|
+
const inMonth = isSameMonth(c.date, month);
|
|
374
|
+
const disabled = isDisabled(c.date);
|
|
375
|
+
const isStart = isSameDay(c.date, range.from);
|
|
376
|
+
const isEnd = isSameDay(c.date, range.to);
|
|
377
|
+
const isInRange = range.from && range.to && isBetween(c.date, range.from, range.to);
|
|
378
|
+
const isPreview = range.from && !range.to && hover && isBetween(c.date, range.from, hover);
|
|
379
|
+
const isTodayCell = isSameDay(c.date, todayD);
|
|
380
|
+
const classes = [
|
|
381
|
+
"royui-drp__day",
|
|
382
|
+
!inMonth && "royui-drp__day--out",
|
|
383
|
+
disabled && "royui-drp__day--disabled",
|
|
384
|
+
(isStart || isEnd) && "royui-drp__day--edge",
|
|
385
|
+
isStart && "royui-drp__day--start",
|
|
386
|
+
isEnd && "royui-drp__day--end",
|
|
387
|
+
(isInRange || isPreview) && "royui-drp__day--in",
|
|
388
|
+
isTodayCell && "royui-drp__day--today"
|
|
389
|
+
].filter(Boolean).join(" ");
|
|
390
|
+
return /* @__PURE__ */ jsx(
|
|
391
|
+
"button",
|
|
392
|
+
{
|
|
393
|
+
type: "button",
|
|
394
|
+
className: classes,
|
|
395
|
+
disabled,
|
|
396
|
+
tabIndex: inMonth ? 0 : -1,
|
|
397
|
+
onClick: () => inMonth && onSelect(c.date),
|
|
398
|
+
onMouseEnter: () => inMonth && onHover(c.date),
|
|
399
|
+
"aria-label": c.date.toDateString(),
|
|
400
|
+
children: /* @__PURE__ */ jsx("span", { children: c.date.getDate() })
|
|
401
|
+
},
|
|
402
|
+
c.iso
|
|
403
|
+
);
|
|
404
|
+
}) })
|
|
405
|
+
] });
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
export { DEFAULT_PRESETS, DateRangePicker, addDays, addMonths, formatMonthYear, formatRange, formatShort, isBetween, isSameDay, startOfDay };
|
|
409
|
+
//# sourceMappingURL=chunk-SFENGB5N.js.map
|
|
410
|
+
//# sourceMappingURL=chunk-SFENGB5N.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/date-range-picker/dateUtils.ts","../src/components/date-range-picker/DateRangePicker.tsx"],"names":[],"mappings":"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","file":"chunk-SFENGB5N.js","sourcesContent":["export type DateRange = { from: Date | null; to: Date | null };\n\nexport const MONTHS = [\n 'January', 'February', 'March', 'April', 'May', 'June',\n 'July', 'August', 'September', 'October', 'November', 'December',\n];\n\nexport const SHORT_MONTHS = [\n 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',\n 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec',\n];\n\nexport const WEEKDAYS = ['S', 'M', 'T', 'W', 'T', 'F', 'S'];\n\nexport function startOfDay(d: Date): Date {\n const n = new Date(d);\n n.setHours(0, 0, 0, 0);\n return n;\n}\n\nexport function isSameDay(a: Date | null | undefined, b: Date | null | undefined): boolean {\n if (!a || !b) return false;\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n );\n}\n\nexport function isSameMonth(a: Date, b: Date): boolean {\n return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth();\n}\n\nexport function addMonths(d: Date, n: number): Date {\n const x = new Date(d);\n x.setDate(1);\n x.setMonth(x.getMonth() + n);\n return x;\n}\n\nexport function addDays(d: Date, n: number): Date {\n const x = new Date(d);\n x.setDate(x.getDate() + n);\n return x;\n}\n\nexport function isBefore(a: Date, b: Date): boolean {\n return a.getTime() < b.getTime();\n}\n\nexport function isAfter(a: Date, b: Date): boolean {\n return a.getTime() > b.getTime();\n}\n\nexport function isBetween(d: Date, from: Date, to: Date): boolean {\n const t = d.getTime();\n const a = Math.min(from.getTime(), to.getTime());\n const b = Math.max(from.getTime(), to.getTime());\n return t >= a && t <= b;\n}\n\nexport function clampToBounds(d: Date, min?: Date | null, max?: Date | null): Date {\n let r = d;\n if (min && isBefore(r, min)) r = min;\n if (max && isAfter(r, max)) r = max;\n return r;\n}\n\nexport type DayCell = {\n date: Date;\n inMonth: boolean;\n iso: string;\n};\n\n/** Returns 6 rows × 7 days = 42 cells covering the month, padded with neighbors. */\nexport function getMonthGrid(year: number, month: number, weekStartsOn = 0): DayCell[] {\n const first = new Date(year, month, 1);\n const firstDow = first.getDay();\n const offset = (firstDow - weekStartsOn + 7) % 7;\n const gridStart = addDays(first, -offset);\n const cells: DayCell[] = [];\n for (let i = 0; i < 42; i++) {\n const date = addDays(gridStart, i);\n cells.push({\n date,\n inMonth: date.getMonth() === month,\n iso: date.toISOString().slice(0, 10),\n });\n }\n return cells;\n}\n\nexport function getWeekdayLabels(weekStartsOn = 0): string[] {\n return Array.from({ length: 7 }, (_, i) => WEEKDAYS[(weekStartsOn + i) % 7] ?? '');\n}\n\nexport function formatMonthYear(d: Date): string {\n return `${MONTHS[d.getMonth()] ?? ''} ${d.getFullYear()}`;\n}\n\nexport function formatShort(d: Date | null): string {\n if (!d) return '';\n const m = SHORT_MONTHS[d.getMonth()] ?? '';\n const sameYear = d.getFullYear() === new Date().getFullYear();\n return sameYear\n ? `${m} ${d.getDate()}`\n : `${m} ${d.getDate()}, ${d.getFullYear()}`;\n}\n\nexport function formatRange(range: DateRange): string {\n if (!range.from && !range.to) return '';\n if (range.from && !range.to) return formatShort(range.from);\n if (!range.from && range.to) return formatShort(range.to);\n if (isSameDay(range.from, range.to)) return formatShort(range.from);\n return `${formatShort(range.from)} – ${formatShort(range.to)}`;\n}\n","'use client';\n\nimport {\n useEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type ReactNode,\n} from 'react';\nimport {\n addDays,\n addMonths,\n clampToBounds,\n DateRange,\n formatMonthYear,\n formatRange,\n getMonthGrid,\n getWeekdayLabels,\n isAfter,\n isBefore,\n isBetween,\n isSameDay,\n isSameMonth,\n startOfDay,\n} from './dateUtils';\nimport './DateRangePicker.css';\n\nexport type DatePreset = {\n label: string;\n range: () => DateRange;\n};\n\nexport interface DateRangePickerProps {\n value?: DateRange;\n defaultValue?: DateRange;\n onChange?: (range: DateRange) => void;\n monthsVisible?: number;\n weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6;\n minDate?: Date | null;\n maxDate?: Date | null;\n placeholder?: string;\n presets?: DatePreset[];\n /** Render below the trigger when open. Default 'left'. */\n align?: 'left' | 'right';\n className?: string;\n style?: CSSProperties;\n triggerLabel?: ReactNode;\n disabled?: boolean;\n}\n\nconst today = () => startOfDay(new Date());\n\nexport const DEFAULT_PRESETS: DatePreset[] = [\n { label: 'Today', range: () => ({ from: today(), to: today() }) },\n {\n label: 'Last 7 days',\n range: () => ({ from: addDays(today(), -6), to: today() }),\n },\n {\n label: 'Last 30 days',\n range: () => ({ from: addDays(today(), -29), to: today() }),\n },\n {\n label: 'This month',\n range: () => {\n const t = today();\n return {\n from: new Date(t.getFullYear(), t.getMonth(), 1),\n to: t,\n };\n },\n },\n {\n label: 'Last month',\n range: () => {\n const t = today();\n const first = new Date(t.getFullYear(), t.getMonth() - 1, 1);\n const last = new Date(t.getFullYear(), t.getMonth(), 0);\n return { from: first, to: last };\n },\n },\n];\n\nexport function DateRangePicker({\n value,\n defaultValue,\n onChange,\n monthsVisible = 2,\n weekStartsOn = 0,\n minDate,\n maxDate,\n placeholder = 'Pick a range',\n presets = DEFAULT_PRESETS,\n align = 'left',\n className = '',\n style,\n triggerLabel,\n disabled,\n}: DateRangePickerProps) {\n const controlled = value !== undefined;\n const [internal, setInternal] = useState<DateRange>(\n defaultValue ?? { from: null, to: null },\n );\n const current = controlled ? value! : internal;\n\n const [open, setOpen] = useState(false);\n const [draft, setDraft] = useState<DateRange>(current);\n const [hover, setHover] = useState<Date | null>(null);\n const [anchorMonth, setAnchorMonth] = useState<Date>(() =>\n startOfDay(current.from ?? today()),\n );\n\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 useEffect(() => {\n if (open) {\n setDraft(current);\n setHover(null);\n setAnchorMonth(startOfDay(current.from ?? today()));\n }\n }, [open]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const months = useMemo(() => {\n return Array.from({ length: monthsVisible }, (_, i) => addMonths(anchorMonth, i));\n }, [anchorMonth, monthsVisible]);\n\n const commit = (next: DateRange) => {\n if (!controlled) setInternal(next);\n onChange?.(next);\n };\n\n const apply = () => {\n commit(draft);\n setOpen(false);\n };\n\n const clear = () => {\n setDraft({ from: null, to: null });\n setHover(null);\n };\n\n const selectDay = (d: Date) => {\n const day = startOfDay(d);\n const { from, to } = draft;\n if (!from || (from && to)) {\n setDraft({ from: day, to: null });\n setHover(day);\n return;\n }\n // from is set, to is null\n if (isBefore(day, from)) {\n setDraft({ from: day, to: from });\n } else {\n setDraft({ from, to: day });\n }\n };\n\n const isDisabled = (d: Date) => {\n if (minDate && isBefore(d, startOfDay(minDate))) return true;\n if (maxDate && isAfter(d, startOfDay(maxDate))) return true;\n return false;\n };\n\n const previewTo = !draft.to && draft.from && hover ? hover : draft.to;\n const previewRange: DateRange = { from: draft.from, to: previewTo };\n\n return (\n <div\n ref={wrap}\n className={['royui-drp', className].filter(Boolean).join(' ')}\n style={style}\n >\n <button\n type=\"button\"\n className=\"royui-drp__trigger\"\n onClick={() => !disabled && setOpen((o) => !o)}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n disabled={disabled}\n >\n <span className=\"royui-drp__trigger-dot\" aria-hidden />\n <span className=\"royui-drp__trigger-label\">\n {triggerLabel ?? (formatRange(current) || placeholder)}\n </span>\n </button>\n\n {open && (\n <div\n className={`royui-drp__panel royui-drp__panel--${align}`}\n role=\"dialog\"\n aria-label=\"Choose date range\"\n >\n {presets.length > 0 && (\n <div className=\"royui-drp__presets\">\n {presets.map((p) => {\n const r = p.range();\n const isActive =\n isSameDay(draft.from, r.from) && isSameDay(draft.to, r.to);\n return (\n <button\n key={p.label}\n type=\"button\"\n className={[\n 'royui-drp__preset',\n isActive && 'royui-drp__preset--active',\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={() => {\n const next = {\n from: r.from ? startOfDay(clampToBounds(r.from, minDate, maxDate)) : null,\n to: r.to ? startOfDay(clampToBounds(r.to, minDate, maxDate)) : null,\n };\n setDraft(next);\n if (next.from) setAnchorMonth(next.from);\n }}\n >\n {p.label}\n </button>\n );\n })}\n </div>\n )}\n\n <div className=\"royui-drp__main\">\n <div className=\"royui-drp__nav\">\n <button\n type=\"button\"\n className=\"royui-drp__nav-btn\"\n onClick={() => setAnchorMonth(addMonths(anchorMonth, -1))}\n aria-label=\"Previous month\"\n >\n Prev\n </button>\n <button\n type=\"button\"\n className=\"royui-drp__nav-btn\"\n onClick={() => setAnchorMonth(addMonths(anchorMonth, 1))}\n aria-label=\"Next month\"\n >\n Next\n </button>\n </div>\n\n <div className=\"royui-drp__months\">\n {months.map((m) => (\n <MonthGrid\n key={`${m.getFullYear()}-${m.getMonth()}`}\n month={m}\n range={previewRange}\n hover={hover}\n weekStartsOn={weekStartsOn}\n isDisabled={isDisabled}\n onSelect={selectDay}\n onHover={(d) => setHover(d)}\n />\n ))}\n </div>\n\n <div className=\"royui-drp__foot\">\n <div className=\"royui-drp__readout\">\n {formatRange(draft) || 'Select start and end'}\n </div>\n <div className=\"royui-drp__foot-actions\">\n <button\n type=\"button\"\n className=\"royui-drp__ghost\"\n onClick={clear}\n >\n Clear\n </button>\n <button\n type=\"button\"\n className=\"royui-drp__primary\"\n onClick={apply}\n disabled={!draft.from}\n >\n Apply\n </button>\n </div>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n}\n\nfunction MonthGrid({\n month,\n range,\n hover,\n weekStartsOn,\n isDisabled,\n onSelect,\n onHover,\n}: {\n month: Date;\n range: DateRange;\n hover: Date | null;\n weekStartsOn: number;\n isDisabled: (d: Date) => boolean;\n onSelect: (d: Date) => void;\n onHover: (d: Date | null) => void;\n}) {\n const grid = useMemo(\n () => getMonthGrid(month.getFullYear(), month.getMonth(), weekStartsOn),\n [month, weekStartsOn],\n );\n const labels = useMemo(() => getWeekdayLabels(weekStartsOn), [weekStartsOn]);\n const todayD = today();\n\n return (\n <div className=\"royui-drp__month\">\n <div className=\"royui-drp__month-title\">{formatMonthYear(month)}</div>\n <div className=\"royui-drp__weekdays\">\n {labels.map((l, i) => (\n <span key={i} className=\"royui-drp__weekday\">\n {l}\n </span>\n ))}\n </div>\n <div className=\"royui-drp__grid\" onMouseLeave={() => onHover(null)}>\n {grid.map((c) => {\n const inMonth = isSameMonth(c.date, month);\n const disabled = isDisabled(c.date);\n const isStart = isSameDay(c.date, range.from);\n const isEnd = isSameDay(c.date, range.to);\n const isInRange =\n range.from && range.to && isBetween(c.date, range.from, range.to);\n const isPreview =\n range.from && !range.to && hover && isBetween(c.date, range.from, hover);\n\n const isTodayCell = isSameDay(c.date, todayD);\n\n const classes = [\n 'royui-drp__day',\n !inMonth && 'royui-drp__day--out',\n disabled && 'royui-drp__day--disabled',\n (isStart || isEnd) && 'royui-drp__day--edge',\n isStart && 'royui-drp__day--start',\n isEnd && 'royui-drp__day--end',\n (isInRange || isPreview) && 'royui-drp__day--in',\n isTodayCell && 'royui-drp__day--today',\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <button\n key={c.iso}\n type=\"button\"\n className={classes}\n disabled={disabled}\n tabIndex={inMonth ? 0 : -1}\n onClick={() => inMonth && onSelect(c.date)}\n onMouseEnter={() => inMonth && onHover(c.date)}\n aria-label={c.date.toDateString()}\n >\n <span>{c.date.getDate()}</span>\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n"]}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { forwardRef } from 'react';
|
|
3
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
4
|
+
import './Table-YTEWR635.css';
|
|
5
|
+
|
|
6
|
+
// src/components/table/Table.tsx
|
|
7
|
+
function Spinner({
|
|
8
|
+
size = 16,
|
|
9
|
+
strokeWidth = 2,
|
|
10
|
+
label = "Loading",
|
|
11
|
+
style,
|
|
12
|
+
className = ""
|
|
13
|
+
}) {
|
|
14
|
+
const r = (size - strokeWidth) / 2;
|
|
15
|
+
const c = size / 2;
|
|
16
|
+
const circumference = 2 * Math.PI * r;
|
|
17
|
+
return /* @__PURE__ */ jsx(
|
|
18
|
+
"span",
|
|
19
|
+
{
|
|
20
|
+
role: "status",
|
|
21
|
+
"aria-label": label,
|
|
22
|
+
className: ["royui-spinner", className].filter(Boolean).join(" "),
|
|
23
|
+
style: { width: size, height: size, ...style },
|
|
24
|
+
children: /* @__PURE__ */ jsxs("svg", { width: size, height: size, viewBox: `0 0 ${size} ${size}`, "aria-hidden": true, children: [
|
|
25
|
+
/* @__PURE__ */ jsx(
|
|
26
|
+
"circle",
|
|
27
|
+
{
|
|
28
|
+
cx: c,
|
|
29
|
+
cy: c,
|
|
30
|
+
r,
|
|
31
|
+
fill: "none",
|
|
32
|
+
stroke: "currentColor",
|
|
33
|
+
strokeOpacity: 0.18,
|
|
34
|
+
strokeWidth
|
|
35
|
+
}
|
|
36
|
+
),
|
|
37
|
+
/* @__PURE__ */ jsx(
|
|
38
|
+
"circle",
|
|
39
|
+
{
|
|
40
|
+
cx: c,
|
|
41
|
+
cy: c,
|
|
42
|
+
r,
|
|
43
|
+
fill: "none",
|
|
44
|
+
stroke: "currentColor",
|
|
45
|
+
strokeWidth,
|
|
46
|
+
strokeLinecap: "round",
|
|
47
|
+
strokeDasharray: circumference,
|
|
48
|
+
strokeDashoffset: circumference * 0.72,
|
|
49
|
+
transform: `rotate(-90 ${c} ${c})`
|
|
50
|
+
}
|
|
51
|
+
)
|
|
52
|
+
] })
|
|
53
|
+
}
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
function fontVars(prefix, spec) {
|
|
57
|
+
if (!spec) return {};
|
|
58
|
+
const out = {};
|
|
59
|
+
if (typeof spec === "string") {
|
|
60
|
+
out[`${prefix}-font`] = spec;
|
|
61
|
+
return out;
|
|
62
|
+
}
|
|
63
|
+
if (spec.family) out[`${prefix}-font`] = spec.family;
|
|
64
|
+
if (spec.size != null)
|
|
65
|
+
out[`${prefix}-size`] = typeof spec.size === "number" ? `${spec.size}px` : spec.size;
|
|
66
|
+
if (spec.weight != null) out[`${prefix}-weight`] = String(spec.weight);
|
|
67
|
+
if (spec.letterSpacing) out[`${prefix}-tracking`] = spec.letterSpacing;
|
|
68
|
+
if (spec.featureSettings) out[`${prefix}-features`] = spec.featureSettings;
|
|
69
|
+
return out;
|
|
70
|
+
}
|
|
71
|
+
var Table = forwardRef(function Table2({
|
|
72
|
+
visibleRows = 7,
|
|
73
|
+
rowHeight = 44,
|
|
74
|
+
stickyHeader = true,
|
|
75
|
+
density = "cozy",
|
|
76
|
+
loading = false,
|
|
77
|
+
empty,
|
|
78
|
+
isEmpty = false,
|
|
79
|
+
fitColumns = false,
|
|
80
|
+
headerFont,
|
|
81
|
+
rowHeaderFont,
|
|
82
|
+
cellFont,
|
|
83
|
+
className = "",
|
|
84
|
+
style,
|
|
85
|
+
children,
|
|
86
|
+
tableProps,
|
|
87
|
+
...rest
|
|
88
|
+
}, ref) {
|
|
89
|
+
const headerH = 40;
|
|
90
|
+
const maxH = rowHeight * visibleRows + (stickyHeader ? headerH : 0);
|
|
91
|
+
const mergedStyle = {
|
|
92
|
+
...style,
|
|
93
|
+
["--royui-table-row-h"]: `${rowHeight}px`,
|
|
94
|
+
["--royui-table-max-h"]: `${maxH}px`,
|
|
95
|
+
...fontVars("--royui-table-header", headerFont),
|
|
96
|
+
...fontVars("--royui-table-row-header", rowHeaderFont),
|
|
97
|
+
...fontVars("--royui-table-cell", cellFont)
|
|
98
|
+
};
|
|
99
|
+
const classes = [
|
|
100
|
+
"royui-table",
|
|
101
|
+
`royui-table--${density}`,
|
|
102
|
+
stickyHeader && "royui-table--sticky",
|
|
103
|
+
loading && "royui-table--loading",
|
|
104
|
+
fitColumns && "royui-table--fit",
|
|
105
|
+
className
|
|
106
|
+
].filter(Boolean).join(" ");
|
|
107
|
+
return /* @__PURE__ */ jsx("div", { ref, className: classes, style: mergedStyle, ...rest, children: /* @__PURE__ */ jsxs("div", { className: "royui-table__scroll", role: "region", "aria-label": "Table", children: [
|
|
108
|
+
/* @__PURE__ */ jsx("table", { className: "royui-table__table", ...tableProps, children }),
|
|
109
|
+
isEmpty && !loading && /* @__PURE__ */ jsx("div", { className: "royui-table__empty", role: "status", children: empty ?? /* @__PURE__ */ jsx("span", { children: "No results" }) }),
|
|
110
|
+
loading && /* @__PURE__ */ jsx("div", { className: "royui-table__loading", "aria-hidden": true, children: /* @__PURE__ */ jsx(Spinner, { size: 18 }) })
|
|
111
|
+
] }) });
|
|
112
|
+
});
|
|
113
|
+
var TableHeader = forwardRef(function TableHeader2({ className = "", ...rest }, ref) {
|
|
114
|
+
return /* @__PURE__ */ jsx(
|
|
115
|
+
"thead",
|
|
116
|
+
{
|
|
117
|
+
ref,
|
|
118
|
+
className: ["royui-table__thead", className].filter(Boolean).join(" "),
|
|
119
|
+
...rest
|
|
120
|
+
}
|
|
121
|
+
);
|
|
122
|
+
});
|
|
123
|
+
var TableBody = forwardRef(function TableBody2({ className = "", ...rest }, ref) {
|
|
124
|
+
return /* @__PURE__ */ jsx(
|
|
125
|
+
"tbody",
|
|
126
|
+
{
|
|
127
|
+
ref,
|
|
128
|
+
className: ["royui-table__tbody", className].filter(Boolean).join(" "),
|
|
129
|
+
...rest
|
|
130
|
+
}
|
|
131
|
+
);
|
|
132
|
+
});
|
|
133
|
+
var TableRow = forwardRef(function TableRow2({ className = "", ...rest }, ref) {
|
|
134
|
+
return /* @__PURE__ */ jsx(
|
|
135
|
+
"tr",
|
|
136
|
+
{
|
|
137
|
+
ref,
|
|
138
|
+
className: ["royui-table__tr", className].filter(Boolean).join(" "),
|
|
139
|
+
...rest
|
|
140
|
+
}
|
|
141
|
+
);
|
|
142
|
+
});
|
|
143
|
+
var TableHead = forwardRef(
|
|
144
|
+
function TableHead2({ className = "", align = "left", ...rest }, ref) {
|
|
145
|
+
return /* @__PURE__ */ jsx(
|
|
146
|
+
"th",
|
|
147
|
+
{
|
|
148
|
+
ref,
|
|
149
|
+
scope: "col",
|
|
150
|
+
className: [
|
|
151
|
+
"royui-table__th",
|
|
152
|
+
align !== "left" && `royui-table__th--${align}`,
|
|
153
|
+
className
|
|
154
|
+
].filter(Boolean).join(" "),
|
|
155
|
+
...rest
|
|
156
|
+
}
|
|
157
|
+
);
|
|
158
|
+
}
|
|
159
|
+
);
|
|
160
|
+
var TableCell = forwardRef(
|
|
161
|
+
function TableCell2({ className = "", align = "left", isRowHeader, ...rest }, ref) {
|
|
162
|
+
if (isRowHeader) {
|
|
163
|
+
return /* @__PURE__ */ jsx(
|
|
164
|
+
"th",
|
|
165
|
+
{
|
|
166
|
+
ref,
|
|
167
|
+
scope: "row",
|
|
168
|
+
className: [
|
|
169
|
+
"royui-table__row-header",
|
|
170
|
+
align !== "left" && `royui-table__td--${align}`,
|
|
171
|
+
className
|
|
172
|
+
].filter(Boolean).join(" "),
|
|
173
|
+
...rest
|
|
174
|
+
}
|
|
175
|
+
);
|
|
176
|
+
}
|
|
177
|
+
return /* @__PURE__ */ jsx(
|
|
178
|
+
"td",
|
|
179
|
+
{
|
|
180
|
+
ref,
|
|
181
|
+
className: [
|
|
182
|
+
"royui-table__td",
|
|
183
|
+
align !== "left" && `royui-table__td--${align}`,
|
|
184
|
+
className
|
|
185
|
+
].filter(Boolean).join(" "),
|
|
186
|
+
...rest
|
|
187
|
+
}
|
|
188
|
+
);
|
|
189
|
+
}
|
|
190
|
+
);
|
|
191
|
+
|
|
192
|
+
export { Spinner, Table, TableBody, TableCell, TableHead, TableHeader, TableRow };
|
|
193
|
+
//# sourceMappingURL=chunk-XERZVDIT.js.map
|
|
194
|
+
//# sourceMappingURL=chunk-XERZVDIT.js.map
|