@liberation-data/desk 0.4.0 → 0.6.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,237 @@
1
+ /* @liberation-data/desk — overlays.css */
2
+ /* ── Overlays ── */
3
+
4
+ .desk-popover-anchor {
5
+ position: relative;
6
+ display: inline-flex;
7
+ }
8
+
9
+ .desk-popover {
10
+ position: absolute;
11
+ z-index: 1200;
12
+ min-width: 220px;
13
+ max-width: min(360px, calc(100vw - 24px));
14
+ padding: var(--desk-space-3);
15
+ border: 1px solid var(--desk-rule);
16
+ border-radius: 12px;
17
+ background: var(--desk-surface);
18
+ box-shadow: var(--desk-shadow-floating);
19
+ animation: desk-menu-in .14s var(--desk-ease);
20
+ }
21
+
22
+ .desk-popover[data-placement="below"] {
23
+ top: calc(100% + 6px);
24
+ }
25
+
26
+ .desk-popover[data-placement="above"] {
27
+ bottom: calc(100% + 6px);
28
+ }
29
+
30
+ .desk-popover[data-align="start"] {
31
+ left: 0;
32
+ }
33
+
34
+ .desk-popover[data-align="end"] {
35
+ right: 0;
36
+ }
37
+
38
+ /* A sheet belongs to its window: the scrim covers that window and nothing else. */
39
+ .desk-sheet-scrim,
40
+ .desk-alert-scrim {
41
+ position: absolute;
42
+ inset: 0;
43
+ z-index: 1300;
44
+ display: grid;
45
+ background: rgb(0 0 0 / 35%);
46
+ animation: desk-fade .16s var(--desk-ease);
47
+ }
48
+
49
+ .desk-sheet-scrim {
50
+ place-items: start center;
51
+ padding: var(--desk-space-4);
52
+ }
53
+
54
+ .desk-alert-scrim {
55
+ position: fixed;
56
+ z-index: 1400;
57
+ place-items: center;
58
+ padding: var(--desk-space-4);
59
+ background: rgb(0 0 0 / 45%);
60
+ }
61
+
62
+ @keyframes desk-fade {
63
+ from {
64
+ opacity: 0;
65
+ }
66
+ }
67
+
68
+ .desk-sheet,
69
+ .desk-alert {
70
+ box-sizing: border-box;
71
+ width: min(440px, 100%);
72
+ padding: var(--desk-space-4);
73
+ border: 1px solid var(--desk-rule);
74
+ border-radius: 14px;
75
+ background: var(--desk-surface);
76
+ color: var(--desk-ink);
77
+ box-shadow: var(--desk-shadow-floating);
78
+ font-family: var(--desk-font);
79
+ }
80
+
81
+ .desk-sheet {
82
+ animation: desk-sheet-in .22s var(--desk-ease);
83
+ }
84
+
85
+ .desk-alert {
86
+ width: min(380px, 100%);
87
+ text-align: center;
88
+ animation: desk-alert-in .16s var(--desk-ease);
89
+ }
90
+
91
+ @keyframes desk-sheet-in {
92
+ from {
93
+ transform: translateY(-12px);
94
+ opacity: 0;
95
+ }
96
+ }
97
+
98
+ @keyframes desk-alert-in {
99
+ from {
100
+ transform: scale(.97);
101
+ opacity: 0;
102
+ }
103
+ }
104
+
105
+ .desk-sheet-title,
106
+ .desk-alert-title {
107
+ margin: 0 0 var(--desk-space-1);
108
+ font-size: 15px;
109
+ font-weight: 600;
110
+ }
111
+
112
+ .desk-sheet-description,
113
+ .desk-alert-message {
114
+ margin: 0 0 var(--desk-space-3);
115
+ color: var(--desk-muted);
116
+ font-size: 13px;
117
+ line-height: 1.5;
118
+ }
119
+
120
+ .desk-sheet-actions,
121
+ .desk-alert-actions {
122
+ display: flex;
123
+ justify-content: flex-end;
124
+ gap: var(--desk-space-2);
125
+ margin-top: var(--desk-space-4);
126
+ }
127
+
128
+ .desk-alert-actions {
129
+ justify-content: center;
130
+ }
131
+
132
+ .desk-toasts {
133
+ position: fixed;
134
+ z-index: 1500;
135
+ right: var(--desk-space-4);
136
+ bottom: var(--desk-space-4);
137
+ display: flex;
138
+ flex-direction: column;
139
+ gap: var(--desk-space-2);
140
+ max-width: min(420px, calc(100vw - 32px));
141
+ }
142
+
143
+ .desk-toast {
144
+ display: flex;
145
+ align-items: center;
146
+ gap: var(--desk-space-2);
147
+ padding: var(--desk-space-2) var(--desk-space-2) var(--desk-space-2) var(--desk-space-3);
148
+ border: 1px solid var(--desk-rule);
149
+ border-radius: 10px;
150
+ background: var(--desk-surface);
151
+ box-shadow: var(--desk-shadow-floating);
152
+ font-family: var(--desk-font);
153
+ font-size: 13px;
154
+ animation: desk-toast-in .2s var(--desk-ease);
155
+ }
156
+
157
+ @keyframes desk-toast-in {
158
+ from {
159
+ transform: translateY(8px);
160
+ opacity: 0;
161
+ }
162
+ }
163
+
164
+ .desk-toast[data-tone="ok"] {
165
+ border-color: color-mix(in srgb, var(--desk-ok) 45%, var(--desk-rule));
166
+ }
167
+
168
+ .desk-toast[data-tone="bad"] {
169
+ border-color: color-mix(in srgb, var(--desk-bad) 45%, var(--desk-rule));
170
+ }
171
+
172
+ .desk-toast-message {
173
+ flex: 1;
174
+ min-width: 0;
175
+ }
176
+
177
+ @media (prefers-reduced-motion: reduce) {
178
+ .desk-inputbar,
179
+ .desk-inputbar-scrim,
180
+ .desk-popover,
181
+ .desk-sheet,
182
+ .desk-alert,
183
+ .desk-toast,
184
+ .desk-sheet-scrim,
185
+ .desk-alert-scrim {
186
+ animation: none;
187
+ }
188
+ }
189
+
190
+ /* ── An (i): what a view would explain if asked ── */
191
+
192
+ .desk-infotip {
193
+ flex: none;
194
+ display: inline-grid;
195
+ place-items: center;
196
+ width: 18px;
197
+ height: 18px;
198
+ padding: 0;
199
+ /* The title bar's own green, the one the zoom control wears: a muted grey (i) sat in a muted
200
+ trailing edge and went unseen, which defeats the point of having one place to ask. */
201
+ border: 1px solid color-mix(in srgb, var(--desk-info) 55%, transparent);
202
+ border-radius: 50%;
203
+ background: color-mix(in srgb, var(--desk-info) 14%, transparent);
204
+ color: var(--desk-info);
205
+ font-family: var(--desk-font);
206
+ font-size: 11px;
207
+ font-style: italic;
208
+ font-weight: 700;
209
+ line-height: 1;
210
+ cursor: pointer;
211
+ }
212
+
213
+ .desk-infotip:hover,
214
+ .desk-infotip[data-open] {
215
+ border-color: var(--desk-info);
216
+ background: color-mix(in srgb, var(--desk-info) 26%, transparent);
217
+ }
218
+
219
+ .desk-infotip:focus-visible {
220
+ outline: 2px solid var(--desk-info);
221
+ outline-offset: 2px;
222
+ }
223
+
224
+ .desk-infotip-body {
225
+ max-width: 34ch;
226
+ font-size: 12.5px;
227
+ line-height: 1.45;
228
+ color: var(--desk-muted);
229
+ }
230
+
231
+ .desk-infotip-body > :first-child {
232
+ margin-top: 0;
233
+ }
234
+
235
+ .desk-infotip-body > :last-child {
236
+ margin-bottom: 0;
237
+ }
@@ -0,0 +1,149 @@
1
+ /* @liberation-data/desk — search.css */
2
+ /* ── Search ── */
3
+
4
+ .desk-search-scrim {
5
+ position: fixed;
6
+ inset: 0;
7
+ z-index: 1450;
8
+ display: grid;
9
+ justify-items: center;
10
+ align-content: start;
11
+ padding: 12vh var(--desk-space-4) var(--desk-space-4);
12
+ background: rgb(0 0 0 / 35%);
13
+ animation: desk-fade .14s var(--desk-ease);
14
+ }
15
+
16
+ .desk-search {
17
+ box-sizing: border-box;
18
+ width: min(620px, 100%);
19
+ max-height: 70vh;
20
+ display: flex;
21
+ flex-direction: column;
22
+ border: 1px solid var(--desk-rule);
23
+ border-radius: 14px;
24
+ background: var(--desk-surface);
25
+ box-shadow: var(--desk-shadow-floating);
26
+ font-family: var(--desk-font);
27
+ overflow: hidden;
28
+ animation: desk-alert-in .16s var(--desk-ease);
29
+ }
30
+
31
+ .desk-search-bar {
32
+ flex: none;
33
+ padding: var(--desk-space-3) var(--desk-space-4);
34
+ border-bottom: 1px solid var(--desk-rule);
35
+ }
36
+
37
+ .desk-search-field {
38
+ width: 100%;
39
+ border: 0;
40
+ background: none;
41
+ color: var(--desk-ink);
42
+ font-family: var(--desk-font);
43
+ font-size: 17px;
44
+ outline: none;
45
+ }
46
+
47
+ .desk-search-field::placeholder {
48
+ color: var(--desk-muted);
49
+ }
50
+
51
+ .desk-search-results {
52
+ flex: 1;
53
+ min-height: 0;
54
+ margin: 0;
55
+ padding: var(--desk-space-1);
56
+ list-style: none;
57
+ overflow-y: auto;
58
+ }
59
+
60
+ .desk-search-group {
61
+ margin: var(--desk-space-2) 0 2px;
62
+ padding: 0 var(--desk-space-2);
63
+ font-size: 11px;
64
+ font-weight: 700;
65
+ letter-spacing: .08em;
66
+ text-transform: uppercase;
67
+ color: var(--desk-muted);
68
+ }
69
+
70
+ .desk-search-row {
71
+ display: flex;
72
+ align-items: center;
73
+ gap: var(--desk-space-3);
74
+ padding: var(--desk-space-2);
75
+ border-radius: 8px;
76
+ cursor: default;
77
+ }
78
+
79
+ .desk-search-row[data-active] {
80
+ background: var(--desk-accent);
81
+ color: var(--desk-on-accent);
82
+ }
83
+
84
+ .desk-search-icon {
85
+ display: grid;
86
+ place-items: center;
87
+ width: 28px;
88
+ height: 28px;
89
+ flex: none;
90
+ border: 1px solid var(--desk-rule);
91
+ border-radius: 7px;
92
+ }
93
+
94
+ .desk-search-icon svg {
95
+ width: 15px;
96
+ height: 15px;
97
+ }
98
+
99
+ .desk-search-row[data-active] .desk-search-icon {
100
+ border-color: transparent;
101
+ background: rgb(255 255 255 / 18%);
102
+ }
103
+
104
+ .desk-search-text {
105
+ flex: 1;
106
+ min-width: 0;
107
+ }
108
+
109
+ .desk-search-title {
110
+ display: block;
111
+ font-size: 13.5px;
112
+ font-weight: 500;
113
+ }
114
+
115
+ .desk-search-subtitle,
116
+ .desk-search-kind {
117
+ font-size: 11.5px;
118
+ color: var(--desk-muted);
119
+ }
120
+
121
+ .desk-search-subtitle {
122
+ display: block;
123
+ }
124
+
125
+ .desk-search-kind {
126
+ flex: none;
127
+ font-family: var(--desk-font-mono);
128
+ font-size: 10.5px;
129
+ }
130
+
131
+ .desk-search-row[data-active] .desk-search-subtitle,
132
+ .desk-search-row[data-active] .desk-search-kind {
133
+ color: rgb(255 255 255 / 80%);
134
+ }
135
+
136
+ .desk-search-empty {
137
+ margin: 0;
138
+ padding: var(--desk-space-5) var(--desk-space-4);
139
+ text-align: center;
140
+ color: var(--desk-muted);
141
+ font-size: 13px;
142
+ }
143
+
144
+ @media (prefers-reduced-motion: reduce) {
145
+ .desk-search,
146
+ .desk-search-scrim {
147
+ animation: none;
148
+ }
149
+ }
@@ -0,0 +1,284 @@
1
+ /* @liberation-data/desk — setup.css */
2
+ /* ── Tour ── */
3
+
4
+ .desk-tour {
5
+ box-sizing: border-box;
6
+ width: min(620px, 100%);
7
+ padding: var(--desk-space-3);
8
+ border: 1px solid color-mix(in srgb, var(--desk-accent) 45%, var(--desk-rule));
9
+ border-radius: 14px;
10
+ background: var(--desk-dock-glass);
11
+ backdrop-filter: blur(28px) saturate(170%);
12
+ -webkit-backdrop-filter: blur(28px) saturate(170%);
13
+ box-shadow: var(--desk-shadow-floating), 0 0 30px color-mix(in srgb, var(--desk-accent) 20%, transparent);
14
+ font-family: var(--desk-font);
15
+ color: var(--desk-ink);
16
+ }
17
+
18
+ .desk-tour-head {
19
+ display: flex;
20
+ align-items: center;
21
+ gap: var(--desk-space-2);
22
+ font-size: 13px;
23
+ }
24
+
25
+ .desk-tour-count {
26
+ color: var(--desk-muted);
27
+ font-size: 11.5px;
28
+ font-variant-numeric: tabular-nums;
29
+ }
30
+
31
+ .desk-tour-head .desk-button {
32
+ margin-left: auto;
33
+ }
34
+
35
+ .desk-tour-progress {
36
+ height: 3px;
37
+ margin: var(--desk-space-2) 0;
38
+ border-radius: 2px;
39
+ background: var(--desk-rule);
40
+ overflow: hidden;
41
+ }
42
+
43
+ .desk-tour-progress i {
44
+ display: block;
45
+ height: 100%;
46
+ background: var(--desk-accent);
47
+ transition: width .3s var(--desk-ease);
48
+ }
49
+
50
+ .desk-tour-caption {
51
+ margin: 0 0 var(--desk-space-2);
52
+ font-size: 13.5px;
53
+ line-height: 1.45;
54
+ }
55
+
56
+ .desk-tour-turn {
57
+ margin-right: var(--desk-space-1);
58
+ color: var(--desk-warn);
59
+ font-weight: 700;
60
+ }
61
+
62
+ .desk-tour-turn::after {
63
+ content: " ·";
64
+ }
65
+
66
+ .desk-tour-actions {
67
+ display: flex;
68
+ align-items: center;
69
+ gap: var(--desk-space-2);
70
+ }
71
+
72
+ .desk-tour-spacer {
73
+ flex: 1;
74
+ }
75
+
76
+ /* What the tour is pointing at. */
77
+ [data-desk-tour-pointed] {
78
+ position: relative;
79
+ z-index: 3;
80
+ outline: 2px solid var(--desk-accent);
81
+ outline-offset: 3px;
82
+ border-radius: 6px;
83
+ animation: desk-tour-pulse 1.6s var(--desk-ease) 2;
84
+ }
85
+
86
+ @keyframes desk-tour-pulse {
87
+ 0%, 100% {
88
+ box-shadow: 0 0 0 0 color-mix(in srgb, var(--desk-accent) 0%, transparent);
89
+ }
90
+ 40% {
91
+ box-shadow: 0 0 0 4px color-mix(in srgb, var(--desk-accent) 45%, transparent);
92
+ }
93
+ }
94
+
95
+ @media (prefers-reduced-motion: reduce) {
96
+ .desk-tour-progress i {
97
+ transition: none;
98
+ }
99
+
100
+ [data-desk-tour-pointed] {
101
+ animation: none;
102
+ }
103
+ }
104
+
105
+ /* ── Wizard ── */
106
+
107
+ .desk-wizard {
108
+ box-sizing: border-box;
109
+ width: min(640px, 100%);
110
+ min-height: 520px;
111
+ display: flex;
112
+ flex-direction: column;
113
+ border: 1px solid var(--desk-rule);
114
+ border-radius: 20px;
115
+ background: var(--desk-surface);
116
+ box-shadow: var(--desk-shadow-floating);
117
+ font-family: var(--desk-font);
118
+ color: var(--desk-ink);
119
+ overflow: hidden;
120
+ }
121
+
122
+ .desk-wizard-content {
123
+ flex: 1;
124
+ display: flex;
125
+ flex-direction: column;
126
+ align-items: center;
127
+ gap: var(--desk-space-2);
128
+ padding: var(--desk-space-7) var(--desk-space-6) var(--desk-space-5);
129
+ text-align: center;
130
+ animation: desk-wizard-in .32s var(--desk-ease);
131
+ }
132
+
133
+ .desk-wizard-content[data-direction="back"] {
134
+ animation-name: desk-wizard-back;
135
+ }
136
+
137
+ @keyframes desk-wizard-in {
138
+ from {
139
+ opacity: 0;
140
+ transform: translateX(22px);
141
+ }
142
+ }
143
+
144
+ @keyframes desk-wizard-back {
145
+ from {
146
+ opacity: 0;
147
+ transform: translateX(-22px);
148
+ }
149
+ }
150
+
151
+ .desk-wizard-glyph {
152
+ display: grid;
153
+ place-items: center;
154
+ width: 60px;
155
+ height: 60px;
156
+ margin-bottom: var(--desk-space-2);
157
+ border: 1px solid var(--desk-rule);
158
+ border-radius: 16px;
159
+ color: var(--desk-accent);
160
+ }
161
+
162
+ .desk-wizard-glyph svg {
163
+ width: 28px;
164
+ height: 28px;
165
+ }
166
+
167
+ .desk-wizard-title {
168
+ margin: 0;
169
+ font-size: 22px;
170
+ font-weight: 700;
171
+ letter-spacing: -.02em;
172
+ text-wrap: balance;
173
+ }
174
+
175
+ .desk-wizard-title:focus {
176
+ outline: none;
177
+ }
178
+
179
+ .desk-wizard-description {
180
+ margin: 0 0 var(--desk-space-4);
181
+ max-width: 46ch;
182
+ color: var(--desk-muted);
183
+ font-size: 13.5px;
184
+ line-height: 1.5;
185
+ text-wrap: pretty;
186
+ }
187
+
188
+ /* Whatever the step puts in the pane lines up left, even though the pane is centred. */
189
+ .desk-wizard-content > *:not(.desk-wizard-glyph):not(.desk-wizard-title):not(.desk-wizard-description) {
190
+ width: 100%;
191
+ max-width: 420px;
192
+ text-align: left;
193
+ }
194
+
195
+ .desk-wizard-error {
196
+ margin: var(--desk-space-3) 0 0;
197
+ padding: var(--desk-space-2) var(--desk-space-3);
198
+ border-radius: var(--desk-control-radius);
199
+ background: color-mix(in srgb, var(--desk-bad) 14%, transparent);
200
+ color: var(--desk-ink);
201
+ font-size: 13px;
202
+ }
203
+
204
+ .desk-wizard-foot {
205
+ flex: none;
206
+ display: flex;
207
+ align-items: center;
208
+ gap: var(--desk-space-3);
209
+ padding: var(--desk-space-3) var(--desk-space-4);
210
+ border-top: 1px solid var(--desk-rule);
211
+ background: var(--desk-titlebar);
212
+ }
213
+
214
+ .desk-wizard-steps {
215
+ display: flex;
216
+ align-items: center;
217
+ gap: 6px;
218
+ margin: 0;
219
+ padding: 0;
220
+ list-style: none;
221
+ }
222
+
223
+ .desk-wizard-dot {
224
+ width: 7px;
225
+ height: 7px;
226
+ border-radius: 50%;
227
+ background: color-mix(in srgb, var(--desk-ink) 20%, transparent);
228
+ transition: width .25s var(--desk-ease), background .25s var(--desk-ease);
229
+ }
230
+
231
+ .desk-wizard-dot[data-state="done"] {
232
+ background: var(--desk-muted);
233
+ }
234
+
235
+ .desk-wizard-dot[data-state="now"] {
236
+ width: 22px;
237
+ border-radius: 4px;
238
+ background: var(--desk-accent);
239
+ }
240
+
241
+ .desk-wizard-dot-name {
242
+ position: absolute;
243
+ width: 1px;
244
+ height: 1px;
245
+ overflow: hidden;
246
+ clip-path: inset(50%);
247
+ white-space: nowrap;
248
+ }
249
+
250
+ .desk-wizard-step-name {
251
+ font-size: 11.5px;
252
+ color: var(--desk-muted);
253
+ }
254
+
255
+ .desk-wizard-actions {
256
+ margin-left: auto;
257
+ display: flex;
258
+ align-items: center;
259
+ gap: var(--desk-space-2);
260
+ }
261
+
262
+ @media (max-width: 560px) {
263
+ .desk-wizard {
264
+ min-height: 0;
265
+ }
266
+
267
+ .desk-wizard-content {
268
+ padding: var(--desk-space-5) var(--desk-space-4) var(--desk-space-4);
269
+ }
270
+
271
+ .desk-wizard-step-name {
272
+ display: none;
273
+ }
274
+ }
275
+
276
+ @media (prefers-reduced-motion: reduce) {
277
+ .desk-wizard-content {
278
+ animation: none;
279
+ }
280
+
281
+ .desk-wizard-dot {
282
+ transition: none;
283
+ }
284
+ }