@gigo-ui/components 1.0.0-alpha

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 (96) hide show
  1. package/README.md +49 -0
  2. package/dist/assets/favicon.svg +1 -0
  3. package/dist/components/chaos/CatchSubmit.svelte +144 -0
  4. package/dist/components/chaos/CatchSubmit.svelte.d.ts +11 -0
  5. package/dist/components/chaos/ChaosButton.svelte +132 -0
  6. package/dist/components/chaos/ChaosButton.svelte.d.ts +4 -0
  7. package/dist/components/chaos/ChaosForm.svelte +206 -0
  8. package/dist/components/chaos/ChaosForm.svelte.d.ts +10 -0
  9. package/dist/components/chaos/ColorPickerWrong.svelte +141 -0
  10. package/dist/components/chaos/ColorPickerWrong.svelte.d.ts +11 -0
  11. package/dist/components/chaos/DropdownCalc.svelte +195 -0
  12. package/dist/components/chaos/DropdownCalc.svelte.d.ts +8 -0
  13. package/dist/components/chaos/GhostCard.svelte +157 -0
  14. package/dist/components/chaos/GhostCard.svelte.d.ts +13 -0
  15. package/dist/components/chaos/GravityInput.svelte +161 -0
  16. package/dist/components/chaos/GravityInput.svelte.d.ts +13 -0
  17. package/dist/components/chaos/PasswordPeekhole.svelte +141 -0
  18. package/dist/components/chaos/PasswordPeekhole.svelte.d.ts +11 -0
  19. package/dist/components/chaos/ProgressDoom.svelte +139 -0
  20. package/dist/components/chaos/ProgressDoom.svelte.d.ts +12 -0
  21. package/dist/components/chaos/RotaryDial.svelte +221 -0
  22. package/dist/components/chaos/RotaryDial.svelte.d.ts +10 -0
  23. package/dist/components/chaos/SliderPhone.svelte +92 -0
  24. package/dist/components/chaos/SliderPhone.svelte.d.ts +10 -0
  25. package/dist/components/chaos/TermsSidescroll.svelte +121 -0
  26. package/dist/components/chaos/TermsSidescroll.svelte.d.ts +12 -0
  27. package/dist/components/chaos/VolumeSlider.svelte +116 -0
  28. package/dist/components/chaos/VolumeSlider.svelte.d.ts +14 -0
  29. package/dist/components/ui/Button.svelte +162 -0
  30. package/dist/components/ui/Button.svelte.d.ts +4 -0
  31. package/dist/components/ui/Card.svelte +141 -0
  32. package/dist/components/ui/Card.svelte.d.ts +4 -0
  33. package/dist/components/ui/Carousel.svelte +164 -0
  34. package/dist/components/ui/Carousel.svelte.d.ts +4 -0
  35. package/dist/components/ui/Form.svelte +178 -0
  36. package/dist/components/ui/Form.svelte.d.ts +4 -0
  37. package/dist/components/ui/Input.svelte +135 -0
  38. package/dist/components/ui/Input.svelte.d.ts +4 -0
  39. package/dist/components/ui/Modal.svelte +173 -0
  40. package/dist/components/ui/Modal.svelte.d.ts +4 -0
  41. package/dist/components/ui/Navigation.svelte +91 -0
  42. package/dist/components/ui/Navigation.svelte.d.ts +4 -0
  43. package/dist/docs/categories.d.ts +13 -0
  44. package/dist/docs/categories.js +17 -0
  45. package/dist/docs/component-data.d.ts +6 -0
  46. package/dist/docs/component-data.js +49 -0
  47. package/dist/docs/components/badui/catch-submit.d.ts +2 -0
  48. package/dist/docs/components/badui/catch-submit.js +49 -0
  49. package/dist/docs/components/badui/color-picker-wrong.d.ts +2 -0
  50. package/dist/docs/components/badui/color-picker-wrong.js +40 -0
  51. package/dist/docs/components/badui/dropdown-calc.d.ts +2 -0
  52. package/dist/docs/components/badui/dropdown-calc.js +28 -0
  53. package/dist/docs/components/badui/ghost-card.d.ts +2 -0
  54. package/dist/docs/components/badui/ghost-card.js +54 -0
  55. package/dist/docs/components/badui/gravity-input.d.ts +2 -0
  56. package/dist/docs/components/badui/gravity-input.js +64 -0
  57. package/dist/docs/components/badui/password-peekhole.d.ts +2 -0
  58. package/dist/docs/components/badui/password-peekhole.js +51 -0
  59. package/dist/docs/components/badui/progress-doom.d.ts +2 -0
  60. package/dist/docs/components/badui/progress-doom.js +48 -0
  61. package/dist/docs/components/badui/rotary-dial.d.ts +2 -0
  62. package/dist/docs/components/badui/rotary-dial.js +40 -0
  63. package/dist/docs/components/badui/slider-phone.d.ts +2 -0
  64. package/dist/docs/components/badui/slider-phone.js +40 -0
  65. package/dist/docs/components/badui/terms-sidescroll.d.ts +2 -0
  66. package/dist/docs/components/badui/terms-sidescroll.js +46 -0
  67. package/dist/docs/components/badui/volume-slider.d.ts +2 -0
  68. package/dist/docs/components/badui/volume-slider.js +52 -0
  69. package/dist/docs/components/chaos/chaos-button.d.ts +2 -0
  70. package/dist/docs/components/chaos/chaos-button.js +48 -0
  71. package/dist/docs/components/chaos/chaos-form.d.ts +2 -0
  72. package/dist/docs/components/chaos/chaos-form.js +68 -0
  73. package/dist/docs/components/standard/button.d.ts +2 -0
  74. package/dist/docs/components/standard/button.js +66 -0
  75. package/dist/docs/components/standard/card.d.ts +2 -0
  76. package/dist/docs/components/standard/card.js +55 -0
  77. package/dist/docs/components/standard/carousel.d.ts +2 -0
  78. package/dist/docs/components/standard/carousel.js +63 -0
  79. package/dist/docs/components/standard/form.d.ts +2 -0
  80. package/dist/docs/components/standard/form.js +57 -0
  81. package/dist/docs/components/standard/input.d.ts +2 -0
  82. package/dist/docs/components/standard/input.js +65 -0
  83. package/dist/docs/components/standard/modal.d.ts +2 -0
  84. package/dist/docs/components/standard/modal.js +63 -0
  85. package/dist/docs/components/standard/navigation.d.ts +2 -0
  86. package/dist/docs/components/standard/navigation.js +51 -0
  87. package/dist/docs/types.d.ts +16 -0
  88. package/dist/docs/types.js +1 -0
  89. package/dist/index.d.ts +22 -0
  90. package/dist/index.js +21 -0
  91. package/dist/styles/globals.css +569 -0
  92. package/dist/types/index.d.ts +177 -0
  93. package/dist/types/index.js +1 -0
  94. package/dist/utils/cn.d.ts +9 -0
  95. package/dist/utils/cn.js +90 -0
  96. package/package.json +61 -0
@@ -0,0 +1,51 @@
1
+ export const navigation = {
2
+ name: "Navigation",
3
+ slug: "navigation",
4
+ emoji: "🧭",
5
+ category: "standard",
6
+ tagline: "Nav bar with deceptive links",
7
+ description: "A horizontal navigation bar where chaos mode makes links navigate to wrong destinations, reorders items periodically, and shows fake loading spinners before navigating.",
8
+ usage: `<script lang="ts">
9
+ import { Navigation } from '@gigo-ui/components';
10
+ import type { NavItem } from '@gigo-ui/components';
11
+
12
+ const items: NavItem[] = [
13
+ { id: 'home', label: 'Home', href: '/', icon: '🏠' },
14
+ { id: 'about', label: 'About', href: '/about', icon: '📄' },
15
+ ];
16
+ </script>
17
+
18
+ <Navigation {items} chaos wrongDestinations fakeLoading />`,
19
+ props: [
20
+ {
21
+ name: "items",
22
+ type: "NavItem[]",
23
+ default: "[]",
24
+ description: "Navigation items array",
25
+ },
26
+ {
27
+ name: "chaos",
28
+ type: "boolean",
29
+ default: "false",
30
+ description: "Enable chaos mode",
31
+ },
32
+ {
33
+ name: "wrongDestinations",
34
+ type: "boolean",
35
+ default: "false",
36
+ description: "Links go to wrong places",
37
+ },
38
+ {
39
+ name: "randomReorder",
40
+ type: "boolean",
41
+ default: "false",
42
+ description: "Items reorder periodically",
43
+ },
44
+ {
45
+ name: "fakeLoading",
46
+ type: "boolean",
47
+ default: "false",
48
+ description: "Shows fake loading spinner",
49
+ },
50
+ ],
51
+ };
@@ -0,0 +1,16 @@
1
+ export interface PropDoc {
2
+ name: string;
3
+ type: string;
4
+ default: string;
5
+ description: string;
6
+ }
7
+ export interface ComponentDoc {
8
+ name: string;
9
+ slug: string;
10
+ emoji: string;
11
+ category: "badui" | "chaos" | "standard";
12
+ tagline: string;
13
+ description: string;
14
+ usage: string;
15
+ props: PropDoc[];
16
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,22 @@
1
+ export { default as Button } from "./components/ui/Button.svelte";
2
+ export { default as Input } from "./components/ui/Input.svelte";
3
+ export { default as Modal } from "./components/ui/Modal.svelte";
4
+ export { default as Card } from "./components/ui/Card.svelte";
5
+ export { default as Carousel } from "./components/ui/Carousel.svelte";
6
+ export { default as Form } from "./components/ui/Form.svelte";
7
+ export { default as Navigation } from "./components/ui/Navigation.svelte";
8
+ export { default as ChaosButton } from "./components/chaos/ChaosButton.svelte";
9
+ export { default as ChaosForm } from "./components/chaos/ChaosForm.svelte";
10
+ export { default as GhostCard } from "./components/chaos/GhostCard.svelte";
11
+ export { default as GravityInput } from "./components/chaos/GravityInput.svelte";
12
+ export { default as RotaryDial } from "./components/chaos/RotaryDial.svelte";
13
+ export { default as SliderPhone } from "./components/chaos/SliderPhone.svelte";
14
+ export { default as CatchSubmit } from "./components/chaos/CatchSubmit.svelte";
15
+ export { default as DropdownCalc } from "./components/chaos/DropdownCalc.svelte";
16
+ export { default as PasswordPeekhole } from "./components/chaos/PasswordPeekhole.svelte";
17
+ export { default as VolumeSlider } from "./components/chaos/VolumeSlider.svelte";
18
+ export { default as ProgressDoom } from "./components/chaos/ProgressDoom.svelte";
19
+ export { default as ColorPickerWrong } from "./components/chaos/ColorPickerWrong.svelte";
20
+ export { default as TermsSidescroll } from "./components/chaos/TermsSidescroll.svelte";
21
+ export type { GigoBaseProps, GigoButtonProps, GigoInputProps, GigoModalProps, GigoCardProps, GigoCarouselProps, GigoFormProps, GigoNavProps, GigoChaosButtonProps, GigoChaosFormProps, GigoGhostCardProps, GigoGravityInputProps, GigoRotaryDialProps, GigoSliderPhoneProps, GigoCatchSubmitProps, GigoDropdownCalcProps, GigoPasswordPeepholeProps, GigoVolumeSliderProps, GigoProgressDoomProps, GigoColorPickerWrongProps, GigoTermsSidescrollProps, ButtonVariant, ButtonSize, InputType, CarouselSlide, FormField, NavItem, ChaosIntensity, } from "./types/index.js";
22
+ export { cn, chaosClasses, chaosRandom, chaosPickOne, randomGarbageText, } from "./utils/cn.js";
package/dist/index.js ADDED
@@ -0,0 +1,21 @@
1
+ export { default as Button } from "./components/ui/Button.svelte";
2
+ export { default as Input } from "./components/ui/Input.svelte";
3
+ export { default as Modal } from "./components/ui/Modal.svelte";
4
+ export { default as Card } from "./components/ui/Card.svelte";
5
+ export { default as Carousel } from "./components/ui/Carousel.svelte";
6
+ export { default as Form } from "./components/ui/Form.svelte";
7
+ export { default as Navigation } from "./components/ui/Navigation.svelte";
8
+ export { default as ChaosButton } from "./components/chaos/ChaosButton.svelte";
9
+ export { default as ChaosForm } from "./components/chaos/ChaosForm.svelte";
10
+ export { default as GhostCard } from "./components/chaos/GhostCard.svelte";
11
+ export { default as GravityInput } from "./components/chaos/GravityInput.svelte";
12
+ export { default as RotaryDial } from "./components/chaos/RotaryDial.svelte";
13
+ export { default as SliderPhone } from "./components/chaos/SliderPhone.svelte";
14
+ export { default as CatchSubmit } from "./components/chaos/CatchSubmit.svelte";
15
+ export { default as DropdownCalc } from "./components/chaos/DropdownCalc.svelte";
16
+ export { default as PasswordPeekhole } from "./components/chaos/PasswordPeekhole.svelte";
17
+ export { default as VolumeSlider } from "./components/chaos/VolumeSlider.svelte";
18
+ export { default as ProgressDoom } from "./components/chaos/ProgressDoom.svelte";
19
+ export { default as ColorPickerWrong } from "./components/chaos/ColorPickerWrong.svelte";
20
+ export { default as TermsSidescroll } from "./components/chaos/TermsSidescroll.svelte";
21
+ export { cn, chaosClasses, chaosRandom, chaosPickOne, randomGarbageText, } from "./utils/cn.js";
@@ -0,0 +1,569 @@
1
+ @import url("https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800;900&family=JetBrains+Mono:wght@400;500;700&display=swap");
2
+ @import "tailwindcss";
3
+
4
+ @theme {
5
+ --radius-sm: 0.25rem;
6
+ --radius-md: 0.5rem;
7
+ --radius-lg: 0.75rem;
8
+ --radius-xl: 1rem;
9
+ --radius-2xl: 1.25rem;
10
+
11
+ --font-sans: "Inter", ui-sans-serif, system-ui, sans-serif;
12
+ --font-mono: "JetBrains Mono", ui-monospace, monospace;
13
+ --font-gigo-chaos: "Comic Sans MS", "Papyrus", cursive;
14
+ --font-gigo-nightmare: "Impact", "Courier New", serif;
15
+
16
+ /* ── Brand palette ── */
17
+ --color-gigo-magenta: #e040fb;
18
+ --color-gigo-magenta-dim: #ab47bc;
19
+ --color-gigo-lime: #76ff03;
20
+ --color-gigo-lime-dim: #64dd17;
21
+ --color-gigo-cyan: #18ffff;
22
+ --color-gigo-cyan-dim: #00e5ff;
23
+ --color-gigo-yellow: #ffea00;
24
+ --color-gigo-orange: #ff6e40;
25
+ --color-gigo-pink: #ff4081;
26
+ --color-gigo-hotpink: #ff69b4;
27
+ --color-gigo-red: #ff1744;
28
+ --color-gigo-blue: #2979ff;
29
+ --color-gigo-tomato: #ff6347;
30
+
31
+ /* ── Surface palette ── */
32
+ --color-gigo-surface: #0a0a0f;
33
+ --color-gigo-surface-raised: #12121a;
34
+ --color-gigo-surface-overlay: #1a1a25;
35
+ --color-gigo-border-subtle: rgba(255, 255, 255, 0.06);
36
+ --color-gigo-border-glow: rgba(224, 64, 251, 0.3);
37
+
38
+ /* ── Animations ── */
39
+ --animate-gigo-jitter: gigo-jitter 0.12s infinite;
40
+ --animate-gigo-wiggle: gigo-wiggle 0.5s ease-in-out infinite;
41
+ --animate-gigo-flash: gigo-flash 0.2s infinite;
42
+ --animate-gigo-shake: gigo-shake 0.5s infinite;
43
+ --animate-gigo-glitch: gigo-glitch 0.3s infinite;
44
+ --animate-gigo-chaos: gigo-chaos 1s ease-in-out infinite;
45
+ --animate-gigo-nightmare: gigo-nightmare 0.5s linear infinite;
46
+ --animate-gigo-teleport: gigo-teleport 2s ease-in-out infinite;
47
+ --animate-gigo-drunk: gigo-drunk 4s ease-in-out infinite;
48
+ --animate-gigo-float: gigo-float 6s ease-in-out infinite;
49
+ --animate-gigo-pulse-glow: gigo-pulse-glow 2s ease-in-out infinite;
50
+ --animate-gigo-gradient: gigo-gradient 8s ease infinite;
51
+ --animate-gigo-shimmer: gigo-shimmer 2s linear infinite;
52
+ --animate-gigo-entrance: gigo-entrance 0.5s cubic-bezier(0.16, 1, 0.3, 1) both;
53
+ --animate-gigo-border-spin: gigo-border-spin 4s linear infinite;
54
+ --animate-gigo-scanline: gigo-scanline 8s linear infinite;
55
+
56
+ @keyframes gigo-jitter {
57
+ 0% {
58
+ transform: translate(0);
59
+ }
60
+ 25% {
61
+ transform: translate(-2px, 2px);
62
+ }
63
+ 50% {
64
+ transform: translate(2px, -2px);
65
+ }
66
+ 75% {
67
+ transform: translate(-2px, -2px);
68
+ }
69
+ 100% {
70
+ transform: translate(2px, 2px);
71
+ }
72
+ }
73
+ @keyframes gigo-wiggle {
74
+ 0%,
75
+ 100% {
76
+ transform: rotate(-3deg);
77
+ }
78
+ 50% {
79
+ transform: rotate(3deg);
80
+ }
81
+ }
82
+ @keyframes gigo-flash {
83
+ 0%,
84
+ 100% {
85
+ opacity: 1;
86
+ }
87
+ 50% {
88
+ opacity: 0;
89
+ }
90
+ }
91
+ @keyframes gigo-shake {
92
+ 0%,
93
+ 100% {
94
+ transform: translateX(0);
95
+ }
96
+ 10%,
97
+ 30%,
98
+ 50%,
99
+ 70%,
100
+ 90% {
101
+ transform: translateX(-2px);
102
+ }
103
+ 20%,
104
+ 40%,
105
+ 60%,
106
+ 80% {
107
+ transform: translateX(2px);
108
+ }
109
+ }
110
+ @keyframes gigo-glitch {
111
+ 0% {
112
+ transform: translate(0);
113
+ filter: hue-rotate(0deg);
114
+ }
115
+ 20% {
116
+ transform: translate(-3px, 2px);
117
+ filter: hue-rotate(90deg);
118
+ }
119
+ 40% {
120
+ transform: translate(-2px, -2px);
121
+ filter: hue-rotate(180deg);
122
+ }
123
+ 60% {
124
+ transform: translate(3px, 1px);
125
+ filter: hue-rotate(270deg);
126
+ }
127
+ 80% {
128
+ transform: translate(2px, -2px);
129
+ filter: hue-rotate(360deg);
130
+ }
131
+ 100% {
132
+ transform: translate(0);
133
+ filter: hue-rotate(0deg);
134
+ }
135
+ }
136
+ @keyframes gigo-chaos {
137
+ 0% {
138
+ transform: scale(1) rotate(0deg);
139
+ filter: hue-rotate(0deg);
140
+ }
141
+ 25% {
142
+ transform: scale(1.1) rotate(5deg);
143
+ filter: hue-rotate(90deg);
144
+ }
145
+ 50% {
146
+ transform: scale(0.95) rotate(-3deg);
147
+ filter: hue-rotate(180deg);
148
+ }
149
+ 75% {
150
+ transform: scale(1.05) rotate(2deg);
151
+ filter: hue-rotate(270deg);
152
+ }
153
+ 100% {
154
+ transform: scale(1) rotate(0deg);
155
+ filter: hue-rotate(360deg);
156
+ }
157
+ }
158
+ @keyframes gigo-nightmare {
159
+ 0% {
160
+ transform: skewX(0deg) scale(1);
161
+ filter: hue-rotate(0deg) saturate(1) brightness(1);
162
+ }
163
+ 20% {
164
+ transform: skewX(5deg) scale(1.05);
165
+ filter: hue-rotate(72deg) saturate(2) brightness(1.3);
166
+ }
167
+ 40% {
168
+ transform: skewX(-4deg) scale(0.97);
169
+ filter: hue-rotate(144deg) saturate(0.5) brightness(0.8);
170
+ }
171
+ 60% {
172
+ transform: skewX(3deg) scale(1.03);
173
+ filter: hue-rotate(216deg) saturate(3) brightness(1.1);
174
+ }
175
+ 80% {
176
+ transform: skewX(-2deg) scale(0.99);
177
+ filter: hue-rotate(288deg) saturate(1.5) brightness(0.9);
178
+ }
179
+ 100% {
180
+ transform: skewX(0deg) scale(1);
181
+ filter: hue-rotate(360deg) saturate(1) brightness(1);
182
+ }
183
+ }
184
+ @keyframes gigo-teleport {
185
+ 0% {
186
+ transform: translate(0, 0) scale(1);
187
+ opacity: 1;
188
+ }
189
+ 25% {
190
+ transform: translate(60px, -30px) scale(0.6);
191
+ opacity: 0.4;
192
+ }
193
+ 50% {
194
+ transform: translate(-50px, 50px) scale(1.3);
195
+ opacity: 0.2;
196
+ }
197
+ 75% {
198
+ transform: translate(30px, -60px) scale(0.8);
199
+ opacity: 0.6;
200
+ }
201
+ 100% {
202
+ transform: translate(0, 0) scale(1);
203
+ opacity: 1;
204
+ }
205
+ }
206
+ @keyframes gigo-drunk {
207
+ 0% {
208
+ transform: rotate(0deg) translateX(0);
209
+ }
210
+ 25% {
211
+ transform: rotate(4deg) translateX(8px);
212
+ }
213
+ 50% {
214
+ transform: rotate(-3deg) translateX(-4px);
215
+ }
216
+ 75% {
217
+ transform: rotate(5deg) translateX(12px);
218
+ }
219
+ 100% {
220
+ transform: rotate(0deg) translateX(0);
221
+ }
222
+ }
223
+ @keyframes gigo-float {
224
+ 0%,
225
+ 100% {
226
+ transform: translateY(0);
227
+ }
228
+ 50% {
229
+ transform: translateY(-12px);
230
+ }
231
+ }
232
+ @keyframes gigo-pulse-glow {
233
+ 0%,
234
+ 100% {
235
+ opacity: 0.6;
236
+ }
237
+ 50% {
238
+ opacity: 1;
239
+ }
240
+ }
241
+ @keyframes gigo-gradient {
242
+ 0% {
243
+ background-position: 0% 50%;
244
+ }
245
+ 50% {
246
+ background-position: 100% 50%;
247
+ }
248
+ 100% {
249
+ background-position: 0% 50%;
250
+ }
251
+ }
252
+ @keyframes gigo-shimmer {
253
+ 0% {
254
+ transform: translateX(-100%);
255
+ }
256
+ 100% {
257
+ transform: translateX(100%);
258
+ }
259
+ }
260
+ @keyframes gigo-entrance {
261
+ from {
262
+ opacity: 0;
263
+ transform: translateY(16px) scale(0.97);
264
+ }
265
+ to {
266
+ opacity: 1;
267
+ transform: translateY(0) scale(1);
268
+ }
269
+ }
270
+ @keyframes gigo-border-spin {
271
+ from {
272
+ --gigo-angle: 0deg;
273
+ }
274
+ to {
275
+ --gigo-angle: 360deg;
276
+ }
277
+ }
278
+ @keyframes gigo-scanline {
279
+ 0% {
280
+ transform: translateY(-100%);
281
+ }
282
+ 100% {
283
+ transform: translateY(100%);
284
+ }
285
+ }
286
+ @keyframes gigo-ripple {
287
+ to {
288
+ transform: scale(4);
289
+ opacity: 0;
290
+ }
291
+ }
292
+ }
293
+
294
+ /* ══════════════════════════════════════════════
295
+ Dark-first design system (GIGO is dark by nature)
296
+ ══════════════════════════════════════════════ */
297
+ :root {
298
+ --background: #07070d;
299
+ --foreground: #ededf0;
300
+ --card: #0e0e16;
301
+ --card-foreground: #ededf0;
302
+ --primary: #e040fb;
303
+ --primary-foreground: #07070d;
304
+ --secondary: #1a1a28;
305
+ --secondary-foreground: #c4c4d0;
306
+ --muted: #14141e;
307
+ --muted-foreground: #7a7a8e;
308
+ --accent: #1e1e30;
309
+ --accent-foreground: #ededf0;
310
+ --destructive: #ff1744;
311
+ --destructive-foreground: #ffffff;
312
+ --border: rgba(255, 255, 255, 0.07);
313
+ --input: rgba(255, 255, 255, 0.07);
314
+ --ring: #e040fb;
315
+ --glow-primary:
316
+ 0 0 20px rgba(224, 64, 251, 0.35), 0 0 60px rgba(224, 64, 251, 0.1);
317
+ --glow-cyan:
318
+ 0 0 20px rgba(24, 255, 255, 0.3), 0 0 60px rgba(24, 255, 255, 0.08);
319
+ --glow-lime:
320
+ 0 0 20px rgba(118, 255, 3, 0.3), 0 0 60px rgba(118, 255, 3, 0.08);
321
+ --glow-destructive:
322
+ 0 0 20px rgba(255, 23, 68, 0.35), 0 0 60px rgba(255, 23, 68, 0.1);
323
+
324
+ /* ── Surface elevation scale ── */
325
+ --surface-0: #07070d;
326
+ --surface-1: #0e0e16;
327
+ --surface-2: #14141e;
328
+ --surface-3: #1a1a28;
329
+ --surface-border-hover: rgba(255, 255, 255, 0.12);
330
+ }
331
+
332
+ .light {
333
+ --background: #fafafe;
334
+ --foreground: #0e0e16;
335
+ --card: #ffffff;
336
+ --card-foreground: #0e0e16;
337
+ --primary: #9c27b0;
338
+ --primary-foreground: #ffffff;
339
+ --secondary: #f0f0f5;
340
+ --secondary-foreground: #2a2a3a;
341
+ --muted: #f4f4f8;
342
+ --muted-foreground: #6a6a7e;
343
+ --accent: #eeeef5;
344
+ --accent-foreground: #0e0e16;
345
+ --destructive: #d50000;
346
+ --destructive-foreground: #ffffff;
347
+ --border: rgba(0, 0, 0, 0.08);
348
+ --input: rgba(0, 0, 0, 0.08);
349
+ --ring: #9c27b0;
350
+
351
+ --surface-0: #fafafe;
352
+ --surface-1: #ffffff;
353
+ --surface-2: #f4f4f8;
354
+ --surface-3: #eeeef5;
355
+ --surface-border-hover: rgba(0, 0, 0, 0.15);
356
+ }
357
+
358
+ /* ── Base layer ── */
359
+ * {
360
+ border-color: var(--border);
361
+ }
362
+
363
+ html {
364
+ scroll-behavior: smooth;
365
+ }
366
+
367
+ body {
368
+ background-color: var(--background);
369
+ color: var(--foreground);
370
+ font-family: "Inter", ui-sans-serif, system-ui, sans-serif;
371
+ -webkit-font-smoothing: antialiased;
372
+ -moz-osx-font-smoothing: grayscale;
373
+ }
374
+
375
+ /* ── Custom scrollbar ── */
376
+ ::-webkit-scrollbar {
377
+ width: 8px;
378
+ height: 8px;
379
+ }
380
+ ::-webkit-scrollbar-track {
381
+ background: var(--background);
382
+ }
383
+ ::-webkit-scrollbar-thumb {
384
+ background: rgba(224, 64, 251, 0.25);
385
+ border-radius: 9999px;
386
+ }
387
+ ::-webkit-scrollbar-thumb:hover {
388
+ background: rgba(224, 64, 251, 0.45);
389
+ }
390
+
391
+ /* ══════════════════════════════════════════════
392
+ GIGO Utility Classes
393
+ ══════════════════════════════════════════════ */
394
+
395
+ /* Animated gradient border wrapper */
396
+ .gigo-gradient-border {
397
+ position: relative;
398
+ border-radius: var(--radius-lg);
399
+ background: var(--card);
400
+ }
401
+ .gigo-gradient-border::before {
402
+ content: "";
403
+ position: absolute;
404
+ inset: -1px;
405
+ border-radius: inherit;
406
+ padding: 1.5px;
407
+ background: conic-gradient(
408
+ from var(--gigo-angle, 0deg),
409
+ #e040fb,
410
+ #18ffff,
411
+ #76ff03,
412
+ #ff4081,
413
+ #e040fb
414
+ );
415
+ mask:
416
+ linear-gradient(#fff 0 0) content-box,
417
+ linear-gradient(#fff 0 0);
418
+ mask-composite: exclude;
419
+ -webkit-mask-composite: xor;
420
+ animation: gigo-border-spin 4s linear infinite;
421
+ opacity: 0.7;
422
+ transition: opacity 0.3s;
423
+ }
424
+ .gigo-gradient-border:hover::before {
425
+ opacity: 1;
426
+ }
427
+
428
+ /* Glass panel */
429
+ .gigo-glass {
430
+ background: rgba(14, 14, 22, 0.6);
431
+ backdrop-filter: blur(16px) saturate(1.2);
432
+ -webkit-backdrop-filter: blur(16px) saturate(1.2);
433
+ border: 1px solid rgba(255, 255, 255, 0.06);
434
+ }
435
+
436
+ /* Gradient text */
437
+ .gigo-gradient-text {
438
+ background: linear-gradient(135deg, #e040fb 0%, #18ffff 50%, #76ff03 100%);
439
+ background-size: 200% auto;
440
+ -webkit-background-clip: text;
441
+ background-clip: text;
442
+ -webkit-text-fill-color: transparent;
443
+ animation: gigo-gradient 6s ease infinite;
444
+ }
445
+
446
+ /* Neon glow text */
447
+ .gigo-neon-text {
448
+ text-shadow:
449
+ 0 0 7px rgba(224, 64, 251, 0.6),
450
+ 0 0 20px rgba(224, 64, 251, 0.3),
451
+ 0 0 42px rgba(224, 64, 251, 0.15);
452
+ }
453
+
454
+ /* Spotlight effect for cards */
455
+ .gigo-spotlight {
456
+ position: relative;
457
+ overflow: hidden;
458
+ }
459
+ .gigo-spotlight::after {
460
+ content: "";
461
+ position: absolute;
462
+ top: var(--spotlight-y, -100%);
463
+ left: var(--spotlight-x, -100%);
464
+ width: 250px;
465
+ height: 250px;
466
+ background: radial-gradient(
467
+ circle,
468
+ rgba(224, 64, 251, 0.12) 0%,
469
+ transparent 70%
470
+ );
471
+ border-radius: 50%;
472
+ pointer-events: none;
473
+ transition:
474
+ top 0.1s,
475
+ left 0.1s;
476
+ }
477
+
478
+ /* Ripple effect */
479
+ .gigo-ripple {
480
+ position: relative;
481
+ overflow: hidden;
482
+ }
483
+ .gigo-ripple-circle {
484
+ position: absolute;
485
+ border-radius: 50%;
486
+ background: rgba(224, 64, 251, 0.3);
487
+ transform: scale(0);
488
+ animation: gigo-ripple 0.6s linear;
489
+ pointer-events: none;
490
+ }
491
+
492
+ /* Shimmer overlay */
493
+ .gigo-shimmer {
494
+ position: relative;
495
+ overflow: hidden;
496
+ }
497
+ .gigo-shimmer::after {
498
+ content: "";
499
+ position: absolute;
500
+ inset: 0;
501
+ background: linear-gradient(
502
+ 90deg,
503
+ transparent 0%,
504
+ rgba(255, 255, 255, 0.04) 50%,
505
+ transparent 100%
506
+ );
507
+ animation: gigo-shimmer 3s linear infinite;
508
+ pointer-events: none;
509
+ }
510
+
511
+ /* CRT scanline overlay */
512
+ .gigo-scanlines::before {
513
+ content: "";
514
+ position: absolute;
515
+ inset: 0;
516
+ background: repeating-linear-gradient(
517
+ 0deg,
518
+ transparent,
519
+ transparent 2px,
520
+ rgba(0, 0, 0, 0.15) 2px,
521
+ rgba(0, 0, 0, 0.15) 4px
522
+ );
523
+ pointer-events: none;
524
+ z-index: 10;
525
+ border-radius: inherit;
526
+ }
527
+
528
+ /* Mesh gradient background for the hero */
529
+ .gigo-mesh-bg {
530
+ background:
531
+ radial-gradient(
532
+ ellipse at 20% 50%,
533
+ rgba(224, 64, 251, 0.15) 0%,
534
+ transparent 50%
535
+ ),
536
+ radial-gradient(
537
+ ellipse at 80% 20%,
538
+ rgba(24, 255, 255, 0.1) 0%,
539
+ transparent 50%
540
+ ),
541
+ radial-gradient(
542
+ ellipse at 50% 80%,
543
+ rgba(118, 255, 3, 0.08) 0%,
544
+ transparent 50%
545
+ ),
546
+ var(--background);
547
+ }
548
+
549
+ /* Section divider with gradient */
550
+ .gigo-divider {
551
+ height: 1px;
552
+ background: linear-gradient(
553
+ 90deg,
554
+ transparent,
555
+ rgba(224, 64, 251, 0.3),
556
+ rgba(24, 255, 255, 0.2),
557
+ transparent
558
+ );
559
+ }
560
+
561
+ /* Floating dot decorations */
562
+ .gigo-dot {
563
+ width: 4px;
564
+ height: 4px;
565
+ border-radius: 50%;
566
+ background: var(--primary);
567
+ opacity: 0.4;
568
+ animation: gigo-float 6s ease-in-out infinite;
569
+ }