@rathnasgala/theme 0.0.19 → 0.0.20

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rathnasgala/theme",
3
- "version": "0.0.19",
3
+ "version": "0.0.20",
4
4
  "description": "Managed Gala static-site theme payload",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -2,7 +2,7 @@
2
2
  "schemaVersion": 1,
3
3
  "themePackage": {
4
4
  "name": "@rathnasgala/theme",
5
- "version": "0.0.19",
5
+ "version": "0.0.20",
6
6
  "availableDesignThemes": [
7
7
  "editorial"
8
8
  ],
@@ -25,7 +25,7 @@
25
25
  "lib/render-markdown.js": "40e6d6743b76de6c16d138475f188a4263967530c370d8b26a363f4df58c2caf",
26
26
  "lib/seo.js": "107de8804931945b8e73894877fc394d6b535a9d0d969a4ba5b68f2e136e0a17",
27
27
  "lib/share-targets.js": "458aff86fab2b62a364442cd8c612565c6e0b53eef2f20cb6237cc562b1e0731",
28
- "lib/site-config.js": "da7d2dffab62c7346c9930494b85fc6ea735d4f50565bbd0454a04393f8cad96",
28
+ "lib/site-config.js": "3ed45daef0b7f79d94bf0c648c4fe7d8bf517534e4645a4b43d952dfc434ddc4",
29
29
  "package-lock.json": "c97a6a2f794aef083a39a8d2628eccc4a3c484e1c6225899b77ec1fb7c466d9e",
30
30
  "package.json": "4c60bea06f39aec755ac68caf8d8841c1d59d0f6121fad7f4396231ce14712dc",
31
31
  "src/404.njk": "be0d44370ac5402156aaf3d32ea581057bc61ec94c1a5f92bb809733af7a8a20",
@@ -33,9 +33,9 @@
33
33
  "src/_data/engagementSnapshot.js": "9217dacebfaf008f7a0ad67ff4e8d1fa8fba609a9dc7e3430c78c5b32024da0e",
34
34
  "src/_data/feedLinks.js": "06c93352ebd888acb431a1c9a8be6ecff757895468e9f2d336761038751c2d5e",
35
35
  "src/_data/languages.js": "1358748f7fa2f74406d3295a030827d6229a53e94da72cf712e719d7a356aeac",
36
- "src/_data/site.js": "d9c001f4cc12a34027dd92303530b11b5402d47613459bb997e22c4bcbea326d",
36
+ "src/_data/site.js": "6f9b754876ab7cfa93f02a38be2962edce8245423c354426a1465513caec7911",
37
37
  "src/_includes/components/ui.njk": "23eb647d8658868449ec6bb809e965a85302124a97639f94d5d28af72df56e4c",
38
- "src/_includes/layouts/base.njk": "e73be30738535902599e1c060c11afbd128c86332913114f643dc56dea99fcba",
38
+ "src/_includes/layouts/base.njk": "638457f6c10f3ba866e8c70715678298096a668568e99456bef4167ebf1111e7",
39
39
  "src/_includes/layouts/post.njk": "1accd2832064ad19ee7bf18daf5fa1e60569f32c9b7a547934a6361f747d7eb7",
40
40
  "src/assets/embed-codepen.svg": "e9def697f38c466fb2b6652535c4c814e8cbbbefc6e052a69f335aeb27e8356b",
41
41
  "src/assets/embed-gist.svg": "fcd9bc2bf29a5c118492b853c0a01390b7539c38ddb985da3c2a6e2f246a39f7",
@@ -44,11 +44,11 @@
44
44
  "src/assets/engagement-comments.js": "b20d9268c9d908b4453a42188eaca25349f25534fb04a9293c9e688a982cd8f8",
45
45
  "src/assets/engagement-transport.js": "4f9ca0cd669bf8abc25f2909104e3e4b231657ef97d36a17d06e53454d711786",
46
46
  "src/assets/favicon.svg": "8615e3d96fe37ae9ed14afb1886e7c0e690eef5b10be66ca91cccfd085a74bb6",
47
- "src/assets/interactions.js": "dd4e343505e528d89596ca67db679b52c989e022f93399193e4377db01fc8a08",
47
+ "src/assets/interactions.js": "4b65dcfcc23682616b15071d746da053bcc3a6bc5df36e11dc5698dd3348f314",
48
48
  "src/assets/preferences.js": "789127bee013ed6a1bbf8cefd7b9109291c16220e7a6e09314e3c93c54731d1d",
49
49
  "src/assets/search.js": "df425f0239277792ad39f2138bc89cb66cc4ecda5ed59042d46abc2f05372088",
50
50
  "src/assets/theme-mode.js": "944b29db11a577961a60ddcfa52f07ef2411f3f3631bea85bd79be16428c08be",
51
- "src/assets/theme.css": "cdd41ddb670fb8c823b3490efa2a887d11dd6a1931afa0264deee53283b684d3",
51
+ "src/assets/theme.css": "300f6c2ffd7e63a948cfdb46b2d0f4abdbce5f5c4da7ee2cca5633d9795277c4",
52
52
  "src/assets/vendor/hooks.js": "ae6ec58592683ca64fa4d65b20d40b103df62a673bcc4712515cf165950b07f3",
53
53
  "src/assets/vendor/htm.js": "e4dac9bc40a6f2ec590413d787ae30bbcfdfcde4f28971ee65d9578271b7aad4",
54
54
  "src/assets/vendor/preact.js": "712517dd2a42c3c22b5ab0264ad7e9a2b1e8be6cf97fa00dbedd98203617e616",
@@ -13,13 +13,9 @@ const BUDGET_KEYS = Object.freeze([
13
13
  */
14
14
  const DESIGN_VALUES = Object.freeze({
15
15
  layout: Object.freeze(['article-first', 'portfolio']),
16
- palette: Object.freeze(['default', 'ocean']),
17
- typography: Object.freeze(['system', 'editorial', 'humanist', 'mono']),
18
- density: Object.freeze(['compact', 'comfortable', 'spacious']),
19
- spacing: Object.freeze(['compact', 'comfortable', 'spacious']),
20
- radius: Object.freeze(['sharp', 'soft', 'round']),
21
- motion: Object.freeze(['none', 'subtle', 'expressive']),
22
- componentStyle: Object.freeze(['quiet', 'outlined', 'raised'])
16
+ palette: Object.freeze(['default', 'ocean', 'forest', 'plum']),
17
+ theme: Object.freeze(['editorial', 'modern', 'technical']),
18
+ colorMode: Object.freeze(['system', 'light', 'dark'])
23
19
  });
24
20
  const CONTACT_KEYS = Object.freeze([
25
21
  'enabled', 'websiteEnabled', 'phoneEnabled'
@@ -33,7 +29,14 @@ const CONTACT_KEYS = Object.freeze([
33
29
  */
34
30
  const REQUIRED_DESIGN = Object.freeze(['layout', 'palette']);
35
31
 
32
+ /** A free colour, not a menu — but still a colour. */
33
+ const ACCENT = /^#(?:[0-9a-f]{3}|[0-9a-f]{6})$/i;
34
+
36
35
  function validateImplementedDesign(config) {
36
+ const accent = config?.design?.accent;
37
+ if (accent !== undefined && !(typeof accent === 'string' && ACCENT.test(accent.trim()))) {
38
+ throw new TypeError(`Unsupported design.accent: ${accent}`);
39
+ }
37
40
  if (config?.design == null) return;
38
41
  for (const [field, allowed] of Object.entries(DESIGN_VALUES)) {
39
42
  const value = config.design[field];
@@ -1,5 +1,16 @@
1
+ import { accentPair } from '../../lib/accent.js';
1
2
  import { loadSiteConfiguration } from '../../lib/site-config.js';
2
3
 
3
4
  export default async function siteConfiguration() {
4
- return loadSiteConfiguration();
5
+ const configuration = await loadSiteConfiguration();
6
+ /*
7
+ * The writer picks one colour; the page needs two, because the same colour cannot be readable on
8
+ * both a light and a dark ground. Derived here rather than in CSS so the contrast is exact — a
9
+ * `color-mix()` approximation can land under 4.5:1 and nobody would know until a reader could
10
+ * not read a link.
11
+ *
12
+ * An absent or unparseable value leaves this undefined, and the look's own accent stands.
13
+ */
14
+ const accent = accentPair(configuration?.design?.accent);
15
+ return accent ? { ...configuration, accent } : configuration;
5
16
  }
@@ -1,5 +1,5 @@
1
1
  <!doctype html>
2
- <html lang="{{ post.language or site.site.defaultLanguage }}" data-theme="{{ site.design.theme }}" data-layout="{{ site.design.layout }}" data-palette="{{ site.design.palette }}" data-typography="{{ site.design.typography }}" data-density="{{ site.design.density }}" data-spacing="{{ site.design.spacing }}" data-radius="{{ site.design.radius }}" data-motion="{{ site.design.motion }}" data-component-style="{{ site.design.componentStyle }}" data-mode="{{ site.design.colorMode | default('system') }}">
2
+ <html lang="{{ post.language or site.site.defaultLanguage }}" data-theme="{{ site.design.theme | default('modern') }}" data-layout="{{ site.design.layout }}" data-palette="{{ site.design.palette | default('default') }}" data-mode="{{ site.design.colorMode | default('system') }}"{% if site.accent %} style="--gala-accent-light: {{ site.accent.light }}; --gala-accent-dark: {{ site.accent.dark }}"{% endif %}>
3
3
  <head>
4
4
  <meta charset="utf-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1">
@@ -392,6 +392,16 @@ if (sessionFrame) {
392
392
  else pending.reject(new Error(event.data.error?.code || 'ENGAGEMENT_WRITE_FAILED'));
393
393
  return;
394
394
  }
395
+ /* The frame is cross-origin, so its content height is not readable from here — it reports
396
+ its own, and the box is sized to it. Without this the account panel scrolled inside a fixed
397
+ box, clipping the first line of its own text. */
398
+ if (event.data?.type === 'gala-session-height') {
399
+ const height = Number(event.data.height);
400
+ if (Number.isFinite(height) && height > 0 && height < 2000) {
401
+ sessionFrame.style.height = `${Math.ceil(height)}px`;
402
+ }
403
+ return;
404
+ }
395
405
  if (event.data?.type !== 'gala-session') return;
396
406
  sessionUser = event.data.user && typeof event.data.user.id === 'string' ? event.data.user : null;
397
407
  const control = document.querySelector('[data-user-control]');
@@ -18,7 +18,9 @@
18
18
  --gala-color-border: light-dark(#968e86, #6b645e);
19
19
  --gala-color-hairline: light-dark(#e8e3dd, #2a2724);
20
20
  --gala-color-border-strong: light-dark(#c9c2ba, #46413d);
21
- --gala-color-accent: light-dark(#8a4b2a, #e8a87c);
21
+ --gala-color-accent: light-dark(
22
+ var(--gala-accent-light, #8a4b2a),
23
+ var(--gala-accent-dark, #e8a87c));
22
24
 
23
25
  /* Type. One scale, used everywhere, fluid between a phone and a desk. */
24
26
  --gala-font-body: ui-sans-serif, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", sans-serif;
@@ -48,7 +50,6 @@
48
50
  --gala-space-page: clamp(1.25rem, 5vw, 4.5rem);
49
51
  --gala-radius-control: 0.625rem;
50
52
  --gala-radius-surface: 1rem;
51
- --gala-shadow-low: 0 1px 2px light-dark(rgb(26 24 23 / 6%), rgb(0 0 0 / 40%));
52
53
  --gala-shadow-high:
53
54
  0 1px 2px light-dark(rgb(26 24 23 / 5%), rgb(0 0 0 / 35%)),
54
55
  0 12px 28px -12px light-dark(rgb(26 24 23 / 18%), rgb(0 0 0 / 60%));
@@ -73,7 +74,7 @@
73
74
  --gala-color-border: #968e86;
74
75
  --gala-color-hairline: #e8e3dd;
75
76
  --gala-color-border-strong: #c9c2ba;
76
- --gala-color-accent: #8a4b2a;
77
+ --gala-color-accent: var(--gala-accent-light, #8a4b2a);
77
78
  }
78
79
  :root[data-mode='dark'] {
79
80
  color-scheme: dark;
@@ -85,7 +86,7 @@
85
86
  --gala-color-border: #6b645e;
86
87
  --gala-color-hairline: #2a2724;
87
88
  --gala-color-border-strong: #46413d;
88
- --gala-color-accent: #e8a87c;
89
+ --gala-color-accent: var(--gala-accent-dark, #e8a87c);
89
90
  }
90
91
 
91
92
  /* ---------------------------------------------------------------- palettes */
@@ -110,7 +111,7 @@
110
111
  --gala-color-border: #7d8d99;
111
112
  --gala-color-hairline: #dde7ee;
112
113
  --gala-color-border-strong: #bdccd7;
113
- --gala-color-accent: #0f5f7a;
114
+ --gala-color-accent: var(--gala-accent-light, #0f5f7a);
114
115
  }
115
116
  :root[data-palette='ocean'][data-mode='dark'] {
116
117
  color-scheme: dark;
@@ -122,62 +123,150 @@
122
123
  --gala-color-border: #5f7d8c;
123
124
  --gala-color-hairline: #1d3644;
124
125
  --gala-color-border-strong: #33505f;
125
- --gala-color-accent: #7fd0e8;
126
+ --gala-color-accent: var(--gala-accent-dark, #7fd0e8);
126
127
  }
127
128
 
128
- /* ---------------------------------------------------------------- typography
129
- System stacks rather than a downloaded face: a publication must build and render with no call
130
- to anyone, and a webfont is bytes on every reader's first paint. These are the good faces the
131
- reader's machine already has. */
132
- :root[data-typography='editorial'] {
129
+
130
+ /* Two more, because colour is the choice a writer actually wants to make — and the one that is
131
+ safe to offer, since a palette only swaps values every rule already reads and each is checked
132
+ for contrast in both modes. */
133
+ :root[data-palette='forest'] {
134
+ --gala-color-background: light-dark(#fbfcfa, #101410);
135
+ --gala-color-surface: light-dark(#f0f4ee, #182018);
136
+ --gala-color-raised: light-dark(#ffffff, #1f271f);
137
+ --gala-color-text: light-dark(#18201a, #eef3ec);
138
+ --gala-color-muted: light-dark(#5b665d, #9aa89b);
139
+ --gala-color-border: light-dark(#849084, #5e685f);
140
+ --gala-color-hairline: light-dark(#e2e9df, #232b23);
141
+ --gala-color-border-strong: light-dark(#5b665d, #7d897e);
142
+ --gala-color-accent: light-dark(#2f6b3f, #8fd3a1);
143
+ }
144
+ :root[data-palette='forest'][data-mode='light'] {
145
+ color-scheme: light;
146
+ --gala-color-background: #fbfcfa;
147
+ --gala-color-surface: #f0f4ee;
148
+ --gala-color-raised: #ffffff;
149
+ --gala-color-text: #18201a;
150
+ --gala-color-muted: #5b665d;
151
+ --gala-color-border: #849084;
152
+ --gala-color-hairline: #e2e9df;
153
+ --gala-color-border-strong: #5b665d;
154
+ --gala-color-accent: var(--gala-accent-light, #2f6b3f);
155
+ }
156
+ :root[data-palette='forest'][data-mode='dark'] {
157
+ color-scheme: dark;
158
+ --gala-color-background: #101410;
159
+ --gala-color-surface: #182018;
160
+ --gala-color-raised: #1f271f;
161
+ --gala-color-text: #eef3ec;
162
+ --gala-color-muted: #9aa89b;
163
+ --gala-color-border: #5e685f;
164
+ --gala-color-hairline: #232b23;
165
+ --gala-color-border-strong: #7d897e;
166
+ --gala-color-accent: var(--gala-accent-dark, #8fd3a1);
167
+ }
168
+ :root[data-palette='plum'] {
169
+ --gala-color-background: light-dark(#fdfbfd, #141016);
170
+ --gala-color-surface: light-dark(#f5eff5, #1d1720);
171
+ --gala-color-raised: light-dark(#ffffff, #241d28);
172
+ --gala-color-text: light-dark(#1f1820, #f2ecf3);
173
+ --gala-color-muted: light-dark(#665c69, #a99dac);
174
+ --gala-color-border: light-dark(#948a95, #6b606d);
175
+ --gala-color-hairline: light-dark(#ebe2ec, #281f2b);
176
+ --gala-color-border-strong: light-dark(#665c69, #8b7f8d);
177
+ --gala-color-accent: light-dark(#7a3d76, #dda6d8);
178
+ }
179
+ :root[data-palette='plum'][data-mode='light'] {
180
+ color-scheme: light;
181
+ --gala-color-background: #fdfbfd;
182
+ --gala-color-surface: #f5eff5;
183
+ --gala-color-raised: #ffffff;
184
+ --gala-color-text: #1f1820;
185
+ --gala-color-muted: #665c69;
186
+ --gala-color-border: #948a95;
187
+ --gala-color-hairline: #ebe2ec;
188
+ --gala-color-border-strong: #665c69;
189
+ --gala-color-accent: var(--gala-accent-light, #7a3d76);
190
+ }
191
+ :root[data-palette='plum'][data-mode='dark'] {
192
+ color-scheme: dark;
193
+ --gala-color-background: #141016;
194
+ --gala-color-surface: #1d1720;
195
+ --gala-color-raised: #241d28;
196
+ --gala-color-text: #f2ecf3;
197
+ --gala-color-muted: #a99dac;
198
+ --gala-color-border: #6b606d;
199
+ --gala-color-hairline: #281f2b;
200
+ --gala-color-border-strong: #8b7f8d;
201
+ --gala-color-accent: var(--gala-accent-dark, #dda6d8);
202
+ }
203
+
204
+ /* ---------------------------------------------------------------- the looks
205
+ *
206
+ * Three, each designed whole.
207
+ *
208
+ * This replaced nine independent knobs — typeface, spacing, density, radius, motion, surfaces,
209
+ * palette — which a writer set one at a time, blind, and only saw combined after a deploy. Nine
210
+ * knobs is several hundred looks, and nobody had seen most of them: `mono` + `round` + `spacious`
211
+ * + `raised` produced monospace headings inside page-wide pills, and it was reachable in four
212
+ * clicks. A look is a set of decisions that agree with each other, so it is chosen as a set.
213
+ */
214
+
215
+ /* Calm, serif, generous. For essays and long reading. */
216
+ :root[data-theme='editorial'] {
133
217
  --gala-font-body: ui-serif, "Iowan Old Style", Charter, "Source Serif 4", Georgia, serif;
134
218
  --gala-font-display: var(--gala-font-body);
135
219
  --gala-weight-display: 600;
136
- }
137
- :root[data-typography='humanist'] {
138
- --gala-font-body: Optima, Candara, "Gill Sans", "Trebuchet MS", sans-serif;
139
- --gala-font-display: var(--gala-font-body);
140
- }
141
- :root[data-typography='mono'] {
142
- --gala-font-display: var(--gala-font-mono);
143
- --gala-weight-display: 560;
144
- --gala-tracking-tight: -0.005em;
220
+ --gala-step: 1.1rem;
221
+ --gala-leading-body: 1.7;
222
+ --gala-radius-control: 0.5rem;
223
+ --gala-radius-surface: 0.75rem;
224
+ --gala-measure: 66ch;
225
+ --gala-surface-border: var(--gala-color-hairline);
226
+ --gala-surface-shadow: none;
145
227
  }
146
228
 
147
- /* ---------------------------------------------------------------- density */
148
- :root[data-density='compact'], :root[data-spacing='compact'] {
149
- --gala-step: 0.8rem;
150
- --gala-leading-body: 1.5;
151
- }
152
- :root[data-density='spacious'], :root[data-spacing='spacious'] {
153
- --gala-step: 1.25rem;
154
- --gala-leading-body: 1.75;
229
+ /* Crisp, sans, a little tighter. The default, and the safe one. */
230
+ :root[data-theme='modern'] {
231
+ --gala-font-body: ui-sans-serif, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", sans-serif;
232
+ --gala-font-display: var(--gala-font-body);
233
+ --gala-weight-display: 640;
234
+ --gala-step: 1rem;
235
+ --gala-leading-body: 1.65;
236
+ --gala-radius-control: 0.625rem;
237
+ --gala-radius-surface: 1rem;
238
+ --gala-measure: 70ch;
239
+ --gala-surface-border: transparent;
240
+ --gala-surface-shadow: var(--gala-shadow-high);
155
241
  }
156
242
 
157
- /* ---------------------------------------------------------------- radius */
158
- :root[data-radius='sharp'] { --gala-radius-control: 0; --gala-radius-surface: 0; }
159
- :root[data-radius='round'] { --gala-radius-control: 999px; --gala-radius-surface: 1.5rem; }
160
-
161
- /* ---------------------------------------------------------------- motion
162
- `none` is honoured for everyone; a reader who asks the operating system for less motion is
163
- honoured regardless of what the publication chose. */
164
- :root[data-motion='none'] { --gala-motion-fast: 0ms; --gala-motion-base: 0ms; }
165
- :root[data-motion='expressive'] { --gala-motion-base: 340ms; }
243
+ /* For writing about code: mono for the furniture, never for the prose or the headings. */
244
+ :root[data-theme='technical'] {
245
+ --gala-font-body: ui-sans-serif, -apple-system, "Segoe UI", Roboto, sans-serif;
246
+ --gala-font-display: var(--gala-font-body);
247
+ --gala-weight-display: 660;
248
+ --gala-tracking-tight: -0.022em;
249
+ --gala-step: 0.9rem;
250
+ --gala-leading-body: 1.6;
251
+ --gala-radius-control: 0.375rem;
252
+ --gala-radius-surface: 0.5rem;
253
+ --gala-measure: 74ch;
254
+ --gala-surface-border: var(--gala-color-border-strong);
255
+ --gala-surface-shadow: none;
256
+ }
257
+ /* Mono is an accent here — labels, counts, metadata — not a face to set a page in. */
258
+ :root[data-theme='technical'] .gala-eyebrow,
259
+ :root[data-theme='technical'] .gala-engagement dt,
260
+ :root[data-theme='technical'] .gala-comment__meta time {
261
+ font-family: var(--gala-font-mono);
262
+ }
263
+
264
+ /* Motion is not a choice a writer has to make; it is a property of a considered page. */
166
265
  @media (prefers-reduced-motion: reduce) {
167
266
  :root { --gala-motion-fast: 0ms; --gala-motion-base: 0ms; }
168
267
  *, *::before, *::after { animation-duration: 1ms !important; transition-duration: 1ms !important; }
169
268
  }
170
269
 
171
- /* ---------------------------------------------------------------- surfaces
172
- `quiet` sits on the page, `outlined` draws its edge, `raised` lifts. One variable decides,
173
- so every card, dialog and chip agrees. */
174
- :root { --gala-surface-border: var(--gala-color-hairline); --gala-surface-shadow: var(--gala-shadow-low); }
175
- :root[data-component-style='outlined'] { --gala-surface-border: var(--gala-color-border-strong); }
176
- :root[data-component-style='raised'] {
177
- --gala-surface-border: transparent;
178
- --gala-surface-shadow: var(--gala-shadow-high);
179
- }
180
-
181
270
  :root[data-layout='portfolio'] { --gala-content-width: 82rem; }
182
271
 
183
272
  body {
@@ -300,11 +389,16 @@ blockquote {
300
389
  .gala-account-dialog iframe {
301
390
  display: block;
302
391
  inline-size: 100%;
303
- min-block-size: 7rem;
392
+ /* Height is set from the frame's own report; this is only what it shows before that arrives. */
393
+ block-size: 7rem;
304
394
  border: 0;
395
+ /* The frame owns its layout and reports its size, so it never needs to scroll inside the box. */
396
+ overflow: hidden;
305
397
  }
306
398
  /* The close control belongs on the same line as the title, not floated above it. */
307
- .gala-dialog__close { float: inline-end; margin-inline-start: var(--gala-space-md); }
399
+ .gala-dialog { display: grid; gap: var(--gala-space-sm); }
400
+ .gala-dialog__close { justify-self: end; margin: 0; }
401
+ .gala-dialog > h2 { margin-block: 0; }
308
402
 
309
403
  main,
310
404
  .gala-page-footer {
@@ -374,14 +468,11 @@ button:focus-visible {
374
468
  border-radius: var(--gala-radius-surface);
375
469
  box-shadow: var(--gala-surface-shadow);
376
470
  }
377
- [data-component-style='raised'] .gala-card { background: var(--gala-color-raised); }
378
471
  /* The one place the page moves of its own accord, and so the one place `motion` is legible:
379
472
  `subtle` is a short settle, `expressive` a longer one, `none` no movement at all. */
380
473
  .gala-card { transition: transform var(--gala-motion-base) var(--gala-ease),
381
474
  box-shadow var(--gala-motion-base) var(--gala-ease); }
382
475
  .gala-card-index li:hover .gala-card { transform: translateY(-2px); box-shadow: var(--gala-shadow-high); }
383
- [data-motion='none'] .gala-card { transition: none; }
384
- [data-motion='none'] .gala-card-index li:hover .gala-card { transform: none; }
385
476
  .gala-stats-graph { min-block-size: var(--gala-widget-min-block-size); margin-inline: 0; }
386
477
  .gala-stats-graph svg { inline-size: 100%; block-size: 8rem; }
387
478
  .gala-stats-graph polyline { fill: none; stroke: var(--gala-color-accent); stroke-width: 2; }
@@ -398,8 +489,6 @@ button:focus-visible {
398
489
  .gala-share__fallback { inline-size: min(100%, 36rem); }
399
490
  .gala-engagement__placeholder { display: grid; min-block-size: var(--gala-widget-min-block-size); align-content: center; margin: 0; }
400
491
  .gala-engagement-profile > * { margin-block: 0 0.5rem; }
401
- .gala-comments { display: grid; gap: 1rem; padding-inline-start: 1.5rem; }
402
- .gala-comments li { padding: 1rem; background: var(--gala-color-surface); border-radius: var(--gala-radius-control); }
403
492
  .gala-engagement-actions { display: grid; gap: 1rem; margin-block-start: 1.5rem; }
404
493
  .gala-engagement-actions[hidden] { display: none; }
405
494
  /* Shown only when signing in interrupted something the reader had already decided to do, so it
@@ -582,7 +671,6 @@ button:focus-visible {
582
671
  }
583
672
 
584
673
  .gala-reaction-actions { display: flex; flex-wrap: wrap; gap: var(--gala-space-2xs); }
585
- .gala-comment-actions { display: flex; flex-wrap: wrap; gap: var(--gala-space-2xs); }
586
674
  .gala-engagement-actions { display: grid; gap: var(--gala-space-sm); justify-items: start; }
587
675
  .gala-engagement-actions > [data-follow-article] { inline-size: auto; }
588
676
  .gala-share { margin-block-start: var(--gala-space-lg); }