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,223 @@
1
+ .socialButton {
2
+ display: inline-flex;
3
+ align-items: center;
4
+ justify-content: center;
5
+ gap: 12px;
6
+ font-family: inherit;
7
+ font-weight: 600;
8
+ cursor: pointer;
9
+ transition: all 0.3s;
10
+ outline: none;
11
+ white-space: nowrap;
12
+ border: 1.5px solid transparent;
13
+ width: 100%;
14
+ }
15
+
16
+ .socialButton:disabled {
17
+ opacity: 0.5;
18
+ cursor: not-allowed;
19
+ }
20
+
21
+ /* --- Sizes --- */
22
+ .sm {
23
+ height: 40px;
24
+ padding: 0 16px;
25
+ font-size: 13px;
26
+ border-radius: 10px;
27
+ }
28
+
29
+ .md {
30
+ height: 48px;
31
+ padding: 0 20px;
32
+ font-size: 14px;
33
+ border-radius: 12px;
34
+ }
35
+
36
+ .lg {
37
+ height: 56px;
38
+ padding: 0 24px;
39
+ font-size: 16px;
40
+ border-radius: 14px;
41
+ }
42
+
43
+ /* --- Icon --- */
44
+ .icon {
45
+ display: inline-flex;
46
+ align-items: center;
47
+ justify-content: center;
48
+ flex-shrink: 0;
49
+ }
50
+
51
+ .label {
52
+ display: inline-flex;
53
+ align-items: center;
54
+ }
55
+
56
+ /* --- Icon only --- */
57
+ .iconOnly {
58
+ width: auto;
59
+ padding: 0;
60
+ }
61
+
62
+ .iconOnly.sm {
63
+ width: 40px;
64
+ }
65
+
66
+ .iconOnly.md {
67
+ width: 48px;
68
+ }
69
+
70
+ .iconOnly.lg {
71
+ width: 56px;
72
+ }
73
+
74
+ /* --- Theme: Brand --- */
75
+ .theme-brand.social-google {
76
+ background: #ffffff;
77
+ color: #3c4043;
78
+ border-color: rgba(0, 0, 0, 0.1);
79
+ }
80
+
81
+ .theme-brand.social-google:hover:not(:disabled) {
82
+ background: #f8f9fa;
83
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
84
+ }
85
+
86
+ .theme-brand.social-facebook {
87
+ background: #1877F2;
88
+ color: #ffffff;
89
+ }
90
+
91
+ .theme-brand.social-facebook:hover:not(:disabled) {
92
+ background: #166fe5;
93
+ box-shadow: 0 2px 8px rgba(24, 119, 242, 0.4);
94
+ }
95
+
96
+ .theme-brand.social-apple {
97
+ background: #000000;
98
+ color: #ffffff;
99
+ }
100
+
101
+ .theme-brand.social-apple:hover:not(:disabled) {
102
+ background: #1a1a1a;
103
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
104
+ }
105
+
106
+ .theme-brand.social-github {
107
+ background: #24292f;
108
+ color: #ffffff;
109
+ }
110
+
111
+ .theme-brand.social-github:hover:not(:disabled) {
112
+ background: #32383f;
113
+ box-shadow: 0 2px 8px rgba(36, 41, 47, 0.4);
114
+ }
115
+
116
+ .theme-brand.social-x {
117
+ background: #000000;
118
+ color: #ffffff;
119
+ }
120
+
121
+ .theme-brand.social-x:hover:not(:disabled) {
122
+ background: #1a1a1a;
123
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
124
+ }
125
+
126
+ .theme-brand.social-linkedin {
127
+ background: #0A66C2;
128
+ color: #ffffff;
129
+ }
130
+
131
+ .theme-brand.social-linkedin:hover:not(:disabled) {
132
+ background: #095baf;
133
+ box-shadow: 0 2px 8px rgba(10, 102, 194, 0.4);
134
+ }
135
+
136
+ .theme-brand.social-microsoft {
137
+ background: #ffffff;
138
+ color: #3c4043;
139
+ border-color: rgba(0, 0, 0, 0.1);
140
+ }
141
+
142
+ .theme-brand.social-microsoft:hover:not(:disabled) {
143
+ background: #f8f9fa;
144
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
145
+ }
146
+
147
+ .theme-brand.social-discord {
148
+ background: #5865F2;
149
+ color: #ffffff;
150
+ }
151
+
152
+ .theme-brand.social-discord:hover:not(:disabled) {
153
+ background: #4752c4;
154
+ box-shadow: 0 2px 8px rgba(88, 101, 242, 0.4);
155
+ }
156
+
157
+ .theme-brand.social-slack {
158
+ background: #4A154B;
159
+ color: #ffffff;
160
+ }
161
+
162
+ .theme-brand.social-slack:hover:not(:disabled) {
163
+ background: #3b1139;
164
+ box-shadow: 0 2px 8px rgba(74, 21, 75, 0.4);
165
+ }
166
+
167
+ .theme-brand.social-figma {
168
+ background: #ffffff;
169
+ color: #3c4043;
170
+ border-color: rgba(0, 0, 0, 0.1);
171
+ }
172
+
173
+ .theme-brand.social-figma:hover:not(:disabled) {
174
+ background: #f8f9fa;
175
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
176
+ }
177
+
178
+ .theme-brand.social-dribbble {
179
+ background: #EA4C89;
180
+ color: #ffffff;
181
+ }
182
+
183
+ .theme-brand.social-dribbble:hover:not(:disabled) {
184
+ background: #d63d7a;
185
+ box-shadow: 0 2px 8px rgba(234, 76, 137, 0.4);
186
+ }
187
+
188
+ .theme-brand.social-spotify {
189
+ background: #1DB954;
190
+ color: #ffffff;
191
+ }
192
+
193
+ .theme-brand.social-spotify:hover:not(:disabled) {
194
+ background: #1aa34a;
195
+ box-shadow: 0 2px 8px rgba(29, 185, 84, 0.4);
196
+ }
197
+
198
+ /* --- Theme: Color --- */
199
+ .theme-color {
200
+ background: var(--color-bg-card);
201
+ border-color: var(--color-border-standard);
202
+ color: var(--color-text-primary);
203
+ backdrop-filter: var(--blur-standard);
204
+ }
205
+
206
+ .theme-color:hover:not(:disabled) {
207
+ background: var(--color-bg-elevated);
208
+ border-color: var(--color-border-medium);
209
+ box-shadow: var(--shadow-card-light);
210
+ }
211
+
212
+ /* --- Theme: Gray --- */
213
+ .theme-gray {
214
+ background: var(--color-bg-secondary);
215
+ border-color: var(--color-border-subtle);
216
+ color: var(--color-text-secondary);
217
+ }
218
+
219
+ .theme-gray:hover:not(:disabled) {
220
+ background: var(--color-bg-hover);
221
+ border-color: var(--color-border-standard);
222
+ color: var(--color-text-primary);
223
+ }
@@ -0,0 +1,185 @@
1
+ "use client";
2
+
3
+ import { forwardRef } from "react";
4
+ import { cn } from "@/lib/cn";
5
+ import styles from "./SocialButton.module.css";
6
+
7
+ export type SocialProvider =
8
+ | "google"
9
+ | "facebook"
10
+ | "apple"
11
+ | "github"
12
+ | "x"
13
+ | "linkedin"
14
+ | "microsoft"
15
+ | "discord"
16
+ | "slack"
17
+ | "figma"
18
+ | "dribbble"
19
+ | "spotify";
20
+
21
+ export type SocialTheme = "brand" | "color" | "gray";
22
+
23
+ export interface SocialButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
24
+ social: SocialProvider;
25
+ theme?: SocialTheme;
26
+ size?: "sm" | "md" | "lg";
27
+ }
28
+
29
+ export const SocialButton = forwardRef<HTMLButtonElement, SocialButtonProps>(
30
+ ({ social, theme = "brand", size = "md", className, children, ...props }, ref) => {
31
+ const iconOnly = !children;
32
+
33
+ return (
34
+ <button
35
+ ref={ref}
36
+ className={cn(
37
+ styles.socialButton,
38
+ styles[`theme-${theme}`],
39
+ styles[`social-${social}`],
40
+ styles[size],
41
+ iconOnly ? styles.iconOnly : undefined,
42
+ className
43
+ )}
44
+ {...props}
45
+ >
46
+ <span className={styles.icon}>
47
+ <SocialIcon social={social} theme={theme} />
48
+ </span>
49
+ {children && <span className={styles.label}>{children}</span>}
50
+ </button>
51
+ );
52
+ }
53
+ );
54
+
55
+ SocialButton.displayName = "SocialButton";
56
+
57
+ function SocialIcon({ social, theme }: { social: SocialProvider; theme: SocialTheme }) {
58
+ const size = 20;
59
+
60
+ switch (social) {
61
+ case "google":
62
+ return (
63
+ <svg width={size} height={size} viewBox="0 0 24 24" fill="none">
64
+ {theme === "gray" ? (
65
+ <path d="M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 01-2.2 3.32v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.1z" fill="currentColor" />
66
+ ) : (
67
+ <>
68
+ <path d="M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 01-2.2 3.32v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.1z" fill="#4285F4" />
69
+ <path d="M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z" fill="#34A853" />
70
+ <path d="M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z" fill="#FBBC05" />
71
+ <path d="M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z" fill="#EA4335" />
72
+ </>
73
+ )}
74
+ </svg>
75
+ );
76
+
77
+ case "facebook":
78
+ return (
79
+ <svg width={size} height={size} viewBox="0 0 24 24" fill="none">
80
+ <path d="M24 12c0-6.627-5.373-12-12-12S0 5.373 0 12c0 5.99 4.388 10.954 10.125 11.854V15.47H7.078V12h3.047V9.356c0-3.007 1.792-4.668 4.533-4.668 1.312 0 2.686.234 2.686.234v2.953H15.83c-1.491 0-1.956.925-1.956 1.875V12h3.328l-.532 3.47h-2.796v8.385C19.612 22.954 24 17.99 24 12z" fill={theme === "gray" ? "currentColor" : "#1877F2"} />
81
+ </svg>
82
+ );
83
+
84
+ case "apple":
85
+ return (
86
+ <svg width={size} height={size} viewBox="0 0 24 24" fill="none">
87
+ <path 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" fill={theme === "gray" ? "currentColor" : theme === "brand" ? "#000000" : "#555555"} />
88
+ </svg>
89
+ );
90
+
91
+ case "github":
92
+ return (
93
+ <svg width={size} height={size} viewBox="0 0 24 24" fill="none">
94
+ <path fillRule="evenodd" clipRule="evenodd" d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0024 12c0-6.63-5.37-12-12-12z" fill={theme === "gray" ? "currentColor" : theme === "brand" ? "#181717" : "#333333"} />
95
+ </svg>
96
+ );
97
+
98
+ case "x":
99
+ return (
100
+ <svg width={size} height={size} viewBox="0 0 24 24" fill="none">
101
+ <path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z" fill={theme === "gray" ? "currentColor" : theme === "brand" ? "#000000" : "#1D9BF0"} />
102
+ </svg>
103
+ );
104
+
105
+ case "linkedin":
106
+ return (
107
+ <svg width={size} height={size} viewBox="0 0 24 24" fill="none">
108
+ <path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 01-2.063-2.065 2.064 2.064 0 112.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z" fill={theme === "gray" ? "currentColor" : "#0A66C2"} />
109
+ </svg>
110
+ );
111
+
112
+ case "microsoft":
113
+ return (
114
+ <svg width={size} height={size} viewBox="0 0 24 24" fill="none">
115
+ {theme === "gray" ? (
116
+ <>
117
+ <rect x="1" y="1" width="10" height="10" fill="currentColor" opacity="0.9" />
118
+ <rect x="13" y="1" width="10" height="10" fill="currentColor" opacity="0.7" />
119
+ <rect x="1" y="13" width="10" height="10" fill="currentColor" opacity="0.6" />
120
+ <rect x="13" y="13" width="10" height="10" fill="currentColor" opacity="0.5" />
121
+ </>
122
+ ) : (
123
+ <>
124
+ <rect x="1" y="1" width="10" height="10" fill="#F25022" />
125
+ <rect x="13" y="1" width="10" height="10" fill="#7FBA00" />
126
+ <rect x="1" y="13" width="10" height="10" fill="#00A4EF" />
127
+ <rect x="13" y="13" width="10" height="10" fill="#FFB900" />
128
+ </>
129
+ )}
130
+ </svg>
131
+ );
132
+
133
+ case "discord":
134
+ return (
135
+ <svg width={size} height={size} viewBox="0 0 24 24" fill="none">
136
+ <path d="M20.317 4.37a19.791 19.791 0 00-4.885-1.515.074.074 0 00-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 00-5.487 0 12.64 12.64 0 00-.617-1.25.077.077 0 00-.079-.037A19.736 19.736 0 003.677 4.37a.07.07 0 00-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 00.031.057 19.9 19.9 0 005.993 3.03.078.078 0 00.084-.028c.462-.63.874-1.295 1.226-1.994a.076.076 0 00-.041-.106 13.107 13.107 0 01-1.872-.892.077.077 0 01-.008-.128 10.2 10.2 0 00.372-.292.074.074 0 01.077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 01.078.01c.12.098.246.198.373.292a.077.077 0 01-.006.127 12.299 12.299 0 01-1.873.892.077.077 0 00-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 00.084.028 19.839 19.839 0 006.002-3.03.077.077 0 00.032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 00-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.956-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.955-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.946 2.418-2.157 2.418z" fill={theme === "gray" ? "currentColor" : "#5865F2"} />
137
+ </svg>
138
+ );
139
+
140
+ case "slack":
141
+ return (
142
+ <svg width={size} height={size} viewBox="0 0 24 24" fill="none">
143
+ {theme === "gray" ? (
144
+ <path d="M5.042 15.165a2.528 2.528 0 01-2.52 2.523A2.528 2.528 0 010 15.165a2.527 2.527 0 012.522-2.52h2.52v2.52zm1.271 0a2.527 2.527 0 012.521-2.52 2.527 2.527 0 012.521 2.52v6.313A2.528 2.528 0 018.834 24a2.528 2.528 0 01-2.521-2.522v-6.313zM8.834 5.042a2.528 2.528 0 01-2.521-2.52A2.528 2.528 0 018.834 0a2.528 2.528 0 012.521 2.522v2.52H8.834zm0 1.271a2.528 2.528 0 012.521 2.521 2.528 2.528 0 01-2.521 2.521H2.522A2.528 2.528 0 010 8.834a2.528 2.528 0 012.522-2.521h6.312zm6.313 2.521a2.528 2.528 0 012.521-2.521A2.528 2.528 0 0124 8.834a2.528 2.528 0 01-2.522 2.521h-2.52V8.834zm-1.271 0a2.528 2.528 0 01-2.521 2.521 2.528 2.528 0 01-2.522-2.521V2.522A2.528 2.528 0 0111.355 0a2.528 2.528 0 012.521 2.522v6.312zm-2.521 6.313a2.528 2.528 0 012.521 2.521 2.528 2.528 0 01-2.521 2.522 2.528 2.528 0 01-2.522-2.522v-2.521h2.522zm0-1.271a2.528 2.528 0 01-2.522-2.521 2.528 2.528 0 012.522-2.522h6.313A2.528 2.528 0 0124 15.165a2.528 2.528 0 01-2.522 2.521h-6.313z" fill="currentColor" />
145
+ ) : (
146
+ <path d="M5.042 15.165a2.528 2.528 0 01-2.52 2.523A2.528 2.528 0 010 15.165a2.527 2.527 0 012.522-2.52h2.52v2.52zm1.271 0a2.527 2.527 0 012.521-2.52 2.527 2.527 0 012.521 2.52v6.313A2.528 2.528 0 018.834 24a2.528 2.528 0 01-2.521-2.522v-6.313zM8.834 5.042a2.528 2.528 0 01-2.521-2.52A2.528 2.528 0 018.834 0a2.528 2.528 0 012.521 2.522v2.52H8.834zm0 1.271a2.528 2.528 0 012.521 2.521 2.528 2.528 0 01-2.521 2.521H2.522A2.528 2.528 0 010 8.834a2.528 2.528 0 012.522-2.521h6.312zm6.313 2.521a2.528 2.528 0 012.521-2.521A2.528 2.528 0 0124 8.834a2.528 2.528 0 01-2.522 2.521h-2.52V8.834zm-1.271 0a2.528 2.528 0 01-2.521 2.521 2.528 2.528 0 01-2.522-2.521V2.522A2.528 2.528 0 0111.355 0a2.528 2.528 0 012.521 2.522v6.312zm-2.521 6.313a2.528 2.528 0 012.521 2.521 2.528 2.528 0 01-2.521 2.522 2.528 2.528 0 01-2.522-2.522v-2.521h2.522zm0-1.271a2.528 2.528 0 01-2.522-2.521 2.528 2.528 0 012.522-2.522h6.313A2.528 2.528 0 0124 15.165a2.528 2.528 0 01-2.522 2.521h-6.313z" fill="#E01E5A" />
147
+ )}
148
+ </svg>
149
+ );
150
+
151
+ case "figma":
152
+ return (
153
+ <svg width={size} height={size} viewBox="0 0 24 24" fill="none">
154
+ {theme === "gray" ? (
155
+ <path d="M15.852 8.981h-4.588V0h4.588c2.476 0 4.49 2.014 4.49 4.49s-2.014 4.491-4.49 4.491zM12.735 7.51h3.117c1.665 0 3.019-1.355 3.019-3.019s-1.355-3.019-3.019-3.019h-3.117V7.51zm0 8.943h-4.588c-2.476 0-4.49-2.014-4.49-4.49s2.014-4.49 4.49-4.49h4.588v8.981zm-4.588-7.51c-1.665 0-3.019 1.355-3.019 3.019s1.355 3.019 3.019 3.019h3.117V8.943H8.148zm4.588 15.057h-4.588c-2.476 0-4.49-2.014-4.49-4.49s2.014-4.49 4.49-4.49h4.588v8.981zm-4.588-7.51c-1.665 0-3.019 1.355-3.019 3.019s1.355 3.019 3.019 3.019h3.117V16.49H8.148zm11.704-3.527c0 2.476-2.014 4.49-4.49 4.49s-4.49-2.014-4.49-4.49 2.014-4.49 4.49-4.49 4.49 2.014 4.49 4.49zm-1.471 0c0-1.665-1.355-3.019-3.019-3.019s-3.019 1.355-3.019 3.019 1.355 3.019 3.019 3.019 3.019-1.355 3.019-3.019z" fill="currentColor" />
156
+ ) : (
157
+ <>
158
+ <path d="M8.148 24c2.476 0 4.49-2.014 4.49-4.49v-4.49H8.148c-2.476 0-4.49 2.013-4.49 4.49 0 2.476 2.014 4.49 4.49 4.49z" fill="#0ACF83" />
159
+ <path d="M3.657 10.962c0-2.476 2.014-4.49 4.49-4.49h4.49v8.981h-4.49c-2.476 0-4.49-2.014-4.49-4.49z" fill="#A259FF" />
160
+ <path d="M3.657 1.49C3.657.014 5.671 0 8.148 0h4.49v8.981h-4.49c-2.476 0-4.49-2.014-4.49-4.49z" fill="#F24E1E" />
161
+ <path d="M12.735 0h4.49c2.476 0 4.49 2.014 4.49 4.49s-2.014 4.49-4.49 4.49h-4.49V0z" fill="#FF7262" />
162
+ <path d="M21.716 10.962c0 2.476-2.014 4.49-4.49 4.49s-4.49-2.014-4.49-4.49 2.014-4.49 4.49-4.49 4.49 2.014 4.49 4.49z" fill="#1ABCFE" />
163
+ </>
164
+ )}
165
+ </svg>
166
+ );
167
+
168
+ case "dribbble":
169
+ return (
170
+ <svg width={size} height={size} viewBox="0 0 24 24" fill="none">
171
+ <path d="M12 24C5.385 24 0 18.615 0 12S5.385 0 12 0s12 5.385 12 12-5.385 12-12 12zm10.12-10.358c-.35-.11-3.17-.953-6.384-.438 1.34 3.684 1.887 6.684 1.992 7.308a10.174 10.174 0 004.392-6.87zm-6.115 7.808c-.153-.9-.75-4.032-2.19-7.77l-.066.02c-5.79 2.015-7.86 6.025-8.04 6.4a10.15 10.15 0 006.29 2.166c1.42 0 2.77-.29 4.006-.816zm-11.62-2.58c.232-.4 3.045-5.055 8.332-6.765.135-.045.27-.084.405-.12-.26-.585-.54-1.167-.832-1.74C7.17 11.775 2.206 11.71 1.756 11.7l-.004.312c0 2.633.998 5.037 2.634 6.855zm-2.42-8.955c.46.008 4.683.026 9.477-1.248-1.698-3.018-3.53-5.558-3.8-5.928-2.868 1.35-5.01 3.99-5.676 7.17zM9.6 2.052c.282.38 2.145 2.914 3.822 6 3.645-1.365 5.19-3.44 5.373-3.702A10.15 10.15 0 0012 1.822c-.83 0-1.632.08-2.4.23zm10.335 3.483c-.218.29-1.91 2.493-5.724 4.04.24.49.47.985.68 1.486.075.18.15.36.22.53 3.41-.428 6.8.26 7.14.33-.02-2.42-.88-4.64-2.316-6.386z" fill={theme === "gray" ? "currentColor" : "#EA4C89"} />
172
+ </svg>
173
+ );
174
+
175
+ case "spotify":
176
+ return (
177
+ <svg width={size} height={size} viewBox="0 0 24 24" fill="none">
178
+ <path d="M12 0C5.4 0 0 5.4 0 12s5.4 12 12 12 12-5.4 12-12S18.66 0 12 0zm5.521 17.34c-.24.359-.66.48-1.021.24-2.82-1.74-6.36-2.101-10.561-1.141-.418.122-.779-.179-.899-.539-.12-.421.18-.78.54-.9 4.56-1.021 8.52-.6 11.64 1.32.42.18.479.659.301 1.02zm1.44-3.3c-.301.42-.841.6-1.262.3-3.239-1.98-8.159-2.58-11.939-1.38-.479.12-1.02-.12-1.14-.6-.12-.48.12-1.021.6-1.141C9.6 9.9 15 10.561 18.72 12.84c.361.181.54.78.241 1.2zm.12-3.36C15.24 8.4 8.82 8.16 5.16 9.301c-.6.179-1.2-.181-1.38-.721-.18-.601.18-1.2.72-1.381 4.26-1.26 11.28-1.02 15.721 1.621.539.3.719 1.02.419 1.56-.299.421-1.02.599-1.559.3z" fill={theme === "gray" ? "currentColor" : "#1DB954"} />
179
+ </svg>
180
+ );
181
+
182
+ default:
183
+ return null;
184
+ }
185
+ }
@@ -0,0 +1,2 @@
1
+ export { SocialButton } from "./SocialButton";
2
+ export type { SocialButtonProps, SocialProvider, SocialTheme } from "./SocialButton";
@@ -0,0 +1,203 @@
1
+ /* ── Tag Base ── */
2
+ .tag {
3
+ display: inline-flex;
4
+ align-items: center;
5
+ gap: 6px;
6
+ border-radius: var(--radius-full);
7
+ background: var(--color-bg-card);
8
+ border: 1.5px solid var(--color-border-standard);
9
+ color: var(--color-text-primary);
10
+ font-family: inherit;
11
+ white-space: nowrap;
12
+ transition: all 0.2s;
13
+ cursor: default;
14
+ user-select: none;
15
+ }
16
+
17
+ /* ── Sizes ── */
18
+ .sm {
19
+ padding: 4px 10px;
20
+ font-size: 12px;
21
+ gap: 4px;
22
+ }
23
+
24
+ .md {
25
+ padding: 6px 12px;
26
+ font-size: 13px;
27
+ gap: 6px;
28
+ }
29
+
30
+ .lg {
31
+ padding: 8px 16px;
32
+ font-size: 14px;
33
+ gap: 8px;
34
+ }
35
+
36
+ /* ── Label ── */
37
+ .label {
38
+ font-weight: 500;
39
+ line-height: 1;
40
+ }
41
+
42
+ /* ── Dot ── */
43
+ .dot {
44
+ width: 6px;
45
+ height: 6px;
46
+ border-radius: 50%;
47
+ background: var(--color-lime);
48
+ flex-shrink: 0;
49
+ }
50
+
51
+ .sm .dot {
52
+ width: 5px;
53
+ height: 5px;
54
+ }
55
+
56
+ .lg .dot {
57
+ width: 7px;
58
+ height: 7px;
59
+ }
60
+
61
+ /* ── Avatar ── */
62
+ .avatar {
63
+ width: 18px;
64
+ height: 18px;
65
+ border-radius: 50%;
66
+ object-fit: cover;
67
+ flex-shrink: 0;
68
+ border: 1px solid var(--color-border-subtle);
69
+ }
70
+
71
+ .sm .avatar {
72
+ width: 14px;
73
+ height: 14px;
74
+ }
75
+
76
+ .lg .avatar {
77
+ width: 22px;
78
+ height: 22px;
79
+ }
80
+
81
+ /* ── Count Badge ── */
82
+ .count {
83
+ display: inline-flex;
84
+ align-items: center;
85
+ justify-content: center;
86
+ min-width: 18px;
87
+ height: 18px;
88
+ padding: 0 5px;
89
+ border-radius: var(--radius-full);
90
+ background: var(--color-bg-elevated);
91
+ border: 1px solid var(--color-border-subtle);
92
+ font-size: 10px;
93
+ font-weight: 700;
94
+ color: var(--color-text-secondary);
95
+ line-height: 1;
96
+ }
97
+
98
+ .sm .count {
99
+ min-width: 14px;
100
+ height: 14px;
101
+ padding: 0 3px;
102
+ font-size: 9px;
103
+ }
104
+
105
+ .lg .count {
106
+ min-width: 20px;
107
+ height: 20px;
108
+ padding: 0 6px;
109
+ font-size: 11px;
110
+ }
111
+
112
+ /* ── Remove Button (X) ── */
113
+ .removeBtn {
114
+ display: flex;
115
+ align-items: center;
116
+ justify-content: center;
117
+ background: none;
118
+ border: none;
119
+ padding: 0;
120
+ margin: 0 -2px 0 0;
121
+ cursor: pointer;
122
+ color: var(--color-text-tertiary);
123
+ transition: color 0.2s;
124
+ flex-shrink: 0;
125
+ line-height: 1;
126
+ }
127
+
128
+ .removeBtn:hover {
129
+ color: var(--color-text-primary);
130
+ }
131
+
132
+ .removeBtn:disabled {
133
+ cursor: not-allowed;
134
+ opacity: 0.4;
135
+ }
136
+
137
+ /* ── Checkbox ── */
138
+ .checkbox {
139
+ display: flex;
140
+ align-items: center;
141
+ justify-content: center;
142
+ flex-shrink: 0;
143
+ line-height: 1;
144
+ }
145
+
146
+ .checkable {
147
+ cursor: pointer;
148
+ }
149
+
150
+ .checkable:hover {
151
+ border-color: var(--color-border-medium);
152
+ background: var(--color-bg-hover);
153
+ }
154
+
155
+ .checked {
156
+ border-color: var(--color-border-lime-medium);
157
+ background: var(--color-bg-lime-subtle);
158
+ }
159
+
160
+ .checked:hover {
161
+ border-color: var(--color-border-lime-strong);
162
+ background: var(--color-bg-lime-medium);
163
+ }
164
+
165
+ /* ── Disabled ── */
166
+ .disabled {
167
+ opacity: 0.5;
168
+ cursor: not-allowed;
169
+ pointer-events: none;
170
+ }
171
+
172
+ /* ── Tag Group ── */
173
+ .tagGroup {
174
+ display: flex;
175
+ flex-direction: column;
176
+ gap: 10px;
177
+ }
178
+
179
+ .tagGroupLabel {
180
+ font-weight: 600;
181
+ color: var(--color-text-secondary);
182
+ letter-spacing: 0.01em;
183
+ }
184
+
185
+ .labelsm {
186
+ font-size: 12px;
187
+ }
188
+
189
+ .labelmd {
190
+ font-size: 13px;
191
+ }
192
+
193
+ .labellg {
194
+ font-size: 14px;
195
+ }
196
+
197
+ /* ── Tag List ── */
198
+ .tagList {
199
+ display: flex;
200
+ flex-wrap: wrap;
201
+ gap: 8px;
202
+ align-items: center;
203
+ }