@parto-system-design/ui 1.1.17 → 1.1.18

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 (300) hide show
  1. package/AGENTS.md +2 -2
  2. package/README.md +1 -1
  3. package/dist/components/brand/parto-logo.cjs +0 -2
  4. package/dist/components/brand/parto-logo.js +0 -2
  5. package/dist/components/charts/PartoAreaChart.cjs +2 -4
  6. package/dist/components/charts/PartoAreaChart.d.cts +1 -1
  7. package/dist/components/charts/PartoAreaChart.d.ts +1 -1
  8. package/dist/components/charts/PartoAreaChart.js +2 -4
  9. package/dist/components/charts/PartoBarChart.cjs +2 -4
  10. package/dist/components/charts/PartoBarChart.d.cts +1 -1
  11. package/dist/components/charts/PartoBarChart.d.ts +1 -1
  12. package/dist/components/charts/PartoBarChart.js +2 -4
  13. package/dist/components/charts/PartoLineChart.cjs +2 -4
  14. package/dist/components/charts/PartoLineChart.d.cts +1 -1
  15. package/dist/components/charts/PartoLineChart.d.ts +1 -1
  16. package/dist/components/charts/PartoLineChart.js +2 -4
  17. package/dist/components/charts/PartoPieChart.cjs +2 -4
  18. package/dist/components/charts/PartoPieChart.d.cts +1 -1
  19. package/dist/components/charts/PartoPieChart.d.ts +1 -1
  20. package/dist/components/charts/PartoPieChart.js +2 -4
  21. package/dist/components/ui/accordion.cjs +0 -2
  22. package/dist/components/ui/accordion.d.cts +4 -5
  23. package/dist/components/ui/accordion.d.ts +4 -5
  24. package/dist/components/ui/accordion.js +0 -2
  25. package/dist/components/ui/alert-dialog.cjs +0 -2
  26. package/dist/components/ui/alert-dialog.d.cts +9 -10
  27. package/dist/components/ui/alert-dialog.d.ts +9 -10
  28. package/dist/components/ui/alert-dialog.js +1 -3
  29. package/dist/components/ui/alert-rule-card.cjs +149 -12
  30. package/dist/components/ui/alert-rule-card.d.cts +2 -2
  31. package/dist/components/ui/alert-rule-card.d.ts +2 -2
  32. package/dist/components/ui/alert-rule-card.js +149 -12
  33. package/dist/components/ui/alert.cjs +3 -5
  34. package/dist/components/ui/alert.js +3 -5
  35. package/dist/components/ui/app-bar.cjs +0 -2
  36. package/dist/components/ui/app-bar.js +0 -2
  37. package/dist/components/ui/avatar.cjs +0 -2
  38. package/dist/components/ui/avatar.d.cts +3 -4
  39. package/dist/components/ui/avatar.d.ts +3 -4
  40. package/dist/components/ui/avatar.js +0 -2
  41. package/dist/components/ui/badge.cjs +0 -2
  42. package/dist/components/ui/badge.d.cts +1 -1
  43. package/dist/components/ui/badge.d.ts +1 -1
  44. package/dist/components/ui/badge.js +0 -2
  45. package/dist/components/ui/breadcrumb.cjs +0 -2
  46. package/dist/components/ui/breadcrumb.d.cts +7 -8
  47. package/dist/components/ui/breadcrumb.d.ts +7 -8
  48. package/dist/components/ui/breadcrumb.js +0 -2
  49. package/dist/components/ui/button.cjs +0 -2
  50. package/dist/components/ui/button.d.cts +2 -2
  51. package/dist/components/ui/button.d.ts +2 -2
  52. package/dist/components/ui/button.js +1 -3
  53. package/dist/components/ui/calendar.cjs +0 -2
  54. package/dist/components/ui/calendar.d.cts +1 -2
  55. package/dist/components/ui/calendar.d.ts +1 -2
  56. package/dist/components/ui/calendar.js +1 -3
  57. package/dist/components/ui/card.cjs +0 -2
  58. package/dist/components/ui/card.js +0 -2
  59. package/dist/components/ui/checkbox.cjs +0 -2
  60. package/dist/components/ui/checkbox.js +0 -2
  61. package/dist/components/ui/concept-card.cjs +179 -61
  62. package/dist/components/ui/concept-card.d.cts +3 -3
  63. package/dist/components/ui/concept-card.d.ts +3 -3
  64. package/dist/components/ui/concept-card.js +179 -61
  65. package/dist/components/ui/data-table.cjs +129 -3
  66. package/dist/components/ui/data-table.d.cts +1 -1
  67. package/dist/components/ui/data-table.d.ts +1 -1
  68. package/dist/components/ui/data-table.js +130 -4
  69. package/dist/components/ui/dialog.cjs +0 -2
  70. package/dist/components/ui/dialog.d.cts +2 -3
  71. package/dist/components/ui/dialog.d.ts +2 -3
  72. package/dist/components/ui/dialog.js +0 -2
  73. package/dist/components/ui/dropdown-menu.cjs +0 -2
  74. package/dist/components/ui/dropdown-menu.d.cts +15 -16
  75. package/dist/components/ui/dropdown-menu.d.ts +15 -16
  76. package/dist/components/ui/dropdown-menu.js +0 -2
  77. package/dist/components/ui/filter-provider.cjs +0 -2
  78. package/dist/components/ui/filter-provider.d.cts +1 -2
  79. package/dist/components/ui/filter-provider.d.ts +1 -2
  80. package/dist/components/ui/filter-provider.js +0 -2
  81. package/dist/components/ui/form.cjs +0 -2
  82. package/dist/components/ui/form.d.cts +7 -8
  83. package/dist/components/ui/form.d.ts +7 -8
  84. package/dist/components/ui/form.js +0 -2
  85. package/dist/components/ui/input.cjs +0 -2
  86. package/dist/components/ui/input.js +0 -2
  87. package/dist/components/ui/iran-province-heat.cjs +1 -3
  88. package/dist/components/ui/iran-province-heat.d.cts +1 -1
  89. package/dist/components/ui/iran-province-heat.d.ts +1 -1
  90. package/dist/components/ui/iran-province-heat.js +1 -3
  91. package/dist/components/ui/label.cjs +0 -2
  92. package/dist/components/ui/label.d.cts +1 -2
  93. package/dist/components/ui/label.d.ts +1 -2
  94. package/dist/components/ui/label.js +0 -2
  95. package/dist/components/ui/page-card.cjs +170 -33
  96. package/dist/components/ui/page-card.d.cts +3 -3
  97. package/dist/components/ui/page-card.d.ts +3 -3
  98. package/dist/components/ui/page-card.js +170 -33
  99. package/dist/components/ui/page-header.cjs +128 -2
  100. package/dist/components/ui/page-header.d.cts +1 -1
  101. package/dist/components/ui/page-header.d.ts +1 -1
  102. package/dist/components/ui/page-header.js +128 -2
  103. package/dist/components/ui/password-input.cjs +0 -2
  104. package/dist/components/ui/password-input.js +0 -2
  105. package/dist/components/ui/popover.cjs +0 -2
  106. package/dist/components/ui/popover.js +0 -2
  107. package/dist/components/ui/progress.cjs +1 -3
  108. package/dist/components/ui/progress.js +1 -3
  109. package/dist/components/ui/radio-card.cjs +0 -2
  110. package/dist/components/ui/radio-card.js +0 -2
  111. package/dist/components/ui/radio-group.cjs +0 -2
  112. package/dist/components/ui/radio-group.js +0 -2
  113. package/dist/components/ui/saved-query-card.cjs +0 -2
  114. package/dist/components/ui/saved-query-card.d.cts +1 -1
  115. package/dist/components/ui/saved-query-card.d.ts +1 -1
  116. package/dist/components/ui/saved-query-card.js +1 -3
  117. package/dist/components/ui/scroll-area.cjs +0 -2
  118. package/dist/components/ui/scroll-area.d.cts +2 -3
  119. package/dist/components/ui/scroll-area.d.ts +2 -3
  120. package/dist/components/ui/scroll-area.js +0 -2
  121. package/dist/components/ui/select.cjs +0 -2
  122. package/dist/components/ui/select.d.cts +1 -2
  123. package/dist/components/ui/select.d.ts +1 -2
  124. package/dist/components/ui/select.js +0 -2
  125. package/dist/components/ui/separator.cjs +0 -2
  126. package/dist/components/ui/separator.js +0 -2
  127. package/dist/components/ui/sheet.cjs +0 -2
  128. package/dist/components/ui/sheet.d.cts +9 -10
  129. package/dist/components/ui/sheet.d.ts +9 -10
  130. package/dist/components/ui/sheet.js +0 -2
  131. package/dist/components/ui/skeleton.cjs +0 -2
  132. package/dist/components/ui/skeleton.d.cts +8 -9
  133. package/dist/components/ui/skeleton.d.ts +8 -9
  134. package/dist/components/ui/skeleton.js +0 -2
  135. package/dist/components/ui/slider.cjs +0 -2
  136. package/dist/components/ui/slider.d.cts +1 -2
  137. package/dist/components/ui/slider.d.ts +1 -2
  138. package/dist/components/ui/slider.js +0 -2
  139. package/dist/components/ui/social-platform-badge.cjs +0 -2
  140. package/dist/components/ui/social-platform-badge.js +1 -3
  141. package/dist/components/ui/sonner.cjs +4 -6
  142. package/dist/components/ui/sonner.d.cts +2 -2
  143. package/dist/components/ui/sonner.d.ts +2 -2
  144. package/dist/components/ui/sonner.js +4 -6
  145. package/dist/components/ui/sparkline.cjs +3 -5
  146. package/dist/components/ui/sparkline.d.cts +1 -1
  147. package/dist/components/ui/sparkline.d.ts +1 -1
  148. package/dist/components/ui/sparkline.js +3 -5
  149. package/dist/components/ui/switch.cjs +0 -2
  150. package/dist/components/ui/switch.d.cts +1 -1
  151. package/dist/components/ui/switch.d.ts +1 -1
  152. package/dist/components/ui/switch.js +0 -2
  153. package/dist/components/ui/table.cjs +0 -2
  154. package/dist/components/ui/table.d.cts +9 -10
  155. package/dist/components/ui/table.d.ts +9 -10
  156. package/dist/components/ui/table.js +0 -2
  157. package/dist/components/ui/tabs.cjs +0 -2
  158. package/dist/components/ui/tabs.js +0 -2
  159. package/dist/components/ui/textarea.cjs +0 -2
  160. package/dist/components/ui/textarea.js +0 -2
  161. package/dist/components/ui/toggle-group.cjs +0 -2
  162. package/dist/components/ui/toggle-group.d.cts +1 -2
  163. package/dist/components/ui/toggle-group.d.ts +1 -2
  164. package/dist/components/ui/toggle-group.js +0 -2
  165. package/dist/components/ui/tooltip.cjs +0 -2
  166. package/dist/components/ui/tooltip.js +0 -2
  167. package/dist/{concept-card-BoJ5gIJD.d.ts → concept-card-BU8JL-gj.d.cts} +5 -5
  168. package/dist/{concept-card-BXra9mr0.d.cts → concept-card-D7PfDkNR.d.ts} +5 -5
  169. package/dist/hooks/use-hotkey-registry.cjs +0 -2
  170. package/dist/hooks/use-hotkey-registry.d.cts +1 -2
  171. package/dist/hooks/use-hotkey-registry.d.ts +1 -2
  172. package/dist/hooks/use-hotkey-registry.js +0 -2
  173. package/dist/hooks/use-hotkeys.cjs +0 -2
  174. package/dist/hooks/use-hotkeys.js +0 -2
  175. package/dist/{i18n-BfRhV5aw.d.cts → i18n-DD3DMY8O.d.cts} +94 -5
  176. package/dist/{i18n-ewyqbKM-.d.ts → i18n-UEClNsBy.d.ts} +94 -5
  177. package/dist/index.cjs +1242 -1173
  178. package/dist/index.css +8010 -5459
  179. package/dist/index.d.cts +212 -991
  180. package/dist/index.d.ts +212 -991
  181. package/dist/index.js +1208 -1153
  182. package/dist/{page-card-C9XXXOVr.d.cts → page-card-DjztZrFM.d.cts} +4 -4
  183. package/dist/{page-card-DAnbez_f.d.ts → page-card-sIE4lvnb.d.ts} +4 -4
  184. package/dist/server-FTUA8opZ.d.cts +829 -0
  185. package/dist/server-m6tiB6DB.d.ts +829 -0
  186. package/dist/server.cjs +1565 -0
  187. package/dist/server.d.cts +8 -0
  188. package/dist/server.d.ts +8 -0
  189. package/dist/server.js +1483 -0
  190. package/dist/theme.css +50 -0
  191. package/dist/{toggle-group-B8r4LOQw.d.cts → toggle-group-Bis6suuR.d.cts} +3 -4
  192. package/dist/{toggle-group-B8r4LOQw.d.ts → toggle-group-Bis6suuR.d.ts} +3 -4
  193. package/dist/{utils-DlXWmDZ-.d.cts → utils-Czyp5Ned.d.cts} +1 -1
  194. package/dist/{utils-DlXWmDZ-.d.ts → utils-Czyp5Ned.d.ts} +1 -1
  195. package/package.json +455 -187
  196. package/tailwind.config.ts +184 -183
  197. package/dist/components/brand/parto-logo.cjs.map +0 -1
  198. package/dist/components/brand/parto-logo.js.map +0 -1
  199. package/dist/components/charts/PartoAreaChart.cjs.map +0 -1
  200. package/dist/components/charts/PartoAreaChart.js.map +0 -1
  201. package/dist/components/charts/PartoBarChart.cjs.map +0 -1
  202. package/dist/components/charts/PartoBarChart.js.map +0 -1
  203. package/dist/components/charts/PartoLineChart.cjs.map +0 -1
  204. package/dist/components/charts/PartoLineChart.js.map +0 -1
  205. package/dist/components/charts/PartoPieChart.cjs.map +0 -1
  206. package/dist/components/charts/PartoPieChart.js.map +0 -1
  207. package/dist/components/ui/accordion.cjs.map +0 -1
  208. package/dist/components/ui/accordion.js.map +0 -1
  209. package/dist/components/ui/alert-dialog.cjs.map +0 -1
  210. package/dist/components/ui/alert-dialog.js.map +0 -1
  211. package/dist/components/ui/alert-rule-card.cjs.map +0 -1
  212. package/dist/components/ui/alert-rule-card.js.map +0 -1
  213. package/dist/components/ui/alert.cjs.map +0 -1
  214. package/dist/components/ui/alert.js.map +0 -1
  215. package/dist/components/ui/app-bar.cjs.map +0 -1
  216. package/dist/components/ui/app-bar.js.map +0 -1
  217. package/dist/components/ui/avatar.cjs.map +0 -1
  218. package/dist/components/ui/avatar.js.map +0 -1
  219. package/dist/components/ui/badge.cjs.map +0 -1
  220. package/dist/components/ui/badge.js.map +0 -1
  221. package/dist/components/ui/breadcrumb.cjs.map +0 -1
  222. package/dist/components/ui/breadcrumb.js.map +0 -1
  223. package/dist/components/ui/button.cjs.map +0 -1
  224. package/dist/components/ui/button.js.map +0 -1
  225. package/dist/components/ui/calendar.cjs.map +0 -1
  226. package/dist/components/ui/calendar.js.map +0 -1
  227. package/dist/components/ui/card.cjs.map +0 -1
  228. package/dist/components/ui/card.js.map +0 -1
  229. package/dist/components/ui/checkbox.cjs.map +0 -1
  230. package/dist/components/ui/checkbox.js.map +0 -1
  231. package/dist/components/ui/concept-card.cjs.map +0 -1
  232. package/dist/components/ui/concept-card.js.map +0 -1
  233. package/dist/components/ui/data-table.cjs.map +0 -1
  234. package/dist/components/ui/data-table.js.map +0 -1
  235. package/dist/components/ui/dialog.cjs.map +0 -1
  236. package/dist/components/ui/dialog.js.map +0 -1
  237. package/dist/components/ui/dropdown-menu.cjs.map +0 -1
  238. package/dist/components/ui/dropdown-menu.js.map +0 -1
  239. package/dist/components/ui/filter-provider.cjs.map +0 -1
  240. package/dist/components/ui/filter-provider.js.map +0 -1
  241. package/dist/components/ui/form.cjs.map +0 -1
  242. package/dist/components/ui/form.js.map +0 -1
  243. package/dist/components/ui/input.cjs.map +0 -1
  244. package/dist/components/ui/input.js.map +0 -1
  245. package/dist/components/ui/iran-province-heat.cjs.map +0 -1
  246. package/dist/components/ui/iran-province-heat.js.map +0 -1
  247. package/dist/components/ui/label.cjs.map +0 -1
  248. package/dist/components/ui/label.js.map +0 -1
  249. package/dist/components/ui/page-card.cjs.map +0 -1
  250. package/dist/components/ui/page-card.js.map +0 -1
  251. package/dist/components/ui/page-header.cjs.map +0 -1
  252. package/dist/components/ui/page-header.js.map +0 -1
  253. package/dist/components/ui/password-input.cjs.map +0 -1
  254. package/dist/components/ui/password-input.js.map +0 -1
  255. package/dist/components/ui/popover.cjs.map +0 -1
  256. package/dist/components/ui/popover.js.map +0 -1
  257. package/dist/components/ui/progress.cjs.map +0 -1
  258. package/dist/components/ui/progress.js.map +0 -1
  259. package/dist/components/ui/radio-card.cjs.map +0 -1
  260. package/dist/components/ui/radio-card.js.map +0 -1
  261. package/dist/components/ui/radio-group.cjs.map +0 -1
  262. package/dist/components/ui/radio-group.js.map +0 -1
  263. package/dist/components/ui/saved-query-card.cjs.map +0 -1
  264. package/dist/components/ui/saved-query-card.js.map +0 -1
  265. package/dist/components/ui/scroll-area.cjs.map +0 -1
  266. package/dist/components/ui/scroll-area.js.map +0 -1
  267. package/dist/components/ui/select.cjs.map +0 -1
  268. package/dist/components/ui/select.js.map +0 -1
  269. package/dist/components/ui/separator.cjs.map +0 -1
  270. package/dist/components/ui/separator.js.map +0 -1
  271. package/dist/components/ui/sheet.cjs.map +0 -1
  272. package/dist/components/ui/sheet.js.map +0 -1
  273. package/dist/components/ui/skeleton.cjs.map +0 -1
  274. package/dist/components/ui/skeleton.js.map +0 -1
  275. package/dist/components/ui/slider.cjs.map +0 -1
  276. package/dist/components/ui/slider.js.map +0 -1
  277. package/dist/components/ui/social-platform-badge.cjs.map +0 -1
  278. package/dist/components/ui/social-platform-badge.js.map +0 -1
  279. package/dist/components/ui/sonner.cjs.map +0 -1
  280. package/dist/components/ui/sonner.js.map +0 -1
  281. package/dist/components/ui/sparkline.cjs.map +0 -1
  282. package/dist/components/ui/sparkline.js.map +0 -1
  283. package/dist/components/ui/switch.cjs.map +0 -1
  284. package/dist/components/ui/switch.js.map +0 -1
  285. package/dist/components/ui/table.cjs.map +0 -1
  286. package/dist/components/ui/table.js.map +0 -1
  287. package/dist/components/ui/tabs.cjs.map +0 -1
  288. package/dist/components/ui/tabs.js.map +0 -1
  289. package/dist/components/ui/textarea.cjs.map +0 -1
  290. package/dist/components/ui/textarea.js.map +0 -1
  291. package/dist/components/ui/toggle-group.cjs.map +0 -1
  292. package/dist/components/ui/toggle-group.js.map +0 -1
  293. package/dist/components/ui/tooltip.cjs.map +0 -1
  294. package/dist/components/ui/tooltip.js.map +0 -1
  295. package/dist/hooks/use-hotkey-registry.cjs.map +0 -1
  296. package/dist/hooks/use-hotkey-registry.js.map +0 -1
  297. package/dist/hooks/use-hotkeys.cjs.map +0 -1
  298. package/dist/hooks/use-hotkeys.js.map +0 -1
  299. package/dist/index.cjs.map +0 -1
  300. package/dist/index.js.map +0 -1
@@ -32,274 +32,275 @@ const config: Config = {
32
32
  colors: {
33
33
  // Supabase Design System - Background Colors
34
34
  background: {
35
- DEFAULT: 'hsl(var(--background-default))',
36
- 200: 'hsl(var(--background-200))',
35
+ DEFAULT: 'var(--background-default)',
36
+ 200: 'var(--background-200)',
37
37
  alternative: {
38
- DEFAULT: 'hsl(var(--background-alternative-default))',
39
- 200: 'hsl(var(--background-alternative-200))',
38
+ DEFAULT: 'var(--background-alternative-default)',
39
+ 200: 'var(--background-alternative-200)',
40
40
  },
41
- selection: 'hsl(var(--background-selection))',
42
- control: 'hsl(var(--background-control))',
41
+ selection: 'var(--background-selection)',
42
+ control: 'var(--background-control)',
43
43
  surface: {
44
- 75: 'hsl(var(--background-surface-75))',
45
- 100: 'hsl(var(--background-surface-100))',
46
- 200: 'hsl(var(--background-surface-200))',
47
- 300: 'hsl(var(--background-surface-300))',
48
- 400: 'hsl(var(--background-surface-400))',
44
+ 75: 'var(--background-surface-75)',
45
+ 100: 'var(--background-surface-100)',
46
+ 200: 'var(--background-surface-200)',
47
+ 300: 'var(--background-surface-300)',
48
+ 400: 'var(--background-surface-400)',
49
49
  },
50
50
  overlay: {
51
- DEFAULT: 'hsl(var(--background-overlay-default))',
52
- hover: 'hsl(var(--background-overlay-hover))',
51
+ DEFAULT: 'var(--background-overlay-default)',
52
+ hover: 'var(--background-overlay-hover)',
53
53
  },
54
- muted: 'hsl(var(--background-muted))',
54
+ muted: 'var(--background-muted)',
55
55
  button: {
56
- DEFAULT: 'hsl(var(--background-button-default))',
56
+ DEFAULT: 'var(--background-button-default)',
57
57
  },
58
58
  dialog: {
59
- DEFAULT: 'hsl(var(--background-dialog-default))',
59
+ DEFAULT: 'var(--background-dialog-default)',
60
60
  },
61
61
  dash: {
62
- sidebar: 'hsl(var(--background-sidebar))',
63
- canvas: 'hsl(var(--background-canvas))',
62
+ sidebar: 'var(--background-sidebar)',
63
+ canvas: 'var(--background-canvas)',
64
64
  },
65
65
  },
66
66
  // Shorthand background colors for Supabase compatibility
67
- alternative: 'hsl(var(--background-alternative-default))',
68
- selection: 'hsl(var(--background-selection))',
67
+ alternative: 'var(--background-alternative-default)',
68
+ selection: 'var(--background-selection)',
69
69
  overlay: {
70
- DEFAULT: 'hsl(var(--background-overlay-default))',
71
- hover: 'hsl(var(--background-overlay-hover))',
70
+ DEFAULT: 'var(--background-overlay-default)',
71
+ hover: 'var(--background-overlay-hover)',
72
72
  },
73
73
 
74
74
  // Supabase Design System - Foreground Colors
75
75
  foreground: {
76
- DEFAULT: 'hsl(var(--foreground-default))',
77
- light: 'hsl(var(--foreground-light))',
78
- lighter: 'hsl(var(--foreground-lighter))',
79
- muted: 'hsl(var(--foreground-muted))',
80
- contrast: 'hsl(var(--foreground-contrast))',
76
+ DEFAULT: 'var(--foreground-default)',
77
+ light: 'var(--foreground-light)',
78
+ lighter: 'var(--foreground-lighter)',
79
+ muted: 'var(--foreground-muted)',
80
+ contrast: 'var(--foreground-contrast)',
81
81
  },
82
82
 
83
83
  // On-color foreground tokens — pair with bg-brand / bg-warning /
84
84
  // bg-destructive to guarantee WCAG AA. See foundations/colors.mdx.
85
85
  // Enables `text-on-brand`, `hover:text-on-brand`, etc. as full Tailwind utilities.
86
- 'on-brand': 'hsl(var(--on-brand))',
87
- 'on-warning': 'hsl(var(--on-warning))',
88
- 'on-destructive': 'hsl(var(--on-destructive))',
89
- 'on-info': 'hsl(var(--on-info))',
90
- 'on-success': 'hsl(var(--on-success))',
86
+ 'on-brand': 'var(--on-brand)',
87
+ 'on-warning': 'var(--on-warning)',
88
+ 'on-destructive': 'var(--on-destructive)',
89
+ 'on-info': 'var(--on-info)',
90
+ 'on-success': 'var(--on-success)',
91
91
 
92
92
  // Supabase Design System - Border Colors
93
93
  border: {
94
- DEFAULT: 'hsl(var(--border-default))',
95
- muted: 'hsl(var(--border-muted))',
96
- secondary: 'hsl(var(--border-secondary))',
97
- overlay: 'hsl(var(--border-overlay))',
98
- control: 'hsl(var(--border-control))',
99
- alternative: 'hsl(var(--border-alternative))',
100
- strong: 'hsl(var(--border-strong))',
101
- stronger: 'hsl(var(--border-stronger))',
94
+ DEFAULT: 'var(--border-default)',
95
+ muted: 'var(--border-muted)',
96
+ secondary: 'var(--border-secondary)',
97
+ overlay: 'var(--border-overlay)',
98
+ control: 'var(--border-control)',
99
+ alternative: 'var(--border-alternative)',
100
+ strong: 'var(--border-strong)',
101
+ stronger: 'var(--border-stronger)',
102
102
  button: {
103
- DEFAULT: 'hsl(var(--border-button-default))',
104
- hover: 'hsl(var(--border-button-hover))',
103
+ DEFAULT: 'var(--border-button-default)',
104
+ hover: 'var(--border-button-hover)',
105
105
  },
106
106
  },
107
107
  // Shorthand border colors for Supabase compatibility
108
- strong: 'hsl(var(--border-strong))',
109
- stronger: 'hsl(var(--border-stronger))',
108
+ strong: 'var(--border-strong)',
109
+ stronger: 'var(--border-stronger)',
110
110
 
111
111
  // Supabase Design System - Brand Colors
112
112
  brand: {
113
- DEFAULT: 'hsl(var(--brand-default))',
114
- 200: 'hsl(var(--brand-200))',
115
- 300: 'hsl(var(--brand-300))',
116
- 400: 'hsl(var(--brand-400))',
117
- 500: 'hsl(var(--brand-500))',
118
- 600: 'hsl(var(--brand-600))',
119
- link: 'hsl(var(--brand-link))',
113
+ DEFAULT: 'var(--brand-default)',
114
+ 200: 'var(--brand-200)',
115
+ 300: 'var(--brand-300)',
116
+ 400: 'var(--brand-400)',
117
+ 500: 'var(--brand-500)',
118
+ 600: 'var(--brand-600)',
119
+ link: 'var(--brand-link)',
120
120
  },
121
121
 
122
122
  // Supabase Design System - Warning Colors
123
123
  warning: {
124
- DEFAULT: 'hsl(var(--warning-default))',
125
- 200: 'hsl(var(--warning-200))',
126
- 300: 'hsl(var(--warning-300))',
127
- 400: 'hsl(var(--warning-400))',
128
- 500: 'hsl(var(--warning-500))',
129
- 600: 'hsl(var(--warning-600))',
124
+ DEFAULT: 'var(--warning-default)',
125
+ 200: 'var(--warning-200)',
126
+ 300: 'var(--warning-300)',
127
+ 400: 'var(--warning-400)',
128
+ 500: 'var(--warning-500)',
129
+ 600: 'var(--warning-600)',
130
130
  },
131
131
 
132
132
  // Supabase Design System - Destructive Colors
133
133
  destructive: {
134
- DEFAULT: 'hsl(var(--destructive-default))',
135
- 200: 'hsl(var(--destructive-200))',
136
- 300: 'hsl(var(--destructive-300))',
137
- 400: 'hsl(var(--destructive-400))',
138
- 500: 'hsl(var(--destructive-500))',
139
- 600: 'hsl(var(--destructive-600))',
140
- foreground: 'hsl(var(--destructive-600))',
134
+ DEFAULT: 'var(--destructive-default)',
135
+ 200: 'var(--destructive-200)',
136
+ 300: 'var(--destructive-300)',
137
+ 400: 'var(--destructive-400)',
138
+ 500: 'var(--destructive-500)',
139
+ 600: 'var(--destructive-600)',
140
+ foreground: 'var(--destructive-600)',
141
141
  },
142
142
 
143
143
  // Info (blue) — loading / in-progress / informational states. Added 1.1.15.
144
144
  info: {
145
- DEFAULT: 'hsl(var(--info-default))',
146
- 200: 'hsl(var(--info-200))',
147
- 300: 'hsl(var(--info-300))',
148
- 400: 'hsl(var(--info-400))',
149
- 500: 'hsl(var(--info-500))',
150
- 600: 'hsl(var(--info-600))',
145
+ DEFAULT: 'var(--info-default)',
146
+ 200: 'var(--info-200)',
147
+ 300: 'var(--info-300)',
148
+ 400: 'var(--info-400)',
149
+ 500: 'var(--info-500)',
150
+ 600: 'var(--info-600)',
151
151
  },
152
152
 
153
153
  // Success (green) — completed / confirmed states. Distinct from brand teal. Added 1.1.15.
154
154
  success: {
155
- DEFAULT: 'hsl(var(--success-default))',
156
- 200: 'hsl(var(--success-200))',
157
- 300: 'hsl(var(--success-300))',
158
- 400: 'hsl(var(--success-400))',
159
- 500: 'hsl(var(--success-500))',
160
- 600: 'hsl(var(--success-600))',
155
+ DEFAULT: 'var(--success-default)',
156
+ 200: 'var(--success-200)',
157
+ 300: 'var(--success-300)',
158
+ 400: 'var(--success-400)',
159
+ 500: 'var(--success-500)',
160
+ 600: 'var(--success-600)',
161
161
  },
162
162
 
163
163
  // Supabase Design System - Secondary Colors
164
164
  secondary: {
165
- DEFAULT: 'hsl(var(--secondary-default))',
166
- 200: 'hsl(var(--secondary-200))',
167
- 400: 'hsl(var(--secondary-400))',
168
- foreground: 'hsl(var(--foreground-default))',
165
+ DEFAULT: 'var(--secondary-default)',
166
+ 200: 'var(--secondary-200)',
167
+ 400: 'var(--secondary-400)',
168
+ foreground: 'var(--foreground-default)',
169
169
  },
170
170
 
171
171
  // Supabase Design System - Code Block Colors
172
172
  'code-block': {
173
- 1: 'hsl(var(--code-block-1))',
174
- 2: 'hsl(var(--code-block-2))',
175
- 3: 'hsl(var(--code-block-3))',
176
- 4: 'hsl(var(--code-block-4))',
177
- 5: 'hsl(var(--code-block-5))',
173
+ 1: 'var(--code-block-1)',
174
+ 2: 'var(--code-block-2)',
175
+ 3: 'var(--code-block-3)',
176
+ 4: 'var(--code-block-4)',
177
+ 5: 'var(--code-block-5)',
178
178
  },
179
179
 
180
180
  // Engagement Rate Tier Colors (social listening domain)
181
181
  engagement: {
182
- excellent: 'hsl(var(--engagement-excellent))',
183
- 'excellent-hover': 'hsl(var(--engagement-excellent-hover))',
184
- 'very-good': 'hsl(var(--engagement-very-good))',
185
- 'very-good-hover': 'hsl(var(--engagement-very-good-hover))',
186
- good: 'hsl(var(--engagement-good))',
187
- 'good-hover': 'hsl(var(--engagement-good-hover))',
188
- average: 'hsl(var(--engagement-average))',
189
- 'average-hover': 'hsl(var(--engagement-average-hover))',
190
- low: 'hsl(var(--engagement-low))',
191
- 'low-hover': 'hsl(var(--engagement-low-hover))',
192
- poor: 'hsl(var(--engagement-poor))',
193
- 'poor-hover': 'hsl(var(--engagement-poor-hover))',
194
- inactive: 'hsl(var(--engagement-inactive))',
182
+ excellent: 'var(--engagement-excellent)',
183
+ 'excellent-hover': 'var(--engagement-excellent-hover)',
184
+ 'very-good': 'var(--engagement-very-good)',
185
+ 'very-good-hover': 'var(--engagement-very-good-hover)',
186
+ good: 'var(--engagement-good)',
187
+ 'good-hover': 'var(--engagement-good-hover)',
188
+ average: 'var(--engagement-average)',
189
+ 'average-hover': 'var(--engagement-average-hover)',
190
+ low: 'var(--engagement-low)',
191
+ 'low-hover': 'var(--engagement-low-hover)',
192
+ poor: 'var(--engagement-poor)',
193
+ 'poor-hover': 'var(--engagement-poor-hover)',
194
+ inactive: 'var(--engagement-inactive)',
195
195
  },
196
196
  // Sentiment Colors — simple 3-class (social listening domain)
197
197
  sentiment: {
198
- positive: 'hsl(var(--sentiment-positive))',
199
- negative: 'hsl(var(--sentiment-negative))',
200
- neutral: 'hsl(var(--sentiment-neutral))',
201
- mixed: 'hsl(var(--sentiment-mixed))',
198
+ positive: 'var(--sentiment-positive)',
199
+ negative: 'var(--sentiment-negative)',
200
+ neutral: 'var(--sentiment-neutral)',
201
+ mixed: 'var(--sentiment-mixed)',
202
202
  },
203
203
  // Emotion Colors — advanced 9-class (افکارسنجی domain)
204
204
  emotion: {
205
- anger: 'hsl(var(--emotion-anger))',
206
- anticipation: 'hsl(var(--emotion-anticipation))',
207
- joy: 'hsl(var(--emotion-joy))',
208
- trust: 'hsl(var(--emotion-trust))',
209
- fear: 'hsl(var(--emotion-fear))',
210
- surprise: 'hsl(var(--emotion-surprise))',
211
- sadness: 'hsl(var(--emotion-sadness))',
212
- disgust: 'hsl(var(--emotion-disgust))',
213
- neutral: 'hsl(var(--emotion-neutral))',
214
- },
215
- // Political Flow Colors — 5-class (افکارسنجی clustering)
205
+ anger: 'var(--emotion-anger)',
206
+ anticipation: 'var(--emotion-anticipation)',
207
+ joy: 'var(--emotion-joy)',
208
+ trust: 'var(--emotion-trust)',
209
+ fear: 'var(--emotion-fear)',
210
+ surprise: 'var(--emotion-surprise)',
211
+ sadness: 'var(--emotion-sadness)',
212
+ disgust: 'var(--emotion-disgust)',
213
+ neutral: 'var(--emotion-neutral)',
214
+ },
215
+ // Audience Stance Colors — 5-class (افکارسنجی clustering)
216
216
  flow: {
217
- 'pro-gov': 'hsl(var(--flow-pro-gov))',
218
- 'internal-critic': 'hsl(var(--flow-internal-critic))',
219
- 'internal-opponent': 'hsl(var(--flow-internal-opponent))',
220
- 'external-opponent': 'hsl(var(--flow-external-opponent))',
221
- grey: 'hsl(var(--flow-grey))',
217
+ 'pro-gov': 'var(--flow-pro-gov)',
218
+ 'internal-critic': 'var(--flow-internal-critic)',
219
+ 'internal-opponent': 'var(--flow-internal-opponent)',
220
+ 'external-opponent': 'var(--flow-external-opponent)',
221
+ grey: 'var(--flow-grey)',
222
222
  },
223
223
  // Operational status indicator (often pulsed for critical)
224
224
  status: {
225
- critical: 'hsl(var(--status-critical))',
226
- warning: 'hsl(var(--status-warning))',
227
- normal: 'hsl(var(--status-normal))',
225
+ critical: 'var(--status-critical)',
226
+ warning: 'var(--status-warning)',
227
+ normal: 'var(--status-normal)',
228
228
  },
229
229
  // Severity — urgency level, independent of status
230
230
  severity: {
231
- urgent: 'hsl(var(--severity-urgent))',
232
- high: 'hsl(var(--severity-high))',
233
- medium: 'hsl(var(--severity-medium))',
234
- low: 'hsl(var(--severity-low))',
231
+ urgent: 'var(--severity-urgent)',
232
+ high: 'var(--severity-high)',
233
+ medium: 'var(--severity-medium)',
234
+ low: 'var(--severity-low)',
235
235
  },
236
236
  // Action Type — per-action colouring for booster/activity feeds
237
237
  'action-type': {
238
- like: 'hsl(var(--action-type-like))',
239
- comment: 'hsl(var(--action-type-comment))',
240
- save: 'hsl(var(--action-type-save))',
241
- follow: 'hsl(var(--action-type-follow))',
242
- unfollow: 'hsl(var(--action-type-unfollow))',
243
- dm: 'hsl(var(--action-type-dm))',
244
- share: 'hsl(var(--action-type-share))',
238
+ like: 'var(--action-type-like)',
239
+ comment: 'var(--action-type-comment)',
240
+ save: 'var(--action-type-save)',
241
+ follow: 'var(--action-type-follow)',
242
+ unfollow: 'var(--action-type-unfollow)',
243
+ dm: 'var(--action-type-dm)',
244
+ share: 'var(--action-type-share)',
245
245
  },
246
246
 
247
247
  // Legacy Shadcn compatibility aliases
248
- input: 'hsl(var(--background-control))',
249
- ring: 'hsl(var(--border-strong))',
248
+ input: 'var(--background-control)',
249
+ ring: 'var(--border-strong)',
250
250
  primary: {
251
- DEFAULT: 'hsl(var(--brand-default))',
252
- foreground: 'hsl(var(--foreground-contrast))',
251
+ DEFAULT: 'var(--brand-default)',
252
+ foreground: 'var(--foreground-contrast)',
253
253
  },
254
254
  muted: {
255
- DEFAULT: 'hsl(var(--background-muted))',
256
- foreground: 'hsl(var(--foreground-muted))',
255
+ DEFAULT: 'var(--background-muted)',
256
+ // readable secondary-text tier (AA); --foreground-muted stays the faint disabled-only tier
257
+ foreground: 'var(--foreground-lighter)',
257
258
  },
258
259
  accent: {
259
- DEFAULT: 'hsl(var(--background-surface-200))',
260
- foreground: 'hsl(var(--foreground-default))',
260
+ DEFAULT: 'var(--background-surface-200)',
261
+ foreground: 'var(--foreground-default)',
261
262
  },
262
263
  popover: {
263
- DEFAULT: 'hsl(var(--background-overlay-default))',
264
- foreground: 'hsl(var(--foreground-default))',
264
+ DEFAULT: 'var(--background-overlay-default)',
265
+ foreground: 'var(--foreground-default)',
265
266
  },
266
267
  card: {
267
- DEFAULT: 'hsl(var(--background-surface-100))',
268
- foreground: 'hsl(var(--foreground-default))',
268
+ DEFAULT: 'var(--background-surface-100)',
269
+ foreground: 'var(--foreground-default)',
269
270
  },
270
271
  // Sidebar colors - mapped to Supabase Design System tokens
271
272
  sidebar: {
272
- DEFAULT: 'hsl(var(--background-sidebar))',
273
- foreground: 'hsl(var(--foreground-default))',
274
- border: 'hsl(var(--border-muted))',
275
- ring: 'hsl(var(--brand-default))',
273
+ DEFAULT: 'var(--background-sidebar)',
274
+ foreground: 'var(--foreground-default)',
275
+ border: 'var(--border-muted)',
276
+ ring: 'var(--brand-default)',
276
277
  accent: {
277
- DEFAULT: 'hsl(var(--background-selection))',
278
- foreground: 'hsl(var(--foreground-default))',
278
+ DEFAULT: 'var(--background-selection)',
279
+ foreground: 'var(--foreground-default)',
279
280
  },
280
281
  },
281
282
  chart: {
282
- '1': 'hsl(var(--chart-1))',
283
- '2': 'hsl(var(--chart-2))',
284
- '3': 'hsl(var(--chart-3))',
285
- '4': 'hsl(var(--chart-4))',
286
- '5': 'hsl(var(--chart-5))',
287
- '6': 'hsl(var(--chart-6))',
288
- '7': 'hsl(var(--chart-7))',
289
- '8': 'hsl(var(--chart-8))',
283
+ '1': 'var(--chart-1)',
284
+ '2': 'var(--chart-2)',
285
+ '3': 'var(--chart-3)',
286
+ '4': 'var(--chart-4)',
287
+ '5': 'var(--chart-5)',
288
+ '6': 'var(--chart-6)',
289
+ '7': 'var(--chart-7)',
290
+ '8': 'var(--chart-8)',
290
291
  },
291
292
  // Generic score/quality tier colors (not domain-specific)
292
293
  score: {
293
- excellent: 'hsl(var(--score-excellent))',
294
- 'excellent-bg': 'hsl(var(--score-excellent-bg))',
295
- good: 'hsl(var(--score-good))',
296
- 'good-bg': 'hsl(var(--score-good-bg))',
297
- moderate: 'hsl(var(--score-moderate))',
298
- 'moderate-bg': 'hsl(var(--score-moderate-bg))',
299
- poor: 'hsl(var(--score-poor))',
300
- 'poor-bg': 'hsl(var(--score-poor-bg))',
301
- critical: 'hsl(var(--score-critical))',
302
- 'critical-bg': 'hsl(var(--score-critical-bg))',
294
+ excellent: 'var(--score-excellent)',
295
+ 'excellent-bg': 'var(--score-excellent-bg)',
296
+ good: 'var(--score-good)',
297
+ 'good-bg': 'var(--score-good-bg)',
298
+ moderate: 'var(--score-moderate)',
299
+ 'moderate-bg': 'var(--score-moderate-bg)',
300
+ poor: 'var(--score-poor)',
301
+ 'poor-bg': 'var(--score-poor-bg)',
302
+ critical: 'var(--score-critical)',
303
+ 'critical-bg': 'var(--score-critical-bg)',
303
304
  },
304
305
  },
305
306
  borderRadius: {
@@ -484,51 +485,51 @@ const config: Config = {
484
485
  addUtilities({
485
486
  // Background shorthands
486
487
  '.bg': {
487
- backgroundColor: 'hsl(var(--background-default))',
488
+ backgroundColor: 'var(--background-default)',
488
489
  },
489
490
  '.bg-muted': {
490
- backgroundColor: 'hsl(var(--background-muted))',
491
+ backgroundColor: 'var(--background-muted)',
491
492
  },
492
493
  '.bg-alternative': {
493
- backgroundColor: 'hsl(var(--background-alternative-default))',
494
+ backgroundColor: 'var(--background-alternative-default)',
494
495
  },
495
496
  '.bg-selection': {
496
- backgroundColor: 'hsl(var(--background-selection))',
497
+ backgroundColor: 'var(--background-selection)',
497
498
  },
498
499
  // Text shorthands
499
500
  '.text': {
500
- color: 'hsl(var(--foreground-default))',
501
+ color: 'var(--foreground-default)',
501
502
  },
502
503
  '.text-light': {
503
- color: 'hsl(var(--foreground-light))',
504
+ color: 'var(--foreground-light)',
504
505
  },
505
506
  '.text-lighter': {
506
- color: 'hsl(var(--foreground-lighter))',
507
+ color: 'var(--foreground-lighter)',
507
508
  },
508
509
  '.text-muted': {
509
- color: 'hsl(var(--foreground-muted))',
510
+ color: 'var(--foreground-muted)',
510
511
  },
511
512
  '.text-contrast': {
512
- color: 'hsl(var(--foreground-contrast))',
513
+ color: 'var(--foreground-contrast)',
513
514
  },
514
515
  // Border shorthands (override default)
515
516
  '.border': {
516
- borderColor: 'hsl(var(--border-default))',
517
+ borderColor: 'var(--border-default)',
517
518
  },
518
519
  '.border-muted': {
519
- borderColor: 'hsl(var(--border-muted))',
520
+ borderColor: 'var(--border-muted)',
520
521
  },
521
522
  '.border-strong': {
522
- borderColor: 'hsl(var(--border-strong))',
523
+ borderColor: 'var(--border-strong)',
523
524
  },
524
525
  '.border-stronger': {
525
- borderColor: 'hsl(var(--border-stronger))',
526
+ borderColor: 'var(--border-stronger)',
526
527
  },
527
528
  '.border-button': {
528
- borderColor: 'hsl(var(--border-button-default))',
529
+ borderColor: 'var(--border-button-default)',
529
530
  },
530
531
  '.border-button-hover': {
531
- borderColor: 'hsl(var(--border-button-hover))',
532
+ borderColor: 'var(--border-button-hover)',
532
533
  },
533
534
  // Font weight shorthand
534
535
  '.font-regular': {
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/lib/utils.ts","../../../src/components/brand/parto-logo.tsx"],"names":["twMerge","clsx","React","jsx","jsxs","Fragment"],"mappings":"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","file":"parto-logo.cjs","sourcesContent":["import { type ClassValue, clsx } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\nimport { formatJalaliDate } from '@/lib/jalali-utils'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\nexport type SupportedLocale = 'fa' | 'ar' | 'en'\n\n/**\n * Convert digits in a string to Persian/Arabic numerals based on locale.\n * @example convertToLocalNumbers('123', 'fa') => '۱۲۳'\n * @example convertToLocalNumbers('123', 'en') => '123'\n */\nexport function convertToLocalNumbers(text: string | number, locale: SupportedLocale): string {\n if (locale === 'fa' || locale === 'ar') {\n const persianDigits = ['۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹']\n return String(text).replace(/\\d/g, (digit) => persianDigits[parseInt(digit)])\n }\n return String(text)\n}\n\n/**\n * Format large numbers with locale-aware suffixes (K/M/B).\n * @example formatLargeNumber(1500, 'fa') => '۱.۵ هزار'\n * @example formatLargeNumber(1500, 'en') => '1.5K'\n */\nexport function formatLargeNumber(num: number, locale: SupportedLocale): string {\n if (num >= 1_000_000_000) {\n const formatted = (num / 1_000_000_000).toFixed(1).replace(/\\.0$/, '')\n return convertToLocalNumbers(formatted, locale) + (locale === 'en' ? 'B' : ' میلیارد')\n }\n if (num >= 1_000_000) {\n const formatted = (num / 1_000_000).toFixed(1).replace(/\\.0$/, '')\n return convertToLocalNumbers(formatted, locale) + (locale === 'en' ? 'M' : ' میلیون')\n }\n if (num >= 1_000) {\n const formatted = (num / 1_000).toFixed(1).replace(/\\.0$/, '')\n return convertToLocalNumbers(formatted, locale) + (locale === 'en' ? 'K' : ' هزار')\n }\n return convertToLocalNumbers(num.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ','), locale)\n}\n\n/**\n * Format number to Instagram-style short format (English only).\n * @example formatNumber(123456, 'short') => '123K'\n * @example formatNumber(123456, 'exact') => '123,456'\n */\nexport function formatNumber(num: number | undefined, format: 'exact' | 'short' = 'exact'): string {\n if (num === undefined || num === null) return '0'\n\n if (format === 'exact') {\n return num.toLocaleString('en-US')\n }\n\n // Short format (Instagram style)\n if (num >= 1_000_000_000) {\n return `${(num / 1_000_000_000).toFixed(1).replace(/\\.0$/, '')}B`\n }\n if (num >= 1_000_000) {\n return `${(num / 1_000_000).toFixed(1).replace(/\\.0$/, '')}M`\n }\n if (num >= 1_000) {\n return `${(num / 1_000).toFixed(1).replace(/\\.0$/, '')}K`\n }\n return num.toString()\n}\n\n/**\n * Format date to relative time with absolute on hover (Persian)\n * @example formatRelativeTime(new Date()) => '۲ ساعت پیش'\n */\nexport function formatRelativeTime(date: Date | string | number): string {\n const now = new Date()\n const then = new Date(date)\n const diffInSeconds = Math.floor((now.getTime() - then.getTime()) / 1000)\n\n if (diffInSeconds < 60) {\n return 'همین الان'\n }\n\n const diffInMinutes = Math.floor(diffInSeconds / 60)\n if (diffInMinutes < 60) {\n return `${convertToLocalNumbers(diffInMinutes, 'fa')} دقیقه پیش`\n }\n\n const diffInHours = Math.floor(diffInMinutes / 60)\n if (diffInHours < 24) {\n return `${convertToLocalNumbers(diffInHours, 'fa')} ساعت پیش`\n }\n\n const diffInDays = Math.floor(diffInHours / 24)\n if (diffInDays < 7) {\n return `${convertToLocalNumbers(diffInDays, 'fa')} روز پیش`\n }\n\n const diffInWeeks = Math.floor(diffInDays / 7)\n if (diffInWeeks < 4) {\n return `${convertToLocalNumbers(diffInWeeks, 'fa')} هفته پیش`\n }\n\n const diffInMonths = Math.floor(diffInDays / 30)\n if (diffInMonths < 12) {\n return `${convertToLocalNumbers(diffInMonths, 'fa')} ماه پیش`\n }\n\n const diffInYears = Math.floor(diffInDays / 365)\n return `${convertToLocalNumbers(diffInYears, 'fa')} سال پیش`\n}\n\n/**\n * Format date to absolute format (Persian / Jalali)\n * Uses date-fns-jalali for accurate Jalali conversion.\n * @example formatAbsoluteTime(new Date()) => '۱۵ دی ۱۴۰۳، ۱۵:۳۰'\n */\nexport function formatAbsoluteTime(date: Date | string | number): string {\n const d = new Date(date)\n return formatJalaliDate(d, 'd MMMM yyyy، HH:mm')\n}\n","import * as React from 'react'\nimport { cn } from '@/lib/utils'\n\n/**\n * Parto brand logo. Every Parto product surfaces this in its header / login /\n * empty-state / about screens so the brand stays visible while individual\n * product names live alongside it.\n *\n * Variants:\n * - `icon` — the 75×75 brand mark (three triangular shapes). Uses the DS\n * brand color by default (`text-brand`) but accepts any\n * `className` overrides for one-off accents.\n * - `logotype` — the \"پرتو\" Persian wordmark. Uses `currentColor` so it\n * inherits the parent's text color (works in both light\n * and dark themes).\n * - `combined` — icon + wordmark side-by-side. The recommended default\n * for headers and login pages.\n *\n * The SVGs are inlined here (kept tiny — under 1KB each) so consumers don't\n * have to copy logo files into `public/` and the component renders as plain\n * markup with no extra network requests.\n */\n\ntype Variant = 'icon' | 'logotype' | 'combined'\n\ninterface PartoLogoProps extends React.HTMLAttributes<HTMLSpanElement> {\n variant?: Variant\n /**\n * Height in pixels (icon-only) or wordmark height (logotype/combined).\n * Width auto-scales to preserve aspect ratio.\n */\n size?: number\n /**\n * Set to a Persian product name to render as `پرتو | <name>` next to the\n * logo. Skip for marketing surfaces where only the brand should appear.\n */\n productName?: string\n}\n\nconst IconSvg = React.forwardRef<SVGSVGElement, { size: number; className?: string }>(({ size, className }, ref) => (\n <svg\n ref={ref}\n viewBox=\"0 0 75 75\"\n width={size}\n height={size}\n role=\"img\"\n aria-label=\"Parto\"\n data-slot=\"parto-logo-icon\"\n className={cn('text-brand', className)}\n >\n <g fill=\"currentColor\">\n <polygon points=\"75 0 0 0 0 25 75 0\" />\n <polygon points=\"75 75 50 75 75 0 75 75\" />\n <polygon points=\"75 0 25 75 0 75 0 50 75 0\" />\n </g>\n </svg>\n))\nIconSvg.displayName = 'PartoLogoIcon'\n\nconst LogotypeSvg = React.forwardRef<SVGSVGElement, { height: number; className?: string }>(\n ({ height, className }, ref) => {\n const aspectRatio = 106.03 / 48.15\n const width = Math.round(height * aspectRatio)\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 106.03 48.15\"\n width={width}\n height={height}\n role=\"img\"\n aria-label=\"پرتو\"\n data-slot=\"parto-logo-logotype\"\n className={cn('text-foreground', className)}\n >\n <g fill=\"currentColor\">\n <path d=\"M41.44,0v6.02h18.75V0h-18.75Z\" />\n <path d=\"M15.22,44.28H6.43l5.1-9.36.02-.04c-4.33-.08-7.61-2.21-9.19-4.14-1.58-1.94-2.36-4.57-2.36-7.9,0-4.28,1.23-7.54,3.71-9.79,2.47-2.24,6.4-3.36,11.8-3.36h18.21v19.23s11.43,0,11.43,0c2.07,0,3.64-.52,4.7-1.53,1.06-1.01,1.59-2.45,1.59-4.27v-13.43h8.74v12.74c-.06,3.2-.66,5.7-1.86,7.51-1.18,1.81-2.87,3.07-5.08,3.8-2.21.74-5.05,1.1-8.55,1.1h-19.28V15.55s-9.29,0-9.29,0c-1.82,0-3.27.19-4.33.57s-1.86,1.04-2.38,1.99c-.52.96-.77,2.35-.77,4.18v1.56c.04,1.63.28,2.89.71,3.81.43.9,1.18,1.59,2.24,2.05s2.57.69,4.52.69h6.37l-7.3,13.88Z\" />\n <path d=\"M76.86,9.56h-8.21v20.23l-7.92,14.48h8.79l4.94-9.37v-.02h16.1c3.5,0,6.34-.36,8.55-1.1,2.21-.72,3.89-1.99,5.08-3.8.22-.33.4-.66.57-1.02.82-1.69,1.24-3.86,1.28-6.49v-12.78h-8.73v13.47c0,1.82-.53,3.26-1.59,4.27-1.06,1.01-2.63,1.53-4.7,1.53h-14.15V9.56Z\" />\n <polygon points=\"97.58 38.26 81.25 38.26 81.25 44.28 91.72 44.28 91.72 48.15 97.58 48.15 97.58 38.26\" />\n </g>\n </svg>\n )\n }\n)\nLogotypeSvg.displayName = 'PartoLogoLogotype'\n\nconst PartoLogo = React.forwardRef<HTMLSpanElement, PartoLogoProps>(\n ({ variant = 'combined', size = 28, productName, className, ...props }, ref) => {\n if (variant === 'icon') {\n return (\n <span\n ref={ref}\n data-slot=\"parto-logo\"\n data-variant=\"icon\"\n className={cn('inline-flex items-center', className)}\n {...props}\n >\n <IconSvg size={size} />\n </span>\n )\n }\n\n if (variant === 'logotype') {\n return (\n <span\n ref={ref}\n data-slot=\"parto-logo\"\n data-variant=\"logotype\"\n className={cn('inline-flex items-center', className)}\n {...props}\n >\n <LogotypeSvg height={size} />\n </span>\n )\n }\n\n // combined (default): icon + wordmark, optionally followed by product name\n const iconSize = Math.round(size * 1.05)\n return (\n <span\n ref={ref}\n data-slot=\"parto-logo\"\n data-variant=\"combined\"\n className={cn('inline-flex items-center gap-2.5', className)}\n {...props}\n >\n <IconSvg size={iconSize} />\n <LogotypeSvg height={size} />\n {productName && (\n <>\n <span aria-hidden=\"true\" data-slot=\"parto-logo-divider\" className=\"h-5 w-px bg-border-stronger/60\" />\n <span data-slot=\"parto-logo-product-name\" className=\"text-foreground-light text-sm font-medium\">\n {productName}\n </span>\n </>\n )}\n </span>\n )\n }\n)\nPartoLogo.displayName = 'PartoLogo'\n\nexport { PartoLogo, type PartoLogoProps }\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/lib/utils.ts","../../../src/components/brand/parto-logo.tsx"],"names":[],"mappings":";;;;;;AAIO,SAAS,MAAM,MAAA,EAAsB;AAC1C,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;ACiCA,IAAM,UAAgB,KAAA,CAAA,UAAA,CAAgE,CAAC,EAAE,IAAA,EAAM,SAAA,IAAa,GAAA,qBAC1G,GAAA;AAAA,EAAC,KAAA;AAAA,EAAA;AAAA,IACC,GAAA;AAAA,IACA,OAAA,EAAQ,WAAA;AAAA,IACR,KAAA,EAAO,IAAA;AAAA,IACP,MAAA,EAAQ,IAAA;AAAA,IACR,IAAA,EAAK,KAAA;AAAA,IACL,YAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAU,iBAAA;AAAA,IACV,SAAA,EAAW,EAAA,CAAG,YAAA,EAAc,SAAS,CAAA;AAAA,IAErC,QAAA,kBAAA,IAAA,CAAC,GAAA,EAAA,EAAE,IAAA,EAAK,cAAA,EACN,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,SAAA,EAAA,EAAQ,QAAO,oBAAA,EAAqB,CAAA;AAAA,sBACrC,GAAA,CAAC,SAAA,EAAA,EAAQ,MAAA,EAAO,wBAAA,EAAyB,CAAA;AAAA,sBACzC,GAAA,CAAC,SAAA,EAAA,EAAQ,MAAA,EAAO,2BAAA,EAA4B;AAAA,KAAA,EAC9C;AAAA;AACF,CACD,CAAA;AACD,OAAA,CAAQ,WAAA,GAAc,eAAA;AAEtB,IAAM,WAAA,GAAoB,KAAA,CAAA,UAAA;AAAA,EACxB,CAAC,EAAE,MAAA,EAAQ,SAAA,IAAa,GAAA,KAAQ;AAC9B,IAAA,MAAM,cAAc,MAAA,GAAS,KAAA;AAC7B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,WAAW,CAAA;AAC7C,IAAA,uBACE,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,OAAA,EAAQ,kBAAA;AAAA,QACR,KAAA;AAAA,QACA,MAAA;AAAA,QACA,IAAA,EAAK,KAAA;AAAA,QACL,YAAA,EAAW,0BAAA;AAAA,QACX,WAAA,EAAU,qBAAA;AAAA,QACV,SAAA,EAAW,EAAA,CAAG,iBAAA,EAAmB,SAAS,CAAA;AAAA,QAE1C,QAAA,kBAAA,IAAA,CAAC,GAAA,EAAA,EAAE,IAAA,EAAK,cAAA,EACN,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,MAAA,EAAA,EAAK,GAAE,+BAAA,EAAgC,CAAA;AAAA,0BACxC,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,wgBAAA,EAAygB,CAAA;AAAA,0BACjhB,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,0PAAA,EAA2P,CAAA;AAAA,0BACnQ,GAAA,CAAC,SAAA,EAAA,EAAQ,MAAA,EAAO,qFAAA,EAAsF;AAAA,SAAA,EACxG;AAAA;AAAA,KACF;AAAA,EAEJ;AACF,CAAA;AACA,WAAA,CAAY,WAAA,GAAc,mBAAA;AAE1B,IAAM,SAAA,GAAkB,KAAA,CAAA,UAAA;AAAA,EACtB,CAAC,EAAE,OAAA,GAAU,UAAA,EAAY,IAAA,GAAO,EAAA,EAAI,WAAA,EAAa,SAAA,EAAW,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AAC9E,IAAA,IAAI,YAAY,MAAA,EAAQ;AACtB,MAAA,uBACE,GAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,GAAA;AAAA,UACA,WAAA,EAAU,YAAA;AAAA,UACV,cAAA,EAAa,MAAA;AAAA,UACb,SAAA,EAAW,EAAA,CAAG,0BAAA,EAA4B,SAAS,CAAA;AAAA,UAClD,GAAG,KAAA;AAAA,UAEJ,QAAA,kBAAA,GAAA,CAAC,WAAQ,IAAA,EAAY;AAAA;AAAA,OACvB;AAAA,IAEJ;AAEA,IAAA,IAAI,YAAY,UAAA,EAAY;AAC1B,MAAA,uBACE,GAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,GAAA;AAAA,UACA,WAAA,EAAU,YAAA;AAAA,UACV,cAAA,EAAa,UAAA;AAAA,UACb,SAAA,EAAW,EAAA,CAAG,0BAAA,EAA4B,SAAS,CAAA;AAAA,UAClD,GAAG,KAAA;AAAA,UAEJ,QAAA,kBAAA,GAAA,CAAC,WAAA,EAAA,EAAY,MAAA,EAAQ,IAAA,EAAM;AAAA;AAAA,OAC7B;AAAA,IAEJ;AAGA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,IAAI,CAAA;AACvC,IAAA,uBACE,IAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,WAAA,EAAU,YAAA;AAAA,QACV,cAAA,EAAa,UAAA;AAAA,QACb,SAAA,EAAW,EAAA,CAAG,kCAAA,EAAoC,SAAS,CAAA;AAAA,QAC1D,GAAG,KAAA;AAAA,QAEJ,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,OAAA,EAAA,EAAQ,MAAM,QAAA,EAAU,CAAA;AAAA,0BACzB,GAAA,CAAC,WAAA,EAAA,EAAY,MAAA,EAAQ,IAAA,EAAM,CAAA;AAAA,UAC1B,+BACC,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,UAAK,aAAA,EAAY,MAAA,EAAO,WAAA,EAAU,oBAAA,EAAqB,WAAU,gCAAA,EAAiC,CAAA;AAAA,gCAClG,MAAA,EAAA,EAAK,WAAA,EAAU,yBAAA,EAA0B,SAAA,EAAU,6CACjD,QAAA,EAAA,WAAA,EACH;AAAA,WAAA,EACF;AAAA;AAAA;AAAA,KAEJ;AAAA,EAEJ;AACF;AACA,SAAA,CAAU,WAAA,GAAc,WAAA","file":"parto-logo.js","sourcesContent":["import { type ClassValue, clsx } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\nimport { formatJalaliDate } from '@/lib/jalali-utils'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\nexport type SupportedLocale = 'fa' | 'ar' | 'en'\n\n/**\n * Convert digits in a string to Persian/Arabic numerals based on locale.\n * @example convertToLocalNumbers('123', 'fa') => '۱۲۳'\n * @example convertToLocalNumbers('123', 'en') => '123'\n */\nexport function convertToLocalNumbers(text: string | number, locale: SupportedLocale): string {\n if (locale === 'fa' || locale === 'ar') {\n const persianDigits = ['۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹']\n return String(text).replace(/\\d/g, (digit) => persianDigits[parseInt(digit)])\n }\n return String(text)\n}\n\n/**\n * Format large numbers with locale-aware suffixes (K/M/B).\n * @example formatLargeNumber(1500, 'fa') => '۱.۵ هزار'\n * @example formatLargeNumber(1500, 'en') => '1.5K'\n */\nexport function formatLargeNumber(num: number, locale: SupportedLocale): string {\n if (num >= 1_000_000_000) {\n const formatted = (num / 1_000_000_000).toFixed(1).replace(/\\.0$/, '')\n return convertToLocalNumbers(formatted, locale) + (locale === 'en' ? 'B' : ' میلیارد')\n }\n if (num >= 1_000_000) {\n const formatted = (num / 1_000_000).toFixed(1).replace(/\\.0$/, '')\n return convertToLocalNumbers(formatted, locale) + (locale === 'en' ? 'M' : ' میلیون')\n }\n if (num >= 1_000) {\n const formatted = (num / 1_000).toFixed(1).replace(/\\.0$/, '')\n return convertToLocalNumbers(formatted, locale) + (locale === 'en' ? 'K' : ' هزار')\n }\n return convertToLocalNumbers(num.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ','), locale)\n}\n\n/**\n * Format number to Instagram-style short format (English only).\n * @example formatNumber(123456, 'short') => '123K'\n * @example formatNumber(123456, 'exact') => '123,456'\n */\nexport function formatNumber(num: number | undefined, format: 'exact' | 'short' = 'exact'): string {\n if (num === undefined || num === null) return '0'\n\n if (format === 'exact') {\n return num.toLocaleString('en-US')\n }\n\n // Short format (Instagram style)\n if (num >= 1_000_000_000) {\n return `${(num / 1_000_000_000).toFixed(1).replace(/\\.0$/, '')}B`\n }\n if (num >= 1_000_000) {\n return `${(num / 1_000_000).toFixed(1).replace(/\\.0$/, '')}M`\n }\n if (num >= 1_000) {\n return `${(num / 1_000).toFixed(1).replace(/\\.0$/, '')}K`\n }\n return num.toString()\n}\n\n/**\n * Format date to relative time with absolute on hover (Persian)\n * @example formatRelativeTime(new Date()) => '۲ ساعت پیش'\n */\nexport function formatRelativeTime(date: Date | string | number): string {\n const now = new Date()\n const then = new Date(date)\n const diffInSeconds = Math.floor((now.getTime() - then.getTime()) / 1000)\n\n if (diffInSeconds < 60) {\n return 'همین الان'\n }\n\n const diffInMinutes = Math.floor(diffInSeconds / 60)\n if (diffInMinutes < 60) {\n return `${convertToLocalNumbers(diffInMinutes, 'fa')} دقیقه پیش`\n }\n\n const diffInHours = Math.floor(diffInMinutes / 60)\n if (diffInHours < 24) {\n return `${convertToLocalNumbers(diffInHours, 'fa')} ساعت پیش`\n }\n\n const diffInDays = Math.floor(diffInHours / 24)\n if (diffInDays < 7) {\n return `${convertToLocalNumbers(diffInDays, 'fa')} روز پیش`\n }\n\n const diffInWeeks = Math.floor(diffInDays / 7)\n if (diffInWeeks < 4) {\n return `${convertToLocalNumbers(diffInWeeks, 'fa')} هفته پیش`\n }\n\n const diffInMonths = Math.floor(diffInDays / 30)\n if (diffInMonths < 12) {\n return `${convertToLocalNumbers(diffInMonths, 'fa')} ماه پیش`\n }\n\n const diffInYears = Math.floor(diffInDays / 365)\n return `${convertToLocalNumbers(diffInYears, 'fa')} سال پیش`\n}\n\n/**\n * Format date to absolute format (Persian / Jalali)\n * Uses date-fns-jalali for accurate Jalali conversion.\n * @example formatAbsoluteTime(new Date()) => '۱۵ دی ۱۴۰۳، ۱۵:۳۰'\n */\nexport function formatAbsoluteTime(date: Date | string | number): string {\n const d = new Date(date)\n return formatJalaliDate(d, 'd MMMM yyyy، HH:mm')\n}\n","import * as React from 'react'\nimport { cn } from '@/lib/utils'\n\n/**\n * Parto brand logo. Every Parto product surfaces this in its header / login /\n * empty-state / about screens so the brand stays visible while individual\n * product names live alongside it.\n *\n * Variants:\n * - `icon` — the 75×75 brand mark (three triangular shapes). Uses the DS\n * brand color by default (`text-brand`) but accepts any\n * `className` overrides for one-off accents.\n * - `logotype` — the \"پرتو\" Persian wordmark. Uses `currentColor` so it\n * inherits the parent's text color (works in both light\n * and dark themes).\n * - `combined` — icon + wordmark side-by-side. The recommended default\n * for headers and login pages.\n *\n * The SVGs are inlined here (kept tiny — under 1KB each) so consumers don't\n * have to copy logo files into `public/` and the component renders as plain\n * markup with no extra network requests.\n */\n\ntype Variant = 'icon' | 'logotype' | 'combined'\n\ninterface PartoLogoProps extends React.HTMLAttributes<HTMLSpanElement> {\n variant?: Variant\n /**\n * Height in pixels (icon-only) or wordmark height (logotype/combined).\n * Width auto-scales to preserve aspect ratio.\n */\n size?: number\n /**\n * Set to a Persian product name to render as `پرتو | <name>` next to the\n * logo. Skip for marketing surfaces where only the brand should appear.\n */\n productName?: string\n}\n\nconst IconSvg = React.forwardRef<SVGSVGElement, { size: number; className?: string }>(({ size, className }, ref) => (\n <svg\n ref={ref}\n viewBox=\"0 0 75 75\"\n width={size}\n height={size}\n role=\"img\"\n aria-label=\"Parto\"\n data-slot=\"parto-logo-icon\"\n className={cn('text-brand', className)}\n >\n <g fill=\"currentColor\">\n <polygon points=\"75 0 0 0 0 25 75 0\" />\n <polygon points=\"75 75 50 75 75 0 75 75\" />\n <polygon points=\"75 0 25 75 0 75 0 50 75 0\" />\n </g>\n </svg>\n))\nIconSvg.displayName = 'PartoLogoIcon'\n\nconst LogotypeSvg = React.forwardRef<SVGSVGElement, { height: number; className?: string }>(\n ({ height, className }, ref) => {\n const aspectRatio = 106.03 / 48.15\n const width = Math.round(height * aspectRatio)\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 106.03 48.15\"\n width={width}\n height={height}\n role=\"img\"\n aria-label=\"پرتو\"\n data-slot=\"parto-logo-logotype\"\n className={cn('text-foreground', className)}\n >\n <g fill=\"currentColor\">\n <path d=\"M41.44,0v6.02h18.75V0h-18.75Z\" />\n <path d=\"M15.22,44.28H6.43l5.1-9.36.02-.04c-4.33-.08-7.61-2.21-9.19-4.14-1.58-1.94-2.36-4.57-2.36-7.9,0-4.28,1.23-7.54,3.71-9.79,2.47-2.24,6.4-3.36,11.8-3.36h18.21v19.23s11.43,0,11.43,0c2.07,0,3.64-.52,4.7-1.53,1.06-1.01,1.59-2.45,1.59-4.27v-13.43h8.74v12.74c-.06,3.2-.66,5.7-1.86,7.51-1.18,1.81-2.87,3.07-5.08,3.8-2.21.74-5.05,1.1-8.55,1.1h-19.28V15.55s-9.29,0-9.29,0c-1.82,0-3.27.19-4.33.57s-1.86,1.04-2.38,1.99c-.52.96-.77,2.35-.77,4.18v1.56c.04,1.63.28,2.89.71,3.81.43.9,1.18,1.59,2.24,2.05s2.57.69,4.52.69h6.37l-7.3,13.88Z\" />\n <path d=\"M76.86,9.56h-8.21v20.23l-7.92,14.48h8.79l4.94-9.37v-.02h16.1c3.5,0,6.34-.36,8.55-1.1,2.21-.72,3.89-1.99,5.08-3.8.22-.33.4-.66.57-1.02.82-1.69,1.24-3.86,1.28-6.49v-12.78h-8.73v13.47c0,1.82-.53,3.26-1.59,4.27-1.06,1.01-2.63,1.53-4.7,1.53h-14.15V9.56Z\" />\n <polygon points=\"97.58 38.26 81.25 38.26 81.25 44.28 91.72 44.28 91.72 48.15 97.58 48.15 97.58 38.26\" />\n </g>\n </svg>\n )\n }\n)\nLogotypeSvg.displayName = 'PartoLogoLogotype'\n\nconst PartoLogo = React.forwardRef<HTMLSpanElement, PartoLogoProps>(\n ({ variant = 'combined', size = 28, productName, className, ...props }, ref) => {\n if (variant === 'icon') {\n return (\n <span\n ref={ref}\n data-slot=\"parto-logo\"\n data-variant=\"icon\"\n className={cn('inline-flex items-center', className)}\n {...props}\n >\n <IconSvg size={size} />\n </span>\n )\n }\n\n if (variant === 'logotype') {\n return (\n <span\n ref={ref}\n data-slot=\"parto-logo\"\n data-variant=\"logotype\"\n className={cn('inline-flex items-center', className)}\n {...props}\n >\n <LogotypeSvg height={size} />\n </span>\n )\n }\n\n // combined (default): icon + wordmark, optionally followed by product name\n const iconSize = Math.round(size * 1.05)\n return (\n <span\n ref={ref}\n data-slot=\"parto-logo\"\n data-variant=\"combined\"\n className={cn('inline-flex items-center gap-2.5', className)}\n {...props}\n >\n <IconSvg size={iconSize} />\n <LogotypeSvg height={size} />\n {productName && (\n <>\n <span aria-hidden=\"true\" data-slot=\"parto-logo-divider\" className=\"h-5 w-px bg-border-stronger/60\" />\n <span data-slot=\"parto-logo-product-name\" className=\"text-foreground-light text-sm font-medium\">\n {productName}\n </span>\n </>\n )}\n </span>\n )\n }\n)\nPartoLogo.displayName = 'PartoLogo'\n\nexport { PartoLogo, type PartoLogoProps }\n"]}