@protolabsai/ui 0.6.0 → 0.8.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.
@@ -0,0 +1,90 @@
1
+ /* @protolabsai/ui — menu styles (over @protolabsai/design --pl-* tokens). */
2
+
3
+ /* ── Menu / DropdownMenu (Radix-backed) ──────────────────────────────────────── */
4
+ .pl-menu__anchor {
5
+ width: 0;
6
+ height: 0;
7
+ pointer-events: none;
8
+ }
9
+
10
+ .pl-menu {
11
+ min-width: 180px;
12
+ padding: 4px;
13
+ background: var(--pl-color-bg-raised);
14
+ border: var(--pl-border-width) solid var(--pl-color-border-strong);
15
+ border-radius: var(--pl-radius);
16
+ box-shadow: var(--pl-shadow-popover);
17
+ z-index: 1200;
18
+ }
19
+
20
+ .pl-menu__item {
21
+ display: flex;
22
+ align-items: center;
23
+ gap: 8px;
24
+ padding: 6px 8px;
25
+ font-size: 13px;
26
+ color: var(--pl-color-fg);
27
+ border-radius: calc(var(--pl-radius) - 1px);
28
+ cursor: pointer;
29
+ outline: none;
30
+ user-select: none;
31
+ }
32
+
33
+ /* Radix sets data-highlighted on the keyboard/pointer-focused item. */
34
+ .pl-menu__item[data-highlighted] {
35
+ background: var(--pl-color-bg-hover);
36
+ }
37
+
38
+ .pl-menu__item[data-disabled] {
39
+ color: var(--pl-color-fg-muted);
40
+ opacity: 0.5;
41
+ pointer-events: none;
42
+ }
43
+
44
+ .pl-menu__item--destructive {
45
+ color: var(--pl-color-status-error);
46
+ }
47
+
48
+ .pl-menu__item--destructive[data-highlighted] {
49
+ background: color-mix(in oklch, var(--pl-color-status-error) 16%, transparent);
50
+ }
51
+
52
+ .pl-menu__icon {
53
+ display: inline-flex;
54
+ align-items: center;
55
+ color: var(--pl-color-fg-muted);
56
+ }
57
+
58
+ .pl-menu__icon svg {
59
+ width: 15px;
60
+ height: 15px;
61
+ }
62
+
63
+ .pl-menu__item--destructive .pl-menu__icon {
64
+ color: var(--pl-color-status-error);
65
+ }
66
+
67
+ .pl-menu__label {
68
+ flex: 1;
69
+ }
70
+
71
+ .pl-menu__subarrow {
72
+ color: var(--pl-color-fg-muted);
73
+ font-size: 14px;
74
+ line-height: 1;
75
+ }
76
+
77
+ .pl-menu__sep {
78
+ height: 1px;
79
+ margin: 4px 0;
80
+ background: var(--pl-color-border);
81
+ }
82
+
83
+ .pl-menu__group-label {
84
+ padding: 4px 8px;
85
+ font-family: var(--pl-font-mono);
86
+ font-size: 10px;
87
+ text-transform: uppercase;
88
+ letter-spacing: 0.06em;
89
+ color: var(--pl-color-fg-muted);
90
+ }
@@ -0,0 +1,173 @@
1
+ /* @protolabsai/ui — navigation styles (over @protolabsai/design --pl-* tokens). */
2
+
3
+ /* ── Tabs ──────────────────────────────────────────────────────────────────── */
4
+ .pl-tabs {
5
+ display: flex;
6
+ gap: 2px;
7
+ border-bottom: var(--pl-border-width) solid var(--pl-color-border);
8
+ }
9
+
10
+ .pl-tab {
11
+ display: inline-flex;
12
+ align-items: center;
13
+ gap: 6px;
14
+ background: none;
15
+ border: none;
16
+ border-bottom: 2px solid transparent;
17
+ color: var(--pl-color-fg-muted);
18
+ font: inherit;
19
+ font-family: var(--pl-font-sans);
20
+ padding: 8px 14px;
21
+ cursor: pointer;
22
+ border-radius: var(--pl-radius) var(--pl-radius) 0 0;
23
+ }
24
+
25
+ .pl-tab__icon {
26
+ display: inline-flex;
27
+ align-items: center;
28
+ }
29
+
30
+ .pl-tab__icon svg {
31
+ width: 15px;
32
+ height: 15px;
33
+ }
34
+
35
+ .pl-tab__badge {
36
+ display: inline-flex;
37
+ align-items: center;
38
+ justify-content: center;
39
+ min-width: 16px;
40
+ height: 16px;
41
+ padding: 0 5px;
42
+ font-family: var(--pl-font-mono);
43
+ font-size: 10px;
44
+ line-height: 1;
45
+ color: var(--pl-color-fg-muted);
46
+ background: var(--pl-color-bg-subtle);
47
+ border: var(--pl-border-width) solid var(--pl-color-border);
48
+ border-radius: 999px;
49
+ }
50
+
51
+ .pl-tab--active .pl-tab__badge {
52
+ color: var(--pl-color-fg);
53
+ }
54
+
55
+ .pl-tab:hover:not(:disabled) {
56
+ color: var(--pl-color-fg);
57
+ }
58
+
59
+ .pl-tab--active {
60
+ color: var(--pl-color-fg);
61
+ border-bottom-color: var(--pl-color-fg);
62
+ }
63
+
64
+ .pl-tab:disabled {
65
+ opacity: 0.35;
66
+ cursor: not-allowed;
67
+ }
68
+
69
+ .pl-tab__lock {
70
+ margin-left: 5px;
71
+ opacity: 0.6;
72
+ }
73
+
74
+ /* ── Board (kanban) ────────────────────────────────────────────────────────── */
75
+ .pl-board {
76
+ display: flex;
77
+ gap: 12px;
78
+ overflow-x: auto;
79
+ align-items: flex-start;
80
+ }
81
+
82
+ .pl-board-col {
83
+ flex: 1 0 200px;
84
+ min-width: 200px;
85
+ background: var(--pl-color-bg-raised);
86
+ border: var(--pl-border-width) solid var(--pl-color-border);
87
+ border-radius: var(--pl-radius);
88
+ display: flex;
89
+ flex-direction: column;
90
+ }
91
+
92
+ .pl-board-col__head {
93
+ display: flex;
94
+ align-items: center;
95
+ justify-content: space-between;
96
+ padding: 10px 12px;
97
+ font-size: 12px;
98
+ font-weight: 600;
99
+ border-bottom: var(--pl-border-width) solid var(--pl-color-border);
100
+ }
101
+
102
+ .pl-board-col__count {
103
+ color: var(--pl-color-fg-muted);
104
+ font-family: var(--pl-font-mono);
105
+ }
106
+
107
+ .pl-board-col__body {
108
+ padding: 8px;
109
+ display: flex;
110
+ flex-direction: column;
111
+ gap: 8px;
112
+ min-height: 40px;
113
+ }
114
+
115
+ .pl-board-card {
116
+ text-align: left;
117
+ background: var(--pl-color-bg);
118
+ border: var(--pl-border-width) solid var(--pl-color-border);
119
+ border-radius: var(--pl-radius);
120
+ color: var(--pl-color-fg);
121
+ padding: 10px 12px;
122
+ cursor: pointer;
123
+ display: flex;
124
+ flex-direction: column;
125
+ gap: 6px;
126
+ font: inherit;
127
+ }
128
+
129
+ .pl-board-card:hover {
130
+ border-color: var(--pl-color-fg);
131
+ }
132
+
133
+ /* ── PanelHeader (console panel header) ──────────────────────────────────────── */
134
+ .pl-panel-header {
135
+ display: flex;
136
+ align-items: center;
137
+ justify-content: space-between;
138
+ gap: var(--pl-space-3);
139
+ padding: var(--pl-space-3) var(--pl-space-4);
140
+ border-bottom: var(--pl-border-width) solid var(--pl-color-border);
141
+ }
142
+
143
+ .pl-panel-header__kicker {
144
+ font-family: var(--pl-font-mono);
145
+ font-size: 11px;
146
+ text-transform: uppercase;
147
+ letter-spacing: 0.06em;
148
+ color: var(--pl-color-fg-muted);
149
+ margin-bottom: 2px;
150
+ }
151
+
152
+ .pl-panel-header__title {
153
+ margin: 0;
154
+ font-size: 15px;
155
+ font-weight: var(--pl-font-weight-medium);
156
+ line-height: 1.2;
157
+ color: var(--pl-color-fg);
158
+ }
159
+
160
+ .pl-panel-header__actions {
161
+ display: flex;
162
+ align-items: center;
163
+ gap: var(--pl-space-2);
164
+ flex-shrink: 0;
165
+ }
166
+
167
+ .pl-panel-header--compact {
168
+ padding: var(--pl-space-2) var(--pl-space-3);
169
+ }
170
+
171
+ .pl-panel-header--compact .pl-panel-header__title {
172
+ font-size: 13px;
173
+ }
@@ -0,0 +1,295 @@
1
+ /* @protolabsai/ui — overlays styles (over @protolabsai/design --pl-* tokens). */
2
+
3
+ /* ── Overlay scrim (Dialog + Drawer) ─────────────────────────────────────────── */
4
+ .pl-overlay {
5
+ position: fixed;
6
+ inset: 0;
7
+ z-index: 1000;
8
+ display: flex;
9
+ align-items: center;
10
+ justify-content: center;
11
+ padding: var(--pl-space-4);
12
+ background: var(--pl-color-overlay);
13
+ }
14
+
15
+ .pl-overlay--drawer {
16
+ padding: 0;
17
+ }
18
+
19
+ /* ── Dialog / Modal ──────────────────────────────────────────────────────────── */
20
+ .pl-dialog {
21
+ display: flex;
22
+ flex-direction: column;
23
+ width: 480px;
24
+ max-width: 100%;
25
+ max-height: calc(100vh - 2 * var(--pl-space-4));
26
+ background: var(--pl-color-bg-raised);
27
+ border: var(--pl-border-width) solid var(--pl-color-border-strong);
28
+ border-radius: var(--pl-radius);
29
+ box-shadow: var(--pl-shadow-popover);
30
+ }
31
+
32
+ .pl-dialog:focus {
33
+ outline: none;
34
+ }
35
+
36
+ .pl-dialog__head {
37
+ display: flex;
38
+ align-items: center;
39
+ justify-content: space-between;
40
+ gap: var(--pl-space-3);
41
+ padding: var(--pl-space-3) var(--pl-space-4);
42
+ border-bottom: var(--pl-border-width) solid var(--pl-color-border);
43
+ }
44
+
45
+ .pl-dialog__title {
46
+ font-size: 14px;
47
+ font-weight: var(--pl-font-weight-medium);
48
+ color: var(--pl-color-fg);
49
+ }
50
+
51
+ .pl-dialog__close {
52
+ display: inline-flex;
53
+ align-items: center;
54
+ justify-content: center;
55
+ width: 24px;
56
+ height: 24px;
57
+ font-size: 18px;
58
+ line-height: 1;
59
+ color: var(--pl-color-fg-muted);
60
+ background: transparent;
61
+ border: none;
62
+ border-radius: var(--pl-radius);
63
+ cursor: pointer;
64
+ transition:
65
+ color var(--pl-motion-fast) var(--pl-motion-ease),
66
+ background var(--pl-motion-fast) var(--pl-motion-ease);
67
+ }
68
+
69
+ .pl-dialog__close:hover {
70
+ color: var(--pl-color-fg);
71
+ background: var(--pl-color-bg-hover);
72
+ }
73
+
74
+ .pl-dialog__body {
75
+ padding: var(--pl-space-4);
76
+ overflow-y: auto;
77
+ font-size: 14px;
78
+ line-height: 1.6;
79
+ color: var(--pl-color-fg-muted);
80
+ }
81
+
82
+ .pl-dialog__foot {
83
+ display: flex;
84
+ justify-content: flex-end;
85
+ gap: var(--pl-space-2);
86
+ padding: var(--pl-space-3) var(--pl-space-4);
87
+ border-top: var(--pl-border-width) solid var(--pl-color-border);
88
+ }
89
+
90
+ /* ── Drawer (slide-in sheet) ─────────────────────────────────────────────────── */
91
+ .pl-drawer {
92
+ display: flex;
93
+ flex-direction: column;
94
+ width: 420px;
95
+ max-width: 100%;
96
+ height: 100%;
97
+ background: var(--pl-color-bg-raised);
98
+ box-shadow: var(--pl-shadow-popover);
99
+ animation: pl-drawer-in var(--pl-motion-base) var(--pl-motion-ease);
100
+ }
101
+
102
+ .pl-drawer:focus {
103
+ outline: none;
104
+ }
105
+
106
+ .pl-drawer--right {
107
+ margin-left: auto;
108
+ border-left: var(--pl-border-width) solid var(--pl-color-border-strong);
109
+ }
110
+
111
+ .pl-drawer--left {
112
+ margin-right: auto;
113
+ border-right: var(--pl-border-width) solid var(--pl-color-border-strong);
114
+ animation-name: pl-drawer-in-left;
115
+ }
116
+
117
+ .pl-overlay--drawer:has(.pl-drawer--left) {
118
+ justify-content: flex-start;
119
+ }
120
+
121
+ @keyframes pl-drawer-in {
122
+ from {
123
+ transform: translateX(100%);
124
+ }
125
+ }
126
+
127
+ @keyframes pl-drawer-in-left {
128
+ from {
129
+ transform: translateX(-100%);
130
+ }
131
+ }
132
+
133
+ .pl-drawer__head {
134
+ display: flex;
135
+ align-items: center;
136
+ justify-content: space-between;
137
+ gap: var(--pl-space-3);
138
+ padding: var(--pl-space-3) var(--pl-space-4);
139
+ border-bottom: var(--pl-border-width) solid var(--pl-color-border);
140
+ }
141
+
142
+ .pl-drawer__title {
143
+ font-size: 14px;
144
+ font-weight: var(--pl-font-weight-medium);
145
+ color: var(--pl-color-fg);
146
+ }
147
+
148
+ .pl-drawer__body {
149
+ flex: 1;
150
+ padding: var(--pl-space-4);
151
+ overflow-y: auto;
152
+ font-size: 14px;
153
+ line-height: 1.6;
154
+ color: var(--pl-color-fg-muted);
155
+ }
156
+
157
+ .pl-drawer__foot {
158
+ display: flex;
159
+ justify-content: flex-end;
160
+ gap: var(--pl-space-2);
161
+ padding: var(--pl-space-3) var(--pl-space-4);
162
+ border-top: var(--pl-border-width) solid var(--pl-color-border);
163
+ }
164
+
165
+ /* ── Toast ───────────────────────────────────────────────────────────────────── */
166
+ .pl-toast-stack {
167
+ position: fixed;
168
+ bottom: var(--pl-space-4);
169
+ right: var(--pl-space-4);
170
+ z-index: 1100;
171
+ display: flex;
172
+ flex-direction: column;
173
+ gap: var(--pl-space-2);
174
+ max-width: min(360px, calc(100vw - 2 * var(--pl-space-4)));
175
+ }
176
+
177
+ .pl-toast {
178
+ display: flex;
179
+ align-items: flex-start;
180
+ gap: var(--pl-space-3);
181
+ padding: var(--pl-space-3);
182
+ background: var(--pl-color-bg-raised);
183
+ border: var(--pl-border-width) solid var(--pl-color-border);
184
+ border-left-width: 2px;
185
+ border-radius: var(--pl-radius);
186
+ box-shadow: var(--pl-shadow-popover);
187
+ animation: pl-toast-in var(--pl-motion-base) var(--pl-motion-ease);
188
+ }
189
+
190
+ @keyframes pl-toast-in {
191
+ from {
192
+ opacity: 0;
193
+ transform: translateY(6px);
194
+ }
195
+ }
196
+
197
+ .pl-toast--success {
198
+ border-left-color: var(--pl-color-status-success);
199
+ }
200
+
201
+ .pl-toast--warning {
202
+ border-left-color: var(--pl-color-status-warning);
203
+ }
204
+
205
+ .pl-toast--error {
206
+ border-left-color: var(--pl-color-status-error);
207
+ }
208
+
209
+ .pl-toast--info {
210
+ border-left-color: var(--pl-color-status-info);
211
+ }
212
+
213
+ .pl-toast__body {
214
+ flex: 1;
215
+ min-width: 0;
216
+ }
217
+
218
+ .pl-toast__title {
219
+ font-family: var(--pl-font-mono);
220
+ font-size: 12px;
221
+ color: var(--pl-color-fg);
222
+ margin-bottom: 0.2rem;
223
+ }
224
+
225
+ .pl-toast__msg {
226
+ font-size: 13px;
227
+ line-height: 1.5;
228
+ color: var(--pl-color-fg-muted);
229
+ }
230
+
231
+ .pl-toast__close {
232
+ flex-shrink: 0;
233
+ font-size: 16px;
234
+ line-height: 1;
235
+ color: var(--pl-color-fg-muted);
236
+ background: transparent;
237
+ border: none;
238
+ cursor: pointer;
239
+ }
240
+
241
+ .pl-toast__close:hover {
242
+ color: var(--pl-color-fg);
243
+ }
244
+
245
+ /* ── Tooltip (CSS-only) ──────────────────────────────────────────────────────── */
246
+ .pl-tip-wrap {
247
+ position: relative;
248
+ display: inline-flex;
249
+ }
250
+
251
+ .pl-tip {
252
+ position: absolute;
253
+ z-index: 1200;
254
+ pointer-events: none;
255
+ white-space: nowrap;
256
+ padding: 0.25rem 0.5rem;
257
+ font-family: var(--pl-font-mono);
258
+ font-size: 11px;
259
+ color: var(--pl-color-fg);
260
+ background: var(--pl-color-bg-raised);
261
+ border: var(--pl-border-width) solid var(--pl-color-border-strong);
262
+ border-radius: var(--pl-radius);
263
+ box-shadow: var(--pl-shadow-popover);
264
+ opacity: 0;
265
+ transition: opacity var(--pl-motion-fast) var(--pl-motion-ease);
266
+ }
267
+
268
+ .pl-tip-wrap:hover .pl-tip,
269
+ .pl-tip-wrap:focus-within .pl-tip {
270
+ opacity: 1;
271
+ }
272
+
273
+ .pl-tip--top {
274
+ bottom: calc(100% + 6px);
275
+ left: 50%;
276
+ transform: translateX(-50%);
277
+ }
278
+
279
+ .pl-tip--bottom {
280
+ top: calc(100% + 6px);
281
+ left: 50%;
282
+ transform: translateX(-50%);
283
+ }
284
+
285
+ .pl-tip--left {
286
+ right: calc(100% + 6px);
287
+ top: 50%;
288
+ transform: translateY(-50%);
289
+ }
290
+
291
+ .pl-tip--right {
292
+ left: calc(100% + 6px);
293
+ top: 50%;
294
+ transform: translateY(-50%);
295
+ }