@refrakt-md/lumina 0.16.1 → 0.18.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/index.css CHANGED
@@ -44,6 +44,7 @@
44
44
  @import './styles/runes/api.css';
45
45
  @import './styles/runes/card.css';
46
46
  @import './styles/runes/badge.css';
47
+ @import './styles/runes/bar.css';
47
48
  @import './styles/runes/bento.css';
48
49
  @import './styles/runes/blog.css';
49
50
  @import './styles/runes/bond.css';
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@refrakt-md/lumina",
3
3
  "description": "Lumina theme for refrakt.md — design tokens, CSS, identity transform, and layout configs",
4
- "version": "0.16.1",
4
+ "version": "0.18.0",
5
5
  "type": "module",
6
6
  "license": "MIT",
7
7
  "repository": {
@@ -83,9 +83,9 @@
83
83
  "build": "tsc"
84
84
  },
85
85
  "dependencies": {
86
- "@refrakt-md/runes": "0.16.1",
87
- "@refrakt-md/transform": "0.16.1",
88
- "@refrakt-md/types": "0.16.1"
86
+ "@refrakt-md/runes": "0.18.0",
87
+ "@refrakt-md/transform": "0.18.0",
88
+ "@refrakt-md/types": "0.18.0"
89
89
  },
90
90
  "devDependencies": {
91
91
  "postcss": "^8.4.0"
@@ -1,19 +1,15 @@
1
1
  /* ─── Metadata Dimensions ──────────────────────────────────────────────
2
- * Generic styling for metadata badges across all runes.
3
- * Works via data-meta-type, data-meta-rank, and data-meta-sentiment
4
- * attributes emitted by the identity transform engine.
5
- *
6
- * Composability: --meta-color cascades from sentiment type rules.
7
- * --meta-font-size cascades from rank type rules.
2
+ * SPEC-080 typography / geometry split:
3
+ * - `[data-meta-type=…]` selectors carry ONLY typography hints
4
+ * (monospace, tabular-nums). No padding, no border, no chip geometry.
5
+ * - Geometry comes from `[data-zone-layout=…]` selectors (`bar`,
6
+ * `definition-list`) and from the universal `.rf-badge` class, which
7
+ * is emitted by chip-type fields AND by the standalone `{% badge %}`
8
+ * rune.
9
+ * - Sentiment rules drive `--meta-color`, which the chip and any
10
+ * sentiment-tinted text inherits.
8
11
  * ────────────────────────────────────────────────────────────────────── */
9
12
 
10
- /* ─── Rank ─────────────────────────────────────────────────────────── */
11
-
12
- [data-meta-rank="primary"],
13
- [data-meta-rank="secondary"] {
14
- --meta-font-size: 0.8125rem;
15
- }
16
-
17
13
  /* ─── Sentiment ────────────────────────────────────────────────────── */
18
14
 
19
15
  [data-meta-sentiment="positive"] { --meta-color: var(--rf-color-success, #10b981); }
@@ -21,105 +17,139 @@
21
17
  [data-meta-sentiment="caution"] { --meta-color: var(--rf-color-warning, #f59e0b); }
22
18
  [data-meta-sentiment="neutral"] { --meta-color: var(--rf-color-muted, #64748b); }
23
19
 
24
- /* Colored dot for any item with a sentiment */
25
- [data-meta-sentiment]::before {
26
- content: '';
27
- width: 0.5rem;
28
- height: 0.5rem;
29
- border-radius: 50%;
30
- background: var(--meta-color, var(--rf-color-muted));
31
- flex-shrink: 0;
32
- }
20
+ /* ─── Meta Types typography only ─────────────────────────────────── */
33
21
 
34
- /* ─── Meta Types ───────────────────────────────────────────────────── */
35
-
36
- /* Status: bordered pill */
37
- [data-meta-type="status"] {
38
- display: inline-flex;
39
- align-items: center;
40
- gap: 0.375rem;
41
- padding: 0.5em 1.0em;
42
- border: 1px solid var(--rf-color-border);
43
- border-radius: 999px;
22
+ [data-meta-type="id"],
23
+ [data-meta-type="code"] {
24
+ font-family: var(--rf-font-mono, monospace);
44
25
  font-size: var(--meta-font-size, 0.8125rem);
45
- font-weight: 500;
46
- color: var(--rf-color-muted);
47
26
  }
48
27
 
49
- /* Category: bordered pill */
50
- [data-meta-type="category"] {
51
- display: inline-flex;
52
- align-items: center;
53
- gap: 0.375rem;
54
- padding: 0.5em 1.0em;
55
- border: 1px solid var(--rf-color-border);
56
- border-radius: 999px;
57
- font-size: var(--meta-font-size, 0.8125rem);
28
+ /* IDs read as primary-coloured references wherever they appear (eyebrow
29
+ * bars, metadata def-lists, etc.) — a semantic treatment of the `id` type,
30
+ * not a per-layout one. `code` (e.g. API paths) stays neutral monospace. */
31
+ [data-meta-type="id"] {
32
+ color: var(--rf-color-primary);
58
33
  font-weight: 500;
59
- color: var(--rf-color-muted);
60
34
  }
61
35
 
62
- /* Quantity: bordered pill with tabular numbers */
63
36
  [data-meta-type="quantity"] {
64
- display: inline-flex;
65
- align-items: center;
66
- padding: 0.5em 1.0em;
67
- border: 1px solid var(--rf-color-border);
68
- border-radius: 999px;
69
37
  font-variant-numeric: tabular-nums;
70
- font-weight: 600;
71
38
  font-size: var(--meta-font-size, 0.8125rem);
72
- color: var(--rf-color-muted);
73
39
  }
74
40
 
75
- /* Temporal: bordered pill with time association */
76
41
  [data-meta-type="temporal"] {
77
- display: inline-flex;
78
- align-items: center;
79
- gap: 0.25rem;
80
- padding: 0.5em 1.0em;
81
- border: 1px solid var(--rf-color-border);
82
- border-radius: 999px;
83
- font-size: var(--meta-font-size, 0.8125rem);
84
42
  font-variant-numeric: tabular-nums;
85
- color: var(--rf-color-muted);
43
+ font-size: var(--meta-font-size, 0.8125rem);
86
44
  }
87
45
 
88
- /* Tag: bordered pill */
89
- [data-meta-type="tag"] {
46
+ /* Rating `value` filled marks out of `total`; each mark carries
47
+ * `data-filled`. Stars via colour (filled = primary, empty = border). */
48
+ [data-meta-type="rating"] {
90
49
  display: inline-flex;
91
- align-items: center;
92
- padding: 0.5em 1.0em;
93
- border: 1px solid var(--rf-color-border);
94
- border-radius: 999px;
95
- font-size: calc(var(--meta-font-size, 0.8125rem) * 0.9);
96
- color: var(--rf-color-muted);
50
+ gap: 0.0625rem;
51
+ line-height: 1;
52
+ }
53
+ [data-meta-type="rating"] span::before {
54
+ content: '★';
55
+ }
56
+ [data-meta-type="rating"] span[data-filled="true"] {
57
+ color: var(--rf-color-primary);
58
+ }
59
+ [data-meta-type="rating"] span[data-filled="false"] {
60
+ color: var(--rf-color-border);
97
61
  }
98
62
 
99
- /* ID: bordered pill, monospace */
100
- [data-meta-type="id"] {
101
- display: inline-flex;
63
+ [data-meta-type="status"],
64
+ [data-meta-type="category"],
65
+ [data-meta-type="tag"] {
66
+ font-size: var(--meta-font-size, 0.8125rem);
67
+ }
68
+
69
+ /* Linked eyebrow content (matches today's hero behaviour). */
70
+ [data-zone="eyebrow"] a {
71
+ color: var(--rf-color-primary);
72
+ text-decoration: underline;
73
+ text-underline-offset: 0.15em;
74
+ }
75
+
76
+ /* ─── Layout: bar (SPEC-080) ───────────────────────────────────────── */
77
+
78
+ /* Horizontal flex row of fields, each in its own intrinsic shape (chip or
79
+ * bare). Wraps by default; `data-wrap="false"` keeps it on one line. A field
80
+ * tagged `data-align="end"` (and everything after it) is pushed to the right
81
+ * edge. */
82
+ [data-zone-layout="bar"] {
83
+ display: flex;
84
+ flex-wrap: wrap;
85
+ gap: 0.5rem;
102
86
  align-items: center;
103
- padding: 0.5em 1.0em;
87
+ }
88
+ [data-zone-layout="bar"][data-wrap="false"] {
89
+ flex-wrap: nowrap;
90
+ }
91
+ [data-zone-layout="bar"] [data-align="end"] {
92
+ margin-left: auto;
93
+ }
94
+
95
+ /* ─── Layout: definition-list ──────────────────────────────────────── */
96
+
97
+ /* Single source of truth for the `definition-list` primitive, shared by
98
+ * both the projected metadata zone (`<dl data-zone="…">`) and the authored
99
+ * `{% deflist %}` rune (`<dl data-rune="deflist">`) — they emit the same
100
+ * `data-zone-layout` so they render identically (geometry, borders, margin).
101
+ *
102
+ * Each row stacks `dt` above `dd`. Rows flow into multiple columns
103
+ * via `auto-fit` — CSS grid naturally collapses to a single column
104
+ * when the container is narrower than the minimum, so the same rule
105
+ * reads fine on mobile and packs dense on wider screens without a
106
+ * media-query step. The 8rem minimum keeps short label / value pairs
107
+ * like "Prep" + "15m" tight while leaving room for the per-item border. */
108
+ [data-zone-layout="definition-list"] {
109
+ display: grid;
110
+ grid-template-columns: repeat(auto-fit, minmax(8rem, 1fr));
111
+ gap: 0.75rem;
112
+ margin: 1.25rem 0;
113
+ }
114
+
115
+ [data-zone-layout="definition-list"] > [data-name="row"] {
116
+ display: flex;
117
+ flex-direction: column;
118
+ gap: 0.125rem;
119
+ min-width: 0;
120
+ padding: 0.625rem 0.75rem;
104
121
  border: 1px solid var(--rf-color-border);
105
- border-radius: 999px;
106
- font-family: var(--rf-font-mono, monospace);
107
- font-size: var(--meta-font-size, 0.8125rem);
122
+ border-radius: var(--rf-radius-sm);
123
+ }
124
+
125
+ [data-zone-layout="definition-list"] dt {
126
+ font-size: 0.75rem;
108
127
  font-weight: 500;
109
128
  color: var(--rf-color-muted);
110
129
  }
111
130
 
131
+ [data-zone-layout="definition-list"] dd {
132
+ margin: 0;
133
+ font-size: 0.875rem;
134
+ }
135
+
136
+ /* Multi-value dd (fields with `splitOn`) renders a row of chips
137
+ * inside the cell, flowing naturally. */
138
+ [data-zone-layout="definition-list"] dd[data-multi-value] {
139
+ display: flex;
140
+ flex-wrap: wrap;
141
+ gap: 0.25rem;
142
+ }
143
+
112
144
  /* ─── Labels ──────────────────────────────────────────────────────── */
113
145
 
114
- /* Label element within metadata items — thin, muted style.
115
- * Themes can override or hide entirely: [data-meta-label] { display: none } */
146
+ /* Label element within a chip — thin, muted; pairs visually with the value */
116
147
  [data-meta-label] {
117
148
  font-weight: 400;
118
149
  opacity: 0.65;
119
150
  }
120
151
 
121
- /* Visually hidden labels — accessible to screen readers but not visible.
122
- * Themes can restore with: [data-meta-label-hidden] { position: static; ... } */
152
+ /* Visually hidden labels — accessible to screen readers only */
123
153
  [data-meta-label-hidden] {
124
154
  position: absolute;
125
155
  width: 1px;
@@ -132,22 +162,29 @@
132
162
  border: 0;
133
163
  }
134
164
 
135
- /* ─── Mobile: compact badges ─────────────────────────────────────────── */
165
+ /* ─── Mobile: compact ──────────────────────────────────────────────── */
136
166
 
137
167
  @media (max-width: 48rem) {
138
- [data-meta-type="status"],
139
- [data-meta-type="category"],
140
- [data-meta-type="quantity"],
141
- [data-meta-type="temporal"],
142
- [data-meta-type="tag"],
143
- [data-meta-type="id"] {
144
- padding: 0.25em 0.625em;
145
- font-size: calc(var(--meta-font-size, 0.8125rem) * 0.9);
168
+ [data-zone-layout="bar"] {
169
+ gap: 0.375rem;
170
+ }
171
+
172
+ /* On narrow screens, fall back to the original label-left / value-right
173
+ * list: each row's dt/dd flow directly into a two-column grid via
174
+ * `display: contents`, which drops the per-item border (no box to paint).
175
+ * The border + padding move to the list itself so the whole group reads
176
+ * as one bordered card. */
177
+ [data-zone-layout="definition-list"] {
178
+ grid-template-columns: max-content 1fr;
179
+ gap: 0.25rem 1rem;
180
+ align-items: baseline;
181
+ padding: 0.75rem 1rem;
182
+ border: 1px solid var(--rf-color-border);
183
+ border-radius: var(--rf-radius-sm);
146
184
  }
147
185
 
148
- [data-meta-sentiment]::before {
149
- width: 0.375rem;
150
- height: 0.375rem;
186
+ [data-zone-layout="definition-list"] > [data-name="row"] {
187
+ display: contents;
151
188
  }
152
189
 
153
190
  [data-section="header"] {
@@ -1,16 +1,12 @@
1
1
  /* Api */
2
- .rf-api__header {
2
+
3
+ /* SPEC-080: the endpoint header is a projected `eyebrow` bar (method + path
4
+ * + auth). Geometry + the auth right-push come from `[data-zone-layout="bar"]`
5
+ * in dimensions/metadata.css; field shape (method/auth chips, path mono code)
6
+ * is intrinsic to metaType. */
7
+ .rf-api__eyebrow {
3
8
  padding: 0.5rem 0;
4
9
  }
5
- .rf-api__method {
6
- font-family: var(--rf-font-mono);
7
- }
8
- .rf-api__path {
9
- background: none;
10
- }
11
- .rf-api__auth {
12
- margin-left: auto;
13
- }
14
10
  .rf-api__body {
15
11
  padding: 0;
16
12
  }
@@ -1,16 +1,13 @@
1
1
  /* Badge rune — standalone inline chip.
2
2
  *
3
- * Built atop the metadata pill base (`data-meta-type`), but reshaped to the
4
- * compact chip look used by plan-progress status counts: **no border**,
5
- * solid-ish sentiment-tinted background, smaller font + tighter padding, and
6
- * a small corner radius. Tints come from the universal `--meta-color` set by
7
- * `dimensions/metadata.css`'s sentiment rules (positive / caution / negative /
8
- * neutral → success / warning / danger / muted). Background is a `color-mix`
9
- * of that color, so the chip stays sentiment-flexible — any value the theme
3
+ * The universal chip primitive emitted by `{% badge %}` AND by every
4
+ * chip-type field a block renders (`bar` chips, `definition-list` `<dd>`
5
+ * for chip-type fields). Tints come from the
6
+ * universal `--meta-color` set by `dimensions/metadata.css`'s
7
+ * sentiment rules (positive / caution / negative / neutral → success
8
+ * / warning / danger / muted). Background is a `color-mix` of that
9
+ * color, so the chip stays sentiment-flexible — any value the theme
10
10
  * gives `--meta-color` works without per-status selectors.
11
- *
12
- * `rank="primary"` boosts emphasis with a heavier tint and bolder weight,
13
- * useful for labels that should dominate over neighbours.
14
11
  */
15
12
 
16
13
  .rf-badge {
@@ -24,14 +21,3 @@
24
21
  border-radius: var(--rf-radius-sm);
25
22
  white-space: nowrap;
26
23
  }
27
-
28
- .rf-badge[data-meta-rank="primary"] {
29
- background: color-mix(in srgb, var(--meta-color, var(--rf-color-muted)) 28%, transparent);
30
- font-weight: 600;
31
- }
32
-
33
- /* Drop the sentiment dot — the background tint carries the cue for
34
- * standalone chips, and the dot competes visually with adjacent prose. */
35
- .rf-badge::before {
36
- display: none;
37
- }
@@ -0,0 +1,10 @@
1
+ /* Bar rune — composable handle for the SPEC-080 `bar` layout.
2
+ *
3
+ * Geometry comes from `[data-zone-layout="bar"]` in
4
+ * `dimensions/metadata.css` (flex row, wrap, `[data-align="end"]`
5
+ * right-push). This file only carries the minimum class hook so the rune
6
+ * participates in CSS tree-shaking. */
7
+
8
+ .rf-bar {
9
+ margin: 0.5rem 0;
10
+ }
@@ -1,9 +1,9 @@
1
1
  /* Budget */
2
+
3
+ /* Duration + currency meta row — flex/gap from the shared
4
+ * `[data-zone-layout=bar]` primitive; this block owns only its spacing. */
2
5
  .rf-budget__meta {
3
- display: flex;
4
- flex-wrap: wrap;
5
- align-items: center;
6
- gap: 0.5rem;
6
+ margin-bottom: 0.75rem;
7
7
  }
8
8
  .rf-budget__preamble {
9
9
  margin-bottom: 1.5rem;
@@ -1,13 +1,10 @@
1
1
  /* Bug */
2
2
 
3
- /* Primary badges: ID left, status right */
4
- .rf-bug__header-primary {
5
- justify-content: space-between;
6
- margin-bottom: 0.75rem;
7
- }
3
+ /* SPEC-079: eyebrow + metadata zone names replace header-primary /
4
+ * header-secondary. Layout-level geometry lives on [data-zone-layout]
5
+ * selectors; this file carries bug-specific spacing + assignee prefix. */
8
6
 
9
- /* Preamble: title + optional description between badge groups */
10
- .rf-bug__preamble {
7
+ .rf-bug__eyebrow {
11
8
  margin-bottom: 0.75rem;
12
9
  }
13
10
  .rf-bug__title h1,
@@ -16,15 +13,12 @@
16
13
  margin-top: 0;
17
14
  }
18
15
 
19
- /* Secondary badges: pill row below preamble */
20
- .rf-bug__header-secondary {
16
+ .rf-bug__metadata {
21
17
  margin-bottom: 1.5rem;
22
18
  }
23
19
 
24
- .rf-bug__assignee-badge {
25
- margin-left: auto;
26
- }
27
- .rf-bug__assignee-badge::before { content: '@'; }
20
+ .rf-bug__metadata [data-field="assignee"] dd .rf-badge::before { content: '@'; }
21
+
28
22
  .rf-bug__body {
29
23
  font-size: 0.925rem;
30
24
  line-height: 1.65;
@@ -1,6 +1,14 @@
1
- /* Character */
1
+ /* Character — the title and the role/status def-list come from the shared
2
+ * dimensions (sections + metadata); only the floated portrait avatar is
3
+ * character-specific chrome. Unlike faction/realm, character is not a split
4
+ * rune: the portrait floats and the content column wraps around it. */
2
5
 
3
- /* Portrait */
6
+ /* Contain the floated portrait within the article */
7
+ .rf-character {
8
+ display: flow-root;
9
+ }
10
+
11
+ /* Portrait — floated circular avatar */
4
12
  .rf-character__portrait {
5
13
  float: right;
6
14
  margin-left: 1.5rem;
@@ -22,20 +30,10 @@
22
30
  flex-direction: column;
23
31
  gap: 1rem;
24
32
  }
25
- .rf-character__content {
26
- clear: both;
27
- }
28
33
  .rf-character__content ul,
29
34
  .rf-character__content ol {
30
35
  padding-left: 1.5rem;
31
36
  }
32
- .rf-character > span[property="name"] {
33
- display: block;
34
- font-size: 1.5rem;
35
- font-weight: 700;
36
- margin-bottom: 0.5rem;
37
- color: var(--rf-color-heading);
38
- }
39
37
 
40
38
  /* Character Section */
41
39
  .rf-character-section {
@@ -1,9 +1,40 @@
1
1
  /* Chart */
2
2
  .rf-chart {
3
+ display: block;
3
4
  border-radius: var(--rf-radius-lg);
4
5
  padding: 1.5rem;
5
6
  margin: 0;
6
7
  }
8
+
9
+ /* Data table — the no-JS / screen-reader source of truth. Visible as the
10
+ * fallback; visually-hidden (but kept for assistive tech) once rf-chart has
11
+ * rendered the svg. */
12
+ .rf-chart__data {
13
+ width: 100%;
14
+ border-collapse: collapse;
15
+ font-size: 0.875rem;
16
+ }
17
+ .rf-chart__data caption {
18
+ font-weight: 600;
19
+ margin-bottom: 0.75rem;
20
+ }
21
+ .rf-chart__data th,
22
+ .rf-chart__data td {
23
+ border: 1px solid var(--rf-color-border);
24
+ padding: 0.375rem 0.625rem;
25
+ text-align: left;
26
+ }
27
+ .rf-chart[data-rendered] .rf-chart__data {
28
+ position: absolute;
29
+ width: 1px;
30
+ height: 1px;
31
+ padding: 0;
32
+ margin: -1px;
33
+ overflow: hidden;
34
+ clip: rect(0, 0, 0, 0);
35
+ white-space: nowrap;
36
+ border: 0;
37
+ }
7
38
  .rf-chart__title {
8
39
  font-weight: 600;
9
40
  font-size: 1rem;
@@ -22,18 +22,26 @@
22
22
  border-bottom: 1px solid var(--rf-color-border);
23
23
  margin-bottom: 0;
24
24
  }
25
- .rf-codegroup__dot {
26
- width: 10px;
25
+ /* Window chrome — three traffic-light dots painted as gradients on one
26
+ * pseudo-element. The element reserves real width (three 10px dots, 1rem
27
+ * apart) so the flex row spaces the title clear of the dots — box-shadow
28
+ * dots take no layout space and overlapped the title. Pure decoration, so
29
+ * it lives entirely in CSS (no markup). */
30
+ .rf-codegroup__topbar::before {
31
+ content: '';
32
+ flex: 0 0 auto;
33
+ width: 2.625rem;
27
34
  height: 10px;
28
- border-radius: var(--rf-radius-full);
29
35
  opacity: 0.8;
30
- }
31
- .rf-codegroup__dot:nth-child(1) { background: #ef4444; }
32
- .rf-codegroup__dot:nth-child(2) { background: #f59e0b; }
33
- .rf-codegroup__dot:nth-child(3) { background: #22c55e; }
34
- .rf-codegroup__title[data-section="title"] {
36
+ background-repeat: no-repeat;
37
+ background-image:
38
+ radial-gradient(circle at 5px 50%, #ef4444 5px, transparent 5px),
39
+ radial-gradient(circle at calc(5px + 1rem) 50%, #f59e0b 5px, transparent 5px),
40
+ radial-gradient(circle at calc(5px + 2rem) 50%, #22c55e 5px, transparent 5px);
41
+ }
42
+ /* Filename title — the topbar bar's lone `code` field. */
43
+ .rf-codegroup__topbar [data-meta-type="code"] {
35
44
  margin-left: 0.5rem;
36
- font-family: var(--rf-font-mono);
37
45
  font-size: 0.8rem;
38
46
  font-weight: normal;
39
47
  color: var(--rf-color-muted);
@@ -1,13 +1,9 @@
1
1
  /* Decision */
2
2
 
3
- /* Primary badges: ID left, status right */
4
- .rf-decision__header-primary {
5
- justify-content: space-between;
6
- margin-bottom: 0.75rem;
7
- }
3
+ /* SPEC-079: eyebrow + metadata zone names replace header-primary /
4
+ * header-secondary. */
8
5
 
9
- /* Preamble: title + optional description between badge groups */
10
- .rf-decision__preamble {
6
+ .rf-decision__eyebrow {
11
7
  margin-bottom: 0.75rem;
12
8
  }
13
9
  .rf-decision__title h1,
@@ -16,8 +12,7 @@
16
12
  margin-top: 0;
17
13
  }
18
14
 
19
- /* Secondary badges: pill row below preamble */
20
- .rf-decision__header-secondary {
15
+ .rf-decision__metadata {
21
16
  margin-bottom: 1.5rem;
22
17
  }
23
18
 
@@ -124,6 +124,10 @@ dialog.rf-drawer .rf-drawer__header {
124
124
  align-items: center;
125
125
  justify-content: space-between;
126
126
  gap: var(--rf-spacing-md);
127
+ /* Reset the generous `[data-section="header"]` bottom margin (3rem) — the
128
+ * dialog chrome spaces the header from the body via the body's own
129
+ * padding, so the section default would push the body off-screen. */
130
+ margin: 0;
127
131
  padding: var(--rf-spacing-md) var(--rf-spacing-lg);
128
132
  border-bottom: 1px solid var(--rf-drawer-border);
129
133
  background: var(--rf-drawer-bg);
@@ -1,11 +1,16 @@
1
1
  /* Event */
2
- .rf-event__meta {
3
- display: flex;
4
- flex-wrap: wrap;
5
- align-items: center;
6
- gap: 0.5rem;
2
+
3
+ /* When/where def-list — geometry from the shared `[data-zone-layout=
4
+ * definition-list]` primitive; this block owns only its top margin. */
5
+ .rf-event__metadata {
6
+ margin-top: 1.25rem;
7
7
  }
8
+
9
+ /* Register CTA — a bar-wrapped link; style the inner `<a>` as a button. */
8
10
  .rf-event__register {
11
+ margin-top: 1.5rem;
12
+ }
13
+ .rf-event__register a {
9
14
  display: inline-block;
10
15
  padding: 0.5rem 1rem;
11
16
  background: var(--rf-color-primary);
@@ -14,22 +19,21 @@
14
19
  font-weight: 500;
15
20
  font-size: 0.875rem;
16
21
  text-decoration: none;
17
- margin-top: 1.5rem;
18
22
  }
19
- .rf-event__register:hover {
23
+ .rf-event__register a:hover {
20
24
  background: var(--rf-color-primary-hover);
21
25
  }
22
- .rf-event__content {
26
+ .rf-event__body {
23
27
  margin-top: 1.5rem;
24
28
  }
25
- .rf-event__content ul,
26
- .rf-event__content ol {
29
+ .rf-event__body ul,
30
+ .rf-event__body ol {
27
31
  padding-left: 1.5rem;
28
32
  }
29
- .rf-event__content a {
33
+ .rf-event__body a {
30
34
  color: var(--rf-color-primary);
31
35
  text-decoration: none;
32
36
  }
33
- .rf-event__content a:hover {
37
+ .rf-event__body a:hover {
34
38
  color: var(--rf-color-primary-hover);
35
39
  }
@@ -23,15 +23,13 @@
23
23
  margin: var(--rf-spacing-md) 0;
24
24
  }
25
25
 
26
- /* Peer-document mode — subtle top + bottom rule, no background, no
27
- * rounded corners. Reads as "set-aside material" without competing
28
- * visually with the host content. Authors who want a stronger
29
- * treatment can override `.rf-expand[data-outline-scope]` in their
30
- * theme. */
26
+ /* Peer-document mode — no background, no rounded corners, no rules.
27
+ * Reads as "set-aside material" through spacing alone, without competing
28
+ * visually with the host content. Authors who want a stronger treatment
29
+ * (rules, background, etc.) can override `.rf-expand[data-outline-scope]`
30
+ * in their theme. */
31
31
  .rf-expand[data-outline-scope] {
32
32
  padding: var(--rf-spacing-md) 0;
33
- border-top: 1px solid var(--rf-color-border);
34
- border-bottom: 1px solid var(--rf-color-border);
35
33
  }
36
34
 
37
35
  /* Tone down embedded headings so the host outline keeps visual primacy.