@parto-system-design/ui 1.0.5 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,95 +1,11 @@
1
+ "use client";
2
+
1
3
  // src/lib/utils.ts
2
4
  import { clsx } from "clsx";
3
5
  import { twMerge } from "tailwind-merge";
4
- function cn(...inputs) {
5
- return twMerge(clsx(inputs));
6
- }
7
- function formatNumber(num, format3 = "exact") {
8
- if (num === void 0 || num === null) return "0";
9
- if (format3 === "exact") {
10
- return num.toLocaleString("en-US");
11
- }
12
- if (num >= 1e9) {
13
- return `${(num / 1e9).toFixed(1).replace(/\.0$/, "")}B`;
14
- }
15
- if (num >= 1e6) {
16
- return `${(num / 1e6).toFixed(1).replace(/\.0$/, "")}M`;
17
- }
18
- if (num >= 1e3) {
19
- return `${(num / 1e3).toFixed(1).replace(/\.0$/, "")}K`;
20
- }
21
- return num.toString();
22
- }
23
- function formatRelativeTime(date) {
24
- const now = /* @__PURE__ */ new Date();
25
- const then = new Date(date);
26
- const diffInSeconds = Math.floor((now.getTime() - then.getTime()) / 1e3);
27
- const toPersianDigits2 = (num) => {
28
- const persianDigits = ["\u06F0", "\u06F1", "\u06F2", "\u06F3", "\u06F4", "\u06F5", "\u06F6", "\u06F7", "\u06F8", "\u06F9"];
29
- return num.toString().replace(/\d/g, (digit) => persianDigits[parseInt(digit)]);
30
- };
31
- if (diffInSeconds < 60) {
32
- return "\u0647\u0645\u06CC\u0646 \u0627\u0644\u0627\u0646";
33
- }
34
- const diffInMinutes = Math.floor(diffInSeconds / 60);
35
- if (diffInMinutes < 60) {
36
- return `${toPersianDigits2(diffInMinutes)} \u062F\u0642\u06CC\u0642\u0647 \u067E\u06CC\u0634`;
37
- }
38
- const diffInHours = Math.floor(diffInMinutes / 60);
39
- if (diffInHours < 24) {
40
- return `${toPersianDigits2(diffInHours)} \u0633\u0627\u0639\u062A \u067E\u06CC\u0634`;
41
- }
42
- const diffInDays = Math.floor(diffInHours / 24);
43
- if (diffInDays < 7) {
44
- return `${toPersianDigits2(diffInDays)} \u0631\u0648\u0632 \u067E\u06CC\u0634`;
45
- }
46
- const diffInWeeks = Math.floor(diffInDays / 7);
47
- if (diffInWeeks < 4) {
48
- return `${toPersianDigits2(diffInWeeks)} \u0647\u0641\u062A\u0647 \u067E\u06CC\u0634`;
49
- }
50
- const diffInMonths = Math.floor(diffInDays / 30);
51
- if (diffInMonths < 12) {
52
- return `${toPersianDigits2(diffInMonths)} \u0645\u0627\u0647 \u067E\u06CC\u0634`;
53
- }
54
- const diffInYears = Math.floor(diffInDays / 365);
55
- return `${toPersianDigits2(diffInYears)} \u0633\u0627\u0644 \u067E\u06CC\u0634`;
56
- }
57
- function formatAbsoluteTime(date) {
58
- const d = new Date(date);
59
- const toPersianDigits2 = (num) => {
60
- const persianDigits = ["\u06F0", "\u06F1", "\u06F2", "\u06F3", "\u06F4", "\u06F5", "\u06F6", "\u06F7", "\u06F8", "\u06F9"];
61
- return num.toString().replace(/\d/g, (digit) => persianDigits[parseInt(digit)]);
62
- };
63
- const persianMonths = [
64
- "\u0641\u0631\u0648\u0631\u062F\u06CC\u0646",
65
- "\u0627\u0631\u062F\u06CC\u0628\u0647\u0634\u062A",
66
- "\u062E\u0631\u062F\u0627\u062F",
67
- "\u062A\u06CC\u0631",
68
- "\u0645\u0631\u062F\u0627\u062F",
69
- "\u0634\u0647\u0631\u06CC\u0648\u0631",
70
- "\u0645\u0647\u0631",
71
- "\u0622\u0628\u0627\u0646",
72
- "\u0622\u0630\u0631",
73
- "\u062F\u06CC",
74
- "\u0628\u0647\u0645\u0646",
75
- "\u0627\u0633\u0641\u0646\u062F"
76
- ];
77
- const year = d.getFullYear();
78
- const month = d.getMonth();
79
- const day = d.getDate();
80
- const hours = d.getHours();
81
- const minutes = d.getMinutes();
82
- const persianYear = year - 621;
83
- const persianMonth = persianMonths[month];
84
- const persianDay = toPersianDigits2(day);
85
- const persianHours = toPersianDigits2(hours);
86
- const persianMinutes = toPersianDigits2(minutes.toString().padStart(2, "0"));
87
- return `${persianDay} ${persianMonth} ${toPersianDigits2(persianYear)}\u060C ${persianHours}:${persianMinutes}`;
88
- }
89
6
 
90
7
  // src/lib/jalali-utils.ts
91
- import moment from "moment-jalaali";
92
- moment.loadPersian({ usePersianDigits: true, dialect: "persian-modern" });
8
+ import { format, getYear, getMonth, getDate, parse, isSameDay, isSameMonth, isSameYear } from "date-fns-jalali";
93
9
  var PERSIAN_MONTHS = [
94
10
  "\u0641\u0631\u0648\u0631\u062F\u06CC\u0646",
95
11
  "\u0627\u0631\u062F\u06CC\u0628\u0647\u0634\u062A",
@@ -137,49 +53,59 @@ function toEnglishDigits(str) {
137
53
  const arabicDigits = ["\u0660", "\u0661", "\u0662", "\u0663", "\u0664", "\u0665", "\u0666", "\u0667", "\u0668", "\u0669"];
138
54
  return str.replace(/[۰-۹]/g, (digit) => String(persianDigits.indexOf(digit))).replace(/[٠-٩]/g, (digit) => String(arabicDigits.indexOf(digit)));
139
55
  }
140
- function formatJalaliDate(date, format3 = "jYYYY/jMM/jDD") {
141
- return moment(date).format(format3);
56
+ function formatJalaliDate(date, formatStr = "yyyy/MM/dd") {
57
+ let finalFormatStr = formatStr;
58
+ if (finalFormatStr.includes("jYYYY")) finalFormatStr = finalFormatStr.replace(/jYYYY/g, "yyyy");
59
+ if (finalFormatStr.includes("jMMMM")) finalFormatStr = finalFormatStr.replace(/jMMMM/g, "MMMM");
60
+ if (finalFormatStr.includes("jMM")) finalFormatStr = finalFormatStr.replace(/jMM/g, "MM");
61
+ if (finalFormatStr.includes("jM")) finalFormatStr = finalFormatStr.replace(/jM/g, "M");
62
+ if (finalFormatStr.includes("jDD")) finalFormatStr = finalFormatStr.replace(/jDD/g, "dd");
63
+ if (finalFormatStr.includes("jD")) finalFormatStr = finalFormatStr.replace(/jD/g, "d");
64
+ return format(date, finalFormatStr);
142
65
  }
143
66
  function getPersianMonthName(date) {
144
- const monthIndex = moment(date).jMonth();
67
+ const monthIndex = getMonth(date);
145
68
  return PERSIAN_MONTHS[monthIndex];
146
69
  }
147
70
  function getPersianMonthNameShort(date) {
148
- const monthIndex = moment(date).jMonth();
71
+ const monthIndex = getMonth(date);
149
72
  return PERSIAN_MONTHS_SHORT[monthIndex];
150
73
  }
151
74
  function getPersianWeekdayName(date, short = false) {
152
- const dayIndex = moment(date).day();
75
+ const dayIndex = date.getDay();
153
76
  return short ? PERSIAN_WEEKDAYS_SHORT[dayIndex] : PERSIAN_WEEKDAYS[dayIndex];
154
77
  }
155
78
  function getPersianYear(date) {
156
- return moment(date).jYear();
79
+ return getYear(date);
157
80
  }
158
81
  function getPersianMonth(date) {
159
- return moment(date).jMonth();
82
+ return getMonth(date);
160
83
  }
161
84
  function getPersianDay(date) {
162
- return moment(date).jDate();
85
+ return getDate(date);
163
86
  }
164
87
  function jalaliToGregorian(year, month, day) {
165
- return moment(`${year}/${month + 1}/${day}`, "jYYYY/jM/jD").toDate();
88
+ const yyyy = year.toString().padStart(4, "0");
89
+ const MM = (month + 1).toString().padStart(2, "0");
90
+ const dd = day.toString().padStart(2, "0");
91
+ const referenceDate = /* @__PURE__ */ new Date();
92
+ referenceDate.setHours(12, 0, 0, 0);
93
+ return parse(`${yyyy}/${MM}/${dd}`, "yyyy/MM/dd", referenceDate);
166
94
  }
167
95
  function formatPersianDateRange(from, to) {
168
- const fromMoment = moment(from);
169
- const toMoment = moment(to);
170
- const fromYear = fromMoment.jYear();
171
- const toYear = toMoment.jYear();
172
- const fromMonth = fromMoment.jMonth();
173
- const toMonth = toMoment.jMonth();
174
- const fromDay = fromMoment.jDate();
175
- const toDay = toMoment.jDate();
176
- if (fromYear === toYear && fromMonth === toMonth && fromDay === toDay) {
96
+ const fromYear = getYear(from);
97
+ const toYear = getYear(to);
98
+ const fromMonth = getMonth(from);
99
+ const toMonth = getMonth(to);
100
+ const fromDay = getDate(from);
101
+ const toDay = getDate(to);
102
+ if (isSameDay(from, to)) {
177
103
  return `${toPersianDigits(fromDay)} ${PERSIAN_MONTHS[fromMonth]} ${toPersianDigits(fromYear)}`;
178
104
  }
179
- if (fromYear === toYear && fromMonth === toMonth) {
105
+ if (isSameYear(from, to) && isSameMonth(from, to)) {
180
106
  return `${toPersianDigits(fromDay)} - ${toPersianDigits(toDay)} ${PERSIAN_MONTHS[fromMonth]} ${toPersianDigits(fromYear)}`;
181
107
  }
182
- if (fromYear === toYear) {
108
+ if (isSameYear(from, to)) {
183
109
  return `${toPersianDigits(fromDay)} ${PERSIAN_MONTHS[fromMonth]} - ${toPersianDigits(toDay)} ${PERSIAN_MONTHS[toMonth]} ${toPersianDigits(fromYear)}`;
184
110
  }
185
111
  return `${toPersianDigits(fromDay)} ${PERSIAN_MONTHS[fromMonth]} ${toPersianDigits(fromYear)} - ${toPersianDigits(toDay)} ${PERSIAN_MONTHS[toMonth]} ${toPersianDigits(toYear)}`;
@@ -201,6 +127,66 @@ function getPersianYearsForDropdown(fromYear, toYear) {
201
127
  return years;
202
128
  }
203
129
 
130
+ // src/lib/utils.ts
131
+ function cn(...inputs) {
132
+ return twMerge(clsx(inputs));
133
+ }
134
+ function formatNumber(num, format4 = "exact") {
135
+ if (num === void 0 || num === null) return "0";
136
+ if (format4 === "exact") {
137
+ return num.toLocaleString("en-US");
138
+ }
139
+ if (num >= 1e9) {
140
+ return `${(num / 1e9).toFixed(1).replace(/\.0$/, "")}B`;
141
+ }
142
+ if (num >= 1e6) {
143
+ return `${(num / 1e6).toFixed(1).replace(/\.0$/, "")}M`;
144
+ }
145
+ if (num >= 1e3) {
146
+ return `${(num / 1e3).toFixed(1).replace(/\.0$/, "")}K`;
147
+ }
148
+ return num.toString();
149
+ }
150
+ function formatRelativeTime(date) {
151
+ const now = /* @__PURE__ */ new Date();
152
+ const then = new Date(date);
153
+ const diffInSeconds = Math.floor((now.getTime() - then.getTime()) / 1e3);
154
+ if (diffInSeconds < 60) {
155
+ return "\u0647\u0645\u06CC\u0646 \u0627\u0644\u0627\u0646";
156
+ }
157
+ const diffInMinutes = Math.floor(diffInSeconds / 60);
158
+ if (diffInMinutes < 60) {
159
+ return `${toPersianDigits(diffInMinutes)} \u062F\u0642\u06CC\u0642\u0647 \u067E\u06CC\u0634`;
160
+ }
161
+ const diffInHours = Math.floor(diffInMinutes / 60);
162
+ if (diffInHours < 24) {
163
+ return `${toPersianDigits(diffInHours)} \u0633\u0627\u0639\u062A \u067E\u06CC\u0634`;
164
+ }
165
+ const diffInDays = Math.floor(diffInHours / 24);
166
+ if (diffInDays < 7) {
167
+ return `${toPersianDigits(diffInDays)} \u0631\u0648\u0632 \u067E\u06CC\u0634`;
168
+ }
169
+ const diffInWeeks = Math.floor(diffInDays / 7);
170
+ if (diffInWeeks < 4) {
171
+ return `${toPersianDigits(diffInWeeks)} \u0647\u0641\u062A\u0647 \u067E\u06CC\u0634`;
172
+ }
173
+ const diffInMonths = Math.floor(diffInDays / 30);
174
+ if (diffInMonths < 12) {
175
+ return `${toPersianDigits(diffInMonths)} \u0645\u0627\u0647 \u067E\u06CC\u0634`;
176
+ }
177
+ const diffInYears = Math.floor(diffInDays / 365);
178
+ return `${toPersianDigits(diffInYears)} \u0633\u0627\u0644 \u067E\u06CC\u0634`;
179
+ }
180
+ function formatAbsoluteTime(date) {
181
+ const d = new Date(date);
182
+ const year = getPersianYear(d);
183
+ const month = getPersianMonth(d);
184
+ const day = getPersianDay(d);
185
+ const hours = d.getHours();
186
+ const minutes = d.getMinutes();
187
+ return `${toPersianDigits(day)} ${PERSIAN_MONTHS[month]} ${toPersianDigits(year)}\u060C ${toPersianDigits(hours)}:${toPersianDigits(String(minutes).padStart(2, "0"))}`;
188
+ }
189
+
204
190
  // src/icons.tsx
205
191
  import {
206
192
  AlertCircle,
@@ -248,11 +234,21 @@ import {
248
234
  User,
249
235
  Users,
250
236
  Video,
251
- X
237
+ X,
238
+ UserCheck,
239
+ TrendingUp,
240
+ Award,
241
+ Crown,
242
+ Minus,
243
+ ImageOff,
244
+ ExternalLink,
245
+ GripVertical,
246
+ PanelLeft,
247
+ XCircle
252
248
  } from "lucide-react";
253
249
  import { jsx, jsxs } from "react/jsx-runtime";
254
250
  var Icons = {
255
- // Lucide Icons
251
+ /** Parto layered logo mark (generic) */
256
252
  logo: (props) => /* @__PURE__ */ jsxs(
257
253
  "svg",
258
254
  {
@@ -271,6 +267,7 @@ var Icons = {
271
267
  ]
272
268
  }
273
269
  ),
270
+ /** Official Parto brand mark (triangle composition) */
274
271
  parto: (props) => /* @__PURE__ */ jsxs(
275
272
  "svg",
276
273
  {
@@ -290,6 +287,7 @@ var Icons = {
290
287
  arrowRight: ArrowRight,
291
288
  arrowLeft: ArrowLeft,
292
289
  bold: Bold,
290
+ building: Building,
293
291
  calendar: Calendar,
294
292
  check: Check,
295
293
  chevronDown: ChevronDown,
@@ -298,47 +296,19 @@ var Icons = {
298
296
  chevronUp: ChevronUp,
299
297
  circle: Circle,
300
298
  clock: Clock,
299
+ /** Use for close/dismiss actions (X mark) */
300
+ close: X,
301
301
  copy: Copy,
302
302
  download: Download,
303
303
  eye: Eye,
304
304
  eyeOff: EyeOff,
305
305
  file: File,
306
306
  fileText: FileText,
307
- heart: Heart,
308
- home: Home,
309
- image: Image,
310
- images: Images,
311
- inbox: Inbox,
312
- info: Info,
313
- italic: Italic,
314
- loader: Loader2,
315
- menu: Menu,
316
- messageCircle: MessageCircle,
317
- moon: Moon,
318
- moreHorizontal: MoreHorizontal,
319
- moreVertical: MoreVertical,
320
- plus: Plus,
321
- rocket: Rocket,
322
- search: Search,
323
- settings: Settings,
324
- share: Share2,
325
- sparkles: Sparkles,
326
- sun: Sun,
327
- trash: Trash,
328
- underline: Underline,
329
- user: User,
330
- users: Users,
331
- video: Video,
332
- building: Building,
333
- close: X,
334
- spinner: Loader2,
335
307
  gitHub: (props) => /* @__PURE__ */ jsx(
336
308
  "svg",
337
309
  {
338
310
  "aria-hidden": "true",
339
311
  focusable: "false",
340
- "data-prefix": "fab",
341
- "data-icon": "github",
342
312
  role: "img",
343
313
  xmlns: "http://www.w3.org/2000/svg",
344
314
  viewBox: "0 0 496 512",
@@ -352,7 +322,13 @@ var Icons = {
352
322
  )
353
323
  }
354
324
  ),
355
- twitter: (props) => /* @__PURE__ */ jsx(
325
+ heart: Heart,
326
+ home: Home,
327
+ image: Image,
328
+ images: Images,
329
+ inbox: Inbox,
330
+ info: Info,
331
+ instagram: (props) => /* @__PURE__ */ jsxs(
356
332
  "svg",
357
333
  {
358
334
  xmlns: "http://www.w3.org/2000/svg",
@@ -363,10 +339,30 @@ var Icons = {
363
339
  strokeLinecap: "round",
364
340
  strokeLinejoin: "round",
365
341
  ...props,
366
- children: /* @__PURE__ */ jsx("path", { d: "M22 4s-.7 2.1-2 3.4c1.6 10-9.4 17.3-18 11.6 2.2.1 4.4-.6 6-2C3 15.5.5 9.6 3 5c2.2 2.6 5.6 4.1 9 4-.9-4.2 4-6.6 7-3.8 1.1 0 3-1.2 3-1.2z" })
342
+ children: [
343
+ /* @__PURE__ */ jsx("rect", { x: "2", y: "2", width: "20", height: "20", rx: "5", ry: "5" }),
344
+ /* @__PURE__ */ jsx("path", { d: "M16 11.37A4 4 0 1 1 12.63 8 4 4 0 0 1 16 11.37z" }),
345
+ /* @__PURE__ */ jsx("line", { x1: "17.5", y1: "6.5", x2: "17.51", y2: "6.5" })
346
+ ]
367
347
  }
368
348
  ),
369
- instagram: (props) => /* @__PURE__ */ jsxs(
349
+ italic: Italic,
350
+ /** Animated loading spinner — prefer this over a custom spinner */
351
+ loader: Loader2,
352
+ menu: Menu,
353
+ messageCircle: MessageCircle,
354
+ moon: Moon,
355
+ moreHorizontal: MoreHorizontal,
356
+ moreVertical: MoreVertical,
357
+ plus: Plus,
358
+ rocket: Rocket,
359
+ search: Search,
360
+ settings: Settings,
361
+ share: Share2,
362
+ sparkles: Sparkles,
363
+ sun: Sun,
364
+ trash: Trash,
365
+ twitter: (props) => /* @__PURE__ */ jsx(
370
366
  "svg",
371
367
  {
372
368
  xmlns: "http://www.w3.org/2000/svg",
@@ -377,18 +373,27 @@ var Icons = {
377
373
  strokeLinecap: "round",
378
374
  strokeLinejoin: "round",
379
375
  ...props,
380
- children: [
381
- /* @__PURE__ */ jsx("rect", { x: "2", y: "2", width: "20", height: "20", rx: "5", ry: "5" }),
382
- /* @__PURE__ */ jsx("path", { d: "M16 11.37A4 4 0 1 1 12.63 8 4 4 0 0 1 16 11.37z" }),
383
- /* @__PURE__ */ jsx("line", { x1: "17.5", y1: "6.5", x2: "17.51", y2: "6.5" })
384
- ]
376
+ children: /* @__PURE__ */ jsx("path", { d: "M22 4s-.7 2.1-2 3.4c1.6 10-9.4 17.3-18 11.6 2.2.1 4.4-.6 6-2C3 15.5.5 9.6 3 5c2.2 2.6 5.6 4.1 9 4-.9-4.2 4-6.6 7-3.8 1.1 0 3-1.2 3-1.2z" })
385
377
  }
386
- )
378
+ ),
379
+ underline: Underline,
380
+ user: User,
381
+ users: Users,
382
+ video: Video,
383
+ userCheck: UserCheck,
384
+ trendingUp: TrendingUp,
385
+ award: Award,
386
+ crown: Crown,
387
+ minus: Minus,
388
+ imageOff: ImageOff,
389
+ externalLink: ExternalLink,
390
+ gripVertical: GripVertical,
391
+ panelLeft: PanelLeft,
392
+ xCircle: XCircle
387
393
  };
388
394
 
389
395
  // src/components/ui/accordion.tsx
390
396
  import * as AccordionPrimitive from "@radix-ui/react-accordion";
391
- import { ChevronDownIcon } from "lucide-react";
392
397
  import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
393
398
  function Accordion({
394
399
  ...props
@@ -424,7 +429,7 @@ function AccordionTrigger({
424
429
  ...props,
425
430
  children: [
426
431
  children,
427
- /* @__PURE__ */ jsx2(ChevronDownIcon, { className: "text-muted-foreground pointer-events-none size-4 shrink-0 translate-y-0.5 transition-transform duration-200" })
432
+ /* @__PURE__ */ jsx2(Icons.chevronDown, { className: "text-muted-foreground pointer-events-none size-4 shrink-0 translate-y-0.5 transition-transform duration-200" })
428
433
  ]
429
434
  }
430
435
  ) });
@@ -502,7 +507,6 @@ import * as AlertDialogPrimitive from "@radix-ui/react-alert-dialog";
502
507
  // src/components/ui/button.tsx
503
508
  import { Slot } from "@radix-ui/react-slot";
504
509
  import { cva as cva2 } from "class-variance-authority";
505
- import { Loader2 as Loader22 } from "lucide-react";
506
510
  import { cloneElement, forwardRef as forwardRef2, isValidElement } from "react";
507
511
 
508
512
  // src/lib/constants.ts
@@ -816,11 +820,11 @@ var Button = forwardRef2(
816
820
  children: asChild ? isValidElement(children) ? cloneElement(
817
821
  children,
818
822
  void 0,
819
- showIcon && (loading ? /* @__PURE__ */ jsx4("div", { className: cn(IconContainerVariants({ size: iconSize, variant: buttonVariant })), children: /* @__PURE__ */ jsx4(Loader22, { className: cn(loadingVariants({ loading, variant: buttonVariant })) }) }) : _iconLeft ? /* @__PURE__ */ jsx4("div", { className: cn(IconContainerVariants({ size: iconSize, variant: buttonVariant })), children: _iconLeft }) : null),
823
+ showIcon && (loading ? /* @__PURE__ */ jsx4("div", { className: cn(IconContainerVariants({ size: iconSize, variant: buttonVariant })), children: /* @__PURE__ */ jsx4(Icons.loader, { className: cn(loadingVariants({ loading, variant: buttonVariant })) }) }) : _iconLeft ? /* @__PURE__ */ jsx4("div", { className: cn(IconContainerVariants({ size: iconSize, variant: buttonVariant })), children: _iconLeft }) : null),
820
824
  children.props?.children && /* @__PURE__ */ jsx4("span", { className: "truncate", children: children.props.children }),
821
825
  iconRight && !loading && /* @__PURE__ */ jsx4("div", { className: cn(IconContainerVariants({ size: iconSize, variant: buttonVariant })), children: iconRight })
822
826
  ) : null : /* @__PURE__ */ jsxs3(Fragment, { children: [
823
- showIcon && (loading ? /* @__PURE__ */ jsx4("div", { className: cn(IconContainerVariants({ size: iconSize, variant: buttonVariant })), children: /* @__PURE__ */ jsx4(Loader22, { className: cn(loadingVariants({ loading, variant: buttonVariant })) }) }) : _iconLeft ? /* @__PURE__ */ jsx4("div", { className: cn(IconContainerVariants({ size: iconSize, variant: buttonVariant })), children: _iconLeft }) : null),
827
+ showIcon && (loading ? /* @__PURE__ */ jsx4("div", { className: cn(IconContainerVariants({ size: iconSize, variant: buttonVariant })), children: /* @__PURE__ */ jsx4(Icons.loader, { className: cn(loadingVariants({ loading, variant: buttonVariant })) }) }) : _iconLeft ? /* @__PURE__ */ jsx4("div", { className: cn(IconContainerVariants({ size: iconSize, variant: buttonVariant })), children: _iconLeft }) : null),
824
828
  " ",
825
829
  children && /* @__PURE__ */ jsx4("span", { className: "truncate", children }),
826
830
  " ",
@@ -999,11 +1003,10 @@ var Input = React3.forwardRef(
999
1003
  Input.displayName = "Input";
1000
1004
 
1001
1005
  // src/components/ui/spinner.tsx
1002
- import { Loader2Icon } from "lucide-react";
1003
1006
  import { jsx as jsx7 } from "react/jsx-runtime";
1004
1007
  function Spinner({ className, ...props }) {
1005
1008
  return /* @__PURE__ */ jsx7(
1006
- Loader2Icon,
1009
+ Icons.loader,
1007
1010
  {
1008
1011
  role: "status",
1009
1012
  "aria-label": "Loading",
@@ -1711,7 +1714,6 @@ function Badge({
1711
1714
 
1712
1715
  // src/components/ui/breadcrumb.tsx
1713
1716
  import { Slot as Slot2 } from "@radix-ui/react-slot";
1714
- import { ChevronRight as ChevronRight2, MoreHorizontal as MoreHorizontal2 } from "lucide-react";
1715
1717
  import { jsx as jsx13, jsxs as jsxs8 } from "react/jsx-runtime";
1716
1718
  function Breadcrumb({ ...props }) {
1717
1719
  return /* @__PURE__ */ jsx13("nav", { "aria-label": "breadcrumb", "data-slot": "breadcrumb", ...props });
@@ -1786,7 +1788,7 @@ function BreadcrumbSeparator({
1786
1788
  "aria-hidden": "true",
1787
1789
  className: cn("[&>svg]:size-3.5", className),
1788
1790
  ...props,
1789
- children: children ?? /* @__PURE__ */ jsx13(ChevronRight2, {})
1791
+ children: children ?? /* @__PURE__ */ jsx13(Icons.chevronRight, {})
1790
1792
  }
1791
1793
  );
1792
1794
  }
@@ -1803,7 +1805,7 @@ function BreadcrumbEllipsis({
1803
1805
  className: cn("flex size-9 items-center justify-center", className),
1804
1806
  ...props,
1805
1807
  children: [
1806
- /* @__PURE__ */ jsx13(MoreHorizontal2, { className: "size-4" }),
1808
+ /* @__PURE__ */ jsx13(Icons.moreHorizontal, { className: "size-4" }),
1807
1809
  /* @__PURE__ */ jsx13("span", { className: "sr-only", children: "More" })
1808
1810
  ]
1809
1811
  }
@@ -1937,7 +1939,6 @@ function ButtonGroupSeparator({
1937
1939
  }
1938
1940
 
1939
1941
  // src/components/ui/calendar.tsx
1940
- import { ChevronLeft as ChevronLeft2, ChevronRight as ChevronRight3 } from "lucide-react";
1941
1942
  import { DayPicker } from "react-day-picker";
1942
1943
  import { DayPicker as PersianDayPicker } from "react-day-picker/persian";
1943
1944
  import { enUS } from "date-fns/locale";
@@ -2022,14 +2023,14 @@ function Calendar2({
2022
2023
  Chevron: ({ orientation }) => {
2023
2024
  if (usePersianCalendar) {
2024
2025
  if (orientation === "left") {
2025
- return /* @__PURE__ */ jsx16(ChevronRight3, { className: "h-4 w-4" });
2026
+ return /* @__PURE__ */ jsx16(Icons.chevronRight, { className: "h-4 w-4" });
2026
2027
  }
2027
- return /* @__PURE__ */ jsx16(ChevronLeft2, { className: "h-4 w-4" });
2028
+ return /* @__PURE__ */ jsx16(Icons.chevronLeft, { className: "h-4 w-4" });
2028
2029
  }
2029
2030
  if (orientation === "left") {
2030
- return /* @__PURE__ */ jsx16(ChevronLeft2, { className: "h-4 w-4" });
2031
+ return /* @__PURE__ */ jsx16(Icons.chevronLeft, { className: "h-4 w-4" });
2031
2032
  }
2032
- return /* @__PURE__ */ jsx16(ChevronRight3, { className: "h-4 w-4" });
2033
+ return /* @__PURE__ */ jsx16(Icons.chevronRight, { className: "h-4 w-4" });
2033
2034
  }
2034
2035
  },
2035
2036
  ...props
@@ -2081,7 +2082,6 @@ CardFooter.displayName = "CardFooter";
2081
2082
  // src/components/ui/carousel.tsx
2082
2083
  import * as React8 from "react";
2083
2084
  import useEmblaCarousel from "embla-carousel-react";
2084
- import { ArrowLeft as ArrowLeft2, ArrowRight as ArrowRight2 } from "lucide-react";
2085
2085
  import { jsx as jsx18, jsxs as jsxs10 } from "react/jsx-runtime";
2086
2086
  var CarouselContext = React8.createContext(null);
2087
2087
  function useCarousel() {
@@ -2275,7 +2275,7 @@ function CarouselPrevious({
2275
2275
  onClick: scrollPrev,
2276
2276
  ...props,
2277
2277
  children: [
2278
- isRTL ? /* @__PURE__ */ jsx18(ArrowRight2, {}) : /* @__PURE__ */ jsx18(ArrowLeft2, {}),
2278
+ isRTL ? /* @__PURE__ */ jsx18(Icons.arrowRight, {}) : /* @__PURE__ */ jsx18(Icons.arrowLeft, {}),
2279
2279
  /* @__PURE__ */ jsx18("span", { className: "sr-only", children: "Previous slide" })
2280
2280
  ]
2281
2281
  }
@@ -2306,7 +2306,7 @@ function CarouselNext({
2306
2306
  onClick: scrollNext,
2307
2307
  ...props,
2308
2308
  children: [
2309
- isRTL ? /* @__PURE__ */ jsx18(ArrowLeft2, {}) : /* @__PURE__ */ jsx18(ArrowRight2, {}),
2309
+ isRTL ? /* @__PURE__ */ jsx18(Icons.arrowLeft, {}) : /* @__PURE__ */ jsx18(Icons.arrowRight, {}),
2310
2310
  /* @__PURE__ */ jsx18("span", { className: "sr-only", children: "Next slide" })
2311
2311
  ]
2312
2312
  }
@@ -2315,7 +2315,6 @@ function CarouselNext({
2315
2315
 
2316
2316
  // src/components/ui/checkbox.tsx
2317
2317
  import * as CheckboxPrimitive from "@radix-ui/react-checkbox";
2318
- import { CheckIcon } from "lucide-react";
2319
2318
  import { jsx as jsx19 } from "react/jsx-runtime";
2320
2319
  function Checkbox({
2321
2320
  className,
@@ -2335,7 +2334,7 @@ function Checkbox({
2335
2334
  {
2336
2335
  "data-slot": "checkbox-indicator",
2337
2336
  className: "grid place-content-center text-current transition-none",
2338
- children: /* @__PURE__ */ jsx19(CheckIcon, { className: "size-3.5" })
2337
+ children: /* @__PURE__ */ jsx19(Icons.check, { className: "size-3.5" })
2339
2338
  }
2340
2339
  )
2341
2340
  }
@@ -2375,12 +2374,10 @@ function CollapsibleContent2({
2375
2374
 
2376
2375
  // src/components/ui/command.tsx
2377
2376
  import { Command as CommandPrimitive } from "cmdk";
2378
- import { SearchIcon } from "lucide-react";
2379
2377
 
2380
2378
  // src/components/ui/dialog.tsx
2381
2379
  import * as React9 from "react";
2382
2380
  import * as DialogPrimitive from "@radix-ui/react-dialog";
2383
- import { X as X2 } from "lucide-react";
2384
2381
  import { jsx as jsx21, jsxs as jsxs11 } from "react/jsx-runtime";
2385
2382
  var Dialog = DialogPrimitive.Root;
2386
2383
  var DialogTrigger = DialogPrimitive.Trigger;
@@ -2412,7 +2409,7 @@ var DialogContent = React9.forwardRef(({ className, children, ...props }, ref) =
2412
2409
  children: [
2413
2410
  children,
2414
2411
  /* @__PURE__ */ jsxs11(DialogPrimitive.Close, { className: "absolute end-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-brand-default focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-selection data-[state=open]:text-foreground-muted", children: [
2415
- /* @__PURE__ */ jsx21(X2, { className: "h-4 w-4" }),
2412
+ /* @__PURE__ */ jsx21(Icons.close, { className: "h-4 w-4" }),
2416
2413
  /* @__PURE__ */ jsx21("span", { className: "sr-only", children: "Close" })
2417
2414
  ] })
2418
2415
  ]
@@ -2519,7 +2516,7 @@ function CommandInput({
2519
2516
  "data-slot": "command-input-wrapper",
2520
2517
  className: "flex h-9 items-center gap-2 border-b px-3",
2521
2518
  children: [
2522
- /* @__PURE__ */ jsx22(SearchIcon, { className: "size-4 shrink-0 opacity-50" }),
2519
+ /* @__PURE__ */ jsx22(Icons.search, { className: "size-4 shrink-0 opacity-50" }),
2523
2520
  /* @__PURE__ */ jsx22(
2524
2521
  CommandPrimitive.Input,
2525
2522
  {
@@ -2698,7 +2695,6 @@ CommentCard.displayName = "CommentCard";
2698
2695
 
2699
2696
  // src/components/ui/context-menu.tsx
2700
2697
  import * as ContextMenuPrimitive from "@radix-ui/react-context-menu";
2701
- import { CheckIcon as CheckIcon2, ChevronRightIcon, CircleIcon } from "lucide-react";
2702
2698
  import { jsx as jsx24, jsxs as jsxs14 } from "react/jsx-runtime";
2703
2699
  function ContextMenu({
2704
2700
  ...props
@@ -2754,7 +2750,7 @@ function ContextMenuSubTrigger({
2754
2750
  ...props,
2755
2751
  children: [
2756
2752
  children,
2757
- /* @__PURE__ */ jsx24(ChevronRightIcon, { className: "ms-auto rtl:rotate-180" })
2753
+ /* @__PURE__ */ jsx24(Icons.chevronRight, { className: "ms-auto rtl:rotate-180" })
2758
2754
  ]
2759
2755
  }
2760
2756
  );
@@ -2828,7 +2824,7 @@ function ContextMenuCheckboxItem({
2828
2824
  checked,
2829
2825
  ...props,
2830
2826
  children: [
2831
- /* @__PURE__ */ jsx24("span", { className: "pointer-events-none absolute start-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ jsx24(ContextMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx24(CheckIcon2, { className: "size-4" }) }) }),
2827
+ /* @__PURE__ */ jsx24("span", { className: "pointer-events-none absolute start-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ jsx24(ContextMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx24(Icons.check, { className: "size-4" }) }) }),
2832
2828
  children
2833
2829
  ]
2834
2830
  }
@@ -2849,7 +2845,7 @@ function ContextMenuRadioItem({
2849
2845
  ),
2850
2846
  ...props,
2851
2847
  children: [
2852
- /* @__PURE__ */ jsx24("span", { className: "pointer-events-none absolute start-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ jsx24(ContextMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx24(CircleIcon, { className: "size-2 fill-current" }) }) }),
2848
+ /* @__PURE__ */ jsx24("span", { className: "pointer-events-none absolute start-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ jsx24(ContextMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx24(Icons.circle, { className: "size-2 fill-current" }) }) }),
2853
2849
  children
2854
2850
  ]
2855
2851
  }
@@ -2904,8 +2900,7 @@ function ContextMenuShortcut({
2904
2900
  }
2905
2901
 
2906
2902
  // src/components/ui/date-picker.tsx
2907
- import { format, subDays, subMonths, subYears } from "date-fns";
2908
- import { Calendar as CalendarIcon } from "lucide-react";
2903
+ import { format as format2, subDays, subMonths, subYears } from "date-fns";
2909
2904
 
2910
2905
  // src/components/ui/popover.tsx
2911
2906
  import * as React11 from "react";
@@ -2948,12 +2943,12 @@ function formatDateRange(range, usePersianCalendar) {
2948
2943
  if (range.from) {
2949
2944
  const isSameDate = range.from && range.to && range.from.getTime() === range.to.getTime();
2950
2945
  if (range.to && !isSameDate) {
2951
- return `${format(range.from, "LLL dd, y")} - ${format(
2946
+ return `${format2(range.from, "LLL dd, y")} - ${format2(
2952
2947
  range.to,
2953
2948
  "LLL dd, y"
2954
2949
  )}`;
2955
2950
  } else {
2956
- return format(range.from, "LLL dd, y");
2951
+ return format2(range.from, "LLL dd, y");
2957
2952
  }
2958
2953
  }
2959
2954
  return "";
@@ -3045,7 +3040,7 @@ function DatePicker({
3045
3040
  !value && "text-muted-foreground"
3046
3041
  ),
3047
3042
  disabled,
3048
- iconLeft: /* @__PURE__ */ jsx26(CalendarIcon, { className: "h-4 w-4" }),
3043
+ iconLeft: /* @__PURE__ */ jsx26(Icons.calendar, { className: "h-4 w-4" }),
3049
3044
  children: displayText || placeholder || defaultPlaceholder
3050
3045
  }
3051
3046
  ) }),
@@ -3104,7 +3099,6 @@ function DatePicker({
3104
3099
 
3105
3100
  // src/components/ui/date-range-picker.tsx
3106
3101
  import * as React12 from "react";
3107
- import { CalendarIcon as CalendarIcon2, ChevronDownIcon as ChevronDownIcon2 } from "lucide-react";
3108
3102
 
3109
3103
  // src/components/ui/label.tsx
3110
3104
  import * as LabelPrimitive from "@radix-ui/react-label";
@@ -3170,7 +3164,7 @@ function DateRangePicker({
3170
3164
  ),
3171
3165
  children: [
3172
3166
  formatDateRange2(value),
3173
- /* @__PURE__ */ jsx28(ChevronDownIcon2, { className: "size-4 opacity-50" })
3167
+ /* @__PURE__ */ jsx28(Icons.chevronDown, { className: "size-4 opacity-50" })
3174
3168
  ]
3175
3169
  }
3176
3170
  ) }),
@@ -3237,7 +3231,7 @@ function DateRangePickerInline({
3237
3231
  ),
3238
3232
  children: [
3239
3233
  formatDateRange2(value),
3240
- /* @__PURE__ */ jsx28(CalendarIcon2, { className: "size-4 opacity-50" })
3234
+ /* @__PURE__ */ jsx28(Icons.calendar, { className: "size-4 opacity-50" })
3241
3235
  ]
3242
3236
  }
3243
3237
  ) }),
@@ -3385,7 +3379,6 @@ function DrawerDescription({
3385
3379
 
3386
3380
  // src/components/ui/dropdown-menu.tsx
3387
3381
  import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu";
3388
- import { CheckIcon as CheckIcon3, ChevronRightIcon as ChevronRightIcon2, CircleIcon as CircleIcon2 } from "lucide-react";
3389
3382
  import { jsx as jsx30, jsxs as jsxs18 } from "react/jsx-runtime";
3390
3383
  function DropdownMenu({
3391
3384
  ...props
@@ -3468,7 +3461,7 @@ function DropdownMenuCheckboxItem({
3468
3461
  checked,
3469
3462
  ...props,
3470
3463
  children: [
3471
- /* @__PURE__ */ jsx30("span", { className: "pointer-events-none absolute start-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ jsx30(DropdownMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx30(CheckIcon3, { className: "size-4" }) }) }),
3464
+ /* @__PURE__ */ jsx30("span", { className: "pointer-events-none absolute start-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ jsx30(DropdownMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx30(Icons.check, { className: "size-4" }) }) }),
3472
3465
  children
3473
3466
  ]
3474
3467
  }
@@ -3500,7 +3493,7 @@ function DropdownMenuRadioItem({
3500
3493
  ),
3501
3494
  ...props,
3502
3495
  children: [
3503
- /* @__PURE__ */ jsx30("span", { className: "pointer-events-none absolute start-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ jsx30(DropdownMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx30(CircleIcon2, { className: "size-2 fill-current" }) }) }),
3496
+ /* @__PURE__ */ jsx30("span", { className: "pointer-events-none absolute start-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ jsx30(DropdownMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx30(Icons.circle, { className: "size-2 fill-current" }) }) }),
3504
3497
  children
3505
3498
  ]
3506
3499
  }
@@ -3576,7 +3569,7 @@ function DropdownMenuSubTrigger({
3576
3569
  ...props,
3577
3570
  children: [
3578
3571
  children,
3579
- /* @__PURE__ */ jsx30(ChevronRightIcon2, { className: "ms-auto size-4 rtl:rotate-180" })
3572
+ /* @__PURE__ */ jsx30(Icons.chevronRight, { className: "ms-auto size-4 rtl:rotate-180" })
3580
3573
  ]
3581
3574
  }
3582
3575
  );
@@ -4010,7 +4003,6 @@ function HoverCardContent({
4010
4003
 
4011
4004
  // src/components/ui/tag-input.tsx
4012
4005
  import * as React14 from "react";
4013
- import { X as X3 } from "lucide-react";
4014
4006
  import { cva as cva7 } from "class-variance-authority";
4015
4007
  import { jsx as jsx35, jsxs as jsxs20 } from "react/jsx-runtime";
4016
4008
  var tagInputVariants = cva7(
@@ -4104,7 +4096,7 @@ var TagInput = React14.forwardRef(
4104
4096
  className: "rounded-full outline-none ring-offset-background focus:ring-2 focus:ring-ring focus:ring-offset-2 hover:!bg-primary/20 transition-colors",
4105
4097
  disabled,
4106
4098
  children: [
4107
- /* @__PURE__ */ jsx35(X3, { className: "h-3 w-3 text-muted-foreground" }),
4099
+ /* @__PURE__ */ jsx35(Icons.close, { className: "h-3 w-3 text-muted-foreground" }),
4108
4100
  /* @__PURE__ */ jsxs20("span", { className: "sr-only", children: [
4109
4101
  "Remove ",
4110
4102
  tag
@@ -4138,7 +4130,6 @@ TagInput.displayName = "TagInput";
4138
4130
 
4139
4131
  // src/components/ui/hashtag-input.tsx
4140
4132
  import * as React15 from "react";
4141
- import { X as X4 } from "lucide-react";
4142
4133
  import { cva as cva8 } from "class-variance-authority";
4143
4134
  import { jsx as jsx36, jsxs as jsxs21 } from "react/jsx-runtime";
4144
4135
  var hashtagInputVariants = cva8(
@@ -4233,7 +4224,7 @@ var HashtagInput = React15.forwardRef(
4233
4224
  className: "rounded-full outline-none ring-offset-background focus:ring-2 focus:ring-ring focus:ring-offset-2 hover:!bg-primary/20 transition-colors",
4234
4225
  disabled,
4235
4226
  children: [
4236
- /* @__PURE__ */ jsx36(X4, { className: "h-3 w-3 text-muted-foreground" }),
4227
+ /* @__PURE__ */ jsx36(Icons.close, { className: "h-3 w-3 text-muted-foreground" }),
4237
4228
  /* @__PURE__ */ jsxs21("span", { className: "sr-only", children: [
4238
4229
  "Remove ",
4239
4230
  tag
@@ -4458,7 +4449,6 @@ function InputGroupTextarea({
4458
4449
  // src/components/ui/input-otp.tsx
4459
4450
  import * as React17 from "react";
4460
4451
  import { OTPInput, OTPInputContext } from "input-otp";
4461
- import { MinusIcon } from "lucide-react";
4462
4452
  import { jsx as jsx39, jsxs as jsxs22 } from "react/jsx-runtime";
4463
4453
  function InputOTP({
4464
4454
  className,
@@ -4524,7 +4514,7 @@ function InputOTPSeparator({ ...props }) {
4524
4514
  role: "separator",
4525
4515
  dir: "ltr",
4526
4516
  ...props,
4527
- children: /* @__PURE__ */ jsx39(MinusIcon, {})
4517
+ children: /* @__PURE__ */ jsx39(Icons.minus, {})
4528
4518
  }
4529
4519
  );
4530
4520
  }
@@ -4555,7 +4545,6 @@ var TooltipContent = React18.forwardRef(({ className, sideOffset = 4, ...props }
4555
4545
  TooltipContent.displayName = TooltipPrimitive.Content.displayName;
4556
4546
 
4557
4547
  // src/components/ui/instagram-post.tsx
4558
- import { ImageOff } from "lucide-react";
4559
4548
  import { Fragment as Fragment4, jsx as jsx41, jsxs as jsxs23 } from "react/jsx-runtime";
4560
4549
  var instagramPostVariants = cva10(
4561
4550
  "relative border bg-background-surface-100",
@@ -4581,7 +4570,7 @@ function InstagramPostMedia({
4581
4570
  const handleImageError = (url) => {
4582
4571
  setImageError((prev) => ({ ...prev, [url]: true }));
4583
4572
  };
4584
- const renderPlaceholder = () => /* @__PURE__ */ jsx41("div", { className: "w-full h-full flex items-center justify-center bg-muted/10 dark:bg-muted/5", children: /* @__PURE__ */ jsx41(ImageOff, { className: "size-12 text-muted-foreground/50" }) });
4573
+ const renderPlaceholder = () => /* @__PURE__ */ jsx41("div", { className: "w-full h-full flex items-center justify-center bg-muted/10 dark:bg-muted/5", children: /* @__PURE__ */ jsx41(Icons.imageOff, { className: "size-12 text-muted-foreground/50" }) });
4585
4574
  if (!media || media.length === 0) {
4586
4575
  return /* @__PURE__ */ jsx41(
4587
4576
  "div",
@@ -4591,7 +4580,7 @@ function InstagramPostMedia({
4591
4580
  variant === "vertical" ? "aspect-square" : "w-[20%] shrink-0 h-full min-h-[200px] -my-[1px] -ms-[1px]"
4592
4581
  ),
4593
4582
  children: /* @__PURE__ */ jsxs23("div", { className: "text-center p-4", children: [
4594
- /* @__PURE__ */ jsx41(ImageOff, { className: "size-12 mx-auto mb-2 text-muted-foreground" }),
4583
+ /* @__PURE__ */ jsx41(Icons.imageOff, { className: "size-12 mx-auto mb-2 text-muted-foreground" }),
4595
4584
  /* @__PURE__ */ jsx41("p", { className: "text-sm text-muted-foreground", children: placeholderText })
4596
4585
  ] })
4597
4586
  }
@@ -5193,7 +5182,6 @@ function KbdGroup({ className, ...props }) {
5193
5182
 
5194
5183
  // src/components/ui/menubar.tsx
5195
5184
  import * as MenubarPrimitive from "@radix-ui/react-menubar";
5196
- import { CheckIcon as CheckIcon4, ChevronRightIcon as ChevronRightIcon3, CircleIcon as CircleIcon3 } from "lucide-react";
5197
5185
  import { jsx as jsx43, jsxs as jsxs24 } from "react/jsx-runtime";
5198
5186
  function Menubar({
5199
5187
  className,
@@ -5306,7 +5294,7 @@ function MenubarCheckboxItem({
5306
5294
  checked,
5307
5295
  ...props,
5308
5296
  children: [
5309
- /* @__PURE__ */ jsx43("span", { className: "pointer-events-none absolute start-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ jsx43(MenubarPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx43(CheckIcon4, { className: "size-4" }) }) }),
5297
+ /* @__PURE__ */ jsx43("span", { className: "pointer-events-none absolute start-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ jsx43(MenubarPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx43(Icons.check, { className: "size-4" }) }) }),
5310
5298
  children
5311
5299
  ]
5312
5300
  }
@@ -5327,7 +5315,7 @@ function MenubarRadioItem({
5327
5315
  ),
5328
5316
  ...props,
5329
5317
  children: [
5330
- /* @__PURE__ */ jsx43("span", { className: "pointer-events-none absolute start-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ jsx43(MenubarPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx43(CircleIcon3, { className: "size-2 fill-current" }) }) }),
5318
+ /* @__PURE__ */ jsx43("span", { className: "pointer-events-none absolute start-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ jsx43(MenubarPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx43(Icons.circle, { className: "size-2 fill-current" }) }) }),
5331
5319
  children
5332
5320
  ]
5333
5321
  }
@@ -5403,7 +5391,7 @@ function MenubarSubTrigger({
5403
5391
  ...props,
5404
5392
  children: [
5405
5393
  children,
5406
- /* @__PURE__ */ jsx43(ChevronRightIcon3, { className: "ms-auto h-4 w-4 rtl:rotate-180" })
5394
+ /* @__PURE__ */ jsx43(Icons.chevronRight, { className: "ms-auto h-4 w-4 rtl:rotate-180" })
5407
5395
  ]
5408
5396
  }
5409
5397
  );
@@ -5427,8 +5415,7 @@ function MenubarSubContent({
5427
5415
 
5428
5416
  // src/components/ui/metric-card.tsx
5429
5417
  import * as React20 from "react";
5430
- import { ExternalLink, Info as Info2 } from "lucide-react";
5431
- import { format as format2 } from "date-fns";
5418
+ import { format as format3 } from "date-fns";
5432
5419
 
5433
5420
  // src/components/ui/skeleton.tsx
5434
5421
  import { jsx as jsx44 } from "react/jsx-runtime";
@@ -5466,7 +5453,7 @@ var MetricCard = React20.forwardRef(
5466
5453
  Card,
5467
5454
  {
5468
5455
  ref,
5469
- className: cn("py-4 space-y-3", className),
5456
+ className: cn("py-4 space-y-3 @container", className),
5470
5457
  ...props,
5471
5458
  children
5472
5459
  }
@@ -5491,7 +5478,7 @@ var MetricCardHeader = React20.forwardRef(
5491
5478
  target: "_blank",
5492
5479
  rel: "noopener noreferrer",
5493
5480
  className: "text-foreground-lighter hover:text-foreground transition-colors",
5494
- children: /* @__PURE__ */ jsx45(ExternalLink, { className: "h-3.5 w-3.5" })
5481
+ children: /* @__PURE__ */ jsx45(Icons.externalLink, { className: "h-3.5 w-3.5" })
5495
5482
  }
5496
5483
  )
5497
5484
  ]
@@ -5521,7 +5508,7 @@ var MetricCardLabel = React20.forwardRef(
5521
5508
  return /* @__PURE__ */ jsx45(TooltipProvider, { children: /* @__PURE__ */ jsxs25(Tooltip, { children: [
5522
5509
  /* @__PURE__ */ jsx45(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxs25("div", { className: "flex items-center gap-1.5 cursor-help", children: [
5523
5510
  label,
5524
- /* @__PURE__ */ jsx45(Info2, { className: "h-3.5 w-3.5 text-foreground-lighter" })
5511
+ /* @__PURE__ */ jsx45(Icons.info, { className: "h-3.5 w-3.5 text-foreground-lighter" })
5525
5512
  ] }) }),
5526
5513
  /* @__PURE__ */ jsx45(TooltipContent, { children: /* @__PURE__ */ jsx45("p", { className: "max-w-xs", children: tooltip }) })
5527
5514
  ] }) });
@@ -5649,7 +5636,7 @@ var MetricCardSparkline = React20.forwardRef(
5649
5636
  const jalaliDate = formatJalaliDate(date, "jD jMMMM");
5650
5637
  return toPersianDigits(jalaliDate);
5651
5638
  } else {
5652
- return format2(date, "MMM d");
5639
+ return format3(date, "MMM d");
5653
5640
  }
5654
5641
  };
5655
5642
  return /* @__PURE__ */ jsxs25(
@@ -5780,7 +5767,6 @@ var MetricCardSparkline = React20.forwardRef(
5780
5767
  MetricCardSparkline.displayName = "MetricCardSparkline";
5781
5768
 
5782
5769
  // src/components/ui/native-select.tsx
5783
- import { ChevronDownIcon as ChevronDownIcon3 } from "lucide-react";
5784
5770
  import { jsx as jsx46, jsxs as jsxs26 } from "react/jsx-runtime";
5785
5771
  function NativeSelect({ className, ...props }) {
5786
5772
  return /* @__PURE__ */ jsxs26(
@@ -5812,7 +5798,7 @@ function NativeSelect({ className, ...props }) {
5812
5798
  }
5813
5799
  ),
5814
5800
  /* @__PURE__ */ jsx46(
5815
- ChevronDownIcon3,
5801
+ Icons.chevronDown,
5816
5802
  {
5817
5803
  className: "pointer-events-none absolute top-1/2 end-3 size-4 -translate-y-1/2 text-foreground-muted select-none",
5818
5804
  "aria-hidden": "true",
@@ -5843,7 +5829,6 @@ function NativeSelectOptGroup({
5843
5829
  // src/components/ui/navigation-menu.tsx
5844
5830
  import * as NavigationMenuPrimitive from "@radix-ui/react-navigation-menu";
5845
5831
  import { cva as cva11 } from "class-variance-authority";
5846
- import { ChevronDownIcon as ChevronDownIcon4 } from "lucide-react";
5847
5832
  import { jsx as jsx47, jsxs as jsxs27 } from "react/jsx-runtime";
5848
5833
  function NavigationMenu({
5849
5834
  className,
@@ -5915,7 +5900,7 @@ function NavigationMenuTrigger({
5915
5900
  children,
5916
5901
  " ",
5917
5902
  /* @__PURE__ */ jsx47(
5918
- ChevronDownIcon4,
5903
+ Icons.chevronDown,
5919
5904
  {
5920
5905
  className: "relative top-[1px] ms-1 size-3 transition duration-300 group-data-[state=open]:rotate-180",
5921
5906
  "aria-hidden": "true"
@@ -6002,11 +5987,6 @@ function NavigationMenuIndicator({
6002
5987
 
6003
5988
  // src/components/ui/pagination.tsx
6004
5989
  import * as React21 from "react";
6005
- import {
6006
- ChevronLeftIcon,
6007
- ChevronRightIcon as ChevronRightIcon4,
6008
- MoreHorizontalIcon
6009
- } from "lucide-react";
6010
5990
  import { Fragment as Fragment6, jsx as jsx48, jsxs as jsxs28 } from "react/jsx-runtime";
6011
5991
  var PaginationDirectionContext = React21.createContext("rtl");
6012
5992
  function usePaginationDirection() {
@@ -6095,7 +6075,7 @@ function PaginationPrevious({
6095
6075
  const dir = usePaginationDirection();
6096
6076
  const isRTL = dir === "rtl";
6097
6077
  const label = isRTL ? "\u0642\u0628\u0644\u06CC" : "Previous";
6098
- const Icon2 = isRTL ? ChevronRightIcon4 : ChevronLeftIcon;
6078
+ const Icon2 = isRTL ? Icons.chevronRight : Icons.chevronLeft;
6099
6079
  return /* @__PURE__ */ jsxs28(
6100
6080
  PaginationLink,
6101
6081
  {
@@ -6121,7 +6101,7 @@ function PaginationNext({
6121
6101
  const dir = usePaginationDirection();
6122
6102
  const isRTL = dir === "rtl";
6123
6103
  const label = isRTL ? "\u0628\u0639\u062F\u06CC" : "Next";
6124
- const Icon2 = isRTL ? ChevronLeftIcon : ChevronRightIcon4;
6104
+ const Icon2 = isRTL ? Icons.chevronLeft : Icons.chevronRight;
6125
6105
  return /* @__PURE__ */ jsx48(
6126
6106
  PaginationLink,
6127
6107
  {
@@ -6155,7 +6135,7 @@ function PaginationEllipsis({
6155
6135
  className: cn("flex size-9 items-center justify-center", className),
6156
6136
  ...props,
6157
6137
  children: [
6158
- /* @__PURE__ */ jsx48(MoreHorizontalIcon, { className: "size-4" }),
6138
+ /* @__PURE__ */ jsx48(Icons.moreHorizontal, { className: "size-4" }),
6159
6139
  /* @__PURE__ */ jsx48("span", { className: "sr-only", children: "More pages" })
6160
6140
  ]
6161
6141
  }
@@ -6356,7 +6336,7 @@ var ProfileCard = React22.forwardRef(
6356
6336
  {
6357
6337
  ref,
6358
6338
  className: cn(
6359
- "flex flex-col items-center rounded-lg shadow-sm transition-colors",
6339
+ "flex flex-col items-center rounded-lg shadow-sm transition-colors @container",
6360
6340
  variantClasses[variant],
6361
6341
  currentSize.container,
6362
6342
  onCardClick && "cursor-pointer hover:bg-surface-200",
@@ -6520,7 +6500,6 @@ ProfileInfo.displayName = "ProfileInfo";
6520
6500
 
6521
6501
  // src/components/ui/engagement-rate.tsx
6522
6502
  import * as React24 from "react";
6523
- import { TrendingUp, Users as Users2, UserCheck, Award, Crown } from "lucide-react";
6524
6503
  import { jsx as jsx52, jsxs as jsxs32 } from "react/jsx-runtime";
6525
6504
  var convertToLocalNumbers2 = (text, locale) => {
6526
6505
  if (locale === "fa" || locale === "ar") {
@@ -6580,17 +6559,17 @@ var getGroupIcon = (group) => {
6580
6559
  const iconClass = "w-12 h-12 text-primary";
6581
6560
  switch (group) {
6582
6561
  case "nano":
6583
- return /* @__PURE__ */ jsx52(Users2, { className: iconClass });
6562
+ return /* @__PURE__ */ jsx52(Icons.users, { className: iconClass });
6584
6563
  case "micro":
6585
- return /* @__PURE__ */ jsx52(UserCheck, { className: iconClass });
6564
+ return /* @__PURE__ */ jsx52(Icons.userCheck, { className: iconClass });
6586
6565
  case "mid":
6587
- return /* @__PURE__ */ jsx52(TrendingUp, { className: iconClass });
6566
+ return /* @__PURE__ */ jsx52(Icons.trendingUp, { className: iconClass });
6588
6567
  case "macro":
6589
- return /* @__PURE__ */ jsx52(Award, { className: iconClass });
6568
+ return /* @__PURE__ */ jsx52(Icons.award, { className: iconClass });
6590
6569
  case "mega":
6591
- return /* @__PURE__ */ jsx52(Crown, { className: iconClass });
6570
+ return /* @__PURE__ */ jsx52(Icons.crown, { className: iconClass });
6592
6571
  default:
6593
- return /* @__PURE__ */ jsx52(Users2, { className: iconClass });
6572
+ return /* @__PURE__ */ jsx52(Icons.users, { className: iconClass });
6594
6573
  }
6595
6574
  };
6596
6575
  var translations = {
@@ -7250,7 +7229,6 @@ function Progress({
7250
7229
 
7251
7230
  // src/components/ui/radio-group.tsx
7252
7231
  import * as RadioGroupPrimitive from "@radix-ui/react-radio-group";
7253
- import { CircleIcon as CircleIcon4 } from "lucide-react";
7254
7232
  import { jsx as jsx55 } from "react/jsx-runtime";
7255
7233
  function RadioGroup4({
7256
7234
  className,
@@ -7283,7 +7261,7 @@ function RadioGroupItem({
7283
7261
  {
7284
7262
  "data-slot": "radio-group-indicator",
7285
7263
  className: "relative flex items-center justify-center",
7286
- children: /* @__PURE__ */ jsx55(CircleIcon4, { className: "fill-brand absolute top-1/2 start-1/2 size-2 -translate-x-1/2 -translate-y-1/2 rtl:translate-x-1/2" })
7264
+ children: /* @__PURE__ */ jsx55(Icons.circle, { className: "fill-brand absolute top-1/2 start-1/2 size-2 -translate-x-1/2 -translate-y-1/2 rtl:translate-x-1/2" })
7287
7265
  }
7288
7266
  )
7289
7267
  }
@@ -7351,7 +7329,6 @@ var RadioCardDescription = React26.forwardRef(({ className, ...props }, ref) =>
7351
7329
  RadioCardDescription.displayName = "RadioCardDescription";
7352
7330
 
7353
7331
  // src/components/ui/resizable.tsx
7354
- import { GripVerticalIcon } from "lucide-react";
7355
7332
  import * as ResizablePrimitive from "react-resizable-panels";
7356
7333
  import { jsx as jsx57 } from "react/jsx-runtime";
7357
7334
  function ResizablePanelGroup({
@@ -7389,7 +7366,7 @@ function ResizableHandle({
7389
7366
  className
7390
7367
  ),
7391
7368
  ...props,
7392
- children: withHandle && /* @__PURE__ */ jsx57("div", { className: "bg-border z-10 flex h-4 w-3 items-center justify-center rounded-xs border", children: /* @__PURE__ */ jsx57(GripVerticalIcon, { className: "size-2.5" }) })
7369
+ children: withHandle && /* @__PURE__ */ jsx57("div", { className: "bg-border z-10 flex h-4 w-3 items-center justify-center rounded-xs border", children: /* @__PURE__ */ jsx57(Icons.gripVertical, { className: "size-2.5" }) })
7393
7370
  }
7394
7371
  );
7395
7372
  }
@@ -7454,7 +7431,6 @@ function ScrollBar({
7454
7431
  // src/components/ui/select.tsx
7455
7432
  import * as React27 from "react";
7456
7433
  import * as SelectPrimitive from "@radix-ui/react-select";
7457
- import { Check as Check2, ChevronDown as ChevronDown2, ChevronUp as ChevronUp2 } from "lucide-react";
7458
7434
  import { cva as cva13 } from "class-variance-authority";
7459
7435
  import { jsx as jsx59, jsxs as jsxs36 } from "react/jsx-runtime";
7460
7436
  var Select = SelectPrimitive.Root;
@@ -7493,7 +7469,7 @@ var SelectTrigger = React27.forwardRef(({ className, children, size, ...props },
7493
7469
  ...props,
7494
7470
  children: [
7495
7471
  children,
7496
- /* @__PURE__ */ jsx59(SelectPrimitive.Icon, { asChild: true, children: /* @__PURE__ */ jsx59(ChevronDown2, { className: "h-4 w-4 text-foreground-lighter flex-shrink-0", strokeWidth: 1.5 }) })
7472
+ /* @__PURE__ */ jsx59(SelectPrimitive.Icon, { asChild: true, children: /* @__PURE__ */ jsx59(Icons.chevronDown, { className: "h-4 w-4 text-foreground-lighter flex-shrink-0", strokeWidth: 1.5 }) })
7497
7473
  ]
7498
7474
  }
7499
7475
  ));
@@ -7507,7 +7483,7 @@ var SelectScrollUpButton = React27.forwardRef(({ className, ...props }, ref) =>
7507
7483
  className
7508
7484
  ),
7509
7485
  ...props,
7510
- children: /* @__PURE__ */ jsx59(ChevronUp2, { className: "h-4 w-4" })
7486
+ children: /* @__PURE__ */ jsx59(Icons.chevronUp, { className: "h-4 w-4" })
7511
7487
  }
7512
7488
  ));
7513
7489
  SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName;
@@ -7520,7 +7496,7 @@ var SelectScrollDownButton = React27.forwardRef(({ className, ...props }, ref) =
7520
7496
  className
7521
7497
  ),
7522
7498
  ...props,
7523
- children: /* @__PURE__ */ jsx59(ChevronDown2, { className: "h-4 w-4" })
7499
+ children: /* @__PURE__ */ jsx59(Icons.chevronDown, { className: "h-4 w-4" })
7524
7500
  }
7525
7501
  ));
7526
7502
  SelectScrollDownButton.displayName = SelectPrimitive.ScrollDownButton.displayName;
@@ -7575,7 +7551,7 @@ var SelectItem = React27.forwardRef(({ className, children, ...props }, ref) =>
7575
7551
  ),
7576
7552
  ...props,
7577
7553
  children: [
7578
- /* @__PURE__ */ jsx59("span", { className: "absolute start-2 flex h-3.5 w-3.5 items-center justify-center", children: /* @__PURE__ */ jsx59(SelectPrimitive.ItemIndicator, { className: "h-3.5 w-3.5 bg-foreground rounded-full flex justify-center items-center", children: /* @__PURE__ */ jsx59(Check2, { className: "h-2 w-2 text-background-overlay", strokeWidth: 6 }) }) }),
7554
+ /* @__PURE__ */ jsx59("span", { className: "absolute start-2 flex h-3.5 w-3.5 items-center justify-center", children: /* @__PURE__ */ jsx59(SelectPrimitive.ItemIndicator, { className: "h-3.5 w-3.5 bg-foreground rounded-full flex justify-center items-center", children: /* @__PURE__ */ jsx59(Icons.check, { className: "h-2 w-2 text-background-overlay", strokeWidth: 6 }) }) }),
7579
7555
  /* @__PURE__ */ jsx59(SelectPrimitive.ItemText, { children: typeof children === "string" ? /* @__PURE__ */ jsx59("span", { children }) : children })
7580
7556
  ]
7581
7557
  }
@@ -7593,7 +7569,6 @@ SelectSeparator.displayName = SelectPrimitive.Separator.displayName;
7593
7569
 
7594
7570
  // src/components/ui/sheet.tsx
7595
7571
  import * as SheetPrimitive from "@radix-ui/react-dialog";
7596
- import { XIcon } from "lucide-react";
7597
7572
  import { jsx as jsx60, jsxs as jsxs37 } from "react/jsx-runtime";
7598
7573
  function Sheet({ ...props }) {
7599
7574
  return /* @__PURE__ */ jsx60(SheetPrimitive.Root, { "data-slot": "sheet", ...props });
@@ -7653,7 +7628,7 @@ function SheetContent({
7653
7628
  children: [
7654
7629
  children,
7655
7630
  /* @__PURE__ */ jsxs37(SheetPrimitive.Close, { className: "absolute top-4 end-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-brand-default focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-selection data-[state=open]:text-foreground-muted", children: [
7656
- /* @__PURE__ */ jsx60(XIcon, { className: "size-4" }),
7631
+ /* @__PURE__ */ jsx60(Icons.close, { className: "size-4" }),
7657
7632
  /* @__PURE__ */ jsx60("span", { className: "sr-only", children: "Close" })
7658
7633
  ] })
7659
7634
  ]
@@ -7712,7 +7687,6 @@ function SheetDescription({
7712
7687
  import * as React29 from "react";
7713
7688
  import { Slot as Slot5 } from "@radix-ui/react-slot";
7714
7689
  import { cva as cva14 } from "class-variance-authority";
7715
- import { PanelLeftIcon } from "lucide-react";
7716
7690
 
7717
7691
  // src/hooks/use-mobile.ts
7718
7692
  import * as React28 from "react";
@@ -7930,7 +7904,7 @@ function SidebarTrigger({
7930
7904
  },
7931
7905
  ...props,
7932
7906
  children: [
7933
- /* @__PURE__ */ jsx61(PanelLeftIcon, {}),
7907
+ /* @__PURE__ */ jsx61(Icons.panelLeft, {}),
7934
7908
  /* @__PURE__ */ jsx61("span", { className: "sr-only", children: "Toggle Sidebar" })
7935
7909
  ]
7936
7910
  }
@@ -8423,22 +8397,15 @@ function Slider({
8423
8397
  }
8424
8398
 
8425
8399
  // src/components/ui/sonner.tsx
8426
- import {
8427
- CheckIcon as CheckIcon5,
8428
- InfoIcon,
8429
- Loader2Icon as Loader2Icon2,
8430
- TriangleAlertIcon,
8431
- XCircleIcon
8432
- } from "lucide-react";
8433
8400
  import { useTheme } from "next-themes";
8434
8401
  import { Toaster as Sonner } from "sonner";
8435
8402
  import { toast } from "sonner";
8436
8403
  import { jsx as jsx63 } from "react/jsx-runtime";
8437
8404
  var SONNER_DEFAULT_DURATION = 4e3;
8438
- var StatusIconSuccess = () => /* @__PURE__ */ jsx63("div", { className: "flex size-4 shrink-0 items-center justify-center rounded bg-brand-600 dark:bg-brand-500 p-0.5", children: /* @__PURE__ */ jsx63(CheckIcon5, { className: "size-3 text-white", strokeWidth: 3 }) });
8439
- var StatusIconInfo = () => /* @__PURE__ */ jsx63("div", { className: "flex size-4 shrink-0 items-center justify-center rounded bg-foreground-lighter p-0.5", children: /* @__PURE__ */ jsx63(InfoIcon, { className: "size-3 text-background-surface-200" }) });
8440
- var StatusIconWarning = () => /* @__PURE__ */ jsx63("div", { className: "flex size-4 shrink-0 items-center justify-center rounded bg-warning-600 dark:bg-warning-500 p-0.5", children: /* @__PURE__ */ jsx63(TriangleAlertIcon, { className: "size-3 text-white" }) });
8441
- var StatusIconError = () => /* @__PURE__ */ jsx63("div", { className: "flex size-4 shrink-0 items-center justify-center rounded bg-destructive-600 dark:bg-destructive-500 p-0.5", children: /* @__PURE__ */ jsx63(XCircleIcon, { className: "size-3 text-white" }) });
8405
+ var StatusIconSuccess = () => /* @__PURE__ */ jsx63("div", { className: "flex size-4 shrink-0 items-center justify-center rounded bg-brand-600 dark:bg-brand-500 p-0.5", children: /* @__PURE__ */ jsx63(Icons.check, { className: "size-3 text-white", strokeWidth: 3 }) });
8406
+ var StatusIconInfo = () => /* @__PURE__ */ jsx63("div", { className: "flex size-4 shrink-0 items-center justify-center rounded bg-foreground-lighter p-0.5", children: /* @__PURE__ */ jsx63(Icons.info, { className: "size-3 text-background-surface-200" }) });
8407
+ var StatusIconWarning = () => /* @__PURE__ */ jsx63("div", { className: "flex size-4 shrink-0 items-center justify-center rounded bg-warning-600 dark:bg-warning-500 p-0.5", children: /* @__PURE__ */ jsx63(Icons.alertTriangle, { className: "size-3 text-white" }) });
8408
+ var StatusIconError = () => /* @__PURE__ */ jsx63("div", { className: "flex size-4 shrink-0 items-center justify-center rounded bg-destructive-600 dark:bg-destructive-500 p-0.5", children: /* @__PURE__ */ jsx63(Icons.xCircle, { className: "size-3 text-white" }) });
8442
8409
  var Toaster = ({
8443
8410
  dir = "rtl",
8444
8411
  position = "bottom-left",
@@ -8455,7 +8422,7 @@ var Toaster = ({
8455
8422
  info: /* @__PURE__ */ jsx63(StatusIconInfo, {}),
8456
8423
  warning: /* @__PURE__ */ jsx63(StatusIconWarning, {}),
8457
8424
  error: /* @__PURE__ */ jsx63(StatusIconError, {}),
8458
- loading: /* @__PURE__ */ jsx63(Loader2Icon2, { className: "size-4 animate-spin" })
8425
+ loading: /* @__PURE__ */ jsx63(Icons.loader, { className: "size-4 animate-spin" })
8459
8426
  },
8460
8427
  theme,
8461
8428
  className: "toaster group pointer-events-auto",
@@ -8839,236 +8806,136 @@ function resolveCssColor(styles, variable, fallback) {
8839
8806
  if (raw.includes("%")) return `hsl(${raw})`;
8840
8807
  return raw;
8841
8808
  }
8842
-
8843
- // src/components/charts/PartoLineChart.tsx
8844
- import { jsx as jsx69 } from "react/jsx-runtime";
8845
- var FALLBACKS = {
8846
- foreground: "hsl(0 0% 98%)",
8847
- border: "hsl(0 0% 45%)",
8848
- mutedForeground: "hsl(0 0% 55%)",
8849
- background: "hsl(0 0% 98%)",
8850
- foregroundMuted: "hsl(0 0% 55%)",
8851
- chart1: "hsl(12 76% 61%)",
8852
- chart2: "hsl(173 58% 39%)",
8853
- chart3: "hsl(197 37% 24%)",
8854
- chart4: "hsl(43 74% 66%)",
8855
- chart5: "hsl(27 87% 67%)"
8856
- };
8857
- function PartoLineChart({ className, ...props }) {
8858
- const styles = useRootStyles();
8859
- const getColor = (variable, fallback) => resolveCssColor(styles, variable, fallback);
8860
- const addOpacity = (color, opacity) => {
8861
- if (color.startsWith("hsl(")) {
8862
- return color.replace(")", ` / ${opacity})`);
8863
- }
8864
- if (color.startsWith("rgb(")) {
8865
- return color.replace("rgb(", "rgba(").replace(")", `, ${opacity})`);
8866
- }
8867
- return color;
8868
- };
8869
- const nivoTheme = {
8809
+ function addOpacityToColor(color, opacity) {
8810
+ if (color.startsWith("hsl(")) {
8811
+ return color.replace(")", ` / ${opacity})`);
8812
+ }
8813
+ if (color.startsWith("rgb(")) {
8814
+ return color.replace("rgb(", "rgba(").replace(")", `, ${opacity})`);
8815
+ }
8816
+ return color;
8817
+ }
8818
+ var CHART_FONT_FAMILY = "Yekan Bakh, system-ui, -apple-system, sans-serif";
8819
+ function createNivoTheme(styles, fallbacks) {
8820
+ const fb = { ...DEFAULT_FALLBACKS, ...fallbacks };
8821
+ const get = (variable, fallback) => resolveCssColor(styles, variable, fallback);
8822
+ const foreground = get("--foreground", fb.foreground);
8823
+ const foregroundMuted = get("--foreground-muted", fb.foregroundMuted);
8824
+ const border = get("--border", fb.border);
8825
+ const background = get("--background", fb.background);
8826
+ return {
8870
8827
  background: "transparent",
8871
8828
  text: {
8872
- fontFamily: "Yekan Bakh, system-ui, -apple-system, sans-serif",
8873
- fill: getColor("--foreground", FALLBACKS.foreground)
8829
+ fontFamily: CHART_FONT_FAMILY,
8830
+ fill: foreground
8874
8831
  },
8875
8832
  axis: {
8876
8833
  domain: {
8877
8834
  line: {
8878
- stroke: getColor("--border", FALLBACKS.border),
8835
+ stroke: border,
8879
8836
  strokeWidth: 1
8880
8837
  }
8881
8838
  },
8882
8839
  ticks: {
8883
8840
  line: {
8884
- stroke: getColor("--border", FALLBACKS.border),
8841
+ stroke: border,
8885
8842
  strokeWidth: 1
8886
8843
  },
8887
8844
  text: {
8888
- fontFamily: "Yekan Bakh, system-ui, -apple-system, sans-serif",
8889
- fill: getColor("--foreground-muted", FALLBACKS.foregroundMuted)
8845
+ fontFamily: CHART_FONT_FAMILY,
8846
+ fill: foregroundMuted
8890
8847
  }
8891
8848
  },
8892
8849
  legend: {
8893
8850
  text: {
8894
- fontFamily: "Yekan Bakh, system-ui, -apple-system, sans-serif",
8895
- fill: getColor("--foreground", FALLBACKS.foreground)
8851
+ fontFamily: CHART_FONT_FAMILY,
8852
+ fill: foreground
8896
8853
  }
8897
8854
  }
8898
8855
  },
8899
8856
  grid: {
8900
8857
  line: {
8901
- stroke: getColor("--border", FALLBACKS.border),
8858
+ stroke: border,
8902
8859
  strokeWidth: 1,
8903
8860
  strokeOpacity: 0.5
8904
8861
  }
8905
8862
  },
8906
8863
  tooltip: {
8907
8864
  container: {
8908
- fontFamily: "Yekan Bakh, system-ui, -apple-system, sans-serif",
8909
- background: getColor("--background", FALLBACKS.background),
8910
- color: getColor("--foreground", FALLBACKS.foreground),
8865
+ fontFamily: CHART_FONT_FAMILY,
8866
+ background,
8867
+ color: foreground,
8911
8868
  fontSize: 12,
8912
8869
  borderRadius: "8px",
8913
- border: `1px solid ${addOpacity(getColor("--border", FALLBACKS.border), 0.5)}`,
8870
+ border: `1px solid ${addOpacityToColor(border, 0.5)}`,
8914
8871
  boxShadow: "0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1)",
8915
8872
  padding: "10px"
8916
8873
  }
8917
8874
  },
8918
8875
  legends: {
8919
8876
  text: {
8920
- fontFamily: "Yekan Bakh, system-ui, -apple-system, sans-serif",
8921
- fill: getColor("--foreground", FALLBACKS.foreground)
8877
+ fontFamily: CHART_FONT_FAMILY,
8878
+ fill: foreground
8922
8879
  }
8923
8880
  }
8924
8881
  };
8925
- const defaultColors = [
8926
- getColor("--chart-1", FALLBACKS.chart1),
8927
- getColor("--chart-2", FALLBACKS.chart2),
8928
- getColor("--chart-3", FALLBACKS.chart3),
8929
- getColor("--chart-4", FALLBACKS.chart4),
8930
- getColor("--chart-5", FALLBACKS.chart5)
8882
+ }
8883
+ var DEFAULT_FALLBACKS = {
8884
+ foreground: "hsl(0 0% 9%)",
8885
+ foregroundMuted: "hsl(0 0% 44%)",
8886
+ border: "hsl(0 0% 88%)",
8887
+ background: "hsl(0 0% 99%)",
8888
+ chart1: "hsl(152.9deg 60% 52.9%)",
8889
+ chart2: "hsl(173 58% 39%)",
8890
+ chart3: "hsl(197 37% 24%)",
8891
+ chart4: "hsl(43 74% 66%)",
8892
+ chart5: "hsl(27 87% 67%)"
8893
+ };
8894
+ function resolveChartColors(styles, fallbacks) {
8895
+ const fb = { ...DEFAULT_FALLBACKS, ...fallbacks };
8896
+ const get = (variable, fallback) => resolveCssColor(styles, variable, fallback);
8897
+ return [
8898
+ get("--chart-1", fb.chart1),
8899
+ get("--chart-2", fb.chart2),
8900
+ get("--chart-3", fb.chart3),
8901
+ get("--chart-4", fb.chart4),
8902
+ get("--chart-5", fb.chart5)
8931
8903
  ];
8904
+ }
8905
+
8906
+ // src/components/charts/PartoLineChart.tsx
8907
+ import { jsx as jsx69 } from "react/jsx-runtime";
8908
+ function PartoLineChart({ className, ...props }) {
8909
+ const styles = useRootStyles();
8910
+ const nivoTheme = createNivoTheme(styles);
8911
+ const defaultColors = resolveChartColors(styles);
8932
8912
  return /* @__PURE__ */ jsx69("div", { className, dir: "ltr", style: { position: "relative", width: "100%", height: "100%" }, children: /* @__PURE__ */ jsx69(ResponsiveLine, { theme: nivoTheme, colors: defaultColors, ...props }) });
8933
8913
  }
8934
8914
 
8935
8915
  // src/components/charts/PartoBarChart.tsx
8936
8916
  import { ResponsiveBar } from "@nivo/bar";
8937
8917
  import { jsx as jsx70 } from "react/jsx-runtime";
8938
- var FALLBACKS2 = {
8939
- foreground: "hsl(0 0% 98%)",
8940
- border: "hsl(0 0% 45%)",
8941
- mutedForeground: "hsl(0 0% 55%)",
8942
- popover: "hsl(0 0% 12%)",
8943
- popoverForeground: "hsl(0 0% 98%)",
8944
- chart1: "hsl(12 76% 61%)",
8945
- chart2: "hsl(173 58% 39%)",
8946
- chart3: "hsl(197 37% 24%)",
8947
- chart4: "hsl(43 74% 66%)",
8948
- chart5: "hsl(27 87% 67%)"
8949
- };
8950
8918
  function PartoBarChart({ className, ...props }) {
8951
8919
  const styles = useRootStyles();
8952
- const getColor = (variable, fallback) => resolveCssColor(styles, variable, fallback);
8953
- const nivoTheme = {
8954
- background: "transparent",
8955
- text: {
8956
- fontFamily: "Yekan Bakh, system-ui, -apple-system, sans-serif",
8957
- fill: getColor("--foreground", FALLBACKS2.foreground)
8958
- },
8959
- axis: {
8960
- domain: {
8961
- line: {
8962
- stroke: getColor("--border", FALLBACKS2.border),
8963
- strokeWidth: 1
8964
- }
8965
- },
8966
- ticks: {
8967
- line: {
8968
- stroke: getColor("--border", FALLBACKS2.border),
8969
- strokeWidth: 1
8970
- },
8971
- text: {
8972
- fontFamily: "Yekan Bakh, system-ui, -apple-system, sans-serif",
8973
- fill: getColor("--muted-foreground", FALLBACKS2.mutedForeground)
8974
- }
8975
- },
8976
- legend: {
8977
- text: {
8978
- fontFamily: "Yekan Bakh, system-ui, -apple-system, sans-serif",
8979
- fill: getColor("--foreground", FALLBACKS2.foreground)
8980
- }
8981
- }
8982
- },
8983
- grid: {
8984
- line: {
8985
- stroke: getColor("--border", FALLBACKS2.border),
8986
- strokeWidth: 1,
8987
- strokeOpacity: 0.4
8988
- }
8989
- },
8990
- tooltip: {
8991
- container: {
8992
- fontFamily: "Yekan Bakh, system-ui, -apple-system, sans-serif",
8993
- background: getColor("--popover", FALLBACKS2.popover),
8994
- color: getColor("--popover-foreground", FALLBACKS2.popoverForeground),
8995
- fontSize: 12,
8996
- borderRadius: "var(--radius)",
8997
- boxShadow: "0 2px 12px rgba(0,0,0,0.15)",
8998
- padding: "8px 12px"
8999
- }
9000
- },
9001
- legends: {
9002
- text: {
9003
- fontFamily: "Yekan Bakh, system-ui, -apple-system, sans-serif",
9004
- fill: getColor("--foreground", FALLBACKS2.foreground)
9005
- }
9006
- }
9007
- };
9008
- const defaultColors = [
9009
- getColor("--chart-1", FALLBACKS2.chart1),
9010
- getColor("--chart-2", FALLBACKS2.chart2),
9011
- getColor("--chart-3", FALLBACKS2.chart3),
9012
- getColor("--chart-4", FALLBACKS2.chart4),
9013
- getColor("--chart-5", FALLBACKS2.chart5)
9014
- ];
8920
+ const nivoTheme = createNivoTheme(styles);
8921
+ const defaultColors = resolveChartColors(styles);
9015
8922
  return /* @__PURE__ */ jsx70("div", { className, dir: "ltr", style: { position: "relative", width: "100%", height: "100%" }, children: /* @__PURE__ */ jsx70(ResponsiveBar, { theme: nivoTheme, colors: defaultColors, ...props }) });
9016
8923
  }
9017
8924
 
9018
8925
  // src/components/charts/PartoPieChart.tsx
9019
8926
  import { ResponsivePie } from "@nivo/pie";
9020
8927
  import { jsx as jsx71 } from "react/jsx-runtime";
9021
- var FALLBACKS3 = {
9022
- foreground: "hsl(0 0% 98%)",
9023
- popover: "hsl(0 0% 12%)",
9024
- popoverForeground: "hsl(0 0% 98%)",
9025
- chart1: "hsl(12 76% 61%)",
9026
- chart2: "hsl(173 58% 39%)",
9027
- chart3: "hsl(197 37% 24%)",
9028
- chart4: "hsl(43 74% 66%)",
9029
- chart5: "hsl(27 87% 67%)"
9030
- };
9031
8928
  function PartoPieChart({ className, ...props }) {
9032
8929
  const styles = useRootStyles();
9033
- const getColor = (variable, fallback) => resolveCssColor(styles, variable, fallback);
9034
- const nivoTheme = {
9035
- background: "transparent",
9036
- text: {
9037
- fontFamily: "Yekan Bakh, system-ui, -apple-system, sans-serif",
9038
- fill: getColor("--foreground", FALLBACKS3.foreground)
9039
- },
9040
- tooltip: {
9041
- container: {
9042
- fontFamily: "Yekan Bakh, system-ui, -apple-system, sans-serif",
9043
- background: getColor("--popover", FALLBACKS3.popover),
9044
- color: getColor("--popover-foreground", FALLBACKS3.popoverForeground),
9045
- fontSize: 12,
9046
- borderRadius: "var(--radius)",
9047
- boxShadow: "0 2px 12px rgba(0,0,0,0.15)",
9048
- padding: "8px 12px"
9049
- }
9050
- },
9051
- legends: {
9052
- text: {
9053
- fontFamily: "Yekan Bakh, system-ui, -apple-system, sans-serif",
9054
- fill: getColor("--foreground", FALLBACKS3.foreground)
9055
- }
9056
- }
9057
- };
9058
- const defaultColors = [
9059
- getColor("--chart-1", FALLBACKS3.chart1),
9060
- getColor("--chart-2", FALLBACKS3.chart2),
9061
- getColor("--chart-3", FALLBACKS3.chart3),
9062
- getColor("--chart-4", FALLBACKS3.chart4),
9063
- getColor("--chart-5", FALLBACKS3.chart5)
9064
- ];
8930
+ const nivoTheme = createNivoTheme(styles);
8931
+ const defaultColors = resolveChartColors(styles);
9065
8932
  return /* @__PURE__ */ jsx71("div", { className, dir: "ltr", style: { position: "relative", width: "100%", height: "100%" }, children: /* @__PURE__ */ jsx71(ResponsivePie, { theme: nivoTheme, colors: defaultColors, ...props }) });
9066
8933
  }
9067
8934
 
9068
8935
  // src/components/charts/PartoHeatMap.tsx
9069
8936
  import { ResponsiveHeatMap } from "@nivo/heatmap";
9070
8937
  import { jsx as jsx72, jsxs as jsxs40 } from "react/jsx-runtime";
9071
- var FALLBACKS4 = {
8938
+ var FALLBACKS = {
9072
8939
  foreground: "hsl(0 0% 98%)",
9073
8940
  border: "hsl(0 0% 45%)",
9074
8941
  mutedForeground: "hsl(0 0% 55%)",
@@ -9136,24 +9003,24 @@ function PartoHeatMap({
9136
9003
  background: "transparent",
9137
9004
  text: {
9138
9005
  fontFamily: "Yekan Bakh, system-ui, -apple-system, sans-serif",
9139
- fill: getColor("--foreground", FALLBACKS4.foreground),
9006
+ fill: getColor("--foreground", FALLBACKS.foreground),
9140
9007
  fontSize: 11
9141
9008
  },
9142
9009
  axis: {
9143
9010
  domain: {
9144
9011
  line: {
9145
- stroke: getColor("--border", FALLBACKS4.border),
9012
+ stroke: getColor("--border", FALLBACKS.border),
9146
9013
  strokeWidth: 1
9147
9014
  }
9148
9015
  },
9149
9016
  ticks: {
9150
9017
  line: {
9151
- stroke: getColor("--border", FALLBACKS4.border),
9018
+ stroke: getColor("--border", FALLBACKS.border),
9152
9019
  strokeWidth: 1
9153
9020
  },
9154
9021
  text: {
9155
9022
  fontFamily: "Yekan Bakh, system-ui, -apple-system, sans-serif",
9156
- fill: getColor("--foreground", FALLBACKS4.foreground),
9023
+ fill: getColor("--foreground", FALLBACKS.foreground),
9157
9024
  fontSize: 13,
9158
9025
  fontWeight: 600
9159
9026
  }
@@ -9161,7 +9028,7 @@ function PartoHeatMap({
9161
9028
  legend: {
9162
9029
  text: {
9163
9030
  fontFamily: "Yekan Bakh, system-ui, -apple-system, sans-serif",
9164
- fill: getColor("--foreground", FALLBACKS4.foreground),
9031
+ fill: getColor("--foreground", FALLBACKS.foreground),
9165
9032
  fontSize: 13,
9166
9033
  fontWeight: 700
9167
9034
  }
@@ -9169,26 +9036,26 @@ function PartoHeatMap({
9169
9036
  },
9170
9037
  grid: {
9171
9038
  line: {
9172
- stroke: getColor("--card", FALLBACKS4.card),
9039
+ stroke: getColor("--card", FALLBACKS.card),
9173
9040
  strokeWidth: 3
9174
9041
  }
9175
9042
  },
9176
9043
  tooltip: {
9177
9044
  container: {
9178
9045
  fontFamily: "Yekan Bakh, system-ui, -apple-system, sans-serif",
9179
- background: getColor("--popover", FALLBACKS4.popover),
9180
- color: getColor("--popover-foreground", FALLBACKS4.popoverForeground),
9046
+ background: getColor("--popover", FALLBACKS.popover),
9047
+ color: getColor("--popover-foreground", FALLBACKS.popoverForeground),
9181
9048
  fontSize: 12,
9182
9049
  borderRadius: "var(--radius)",
9183
9050
  boxShadow: "0 2px 4px rgba(0,0,0,0.2)",
9184
9051
  padding: "8px 12px",
9185
- border: `1px solid ${getColor("--border", FALLBACKS4.border)}`
9052
+ border: `1px solid ${getColor("--border", FALLBACKS.border)}`
9186
9053
  }
9187
9054
  },
9188
9055
  legends: {
9189
9056
  text: {
9190
9057
  fontFamily: "Yekan Bakh, system-ui, -apple-system, sans-serif",
9191
- fill: getColor("--foreground", FALLBACKS4.foreground),
9058
+ fill: getColor("--foreground", FALLBACKS.foreground),
9192
9059
  fontSize: 11
9193
9060
  }
9194
9061
  }
@@ -9257,7 +9124,7 @@ function PartoHeatMap({
9257
9124
  emptyColor: getColor("--muted", "hsl(0 0% 20%)"),
9258
9125
  borderRadius: 2,
9259
9126
  borderWidth: 3,
9260
- borderColor: getColor("--card", FALLBACKS4.card),
9127
+ borderColor: getColor("--card", FALLBACKS.card),
9261
9128
  enableLabels: false,
9262
9129
  animate: true,
9263
9130
  motionConfig: "gentle",
@@ -9276,7 +9143,7 @@ import { Wordcloud } from "@visx/wordcloud";
9276
9143
  import { scaleLog } from "@visx/scale";
9277
9144
  import { Text } from "@visx/text";
9278
9145
  import { jsx as jsx73, jsxs as jsxs41 } from "react/jsx-runtime";
9279
- var FALLBACKS5 = {
9146
+ var FALLBACKS2 = {
9280
9147
  primary: "hsl(12 76% 61%)"
9281
9148
  };
9282
9149
  var stableRandom = () => 0.5;
@@ -9310,7 +9177,7 @@ function PartoWordCloud({
9310
9177
  const [hovered, setHovered] = React34.useState(null);
9311
9178
  const containerRef = React34.useRef(null);
9312
9179
  const getColor = (variable, fallback) => resolveCssColor(styles, variable, fallback);
9313
- const primaryColor = getColor("--primary", FALLBACKS5.primary);
9180
+ const primaryColor = getColor("--primary", FALLBACKS2.primary);
9314
9181
  const formattedWords = React34.useMemo(() => {
9315
9182
  return words.map((word) => ({
9316
9183
  ...word,