@zvndev/darkmown 0.19.0 → 1.0.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.
Files changed (69) hide show
  1. package/AGENTS.md +1 -1
  2. package/CHANGELOG.md +25 -0
  3. package/README.md +115 -5
  4. package/docs/spec-alignment.md +16 -3
  5. package/package.json +22 -4
  6. package/site/_/base.skin +372 -0
  7. package/site/_/base.wd +4 -0
  8. package/site/_/footer.wd +14 -0
  9. package/site/_/metrics.json +13 -0
  10. package/site/_/nav.skin +35 -12
  11. package/site/_/nav.wd +8 -10
  12. package/site/_/products.json +10 -0
  13. package/site/pages/app.wd +1 -1
  14. package/site/pages/carousel/index.js +82 -0
  15. package/site/pages/carousel/index.skin +185 -0
  16. package/site/pages/carousel/index.wd +109 -0
  17. package/site/pages/carousel/slide-1.jpg +0 -0
  18. package/site/pages/carousel/slide-2.jpg +0 -0
  19. package/site/pages/carousel/slide-3.jpg +0 -0
  20. package/site/pages/carousel/slide-4.jpg +0 -0
  21. package/site/pages/carousel/slide-5.jpg +0 -0
  22. package/site/pages/compass/index.skin +247 -0
  23. package/site/pages/compass/index.wd +194 -0
  24. package/site/pages/docs/index.skin +48 -28
  25. package/site/pages/docs/index.wd +71 -5
  26. package/site/pages/folio/-style.skin +375 -0
  27. package/site/pages/folio/-style.wd +6 -0
  28. package/site/pages/folio/cart.skin +309 -0
  29. package/site/pages/folio/cart.wd +201 -0
  30. package/site/pages/folio/index.skin +24 -0
  31. package/site/pages/folio/index.wd +167 -0
  32. package/site/pages/forge/index.skin +676 -0
  33. package/site/pages/forge/index.wd +330 -0
  34. package/site/pages/index.skin +135 -144
  35. package/site/pages/index.wd +17 -5
  36. package/site/pages/ledger/index.skin +257 -0
  37. package/site/pages/ledger/index.wd +174 -0
  38. package/site/pages/media/clip-poster.jpg +0 -0
  39. package/site/pages/media/clip.mp4 +0 -0
  40. package/site/pages/media/index.skin +82 -0
  41. package/site/pages/media/index.wd +84 -0
  42. package/site/pages/media/tone.mp3 +0 -0
  43. package/site/pages/pulse/index.skin +434 -0
  44. package/site/pages/pulse/index.wd +178 -0
  45. package/site/pages/showcase/index.skin +130 -0
  46. package/site/pages/showcase/index.wd +168 -0
  47. package/src/builder.js +20 -14
  48. package/src/cli.js +216 -77
  49. package/src/compiler/body.js +457 -0
  50. package/src/compiler/context.js +160 -0
  51. package/src/compiler/directives.js +1345 -0
  52. package/src/compiler/format.js +244 -0
  53. package/src/compiler/frontmatter.js +117 -0
  54. package/src/compiler/includes.js +116 -0
  55. package/src/compiler/index.js +22 -0
  56. package/src/compiler/interpolation.js +223 -0
  57. package/src/compiler/loops.js +715 -0
  58. package/src/compiler/markdown.js +242 -0
  59. package/src/compiler/page.js +267 -0
  60. package/src/compiler/predicates.js +314 -0
  61. package/src/compiler.js +26 -2932
  62. package/src/dev.js +3 -1
  63. package/src/headers.js +8 -4
  64. package/src/index.js +22 -0
  65. package/src/router.js +3 -1
  66. package/src/runtime.js +168 -14
  67. package/src/scaffold.js +158 -131
  68. package/src/skin.js +11 -2
  69. package/site/_/og.png +0 -0
@@ -0,0 +1,375 @@
1
+ /* ===================================================================
2
+ Folio — a boutique storefront. Warm editorial luxe.
3
+
4
+ Sits on top of /base.wd (tokens, type, dark mode, .card/.btn/.tag).
5
+ The DISTINCT identity: a refined terracotta accent, a tight 2-column
6
+ product grid beside a sticky cart rail, compact uniform cards with a
7
+ soft emoji chip, and a filled brand "Add" button.
8
+ Shared by /folio/ and /folio/cart/ via `@include ./style.wd`.
9
+ =================================================================== */
10
+
11
+ /* The brand accent — scoped to the app wrapper so it never leaks into
12
+ the rest of the site. Dark mode lifts it to a warmer, brighter clay. */
13
+ .app-folio
14
+ --brand #b8462e
15
+ --brand-deep #97331f
16
+ --brand-soft #f8ece5
17
+ --brand-tint #fbf3ee
18
+ --shelf #fcf9f4
19
+
20
+ @media (prefers-color-scheme: dark)
21
+ .app-folio
22
+ --brand #e88a6f
23
+ --brand-deep #f2a78f
24
+ --brand-soft #2c1d16
25
+ --brand-tint #221710
26
+ --shelf #18130e
27
+
28
+ .app-folio
29
+ padding-top 1rem
30
+
31
+ /* ── Storefront header / hero ───────────────────────────────────── */
32
+
33
+ .shop-head
34
+ display flex
35
+ flex-wrap wrap
36
+ align-items flex-end
37
+ justify-content space-between
38
+ gap 1.25rem 2rem
39
+ padding 2.25rem 0 1.75rem
40
+ border-bottom 1px solid $line
41
+
42
+ .shop-mark
43
+ max-width 44ch
44
+
45
+ .shop-eyebrow
46
+ display inline-block
47
+ text-transform uppercase
48
+ letter-spacing .22em
49
+ font-size .72rem
50
+ font-weight 600
51
+ font-family system-ui, -apple-system, "Segoe UI", Roboto, sans-serif
52
+ color var(--brand)
53
+ margin 0 0 .55rem
54
+
55
+ .shop-name
56
+ font-size clamp(2.75rem, 7vw, 4.75rem)
57
+ line-height .92
58
+ letter-spacing -.03em
59
+ margin 0
60
+ font-weight 600
61
+
62
+ .shop-name em
63
+ font-style italic
64
+ color var(--brand)
65
+
66
+ .shop-tagline
67
+ font-size 1.08rem
68
+ color $ink-soft
69
+ margin .85rem 0 0
70
+ max-width 42ch
71
+
72
+ /* ── Layout: catalog + sticky cart rail ─────────────────────────── */
73
+
74
+ .shop-layout
75
+ display grid
76
+ grid-template-columns 1fr 300px
77
+ gap 2rem
78
+ align-items start
79
+ margin-top 2rem
80
+
81
+ .shop-main
82
+ min-width 0
83
+
84
+ @media (max-width: 900px)
85
+ .shop-layout
86
+ grid-template-columns 1fr
87
+ gap 1.5rem
88
+
89
+ /* ── Search field (a :bind input) ───────────────────────────────── */
90
+
91
+ .shop-search input[data-wd-bind-input]
92
+ width 100%
93
+ box-sizing border-box
94
+ font-family inherit
95
+ font-size 1.02rem
96
+ padding .8rem 1.1rem
97
+ border 1px solid $line
98
+ radius 999px
99
+ bg $panel
100
+ color $ink
101
+ margin .1rem 0 .35rem
102
+ transition border-color .15s ease, box-shadow .15s ease
103
+
104
+ .shop-search input[data-wd-bind-input]:focus
105
+ outline none
106
+ border-color var(--brand)
107
+ box-shadow 0 0 0 3px var(--brand-soft)
108
+
109
+ .shop-search input[data-wd-bind-input]::placeholder
110
+ color $faint
111
+
112
+ .shop-hint
113
+ font-size .82rem
114
+ color $muted
115
+ font-style italic
116
+ margin .1rem 0 0
117
+
118
+ /* ── Catalog grid ────────────────────────────────────────────────
119
+ The reactive @loop renders rows into a `<div data-wd-loop-out>`, so the
120
+ grid lives on that out container (its direct children are the cards). */
121
+
122
+ .catalog
123
+ margin 1.5rem 0 0
124
+
125
+ .catalog [data-wd-loop-out]
126
+ display grid
127
+ grid-template-columns repeat(2, 1fr)
128
+ gap 1rem
129
+
130
+ @media (max-width: 620px)
131
+ .catalog [data-wd-loop-out]
132
+ grid-template-columns 1fr
133
+
134
+ /* ── Product card ─────────────────────────────────────────────────
135
+ Compact and uniform: a small emoji chip top-left, the name + tag,
136
+ a one-line blurb, then a price/Add footer pinned to the bottom. */
137
+
138
+ .product
139
+ position relative
140
+ display flex
141
+ flex-direction column
142
+ gap .7rem
143
+ padding 1.1rem 1.15rem 1.15rem
144
+ height 100%
145
+ box-sizing border-box
146
+ border 1px solid $line
147
+ radius $radius
148
+ bg $panel
149
+ box-shadow 0 1px 2px rgba(28,24,20,.04)
150
+ transition transform .16s ease, box-shadow .16s ease, border-color .16s ease
151
+
152
+ .product:hover
153
+ transform translateY(-2px)
154
+ border-color var(--brand)
155
+ box-shadow 0 16px 34px -22px rgba(28,24,20,.45)
156
+
157
+ /* Prose inside the card containers renders as <p>; strip its margins so
158
+ the compact layout holds (the chip is a tight 48px box). */
159
+ .product .chip p, .product .pname p, .product .tag p, .product .blurb p, .product .price p
160
+ margin 0
161
+ max-width none
162
+
163
+ /* The emoji chip — a small soft-tinted rounded square holding the emoji. */
164
+ .product .chip
165
+ display flex
166
+ align-items center
167
+ justify-content center
168
+ width 48px
169
+ height 48px
170
+ font-size 1.65rem
171
+ line-height 1
172
+ radius 14px
173
+ background var(--brand-tint)
174
+ border 1px solid $line-soft
175
+ flex-shrink 0
176
+
177
+ .product .body
178
+ display flex
179
+ flex-direction column
180
+ gap .4rem
181
+ flex 1
182
+ min-width 0
183
+
184
+ .product .pname
185
+ font-size 1.18rem
186
+ line-height 1.18
187
+ letter-spacing -.015em
188
+ margin 0
189
+ font-weight 600
190
+
191
+ .product .body .tag
192
+ align-self flex-start
193
+ margin 0
194
+ background var(--brand-soft)
195
+ color var(--brand-deep)
196
+
197
+ .product .blurb
198
+ font-size .86rem
199
+ color $ink-soft
200
+ line-height 1.45
201
+ margin .1rem 0 0
202
+ flex 1
203
+ display -webkit-box
204
+ -webkit-line-clamp 2
205
+ -webkit-box-orient vertical
206
+ overflow hidden
207
+
208
+ .product .foot
209
+ display flex
210
+ align-items center
211
+ justify-content space-between
212
+ gap .6rem
213
+ margin-top .55rem
214
+ padding-top .8rem
215
+ border-top 1px solid $line-soft
216
+
217
+ .product .price
218
+ font-size 1.3rem
219
+ font-weight 650
220
+ letter-spacing -.02em
221
+ color $ink
222
+ margin 0
223
+
224
+ /* The "Add" button — filled brand terracotta, white, fully rounded.
225
+ The `:button` directive emits a bare <button data-wd-action>, so we
226
+ target it by attribute (same pattern as the cart's remove button). */
227
+ .product .foot button[data-wd-action]
228
+ border 0
229
+ margin 0
230
+ font-family system-ui, -apple-system, "Segoe UI", Roboto, sans-serif
231
+ font-size .85rem
232
+ font-weight 600
233
+ letter-spacing .01em
234
+ padding .5rem 1.1rem
235
+ radius 999px
236
+ bg var(--brand)
237
+ color #fff
238
+ cursor pointer
239
+ flex-shrink 0
240
+ transition background .14s ease, transform .12s ease, box-shadow .12s ease
241
+
242
+ .product .foot button[data-wd-action]:hover
243
+ bg var(--brand-deep)
244
+ transform translateY(-1px)
245
+ box-shadow 0 8px 16px -8px rgba(184,70,46,.5)
246
+
247
+ .product .foot button[data-wd-action]:active
248
+ transform translateY(0)
249
+
250
+ /* Empty / no-matches state — spans the whole grid row. */
251
+ .catalog-empty
252
+ grid-column 1 / -1
253
+ padding 2.25rem 1.5rem
254
+ text-align center
255
+ border 1px dashed $line
256
+ radius $radius
257
+ bg $paper-2
258
+ color $muted
259
+
260
+ .catalog-empty p
261
+ margin .3rem auto
262
+ max-width none
263
+
264
+ /* ── Sticky cart rail (catalog page) — same card treatment ──────── */
265
+
266
+ .cart-rail
267
+ position sticky
268
+ top 1.25rem
269
+ border 1px solid $line
270
+ radius $radius
271
+ bg $panel
272
+ padding 1.25rem 1.25rem 1.35rem
273
+ box-shadow 0 1px 2px rgba(28,24,20,.04)
274
+
275
+ .cart-rail .rail-eyebrow
276
+ display flex
277
+ align-items center
278
+ justify-content space-between
279
+ font-family system-ui, -apple-system, "Segoe UI", Roboto, sans-serif
280
+ font-size .7rem
281
+ font-weight 600
282
+ text-transform uppercase
283
+ letter-spacing .12em
284
+ color $muted
285
+ margin 0 0 .15rem
286
+
287
+ .cart-rail .rail-count
288
+ font-size 2.85rem
289
+ line-height 1
290
+ letter-spacing -.03em
291
+ color var(--brand)
292
+ margin .1rem 0 0
293
+ font-weight 650
294
+
295
+ .cart-rail .rail-sub
296
+ font-size .88rem
297
+ color $ink-soft
298
+ margin .5rem 0 1rem
299
+
300
+ .cart-rail .rail-link
301
+ display flex
302
+ align-items center
303
+ justify-content center
304
+ gap .4rem
305
+ width 100%
306
+ box-sizing border-box
307
+ margin 0
308
+ padding .75rem 1rem
309
+ font-family system-ui, -apple-system, "Segoe UI", Roboto, sans-serif
310
+ font-size .92rem
311
+ font-weight 600
312
+ text-decoration none
313
+ radius 999px
314
+ bg var(--brand)
315
+ color #fff
316
+ border 1px solid var(--brand)
317
+ transition background .14s ease, transform .12s ease, box-shadow .12s ease
318
+
319
+ .cart-rail .rail-link:hover
320
+ bg var(--brand-deep)
321
+ color #fff
322
+ transform translateY(-1px)
323
+ box-shadow 0 8px 16px -8px rgba(184,70,46,.5)
324
+
325
+ .cart-rail .rail-note
326
+ margin 1rem 0 0
327
+ border-top 1px solid $line-soft
328
+ padding-top .9rem
329
+ font-size .8rem
330
+ color $muted
331
+ font-style italic
332
+ line-height 1.5
333
+
334
+ /* ── Persistence ribbon ─────────────────────────────────────────── */
335
+
336
+ .persist-note
337
+ display flex
338
+ gap .7rem
339
+ align-items flex-start
340
+ margin 1.75rem 0 0
341
+ padding 1rem 1.2rem
342
+ border 1px solid $line
343
+ border-left 3px solid var(--brand)
344
+ radius $radius-sm
345
+ bg var(--brand-soft)
346
+ color $ink-soft
347
+ font-size .9rem
348
+
349
+ .persist-note .dot
350
+ font-size 1.05rem
351
+ line-height 1.5
352
+ color var(--brand)
353
+
354
+ /* ── Footer cross-link strip ────────────────────────────────────── */
355
+
356
+ .folio-foot
357
+ display flex
358
+ flex-wrap wrap
359
+ align-items center
360
+ justify-content space-between
361
+ gap 1rem
362
+ margin 3rem 0 0
363
+ padding-top 1.5rem
364
+ border-top 1px solid $line
365
+ font-size .92rem
366
+ color $muted
367
+
368
+ .folio-foot a
369
+ color var(--brand)
370
+ font-weight 600
371
+ text-decoration none
372
+
373
+ .folio-foot a:hover
374
+ color var(--brand-deep)
375
+ text-decoration underline
@@ -0,0 +1,6 @@
1
+ <!-- Folio — shared style carrier.
2
+
3
+ Both the catalog (/folio/) and the cart (/folio/cart/) `@include ./style.wd`
4
+ so the boutique look lives in exactly one place. This file renders no markup;
5
+ including it pulls in style.skin (the warm editorial-luxe layer that sits on
6
+ top of the base design system from /base.wd). -->
@@ -0,0 +1,309 @@
1
+ /* Folio cart / checkout page — thin layer over style.skin and /base.wd.
2
+ Holds the line-item rows, the two-column cart layout, and the checkout
3
+ form + receipt styling. */
4
+
5
+ /* ── Two-column: line items | checkout panel ────────────────────── */
6
+
7
+ .app-folio .cart-grid
8
+ display grid
9
+ grid-template-columns 1.3fr 1fr
10
+ gap 2rem
11
+ align-items start
12
+ margin-top 2rem
13
+
14
+ .app-folio .cart-lines h2, .app-folio .checkout-panel h2
15
+ margin-top 0
16
+
17
+ @media (max-width: 860px)
18
+ .app-folio .cart-grid
19
+ grid-template-columns 1fr
20
+ gap 2rem
21
+
22
+ /* ── A basket line — same compact card treatment as the catalog ──── */
23
+
24
+ .app-folio .line
25
+ display flex
26
+ align-items center
27
+ gap .9rem
28
+ padding .85rem 1rem
29
+ margin .65rem 0
30
+ border 1px solid $line
31
+ radius $radius
32
+ bg $panel
33
+ box-shadow 0 1px 2px rgba(28,24,20,.04)
34
+ transition border-color .14s ease, box-shadow .14s ease
35
+
36
+ .app-folio .line:hover
37
+ border-color var(--brand)
38
+ box-shadow 0 10px 24px -18px rgba(28,24,20,.45)
39
+
40
+ /* Prose inside the line containers renders as <p>; strip its margins so
41
+ the compact row holds (the chip is a tight 46px box). */
42
+ .app-folio .line .line-emoji p, .app-folio .line .line-name p, .app-folio .line .line-cat p, .app-folio .line .line-price p
43
+ margin 0
44
+ max-width none
45
+
46
+ /* The emoji chip — matches the catalog card chip exactly. */
47
+ .app-folio .line .line-emoji
48
+ font-size 1.55rem
49
+ line-height 1
50
+ width 46px
51
+ height 46px
52
+ display flex
53
+ align-items center
54
+ justify-content center
55
+ flex-shrink 0
56
+ radius 14px
57
+ background var(--brand-tint)
58
+ border 1px solid $line-soft
59
+
60
+ .app-folio .line .line-body
61
+ flex 1
62
+ min-width 0
63
+
64
+ .app-folio .line .line-name
65
+ font-size 1.08rem
66
+ font-weight 600
67
+ letter-spacing -.01em
68
+ line-height 1.2
69
+ margin 0
70
+
71
+ .app-folio .line .line-cat
72
+ font-family system-ui, -apple-system, "Segoe UI", Roboto, sans-serif
73
+ font-size .68rem
74
+ font-weight 600
75
+ text-transform uppercase
76
+ letter-spacing .08em
77
+ color $muted
78
+ margin .2rem 0 0
79
+
80
+ .app-folio .line .line-price
81
+ font-size 1.15rem
82
+ font-weight 650
83
+ letter-spacing -.02em
84
+ color $ink
85
+ margin 0
86
+ flex-shrink 0
87
+
88
+ .app-folio .line button[data-wd-action]
89
+ border 1px solid $line
90
+ margin 0
91
+ flex-shrink 0
92
+ font-family system-ui, -apple-system, "Segoe UI", Roboto, sans-serif
93
+ font-size .78rem
94
+ font-weight 600
95
+ padding .42rem .8rem
96
+ radius 999px
97
+ bg $panel
98
+ color $muted
99
+ cursor pointer
100
+ transition color .14s ease, border-color .14s ease, background .14s ease
101
+
102
+ .app-folio .line button[data-wd-action]:hover
103
+ color var(--brand)
104
+ border-color var(--brand)
105
+ background var(--brand-soft)
106
+
107
+ /* Empty basket card */
108
+ .app-folio .cart-blank
109
+ padding 2.25rem 1.5rem
110
+ text-align center
111
+ border 1px dashed $line
112
+ radius $radius
113
+ bg $paper-2
114
+ color $muted
115
+
116
+ .app-folio .cart-blank a
117
+ color var(--brand)
118
+ font-weight 600
119
+
120
+ /* Clear-basket action row */
121
+ .app-folio .cart-actions
122
+ display flex
123
+ align-items center
124
+ justify-content space-between
125
+ flex-wrap wrap
126
+ gap .75rem
127
+ margin-top 1.25rem
128
+ padding-top 1.1rem
129
+ border-top 1px solid $line-soft
130
+ font-size .9rem
131
+ color $muted
132
+
133
+ .app-folio .cart-actions button[data-wd-action]
134
+ border 1px solid $line
135
+ margin 0
136
+ font-family system-ui, -apple-system, "Segoe UI", Roboto, sans-serif
137
+ font-size .82rem
138
+ font-weight 600
139
+ padding .55rem 1rem
140
+ radius 999px
141
+ bg $panel
142
+ color $ink-soft
143
+ cursor pointer
144
+ transition color .14s ease, border-color .14s ease
145
+
146
+ .app-folio .cart-actions button[data-wd-action]:hover
147
+ color var(--brand)
148
+ border-color var(--brand)
149
+
150
+ /* ── Checkout panel ─────────────────────────────────────────────── */
151
+
152
+ .app-folio .checkout-panel
153
+ position sticky
154
+ top 1.25rem
155
+ border 1px solid $line
156
+ radius $radius
157
+ bg $panel
158
+ padding 1.5rem 1.5rem 1.65rem
159
+ box-shadow 0 1px 2px rgba(28,24,20,.04)
160
+
161
+ .app-folio .checkout-panel p
162
+ font-size .92rem
163
+ color $ink-soft
164
+
165
+ .app-folio .checkout-panel form
166
+ display flex
167
+ flex-direction column
168
+ gap .75rem
169
+ margin 1.25rem 0 0
170
+
171
+ .app-folio .checkout-panel input, .app-folio .checkout-panel select
172
+ width 100%
173
+ box-sizing border-box
174
+ font-family inherit
175
+ font-size 1rem
176
+ padding .75rem .9rem
177
+ border 1px solid $line
178
+ radius $radius-sm
179
+ bg $paper
180
+ color $ink
181
+ margin 0
182
+ transition border-color .15s ease, box-shadow .15s ease
183
+
184
+ .app-folio .checkout-panel input:focus, .app-folio .checkout-panel select:focus
185
+ outline none
186
+ border-color var(--brand)
187
+ box-shadow 0 0 0 3px var(--brand-soft)
188
+
189
+ .app-folio .checkout-panel input::placeholder
190
+ color $faint
191
+
192
+ .app-folio .checkout-panel button[type="submit"]
193
+ border 0
194
+ margin .45rem 0 0
195
+ width 100%
196
+ font-family system-ui, -apple-system, "Segoe UI", Roboto, sans-serif
197
+ font-size 1rem
198
+ font-weight 600
199
+ letter-spacing .01em
200
+ padding .9rem 1rem
201
+ radius 999px
202
+ bg var(--brand)
203
+ color #fff
204
+ cursor pointer
205
+ transition background .14s ease, transform .12s ease, box-shadow .12s ease
206
+
207
+ .app-folio .checkout-panel button[type="submit"]:hover
208
+ bg var(--brand-deep)
209
+ transform translateY(-1px)
210
+ box-shadow 0 10px 20px -8px rgba(184,70,46,.5)
211
+
212
+ .app-folio .checkout-panel button[type="submit"]:active
213
+ transform translateY(0)
214
+
215
+ .app-folio .checkout-hint
216
+ margin 1.1rem 0 0
217
+ padding-top 1rem
218
+ border-top 1px solid $line-soft
219
+ font-size .85rem
220
+ color $muted
221
+ font-style italic
222
+
223
+ /* ── Receipt ────────────────────────────────────────────────────── */
224
+
225
+ .app-folio .receipt
226
+ margin 1.25rem 0 0
227
+ padding 1.2rem 1.3rem
228
+ border 1px solid var(--brand)
229
+ border-left 3px solid var(--brand)
230
+ radius $radius
231
+ background var(--brand-soft)
232
+
233
+ .app-folio .receipt strong
234
+ color var(--brand-deep)
235
+
236
+ .app-folio .receipt p
237
+ color $ink-soft
238
+
239
+ .app-folio .receipt .receipt-stamp
240
+ margin .6rem 0 0
241
+ font-family ui-monospace, "SF Mono", Menlo, monospace
242
+ font-size .76rem
243
+ color $muted
244
+
245
+ .app-folio .receipt-error
246
+ margin 1rem 0 0
247
+ padding 1rem 1.2rem
248
+ border 1px solid $line
249
+ border-left 3px solid $warm
250
+ radius $radius-sm
251
+ background $warm-soft
252
+ color $ink-soft
253
+ font-size .9rem
254
+
255
+ /* ── Order summary — live subtotal/tax/total via :computed sum() + | money ── */
256
+ .app-folio .order-summary
257
+ margin-top 1.25rem
258
+ padding 1.1rem 1.2rem
259
+ border 1px solid $line-soft
260
+ radius 14px
261
+ bg $panel
262
+
263
+ .app-folio .order-summary h3
264
+ margin 0 0 .75rem
265
+ font-size .78rem
266
+ font-weight 700
267
+ letter-spacing .08em
268
+ text-transform uppercase
269
+ color $muted
270
+
271
+ .app-folio .sum-row
272
+ display flex
273
+ align-items baseline
274
+ justify-content space-between
275
+ gap 1rem
276
+ font-size .92rem
277
+ color $ink-soft
278
+ padding .3rem 0
279
+
280
+ .app-folio .sum-row p
281
+ margin 0
282
+
283
+ .app-folio .sum-val
284
+ font-variant-numeric tabular-nums
285
+ color $ink
286
+
287
+ .app-folio .sum-total
288
+ margin-top .35rem
289
+ padding-top .7rem
290
+ border-top 1px solid $line-soft
291
+ font-size 1.05rem
292
+ color $ink
293
+
294
+ .app-folio .order-summary button[data-wd-action]
295
+ margin-top 1rem
296
+ width 100%
297
+ border 1px solid $line
298
+ font-size .82rem
299
+ font-weight 600
300
+ padding .6rem 1rem
301
+ radius 999px
302
+ bg transparent
303
+ color $ink-soft
304
+ cursor pointer
305
+ transition color .14s ease, border-color .14s ease
306
+
307
+ .app-folio .order-summary button[data-wd-action]:hover
308
+ color $ink
309
+ border-color $ink-soft