Skip to main content

max / makenotwork

13.7 KB · 664 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 /* The described upload field draws a sunken panel; inside a wizard image
359 picker it keeps the dashed edge the hand-written dropzone had. */
360 .project-image-upload .file-upload-area {
361 border: 2px dashed var(--border);
362 border-radius: var(--radius-control);
363 background: var(--surface-page);
364 margin-bottom: 0;
365 }
366
367 .project-image-upload .file-upload-area:hover,
368 .project-image-upload .file-upload-area.dragover {
369 border-color: var(--action);
370 background: var(--surface-page);
371 }
372
373 .project-image-placeholder {
374 padding: var(--gap-page);
375 text-align: center;
376 }
377
378 .project-image-upload .secondary {
379 align-self: flex-start;
380 }
381
382 .project-image-current img {
383 width: 200px;
384 height: 200px;
385 object-fit: cover;
386 border-radius: var(--radius-control);
387 }
388
389 .upload-progress-inline {
390 font-size: var(--text-note);
391 display: flex;
392 flex-wrap: wrap;
393 align-items: center;
394 gap: var(--gap-peer);
395 }
396
397 .upload-progress-inline .progress-bar-container {
398 width: 100%;
399 height: 6px;
400 background: var(--border);
401 border-radius: var(--radius-control);
402 overflow: hidden;
403 }
404
405 .upload-progress-inline .progress-bar {
406 height: 100%;
407 background: var(--action);
408 transition: width 0.2s;
409 }
410
411 .upload-error-inline {
412 font-size: var(--text-note);
413 color: var(--danger);
414 padding: var(--gap-peer) var(--gap-section);
415 background: color-mix(in oklch, var(--danger) 8%, transparent);
416 border-radius: var(--radius-control);
417 }
418
419 /* Project Card Preview */
420
421 .project-card-preview {
422 display: flex;
423 gap: var(--gap-section);
424 align-items: center;
425 padding: var(--gap-section);
426 background: var(--surface-page);
427 border: 1px solid var(--border);
428 border-radius: var(--radius-control);
429 }
430
431 .preview-cover {
432 width: 80px;
433 height: 80px;
434 flex-shrink: 0;
435 border-radius: var(--radius-control);
436 overflow: hidden;
437 background: var(--surface-sunken);
438 }
439
440 .preview-cover img {
441 width: 100%;
442 height: 100%;
443 object-fit: cover;
444 }
445
446 .preview-cover-empty {
447 display: flex;
448 align-items: center;
449 justify-content: center;
450 height: 100%;
451 font-size: var(--text-fine);
452 color: var(--content-muted);
453 }
454
455 /* Distribution */
456
457 .distribution-section {
458 background: var(--surface-page);
459 padding: var(--gap-section);
460 border: 1px solid var(--border);
461 border-radius: var(--radius-control);
462 }
463
464 .distribution-section h3 {
465 font-family: var(--font-mono);
466 font-size: var(--text-body);
467 margin-bottom: var(--gap-peer);
468 }
469
470 .checkbox-label {
471 display: flex;
472 align-items: center;
473 gap: var(--gap-peer);
474 cursor: pointer;
475 font-size: var(--text-note);
476 }
477
478 /* Monospace input for text editor */
479
480 .monospace-input {
481 font-family: var(--font-mono);
482 font-size: var(--text-note);
483 line-height: 1.6;
484 }
485
486 /* Readonly field */
487
488 .readonly-field {
489 opacity: 0.6;
490 cursor: not-allowed;
491 }
492
493 /* Info box */
494
495 .info-box {
496 background: var(--surface-raised);
497 padding: var(--gap-section);
498 border-radius: var(--radius-control);
499 font-size: var(--text-note);
500 }
501
502 /* Responsive */
503
504 @media (max-width: 839px) {
505 .wizard-layout {
506 flex-direction: column;
507 }
508
509 .wizard-sidebar {
510 width: 100%;
511 }
512
513 .wizard-steps {
514 display: flex;
515 gap: var(--gap-bound);
516 overflow-x: auto;
517 }
518
519 .wizard-step-indicator {
520 flex-direction: column;
521 gap: var(--gap-bound);
522 font-size: var(--text-fine);
523 min-width: 0;
524 }
525
526 .wizard-step-indicator + .wizard-step-indicator::before {
527 display: none;
528 }
529
530 .step-label {
531 white-space: nowrap;
532 }
533
534 .type-grid {
535 grid-template-columns: repeat(2, 1fr);
536 }
537
538 .tier-form-row {
539 grid-template-columns: 1fr;
540 }
541
542 .preview-row {
543 flex-direction: column;
544 gap: var(--gap-bound);
545 }
546
547 .preview-label {
548 width: auto;
549 }
550 }
551
552 /* ===========================================
553 WIZARD STEPS, shared step-level patterns
554 ===========================================
555 Patterns shared across:
556 - wizards/wizard_project.html
557 - wizards/steps/project/basics.html
558 - wizards/steps/project/appearance.html
559 - wizards/steps/item/basics.html
560 - wizards/steps/join/stripe.html
561 */
562
563 /* Intro paragraph below .step-description that explains the concept. */
564 .wizard-step .form-hint {
565 margin-bottom: var(--gap-pane);
566 }
567
568 /* "Checking..." style spinner shown next to async-validated inputs. */
569 .wizard-field-spinner {
570 font-size: var(--text-note);
571 }
572
573 /* Spacing helpers for hints that sit just above a control group. */
574 .wizard-hint-gap-sm { margin-bottom: var(--gap-peer); }
575 .wizard-hint-gap-md { margin-bottom: var(--gap-section); }
576
577 /* Vertical radio group for AI disclosure and similar one-of-many pickers. */
578 .wizard-radio-group {
579 display: flex;
580 flex-direction: column;
581 gap: var(--gap-peer);
582 }
583
584 .wizard-radio-option {
585 display: flex;
586 align-items: center;
587 gap: var(--gap-peer);
588 cursor: pointer;
589 }
590
591 /* Optional-label suffix, e.g. "(optional)". */
592 .wizard-optional-tag {
593 opacity: 0.5;
594 font-weight: normal;
595 }
596
597 /* Square cover images inside upload previews (project + item basics). */
598 .wizard-cover-img {
599 width: 100%;
600 aspect-ratio: 1 / 1;
601 object-fit: cover;
602 }
603
604 /* Stripe-step layout. */
605 .stripe-connect-box {
606 background: var(--surface-sunken);
607 padding: var(--gap-section);
608 text-align: center;
609 margin: var(--gap-section) 0;
610 }
611
612 .stripe-connect-box .stripe-intro {
613 margin: var(--gap-section) 0;
614 opacity: 0.8;
615 }
616
617 .stripe-connect-actions {
618 margin-top: var(--gap-section);
619 }
620
621 .stripe-connect-cta {
622 display: inline-block;
623 padding: var(--gap-section) var(--gap-pane);
624 text-decoration: none;
625 background: var(--stripe);
626 border: none;
627 color: var(--primary-light);
628 }
629
630 .stripe-connect-cta:hover {
631 opacity: 0.85;
632 }
633
634 .stripe-connect-note {
635 font-size: var(--text-fine);
636 opacity: 0.5;
637 margin-top: var(--gap-section);
638 }
639
640 .stripe-connect-note-secondary {
641 font-size: var(--text-fine);
642 opacity: 0.7;
643 margin-top: var(--gap-peer);
644 }
645
646 .stripe-benefits {
647 text-align: left;
648 margin-top: var(--gap-section);
649 }
650
651 .benefit-item {
652 padding: var(--gap-peer) 0 var(--gap-peer) var(--gap-pane);
653 position: relative;
654 font-size: var(--text-note);
655 }
656
657 .benefit-item::before {
658 content: "";
659 position: absolute;
660 left: 0;
661 color: var(--success);
662 }
663 }
664