@parto-system-design/ui 1.1.7 → 1.1.9

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.
Files changed (122) hide show
  1. package/dist/{chunk-HEYMLQOV.cjs → chunk-2ACKKPWA.cjs} +22 -4
  2. package/dist/chunk-2ACKKPWA.cjs.map +1 -0
  3. package/dist/{chunk-RA5KZNG5.js → chunk-3QYYPPFJ.js} +8 -8
  4. package/dist/chunk-3QYYPPFJ.js.map +1 -0
  5. package/dist/{chunk-OEVMKFFL.cjs → chunk-4WONHORR.cjs} +47 -35
  6. package/dist/chunk-4WONHORR.cjs.map +1 -0
  7. package/dist/{chunk-NEML6RCV.js → chunk-5HCXH6GS.js} +6 -2
  8. package/dist/chunk-5HCXH6GS.js.map +1 -0
  9. package/dist/{chunk-53QY4PD3.js → chunk-GCZ6YATL.js} +38 -6
  10. package/dist/chunk-GCZ6YATL.js.map +1 -0
  11. package/dist/{chunk-GDHRYKVM.js → chunk-GPYJ66CG.js} +4 -4
  12. package/dist/chunk-GPYJ66CG.js.map +1 -0
  13. package/dist/{chunk-SCGW2BH4.cjs → chunk-HS3XI3CC.cjs} +5 -5
  14. package/dist/chunk-HS3XI3CC.cjs.map +1 -0
  15. package/dist/chunk-JCJLN437.js +108 -0
  16. package/dist/chunk-JCJLN437.js.map +1 -0
  17. package/dist/{chunk-MQGQVI3W.cjs → chunk-JMKNNH63.cjs} +39 -7
  18. package/dist/chunk-JMKNNH63.cjs.map +1 -0
  19. package/dist/{chunk-34JUCX2G.cjs → chunk-K6G63EED.cjs} +2 -4
  20. package/dist/chunk-K6G63EED.cjs.map +1 -0
  21. package/dist/{chunk-3AIJKXBV.cjs → chunk-KYM7NIJO.cjs} +200 -9
  22. package/dist/chunk-KYM7NIJO.cjs.map +1 -0
  23. package/dist/{chunk-ZZFNJR2E.js → chunk-MEKWH3GS.js} +22 -4
  24. package/dist/chunk-MEKWH3GS.js.map +1 -0
  25. package/dist/{chunk-YE477L2H.cjs → chunk-MMC6M35Q.cjs} +10 -10
  26. package/dist/chunk-MMC6M35Q.cjs.map +1 -0
  27. package/dist/{chunk-LZMCMZZF.js → chunk-NMH43BDC.js} +44 -32
  28. package/dist/chunk-NMH43BDC.js.map +1 -0
  29. package/dist/chunk-NORDUD2T.cjs +135 -0
  30. package/dist/chunk-NORDUD2T.cjs.map +1 -0
  31. package/dist/{chunk-SCX6AR53.cjs → chunk-OQB6HIUL.cjs} +5 -5
  32. package/dist/{chunk-SCX6AR53.cjs.map → chunk-OQB6HIUL.cjs.map} +1 -1
  33. package/dist/{chunk-IQHKJ4SS.js → chunk-PYURPUTV.js} +195 -6
  34. package/dist/chunk-PYURPUTV.js.map +1 -0
  35. package/dist/{chunk-AXAY64KL.js → chunk-S3T2L6NA.js} +3 -4
  36. package/dist/chunk-S3T2L6NA.js.map +1 -0
  37. package/dist/{chunk-MBCTRNTG.js → chunk-SXWSOU3Y.js} +3 -3
  38. package/dist/{chunk-MBCTRNTG.js.map → chunk-SXWSOU3Y.js.map} +1 -1
  39. package/dist/chunk-TWJXOV4C.js +145 -0
  40. package/dist/chunk-TWJXOV4C.js.map +1 -0
  41. package/dist/{chunk-P5XHPNJG.cjs → chunk-U3ADRIVO.cjs} +6 -2
  42. package/dist/chunk-U3ADRIVO.cjs.map +1 -0
  43. package/dist/chunk-UOZN45G4.cjs +130 -0
  44. package/dist/chunk-UOZN45G4.cjs.map +1 -0
  45. package/dist/chunk-VHLDOG74.cjs +167 -0
  46. package/dist/chunk-VHLDOG74.cjs.map +1 -0
  47. package/dist/{chunk-VO3B75F6.cjs → chunk-YENXXYUV.cjs} +4 -4
  48. package/dist/{chunk-VO3B75F6.cjs.map → chunk-YENXXYUV.cjs.map} +1 -1
  49. package/dist/chunk-YFQWC2PW.js +113 -0
  50. package/dist/chunk-YFQWC2PW.js.map +1 -0
  51. package/dist/{chunk-YAJWTNOX.js → chunk-ZBZDR4ZC.js} +3 -3
  52. package/dist/{chunk-YAJWTNOX.js.map → chunk-ZBZDR4ZC.js.map} +1 -1
  53. package/dist/components/charts/PartoAreaChart.cjs +3 -3
  54. package/dist/components/charts/PartoAreaChart.d.cts +2 -0
  55. package/dist/components/charts/PartoAreaChart.d.ts +2 -0
  56. package/dist/components/charts/PartoAreaChart.js +2 -2
  57. package/dist/components/charts/PartoBarChart.cjs +3 -3
  58. package/dist/components/charts/PartoBarChart.d.cts +6 -0
  59. package/dist/components/charts/PartoBarChart.d.ts +6 -0
  60. package/dist/components/charts/PartoBarChart.js +2 -2
  61. package/dist/components/charts/PartoLineChart.cjs +3 -3
  62. package/dist/components/charts/PartoLineChart.d.cts +8 -0
  63. package/dist/components/charts/PartoLineChart.d.ts +8 -0
  64. package/dist/components/charts/PartoLineChart.js +2 -2
  65. package/dist/components/charts/PartoPieChart.cjs +3 -3
  66. package/dist/components/charts/PartoPieChart.d.cts +8 -0
  67. package/dist/components/charts/PartoPieChart.d.ts +8 -0
  68. package/dist/components/charts/PartoPieChart.js +2 -2
  69. package/dist/components/ui/badge.cjs +3 -3
  70. package/dist/components/ui/badge.js +1 -1
  71. package/dist/components/ui/button.cjs +4 -4
  72. package/dist/components/ui/button.js +2 -2
  73. package/dist/components/ui/calendar.cjs +4 -4
  74. package/dist/components/ui/calendar.js +3 -3
  75. package/dist/components/ui/data-table.cjs +4 -4
  76. package/dist/components/ui/data-table.js +3 -3
  77. package/dist/components/ui/input.cjs +5 -5
  78. package/dist/components/ui/input.js +2 -2
  79. package/dist/components/ui/page-card.cjs +2 -2
  80. package/dist/components/ui/page-card.d.cts +1 -1
  81. package/dist/components/ui/page-card.d.ts +1 -1
  82. package/dist/components/ui/page-card.js +1 -1
  83. package/dist/components/ui/saved-query-card.cjs +4 -4
  84. package/dist/components/ui/saved-query-card.js +3 -3
  85. package/dist/index.cjs +5349 -3558
  86. package/dist/index.cjs.map +1 -1
  87. package/dist/index.css +357 -92
  88. package/dist/index.d.cts +956 -197
  89. package/dist/index.d.ts +956 -197
  90. package/dist/index.js +5165 -3409
  91. package/dist/index.js.map +1 -1
  92. package/dist/{page-card-DOl50DqJ.d.cts → page-card-CmShVqG-.d.cts} +1 -1
  93. package/dist/{page-card-CO92oXkc.d.ts → page-card-HBn-cy4J.d.ts} +1 -1
  94. package/package.json +1 -1
  95. package/dist/chunk-34JUCX2G.cjs.map +0 -1
  96. package/dist/chunk-3AIJKXBV.cjs.map +0 -1
  97. package/dist/chunk-53QY4PD3.js.map +0 -1
  98. package/dist/chunk-7Y4V3R3Y.cjs +0 -120
  99. package/dist/chunk-7Y4V3R3Y.cjs.map +0 -1
  100. package/dist/chunk-AXAY64KL.js.map +0 -1
  101. package/dist/chunk-D5XCQDFS.js +0 -92
  102. package/dist/chunk-D5XCQDFS.js.map +0 -1
  103. package/dist/chunk-GDHRYKVM.js.map +0 -1
  104. package/dist/chunk-HEYMLQOV.cjs.map +0 -1
  105. package/dist/chunk-IQHKJ4SS.js.map +0 -1
  106. package/dist/chunk-LLJR7FV3.js +0 -135
  107. package/dist/chunk-LLJR7FV3.js.map +0 -1
  108. package/dist/chunk-LZMCMZZF.js.map +0 -1
  109. package/dist/chunk-MKYVQQBV.cjs +0 -114
  110. package/dist/chunk-MKYVQQBV.cjs.map +0 -1
  111. package/dist/chunk-MQGQVI3W.cjs.map +0 -1
  112. package/dist/chunk-NEFZJHE4.cjs +0 -157
  113. package/dist/chunk-NEFZJHE4.cjs.map +0 -1
  114. package/dist/chunk-NEML6RCV.js.map +0 -1
  115. package/dist/chunk-OEVMKFFL.cjs.map +0 -1
  116. package/dist/chunk-P5XHPNJG.cjs.map +0 -1
  117. package/dist/chunk-QJ7UB2ZQ.js +0 -98
  118. package/dist/chunk-QJ7UB2ZQ.js.map +0 -1
  119. package/dist/chunk-RA5KZNG5.js.map +0 -1
  120. package/dist/chunk-SCGW2BH4.cjs.map +0 -1
  121. package/dist/chunk-YE477L2H.cjs.map +0 -1
  122. package/dist/chunk-ZZFNJR2E.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/ui/social-platform-badge.tsx","../src/components/ui/bot-detection-meter.tsx","../src/components/ui/page-card.tsx"],"names":["jsx","cva","React","jsxs","cn","React2","convertToLocalNumbers","React3","StatusBadge","Sparkline"],"mappings":"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","file":"chunk-U3ADRIVO.cjs","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { cva } from 'class-variance-authority'\nimport { cn } from '@/lib/utils'\n\nexport type SocialPlatform =\n | 'instagram'\n | 'twitter'\n | 'tiktok'\n | 'youtube'\n | 'linkedin'\n | 'telegram'\n | 'threads'\n | 'facebook'\n\nexport interface SocialPlatformBadgeProps extends React.HTMLAttributes<HTMLSpanElement> {\n /** The social media platform to display */\n platform: SocialPlatform\n /** Size of the badge */\n size?: 'xs' | 'sm' | 'md' | 'lg'\n /** Show the platform name label */\n showLabel?: boolean\n /** Visual style of the badge */\n variant?: 'flat' | 'badge'\n}\n\nconst PLATFORM_META: Record<\n SocialPlatform,\n { label: string; icon: React.FC<{ className?: string; style?: React.CSSProperties }> }\n> = {\n instagram: {\n label: 'Instagram',\n icon: ({ className }) => (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.266-.057 1.645-.069 4.849-.069zm0-2.163c-3.259 0-3.667.014-4.947.072-4.358.2-6.78 2.618-6.98 6.98-.059 1.281-.073 1.689-.073 4.948 0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98 1.281.058 1.689.072 4.948.072 3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98-1.281-.059-1.69-.073-4.949-.073zm0 5.838c-3.403 0-6.162 2.759-6.162 6.162s2.759 6.163 6.162 6.163 6.162-2.759 6.162-6.163c0-3.403-2.759-6.162-6.162-6.162zm0 10.162c-2.209 0-4-1.79-4-4 0-2.209 1.791-4 4-4s4 1.791 4 4c0 2.21-1.791 4-4 4zm6.406-11.845c-.796 0-1.441.645-1.441 1.44s.645 1.44 1.441 1.44c.795 0 1.439-.645 1.439-1.44s-.644-1.44-1.439-1.44z\" />\n </svg>\n ),\n },\n twitter: {\n label: 'X',\n icon: ({ className }) => (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-4.714-6.231-5.401 6.231H2.744l7.737-8.835L1.254 2.25H8.08l4.259 5.63 5.905-5.63zm-1.161 17.52h1.833L7.084 4.126H5.117z\" />\n </svg>\n ),\n },\n tiktok: {\n label: 'TikTok',\n icon: ({ className }) => (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M19.59 6.69a4.83 4.83 0 01-3.77-4.25V2h-3.45v13.67a2.89 2.89 0 01-2.88 2.5 2.89 2.89 0 01-2.89-2.89 2.89 2.89 0 012.89-2.89c.28 0 .54.04.79.1V9.01a6.33 6.33 0 00-.79-.05 6.34 6.34 0 00-6.34 6.34 6.34 6.34 0 006.34 6.34 6.34 6.34 0 006.33-6.34V8.69a8.16 8.16 0 004.77 1.52V6.75a4.85 4.85 0 01-1-.06z\" />\n </svg>\n ),\n },\n youtube: {\n label: 'YouTube',\n icon: ({ className }) => (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M23.498 6.186a3.016 3.016 0 00-2.122-2.136C19.505 3.545 12 3.545 12 3.545s-7.505 0-9.377.505A3.017 3.017 0 00.502 6.186C0 8.07 0 12 0 12s0 3.93.502 5.814a3.016 3.016 0 002.122 2.136c1.871.505 9.376.505 9.376.505s7.505 0 9.377-.505a3.015 3.015 0 002.122-2.136C24 15.93 24 12 24 12s0-3.93-.502-5.814zM9.545 15.568V8.432L15.818 12l-6.273 3.568z\" />\n </svg>\n ),\n },\n linkedin: {\n label: 'LinkedIn',\n icon: ({ className }) => (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 01-2.063-2.065 2.064 2.064 0 112.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z\" />\n </svg>\n ),\n },\n telegram: {\n label: 'Telegram',\n icon: ({ className }) => (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M11.944 0A12 12 0 000 12a12 12 0 0012 12 12 12 0 0012-12A12 12 0 0012 0a12 12 0 00-.056 0zm4.962 7.224c.1-.002.321.023.465.14a.506.506 0 01.171.325c.016.093.036.306.02.472-.18 1.898-.962 6.502-1.36 8.627-.168.9-.499 1.201-.82 1.23-.696.065-1.225-.46-1.9-.902-1.056-.693-1.653-1.124-2.678-1.8-1.185-.78-.417-1.21.258-1.91.177-.184 3.247-2.977 3.307-3.23.007-.032.014-.15-.056-.212s-.174-.041-.249-.024c-.106.024-1.793 1.14-5.061 3.345-.48.33-.913.49-1.302.48-.428-.008-1.252-.241-1.865-.44-.752-.245-1.349-.374-1.297-.789.027-.216.325-.437.893-.663 3.498-1.524 5.83-2.529 6.998-3.014 3.332-1.386 4.025-1.627 4.476-1.635z\" />\n </svg>\n ),\n },\n threads: {\n label: 'Threads',\n icon: ({ className }) => (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M12.186 24h-.007c-3.581-.024-6.334-1.205-8.184-3.509C2.35 18.44 1.5 15.586 1.472 12.01v-.017c.03-3.579.879-6.43 2.525-8.482C5.868 1.205 8.617.024 12.18 0h.014c2.746.02 5.043.725 6.826 2.098 1.677 1.29 2.858 3.13 3.509 5.467l-2.04.569c-1.104-3.96-3.898-5.984-8.304-6.015-2.91.022-5.11.936-6.54 2.717C4.307 6.504 3.616 8.914 3.589 12c.027 3.086.718 5.496 2.057 7.164 1.43 1.783 3.631 2.698 6.54 2.717 2.623-.02 4.358-.631 5.8-2.045 1.647-1.613 1.618-3.593 1.09-4.798-.31-.71-.873-1.3-1.634-1.75-.192 1.352-.622 2.446-1.284 3.272-.886 1.102-2.14 1.704-3.73 1.79-1.202.065-2.361-.218-3.259-.801-1.063-.689-1.685-1.749-1.752-2.98-.065-1.19.388-2.285 1.277-3.086.84-.754 2.02-1.164 3.43-1.19.954-.018 1.858.09 2.695.322-.082-.858-.372-1.502-.861-1.903-.529-.434-1.32-.658-2.332-.67-.884.01-1.63.23-2.22.65l-1.11-1.75c.97-.625 2.18-.95 3.6-.97h.022c1.63.02 2.976.497 3.898 1.385.955.92 1.444 2.25 1.51 3.95.23.073.46.149.682.232 1.69.64 2.847 1.635 3.406 2.946.859 2.002.86 5.139-1.773 7.674-1.797 1.742-3.993 2.525-6.935 2.545zm.098-10.02c-.745.01-1.377.186-1.882.523-.443.298-.706.733-.67 1.215.03.564.342 1.017.876 1.275.516.25 1.087.299 1.58.127.684-.24 1.34-.93 1.614-2.366a9.68 9.68 0 00-1.518-.774z\" />\n </svg>\n ),\n },\n facebook: {\n label: 'Facebook',\n icon: ({ className }) => (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M24 12.073c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.99 4.388 10.954 10.125 11.854v-8.385H7.078v-3.47h3.047V9.43c0-3.007 1.792-4.669 4.533-4.669 1.312 0 2.686.235 2.686.235v2.953H15.83c-1.491 0-1.956.925-1.956 1.875v2.25h3.328l-.532 3.47h-2.796v8.385C19.612 23.027 24 18.062 24 12.073z\" />\n </svg>\n ),\n },\n}\n\nconst socialPlatformBadgeVariants = cva('inline-flex items-center font-medium transition-colors duration-150', {\n variants: {\n size: {\n xs: 'gap-1',\n sm: 'gap-1.5',\n md: 'gap-1.5',\n lg: 'gap-2',\n },\n variant: {\n flat: '',\n badge: 'border border-border bg-surface-100',\n },\n },\n compoundVariants: [\n { variant: 'badge', size: 'xs', className: 'px-1.5 py-0.5 rounded' },\n { variant: 'badge', size: 'sm', className: 'px-2 py-1 rounded' },\n { variant: 'badge', size: 'md', className: 'px-2.5 py-1 rounded-md' },\n { variant: 'badge', size: 'lg', className: 'px-3 py-1.5 rounded-md' },\n ],\n defaultVariants: { size: 'sm', variant: 'flat' },\n})\n\n/** Size-specific classes for child elements (icon, text) */\nconst SIZE_CHILD_CLASSES = {\n xs: { icon: 'size-3', text: 'text-xs' },\n sm: { icon: 'size-4', text: 'text-xs' },\n md: { icon: 'size-5', text: 'text-sm' },\n lg: { icon: 'size-6', text: 'text-base' },\n}\n\nconst SocialPlatformBadge = React.forwardRef<HTMLSpanElement, SocialPlatformBadgeProps>(\n ({ className, platform, size = 'sm', showLabel = false, variant = 'flat', style, ...props }, ref) => {\n const meta = PLATFORM_META[platform]\n const Icon = meta.icon\n const sizeClasses = SIZE_CHILD_CLASSES[size]\n\n return (\n <span\n ref={ref}\n data-slot=\"social-platform-badge\"\n className={cn(socialPlatformBadgeVariants({ size, variant }), className)}\n style={style}\n {...props}\n >\n <Icon className={cn(sizeClasses.icon, 'shrink-0')} style={{ color: `var(--social-platform-${platform})` }} />\n {showLabel && <span className={cn(sizeClasses.text, 'text-foreground-light')}>{meta.label}</span>}\n </span>\n )\n }\n)\n\nSocialPlatformBadge.displayName = 'SocialPlatformBadge'\n\nexport { SocialPlatformBadge, socialPlatformBadgeVariants }\n","'use client'\n\nimport * as React from 'react'\nimport { cn, convertToLocalNumbers, type SupportedLocale } from '@/lib/utils'\n\nexport type BotDetectionKey = 'real' | 'suspicious' | 'bot'\n\nexport interface BotDetectionData {\n /** Confirmed real / human accounts */\n real: number\n /** Suspicious — insufficient signal, possibly bot */\n suspicious: number\n /** Confirmed bot / automated */\n bot: number\n}\n\nexport interface BotDetectionMeterProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Counts — auto-normalised to percentages that sum to exactly 100 */\n data: BotDetectionData\n /** Display mode @default \"stacked\" */\n variant?: 'stacked' | 'bars' | 'compact'\n /** Show numeric count labels */\n showCounts?: boolean\n /** Show percentage labels @default true */\n showPercent?: boolean\n /** Show the top \"Real-account rate\" summary line (stacked variant only) @default true */\n showSummary?: boolean\n /** Size of the stacked bar or individual bars */\n size?: 'sm' | 'md' | 'lg'\n /** Locale for digits + default labels @default \"fa\" */\n locale?: SupportedLocale\n}\n\nconst LABELS: Record<SupportedLocale, Record<BotDetectionKey | 'summary', string>> = {\n fa: { real: 'واقعی', suspicious: 'مشکوک', bot: 'بات', summary: 'نرخ حساب‌های واقعی' },\n ar: { real: 'حقيقي', suspicious: 'مشبوه', bot: 'روبوت', summary: 'معدل الحسابات الحقيقية' },\n en: { real: 'Real', suspicious: 'Suspicious', bot: 'Bot', summary: 'Real-account rate' },\n}\n\nconst SEGMENT_STYLES: Record<BotDetectionKey, { bar: string; text: string; bg: string; dot: string }> = {\n real: {\n bar: 'bg-[hsl(var(--sentiment-positive))]',\n text: 'text-[hsl(var(--sentiment-positive))]',\n bg: 'bg-[hsl(var(--sentiment-positive)/0.12)]',\n dot: 'bg-[hsl(var(--sentiment-positive))]',\n },\n suspicious: {\n bar: 'bg-[hsl(var(--warning-default))]',\n text: 'text-[hsl(var(--warning-default))]',\n bg: 'bg-[hsl(var(--warning-default)/0.12)]',\n dot: 'bg-[hsl(var(--warning-default))]',\n },\n bot: {\n bar: 'bg-[hsl(var(--destructive-default))]',\n text: 'text-[hsl(var(--destructive-default))]',\n bg: 'bg-[hsl(var(--destructive-default)/0.12)]',\n dot: 'bg-[hsl(var(--destructive-default))]',\n },\n}\n\nconst SEGMENT_ORDER: BotDetectionKey[] = ['real', 'suspicious', 'bot']\n\nfunction calcPercents(data: BotDetectionData): Record<BotDetectionKey, number> {\n const total = SEGMENT_ORDER.reduce((sum, k) => sum + (data[k] ?? 0), 0)\n if (total === 0) return { real: 0, suspicious: 0, bot: 0 }\n\n // Largest remainder method — guarantees percentages sum to exactly 100\n const floats = SEGMENT_ORDER.map((k) => ({ k, v: ((data[k] ?? 0) / total) * 100 }))\n const floors = floats.map(({ k, v }) => ({ k, floor: Math.floor(v), rem: v - Math.floor(v) }))\n const remaining = 100 - floors.reduce((s, f) => s + f.floor, 0)\n const sorted = [...floors].sort((a, b) => b.rem - a.rem)\n sorted.slice(0, remaining).forEach((f) => f.floor++)\n\n const result: Record<BotDetectionKey, number> = { real: 0, suspicious: 0, bot: 0 }\n sorted.forEach(({ k, floor }) => (result[k] = floor))\n return result\n}\n\nconst BAR_HEIGHT: Record<'sm' | 'md' | 'lg', string> = {\n sm: 'h-1.5',\n md: 'h-2',\n lg: 'h-3',\n}\n\nconst BotDetectionMeter = React.forwardRef<HTMLDivElement, BotDetectionMeterProps>(\n (\n {\n className,\n data,\n variant = 'stacked',\n showCounts = false,\n showPercent = true,\n showSummary = true,\n size = 'md',\n locale = 'fa',\n ...props\n },\n ref\n ) => {\n const labels = LABELS[locale]\n const percents = calcPercents(data)\n const total = SEGMENT_ORDER.reduce((sum, k) => sum + (data[k] ?? 0), 0)\n\n const fmt = (n: number) => convertToLocalNumbers(n, locale)\n\n if (variant === 'compact') {\n return (\n <div\n ref={ref}\n data-slot=\"bot-detection-meter\"\n data-variant=\"compact\"\n className={cn('flex items-center gap-2 text-xs', className)}\n {...props}\n >\n {SEGMENT_ORDER.map((k) => {\n const value = showCounts ? (data[k] ?? 0) : percents[k]\n return (\n <span key={k} className=\"inline-flex items-center gap-1\">\n <span className={cn('size-2 rounded-full', SEGMENT_STYLES[k].dot)} aria-hidden=\"true\" />\n <span className=\"text-foreground-lighter\">{labels[k]}</span>\n <span className={cn('font-semibold tabular-nums', SEGMENT_STYLES[k].text)}>\n {fmt(value)}\n {!showCounts && showPercent && '٪'}\n </span>\n </span>\n )\n })}\n </div>\n )\n }\n\n if (variant === 'bars') {\n return (\n <div\n ref={ref}\n data-slot=\"bot-detection-meter\"\n data-variant=\"bars\"\n className={cn('flex flex-col gap-2', className)}\n {...props}\n >\n {SEGMENT_ORDER.map((k) => (\n <div key={k} className=\"flex flex-col gap-1\">\n <div className=\"flex items-center justify-between text-xs\">\n <span className=\"inline-flex items-center gap-1.5 text-foreground\">\n <span className={cn('size-2 rounded-full', SEGMENT_STYLES[k].dot)} aria-hidden=\"true\" />\n {labels[k]}\n </span>\n <span className=\"tabular-nums text-foreground-lighter\">\n {showCounts && <span className=\"me-2\">{fmt(data[k] ?? 0)}</span>}\n {showPercent && (\n <span className={cn('font-semibold', SEGMENT_STYLES[k].text)}>{fmt(percents[k])}٪</span>\n )}\n </span>\n </div>\n <div className={cn('w-full rounded-full overflow-hidden', SEGMENT_STYLES[k].bg, BAR_HEIGHT[size])}>\n <div\n className={cn('h-full rounded-full transition-[width] duration-300', SEGMENT_STYLES[k].bar)}\n style={{ width: `${percents[k]}%` }}\n role=\"progressbar\"\n aria-valuenow={percents[k]}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={`${labels[k]}: ${fmt(percents[k])}٪`}\n />\n </div>\n </div>\n ))}\n </div>\n )\n }\n\n // stacked (default)\n return (\n <div\n ref={ref}\n data-slot=\"bot-detection-meter\"\n data-variant=\"stacked\"\n className={cn('flex flex-col gap-2', className)}\n {...props}\n >\n {showSummary && (\n <div className=\"flex items-center justify-between text-xs\">\n <span className=\"text-foreground-lighter\">{labels.summary}</span>\n <span className={cn('font-semibold tabular-nums', SEGMENT_STYLES.real.text)}>\n {fmt(percents.real)}٪\n {showCounts && total > 0 && (\n <span className=\"ms-1 font-normal text-foreground-lighter\">\n ({fmt(data.real)} / {fmt(total)})\n </span>\n )}\n </span>\n </div>\n )}\n <div\n className={cn('w-full rounded-full overflow-hidden bg-surface-200 flex', BAR_HEIGHT[size])}\n role=\"group\"\n aria-label={labels.summary}\n >\n {SEGMENT_ORDER.map((k) => {\n if (percents[k] === 0) return null\n return (\n <div\n key={k}\n className={cn('h-full transition-[width] duration-300', SEGMENT_STYLES[k].bar)}\n style={{ width: `${percents[k]}%` }}\n role=\"progressbar\"\n aria-valuenow={percents[k]}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={`${labels[k]}: ${fmt(percents[k])}٪`}\n />\n )\n })}\n </div>\n <div className=\"flex items-center gap-4 text-xs\">\n {SEGMENT_ORDER.map((k) => (\n <span key={k} className=\"inline-flex items-center gap-1.5\">\n <span className={cn('size-2 rounded-full', SEGMENT_STYLES[k].dot)} aria-hidden=\"true\" />\n <span className=\"text-foreground-lighter\">{labels[k]}</span>\n <span className={cn('font-semibold tabular-nums', SEGMENT_STYLES[k].text)}>\n {showCounts ? fmt(data[k] ?? 0) : `${fmt(percents[k])}٪`}\n </span>\n </span>\n ))}\n </div>\n </div>\n )\n }\n)\nBotDetectionMeter.displayName = 'BotDetectionMeter'\n\nexport { BotDetectionMeter }\n","'use client'\n\nimport * as React from 'react'\nimport { cn, convertToLocalNumbers, type SupportedLocale } from '@/lib/utils'\nimport { StatusBadge } from './status-badge'\nimport { SocialPlatformBadge, type SocialPlatform } from './social-platform-badge'\nimport { Sparkline } from './sparkline'\nimport { BotDetectionMeter, type BotDetectionData } from './bot-detection-meter'\nimport type { StatusKey } from '@/lib/i18n'\n\n/**\n * PageCard (government-flavor) — tracked-account tile for افکارسنجی pages\n * dashboards. Composes: avatar + handle + platform badge, status (healthy/\n * degrading/at-risk via StatusKey), follower trend sparkline, engagement\n * stats, content-type mix, bot-detection percentages.\n *\n * Distinct from `ProfileCard` which is influencer-flavored (focus on\n * engagement tier, follower count, avatar). PageCard is for **tracked\n * accounts** in monitoring — health and trust signals matter most.\n */\n\nexport interface PageCardContentMix {\n /** Photo posts in window (count or %) */\n photo?: number\n /** Video posts in window */\n video?: number\n /** Carousel posts */\n carousel?: number\n /** Story / reel count */\n story?: number\n}\n\nexport interface PageCardProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Account handle / display name (e.g., \"@news_agency\") */\n handle: React.ReactNode\n /** Optional secondary subtitle (e.g., page category) */\n subtitle?: React.ReactNode\n /** Avatar URL */\n avatarSrc?: string\n /** Platform — drives the platform badge */\n platform?: SocialPlatform\n /** Operational status (healthy/degrading/at-risk) — uses StatusKey */\n status?: StatusKey\n /** Total followers (current snapshot) */\n followers?: number\n /** Follower-trend sparkline values */\n followerTrend?: number[]\n /** Engagement rate (%) */\n engagementRate?: number\n /** Posts per week (recent average) */\n postsPerWeek?: number\n /** Content-type mix (counts or percents) */\n contentMix?: PageCardContentMix\n /** Bot-detection breakdown (real / suspicious / bot) */\n botDetection?: BotDetectionData\n /** Make the entire card clickable */\n interactive?: boolean\n /** Locale @default 'fa' */\n locale?: SupportedLocale\n}\n\nfunction formatBig(n: number, locale: SupportedLocale): string {\n if (n >= 1_000_000) return `${convertToLocalNumbers((n / 1_000_000).toFixed(1), locale)}M`\n if (n >= 1_000) return `${convertToLocalNumbers((n / 1_000).toFixed(1), locale)}K`\n return convertToLocalNumbers(n, locale)\n}\n\nconst PageCard = React.forwardRef<HTMLDivElement, PageCardProps>(\n (\n {\n className,\n handle,\n subtitle,\n avatarSrc,\n platform,\n status,\n followers,\n followerTrend,\n engagementRate,\n postsPerWeek,\n contentMix,\n botDetection,\n interactive = false,\n locale = 'fa',\n onClick,\n ...props\n },\n ref\n ) => {\n const isClickable = interactive || !!onClick\n const totalContent =\n contentMix &&\n (contentMix.photo ?? 0) + (contentMix.video ?? 0) + (contentMix.carousel ?? 0) + (contentMix.story ?? 0)\n\n return (\n <div\n ref={ref}\n data-slot=\"page-card\"\n data-status={status}\n role={isClickable ? 'button' : 'article'}\n tabIndex={isClickable ? 0 : undefined}\n onClick={onClick}\n onKeyDown={\n isClickable\n ? (e) => {\n if ((e.key === 'Enter' || e.key === ' ') && e.target === e.currentTarget) {\n e.preventDefault()\n ;(e.currentTarget as HTMLDivElement).click()\n }\n }\n : undefined\n }\n className={cn(\n 'flex flex-col gap-3 rounded-lg border border-border bg-background p-4 transition-colors',\n isClickable &&\n 'cursor-pointer hover:border-strong hover:bg-surface-100/40 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand focus-visible:ring-offset-2 focus-visible:ring-offset-background',\n className\n )}\n {...props}\n >\n {/* Identity row */}\n <div className=\"flex items-center gap-3\">\n {avatarSrc ? (\n <img\n src={avatarSrc}\n alt=\"\"\n className=\"size-10 rounded-full object-cover object-center shrink-0 border border-border\"\n />\n ) : (\n <div className=\"size-10 rounded-full bg-surface-200 shrink-0\" aria-hidden=\"true\" />\n )}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2 flex-wrap\">\n <span className=\"text-sm font-semibold text-foreground truncate\">{handle}</span>\n {platform && <SocialPlatformBadge platform={platform} size=\"xs\" />}\n {status && <StatusBadge status={status} size=\"sm\" animated locale={locale} />}\n </div>\n {subtitle && <p className=\"text-xs text-foreground-lighter truncate\">{subtitle}</p>}\n </div>\n </div>\n\n {/* Stats row — followers + trend + engagement */}\n {(typeof followers === 'number' || followerTrend || typeof engagementRate === 'number') && (\n <div className=\"grid grid-cols-3 gap-3 text-xs\">\n {typeof followers === 'number' && (\n <div>\n <div className=\"text-foreground-lighter\">\n {locale === 'fa' ? 'فالوور' : locale === 'ar' ? 'متابعون' : 'Followers'}\n </div>\n <div className=\"text-base font-semibold tabular-nums text-foreground\">\n {formatBig(followers, locale)}\n </div>\n </div>\n )}\n {followerTrend && followerTrend.length > 0 && (\n <div className=\"flex flex-col\">\n <div className=\"text-foreground-lighter\">\n {locale === 'fa' ? 'روند' : locale === 'ar' ? 'الاتجاه' : 'Trend'}\n </div>\n <div className=\"mt-1\">\n <Sparkline data={followerTrend} variant=\"line\" width={80} height={24} />\n </div>\n </div>\n )}\n {typeof engagementRate === 'number' && (\n <div>\n <div className=\"text-foreground-lighter\">\n {locale === 'fa' ? 'نرخ تعامل' : locale === 'ar' ? 'معدل التفاعل' : 'Engagement'}\n </div>\n <div className=\"text-base font-semibold tabular-nums text-foreground\">\n {convertToLocalNumbers(engagementRate.toFixed(1), locale)}\n {locale === 'en' ? '%' : '٪'}\n </div>\n </div>\n )}\n </div>\n )}\n\n {/* Content mix bar (photo/video/carousel/story) */}\n {contentMix && totalContent && totalContent > 0 && (\n <div className=\"space-y-1\">\n <div className=\"text-2xs text-foreground-lighter\">\n {locale === 'fa' ? 'ترکیب محتوا' : locale === 'ar' ? 'مزيج المحتوى' : 'Content mix'}\n </div>\n <div className=\"flex h-1.5 w-full overflow-hidden rounded-full bg-surface-200\">\n {contentMix.photo ? (\n <span\n style={{\n width: `${(contentMix.photo / totalContent) * 100}%`,\n backgroundColor: 'hsl(var(--chart-1))',\n }}\n aria-label={`photo ${contentMix.photo}`}\n />\n ) : null}\n {contentMix.video ? (\n <span\n style={{\n width: `${(contentMix.video / totalContent) * 100}%`,\n backgroundColor: 'hsl(var(--chart-2))',\n }}\n aria-label={`video ${contentMix.video}`}\n />\n ) : null}\n {contentMix.carousel ? (\n <span\n style={{\n width: `${(contentMix.carousel / totalContent) * 100}%`,\n backgroundColor: 'hsl(var(--chart-3))',\n }}\n aria-label={`carousel ${contentMix.carousel}`}\n />\n ) : null}\n {contentMix.story ? (\n <span\n style={{\n width: `${(contentMix.story / totalContent) * 100}%`,\n backgroundColor: 'hsl(var(--chart-4))',\n }}\n aria-label={`story ${contentMix.story}`}\n />\n ) : null}\n </div>\n </div>\n )}\n\n {/* Bot detection */}\n {botDetection && (\n <div data-slot=\"page-card-bot\">\n <BotDetectionMeter data={botDetection} variant=\"compact\" size=\"sm\" locale={locale} />\n </div>\n )}\n\n {typeof postsPerWeek === 'number' && (\n <div className=\"text-2xs text-foreground-lighter pt-1 border-t border-border\">\n {locale === 'fa'\n ? `میانگین ${convertToLocalNumbers(postsPerWeek.toFixed(1), 'fa')} پست در هفته`\n : locale === 'ar'\n ? `متوسط ${convertToLocalNumbers(postsPerWeek.toFixed(1), 'ar')} منشور في الأسبوع`\n : `Avg ${postsPerWeek.toFixed(1)} posts/week`}\n </div>\n )}\n </div>\n )\n }\n)\nPageCard.displayName = 'PageCard'\n\nexport { PageCard }\n"]}
@@ -0,0 +1,130 @@
1
+ 'use strict';
2
+
3
+ var chunkKYM7NIJO_cjs = require('./chunk-KYM7NIJO.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
+ legend = false
48
+ }, ref) {
49
+ const { chartColors, axisTickStyle, gridStyle, tooltipStyle, crosshairStyle } = chunkKYM7NIJO_cjs.useChartTheme();
50
+ const defaultXTick = React__namespace.useMemo(() => chunkKYM7NIJO_cjs.localeAwareCategoryTick(locale), [locale]);
51
+ const defaultYTick = React__namespace.useMemo(() => chunkKYM7NIJO_cjs.localeAwareNumberTick(locale), [locale]);
52
+ if (isLoading) {
53
+ return /* @__PURE__ */ jsxRuntime.jsx(chunkKYM7NIJO_cjs.ChartLoadingSkeleton, { className });
54
+ }
55
+ const legendItems = legend ? dataKeys.map((key, i) => ({
56
+ key,
57
+ label: key,
58
+ color: chartColors[i % chartColors.length],
59
+ shape: "line"
60
+ })) : [];
61
+ return /* @__PURE__ */ jsxRuntime.jsx(chunkKYM7NIJO_cjs.ChartContainer, { ref, className, dataSlot: "area-chart", ariaLabel, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", flexDirection: "column", width: "100%", height: "100%" }, children: [
62
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { flex: 1, minHeight: 0 }, children: /* @__PURE__ */ jsxRuntime.jsx(recharts.ResponsiveContainer, { width: "100%", height: "100%", children: /* @__PURE__ */ jsxRuntime.jsxs(recharts.AreaChart, { data, margin, ...chartProps, children: [
63
+ /* @__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: [
64
+ /* @__PURE__ */ jsxRuntime.jsx("stop", { offset: "0%", stopColor: chartColors[i % chartColors.length], stopOpacity: fillOpacity }),
65
+ /* @__PURE__ */ jsxRuntime.jsx("stop", { offset: "100%", stopColor: chartColors[i % chartColors.length], stopOpacity: 0 })
66
+ ] }, key)) }),
67
+ (enableGridX || enableGridY) && /* @__PURE__ */ jsxRuntime.jsx(
68
+ recharts.CartesianGrid,
69
+ {
70
+ horizontal: enableGridY,
71
+ vertical: enableGridX,
72
+ stroke: gridStyle.stroke,
73
+ strokeDasharray: gridStyle.strokeDasharray,
74
+ strokeOpacity: gridStyle.strokeOpacity
75
+ }
76
+ ),
77
+ axisBottom !== null && /* @__PURE__ */ jsxRuntime.jsx(
78
+ recharts.XAxis,
79
+ {
80
+ dataKey: xAxisKey,
81
+ tick: axisTickStyle,
82
+ tickLine: false,
83
+ axisLine: false,
84
+ tickMargin: 12,
85
+ tickFormatter: defaultXTick,
86
+ ...axisBottom
87
+ }
88
+ ),
89
+ axisLeft !== null && /* @__PURE__ */ jsxRuntime.jsx(
90
+ recharts.YAxis,
91
+ {
92
+ tick: axisTickStyle,
93
+ tickLine: false,
94
+ axisLine: false,
95
+ tickMargin: 12,
96
+ tickFormatter: defaultYTick,
97
+ ...axisLeft
98
+ }
99
+ ),
100
+ /* @__PURE__ */ jsxRuntime.jsx(
101
+ recharts.Tooltip,
102
+ {
103
+ cursor: crosshairStyle,
104
+ content: /* @__PURE__ */ jsxRuntime.jsx(chunkKYM7NIJO_cjs.ChartTooltip, { tooltipStyle, formatter: tooltipFormatter, locale })
105
+ }
106
+ ),
107
+ dataKeys.map((key, i) => /* @__PURE__ */ jsxRuntime.jsx(
108
+ recharts.Area,
109
+ {
110
+ type: curve,
111
+ dataKey: key,
112
+ stroke: chartColors[i % chartColors.length],
113
+ strokeWidth,
114
+ fill: `url(#area-gradient-${key})`,
115
+ dot: showDots,
116
+ activeDot: { r: 4, strokeWidth: 2 },
117
+ animationDuration: 800,
118
+ animationEasing: "ease-out"
119
+ },
120
+ key
121
+ ))
122
+ ] }) }) }),
123
+ legend && /* @__PURE__ */ jsxRuntime.jsx(chunkKYM7NIJO_cjs.ChartLegend, { items: legendItems, style: { paddingTop: 12 } })
124
+ ] }) });
125
+ });
126
+ PartoAreaChart.displayName = "PartoAreaChart";
127
+
128
+ exports.PartoAreaChart = PartoAreaChart;
129
+ //# sourceMappingURL=chunk-UOZN45G4.cjs.map
130
+ //# sourceMappingURL=chunk-UOZN45G4.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/charts/PartoAreaChart.tsx"],"names":["React","PartoAreaChart","useChartTheme","localeAwareCategoryTick","localeAwareNumberTick","jsx","ChartLoadingSkeleton","ChartContainer","jsxs","ResponsiveContainer","AreaChart","CartesianGrid","XAxis","YAxis","Tooltip","ChartTooltip","Area","ChartLegend"],"mappings":"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","file":"chunk-UOZN45G4.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 ChartLegend,\n ChartLoadingSkeleton,\n ChartTooltip,\n localeAwareCategoryTick,\n localeAwareNumberTick,\n type ChartLegendItem,\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 /** Render a colored-marker legend below the chart. @default `false` */\n legend?: boolean\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 legend = false,\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 const legendItems: ChartLegendItem[] = legend\n ? dataKeys.map((key, i) => ({\n key,\n label: key,\n color: chartColors[i % chartColors.length],\n shape: 'line',\n }))\n : []\n\n return (\n <ChartContainer ref={ref} className={className} dataSlot=\"area-chart\" ariaLabel={ariaLabel}>\n <div style={{ display: 'flex', flexDirection: 'column', width: '100%', height: '100%' }}>\n <div style={{ flex: 1, minHeight: 0 }}>\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 </div>\n {legend && <ChartLegend items={legendItems} style={{ paddingTop: 12 }} />}\n </div>\n </ChartContainer>\n )\n})\nPartoAreaChart.displayName = 'PartoAreaChart'\n"]}
@@ -0,0 +1,167 @@
1
+ 'use strict';
2
+
3
+ var chunkKYM7NIJO_cjs = require('./chunk-KYM7NIJO.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 PartoBarChart = React__namespace.forwardRef(function PartoBarChart2({
29
+ data,
30
+ keys,
31
+ indexBy,
32
+ groupMode = "grouped",
33
+ layout = "vertical",
34
+ margin = { top: 20, right: 20, bottom: 50, left: 50 },
35
+ barCategoryGap = "35%",
36
+ barGap = 2,
37
+ radius = [6, 6, 0, 0],
38
+ enableGridY = true,
39
+ enableGridX = false,
40
+ enableLabel = false,
41
+ axisBottom,
42
+ axisLeft,
43
+ tooltipFormatter,
44
+ locale = "fa",
45
+ className,
46
+ isLoading = false,
47
+ ariaLabel,
48
+ chartProps,
49
+ legend = false
50
+ }, ref) {
51
+ const { chartColors, axisTickStyle, gridStyle, tooltipStyle } = chunkKYM7NIJO_cjs.useChartTheme();
52
+ const categoryTick = React__namespace.useMemo(() => chunkKYM7NIJO_cjs.localeAwareCategoryTick(locale), [locale]);
53
+ const numberTick = React__namespace.useMemo(() => chunkKYM7NIJO_cjs.localeAwareNumberTick(locale), [locale]);
54
+ if (isLoading) {
55
+ return /* @__PURE__ */ jsxRuntime.jsx(chunkKYM7NIJO_cjs.ChartLoadingSkeleton, { className });
56
+ }
57
+ const rechartsLayout = layout === "horizontal" ? "vertical" : "horizontal";
58
+ const stackId = groupMode === "stacked" ? "stack" : void 0;
59
+ const legendItems = legend ? keys.map((key, i) => ({
60
+ key,
61
+ label: key,
62
+ color: chartColors[i % chartColors.length],
63
+ shape: "bar"
64
+ })) : [];
65
+ return /* @__PURE__ */ jsxRuntime.jsx(chunkKYM7NIJO_cjs.ChartContainer, { ref, className, dataSlot: "bar-chart", ariaLabel, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", flexDirection: "column", width: "100%", height: "100%" }, children: [
66
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { flex: 1, minHeight: 0 }, children: /* @__PURE__ */ jsxRuntime.jsx(recharts.ResponsiveContainer, { width: "100%", height: "100%", children: /* @__PURE__ */ jsxRuntime.jsxs(
67
+ recharts.BarChart,
68
+ {
69
+ data,
70
+ layout: rechartsLayout,
71
+ margin,
72
+ barCategoryGap,
73
+ barGap,
74
+ ...chartProps,
75
+ children: [
76
+ (enableGridX || enableGridY) && /* @__PURE__ */ jsxRuntime.jsx(
77
+ recharts.CartesianGrid,
78
+ {
79
+ horizontal: enableGridY,
80
+ vertical: enableGridX,
81
+ stroke: gridStyle.stroke,
82
+ strokeDasharray: gridStyle.strokeDasharray,
83
+ strokeOpacity: gridStyle.strokeOpacity
84
+ }
85
+ ),
86
+ rechartsLayout === "horizontal" ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
87
+ axisBottom !== null && /* @__PURE__ */ jsxRuntime.jsx(
88
+ recharts.XAxis,
89
+ {
90
+ dataKey: indexBy,
91
+ tick: axisTickStyle,
92
+ tickLine: false,
93
+ axisLine: false,
94
+ tickMargin: 12,
95
+ tickFormatter: categoryTick,
96
+ ...axisBottom
97
+ }
98
+ ),
99
+ axisLeft !== null && /* @__PURE__ */ jsxRuntime.jsx(
100
+ recharts.YAxis,
101
+ {
102
+ tick: axisTickStyle,
103
+ tickLine: false,
104
+ axisLine: false,
105
+ tickMargin: 12,
106
+ tickFormatter: numberTick,
107
+ ...axisLeft
108
+ }
109
+ )
110
+ ] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
111
+ axisLeft !== null && /* @__PURE__ */ jsxRuntime.jsx(
112
+ recharts.YAxis,
113
+ {
114
+ dataKey: indexBy,
115
+ type: "category",
116
+ tick: axisTickStyle,
117
+ tickLine: false,
118
+ axisLine: false,
119
+ tickMargin: 12,
120
+ tickFormatter: categoryTick,
121
+ ...axisLeft
122
+ }
123
+ ),
124
+ axisBottom !== null && /* @__PURE__ */ jsxRuntime.jsx(
125
+ recharts.XAxis,
126
+ {
127
+ type: "number",
128
+ tick: axisTickStyle,
129
+ tickLine: false,
130
+ axisLine: false,
131
+ tickMargin: 12,
132
+ tickFormatter: numberTick,
133
+ ...axisBottom
134
+ }
135
+ )
136
+ ] }),
137
+ /* @__PURE__ */ jsxRuntime.jsx(
138
+ recharts.Tooltip,
139
+ {
140
+ cursor: { fill: "hsl(0 0% 50% / 0.05)" },
141
+ content: /* @__PURE__ */ jsxRuntime.jsx(chunkKYM7NIJO_cjs.ChartTooltip, { tooltipStyle, formatter: tooltipFormatter, locale })
142
+ }
143
+ ),
144
+ keys.map((key, i) => /* @__PURE__ */ jsxRuntime.jsx(
145
+ recharts.Bar,
146
+ {
147
+ dataKey: key,
148
+ fill: chartColors[i % chartColors.length],
149
+ radius,
150
+ stackId,
151
+ label: enableLabel ? { position: "top", style: axisTickStyle } : false,
152
+ animationDuration: 800,
153
+ animationEasing: "ease-out"
154
+ },
155
+ key
156
+ ))
157
+ ]
158
+ }
159
+ ) }) }),
160
+ legend && /* @__PURE__ */ jsxRuntime.jsx(chunkKYM7NIJO_cjs.ChartLegend, { items: legendItems, style: { paddingTop: 12 } })
161
+ ] }) });
162
+ });
163
+ PartoBarChart.displayName = "PartoBarChart";
164
+
165
+ exports.PartoBarChart = PartoBarChart;
166
+ //# sourceMappingURL=chunk-VHLDOG74.cjs.map
167
+ //# sourceMappingURL=chunk-VHLDOG74.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/charts/PartoBarChart.tsx"],"names":["React","PartoBarChart","useChartTheme","localeAwareCategoryTick","localeAwareNumberTick","jsx","ChartLoadingSkeleton","ChartContainer","jsxs","ResponsiveContainer","BarChart","CartesianGrid","Fragment","XAxis","YAxis","Tooltip","ChartTooltip","Bar","ChartLegend"],"mappings":"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","file":"chunk-VHLDOG74.cjs","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { BarChart, Bar, 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 ChartLegend,\n ChartLoadingSkeleton,\n ChartTooltip,\n localeAwareCategoryTick,\n localeAwareNumberTick,\n type ChartLegendItem,\n} from './chart-utils'\n\nexport interface PartoBarChartProps {\n /** Chart data — row-oriented array of objects */\n data: Array<Record<string, any>>\n /** Data keys to render as bars (e.g. ['فروش', 'هزینه']) */\n keys: string[]\n /** Field name used for X axis categories (e.g. 'ماه') */\n indexBy: string\n /** Stacked or grouped layout */\n groupMode?: 'grouped' | 'stacked'\n /** Bar layout direction */\n layout?: 'vertical' | 'horizontal'\n /** Chart margins */\n margin?: { top?: number; right?: number; bottom?: number; left?: number }\n /** Gap between category groups as percentage */\n barCategoryGap?: string | number\n /** Gap between bars within a group */\n barGap?: number\n /** Border radius for bar tops [topLeft, topRight, bottomRight, bottomLeft] */\n radius?: [number, number, number, number]\n /** Show horizontal grid lines */\n enableGridY?: boolean\n /** Show vertical grid lines */\n enableGridX?: boolean\n /** Show labels inside bars */\n enableLabel?: boolean\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 BarChart props */\n chartProps?: Record<string, any>\n /**\n * Render a legend below the chart that names each series with a colored\n * marker. Strongly recommended for grouped or stacked layouts where\n * series identity is otherwise color-only. @default `false`\n */\n legend?: boolean\n}\n\nexport const PartoBarChart = React.forwardRef<HTMLDivElement, PartoBarChartProps>(function PartoBarChart(\n {\n data,\n keys,\n indexBy,\n groupMode = 'grouped',\n layout = 'vertical',\n margin = { top: 20, right: 20, bottom: 50, left: 50 },\n barCategoryGap = '35%',\n barGap = 2,\n radius = [6, 6, 0, 0],\n enableGridY = true,\n enableGridX = false,\n enableLabel = false,\n axisBottom,\n axisLeft,\n tooltipFormatter,\n locale = 'fa',\n className,\n isLoading = false,\n ariaLabel,\n chartProps,\n legend = false,\n },\n ref\n) {\n const { chartColors, axisTickStyle, gridStyle, tooltipStyle } = useChartTheme()\n const categoryTick = React.useMemo(() => localeAwareCategoryTick(locale), [locale])\n const numberTick = React.useMemo(() => localeAwareNumberTick(locale), [locale])\n\n if (isLoading) {\n return <ChartLoadingSkeleton className={className} />\n }\n\n // Recharts uses \"horizontal\" for standard vertical bars and \"vertical\" for horizontal bars\n const rechartsLayout = layout === 'horizontal' ? 'vertical' : 'horizontal'\n const stackId = groupMode === 'stacked' ? 'stack' : undefined\n\n const legendItems: ChartLegendItem[] = legend\n ? keys.map((key, i) => ({\n key,\n label: key,\n color: chartColors[i % chartColors.length],\n shape: 'bar',\n }))\n : []\n\n return (\n <ChartContainer ref={ref} className={className} dataSlot=\"bar-chart\" ariaLabel={ariaLabel}>\n <div style={{ display: 'flex', flexDirection: 'column', width: '100%', height: '100%' }}>\n <div style={{ flex: 1, minHeight: 0 }}>\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <BarChart\n data={data}\n layout={rechartsLayout}\n margin={margin}\n barCategoryGap={barCategoryGap}\n barGap={barGap}\n {...chartProps}\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 {rechartsLayout === 'horizontal' ? (\n <>\n {axisBottom !== null && (\n <XAxis\n dataKey={indexBy}\n tick={axisTickStyle}\n tickLine={false}\n axisLine={false}\n tickMargin={12}\n tickFormatter={categoryTick}\n {...axisBottom}\n />\n )}\n {axisLeft !== null && (\n <YAxis\n tick={axisTickStyle}\n tickLine={false}\n axisLine={false}\n tickMargin={12}\n tickFormatter={numberTick}\n {...axisLeft}\n />\n )}\n </>\n ) : (\n <>\n {axisLeft !== null && (\n <YAxis\n dataKey={indexBy}\n type=\"category\"\n tick={axisTickStyle}\n tickLine={false}\n axisLine={false}\n tickMargin={12}\n tickFormatter={categoryTick}\n {...axisLeft}\n />\n )}\n {axisBottom !== null && (\n <XAxis\n type=\"number\"\n tick={axisTickStyle}\n tickLine={false}\n axisLine={false}\n tickMargin={12}\n tickFormatter={numberTick}\n {...axisBottom}\n />\n )}\n </>\n )}\n\n <Tooltip\n cursor={{ fill: 'hsl(0 0% 50% / 0.05)' }}\n content={<ChartTooltip tooltipStyle={tooltipStyle} formatter={tooltipFormatter} locale={locale} />}\n />\n\n {keys.map((key, i) => (\n <Bar\n key={key}\n dataKey={key}\n fill={chartColors[i % chartColors.length]}\n radius={radius}\n stackId={stackId}\n label={enableLabel ? { position: 'top', style: axisTickStyle } : false}\n animationDuration={800}\n animationEasing=\"ease-out\"\n />\n ))}\n </BarChart>\n </ResponsiveContainer>\n </div>\n {legend && <ChartLegend items={legendItems} style={{ paddingTop: 12 }} />}\n </div>\n </ChartContainer>\n )\n})\nPartoBarChart.displayName = 'PartoBarChart'\n"]}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkYE477L2H_cjs = require('./chunk-YE477L2H.cjs');
3
+ var chunkMMC6M35Q_cjs = require('./chunk-MMC6M35Q.cjs');
4
4
  var chunkNV4JOKWL_cjs = require('./chunk-NV4JOKWL.cjs');
5
5
  var React = require('react');
6
6
  var lucideReact = require('lucide-react');
@@ -94,7 +94,7 @@ var SavedQueryCard = React__namespace.forwardRef(
94
94
  lastRun
95
95
  ] })
96
96
  ] }),
97
- onRun && /* @__PURE__ */ jsxRuntime.jsxs(chunkYE477L2H_cjs.Button, { size: "sm", variant: "outline", onClick: onRun, className: "gap-1.5", "data-slot": "saved-query-card-run", children: [
97
+ onRun && /* @__PURE__ */ jsxRuntime.jsxs(chunkMMC6M35Q_cjs.Button, { size: "sm", variant: "outline", onClick: onRun, className: "gap-1.5", "data-slot": "saved-query-card-run", children: [
98
98
  /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Play, { className: "size-3", "aria-hidden": "true" }),
99
99
  runLabel ?? t.run
100
100
  ] })
@@ -107,5 +107,5 @@ var SavedQueryCard = React__namespace.forwardRef(
107
107
  SavedQueryCard.displayName = "SavedQueryCard";
108
108
 
109
109
  exports.SavedQueryCard = SavedQueryCard;
110
- //# sourceMappingURL=chunk-VO3B75F6.cjs.map
111
- //# sourceMappingURL=chunk-VO3B75F6.cjs.map
110
+ //# sourceMappingURL=chunk-YENXXYUV.cjs.map
111
+ //# sourceMappingURL=chunk-YENXXYUV.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/ui/saved-query-card.tsx"],"names":["React","jsxs","cn","jsx","Search","Star","convertToLocalNumbers","Clock","Button","Play"],"mappings":"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","file":"chunk-VO3B75F6.cjs","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { Search, Play, Star, Clock } from 'lucide-react'\nimport { cn, convertToLocalNumbers, type SupportedLocale } from '@/lib/utils'\nimport { Button } from './button'\n\n/**\n * SavedQueryCard — saved-search tile for analyst dashboards. Shows query\n * description + filter summary chips, run count, last-run timestamp, and a\n * one-click \"run again\" action button. Optional star/favorite toggle.\n */\n\nexport interface SavedQueryFilter {\n /** Filter label (e.g., \"احساس\") */\n label: React.ReactNode\n /** Filter value (e.g., \"منفی\") */\n value: React.ReactNode\n}\n\nexport interface SavedQueryCardProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Saved query name */\n name: React.ReactNode\n /** Optional 1-line description */\n description?: React.ReactNode\n /** Filter chips (label + value pairs) */\n filters?: SavedQueryFilter[]\n /** Total run count */\n runCount?: number\n /** Last-run display (e.g., \"۲ روز پیش\") */\n lastRun?: React.ReactNode\n /** Run-now callback */\n onRun?: () => void\n /** Run button label override */\n runLabel?: React.ReactNode\n /** Favorite/star state. When set, renders the star toggle */\n favorite?: {\n starred: boolean\n onChange: (next: boolean) => void\n }\n /** Locale @default 'fa' */\n locale?: SupportedLocale\n}\n\nconst STRINGS: Record<SupportedLocale, { run: string; runs: string; star: string; unstar: string }> = {\n fa: { run: 'اجرا', runs: 'اجرا', star: 'علاقه‌مندی', unstar: 'حذف از علاقه‌مندی‌ها' },\n ar: { run: 'تشغيل', runs: 'تشغيل', star: 'مفضلة', unstar: 'إزالة من المفضلة' },\n en: { run: 'Run', runs: 'runs', star: 'Favorite', unstar: 'Unfavorite' },\n}\n\nconst SavedQueryCard = React.forwardRef<HTMLDivElement, SavedQueryCardProps>(\n (\n { className, name, description, filters, runCount, lastRun, onRun, runLabel, favorite, locale = 'fa', ...props },\n ref\n ) => {\n const t = STRINGS[locale] ?? STRINGS.fa\n return (\n <div\n ref={ref}\n data-slot=\"saved-query-card\"\n className={cn('flex flex-col gap-3 rounded-lg border border-border bg-background p-4', className)}\n {...props}\n >\n {/* Header */}\n <div className=\"flex items-start gap-3\">\n <Search className=\"size-4 mt-0.5 shrink-0 text-foreground-lighter\" aria-hidden=\"true\" />\n <div className=\"flex-1 min-w-0\">\n <h3 className=\"text-sm font-semibold text-foreground truncate\">{name}</h3>\n {description && <p className=\"mt-0.5 text-xs text-foreground-lighter line-clamp-2\">{description}</p>}\n </div>\n {favorite && (\n <button\n type=\"button\"\n onClick={() => favorite.onChange(!favorite.starred)}\n className=\"shrink-0 inline-flex size-7 items-center justify-center rounded text-foreground-lighter hover:bg-surface-100 hover:text-foreground transition-colors\"\n aria-label={favorite.starred ? t.unstar : t.star}\n aria-pressed={favorite.starred}\n data-slot=\"saved-query-card-favorite\"\n >\n <Star\n className={cn('size-4', favorite.starred && 'fill-warning-default text-warning-default')}\n aria-hidden=\"true\"\n />\n </button>\n )}\n </div>\n\n {/* Filter chips */}\n {filters && filters.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5\">\n {filters.map((f, i) => (\n <span\n key={i}\n className=\"inline-flex items-center gap-1 rounded-md border border-border bg-background-muted/40 px-2 py-0.5 text-2xs\"\n data-slot=\"saved-query-card-filter\"\n >\n <span className=\"text-foreground-lighter\">{f.label}:</span>\n <span className=\"text-foreground font-medium\">{f.value}</span>\n </span>\n ))}\n </div>\n )}\n\n {/* Footer — meta + run button */}\n <div className=\"flex items-center justify-between gap-2 pt-2 border-t border-border\">\n <div className=\"flex items-center gap-3 text-2xs text-foreground-lighter\">\n {typeof runCount === 'number' && (\n <span className=\"tabular-nums\">\n {convertToLocalNumbers(runCount, locale)} {t.runs}\n </span>\n )}\n {lastRun && (\n <span className=\"inline-flex items-center gap-1\">\n <Clock className=\"size-3\" aria-hidden=\"true\" />\n {lastRun}\n </span>\n )}\n </div>\n {onRun && (\n <Button size=\"sm\" variant=\"outline\" onClick={onRun} className=\"gap-1.5\" data-slot=\"saved-query-card-run\">\n <Play className=\"size-3\" aria-hidden=\"true\" />\n {runLabel ?? t.run}\n </Button>\n )}\n </div>\n </div>\n )\n }\n)\nSavedQueryCard.displayName = 'SavedQueryCard'\n\nexport { SavedQueryCard }\n"]}
1
+ {"version":3,"sources":["../src/components/ui/saved-query-card.tsx"],"names":["React","jsxs","cn","jsx","Search","Star","convertToLocalNumbers","Clock","Button","Play"],"mappings":"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","file":"chunk-YENXXYUV.cjs","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { Search, Play, Star, Clock } from 'lucide-react'\nimport { cn, convertToLocalNumbers, type SupportedLocale } from '@/lib/utils'\nimport { Button } from './button'\n\n/**\n * SavedQueryCard — saved-search tile for analyst dashboards. Shows query\n * description + filter summary chips, run count, last-run timestamp, and a\n * one-click \"run again\" action button. Optional star/favorite toggle.\n */\n\nexport interface SavedQueryFilter {\n /** Filter label (e.g., \"احساس\") */\n label: React.ReactNode\n /** Filter value (e.g., \"منفی\") */\n value: React.ReactNode\n}\n\nexport interface SavedQueryCardProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Saved query name */\n name: React.ReactNode\n /** Optional 1-line description */\n description?: React.ReactNode\n /** Filter chips (label + value pairs) */\n filters?: SavedQueryFilter[]\n /** Total run count */\n runCount?: number\n /** Last-run display (e.g., \"۲ روز پیش\") */\n lastRun?: React.ReactNode\n /** Run-now callback */\n onRun?: () => void\n /** Run button label override */\n runLabel?: React.ReactNode\n /** Favorite/star state. When set, renders the star toggle */\n favorite?: {\n starred: boolean\n onChange: (next: boolean) => void\n }\n /** Locale @default 'fa' */\n locale?: SupportedLocale\n}\n\nconst STRINGS: Record<SupportedLocale, { run: string; runs: string; star: string; unstar: string }> = {\n fa: { run: 'اجرا', runs: 'اجرا', star: 'علاقه‌مندی', unstar: 'حذف از علاقه‌مندی‌ها' },\n ar: { run: 'تشغيل', runs: 'تشغيل', star: 'مفضلة', unstar: 'إزالة من المفضلة' },\n en: { run: 'Run', runs: 'runs', star: 'Favorite', unstar: 'Unfavorite' },\n}\n\nconst SavedQueryCard = React.forwardRef<HTMLDivElement, SavedQueryCardProps>(\n (\n { className, name, description, filters, runCount, lastRun, onRun, runLabel, favorite, locale = 'fa', ...props },\n ref\n ) => {\n const t = STRINGS[locale] ?? STRINGS.fa\n return (\n <div\n ref={ref}\n data-slot=\"saved-query-card\"\n className={cn('flex flex-col gap-3 rounded-lg border border-border bg-background p-4', className)}\n {...props}\n >\n {/* Header */}\n <div className=\"flex items-start gap-3\">\n <Search className=\"size-4 mt-0.5 shrink-0 text-foreground-lighter\" aria-hidden=\"true\" />\n <div className=\"flex-1 min-w-0\">\n <h3 className=\"text-sm font-semibold text-foreground truncate\">{name}</h3>\n {description && <p className=\"mt-0.5 text-xs text-foreground-lighter line-clamp-2\">{description}</p>}\n </div>\n {favorite && (\n <button\n type=\"button\"\n onClick={() => favorite.onChange(!favorite.starred)}\n className=\"shrink-0 inline-flex size-7 items-center justify-center rounded text-foreground-lighter hover:bg-surface-100 hover:text-foreground transition-colors\"\n aria-label={favorite.starred ? t.unstar : t.star}\n aria-pressed={favorite.starred}\n data-slot=\"saved-query-card-favorite\"\n >\n <Star\n className={cn('size-4', favorite.starred && 'fill-warning-default text-warning-default')}\n aria-hidden=\"true\"\n />\n </button>\n )}\n </div>\n\n {/* Filter chips */}\n {filters && filters.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5\">\n {filters.map((f, i) => (\n <span\n key={i}\n className=\"inline-flex items-center gap-1 rounded-md border border-border bg-background-muted/40 px-2 py-0.5 text-2xs\"\n data-slot=\"saved-query-card-filter\"\n >\n <span className=\"text-foreground-lighter\">{f.label}:</span>\n <span className=\"text-foreground font-medium\">{f.value}</span>\n </span>\n ))}\n </div>\n )}\n\n {/* Footer — meta + run button */}\n <div className=\"flex items-center justify-between gap-2 pt-2 border-t border-border\">\n <div className=\"flex items-center gap-3 text-2xs text-foreground-lighter\">\n {typeof runCount === 'number' && (\n <span className=\"tabular-nums\">\n {convertToLocalNumbers(runCount, locale)} {t.runs}\n </span>\n )}\n {lastRun && (\n <span className=\"inline-flex items-center gap-1\">\n <Clock className=\"size-3\" aria-hidden=\"true\" />\n {lastRun}\n </span>\n )}\n </div>\n {onRun && (\n <Button size=\"sm\" variant=\"outline\" onClick={onRun} className=\"gap-1.5\" data-slot=\"saved-query-card-run\">\n <Play className=\"size-3\" aria-hidden=\"true\" />\n {runLabel ?? t.run}\n </Button>\n )}\n </div>\n </div>\n )\n }\n)\nSavedQueryCard.displayName = 'SavedQueryCard'\n\nexport { SavedQueryCard }\n"]}