@gemboss/website-ui 0.11.0 → 0.13.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.
package/website.css CHANGED
@@ -1,9 +1,10 @@
1
- /*! @gemboss/website-ui 0.11.0 | generated by scripts/build.mjs from the files in css/. Edit those and not this file */
1
+ /*! @gemboss/website-ui 0.13.0 | generated by scripts/build.mjs from the files in css/. Edit those and not this file */
2
2
  /* @gemboss/website-ui tokens. GENERATED from system.json by scripts/build.mjs: do not edit by hand. */
3
3
  :root {
4
4
  color-scheme: light;
5
5
  --gw-font: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
6
6
  --gw-font-mono: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
7
+ --gw-font-action: Inter;
7
8
  --gw-text-11: 11px;
8
9
  --gw-text-12: 12px;
9
10
  --gw-text-13: 13px;
@@ -19,6 +20,8 @@
19
20
  --gw-display-wordmark: clamp(40px, 9vw, 128px);
20
21
  --gw-display-weight: 600;
21
22
  --gw-display-tracking: -0.03em;
23
+ --gw-display-h1-leading: 1.1;
24
+ --gw-display-h2-leading: 1.06;
22
25
  --gw-heading-weight: 650;
23
26
  --gw-heading-tracking: -0.022em;
24
27
  --gw-heading-leading: 1.08;
@@ -71,6 +74,7 @@
71
74
  --gw-tap-min: 44px;
72
75
  --gw-ease: cubic-bezier(.22,1,.36,1);
73
76
  --gw-reveal-ms: 700ms;
77
+ --gw-reveal-distance: 20px;
74
78
  --gw-spin-ms: 700ms;
75
79
  --gw-spot-radius: 260px;
76
80
  --gw-spot-radius-action: 120px;
@@ -89,6 +93,13 @@
89
93
  --gw-stage-bottom: #0d0f2e;
90
94
  --gw-stage-dot: rgba(255, 255, 255, 0.1);
91
95
  --gw-stage-ink: #ffffff;
96
+ --gw-announce-bg: #171a38;
97
+ --gw-announce-ink: #b9beda;
98
+ --gw-announce-line: rgba(255, 255, 255, 0.06);
99
+ --gw-announce-tag: rgba(122, 132, 255, 0.2);
100
+ --gw-announce-tag-ink: #a7aeff;
101
+ --gw-announce-link: #ffffff;
102
+ --gw-announce-link-line: rgba(255, 255, 255, 0.28);
92
103
  /* accent primitives: the only colours a brand overrides (docs/theming.md) */
93
104
  --gw-accent-light: #5661f5;
94
105
  --gw-accent-strong-light: #3a44de;
@@ -305,33 +316,34 @@ h1, h2, h3, h4, h5, h6, .gw-h1, .gw-h2, .gw-h3, .gw-h4 {
305
316
  text-wrap: balance;
306
317
  }
307
318
  h1, .gw-h1, h2, .gw-h2 { font-weight: var(--gw-display-weight); letter-spacing: var(--gw-display-tracking); }
308
- h1, .gw-h1 { font-size: var(--gw-display-h1); }
309
- h2, .gw-h2 { font-size: var(--gw-display-h2); }
310
- h3, .gw-h3 { font-size: 24px; }
319
+ h1, .gw-h1 { font-size: var(--gw-display-h1); line-height: var(--gw-display-h1-leading); }
320
+ h2, .gw-h2 { font-size: var(--gw-display-h2); line-height: var(--gw-display-h2-leading); }
321
+ /* h3 (0.12.0): 20px/600, as every h3 on gemboss.ai */
322
+ h3, .gw-h3 { font-size: 20px; font-weight: 600; letter-spacing: -0.02em; line-height: 1.2; }
311
323
  h4, .gw-h4 { font-size: 20px; font-weight: 600; letter-spacing: -0.01em; }
312
324
  h5, h6 { font-size: 16px; font-weight: 600; letter-spacing: 0; }
313
325
 
314
- .gw-lead { font-size: 18px; line-height: 1.55; color: var(--gw-muted); max-width: 60ch; }
326
+ .gw-lead { font-size: 18px; line-height: 1.55; color: var(--gw-muted); max-width: 58ch; }
315
327
  .gw-note { font-size: 14px; color: var(--gw-muted); }
316
328
  .gw-dim { color: var(--gw-muted); }
317
329
 
318
- /* the label above a heading: sentence case, muted, led by the 8px accent square */
330
+ /* the label above a heading: sentence case, muted, led by the 8px square, ink by default (0.12.0, as gemboss.ai). The
331
+ input --gw-label-mark paints the square another colour (a product's own, say): set it on the label or on anything
332
+ around it, e.g. style="--gw-label-mark: var(--gw-accent)". */
319
333
  .gw-label {
320
334
  display: inline-flex;
321
335
  align-items: center;
322
336
  gap: 8px;
323
337
  font-size: 13px;
324
338
  font-weight: 500;
325
- line-height: 1.4;
326
339
  color: var(--gw-muted);
327
340
  }
328
341
  .gw-label::before {
329
342
  content: "";
330
- flex: none;
331
343
  width: 8px;
332
344
  height: 8px;
333
- border-radius: var(--gw-radius-0);
334
- background: var(--gw-accent);
345
+ border-radius: var(--gw-radius-2);
346
+ background: var(--gw-label-mark, var(--gw-ink));
335
347
  }
336
348
 
337
349
  /* links inside running text (and anywhere in .gw-prose) get a visible link style; everything else opts in with .gw-link */
@@ -351,19 +363,22 @@ h5, h6 { font-size: 16px; font-weight: 600; letter-spacing: 0; }
351
363
  :focus-visible { border-radius: var(--gw-radius-4); outline: 2px solid var(--gw-accent); outline-offset: 3px; }
352
364
  [id] { scroll-margin-top: calc(var(--gw-header-height) + 16px); }
353
365
 
366
+ /* the skip link (0.12.0, gemboss.ai's): the accent tab in the top left corner, shown while it has the focus */
354
367
  .gw-skip {
355
368
  position: absolute;
356
369
  left: -9999px;
357
- top: 8px;
358
- z-index: 100;
359
- padding: 12px 16px;
360
- border-radius: var(--gw-radius-action);
361
- background: var(--gw-action);
362
- color: var(--gw-on-action);
370
+ top: 0;
371
+ z-index: 200;
372
+ padding: 12px 20px;
373
+ border-radius: 0 0 var(--gw-radius-card) 0;
374
+ background: var(--gw-accent);
375
+ color: var(--gw-on-accent);
376
+ box-shadow: var(--gw-shadow);
363
377
  font-size: 14px;
364
378
  font-weight: 600;
365
379
  }
366
- .gw-skip:focus { left: 16px; }
380
+ /* its corner again with the focus: a page's own :focus-visible corners, loaded after the kit, must not round the tab */
381
+ .gw-skip:focus { left: 0; border-radius: 0 0 var(--gw-radius-card) 0; }
367
382
 
368
383
  /* words for a screen reader only (0.7.0): " (opens in a new tab)" in a link with target="_blank" */
369
384
  .gw-visually-hidden {
@@ -377,10 +392,11 @@ h5, h6 { font-size: 16px; font-weight: 600; letter-spacing: 0; }
377
392
  border: 0;
378
393
  }
379
394
 
380
- /* scroll reveal: the script adds .is-in; the animation is a failsafe that shows it anyway after 2.5s */
395
+ /* scroll reveal: the script adds .is-in (system.json motion.reveal: when, the stagger, the failsafe); the animation is
396
+ a second failsafe, for a page whose script never ran, that shows it anyway after 2.5s */
381
397
  .gw-reveal {
382
398
  opacity: 0;
383
- transform: translateY(24px);
399
+ transform: translateY(var(--gw-reveal-distance));
384
400
  transition: opacity var(--gw-reveal-ms) var(--gw-ease), transform var(--gw-reveal-ms) var(--gw-ease);
385
401
  animation: gw-reveal-failsafe 1ms linear 2.5s forwards;
386
402
  }
@@ -406,15 +422,19 @@ h5, h6 { font-size: 16px; font-weight: 600; letter-spacing: 0; }
406
422
  @media (min-width: 768px) { .gw-section--tight { padding-block: 64px; } }
407
423
 
408
424
  /* label + h2 + one or two lines; the vertical flow of every text block in the kit */
409
- .gw-section__head { max-width: 660px; }
425
+ .gw-section__head { max-width: 760px; }
410
426
  .gw-section__head--center { margin-inline: auto; text-align: center; }
411
427
  .gw-section__head--center .gw-lead { margin-inline: auto; }
412
- .gw-section__head:not(:last-child) { margin-bottom: 40px; }
413
- @media (min-width: 768px) { .gw-section__head:not(:last-child) { margin-bottom: 48px; } }
428
+ /* what follows a head starts 40px under it, 48px from 768px (0.12.0): a top margin on the next thing, at no
429
+ specificity, so a block that brings its own (a FAQ's 40px, say) keeps it */
430
+ :where(.gw-section__head) + * { margin-top: 40px; }
431
+ @media (min-width: 768px) { :where(.gw-section__head) + * { margin-top: 48px; } }
414
432
 
415
433
  :where(.gw-section__head, .gw-hero > .gw-wrap, .gw-split > :not(.gw-window), .gw-cta, .gw-card, .gw-feature, .gw-plan) > * + * { margin-top: 16px; }
416
434
  :where(.gw-section__head, .gw-hero > .gw-wrap, .gw-split > :not(.gw-window), .gw-cta, .gw-card, .gw-plan) > :is(.gw-actions, .gw-segmented) { margin-top: 32px; }
417
435
  :where(.gw-section__head, .gw-hero > .gw-wrap, .gw-split > :not(.gw-window), .gw-cta, .gw-card, .gw-plan) > .gw-list--check { margin-top: 24px; }
436
+ /* a lead under a heading: 20px (0.12.0, as gemboss.ai); in a hero it keeps the 16px of the flow */
437
+ :where(.gw-section__head, .gw-split > :not(.gw-window), .gw-cta) > :where(* + .gw-lead) { margin-top: 20px; }
418
438
 
419
439
  /* a row of actions: one .gw-btn, then a secondary or a link */
420
440
  .gw-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 12px; }
@@ -456,12 +476,12 @@ h5, h6 { font-size: 16px; font-weight: 600; letter-spacing: 0; }
456
476
 
457
477
  /* actions are rectangles: 40px, the action radius of the site's profile (8, 12 in soft), 14px/600, sentence case.
458
478
  The fill is the action colour: ink, or the brand's accent under data-gw-action="accent" (tokens.css). Never a
459
- gradient, a wash hue or a shadow. */
479
+ gradient or a wash hue. On hover (0.12.0, as gemboss.ai) the filled button rises 1px onto the rest shadow; the framed
480
+ and frameless ones only change their frame or tint. Phones: see "touch" below. */
460
481
  .gw-btn {
461
482
  position: relative;
462
483
  display: inline-flex;
463
484
  align-items: center;
464
- justify-content: center;
465
485
  gap: 8px;
466
486
  max-width: 100%;
467
487
  height: var(--gw-button-height);
@@ -470,26 +490,34 @@ h5, h6 { font-size: 16px; font-weight: 600; letter-spacing: 0; }
470
490
  border-radius: var(--gw-radius-action);
471
491
  background: var(--gw-action);
472
492
  color: var(--gw-on-action);
493
+ font-family: var(--gw-font-action);
473
494
  font-size: 14px;
474
495
  font-weight: 600;
475
- line-height: 1.4;
476
496
  letter-spacing: 0;
477
497
  text-align: center;
478
498
  white-space: nowrap;
479
499
  cursor: pointer;
500
+ transition: background 0.15s ease, border-color 0.15s ease;
480
501
  }
481
- .gw-btn:hover { background: var(--gw-action-hover); }
502
+ .gw-btn:hover { transform: translateY(-1px); box-shadow: var(--gw-shadow); }
482
503
  .gw-btn svg { flex: none; width: 16px; height: 16px; }
483
504
  .gw-btn--secondary { background: transparent; border-color: var(--gw-line-strong); color: var(--gw-ink); }
484
505
  .gw-btn--secondary:hover { background: transparent; border-color: var(--gw-ink); }
485
506
  .gw-btn--ghost { background: transparent; color: var(--gw-ink); }
486
507
  .gw-btn--ghost:hover { background: var(--gw-bg-soft); }
508
+ .gw-btn:is(.gw-btn--secondary, .gw-btn--ghost):hover { transform: none; box-shadow: none; }
509
+ /* an arrow after the label (→), nudged 3px on hover */
510
+ .gw-btn__arrow { letter-spacing: 0; transition: transform 0.18s ease; }
511
+ .gw-btn:hover .gw-btn__arrow { transform: translateX(3px); }
512
+
487
513
  .gw-btn--on-night { background: var(--gw-on-night); color: var(--gw-night); }
488
514
  .gw-btn--on-night:hover { background: var(--gw-on-night); opacity: 0.88; }
489
515
  .gw-btn--sm { height: 36px; padding: 0 16px; }
490
516
  .gw-btn--sm::after { content: ""; position: absolute; top: -6px; right: 0; bottom: -6px; left: 0; }
491
517
  .gw-btn--lg { height: 48px; padding: 0 24px; font-size: 16px; }
492
- .gw-btn--block { display: flex; width: 100%; }
518
+ /* a button wider than its label keeps the label at its start (as gemboss.ai), unless it is made wide on purpose: full
519
+ width (--block), a phone's row of actions, an inline form */
520
+ .gw-btn--block { display: flex; width: 100%; justify-content: center; }
493
521
  .gw-btn:disabled, .gw-btn[aria-disabled="true"] { opacity: 0.48; cursor: not-allowed; pointer-events: none; }
494
522
  /* pressed: the ink one step darker (the hover ink, as the dashboard's primary), nothing moves; the frameless variants
495
523
  take one more step of tint */
@@ -712,6 +740,13 @@ h5, h6 { font-size: 16px; font-weight: 600; letter-spacing: 0; }
712
740
  }
713
741
  .gw-window__body:has(> img:only-child) + .gw-window__caption { padding-top: 12px; }
714
742
 
743
+ /* figure (0.13.0, Gemians): a photo and its caption where a section shows one outside the prose (beside words in a
744
+ split, under a hero's actions): the picture at the card radius, the caption 14px, muted, 12px under it, as a figure
745
+ in .gw-prose. A screen of the product goes in .gw-window instead. */
746
+ .gw-figure > :is(img, video, picture) { display: block; width: 100%; height: auto; border-radius: var(--gw-radius-card); }
747
+ .gw-figure > picture > img { display: block; width: 100%; height: auto; border-radius: inherit; }
748
+ .gw-figure > figcaption { margin-top: 12px; color: var(--gw-muted); font-size: 14px; line-height: 1.5; }
749
+
715
750
  /* icon: 20px inline stroke SVG (1.7 to 2px stroke, currentColor) */
716
751
  .gw-icon { display: inline-flex; align-items: center; justify-content: center; flex: none; width: 20px; height: 20px; }
717
752
  .gw-icon svg { width: 20px; height: 20px; }
@@ -788,16 +823,21 @@ h5, h6 { font-size: 16px; font-weight: 600; letter-spacing: 0; }
788
823
  .gw-faq__item[open] > summary::after { transform: rotate(45deg); }
789
824
  .gw-faq__item > :not(summary) { margin: 0 0 20px; max-width: 68ch; color: var(--gw-muted); font-size: 16px; }
790
825
 
791
- /* touch: every control is at least 44px tall, labels may wrap */
792
- @media (max-width: 768px), (pointer: coarse) {
826
+ /* touch: every control is at least 44px tall. A button up to 768px (0.12.0, as gemboss.ai: by the width, not the
827
+ pointer), its label wrapping (and tighter) from 480px down in the page's <main>, so a long one never pushes the page
828
+ sideways (a header or an overlay outside <main> keeps its one line) */
829
+ @media (max-width: 768px) {
793
830
  .gw-btn, .gw-btn--sm, .gw-btn--lg {
794
831
  height: auto;
795
832
  min-height: var(--gw-tap-min);
796
833
  padding-block: 8px;
797
- white-space: normal;
798
- text-wrap: balance;
799
834
  }
800
835
  .gw-btn--lg { min-height: 48px; }
836
+ }
837
+ @media (max-width: 480px) {
838
+ :where(main) .gw-btn { white-space: normal; line-height: 1.35; }
839
+ }
840
+ @media (max-width: 768px), (pointer: coarse) {
801
841
  :is(a, button, label).gw-chip { min-height: var(--gw-tap-min); }
802
842
  .gw-segmented > button { height: auto; min-height: var(--gw-tap-min); padding-block: 8px; white-space: normal; text-wrap: balance; }
803
843
  }
@@ -805,16 +845,50 @@ h5, h6 { font-size: 16px; font-weight: 600; letter-spacing: 0; }
805
845
  /* header: announcement, a flat 64px bar with one hairline, mega menu, mobile menu up to 1080px.
806
846
  Not a floating pill: no radius, no blur, no shadow on the bar. Nothing tucks under it. A brand may choose the one
807
847
  other shape, .gw-header--float (an inset card from 1081px, at the end of this file). */
848
+ /* the announcement bar (0.12.0, gemboss.ai's): one sentence on its own ground over the header, the same in both themes
849
+ (system.json color.announce). A small pill may lead it (.gw-announce__tag); its link is light, underlined by a hairline
850
+ that brightens on hover. From 520px down, 12px words and a slimmer bar. */
808
851
  .gw-announce {
809
- padding: 8px var(--gw-gutter);
810
- border-bottom: 1px solid var(--gw-line);
811
- background: var(--gw-bg-soft);
812
- color: var(--gw-ink-2);
852
+ position: relative;
853
+ z-index: 60;
854
+ padding: 12px 16px;
855
+ border-bottom: 1px solid var(--gw-announce-line);
856
+ background: var(--gw-announce-bg);
857
+ color: var(--gw-announce-ink);
813
858
  font-size: 13px;
859
+ font-weight: 500;
814
860
  line-height: 1.5;
861
+ letter-spacing: 0.005em;
815
862
  text-align: center;
816
863
  }
817
- .gw-announce a { color: var(--gw-ink); font-weight: 600; text-decoration: underline; text-underline-offset: 4px; }
864
+ /* 2.5px above and below, as gemboss.ai draws the pill (21.5px tall): the one half pixel in the kit */
865
+ .gw-announce__tag {
866
+ display: inline-block;
867
+ margin-right: 12px;
868
+ padding: 2.5px 8px;
869
+ border-radius: var(--gw-radius-chip);
870
+ background: var(--gw-announce-tag);
871
+ color: var(--gw-announce-tag-ink);
872
+ font-size: 11px;
873
+ font-weight: 700;
874
+ letter-spacing: 0.09em;
875
+ vertical-align: 1px;
876
+ }
877
+ .gw-announce a {
878
+ margin-left: 8px;
879
+ padding-bottom: 2px;
880
+ border-bottom: 1px solid var(--gw-announce-link-line);
881
+ color: var(--gw-announce-link);
882
+ font-weight: 600;
883
+ text-decoration: none;
884
+ white-space: nowrap;
885
+ transition: border-color 0.18s;
886
+ }
887
+ .gw-announce a:hover { border-bottom-color: var(--gw-announce-link); }
888
+ @media (max-width: 520px) {
889
+ .gw-announce { padding: 8px 12px; font-size: 12px; }
890
+ .gw-announce__tag { margin-right: 6px; }
891
+ }
818
892
 
819
893
  .gw-header {
820
894
  position: sticky;
@@ -1474,6 +1548,19 @@ html.is-menu-open .gw-header:has(> .gw-mobile-menu.is-drill) { position: sticky;
1474
1548
  :root:not([data-theme="light"]) .gw-theme-toggle__moon { display: none; }
1475
1549
  }
1476
1550
 
1551
+ /* ---- 0.13.0: the brand's logo as one drawing (Gemians): the mark and the wordmark in one file, in place of the mark and
1552
+ the name, 26px tall, its width the file's. Its alt is the brand's name. A logo drawn for dark grounds only (a white
1553
+ wordmark) comes as a second file, .gw-brand__logo--dark, right after the first: it shows in dark (the system's or the
1554
+ toggle's) and the first one hides, the toggle icons' rule. One file that reads on both: no --dark. */
1555
+ .gw-brand__logo { display: block; flex: none; width: auto; height: 26px; }
1556
+ .gw-brand__logo--dark { display: none; }
1557
+ :root[data-theme="dark"] .gw-brand__logo--dark { display: block; }
1558
+ :root[data-theme="dark"] .gw-brand__logo:has(+ .gw-brand__logo--dark) { display: none; }
1559
+ @media (prefers-color-scheme: dark) {
1560
+ :root:not([data-theme="light"]) .gw-brand__logo--dark { display: block; }
1561
+ :root:not([data-theme="light"]) .gw-brand__logo:has(+ .gw-brand__logo--dark) { display: none; }
1562
+ }
1563
+
1477
1564
  /* footer: brand block, link columns, bottom row. One hairline on top, white like the page. */
1478
1565
  .gw-footer {
1479
1566
  padding-block: 64px 32px;
@@ -1740,7 +1827,7 @@ html.is-menu-open .gw-header:has(> .gw-mobile-menu.is-drill) { position: sticky;
1740
1827
  radial-gradient(420px 320px at 52% 118%, color-mix(in srgb, var(--gw-wash-mint) 10%, transparent), transparent 62%);
1741
1828
  }
1742
1829
  .gw-hero h1 .gw-dim { display: block; }
1743
- .gw-hero > .gw-wrap > .gw-window { margin-top: 48px; }
1830
+ .gw-hero > .gw-wrap > :is(.gw-window, .gw-figure) { margin-top: 48px; }
1744
1831
  .gw-hero--center { text-align: center; }
1745
1832
  .gw-hero--center > .gw-wrap > * { margin-inline: auto; }
1746
1833
  .gw-hero--center .gw-actions { justify-content: center; }
@@ -1753,7 +1840,7 @@ html.is-menu-open .gw-header:has(> .gw-mobile-menu.is-drill) { position: sticky;
1753
1840
  .gw-hero > .gw-wrap > .gw-window { margin-top: 64px; }
1754
1841
  }
1755
1842
  @media (max-width: 479px) {
1756
- :is(.gw-hero, .gw-cta) .gw-actions > .gw-btn { flex: 1 1 100%; }
1843
+ :is(.gw-hero, .gw-cta) .gw-actions > .gw-btn { flex: 1 1 100%; justify-content: center; }
1757
1844
  }
1758
1845
 
1759
1846
  /* logos: a proof strip of real logos or wordmarks */
@@ -1773,7 +1860,7 @@ html.is-menu-open .gw-header:has(> .gw-mobile-menu.is-drill) { position: sticky;
1773
1860
  .gw-logos img { width: auto; height: 28px; }
1774
1861
 
1775
1862
  /* stats: three or four facts, each with its source */
1776
- .gw-stats { display: grid; grid-template-columns: minmax(0, 1fr); gap: 24px; margin: 0; padding: 0; list-style: none; }
1863
+ .gw-stats { display: grid; grid-template-columns: minmax(0, 1fr); gap: 24px; padding: 0; list-style: none; }
1777
1864
  .gw-stats__value { font-size: var(--gw-display-h2); font-weight: 600; letter-spacing: -0.03em; line-height: 1.1; font-variant-numeric: tabular-nums; }
1778
1865
  .gw-stats__label { margin-top: 8px; max-width: 28ch; color: var(--gw-muted); font-size: 14px; }
1779
1866
  .gw-stats__source { margin-top: 8px; color: var(--gw-muted); font-size: 12px; }
@@ -1806,7 +1893,6 @@ html.is-menu-open .gw-header:has(> .gw-mobile-menu.is-drill) { position: sticky;
1806
1893
  display: grid;
1807
1894
  grid-template-columns: minmax(0, 1fr);
1808
1895
  gap: 32px 24px;
1809
- margin: 0;
1810
1896
  padding: 0;
1811
1897
  list-style: none;
1812
1898
  counter-reset: gw-step;
@@ -2238,7 +2324,7 @@ html.is-menu-open .gw-header:has(> .gw-mobile-menu.is-drill) { position: sticky;
2238
2324
  .gw-card__media first, a .gw-label for the category, the title (its link covers the card, so the card is one target
2239
2325
  and the link's name is the title alone), one or two lines of excerpt and a .gw-article-meta row at the foot. One
2240
2326
  column on phones, two from 768px, three from 1080px. --compact: one column of rows, no card and no picture. */
2241
- .gw-post-list { display: grid; grid-template-columns: minmax(0, 1fr); gap: 16px; margin: 0; padding: 0; list-style: none; }
2327
+ .gw-post-list { display: grid; grid-template-columns: minmax(0, 1fr); gap: 16px; padding: 0; list-style: none; }
2242
2328
  .gw-post-list > li { display: flex; min-width: 0; }
2243
2329
  .gw-post { position: relative; display: flex; flex: 1 1 auto; flex-direction: column; min-width: 0; }
2244
2330
  .gw-post:hover { border-color: var(--gw-line-strong); }
@@ -2407,7 +2493,7 @@ html.is-menu-open .gw-header:has(> .gw-mobile-menu.is-drill) { position: sticky;
2407
2493
  room; below 480px, and in a box too narrow for both, the field and the button each take a full line. */
2408
2494
  .gw-form-inline { display: flex; flex-wrap: wrap; gap: 8px; }
2409
2495
  .gw-form-inline > :not(.gw-btn) { flex: 999 1 160px; min-width: 0; }
2410
- .gw-form-inline > .gw-btn { flex: 1 0 auto; }
2496
+ .gw-form-inline > .gw-btn { flex: 1 0 auto; justify-content: center; }
2411
2497
  @media (max-width: 479px) {
2412
2498
  .gw-form-inline > :not(.gw-btn) { flex-basis: 100%; }
2413
2499
  }
@@ -2454,7 +2540,6 @@ html.is-menu-open .gw-header:has(> .gw-mobile-menu.is-drill) { position: sticky;
2454
2540
  display: grid;
2455
2541
  grid-template-columns: minmax(0, 1fr);
2456
2542
  gap: 16px;
2457
- margin: 0;
2458
2543
  padding: 0;
2459
2544
  list-style: none;
2460
2545
  }