Skip to main content

max / makenotwork

13.1 KB · 644 lines History Blame Raw
1 /* In the `components` cascade layer, declared in _head_assets.html.
2 This sheet loads after style.css and shares its layer, so a tie still
3 resolves in this file's favour by source order, exactly as when both
4 were unlayered. The creator theme block stays unlayered and outranks
5 both. */
6 @layer components {
7 /* Creation Wizard Layout */
8
9 .wizard-layout {
10 display: flex;
11 max-width: 1100px;
12 margin: 0 auto;
13 gap: var(--gap-page);
14 min-height: 60vh;
15 }
16
17 .wizard-sidebar {
18 width: 220px;
19 flex-shrink: 0;
20 padding-top: var(--gap-peer);
21 }
22
23 .wizard-sidebar h2 {
24 font-family: var(--font-display); font-weight: bold;
25 font-size: var(--text-subhead);
26 margin-bottom: var(--gap-pane);
27 }
28
29 .wizard-content {
30 flex: 1;
31 min-width: 0;
32 }
33
34 /* Step Indicator */
35
36 .wizard-steps {
37 list-style: none;
38 padding: 0;
39 margin: 0;
40 }
41
42 .wizard-step-indicator {
43 display: flex;
44 align-items: center;
45 gap: var(--gap-group);
46 padding: var(--gap-peer) 0;
47 font-size: var(--text-note);
48 color: var(--content-muted);
49 position: relative;
50 }
51
52 .wizard-step-indicator + .wizard-step-indicator::before {
53 content: '';
54 position: absolute;
55 left: 12px;
56 top: -4px;
57 width: 1px;
58 height: 12px;
59 background: var(--border);
60 }
61
62 .wizard-step-indicator.completed + .wizard-step-indicator::before {
63 background: var(--action);
64 }
65
66 .step-number {
67 display: inline-flex;
68 align-items: center;
69 justify-content: center;
70 width: 24px;
71 height: 24px;
72 border-radius: var(--radius-round);
73 font-size: var(--text-fine);
74 font-weight: bold;
75 flex-shrink: 0;
76 border: 2px solid var(--border);
77 color: var(--content-muted);
78 background: transparent;
79 }
80
81 .wizard-step-indicator.active .step-number {
82 border-color: var(--action);
83 background: var(--action);
84 color: var(--primary-light);
85 }
86
87 .wizard-step-indicator.completed .step-number {
88 border-color: var(--action);
89 color: var(--action);
90 }
91
92 .wizard-step-indicator.active .step-label {
93 color: var(--content);
94 font-weight: bold;
95 }
96
97 .wizard-step-indicator.completed .step-label {
98 color: var(--content);
99 }
100
101 /* Step Content */
102
103 .wizard-step {
104 background: var(--surface-overlay);
105 padding: var(--gap-page);
106 border-radius: var(--radius-control);
107 }
108
109 .wizard-step h2 {
110 font-family: var(--font-display); font-weight: bold;
111 font-size: var(--text-head);
112 margin-bottom: var(--gap-bound);
113 }
114
115 .step-description {
116 color: var(--content-muted);
117 font-size: var(--text-note);
118 margin-bottom: var(--gap-pane);
119 }
120
121 /* Wizard Actions (button row) */
122
123 .wizard-actions {
124 display: flex;
125 align-items: center;
126 gap: var(--gap-section);
127 margin-top: var(--gap-page);
128 padding-top: var(--gap-pane);
129 border-top: 1px solid var(--border);
130 flex-wrap: wrap;
131 }
132
133 .wizard-actions .primary {
134 margin-left: auto;
135 }
136
137 /* Type Card Grid */
138
139 .type-grid {
140 display: grid;
141 grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
142 gap: var(--gap-section);
143 margin-top: var(--gap-peer);
144 }
145
146 .type-grid-large {
147 grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
148 }
149
150 /* (The cards themselves are .card--selectable, defined in style.css; this
151 file only contains wizard-specific layouts.) */
152
153 /* Suggestion Input (category, tags) */
154
155 .suggestion-input {
156 position: relative;
157 }
158
159 .suggestion-dropdown {
160 display: none;
161 position: absolute;
162 top: 100%;
163 left: 0;
164 right: 0;
165 background: var(--surface-page);
166 border: 1px solid var(--border);
167 border-top: none;
168 border-radius: 0 0 var(--radius-control) var(--radius-control);
169 max-height: 200px;
170 overflow-y: auto;
171 z-index: var(--z-dropdown);
172 box-shadow: var(--elevation-overlay);
173 }
174
175 .suggestion-dropdown.open {
176 display: block;
177 }
178
179 .suggestion-item {
180 padding: var(--gap-peer) var(--gap-section);
181 cursor: pointer;
182 font-size: var(--text-note);
183 }
184
185 .suggestion-item:hover {
186 background: var(--surface-overlay);
187 }
188
189 .suggestion-create {
190 font-style: italic;
191 opacity: 0.8;
192 border-top: 1px solid var(--border);
193 }
194
195 /* (`.monetization-card{,-cards,.info-only}` removed 2026-05-20, dead CSS,
196 no template references. Selectable monetization choices use the canonical
197 `.card--selectable` recipe in style.css.) */
198
199 .tier-row {
200 display: flex;
201 justify-content: space-between;
202 padding: var(--gap-peer) 0;
203 font-size: var(--text-note);
204 border-bottom: 1px solid var(--border);
205 }
206
207 .tier-form-row {
208 display: grid;
209 grid-template-columns: 1fr 1fr 2fr;
210 gap: var(--gap-section);
211 margin-top: var(--gap-peer);
212 padding: var(--gap-section);
213 background: var(--surface-raised);
214 border-radius: var(--radius-control);
215 }
216
217 /* Pricing Cards */
218
219 .pricing-cards {
220 display: grid;
221 grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
222 gap: var(--gap-section);
223 margin-bottom: var(--gap-pane);
224 }
225
226 /* (The cards are `.card--selectable`, the text-heavy pricing variant adds
227 `.is-text-heavy`, and `.is-disabled` is its modifier. All in style.css.) */
228 .pricing-fields {
229 margin-top: var(--gap-section);
230 }
231
232 .content-choice-cards {
233 display: grid;
234 grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
235 gap: var(--gap-section);
236 margin-bottom: var(--gap-pane);
237 }
238
239 /* Preview Summary */
240
241 .preview-summary {
242 margin-bottom: var(--gap-pane);
243 }
244
245 .preview-row {
246 display: flex;
247 padding: var(--gap-group) 0;
248 border-bottom: 1px solid var(--border);
249 font-size: var(--text-note);
250 }
251
252 .preview-row.indent {
253 padding-left: var(--gap-pane);
254 }
255
256 .preview-label {
257 width: 180px;
258 flex-shrink: 0;
259 color: var(--content-muted);
260 font-weight: bold;
261 }
262
263 .preview-value {
264 flex: 1;
265 }
266
267 /* Preview Checklist */
268
269 .preview-checklist {
270 margin-bottom: var(--gap-pane);
271 }
272
273 .preview-checklist h3 {
274 font-family: var(--font-mono);
275 font-size: var(--text-body);
276 margin-bottom: var(--gap-peer);
277 }
278
279 .preview-checklist ul {
280 list-style: none;
281 padding: 0;
282 margin: 0;
283 }
284
285 .preview-checklist li {
286 padding: var(--gap-bound) 0;
287 padding-left: var(--gap-page);
288 position: relative;
289 font-size: var(--text-note);
290 }
291
292 .preview-checklist li::before {
293 position: absolute;
294 left: 0;
295 font-family: var(--font-mono);
296 font-size: var(--text-fine);
297 text-transform: uppercase;
298 letter-spacing: 0.04em;
299 line-height: 1.6;
300 }
301
302 .check-done::before {
303 content: "Done";
304 color: var(--success);
305 }
306
307 .check-missing::before {
308 content: "Todo";
309 color: var(--content-muted);
310 }
311
312 /* Upload Areas */
313
314 .upload-area {
315 border: 2px dashed var(--border);
316 border-radius: var(--radius-control);
317 padding: var(--gap-page);
318 text-align: center;
319 cursor: pointer;
320 transition: border-color 0.15s;
321 background: var(--surface-page);
322 }
323
324 .upload-area:hover,
325 .upload-area.dragover {
326 border-color: var(--action);
327 }
328
329 /* Project Image Dropzone */
330
331 .project-image-dropzone {
332 border: 2px dashed var(--border);
333 border-radius: var(--radius-control);
334 padding: var(--gap-page);
335 text-align: center;
336 cursor: pointer;
337 transition: border-color 0.15s;
338 background: var(--surface-page);
339 max-width: 300px;
340 }
341
342 .project-image-dropzone:hover,
343 .project-image-dropzone.dragover {
344 border-color: var(--action);
345 }
346
347 .project-image-placeholder {
348 color: var(--content-muted);
349 }
350
351 .project-image-upload {
352 display: flex;
353 flex-direction: column;
354 gap: var(--gap-section);
355 max-width: 300px;
356 }
357
358 .project-image-upload .secondary {
359 align-self: flex-start;
360 }
361
362 .project-image-current img {
363 width: 200px;
364 height: 200px;
365 object-fit: cover;
366 border-radius: var(--radius-control);
367 }
368
369 .upload-progress-inline {
370 font-size: var(--text-note);
371 display: flex;
372 flex-wrap: wrap;
373 align-items: center;
374 gap: var(--gap-peer);
375 }
376
377 .upload-progress-inline .progress-bar-container {
378 width: 100%;
379 height: 6px;
380 background: var(--border);
381 border-radius: var(--radius-control);
382 overflow: hidden;
383 }
384
385 .upload-progress-inline .progress-bar {
386 height: 100%;
387 background: var(--action);
388 transition: width 0.2s;
389 }
390
391 .upload-error-inline {
392 font-size: var(--text-note);
393 color: var(--danger);
394 padding: var(--gap-peer) var(--gap-section);
395 background: color-mix(in oklch, var(--danger) 8%, transparent);
396 border-radius: var(--radius-control);
397 }
398
399 /* Project Card Preview */
400
401 .project-card-preview {
402 display: flex;
403 gap: var(--gap-section);
404 align-items: center;
405 padding: var(--gap-section);
406 background: var(--surface-page);
407 border: 1px solid var(--border);
408 border-radius: var(--radius-control);
409 }
410
411 .preview-cover {
412 width: 80px;
413 height: 80px;
414 flex-shrink: 0;
415 border-radius: var(--radius-control);
416 overflow: hidden;
417 background: var(--surface-sunken);
418 }
419
420 .preview-cover img {
421 width: 100%;
422 height: 100%;
423 object-fit: cover;
424 }
425
426 .preview-cover-empty {
427 display: flex;
428 align-items: center;
429 justify-content: center;
430 height: 100%;
431 font-size: var(--text-fine);
432 color: var(--content-muted);
433 }
434
435 /* Distribution */
436
437 .distribution-section {
438 background: var(--surface-page);
439 padding: var(--gap-section);
440 border: 1px solid var(--border);
441 border-radius: var(--radius-control);
442 }
443
444 .distribution-section h3 {
445 font-family: var(--font-mono);
446 font-size: var(--text-body);
447 margin-bottom: var(--gap-peer);
448 }
449
450 .checkbox-label {
451 display: flex;
452 align-items: center;
453 gap: var(--gap-peer);
454 cursor: pointer;
455 font-size: var(--text-note);
456 }
457
458 /* Monospace input for text editor */
459
460 .monospace-input {
461 font-family: var(--font-mono);
462 font-size: var(--text-note);
463 line-height: 1.6;
464 }
465
466 /* Readonly field */
467
468 .readonly-field {
469 opacity: 0.6;
470 cursor: not-allowed;
471 }
472
473 /* Info box */
474
475 .info-box {
476 background: var(--surface-raised);
477 padding: var(--gap-section);
478 border-radius: var(--radius-control);
479 font-size: var(--text-note);
480 }
481
482 /* Responsive */
483
484 @media (max-width: 839px) {
485 .wizard-layout {
486 flex-direction: column;
487 }
488
489 .wizard-sidebar {
490 width: 100%;
491 }
492
493 .wizard-steps {
494 display: flex;
495 gap: var(--gap-bound);
496 overflow-x: auto;
497 }
498
499 .wizard-step-indicator {
500 flex-direction: column;
501 gap: var(--gap-bound);
502 font-size: var(--text-fine);
503 min-width: 0;
504 }
505
506 .wizard-step-indicator + .wizard-step-indicator::before {
507 display: none;
508 }
509
510 .step-label {
511 white-space: nowrap;
512 }
513
514 .type-grid {
515 grid-template-columns: repeat(2, 1fr);
516 }
517
518 .tier-form-row {
519 grid-template-columns: 1fr;
520 }
521
522 .preview-row {
523 flex-direction: column;
524 gap: var(--gap-bound);
525 }
526
527 .preview-label {
528 width: auto;
529 }
530 }
531
532 /* ===========================================
533 WIZARD STEPS, shared step-level patterns
534 ===========================================
535 Patterns shared across:
536 - wizards/wizard_project.html
537 - wizards/steps/project/basics.html
538 - wizards/steps/project/appearance.html
539 - wizards/steps/item/basics.html
540 - wizards/steps/join/stripe.html
541 */
542
543 /* Intro paragraph below .step-description that explains the concept. */
544 .wizard-step .form-hint {
545 margin-bottom: var(--gap-pane);
546 }
547
548 /* "Checking..." style spinner shown next to async-validated inputs. */
549 .wizard-field-spinner {
550 font-size: var(--text-note);
551 }
552
553 /* Spacing helpers for hints that sit just above a control group. */
554 .wizard-hint-gap-sm { margin-bottom: var(--gap-peer); }
555 .wizard-hint-gap-md { margin-bottom: var(--gap-section); }
556
557 /* Vertical radio group for AI disclosure and similar one-of-many pickers. */
558 .wizard-radio-group {
559 display: flex;
560 flex-direction: column;
561 gap: var(--gap-peer);
562 }
563
564 .wizard-radio-option {
565 display: flex;
566 align-items: center;
567 gap: var(--gap-peer);
568 cursor: pointer;
569 }
570
571 /* Optional-label suffix, e.g. "(optional)". */
572 .wizard-optional-tag {
573 opacity: 0.5;
574 font-weight: normal;
575 }
576
577 /* Square cover images inside upload previews (project + item basics). */
578 .wizard-cover-img {
579 width: 100%;
580 aspect-ratio: 1 / 1;
581 object-fit: cover;
582 }
583
584 /* Stripe-step layout. */
585 .stripe-connect-box {
586 background: var(--surface-sunken);
587 padding: var(--gap-section);
588 text-align: center;
589 margin: var(--gap-section) 0;
590 }
591
592 .stripe-connect-box .stripe-intro {
593 margin: var(--gap-section) 0;
594 opacity: 0.8;
595 }
596
597 .stripe-connect-actions {
598 margin-top: var(--gap-section);
599 }
600
601 .stripe-connect-cta {
602 display: inline-block;
603 padding: var(--gap-section) var(--gap-pane);
604 text-decoration: none;
605 background: var(--stripe);
606 border: none;
607 color: var(--primary-light);
608 }
609
610 .stripe-connect-cta:hover {
611 opacity: 0.85;
612 }
613
614 .stripe-connect-note {
615 font-size: var(--text-fine);
616 opacity: 0.5;
617 margin-top: var(--gap-section);
618 }
619
620 .stripe-connect-note-secondary {
621 font-size: var(--text-fine);
622 opacity: 0.7;
623 margin-top: var(--gap-peer);
624 }
625
626 .stripe-benefits {
627 text-align: left;
628 margin-top: var(--gap-section);
629 }
630
631 .benefit-item {
632 padding: var(--gap-peer) 0 var(--gap-peer) var(--gap-pane);
633 position: relative;
634 font-size: var(--text-note);
635 }
636
637 .benefit-item::before {
638 content: "";
639 position: absolute;
640 left: 0;
641 color: var(--success);
642 }
643 }
644