omnira-ui 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +145 -0
  3. package/cli/omnira-init.mjs +260 -0
  4. package/cli/presets.mjs +386 -0
  5. package/components/ui/AppStoreButton/AppStoreButton.module.css +87 -0
  6. package/components/ui/AppStoreButton/AppStoreButton.tsx +114 -0
  7. package/components/ui/AppStoreButton/index.ts +2 -0
  8. package/components/ui/Avatar/Avatar.module.css +76 -0
  9. package/components/ui/Avatar/Avatar.tsx +102 -0
  10. package/components/ui/Avatar/index.ts +2 -0
  11. package/components/ui/Badge/Badge.module.css +120 -0
  12. package/components/ui/Badge/Badge.tsx +25 -0
  13. package/components/ui/Badge/index.ts +2 -0
  14. package/components/ui/BadgeGroup/BadgeGroup.module.css +214 -0
  15. package/components/ui/BadgeGroup/BadgeGroup.tsx +88 -0
  16. package/components/ui/BadgeGroup/index.ts +2 -0
  17. package/components/ui/Browser/Browser.module.css +105 -0
  18. package/components/ui/Browser/Browser.tsx +54 -0
  19. package/components/ui/Browser/index.ts +2 -0
  20. package/components/ui/Button/Button.module.css +188 -0
  21. package/components/ui/Button/Button.tsx +74 -0
  22. package/components/ui/Button/index.ts +2 -0
  23. package/components/ui/ButtonUtility/ButtonUtility.module.css +154 -0
  24. package/components/ui/ButtonUtility/ButtonUtility.tsx +65 -0
  25. package/components/ui/ButtonUtility/index.ts +2 -0
  26. package/components/ui/Card/Card.module.css +80 -0
  27. package/components/ui/Card/Card.tsx +39 -0
  28. package/components/ui/Card/index.ts +2 -0
  29. package/components/ui/Checkbox/Checkbox.module.css +92 -0
  30. package/components/ui/Checkbox/Checkbox.tsx +95 -0
  31. package/components/ui/Checkbox/index.ts +2 -0
  32. package/components/ui/Collapse/Collapse.module.css +60 -0
  33. package/components/ui/Collapse/Collapse.tsx +100 -0
  34. package/components/ui/Collapse/index.ts +2 -0
  35. package/components/ui/CreditCard/CreditCard.module.css +117 -0
  36. package/components/ui/CreditCard/CreditCard.tsx +86 -0
  37. package/components/ui/CreditCard/index.ts +2 -0
  38. package/components/ui/Dropdown/Dropdown.module.css +269 -0
  39. package/components/ui/Dropdown/Dropdown.tsx +419 -0
  40. package/components/ui/Dropdown/index.ts +31 -0
  41. package/components/ui/GridLines/GridLines.module.css +95 -0
  42. package/components/ui/GridLines/GridLines.tsx +10 -0
  43. package/components/ui/GridLines/index.ts +1 -0
  44. package/components/ui/Illustration/Illustration.module.css +10 -0
  45. package/components/ui/Illustration/Illustration.tsx +96 -0
  46. package/components/ui/Illustration/index.ts +2 -0
  47. package/components/ui/Input/Input.module.css +217 -0
  48. package/components/ui/Input/Input.tsx +93 -0
  49. package/components/ui/Input/index.ts +2 -0
  50. package/components/ui/Phone/Phone.module.css +104 -0
  51. package/components/ui/Phone/Phone.tsx +54 -0
  52. package/components/ui/Phone/index.ts +2 -0
  53. package/components/ui/PinInput/PinInput.module.css +104 -0
  54. package/components/ui/PinInput/PinInput.tsx +210 -0
  55. package/components/ui/PinInput/index.ts +1 -0
  56. package/components/ui/ProgressBar/ProgressBar.module.css +180 -0
  57. package/components/ui/ProgressBar/ProgressBar.tsx +206 -0
  58. package/components/ui/ProgressBar/index.ts +2 -0
  59. package/components/ui/QRCode/QRCode.module.css +13 -0
  60. package/components/ui/QRCode/QRCode.tsx +128 -0
  61. package/components/ui/QRCode/index.ts +2 -0
  62. package/components/ui/RadioButton/RadioButton.module.css +92 -0
  63. package/components/ui/RadioButton/RadioButton.tsx +134 -0
  64. package/components/ui/RadioButton/index.ts +2 -0
  65. package/components/ui/RadioGroup/RadioGroup.module.css +382 -0
  66. package/components/ui/RadioGroup/RadioGroup.tsx +292 -0
  67. package/components/ui/RadioGroup/index.ts +1 -0
  68. package/components/ui/Rating/Rating.module.css +99 -0
  69. package/components/ui/Rating/Rating.tsx +123 -0
  70. package/components/ui/Rating/index.ts +2 -0
  71. package/components/ui/Select/Select.module.css +371 -0
  72. package/components/ui/Select/Select.tsx +507 -0
  73. package/components/ui/Select/index.ts +2 -0
  74. package/components/ui/SidebarNavigation/SidebarDual.tsx +71 -0
  75. package/components/ui/SidebarNavigation/SidebarFeatureCard.module.css +351 -0
  76. package/components/ui/SidebarNavigation/SidebarFeatureCard.tsx +388 -0
  77. package/components/ui/SidebarNavigation/SidebarNavigation.module.css +610 -0
  78. package/components/ui/SidebarNavigation/SidebarParts.tsx +215 -0
  79. package/components/ui/SidebarNavigation/SidebarSectionDividers.tsx +46 -0
  80. package/components/ui/SidebarNavigation/SidebarSectionHeadings.tsx +52 -0
  81. package/components/ui/SidebarNavigation/SidebarSimple.tsx +46 -0
  82. package/components/ui/SidebarNavigation/SidebarSlim.tsx +48 -0
  83. package/components/ui/SidebarNavigation/index.ts +29 -0
  84. package/components/ui/SidebarNavigation/types.ts +27 -0
  85. package/components/ui/Slider/Slider.module.css +93 -0
  86. package/components/ui/Slider/Slider.tsx +118 -0
  87. package/components/ui/Slider/index.ts +2 -0
  88. package/components/ui/SocialButton/SocialButton.module.css +223 -0
  89. package/components/ui/SocialButton/SocialButton.tsx +185 -0
  90. package/components/ui/SocialButton/index.ts +2 -0
  91. package/components/ui/Tag/Tag.module.css +203 -0
  92. package/components/ui/Tag/Tag.tsx +161 -0
  93. package/components/ui/Tag/index.ts +2 -0
  94. package/components/ui/TextEditor/TextEditor.module.css +182 -0
  95. package/components/ui/TextEditor/TextEditor.tsx +323 -0
  96. package/components/ui/TextEditor/index.ts +1 -0
  97. package/components/ui/Textarea/Textarea.module.css +75 -0
  98. package/components/ui/Textarea/Textarea.tsx +59 -0
  99. package/components/ui/Textarea/index.ts +2 -0
  100. package/components/ui/Toggle/Toggle.module.css +118 -0
  101. package/components/ui/Toggle/Toggle.tsx +77 -0
  102. package/components/ui/Toggle/index.ts +2 -0
  103. package/components/ui/Tooltip/Tooltip.module.css +95 -0
  104. package/components/ui/Tooltip/Tooltip.tsx +55 -0
  105. package/components/ui/Tooltip/index.ts +2 -0
  106. package/components/ui/VideoPlayer/VideoPlayer.module.css +120 -0
  107. package/components/ui/VideoPlayer/VideoPlayer.tsx +229 -0
  108. package/components/ui/VideoPlayer/index.ts +2 -0
  109. package/lib/cn.ts +3 -0
  110. package/lib/copy-to-clipboard.ts +21 -0
  111. package/package.json +61 -0
@@ -0,0 +1,386 @@
1
+ /**
2
+ * Omnira UI — Color Presets
3
+ *
4
+ * Each preset contains the full set of CSS custom property overrides
5
+ * for both dark and light themes. The tokens follow the same structure
6
+ * as globals.css so the generated file can be imported after the base.
7
+ *
8
+ * Colors are listed in alphabetical order.
9
+ */
10
+
11
+ export const COLOR_PRESETS = {
12
+ blue: {
13
+ label: "Blue",
14
+ hex: "#2196F3",
15
+ dark: {
16
+ "--color-lime": "#2196F3",
17
+ "--color-lime-hover": "#1E88E5",
18
+ "--color-lime-gradient": "#1976D2",
19
+ "--color-lime-text": "#ffffff",
20
+ "--color-border-lime-subtle": "rgba(33, 150, 243, 0.1)",
21
+ "--color-border-lime-medium": "rgba(33, 150, 243, 0.15)",
22
+ "--color-border-lime-strong": "rgba(33, 150, 243, 0.3)",
23
+ "--color-bg-lime-subtle": "rgba(33, 150, 243, 0.06)",
24
+ "--color-bg-lime-medium": "rgba(33, 150, 243, 0.08)",
25
+ "--color-bg-lime-strong": "rgba(33, 150, 243, 0.12)",
26
+ "--shadow-btn-primary": "0 8px 24px rgba(33, 150, 243, 0.3)",
27
+ "--shadow-glow-lime": "0 0 8px rgba(33, 150, 243, 0.6), 0 0 16px rgba(33, 150, 243, 0.3)",
28
+ "--shadow-card-accent": "inset 2px 4px 16px rgba(33, 150, 243, 0.04), 0px 16px 48px rgba(0, 0, 0, 0.2)",
29
+ "--gradient-progress": "linear-gradient(90deg, #2196F3, #64B5F6)",
30
+ },
31
+ light: {
32
+ "--color-lime": "#1976D2",
33
+ "--color-lime-hover": "#1565C0",
34
+ "--color-lime-gradient": "#1565C0",
35
+ "--color-lime-text": "#ffffff",
36
+ "--color-border-lime-subtle": "rgba(25, 118, 210, 0.15)",
37
+ "--color-border-lime-medium": "rgba(25, 118, 210, 0.25)",
38
+ "--color-border-lime-strong": "rgba(25, 118, 210, 0.4)",
39
+ "--color-bg-lime-subtle": "rgba(25, 118, 210, 0.06)",
40
+ "--color-bg-lime-medium": "rgba(25, 118, 210, 0.10)",
41
+ "--color-bg-lime-strong": "rgba(25, 118, 210, 0.15)",
42
+ "--shadow-btn-primary": "0 6px 20px rgba(25, 118, 210, 0.25)",
43
+ "--shadow-glow-lime": "0 0 6px rgba(25, 118, 210, 0.4), 0 0 12px rgba(25, 118, 210, 0.2)",
44
+ "--shadow-card-accent": "0px 2px 8px rgba(25, 118, 210, 0.08), 0px 12px 36px rgba(0, 0, 0, 0.06)",
45
+ "--gradient-progress": "linear-gradient(90deg, #1976D2, #42A5F5)",
46
+ },
47
+ },
48
+
49
+ cyan: {
50
+ label: "Cyan",
51
+ hex: "#00BCD4",
52
+ dark: {
53
+ "--color-lime": "#00BCD4",
54
+ "--color-lime-hover": "#00ACC1",
55
+ "--color-lime-gradient": "#0097A7",
56
+ "--color-lime-text": "#121212",
57
+ "--color-border-lime-subtle": "rgba(0, 188, 212, 0.1)",
58
+ "--color-border-lime-medium": "rgba(0, 188, 212, 0.15)",
59
+ "--color-border-lime-strong": "rgba(0, 188, 212, 0.3)",
60
+ "--color-bg-lime-subtle": "rgba(0, 188, 212, 0.06)",
61
+ "--color-bg-lime-medium": "rgba(0, 188, 212, 0.08)",
62
+ "--color-bg-lime-strong": "rgba(0, 188, 212, 0.12)",
63
+ "--shadow-btn-primary": "0 8px 24px rgba(0, 188, 212, 0.3)",
64
+ "--shadow-glow-lime": "0 0 8px rgba(0, 188, 212, 0.6), 0 0 16px rgba(0, 188, 212, 0.3)",
65
+ "--shadow-card-accent": "inset 2px 4px 16px rgba(0, 188, 212, 0.04), 0px 16px 48px rgba(0, 0, 0, 0.2)",
66
+ "--gradient-progress": "linear-gradient(90deg, #00BCD4, #4DD0E1)",
67
+ },
68
+ light: {
69
+ "--color-lime": "#0097A7",
70
+ "--color-lime-hover": "#00838F",
71
+ "--color-lime-gradient": "#00838F",
72
+ "--color-lime-text": "#ffffff",
73
+ "--color-border-lime-subtle": "rgba(0, 151, 167, 0.15)",
74
+ "--color-border-lime-medium": "rgba(0, 151, 167, 0.25)",
75
+ "--color-border-lime-strong": "rgba(0, 151, 167, 0.4)",
76
+ "--color-bg-lime-subtle": "rgba(0, 151, 167, 0.06)",
77
+ "--color-bg-lime-medium": "rgba(0, 151, 167, 0.10)",
78
+ "--color-bg-lime-strong": "rgba(0, 151, 167, 0.15)",
79
+ "--shadow-btn-primary": "0 6px 20px rgba(0, 151, 167, 0.25)",
80
+ "--shadow-glow-lime": "0 0 6px rgba(0, 151, 167, 0.4), 0 0 12px rgba(0, 151, 167, 0.2)",
81
+ "--shadow-card-accent": "0px 2px 8px rgba(0, 151, 167, 0.08), 0px 12px 36px rgba(0, 0, 0, 0.06)",
82
+ "--gradient-progress": "linear-gradient(90deg, #0097A7, #26C6DA)",
83
+ },
84
+ },
85
+
86
+ green: {
87
+ label: "Green",
88
+ hex: "#4CAF50",
89
+ dark: {
90
+ "--color-lime": "#4CAF50",
91
+ "--color-lime-hover": "#43A047",
92
+ "--color-lime-gradient": "#388E3C",
93
+ "--color-lime-text": "#ffffff",
94
+ "--color-border-lime-subtle": "rgba(76, 175, 80, 0.1)",
95
+ "--color-border-lime-medium": "rgba(76, 175, 80, 0.15)",
96
+ "--color-border-lime-strong": "rgba(76, 175, 80, 0.3)",
97
+ "--color-bg-lime-subtle": "rgba(76, 175, 80, 0.06)",
98
+ "--color-bg-lime-medium": "rgba(76, 175, 80, 0.08)",
99
+ "--color-bg-lime-strong": "rgba(76, 175, 80, 0.12)",
100
+ "--shadow-btn-primary": "0 8px 24px rgba(76, 175, 80, 0.3)",
101
+ "--shadow-glow-lime": "0 0 8px rgba(76, 175, 80, 0.6), 0 0 16px rgba(76, 175, 80, 0.3)",
102
+ "--shadow-card-accent": "inset 2px 4px 16px rgba(76, 175, 80, 0.04), 0px 16px 48px rgba(0, 0, 0, 0.2)",
103
+ "--gradient-progress": "linear-gradient(90deg, #4CAF50, #81C784)",
104
+ },
105
+ light: {
106
+ "--color-lime": "#388E3C",
107
+ "--color-lime-hover": "#2E7D32",
108
+ "--color-lime-gradient": "#2E7D32",
109
+ "--color-lime-text": "#ffffff",
110
+ "--color-border-lime-subtle": "rgba(56, 142, 60, 0.15)",
111
+ "--color-border-lime-medium": "rgba(56, 142, 60, 0.25)",
112
+ "--color-border-lime-strong": "rgba(56, 142, 60, 0.4)",
113
+ "--color-bg-lime-subtle": "rgba(56, 142, 60, 0.06)",
114
+ "--color-bg-lime-medium": "rgba(56, 142, 60, 0.10)",
115
+ "--color-bg-lime-strong": "rgba(56, 142, 60, 0.15)",
116
+ "--shadow-btn-primary": "0 6px 20px rgba(56, 142, 60, 0.25)",
117
+ "--shadow-glow-lime": "0 0 6px rgba(56, 142, 60, 0.4), 0 0 12px rgba(56, 142, 60, 0.2)",
118
+ "--shadow-card-accent": "0px 2px 8px rgba(56, 142, 60, 0.08), 0px 12px 36px rgba(0, 0, 0, 0.06)",
119
+ "--gradient-progress": "linear-gradient(90deg, #388E3C, #66BB6A)",
120
+ },
121
+ },
122
+
123
+ lime: {
124
+ label: "Lime (Default)",
125
+ hex: "#D2FE17",
126
+ dark: {
127
+ "--color-lime": "#D2FE17",
128
+ "--color-lime-hover": "#c0e616",
129
+ "--color-lime-gradient": "#ABC928",
130
+ "--color-lime-text": "#121212",
131
+ "--color-border-lime-subtle": "rgba(210, 254, 23, 0.1)",
132
+ "--color-border-lime-medium": "rgba(210, 254, 23, 0.15)",
133
+ "--color-border-lime-strong": "rgba(210, 254, 23, 0.3)",
134
+ "--color-bg-lime-subtle": "rgba(210, 254, 23, 0.06)",
135
+ "--color-bg-lime-medium": "rgba(210, 254, 23, 0.08)",
136
+ "--color-bg-lime-strong": "rgba(210, 254, 23, 0.12)",
137
+ "--shadow-btn-primary": "0 8px 24px rgba(210, 254, 23, 0.3)",
138
+ "--shadow-glow-lime": "0 0 8px rgba(210, 254, 23, 0.6), 0 0 16px rgba(210, 254, 23, 0.3)",
139
+ "--shadow-card-accent": "inset 2px 4px 16px rgba(210, 254, 23, 0.04), 0px 16px 48px rgba(0, 0, 0, 0.2)",
140
+ "--gradient-progress": "linear-gradient(90deg, #D2FE17, #e5ff54)",
141
+ },
142
+ light: {
143
+ "--color-lime": "#8AB400",
144
+ "--color-lime-hover": "#7DA310",
145
+ "--color-lime-gradient": "#6B9A00",
146
+ "--color-lime-text": "#ffffff",
147
+ "--color-border-lime-subtle": "rgba(138, 180, 0, 0.15)",
148
+ "--color-border-lime-medium": "rgba(138, 180, 0, 0.25)",
149
+ "--color-border-lime-strong": "rgba(138, 180, 0, 0.4)",
150
+ "--color-bg-lime-subtle": "rgba(138, 180, 0, 0.06)",
151
+ "--color-bg-lime-medium": "rgba(138, 180, 0, 0.10)",
152
+ "--color-bg-lime-strong": "rgba(138, 180, 0, 0.15)",
153
+ "--shadow-btn-primary": "0 6px 20px rgba(138, 180, 0, 0.25)",
154
+ "--shadow-glow-lime": "0 0 6px rgba(138, 180, 0, 0.4), 0 0 12px rgba(138, 180, 0, 0.2)",
155
+ "--shadow-card-accent": "0px 2px 8px rgba(138, 180, 0, 0.08), 0px 12px 36px rgba(0, 0, 0, 0.06)",
156
+ "--gradient-progress": "linear-gradient(90deg, #8AB400, #a5d600)",
157
+ },
158
+ },
159
+
160
+ orange: {
161
+ label: "Orange",
162
+ hex: "#FF5722",
163
+ dark: {
164
+ "--color-lime": "#FF5722",
165
+ "--color-lime-hover": "#F4511E",
166
+ "--color-lime-gradient": "#E64A19",
167
+ "--color-lime-text": "#ffffff",
168
+ "--color-border-lime-subtle": "rgba(255, 87, 34, 0.1)",
169
+ "--color-border-lime-medium": "rgba(255, 87, 34, 0.15)",
170
+ "--color-border-lime-strong": "rgba(255, 87, 34, 0.3)",
171
+ "--color-bg-lime-subtle": "rgba(255, 87, 34, 0.06)",
172
+ "--color-bg-lime-medium": "rgba(255, 87, 34, 0.08)",
173
+ "--color-bg-lime-strong": "rgba(255, 87, 34, 0.12)",
174
+ "--shadow-btn-primary": "0 8px 24px rgba(255, 87, 34, 0.3)",
175
+ "--shadow-glow-lime": "0 0 8px rgba(255, 87, 34, 0.6), 0 0 16px rgba(255, 87, 34, 0.3)",
176
+ "--shadow-card-accent": "inset 2px 4px 16px rgba(255, 87, 34, 0.04), 0px 16px 48px rgba(0, 0, 0, 0.2)",
177
+ "--gradient-progress": "linear-gradient(90deg, #FF5722, #FF8A65)",
178
+ },
179
+ light: {
180
+ "--color-lime": "#E64A19",
181
+ "--color-lime-hover": "#D84315",
182
+ "--color-lime-gradient": "#BF360C",
183
+ "--color-lime-text": "#ffffff",
184
+ "--color-border-lime-subtle": "rgba(230, 74, 25, 0.15)",
185
+ "--color-border-lime-medium": "rgba(230, 74, 25, 0.25)",
186
+ "--color-border-lime-strong": "rgba(230, 74, 25, 0.4)",
187
+ "--color-bg-lime-subtle": "rgba(230, 74, 25, 0.06)",
188
+ "--color-bg-lime-medium": "rgba(230, 74, 25, 0.10)",
189
+ "--color-bg-lime-strong": "rgba(230, 74, 25, 0.15)",
190
+ "--shadow-btn-primary": "0 6px 20px rgba(230, 74, 25, 0.25)",
191
+ "--shadow-glow-lime": "0 0 6px rgba(230, 74, 25, 0.4), 0 0 12px rgba(230, 74, 25, 0.2)",
192
+ "--shadow-card-accent": "0px 2px 8px rgba(230, 74, 25, 0.08), 0px 12px 36px rgba(0, 0, 0, 0.06)",
193
+ "--gradient-progress": "linear-gradient(90deg, #E64A19, #FF7043)",
194
+ },
195
+ },
196
+
197
+ pink: {
198
+ label: "Pink",
199
+ hex: "#E91E63",
200
+ dark: {
201
+ "--color-lime": "#E91E63",
202
+ "--color-lime-hover": "#D81B60",
203
+ "--color-lime-gradient": "#C2185B",
204
+ "--color-lime-text": "#ffffff",
205
+ "--color-border-lime-subtle": "rgba(233, 30, 99, 0.1)",
206
+ "--color-border-lime-medium": "rgba(233, 30, 99, 0.15)",
207
+ "--color-border-lime-strong": "rgba(233, 30, 99, 0.3)",
208
+ "--color-bg-lime-subtle": "rgba(233, 30, 99, 0.06)",
209
+ "--color-bg-lime-medium": "rgba(233, 30, 99, 0.08)",
210
+ "--color-bg-lime-strong": "rgba(233, 30, 99, 0.12)",
211
+ "--shadow-btn-primary": "0 8px 24px rgba(233, 30, 99, 0.3)",
212
+ "--shadow-glow-lime": "0 0 8px rgba(233, 30, 99, 0.6), 0 0 16px rgba(233, 30, 99, 0.3)",
213
+ "--shadow-card-accent": "inset 2px 4px 16px rgba(233, 30, 99, 0.04), 0px 16px 48px rgba(0, 0, 0, 0.2)",
214
+ "--gradient-progress": "linear-gradient(90deg, #E91E63, #F06292)",
215
+ },
216
+ light: {
217
+ "--color-lime": "#C2185B",
218
+ "--color-lime-hover": "#AD1457",
219
+ "--color-lime-gradient": "#AD1457",
220
+ "--color-lime-text": "#ffffff",
221
+ "--color-border-lime-subtle": "rgba(194, 24, 91, 0.15)",
222
+ "--color-border-lime-medium": "rgba(194, 24, 91, 0.25)",
223
+ "--color-border-lime-strong": "rgba(194, 24, 91, 0.4)",
224
+ "--color-bg-lime-subtle": "rgba(194, 24, 91, 0.06)",
225
+ "--color-bg-lime-medium": "rgba(194, 24, 91, 0.10)",
226
+ "--color-bg-lime-strong": "rgba(194, 24, 91, 0.15)",
227
+ "--shadow-btn-primary": "0 6px 20px rgba(194, 24, 91, 0.25)",
228
+ "--shadow-glow-lime": "0 0 6px rgba(194, 24, 91, 0.4), 0 0 12px rgba(194, 24, 91, 0.2)",
229
+ "--shadow-card-accent": "0px 2px 8px rgba(194, 24, 91, 0.08), 0px 12px 36px rgba(0, 0, 0, 0.06)",
230
+ "--gradient-progress": "linear-gradient(90deg, #C2185B, #EC407A)",
231
+ },
232
+ },
233
+
234
+ purple: {
235
+ label: "Purple",
236
+ hex: "#9C27B0",
237
+ dark: {
238
+ "--color-lime": "#9C27B0",
239
+ "--color-lime-hover": "#8E24AA",
240
+ "--color-lime-gradient": "#7B1FA2",
241
+ "--color-lime-text": "#ffffff",
242
+ "--color-border-lime-subtle": "rgba(156, 39, 176, 0.1)",
243
+ "--color-border-lime-medium": "rgba(156, 39, 176, 0.15)",
244
+ "--color-border-lime-strong": "rgba(156, 39, 176, 0.3)",
245
+ "--color-bg-lime-subtle": "rgba(156, 39, 176, 0.06)",
246
+ "--color-bg-lime-medium": "rgba(156, 39, 176, 0.08)",
247
+ "--color-bg-lime-strong": "rgba(156, 39, 176, 0.12)",
248
+ "--shadow-btn-primary": "0 8px 24px rgba(156, 39, 176, 0.3)",
249
+ "--shadow-glow-lime": "0 0 8px rgba(156, 39, 176, 0.6), 0 0 16px rgba(156, 39, 176, 0.3)",
250
+ "--shadow-card-accent": "inset 2px 4px 16px rgba(156, 39, 176, 0.04), 0px 16px 48px rgba(0, 0, 0, 0.2)",
251
+ "--gradient-progress": "linear-gradient(90deg, #9C27B0, #CE93D8)",
252
+ },
253
+ light: {
254
+ "--color-lime": "#7B1FA2",
255
+ "--color-lime-hover": "#6A1B9A",
256
+ "--color-lime-gradient": "#6A1B9A",
257
+ "--color-lime-text": "#ffffff",
258
+ "--color-border-lime-subtle": "rgba(123, 31, 162, 0.15)",
259
+ "--color-border-lime-medium": "rgba(123, 31, 162, 0.25)",
260
+ "--color-border-lime-strong": "rgba(123, 31, 162, 0.4)",
261
+ "--color-bg-lime-subtle": "rgba(123, 31, 162, 0.06)",
262
+ "--color-bg-lime-medium": "rgba(123, 31, 162, 0.10)",
263
+ "--color-bg-lime-strong": "rgba(123, 31, 162, 0.15)",
264
+ "--shadow-btn-primary": "0 6px 20px rgba(123, 31, 162, 0.25)",
265
+ "--shadow-glow-lime": "0 0 6px rgba(123, 31, 162, 0.4), 0 0 12px rgba(123, 31, 162, 0.2)",
266
+ "--shadow-card-accent": "0px 2px 8px rgba(123, 31, 162, 0.08), 0px 12px 36px rgba(0, 0, 0, 0.06)",
267
+ "--gradient-progress": "linear-gradient(90deg, #7B1FA2, #AB47BC)",
268
+ },
269
+ },
270
+
271
+ red: {
272
+ label: "Red",
273
+ hex: "#F44336",
274
+ dark: {
275
+ "--color-lime": "#F44336",
276
+ "--color-lime-hover": "#E53935",
277
+ "--color-lime-gradient": "#D32F2F",
278
+ "--color-lime-text": "#ffffff",
279
+ "--color-border-lime-subtle": "rgba(244, 67, 54, 0.1)",
280
+ "--color-border-lime-medium": "rgba(244, 67, 54, 0.15)",
281
+ "--color-border-lime-strong": "rgba(244, 67, 54, 0.3)",
282
+ "--color-bg-lime-subtle": "rgba(244, 67, 54, 0.06)",
283
+ "--color-bg-lime-medium": "rgba(244, 67, 54, 0.08)",
284
+ "--color-bg-lime-strong": "rgba(244, 67, 54, 0.12)",
285
+ "--shadow-btn-primary": "0 8px 24px rgba(244, 67, 54, 0.3)",
286
+ "--shadow-glow-lime": "0 0 8px rgba(244, 67, 54, 0.6), 0 0 16px rgba(244, 67, 54, 0.3)",
287
+ "--shadow-card-accent": "inset 2px 4px 16px rgba(244, 67, 54, 0.04), 0px 16px 48px rgba(0, 0, 0, 0.2)",
288
+ "--gradient-progress": "linear-gradient(90deg, #F44336, #EF9A9A)",
289
+ },
290
+ light: {
291
+ "--color-lime": "#D32F2F",
292
+ "--color-lime-hover": "#C62828",
293
+ "--color-lime-gradient": "#B71C1C",
294
+ "--color-lime-text": "#ffffff",
295
+ "--color-border-lime-subtle": "rgba(211, 47, 47, 0.15)",
296
+ "--color-border-lime-medium": "rgba(211, 47, 47, 0.25)",
297
+ "--color-border-lime-strong": "rgba(211, 47, 47, 0.4)",
298
+ "--color-bg-lime-subtle": "rgba(211, 47, 47, 0.06)",
299
+ "--color-bg-lime-medium": "rgba(211, 47, 47, 0.10)",
300
+ "--color-bg-lime-strong": "rgba(211, 47, 47, 0.15)",
301
+ "--shadow-btn-primary": "0 6px 20px rgba(211, 47, 47, 0.25)",
302
+ "--shadow-glow-lime": "0 0 6px rgba(211, 47, 47, 0.4), 0 0 12px rgba(211, 47, 47, 0.2)",
303
+ "--shadow-card-accent": "0px 2px 8px rgba(211, 47, 47, 0.08), 0px 12px 36px rgba(0, 0, 0, 0.06)",
304
+ "--gradient-progress": "linear-gradient(90deg, #D32F2F, #EF5350)",
305
+ },
306
+ },
307
+
308
+ teal: {
309
+ label: "Teal",
310
+ hex: "#009688",
311
+ dark: {
312
+ "--color-lime": "#009688",
313
+ "--color-lime-hover": "#00897B",
314
+ "--color-lime-gradient": "#00796B",
315
+ "--color-lime-text": "#ffffff",
316
+ "--color-border-lime-subtle": "rgba(0, 150, 136, 0.1)",
317
+ "--color-border-lime-medium": "rgba(0, 150, 136, 0.15)",
318
+ "--color-border-lime-strong": "rgba(0, 150, 136, 0.3)",
319
+ "--color-bg-lime-subtle": "rgba(0, 150, 136, 0.06)",
320
+ "--color-bg-lime-medium": "rgba(0, 150, 136, 0.08)",
321
+ "--color-bg-lime-strong": "rgba(0, 150, 136, 0.12)",
322
+ "--shadow-btn-primary": "0 8px 24px rgba(0, 150, 136, 0.3)",
323
+ "--shadow-glow-lime": "0 0 8px rgba(0, 150, 136, 0.6), 0 0 16px rgba(0, 150, 136, 0.3)",
324
+ "--shadow-card-accent": "inset 2px 4px 16px rgba(0, 150, 136, 0.04), 0px 16px 48px rgba(0, 0, 0, 0.2)",
325
+ "--gradient-progress": "linear-gradient(90deg, #009688, #4DB6AC)",
326
+ },
327
+ light: {
328
+ "--color-lime": "#00796B",
329
+ "--color-lime-hover": "#00695C",
330
+ "--color-lime-gradient": "#004D40",
331
+ "--color-lime-text": "#ffffff",
332
+ "--color-border-lime-subtle": "rgba(0, 121, 107, 0.15)",
333
+ "--color-border-lime-medium": "rgba(0, 121, 107, 0.25)",
334
+ "--color-border-lime-strong": "rgba(0, 121, 107, 0.4)",
335
+ "--color-bg-lime-subtle": "rgba(0, 121, 107, 0.06)",
336
+ "--color-bg-lime-medium": "rgba(0, 121, 107, 0.10)",
337
+ "--color-bg-lime-strong": "rgba(0, 121, 107, 0.15)",
338
+ "--shadow-btn-primary": "0 6px 20px rgba(0, 121, 107, 0.25)",
339
+ "--shadow-glow-lime": "0 0 6px rgba(0, 121, 107, 0.4), 0 0 12px rgba(0, 121, 107, 0.2)",
340
+ "--shadow-card-accent": "0px 2px 8px rgba(0, 121, 107, 0.08), 0px 12px 36px rgba(0, 0, 0, 0.06)",
341
+ "--gradient-progress": "linear-gradient(90deg, #00796B, #26A69A)",
342
+ },
343
+ },
344
+
345
+ yellow: {
346
+ label: "Yellow",
347
+ hex: "#FFEB3B",
348
+ dark: {
349
+ "--color-lime": "#FFEB3B",
350
+ "--color-lime-hover": "#FDD835",
351
+ "--color-lime-gradient": "#F9A825",
352
+ "--color-lime-text": "#121212",
353
+ "--color-border-lime-subtle": "rgba(255, 235, 59, 0.1)",
354
+ "--color-border-lime-medium": "rgba(255, 235, 59, 0.15)",
355
+ "--color-border-lime-strong": "rgba(255, 235, 59, 0.3)",
356
+ "--color-bg-lime-subtle": "rgba(255, 235, 59, 0.06)",
357
+ "--color-bg-lime-medium": "rgba(255, 235, 59, 0.08)",
358
+ "--color-bg-lime-strong": "rgba(255, 235, 59, 0.12)",
359
+ "--shadow-btn-primary": "0 8px 24px rgba(255, 235, 59, 0.3)",
360
+ "--shadow-glow-lime": "0 0 8px rgba(255, 235, 59, 0.6), 0 0 16px rgba(255, 235, 59, 0.3)",
361
+ "--shadow-card-accent": "inset 2px 4px 16px rgba(255, 235, 59, 0.04), 0px 16px 48px rgba(0, 0, 0, 0.2)",
362
+ "--gradient-progress": "linear-gradient(90deg, #FFEB3B, #FFF176)",
363
+ },
364
+ light: {
365
+ "--color-lime": "#F9A825",
366
+ "--color-lime-hover": "#F57F17",
367
+ "--color-lime-gradient": "#F57F17",
368
+ "--color-lime-text": "#121212",
369
+ "--color-border-lime-subtle": "rgba(249, 168, 37, 0.15)",
370
+ "--color-border-lime-medium": "rgba(249, 168, 37, 0.25)",
371
+ "--color-border-lime-strong": "rgba(249, 168, 37, 0.4)",
372
+ "--color-bg-lime-subtle": "rgba(249, 168, 37, 0.06)",
373
+ "--color-bg-lime-medium": "rgba(249, 168, 37, 0.10)",
374
+ "--color-bg-lime-strong": "rgba(249, 168, 37, 0.15)",
375
+ "--shadow-btn-primary": "0 6px 20px rgba(249, 168, 37, 0.25)",
376
+ "--shadow-glow-lime": "0 0 6px rgba(249, 168, 37, 0.4), 0 0 12px rgba(249, 168, 37, 0.2)",
377
+ "--shadow-card-accent": "0px 2px 8px rgba(249, 168, 37, 0.08), 0px 12px 36px rgba(0, 0, 0, 0.06)",
378
+ "--gradient-progress": "linear-gradient(90deg, #F9A825, #FFCA28)",
379
+ },
380
+ },
381
+ };
382
+
383
+ export const THEME_MODES = ["dark-first", "light-first"];
384
+
385
+ export const DEFAULT_COLOR = "lime";
386
+ export const DEFAULT_THEME = "dark-first";
@@ -0,0 +1,87 @@
1
+ .storeButton {
2
+ display: inline-flex;
3
+ align-items: center;
4
+ gap: 10px;
5
+ background: #000000;
6
+ border: 1.5px solid rgba(255, 255, 255, 0.15);
7
+ border-radius: 12px;
8
+ cursor: pointer;
9
+ transition: all 0.3s;
10
+ text-decoration: none;
11
+ color: #ffffff;
12
+ font-family: inherit;
13
+ outline: none;
14
+ white-space: nowrap;
15
+ }
16
+
17
+ .storeButton:hover:not(:disabled) {
18
+ background: #1a1a1a;
19
+ border-color: rgba(255, 255, 255, 0.25);
20
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3);
21
+ }
22
+
23
+ .storeButton:disabled {
24
+ opacity: 0.5;
25
+ cursor: not-allowed;
26
+ }
27
+
28
+ /* --- Sizes --- */
29
+ .sm {
30
+ height: 40px;
31
+ padding: 0 14px;
32
+ }
33
+
34
+ .md {
35
+ height: 48px;
36
+ padding: 0 18px;
37
+ }
38
+
39
+ .lg {
40
+ height: 56px;
41
+ padding: 0 22px;
42
+ }
43
+
44
+ /* --- Text block --- */
45
+ .textBlock {
46
+ display: flex;
47
+ flex-direction: column;
48
+ align-items: flex-start;
49
+ line-height: 1.1;
50
+ }
51
+
52
+ .subtitle {
53
+ font-size: 9px;
54
+ font-weight: 500;
55
+ text-transform: uppercase;
56
+ letter-spacing: 0.04em;
57
+ color: rgba(255, 255, 255, 0.7);
58
+ }
59
+
60
+ .title {
61
+ font-weight: 700;
62
+ color: #ffffff;
63
+ }
64
+
65
+ .sm .subtitle {
66
+ font-size: 8px;
67
+ }
68
+
69
+ .sm .title {
70
+ font-size: 14px;
71
+ }
72
+
73
+ .md .subtitle {
74
+ font-size: 9px;
75
+ }
76
+
77
+ .md .title {
78
+ font-size: 16px;
79
+ }
80
+
81
+ .lg .subtitle {
82
+ font-size: 10px;
83
+ }
84
+
85
+ .lg .title {
86
+ font-size: 19px;
87
+ }
@@ -0,0 +1,114 @@
1
+ "use client";
2
+
3
+ import { forwardRef } from "react";
4
+ import { cn } from "@/lib/cn";
5
+ import styles from "./AppStoreButton.module.css";
6
+
7
+ export type AppStoreSize = "sm" | "md" | "lg";
8
+
9
+ interface BaseStoreButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
10
+ size?: AppStoreSize;
11
+ }
12
+
13
+ /* ── Apple App Store ── */
14
+ export interface AppStoreButtonProps extends BaseStoreButtonProps {}
15
+
16
+ export const AppStoreButton = forwardRef<HTMLButtonElement, AppStoreButtonProps>(
17
+ ({ size = "md", className, ...props }, ref) => (
18
+ <button
19
+ ref={ref}
20
+ className={cn(styles.storeButton, styles[size], className)}
21
+ {...props}
22
+ >
23
+ <AppleLogo size={size} />
24
+ <div className={styles.textBlock}>
25
+ <span className={styles.subtitle}>Download on the</span>
26
+ <span className={styles.title}>App Store</span>
27
+ </div>
28
+ </button>
29
+ )
30
+ );
31
+ AppStoreButton.displayName = "AppStoreButton";
32
+
33
+ /* ── Google Play ── */
34
+ export interface GooglePlayButtonProps extends BaseStoreButtonProps {}
35
+
36
+ export const GooglePlayButton = forwardRef<HTMLButtonElement, GooglePlayButtonProps>(
37
+ ({ size = "md", className, ...props }, ref) => (
38
+ <button
39
+ ref={ref}
40
+ className={cn(styles.storeButton, styles[size], className)}
41
+ {...props}
42
+ >
43
+ <GooglePlayLogo size={size} />
44
+ <div className={styles.textBlock}>
45
+ <span className={styles.subtitle}>GET IT ON</span>
46
+ <span className={styles.title}>Google Play</span>
47
+ </div>
48
+ </button>
49
+ )
50
+ );
51
+ GooglePlayButton.displayName = "GooglePlayButton";
52
+
53
+ /* ── Samsung Galaxy Store ── */
54
+ export interface GalaxyStoreButtonProps extends BaseStoreButtonProps {}
55
+
56
+ export const GalaxyStoreButton = forwardRef<HTMLButtonElement, GalaxyStoreButtonProps>(
57
+ ({ size = "md", className, ...props }, ref) => (
58
+ <button
59
+ ref={ref}
60
+ className={cn(styles.storeButton, styles[size], className)}
61
+ {...props}
62
+ >
63
+ <GalaxyStoreLogo size={size} />
64
+ <div className={styles.textBlock}>
65
+ <span className={styles.subtitle}>Available on</span>
66
+ <span className={styles.title}>Galaxy Store</span>
67
+ </div>
68
+ </button>
69
+ )
70
+ );
71
+ GalaxyStoreButton.displayName = "GalaxyStoreButton";
72
+
73
+ /* ── SVG Logos ── */
74
+
75
+ function AppleLogo({ size }: { size: AppStoreSize }) {
76
+ const s = size === "sm" ? 20 : size === "md" ? 24 : 28;
77
+ return (
78
+ <svg width={s} height={s} viewBox="0 0 24 24" fill="none">
79
+ <path
80
+ d="M17.05 20.28c-.98.95-2.05.88-3.08.4-1.09-.5-2.08-.48-3.24 0-1.44.62-2.2.44-3.06-.4C2.79 15.25 3.51 7.59 9.05 7.31c1.35.07 2.29.74 3.08.8 1.18-.24 2.31-.93 3.57-.84 1.51.12 2.65.72 3.4 1.8-3.12 1.87-2.38 5.98.48 7.13-.57 1.5-1.31 2.99-2.54 4.09zM12.03 7.25c-.15-2.23 1.66-4.07 3.74-4.25.29 2.58-2.34 4.5-3.74 4.25z"
81
+ fill="#ffffff"
82
+ />
83
+ </svg>
84
+ );
85
+ }
86
+
87
+ function GooglePlayLogo({ size }: { size: AppStoreSize }) {
88
+ const s = size === "sm" ? 20 : size === "md" ? 24 : 28;
89
+ return (
90
+ <svg width={s} height={s} viewBox="0 0 24 24" fill="none">
91
+ <path d="M3.61 1.814L13.793 12 3.61 22.186a1.12 1.12 0 01-.61-.995V2.81c0-.416.232-.78.61-.995z" fill="#4285F4" />
92
+ <path d="M17.318 8.475L5.09.95C4.556.64 3.95.58 3.41.78l10.39 10.39 3.518-2.695z" fill="#34A853" />
93
+ <path d="M3.41 23.22c.54.2 1.146.14 1.68-.17l12.228-7.525-3.518-2.695L3.41 23.22z" fill="#EA4335" />
94
+ <path d="M21.39 10.473l-4.072-2.498L13.8 11.17l3.518 2.695 4.072-2.498c.74-.456.74-1.438 0-1.894z" fill="#FBBC05" />
95
+ </svg>
96
+ );
97
+ }
98
+
99
+ function GalaxyStoreLogo({ size }: { size: AppStoreSize }) {
100
+ const s = size === "sm" ? 20 : size === "md" ? 24 : 28;
101
+ return (
102
+ <svg width={s} height={s} viewBox="0 0 24 24" fill="none">
103
+ <path
104
+ d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"
105
+ fill="#FF6B35"
106
+ />
107
+ <path
108
+ d="M12 6c-3.31 0-6 2.69-6 6s2.69 6 6 6 6-2.69 6-6-2.69-6-6-6zm0 10c-2.21 0-4-1.79-4-4s1.79-4 4-4 4 1.79 4 4-1.79 4-4 4z"
109
+ fill="#FF6B35"
110
+ />
111
+ <circle cx="12" cy="12" r="2" fill="#FF6B35" />
112
+ </svg>
113
+ );
114
+ }
@@ -0,0 +1,2 @@
1
+ export { AppStoreButton, GooglePlayButton, GalaxyStoreButton } from "./AppStoreButton";
2
+ export type { AppStoreButtonProps, GooglePlayButtonProps, GalaxyStoreButtonProps, AppStoreSize } from "./AppStoreButton";
@@ -0,0 +1,76 @@
1
+ .avatar {
2
+ position: relative;
3
+ display: inline-flex;
4
+ align-items: center;
5
+ justify-content: center;
6
+ overflow: hidden;
7
+ flex-shrink: 0;
8
+ background: var(--color-bg-elevated);
9
+ border: 2px solid var(--color-border-subtle);
10
+ }
11
+
12
+ /* ── Shapes ── */
13
+ .avatar_circle { border-radius: 50%; }
14
+ .avatar_rounded { border-radius: var(--radius-md); }
15
+
16
+ /* ── Sizes ── */
17
+ .avatar_xs { width: 24px; height: 24px; font-size: 10px; }
18
+ .avatar_sm { width: 32px; height: 32px; font-size: 12px; }
19
+ .avatar_md { width: 40px; height: 40px; font-size: 14px; }
20
+ .avatar_lg { width: 48px; height: 48px; font-size: 16px; }
21
+ .avatar_xl { width: 56px; height: 56px; font-size: 18px; }
22
+ .avatar_2xl { width: 72px; height: 72px; font-size: 22px; }
23
+
24
+ .img {
25
+ width: 100%;
26
+ height: 100%;
27
+ object-fit: cover;
28
+ }
29
+
30
+ .fallback {
31
+ font-weight: 600;
32
+ color: var(--color-text-secondary);
33
+ line-height: 1;
34
+ user-select: none;
35
+ }
36
+
37
+ /* ── Status indicator ── */
38
+ .status {
39
+ position: absolute;
40
+ bottom: 0;
41
+ right: 0;
42
+ border-radius: 50%;
43
+ border: 2px solid var(--color-bg-primary);
44
+ }
45
+
46
+ .status_online { background: #22c55e; }
47
+ .status_offline { background: var(--color-text-tertiary); }
48
+ .status_away { background: #f59e0b; }
49
+ .status_busy { background: #ef4444; }
50
+
51
+ .statusPos_xs { width: 8px; height: 8px; }
52
+ .statusPos_sm { width: 8px; height: 8px; }
53
+ .statusPos_md { width: 10px; height: 10px; }
54
+ .statusPos_lg { width: 12px; height: 12px; }
55
+ .statusPos_xl { width: 14px; height: 14px; }
56
+ .statusPos_2xl { width: 16px; height: 16px; }
57
+
58
+ /* ── Group ── */
59
+ .group {
60
+ display: flex;
61
+ align-items: center;
62
+ }
63
+
64
+ .group > * {
65
+ margin-left: -8px;
66
+ }
67
+
68
+ .group > *:first-child {
69
+ margin-left: 0;
70
+ }
71
+
72
+ .overflow {
73
+ background: var(--color-bg-card);
74
+ border: 2px solid var(--color-border-standard);
75
+ z-index: 0;
76
+ }