@parto-system-design/ui 1.1.7 → 1.1.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-HEYMLQOV.cjs → chunk-2ACKKPWA.cjs} +22 -4
- package/dist/chunk-2ACKKPWA.cjs.map +1 -0
- package/dist/{chunk-RA5KZNG5.js → chunk-3QYYPPFJ.js} +8 -8
- package/dist/chunk-3QYYPPFJ.js.map +1 -0
- package/dist/{chunk-OEVMKFFL.cjs → chunk-4WONHORR.cjs} +47 -35
- package/dist/chunk-4WONHORR.cjs.map +1 -0
- package/dist/{chunk-NEML6RCV.js → chunk-5HCXH6GS.js} +6 -2
- package/dist/chunk-5HCXH6GS.js.map +1 -0
- package/dist/{chunk-53QY4PD3.js → chunk-GCZ6YATL.js} +38 -6
- package/dist/chunk-GCZ6YATL.js.map +1 -0
- package/dist/{chunk-GDHRYKVM.js → chunk-GPYJ66CG.js} +4 -4
- package/dist/chunk-GPYJ66CG.js.map +1 -0
- package/dist/{chunk-SCGW2BH4.cjs → chunk-HS3XI3CC.cjs} +5 -5
- package/dist/chunk-HS3XI3CC.cjs.map +1 -0
- package/dist/chunk-JCJLN437.js +108 -0
- package/dist/chunk-JCJLN437.js.map +1 -0
- package/dist/{chunk-MQGQVI3W.cjs → chunk-JMKNNH63.cjs} +39 -7
- package/dist/chunk-JMKNNH63.cjs.map +1 -0
- package/dist/{chunk-34JUCX2G.cjs → chunk-K6G63EED.cjs} +2 -4
- package/dist/chunk-K6G63EED.cjs.map +1 -0
- package/dist/{chunk-3AIJKXBV.cjs → chunk-KYM7NIJO.cjs} +200 -9
- package/dist/chunk-KYM7NIJO.cjs.map +1 -0
- package/dist/{chunk-ZZFNJR2E.js → chunk-MEKWH3GS.js} +22 -4
- package/dist/chunk-MEKWH3GS.js.map +1 -0
- package/dist/{chunk-YE477L2H.cjs → chunk-MMC6M35Q.cjs} +10 -10
- package/dist/chunk-MMC6M35Q.cjs.map +1 -0
- package/dist/{chunk-LZMCMZZF.js → chunk-NMH43BDC.js} +44 -32
- package/dist/chunk-NMH43BDC.js.map +1 -0
- package/dist/chunk-NORDUD2T.cjs +135 -0
- package/dist/chunk-NORDUD2T.cjs.map +1 -0
- package/dist/{chunk-SCX6AR53.cjs → chunk-OQB6HIUL.cjs} +5 -5
- package/dist/{chunk-SCX6AR53.cjs.map → chunk-OQB6HIUL.cjs.map} +1 -1
- package/dist/{chunk-IQHKJ4SS.js → chunk-PYURPUTV.js} +195 -6
- package/dist/chunk-PYURPUTV.js.map +1 -0
- package/dist/{chunk-AXAY64KL.js → chunk-S3T2L6NA.js} +3 -4
- package/dist/chunk-S3T2L6NA.js.map +1 -0
- package/dist/{chunk-MBCTRNTG.js → chunk-SXWSOU3Y.js} +3 -3
- package/dist/{chunk-MBCTRNTG.js.map → chunk-SXWSOU3Y.js.map} +1 -1
- package/dist/chunk-TWJXOV4C.js +145 -0
- package/dist/chunk-TWJXOV4C.js.map +1 -0
- package/dist/{chunk-P5XHPNJG.cjs → chunk-U3ADRIVO.cjs} +6 -2
- package/dist/chunk-U3ADRIVO.cjs.map +1 -0
- package/dist/chunk-UOZN45G4.cjs +130 -0
- package/dist/chunk-UOZN45G4.cjs.map +1 -0
- package/dist/chunk-VHLDOG74.cjs +167 -0
- package/dist/chunk-VHLDOG74.cjs.map +1 -0
- package/dist/{chunk-VO3B75F6.cjs → chunk-YENXXYUV.cjs} +4 -4
- package/dist/{chunk-VO3B75F6.cjs.map → chunk-YENXXYUV.cjs.map} +1 -1
- package/dist/chunk-YFQWC2PW.js +113 -0
- package/dist/chunk-YFQWC2PW.js.map +1 -0
- package/dist/{chunk-YAJWTNOX.js → chunk-ZBZDR4ZC.js} +3 -3
- package/dist/{chunk-YAJWTNOX.js.map → chunk-ZBZDR4ZC.js.map} +1 -1
- package/dist/components/charts/PartoAreaChart.cjs +3 -3
- package/dist/components/charts/PartoAreaChart.d.cts +2 -0
- package/dist/components/charts/PartoAreaChart.d.ts +2 -0
- package/dist/components/charts/PartoAreaChart.js +2 -2
- package/dist/components/charts/PartoBarChart.cjs +3 -3
- package/dist/components/charts/PartoBarChart.d.cts +6 -0
- package/dist/components/charts/PartoBarChart.d.ts +6 -0
- package/dist/components/charts/PartoBarChart.js +2 -2
- package/dist/components/charts/PartoLineChart.cjs +3 -3
- package/dist/components/charts/PartoLineChart.d.cts +8 -0
- package/dist/components/charts/PartoLineChart.d.ts +8 -0
- package/dist/components/charts/PartoLineChart.js +2 -2
- package/dist/components/charts/PartoPieChart.cjs +3 -3
- package/dist/components/charts/PartoPieChart.d.cts +8 -0
- package/dist/components/charts/PartoPieChart.d.ts +8 -0
- package/dist/components/charts/PartoPieChart.js +2 -2
- package/dist/components/ui/badge.cjs +3 -3
- package/dist/components/ui/badge.js +1 -1
- package/dist/components/ui/button.cjs +4 -4
- package/dist/components/ui/button.js +2 -2
- package/dist/components/ui/calendar.cjs +4 -4
- package/dist/components/ui/calendar.js +3 -3
- package/dist/components/ui/data-table.cjs +4 -4
- package/dist/components/ui/data-table.js +3 -3
- package/dist/components/ui/input.cjs +5 -5
- package/dist/components/ui/input.js +2 -2
- package/dist/components/ui/page-card.cjs +2 -2
- package/dist/components/ui/page-card.d.cts +1 -1
- package/dist/components/ui/page-card.d.ts +1 -1
- package/dist/components/ui/page-card.js +1 -1
- package/dist/components/ui/saved-query-card.cjs +4 -4
- package/dist/components/ui/saved-query-card.js +3 -3
- package/dist/index.cjs +4470 -1927
- package/dist/index.cjs.map +1 -1
- package/dist/index.css +333 -34
- package/dist/index.d.cts +910 -120
- package/dist/index.d.ts +910 -120
- package/dist/index.js +4298 -1792
- package/dist/index.js.map +1 -1
- package/dist/{page-card-DOl50DqJ.d.cts → page-card-CmShVqG-.d.cts} +1 -1
- package/dist/{page-card-CO92oXkc.d.ts → page-card-HBn-cy4J.d.ts} +1 -1
- package/package.json +1 -1
- package/dist/chunk-34JUCX2G.cjs.map +0 -1
- package/dist/chunk-3AIJKXBV.cjs.map +0 -1
- package/dist/chunk-53QY4PD3.js.map +0 -1
- package/dist/chunk-7Y4V3R3Y.cjs +0 -120
- package/dist/chunk-7Y4V3R3Y.cjs.map +0 -1
- package/dist/chunk-AXAY64KL.js.map +0 -1
- package/dist/chunk-D5XCQDFS.js +0 -92
- package/dist/chunk-D5XCQDFS.js.map +0 -1
- package/dist/chunk-GDHRYKVM.js.map +0 -1
- package/dist/chunk-HEYMLQOV.cjs.map +0 -1
- package/dist/chunk-IQHKJ4SS.js.map +0 -1
- package/dist/chunk-LLJR7FV3.js +0 -135
- package/dist/chunk-LLJR7FV3.js.map +0 -1
- package/dist/chunk-LZMCMZZF.js.map +0 -1
- package/dist/chunk-MKYVQQBV.cjs +0 -114
- package/dist/chunk-MKYVQQBV.cjs.map +0 -1
- package/dist/chunk-MQGQVI3W.cjs.map +0 -1
- package/dist/chunk-NEFZJHE4.cjs +0 -157
- package/dist/chunk-NEFZJHE4.cjs.map +0 -1
- package/dist/chunk-NEML6RCV.js.map +0 -1
- package/dist/chunk-OEVMKFFL.cjs.map +0 -1
- package/dist/chunk-P5XHPNJG.cjs.map +0 -1
- package/dist/chunk-QJ7UB2ZQ.js +0 -98
- package/dist/chunk-QJ7UB2ZQ.js.map +0 -1
- package/dist/chunk-RA5KZNG5.js.map +0 -1
- package/dist/chunk-SCGW2BH4.cjs.map +0 -1
- package/dist/chunk-YE477L2H.cjs.map +0 -1
- package/dist/chunk-ZZFNJR2E.js.map +0 -1
|
@@ -3,7 +3,7 @@ import { S as SupportedLocale } from './utils-DlXWmDZ-.cjs';
|
|
|
3
3
|
import * as class_variance_authority_types from 'class-variance-authority/types';
|
|
4
4
|
import { c as StatusKey } from './i18n-CAd9wGOr.cjs';
|
|
5
5
|
|
|
6
|
-
type SocialPlatform = 'instagram' | 'twitter' | 'tiktok' | 'youtube' | 'linkedin' | 'telegram' | 'threads';
|
|
6
|
+
type SocialPlatform = 'instagram' | 'twitter' | 'tiktok' | 'youtube' | 'linkedin' | 'telegram' | 'threads' | 'facebook';
|
|
7
7
|
interface SocialPlatformBadgeProps extends React.HTMLAttributes<HTMLSpanElement> {
|
|
8
8
|
/** The social media platform to display */
|
|
9
9
|
platform: SocialPlatform;
|
|
@@ -3,7 +3,7 @@ import { S as SupportedLocale } from './utils-DlXWmDZ-.js';
|
|
|
3
3
|
import * as class_variance_authority_types from 'class-variance-authority/types';
|
|
4
4
|
import { c as StatusKey } from './i18n-ArS3mqj0.js';
|
|
5
5
|
|
|
6
|
-
type SocialPlatform = 'instagram' | 'twitter' | 'tiktok' | 'youtube' | 'linkedin' | 'telegram' | 'threads';
|
|
6
|
+
type SocialPlatform = 'instagram' | 'twitter' | 'tiktok' | 'youtube' | 'linkedin' | 'telegram' | 'threads' | 'facebook';
|
|
7
7
|
interface SocialPlatformBadgeProps extends React.HTMLAttributes<HTMLSpanElement> {
|
|
8
8
|
/** The social media platform to display */
|
|
9
9
|
platform: SocialPlatform;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@parto-system-design/ui",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.8",
|
|
4
4
|
"description": "Persian-first, RTL-native React component library for public-opinion monitoring (افکارسنجی), social listening, and influencer analytics — Supabase-style design language adapted for Farsi typography.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Parto Design System contributors",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/constants.ts"],"names":[],"mappings":";;;AAgBO,SAAS,cAAc,IAAA,EAAkC;AAC9D,EAAA,OAAO,IAAA;AACT;AAEO,IAAM,IAAA,GAAO;AAAA,EAClB,IAAA,EAAM;AAAA,IACJ,EAAA,EAAI,SAAA;AAAA,IACJ,EAAA,EAAI,mBAAA;AAAA,IACJ,EAAA,EAAI,SAAA;AAAA,IACJ,EAAA,EAAI,WAAA;AAAA,IACJ,EAAA,EAAI;AAAA,GACN;AAAA,EACA,OAAA,EAAS;AAAA,IACP,EAAA,EAAI,aAAA;AAAA,IACJ,EAAA,EAAI,WAAA;AAAA,IACJ,EAAA,EAAI,WAAA;AAAA,IACJ,EAAA,EAAI,WAAA;AAAA,IACJ,EAAA,EAAI;AAAA,GACN;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,EAAA,EAAI,UAAA;AAAA,IACJ,EAAA,EAAI,UAAA;AAAA,IACJ,EAAA,EAAI,UAAA;AAAA,IACJ,EAAA,EAAI,UAAA;AAAA,IACJ,EAAA,EAAI;AAAA;AAER,CAAA;AA2BO,IAAM,aAAA,GAAgB;AAAA,EAC3B,EAAA,EAAI,CAAA,EAAG,IAAA,CAAK,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,CAAO,IAAI,CAAC,CAAA,CAAA;AAAA,EACjE,EAAA,EAAI,CAAA,EAAG,IAAA,CAAK,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,CAAO,IAAI,CAAC,CAAA,CAAA;AAAA,EACjE,EAAA,EAAI,CAAA,EAAG,IAAA,CAAK,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,CAAO,IAAI,CAAC,CAAA,CAAA;AAAA,EACjE,EAAA,EAAI,CAAA,EAAG,IAAA,CAAK,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,CAAO,IAAI,CAAC,CAAA,CAAA;AAAA,EACjE,EAAA,EAAI,CAAA,EAAG,IAAA,CAAK,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,CAAO,IAAI,CAAC,CAAA;AACnE;AAWO,IAAM,qBAAA,GAAwB","file":"chunk-34JUCX2G.cjs","sourcesContent":["/**\n * Standard size scale used across the design system.\n * Components should accept these values for their `size` prop.\n */\nexport type StandardSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n\n/** @deprecated Use `StandardSize` instead — legacy names have been removed */\nexport type LegacySize = StandardSize\n\n/** @deprecated Use `StandardSize` instead */\nexport type SizeWithLegacy = StandardSize\n\n/**\n * Normalizes a size value to standard names.\n * @deprecated All sizes are standard now — this function is a no-op passthrough.\n */\nexport function normalizeSize(size: StandardSize): StandardSize {\n return size\n}\n\nexport const SIZE = {\n text: {\n xs: 'text-xs',\n sm: 'text-sm leading-4',\n md: 'text-sm',\n lg: 'text-base',\n xl: 'text-base',\n },\n padding: {\n xs: 'px-2.5 py-1',\n sm: 'px-3 py-2',\n md: 'px-4 py-2',\n lg: 'px-4 py-2',\n xl: 'px-6 py-3',\n },\n height: {\n xs: 'h-[26px]',\n sm: 'h-[34px]',\n md: 'h-[38px]',\n lg: 'h-[42px]',\n xl: 'h-[50px]',\n },\n}\n\n/** Inner sizes for nested elements (badges inside buttons, multi-select items, etc.) */\nexport const SIZE_INNER = {\n text: {\n xs: 'text-xs',\n sm: 'text-sm leading-4',\n md: 'text-sm',\n lg: 'text-base',\n xl: 'text-base',\n },\n padding: {\n xs: 'px-2.5 py-1',\n sm: 'px-3 py-2',\n md: 'px-4 py-2',\n lg: 'px-4 py-2',\n xl: 'px-6 py-3',\n },\n height: {\n xs: 'h-[24px]',\n sm: 'h-[28px]',\n md: 'h-[32px]',\n lg: 'h-[36px]',\n xl: 'h-[44px]',\n },\n}\n\nexport const SIZE_VARIANTS = {\n xs: `${SIZE.text['xs']} ${SIZE.padding['xs']} ${SIZE.height['xs']}`,\n sm: `${SIZE.text['sm']} ${SIZE.padding['sm']} ${SIZE.height['sm']}`,\n md: `${SIZE.text['md']} ${SIZE.padding['md']} ${SIZE.height['md']}`,\n lg: `${SIZE.text['lg']} ${SIZE.padding['lg']} ${SIZE.height['lg']}`,\n xl: `${SIZE.text['xl']} ${SIZE.padding['xl']} ${SIZE.height['xl']}`,\n}\n\nexport const SIZE_VARIANTS_INNER = {\n xs: `${SIZE.text['xs']} ${SIZE.padding['xs']} ${SIZE_INNER.height['xs']}`,\n sm: `${SIZE.text['sm']} ${SIZE.padding['sm']} ${SIZE_INNER.height['sm']}`,\n md: `${SIZE.text['md']} ${SIZE.padding['md']} ${SIZE_INNER.height['md']}`,\n lg: `${SIZE.text['lg']} ${SIZE.padding['lg']} ${SIZE_INNER.height['lg']}`,\n xl: `${SIZE.text['xl']} ${SIZE.padding['xl']} ${SIZE_INNER.height['xl']}`,\n}\n\n/** @deprecated Use 'sm' instead */\nexport const SIZE_VARIANTS_DEFAULT = 'sm'\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/hooks/use-root-styles.ts","../src/lib/theme.ts","../src/hooks/use-chart-theme.ts","../src/components/charts/chart-utils.tsx"],"names":["useState","useEffect","useMemo","React","React2","jsx","Skeleton","jsxs","formatLargeNumber","convertToLocalNumbers"],"mappings":"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","file":"chunk-3AIJKXBV.cjs","sourcesContent":["'use client'\n\nimport { useEffect, useMemo, useState } from 'react'\n\n/**\n * Returns a snapshot of the current document root computed styles and\n * re-renders when the theme class or OS color scheme changes.\n */\nexport function useRootStyles() {\n const [version, setVersion] = useState(0)\n\n useEffect(() => {\n if (typeof window === 'undefined' || !document?.documentElement) {\n return\n }\n\n const target = document.documentElement\n const observer = new MutationObserver(() => {\n setVersion((prev) => prev + 1)\n })\n\n observer.observe(target, {\n attributes: true,\n attributeFilter: ['class', 'data-theme'],\n })\n\n const media = window.matchMedia('(prefers-color-scheme: dark)')\n const mediaHandler = () => setVersion((prev) => prev + 1)\n media.addEventListener('change', mediaHandler)\n\n return () => {\n observer.disconnect()\n media.removeEventListener('change', mediaHandler)\n }\n }, [])\n\n return useMemo(() => {\n if (typeof window === 'undefined' || !document?.documentElement) {\n return null\n }\n\n return getComputedStyle(document.documentElement)\n }, [version])\n}\n","const COLOR_VALUE_REGEX = /^(#|rgb|hsl|oklch)/i;\n\nexport function resolveCssColor(\n styles: CSSStyleDeclaration | null,\n variable: string,\n fallback: string,\n) {\n if (!styles) return fallback;\n const raw = styles.getPropertyValue(variable).trim();\n if (!raw) return fallback;\n if (COLOR_VALUE_REGEX.test(raw)) return raw;\n if (raw.includes('%')) return `hsl(${raw})`;\n return raw;\n}\n\n","'use client'\n\nimport * as React from 'react'\nimport { useRootStyles } from './use-root-styles'\nimport { resolveCssColor } from '@/lib/theme'\n\n/**\n * Chart theme hook — reads CSS design tokens at runtime and produces\n * resolved colors and styles for Recharts + Visx chart components.\n * Inspired by Linear, Vercel, and Stripe data visualizations.\n */\n\nconst FALLBACKS = {\n foreground: 'hsl(0 0% 98%)',\n foregroundMuted: 'hsl(0 0% 50%)',\n border: 'hsl(0 0% 22%)',\n popover: 'hsl(0 0% 10%)',\n popoverForeground: 'hsl(0 0% 98%)',\n chart1: 'hsl(153 55% 42%)',\n chart2: 'hsl(198 50% 48%)',\n chart3: 'hsl(240 40% 54%)',\n chart4: 'hsl(310 38% 52%)',\n chart5: 'hsl(355 45% 52%)',\n chart6: 'hsl(35 52% 48%)',\n chart7: 'hsl(75 38% 46%)',\n chart8: 'hsl(118 35% 46%)',\n}\n\nexport const CHART_FONT_FAMILY = 'Yekan Bakh, system-ui, -apple-system, sans-serif'\n\nexport function useChartTheme() {\n const styles = useRootStyles()\n\n return React.useMemo(() => {\n const getColor = (variable: string, fallback: string) => resolveCssColor(styles, variable, fallback)\n\n const chartColors = [\n getColor('--chart-1', FALLBACKS.chart1),\n getColor('--chart-2', FALLBACKS.chart2),\n getColor('--chart-3', FALLBACKS.chart3),\n getColor('--chart-4', FALLBACKS.chart4),\n getColor('--chart-5', FALLBACKS.chart5),\n getColor('--chart-6', FALLBACKS.chart6),\n getColor('--chart-7', FALLBACKS.chart7),\n getColor('--chart-8', FALLBACKS.chart8),\n ]\n\n const axisTickStyle = {\n fontFamily: CHART_FONT_FAMILY,\n fill: getColor('--foreground-lighter', FALLBACKS.foregroundMuted),\n fontSize: 11,\n fontWeight: 400 as const,\n }\n\n const gridStyle = {\n stroke: getColor('--border', FALLBACKS.border),\n strokeDasharray: '3 3',\n strokeOpacity: 0.15,\n }\n\n const tooltipStyle: React.CSSProperties = {\n fontFamily: CHART_FONT_FAMILY,\n background: getColor('--background-overlay-default', FALLBACKS.popover),\n color: getColor('--foreground-default', FALLBACKS.popoverForeground),\n fontSize: 12,\n lineHeight: '1.5',\n borderRadius: '10px',\n border: `1px solid ${getColor('--border-muted', FALLBACKS.border)}`,\n boxShadow: '0 4px 24px -4px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.06)',\n padding: '10px 14px',\n backdropFilter: 'blur(8px)',\n WebkitBackdropFilter: 'blur(8px)',\n }\n\n const crosshairStyle = {\n stroke: getColor('--foreground-muted', FALLBACKS.foregroundMuted),\n strokeWidth: 1,\n strokeDasharray: '4 4',\n strokeOpacity: 0.5,\n }\n\n return {\n chartColors,\n getColor,\n fontFamily: CHART_FONT_FAMILY,\n axisTickStyle,\n gridStyle,\n tooltipStyle,\n crosshairStyle,\n }\n }, [styles])\n}\n","'use client'\n\nimport * as React from 'react'\nimport { Skeleton } from '@/components/ui/skeleton'\nimport { convertToLocalNumbers, formatLargeNumber, type SupportedLocale } from '@/lib/utils'\n\n// ─── Chart Container ─────────────────────────────────────────────────────────\n\ninterface ChartContainerProps {\n className?: string\n dataSlot: string\n ariaLabel?: string\n children: React.ReactNode\n}\n\nexport const ChartContainer = React.forwardRef<HTMLDivElement, ChartContainerProps>(\n ({ className, dataSlot, ariaLabel, children }, ref) => (\n <div\n ref={ref}\n className={className}\n dir=\"ltr\"\n data-slot={dataSlot}\n role=\"img\"\n aria-label={ariaLabel ?? 'نمودار'}\n style={{ position: 'relative', width: '100%', height: '100%' }}\n >\n {children}\n </div>\n )\n)\nChartContainer.displayName = 'ChartContainer'\n\n// ─── Chart Skeleton ──────────────────────────────────────────────────────────\n\ninterface ChartSkeletonProps {\n className?: string\n shape?: 'rect' | 'circle'\n}\n\nexport function ChartLoadingSkeleton({ className, shape = 'rect' }: ChartSkeletonProps) {\n return (\n <div\n data-slot=\"chart-loading-skeleton\"\n className={className}\n dir=\"ltr\"\n style={{ position: 'relative', width: '100%', height: '100%' }}\n role=\"status\"\n aria-label=\"Loading chart\"\n >\n <Skeleton\n shape={shape}\n className={\n shape === 'circle' ? 'w-full h-full min-h-[200px] aspect-square mx-auto' : 'w-full h-full min-h-[200px]'\n }\n />\n </div>\n )\n}\n\n// ─── Chart Tooltip ───────────────────────────────────────────────────────────\n\ninterface ChartTooltipProps {\n active?: boolean\n payload?: Array<{ name: string; value: number; color: string; dataKey?: string }>\n label?: string\n tooltipStyle: React.CSSProperties\n formatter?: (name: string, value: number) => React.ReactNode\n /** Locale for the default value formatter. fa/ar render Persian/Arabic digits with thousands separators; en uses Latin. */\n locale?: SupportedLocale\n}\n\nconst LOCALE_TO_BCP47: Record<SupportedLocale, string> = {\n fa: 'fa-IR',\n ar: 'ar',\n en: 'en-US',\n}\n\nexport function ChartTooltip({ active, payload, label, tooltipStyle, formatter, locale = 'fa' }: ChartTooltipProps) {\n if (!active || !payload?.length) return null\n\n const bcp47 = LOCALE_TO_BCP47[locale] ?? 'fa-IR'\n\n return (\n <div data-slot=\"chart-tooltip\" style={tooltipStyle}>\n {label && <div style={{ fontWeight: 500, fontSize: 13, marginBottom: 6 }}>{label}</div>}\n {payload.map((entry, i) => (\n <div key={i} style={{ display: 'flex', alignItems: 'center', gap: 8, marginTop: i > 0 ? 4 : 0 }}>\n <div\n style={{\n width: 10,\n height: 10,\n borderRadius: 2,\n backgroundColor: entry.color,\n flexShrink: 0,\n }}\n />\n {formatter ? (\n formatter(entry.name, entry.value)\n ) : (\n <span style={{ display: 'flex', justifyContent: 'space-between', width: '100%', gap: 16 }}>\n <span style={{ opacity: 0.7 }}>{entry.name}</span>\n <span style={{ fontWeight: 600, fontVariantNumeric: 'tabular-nums' }}>\n {typeof entry.value === 'number' ? entry.value.toLocaleString(bcp47) : entry.value}\n </span>\n </span>\n )}\n </div>\n ))}\n </div>\n )\n}\n\n// ─── Locale-aware tick formatter ─────────────────────────────────────────────\n\n/**\n * Default tickFormatter for numeric chart axes (Y axis on Line/Area/Bar, both\n * axes on Scatter, radial on Radar). Renders Persian/Arabic digits + locale\n * suffix (\"۱.۵ هزار\", \"1.5K\") for fa/ar, Latin K/M/B for en.\n *\n * Pass via `axisLeft={{ tickFormatter: localeAwareNumberTick('fa') }}`, or rely\n * on the chart wrapper's `locale` prop which wires this in by default.\n */\nexport function localeAwareNumberTick(locale: SupportedLocale): (value: unknown) => string {\n return (value) => {\n if (typeof value === 'number') return formatLargeNumber(value, locale)\n if (typeof value === 'string') {\n // Numeric strings: convert digits only (don't touch labels).\n if (/^-?\\d+(\\.\\d+)?$/.test(value)) return convertToLocalNumbers(value, locale)\n return value\n }\n return String(value ?? '')\n }\n}\n\n/**\n * Default tickFormatter for categorical chart axes — converts embedded digits\n * to the locale's numerals (e.g. \"۱۴۰۳-۰۱\" for \"1403-01\") without altering\n * letters. Use on date/time axes whose labels carry digits.\n */\nexport function localeAwareCategoryTick(locale: SupportedLocale): (value: unknown) => string {\n return (value) => convertToLocalNumbers(String(value ?? ''), locale)\n}\n\n// ─── Data Transform Utility ──────────────────────────────────────────────────\n\n/**\n * Transforms Nivo line/area data format to Recharts row-oriented format.\n * Useful for consumers migrating from Nivo data shape.\n *\n * @example\n * // Nivo: [{ id: \"فروش\", data: [{ x: \"فروردین\", y: 50 }] }]\n * // Recharts: [{ name: \"فروردین\", فروش: 50 }]\n */\nexport function transformNivoLineData(\n nivoData: Array<{ id: string; data: Array<{ x: string | number; y: number }> }>\n): { data: Array<Record<string, string | number>>; dataKeys: string[] } {\n const dataKeys = nivoData.map((s) => s.id)\n const xValues = nivoData[0]?.data.map((d) => d.x) ?? []\n\n const data = xValues.map((x, xi) => {\n const row: Record<string, string | number> = { name: x }\n for (const series of nivoData) {\n row[series.id] = series.data[xi]?.y ?? 0\n }\n return row\n })\n\n return { data, dataKeys }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/ui/table.tsx","../src/components/ui/pagination.tsx","../src/components/ui/pagination-controlled.tsx","../src/hooks/use-infinite-scroll.ts","../src/components/ui/spinner.tsx","../src/components/ui/data-table.tsx"],"names":["React","jsx","isRTL","jsxs","React2","React3","React4"],"mappings":";;;;;;;;;;AAqBA,SAAS,KAAA,CAAM;AAAA,EACb,SAAA;AAAA,EACA,IAAA,GAAO,IAAA;AAAA,EACP,OAAA,GAAU,KAAA;AAAA,EACV,QAAA,GAAW,KAAA;AAAA,EACX,YAAA,GAAe,KAAA;AAAA,EACf,GAAG;AACL,CAAA,EAAe;AACb,EAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,WAAA,EAAU,iBAAA,EAAkB,WAAU,iCAAA,EACzC,QAAA,kBAAA,GAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,OAAA;AAAA,MACV,WAAA,EAAW,IAAA;AAAA,MACX,gBAAc,OAAA,IAAW,MAAA;AAAA,MACzB,iBAAe,QAAA,IAAY,MAAA;AAAA,MAC3B,sBAAoB,YAAA,IAAgB,MAAA;AAAA,MACpC,SAAA,EAAW,EAAA,CAAG,uBAAA,EAAyB,SAAS,CAAA;AAAA,MAC/C,GAAG;AAAA;AAAA,GACN,EACF,CAAA;AAEJ;AAMA,SAAS,WAAA,CAAY,EAAE,SAAA,EAAW,GAAG,OAAM,EAAkC;AAC3E,EAAA,uBACE,GAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,cAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,+BAAA;AAAA,QACA,sIAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;AAMA,SAAS,SAAA,CAAU,EAAE,SAAA,EAAW,GAAG,OAAM,EAAkC;AACzE,EAAA,uBACE,GAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,YAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,4BAAA;AAAA,QACA,gHAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;AAMA,SAAS,WAAA,CAAY,EAAE,SAAA,EAAW,GAAG,OAAM,EAAkC;AAC3E,EAAA,uBACE,GAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,cAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,yDAAA,EAA2D,SAAS,CAAA;AAAA,MACjF,GAAG;AAAA;AAAA,GACN;AAEJ;AAMA,SAAS,QAAA,CAAS,EAAE,SAAA,EAAW,GAAG,OAAM,EAA+B;AACrE,EAAA,uBACE,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,WAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,oFAAA,EAAsF,SAAS,CAAA;AAAA,MAC5G,GAAG;AAAA;AAAA,GACN;AAEJ;AAWA,SAAS,UAAU,EAAE,SAAA,EAAW,aAAA,EAAe,GAAG,OAAM,EAAmB;AACzE,EAAA,MAAM,QAAA,GACJ,kBAAkB,KAAA,GACd,WAAA,GACA,kBAAkB,MAAA,GAChB,YAAA,GACA,aAAA,KAAkB,MAAA,GAChB,MAAA,GACA,MAAA;AAEV,EAAA,uBACE,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,YAAA;AAAA,MACV,WAAA,EAAW,QAAA;AAAA,MACX,SAAA,EAAW,EAAA;AAAA,QACT,qJAAA;AAAA;AAAA,QAEA,2EAAA;AAAA,QACA,4EAAA;AAAA,QACA,8EAAA;AAAA;AAAA,QAEA,8DAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;AAMA,SAAS,SAAA,CAAU,EAAE,SAAA,EAAW,GAAG,OAAM,EAA+B;AACtE,EAAA,uBACE,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,YAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,oGAAA;AAAA;AAAA,QAEA,8EAAA;AAAA,QACA,4EAAA;AAAA,QACA,8EAAA;AAAA;AAAA,QAEA,8DAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;AAMA,SAAS,YAAA,CAAa,EAAE,SAAA,EAAW,GAAG,OAAM,EAAoC;AAC9E,EAAA,uBACE,GAAA,CAAC,SAAA,EAAA,EAAQ,WAAA,EAAU,eAAA,EAAgB,SAAA,EAAW,GAAG,oCAAA,EAAsC,SAAS,CAAA,EAAI,GAAG,KAAA,EAAO,CAAA;AAElH;AAWA,SAAS,gBAAgB,EAAE,SAAA,EAAW,UAAU,MAAA,EAAQ,GAAG,OAAM,EAAyB;AACxF,EAAA,uBACE,IAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,mBAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,oNAAA;AAAA,QACA,MAAA,IAAU,iBAAA;AAAA,QACV;AAAA,OACF;AAAA,MACC,GAAG,KAAA;AAAA,MAEH,QAAA,EAAA;AAAA,QAAA,QAAA;AAAA,wBACD,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mCAAA,EACd,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAM,GAAA;AAAA,cACN,MAAA,EAAO,GAAA;AAAA,cACP,OAAA,EAAQ,SAAA;AAAA,cACR,WAAW,EAAA,CAAG,mBAAA,EAAqB,MAAA,KAAW,KAAA,GAAQ,oBAAoB,uBAAuB,CAAA;AAAA,cAEjG,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,iBAAA,EAAkB,MAAK,cAAA,EAAe;AAAA;AAAA,WAChD;AAAA,0BACA,GAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAM,GAAA;AAAA,cACN,MAAA,EAAO,GAAA;AAAA,cACP,OAAA,EAAQ,SAAA;AAAA,cACR,WAAW,EAAA,CAAG,mBAAA,EAAqB,MAAA,KAAW,MAAA,GAAS,oBAAoB,uBAAuB,CAAA;AAAA,cAElG,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,iBAAA,EAAkB,MAAK,cAAA,EAAe;AAAA;AAAA;AAChD,SAAA,EACF;AAAA;AAAA;AAAA,GACF;AAEJ;AAEA,KAAA,CAAM,WAAA,GAAc,OAAA;AACpB,WAAA,CAAY,WAAA,GAAc,aAAA;AAC1B,SAAA,CAAU,WAAA,GAAc,WAAA;AACxB,WAAA,CAAY,WAAA,GAAc,aAAA;AAC1B,SAAA,CAAU,WAAA,GAAc,WAAA;AACxB,QAAA,CAAS,WAAA,GAAc,UAAA;AACvB,SAAA,CAAU,WAAA,GAAc,WAAA;AACxB,YAAA,CAAa,WAAA,GAAc,cAAA;AAC3B,eAAA,CAAgB,WAAA,GAAc,iBAAA;AC3N9B,IAAM,0BAAA,GAAmCA,qBAAyB,KAAK,CAAA;AAEvE,SAAS,sBAAA,GAAyB;AAChC,EAAA,OAAaA,kBAAW,0BAA0B,CAAA;AACpD;AAEA,SAAS,WAAW,EAAE,SAAA,EAAW,KAAK,QAAA,EAAU,GAAG,OAAM,EAAgC;AACvF,EAAA,MAAM,cAAe,GAAA,IAAqB,KAAA;AAE1C,EAAA,uBACEC,GAAAA,CAAC,0BAAA,CAA2B,UAA3B,EAAoC,KAAA,EAAO,aAC1C,QAAA,kBAAAA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,YAAA;AAAA,MACL,YAAA,EAAW,YAAA;AAAA,MACX,WAAA,EAAU,YAAA;AAAA,MACV,GAAA,EAAK,WAAA;AAAA,MACL,SAAA,EAAW,EAAA,CAAG,8CAAA,EAAgD,SAAS,CAAA;AAAA,MACtE,GAAG,KAAA;AAAA,MAEH;AAAA;AAAA,GACH,EACF,CAAA;AAEJ;AAEA,SAAS,iBAAA,CAAkB,EAAE,SAAA,EAAW,GAAG,OAAM,EAA+B;AAC9E,EAAA,MAAM,MAAM,sBAAA,EAAuB;AAEnC,EAAA,uBACEA,GAAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,oBAAA;AAAA,MACV,GAAA;AAAA,MACA,SAAA,EAAW,EAAA,CAAG,4CAAA,EAA8C,SAAS,CAAA;AAAA,MACpE,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,SAAS,cAAA,CAAe,EAAE,GAAG,KAAA,EAAM,EAA+B;AAChE,EAAA,uBAAOA,GAAAA,CAAC,IAAA,EAAA,EAAG,WAAA,EAAU,iBAAA,EAAmB,GAAG,KAAA,EAAO,CAAA;AACpD;AAOA,SAAS,cAAA,CAAe,EAAE,SAAA,EAAW,QAAA,EAAU,OAAO,MAAA,EAAQ,GAAA,EAAK,GAAG,KAAA,EAAM,EAAwB;AAClG,EAAA,MAAM,aAAa,sBAAA,EAAuB;AAC1C,EAAA,MAAM,OAAA,GAAU,GAAA,KAAQ,UAAA,KAAe,KAAA,GAAQ,KAAA,GAAQ,KAAA,CAAA;AAEvD,EAAA,uBACEA,GAAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACC,cAAA,EAAc,WAAW,MAAA,GAAS,MAAA;AAAA,MAClC,WAAA,EAAU,iBAAA;AAAA,MACV,aAAA,EAAa,QAAA;AAAA,MACb,GAAA,EAAK,OAAA;AAAA,MACL,SAAA,EAAW,EAAA;AAAA,QACT,cAAA,CAAe;AAAA,UACb,OAAA,EAAS,SAAA;AAAA,UACT;AAAA,SACD,CAAA;AAAA;AAAA,QAED,cAAA;AAAA;AAAA,QAEA,QAAA,IAAY;AAAA,UACV,6CAAA;AAAA,UACA,4DAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,SAAS,kBAAA,CAAmB,EAAE,SAAA,EAAW,GAAG,OAAM,EAAgD;AAChG,EAAA,MAAM,MAAM,sBAAA,EAAuB;AACnC,EAAA,MAAMC,SAAQ,GAAA,KAAQ,KAAA;AACtB,EAAA,MAAM,OAAA,GAAU,YAAA,CAAaA,MAAAA,GAAQ,IAAA,GAAO,IAAI,CAAA;AAEhD,EAAA,MAAM,IAAA,GAAOA,SAAQ,gBAAA,GAAmB,eAAA;AAExC,EAAA,uBACEC,IAAAA;AAAA,IAAC,cAAA;AAAA,IAAA;AAAA,MACC,cAAY,OAAA,CAAQ,gBAAA;AAAA,MACpB,IAAA,EAAK,SAAA;AAAA,MACL,SAAA,EAAW,EAAA,CAAG,oDAAA,EAAsD,SAAS,CAAA;AAAA,MAC7E,GAAA,EAAI,KAAA;AAAA,MACH,GAAG,KAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAAF,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,wBACzBA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+BAAA,EAAiC,kBAAQ,QAAA,EAAS;AAAA;AAAA;AAAA,GACpE;AAEJ;AAEA,SAAS,cAAA,CAAe,EAAE,SAAA,EAAW,GAAG,OAAM,EAAgD;AAC5F,EAAA,MAAM,MAAM,sBAAA,EAAuB;AACnC,EAAA,MAAMC,SAAQ,GAAA,KAAQ,KAAA;AACtB,EAAA,MAAM,OAAA,GAAU,YAAA,CAAaA,MAAAA,GAAQ,IAAA,GAAO,IAAI,CAAA;AAEhD,EAAA,MAAM,IAAA,GAAOA,SAAQ,eAAA,GAAkB,gBAAA;AAEvC,EAAA,uBACED,GAAAA;AAAA,IAAC,cAAA;AAAA,IAAA;AAAA,MACC,cAAY,OAAA,CAAQ,YAAA;AAAA,MACpB,IAAA,EAAK,SAAA;AAAA,MACL,SAAA,EAAW,EAAA,CAAG,oDAAA,EAAsD,SAAS,CAAA;AAAA,MAC7E,GAAA,EAAI,KAAA;AAAA,MACH,GAAG,KAAA;AAAA,MAEH,QAAA,EAAAC,MAAAA,mBACCC,IAAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,wBAAAF,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,wBACzBA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+BAAA,EAAiC,kBAAQ,IAAA,EAAK;AAAA,OAAA,EAChE,CAAA,mBAEAE,IAAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,wBAAAF,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+BAAA,EAAiC,kBAAQ,IAAA,EAAK,CAAA;AAAA,wBAC9DA,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,QAAA,EAAS;AAAA,OAAA,EAC3B;AAAA;AAAA,GAEJ;AAEJ;AAEA,SAAS,kBAAA,CAAmB,EAAE,SAAA,EAAW,GAAG,OAAM,EAAiC;AACjF,EAAA,uBACEE,IAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,aAAA,EAAW,IAAA;AAAA,MACX,WAAA,EAAU,qBAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,yCAAA,EAA2C,SAAS,CAAA;AAAA,MACjE,GAAG,KAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAAF,GAAAA,CAAC,kBAAA,EAAA,EAAmB,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,wBACvCA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,WAAU,QAAA,EAAA,YAAA,EAAU;AAAA;AAAA;AAAA,GACtC;AAEJ;AAEA,UAAA,CAAW,WAAA,GAAc,YAAA;AACzB,iBAAA,CAAkB,WAAA,GAAc,mBAAA;AAChC,cAAA,CAAe,WAAA,GAAc,gBAAA;AAC7B,cAAA,CAAe,WAAA,GAAc,gBAAA;AAC7B,kBAAA,CAAmB,WAAA,GAAc,oBAAA;AACjC,cAAA,CAAe,WAAA,GAAc,gBAAA;AAC7B,kBAAA,CAAmB,WAAA,GAAc,oBAAA;ACzFjC,IAAM,oBAAA,GAA6BG,MAAA,CAAA,UAAA;AAAA,EACjC,CACE;AAAA,IACE,WAAA;AAAA,IACA,UAAA;AAAA,IACA,YAAA;AAAA,IACA,YAAA,GAAe,CAAA;AAAA,IACf,aAAA,GAAgB,KAAA;AAAA,IAChB,YAAA,GAAe,IAAA;AAAA,IACf,YAAA,GAAe,IAAA;AAAA,IACf,SAAA;AAAA,IACA,MAAA,GAAS;AAAA,KAEX,GAAA,KACG;AACH,IAAA,MAAMF,MAAAA,GAAQ,MAAA,KAAW,IAAA,IAAQ,MAAA,KAAW,IAAA;AAC5C,IAAA,MAAM,iBAAiB,CAAC,CAAA,KAAc,sBAAsB,MAAA,CAAO,CAAC,GAAG,MAAM,CAAA;AAE7E,IAAA,MAAM,gBAAA,GAAmB,CAAC,IAAA,KAAiB;AACzC,MAAA,IAAI,IAAA,IAAQ,CAAA,IAAK,IAAA,IAAQ,UAAA,IAAc,SAAS,WAAA,EAAa;AAC3D,QAAA,YAAA,CAAa,IAAI,CAAA;AAAA,MACnB;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,sBAAsB,MAAM;AAChC,MAAA,MAAM,QAAiC,EAAC;AACxC,MAAA,MAAM,YAAA,GAAe,eAAe,CAAA,GAAI,CAAA;AACxC,MAAA,MAAM,cAAc,YAAA,GAAe,CAAA;AAEnC,MAAA,IAAI,cAAc,WAAA,EAAa;AAE7B,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,UAAA,EAAY,CAAA,EAAA,EAAK;AACpC,UAAA,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,QACd;AAAA,MACF,CAAA,MAAO;AACL,QAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,GAAA,CAAI,WAAA,GAAc,cAAc,CAAC,CAAA;AAC/D,QAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,GAAA,CAAI,WAAA,GAAc,cAAc,UAAU,CAAA;AAEzE,QAAA,MAAM,yBAAyB,gBAAA,GAAmB,CAAA;AAClD,QAAA,MAAM,uBAAA,GAA0B,oBAAoB,UAAA,GAAa,CAAA;AAEjE,QAAA,IAAI,CAAC,0BAA0B,uBAAA,EAAyB;AACtD,UAAA,MAAM,aAAA,GAAgB,IAAI,CAAA,GAAI,YAAA;AAC9B,UAAA,MAAM,YAAsB,EAAC;AAC7B,UAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,aAAA,EAAe,CAAA,EAAA,EAAK;AACvC,YAAA,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,UAClB;AACA,UAAA,KAAA,CAAM,IAAA,CAAK,GAAG,SAAS,CAAA;AACvB,UAAA,IAAI,YAAA,EAAc,KAAA,CAAM,IAAA,CAAK,UAAU,CAAA;AACvC,UAAA,KAAA,CAAM,KAAK,UAAU,CAAA;AAAA,QACvB,CAAA,MAAA,IAAW,sBAAA,IAA0B,CAAC,uBAAA,EAAyB;AAC7D,UAAA,KAAA,CAAM,KAAK,CAAC,CAAA;AACZ,UAAA,IAAI,YAAA,EAAc,KAAA,CAAM,IAAA,CAAK,UAAU,CAAA;AACvC,UAAA,MAAM,cAAA,GAAiB,IAAI,CAAA,GAAI,YAAA;AAC/B,UAAA,MAAM,aAAuB,EAAC;AAC9B,UAAA,KAAA,IAAS,IAAI,UAAA,GAAa,cAAA,GAAiB,CAAA,EAAG,CAAA,IAAK,YAAY,CAAA,EAAA,EAAK;AAClE,YAAA,UAAA,CAAW,KAAK,CAAC,CAAA;AAAA,UACnB;AACA,UAAA,KAAA,CAAM,IAAA,CAAK,GAAG,UAAU,CAAA;AAAA,QAC1B,CAAA,MAAA,IAAW,0BAA0B,uBAAA,EAAyB;AAC5D,UAAA,KAAA,CAAM,KAAK,CAAC,CAAA;AACZ,UAAA,IAAI,YAAA,EAAc,KAAA,CAAM,IAAA,CAAK,UAAU,CAAA;AACvC,UAAA,KAAA,IAAS,CAAA,GAAI,gBAAA,EAAkB,CAAA,IAAK,iBAAA,EAAmB,CAAA,EAAA,EAAK;AAC1D,YAAA,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,UACd;AACA,UAAA,IAAI,YAAA,EAAc,KAAA,CAAM,IAAA,CAAK,UAAU,CAAA;AACvC,UAAA,KAAA,CAAM,KAAK,UAAU,CAAA;AAAA,QACvB;AAAA,MACF;AAEA,MAAA,OAAO,KAAA;AAAA,IACT,CAAA;AAEA,IAAA,MAAM,cAAc,mBAAA,EAAoB;AAGxC,IAAA,MAAM,kBAAkB,aAAA,IAAiB,CAAC,YAAY,QAAA,CAAS,CAAC,KAAK,WAAA,GAAc,CAAA;AACnF,IAAA,MAAM,iBAAiB,aAAA,IAAiB,CAAC,YAAY,QAAA,CAAS,UAAU,KAAK,WAAA,GAAc,UAAA;AAE3F,IAAA,uBACED,GAAAA,CAAC,UAAA,EAAA,EAAW,GAAA,EAAU,WAAA,EAAU,yBAAwB,SAAA,EAAW,EAAA,CAAG,SAAS,CAAA,EAAG,KAAKC,MAAAA,GAAQ,KAAA,GAAQ,KAAA,EACrG,QAAA,kBAAAC,KAAC,iBAAA,EAAA,EACE,QAAA,EAAA;AAAA,MAAA,eAAA,oBACCF,GAAAA,CAAC,cAAA,EAAA,EACC,QAAA,kBAAAA,GAAAA;AAAA,QAAC,cAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,GAAA;AAAA,UACL,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,YAAA,CAAA,CAAE,cAAA,EAAe;AACjB,YAAA,gBAAA,CAAiB,CAAC,CAAA;AAAA,UACpB,CAAA;AAAA,UAEC,yBAAe,CAAC;AAAA;AAAA,OACnB,EACF,CAAA;AAAA,MAGD,YAAA,oBACCA,GAAAA,CAAC,cAAA,EAAA,EACC,QAAA,kBAAAA,GAAAA;AAAA,QAAC,kBAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,GAAA;AAAA,UACL,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,YAAA,CAAA,CAAE,cAAA,EAAe;AACjB,YAAA,gBAAA,CAAiB,cAAc,CAAC,CAAA;AAAA,UAClC,CAAA;AAAA,UACA,SAAA,EAAW,WAAA,KAAgB,CAAA,GAAI,gCAAA,GAAmC;AAAA;AAAA,OACpE,EACF,CAAA;AAAA,MAGD,WAAA,CAAY,GAAA,CAAI,CAAC,IAAA,EAAM,KAAA,KAAU;AAChC,QAAA,IAAI,SAAS,UAAA,EAAY;AACvB,UAAA,uBACEA,IAAC,cAAA,EAAA,EACC,QAAA,kBAAAA,IAAC,kBAAA,EAAA,EAAmB,CAAA,EAAA,EADD,CAAA,SAAA,EAAY,KAAK,CAAA,CAEtC,CAAA;AAAA,QAEJ;AAEA,QAAA,uBACEA,GAAAA,CAAC,cAAA,EAAA,EACC,QAAA,kBAAAA,GAAAA;AAAA,UAAC,cAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,GAAA;AAAA,YACL,UAAU,IAAA,KAAS,WAAA;AAAA,YACnB,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,cAAA,CAAA,CAAE,cAAA,EAAe;AACjB,cAAA,gBAAA,CAAiB,IAAI,CAAA;AAAA,YACvB,CAAA;AAAA,YAEC,yBAAe,IAAI;AAAA;AAAA,aATH,IAWrB,CAAA;AAAA,MAEJ,CAAC,CAAA;AAAA,MAEA,YAAA,oBACCA,GAAAA,CAAC,cAAA,EAAA,EACC,QAAA,kBAAAA,GAAAA;AAAA,QAAC,cAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,GAAA;AAAA,UACL,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,YAAA,CAAA,CAAE,cAAA,EAAe;AACjB,YAAA,gBAAA,CAAiB,cAAc,CAAC,CAAA;AAAA,UAClC,CAAA;AAAA,UACA,SAAA,EAAW,WAAA,KAAgB,UAAA,GAAa,gCAAA,GAAmC;AAAA;AAAA,OAC7E,EACF,CAAA;AAAA,MAGD,cAAA,oBACCA,GAAAA,CAAC,cAAA,EAAA,EACC,QAAA,kBAAAA,GAAAA;AAAA,QAAC,cAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,GAAA;AAAA,UACL,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,YAAA,CAAA,CAAE,cAAA,EAAe;AACjB,YAAA,gBAAA,CAAiB,UAAU,CAAA;AAAA,UAC7B,CAAA;AAAA,UAEC,yBAAe,UAAU;AAAA;AAAA,OAC5B,EACF;AAAA,KAAA,EAEJ,CAAA,EACF,CAAA;AAAA,EAEJ;AACF;AAEA,oBAAA,CAAqB,WAAA,GAAc,sBAAA;AChM5B,SAAS,iBAAA,CAAkB;AAAA,EAChC,UAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA,GAAY,KAAA;AAAA,EACZ,UAAA,GAAa,OAAA;AAAA,EACb,SAAA,GAAY;AACd,CAAA,EAAsD;AACpD,EAAA,MAAM,WAAA,GAAoBI,cAAoC,IAAI,CAAA;AAGlE,EAAA,MAAM,WAAA,GAAoBA,cAAO,UAAU,CAAA;AAC3C,EAAMA,iBAAU,MAAM;AACpB,IAAA,WAAA,CAAY,OAAA,GAAU,UAAA;AAAA,EACxB,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,EAAA,MAAM,UAAA,GAAmBA,cAAO,OAAO,CAAA;AACvC,EAAMA,iBAAU,MAAM;AACpB,IAAA,UAAA,CAAW,OAAA,GAAU,OAAA;AAAA,EACvB,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,MAAM,YAAA,GAAqBA,cAAO,SAAS,CAAA;AAC3C,EAAMA,iBAAU,MAAM;AACpB,IAAA,YAAA,CAAa,OAAA,GAAU,SAAA;AAAA,EACzB,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,MAAM,WAAA,GAAoBA,MAAA,CAAA,WAAA;AAAA,IACxB,CAAC,IAAA,KAA6B;AAE5B,MAAA,IAAI,YAAY,OAAA,EAAS;AACvB,QAAA,WAAA,CAAY,QAAQ,UAAA,EAAW;AAC/B,QAAA,WAAA,CAAY,OAAA,GAAU,IAAA;AAAA,MACxB;AAEA,MAAA,IAAI,CAAC,IAAA,EAAM;AAEX,MAAA,WAAA,CAAY,UAAU,IAAI,oBAAA;AAAA,QACxB,CAAC,OAAA,KAAY;AACX,UAAA,MAAM,KAAA,GAAQ,QAAQ,CAAC,CAAA;AACvB,UAAA,IAAI,OAAO,cAAA,IAAkB,UAAA,CAAW,OAAA,IAAW,CAAC,aAAa,OAAA,EAAS;AACxE,YAAA,WAAA,CAAY,OAAA,EAAQ;AAAA,UACtB;AAAA,QACF,CAAA;AAAA,QACA,EAAE,YAAY,SAAA;AAAU,OAC1B;AAEA,MAAA,WAAA,CAAY,OAAA,CAAQ,QAAQ,IAAI,CAAA;AAAA,IAClC,CAAA;AAAA,IACA,CAAC,YAAY,SAAS;AAAA,GACxB;AAGA,EAAMA,iBAAU,MAAM;AACpB,IAAA,OAAO,MAAM;AACX,MAAA,WAAA,CAAY,SAAS,UAAA,EAAW;AAAA,IAClC,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO,EAAE,WAAA,EAAY;AACvB;AC/FA,IAAM,eAAA,GAAkB,IAAI,oCAAA,EAAsC;AAAA,EAChE,QAAA,EAAU;AAAA,IACR,IAAA,EAAM;AAAA,MACJ,EAAA,EAAI,QAAA;AAAA,MACJ,EAAA,EAAI,QAAA;AAAA,MACJ,EAAA,EAAI,QAAA;AAAA,MACJ,EAAA,EAAI,QAAA;AAAA,MACJ,EAAA,EAAI;AAAA;AACN,GACF;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,IAAA,EAAM;AAAA;AAEV,CAAC;AAID,IAAM,OAAA,GAAgBC,MAAA,CAAA,UAAA,CAA0C,CAAC,EAAE,SAAA,EAAW,MAAM,GAAG,KAAA,EAAM,EAAG,GAAA,qBAC9FL,GAAAA;AAAA,EAAC,MAAA;AAAA,EAAA;AAAA,IACC,GAAA;AAAA,IACA,WAAA,EAAU,SAAA;AAAA,IACV,IAAA,EAAK,QAAA;AAAA,IACL,YAAA,EAAW,qFAAA;AAAA,IACX,SAAA,EAAW,EAAA,CAAG,yCAAA,EAA2C,SAAS,CAAA;AAAA,IACjE,GAAG,KAAA;AAAA,IAEJ,QAAA,kBAAAA,GAAAA,CAAC,OAAA,EAAA,EAAQ,SAAA,EAAW,eAAA,CAAgB,EAAE,IAAA,EAAM,CAAA,EAAG,aAAA,EAAY,MAAA,EAAO;AAAA;AACpE,CACD;AACD,OAAA,CAAQ,WAAA,GAAc,SAAA;ACuKtB,IAAM,OAAO,MAAM;AAAC,CAAA;AAEpB,SAAS,cAAA,CACP;AAAA,EACE,OAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA,GAAO,IAAA;AAAA,EACP,SAAA,GAAY,KAAA;AAAA,EACZ,WAAA,GAAc,CAAA;AAAA,EACd,UAAA;AAAA,EACA,UAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA,GAAS,KAAA;AAAA,EACT,YAAA,GAAe,IAAA;AAAA,EACf,cAAA;AAAA,EACA,SAAA;AAAA,EACA,gBAAA;AAAA,EACA,SAAA;AAAA,EACA,cAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA,GAAU,KAAA;AAAA,EACV,QAAA,GAAW,KAAA;AAAA,EACX,YAAA,GAAe,KAAA;AAAA,EACf,SAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA,GAAS;AACX,CAAA,EACA,GAAA,EACA;AACA,EAAA,MAAM,CAAA,GAAI,aAAa,MAAM,CAAA;AAC7B,EAAA,MAAM,YAAA,GAAe,CAAC,CAAC,SAAA;AACvB,EAAA,MAAM,YAAA,GAAe,CAAC,CAAC,SAAA;AACvB,EAAA,MAAM,GAAA,GAAM,MAAM,MAAM,CAAA;AAMxB,EAAA,MAAM,cAAA,GAAuB,eAAQ,MAAM;AACzC,IAAA,OAAO,OAAA,CAAQ,MAAA,CAAO,CAAC,GAAA,KAAQ;AAC7B,MAAA,MAAM,QAAA,GAAW,gBAAA,EAAkB,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AACjD,MAAA,IAAI,QAAA,KAAa,QAAW,OAAO,QAAA;AACnC,MAAA,OAAO,IAAI,cAAA,KAAmB,KAAA;AAAA,IAChC,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,OAAA,EAAS,gBAAgB,CAAC,CAAA;AAE9B,EAAA,MAAM,iBAAiB,cAAA,CAAe,MAAA,IAAU,eAAe,CAAA,GAAI,CAAA,CAAA,IAAM,eAAe,CAAA,GAAI,CAAA,CAAA;AAK5F,EAAA,MAAM,SAAA,GAAkB,MAAA,CAAA,OAAA;AAAA,IACtB,MAAM,SAAA,EAAW,SAAA,KAAc,CAAC,GAAU,KAAA,KAAkB,KAAA,CAAA;AAAA,IAC5D,CAAC,WAAW,SAAS;AAAA,GACvB;AAEA,EAAA,MAAM,aAAmB,MAAA,CAAA,OAAA,CAAQ,MAAM,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,EAAK,CAAA,KAAM,SAAA,CAAU,GAAA,EAAK,CAAC,CAAC,CAAA,EAAG,CAAC,IAAA,EAAM,SAAS,CAAC,CAAA;AAEjG,EAAA,MAAM,WAAA,GAAc,YAAA,IAAgB,IAAA,CAAK,MAAA,GAAS,CAAA,IAAK,UAAA,CAAW,KAAA,CAAM,CAAC,GAAA,KAAQ,SAAA,CAAU,YAAA,CAAa,GAAA,CAAI,GAAG,CAAC,CAAA;AAEhH,EAAA,MAAM,YAAA,GAAe,YAAA,IAAgB,CAAC,WAAA,IAAe,UAAA,CAAW,IAAA,CAAK,CAAC,GAAA,KAAQ,SAAA,CAAU,YAAA,CAAa,GAAA,CAAI,GAAG,CAAC,CAAA;AAE7G,EAAA,MAAM,kBAAkB,MAAM;AAC5B,IAAA,IAAI,CAAC,SAAA,EAAW;AAChB,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,SAAA,CAAU,iBAAA,iBAAkB,IAAI,GAAA,EAAK,CAAA;AAAA,IACvC,CAAA,MAAO;AACL,MAAA,SAAA,CAAU,iBAAA,CAAkB,IAAI,GAAA,CAAI,UAAU,CAAC,CAAA;AAAA,IACjD;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,eAAA,GAAkB,CAAC,GAAA,KAAgB;AACvC,IAAA,IAAI,CAAC,SAAA,EAAW;AAChB,IAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,SAAA,CAAU,YAAY,CAAA;AAC3C,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG;AACjB,MAAA,IAAA,CAAK,OAAO,GAAG,CAAA;AAAA,IACjB,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AAAA,IACd;AACA,IAAA,SAAA,CAAU,kBAAkB,IAAI,CAAA;AAAA,EAClC,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,CAAC,QAAA,EAAkB,CAAA,KAA+C;AAEnF,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,MAAM,UAAU,CAAC,CAAC,CAAA,IAAK,UAAA,IAAc,KAAK,CAAA,CAAE,QAAA;AAC5C,MAAA,MAAM,QAAA,GAAW,UAAU,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,QAAQ,CAAA;AAClE,MAAA,MAAM,QAAA,GAAW,UAAU,QAAA,IAAY,CAAA;AACvC,MAAA,IAAI,IAAA;AACJ,MAAA,IAAI,CAAC,OAAA,EAAS;AAEZ,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,IAAA,GAAO,CAAC,EAAE,MAAA,EAAQ,QAAA,EAAU,SAAA,EAAW,SAAS,SAAA,KAAc,KAAA,GAAQ,MAAA,GAAS,KAAA,EAAO,CAAA;AAAA,QACxF,CAAA,MAAO;AACL,UAAA,IAAA,GAAO,CAAC,EAAE,MAAA,EAAQ,QAAA,EAAU,SAAA,EAAW,OAAO,CAAA;AAAA,QAChD;AAAA,MACF,CAAA,MAAO;AACL,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,IAAI,QAAA,CAAS,cAAc,KAAA,EAAO;AAChC,YAAA,IAAA,GAAO,SAAA,CAAU,KAAA,CAAM,GAAA,CAAI,CAAC,MAAO,CAAA,CAAE,MAAA,KAAW,QAAA,GAAW,EAAE,GAAG,CAAA,EAAG,SAAA,EAAW,MAAA,KAAoB,CAAE,CAAA;AAAA,UACtG,CAAA,MAAO;AAEL,YAAA,IAAA,GAAO,UAAU,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,QAAQ,CAAA;AAAA,UAC5D;AAAA,QACF,CAAA,MAAO;AAEL,UAAA,IAAA,GAAO,CAAC,GAAG,SAAA,CAAU,KAAA,EAAO,EAAE,MAAA,EAAQ,QAAA,EAAU,SAAA,EAAW,KAAA,EAAgB,CAAA,CAAE,KAAA,CAAM,GAAG,QAAQ,CAAA;AAAA,QAChG;AAAA,MACF;AACA,MAAA,SAAA,CAAU,aAAa,IAAI,CAAA;AAC3B,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,gBAA+B,IAAA,CAAK,MAAA,KAAW,YAAY,IAAA,CAAK,SAAA,KAAc,QAAQ,MAAA,GAAS,KAAA;AACrG,IAAA,IAAA,CAAK,MAAA,CAAO,UAAU,aAAa,CAAA;AAAA,EACrC,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,CAAC,QAAA,KAA8C;AAChE,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,MAAM,IAAA,GAAO,UAAU,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,QAAQ,CAAA;AAC9D,MAAA,OAAO,IAAA,GAAO,KAAK,SAAA,GAAY,MAAA;AAAA,IACjC;AACA,IAAA,IAAI,CAAC,QAAQ,IAAA,CAAK,MAAA,KAAW,YAAY,CAAC,IAAA,CAAK,WAAW,OAAO,MAAA;AACjE,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd,CAAA;AAGA,EAAA,MAAM,eAAA,GAAkB,CAAC,QAAA,KAA6B;AACpD,IAAA,IAAI,CAAC,WAAW,OAAO,CAAA;AACvB,IAAA,MAAM,GAAA,GAAM,UAAU,KAAA,CAAM,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,QAAQ,CAAA;AAClE,IAAA,OAAO,GAAA,KAAQ,EAAA,GAAK,CAAA,GAAI,GAAA,GAAM,CAAA;AAAA,EAChC,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,CAAC,KAAA,KAAuC;AACzD,IAAA,IAAI,KAAA,KAAU,UAAU,OAAO,aAAA;AAC/B,IAAA,IAAI,KAAA,KAAU,OAAO,OAAO,UAAA;AAC5B,IAAA,OAAO,YAAA;AAAA,EACT,CAAA;AAQA,EAAA,MAAM,QAAA,GAAW,CAAC,MAAA,KAA6B;AAC7C,IAAA,IAAI,CAAC,QAAQ,OAAO,EAAA;AACpB,IAAA,MAAM,SAAA,GAAY,MAAA,KAAW,OAAA,GAAU,mCAAA,GAAsC,iCAAA;AAC7E,IAAA,OAAO,GAAG,SAAS,CAAA,cAAA,CAAA;AAAA,EACrB,CAAA;AAEA,EAAA,MAAM,kBAAA,GAAqB,CAAC,MAAA,KAAmB;AAC7C,IAAA,IAAI,CAAC,SAAA,EAAW;AAChB,IAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,SAAA,CAAU,YAAY,CAAA;AAC3C,IAAA,IAAI,KAAK,GAAA,CAAI,MAAM,CAAA,EAAG,IAAA,CAAK,OAAO,MAAM,CAAA;AAAA,SACnC,IAAA,CAAK,IAAI,MAAM,CAAA;AACpB,IAAA,SAAA,CAAU,qBAAqB,IAAI,CAAA;AAAA,EACrC,CAAA;AAOA,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAU,MAAA,CAAA,QAAA,CAAiC,EAAE,CAAA;AACjF,EAAA,MAAM,OAAA,GAAgB,cAOZ,IAAI,CAAA;AAEd,EAAA,MAAM,WAAA,GAAoB,MAAA,CAAA,WAAA;AAAA,IACxB,CAAC,UAAkB,CAAA,KAA0C;AAC3D,MAAA,MAAM,MAAM,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,QAAQ,CAAA;AACjD,MAAA,IAAI,CAAC,GAAA,EAAK;AACV,MAAA,MAAM,UAAA,GAAc,CAAA,CAAE,aAAA,CAA8B,OAAA,CAAQ,IAAI,CAAA;AAChE,MAAA,MAAM,QAAA,GAAW,UAAA,EAAY,qBAAA,EAAsB,CAAE,KAAA,IAAS,CAAA;AAC9D,MAAA,MAAM,UAAA,GAAa,OAAO,GAAA,CAAI,KAAA,KAAU,WAAW,GAAA,CAAI,KAAA,GAAQ,QAAA,GAAW,CAAA,GAAI,QAAA,GAAW,GAAA;AACzF,MAAA,OAAA,CAAQ,OAAA,GAAU;AAAA,QAChB,QAAA;AAAA,QACA,QAAQ,CAAA,CAAE,OAAA;AAAA,QACV,UAAA;AAAA,QACA,YAAA,EAAc,UAAA;AAAA,QACd,QAAA,EAAU,IAAI,QAAA,IAAY,EAAA;AAAA,QAC1B,QAAA,EAAU,IAAI,QAAA,IAAY;AAAA,OAC5B;AAEC,MAAC,CAAA,CAAE,aAAA,CAA8B,iBAAA,GAAoB,CAAA,CAAE,SAAS,CAAA;AACjE,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,CAAA,CAAE,eAAA,EAAgB;AAAA,IACpB,CAAA;AAAA,IACA,CAAC,OAAO;AAAA,GACV;AAEA,EAAA,MAAM,mBAAA,GAA4B,MAAA,CAAA,WAAA;AAAA,IAChC,CAAC,CAAA,KAA0C;AACzC,MAAA,MAAM,OAAO,OAAA,CAAQ,OAAA;AACrB,MAAA,IAAI,CAAC,IAAA,EAAM;AAEX,MAAA,MAAM,MAAM,GAAA,GAAM,EAAA,GAAK,CAAA,KAAM,CAAA,CAAE,UAAU,IAAA,CAAK,MAAA,CAAA;AAC9C,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,UAAA,GAAa,EAAE,CAAC,CAAA;AAClF,MAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,MAAA,eAAA,CAAgB,CAAC,IAAA,KAAU,IAAA,CAAK,IAAA,CAAK,QAAQ,MAAM,IAAA,GAAO,IAAA,GAAO,EAAE,GAAG,MAAM,CAAC,IAAA,CAAK,QAAQ,GAAG,MAAO,CAAA;AAAA,IACtG,CAAA;AAAA,IACA,CAAC,GAAG;AAAA,GACN;AAEA,EAAA,MAAM,SAAA,GAAkB,MAAA,CAAA,WAAA;AAAA,IACtB,CAAC,CAAA,KAA0C;AACzC,MAAA,MAAM,OAAO,OAAA,CAAQ,OAAA;AACrB,MAAA,IAAI,CAAC,IAAA,EAAM;AACX,MAAA,cAAA,GAAiB,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,YAAY,CAAA;AACjD,MAAA,OAAA,CAAQ,OAAA,GAAU,IAAA;AACjB,MAAC,CAAA,CAAE,aAAA,CAA8B,qBAAA,GAAwB,CAAA,CAAE,SAAS,CAAA;AAAA,IACvE,CAAA;AAAA,IACA,CAAC,cAAc;AAAA,GACjB;AAEA,EAAA,MAAM,cAAA,GAAiB,CAAC,GAAA,KAAoD;AAC1E,IAAA,OAAO,YAAA,CAAa,GAAA,CAAI,EAAE,CAAA,IAAK,GAAA,CAAI,KAAA;AAAA,EACrC,CAAA;AAIA,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,iBAAA,CAAkB;AAAA,IACxC,UAAA,EAAY,gBAAgB,UAAA,IAAc,IAAA;AAAA,IAC1C,OAAA,EAAS,CAAC,CAAC,cAAA,EAAgB,OAAA;AAAA,IAC3B,SAAA,EAAW,CAAC,CAAC,cAAA,EAAgB,aAAA;AAAA,IAC7B,UAAA,EAAY,gBAAgB,UAAA,IAAc;AAAA,GAC3C,CAAA;AAID,EAAA,MAAM,aAAA,GAAgB,YAAY,SAAA,IAAa,CAAA;AAC/C,EAAA,MAAM,kBAAA,GAAqB,YAAY,cAAA,IAAkB,GAAA;AACzD,EAAA,MAAM,YAAA,GAAe,YAAY,QAAA,IAAY,CAAA;AAC7C,EAAA,MAAM,aAAA,GAAsB,cAA8B,IAAI,CAAA;AAC9D,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAU,gBAAS,CAAC,CAAA;AAE1D,EAAA,MAAM,gBAAA,GAAyB,MAAA,CAAA,WAAA,CAAY,CAAC,CAAA,KAAqC;AAC/E,IAAA,gBAAA,CAAiB,CAAA,CAAE,cAAc,SAAS,CAAA;AAAA,EAC5C,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,EAAE,cAAA,EAAgB,YAAA,EAAc,eAAe,gBAAA,EAAiB,GAAU,eAAQ,MAAM;AAC5F,IAAA,IAAI,CAAC,UAAA,IAAc,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG;AACpC,MAAA,OAAO,EAAE,gBAAgB,CAAA,EAAG,YAAA,EAAc,KAAK,MAAA,EAAQ,aAAA,EAAe,CAAA,EAAG,gBAAA,EAAkB,CAAA,EAAE;AAAA,IAC/F;AACA,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,aAAA,GAAgB,aAAa,CAAA,GAAI,YAAY,CAAA;AAClF,IAAA,MAAM,eAAe,IAAA,CAAK,IAAA,CAAK,kBAAA,GAAqB,aAAa,IAAI,YAAA,GAAe,CAAA;AACpF,IAAA,MAAM,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,MAAA,EAAQ,QAAQ,YAAY,CAAA;AACtD,IAAA,OAAO;AAAA,MACL,cAAA,EAAgB,KAAA;AAAA,MAChB,YAAA,EAAc,GAAA;AAAA,MACd,eAAe,KAAA,GAAQ,aAAA;AAAA,MACvB,gBAAA,EAAA,CAAmB,IAAA,CAAK,MAAA,GAAS,GAAA,IAAO;AAAA,KAC1C;AAAA,EACF,CAAA,EAAG,CAAC,UAAA,EAAY,IAAA,CAAK,QAAQ,aAAA,EAAe,aAAA,EAAe,kBAAA,EAAoB,YAAY,CAAC,CAAA;AAE5F,EAAA,uBACEE,IAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAU,WAAA,EAAU,cAAa,SAAA,EAAW,EAAA,CAAG,qBAAA,EAAuB,SAAS,CAAA,EACjF,QAAA,EAAA;AAAA,IAAA,WAAA,oBACCF,GAAAA,CAAC,KAAA,EAAA,EAAI,aAAU,yBAAA,EAA0B,SAAA,EAAU,iCAChD,QAAA,EAAA,WAAA,EACH,CAAA;AAAA,oBAGFA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,aAAa,aAAA,GAAgB,MAAA;AAAA,QAClC,QAAA,EAAU,aAAa,gBAAA,GAAmB,MAAA;AAAA,QAC1C,OAAO,UAAA,GAAa,EAAE,WAAW,kBAAA,EAAoB,SAAA,EAAW,QAAO,GAAI,MAAA;AAAA,QAC3E,WAAA,EAAW,aAAa,2BAAA,GAA8B,MAAA;AAAA,QAEtD,QAAA,kBAAAE,IAAAA,CAAC,KAAA,EAAA,EAAM,IAAA,EAAY,OAAA,EAAkB,UAAoB,YAAA,EAAc,YAAA,IAAgB,CAAC,CAAC,UAAA,EACtF,QAAA,EAAA;AAAA,UAAA,OAAA,oBAAWF,GAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,sCAAsC,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,0BAE7EA,GAAAA,CAAC,WAAA,EAAA,EACC,QAAA,kBAAAE,KAAC,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,YAAA,YAAA,oBACCF,GAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAW,EAAA,CAAG,YAAY,QAAA,CAAS,OAAO,CAAC,CAAA,EACpD,QAAA,kBAAAA,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAS,WAAA,GAAc,IAAA,GAAO,YAAA,GAAe,eAAA,GAAkB,KAAA;AAAA,gBAC/D,eAAA,EAAiB,eAAA;AAAA,gBACjB,cAAY,CAAA,CAAE;AAAA;AAAA,aAChB,EACF,CAAA;AAAA,YAED,YAAA,oBAAgBA,GAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAW,EAAA,CAAG,UAAA,EAAY,QAAA,CAAS,OAAO,CAAC,CAAA,EAAG,aAAA,EAAY,MAAA,EAAO,CAAA;AAAA,YAC5F,cAAA,CAAe,GAAA,CAAI,CAAC,GAAA,KAAQ;AAC3B,cAAA,MAAM,QAAA,GAAW,GAAA,CAAI,QAAA,KAAa,IAAA,IAAQ,SAAA,CAAA;AAC1C,cAAA,MAAM,GAAA,GAAM,QAAA,GAAW,UAAA,CAAW,GAAA,CAAI,EAAE,CAAA,GAAI,MAAA;AAC5C,cAAA,MAAM,QAAA,GAAW,eAAA,CAAgB,GAAA,CAAI,EAAE,CAAA;AACvC,cAAA,MAAM,SAAA,GAAY,eAAe,GAAG,CAAA;AACpC,cAAA,uBACEE,IAAAA;AAAA,gBAAC,SAAA;AAAA,gBAAA;AAAA,kBAEC,aAAA,EAAe,WAAW,GAAA,GAAM,MAAA;AAAA,kBAChC,SAAA,EAAW,EAAA,CAAG,UAAA,EAAY,UAAA,CAAW,GAAA,CAAI,KAAK,CAAA,EAAG,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA,EAAG,GAAA,CAAI,SAAS,CAAA;AAAA,kBACpF,KAAA,EAAO,SAAA,GAAY,EAAE,KAAA,EAAO,WAAU,GAAI,MAAA;AAAA,kBAEzC,QAAA,EAAA;AAAA,oBAAA,QAAA,mBACCF,GAAAA;AAAA,sBAAC,eAAA;AAAA,sBAAA;AAAA,wBACC,MAAA,EAAQ,GAAA,KAAQ,MAAA,GAAS,KAAA,GAAQ,GAAA;AAAA,wBACjC,SAAS,CAAC,CAAA,KAAwB,UAAA,CAAW,GAAA,CAAI,IAAI,CAAC,CAAA;AAAA,wBAEtD,QAAA,kBAAAE,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kCAAA,EACb,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAI,MAAA;AAAA,0BACJ,WAAW,CAAA,IAAK,SAAA,IAAa,UAAU,KAAA,CAAM,MAAA,GAAS,qBACrDF,GAAAA;AAAA,4BAAC,MAAA;AAAA,4BAAA;AAAA,8BACC,WAAA,EAAU,0BAAA;AAAA,8BACV,SAAA,EAAU,+IAAA;AAAA,8BACV,YAAA,EAAY,+FAAoB,QAAQ,CAAA,CAAA;AAAA,8BAEvC,QAAA,EAAA;AAAA;AAAA;AACH,yBAAA,EAEJ;AAAA;AAAA,wBAGF,GAAA,CAAI,MAAA;AAAA,oBAEL,GAAA,CAAI,6BACHA,GAAAA;AAAA,sBAAC,KAAA;AAAA,sBAAA;AAAA,wBACC,WAAA,EAAU,0BAAA;AAAA,wBACV,IAAA,EAAK,WAAA;AAAA,wBACL,kBAAA,EAAiB,UAAA;AAAA,wBACjB,YAAA,EAAW,8FAAA;AAAA,wBACX,eAAe,CAAC,CAAA,KAAM,WAAA,CAAY,GAAA,CAAI,IAAI,CAAC,CAAA;AAAA,wBAC3C,aAAA,EAAe,mBAAA;AAAA,wBACf,WAAA,EAAa,SAAA;AAAA,wBACb,eAAA,EAAiB,SAAA;AAAA,wBACjB,SAAA,EAAW,EAAA;AAAA,0BACT,0FAAA;AAAA,0BACA,sKAAA;AAAA,0BACA,mDAAA;AAAA,0BACA,OAAA,CAAQ,OAAA,EAAS,QAAA,KAAa,GAAA,CAAI,EAAA,IAAM;AAAA;AAC1C;AAAA;AACF;AAAA,iBAAA;AAAA,gBA1CG,GAAA,CAAI;AAAA,eA4CX;AAAA,YAEJ,CAAC;AAAA,WAAA,EACH,CAAA,EACF,CAAA;AAAA,0BAEAE,KAAC,SAAA,EAAA,EACE,QAAA,EAAA;AAAA,YAAA,UAAA,IAAc,CAAC,SAAA,IAAa,IAAA,CAAK,MAAA,GAAS,CAAA,IAAK,aAAA,GAAgB,CAAA,oBAC9DF,GAAAA,CAAC,IAAA,EAAA,EAAG,aAAA,EAAY,MAAA,EAAO,WAAA,EAAU,iCAC/B,QAAA,kBAAAA,GAAAA,CAAC,IAAA,EAAA,EAAG,OAAA,EAAS,cAAA,EAAgB,KAAA,EAAO,EAAE,MAAA,EAAQ,aAAA,EAAe,OAAA,EAAS,CAAA,EAAE,EAAG,CAAA,EAC7E,CAAA;AAAA,YAED,SAAA,GACC,KAAA,CAAM,IAAA,CAAK,EAAE,QAAQ,WAAA,EAAa,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,EAAG,MAAA,qBAC1CE,KAAC,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,cAAA,YAAA,oBACCF,GAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAW,QAAA,CAAS,OAAO,CAAA,EACpC,QAAA,kBAAAA,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,SAAA,EAAU,CAAA,EAChC,CAAA;AAAA,cAED,YAAA,oBACCA,GAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAW,QAAA,CAAS,OAAO,CAAA,EACpC,QAAA,kBAAAA,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,WAAU,CAAA,EAChC,CAAA;AAAA,cAED,cAAA,CAAe,GAAA,CAAI,CAAC,GAAA,KAAQ;AAC3B,gBAAA,MAAM,SAAA,GAAY,eAAe,GAAG,CAAA;AACpC,gBAAA,uBACEA,GAAAA;AAAA,kBAAC,SAAA;AAAA,kBAAA;AAAA,oBAEC,SAAA,EAAW,EAAA,CAAG,UAAA,CAAW,GAAA,CAAI,KAAK,CAAA,EAAG,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA,EAAG,GAAA,CAAI,SAAS,CAAA;AAAA,oBACxE,KAAA,EAAO,SAAA,GAAY,EAAE,KAAA,EAAO,WAAU,GAAI,MAAA;AAAA,oBAE1C,QAAA,kBAAAA,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,0BAAA,EAA2B;AAAA,mBAAA;AAAA,kBAJ1C,GAAA,CAAI;AAAA,iBAKX;AAAA,cAEJ,CAAC;AAAA,aAAA,EAAA,EAtBY,YAAY,MAAM,CAAA,CAuBjC,CACD,CAAA,GACC,KAAK,MAAA,KAAW,CAAA,mBAClBA,GAAAA,CAAC,YACC,QAAA,kBAAAA,GAAAA,CAAC,SAAA,EAAA,EAAU,OAAA,EAAS,gBACjB,QAAA,EAAA,UAAA,oBACCA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,sEAAA,EACZ,QAAA,EAAA,CAAA,CAAE,eAAA,EACL,CAAA,EAEJ,GACF,CAAA,GAAA,CAEC,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,gBAAgB,YAAY,CAAA,GAAI,MAAM,GAAA,CAAI,CAAC,KAAK,QAAA,KAAa;AACpF,cAAA,MAAM,MAAA,GAAS,UAAA,GAAa,cAAA,GAAiB,QAAA,GAAW,QAAA;AACxD,cAAA,MAAM,MAAA,GAAS,SAAA,CAAU,GAAA,EAAK,MAAM,CAAA;AACpC,cAAA,MAAM,UAAA,GAAa,YAAA,IAAgB,SAAA,CAAU,YAAA,CAAa,IAAI,MAAM,CAAA;AACpE,cAAA,MAAM,UAAA,GAAa,YAAA,IAAgB,SAAA,CAAU,YAAA,CAAa,IAAI,MAAM,CAAA;AACpE,cAAA,MAAM,WAAA,GAAc,MAAM,YAAA,GAAe,YAAA;AACzC,cAAA,uBACEE,IAAAA,CAAO,MAAA,CAAA,QAAA,EAAN,EACC,QAAA,EAAA;AAAA,gCAAAA,IAAAA,CAAC,QAAA,EAAA,EAAS,YAAA,EAAY,UAAA,GAAa,aAAa,MAAA,EAC7C,QAAA,EAAA;AAAA,kBAAA,YAAA,oBACCF,GAAAA,CAAC,SAAA,EAAA,EAAU,WAAW,QAAA,CAAS,OAAO,GACpC,QAAA,kBAAAA,GAAAA;AAAA,oBAAC,QAAA;AAAA,oBAAA;AAAA,sBACC,OAAA,EAAS,UAAA;AAAA,sBACT,eAAA,EAAiB,MAAM,eAAA,CAAgB,MAAM,CAAA;AAAA,sBAC7C,YAAA,EAAY,CAAA,EAAG,CAAA,CAAE,SAAS,KAAK,MAAA,GAAS,CAAA,EAAG,cAAA,CAAe,MAAA,KAAW,OAAO,OAAA,GAAU,MAAA,KAAW,IAAA,GAAO,OAAA,GAAU,OAAO,CAAC,CAAA;AAAA;AAAA,mBAC5H,EACF,CAAA;AAAA,kBAED,YAAA,oBACCA,GAAAA,CAAC,SAAA,EAAA,EAAU,WAAW,QAAA,CAAS,OAAO,GACpC,QAAA,kBAAAA,GAAAA;AAAA,oBAAC,QAAA;AAAA,oBAAA;AAAA,sBACC,IAAA,EAAK,QAAA;AAAA,sBACL,YAAA,EAAY,aAAa,UAAA,GAAa,QAAA;AAAA,sBACtC,eAAA,EAAe,UAAA;AAAA,sBACf,OAAA,EAAS,MAAM,kBAAA,CAAmB,MAAM,CAAA;AAAA,sBACxC,SAAA,EAAU,6IAAA;AAAA,sBAET,uCACCA,GAAAA,CAAC,eAAY,SAAA,EAAU,QAAA,EAAS,eAAY,MAAA,EAAO,CAAA,mBAEnDA,GAAAA,CAAC,WAAA,EAAA,EAAY,WAAW,EAAA,CAAG,QAAA,EAAU,OAAO,YAAY,CAAA,EAAG,eAAY,MAAA,EAAO;AAAA;AAAA,mBAElF,EACF,CAAA;AAAA,kBAED,cAAA,CAAe,GAAA,CAAI,CAAC,GAAA,KAAQ;AAC3B,oBAAA,MAAM,SAAA,GAAY,eAAe,GAAG,CAAA;AACpC,oBAAA,uBACEA,GAAAA;AAAA,sBAAC,SAAA;AAAA,sBAAA;AAAA,wBAEC,SAAA,EAAW,EAAA,CAAG,UAAA,CAAW,GAAA,CAAI,KAAK,CAAA,EAAG,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA,EAAG,GAAA,CAAI,SAAS,CAAA;AAAA,wBACxE,KAAA,EAAO,SAAA,GAAY,EAAE,KAAA,EAAO,WAAU,GAAI,MAAA;AAAA,wBAEzC,QAAA,EAAA,GAAA,CAAI,IAAA,CAAK,GAAA,EAAK,MAAM;AAAA,uBAAA;AAAA,sBAJhB,GAAA,CAAI;AAAA,qBAKX;AAAA,kBAEJ,CAAC;AAAA,iBAAA,EACH,CAAA;AAAA,gBACC,gBAAgB,UAAA,oBACfA,IAAC,QAAA,EAAA,EAAS,WAAA,EAAU,2BAClB,QAAA,kBAAAA,GAAAA,CAAC,aAAU,OAAA,EAAS,cAAA,EAAgB,WAAU,8BAAA,EAC3C,QAAA,EAAA,SAAA,CAAU,kBAAkB,GAAA,EAAK,MAAM,GAC1C,CAAA,EACF;AAAA,eAAA,EAAA,EA9CiB,MAgDrB,CAAA;AAAA,YAEJ,CAAC,CAAA;AAAA,YAEF,UAAA,IAAc,CAAC,SAAA,IAAa,IAAA,CAAK,MAAA,GAAS,CAAA,IAAK,gBAAA,GAAmB,CAAA,oBACjEA,GAAAA,CAAC,IAAA,EAAA,EAAG,aAAA,EAAY,MAAA,EAAO,WAAA,EAAU,kCAAA,EAC/B,QAAA,kBAAAA,GAAAA,CAAC,IAAA,EAAA,EAAG,OAAA,EAAS,cAAA,EAAgB,KAAA,EAAO,EAAE,MAAA,EAAQ,gBAAA,EAAkB,OAAA,EAAS,CAAA,EAAE,EAAG,CAAA,EAChF,CAAA;AAAA,YAED,kBAAkB,CAAC,SAAA,IAAa,IAAA,CAAK,MAAA,GAAS,KAAK,cAAA,CAAe,OAAA,oBACjEA,GAAAA,CAAC,QAAG,WAAA,EAAU,8BAAA,EAA+B,eAAa,CAAC,cAAA,CAAe,eACxE,QAAA,kBAAAA,GAAAA;AAAA,cAAC,IAAA;AAAA,cAAA;AAAA,gBACC,GAAA,EAAK,WAAA;AAAA,gBACL,OAAA,EAAS,cAAA;AAAA,gBACT,SAAA,EAAU,UAAA;AAAA,gBAET,QAAA,EAAA,cAAA,CAAe,gBACb,cAAA,CAAe,kBAAA,oBACdE,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,6EAAA,EACb,QAAA,EAAA;AAAA,kCAAAF,GAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,IAAA,EAAK,CAAA;AAAA,kCACnBA,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,CAAA,CAAE,WAAW,kFAAA,EAAkB;AAAA,iBAAA,EACxC,oBAGFA,GAAAA,CAAC,SAAI,aAAA,EAAY,MAAA,EAAO,WAAU,MAAA,EAAO;AAAA;AAAA,aAE7C,EACF,CAAA;AAAA,YAED,cAAA,IACC,CAAC,SAAA,IACD,IAAA,CAAK,MAAA,GAAS,KACd,CAAC,cAAA,CAAe,OAAA,IAChB,cAAA,CAAe,UAAA,oBACbA,IAAC,IAAA,EAAA,EAAG,WAAA,EAAU,yBAAA,EACZ,QAAA,kBAAAA,GAAAA,CAAC,IAAA,EAAA,EAAG,OAAA,EAAS,cAAA,EAAgB,SAAA,EAAU,2DAAA,EACpC,QAAA,EAAA,cAAA,CAAe,UAAA,EAClB,CAAA,EACF;AAAA,WAAA,EAEN,CAAA;AAAA,UAEC,MAAA,IAAU,cAAA,CAAe,IAAA,CAAK,CAAC,MAAM,CAAC,CAAC,CAAA,CAAE,MAAM,KAAK,CAAC,SAAA,IAAa,IAAA,CAAK,MAAA,GAAS,qBAC/EA,GAAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,WAAA,EAAU,mBAAA;AAAA,cACV,eAAa,YAAA,IAAgB,MAAA;AAAA,cAC7B,SAAA,EAAW,EAAA;AAAA,gBACT,0DAAA;AAAA,gBACA,YAAA,IAAgB;AAAA,eAClB;AAAA,cAEA,QAAA,kBAAAE,KAAC,IAAA,EAAA,EACE,QAAA,EAAA;AAAA,gBAAA,YAAA,oBAAgBF,IAAC,IAAA,EAAA,EAAG,SAAA,EAAW,SAAS,OAAO,CAAA,EAAG,eAAY,MAAA,EAAO,CAAA;AAAA,gBACrE,YAAA,oBAAgBA,GAAAA,CAAC,IAAA,EAAA,EAAG,WAAW,QAAA,CAAS,OAAO,CAAA,EAAG,aAAA,EAAY,MAAA,EAAO,CAAA;AAAA,gBACrE,cAAA,CAAe,GAAA,CAAI,CAAC,GAAA,KAAQ;AAC3B,kBAAA,MAAM,SAAA,GAAY,eAAe,GAAG,CAAA;AACpC,kBAAA,uBACEA,GAAAA;AAAA,oBAAC,IAAA;AAAA,oBAAA;AAAA,sBAEC,SAAA,EAAW,EAAA;AAAA,wBACT,UAAA,CAAW,IAAI,KAAK,CAAA;AAAA,wBACpB,QAAA,CAAS,IAAI,MAAM,CAAA;AAAA,wBACnB,GAAA,CAAI,SAAA;AAAA,wBACJ,8EAAA;AAAA,wBACA,4EAAA;AAAA,wBACA;AAAA,uBACF;AAAA,sBACA,KAAA,EAAO,SAAA,GAAY,EAAE,KAAA,EAAO,WAAU,GAAI,MAAA;AAAA,sBAEzC,QAAA,EAAA,GAAA,CAAI,MAAA,GAAS,GAAA,CAAI,MAAA,EAAO,GAAI;AAAA,qBAAA;AAAA,oBAXxB,GAAA,CAAI;AAAA,mBAYX;AAAA,gBAEJ,CAAC;AAAA,eAAA,EACH;AAAA;AAAA;AACF,SAAA,EAEJ;AAAA;AAAA,KACF;AAAA,IAEC,UAAA,IAAc,UAAA,CAAW,UAAA,GAAa,CAAA,oBACrCA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAA,EAAU,uBAAA,EAAwB,SAAA,EAAU,qBAAA,EAC/C,QAAA,kBAAAA,GAAAA;AAAA,MAAC,oBAAA;AAAA,MAAA;AAAA,QACC,aAAa,UAAA,CAAW,WAAA;AAAA,QACxB,YAAY,UAAA,CAAW,UAAA;AAAA,QACvB,cAAc,UAAA,CAAW;AAAA;AAAA,KAC3B,EACF;AAAA,GAAA,EAEJ,CAAA;AAEJ;AAEA,IAAM,SAAA,GAAkB,kBAAW,cAAc;AAI/C,SAAA,CAAuC,WAAA,GAAc,WAAA","file":"chunk-53QY4PD3.js","sourcesContent":["'use client'\n\nimport * as React from 'react'\n\nimport { cn } from '@/lib/utils'\n\n/* -------------------------------------------------------------------------- */\n/* Table */\n/* -------------------------------------------------------------------------- */\n\ninterface TableProps extends React.ComponentProps<'table'> {\n /** Size variant affecting cell padding and font size */\n size?: 'sm' | 'md' | 'lg'\n /** Zebra-striped rows */\n striped?: boolean\n /** Bordered cells */\n bordered?: boolean\n /** Sticky header that stays visible when scrolling */\n stickyHeader?: boolean\n}\n\nfunction Table({\n className,\n size = 'md',\n striped = false,\n bordered = false,\n stickyHeader = false,\n ...props\n}: TableProps) {\n return (\n <div data-slot=\"table-container\" className=\"relative w-full overflow-x-auto\">\n <table\n data-slot=\"table\"\n data-size={size}\n data-striped={striped || undefined}\n data-bordered={bordered || undefined}\n data-sticky-header={stickyHeader || undefined}\n className={cn('w-full caption-bottom', className)}\n {...props}\n />\n </div>\n )\n}\n\n/* -------------------------------------------------------------------------- */\n/* TableHeader */\n/* -------------------------------------------------------------------------- */\n\nfunction TableHeader({ className, ...props }: React.ComponentProps<'thead'>) {\n return (\n <thead\n data-slot=\"table-header\"\n className={cn(\n '[&_tr]:border-b bg-surface-75',\n '[[data-sticky-header]_&]:sticky [[data-sticky-header]_&]:top-0 [[data-sticky-header]_&]:z-[9] [[data-sticky-header]_&]:bg-surface-75',\n className\n )}\n {...props}\n />\n )\n}\n\n/* -------------------------------------------------------------------------- */\n/* TableBody */\n/* -------------------------------------------------------------------------- */\n\nfunction TableBody({ className, ...props }: React.ComponentProps<'tbody'>) {\n return (\n <tbody\n data-slot=\"table-body\"\n className={cn(\n '[&_tr:last-child]:border-0',\n '[[data-striped]_&_tr:nth-child(even)]:bg-surface-75 [[data-striped]_&_tr:nth-child(even):hover]:bg-surface-200',\n className\n )}\n {...props}\n />\n )\n}\n\n/* -------------------------------------------------------------------------- */\n/* TableFooter */\n/* -------------------------------------------------------------------------- */\n\nfunction TableFooter({ className, ...props }: React.ComponentProps<'tfoot'>) {\n return (\n <tfoot\n data-slot=\"table-footer\"\n className={cn('bg-muted/50 border-t font-medium [&>tr]:last:border-b-0', className)}\n {...props}\n />\n )\n}\n\n/* -------------------------------------------------------------------------- */\n/* TableRow */\n/* -------------------------------------------------------------------------- */\n\nfunction TableRow({ className, ...props }: React.ComponentProps<'tr'>) {\n return (\n <tr\n data-slot=\"table-row\"\n className={cn('hover:bg-surface-200 data-[state=selected]:bg-selection border-b transition-colors', className)}\n {...props}\n />\n )\n}\n\n/* -------------------------------------------------------------------------- */\n/* TableHead */\n/* -------------------------------------------------------------------------- */\n\ninterface TableHeadProps extends React.ComponentProps<'th'> {\n /** Sort direction — sets aria-sort on the <th> element */\n sortDirection?: 'asc' | 'desc' | 'none'\n}\n\nfunction TableHead({ className, sortDirection, ...props }: TableHeadProps) {\n const ariaSort =\n sortDirection === 'asc'\n ? 'ascending'\n : sortDirection === 'desc'\n ? 'descending'\n : sortDirection === 'none'\n ? 'none'\n : undefined\n\n return (\n <th\n data-slot=\"table-head\"\n aria-sort={ariaSort}\n className={cn(\n 'text-foreground-lighter text-start align-middle font-semibold whitespace-nowrap [&:has([role=checkbox])]:pe-0 [&>[role=checkbox]]:translate-y-[2px]',\n // Size variants (inherited from parent table)\n '[[data-size=sm]_&]:h-8 [[data-size=sm]_&]:px-2 [[data-size=sm]_&]:text-xs',\n '[[data-size=md]_&]:h-10 [[data-size=md]_&]:px-3 [[data-size=md]_&]:text-sm',\n '[[data-size=lg]_&]:h-12 [[data-size=lg]_&]:px-4 [[data-size=lg]_&]:text-base',\n // Bordered variant\n '[[data-bordered]_&]:border [[data-bordered]_&]:border-border',\n className\n )}\n {...props}\n />\n )\n}\n\n/* -------------------------------------------------------------------------- */\n/* TableCell */\n/* -------------------------------------------------------------------------- */\n\nfunction TableCell({ className, ...props }: React.ComponentProps<'td'>) {\n return (\n <td\n data-slot=\"table-cell\"\n className={cn(\n 'align-middle whitespace-nowrap [&:has([role=checkbox])]:pe-0 [&>[role=checkbox]]:translate-y-[2px]',\n // Size variants (inherited from parent table)\n '[[data-size=sm]_&]:px-2 [[data-size=sm]_&]:py-1.5 [[data-size=sm]_&]:text-xs',\n '[[data-size=md]_&]:px-3 [[data-size=md]_&]:py-2 [[data-size=md]_&]:text-sm',\n '[[data-size=lg]_&]:px-4 [[data-size=lg]_&]:py-3 [[data-size=lg]_&]:text-base',\n // Bordered variant\n '[[data-bordered]_&]:border [[data-bordered]_&]:border-border',\n className\n )}\n {...props}\n />\n )\n}\n\n/* -------------------------------------------------------------------------- */\n/* TableCaption */\n/* -------------------------------------------------------------------------- */\n\nfunction TableCaption({ className, ...props }: React.ComponentProps<'caption'>) {\n return (\n <caption data-slot=\"table-caption\" className={cn('text-foreground-muted mt-4 text-sm', className)} {...props} />\n )\n}\n\n/* -------------------------------------------------------------------------- */\n/* TableSortHeader — clickable sort indicator for table headers */\n/* -------------------------------------------------------------------------- */\n\ninterface TableSortHeaderProps extends React.ComponentProps<'button'> {\n /** Current sort direction */\n sorted?: 'asc' | 'desc' | false\n}\n\nfunction TableSortHeader({ className, children, sorted, ...props }: TableSortHeaderProps) {\n return (\n <button\n data-slot=\"table-sort-header\"\n className={cn(\n 'inline-flex items-center gap-1.5 cursor-pointer select-none hover:text-foreground transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 rounded-sm',\n sorted && 'text-foreground',\n className\n )}\n {...props}\n >\n {children}\n <span className=\"inline-flex flex-col -space-y-0.5\">\n <svg\n width=\"8\"\n height=\"5\"\n viewBox=\"0 0 8 5\"\n className={cn('transition-colors', sorted === 'asc' ? 'text-foreground' : 'text-foreground-muted')}\n >\n <path d=\"M4 0L8 5H0L4 0Z\" fill=\"currentColor\" />\n </svg>\n <svg\n width=\"8\"\n height=\"5\"\n viewBox=\"0 0 8 5\"\n className={cn('transition-colors', sorted === 'desc' ? 'text-foreground' : 'text-foreground-muted')}\n >\n <path d=\"M4 5L0 0H8L4 5Z\" fill=\"currentColor\" />\n </svg>\n </span>\n </button>\n )\n}\n\nTable.displayName = 'Table'\nTableHeader.displayName = 'TableHeader'\nTableBody.displayName = 'TableBody'\nTableFooter.displayName = 'TableFooter'\nTableHead.displayName = 'TableHead'\nTableRow.displayName = 'TableRow'\nTableCell.displayName = 'TableCell'\nTableCaption.displayName = 'TableCaption'\nTableSortHeader.displayName = 'TableSortHeader'\n\nexport { Table, TableHeader, TableBody, TableFooter, TableHead, TableRow, TableCell, TableCaption, TableSortHeader }\n","'use client'\n\nimport * as React from 'react'\nimport { ChevronLeftIcon, ChevronRightIcon, MoreHorizontalIcon } from 'lucide-react'\n\nimport { cn } from '@/lib/utils'\nimport { getUIStrings } from '@/lib/i18n'\nimport { Button, buttonVariants } from './button'\n\ntype Direction = 'ltr' | 'rtl'\n\nconst PaginationDirectionContext = React.createContext<Direction>('rtl')\n\nfunction usePaginationDirection() {\n return React.useContext(PaginationDirectionContext)\n}\n\nfunction Pagination({ className, dir, children, ...props }: React.ComponentProps<'nav'>) {\n const resolvedDir = (dir as Direction) ?? 'rtl'\n\n return (\n <PaginationDirectionContext.Provider value={resolvedDir}>\n <nav\n role=\"navigation\"\n aria-label=\"pagination\"\n data-slot=\"pagination\"\n dir={resolvedDir}\n className={cn('mx-auto flex w-full justify-center not-prose', className)}\n {...props}\n >\n {children}\n </nav>\n </PaginationDirectionContext.Provider>\n )\n}\n\nfunction PaginationContent({ className, ...props }: React.ComponentProps<'ul'>) {\n const dir = usePaginationDirection()\n\n return (\n <ul\n data-slot=\"pagination-content\"\n dir={dir}\n className={cn('flex flex-row items-center gap-1 list-none', className)}\n {...props}\n />\n )\n}\n\nfunction PaginationItem({ ...props }: React.ComponentProps<'li'>) {\n return <li data-slot=\"pagination-item\" {...props} />\n}\n\ntype PaginationLinkProps = {\n isActive?: boolean\n} & Pick<React.ComponentProps<typeof Button>, 'size'> &\n React.ComponentProps<'a'>\n\nfunction PaginationLink({ className, isActive, size = 'icon', dir, ...props }: PaginationLinkProps) {\n const contextDir = usePaginationDirection()\n const linkDir = dir ?? (contextDir === 'rtl' ? 'rtl' : 'ltr')\n\n return (\n <a\n aria-current={isActive ? 'page' : undefined}\n data-slot=\"pagination-link\"\n data-active={isActive}\n dir={linkDir}\n className={cn(\n buttonVariants({\n variant: 'outline',\n size,\n }),\n // Remove underline from links\n 'no-underline',\n // Active state styling with green color\n isActive && [\n 'border-brand-500 bg-brand/10 text-brand-600',\n 'dark:border-brand-600 dark:bg-brand/10 dark:text-brand-400',\n 'pointer-events-none',\n ],\n className\n )}\n {...props}\n />\n )\n}\n\nfunction PaginationPrevious({ className, ...props }: React.ComponentProps<typeof PaginationLink>) {\n const dir = usePaginationDirection()\n const isRTL = dir === 'rtl'\n const strings = getUIStrings(isRTL ? 'fa' : 'en')\n // In RTL, previous uses ChevronRight (→). In LTR, previous uses ChevronLeft (←)\n const Icon = isRTL ? ChevronRightIcon : ChevronLeftIcon\n\n return (\n <PaginationLink\n aria-label={strings.goToPreviousPage}\n size=\"default\"\n className={cn('gap-1 ps-2.5 pe-2.5 no-underline flex items-center', className)}\n dir=\"ltr\"\n {...props}\n >\n <Icon className=\"size-4\" />\n <span className=\"hidden sm:inline no-underline\">{strings.previous}</span>\n </PaginationLink>\n )\n}\n\nfunction PaginationNext({ className, ...props }: React.ComponentProps<typeof PaginationLink>) {\n const dir = usePaginationDirection()\n const isRTL = dir === 'rtl'\n const strings = getUIStrings(isRTL ? 'fa' : 'en')\n // In RTL, next uses ChevronLeft (←). In LTR, next uses ChevronRight (→)\n const Icon = isRTL ? ChevronLeftIcon : ChevronRightIcon\n\n return (\n <PaginationLink\n aria-label={strings.goToNextPage}\n size=\"default\"\n className={cn('gap-1 ps-2.5 pe-2.5 no-underline flex items-center', className)}\n dir=\"ltr\"\n {...props}\n >\n {isRTL ? (\n <>\n <Icon className=\"size-4\" />\n <span className=\"hidden sm:inline no-underline\">{strings.next}</span>\n </>\n ) : (\n <>\n <span className=\"hidden sm:inline no-underline\">{strings.next}</span>\n <Icon className=\"size-4\" />\n </>\n )}\n </PaginationLink>\n )\n}\n\nfunction PaginationEllipsis({ className, ...props }: React.ComponentProps<'span'>) {\n return (\n <span\n aria-hidden\n data-slot=\"pagination-ellipsis\"\n className={cn('flex size-9 items-center justify-center', className)}\n {...props}\n >\n <MoreHorizontalIcon className=\"size-4\" />\n <span className=\"sr-only\">More pages</span>\n </span>\n )\n}\n\nPagination.displayName = 'Pagination'\nPaginationContent.displayName = 'PaginationContent'\nPaginationItem.displayName = 'PaginationItem'\nPaginationLink.displayName = 'PaginationLink'\nPaginationPrevious.displayName = 'PaginationPrevious'\nPaginationNext.displayName = 'PaginationNext'\nPaginationEllipsis.displayName = 'PaginationEllipsis'\n\nexport {\n Pagination,\n PaginationContent,\n PaginationLink,\n PaginationItem,\n PaginationPrevious,\n PaginationNext,\n PaginationEllipsis,\n}\n","'use client'\n\nimport * as React from 'react'\nimport { cn, convertToLocalNumbers, type SupportedLocale } from '@/lib/utils'\nimport {\n Pagination,\n PaginationContent,\n PaginationEllipsis,\n PaginationItem,\n PaginationLink,\n PaginationNext,\n PaginationPrevious,\n} from './pagination'\n\nexport interface PaginationControlledProps {\n /**\n * شماره صفحه فعلی (شروع از 1)\n */\n currentPage: number\n /**\n * تعداد کل صفحات\n */\n totalPages: number\n /**\n * تابع callback برای تغییر صفحه\n */\n onPageChange: (page: number) => void\n /**\n * تعداد صفحات نمایش داده شده در هر طرف صفحه فعلی\n * @default 1\n */\n siblingCount?: number\n /**\n * نمایش دکمههای اول و آخر\n * @default false\n */\n showFirstLast?: boolean\n /**\n * نمایش دکمههای قبلی و بعدی\n * @default true\n */\n showPrevNext?: boolean\n /**\n * نمایش ellipsis برای صفحات مخفی\n * @default true\n */\n showEllipsis?: boolean\n /**\n * کلاسهای اضافی\n */\n className?: string\n /**\n * زبان برای تبدیل اعداد و جهت متن\n * @default \"fa\"\n */\n locale?: SupportedLocale\n}\n\n/**\n * کامپوننت صفحهبندی با props استاندارد\n *\n * @example\n * ```tsx\n * <PaginationControlled\n * currentPage={2}\n * totalPages={10}\n * onPageChange={(page) => console.log(page)}\n * />\n * ```\n */\nconst PaginationControlled = React.forwardRef<HTMLElement, PaginationControlledProps>(\n (\n {\n currentPage,\n totalPages,\n onPageChange,\n siblingCount = 1,\n showFirstLast = false,\n showPrevNext = true,\n showEllipsis = true,\n className,\n locale = 'fa',\n },\n ref\n ) => {\n const isRTL = locale === 'fa' || locale === 'ar'\n const localizeNumber = (n: number) => convertToLocalNumbers(String(n), locale)\n\n const handlePageChange = (page: number) => {\n if (page >= 1 && page <= totalPages && page !== currentPage) {\n onPageChange(page)\n }\n }\n\n const generatePageNumbers = () => {\n const pages: (number | 'ellipsis')[] = []\n const totalNumbers = siblingCount * 2 + 5 // siblingCount on each side + current + first + last + 2 ellipsis\n const totalBlocks = totalNumbers + 2 // +2 for first and last\n\n if (totalPages <= totalBlocks) {\n // Show all pages if total pages is less than or equal to total blocks\n for (let i = 1; i <= totalPages; i++) {\n pages.push(i)\n }\n } else {\n const leftSiblingIndex = Math.max(currentPage - siblingCount, 1)\n const rightSiblingIndex = Math.min(currentPage + siblingCount, totalPages)\n\n const shouldShowLeftEllipsis = leftSiblingIndex > 2\n const shouldShowRightEllipsis = rightSiblingIndex < totalPages - 1\n\n if (!shouldShowLeftEllipsis && shouldShowRightEllipsis) {\n const leftItemCount = 3 + 2 * siblingCount\n const leftRange: number[] = []\n for (let i = 1; i <= leftItemCount; i++) {\n leftRange.push(i)\n }\n pages.push(...leftRange)\n if (showEllipsis) pages.push('ellipsis')\n pages.push(totalPages)\n } else if (shouldShowLeftEllipsis && !shouldShowRightEllipsis) {\n pages.push(1)\n if (showEllipsis) pages.push('ellipsis')\n const rightItemCount = 3 + 2 * siblingCount\n const rightRange: number[] = []\n for (let i = totalPages - rightItemCount + 1; i <= totalPages; i++) {\n rightRange.push(i)\n }\n pages.push(...rightRange)\n } else if (shouldShowLeftEllipsis && shouldShowRightEllipsis) {\n pages.push(1)\n if (showEllipsis) pages.push('ellipsis')\n for (let i = leftSiblingIndex; i <= rightSiblingIndex; i++) {\n pages.push(i)\n }\n if (showEllipsis) pages.push('ellipsis')\n pages.push(totalPages)\n }\n }\n\n return pages\n }\n\n const pageNumbers = generatePageNumbers()\n\n // Don't show first/last if they're already in pageNumbers\n const showFirstButton = showFirstLast && !pageNumbers.includes(1) && currentPage > 1\n const showLastButton = showFirstLast && !pageNumbers.includes(totalPages) && currentPage < totalPages\n\n return (\n <Pagination ref={ref} data-slot=\"pagination-controlled\" className={cn(className)} dir={isRTL ? 'rtl' : 'ltr'}>\n <PaginationContent>\n {showFirstButton && (\n <PaginationItem>\n <PaginationLink\n href=\"#\"\n onClick={(e) => {\n e.preventDefault()\n handlePageChange(1)\n }}\n >\n {localizeNumber(1)}\n </PaginationLink>\n </PaginationItem>\n )}\n\n {showPrevNext && (\n <PaginationItem>\n <PaginationPrevious\n href=\"#\"\n onClick={(e) => {\n e.preventDefault()\n handlePageChange(currentPage - 1)\n }}\n className={currentPage === 1 ? 'pointer-events-none opacity-50' : ''}\n />\n </PaginationItem>\n )}\n\n {pageNumbers.map((page, index) => {\n if (page === 'ellipsis') {\n return (\n <PaginationItem key={`ellipsis-${index}`}>\n <PaginationEllipsis />\n </PaginationItem>\n )\n }\n\n return (\n <PaginationItem key={page}>\n <PaginationLink\n href=\"#\"\n isActive={page === currentPage}\n onClick={(e) => {\n e.preventDefault()\n handlePageChange(page)\n }}\n >\n {localizeNumber(page)}\n </PaginationLink>\n </PaginationItem>\n )\n })}\n\n {showPrevNext && (\n <PaginationItem>\n <PaginationNext\n href=\"#\"\n onClick={(e) => {\n e.preventDefault()\n handlePageChange(currentPage + 1)\n }}\n className={currentPage === totalPages ? 'pointer-events-none opacity-50' : ''}\n />\n </PaginationItem>\n )}\n\n {showLastButton && (\n <PaginationItem>\n <PaginationLink\n href=\"#\"\n onClick={(e) => {\n e.preventDefault()\n handlePageChange(totalPages)\n }}\n >\n {localizeNumber(totalPages)}\n </PaginationLink>\n </PaginationItem>\n )}\n </PaginationContent>\n </Pagination>\n )\n }\n)\n\nPaginationControlled.displayName = 'PaginationControlled'\n\nexport { PaginationControlled }\n","'use client'\n\nimport * as React from 'react'\n\nexport interface UseInfiniteScrollOptions {\n /** Called when the sentinel enters the viewport */\n onLoadMore: () => void\n /** Whether there are more items to load */\n hasMore: boolean\n /** Whether a load is currently in progress (prevents double-firing) */\n isLoading?: boolean\n /** IntersectionObserver rootMargin @default \"200px\" */\n rootMargin?: string\n /** IntersectionObserver threshold @default 0 */\n threshold?: number\n}\n\nexport interface UseInfiniteScrollReturn {\n /** Ref to attach to the sentinel element at the bottom of the list */\n sentinelRef: React.RefCallback<HTMLElement>\n}\n\n/**\n * Hook for infinite scroll using IntersectionObserver.\n *\n * Attach `sentinelRef` to an empty element at the bottom of your list.\n * When it enters the viewport, `onLoadMore` is called (unless `isLoading` or `!hasMore`).\n *\n * @example\n * ```tsx\n * const { sentinelRef } = useInfiniteScroll({\n * onLoadMore: () => fetchNextPage(),\n * hasMore: data.hasNextPage,\n * isLoading: isFetchingNextPage,\n * })\n *\n * return (\n * <div>\n * {items.map(item => <Card key={item.id} {...item} />)}\n * <div ref={sentinelRef} />\n * </div>\n * )\n * ```\n */\nexport function useInfiniteScroll({\n onLoadMore,\n hasMore,\n isLoading = false,\n rootMargin = '200px',\n threshold = 0,\n}: UseInfiniteScrollOptions): UseInfiniteScrollReturn {\n const observerRef = React.useRef<IntersectionObserver | null>(null)\n\n // Keep callbacks fresh without re-creating observer\n const callbackRef = React.useRef(onLoadMore)\n React.useEffect(() => {\n callbackRef.current = onLoadMore\n }, [onLoadMore])\n\n const hasMoreRef = React.useRef(hasMore)\n React.useEffect(() => {\n hasMoreRef.current = hasMore\n }, [hasMore])\n\n const isLoadingRef = React.useRef(isLoading)\n React.useEffect(() => {\n isLoadingRef.current = isLoading\n }, [isLoading])\n\n const sentinelRef = React.useCallback(\n (node: HTMLElement | null) => {\n // Disconnect previous observer\n if (observerRef.current) {\n observerRef.current.disconnect()\n observerRef.current = null\n }\n\n if (!node) return\n\n observerRef.current = new IntersectionObserver(\n (entries) => {\n const entry = entries[0]\n if (entry?.isIntersecting && hasMoreRef.current && !isLoadingRef.current) {\n callbackRef.current()\n }\n },\n { rootMargin, threshold }\n )\n\n observerRef.current.observe(node)\n },\n [rootMargin, threshold]\n )\n\n // Cleanup on unmount\n React.useEffect(() => {\n return () => {\n observerRef.current?.disconnect()\n }\n }, [])\n\n return { sentinelRef }\n}\n","'use client'\n\nimport * as React from 'react'\nimport { Loader2 } from 'lucide-react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '@/lib/utils'\n\nconst spinnerVariants = cva('animate-spin text-muted-foreground', {\n variants: {\n size: {\n xs: 'size-3',\n sm: 'size-4',\n md: 'size-5',\n lg: 'size-6',\n xl: 'size-8',\n },\n },\n defaultVariants: {\n size: 'sm',\n },\n})\n\nexport interface SpinnerProps extends React.HTMLAttributes<HTMLSpanElement>, VariantProps<typeof spinnerVariants> {}\n\nconst Spinner = React.forwardRef<HTMLSpanElement, SpinnerProps>(({ className, size, ...props }, ref) => (\n <span\n ref={ref}\n data-slot=\"spinner\"\n role=\"status\"\n aria-label=\"در حال بارگذاری...\"\n className={cn('inline-flex items-center justify-center', className)}\n {...props}\n >\n <Loader2 className={spinnerVariants({ size })} aria-hidden=\"true\" />\n </span>\n))\nSpinner.displayName = 'Spinner'\n\nexport { Spinner, spinnerVariants }\n","'use client'\n\nimport * as React from 'react'\nimport { ChevronDown, ChevronRight } from 'lucide-react'\nimport { cn, type SupportedLocale } from '@/lib/utils'\nimport { getUIStrings, isRTL } from '@/lib/i18n'\nimport { Checkbox } from '@/components/ui/checkbox'\nimport { Skeleton } from '@/components/ui/skeleton'\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, TableSortHeader } from '@/components/ui/table'\nimport { PaginationControlled } from '@/components/ui/pagination-controlled'\nimport { useInfiniteScroll } from '@/hooks/use-infinite-scroll'\nimport { Spinner } from '@/components/ui/spinner'\n\n/* -------------------------------------------------------------------------- */\n/* Types */\n/* -------------------------------------------------------------------------- */\n\nexport type SortDirection = 'asc' | 'desc'\n\n/** A single sort rule. In multi-sort mode, rules are ordered by priority. */\nexport interface SortRule {\n column: string\n direction: SortDirection\n}\n\nexport interface DataTableColumn<TData> {\n /** Unique key identifying the column — used for sort callbacks */\n id: string\n /** Column header label */\n header: React.ReactNode\n /** Render function for cell content */\n cell: (row: TData, rowIndex: number) => React.ReactNode\n /** Whether this column is sortable */\n sortable?: boolean\n /**\n * Render function for the footer cell (e.g. column total, average). When\n * defined for any column and `footer` is true on the table, a sticky\n * `<tfoot>` row is rendered.\n */\n footer?: () => React.ReactNode\n /** Additional className for both <th> and <td> */\n className?: string\n /** Column alignment */\n align?: 'start' | 'center' | 'end'\n /**\n * Pin the column to the start (logical, RTL-aware) or end of the visible\n * area. Pinned columns stay visible while horizontal scrolling. The\n * selection / expansion gutter columns are pinned automatically.\n */\n pinned?: 'start' | 'end'\n /** Optional fixed pixel width (used for pinning offset calculation) */\n width?: number\n /** Allow the user to drag the start/end edge of this column to resize it. */\n resizable?: boolean\n /** Min width when resizing (px). Default 60. */\n minWidth?: number\n /** Max width when resizing (px). Default 800. */\n maxWidth?: number\n /** When false, this column is hidden via the columnVisibility map */\n defaultVisible?: boolean\n}\n\nexport interface DataTableColumnVisibility {\n /** Map of column id → visible. Missing keys default to true. */\n visible: Record<string, boolean>\n /** Called when a column toggle changes. */\n onVisibilityChange: (next: Record<string, boolean>) => void\n}\n\nexport interface DataTableExpansion<TData> {\n /** Set of expanded row keys. */\n expandedRows: Set<number>\n /** Called when expansion toggles. */\n onExpandedRowsChange: (next: Set<number>) => void\n /** Render function for the expanded content (full-width row below). */\n renderExpandedRow: (row: TData, rowIndex: number) => React.ReactNode\n}\n\nexport interface DataTablePagination {\n currentPage: number\n totalPages: number\n onPageChange: (page: number) => void\n}\n\nexport interface DataTableSort {\n column: string | null\n direction: SortDirection | null\n onSort: (column: string, direction: SortDirection) => void\n}\n\n/**\n * Multi-column sort configuration. When supplied, takes precedence over the\n * single-column `sort` prop. Headers display a priority badge (۱، ۲، ۳…) and\n * Shift-click on a header toggles its rule without disturbing the others.\n * A bare click resets the active rules to a single column.\n */\nexport interface DataTableMultiSort {\n /** Active rules in priority order — first is the primary sort. */\n rules: SortRule[]\n onSortChange: (next: SortRule[]) => void\n /** Maximum rules allowed at once. @default 3 */\n maxRules?: number\n}\n\nexport interface DataTableSelection<TData> {\n selectedRows: Set<number>\n onSelectionChange: (selectedRows: Set<number>) => void\n /** Function to get a unique key for each row (defaults to index) */\n getRowKey?: (row: TData, index: number) => number\n}\n\nexport interface DataTableProps<TData> {\n /** Column definitions */\n columns: DataTableColumn<TData>[]\n /** Data rows */\n data: TData[]\n /** Table size variant */\n size?: 'sm' | 'md' | 'lg'\n /** Show loading skeleton */\n isLoading?: boolean\n /** Number of skeleton rows to show when loading */\n loadingRows?: number\n /** Content to show when data is empty (not loading) */\n emptyState?: React.ReactNode\n /** Pagination configuration */\n pagination?: DataTablePagination\n /** Sort configuration (single-column). Ignored when `multiSort` is set. */\n sort?: DataTableSort\n /** Multi-column sort configuration (Shift-click to add rules). */\n multiSort?: DataTableMultiSort\n /**\n * When a column has a `footer` render fn, render a sticky `<tfoot>` row.\n * Useful for column totals/averages.\n */\n footer?: boolean\n /** Stick the `<tfoot>` to the bottom of the scroll container. @default true when footer enabled */\n stickyFooter?: boolean\n /**\n * Fired with `(columnId, newWidth)` when the user finishes resizing a\n * column. Persist this on the consumer side and feed it back via\n * `column.width` for state to survive remounts.\n */\n onColumnResize?: (columnId: string, width: number) => void\n /** Row selection configuration */\n selection?: DataTableSelection<TData>\n /** Column visibility configuration (for show/hide column toggle) */\n columnVisibility?: DataTableColumnVisibility\n /** Expansion configuration (for inline detail row) */\n expansion?: DataTableExpansion<TData>\n /**\n * Infinite-scroll mode. The sentinel rendered after the last row triggers\n * `onLoadMore` when it enters the viewport. Pair with paged data\n * fetching: append the new rows to `data` on the consumer side. Not\n * compatible with `virtualize` (use one or the other).\n */\n infiniteScroll?: {\n onLoadMore: () => void\n /** When false, the sentinel is removed and no further loads fire. */\n hasMore: boolean\n /** Show a loading indicator in the sentinel row. */\n isLoadingMore?: boolean\n /** IntersectionObserver rootMargin. @default '200px' */\n rootMargin?: string\n /** Custom node to render in the sentinel while loading. */\n loadingMoreContent?: React.ReactNode\n /** Custom node to render when there are no more rows to load. */\n endContent?: React.ReactNode\n }\n /**\n * Opt-in row virtualization for very long lists (1000+ rows). When set,\n * the table is wrapped in a scroll container of `viewportHeight` and only\n * rows in the visible window + `overscan` are rendered. Rows must have a\n * predictable `rowHeight`; expanded rows + dynamic content are NOT\n * supported in virtualized mode.\n */\n virtualize?: {\n /** Pixel height of each row (must be uniform). */\n rowHeight: number\n /** Container scroll-area height in px. @default 480 */\n viewportHeight?: number\n /** Extra rows rendered above and below the viewport. @default 6 */\n overscan?: number\n }\n /** Zebra-striped rows */\n striped?: boolean\n /** Bordered cells */\n bordered?: boolean\n /** Sticky header */\n stickyHeader?: boolean\n /** Additional className for the root wrapper */\n className?: string\n /** Caption text below the table */\n caption?: string\n /** Total result count shown above table (e.g. \"۲۴ نتیجه\") */\n resultCount?: React.ReactNode\n /** Locale for UI strings @default 'fa' */\n locale?: SupportedLocale\n}\n\n/* -------------------------------------------------------------------------- */\n/* DataTable */\n/* -------------------------------------------------------------------------- */\n\nconst noop = () => {}\n\nfunction DataTableInner<TData>(\n {\n columns,\n data,\n size = 'md',\n isLoading = false,\n loadingRows = 5,\n emptyState,\n pagination,\n sort,\n multiSort,\n footer = false,\n stickyFooter = true,\n onColumnResize,\n selection,\n columnVisibility,\n expansion,\n infiniteScroll,\n virtualize,\n striped = false,\n bordered = false,\n stickyHeader = false,\n className,\n caption,\n resultCount,\n locale = 'fa',\n }: DataTableProps<TData>,\n ref: React.ForwardedRef<HTMLDivElement>\n) {\n const t = getUIStrings(locale)\n const hasSelection = !!selection\n const hasExpansion = !!expansion\n const rtl = isRTL(locale)\n\n // Filter columns by visibility map (explicit override) or defaultVisible\n // fallback. When no columnVisibility prop is supplied, columns marked\n // `defaultVisible: false` are still hidden — consumers can flip them on\n // by passing a columnVisibility prop with `{ id: true }`.\n const visibleColumns = React.useMemo(() => {\n return columns.filter((col) => {\n const explicit = columnVisibility?.visible[col.id]\n if (explicit !== undefined) return explicit\n return col.defaultVisible !== false\n })\n }, [columns, columnVisibility])\n\n const allColumnCount = visibleColumns.length + (hasSelection ? 1 : 0) + (hasExpansion ? 1 : 0)\n\n // Memoize the row-key resolver so it has a stable identity across renders\n // when consumer omits selection.getRowKey (the default identity function\n // would be a new ref every render and bust downstream useMemos).\n const getRowKey = React.useMemo(\n () => selection?.getRowKey ?? ((_: TData, index: number) => index),\n [selection?.getRowKey]\n )\n\n const allRowKeys = React.useMemo(() => data.map((row, i) => getRowKey(row, i)), [data, getRowKey])\n\n const allSelected = hasSelection && data.length > 0 && allRowKeys.every((key) => selection.selectedRows.has(key))\n\n const someSelected = hasSelection && !allSelected && allRowKeys.some((key) => selection.selectedRows.has(key))\n\n const handleSelectAll = () => {\n if (!selection) return\n if (allSelected) {\n selection.onSelectionChange(new Set())\n } else {\n selection.onSelectionChange(new Set(allRowKeys))\n }\n }\n\n const handleSelectRow = (key: number) => {\n if (!selection) return\n const next = new Set(selection.selectedRows)\n if (next.has(key)) {\n next.delete(key)\n } else {\n next.add(key)\n }\n selection.onSelectionChange(next)\n }\n\n const handleSort = (columnId: string, e?: React.MouseEvent | React.KeyboardEvent) => {\n // Multi-sort takes precedence — Shift-click toggles rule, plain click replaces all\n if (multiSort) {\n const isShift = !!e && 'shiftKey' in e && e.shiftKey\n const existing = multiSort.rules.find((r) => r.column === columnId)\n const maxRules = multiSort.maxRules ?? 3\n let next: SortRule[]\n if (!isShift) {\n // Plain click: cycle existing → flip / replace with this column ascending\n if (existing) {\n next = [{ column: columnId, direction: existing.direction === 'asc' ? 'desc' : 'asc' }]\n } else {\n next = [{ column: columnId, direction: 'asc' }]\n }\n } else {\n if (existing) {\n if (existing.direction === 'asc') {\n next = multiSort.rules.map((r) => (r.column === columnId ? { ...r, direction: 'desc' as const } : r))\n } else {\n // Already desc → remove the rule\n next = multiSort.rules.filter((r) => r.column !== columnId)\n }\n } else {\n // Append a new rule, capped at maxRules\n next = [...multiSort.rules, { column: columnId, direction: 'asc' as const }].slice(0, maxRules)\n }\n }\n multiSort.onSortChange(next)\n return\n }\n if (!sort) return\n const nextDirection: SortDirection = sort.column === columnId && sort.direction === 'asc' ? 'desc' : 'asc'\n sort.onSort(columnId, nextDirection)\n }\n\n const getSortDir = (columnId: string): 'asc' | 'desc' | 'none' => {\n if (multiSort) {\n const rule = multiSort.rules.find((r) => r.column === columnId)\n return rule ? rule.direction : 'none'\n }\n if (!sort || sort.column !== columnId || !sort.direction) return 'none'\n return sort.direction\n }\n\n /** Priority badge index for multi-sort (1-based). 0 = no rule. */\n const getSortPriority = (columnId: string): number => {\n if (!multiSort) return 0\n const idx = multiSort.rules.findIndex((r) => r.column === columnId)\n return idx === -1 ? 0 : idx + 1\n }\n\n const alignClass = (align?: 'start' | 'center' | 'end') => {\n if (align === 'center') return 'text-center'\n if (align === 'end') return 'text-end'\n return 'text-start'\n }\n\n /**\n * Pinned-column style — uses CSS logical inset properties so RTL is\n * automatic. We don't compute pixel offsets for stacked pinned columns\n * (those are rare); first pinned column on each side is enough for the\n * common case.\n */\n const pinClass = (pinned?: 'start' | 'end') => {\n if (!pinned) return ''\n const sideClass = pinned === 'start' ? 'sticky inset-inline-start-0 z-[1]' : 'sticky inset-inline-end-0 z-[1]'\n return `${sideClass} bg-background`\n }\n\n const handleToggleExpand = (rowKey: number) => {\n if (!expansion) return\n const next = new Set(expansion.expandedRows)\n if (next.has(rowKey)) next.delete(rowKey)\n else next.add(rowKey)\n expansion.onExpandedRowsChange(next)\n }\n\n /* ----------------------------- Column resize ---------------------------- */\n\n // Live override widths during drag — keyed by column id. Only applies while\n // dragging is active; on mouseup we surface the final width via callback\n // and the consumer is expected to push it back via `column.width`.\n const [resizeWidths, setResizeWidths] = React.useState<Record<string, number>>({})\n const dragRef = React.useRef<{\n columnId: string\n startX: number\n startWidth: number\n currentWidth: number\n minWidth: number\n maxWidth: number\n } | null>(null)\n\n const startResize = React.useCallback(\n (columnId: string, e: React.PointerEvent<HTMLDivElement>) => {\n const col = columns.find((c) => c.id === columnId)\n if (!col) return\n const headerCell = (e.currentTarget as HTMLElement).closest('th')\n const measured = headerCell?.getBoundingClientRect().width || 0\n const startWidth = typeof col.width === 'number' ? col.width : measured > 0 ? measured : 120\n dragRef.current = {\n columnId,\n startX: e.clientX,\n startWidth,\n currentWidth: startWidth,\n minWidth: col.minWidth ?? 60,\n maxWidth: col.maxWidth ?? 800,\n }\n // Capture pointer to keep receiving moves outside the divider\n ;(e.currentTarget as HTMLElement).setPointerCapture?.(e.pointerId)\n e.preventDefault()\n e.stopPropagation()\n },\n [columns]\n )\n\n const onResizePointerMove = React.useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n const drag = dragRef.current\n if (!drag) return\n // In RTL the visual drag direction reverses\n const dx = (rtl ? -1 : 1) * (e.clientX - drag.startX)\n const next = Math.max(drag.minWidth, Math.min(drag.maxWidth, drag.startWidth + dx))\n drag.currentWidth = next\n setResizeWidths((prev) => (prev[drag.columnId] === next ? prev : { ...prev, [drag.columnId]: next }))\n },\n [rtl]\n )\n\n const endResize = React.useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n const drag = dragRef.current\n if (!drag) return\n onColumnResize?.(drag.columnId, drag.currentWidth)\n dragRef.current = null\n ;(e.currentTarget as HTMLElement).releasePointerCapture?.(e.pointerId)\n },\n [onColumnResize]\n )\n\n const getColumnWidth = (col: DataTableColumn<TData>): number | undefined => {\n return resizeWidths[col.id] ?? col.width\n }\n\n /* ---------------------------- Infinite scroll --------------------------- */\n\n const { sentinelRef } = useInfiniteScroll({\n onLoadMore: infiniteScroll?.onLoadMore ?? noop,\n hasMore: !!infiniteScroll?.hasMore,\n isLoading: !!infiniteScroll?.isLoadingMore,\n rootMargin: infiniteScroll?.rootMargin ?? '200px',\n })\n\n /* ----------------------------- Virtualization --------------------------- */\n\n const virtRowHeight = virtualize?.rowHeight ?? 0\n const virtViewportHeight = virtualize?.viewportHeight ?? 480\n const virtOverscan = virtualize?.overscan ?? 6\n const virtScrollRef = React.useRef<HTMLDivElement | null>(null)\n const [virtScrollTop, setVirtScrollTop] = React.useState(0)\n\n const handleVirtScroll = React.useCallback((e: React.UIEvent<HTMLDivElement>) => {\n setVirtScrollTop(e.currentTarget.scrollTop)\n }, [])\n\n // When virtualize is set, compute the visible slice; otherwise use full data.\n const { virtStartIndex, virtEndIndex, virtTopSpacer, virtBottomSpacer } = React.useMemo(() => {\n if (!virtualize || data.length === 0) {\n return { virtStartIndex: 0, virtEndIndex: data.length, virtTopSpacer: 0, virtBottomSpacer: 0 }\n }\n const start = Math.max(0, Math.floor(virtScrollTop / virtRowHeight) - virtOverscan)\n const visibleCount = Math.ceil(virtViewportHeight / virtRowHeight) + virtOverscan * 2\n const end = Math.min(data.length, start + visibleCount)\n return {\n virtStartIndex: start,\n virtEndIndex: end,\n virtTopSpacer: start * virtRowHeight,\n virtBottomSpacer: (data.length - end) * virtRowHeight,\n }\n }, [virtualize, data.length, virtScrollTop, virtRowHeight, virtViewportHeight, virtOverscan])\n\n return (\n <div ref={ref} data-slot=\"data-table\" className={cn('flex flex-col gap-4', className)}>\n {resultCount && (\n <div data-slot=\"data-table-result-count\" className=\"text-sm text-foreground-muted\">\n {resultCount}\n </div>\n )}\n\n <div\n ref={virtualize ? virtScrollRef : undefined}\n onScroll={virtualize ? handleVirtScroll : undefined}\n style={virtualize ? { maxHeight: virtViewportHeight, overflowY: 'auto' } : undefined}\n data-slot={virtualize ? 'data-table-virtual-scroll' : undefined}\n >\n <Table size={size} striped={striped} bordered={bordered} stickyHeader={stickyHeader || !!virtualize}>\n {caption && <caption className=\"text-foreground-muted mt-4 text-sm\">{caption}</caption>}\n\n <TableHeader>\n <TableRow>\n {hasSelection && (\n <TableHead className={cn('w-[40px]', pinClass('start'))}>\n <Checkbox\n checked={allSelected ? true : someSelected ? 'indeterminate' : false}\n onCheckedChange={handleSelectAll}\n aria-label={t.selectAll}\n />\n </TableHead>\n )}\n {hasExpansion && <TableHead className={cn('w-[36px]', pinClass('start'))} aria-hidden=\"true\" />}\n {visibleColumns.map((col) => {\n const sortable = col.sortable && (sort || multiSort)\n const dir = sortable ? getSortDir(col.id) : 'none'\n const priority = getSortPriority(col.id)\n const liveWidth = getColumnWidth(col)\n return (\n <TableHead\n key={col.id}\n sortDirection={sortable ? dir : undefined}\n className={cn('relative', alignClass(col.align), pinClass(col.pinned), col.className)}\n style={liveWidth ? { width: liveWidth } : undefined}\n >\n {sortable ? (\n <TableSortHeader\n sorted={dir === 'none' ? false : dir}\n onClick={(e: React.MouseEvent) => handleSort(col.id, e)}\n >\n <span className=\"inline-flex items-center gap-1.5\">\n {col.header}\n {priority > 0 && multiSort && multiSort.rules.length > 1 && (\n <span\n data-slot=\"data-table-sort-priority\"\n className=\"inline-flex h-4 min-w-4 items-center justify-center rounded bg-overlay-active px-1 text-[10px] font-medium tabular-nums text-foreground-light\"\n aria-label={`اولویت مرتبسازی ${priority}`}\n >\n {priority}\n </span>\n )}\n </span>\n </TableSortHeader>\n ) : (\n col.header\n )}\n {col.resizable && (\n <div\n data-slot=\"data-table-resize-handle\"\n role=\"separator\"\n aria-orientation=\"vertical\"\n aria-label=\"تغییر اندازه ستون\"\n onPointerDown={(e) => startResize(col.id, e)}\n onPointerMove={onResizePointerMove}\n onPointerUp={endResize}\n onPointerCancel={endResize}\n className={cn(\n 'absolute inset-block-0 inset-inline-end-0 w-1.5 cursor-col-resize select-none touch-none',\n 'before:absolute before:inset-block-2 before:inset-inline-1/2 before:w-px before:-translate-x-1/2 before:bg-border-default before:opacity-0 before:transition-opacity',\n 'hover:before:opacity-100 focus:before:opacity-100',\n dragRef.current?.columnId === col.id && 'before:!bg-brand before:opacity-100'\n )}\n />\n )}\n </TableHead>\n )\n })}\n </TableRow>\n </TableHeader>\n\n <TableBody>\n {virtualize && !isLoading && data.length > 0 && virtTopSpacer > 0 && (\n <tr aria-hidden=\"true\" data-slot=\"data-table-virtual-spacer-top\">\n <td colSpan={allColumnCount} style={{ height: virtTopSpacer, padding: 0 }} />\n </tr>\n )}\n {isLoading ? (\n Array.from({ length: loadingRows }).map((_, rowIdx) => (\n <TableRow key={`skeleton-${rowIdx}`}>\n {hasSelection && (\n <TableCell className={pinClass('start')}>\n <Skeleton className=\"h-4 w-4\" />\n </TableCell>\n )}\n {hasExpansion && (\n <TableCell className={pinClass('start')}>\n <Skeleton className=\"h-4 w-4\" />\n </TableCell>\n )}\n {visibleColumns.map((col) => {\n const liveWidth = getColumnWidth(col)\n return (\n <TableCell\n key={col.id}\n className={cn(alignClass(col.align), pinClass(col.pinned), col.className)}\n style={liveWidth ? { width: liveWidth } : undefined}\n >\n <Skeleton className=\"h-4 w-full max-w-[120px]\" />\n </TableCell>\n )\n })}\n </TableRow>\n ))\n ) : data.length === 0 ? (\n <TableRow>\n <TableCell colSpan={allColumnCount}>\n {emptyState || (\n <div className=\"flex items-center justify-center py-10 text-foreground-muted text-sm\">\n {t.noDataToDisplay}\n </div>\n )}\n </TableCell>\n </TableRow>\n ) : (\n (virtualize ? data.slice(virtStartIndex, virtEndIndex) : data).map((row, sliceIdx) => {\n const rowIdx = virtualize ? virtStartIndex + sliceIdx : sliceIdx\n const rowKey = getRowKey(row, rowIdx)\n const isSelected = hasSelection && selection.selectedRows.has(rowKey)\n const isExpanded = hasExpansion && expansion.expandedRows.has(rowKey)\n const ChevronIcon = rtl ? ChevronRight : ChevronRight\n return (\n <React.Fragment key={rowKey}>\n <TableRow data-state={isSelected ? 'selected' : undefined}>\n {hasSelection && (\n <TableCell className={pinClass('start')}>\n <Checkbox\n checked={isSelected}\n onCheckedChange={() => handleSelectRow(rowKey)}\n aria-label={`${t.selectRow} ${(rowIdx + 1).toLocaleString(locale === 'fa' ? 'fa-IR' : locale === 'ar' ? 'ar-SA' : 'en-US')}`}\n />\n </TableCell>\n )}\n {hasExpansion && (\n <TableCell className={pinClass('start')}>\n <button\n type=\"button\"\n aria-label={isExpanded ? 'collapse' : 'expand'}\n aria-expanded={isExpanded}\n onClick={() => handleToggleExpand(rowKey)}\n className=\"inline-flex size-6 items-center justify-center rounded text-foreground-lighter hover:bg-surface-100 hover:text-foreground transition-colors\"\n >\n {isExpanded ? (\n <ChevronDown className=\"size-4\" aria-hidden=\"true\" />\n ) : (\n <ChevronIcon className={cn('size-4', rtl && 'rotate-180')} aria-hidden=\"true\" />\n )}\n </button>\n </TableCell>\n )}\n {visibleColumns.map((col) => {\n const liveWidth = getColumnWidth(col)\n return (\n <TableCell\n key={col.id}\n className={cn(alignClass(col.align), pinClass(col.pinned), col.className)}\n style={liveWidth ? { width: liveWidth } : undefined}\n >\n {col.cell(row, rowIdx)}\n </TableCell>\n )\n })}\n </TableRow>\n {hasExpansion && isExpanded && (\n <TableRow data-slot=\"data-table-expanded-row\">\n <TableCell colSpan={allColumnCount} className=\"bg-surface-100/50 border-t-0\">\n {expansion.renderExpandedRow(row, rowIdx)}\n </TableCell>\n </TableRow>\n )}\n </React.Fragment>\n )\n })\n )}\n {virtualize && !isLoading && data.length > 0 && virtBottomSpacer > 0 && (\n <tr aria-hidden=\"true\" data-slot=\"data-table-virtual-spacer-bottom\">\n <td colSpan={allColumnCount} style={{ height: virtBottomSpacer, padding: 0 }} />\n </tr>\n )}\n {infiniteScroll && !isLoading && data.length > 0 && infiniteScroll.hasMore && (\n <tr data-slot=\"data-table-infinite-sentinel\" aria-hidden={!infiniteScroll.isLoadingMore}>\n <td\n ref={sentinelRef as React.RefCallback<HTMLTableCellElement>}\n colSpan={allColumnCount}\n className=\"border-0\"\n >\n {infiniteScroll.isLoadingMore ? (\n (infiniteScroll.loadingMoreContent ?? (\n <div className=\"flex items-center justify-center gap-2 py-3 text-sm text-foreground-lighter\">\n <Spinner size=\"sm\" />\n <span>{t.loading ?? 'در حال بارگذاری'}</span>\n </div>\n ))\n ) : (\n <div aria-hidden=\"true\" className=\"h-px\" />\n )}\n </td>\n </tr>\n )}\n {infiniteScroll &&\n !isLoading &&\n data.length > 0 &&\n !infiniteScroll.hasMore &&\n infiniteScroll.endContent && (\n <tr data-slot=\"data-table-infinite-end\">\n <td colSpan={allColumnCount} className=\"border-0 py-3 text-center text-xs text-foreground-lighter\">\n {infiniteScroll.endContent}\n </td>\n </tr>\n )}\n </TableBody>\n\n {footer && visibleColumns.some((c) => !!c.footer) && !isLoading && data.length > 0 && (\n <tfoot\n data-slot=\"data-table-footer\"\n data-sticky={stickyFooter || undefined}\n className={cn(\n 'bg-surface-75 border-t border-border-default font-medium',\n stickyFooter && '[&>tr>td]:sticky [&>tr>td]:inset-block-end-0 [&>tr>td]:bg-surface-75 [&>tr>td]:z-[8]'\n )}\n >\n <tr>\n {hasSelection && <td className={pinClass('start')} aria-hidden=\"true\" />}\n {hasExpansion && <td className={pinClass('start')} aria-hidden=\"true\" />}\n {visibleColumns.map((col) => {\n const liveWidth = getColumnWidth(col)\n return (\n <td\n key={col.id}\n className={cn(\n alignClass(col.align),\n pinClass(col.pinned),\n col.className,\n '[[data-size=sm]_&]:px-2 [[data-size=sm]_&]:py-1.5 [[data-size=sm]_&]:text-xs',\n '[[data-size=md]_&]:px-3 [[data-size=md]_&]:py-2 [[data-size=md]_&]:text-sm',\n '[[data-size=lg]_&]:px-4 [[data-size=lg]_&]:py-3 [[data-size=lg]_&]:text-base'\n )}\n style={liveWidth ? { width: liveWidth } : undefined}\n >\n {col.footer ? col.footer() : null}\n </td>\n )\n })}\n </tr>\n </tfoot>\n )}\n </Table>\n </div>\n\n {pagination && pagination.totalPages > 1 && (\n <div data-slot=\"data-table-pagination\" className=\"flex justify-center\">\n <PaginationControlled\n currentPage={pagination.currentPage}\n totalPages={pagination.totalPages}\n onPageChange={pagination.onPageChange}\n />\n </div>\n )}\n </div>\n )\n}\n\nconst DataTable = React.forwardRef(DataTableInner) as <TData>(\n props: DataTableProps<TData> & { ref?: React.ForwardedRef<HTMLDivElement> }\n) => React.ReactElement\n\n;(DataTable as { displayName?: string }).displayName = 'DataTable'\n\nexport { DataTable }\n"]}
|
package/dist/chunk-7Y4V3R3Y.cjs
DELETED
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var chunk3AIJKXBV_cjs = require('./chunk-3AIJKXBV.cjs');
|
|
4
|
-
var React = require('react');
|
|
5
|
-
var recharts = require('recharts');
|
|
6
|
-
var jsxRuntime = require('react/jsx-runtime');
|
|
7
|
-
|
|
8
|
-
function _interopNamespace(e) {
|
|
9
|
-
if (e && e.__esModule) return e;
|
|
10
|
-
var n = Object.create(null);
|
|
11
|
-
if (e) {
|
|
12
|
-
Object.keys(e).forEach(function (k) {
|
|
13
|
-
if (k !== 'default') {
|
|
14
|
-
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
15
|
-
Object.defineProperty(n, k, d.get ? d : {
|
|
16
|
-
enumerable: true,
|
|
17
|
-
get: function () { return e[k]; }
|
|
18
|
-
});
|
|
19
|
-
}
|
|
20
|
-
});
|
|
21
|
-
}
|
|
22
|
-
n.default = e;
|
|
23
|
-
return Object.freeze(n);
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
27
|
-
|
|
28
|
-
var PartoAreaChart = React__namespace.forwardRef(function PartoAreaChart2({
|
|
29
|
-
data,
|
|
30
|
-
dataKeys,
|
|
31
|
-
xAxisKey = "name",
|
|
32
|
-
curve = "monotone",
|
|
33
|
-
strokeWidth = 2,
|
|
34
|
-
fillOpacity = 0.08,
|
|
35
|
-
showDots = false,
|
|
36
|
-
enableGridY = true,
|
|
37
|
-
enableGridX = false,
|
|
38
|
-
margin = { top: 20, right: 20, bottom: 50, left: 50 },
|
|
39
|
-
axisBottom,
|
|
40
|
-
axisLeft,
|
|
41
|
-
tooltipFormatter,
|
|
42
|
-
locale = "fa",
|
|
43
|
-
className,
|
|
44
|
-
isLoading = false,
|
|
45
|
-
ariaLabel,
|
|
46
|
-
chartProps
|
|
47
|
-
}, ref) {
|
|
48
|
-
const { chartColors, axisTickStyle, gridStyle, tooltipStyle, crosshairStyle } = chunk3AIJKXBV_cjs.useChartTheme();
|
|
49
|
-
const defaultXTick = React__namespace.useMemo(() => chunk3AIJKXBV_cjs.localeAwareCategoryTick(locale), [locale]);
|
|
50
|
-
const defaultYTick = React__namespace.useMemo(() => chunk3AIJKXBV_cjs.localeAwareNumberTick(locale), [locale]);
|
|
51
|
-
if (isLoading) {
|
|
52
|
-
return /* @__PURE__ */ jsxRuntime.jsx(chunk3AIJKXBV_cjs.ChartLoadingSkeleton, { className });
|
|
53
|
-
}
|
|
54
|
-
return /* @__PURE__ */ jsxRuntime.jsx(chunk3AIJKXBV_cjs.ChartContainer, { ref, className, dataSlot: "area-chart", ariaLabel, children: /* @__PURE__ */ jsxRuntime.jsx(recharts.ResponsiveContainer, { width: "100%", height: "100%", children: /* @__PURE__ */ jsxRuntime.jsxs(recharts.AreaChart, { data, margin, ...chartProps, children: [
|
|
55
|
-
/* @__PURE__ */ jsxRuntime.jsx("defs", { children: dataKeys.map((key, i) => /* @__PURE__ */ jsxRuntime.jsxs("linearGradient", { id: `area-gradient-${key}`, x1: "0", y1: "0", x2: "0", y2: "1", children: [
|
|
56
|
-
/* @__PURE__ */ jsxRuntime.jsx("stop", { offset: "0%", stopColor: chartColors[i % chartColors.length], stopOpacity: fillOpacity }),
|
|
57
|
-
/* @__PURE__ */ jsxRuntime.jsx("stop", { offset: "100%", stopColor: chartColors[i % chartColors.length], stopOpacity: 0 })
|
|
58
|
-
] }, key)) }),
|
|
59
|
-
(enableGridX || enableGridY) && /* @__PURE__ */ jsxRuntime.jsx(
|
|
60
|
-
recharts.CartesianGrid,
|
|
61
|
-
{
|
|
62
|
-
horizontal: enableGridY,
|
|
63
|
-
vertical: enableGridX,
|
|
64
|
-
stroke: gridStyle.stroke,
|
|
65
|
-
strokeDasharray: gridStyle.strokeDasharray,
|
|
66
|
-
strokeOpacity: gridStyle.strokeOpacity
|
|
67
|
-
}
|
|
68
|
-
),
|
|
69
|
-
axisBottom !== null && /* @__PURE__ */ jsxRuntime.jsx(
|
|
70
|
-
recharts.XAxis,
|
|
71
|
-
{
|
|
72
|
-
dataKey: xAxisKey,
|
|
73
|
-
tick: axisTickStyle,
|
|
74
|
-
tickLine: false,
|
|
75
|
-
axisLine: false,
|
|
76
|
-
tickMargin: 12,
|
|
77
|
-
tickFormatter: defaultXTick,
|
|
78
|
-
...axisBottom
|
|
79
|
-
}
|
|
80
|
-
),
|
|
81
|
-
axisLeft !== null && /* @__PURE__ */ jsxRuntime.jsx(
|
|
82
|
-
recharts.YAxis,
|
|
83
|
-
{
|
|
84
|
-
tick: axisTickStyle,
|
|
85
|
-
tickLine: false,
|
|
86
|
-
axisLine: false,
|
|
87
|
-
tickMargin: 12,
|
|
88
|
-
tickFormatter: defaultYTick,
|
|
89
|
-
...axisLeft
|
|
90
|
-
}
|
|
91
|
-
),
|
|
92
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
93
|
-
recharts.Tooltip,
|
|
94
|
-
{
|
|
95
|
-
cursor: crosshairStyle,
|
|
96
|
-
content: /* @__PURE__ */ jsxRuntime.jsx(chunk3AIJKXBV_cjs.ChartTooltip, { tooltipStyle, formatter: tooltipFormatter, locale })
|
|
97
|
-
}
|
|
98
|
-
),
|
|
99
|
-
dataKeys.map((key, i) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
100
|
-
recharts.Area,
|
|
101
|
-
{
|
|
102
|
-
type: curve,
|
|
103
|
-
dataKey: key,
|
|
104
|
-
stroke: chartColors[i % chartColors.length],
|
|
105
|
-
strokeWidth,
|
|
106
|
-
fill: `url(#area-gradient-${key})`,
|
|
107
|
-
dot: showDots,
|
|
108
|
-
activeDot: { r: 4, strokeWidth: 2 },
|
|
109
|
-
animationDuration: 800,
|
|
110
|
-
animationEasing: "ease-out"
|
|
111
|
-
},
|
|
112
|
-
key
|
|
113
|
-
))
|
|
114
|
-
] }) }) });
|
|
115
|
-
});
|
|
116
|
-
PartoAreaChart.displayName = "PartoAreaChart";
|
|
117
|
-
|
|
118
|
-
exports.PartoAreaChart = PartoAreaChart;
|
|
119
|
-
//# sourceMappingURL=chunk-7Y4V3R3Y.cjs.map
|
|
120
|
-
//# sourceMappingURL=chunk-7Y4V3R3Y.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/charts/PartoAreaChart.tsx"],"names":["React","PartoAreaChart","useChartTheme","localeAwareCategoryTick","localeAwareNumberTick","jsx","ChartLoadingSkeleton","ChartContainer","ResponsiveContainer","jsxs","AreaChart","CartesianGrid","XAxis","YAxis","Tooltip","ChartTooltip","Area"],"mappings":"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","file":"chunk-7Y4V3R3Y.cjs","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { AreaChart, Area, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer } from 'recharts'\n\nimport { useChartTheme } from '@/hooks/use-chart-theme'\nimport { type SupportedLocale } from '@/lib/utils'\nimport {\n ChartContainer,\n ChartLoadingSkeleton,\n ChartTooltip,\n localeAwareCategoryTick,\n localeAwareNumberTick,\n} from './chart-utils'\n\nexport interface PartoAreaChartProps {\n /** Row-oriented data: [{ name: \"فروردین\", series1: 50, series2: 30 }] */\n data: Array<Record<string, any>>\n /** Keys for each area series (e.g. ['فروش', 'سود']) */\n dataKeys: string[]\n /** Field name for X axis (default: 'name') */\n xAxisKey?: string\n /** Curve type */\n curve?: 'monotone' | 'linear' | 'natural' | 'step'\n /** Line width */\n strokeWidth?: number\n /** Area fill opacity */\n fillOpacity?: number\n /** Show dots on data points */\n showDots?: boolean\n /** Show horizontal grid lines */\n enableGridY?: boolean\n /** Show vertical grid lines */\n enableGridX?: boolean\n /** Chart margins */\n margin?: { top?: number; right?: number; bottom?: number; left?: number }\n /** Custom X axis config */\n axisBottom?: Record<string, any> | null\n /** Custom Y axis config */\n axisLeft?: Record<string, any> | null\n /** Custom tooltip formatter */\n tooltipFormatter?: (name: string, value: number) => React.ReactNode\n /**\n * Locale for digit formatting in tooltips and axis ticks. fa/ar render\n * Persian/Arabic digits with locale suffixes; en uses Latin K/M/B.\n * Default: 'fa'.\n */\n locale?: SupportedLocale\n className?: string\n isLoading?: boolean\n ariaLabel?: string\n /** Additional Recharts AreaChart props */\n chartProps?: Record<string, any>\n}\n\nexport const PartoAreaChart = React.forwardRef<HTMLDivElement, PartoAreaChartProps>(function PartoAreaChart(\n {\n data,\n dataKeys,\n xAxisKey = 'name',\n curve = 'monotone',\n strokeWidth = 2,\n fillOpacity = 0.08,\n showDots = false,\n enableGridY = true,\n enableGridX = false,\n margin = { top: 20, right: 20, bottom: 50, left: 50 },\n axisBottom,\n axisLeft,\n tooltipFormatter,\n locale = 'fa',\n className,\n isLoading = false,\n ariaLabel,\n chartProps,\n },\n ref\n) {\n const { chartColors, axisTickStyle, gridStyle, tooltipStyle, crosshairStyle } = useChartTheme()\n const defaultXTick = React.useMemo(() => localeAwareCategoryTick(locale), [locale])\n const defaultYTick = React.useMemo(() => localeAwareNumberTick(locale), [locale])\n\n if (isLoading) {\n return <ChartLoadingSkeleton className={className} />\n }\n\n return (\n <ChartContainer ref={ref} className={className} dataSlot=\"area-chart\" ariaLabel={ariaLabel}>\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <AreaChart data={data} margin={margin} {...chartProps}>\n <defs>\n {dataKeys.map((key, i) => (\n <linearGradient key={key} id={`area-gradient-${key}`} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor={chartColors[i % chartColors.length]} stopOpacity={fillOpacity} />\n <stop offset=\"100%\" stopColor={chartColors[i % chartColors.length]} stopOpacity={0} />\n </linearGradient>\n ))}\n </defs>\n\n {(enableGridX || enableGridY) && (\n <CartesianGrid\n horizontal={enableGridY}\n vertical={enableGridX}\n stroke={gridStyle.stroke}\n strokeDasharray={gridStyle.strokeDasharray}\n strokeOpacity={gridStyle.strokeOpacity}\n />\n )}\n\n {axisBottom !== null && (\n <XAxis\n dataKey={xAxisKey}\n tick={axisTickStyle}\n tickLine={false}\n axisLine={false}\n tickMargin={12}\n tickFormatter={defaultXTick}\n {...axisBottom}\n />\n )}\n\n {axisLeft !== null && (\n <YAxis\n tick={axisTickStyle}\n tickLine={false}\n axisLine={false}\n tickMargin={12}\n tickFormatter={defaultYTick}\n {...axisLeft}\n />\n )}\n\n <Tooltip\n cursor={crosshairStyle}\n content={<ChartTooltip tooltipStyle={tooltipStyle} formatter={tooltipFormatter} locale={locale} />}\n />\n\n {dataKeys.map((key, i) => (\n <Area\n key={key}\n type={curve}\n dataKey={key}\n stroke={chartColors[i % chartColors.length]}\n strokeWidth={strokeWidth}\n fill={`url(#area-gradient-${key})`}\n dot={showDots}\n activeDot={{ r: 4, strokeWidth: 2 }}\n animationDuration={800}\n animationEasing=\"ease-out\"\n />\n ))}\n </AreaChart>\n </ResponsiveContainer>\n </ChartContainer>\n )\n})\nPartoAreaChart.displayName = 'PartoAreaChart'\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/constants.ts"],"names":[],"mappings":";AAgBO,SAAS,cAAc,IAAA,EAAkC;AAC9D,EAAA,OAAO,IAAA;AACT;AAEO,IAAM,IAAA,GAAO;AAAA,EAClB,IAAA,EAAM;AAAA,IACJ,EAAA,EAAI,SAAA;AAAA,IACJ,EAAA,EAAI,mBAAA;AAAA,IACJ,EAAA,EAAI,SAAA;AAAA,IACJ,EAAA,EAAI,WAAA;AAAA,IACJ,EAAA,EAAI;AAAA,GACN;AAAA,EACA,OAAA,EAAS;AAAA,IACP,EAAA,EAAI,aAAA;AAAA,IACJ,EAAA,EAAI,WAAA;AAAA,IACJ,EAAA,EAAI,WAAA;AAAA,IACJ,EAAA,EAAI,WAAA;AAAA,IACJ,EAAA,EAAI;AAAA,GACN;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,EAAA,EAAI,UAAA;AAAA,IACJ,EAAA,EAAI,UAAA;AAAA,IACJ,EAAA,EAAI,UAAA;AAAA,IACJ,EAAA,EAAI,UAAA;AAAA,IACJ,EAAA,EAAI;AAAA;AAER,CAAA;AA2BO,IAAM,aAAA,GAAgB;AAAA,EAC3B,EAAA,EAAI,CAAA,EAAG,IAAA,CAAK,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,CAAO,IAAI,CAAC,CAAA,CAAA;AAAA,EACjE,EAAA,EAAI,CAAA,EAAG,IAAA,CAAK,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,CAAO,IAAI,CAAC,CAAA,CAAA;AAAA,EACjE,EAAA,EAAI,CAAA,EAAG,IAAA,CAAK,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,CAAO,IAAI,CAAC,CAAA,CAAA;AAAA,EACjE,EAAA,EAAI,CAAA,EAAG,IAAA,CAAK,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,CAAO,IAAI,CAAC,CAAA,CAAA;AAAA,EACjE,EAAA,EAAI,CAAA,EAAG,IAAA,CAAK,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,CAAO,IAAI,CAAC,CAAA;AACnE;AAWO,IAAM,qBAAA,GAAwB","file":"chunk-AXAY64KL.js","sourcesContent":["/**\n * Standard size scale used across the design system.\n * Components should accept these values for their `size` prop.\n */\nexport type StandardSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n\n/** @deprecated Use `StandardSize` instead — legacy names have been removed */\nexport type LegacySize = StandardSize\n\n/** @deprecated Use `StandardSize` instead */\nexport type SizeWithLegacy = StandardSize\n\n/**\n * Normalizes a size value to standard names.\n * @deprecated All sizes are standard now — this function is a no-op passthrough.\n */\nexport function normalizeSize(size: StandardSize): StandardSize {\n return size\n}\n\nexport const SIZE = {\n text: {\n xs: 'text-xs',\n sm: 'text-sm leading-4',\n md: 'text-sm',\n lg: 'text-base',\n xl: 'text-base',\n },\n padding: {\n xs: 'px-2.5 py-1',\n sm: 'px-3 py-2',\n md: 'px-4 py-2',\n lg: 'px-4 py-2',\n xl: 'px-6 py-3',\n },\n height: {\n xs: 'h-[26px]',\n sm: 'h-[34px]',\n md: 'h-[38px]',\n lg: 'h-[42px]',\n xl: 'h-[50px]',\n },\n}\n\n/** Inner sizes for nested elements (badges inside buttons, multi-select items, etc.) */\nexport const SIZE_INNER = {\n text: {\n xs: 'text-xs',\n sm: 'text-sm leading-4',\n md: 'text-sm',\n lg: 'text-base',\n xl: 'text-base',\n },\n padding: {\n xs: 'px-2.5 py-1',\n sm: 'px-3 py-2',\n md: 'px-4 py-2',\n lg: 'px-4 py-2',\n xl: 'px-6 py-3',\n },\n height: {\n xs: 'h-[24px]',\n sm: 'h-[28px]',\n md: 'h-[32px]',\n lg: 'h-[36px]',\n xl: 'h-[44px]',\n },\n}\n\nexport const SIZE_VARIANTS = {\n xs: `${SIZE.text['xs']} ${SIZE.padding['xs']} ${SIZE.height['xs']}`,\n sm: `${SIZE.text['sm']} ${SIZE.padding['sm']} ${SIZE.height['sm']}`,\n md: `${SIZE.text['md']} ${SIZE.padding['md']} ${SIZE.height['md']}`,\n lg: `${SIZE.text['lg']} ${SIZE.padding['lg']} ${SIZE.height['lg']}`,\n xl: `${SIZE.text['xl']} ${SIZE.padding['xl']} ${SIZE.height['xl']}`,\n}\n\nexport const SIZE_VARIANTS_INNER = {\n xs: `${SIZE.text['xs']} ${SIZE.padding['xs']} ${SIZE_INNER.height['xs']}`,\n sm: `${SIZE.text['sm']} ${SIZE.padding['sm']} ${SIZE_INNER.height['sm']}`,\n md: `${SIZE.text['md']} ${SIZE.padding['md']} ${SIZE_INNER.height['md']}`,\n lg: `${SIZE.text['lg']} ${SIZE.padding['lg']} ${SIZE_INNER.height['lg']}`,\n xl: `${SIZE.text['xl']} ${SIZE.padding['xl']} ${SIZE_INNER.height['xl']}`,\n}\n\n/** @deprecated Use 'sm' instead */\nexport const SIZE_VARIANTS_DEFAULT = 'sm'\n"]}
|
package/dist/chunk-D5XCQDFS.js
DELETED
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
import { useChartTheme, localeAwareCategoryTick, localeAwareNumberTick, ChartLoadingSkeleton, ChartContainer, ChartTooltip } from './chunk-IQHKJ4SS.js';
|
|
2
|
-
import * as React from 'react';
|
|
3
|
-
import { ResponsiveContainer, LineChart, CartesianGrid, XAxis, YAxis, Tooltip, Line } from 'recharts';
|
|
4
|
-
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
5
|
-
|
|
6
|
-
var PartoLineChart = React.forwardRef(function PartoLineChart2({
|
|
7
|
-
data,
|
|
8
|
-
dataKeys,
|
|
9
|
-
xAxisKey = "name",
|
|
10
|
-
curve = "monotone",
|
|
11
|
-
strokeWidth = 2.5,
|
|
12
|
-
showDots = false,
|
|
13
|
-
enableGridY = true,
|
|
14
|
-
enableGridX = false,
|
|
15
|
-
margin = { top: 20, right: 20, bottom: 50, left: 50 },
|
|
16
|
-
axisBottom,
|
|
17
|
-
axisLeft,
|
|
18
|
-
tooltipFormatter,
|
|
19
|
-
locale = "fa",
|
|
20
|
-
className,
|
|
21
|
-
isLoading = false,
|
|
22
|
-
ariaLabel,
|
|
23
|
-
chartProps
|
|
24
|
-
}, ref) {
|
|
25
|
-
const { chartColors, axisTickStyle, gridStyle, tooltipStyle, crosshairStyle } = useChartTheme();
|
|
26
|
-
const defaultXTick = React.useMemo(() => localeAwareCategoryTick(locale), [locale]);
|
|
27
|
-
const defaultYTick = React.useMemo(() => localeAwareNumberTick(locale), [locale]);
|
|
28
|
-
if (isLoading) {
|
|
29
|
-
return /* @__PURE__ */ jsx(ChartLoadingSkeleton, { className });
|
|
30
|
-
}
|
|
31
|
-
return /* @__PURE__ */ jsx(ChartContainer, { ref, className, dataSlot: "line-chart", ariaLabel, children: /* @__PURE__ */ jsx(ResponsiveContainer, { width: "100%", height: "100%", children: /* @__PURE__ */ jsxs(LineChart, { data, margin, ...chartProps, children: [
|
|
32
|
-
(enableGridX || enableGridY) && /* @__PURE__ */ jsx(
|
|
33
|
-
CartesianGrid,
|
|
34
|
-
{
|
|
35
|
-
horizontal: enableGridY,
|
|
36
|
-
vertical: enableGridX,
|
|
37
|
-
stroke: gridStyle.stroke,
|
|
38
|
-
strokeDasharray: gridStyle.strokeDasharray,
|
|
39
|
-
strokeOpacity: gridStyle.strokeOpacity
|
|
40
|
-
}
|
|
41
|
-
),
|
|
42
|
-
axisBottom !== null && /* @__PURE__ */ jsx(
|
|
43
|
-
XAxis,
|
|
44
|
-
{
|
|
45
|
-
dataKey: xAxisKey,
|
|
46
|
-
tick: axisTickStyle,
|
|
47
|
-
tickLine: false,
|
|
48
|
-
axisLine: false,
|
|
49
|
-
tickMargin: 12,
|
|
50
|
-
tickFormatter: defaultXTick,
|
|
51
|
-
...axisBottom
|
|
52
|
-
}
|
|
53
|
-
),
|
|
54
|
-
axisLeft !== null && /* @__PURE__ */ jsx(
|
|
55
|
-
YAxis,
|
|
56
|
-
{
|
|
57
|
-
tick: axisTickStyle,
|
|
58
|
-
tickLine: false,
|
|
59
|
-
axisLine: false,
|
|
60
|
-
tickMargin: 12,
|
|
61
|
-
tickFormatter: defaultYTick,
|
|
62
|
-
...axisLeft
|
|
63
|
-
}
|
|
64
|
-
),
|
|
65
|
-
/* @__PURE__ */ jsx(
|
|
66
|
-
Tooltip,
|
|
67
|
-
{
|
|
68
|
-
cursor: crosshairStyle,
|
|
69
|
-
content: /* @__PURE__ */ jsx(ChartTooltip, { tooltipStyle, formatter: tooltipFormatter, locale })
|
|
70
|
-
}
|
|
71
|
-
),
|
|
72
|
-
dataKeys.map((key, i) => /* @__PURE__ */ jsx(
|
|
73
|
-
Line,
|
|
74
|
-
{
|
|
75
|
-
type: curve,
|
|
76
|
-
dataKey: key,
|
|
77
|
-
stroke: chartColors[i % chartColors.length],
|
|
78
|
-
strokeWidth,
|
|
79
|
-
dot: showDots,
|
|
80
|
-
activeDot: { r: 4, strokeWidth: 2 },
|
|
81
|
-
animationDuration: 800,
|
|
82
|
-
animationEasing: "ease-out"
|
|
83
|
-
},
|
|
84
|
-
key
|
|
85
|
-
))
|
|
86
|
-
] }) }) });
|
|
87
|
-
});
|
|
88
|
-
PartoLineChart.displayName = "PartoLineChart";
|
|
89
|
-
|
|
90
|
-
export { PartoLineChart };
|
|
91
|
-
//# sourceMappingURL=chunk-D5XCQDFS.js.map
|
|
92
|
-
//# sourceMappingURL=chunk-D5XCQDFS.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/charts/PartoLineChart.tsx"],"names":["PartoLineChart"],"mappings":";;;;;AAqDO,IAAM,cAAA,GAAuB,KAAA,CAAA,UAAA,CAAgD,SAASA,eAAAA,CAC3F;AAAA,EACE,IAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA,GAAW,MAAA;AAAA,EACX,KAAA,GAAQ,UAAA;AAAA,EACR,WAAA,GAAc,GAAA;AAAA,EACd,QAAA,GAAW,KAAA;AAAA,EACX,WAAA,GAAc,IAAA;AAAA,EACd,WAAA,GAAc,KAAA;AAAA,EACd,MAAA,GAAS,EAAE,GAAA,EAAK,EAAA,EAAI,OAAO,EAAA,EAAI,MAAA,EAAQ,EAAA,EAAI,IAAA,EAAM,EAAA,EAAG;AAAA,EACpD,UAAA;AAAA,EACA,QAAA;AAAA,EACA,gBAAA;AAAA,EACA,MAAA,GAAS,IAAA;AAAA,EACT,SAAA;AAAA,EACA,SAAA,GAAY,KAAA;AAAA,EACZ,SAAA;AAAA,EACA;AACF,CAAA,EACA,GAAA,EACA;AACA,EAAA,MAAM,EAAE,WAAA,EAAa,aAAA,EAAe,WAAW,YAAA,EAAc,cAAA,KAAmB,aAAA,EAAc;AAC9F,EAAA,MAAM,YAAA,GAAqB,cAAQ,MAAM,uBAAA,CAAwB,MAAM,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAClF,EAAA,MAAM,YAAA,GAAqB,cAAQ,MAAM,qBAAA,CAAsB,MAAM,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEhF,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,uBAAO,GAAA,CAAC,wBAAqB,SAAA,EAAsB,CAAA;AAAA,EACrD;AAEA,EAAA,2BACG,cAAA,EAAA,EAAe,GAAA,EAAU,WAAsB,QAAA,EAAS,YAAA,EAAa,WACpE,QAAA,kBAAA,GAAA,CAAC,mBAAA,EAAA,EAAoB,KAAA,EAAM,MAAA,EAAO,QAAO,MAAA,EACvC,QAAA,kBAAA,IAAA,CAAC,aAAU,IAAA,EAAY,MAAA,EAAiB,GAAG,UAAA,EACvC,QAAA,EAAA;AAAA,IAAA,CAAA,WAAA,IAAe,WAAA,qBACf,GAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QACC,UAAA,EAAY,WAAA;AAAA,QACZ,QAAA,EAAU,WAAA;AAAA,QACV,QAAQ,SAAA,CAAU,MAAA;AAAA,QAClB,iBAAiB,SAAA,CAAU,eAAA;AAAA,QAC3B,eAAe,SAAA,CAAU;AAAA;AAAA,KAC3B;AAAA,IAGD,eAAe,IAAA,oBACd,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,QAAA;AAAA,QACT,IAAA,EAAM,aAAA;AAAA,QACN,QAAA,EAAU,KAAA;AAAA,QACV,QAAA,EAAU,KAAA;AAAA,QACV,UAAA,EAAY,EAAA;AAAA,QACZ,aAAA,EAAe,YAAA;AAAA,QACd,GAAG;AAAA;AAAA,KACN;AAAA,IAGD,aAAa,IAAA,oBACZ,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAM,aAAA;AAAA,QACN,QAAA,EAAU,KAAA;AAAA,QACV,QAAA,EAAU,KAAA;AAAA,QACV,UAAA,EAAY,EAAA;AAAA,QACZ,aAAA,EAAe,YAAA;AAAA,QACd,GAAG;AAAA;AAAA,KACN;AAAA,oBAGF,GAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAQ,cAAA;AAAA,QACR,yBAAS,GAAA,CAAC,YAAA,EAAA,EAAa,YAAA,EAA4B,SAAA,EAAW,kBAAkB,MAAA,EAAgB;AAAA;AAAA,KAClG;AAAA,IAEC,QAAA,CAAS,GAAA,CAAI,CAAC,GAAA,EAAK,CAAA,qBAClB,GAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QAEC,IAAA,EAAM,KAAA;AAAA,QACN,OAAA,EAAS,GAAA;AAAA,QACT,MAAA,EAAQ,WAAA,CAAY,CAAA,GAAI,WAAA,CAAY,MAAM,CAAA;AAAA,QAC1C,WAAA;AAAA,QACA,GAAA,EAAK,QAAA;AAAA,QACL,SAAA,EAAW,EAAE,CAAA,EAAG,CAAA,EAAG,aAAa,CAAA,EAAE;AAAA,QAClC,iBAAA,EAAmB,GAAA;AAAA,QACnB,eAAA,EAAgB;AAAA,OAAA;AAAA,MARX;AAAA,KAUR;AAAA,GAAA,EACH,GACF,CAAA,EACF,CAAA;AAEJ,CAAC;AACD,cAAA,CAAe,WAAA,GAAc,gBAAA","file":"chunk-D5XCQDFS.js","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer } from 'recharts'\n\nimport { useChartTheme } from '@/hooks/use-chart-theme'\nimport { type SupportedLocale } from '@/lib/utils'\nimport {\n ChartContainer,\n ChartLoadingSkeleton,\n ChartTooltip,\n localeAwareCategoryTick,\n localeAwareNumberTick,\n} from './chart-utils'\n\nexport interface PartoLineChartProps {\n /** Row-oriented data: [{ name: \"فروردین\", series1: 50, series2: 30 }] */\n data: Array<Record<string, any>>\n /** Keys for each line series (e.g. ['فروش', 'سود']) */\n dataKeys: string[]\n /** Field name for X axis (default: 'name') */\n xAxisKey?: string\n /** Curve type */\n curve?: 'monotone' | 'linear' | 'natural' | 'step'\n /** Line width */\n strokeWidth?: number\n /** Show dots on data points */\n showDots?: boolean\n /** Show horizontal grid lines */\n enableGridY?: boolean\n /** Show vertical grid lines */\n enableGridX?: boolean\n /** Chart margins */\n margin?: { top?: number; right?: number; bottom?: number; left?: number }\n /** Custom X axis config */\n axisBottom?: Record<string, any> | null\n /** Custom Y axis config */\n axisLeft?: Record<string, any> | null\n /** Custom tooltip formatter */\n tooltipFormatter?: (name: string, value: number) => React.ReactNode\n /**\n * Locale for digit formatting in tooltips and axis ticks. fa/ar render\n * Persian/Arabic digits with locale suffixes; en uses Latin K/M/B.\n * Default: 'fa'.\n */\n locale?: SupportedLocale\n className?: string\n isLoading?: boolean\n ariaLabel?: string\n /** Additional Recharts LineChart props */\n chartProps?: Record<string, any>\n}\n\nexport const PartoLineChart = React.forwardRef<HTMLDivElement, PartoLineChartProps>(function PartoLineChart(\n {\n data,\n dataKeys,\n xAxisKey = 'name',\n curve = 'monotone',\n strokeWidth = 2.5,\n showDots = false,\n enableGridY = true,\n enableGridX = false,\n margin = { top: 20, right: 20, bottom: 50, left: 50 },\n axisBottom,\n axisLeft,\n tooltipFormatter,\n locale = 'fa',\n className,\n isLoading = false,\n ariaLabel,\n chartProps,\n },\n ref\n) {\n const { chartColors, axisTickStyle, gridStyle, tooltipStyle, crosshairStyle } = useChartTheme()\n const defaultXTick = React.useMemo(() => localeAwareCategoryTick(locale), [locale])\n const defaultYTick = React.useMemo(() => localeAwareNumberTick(locale), [locale])\n\n if (isLoading) {\n return <ChartLoadingSkeleton className={className} />\n }\n\n return (\n <ChartContainer ref={ref} className={className} dataSlot=\"line-chart\" ariaLabel={ariaLabel}>\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <LineChart data={data} margin={margin} {...chartProps}>\n {(enableGridX || enableGridY) && (\n <CartesianGrid\n horizontal={enableGridY}\n vertical={enableGridX}\n stroke={gridStyle.stroke}\n strokeDasharray={gridStyle.strokeDasharray}\n strokeOpacity={gridStyle.strokeOpacity}\n />\n )}\n\n {axisBottom !== null && (\n <XAxis\n dataKey={xAxisKey}\n tick={axisTickStyle}\n tickLine={false}\n axisLine={false}\n tickMargin={12}\n tickFormatter={defaultXTick}\n {...axisBottom}\n />\n )}\n\n {axisLeft !== null && (\n <YAxis\n tick={axisTickStyle}\n tickLine={false}\n axisLine={false}\n tickMargin={12}\n tickFormatter={defaultYTick}\n {...axisLeft}\n />\n )}\n\n <Tooltip\n cursor={crosshairStyle}\n content={<ChartTooltip tooltipStyle={tooltipStyle} formatter={tooltipFormatter} locale={locale} />}\n />\n\n {dataKeys.map((key, i) => (\n <Line\n key={key}\n type={curve}\n dataKey={key}\n stroke={chartColors[i % chartColors.length]}\n strokeWidth={strokeWidth}\n dot={showDots}\n activeDot={{ r: 4, strokeWidth: 2 }}\n animationDuration={800}\n animationEasing=\"ease-out\"\n />\n ))}\n </LineChart>\n </ResponsiveContainer>\n </ChartContainer>\n )\n})\nPartoLineChart.displayName = 'PartoLineChart'\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/ui/input.tsx"],"names":[],"mappings":";;;;;;AAOO,IAAM,aAAA,GAAgB,GAAA;AAAA,EAC3B,EAAA;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,GAAG;AAAA;AACL,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,IAAA,EAAM;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,GAAc,KAAA,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,uBACE,GAAA;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,WAAW,EAAA,CAAG,aAAA,CAAc,EAAE,IAAA,EAAM,GAAG,SAAS;AAAA;AAAA,GAClD;AAEJ,CAAC;AAED,KAAA,CAAM,WAAA,GAAc,OAAA","file":"chunk-GDHRYKVM.js","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"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/ui/badge.tsx"],"names":["cva","React","cn","jsx"],"mappings":"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","file":"chunk-HEYMLQOV.cjs","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\n\nimport { cn } from '@/lib/utils'\n\nconst badgeVariants = cva(\n 'inline-flex items-center rounded-full font-normal whitespace-nowrap transition-colors duration-150',\n {\n variants: {\n variant: {\n default: 'bg-surface-75 text-foreground-light border border-strong',\n secondary:\n 'bg-[hsl(var(--secondary-default)/0.1)] border border-[hsl(var(--secondary-default)/0.4)] text-[hsl(var(--secondary-default))]',\n success: 'bg-brand bg-opacity-10 text-brand-600 border border-brand-500',\n warning: 'bg-warning bg-opacity-10 text-warning border border-warning-500',\n destructive: 'bg-destructive bg-opacity-10 text-destructive-600 border border-destructive-500',\n brand: 'bg-brand bg-opacity-10 text-brand-600 border border-brand-500',\n outline: 'bg-transparent text-foreground border border-foreground-muted',\n },\n size: {\n xs: 'px-1.5 py-[3px] text-2xs leading-none tracking-wide uppercase',\n sm: 'px-2 py-0.5 text-xs',\n md: 'px-2 py-0.5 text-xs',\n lg: 'px-3 py-0.5 text-sm',\n /** @deprecated Use xs */ tiny: 'px-1.5 py-[3px] text-2xs leading-none tracking-wide uppercase',\n /** @deprecated Use sm */ small: 'px-2 py-0.5 text-xs',\n /** @deprecated Use lg */ large: 'px-3 py-0.5 text-sm',\n },\n dot: {\n true: '',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'sm',\n },\n }\n)\n\nconst dotVariants = cva('size-2 rounded-full', {\n variants: {\n position: {\n start: '-ms-0.5 me-1.5',\n end: 'ms-1.5 -me-0.5',\n },\n },\n defaultVariants: {\n position: 'start',\n },\n})\n\nexport interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement>, VariantProps<typeof badgeVariants> {\n dot?: boolean\n dotPosition?: 'start' | 'end'\n}\n\nconst Badge = React.forwardRef<HTMLSpanElement, BadgeProps>(\n ({ className, variant, size, dot, dotPosition = 'end', children, ...props }, ref) => {\n if (process.env.NODE_ENV !== 'production') {\n const deprecatedSizes = ['tiny', 'small', 'large']\n if (size && deprecatedSizes.includes(size as string)) {\n console.warn(`[Parto UI] Badge: size=\"${size}\" is deprecated. Use xs|sm|md|lg instead.`)\n }\n }\n\n return (\n <span ref={ref} data-slot=\"badge\" className={cn(badgeVariants({ variant, size }), className)} {...props}>\n {dot && dotPosition === 'start' && (\n <svg className={cn(dotVariants({ position: 'start' }))} fill=\"currentColor\" viewBox=\"0 0 8 8\">\n <circle cx=\"4\" cy=\"4\" r=\"3\" />\n </svg>\n )}\n {children}\n {dot && dotPosition === 'end' && (\n <svg className={cn(dotVariants({ position: 'end' }))} fill=\"currentColor\" viewBox=\"0 0 8 8\">\n <circle cx=\"4\" cy=\"4\" r=\"3\" />\n </svg>\n )}\n </span>\n )\n }\n)\n\nBadge.displayName = 'Badge'\n\nexport { Badge, badgeVariants }\n"]}
|