@rhavenside/baseline-ui 1.0.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 (49) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/LICENSE +22 -0
  3. package/README.md +272 -0
  4. package/dist/.gitkeep +0 -0
  5. package/dist/baseline.css +4811 -0
  6. package/dist/baseline.css.map +1 -0
  7. package/dist/baseline.min.css +1 -0
  8. package/package.json +59 -0
  9. package/src/base/_base.scss +182 -0
  10. package/src/base/_normalize.scss +186 -0
  11. package/src/base/_reset.scss +24 -0
  12. package/src/baseline.scss +48 -0
  13. package/src/components/_alert.scss +97 -0
  14. package/src/components/_badge.scss +105 -0
  15. package/src/components/_button.scss +200 -0
  16. package/src/components/_card.scss +94 -0
  17. package/src/components/_dropdown.scss +111 -0
  18. package/src/components/_form.scss +324 -0
  19. package/src/components/_modal.scss +157 -0
  20. package/src/components/_nav.scss +211 -0
  21. package/src/components/_progress.scss +65 -0
  22. package/src/components/_spinner.scss +118 -0
  23. package/src/components/_table.scss +182 -0
  24. package/src/components/_tooltip.scss +134 -0
  25. package/src/fonts/.gitkeep +4 -0
  26. package/src/icons/_icons.scss +150 -0
  27. package/src/layout/_container.scss +45 -0
  28. package/src/layout/_flex.scss +174 -0
  29. package/src/layout/_grid-modern.scss +128 -0
  30. package/src/layout/_grid.scss +123 -0
  31. package/src/themes/_dark.scss +122 -0
  32. package/src/themes/_light.scss +7 -0
  33. package/src/tokens/_borders.scss +36 -0
  34. package/src/tokens/_colors.scss +136 -0
  35. package/src/tokens/_forms.scss +170 -0
  36. package/src/tokens/_glassmorphism.scss +60 -0
  37. package/src/tokens/_shadows.scss +24 -0
  38. package/src/tokens/_spacing.scss +31 -0
  39. package/src/tokens/_tokens.scss +14 -0
  40. package/src/tokens/_transitions.scss +42 -0
  41. package/src/tokens/_typography.scss +89 -0
  42. package/src/tokens/_z-index.scss +26 -0
  43. package/src/utilities/_accessibility.scss +76 -0
  44. package/src/utilities/_animations.scss +177 -0
  45. package/src/utilities/_display.scss +89 -0
  46. package/src/utilities/_position.scss +105 -0
  47. package/src/utilities/_spacing.scss +87 -0
  48. package/src/utilities/_text.scss +255 -0
  49. package/src/utilities/_visibility.scss +74 -0
@@ -0,0 +1,200 @@
1
+ // ============================================================================
2
+ // Button Component (Technical Glass Design)
3
+ // ============================================================================
4
+
5
+ @use '../tokens/tokens' as *;
6
+
7
+ .bl-btn {
8
+ display: inline-flex;
9
+ align-items: center;
10
+ justify-content: center;
11
+ padding: var(--spacing-sm) var(--spacing-md);
12
+ font-family: var(--font-family-base);
13
+ font-size: var(--font-size-base);
14
+ font-weight: var(--font-weight-medium);
15
+ line-height: var(--line-height-base);
16
+ text-align: center;
17
+ text-decoration: none;
18
+ white-space: nowrap;
19
+ vertical-align: middle;
20
+ cursor: pointer;
21
+ user-select: none;
22
+ border: 1px solid var(--glass-border-medium);
23
+ border-radius: var(--tech-border-radius-sm);
24
+ background: var(--glass-bg-medium);
25
+ backdrop-filter: blur(var(--glass-blur-md));
26
+ -webkit-backdrop-filter: blur(var(--glass-blur-md));
27
+ transition: var(--transition-base);
28
+ color: var(--color-text);
29
+
30
+ &:focus {
31
+ outline: 1px solid var(--color-border-focus);
32
+ outline-offset: 2px;
33
+ }
34
+
35
+ &:disabled,
36
+ &.bl-disabled {
37
+ opacity: 0.6;
38
+ cursor: not-allowed;
39
+ pointer-events: none;
40
+ }
41
+ }
42
+
43
+ // Button Sizes
44
+ .bl-btn-sm {
45
+ padding: var(--spacing-xs) var(--spacing-sm);
46
+ font-size: var(--font-size-sm);
47
+ }
48
+
49
+ .bl-btn-lg {
50
+ padding: var(--spacing-md) var(--spacing-lg);
51
+ font-size: var(--font-size-lg);
52
+ }
53
+
54
+ // Button Variants
55
+ .bl-btn-primary {
56
+ background: var(--color-accent);
57
+ color: var(--color-text-inverse);
58
+ border-color: var(--color-accent);
59
+
60
+ &:hover:not(:disabled):not(.bl-disabled) {
61
+ background: var(--color-accent-dark);
62
+ border-color: var(--color-accent-dark);
63
+ }
64
+
65
+ &:active:not(:disabled):not(.bl-disabled) {
66
+ transform: translateY(1px); // Pressed effect
67
+ box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.2);
68
+ }
69
+ }
70
+
71
+ .bl-btn-secondary {
72
+ background: var(--glass-bg-medium);
73
+ color: var(--color-text);
74
+ border-color: var(--glass-border-medium);
75
+
76
+ &:hover:not(:disabled):not(.bl-disabled) {
77
+ background: var(--glass-bg-heavy);
78
+ border-color: var(--glass-border-heavy);
79
+ }
80
+
81
+ &:active:not(:disabled):not(.bl-disabled) {
82
+ transform: translateY(1px);
83
+ box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.2);
84
+ }
85
+ }
86
+
87
+ .bl-btn-outline {
88
+ background: transparent;
89
+ color: var(--color-accent);
90
+ border-color: var(--color-accent);
91
+
92
+ &:hover:not(:disabled):not(.bl-disabled) {
93
+ background: var(--glass-bg-light);
94
+ border-color: var(--color-accent-light);
95
+ }
96
+
97
+ &:active:not(:disabled):not(.bl-disabled) {
98
+ transform: translateY(1px);
99
+ box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.2);
100
+ }
101
+ }
102
+
103
+ .bl-btn-ghost {
104
+ background: transparent;
105
+ color: var(--color-text);
106
+ border-color: transparent;
107
+
108
+ &:hover:not(:disabled):not(.bl-disabled) {
109
+ background: var(--glass-bg-light);
110
+ border-color: var(--glass-border-light);
111
+ }
112
+
113
+ &:active:not(:disabled):not(.bl-disabled) {
114
+ transform: translateY(1px);
115
+ }
116
+ }
117
+
118
+ .bl-btn-link {
119
+ background: transparent;
120
+ color: var(--color-accent);
121
+ border-color: transparent;
122
+ padding: 0;
123
+ text-decoration: underline;
124
+
125
+ &:hover:not(:disabled):not(.bl-disabled) {
126
+ color: var(--color-accent-light);
127
+ text-decoration: none;
128
+ }
129
+ }
130
+
131
+ // Semantic Button Variants
132
+ .bl-btn-success {
133
+ background: var(--color-success);
134
+ color: var(--color-text-inverse);
135
+ border-color: var(--color-success);
136
+
137
+ &:hover:not(:disabled):not(.bl-disabled) {
138
+ background: var(--color-success-dark);
139
+ border-color: var(--color-success-dark);
140
+ }
141
+
142
+ &:active:not(:disabled):not(.bl-disabled) {
143
+ transform: translateY(1px);
144
+ box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.2);
145
+ }
146
+ }
147
+
148
+ .bl-btn-warning {
149
+ background: var(--color-warning);
150
+ color: var(--color-text-inverse);
151
+ border-color: var(--color-warning);
152
+
153
+ &:hover:not(:disabled):not(.bl-disabled) {
154
+ background: var(--color-warning-dark);
155
+ border-color: var(--color-warning-dark);
156
+ }
157
+
158
+ &:active:not(:disabled):not(.bl-disabled) {
159
+ transform: translateY(1px);
160
+ box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.2);
161
+ }
162
+ }
163
+
164
+ .bl-btn-error {
165
+ background: var(--color-error);
166
+ color: var(--color-text-inverse);
167
+ border-color: var(--color-error);
168
+
169
+ &:hover:not(:disabled):not(.bl-disabled) {
170
+ background: var(--color-error-dark);
171
+ border-color: var(--color-error-dark);
172
+ }
173
+
174
+ &:active:not(:disabled):not(.bl-disabled) {
175
+ transform: translateY(1px);
176
+ box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.2);
177
+ }
178
+ }
179
+
180
+ .bl-btn-info {
181
+ background: var(--color-info);
182
+ color: var(--color-text-inverse);
183
+ border-color: var(--color-info);
184
+
185
+ &:hover:not(:disabled):not(.bl-disabled) {
186
+ background: var(--color-info-dark);
187
+ border-color: var(--color-info-dark);
188
+ }
189
+
190
+ &:active:not(:disabled):not(.bl-disabled) {
191
+ transform: translateY(1px);
192
+ box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.2);
193
+ }
194
+ }
195
+
196
+ // Button Block (full width)
197
+ .bl-btn-block {
198
+ display: flex;
199
+ width: 100%;
200
+ }
@@ -0,0 +1,94 @@
1
+ // ============================================================================
2
+ // Card Component (Technical Glass Design)
3
+ // ============================================================================
4
+
5
+ @use '../tokens/tokens' as *;
6
+
7
+ .bl-card {
8
+ display: flex;
9
+ flex-direction: column;
10
+ background: var(--glass-bg-medium);
11
+ backdrop-filter: blur(var(--glass-blur-md));
12
+ -webkit-backdrop-filter: blur(var(--glass-blur-md));
13
+ border: 1px solid var(--glass-border-medium);
14
+ border-radius: var(--tech-border-radius-md);
15
+ overflow: hidden;
16
+ transition: var(--transition-base);
17
+ position: relative;
18
+
19
+ // Optional: Vertical accent line at edge
20
+ &.bl-card-accent {
21
+ border-left: 2px solid var(--color-accent);
22
+ }
23
+ }
24
+
25
+ .bl-card-header {
26
+ padding: var(--spacing-md);
27
+ border-bottom: 1px solid var(--glass-border-light);
28
+ background: var(--glass-bg-light);
29
+ backdrop-filter: blur(var(--glass-blur-sm));
30
+ -webkit-backdrop-filter: blur(var(--glass-blur-sm));
31
+ }
32
+
33
+ .bl-card-title {
34
+ margin: 0;
35
+ font-size: var(--font-size-lg);
36
+ font-weight: var(--font-weight-semibold);
37
+ color: var(--color-text);
38
+ }
39
+
40
+ .bl-card-subtitle {
41
+ margin: var(--spacing-xs) 0 0 0;
42
+ font-size: var(--font-size-sm);
43
+ color: var(--color-text-muted);
44
+ }
45
+
46
+ .bl-card-body {
47
+ padding: var(--spacing-md);
48
+ flex: 1 1 auto;
49
+ color: var(--color-text);
50
+ }
51
+
52
+ .bl-card-footer {
53
+ padding: var(--spacing-md);
54
+ border-top: 1px solid var(--glass-border-light);
55
+ background: var(--glass-bg-light);
56
+ backdrop-filter: blur(var(--glass-blur-sm));
57
+ -webkit-backdrop-filter: blur(var(--glass-blur-sm));
58
+ }
59
+
60
+ // Card Variants
61
+ .bl-card-primary {
62
+ border-color: var(--color-accent);
63
+
64
+ &.bl-card-accent {
65
+ border-left-color: var(--color-accent);
66
+ }
67
+ }
68
+
69
+ .bl-card-secondary {
70
+ border-color: var(--glass-border-heavy);
71
+
72
+ &.bl-card-accent {
73
+ border-left-color: var(--color-secondary);
74
+ }
75
+ }
76
+
77
+ // Card with Shadow
78
+ .bl-card-shadow {
79
+ box-shadow: var(--glass-shadow-md);
80
+ }
81
+
82
+ .bl-card-shadow-lg {
83
+ box-shadow: var(--glass-shadow-lg);
84
+ }
85
+
86
+ // Card Hover Effect (subtle, no movement)
87
+ .bl-card-hover {
88
+ cursor: pointer;
89
+
90
+ &:hover {
91
+ background: var(--glass-bg-heavy);
92
+ border-color: var(--glass-border-heavy);
93
+ }
94
+ }
@@ -0,0 +1,111 @@
1
+ // ============================================================================
2
+ // Dropdown Component (Technical Glass Design)
3
+ // ============================================================================
4
+
5
+ @use '../tokens/tokens' as *;
6
+
7
+ .bl-dropdown {
8
+ position: relative;
9
+ display: inline-block;
10
+ }
11
+
12
+ .bl-dropdown-toggle {
13
+ &::after {
14
+ display: inline-block;
15
+ margin-left: var(--spacing-xs);
16
+ vertical-align: 0.255em;
17
+ content: "";
18
+ border-top: 0.3em solid;
19
+ border-right: 0.3em solid transparent;
20
+ border-bottom: 0;
21
+ border-left: 0.3em solid transparent;
22
+ }
23
+ }
24
+
25
+ .bl-dropdown-menu {
26
+ position: absolute;
27
+ top: 100%;
28
+ left: 0;
29
+ z-index: var(--z-index-dropdown);
30
+ display: none;
31
+ min-width: 10rem;
32
+ padding: var(--spacing-xs) 0;
33
+ margin: var(--spacing-xs) 0 0 0;
34
+ font-size: var(--font-size-base);
35
+ color: var(--color-text);
36
+ text-align: left;
37
+ list-style: none;
38
+ background: var(--glass-bg-medium);
39
+ backdrop-filter: blur(var(--glass-blur-lg));
40
+ -webkit-backdrop-filter: blur(var(--glass-blur-lg));
41
+ border: 1px solid var(--glass-border-medium);
42
+ border-radius: var(--tech-border-radius-md);
43
+ overflow: hidden;
44
+
45
+ &.bl-show {
46
+ display: block;
47
+ }
48
+ }
49
+
50
+ .bl-dropdown-menu-right {
51
+ right: 0;
52
+ left: auto;
53
+ }
54
+
55
+ .bl-dropdown-item {
56
+ display: block;
57
+ width: 100%;
58
+ padding: var(--spacing-sm) var(--spacing-md);
59
+ clear: both;
60
+ font-weight: var(--font-weight-normal);
61
+ color: var(--color-text);
62
+ text-align: inherit;
63
+ text-decoration: none;
64
+ white-space: nowrap;
65
+ background-color: transparent;
66
+ border: 0;
67
+ cursor: pointer;
68
+ transition: var(--transition-base);
69
+
70
+ &:hover,
71
+ &:focus {
72
+ color: var(--color-text);
73
+ text-decoration: none;
74
+ background: var(--glass-bg-heavy); // Flat, not floating
75
+ }
76
+
77
+ &:active {
78
+ color: var(--color-text);
79
+ background: var(--glass-bg-heavy);
80
+ }
81
+
82
+ &.bl-active {
83
+ background: var(--glass-bg-heavy);
84
+ color: var(--color-accent);
85
+ }
86
+
87
+ &.bl-disabled,
88
+ &:disabled {
89
+ color: var(--color-text-muted);
90
+ pointer-events: none;
91
+ background-color: transparent;
92
+ opacity: 0.6;
93
+ }
94
+ }
95
+
96
+ .bl-dropdown-divider {
97
+ height: 0;
98
+ margin: var(--spacing-xs) 0;
99
+ overflow: hidden;
100
+ border-top: 1px solid var(--glass-border-light);
101
+ }
102
+
103
+ .bl-dropdown-header {
104
+ display: block;
105
+ padding: var(--spacing-sm) var(--spacing-md);
106
+ margin-bottom: 0;
107
+ font-size: var(--font-size-sm);
108
+ font-weight: var(--font-weight-semibold);
109
+ color: var(--color-text-muted);
110
+ white-space: nowrap;
111
+ }
@@ -0,0 +1,324 @@
1
+ // ============================================================================
2
+ // Form Components (Technical Glass Design)
3
+ // ============================================================================
4
+
5
+ @use '../tokens/tokens' as *;
6
+
7
+ // Form Group
8
+ .bl-form-group {
9
+ margin-bottom: var(--form-group-margin-bottom);
10
+ }
11
+
12
+ .bl-form-label {
13
+ display: block;
14
+ margin-bottom: var(--form-label-margin-bottom);
15
+ font-size: var(--form-label-font-size);
16
+ font-weight: var(--form-label-font-weight);
17
+ color: var(--color-text);
18
+ }
19
+
20
+ .bl-form-label-required::after {
21
+ content: ' *';
22
+ color: var(--form-error-color);
23
+ }
24
+
25
+ .bl-form-helper {
26
+ display: block;
27
+ margin-top: var(--form-helper-margin-top);
28
+ font-size: var(--form-helper-font-size);
29
+ color: var(--color-text-muted);
30
+ }
31
+
32
+ .bl-form-error {
33
+ display: block;
34
+ margin-top: var(--form-helper-margin-top);
35
+ font-size: var(--form-error-font-size);
36
+ color: var(--color-error);
37
+ }
38
+
39
+ // Input Base (Recessed Glass Windows)
40
+ .bl-input,
41
+ .bl-textarea {
42
+ display: block;
43
+ width: 100%;
44
+ padding: var(--form-input-padding-y) var(--form-input-padding-x);
45
+ font-family: var(--font-family-base);
46
+ font-size: var(--form-input-font-size);
47
+ line-height: var(--form-input-line-height);
48
+ color: var(--color-text);
49
+ background: var(--glass-bg-light);
50
+ border: 1px solid var(--glass-border-medium);
51
+ border-radius: var(--tech-border-radius-sm);
52
+ backdrop-filter: blur(var(--glass-blur-md));
53
+ -webkit-backdrop-filter: blur(var(--glass-blur-md));
54
+ transition: var(--transition-base);
55
+
56
+ &::placeholder {
57
+ color: var(--color-text-muted);
58
+ opacity: 1;
59
+ font-style: normal; // Technical labeling style
60
+ }
61
+
62
+ &:focus {
63
+ outline: none;
64
+ border-width: 2px; // Sharper border, not brighter
65
+ border-color: var(--color-accent);
66
+ background: var(--glass-bg-medium);
67
+ }
68
+
69
+ &:disabled {
70
+ opacity: var(--form-input-opacity-disabled);
71
+ cursor: not-allowed;
72
+ background: var(--glass-bg-dark);
73
+ }
74
+ }
75
+
76
+ // Select (Mechanical Switch, Angular Arrow)
77
+ .bl-select {
78
+ display: block;
79
+ width: 100%;
80
+ padding: var(--form-input-padding-y) var(--form-input-padding-x);
81
+ padding-right: calc(var(--form-input-padding-x) + 1.5rem); // Space for arrow
82
+ font-family: var(--font-family-base);
83
+ font-size: var(--form-input-font-size);
84
+ line-height: var(--form-input-line-height);
85
+ color: var(--color-text);
86
+ background: var(--glass-bg-light);
87
+ border: 1px solid var(--glass-border-medium);
88
+ border-radius: var(--tech-border-radius-sm);
89
+ backdrop-filter: blur(var(--glass-blur-md));
90
+ -webkit-backdrop-filter: blur(var(--glass-blur-md));
91
+ transition: var(--transition-base);
92
+ cursor: pointer;
93
+ appearance: none;
94
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3E%3Cpath fill='%23ffffff' d='M0 2l4 4 4-4z'/%3E%3C/svg%3E");
95
+ background-repeat: no-repeat;
96
+ background-position: right var(--form-input-padding-x) center;
97
+ background-size: 0.75rem;
98
+
99
+ &:focus {
100
+ outline: none;
101
+ border-width: 2px;
102
+ border-color: var(--color-accent);
103
+ background-color: var(--glass-bg-medium);
104
+ }
105
+
106
+ &:disabled {
107
+ opacity: var(--form-input-opacity-disabled);
108
+ cursor: not-allowed;
109
+ background-color: var(--glass-bg-dark);
110
+ }
111
+ }
112
+
113
+ // Input States
114
+ .bl-input-error,
115
+ .bl-select-error,
116
+ .bl-textarea-error {
117
+ border-bottom: 2px solid var(--color-error); // Line, not area
118
+
119
+ &:focus {
120
+ border-width: 2px;
121
+ border-color: var(--color-error);
122
+ border-bottom-width: 2px;
123
+ }
124
+ }
125
+
126
+ .bl-input-success,
127
+ .bl-select-success,
128
+ .bl-textarea-success {
129
+ border-bottom: 2px solid var(--color-success);
130
+
131
+ &:focus {
132
+ border-width: 2px;
133
+ border-color: var(--color-success);
134
+ border-bottom-width: 2px;
135
+ }
136
+ }
137
+
138
+ // Input Sizes
139
+ .bl-input-sm,
140
+ .bl-select-sm {
141
+ padding: var(--form-input-padding-y-sm) var(--form-input-padding-x-sm);
142
+ font-size: var(--form-input-font-size-sm);
143
+ }
144
+
145
+ .bl-select-sm {
146
+ padding-right: calc(var(--form-input-padding-x-sm) + 1.25rem);
147
+ }
148
+
149
+ .bl-input-lg,
150
+ .bl-select-lg {
151
+ padding: var(--form-input-padding-y-lg) var(--form-input-padding-x-lg);
152
+ font-size: var(--form-input-font-size-lg);
153
+ }
154
+
155
+ .bl-select-lg {
156
+ padding-right: calc(var(--form-input-padding-x-lg) + 1.75rem);
157
+ }
158
+
159
+ // Textarea
160
+ .bl-textarea {
161
+ resize: var(--form-textarea-resize);
162
+ min-height: var(--form-textarea-min-height);
163
+ }
164
+
165
+ // Checkbox & Radio
166
+ .bl-checkbox,
167
+ .bl-radio {
168
+ display: inline-flex;
169
+ align-items: center;
170
+ cursor: pointer;
171
+ user-select: none;
172
+
173
+ input[type="checkbox"],
174
+ input[type="radio"] {
175
+ width: var(--form-checkbox-size);
176
+ height: var(--form-checkbox-size);
177
+ margin-right: var(--form-checkbox-margin-right);
178
+ cursor: pointer;
179
+ accent-color: var(--form-checkbox-accent-color);
180
+ }
181
+
182
+ &:disabled {
183
+ opacity: var(--form-checkbox-opacity-disabled);
184
+ cursor: not-allowed;
185
+ }
186
+ }
187
+
188
+ // Switch (Toggle)
189
+ .bl-switch {
190
+ position: relative;
191
+ display: inline-block;
192
+ width: var(--form-switch-width);
193
+ height: var(--form-switch-height);
194
+
195
+ input {
196
+ opacity: 0;
197
+ width: 0;
198
+ height: 0;
199
+
200
+ &:checked + .bl-switch-slider {
201
+ background-color: var(--form-switch-bg-active);
202
+
203
+ &::before {
204
+ transform: translateX(var(--form-switch-slider-translate));
205
+ }
206
+ }
207
+
208
+ &:focus + .bl-switch-slider {
209
+ border-color: var(--color-accent);
210
+ }
211
+
212
+ &:disabled + .bl-switch-slider {
213
+ opacity: var(--form-switch-opacity-disabled);
214
+ cursor: not-allowed;
215
+ }
216
+ }
217
+ }
218
+
219
+ .bl-switch-slider {
220
+ position: absolute;
221
+ top: 0;
222
+ left: 0;
223
+ right: 0;
224
+ bottom: 0;
225
+ background: var(--glass-bg-medium);
226
+ border: 1px solid var(--glass-border-medium);
227
+ border-radius: var(--border-radius-full);
228
+ backdrop-filter: blur(var(--glass-blur-sm));
229
+ -webkit-backdrop-filter: blur(var(--glass-blur-sm));
230
+ transition: var(--transition-base);
231
+ cursor: pointer;
232
+
233
+ &::before {
234
+ position: absolute;
235
+ content: "";
236
+ height: var(--form-switch-slider-size);
237
+ width: var(--form-switch-slider-size);
238
+ left: var(--form-switch-slider-offset);
239
+ bottom: var(--form-switch-slider-offset);
240
+ background: var(--glass-bg-heavy);
241
+ border: 1px solid var(--glass-border-light);
242
+ border-radius: var(--border-radius-full);
243
+ transition: var(--transition-base);
244
+ }
245
+ }
246
+
247
+ // File Input
248
+ .bl-file-input {
249
+ display: block;
250
+ width: 100%;
251
+ padding: var(--form-file-input-padding);
252
+ font-size: var(--form-file-input-font-size);
253
+ color: var(--color-text);
254
+ border: 1px dashed var(--glass-border-medium);
255
+ border-radius: var(--tech-border-radius-sm);
256
+ background: var(--glass-bg-light);
257
+ backdrop-filter: blur(var(--glass-blur-md));
258
+ -webkit-backdrop-filter: blur(var(--glass-blur-md));
259
+ cursor: pointer;
260
+ transition: var(--transition-base);
261
+
262
+ &:hover {
263
+ border-color: var(--glass-border-heavy);
264
+ background: var(--glass-bg-medium);
265
+ }
266
+
267
+ input[type="file"] {
268
+ display: none;
269
+ }
270
+ }
271
+
272
+ // Range Input
273
+ .bl-range {
274
+ width: 100%;
275
+ height: var(--form-range-height);
276
+ border-radius: var(--tech-border-radius-sm);
277
+ background: var(--form-range-bg);
278
+ outline: none;
279
+ -webkit-appearance: none;
280
+
281
+ &::-webkit-slider-thumb {
282
+ -webkit-appearance: none;
283
+ appearance: none;
284
+ width: var(--form-range-thumb-size);
285
+ height: var(--form-range-thumb-size);
286
+ border-radius: var(--tech-border-radius-sm);
287
+ background: var(--form-range-thumb-bg);
288
+ border: 1px solid var(--glass-border-medium);
289
+ cursor: pointer;
290
+ }
291
+
292
+ &::-moz-range-thumb {
293
+ width: var(--form-range-thumb-size);
294
+ height: var(--form-range-thumb-size);
295
+ border-radius: var(--tech-border-radius-sm);
296
+ background: var(--form-range-thumb-bg);
297
+ border: 1px solid var(--glass-border-medium);
298
+ cursor: pointer;
299
+ }
300
+ }
301
+
302
+ // Input Group
303
+ .bl-input-group {
304
+ display: flex;
305
+ width: 100%;
306
+
307
+ .bl-input,
308
+ .bl-select {
309
+ position: relative;
310
+ flex: 1 1 auto;
311
+ width: 1%;
312
+
313
+ &:not(:first-child) {
314
+ border-top-left-radius: 0;
315
+ border-bottom-left-radius: 0;
316
+ margin-left: -1px;
317
+ }
318
+
319
+ &:not(:last-child) {
320
+ border-top-right-radius: 0;
321
+ border-bottom-right-radius: 0;
322
+ }
323
+ }
324
+ }