@parto-system-design/ui 1.1.17 → 1.1.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +2 -2
- package/README.md +1 -1
- package/dist/components/brand/parto-logo.cjs +0 -2
- package/dist/components/brand/parto-logo.js +0 -2
- package/dist/components/charts/PartoAreaChart.cjs +2 -4
- package/dist/components/charts/PartoAreaChart.d.cts +1 -1
- package/dist/components/charts/PartoAreaChart.d.ts +1 -1
- package/dist/components/charts/PartoAreaChart.js +2 -4
- package/dist/components/charts/PartoBarChart.cjs +2 -4
- package/dist/components/charts/PartoBarChart.d.cts +1 -1
- package/dist/components/charts/PartoBarChart.d.ts +1 -1
- package/dist/components/charts/PartoBarChart.js +2 -4
- package/dist/components/charts/PartoLineChart.cjs +2 -4
- package/dist/components/charts/PartoLineChart.d.cts +1 -1
- package/dist/components/charts/PartoLineChart.d.ts +1 -1
- package/dist/components/charts/PartoLineChart.js +2 -4
- package/dist/components/charts/PartoPieChart.cjs +2 -4
- package/dist/components/charts/PartoPieChart.d.cts +1 -1
- package/dist/components/charts/PartoPieChart.d.ts +1 -1
- package/dist/components/charts/PartoPieChart.js +2 -4
- package/dist/components/ui/accordion.cjs +0 -2
- package/dist/components/ui/accordion.d.cts +4 -5
- package/dist/components/ui/accordion.d.ts +4 -5
- package/dist/components/ui/accordion.js +0 -2
- package/dist/components/ui/alert-dialog.cjs +0 -2
- package/dist/components/ui/alert-dialog.d.cts +9 -10
- package/dist/components/ui/alert-dialog.d.ts +9 -10
- package/dist/components/ui/alert-dialog.js +1 -3
- package/dist/components/ui/alert-rule-card.cjs +149 -12
- package/dist/components/ui/alert-rule-card.d.cts +2 -2
- package/dist/components/ui/alert-rule-card.d.ts +2 -2
- package/dist/components/ui/alert-rule-card.js +149 -12
- package/dist/components/ui/alert.cjs +3 -5
- package/dist/components/ui/alert.js +3 -5
- package/dist/components/ui/app-bar.cjs +0 -2
- package/dist/components/ui/app-bar.js +0 -2
- package/dist/components/ui/avatar.cjs +0 -2
- package/dist/components/ui/avatar.d.cts +3 -4
- package/dist/components/ui/avatar.d.ts +3 -4
- package/dist/components/ui/avatar.js +0 -2
- package/dist/components/ui/badge.cjs +0 -2
- package/dist/components/ui/badge.d.cts +1 -1
- package/dist/components/ui/badge.d.ts +1 -1
- package/dist/components/ui/badge.js +0 -2
- package/dist/components/ui/breadcrumb.cjs +0 -2
- package/dist/components/ui/breadcrumb.d.cts +7 -8
- package/dist/components/ui/breadcrumb.d.ts +7 -8
- package/dist/components/ui/breadcrumb.js +0 -2
- package/dist/components/ui/button.cjs +0 -2
- package/dist/components/ui/button.d.cts +2 -2
- package/dist/components/ui/button.d.ts +2 -2
- package/dist/components/ui/button.js +1 -3
- package/dist/components/ui/calendar.cjs +0 -2
- package/dist/components/ui/calendar.d.cts +1 -2
- package/dist/components/ui/calendar.d.ts +1 -2
- package/dist/components/ui/calendar.js +1 -3
- package/dist/components/ui/card.cjs +0 -2
- package/dist/components/ui/card.js +0 -2
- package/dist/components/ui/checkbox.cjs +0 -2
- package/dist/components/ui/checkbox.js +0 -2
- package/dist/components/ui/concept-card.cjs +179 -61
- package/dist/components/ui/concept-card.d.cts +3 -3
- package/dist/components/ui/concept-card.d.ts +3 -3
- package/dist/components/ui/concept-card.js +179 -61
- package/dist/components/ui/data-table.cjs +129 -3
- package/dist/components/ui/data-table.d.cts +1 -1
- package/dist/components/ui/data-table.d.ts +1 -1
- package/dist/components/ui/data-table.js +130 -4
- package/dist/components/ui/dialog.cjs +0 -2
- package/dist/components/ui/dialog.d.cts +2 -3
- package/dist/components/ui/dialog.d.ts +2 -3
- package/dist/components/ui/dialog.js +0 -2
- package/dist/components/ui/dropdown-menu.cjs +0 -2
- package/dist/components/ui/dropdown-menu.d.cts +15 -16
- package/dist/components/ui/dropdown-menu.d.ts +15 -16
- package/dist/components/ui/dropdown-menu.js +0 -2
- package/dist/components/ui/filter-provider.cjs +0 -2
- package/dist/components/ui/filter-provider.d.cts +1 -2
- package/dist/components/ui/filter-provider.d.ts +1 -2
- package/dist/components/ui/filter-provider.js +0 -2
- package/dist/components/ui/form.cjs +0 -2
- package/dist/components/ui/form.d.cts +7 -8
- package/dist/components/ui/form.d.ts +7 -8
- package/dist/components/ui/form.js +0 -2
- package/dist/components/ui/input.cjs +0 -2
- package/dist/components/ui/input.js +0 -2
- package/dist/components/ui/iran-province-heat.cjs +1 -3
- package/dist/components/ui/iran-province-heat.d.cts +1 -1
- package/dist/components/ui/iran-province-heat.d.ts +1 -1
- package/dist/components/ui/iran-province-heat.js +1 -3
- package/dist/components/ui/label.cjs +0 -2
- package/dist/components/ui/label.d.cts +1 -2
- package/dist/components/ui/label.d.ts +1 -2
- package/dist/components/ui/label.js +0 -2
- package/dist/components/ui/page-card.cjs +170 -33
- package/dist/components/ui/page-card.d.cts +3 -3
- package/dist/components/ui/page-card.d.ts +3 -3
- package/dist/components/ui/page-card.js +170 -33
- package/dist/components/ui/page-header.cjs +128 -2
- package/dist/components/ui/page-header.d.cts +1 -1
- package/dist/components/ui/page-header.d.ts +1 -1
- package/dist/components/ui/page-header.js +128 -2
- package/dist/components/ui/password-input.cjs +0 -2
- package/dist/components/ui/password-input.js +0 -2
- package/dist/components/ui/popover.cjs +0 -2
- package/dist/components/ui/popover.js +0 -2
- package/dist/components/ui/progress.cjs +1 -3
- package/dist/components/ui/progress.js +1 -3
- package/dist/components/ui/radio-card.cjs +0 -2
- package/dist/components/ui/radio-card.js +0 -2
- package/dist/components/ui/radio-group.cjs +0 -2
- package/dist/components/ui/radio-group.js +0 -2
- package/dist/components/ui/saved-query-card.cjs +0 -2
- package/dist/components/ui/saved-query-card.d.cts +1 -1
- package/dist/components/ui/saved-query-card.d.ts +1 -1
- package/dist/components/ui/saved-query-card.js +1 -3
- package/dist/components/ui/scroll-area.cjs +0 -2
- package/dist/components/ui/scroll-area.d.cts +2 -3
- package/dist/components/ui/scroll-area.d.ts +2 -3
- package/dist/components/ui/scroll-area.js +0 -2
- package/dist/components/ui/select.cjs +0 -2
- package/dist/components/ui/select.d.cts +1 -2
- package/dist/components/ui/select.d.ts +1 -2
- package/dist/components/ui/select.js +0 -2
- package/dist/components/ui/separator.cjs +0 -2
- package/dist/components/ui/separator.js +0 -2
- package/dist/components/ui/sheet.cjs +0 -2
- package/dist/components/ui/sheet.d.cts +9 -10
- package/dist/components/ui/sheet.d.ts +9 -10
- package/dist/components/ui/sheet.js +0 -2
- package/dist/components/ui/skeleton.cjs +0 -2
- package/dist/components/ui/skeleton.d.cts +8 -9
- package/dist/components/ui/skeleton.d.ts +8 -9
- package/dist/components/ui/skeleton.js +0 -2
- package/dist/components/ui/slider.cjs +0 -2
- package/dist/components/ui/slider.d.cts +1 -2
- package/dist/components/ui/slider.d.ts +1 -2
- package/dist/components/ui/slider.js +0 -2
- package/dist/components/ui/social-platform-badge.cjs +0 -2
- package/dist/components/ui/social-platform-badge.js +1 -3
- package/dist/components/ui/sonner.cjs +4 -6
- package/dist/components/ui/sonner.d.cts +2 -2
- package/dist/components/ui/sonner.d.ts +2 -2
- package/dist/components/ui/sonner.js +4 -6
- package/dist/components/ui/sparkline.cjs +3 -5
- package/dist/components/ui/sparkline.d.cts +1 -1
- package/dist/components/ui/sparkline.d.ts +1 -1
- package/dist/components/ui/sparkline.js +3 -5
- package/dist/components/ui/switch.cjs +0 -2
- package/dist/components/ui/switch.d.cts +1 -1
- package/dist/components/ui/switch.d.ts +1 -1
- package/dist/components/ui/switch.js +0 -2
- package/dist/components/ui/table.cjs +0 -2
- package/dist/components/ui/table.d.cts +9 -10
- package/dist/components/ui/table.d.ts +9 -10
- package/dist/components/ui/table.js +0 -2
- package/dist/components/ui/tabs.cjs +0 -2
- package/dist/components/ui/tabs.js +0 -2
- package/dist/components/ui/textarea.cjs +0 -2
- package/dist/components/ui/textarea.js +0 -2
- package/dist/components/ui/toggle-group.cjs +0 -2
- package/dist/components/ui/toggle-group.d.cts +1 -2
- package/dist/components/ui/toggle-group.d.ts +1 -2
- package/dist/components/ui/toggle-group.js +0 -2
- package/dist/components/ui/tooltip.cjs +0 -2
- package/dist/components/ui/tooltip.js +0 -2
- package/dist/{concept-card-BoJ5gIJD.d.ts → concept-card-BU8JL-gj.d.cts} +5 -5
- package/dist/{concept-card-BXra9mr0.d.cts → concept-card-D7PfDkNR.d.ts} +5 -5
- package/dist/hooks/use-hotkey-registry.cjs +0 -2
- package/dist/hooks/use-hotkey-registry.d.cts +1 -2
- package/dist/hooks/use-hotkey-registry.d.ts +1 -2
- package/dist/hooks/use-hotkey-registry.js +0 -2
- package/dist/hooks/use-hotkeys.cjs +0 -2
- package/dist/hooks/use-hotkeys.js +0 -2
- package/dist/{i18n-BfRhV5aw.d.cts → i18n-DD3DMY8O.d.cts} +94 -5
- package/dist/{i18n-ewyqbKM-.d.ts → i18n-UEClNsBy.d.ts} +94 -5
- package/dist/index.cjs +1244 -1173
- package/dist/index.css +8010 -5459
- package/dist/index.d.cts +213 -992
- package/dist/index.d.ts +213 -992
- package/dist/index.js +1210 -1153
- package/dist/{page-card-C9XXXOVr.d.cts → page-card-DjztZrFM.d.cts} +4 -4
- package/dist/{page-card-DAnbez_f.d.ts → page-card-sIE4lvnb.d.ts} +4 -4
- package/dist/server-FTUA8opZ.d.cts +829 -0
- package/dist/server-m6tiB6DB.d.ts +829 -0
- package/dist/server.cjs +1565 -0
- package/dist/server.d.cts +8 -0
- package/dist/server.d.ts +8 -0
- package/dist/server.js +1483 -0
- package/dist/theme.css +50 -0
- package/dist/{toggle-group-B8r4LOQw.d.cts → toggle-group-Bis6suuR.d.cts} +3 -4
- package/dist/{toggle-group-B8r4LOQw.d.ts → toggle-group-Bis6suuR.d.ts} +3 -4
- package/dist/{utils-DlXWmDZ-.d.cts → utils-Czyp5Ned.d.cts} +1 -1
- package/dist/{utils-DlXWmDZ-.d.ts → utils-Czyp5Ned.d.ts} +1 -1
- package/package.json +455 -187
- package/tailwind.config.ts +184 -183
- package/dist/components/brand/parto-logo.cjs.map +0 -1
- package/dist/components/brand/parto-logo.js.map +0 -1
- package/dist/components/charts/PartoAreaChart.cjs.map +0 -1
- package/dist/components/charts/PartoAreaChart.js.map +0 -1
- package/dist/components/charts/PartoBarChart.cjs.map +0 -1
- package/dist/components/charts/PartoBarChart.js.map +0 -1
- package/dist/components/charts/PartoLineChart.cjs.map +0 -1
- package/dist/components/charts/PartoLineChart.js.map +0 -1
- package/dist/components/charts/PartoPieChart.cjs.map +0 -1
- package/dist/components/charts/PartoPieChart.js.map +0 -1
- package/dist/components/ui/accordion.cjs.map +0 -1
- package/dist/components/ui/accordion.js.map +0 -1
- package/dist/components/ui/alert-dialog.cjs.map +0 -1
- package/dist/components/ui/alert-dialog.js.map +0 -1
- package/dist/components/ui/alert-rule-card.cjs.map +0 -1
- package/dist/components/ui/alert-rule-card.js.map +0 -1
- package/dist/components/ui/alert.cjs.map +0 -1
- package/dist/components/ui/alert.js.map +0 -1
- package/dist/components/ui/app-bar.cjs.map +0 -1
- package/dist/components/ui/app-bar.js.map +0 -1
- package/dist/components/ui/avatar.cjs.map +0 -1
- package/dist/components/ui/avatar.js.map +0 -1
- package/dist/components/ui/badge.cjs.map +0 -1
- package/dist/components/ui/badge.js.map +0 -1
- package/dist/components/ui/breadcrumb.cjs.map +0 -1
- package/dist/components/ui/breadcrumb.js.map +0 -1
- package/dist/components/ui/button.cjs.map +0 -1
- package/dist/components/ui/button.js.map +0 -1
- package/dist/components/ui/calendar.cjs.map +0 -1
- package/dist/components/ui/calendar.js.map +0 -1
- package/dist/components/ui/card.cjs.map +0 -1
- package/dist/components/ui/card.js.map +0 -1
- package/dist/components/ui/checkbox.cjs.map +0 -1
- package/dist/components/ui/checkbox.js.map +0 -1
- package/dist/components/ui/concept-card.cjs.map +0 -1
- package/dist/components/ui/concept-card.js.map +0 -1
- package/dist/components/ui/data-table.cjs.map +0 -1
- package/dist/components/ui/data-table.js.map +0 -1
- package/dist/components/ui/dialog.cjs.map +0 -1
- package/dist/components/ui/dialog.js.map +0 -1
- package/dist/components/ui/dropdown-menu.cjs.map +0 -1
- package/dist/components/ui/dropdown-menu.js.map +0 -1
- package/dist/components/ui/filter-provider.cjs.map +0 -1
- package/dist/components/ui/filter-provider.js.map +0 -1
- package/dist/components/ui/form.cjs.map +0 -1
- package/dist/components/ui/form.js.map +0 -1
- package/dist/components/ui/input.cjs.map +0 -1
- package/dist/components/ui/input.js.map +0 -1
- package/dist/components/ui/iran-province-heat.cjs.map +0 -1
- package/dist/components/ui/iran-province-heat.js.map +0 -1
- package/dist/components/ui/label.cjs.map +0 -1
- package/dist/components/ui/label.js.map +0 -1
- package/dist/components/ui/page-card.cjs.map +0 -1
- package/dist/components/ui/page-card.js.map +0 -1
- package/dist/components/ui/page-header.cjs.map +0 -1
- package/dist/components/ui/page-header.js.map +0 -1
- package/dist/components/ui/password-input.cjs.map +0 -1
- package/dist/components/ui/password-input.js.map +0 -1
- package/dist/components/ui/popover.cjs.map +0 -1
- package/dist/components/ui/popover.js.map +0 -1
- package/dist/components/ui/progress.cjs.map +0 -1
- package/dist/components/ui/progress.js.map +0 -1
- package/dist/components/ui/radio-card.cjs.map +0 -1
- package/dist/components/ui/radio-card.js.map +0 -1
- package/dist/components/ui/radio-group.cjs.map +0 -1
- package/dist/components/ui/radio-group.js.map +0 -1
- package/dist/components/ui/saved-query-card.cjs.map +0 -1
- package/dist/components/ui/saved-query-card.js.map +0 -1
- package/dist/components/ui/scroll-area.cjs.map +0 -1
- package/dist/components/ui/scroll-area.js.map +0 -1
- package/dist/components/ui/select.cjs.map +0 -1
- package/dist/components/ui/select.js.map +0 -1
- package/dist/components/ui/separator.cjs.map +0 -1
- package/dist/components/ui/separator.js.map +0 -1
- package/dist/components/ui/sheet.cjs.map +0 -1
- package/dist/components/ui/sheet.js.map +0 -1
- package/dist/components/ui/skeleton.cjs.map +0 -1
- package/dist/components/ui/skeleton.js.map +0 -1
- package/dist/components/ui/slider.cjs.map +0 -1
- package/dist/components/ui/slider.js.map +0 -1
- package/dist/components/ui/social-platform-badge.cjs.map +0 -1
- package/dist/components/ui/social-platform-badge.js.map +0 -1
- package/dist/components/ui/sonner.cjs.map +0 -1
- package/dist/components/ui/sonner.js.map +0 -1
- package/dist/components/ui/sparkline.cjs.map +0 -1
- package/dist/components/ui/sparkline.js.map +0 -1
- package/dist/components/ui/switch.cjs.map +0 -1
- package/dist/components/ui/switch.js.map +0 -1
- package/dist/components/ui/table.cjs.map +0 -1
- package/dist/components/ui/table.js.map +0 -1
- package/dist/components/ui/tabs.cjs.map +0 -1
- package/dist/components/ui/tabs.js.map +0 -1
- package/dist/components/ui/textarea.cjs.map +0 -1
- package/dist/components/ui/textarea.js.map +0 -1
- package/dist/components/ui/toggle-group.cjs.map +0 -1
- package/dist/components/ui/toggle-group.js.map +0 -1
- package/dist/components/ui/tooltip.cjs.map +0 -1
- package/dist/components/ui/tooltip.js.map +0 -1
- package/dist/hooks/use-hotkey-registry.cjs.map +0 -1
- package/dist/hooks/use-hotkey-registry.js.map +0 -1
- package/dist/hooks/use-hotkeys.cjs.map +0 -1
- package/dist/hooks/use-hotkeys.js.map +0 -1
- package/dist/index.cjs.map +0 -1
- package/dist/index.js.map +0 -1
package/tailwind.config.ts
CHANGED
|
@@ -32,274 +32,275 @@ const config: Config = {
|
|
|
32
32
|
colors: {
|
|
33
33
|
// Supabase Design System - Background Colors
|
|
34
34
|
background: {
|
|
35
|
-
DEFAULT: '
|
|
36
|
-
200: '
|
|
35
|
+
DEFAULT: 'var(--background-default)',
|
|
36
|
+
200: 'var(--background-200)',
|
|
37
37
|
alternative: {
|
|
38
|
-
DEFAULT: '
|
|
39
|
-
200: '
|
|
38
|
+
DEFAULT: 'var(--background-alternative-default)',
|
|
39
|
+
200: 'var(--background-alternative-200)',
|
|
40
40
|
},
|
|
41
|
-
selection: '
|
|
42
|
-
control: '
|
|
41
|
+
selection: 'var(--background-selection)',
|
|
42
|
+
control: 'var(--background-control)',
|
|
43
43
|
surface: {
|
|
44
|
-
75: '
|
|
45
|
-
100: '
|
|
46
|
-
200: '
|
|
47
|
-
300: '
|
|
48
|
-
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: '
|
|
52
|
-
hover: '
|
|
51
|
+
DEFAULT: 'var(--background-overlay-default)',
|
|
52
|
+
hover: 'var(--background-overlay-hover)',
|
|
53
53
|
},
|
|
54
|
-
muted: '
|
|
54
|
+
muted: 'var(--background-muted)',
|
|
55
55
|
button: {
|
|
56
|
-
DEFAULT: '
|
|
56
|
+
DEFAULT: 'var(--background-button-default)',
|
|
57
57
|
},
|
|
58
58
|
dialog: {
|
|
59
|
-
DEFAULT: '
|
|
59
|
+
DEFAULT: 'var(--background-dialog-default)',
|
|
60
60
|
},
|
|
61
61
|
dash: {
|
|
62
|
-
sidebar: '
|
|
63
|
-
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: '
|
|
68
|
-
selection: '
|
|
67
|
+
alternative: 'var(--background-alternative-default)',
|
|
68
|
+
selection: 'var(--background-selection)',
|
|
69
69
|
overlay: {
|
|
70
|
-
DEFAULT: '
|
|
71
|
-
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: '
|
|
77
|
-
light: '
|
|
78
|
-
lighter: '
|
|
79
|
-
muted: '
|
|
80
|
-
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': '
|
|
87
|
-
'on-warning': '
|
|
88
|
-
'on-destructive': '
|
|
89
|
-
'on-info': '
|
|
90
|
-
'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: '
|
|
95
|
-
muted: '
|
|
96
|
-
secondary: '
|
|
97
|
-
overlay: '
|
|
98
|
-
control: '
|
|
99
|
-
alternative: '
|
|
100
|
-
strong: '
|
|
101
|
-
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: '
|
|
104
|
-
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: '
|
|
109
|
-
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: '
|
|
114
|
-
200: '
|
|
115
|
-
300: '
|
|
116
|
-
400: '
|
|
117
|
-
500: '
|
|
118
|
-
600: '
|
|
119
|
-
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: '
|
|
125
|
-
200: '
|
|
126
|
-
300: '
|
|
127
|
-
400: '
|
|
128
|
-
500: '
|
|
129
|
-
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: '
|
|
135
|
-
200: '
|
|
136
|
-
300: '
|
|
137
|
-
400: '
|
|
138
|
-
500: '
|
|
139
|
-
600: '
|
|
140
|
-
foreground: '
|
|
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: '
|
|
146
|
-
200: '
|
|
147
|
-
300: '
|
|
148
|
-
400: '
|
|
149
|
-
500: '
|
|
150
|
-
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: '
|
|
156
|
-
200: '
|
|
157
|
-
300: '
|
|
158
|
-
400: '
|
|
159
|
-
500: '
|
|
160
|
-
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: '
|
|
166
|
-
200: '
|
|
167
|
-
400: '
|
|
168
|
-
foreground: '
|
|
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: '
|
|
174
|
-
2: '
|
|
175
|
-
3: '
|
|
176
|
-
4: '
|
|
177
|
-
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: '
|
|
183
|
-
'excellent-hover': '
|
|
184
|
-
'very-good': '
|
|
185
|
-
'very-good-hover': '
|
|
186
|
-
good: '
|
|
187
|
-
'good-hover': '
|
|
188
|
-
average: '
|
|
189
|
-
'average-hover': '
|
|
190
|
-
low: '
|
|
191
|
-
'low-hover': '
|
|
192
|
-
poor: '
|
|
193
|
-
'poor-hover': '
|
|
194
|
-
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: '
|
|
199
|
-
negative: '
|
|
200
|
-
neutral: '
|
|
201
|
-
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: '
|
|
206
|
-
anticipation: '
|
|
207
|
-
joy: '
|
|
208
|
-
trust: '
|
|
209
|
-
fear: '
|
|
210
|
-
surprise: '
|
|
211
|
-
sadness: '
|
|
212
|
-
disgust: '
|
|
213
|
-
neutral: '
|
|
214
|
-
},
|
|
215
|
-
//
|
|
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': '
|
|
218
|
-
'internal-critic': '
|
|
219
|
-
'internal-opponent': '
|
|
220
|
-
'external-opponent': '
|
|
221
|
-
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: '
|
|
226
|
-
warning: '
|
|
227
|
-
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: '
|
|
232
|
-
high: '
|
|
233
|
-
medium: '
|
|
234
|
-
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: '
|
|
239
|
-
comment: '
|
|
240
|
-
save: '
|
|
241
|
-
follow: '
|
|
242
|
-
unfollow: '
|
|
243
|
-
dm: '
|
|
244
|
-
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: '
|
|
249
|
-
ring: '
|
|
248
|
+
input: 'var(--background-control)',
|
|
249
|
+
ring: 'var(--border-strong)',
|
|
250
250
|
primary: {
|
|
251
|
-
DEFAULT: '
|
|
252
|
-
foreground: '
|
|
251
|
+
DEFAULT: 'var(--brand-default)',
|
|
252
|
+
foreground: 'var(--foreground-contrast)',
|
|
253
253
|
},
|
|
254
254
|
muted: {
|
|
255
|
-
DEFAULT: '
|
|
256
|
-
|
|
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: '
|
|
260
|
-
foreground: '
|
|
260
|
+
DEFAULT: 'var(--background-surface-200)',
|
|
261
|
+
foreground: 'var(--foreground-default)',
|
|
261
262
|
},
|
|
262
263
|
popover: {
|
|
263
|
-
DEFAULT: '
|
|
264
|
-
foreground: '
|
|
264
|
+
DEFAULT: 'var(--background-overlay-default)',
|
|
265
|
+
foreground: 'var(--foreground-default)',
|
|
265
266
|
},
|
|
266
267
|
card: {
|
|
267
|
-
DEFAULT: '
|
|
268
|
-
foreground: '
|
|
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: '
|
|
273
|
-
foreground: '
|
|
274
|
-
border: '
|
|
275
|
-
ring: '
|
|
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: '
|
|
278
|
-
foreground: '
|
|
278
|
+
DEFAULT: 'var(--background-selection)',
|
|
279
|
+
foreground: 'var(--foreground-default)',
|
|
279
280
|
},
|
|
280
281
|
},
|
|
281
282
|
chart: {
|
|
282
|
-
'1': '
|
|
283
|
-
'2': '
|
|
284
|
-
'3': '
|
|
285
|
-
'4': '
|
|
286
|
-
'5': '
|
|
287
|
-
'6': '
|
|
288
|
-
'7': '
|
|
289
|
-
'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: '
|
|
294
|
-
'excellent-bg': '
|
|
295
|
-
good: '
|
|
296
|
-
'good-bg': '
|
|
297
|
-
moderate: '
|
|
298
|
-
'moderate-bg': '
|
|
299
|
-
poor: '
|
|
300
|
-
'poor-bg': '
|
|
301
|
-
critical: '
|
|
302
|
-
'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: '
|
|
488
|
+
backgroundColor: 'var(--background-default)',
|
|
488
489
|
},
|
|
489
490
|
'.bg-muted': {
|
|
490
|
-
backgroundColor: '
|
|
491
|
+
backgroundColor: 'var(--background-muted)',
|
|
491
492
|
},
|
|
492
493
|
'.bg-alternative': {
|
|
493
|
-
backgroundColor: '
|
|
494
|
+
backgroundColor: 'var(--background-alternative-default)',
|
|
494
495
|
},
|
|
495
496
|
'.bg-selection': {
|
|
496
|
-
backgroundColor: '
|
|
497
|
+
backgroundColor: 'var(--background-selection)',
|
|
497
498
|
},
|
|
498
499
|
// Text shorthands
|
|
499
500
|
'.text': {
|
|
500
|
-
color: '
|
|
501
|
+
color: 'var(--foreground-default)',
|
|
501
502
|
},
|
|
502
503
|
'.text-light': {
|
|
503
|
-
color: '
|
|
504
|
+
color: 'var(--foreground-light)',
|
|
504
505
|
},
|
|
505
506
|
'.text-lighter': {
|
|
506
|
-
color: '
|
|
507
|
+
color: 'var(--foreground-lighter)',
|
|
507
508
|
},
|
|
508
509
|
'.text-muted': {
|
|
509
|
-
color: '
|
|
510
|
+
color: 'var(--foreground-muted)',
|
|
510
511
|
},
|
|
511
512
|
'.text-contrast': {
|
|
512
|
-
color: '
|
|
513
|
+
color: 'var(--foreground-contrast)',
|
|
513
514
|
},
|
|
514
515
|
// Border shorthands (override default)
|
|
515
516
|
'.border': {
|
|
516
|
-
borderColor: '
|
|
517
|
+
borderColor: 'var(--border-default)',
|
|
517
518
|
},
|
|
518
519
|
'.border-muted': {
|
|
519
|
-
borderColor: '
|
|
520
|
+
borderColor: 'var(--border-muted)',
|
|
520
521
|
},
|
|
521
522
|
'.border-strong': {
|
|
522
|
-
borderColor: '
|
|
523
|
+
borderColor: 'var(--border-strong)',
|
|
523
524
|
},
|
|
524
525
|
'.border-stronger': {
|
|
525
|
-
borderColor: '
|
|
526
|
+
borderColor: 'var(--border-stronger)',
|
|
526
527
|
},
|
|
527
528
|
'.border-button': {
|
|
528
|
-
borderColor: '
|
|
529
|
+
borderColor: 'var(--border-button-default)',
|
|
529
530
|
},
|
|
530
531
|
'.border-button-hover': {
|
|
531
|
-
borderColor: '
|
|
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":"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","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"]}
|