@parto-system-design/ui 1.1.5 → 1.1.7
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/AGENTS.md +233 -0
- package/LICENSE +21 -0
- package/README.md +96 -43
- package/dist/chunk-2UD3LGVX.cjs +316 -0
- package/dist/chunk-2UD3LGVX.cjs.map +1 -0
- package/dist/chunk-34JUCX2G.cjs +43 -0
- package/dist/chunk-34JUCX2G.cjs.map +1 -0
- package/dist/chunk-3AIJKXBV.cjs +242 -0
- package/dist/chunk-3AIJKXBV.cjs.map +1 -0
- package/dist/chunk-4SVQNEVH.js +173 -0
- package/dist/chunk-4SVQNEVH.js.map +1 -0
- package/dist/chunk-53QY4PD3.js +908 -0
- package/dist/chunk-53QY4PD3.js.map +1 -0
- package/dist/chunk-5JJSRGJD.js +31 -0
- package/dist/chunk-5JJSRGJD.js.map +1 -0
- package/dist/chunk-5K6E4ZSW.cjs +77 -0
- package/dist/chunk-5K6E4ZSW.cjs.map +1 -0
- package/dist/chunk-5NY26ULO.js +89 -0
- package/dist/chunk-5NY26ULO.js.map +1 -0
- package/dist/chunk-7RVPG3LE.cjs +231 -0
- package/dist/chunk-7RVPG3LE.cjs.map +1 -0
- package/dist/chunk-7Y4V3R3Y.cjs +120 -0
- package/dist/chunk-7Y4V3R3Y.cjs.map +1 -0
- package/dist/chunk-AXAY64KL.js +39 -0
- package/dist/chunk-AXAY64KL.js.map +1 -0
- package/dist/chunk-AYEK3WOM.js +207 -0
- package/dist/chunk-AYEK3WOM.js.map +1 -0
- package/dist/chunk-BRMBLIQG.js +53 -0
- package/dist/chunk-BRMBLIQG.js.map +1 -0
- package/dist/chunk-CAJKSTXX.cjs +54 -0
- package/dist/chunk-CAJKSTXX.cjs.map +1 -0
- package/dist/chunk-CKFWMHQU.js +401 -0
- package/dist/chunk-CKFWMHQU.js.map +1 -0
- package/dist/chunk-CV3N3HVK.js +672 -0
- package/dist/chunk-CV3N3HVK.js.map +1 -0
- package/dist/chunk-D2EBLE2B.cjs +220 -0
- package/dist/chunk-D2EBLE2B.cjs.map +1 -0
- package/dist/chunk-D5XCQDFS.js +92 -0
- package/dist/chunk-D5XCQDFS.js.map +1 -0
- package/dist/chunk-GDHRYKVM.js +45 -0
- package/dist/chunk-GDHRYKVM.js.map +1 -0
- package/dist/chunk-GKRAZGDI.cjs +84 -0
- package/dist/chunk-GKRAZGDI.cjs.map +1 -0
- package/dist/chunk-HEYMLQOV.cjs +94 -0
- package/dist/chunk-HEYMLQOV.cjs.map +1 -0
- package/dist/chunk-HF6XU5NI.js +84 -0
- package/dist/chunk-HF6XU5NI.js.map +1 -0
- package/dist/chunk-HJPDZOMJ.cjs +87 -0
- package/dist/chunk-HJPDZOMJ.cjs.map +1 -0
- package/dist/chunk-HUCC3QH5.cjs +53 -0
- package/dist/chunk-HUCC3QH5.cjs.map +1 -0
- package/dist/chunk-HYZ6BQPS.cjs +425 -0
- package/dist/chunk-HYZ6BQPS.cjs.map +1 -0
- package/dist/chunk-IQHKJ4SS.js +213 -0
- package/dist/chunk-IQHKJ4SS.js.map +1 -0
- package/dist/chunk-ISCSZMYW.cjs +106 -0
- package/dist/chunk-ISCSZMYW.cjs.map +1 -0
- package/dist/chunk-IXFEFIDO.js +82 -0
- package/dist/chunk-IXFEFIDO.js.map +1 -0
- package/dist/chunk-JUBHQAA2.js +53 -0
- package/dist/chunk-JUBHQAA2.js.map +1 -0
- package/dist/chunk-KCWRCSI7.js +62 -0
- package/dist/chunk-KCWRCSI7.js.map +1 -0
- package/dist/chunk-L2L5CKC2.js +291 -0
- package/dist/chunk-L2L5CKC2.js.map +1 -0
- package/dist/chunk-LLJR7FV3.js +135 -0
- package/dist/chunk-LLJR7FV3.js.map +1 -0
- package/dist/chunk-LZMCMZZF.js +118 -0
- package/dist/chunk-LZMCMZZF.js.map +1 -0
- package/dist/chunk-M5CHZ5BA.js +124 -0
- package/dist/chunk-M5CHZ5BA.js.map +1 -0
- package/dist/chunk-MBCTRNTG.js +89 -0
- package/dist/chunk-MBCTRNTG.js.map +1 -0
- package/dist/chunk-MEK4RSGC.js +65 -0
- package/dist/chunk-MEK4RSGC.js.map +1 -0
- package/dist/chunk-MFTX2DDQ.js +27 -0
- package/dist/chunk-MFTX2DDQ.js.map +1 -0
- package/dist/chunk-MKYVQQBV.cjs +114 -0
- package/dist/chunk-MKYVQQBV.cjs.map +1 -0
- package/dist/chunk-MQGQVI3W.cjs +950 -0
- package/dist/chunk-MQGQVI3W.cjs.map +1 -0
- package/dist/chunk-NEFZJHE4.cjs +157 -0
- package/dist/chunk-NEFZJHE4.cjs.map +1 -0
- package/dist/chunk-NEML6RCV.js +405 -0
- package/dist/chunk-NEML6RCV.js.map +1 -0
- package/dist/chunk-NV4JOKWL.cjs +197 -0
- package/dist/chunk-NV4JOKWL.cjs.map +1 -0
- package/dist/chunk-O2JG7WY5.cjs +121 -0
- package/dist/chunk-O2JG7WY5.cjs.map +1 -0
- package/dist/chunk-OEVMKFFL.cjs +140 -0
- package/dist/chunk-OEVMKFFL.cjs.map +1 -0
- package/dist/chunk-ONO2FTV4.cjs +68 -0
- package/dist/chunk-ONO2FTV4.cjs.map +1 -0
- package/dist/chunk-OS6CMYAS.cjs +79 -0
- package/dist/chunk-OS6CMYAS.cjs.map +1 -0
- package/dist/chunk-P5XHPNJG.cjs +430 -0
- package/dist/chunk-P5XHPNJG.cjs.map +1 -0
- package/dist/chunk-QJ7UB2ZQ.js +98 -0
- package/dist/chunk-QJ7UB2ZQ.js.map +1 -0
- package/dist/chunk-RA5KZNG5.js +269 -0
- package/dist/chunk-RA5KZNG5.js.map +1 -0
- package/dist/chunk-RJ3HYZ7S.js +44 -0
- package/dist/chunk-RJ3HYZ7S.js.map +1 -0
- package/dist/chunk-RZNRIOLT.js +128 -0
- package/dist/chunk-RZNRIOLT.js.map +1 -0
- package/dist/chunk-S5IPJQZ3.cjs +161 -0
- package/dist/chunk-S5IPJQZ3.cjs.map +1 -0
- package/dist/chunk-SB5DSYR5.js +211 -0
- package/dist/chunk-SB5DSYR5.js.map +1 -0
- package/dist/chunk-SCGW2BH4.cjs +69 -0
- package/dist/chunk-SCGW2BH4.cjs.map +1 -0
- package/dist/chunk-SCX6AR53.cjs +108 -0
- package/dist/chunk-SCX6AR53.cjs.map +1 -0
- package/dist/chunk-SFXV2DUH.js +106 -0
- package/dist/chunk-SFXV2DUH.js.map +1 -0
- package/dist/chunk-SXEPGD4Z.cjs +152 -0
- package/dist/chunk-SXEPGD4Z.cjs.map +1 -0
- package/dist/chunk-SZMVOHT7.cjs +107 -0
- package/dist/chunk-SZMVOHT7.cjs.map +1 -0
- package/dist/chunk-U5FLLCGC.cjs +151 -0
- package/dist/chunk-U5FLLCGC.cjs.map +1 -0
- package/dist/chunk-VO3B75F6.cjs +111 -0
- package/dist/chunk-VO3B75F6.cjs.map +1 -0
- package/dist/chunk-YAJWTNOX.js +106 -0
- package/dist/chunk-YAJWTNOX.js.map +1 -0
- package/dist/chunk-YC5KLN6I.js +139 -0
- package/dist/chunk-YC5KLN6I.js.map +1 -0
- package/dist/chunk-YE477L2H.cjs +272 -0
- package/dist/chunk-YE477L2H.cjs.map +1 -0
- package/dist/chunk-Z2TY4A75.cjs +700 -0
- package/dist/chunk-Z2TY4A75.cjs.map +1 -0
- package/dist/chunk-Z56O7UEU.cjs +136 -0
- package/dist/chunk-Z56O7UEU.cjs.map +1 -0
- package/dist/chunk-ZZFNJR2E.js +71 -0
- package/dist/chunk-ZZFNJR2E.js.map +1 -0
- package/dist/components/charts/PartoAreaChart.cjs +15 -0
- package/dist/components/charts/PartoAreaChart.cjs.map +1 -0
- package/dist/components/charts/PartoAreaChart.d.cts +51 -0
- package/dist/components/charts/PartoAreaChart.d.ts +51 -0
- package/dist/components/charts/PartoAreaChart.js +6 -0
- package/dist/components/charts/PartoAreaChart.js.map +1 -0
- package/dist/components/charts/PartoBarChart.cjs +15 -0
- package/dist/components/charts/PartoBarChart.cjs.map +1 -0
- package/dist/components/charts/PartoBarChart.d.cts +55 -0
- package/dist/components/charts/PartoBarChart.d.ts +55 -0
- package/dist/components/charts/PartoBarChart.js +6 -0
- package/dist/components/charts/PartoBarChart.js.map +1 -0
- package/dist/components/charts/PartoLineChart.cjs +15 -0
- package/dist/components/charts/PartoLineChart.cjs.map +1 -0
- package/dist/components/charts/PartoLineChart.d.cts +49 -0
- package/dist/components/charts/PartoLineChart.d.ts +49 -0
- package/dist/components/charts/PartoLineChart.js +6 -0
- package/dist/components/charts/PartoLineChart.js.map +1 -0
- package/dist/components/charts/PartoPieChart.cjs +15 -0
- package/dist/components/charts/PartoPieChart.cjs.map +1 -0
- package/dist/components/charts/PartoPieChart.d.cts +44 -0
- package/dist/components/charts/PartoPieChart.d.ts +44 -0
- package/dist/components/charts/PartoPieChart.js +6 -0
- package/dist/components/charts/PartoPieChart.js.map +1 -0
- package/dist/components/ui/alert-rule-card.cjs +15 -0
- package/dist/components/ui/alert-rule-card.cjs.map +1 -0
- package/dist/components/ui/alert-rule-card.d.cts +38 -0
- package/dist/components/ui/alert-rule-card.d.ts +38 -0
- package/dist/components/ui/alert-rule-card.js +6 -0
- package/dist/components/ui/alert-rule-card.js.map +1 -0
- package/dist/components/ui/avatar.cjs +21 -0
- package/dist/components/ui/avatar.cjs.map +1 -0
- package/dist/components/ui/avatar.d.cts +18 -0
- package/dist/components/ui/avatar.d.ts +18 -0
- package/dist/components/ui/avatar.js +4 -0
- package/dist/components/ui/avatar.js.map +1 -0
- package/dist/components/ui/badge.cjs +17 -0
- package/dist/components/ui/badge.cjs.map +1 -0
- package/dist/components/ui/badge.d.cts +16 -0
- package/dist/components/ui/badge.d.ts +16 -0
- package/dist/components/ui/badge.js +4 -0
- package/dist/components/ui/badge.js.map +1 -0
- package/dist/components/ui/button.cjs +18 -0
- package/dist/components/ui/button.cjs.map +1 -0
- package/dist/components/ui/button.d.cts +37 -0
- package/dist/components/ui/button.d.ts +37 -0
- package/dist/components/ui/button.js +5 -0
- package/dist/components/ui/button.js.map +1 -0
- package/dist/components/ui/calendar.cjs +15 -0
- package/dist/components/ui/calendar.cjs.map +1 -0
- package/dist/components/ui/calendar.d.cts +17 -0
- package/dist/components/ui/calendar.d.ts +17 -0
- package/dist/components/ui/calendar.js +6 -0
- package/dist/components/ui/calendar.js.map +1 -0
- package/dist/components/ui/card.cjs +37 -0
- package/dist/components/ui/card.cjs.map +1 -0
- package/dist/components/ui/card.d.cts +18 -0
- package/dist/components/ui/card.d.ts +18 -0
- package/dist/components/ui/card.js +4 -0
- package/dist/components/ui/card.js.map +1 -0
- package/dist/components/ui/concept-card.cjs +18 -0
- package/dist/components/ui/concept-card.cjs.map +1 -0
- package/dist/components/ui/concept-card.d.cts +5 -0
- package/dist/components/ui/concept-card.d.ts +5 -0
- package/dist/components/ui/concept-card.js +9 -0
- package/dist/components/ui/concept-card.js.map +1 -0
- package/dist/components/ui/data-table.cjs +18 -0
- package/dist/components/ui/data-table.cjs.map +1 -0
- package/dist/components/ui/data-table.d.cts +181 -0
- package/dist/components/ui/data-table.d.ts +181 -0
- package/dist/components/ui/data-table.js +9 -0
- package/dist/components/ui/data-table.js.map +1 -0
- package/dist/components/ui/dialog.cjs +49 -0
- package/dist/components/ui/dialog.cjs.map +1 -0
- package/dist/components/ui/dialog.d.cts +22 -0
- package/dist/components/ui/dialog.d.ts +22 -0
- package/dist/components/ui/dialog.js +4 -0
- package/dist/components/ui/dialog.js.map +1 -0
- package/dist/components/ui/filter-provider.cjs +20 -0
- package/dist/components/ui/filter-provider.cjs.map +1 -0
- package/dist/components/ui/filter-provider.d.cts +49 -0
- package/dist/components/ui/filter-provider.d.ts +49 -0
- package/dist/components/ui/filter-provider.js +3 -0
- package/dist/components/ui/filter-provider.js.map +1 -0
- package/dist/components/ui/input.cjs +22 -0
- package/dist/components/ui/input.cjs.map +1 -0
- package/dist/components/ui/input.d.cts +16 -0
- package/dist/components/ui/input.d.ts +16 -0
- package/dist/components/ui/input.js +5 -0
- package/dist/components/ui/input.js.map +1 -0
- package/dist/components/ui/iran-province-heat.cjs +13 -0
- package/dist/components/ui/iran-province-heat.cjs.map +1 -0
- package/dist/components/ui/iran-province-heat.d.cts +64 -0
- package/dist/components/ui/iran-province-heat.d.ts +64 -0
- package/dist/components/ui/iran-province-heat.js +4 -0
- package/dist/components/ui/iran-province-heat.js.map +1 -0
- package/dist/components/ui/page-card.cjs +16 -0
- package/dist/components/ui/page-card.cjs.map +1 -0
- package/dist/components/ui/page-card.d.cts +6 -0
- package/dist/components/ui/page-card.d.ts +6 -0
- package/dist/components/ui/page-card.js +7 -0
- package/dist/components/ui/page-card.js.map +1 -0
- package/dist/components/ui/popover.cjs +25 -0
- package/dist/components/ui/popover.cjs.map +1 -0
- package/dist/components/ui/popover.d.cts +9 -0
- package/dist/components/ui/popover.d.ts +9 -0
- package/dist/components/ui/popover.js +4 -0
- package/dist/components/ui/popover.js.map +1 -0
- package/dist/components/ui/saved-query-card.cjs +15 -0
- package/dist/components/ui/saved-query-card.cjs.map +1 -0
- package/dist/components/ui/saved-query-card.d.cts +41 -0
- package/dist/components/ui/saved-query-card.d.ts +41 -0
- package/dist/components/ui/saved-query-card.js +6 -0
- package/dist/components/ui/saved-query-card.js.map +1 -0
- package/dist/components/ui/separator.cjs +13 -0
- package/dist/components/ui/separator.cjs.map +1 -0
- package/dist/components/ui/separator.d.cts +9 -0
- package/dist/components/ui/separator.d.ts +9 -0
- package/dist/components/ui/separator.js +4 -0
- package/dist/components/ui/separator.js.map +1 -0
- package/dist/components/ui/sheet.cjs +45 -0
- package/dist/components/ui/sheet.cjs.map +1 -0
- package/dist/components/ui/sheet.d.cts +44 -0
- package/dist/components/ui/sheet.d.ts +44 -0
- package/dist/components/ui/sheet.js +4 -0
- package/dist/components/ui/sheet.js.map +1 -0
- package/dist/components/ui/sparkline.cjs +13 -0
- package/dist/components/ui/sparkline.cjs.map +1 -0
- package/dist/components/ui/sparkline.d.cts +36 -0
- package/dist/components/ui/sparkline.d.ts +36 -0
- package/dist/components/ui/sparkline.js +4 -0
- package/dist/components/ui/sparkline.js.map +1 -0
- package/dist/components/ui/tooltip.cjs +25 -0
- package/dist/components/ui/tooltip.cjs.map +1 -0
- package/dist/components/ui/tooltip.d.cts +17 -0
- package/dist/components/ui/tooltip.d.ts +17 -0
- package/dist/components/ui/tooltip.js +4 -0
- package/dist/components/ui/tooltip.js.map +1 -0
- package/dist/concept-card-CcOBb2Nz.d.ts +83 -0
- package/dist/concept-card-RwPbqJ06.d.cts +83 -0
- package/dist/hooks/use-hotkey-registry.cjs +21 -0
- package/dist/hooks/use-hotkey-registry.cjs.map +1 -0
- package/dist/hooks/use-hotkey-registry.d.cts +65 -0
- package/dist/hooks/use-hotkey-registry.d.ts +65 -0
- package/dist/hooks/use-hotkey-registry.js +4 -0
- package/dist/hooks/use-hotkey-registry.js.map +1 -0
- package/dist/hooks/use-hotkeys.cjs +16 -0
- package/dist/hooks/use-hotkeys.cjs.map +1 -0
- package/dist/hooks/use-hotkeys.d.cts +66 -0
- package/dist/hooks/use-hotkeys.d.ts +66 -0
- package/dist/hooks/use-hotkeys.js +3 -0
- package/dist/hooks/use-hotkeys.js.map +1 -0
- package/dist/i18n-ArS3mqj0.d.ts +344 -0
- package/dist/i18n-CAd9wGOr.d.cts +344 -0
- package/dist/index.cjs +7383 -10955
- package/dist/index.cjs.map +1 -1
- package/dist/index.css +157 -0
- package/dist/index.d.cts +726 -1144
- package/dist/index.d.ts +726 -1144
- package/dist/index.js +6735 -10912
- package/dist/index.js.map +1 -1
- package/dist/page-card-CO92oXkc.d.ts +100 -0
- package/dist/page-card-DOl50DqJ.d.cts +100 -0
- package/dist/utils-DlXWmDZ-.d.cts +35 -0
- package/dist/utils-DlXWmDZ-.d.ts +35 -0
- package/package.json +160 -4
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkNV4JOKWL_cjs = require('./chunk-NV4JOKWL.cjs');
|
|
4
|
+
var React = require('react');
|
|
5
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
6
|
+
|
|
7
|
+
function _interopNamespace(e) {
|
|
8
|
+
if (e && e.__esModule) return e;
|
|
9
|
+
var n = Object.create(null);
|
|
10
|
+
if (e) {
|
|
11
|
+
Object.keys(e).forEach(function (k) {
|
|
12
|
+
if (k !== 'default') {
|
|
13
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
14
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
15
|
+
enumerable: true,
|
|
16
|
+
get: function () { return e[k]; }
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
n.default = e;
|
|
22
|
+
return Object.freeze(n);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
26
|
+
|
|
27
|
+
var TREND_CLASSES = {
|
|
28
|
+
up: "text-[hsl(var(--sentiment-positive))]",
|
|
29
|
+
down: "text-[hsl(var(--sentiment-negative))]",
|
|
30
|
+
neutral: "text-[hsl(var(--sentiment-neutral))]"
|
|
31
|
+
};
|
|
32
|
+
function resolveTrend(data, trend) {
|
|
33
|
+
if (trend !== "auto") return trend;
|
|
34
|
+
if (data.length < 2) return "neutral";
|
|
35
|
+
const first = data[0];
|
|
36
|
+
const last = data[data.length - 1];
|
|
37
|
+
if (last > first) return "up";
|
|
38
|
+
if (last < first) return "down";
|
|
39
|
+
return "neutral";
|
|
40
|
+
}
|
|
41
|
+
var Sparkline = React__namespace.forwardRef(
|
|
42
|
+
({
|
|
43
|
+
className,
|
|
44
|
+
data,
|
|
45
|
+
variant = "line",
|
|
46
|
+
trend = "auto",
|
|
47
|
+
width = 80,
|
|
48
|
+
height = 24,
|
|
49
|
+
strokeWidth = 1.5,
|
|
50
|
+
showEndDot = false,
|
|
51
|
+
padding = 2,
|
|
52
|
+
color,
|
|
53
|
+
barGap = 1,
|
|
54
|
+
"aria-label": ariaLabel,
|
|
55
|
+
...props
|
|
56
|
+
}, ref) => {
|
|
57
|
+
const effectiveTrend = resolveTrend(data, trend);
|
|
58
|
+
const trendColorClass = color ? void 0 : TREND_CLASSES[effectiveTrend];
|
|
59
|
+
if (data.length === 0) {
|
|
60
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
61
|
+
"div",
|
|
62
|
+
{
|
|
63
|
+
ref,
|
|
64
|
+
"data-slot": "sparkline",
|
|
65
|
+
"data-empty": "true",
|
|
66
|
+
"aria-hidden": "true",
|
|
67
|
+
className: chunkNV4JOKWL_cjs.cn("inline-block", className),
|
|
68
|
+
style: { width, height },
|
|
69
|
+
...props
|
|
70
|
+
}
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
const min = Math.min(...data);
|
|
74
|
+
const max = Math.max(...data);
|
|
75
|
+
const range = max - min || 1;
|
|
76
|
+
const innerW = width - padding * 2;
|
|
77
|
+
const innerH = height - padding * 2;
|
|
78
|
+
const stepX = data.length > 1 ? innerW / (data.length - 1) : 0;
|
|
79
|
+
const yFor = (v) => padding + innerH - (v - min) / range * innerH;
|
|
80
|
+
const xFor = (i) => padding + i * stepX;
|
|
81
|
+
const points = data.map((v, i) => ({ x: xFor(i), y: yFor(v) }));
|
|
82
|
+
const linePath = points.map((p, i) => `${i === 0 ? "M" : "L"}${p.x.toFixed(2)} ${p.y.toFixed(2)}`).join(" ");
|
|
83
|
+
const areaPath = `${linePath} L${points[points.length - 1].x.toFixed(2)} ${(height - padding).toFixed(
|
|
84
|
+
2
|
|
85
|
+
)} L${points[0].x.toFixed(2)} ${(height - padding).toFixed(2)} Z`;
|
|
86
|
+
const stroke = color ?? "currentColor";
|
|
87
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
88
|
+
"div",
|
|
89
|
+
{
|
|
90
|
+
ref,
|
|
91
|
+
"data-slot": "sparkline",
|
|
92
|
+
"data-variant": variant,
|
|
93
|
+
"data-trend": effectiveTrend,
|
|
94
|
+
role: ariaLabel ? "img" : void 0,
|
|
95
|
+
"aria-label": ariaLabel,
|
|
96
|
+
"aria-hidden": ariaLabel ? void 0 : true,
|
|
97
|
+
className: chunkNV4JOKWL_cjs.cn("inline-block align-middle", trendColorClass, className),
|
|
98
|
+
style: { width, height },
|
|
99
|
+
...props,
|
|
100
|
+
children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
101
|
+
"svg",
|
|
102
|
+
{
|
|
103
|
+
width,
|
|
104
|
+
height,
|
|
105
|
+
viewBox: `0 0 ${width} ${height}`,
|
|
106
|
+
preserveAspectRatio: "none",
|
|
107
|
+
focusable: "false",
|
|
108
|
+
children: [
|
|
109
|
+
variant === "area" && /* @__PURE__ */ jsxRuntime.jsx("path", { d: areaPath, fill: stroke, opacity: 0.18 }),
|
|
110
|
+
(variant === "line" || variant === "area") && /* @__PURE__ */ jsxRuntime.jsx(
|
|
111
|
+
"path",
|
|
112
|
+
{
|
|
113
|
+
d: linePath,
|
|
114
|
+
fill: "none",
|
|
115
|
+
stroke,
|
|
116
|
+
strokeWidth,
|
|
117
|
+
strokeLinecap: "round",
|
|
118
|
+
strokeLinejoin: "round",
|
|
119
|
+
vectorEffect: "non-scaling-stroke"
|
|
120
|
+
}
|
|
121
|
+
),
|
|
122
|
+
variant === "bars" && data.map((v, i) => {
|
|
123
|
+
const gap = barGap;
|
|
124
|
+
const barW = Math.max(0, stepX - gap);
|
|
125
|
+
const y = yFor(v);
|
|
126
|
+
const barH = Math.max(1, height - padding - y);
|
|
127
|
+
const x = xFor(i) - barW / 2;
|
|
128
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
129
|
+
"rect",
|
|
130
|
+
{
|
|
131
|
+
x: x.toFixed(2),
|
|
132
|
+
y: y.toFixed(2),
|
|
133
|
+
width: barW.toFixed(2),
|
|
134
|
+
height: barH.toFixed(2),
|
|
135
|
+
rx: Math.min(1, barW / 3),
|
|
136
|
+
fill: stroke
|
|
137
|
+
},
|
|
138
|
+
i
|
|
139
|
+
);
|
|
140
|
+
}),
|
|
141
|
+
showEndDot && variant !== "bars" && /* @__PURE__ */ jsxRuntime.jsx(
|
|
142
|
+
"circle",
|
|
143
|
+
{
|
|
144
|
+
cx: points[points.length - 1].x.toFixed(2),
|
|
145
|
+
cy: points[points.length - 1].y.toFixed(2),
|
|
146
|
+
r: strokeWidth + 0.5,
|
|
147
|
+
fill: stroke
|
|
148
|
+
}
|
|
149
|
+
)
|
|
150
|
+
]
|
|
151
|
+
}
|
|
152
|
+
)
|
|
153
|
+
}
|
|
154
|
+
);
|
|
155
|
+
}
|
|
156
|
+
);
|
|
157
|
+
Sparkline.displayName = "Sparkline";
|
|
158
|
+
|
|
159
|
+
exports.Sparkline = Sparkline;
|
|
160
|
+
//# sourceMappingURL=chunk-S5IPJQZ3.cjs.map
|
|
161
|
+
//# sourceMappingURL=chunk-S5IPJQZ3.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/ui/sparkline.tsx"],"names":["React","jsx","cn","jsxs"],"mappings":"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","file":"chunk-S5IPJQZ3.cjs","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { cn } from '@/lib/utils'\n\nexport type SparklineTrend = 'up' | 'down' | 'neutral' | 'auto'\nexport type SparklineVariant = 'line' | 'area' | 'bars'\n\nexport interface SparklineProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Array of numeric data points. Must have at least 2 items to render line/area. */\n data: number[]\n /** Visual style @default \"line\" */\n variant?: SparklineVariant\n /**\n * Trend colour. `\"auto\"` compares first and last point:\n * last > first → up, last < first → down, equal → neutral.\n * Pass an explicit value to override.\n * @default \"auto\"\n */\n trend?: SparklineTrend\n /** Width in px. Also used as SVG viewBox width — output scales to parent when CSS overrides. @default 80 */\n width?: number\n /** Height in px @default 24 */\n height?: number\n /** Line / bar stroke width @default 1.5 */\n strokeWidth?: number\n /** Show a filled dot at the last point */\n showEndDot?: boolean\n /** Padding inside the viewBox so strokes/dots are not clipped @default 2 */\n padding?: number\n /** Override color with any CSS value (e.g. `\"hsl(var(--brand))\"`). Takes precedence over `trend`. */\n color?: string\n /** For bars variant — gap between bars in user units @default 1 */\n barGap?: number\n /** aria-label for screen readers — describe the trend / metric */\n 'aria-label'?: string\n}\n\nconst TREND_CLASSES: Record<Exclude<SparklineTrend, 'auto'>, string> = {\n up: 'text-[hsl(var(--sentiment-positive))]',\n down: 'text-[hsl(var(--sentiment-negative))]',\n neutral: 'text-[hsl(var(--sentiment-neutral))]',\n}\n\nfunction resolveTrend(data: number[], trend: SparklineTrend): Exclude<SparklineTrend, 'auto'> {\n if (trend !== 'auto') return trend\n if (data.length < 2) return 'neutral'\n const first = data[0]\n const last = data[data.length - 1]\n if (last > first) return 'up'\n if (last < first) return 'down'\n return 'neutral'\n}\n\nconst Sparkline = React.forwardRef<HTMLDivElement, SparklineProps>(\n (\n {\n className,\n data,\n variant = 'line',\n trend = 'auto',\n width = 80,\n height = 24,\n strokeWidth = 1.5,\n showEndDot = false,\n padding = 2,\n color,\n barGap = 1,\n 'aria-label': ariaLabel,\n ...props\n },\n ref\n ) => {\n const effectiveTrend = resolveTrend(data, trend)\n const trendColorClass = color ? undefined : TREND_CLASSES[effectiveTrend]\n\n if (data.length === 0) {\n return (\n <div\n ref={ref}\n data-slot=\"sparkline\"\n data-empty=\"true\"\n aria-hidden=\"true\"\n className={cn('inline-block', className)}\n style={{ width, height }}\n {...props}\n />\n )\n }\n\n const min = Math.min(...data)\n const max = Math.max(...data)\n const range = max - min || 1\n const innerW = width - padding * 2\n const innerH = height - padding * 2\n const stepX = data.length > 1 ? innerW / (data.length - 1) : 0\n const yFor = (v: number) => padding + innerH - ((v - min) / range) * innerH\n const xFor = (i: number) => padding + i * stepX\n\n const points = data.map((v, i) => ({ x: xFor(i), y: yFor(v) }))\n const linePath = points.map((p, i) => `${i === 0 ? 'M' : 'L'}${p.x.toFixed(2)} ${p.y.toFixed(2)}`).join(' ')\n const areaPath = `${linePath} L${points[points.length - 1].x.toFixed(2)} ${(height - padding).toFixed(\n 2\n )} L${points[0].x.toFixed(2)} ${(height - padding).toFixed(2)} Z`\n\n const stroke = color ?? 'currentColor'\n\n return (\n <div\n ref={ref}\n data-slot=\"sparkline\"\n data-variant={variant}\n data-trend={effectiveTrend}\n role={ariaLabel ? 'img' : undefined}\n aria-label={ariaLabel}\n aria-hidden={ariaLabel ? undefined : true}\n className={cn('inline-block align-middle', trendColorClass, className)}\n style={{ width, height }}\n {...props}\n >\n <svg\n width={width}\n height={height}\n viewBox={`0 0 ${width} ${height}`}\n preserveAspectRatio=\"none\"\n focusable=\"false\"\n >\n {variant === 'area' && <path d={areaPath} fill={stroke} opacity={0.18} />}\n {(variant === 'line' || variant === 'area') && (\n <path\n d={linePath}\n fill=\"none\"\n stroke={stroke}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n vectorEffect=\"non-scaling-stroke\"\n />\n )}\n {variant === 'bars' &&\n data.map((v, i) => {\n const gap = barGap\n const barW = Math.max(0, stepX - gap)\n const y = yFor(v)\n const barH = Math.max(1, height - padding - y)\n const x = xFor(i) - barW / 2\n return (\n <rect\n key={i}\n x={x.toFixed(2)}\n y={y.toFixed(2)}\n width={barW.toFixed(2)}\n height={barH.toFixed(2)}\n rx={Math.min(1, barW / 3)}\n fill={stroke}\n />\n )\n })}\n {showEndDot && variant !== 'bars' && (\n <circle\n cx={points[points.length - 1].x.toFixed(2)}\n cy={points[points.length - 1].y.toFixed(2)}\n r={strokeWidth + 0.5}\n fill={stroke}\n />\n )}\n </svg>\n </div>\n )\n }\n)\nSparkline.displayName = 'Sparkline'\n\nexport { Sparkline }\n"]}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
import { cn } from './chunk-4SVQNEVH.js';
|
|
2
|
+
import { cva } from 'class-variance-authority';
|
|
3
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
4
|
+
|
|
5
|
+
var skeletonVariants = cva("bg-accent animate-pulse", {
|
|
6
|
+
variants: {
|
|
7
|
+
shape: {
|
|
8
|
+
rect: "rounded-md",
|
|
9
|
+
line: "rounded-full h-4 w-full",
|
|
10
|
+
circle: "rounded-full",
|
|
11
|
+
text: "rounded h-4"
|
|
12
|
+
},
|
|
13
|
+
size: {
|
|
14
|
+
sm: "",
|
|
15
|
+
md: "",
|
|
16
|
+
lg: ""
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
compoundVariants: [
|
|
20
|
+
{ shape: "circle", size: "sm", class: "size-8" },
|
|
21
|
+
{ shape: "circle", size: "md", class: "size-10" },
|
|
22
|
+
{ shape: "circle", size: "lg", class: "size-14" }
|
|
23
|
+
],
|
|
24
|
+
defaultVariants: {
|
|
25
|
+
shape: "rect",
|
|
26
|
+
size: "md"
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
function Skeleton({ className, shape, size, count, ...props }) {
|
|
30
|
+
if (count && count > 1) {
|
|
31
|
+
return /* @__PURE__ */ jsx("div", { role: "status", "aria-busy": "true", "aria-label": "Loading", className: "space-y-2", children: Array.from({ length: count }).map((_, i) => /* @__PURE__ */ jsx(
|
|
32
|
+
"div",
|
|
33
|
+
{
|
|
34
|
+
"data-slot": "skeleton",
|
|
35
|
+
"aria-hidden": "true",
|
|
36
|
+
className: cn(skeletonVariants({ shape, size }), className)
|
|
37
|
+
},
|
|
38
|
+
i
|
|
39
|
+
)) });
|
|
40
|
+
}
|
|
41
|
+
return /* @__PURE__ */ jsx(
|
|
42
|
+
"div",
|
|
43
|
+
{
|
|
44
|
+
"data-slot": "skeleton",
|
|
45
|
+
role: "status",
|
|
46
|
+
"aria-busy": "true",
|
|
47
|
+
"aria-label": "Loading",
|
|
48
|
+
...props,
|
|
49
|
+
className: cn(skeletonVariants({ shape, size }), className)
|
|
50
|
+
}
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
Skeleton.displayName = "Skeleton";
|
|
54
|
+
function MetricCardSkeleton({ className }) {
|
|
55
|
+
return /* @__PURE__ */ jsxs(
|
|
56
|
+
"div",
|
|
57
|
+
{
|
|
58
|
+
"data-slot": "metric-card-skeleton",
|
|
59
|
+
role: "status",
|
|
60
|
+
"aria-busy": "true",
|
|
61
|
+
"aria-label": "Loading metric",
|
|
62
|
+
className: cn("rounded-lg border border-border bg-card p-4 space-y-3", className),
|
|
63
|
+
children: [
|
|
64
|
+
/* @__PURE__ */ jsx(Skeleton, { shape: "line", className: "h-3 w-1/3", "aria-hidden": "true" }),
|
|
65
|
+
/* @__PURE__ */ jsx(Skeleton, { shape: "rect", className: "h-8 w-1/2", "aria-hidden": "true" }),
|
|
66
|
+
/* @__PURE__ */ jsx(Skeleton, { shape: "line", className: "h-3 w-1/4", "aria-hidden": "true" })
|
|
67
|
+
]
|
|
68
|
+
}
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
MetricCardSkeleton.displayName = "MetricCardSkeleton";
|
|
72
|
+
function ChartSkeleton({ className }) {
|
|
73
|
+
return /* @__PURE__ */ jsx(
|
|
74
|
+
"div",
|
|
75
|
+
{
|
|
76
|
+
"data-slot": "chart-skeleton",
|
|
77
|
+
role: "status",
|
|
78
|
+
"aria-busy": "true",
|
|
79
|
+
"aria-label": "Loading chart",
|
|
80
|
+
className: cn("w-full rounded-md overflow-hidden", className),
|
|
81
|
+
children: /* @__PURE__ */ jsx(Skeleton, { shape: "rect", className: "w-full h-full min-h-[200px]", "aria-hidden": "true" })
|
|
82
|
+
}
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
ChartSkeleton.displayName = "ChartSkeleton";
|
|
86
|
+
function TableSkeleton({ rows = 5, className }) {
|
|
87
|
+
return /* @__PURE__ */ jsxs(
|
|
88
|
+
"div",
|
|
89
|
+
{
|
|
90
|
+
"data-slot": "table-skeleton",
|
|
91
|
+
role: "status",
|
|
92
|
+
"aria-busy": "true",
|
|
93
|
+
"aria-label": "Loading table",
|
|
94
|
+
className: cn("w-full rounded-md border border-border overflow-hidden", className),
|
|
95
|
+
children: [
|
|
96
|
+
/* @__PURE__ */ jsxs("div", { className: "flex gap-4 bg-muted/50 px-4 py-3 border-b border-border", "aria-hidden": "true", children: [
|
|
97
|
+
/* @__PURE__ */ jsx(Skeleton, { shape: "line", className: "h-4 flex-1" }),
|
|
98
|
+
/* @__PURE__ */ jsx(Skeleton, { shape: "line", className: "h-4 flex-1" }),
|
|
99
|
+
/* @__PURE__ */ jsx(Skeleton, { shape: "line", className: "h-4 flex-1" }),
|
|
100
|
+
/* @__PURE__ */ jsx(Skeleton, { shape: "line", className: "h-4 w-16" })
|
|
101
|
+
] }),
|
|
102
|
+
Array.from({ length: rows }).map((_, i) => /* @__PURE__ */ jsxs(
|
|
103
|
+
"div",
|
|
104
|
+
{
|
|
105
|
+
"aria-hidden": "true",
|
|
106
|
+
className: cn("flex gap-4 px-4 py-3", i !== rows - 1 && "border-b border-border"),
|
|
107
|
+
children: [
|
|
108
|
+
/* @__PURE__ */ jsx(Skeleton, { shape: "line", className: "h-4 flex-1" }),
|
|
109
|
+
/* @__PURE__ */ jsx(Skeleton, { shape: "line", className: "h-4 flex-1" }),
|
|
110
|
+
/* @__PURE__ */ jsx(Skeleton, { shape: "line", className: "h-4 flex-1" }),
|
|
111
|
+
/* @__PURE__ */ jsx(Skeleton, { shape: "line", className: "h-4 w-16" })
|
|
112
|
+
]
|
|
113
|
+
},
|
|
114
|
+
i
|
|
115
|
+
))
|
|
116
|
+
]
|
|
117
|
+
}
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
TableSkeleton.displayName = "TableSkeleton";
|
|
121
|
+
function TableRowSkeleton({ cells = 4, className }) {
|
|
122
|
+
return /* @__PURE__ */ jsx("tr", { "data-slot": "table-row-skeleton", "aria-busy": "true", className, children: Array.from({ length: cells }).map((_, i) => /* @__PURE__ */ jsx("td", { className: "px-3 py-2.5", "aria-hidden": "true", children: /* @__PURE__ */ jsx(Skeleton, { shape: "line", className: "h-3.5 w-full max-w-[140px]" }) }, i)) });
|
|
123
|
+
}
|
|
124
|
+
TableRowSkeleton.displayName = "TableRowSkeleton";
|
|
125
|
+
function CardSkeleton({
|
|
126
|
+
withImage = false,
|
|
127
|
+
imageAspect = "video",
|
|
128
|
+
bodyLines = 2,
|
|
129
|
+
withFooter = false,
|
|
130
|
+
className
|
|
131
|
+
}) {
|
|
132
|
+
const aspectClass = imageAspect === "square" ? "aspect-square" : imageAspect === "wide" ? "aspect-[21/9]" : "aspect-video";
|
|
133
|
+
return /* @__PURE__ */ jsxs(
|
|
134
|
+
"div",
|
|
135
|
+
{
|
|
136
|
+
"data-slot": "card-skeleton",
|
|
137
|
+
role: "status",
|
|
138
|
+
"aria-busy": "true",
|
|
139
|
+
"aria-label": "Loading card",
|
|
140
|
+
className: cn("rounded-lg border border-border bg-card overflow-hidden flex flex-col", className),
|
|
141
|
+
children: [
|
|
142
|
+
withImage && /* @__PURE__ */ jsx(Skeleton, { shape: "rect", className: cn("w-full", aspectClass), "aria-hidden": "true" }),
|
|
143
|
+
/* @__PURE__ */ jsxs("div", { className: "p-4 space-y-3 flex-1", children: [
|
|
144
|
+
/* @__PURE__ */ jsx(Skeleton, { shape: "line", className: "h-4 w-3/5", "aria-hidden": "true" }),
|
|
145
|
+
/* @__PURE__ */ jsx("div", { className: "space-y-2", children: Array.from({ length: bodyLines }).map((_, i) => /* @__PURE__ */ jsx(
|
|
146
|
+
Skeleton,
|
|
147
|
+
{
|
|
148
|
+
shape: "line",
|
|
149
|
+
className: cn("h-3", i === bodyLines - 1 ? "w-2/3" : "w-full"),
|
|
150
|
+
"aria-hidden": "true"
|
|
151
|
+
},
|
|
152
|
+
i
|
|
153
|
+
)) })
|
|
154
|
+
] }),
|
|
155
|
+
withFooter && /* @__PURE__ */ jsxs("div", { className: "p-4 border-t border-border flex items-center justify-between gap-2", children: [
|
|
156
|
+
/* @__PURE__ */ jsx(Skeleton, { shape: "line", className: "h-3 w-1/4", "aria-hidden": "true" }),
|
|
157
|
+
/* @__PURE__ */ jsx(Skeleton, { shape: "rect", className: "h-8 w-20", "aria-hidden": "true" })
|
|
158
|
+
] })
|
|
159
|
+
]
|
|
160
|
+
}
|
|
161
|
+
);
|
|
162
|
+
}
|
|
163
|
+
CardSkeleton.displayName = "CardSkeleton";
|
|
164
|
+
function AvatarTextSkeleton({ size = "md", lines = 2, className }) {
|
|
165
|
+
return /* @__PURE__ */ jsxs(
|
|
166
|
+
"div",
|
|
167
|
+
{
|
|
168
|
+
"data-slot": "avatar-text-skeleton",
|
|
169
|
+
role: "status",
|
|
170
|
+
"aria-busy": "true",
|
|
171
|
+
"aria-label": "Loading user",
|
|
172
|
+
className: cn("flex items-center gap-3", className),
|
|
173
|
+
children: [
|
|
174
|
+
/* @__PURE__ */ jsx(Skeleton, { shape: "circle", size, "aria-hidden": "true" }),
|
|
175
|
+
/* @__PURE__ */ jsx("div", { className: "flex-1 min-w-0 space-y-2", children: Array.from({ length: lines }).map((_, i) => /* @__PURE__ */ jsx(
|
|
176
|
+
Skeleton,
|
|
177
|
+
{
|
|
178
|
+
shape: "line",
|
|
179
|
+
className: cn("h-3", i === 0 ? "w-1/3" : i === lines - 1 ? "w-1/2" : "w-full"),
|
|
180
|
+
"aria-hidden": "true"
|
|
181
|
+
},
|
|
182
|
+
i
|
|
183
|
+
)) })
|
|
184
|
+
]
|
|
185
|
+
}
|
|
186
|
+
);
|
|
187
|
+
}
|
|
188
|
+
AvatarTextSkeleton.displayName = "AvatarTextSkeleton";
|
|
189
|
+
function FormRowSkeleton({ field = "input", withHelp = false, className }) {
|
|
190
|
+
const inputClass = field === "textarea" ? "h-20" : field === "select" ? "h-9" : "h-9";
|
|
191
|
+
return /* @__PURE__ */ jsxs(
|
|
192
|
+
"div",
|
|
193
|
+
{
|
|
194
|
+
"data-slot": "form-row-skeleton",
|
|
195
|
+
role: "status",
|
|
196
|
+
"aria-busy": "true",
|
|
197
|
+
"aria-label": "Loading form field",
|
|
198
|
+
className: cn("space-y-2", className),
|
|
199
|
+
children: [
|
|
200
|
+
/* @__PURE__ */ jsx(Skeleton, { shape: "line", className: "h-3 w-1/4", "aria-hidden": "true" }),
|
|
201
|
+
/* @__PURE__ */ jsx(Skeleton, { shape: "rect", className: cn("w-full", inputClass), "aria-hidden": "true" }),
|
|
202
|
+
withHelp && /* @__PURE__ */ jsx(Skeleton, { shape: "line", className: "h-2.5 w-1/3", "aria-hidden": "true" })
|
|
203
|
+
]
|
|
204
|
+
}
|
|
205
|
+
);
|
|
206
|
+
}
|
|
207
|
+
FormRowSkeleton.displayName = "FormRowSkeleton";
|
|
208
|
+
|
|
209
|
+
export { AvatarTextSkeleton, CardSkeleton, ChartSkeleton, FormRowSkeleton, MetricCardSkeleton, Skeleton, TableRowSkeleton, TableSkeleton };
|
|
210
|
+
//# sourceMappingURL=chunk-SB5DSYR5.js.map
|
|
211
|
+
//# sourceMappingURL=chunk-SB5DSYR5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/ui/skeleton.tsx"],"names":[],"mappings":"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","file":"chunk-SB5DSYR5.js","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '@/lib/utils'\n\nconst skeletonVariants = cva('bg-accent animate-pulse', {\n variants: {\n shape: {\n rect: 'rounded-md',\n line: 'rounded-full h-4 w-full',\n circle: 'rounded-full',\n text: 'rounded h-4',\n },\n size: {\n sm: '',\n md: '',\n lg: '',\n },\n },\n compoundVariants: [\n { shape: 'circle', size: 'sm', class: 'size-8' },\n { shape: 'circle', size: 'md', class: 'size-10' },\n { shape: 'circle', size: 'lg', class: 'size-14' },\n ],\n defaultVariants: {\n shape: 'rect',\n size: 'md',\n },\n})\n\nexport interface SkeletonProps extends React.HTMLAttributes<HTMLDivElement>, VariantProps<typeof skeletonVariants> {\n /**\n * تعداد عناصر skeleton برای نمایش (برای shape های line و text)\n * Number of skeleton elements to repeat (for line/text shapes)\n */\n count?: number\n}\n\nfunction Skeleton({ className, shape, size, count, ...props }: SkeletonProps) {\n if (count && count > 1) {\n return (\n <div role=\"status\" aria-busy=\"true\" aria-label=\"Loading\" className=\"space-y-2\">\n {Array.from({ length: count }).map((_, i) => (\n <div\n key={i}\n data-slot=\"skeleton\"\n aria-hidden=\"true\"\n className={cn(skeletonVariants({ shape, size }), className)}\n />\n ))}\n </div>\n )\n }\n\n return (\n <div\n data-slot=\"skeleton\"\n role=\"status\"\n aria-busy=\"true\"\n aria-label=\"Loading\"\n {...props}\n className={cn(skeletonVariants({ shape, size }), className)}\n />\n )\n}\n\nSkeleton.displayName = 'Skeleton'\n\n/* -------------------------------------------------------------------------- */\n/* Named Skeleton Presets */\n/* -------------------------------------------------------------------------- */\n\nexport interface MetricCardSkeletonProps {\n className?: string\n}\n\nfunction MetricCardSkeleton({ className }: MetricCardSkeletonProps) {\n return (\n <div\n data-slot=\"metric-card-skeleton\"\n role=\"status\"\n aria-busy=\"true\"\n aria-label=\"Loading metric\"\n className={cn('rounded-lg border border-border bg-card p-4 space-y-3', className)}\n >\n <Skeleton shape=\"line\" className=\"h-3 w-1/3\" aria-hidden=\"true\" />\n <Skeleton shape=\"rect\" className=\"h-8 w-1/2\" aria-hidden=\"true\" />\n <Skeleton shape=\"line\" className=\"h-3 w-1/4\" aria-hidden=\"true\" />\n </div>\n )\n}\nMetricCardSkeleton.displayName = 'MetricCardSkeleton'\n\nexport interface ChartSkeletonProps {\n className?: string\n}\n\nfunction ChartSkeleton({ className }: ChartSkeletonProps) {\n return (\n <div\n data-slot=\"chart-skeleton\"\n role=\"status\"\n aria-busy=\"true\"\n aria-label=\"Loading chart\"\n className={cn('w-full rounded-md overflow-hidden', className)}\n >\n <Skeleton shape=\"rect\" className=\"w-full h-full min-h-[200px]\" aria-hidden=\"true\" />\n </div>\n )\n}\nChartSkeleton.displayName = 'ChartSkeleton'\n\nexport interface TableSkeletonProps {\n rows?: number\n className?: string\n}\n\nfunction TableSkeleton({ rows = 5, className }: TableSkeletonProps) {\n return (\n <div\n data-slot=\"table-skeleton\"\n role=\"status\"\n aria-busy=\"true\"\n aria-label=\"Loading table\"\n className={cn('w-full rounded-md border border-border overflow-hidden', className)}\n >\n <div className=\"flex gap-4 bg-muted/50 px-4 py-3 border-b border-border\" aria-hidden=\"true\">\n <Skeleton shape=\"line\" className=\"h-4 flex-1\" />\n <Skeleton shape=\"line\" className=\"h-4 flex-1\" />\n <Skeleton shape=\"line\" className=\"h-4 flex-1\" />\n <Skeleton shape=\"line\" className=\"h-4 w-16\" />\n </div>\n {Array.from({ length: rows }).map((_, i) => (\n <div\n key={i}\n aria-hidden=\"true\"\n className={cn('flex gap-4 px-4 py-3', i !== rows - 1 && 'border-b border-border')}\n >\n <Skeleton shape=\"line\" className=\"h-4 flex-1\" />\n <Skeleton shape=\"line\" className=\"h-4 flex-1\" />\n <Skeleton shape=\"line\" className=\"h-4 flex-1\" />\n <Skeleton shape=\"line\" className=\"h-4 w-16\" />\n </div>\n ))}\n </div>\n )\n}\nTableSkeleton.displayName = 'TableSkeleton'\n\n/* -------------------------------------------------------------------------- */\n/* TableRowSkeleton — a single row inside an existing table */\n/* -------------------------------------------------------------------------- */\n\nexport interface TableRowSkeletonProps {\n /** Number of cells in the row */\n cells?: number\n className?: string\n}\n\nfunction TableRowSkeleton({ cells = 4, className }: TableRowSkeletonProps) {\n // Don't assign role=\"status\" to <tr> — it's a table-row element and\n // ARIA disallows that combination. The cell <td>s carry aria-hidden so\n // screen readers stay quiet during the brief loading window.\n return (\n <tr data-slot=\"table-row-skeleton\" aria-busy=\"true\" className={className}>\n {Array.from({ length: cells }).map((_, i) => (\n <td key={i} className=\"px-3 py-2.5\" aria-hidden=\"true\">\n <Skeleton shape=\"line\" className=\"h-3.5 w-full max-w-[140px]\" />\n </td>\n ))}\n </tr>\n )\n}\nTableRowSkeleton.displayName = 'TableRowSkeleton'\n\n/* -------------------------------------------------------------------------- */\n/* CardSkeleton — typical card with title + body lines + optional image */\n/* -------------------------------------------------------------------------- */\n\nexport interface CardSkeletonProps {\n /** Show a leading image/thumbnail block @default false */\n withImage?: boolean\n /** Aspect ratio of the image (when withImage) @default 'video' */\n imageAspect?: 'video' | 'square' | 'wide'\n /** Number of body lines @default 2 */\n bodyLines?: number\n /** Show a footer row (button-shaped placeholder) @default false */\n withFooter?: boolean\n className?: string\n}\n\nfunction CardSkeleton({\n withImage = false,\n imageAspect = 'video',\n bodyLines = 2,\n withFooter = false,\n className,\n}: CardSkeletonProps) {\n const aspectClass =\n imageAspect === 'square' ? 'aspect-square' : imageAspect === 'wide' ? 'aspect-[21/9]' : 'aspect-video'\n return (\n <div\n data-slot=\"card-skeleton\"\n role=\"status\"\n aria-busy=\"true\"\n aria-label=\"Loading card\"\n className={cn('rounded-lg border border-border bg-card overflow-hidden flex flex-col', className)}\n >\n {withImage && <Skeleton shape=\"rect\" className={cn('w-full', aspectClass)} aria-hidden=\"true\" />}\n <div className=\"p-4 space-y-3 flex-1\">\n <Skeleton shape=\"line\" className=\"h-4 w-3/5\" aria-hidden=\"true\" />\n <div className=\"space-y-2\">\n {Array.from({ length: bodyLines }).map((_, i) => (\n <Skeleton\n key={i}\n shape=\"line\"\n className={cn('h-3', i === bodyLines - 1 ? 'w-2/3' : 'w-full')}\n aria-hidden=\"true\"\n />\n ))}\n </div>\n </div>\n {withFooter && (\n <div className=\"p-4 border-t border-border flex items-center justify-between gap-2\">\n <Skeleton shape=\"line\" className=\"h-3 w-1/4\" aria-hidden=\"true\" />\n <Skeleton shape=\"rect\" className=\"h-8 w-20\" aria-hidden=\"true\" />\n </div>\n )}\n </div>\n )\n}\nCardSkeleton.displayName = 'CardSkeleton'\n\n/* -------------------------------------------------------------------------- */\n/* AvatarTextSkeleton — circle avatar + 2 text lines (list/comment style) */\n/* -------------------------------------------------------------------------- */\n\nexport interface AvatarTextSkeletonProps {\n /** Avatar size @default 'md' */\n size?: 'sm' | 'md' | 'lg'\n /** Number of text lines beside the avatar @default 2 */\n lines?: number\n className?: string\n}\n\nfunction AvatarTextSkeleton({ size = 'md', lines = 2, className }: AvatarTextSkeletonProps) {\n return (\n <div\n data-slot=\"avatar-text-skeleton\"\n role=\"status\"\n aria-busy=\"true\"\n aria-label=\"Loading user\"\n className={cn('flex items-center gap-3', className)}\n >\n <Skeleton shape=\"circle\" size={size} aria-hidden=\"true\" />\n <div className=\"flex-1 min-w-0 space-y-2\">\n {Array.from({ length: lines }).map((_, i) => (\n <Skeleton\n key={i}\n shape=\"line\"\n className={cn('h-3', i === 0 ? 'w-1/3' : i === lines - 1 ? 'w-1/2' : 'w-full')}\n aria-hidden=\"true\"\n />\n ))}\n </div>\n </div>\n )\n}\nAvatarTextSkeleton.displayName = 'AvatarTextSkeleton'\n\n/* -------------------------------------------------------------------------- */\n/* FormRowSkeleton — label + input placeholder for forms */\n/* -------------------------------------------------------------------------- */\n\nexport interface FormRowSkeletonProps {\n /** Field shape — 'input' (one-line), 'textarea' (3-line), 'select' (input + chevron) */\n field?: 'input' | 'textarea' | 'select'\n /** Show help text line below input @default false */\n withHelp?: boolean\n className?: string\n}\n\nfunction FormRowSkeleton({ field = 'input', withHelp = false, className }: FormRowSkeletonProps) {\n const inputClass = field === 'textarea' ? 'h-20' : field === 'select' ? 'h-9' : 'h-9'\n return (\n <div\n data-slot=\"form-row-skeleton\"\n role=\"status\"\n aria-busy=\"true\"\n aria-label=\"Loading form field\"\n className={cn('space-y-2', className)}\n >\n <Skeleton shape=\"line\" className=\"h-3 w-1/4\" aria-hidden=\"true\" />\n <Skeleton shape=\"rect\" className={cn('w-full', inputClass)} aria-hidden=\"true\" />\n {withHelp && <Skeleton shape=\"line\" className=\"h-2.5 w-1/3\" aria-hidden=\"true\" />}\n </div>\n )\n}\nFormRowSkeleton.displayName = 'FormRowSkeleton'\n\nexport {\n Skeleton,\n MetricCardSkeleton,\n ChartSkeleton,\n TableSkeleton,\n TableRowSkeleton,\n CardSkeleton,\n AvatarTextSkeleton,\n FormRowSkeleton,\n}\n"]}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunk34JUCX2G_cjs = require('./chunk-34JUCX2G.cjs');
|
|
4
|
+
var chunkNV4JOKWL_cjs = require('./chunk-NV4JOKWL.cjs');
|
|
5
|
+
var classVarianceAuthority = require('class-variance-authority');
|
|
6
|
+
var React = require('react');
|
|
7
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
8
|
+
|
|
9
|
+
function _interopNamespace(e) {
|
|
10
|
+
if (e && e.__esModule) return e;
|
|
11
|
+
var n = Object.create(null);
|
|
12
|
+
if (e) {
|
|
13
|
+
Object.keys(e).forEach(function (k) {
|
|
14
|
+
if (k !== 'default') {
|
|
15
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
16
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
17
|
+
enumerable: true,
|
|
18
|
+
get: function () { return e[k]; }
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
n.default = e;
|
|
24
|
+
return Object.freeze(n);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
28
|
+
|
|
29
|
+
var inputVariants = classVarianceAuthority.cva(
|
|
30
|
+
chunkNV4JOKWL_cjs.cn(
|
|
31
|
+
"flex w-full rounded-md border border-control read-only:border-button bg-foreground/[.026] text-sm text-foreground file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-foreground-muted read-only:text-foreground-light",
|
|
32
|
+
"transition-colors duration-150",
|
|
33
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50",
|
|
34
|
+
"aria-[invalid=true]:bg-destructive-200 dark:aria-[invalid=true]:bg-destructive/5 aria-[invalid=true]:border-destructive-400 dark:aria-[invalid=true]:border-destructive-default aria-[invalid=true]:focus:border-destructive aria-[invalid=true]:focus-visible:border-destructive"
|
|
35
|
+
),
|
|
36
|
+
{
|
|
37
|
+
variants: {
|
|
38
|
+
size: {
|
|
39
|
+
...chunk34JUCX2G_cjs.SIZE_VARIANTS
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
defaultVariants: {
|
|
43
|
+
size: chunk34JUCX2G_cjs.SIZE_VARIANTS_DEFAULT
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
);
|
|
47
|
+
var InputVariants = inputVariants;
|
|
48
|
+
var LTR_INPUT_TYPES = /* @__PURE__ */ new Set(["email", "url", "tel", "number", "password"]);
|
|
49
|
+
var Input = React__namespace.forwardRef(({ className, type, size = "sm", dir, ...props }, ref) => {
|
|
50
|
+
const resolvedDir = dir ?? (type && LTR_INPUT_TYPES.has(type) ? "ltr" : void 0);
|
|
51
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
52
|
+
"input",
|
|
53
|
+
{
|
|
54
|
+
type,
|
|
55
|
+
ref,
|
|
56
|
+
"data-slot": "input",
|
|
57
|
+
dir: resolvedDir,
|
|
58
|
+
...props,
|
|
59
|
+
className: chunkNV4JOKWL_cjs.cn(inputVariants({ size }), className)
|
|
60
|
+
}
|
|
61
|
+
);
|
|
62
|
+
});
|
|
63
|
+
Input.displayName = "Input";
|
|
64
|
+
|
|
65
|
+
exports.Input = Input;
|
|
66
|
+
exports.InputVariants = InputVariants;
|
|
67
|
+
exports.inputVariants = inputVariants;
|
|
68
|
+
//# sourceMappingURL=chunk-SCGW2BH4.cjs.map
|
|
69
|
+
//# sourceMappingURL=chunk-SCGW2BH4.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/ui/input.tsx"],"names":["cva","cn","SIZE_VARIANTS","SIZE_VARIANTS_DEFAULT","React","jsx"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOO,IAAM,aAAA,GAAgBA,0BAAA;AAAA,EAC3BC,oBAAA;AAAA,IACE,0QAAA;AAAA,IACA,gCAAA;AAAA,IACA,0LAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,IAAA,EAAM;AAAA,QACJ,GAAGC;AAAA;AACL,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,IAAA,EAAMC;AAAA;AACR;AAEJ;AAGO,IAAM,aAAA,GAAgB;AAK7B,IAAM,eAAA,uBAAsB,GAAA,CAAI,CAAC,SAAS,KAAA,EAAO,KAAA,EAAO,QAAA,EAAU,UAAU,CAAC,CAAA;AAE7E,IAAM,KAAA,GAAcC,gBAAA,CAAA,UAAA,CAAyC,CAAC,EAAE,SAAA,EAAW,IAAA,EAAM,IAAA,GAAO,IAAA,EAAM,GAAA,EAAK,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AAErH,EAAA,MAAM,cAAc,GAAA,KAAQ,IAAA,IAAQ,gBAAgB,GAAA,CAAI,IAAI,IAAI,KAAA,GAAQ,MAAA,CAAA;AACxE,EAAA,uBACEC,cAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,IAAA;AAAA,MACA,GAAA;AAAA,MACA,WAAA,EAAU,OAAA;AAAA,MACV,GAAA,EAAK,WAAA;AAAA,MACJ,GAAG,KAAA;AAAA,MACJ,WAAWJ,oBAAA,CAAG,aAAA,CAAc,EAAE,IAAA,EAAM,GAAG,SAAS;AAAA;AAAA,GAClD;AAEJ,CAAC;AAED,KAAA,CAAM,WAAA,GAAc,OAAA","file":"chunk-SCGW2BH4.cjs","sourcesContent":["'use client'\n\nimport { VariantProps, cva } from 'class-variance-authority'\nimport * as React from 'react'\nimport { SIZE_VARIANTS, SIZE_VARIANTS_DEFAULT } from '@/lib/constants'\nimport { cn } from '@/lib/utils'\n\nexport const inputVariants = cva(\n cn(\n 'flex w-full rounded-md border border-control read-only:border-button bg-foreground/[.026] text-sm text-foreground file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-foreground-muted read-only:text-foreground-light',\n 'transition-colors duration-150',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50',\n 'aria-[invalid=true]:bg-destructive-200 dark:aria-[invalid=true]:bg-destructive/5 aria-[invalid=true]:border-destructive-400 dark:aria-[invalid=true]:border-destructive-default aria-[invalid=true]:focus:border-destructive aria-[invalid=true]:focus-visible:border-destructive'\n ),\n {\n variants: {\n size: {\n ...SIZE_VARIANTS,\n },\n },\n defaultVariants: {\n size: SIZE_VARIANTS_DEFAULT,\n },\n }\n)\n\n/** @deprecated Use inputVariants instead */\nexport const InputVariants = inputVariants\n\nexport interface InputProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'>, VariantProps<typeof inputVariants> {}\n\nconst LTR_INPUT_TYPES = new Set(['email', 'url', 'tel', 'number', 'password'])\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(({ className, type, size = 'sm', dir, ...props }, ref) => {\n // LTR content types: auto-set dir=\"ltr\" unless caller explicitly overrides\n const resolvedDir = dir ?? (type && LTR_INPUT_TYPES.has(type) ? 'ltr' : undefined)\n return (\n <input\n type={type}\n ref={ref}\n data-slot=\"input\"\n dir={resolvedDir}\n {...props}\n className={cn(inputVariants({ size }), className)}\n />\n )\n})\n\nInput.displayName = 'Input'\n\nexport { Input }\n"]}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkYE477L2H_cjs = require('./chunk-YE477L2H.cjs');
|
|
4
|
+
var chunkNV4JOKWL_cjs = require('./chunk-NV4JOKWL.cjs');
|
|
5
|
+
var lucideReact = require('lucide-react');
|
|
6
|
+
var reactDayPicker = require('react-day-picker');
|
|
7
|
+
var persian = require('react-day-picker/persian');
|
|
8
|
+
var locale = require('date-fns/locale');
|
|
9
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
10
|
+
|
|
11
|
+
function Calendar({
|
|
12
|
+
className,
|
|
13
|
+
classNames,
|
|
14
|
+
showOutsideDays = true,
|
|
15
|
+
usePersianCalendar = false,
|
|
16
|
+
...props
|
|
17
|
+
}) {
|
|
18
|
+
const PickerComponent = usePersianCalendar ? persian.DayPicker : reactDayPicker.DayPicker;
|
|
19
|
+
const englishFormatters = !usePersianCalendar ? {
|
|
20
|
+
formatDay: (date) => {
|
|
21
|
+
if (!date || !(date instanceof Date)) {
|
|
22
|
+
return "";
|
|
23
|
+
}
|
|
24
|
+
const dayNumber = date.getDate();
|
|
25
|
+
return new Intl.NumberFormat("en-US", { useGrouping: false }).format(dayNumber);
|
|
26
|
+
},
|
|
27
|
+
formatWeekdayName: (date) => {
|
|
28
|
+
if (!date || !(date instanceof Date)) {
|
|
29
|
+
return "";
|
|
30
|
+
}
|
|
31
|
+
return new Intl.DateTimeFormat("en-US", { weekday: "short" }).format(date);
|
|
32
|
+
},
|
|
33
|
+
formatMonthCaption: (date) => {
|
|
34
|
+
if (!date || !(date instanceof Date)) {
|
|
35
|
+
return "";
|
|
36
|
+
}
|
|
37
|
+
return new Intl.DateTimeFormat("en-US", { month: "long", year: "numeric" }).format(date);
|
|
38
|
+
}
|
|
39
|
+
} : void 0;
|
|
40
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { "data-slot": "calendar", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
41
|
+
PickerComponent,
|
|
42
|
+
{
|
|
43
|
+
dir: usePersianCalendar ? "rtl" : "ltr",
|
|
44
|
+
locale: usePersianCalendar ? void 0 : locale.enUS,
|
|
45
|
+
formatters: englishFormatters,
|
|
46
|
+
showOutsideDays,
|
|
47
|
+
className: chunkNV4JOKWL_cjs.cn("p-6", usePersianCalendar ? "" : "font-sans", className),
|
|
48
|
+
classNames: {
|
|
49
|
+
months: "flex flex-col sm:flex-row gap-y-4 sm:gap-y-0",
|
|
50
|
+
month: "gap-y-4 mx-2",
|
|
51
|
+
month_caption: "flex justify-center pt-1 relative items-center h-7",
|
|
52
|
+
caption_label: "text-sm font-medium truncate",
|
|
53
|
+
button_previous: chunkNV4JOKWL_cjs.cn(
|
|
54
|
+
chunkYE477L2H_cjs.buttonVariants({ variant: "outline" }),
|
|
55
|
+
"absolute start-2 size-7 bg-transparent p-0 opacity-50 hover:opacity-100 border-0"
|
|
56
|
+
),
|
|
57
|
+
button_next: chunkNV4JOKWL_cjs.cn(
|
|
58
|
+
chunkYE477L2H_cjs.buttonVariants({ variant: "outline" }),
|
|
59
|
+
"absolute end-2 size-7 bg-transparent p-0 opacity-50 hover:opacity-100 border-0"
|
|
60
|
+
),
|
|
61
|
+
month_grid: "mt-4",
|
|
62
|
+
weekdays: "flex flex-row",
|
|
63
|
+
weekday: "text-muted-foreground rounded-md size-9 font-normal text-xs flex items-center justify-center",
|
|
64
|
+
week: "flex w-full mt-2",
|
|
65
|
+
day: chunkNV4JOKWL_cjs.cn("size-9 text-center text-sm p-0 relative", "focus-within:relative focus-within:z-20"),
|
|
66
|
+
day_button: chunkNV4JOKWL_cjs.cn(
|
|
67
|
+
"w-full cursor-pointer h-full p-0 font-normal rounded-md",
|
|
68
|
+
"aria-selected:opacity-100",
|
|
69
|
+
"border-0 shadow-none outline-none",
|
|
70
|
+
"transition-colors duration-150",
|
|
71
|
+
"hover:bg-accent hover:text-accent-foreground",
|
|
72
|
+
"focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-2",
|
|
73
|
+
"flex items-center justify-center",
|
|
74
|
+
"text-foreground"
|
|
75
|
+
),
|
|
76
|
+
range_start: "day-range-start",
|
|
77
|
+
range_end: "day-range-end",
|
|
78
|
+
selected: "bg-primary text-primary-foreground hover:bg-primary hover:text-primary-foreground focus:bg-primary focus:text-primary-foreground rounded-md",
|
|
79
|
+
today: "bg-accent text-accent-foreground",
|
|
80
|
+
outside: "day-outside text-muted-foreground aria-selected:bg-accent/50 aria-selected:text-muted-foreground",
|
|
81
|
+
disabled: "text-muted-foreground opacity-50",
|
|
82
|
+
range_middle: "aria-selected:bg-primary/20 aria-selected:text-foreground rounded-none",
|
|
83
|
+
hidden: "invisible",
|
|
84
|
+
...classNames
|
|
85
|
+
},
|
|
86
|
+
components: {
|
|
87
|
+
Chevron: ({ orientation }) => {
|
|
88
|
+
if (usePersianCalendar) {
|
|
89
|
+
if (orientation === "left") {
|
|
90
|
+
return /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRight, { className: "size-4" });
|
|
91
|
+
}
|
|
92
|
+
return /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronLeft, { className: "size-4" });
|
|
93
|
+
}
|
|
94
|
+
if (orientation === "left") {
|
|
95
|
+
return /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronLeft, { className: "size-4" });
|
|
96
|
+
}
|
|
97
|
+
return /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRight, { className: "size-4" });
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
...props
|
|
101
|
+
}
|
|
102
|
+
) });
|
|
103
|
+
}
|
|
104
|
+
Calendar.displayName = "Calendar";
|
|
105
|
+
|
|
106
|
+
exports.Calendar = Calendar;
|
|
107
|
+
//# sourceMappingURL=chunk-SCX6AR53.cjs.map
|
|
108
|
+
//# sourceMappingURL=chunk-SCX6AR53.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/ui/calendar.tsx"],"names":["PersianDayPicker","DayPicker","jsx","enUS","cn","buttonVariants","ChevronRight","ChevronLeft"],"mappings":"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","file":"chunk-SCX6AR53.cjs","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { ChevronLeft, ChevronRight } from 'lucide-react'\nimport { DayPicker } from 'react-day-picker'\nimport { DayPicker as PersianDayPicker } from 'react-day-picker/persian'\nimport { enUS } from 'date-fns/locale'\n\nimport { cn } from '@/lib/utils'\nimport { buttonVariants } from './button'\n\nexport type CalendarProps = {\n usePersianCalendar?: boolean\n className?: string\n classNames?: Partial<Record<string, string>>\n showOutsideDays?: boolean\n} & (React.ComponentProps<typeof DayPicker> | React.ComponentProps<typeof PersianDayPicker>)\n\nfunction Calendar({\n className,\n classNames,\n showOutsideDays = true,\n usePersianCalendar = false,\n ...props\n}: CalendarProps) {\n const PickerComponent = usePersianCalendar ? PersianDayPicker : DayPicker\n\n // Formatters for English numbers in Gregorian calendar\n const englishFormatters = !usePersianCalendar\n ? {\n formatDay: (date: Date) => {\n // Force English numbers using Intl.NumberFormat with en-US locale\n if (!date || !(date instanceof Date)) {\n return ''\n }\n const dayNumber = date.getDate()\n return new Intl.NumberFormat('en-US', { useGrouping: false }).format(dayNumber)\n },\n formatWeekdayName: (date: Date) => {\n if (!date || !(date instanceof Date)) {\n return ''\n }\n return new Intl.DateTimeFormat('en-US', { weekday: 'short' }).format(date)\n },\n formatMonthCaption: (date: Date) => {\n if (!date || !(date instanceof Date)) {\n return ''\n }\n return new Intl.DateTimeFormat('en-US', { month: 'long', year: 'numeric' }).format(date)\n },\n }\n : undefined\n\n return (\n <div data-slot=\"calendar\">\n <PickerComponent\n dir={usePersianCalendar ? 'rtl' : 'ltr'}\n locale={usePersianCalendar ? undefined : enUS}\n formatters={englishFormatters}\n showOutsideDays={showOutsideDays}\n className={cn('p-6', usePersianCalendar ? '' : 'font-sans', className)}\n classNames={{\n months: 'flex flex-col sm:flex-row gap-y-4 sm:gap-y-0',\n month: 'gap-y-4 mx-2',\n month_caption: 'flex justify-center pt-1 relative items-center h-7',\n caption_label: 'text-sm font-medium truncate',\n button_previous: cn(\n buttonVariants({ variant: 'outline' }),\n 'absolute start-2 size-7 bg-transparent p-0 opacity-50 hover:opacity-100 border-0'\n ),\n button_next: cn(\n buttonVariants({ variant: 'outline' }),\n 'absolute end-2 size-7 bg-transparent p-0 opacity-50 hover:opacity-100 border-0'\n ),\n month_grid: 'mt-4',\n weekdays: 'flex flex-row',\n weekday: 'text-muted-foreground rounded-md size-9 font-normal text-xs flex items-center justify-center',\n week: 'flex w-full mt-2',\n day: cn('size-9 text-center text-sm p-0 relative', 'focus-within:relative focus-within:z-20'),\n day_button: cn(\n 'w-full cursor-pointer h-full p-0 font-normal rounded-md',\n 'aria-selected:opacity-100',\n 'border-0 shadow-none outline-none',\n 'transition-colors duration-150',\n 'hover:bg-accent hover:text-accent-foreground',\n 'focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-2',\n 'flex items-center justify-center',\n 'text-foreground'\n ),\n range_start: 'day-range-start',\n range_end: 'day-range-end',\n selected:\n 'bg-primary text-primary-foreground hover:bg-primary hover:text-primary-foreground focus:bg-primary focus:text-primary-foreground rounded-md',\n today: 'bg-accent text-accent-foreground',\n outside: 'day-outside text-muted-foreground aria-selected:bg-accent/50 aria-selected:text-muted-foreground',\n disabled: 'text-muted-foreground opacity-50',\n range_middle: 'aria-selected:bg-primary/20 aria-selected:text-foreground rounded-none',\n hidden: 'invisible',\n ...classNames,\n }}\n components={{\n Chevron: ({ orientation }) => {\n // برای RTL (تقویم شمسی) فلشها معکوس میشوند\n if (usePersianCalendar) {\n if (orientation === 'left') {\n return <ChevronRight className=\"size-4\" />\n }\n return <ChevronLeft className=\"size-4\" />\n }\n // برای LTR (تقویم میلادی) فلشها طبیعی هستند\n if (orientation === 'left') {\n return <ChevronLeft className=\"size-4\" />\n }\n return <ChevronRight className=\"size-4\" />\n },\n }}\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n {...(props as any)}\n />\n </div>\n )\n}\nCalendar.displayName = 'Calendar'\n\nexport { Calendar }\n"]}
|