kozenet_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 (50) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +5 -0
  3. data/CODE_OF_CONDUCT.md +132 -0
  4. data/LICENSE.txt +21 -0
  5. data/README.md +76 -0
  6. data/app/assets/images/kozenet_ui/icons/cart.svg +1 -0
  7. data/app/assets/images/kozenet_ui/icons/heart.svg +1 -0
  8. data/app/assets/javascripts/kozenet_ui/controllers/dropdown_controller.js +55 -0
  9. data/app/assets/javascripts/kozenet_ui/controllers/header_controller.js +32 -0
  10. data/app/assets/javascripts/kozenet_ui/controllers/mobile_nav_controller.js +43 -0
  11. data/app/assets/javascripts/kozenet_ui/controllers/user_menu_controller.js +60 -0
  12. data/app/assets/javascripts/kozenet_ui/index.js +23 -0
  13. data/app/assets/stylesheets/kozenet_ui/base.css +69 -0
  14. data/app/assets/stylesheets/kozenet_ui/components/avatar.css +88 -0
  15. data/app/assets/stylesheets/kozenet_ui/components/badge.css +101 -0
  16. data/app/assets/stylesheets/kozenet_ui/components/button.css +230 -0
  17. data/app/assets/stylesheets/kozenet_ui/components/header.css +389 -0
  18. data/app/assets/stylesheets/kozenet_ui/components/utilities.css +270 -0
  19. data/app/assets/stylesheets/kozenet_ui/components.css +8 -0
  20. data/app/assets/stylesheets/kozenet_ui/tokens.css +168 -0
  21. data/app/components/kozenet_ui/avatar_component.rb +72 -0
  22. data/app/components/kozenet_ui/badge_component.rb +62 -0
  23. data/app/components/kozenet_ui/base_component.rb +84 -0
  24. data/app/components/kozenet_ui/button_component.rb +156 -0
  25. data/app/components/kozenet_ui/header_component/action_button_component.html.erb +11 -0
  26. data/app/components/kozenet_ui/header_component/action_button_component.rb +29 -0
  27. data/app/components/kozenet_ui/header_component/brand_component.rb +32 -0
  28. data/app/components/kozenet_ui/header_component/cta_component.html.erb +5 -0
  29. data/app/components/kozenet_ui/header_component/cta_component.rb +23 -0
  30. data/app/components/kozenet_ui/header_component/nav_item_component.html.erb +8 -0
  31. data/app/components/kozenet_ui/header_component/nav_item_component.rb +28 -0
  32. data/app/components/kozenet_ui/header_component/search_component.html.erb +17 -0
  33. data/app/components/kozenet_ui/header_component/search_component.rb +29 -0
  34. data/app/components/kozenet_ui/header_component/user_menu_component.html.erb +18 -0
  35. data/app/components/kozenet_ui/header_component/user_menu_component.rb +21 -0
  36. data/app/components/kozenet_ui/header_component.html.erb +81 -0
  37. data/app/components/kozenet_ui/header_component.rb +40 -0
  38. data/app/helpers/kozenet_ui/component_helper.rb +59 -0
  39. data/app/helpers/kozenet_ui/icon_helper.rb +16 -0
  40. data/lib/generators/kozenet_ui/install/install_generator.rb +67 -0
  41. data/lib/generators/kozenet_ui/install/templates/kozenet_ui.rb +39 -0
  42. data/lib/generators/kozenet_ui/install/templates/tailwind.config.js +19 -0
  43. data/lib/kozenet_ui/configuration.rb +21 -0
  44. data/lib/kozenet_ui/engine.rb +94 -0
  45. data/lib/kozenet_ui/theme/palette.rb +132 -0
  46. data/lib/kozenet_ui/theme/tokens.rb +100 -0
  47. data/lib/kozenet_ui/theme/variants.rb +51 -0
  48. data/lib/kozenet_ui/version.rb +5 -0
  49. data/lib/kozenet_ui.rb +30 -0
  50. metadata +308 -0
@@ -0,0 +1,101 @@
1
+ @layer components {
2
+ /* Badge base */
3
+ .kz-badge {
4
+ border-radius: var(--kz-radius-sm);
5
+ font-weight: var(--kz-font-weight-bold);
6
+ letter-spacing: 0.05em;
7
+ transition: all var(--kz-transition-base);
8
+ }
9
+
10
+ /* Size variants */
11
+ .kz-badge.kz-size-xs {
12
+ padding: 0.25rem 0.5rem;
13
+ font-size: 0.625rem;
14
+ line-height: 1;
15
+ }
16
+
17
+ .kz-badge.kz-size-sm {
18
+ padding: 0.35rem 0.6rem;
19
+ font-size: var(--kz-font-size-xs);
20
+ line-height: 1;
21
+ }
22
+
23
+ .kz-badge.kz-size-md {
24
+ padding: 0.4rem 0.7rem;
25
+ font-size: var(--kz-font-size-sm);
26
+ line-height: 1.2;
27
+ }
28
+
29
+ .kz-badge.kz-size-lg {
30
+ padding: 0.5rem 0.85rem;
31
+ font-size: var(--kz-font-size-base);
32
+ line-height: 1.2;
33
+ }
34
+
35
+ /* Variant colors */
36
+ .kz-badge.kz-badge-primary,
37
+ .kz-badge.kz-variant-primary {
38
+ background: linear-gradient(120deg, #6366f1, #0ea5e9);
39
+ color: white;
40
+ box-shadow: 0 2px 8px -2px rgba(99, 102, 241, 0.4);
41
+ }
42
+
43
+ .kz-badge.kz-badge-secondary,
44
+ .kz-badge.kz-variant-secondary {
45
+ background: linear-gradient(120deg, #8b5cf6, #a855f7);
46
+ color: white;
47
+ box-shadow: 0 2px 8px -2px rgba(139, 92, 246, 0.4);
48
+ }
49
+
50
+ .kz-badge.kz-badge-success,
51
+ .kz-badge.kz-variant-success {
52
+ background: linear-gradient(120deg, #10b981, #059669);
53
+ color: white;
54
+ box-shadow: 0 2px 8px -2px rgba(16, 185, 129, 0.4);
55
+ }
56
+
57
+ .kz-badge.kz-badge-warning,
58
+ .kz-badge.kz-variant-warning {
59
+ background: linear-gradient(120deg, #f59e0b, #d97706);
60
+ color: white;
61
+ box-shadow: 0 2px 8px -2px rgba(245, 158, 11, 0.4);
62
+ }
63
+
64
+ .kz-badge.kz-badge-error,
65
+ .kz-badge.kz-variant-error {
66
+ background: linear-gradient(120deg, #ef4444, #dc2626);
67
+ color: white;
68
+ box-shadow: 0 2px 8px -2px rgba(239, 68, 68, 0.4);
69
+ }
70
+
71
+ .kz-badge.kz-badge-info,
72
+ .kz-badge.kz-variant-info {
73
+ background: linear-gradient(120deg, #0ea5e9, #0284c7);
74
+ color: white;
75
+ box-shadow: 0 2px 8px -2px rgba(14, 165, 233, 0.4);
76
+ }
77
+
78
+ /* Ghost variant */
79
+ .kz-badge.kz-variant-ghost {
80
+ background: transparent;
81
+ color: var(--kz-text-muted);
82
+ border: 1px solid var(--kz-border-default);
83
+ }
84
+
85
+ /* Outline variants */
86
+ .kz-badge.kz-variant-outline {
87
+ background: transparent;
88
+ border: 1px solid currentColor;
89
+ }
90
+
91
+ /* Icon spacing */
92
+ .kz-badge-icon {
93
+ display: inline-flex;
94
+ align-items: center;
95
+ }
96
+
97
+ .kz-badge-icon svg {
98
+ width: 0.875em;
99
+ height: 0.875em;
100
+ }
101
+ }
@@ -0,0 +1,230 @@
1
+ @layer components {
2
+ /* Base button styles */
3
+ .kz-btn {
4
+ position: relative;
5
+ border: 0;
6
+ cursor: pointer;
7
+ user-select: none;
8
+ -webkit-tap-highlight-color: transparent;
9
+ }
10
+
11
+ /* Size variants */
12
+ .kz-btn.kz-size-xs {
13
+ padding-left: 0.75rem;
14
+ padding-right: 0.75rem;
15
+ padding-top: 0.375rem;
16
+ padding-bottom: 0.375rem;
17
+ font-size: 0.75rem;
18
+ border-radius: var(--kz-radius-sm);
19
+ min-height: 32px;
20
+ font-size: var(--kz-font-size-xs);
21
+ }
22
+
23
+ .kz-btn.kz-size-sm {
24
+ padding-left: 1rem;
25
+ padding-right: 1rem;
26
+ padding-top: 0.5rem;
27
+ padding-bottom: 0.5rem;
28
+ border-radius: 14px;
29
+ min-height: 36px;
30
+ font-size: var(--kz-font-size-sm);
31
+ }
32
+
33
+ .kz-btn.kz-size-md {
34
+ padding-left: 1.25rem;
35
+ padding-right: 1.25rem;
36
+ padding-top: 0.625rem;
37
+ padding-bottom: 0.625rem;
38
+ border-radius: var(--kz-radius-md);
39
+ min-height: 46px;
40
+ font-size: var(--kz-font-size-sm);
41
+ letter-spacing: 0.35px;
42
+ }
43
+
44
+ .kz-btn.kz-size-lg {
45
+ padding-left: 1.5rem;
46
+ padding-right: 1.5rem;
47
+ padding-top: 0.75rem;
48
+ padding-bottom: 0.75rem;
49
+ border-radius: 18px;
50
+ min-height: 52px;
51
+ font-size: var(--kz-font-size-base);
52
+ font-weight: var(--kz-font-weight-semibold);
53
+ }
54
+
55
+ .kz-btn.kz-size-xl {
56
+ padding-left: 2rem;
57
+ padding-right: 2rem;
58
+ padding-top: 1rem;
59
+ padding-bottom: 1rem;
60
+ border-radius: var(--kz-radius-lg);
61
+ min-height: 60px;
62
+ font-size: var(--kz-font-size-lg);
63
+ font-weight: var(--kz-font-weight-semibold);
64
+ }
65
+
66
+ /* Primary variant - Gradient */
67
+ .kz-btn.kz-variant-primary {
68
+ background: linear-gradient(110deg, #6366f1, #0ea5e9 55%, #06b6d4);
69
+ color: white;
70
+ box-shadow: var(--kz-shadow-md);
71
+ transition: transform var(--kz-transition-base), box-shadow var(--kz-transition-base);
72
+ }
73
+
74
+ .kz-btn.kz-variant-primary:hover:not(:disabled) {
75
+ transform: translateY(-2px);
76
+ box-shadow: var(--kz-shadow-lg);
77
+ }
78
+
79
+ .kz-btn.kz-variant-primary:active:not(:disabled) {
80
+ transform: translateY(-1px);
81
+ }
82
+
83
+ /* Secondary variant - Elevated glass */
84
+ .kz-btn.kz-variant-secondary {
85
+ background: linear-gradient(135deg, rgba(255,255,255,.65), rgba(255,255,255,.5));
86
+ border: 1px solid rgba(0,0,0,0.05);
87
+ color: var(--kz-text-default);
88
+ backdrop-filter: blur(10px);
89
+ transition: all var(--kz-transition-base);
90
+ }
91
+
92
+ .dark .kz-btn.kz-variant-secondary {
93
+ background: linear-gradient(135deg, rgba(255,255,255,.12), rgba(255,255,255,.08));
94
+ border-color: rgba(255,255,255,0.1);
95
+ }
96
+
97
+ .kz-btn.kz-variant-secondary:hover:not(:disabled) {
98
+ background: linear-gradient(135deg, rgba(255,255,255,.9), rgba(255,255,255,.75));
99
+ transform: translateY(-2px);
100
+ }
101
+
102
+ .dark .kz-btn.kz-variant-secondary:hover:not(:disabled) {
103
+ background: linear-gradient(135deg, rgba(255,255,255,.18), rgba(255,255,255,.12));
104
+ }
105
+
106
+ /* Ghost variant */
107
+ .kz-btn.kz-variant-ghost {
108
+ background: transparent;
109
+ color: var(--kz-text-muted);
110
+ transition: all var(--kz-transition-base);
111
+ }
112
+
113
+ .kz-btn.kz-variant-ghost:hover:not(:disabled) {
114
+ background: rgba(0,0,0,0.05);
115
+ color: var(--kz-text-default);
116
+ }
117
+
118
+ .dark .kz-btn.kz-variant-ghost:hover:not(:disabled) {
119
+ background: rgba(255,255,255,0.08);
120
+ }
121
+
122
+ /* Outline variant */
123
+ .kz-btn.kz-variant-outline {
124
+ background: transparent;
125
+ border: 1px solid var(--kz-border-default);
126
+ color: var(--kz-text-default);
127
+ transition: all var(--kz-transition-base);
128
+ }
129
+
130
+ .kz-btn.kz-variant-outline:hover:not(:disabled) {
131
+ background: rgba(0,0,0,0.05);
132
+ border-color: var(--kz-text-default);
133
+ }
134
+
135
+ .dark .kz-btn.kz-variant-outline:hover:not(:disabled) {
136
+ background: rgba(255,255,255,0.08);
137
+ }
138
+
139
+ /* Accent variant */
140
+ .kz-btn.kz-variant-accent {
141
+ background: linear-gradient(125deg, #6366f1, #0ea5e9 55%, #06b6d4);
142
+ color: white;
143
+ box-shadow: var(--kz-shadow-md);
144
+ transition: transform var(--kz-transition-base), box-shadow var(--kz-transition-base);
145
+ }
146
+
147
+ .kz-btn.kz-variant-accent:hover:not(:disabled) {
148
+ transform: translateY(-2px);
149
+ box-shadow: var(--kz-shadow-lg);
150
+ }
151
+
152
+ /* Success variant */
153
+ .kz-btn.kz-variant-success {
154
+ background: linear-gradient(125deg, #10b981, #059669);
155
+ color: white;
156
+ box-shadow: var(--kz-shadow-md);
157
+ }
158
+
159
+ .kz-btn.kz-variant-success:hover:not(:disabled) {
160
+ transform: translateY(-2px);
161
+ box-shadow: var(--kz-shadow-lg);
162
+ }
163
+
164
+ /* Warning variant */
165
+ .kz-btn.kz-variant-warning {
166
+ background: linear-gradient(125deg, #f59e0b, #d97706);
167
+ color: white;
168
+ box-shadow: var(--kz-shadow-md);
169
+ }
170
+
171
+ .kz-btn.kz-variant-warning:hover:not(:disabled) {
172
+ transform: translateY(-2px);
173
+ box-shadow: var(--kz-shadow-lg);
174
+ }
175
+
176
+ /* Error variant */
177
+ .kz-btn.kz-variant-error {
178
+ background: linear-gradient(125deg, #ef4444, #dc2626);
179
+ color: white;
180
+ box-shadow: var(--kz-shadow-md);
181
+ }
182
+
183
+ .kz-btn.kz-variant-error:hover:not(:disabled) {
184
+ transform: translateY(-2px);
185
+ box-shadow: var(--kz-shadow-lg);
186
+ }
187
+
188
+ /* Loading spinner */
189
+ .kz-btn-spinner {
190
+ margin-left: -0.25rem;
191
+ }
192
+
193
+ /* Icon spacing */
194
+ .kz-btn-icon {
195
+ display: inline-flex;
196
+ align-items: center;
197
+ }
198
+
199
+ .kz-btn-icon svg {
200
+ width: 1rem;
201
+ height: 1rem;
202
+ }
203
+
204
+ .kz-btn.kz-size-lg .kz-btn-icon svg {
205
+ width: 1.25rem;
206
+ height: 1.25rem;
207
+ }
208
+
209
+ .kz-btn.kz-size-xl .kz-btn-icon svg {
210
+ width: 1.5rem;
211
+ height: 1.5rem;
212
+ }
213
+
214
+ /* Focus rings */
215
+ .kz-btn:focus-visible {
216
+ outline: 2px solid rgb(99 102 241 / 0.5);
217
+ outline-offset: 2px;
218
+ }
219
+
220
+ /* Reduced motion */
221
+ @media (prefers-reduced-motion: reduce) {
222
+ .kz-btn {
223
+ transition: none;
224
+ }
225
+
226
+ .kz-btn:hover:not(:disabled) {
227
+ transform: none;
228
+ }
229
+ }
230
+ }
@@ -0,0 +1,389 @@
1
+ @layer components {
2
+ /* Header container */
3
+ .kz-header {
4
+ position: relative;
5
+ width: 100%;
6
+ z-index: var(--kz-z-sticky);
7
+ }
8
+
9
+ .kz-header.kz-header-sticky {
10
+ position: sticky;
11
+ top: 0;
12
+ }
13
+
14
+ .kz-header.kz-header-blur {
15
+ backdrop-filter: blur(28px) saturate(1.4);
16
+ -webkit-backdrop-filter: blur(28px) saturate(1.4);
17
+ background: linear-gradient(135deg,
18
+ rgba(245, 247, 250, 0.88),
19
+ rgba(240, 243, 247, 0.82)
20
+ );
21
+ border-bottom: 1px solid rgba(0, 0, 0, 0.06);
22
+ }
23
+
24
+ .dark .kz-header.kz-header-blur {
25
+ background: linear-gradient(135deg,
26
+ rgba(15, 18, 24, 0.85),
27
+ rgba(20, 24, 30, 0.82)
28
+ );
29
+ border-color: rgba(255, 255, 255, 0.06);
30
+ }
31
+
32
+ /* Header bar (main content) */
33
+ .kz-header-bar {
34
+ width: 100%;
35
+ margin-left: auto;
36
+ margin-right: auto;
37
+ padding-left: 1rem;
38
+ padding-right: 1rem;
39
+ height: 78px;
40
+ display: grid;
41
+ grid-template-columns: auto 1fr auto;
42
+ align-items: center;
43
+ gap: 1rem;
44
+ max-width: 1480px;
45
+ }
46
+
47
+ @media (min-width: 1040px) {
48
+ .kz-header-bar {
49
+ padding-left: 2rem;
50
+ padding-right: 2rem;
51
+ }
52
+ }
53
+
54
+ /* Left section (brand + nav) */
55
+ .kz-header-start {
56
+ display: flex;
57
+ align-items: center;
58
+ gap: 1rem;
59
+ }
60
+
61
+ /* Brand */
62
+ .kz-brand {
63
+ display: flex;
64
+ align-items: center;
65
+ gap: 0.625rem;
66
+ font-weight: 600;
67
+ font-size: 1.125rem;
68
+ text-decoration: none;
69
+ padding: 0.4rem 0.55rem;
70
+ border-radius: var(--kz-radius-md);
71
+ letter-spacing: 0.3px;
72
+ }
73
+
74
+ .kz-brand img {
75
+ height: 44px;
76
+ width: auto;
77
+ display: block;
78
+ }
79
+
80
+ .kz-brand .accent {
81
+ background: linear-gradient(110deg,
82
+ rgb(var(--kz-primary-500) / 1),
83
+ rgb(var(--kz-accent-500) / 1) 55%,
84
+ rgb(var(--kz-accent-400) / 1)
85
+ );
86
+ -webkit-background-clip: text;
87
+ background-clip: text;
88
+ color: transparent;
89
+ }
90
+
91
+ /* Navigation links */
92
+ .kz-nav-links {
93
+ display: none;
94
+ display: flex;
95
+ align-items: center;
96
+ gap: 0.375rem;
97
+ }
98
+
99
+ .kz-nav-link {
100
+ display: inline-flex;
101
+ align-items: center;
102
+ height: 2.75rem;
103
+ padding-left: 1rem;
104
+ padding-right: 1rem;
105
+ font-size: 0.75rem;
106
+ font-weight: 500;
107
+ color: var(--kz-text-muted);
108
+ text-decoration: none;
109
+ border-radius: var(--kz-radius-md);
110
+ position: relative;
111
+ transition: var(--kz-transition-base);
112
+ letter-spacing: 0.35px;
113
+ }
114
+
115
+ .kz-nav-link:hover {
116
+ background: rgba(0, 0, 0, 0.05);
117
+ color: var(--kz-text-default);
118
+ }
119
+
120
+ .dark .kz-nav-link:hover {
121
+ background: rgba(255, 255, 255, 0.08);
122
+ }
123
+
124
+ .kz-nav-link.is-active {
125
+ background: var(--kz-cta-gradient);
126
+ color: var(--kz-cta-text);
127
+ box-shadow: var(--kz-shadow-md);
128
+ }
129
+
130
+ /* Search */
131
+ .kz-search-col {
132
+ display: none;
133
+ display: block;
134
+ }
135
+
136
+ .kz-search-wrap {
137
+ position: relative;
138
+ display: flex;
139
+ align-items: center;
140
+ height: 48px;
141
+ border-radius: 18px;
142
+ background: linear-gradient(135deg,
143
+ rgba(255, 255, 255, 0.75),
144
+ rgba(255, 255, 255, 0.55)
145
+ );
146
+ border: 1px solid rgba(0, 0, 0, 0.06);
147
+ padding: 0 0.85rem 0 2.25rem;
148
+ box-shadow: var(--kz-shadow-sm);
149
+ }
150
+
151
+ .dark .kz-search-wrap {
152
+ background: linear-gradient(135deg,
153
+ rgba(255, 255, 255, 0.1),
154
+ rgba(255, 255, 255, 0.06)
155
+ );
156
+ border-color: rgba(255, 255, 255, 0.08);
157
+ }
158
+
159
+ .kz-search-icon {
160
+ position: absolute;
161
+ left: 0.75rem;
162
+ color: var(--kz-text-muted);
163
+ display: inline-flex;
164
+ align-items: center;
165
+ justify-content: center;
166
+ }
167
+
168
+ .kz-search-input {
169
+ flex: 1;
170
+ background: transparent;
171
+ border: 0;
172
+ outline: none;
173
+ font-size: 0.875rem;
174
+ font-weight: 500;
175
+ color: var(--kz-text-default);
176
+ letter-spacing: 0.35px;
177
+ }
178
+
179
+ .kz-search-input::placeholder {
180
+ color: var(--kz-text-muted);
181
+ }
182
+
183
+ /* Actions */
184
+ .kz-header-actions {
185
+ display: flex;
186
+ align-items: center;
187
+ gap: 0.5rem;
188
+ }
189
+
190
+ .kz-action-btn {
191
+ display: inline-flex;
192
+ align-items: center;
193
+ justify-content: center;
194
+ width: 46px;
195
+ height: 46px;
196
+ border-radius: var(--kz-radius-md);
197
+ background: linear-gradient(135deg,
198
+ rgba(255, 255, 255, 0.65),
199
+ rgba(255, 255, 255, 0.5)
200
+ );
201
+ border: 1px solid rgba(0, 0, 0, 0.05);
202
+ color: var(--kz-text-muted);
203
+ transition: var(--kz-transition-base);
204
+ }
205
+
206
+ .kz-action-btn:hover {
207
+ background: linear-gradient(135deg,
208
+ rgba(255, 255, 255, 0.9),
209
+ rgba(255, 255, 255, 0.75)
210
+ );
211
+ color: var(--kz-text-default);
212
+ transform: translateY(-2px);
213
+ }
214
+
215
+ .dark .kz-action-btn {
216
+ background: linear-gradient(135deg,
217
+ rgba(255, 255, 255, 0.12),
218
+ rgba(255, 255, 255, 0.08)
219
+ );
220
+ border-color: rgba(255, 255, 255, 0.1);
221
+ }
222
+
223
+ .dark .kz-action-btn:hover {
224
+ background: linear-gradient(135deg,
225
+ rgba(255, 255, 255, 0.18),
226
+ rgba(255, 255, 255, 0.12)
227
+ );
228
+ }
229
+
230
+ /* CTA Button */
231
+ .kz-cta {
232
+ display: inline-flex;
233
+ align-items: center;
234
+ height: 46px;
235
+ padding: 0 1.15rem;
236
+ font-size: 0.78rem;
237
+ font-weight: 600;
238
+ text-decoration: none;
239
+ border-radius: var(--kz-radius-md);
240
+ background: var(--kz-cta-gradient);
241
+ color: var(--kz-cta-text);
242
+ box-shadow: var(--kz-shadow-md);
243
+ transition: var(--kz-transition-base);
244
+ }
245
+
246
+ .kz-cta:hover {
247
+ transform: translateY(-2px);
248
+ box-shadow: var(--kz-shadow-lg);
249
+ }
250
+
251
+ /* Avatar button */
252
+ .kz-avatar-btn {
253
+ width: 46px;
254
+ height: 46px;
255
+ border-radius: var(--kz-radius-md);
256
+ overflow: hidden;
257
+ background: linear-gradient(135deg,
258
+ rgba(255, 255, 255, 0.65),
259
+ rgba(255, 255, 255, 0.5)
260
+ );
261
+ border: 1px solid rgba(0, 0, 0, 0.05);
262
+ box-shadow: var(--kz-shadow-md);
263
+ display: inline-flex;
264
+ align-items: center;
265
+ justify-content: center;
266
+ }
267
+
268
+ .dark .kz-avatar-btn {
269
+ background: linear-gradient(135deg,
270
+ rgba(255, 255, 255, 0.12),
271
+ rgba(255, 255, 255, 0.08)
272
+ );
273
+ border-color: rgba(255, 255, 255, 0.1);
274
+ }
275
+
276
+ /* Mobile trigger */
277
+ .kz-mobile-trigger {
278
+ display: none;
279
+ }
280
+
281
+ /* Mobile panel */
282
+ .kz-mobile-panel {
283
+ position: absolute;
284
+ left: 0;
285
+ right: 0;
286
+ top: 78px;
287
+ padding: 1rem 1rem 1.25rem;
288
+ background: linear-gradient(135deg,
289
+ rgba(245, 247, 250, 0.95),
290
+ rgba(240, 243, 247, 0.9)
291
+ );
292
+ backdrop-filter: blur(26px) saturate(1.4);
293
+ border-bottom: 1px solid rgba(0, 0, 0, 0.06);
294
+ box-shadow: 0 18px 48px -20px rgba(0, 0, 0, 0.25);
295
+ transform-origin: top center;
296
+ transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
297
+ }
298
+
299
+ .kz-mobile-panel.hidden {
300
+ transform: scaleY(0);
301
+ }
302
+
303
+ .dark .kz-mobile-panel {
304
+ background: linear-gradient(135deg,
305
+ rgba(15, 18, 24, 0.95),
306
+ rgba(20, 24, 30, 0.9)
307
+ );
308
+ border-color: rgba(255, 255, 255, 0.06);
309
+ box-shadow: 0 24px 60px -26px rgba(0, 0, 0, 0.8);
310
+ }
311
+
312
+ /* User dropdown */
313
+ .kz-user-dropdown {
314
+ position: absolute;
315
+ top: 78px;
316
+ right: 1rem;
317
+ min-width: 220px;
318
+ padding: 0.55rem 0.55rem 0.7rem;
319
+ border-radius: 18px;
320
+ background: linear-gradient(135deg,
321
+ rgba(255, 255, 255, 0.9),
322
+ rgba(255, 255, 255, 0.75)
323
+ );
324
+ backdrop-filter: blur(26px) saturate(1.4);
325
+ border: 1px solid rgba(0, 0, 0, 0.06);
326
+ box-shadow: var(--kz-shadow-xl);
327
+ animation: fadeIn 0.28s ease;
328
+ }
329
+
330
+ .dark .kz-user-dropdown {
331
+ background: linear-gradient(135deg,
332
+ rgba(20, 24, 30, 0.92),
333
+ rgba(18, 22, 28, 0.88)
334
+ );
335
+ border-color: rgba(255, 255, 255, 0.08);
336
+ }
337
+
338
+ @keyframes fadeIn {
339
+ from {
340
+ opacity: 0;
341
+ transform: translateY(-10px);
342
+ }
343
+ to {
344
+ opacity: 1;
345
+ transform: translateY(0);
346
+ }
347
+ }
348
+
349
+ /* Responsive adjustments */
350
+ @media (max-width: 1080px) {
351
+ .kz-nav-links {
352
+ display: none;
353
+ }
354
+
355
+ .kz-search-col {
356
+ display: none;
357
+ }
358
+ }
359
+
360
+ @media (max-width: 640px) {
361
+ .kz-header-bar {
362
+ grid-template-columns: 1fr auto;
363
+ }
364
+ }
365
+
366
+ /* Reduced motion */
367
+ @media (prefers-reduced-motion: reduce) {
368
+ .kz-action-btn:hover,
369
+ .kz-cta:hover {
370
+ transform: none;
371
+ }
372
+
373
+ .kz-mobile-panel {
374
+ transition: none;
375
+ }
376
+ }
377
+
378
+ @media (prefers-color-scheme: dark) {
379
+ :root {
380
+ color-scheme: dark;
381
+ --kz-cta-gradient: var(--kz-cta-gradient-dark);
382
+ --kz-cta-text: var(--kz-cta-text-dark);
383
+ }
384
+ }
385
+ }
386
+
387
+ header {
388
+ background: none;
389
+ }