@adrelle/design-system 0.0.0-stage → 3.2.1

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.
@@ -0,0 +1,285 @@
1
+ .form-group {
2
+ display: flex;
3
+ flex-direction: column;
4
+ gap: 0.375rem;
5
+ }
6
+
7
+ .form-label {
8
+ font-size: 0.75rem;
9
+ font-weight: 600;
10
+ color: var(--foreground);
11
+ line-height: 1;
12
+ }
13
+
14
+ .form-label-required {
15
+ color: var(--danger);
16
+ margin-left: 0.25rem;
17
+ }
18
+
19
+ .form-input,
20
+ .form-select,
21
+ .form-textarea {
22
+ width: 100%;
23
+ border-radius: var(--radius-lg, 0.5rem);
24
+ border: 1px solid var(--border);
25
+ background-color: var(--card);
26
+ padding: 0.5rem 0.75rem;
27
+ font-size: 0.75rem;
28
+ line-height: 1.25;
29
+ color: var(--foreground);
30
+ transition:
31
+ border-color 0.15s ease,
32
+ box-shadow 0.15s ease;
33
+ box-shadow: var(--shadow-xs);
34
+ }
35
+
36
+ .form-input,
37
+ .form-select {
38
+ height: 2.25rem;
39
+ }
40
+
41
+ .form-input-lg,
42
+ .form-select-lg {
43
+ height: 2.5rem;
44
+ font-size: 0.875rem;
45
+ padding: 0.5rem 1rem;
46
+ }
47
+
48
+ .form-textarea {
49
+ min-height: 5rem;
50
+ resize: vertical;
51
+ }
52
+
53
+ /* Precision Brand Focus Rings */
54
+ .form-input:focus,
55
+ .form-select:focus,
56
+ .form-textarea:focus {
57
+ outline: none;
58
+ border-color: var(--primary);
59
+ box-shadow: 0 0 0 1px var(--primary);
60
+ }
61
+
62
+ .form-input::placeholder,
63
+ .form-select::placeholder,
64
+ .form-textarea::placeholder {
65
+ color: var(--neutral-foreground);
66
+ opacity: 0.8;
67
+ }
68
+
69
+ .form-input:disabled,
70
+ .form-select:disabled,
71
+ .form-textarea:disabled {
72
+ cursor: not-allowed;
73
+ opacity: 0.5;
74
+ background-color: var(--neutral);
75
+ }
76
+
77
+ /* Error States */
78
+ .form-input-error,
79
+ .form-input[aria-invalid="true"] {
80
+ border-color: var(--danger);
81
+ }
82
+
83
+ .form-input-error:focus,
84
+ .form-input[aria-invalid="true"]:focus {
85
+ border-color: var(--danger);
86
+ box-shadow: 0 0 0 1px var(--danger);
87
+ }
88
+
89
+ /* Search Input with Inline Icon (forms-and-inputs.md) */
90
+ .form-search {
91
+ position: relative;
92
+ width: 100%;
93
+ }
94
+
95
+ .form-search .form-input {
96
+ padding-left: 2.25rem;
97
+ }
98
+
99
+ .form-search-icon {
100
+ position: absolute;
101
+ left: 0.75rem;
102
+ top: 50%;
103
+ transform: translateY(-50%);
104
+ width: 1rem;
105
+ height: 1rem;
106
+ color: var(--neutral-foreground);
107
+ pointer-events: none;
108
+ }
109
+
110
+ /* Form Error Callout Banner (forms-and-inputs.md) */
111
+ .form-error-banner {
112
+ padding: 0.875rem;
113
+ border-radius: var(--radius-lg, 0.5rem);
114
+ background-color: var(--danger-tint);
115
+ border-left: 4px solid var(--danger);
116
+ color: var(--danger);
117
+ font-size: 0.75rem;
118
+ box-shadow: var(--shadow-xs);
119
+ display: flex;
120
+ flex-direction: column;
121
+ gap: 0.375rem;
122
+ }
123
+
124
+ .form-error-banner-title {
125
+ font-weight: 600;
126
+ display: flex;
127
+ align-items: center;
128
+ gap: 0.375rem;
129
+ }
130
+
131
+ .form-error-banner-list {
132
+ padding-left: 1.25rem;
133
+ margin: 0;
134
+ font-size: 0.6875rem;
135
+ line-height: 1.4;
136
+ }
137
+
138
+ /* File Input */
139
+ .form-file {
140
+ width: 100%;
141
+ font-size: 0.75rem;
142
+ color: var(--neutral-foreground);
143
+ }
144
+
145
+ .form-file::file-selector-button {
146
+ margin-right: 0.75rem;
147
+ border: 1px solid var(--border);
148
+ background-color: var(--neutral);
149
+ color: var(--foreground);
150
+ padding: 0.375rem 0.75rem;
151
+ border-radius: var(--radius-lg, 0.5rem);
152
+ font-size: 0.75rem;
153
+ font-weight: 600;
154
+ cursor: pointer;
155
+ transition:
156
+ background-color 0.15s,
157
+ border-color 0.15s;
158
+ }
159
+
160
+ .form-file::file-selector-button:hover {
161
+ background-color: var(--neutral-hover);
162
+ }
163
+
164
+ .form-file:focus-visible::file-selector-button {
165
+ outline: none;
166
+ box-shadow:
167
+ 0 0 0 1px var(--background),
168
+ 0 0 0 3px var(--primary);
169
+ }
170
+
171
+ /* Range Input */
172
+ .form-range {
173
+ width: 100%;
174
+ height: 0.375rem;
175
+ background-color: var(--neutral);
176
+ border-radius: var(--radius-full, 9999px);
177
+ outline: none;
178
+ cursor: pointer;
179
+ appearance: none;
180
+ transition: background-color 0.15s;
181
+ }
182
+
183
+ .form-range::-webkit-slider-thumb {
184
+ appearance: none;
185
+ width: 1rem;
186
+ height: 1rem;
187
+ border-radius: var(--radius-full, 9999px);
188
+ background-color: var(--primary);
189
+ border: 2px solid var(--card);
190
+ box-shadow: var(--shadow-xs);
191
+ transition:
192
+ background-color 0.15s,
193
+ transform 0.1s;
194
+ }
195
+
196
+ .form-range::-webkit-slider-thumb:hover {
197
+ background-color: var(--primary-hover);
198
+ transform: scale(1.1);
199
+ }
200
+
201
+ .form-range:focus-visible::-webkit-slider-thumb {
202
+ box-shadow:
203
+ 0 0 0 1px var(--background),
204
+ 0 0 0 3px var(--primary);
205
+ }
206
+
207
+ /* Checkbox & Radio */
208
+ .form-checkbox-wrapper,
209
+ .form-radio-wrapper {
210
+ display: flex;
211
+ align-items: center;
212
+ gap: 0.5rem;
213
+ }
214
+
215
+ .form-checkbox,
216
+ .form-radio {
217
+ appearance: none;
218
+ position: relative;
219
+ height: 1rem;
220
+ width: 1rem;
221
+ border-radius: var(--radius-sm, 0.25rem);
222
+ border: 1px solid var(--border);
223
+ background-color: var(--card);
224
+ cursor: pointer;
225
+ transition:
226
+ border-color 0.15s,
227
+ box-shadow 0.15s,
228
+ background-color 0.15s;
229
+ }
230
+
231
+ .form-radio {
232
+ border-radius: var(--radius-full, 9999px);
233
+ }
234
+
235
+ .form-checkbox:checked,
236
+ .form-radio:checked {
237
+ background-color: var(--primary);
238
+ border-color: var(--primary);
239
+ }
240
+
241
+ .form-checkbox:checked::after {
242
+ content: "";
243
+ position: absolute;
244
+ top: 45%;
245
+ left: 50%;
246
+ transform: translate(-50%, -50%) rotate(45deg);
247
+ width: 0.25rem;
248
+ height: 0.5rem;
249
+ border-bottom: 2px solid var(--primary-foreground);
250
+ border-right: 2px solid var(--primary-foreground);
251
+ }
252
+
253
+ .form-radio:checked::after {
254
+ content: "";
255
+ position: absolute;
256
+ top: 50%;
257
+ left: 50%;
258
+ transform: translate(-50%, -50%);
259
+ width: 0.375rem;
260
+ height: 0.375rem;
261
+ border-radius: var(--radius-full, 9999px);
262
+ background-color: var(--primary-foreground);
263
+ }
264
+
265
+ .form-checkbox:focus-visible,
266
+ .form-radio:focus-visible {
267
+ outline: none;
268
+ box-shadow:
269
+ 0 0 0 1px var(--background),
270
+ 0 0 0 3px var(--primary);
271
+ }
272
+
273
+ .form-helper {
274
+ font-size: 0.6875rem;
275
+ color: var(--neutral-foreground);
276
+ line-height: 1.4;
277
+ }
278
+
279
+ .form-error {
280
+ font-size: 0.6875rem;
281
+ color: var(--danger);
282
+ font-weight: 500;
283
+ line-height: 1.4;
284
+ }
285
+
@@ -0,0 +1,68 @@
1
+ .navbar {
2
+ display: flex;
3
+ height: 3.5rem;
4
+ align-items: center;
5
+ justify-content: space-between;
6
+ border-bottom: 1px solid var(--border);
7
+ background-color: var(--card);
8
+ padding: 0 1.25rem;
9
+ position: sticky;
10
+ top: 0;
11
+ z-index: 40;
12
+ }
13
+
14
+ .navbar-brand {
15
+ display: flex;
16
+ align-items: center;
17
+ gap: 0.5rem;
18
+ font-weight: 700;
19
+ font-size: 0.875rem;
20
+ color: var(--foreground);
21
+ text-decoration: none;
22
+ }
23
+
24
+ .navbar-nav {
25
+ display: flex;
26
+ align-items: center;
27
+ gap: 1rem;
28
+ }
29
+
30
+ .navbar-link {
31
+ font-size: 0.75rem;
32
+ font-weight: 500;
33
+ color: var(--neutral-foreground);
34
+ text-decoration: none;
35
+ transition: color 0.15s ease;
36
+ }
37
+
38
+ .navbar-link:hover,
39
+ .navbar-link.active {
40
+ color: var(--foreground);
41
+ font-weight: 600;
42
+ }
43
+
44
+ /* Command Bar & Live Operational Telemetry Pulse */
45
+ .command-bar {
46
+ display: flex;
47
+ align-items: center;
48
+ justify-content: space-between;
49
+ gap: 1rem;
50
+ width: 100%;
51
+ }
52
+
53
+ .telemetry-pulse {
54
+ width: 0.5rem;
55
+ height: 0.5rem;
56
+ border-radius: var(--radius-full, 9999px);
57
+ background-color: #10b981;
58
+ animation: telemetry-pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
59
+ display: inline-block;
60
+ flex-shrink: 0;
61
+ }
62
+
63
+ @keyframes telemetry-pulse {
64
+ 50% {
65
+ opacity: 0.4;
66
+ }
67
+ }
68
+
@@ -0,0 +1,94 @@
1
+ /* Collapsible Sidebar Architecture */
2
+ .sidebar {
3
+ display: flex;
4
+ flex-direction: column;
5
+ width: 16rem;
6
+ border-right: 1px solid var(--border);
7
+ background-color: var(--card);
8
+ color: var(--foreground);
9
+ height: 100vh;
10
+ transition: width 0.2s ease;
11
+ }
12
+
13
+ .sidebar-compact {
14
+ width: 4.5rem;
15
+ }
16
+
17
+ .sidebar-header {
18
+ display: flex;
19
+ align-items: center;
20
+ height: 3.5rem;
21
+ padding: 0 1.25rem;
22
+ border-bottom: 1px solid var(--border);
23
+ justify-content: space-between;
24
+ }
25
+
26
+ .sidebar-content {
27
+ flex: 1;
28
+ overflow-y: auto;
29
+ padding: 1rem;
30
+ }
31
+
32
+ .sidebar-menu {
33
+ display: flex;
34
+ flex-direction: column;
35
+ gap: 0.25rem;
36
+ list-style: none;
37
+ padding: 0;
38
+ margin: 0;
39
+ }
40
+
41
+ .sidebar-item {
42
+ display: flex;
43
+ align-items: center;
44
+ gap: 0.75rem;
45
+ padding: 0.5rem 0.75rem;
46
+ font-size: 0.75rem;
47
+ font-weight: 500;
48
+ border-radius: var(--radius-lg, 0.5rem);
49
+ color: var(--neutral-foreground);
50
+ text-decoration: none;
51
+ transition:
52
+ background-color 0.15s ease,
53
+ color 0.15s ease;
54
+ cursor: pointer;
55
+ user-select: none;
56
+ }
57
+
58
+ .sidebar-item:hover {
59
+ background-color: var(--neutral);
60
+ color: var(--foreground);
61
+ }
62
+
63
+ /* Active Item: Subtle Blue Tint (frontend-core standard) */
64
+ .sidebar-item.active {
65
+ background-color: var(--primary-tint);
66
+ color: var(--primary);
67
+ font-weight: 600;
68
+ box-shadow: var(--shadow-xs);
69
+ }
70
+
71
+ .sidebar-item.active:hover {
72
+ background-color: var(--primary-tint);
73
+ color: var(--primary-hover);
74
+ }
75
+
76
+ .sidebar-item-badge {
77
+ margin-left: auto;
78
+ font-family: var(--font-mono);
79
+ font-size: 0.625rem;
80
+ padding: 0.125rem 0.375rem;
81
+ border-radius: var(--radius-md, 0.375rem);
82
+ background-color: var(--neutral);
83
+ color: var(--neutral-foreground);
84
+ font-weight: 700;
85
+ border: 1px solid var(--border);
86
+ box-shadow: var(--shadow-xs);
87
+ line-height: 1;
88
+ }
89
+
90
+ .sidebar-footer {
91
+ padding: 1rem 1.25rem;
92
+ border-top: 1px solid var(--border);
93
+ }
94
+
@@ -0,0 +1,98 @@
1
+ /* Table Ledger Enclosure (Level 1 Container: rounded-xl, shadow-xs, overflow-hidden) */
2
+ .table-container {
3
+ width: 100%;
4
+ overflow-x: auto;
5
+ border-radius: var(--radius-xl, 0.75rem);
6
+ border: 1px solid var(--border);
7
+ background-color: var(--card);
8
+ box-shadow: var(--shadow-xs);
9
+ }
10
+
11
+ .table {
12
+ width: 100%;
13
+ border-collapse: collapse;
14
+ font-size: 0.75rem;
15
+ text-align: left;
16
+ }
17
+
18
+ .table th {
19
+ background-color: var(--neutral);
20
+ color: var(--neutral-foreground);
21
+ font-weight: 600;
22
+ font-size: 0.75rem;
23
+ padding: 0.75rem 1rem;
24
+ border-bottom: 1px solid var(--border);
25
+ user-select: none;
26
+ white-space: nowrap;
27
+ }
28
+
29
+ .table td {
30
+ padding: 0.875rem 1rem;
31
+ border-bottom: 1px solid var(--border);
32
+ color: var(--foreground);
33
+ font-size: 0.75rem;
34
+ transition: background-color 0.15s ease;
35
+ }
36
+
37
+ .table-compact th,
38
+ .table-compact td {
39
+ padding: 0.5rem 0.75rem;
40
+ }
41
+
42
+ .table tr:last-child td {
43
+ border-bottom: none;
44
+ }
45
+
46
+ .table-striped tbody tr:nth-child(even) {
47
+ background-color: var(--card-nested);
48
+ }
49
+
50
+ .table-hover tbody tr:hover {
51
+ background-color: var(--secondary-hover);
52
+ cursor: pointer;
53
+ }
54
+
55
+ /* Numeric & Monospace Integrities (data-tables.md) */
56
+ .table-numeric,
57
+ .table-cell-numeric,
58
+ .table th.text-right,
59
+ .table td.text-right {
60
+ text-align: right;
61
+ font-family: var(--font-mono);
62
+ font-feature-settings: "tnum" 1;
63
+ }
64
+
65
+ .table-id,
66
+ .table-mono {
67
+ font-family: var(--font-mono);
68
+ font-feature-settings: "tnum" 1;
69
+ font-weight: 600;
70
+ }
71
+
72
+ .table-actions {
73
+ text-align: right;
74
+ white-space: nowrap;
75
+ }
76
+
77
+ /* Empty Table State */
78
+ .table-empty {
79
+ padding: 3rem 1rem;
80
+ text-align: center;
81
+ color: var(--neutral-foreground);
82
+ font-style: italic;
83
+ font-size: 0.75rem;
84
+ }
85
+
86
+ /* Tabular Ledger Pagination Footer */
87
+ .table-footer {
88
+ padding: 0.875rem 1rem;
89
+ border-top: 1px solid var(--border);
90
+ display: flex;
91
+ align-items: center;
92
+ justify-content: space-between;
93
+ font-size: 0.75rem;
94
+ color: var(--neutral-foreground);
95
+ background-color: var(--card-nested);
96
+ gap: 1rem;
97
+ }
98
+
@@ -0,0 +1,22 @@
1
+ /* Theme tokens & variable defaults */
2
+ @import "./theme/colors.css";
3
+ @import "./theme/typography.css";
4
+
5
+ /* Layout elements */
6
+ @import "./layouts/app-shell.css" layer(components);
7
+ @import "./layouts/sidebar-layout.css" layer(components);
8
+ @import "./layouts/split-layout.css" layer(components);
9
+
10
+ /* Reusable components */
11
+ @import "./components/button.css" layer(components);
12
+ @import "./components/card.css" layer(components);
13
+ @import "./components/form.css" layer(components);
14
+ @import "./components/table.css" layer(components);
15
+ @import "./components/dialog.css" layer(components);
16
+ @import "./components/navbar.css" layer(components);
17
+ @import "./components/sidebar.css" layer(components);
18
+ @import "./components/breadcrumb.css" layer(components);
19
+ @import "./components/empty-state.css" layer(components);
20
+ @import "./components/badge.css" layer(components);
21
+ @import "./components/alert.css" layer(components);
22
+
@@ -0,0 +1,41 @@
1
+ .app-shell {
2
+ display: flex;
3
+ height: 100vh;
4
+ width: 100vw;
5
+ overflow: hidden;
6
+ }
7
+
8
+ .app-shell-sidebar {
9
+ display: none;
10
+ flex-shrink: 0;
11
+ }
12
+
13
+ @media (width >= 768px) {
14
+ .app-shell-sidebar {
15
+ display: flex;
16
+ }
17
+ }
18
+
19
+ .app-shell-main {
20
+ display: flex;
21
+ flex-direction: column;
22
+ flex: 1;
23
+ height: 100%;
24
+ overflow: hidden;
25
+ }
26
+
27
+ .app-shell-header {
28
+ display: flex;
29
+ height: 3.5rem;
30
+ align-items: center;
31
+ border-bottom: 1px solid var(--border);
32
+ padding: 0 1.25rem;
33
+ }
34
+
35
+ .app-shell-content {
36
+ flex: 1;
37
+ overflow-y: auto;
38
+ padding: 1.5rem;
39
+ background-color: var(--background);
40
+ }
41
+
@@ -0,0 +1,14 @@
1
+ .sidebar-layout {
2
+ display: flex;
3
+ width: 100%;
4
+ height: 100%;
5
+ }
6
+
7
+ .sidebar-layout-sidebar {
8
+ flex-shrink: 0;
9
+ }
10
+
11
+ .sidebar-layout-content {
12
+ flex-grow: 1;
13
+ overflow-y: auto;
14
+ }
@@ -0,0 +1,23 @@
1
+ .split-layout {
2
+ display: grid;
3
+ grid-template-columns: 1fr;
4
+ gap: 1.5rem;
5
+ }
6
+
7
+ @media (width >= 1024px) {
8
+ .split-layout {
9
+ grid-template-columns: 240px 1fr;
10
+ }
11
+ }
12
+
13
+ .split-layout-aside {
14
+ display: flex;
15
+ flex-direction: column;
16
+ gap: 0.5rem;
17
+ }
18
+
19
+ .split-layout-main {
20
+ display: flex;
21
+ flex-direction: column;
22
+ gap: 1.5rem;
23
+ }
@@ -0,0 +1,7 @@
1
+ @import "tailwindcss";
2
+
3
+ @custom-variant dark (&:is(.dark *));
4
+
5
+ @import "./app.css";
6
+
7
+ /* Sandbox-specific rules (if any) */