Skip to main content

max / makenotwork

12.1 KB · 470 lines History Blame Raw
1 /* ===========================================
2 RECEIPT PAGE
3 =========================================== */
4
5 /* Receipt page (templates/pages/receipt.html). */
6
7 .receipt-page .receipt-header {
8 display: flex;
9 justify-content: space-between;
10 align-items: flex-start;
11 margin-bottom: var(--gap-page);
12 padding-bottom: var(--gap-pane);
13 border-bottom: 1px solid var(--border);
14 }
15
16 .receipt-page .receipt-row {
17 display: flex;
18 justify-content: space-between;
19 padding: var(--gap-peer) 0;
20 font-size: var(--text-body);
21 }
22
23 .receipt-page .receipt-row.total {
24 font-weight: bold;
25 font-size: var(--text-lead);
26 border-top: 1px solid var(--border);
27 padding-top: var(--gap-section);
28 margin-top: var(--gap-peer);
29 }
30
31 .receipt-page .receipt-label { opacity: 0.7; }
32
33 .receipt-page .receipt-footer {
34 margin-top: var(--gap-page);
35 padding-top: var(--gap-pane);
36 border-top: 1px solid var(--border);
37 font-size: var(--text-note);
38 opacity: 0.6;
39 }
40
41 .receipt-page .back-link {
42 display: inline-block;
43 margin-bottom: var(--gap-pane);
44 font-size: var(--text-note);
45 opacity: 0.7;
46 }
47
48 .receipt-page .back-link:hover { opacity: 1; }
49
50 @media print {
51 .receipt-page .back-link,
52 .receipt-page .chrome-band,
53 .receipt-page .print-btn { display: none !important; }
54 .receipt-page .receipt-box { border: 1px solid var(--border); }
55 }
56
57 /* ===========================================
58 FAN+ PAGE
59 =========================================== */
60
61 /* The Fan+ page moved to the description layer. Its headings, its section
62 spacing, its price callout, its subscribe button, its status box and its
63 success banner are all drawn by the design system now: the banner is a
64 `Node::banner` with `Tone::Success`, the price is a `Figure`, and the button
65 is an `Act`. Nothing here is left to target.
66
67 The measure is on `.fan-plus-page main` beside `.creators-page main`. */
68
69 /* ===========================================
70 PURCHASE PAGE
71 =========================================== */
72
73 /* Purchase confirmation page (templates/pages/purchase.html). */
74 .purchase-page .container {
75 max-width: 800px;
76 margin: var(--gap-page) auto;
77 padding: 0 var(--gap-page);
78 }
79
80 .purchase-page .tagline {
81 font-size: var(--text-note);
82 opacity: 0.7;
83 margin-bottom: var(--gap-page);
84 text-align: center;
85 }
86
87 .purchase-page .checkout-box { margin-bottom: var(--gap-pane); }
88
89 .purchase-page h2 { font-size: var(--text-title); margin-bottom: var(--gap-peer); }
90
91 .purchase-page .step-indicator {
92 font-size: var(--text-note);
93 opacity: 0.6;
94 margin-bottom: var(--gap-pane);
95 }
96
97 .purchase-page .item-summary {
98 background: var(--surface-page);
99 padding: var(--gap-pane);
100 margin-bottom: var(--gap-pane);
101 display: flex;
102 gap: var(--gap-pane);
103 }
104
105 .purchase-page .item-thumbnail {
106 width: 120px;
107 height: 120px;
108 background: var(--surface-sunken);
109 flex-shrink: 0;
110 display: flex;
111 align-items: center;
112 justify-content: center;
113 font-size: var(--text-hero);
114 overflow: hidden;
115 }
116
117 .purchase-page .item-thumbnail img {
118 width: 100%;
119 height: 100%;
120 object-fit: cover;
121 display: block;
122 }
123
124 /* See the storefront card: the dimming is the placeholder's, not the slot's. */
125 .purchase-page .item-thumbnail-empty { opacity: 0.3; }
126
127 .purchase-page .item-details { flex: 1; }
128
129 .purchase-page .item-title {
130 font-size: var(--text-subhead);
131 margin-bottom: var(--gap-peer);
132 font-family: var(--font-display);
133 font-weight: bold;
134 }
135
136 .purchase-page .item-creator {
137 font-size: var(--text-note);
138 opacity: 0.7;
139 margin-bottom: var(--gap-section);
140 }
141
142 .purchase-page .item-creator a { color: var(--content); }
143 .purchase-page .item-description { font-size: var(--text-note); opacity: 0.8; }
144
145 .purchase-page .price-breakdown {
146 background: var(--surface-page);
147 padding: var(--gap-pane);
148 margin-bottom: var(--gap-pane);
149 }
150
151 .purchase-page .price-breakdown h2 { font-size: var(--text-lead); margin-bottom: var(--gap-section); }
152
153 .purchase-page .price-row {
154 display: flex;
155 justify-content: space-between;
156 padding: var(--gap-peer) 0;
157 border-bottom: 1px solid var(--border);
158 }
159
160 .purchase-page .price-row:last-child {
161 border-bottom: none;
162 margin-top: var(--gap-peer);
163 font-size: var(--text-subhead);
164 padding-top: var(--gap-section);
165 border-top: 2px solid var(--border);
166 }
167
168 .purchase-page .price-row.total { font-weight: bold; }
169
170 .purchase-page .payment-section { margin-bottom: var(--gap-pane); }
171 .purchase-page .payment-section h2 { font-size: var(--text-lead); margin-bottom: var(--gap-section); }
172
173 .purchase-page .btn-primary { width: 100%; }
174 .purchase-page .btn-secondary { width: 100%; margin-top: var(--gap-section); }
175
176 .purchase-page .security-note {
177 font-size: var(--text-note);
178 opacity: 0.6;
179 text-align: center;
180 margin-top: var(--gap-section);
181 }
182
183 /* Replaces inline styles in pages/purchase.html. */
184 .purchase-page h1 { text-align: center; }
185
186 .purchase-page .price-breakdown-note {
187 margin-top: var(--gap-peer);
188 font-size: var(--text-fine);
189 opacity: 0.6;
190 }
191
192 .purchase-page .creator-breakdown {
193 background: var(--surface-page);
194 padding: var(--gap-section) var(--gap-pane);
195 margin-bottom: var(--gap-pane);
196 font-size: var(--text-note);
197 }
198 .purchase-page .creator-breakdown h2 {
199 font-size: var(--text-body);
200 margin-bottom: var(--gap-section);
201 opacity: 0.7;
202 }
203 .purchase-page .creator-breakdown .price-row { opacity: 0.8; }
204 .purchase-page .creator-breakdown .price-row.is-total {
205 opacity: 1;
206 font-weight: bold;
207 border-top: 1px solid var(--border);
208 margin-top: var(--gap-peer);
209 padding-top: var(--gap-peer);
210 /* override .price-row:last-child upsize */
211 font-size: inherit;
212 border-bottom: none;
213 }
214 .purchase-page .creator-breakdown .platform-fee-amount { color: var(--content); }
215 .purchase-page .creator-breakdown-note {
216 margin-top: var(--gap-section);
217 font-size: var(--text-note);
218 opacity: 0.6;
219 }
220
221 .purchase-page .payment-section-lead {
222 margin-bottom: var(--gap-pane);
223 opacity: 0.8;
224 }
225
226 .purchase-page .pending-checkout {
227 margin-bottom: var(--gap-pane);
228 background: var(--surface-sunken);
229 padding: var(--gap-section);
230 }
231 .purchase-page .pending-checkout p { margin: 0 0 var(--gap-section); }
232 .purchase-page .pending-checkout p.is-sub {
233 font-size: var(--text-note);
234 opacity: 0.8;
235 }
236 .purchase-page .pending-checkout form { margin: 0; }
237
238 /* Checkout form field wrappers. */
239 .purchase-page .checkout-field { margin-bottom: var(--gap-section); }
240 .purchase-page .checkout-field-label {
241 font-size: var(--text-note);
242 display: block;
243 margin-bottom: var(--gap-bound);
244 }
245 .purchase-page .pwyw-row {
246 display: flex;
247 align-items: center;
248 gap: var(--gap-bound);
249 }
250 .purchase-page .pwyw-symbol { font-size: var(--text-lead); }
251 .purchase-page .pwyw-input { width: 120px; }
252 .purchase-page .pwyw-min-note {
253 font-size: var(--text-fine);
254 opacity: 0.6;
255 margin-top: var(--gap-bound);
256 }
257 .purchase-page .promo-input {
258 width: 200px;
259 text-transform: uppercase;
260 }
261 .purchase-page .share-contact-label {
262 font-size: var(--text-note);
263 display: flex;
264 align-items: center;
265 gap: var(--gap-peer);
266 cursor: pointer;
267 }
268 .purchase-page .share-contact-checkbox { width: auto; }
269
270 .purchase-page .cart-alt-link {
271 text-align: center;
272 margin-top: var(--gap-section);
273 font-size: var(--text-note);
274 opacity: 0.7;
275 }
276 .purchase-page .guest-hint {
277 font-size: var(--text-fine);
278 opacity: 0.6;
279 margin-top: var(--gap-section);
280 text-align: center;
281 }
282 .purchase-page .guest-login-prompt {
283 font-size: var(--text-fine);
284 margin-top: var(--gap-peer);
285 text-align: center;
286 }
287
288 /* ===========================================
289 PROJECT SETTINGS TAB
290 (replaces inline styles in partials/tabs/project_settings.html and
291 related innerHTML in static/project-sections.js)
292 =========================================== */
293
294 .proj-image-hint {
295 font-size: var(--text-note);
296 opacity: 0.7;
297 margin: 0 0 var(--gap-peer);
298 }
299
300 /* Canonical inline form-status text following a Save / Change button.
301 Two class names because templates evolved with both. They're aliases.
302 States via .success / .error / .saving modifier. */
303 .field-status,
304 .save-status {
305 margin-left: var(--gap-peer);
306 font-size: var(--text-note);
307 }
308 .field-status.success, .save-status.success { color: var(--success); }
309 .field-status.error, .save-status.error { color: var(--danger); }
310 .field-status.saving, .save-status.saving { opacity: 0.6; }
311
312 /* Muted lead paragraph above a form button (monetization / features / delete). */
313 .section-lead {
314 margin-bottom: var(--gap-section);
315 opacity: 0.7;
316 text-align: left;
317 }
318
319 /* Large intro paragraph under a page h1 (creators, policy, changelog, fan_plus). */
320 .page-intro {
321 font-size: var(--text-lead);
322 margin-bottom: var(--gap-page);
323 line-height: 1.6;
324 }
325
326 .subscription-note p {
327 opacity: 0.7;
328 font-size: var(--text-note);
329 }
330
331 .features-grid-status {
332 margin-top: var(--gap-peer);
333 display: inline-block;
334 }
335
336 /* "Pages" disclosure (project-level markdown sections). */
337 .pages-toggle { margin-top: var(--gap-page); }
338 .pages-toggle > summary { cursor: pointer; }
339 .pages-toggle > summary h2 { display: inline; }
340 .pages-intro {
341 font-size: var(--text-note);
342 opacity: 0.7;
343 margin: var(--gap-section) 0 var(--gap-section);
344 }
345
346 /* psection-* mirrors section-mgmt-* (used by item_details) but psection
347 class hooks are also queried by static/project-sections.js. */
348 .psection-row-title { flex: 1; font-weight: bold; }
349 .psection-row-anchor { font-size: var(--text-fine); opacity: 0.6; }
350 .psection-row-length { font-size: var(--text-fine); opacity: 0.6; }
351
352 .psection-edit-btn,
353 .psection-del-btn {
354 padding: var(--gap-bound) var(--gap-group);
355 font-size: var(--text-fine);
356 }
357
358 .psection-add-details { margin-top: var(--gap-section); }
359 .psection-add-details > summary {
360 cursor: pointer;
361 font-size: var(--text-body);
362 }
363 .psection-add-fields { margin-top: var(--gap-section); }
364
365 .psection-edit-modal {
366 margin-top: var(--gap-section);
367 padding: var(--gap-section);
368 background: var(--surface-sunken);
369 }
370 .psection-edit-actions {
371 display: flex;
372 gap: var(--gap-peer);
373 }
374
375 /* ===========================================
376 CART PAGE (replaces inline styles in pages/cart.html)
377 =========================================== */
378
379 .cart-empty {
380 text-align: center;
381 padding: var(--gap-page) var(--gap-section);
382 }
383 .cart-empty-hint {
384 font-size: var(--text-note);
385 opacity: 0.7;
386 margin-bottom: var(--gap-pane);
387 }
388
389 /* Multi-creator summary bar (only renders when seller_groups.len() > 1). */
390 .cart-multi-bar-note {
391 opacity: 0.7;
392 margin-left: var(--gap-peer);
393 }
394 .cart-multi-bar-form {
395 display: flex;
396 align-items: center;
397 gap: var(--gap-section);
398 }
399 .cart-share-label {
400 font-size: var(--text-note);
401 display: flex;
402 align-items: center;
403 gap: var(--gap-peer);
404 }
405
406 /* Per-seller group card. */
407 .cart-group { margin-bottom: var(--gap-page); }
408 .cart-group-title { margin-bottom: var(--gap-bound); }
409 .cart-group-count {
410 font-size: var(--text-note);
411 opacity: 0.6;
412 margin-bottom: var(--gap-section);
413 }
414
415 /* PWYW editable price cell. */
416 .cart-pwyw-cell {
417 display: flex;
418 align-items: center;
419 justify-content: flex-end;
420 gap: var(--gap-bound);
421 }
422 .cart-pwyw-symbol { font-size: var(--text-note); }
423
424 /* Compact action button used in cart/wishlist tables. */
425
426 /* Bottom summary row of each seller group. */
427 .cart-group-summary {
428 margin-top: var(--gap-section);
429 display: flex;
430 justify-content: space-between;
431 align-items: center;
432 flex-wrap: wrap;
433 gap: var(--gap-section);
434 }
435 .cart-subtotal {
436 font-family: var(--font-display);
437 font-size: var(--text-lead);
438 }
439 .cart-fee-line {
440 font-size: var(--text-note);
441 opacity: 0.6;
442 }
443 .cart-savings {
444 font-size: var(--text-note);
445 color: var(--action);
446 margin-top: var(--gap-bound);
447 }
448 .cart-stripe-not-ready {
449 font-size: var(--text-note);
450 opacity: 0.6;
451 }
452
453 /* Checkout form within a seller group. */
454 .cart-promo-row { margin-bottom: var(--gap-peer); }
455 .cart-checkout-share {
456 display: flex;
457 align-items: center;
458 gap: var(--gap-peer);
459 font-size: var(--text-note);
460 margin-bottom: var(--gap-peer);
461 }
462
463 /* Wishlist suggestions section below the cart. */
464 .cart-wishlist { margin-top: var(--gap-page); }
465
466 /* Generic "faded out" row state, used by Add-to-Cart click handler in cart.html
467 to indicate the wishlist row has been moved into the cart. */
468 .is-faded { opacity: 0.4; }
469
470