@refrakt-md/lumina 0.42.0 → 0.43.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/base.css CHANGED
@@ -30,6 +30,7 @@
30
30
  @import "./styles/dimensions/metadata.css";
31
31
  @import "./styles/dimensions/density.css";
32
32
  @import "./styles/dimensions/sections.css";
33
+ @import "./styles/dimensions/link.css";
33
34
  @import "./styles/dimensions/reading.css";
34
35
  @import "./styles/dimensions/state.css";
35
36
  @import "./styles/dimensions/media.css";
@@ -640,36 +640,6 @@
640
640
  }
641
641
  }
642
642
  },
643
- "PageSection": {
644
- "block": "page-section",
645
- "root": ".rf-page-section",
646
- "dataRune": "page-section",
647
- "childOrder": [
648
- "{content}"
649
- ],
650
- "universalAxes": {
651
- "axes": {
652
- "tint": {
653
- "selectors": [
654
- ".rf-page-section--tinted"
655
- ]
656
- },
657
- "bg": {
658
- "selectors": [
659
- ".rf-page-section--has-bg"
660
- ]
661
- }
662
- },
663
- "unavailable": {
664
- "reading": "this rune declares no prose body",
665
- "dropcap": "this rune declares no prose body",
666
- "prominence": "this rune has no page-section header",
667
- "content-place": "this rune declares no `content-place` modifier",
668
- "cover": "this rune declares no `media-position` modifier, so it cannot enter cover mode",
669
- "frame": "this rune declares neither a `frameTarget` nor a media section"
670
- }
671
- }
672
- },
673
643
  "TableOfContents": {
674
644
  "block": "toc",
675
645
  "root": ".rf-toc",
@@ -3003,6 +2973,36 @@
3003
2973
  }
3004
2974
  }
3005
2975
  },
2976
+ "Actions": {
2977
+ "block": "actions",
2978
+ "root": ".rf-actions",
2979
+ "dataRune": "actions",
2980
+ "childOrder": [
2981
+ "{content}"
2982
+ ],
2983
+ "universalAxes": {
2984
+ "axes": {
2985
+ "tint": {
2986
+ "selectors": [
2987
+ ".rf-actions--tinted"
2988
+ ]
2989
+ },
2990
+ "bg": {
2991
+ "selectors": [
2992
+ ".rf-actions--has-bg"
2993
+ ]
2994
+ }
2995
+ },
2996
+ "unavailable": {
2997
+ "reading": "this rune declares no prose body",
2998
+ "dropcap": "this rune declares no prose body",
2999
+ "prominence": "this rune has no page-section header",
3000
+ "content-place": "this rune declares no `content-place` modifier",
3001
+ "cover": "this rune declares no `media-position` modifier, so it cannot enter cover mode",
3002
+ "frame": "this rune declares neither a `frameTarget` nor a media section"
3003
+ }
3004
+ }
3005
+ },
3006
3006
  "Section": {
3007
3007
  "block": "section",
3008
3008
  "root": ".rf-section",
@@ -3016,6 +3016,34 @@
3016
3016
  "default": "start",
3017
3017
  "classPattern": ".rf-section--{value}",
3018
3018
  "dataAttribute": "data-align"
3019
+ },
3020
+ "media-position": {
3021
+ "source": "meta",
3022
+ "dataAttribute": "data-media-position"
3023
+ },
3024
+ "media-ratio": {
3025
+ "source": "meta",
3026
+ "dataAttribute": "data-media-ratio"
3027
+ },
3028
+ "valign": {
3029
+ "source": "meta",
3030
+ "dataAttribute": "data-valign"
3031
+ },
3032
+ "collapse": {
3033
+ "source": "meta",
3034
+ "dataAttribute": "data-collapse"
3035
+ },
3036
+ "content-place": {
3037
+ "source": "meta",
3038
+ "dataAttribute": "data-content-place"
3039
+ },
3040
+ "height": {
3041
+ "source": "meta",
3042
+ "dataAttribute": "data-height"
3043
+ },
3044
+ "aspect": {
3045
+ "source": "meta",
3046
+ "dataAttribute": "data-aspect"
3019
3047
  }
3020
3048
  },
3021
3049
  "universalAxes": {
@@ -3025,18 +3053,14 @@
3025
3053
  ".rf-section--tinted"
3026
3054
  ]
3027
3055
  },
3056
+ "frame": {
3057
+ "target": "[data-section=\"media\"]"
3058
+ },
3028
3059
  "bg": {
3029
3060
  "selectors": [
3030
3061
  ".rf-section--has-bg"
3031
3062
  ]
3032
3063
  }
3033
- },
3034
- "unavailable": {
3035
- "reading": "this rune declares no prose body",
3036
- "dropcap": "this rune declares no prose body",
3037
- "content-place": "this rune declares no `content-place` modifier",
3038
- "cover": "this rune declares no `media-position` modifier, so it cannot enter cover mode",
3039
- "frame": "this rune declares neither a `frameTarget` nor a media section"
3040
3064
  }
3041
3065
  },
3042
3066
  "elements": {
@@ -3065,6 +3089,118 @@
3065
3089
  "selector": ".rf-section__image",
3066
3090
  "source": "autoLabel"
3067
3091
  }
3092
+ },
3093
+ "inlineStyles": {
3094
+ "valign": {
3095
+ "prop": "--split-valign",
3096
+ "transform": "align"
3097
+ },
3098
+ "aspect": "aspect-ratio"
3099
+ },
3100
+ "variants": {
3101
+ "media-position": {
3102
+ "cover": {
3103
+ "block": "section",
3104
+ "root": ".rf-section",
3105
+ "dataRune": "section",
3106
+ "childOrder": [
3107
+ "{content}"
3108
+ ],
3109
+ "modifiers": {
3110
+ "align": {
3111
+ "source": "meta",
3112
+ "default": "start",
3113
+ "classPattern": ".rf-section--{value}",
3114
+ "dataAttribute": "data-align"
3115
+ },
3116
+ "media-position": {
3117
+ "source": "meta",
3118
+ "dataAttribute": "data-media-position"
3119
+ },
3120
+ "media-ratio": {
3121
+ "source": "meta",
3122
+ "dataAttribute": "data-media-ratio"
3123
+ },
3124
+ "valign": {
3125
+ "source": "meta",
3126
+ "dataAttribute": "data-valign"
3127
+ },
3128
+ "collapse": {
3129
+ "source": "meta",
3130
+ "dataAttribute": "data-collapse"
3131
+ },
3132
+ "content-place": {
3133
+ "source": "meta",
3134
+ "dataAttribute": "data-content-place"
3135
+ },
3136
+ "height": {
3137
+ "source": "meta",
3138
+ "dataAttribute": "data-height"
3139
+ },
3140
+ "aspect": {
3141
+ "source": "meta",
3142
+ "dataAttribute": "data-aspect"
3143
+ }
3144
+ },
3145
+ "staticModifiers": [
3146
+ {
3147
+ "name": "cover",
3148
+ "selector": ".rf-section--cover"
3149
+ }
3150
+ ],
3151
+ "universalAxes": {
3152
+ "axes": {
3153
+ "tint": {
3154
+ "selectors": [
3155
+ ".rf-section--tinted"
3156
+ ]
3157
+ },
3158
+ "frame": {
3159
+ "target": "[data-section=\"media\"]"
3160
+ },
3161
+ "bg": {
3162
+ "selectors": [
3163
+ ".rf-section--has-bg"
3164
+ ]
3165
+ }
3166
+ }
3167
+ },
3168
+ "elements": {
3169
+ "preamble": {
3170
+ "tag": "header",
3171
+ "selector": ".rf-section__preamble",
3172
+ "source": "autoLabel"
3173
+ },
3174
+ "eyebrow": {
3175
+ "tag": "eyebrow",
3176
+ "selector": ".rf-section__eyebrow",
3177
+ "source": "autoLabel"
3178
+ },
3179
+ "headline": {
3180
+ "tag": "headline",
3181
+ "selector": ".rf-section__headline",
3182
+ "source": "autoLabel"
3183
+ },
3184
+ "blurb": {
3185
+ "tag": "blurb",
3186
+ "selector": ".rf-section__blurb",
3187
+ "source": "autoLabel"
3188
+ },
3189
+ "image": {
3190
+ "tag": "image",
3191
+ "selector": ".rf-section__image",
3192
+ "source": "autoLabel"
3193
+ }
3194
+ },
3195
+ "inlineStyles": {
3196
+ "valign": {
3197
+ "prop": "--split-valign",
3198
+ "transform": "align"
3199
+ },
3200
+ "aspect": "aspect-ratio"
3201
+ }
3202
+ }
3203
+ }
3068
3204
  }
3069
3205
  },
3070
3206
  "Juxtapose": {
package/index.css CHANGED
@@ -38,6 +38,7 @@
38
38
  @import "./styles/dimensions/metadata.css";
39
39
  @import "./styles/dimensions/density.css";
40
40
  @import "./styles/dimensions/sections.css";
41
+ @import "./styles/dimensions/link.css";
41
42
  @import "./styles/dimensions/reading.css";
42
43
  @import "./styles/dimensions/state.css";
43
44
  @import "./styles/dimensions/media.css";
@@ -57,6 +58,7 @@
57
58
  @import "./styles/runes/annotate.css";
58
59
  @import "./styles/runes/audio.css";
59
60
  @import "./styles/runes/api.css";
61
+ @import "./styles/runes/actions.css";
60
62
  @import "./styles/runes/card.css";
61
63
  @import "./styles/runes/badge.css";
62
64
  @import "./styles/runes/bar.css";
@@ -105,7 +107,6 @@
105
107
  @import "./styles/runes/mockup.css";
106
108
  @import "./styles/runes/nav.css";
107
109
  @import "./styles/runes/organization.css";
108
- @import "./styles/runes/page-section.css";
109
110
  @import "./styles/runes/pagination.css";
110
111
  @import "./styles/runes/playlist.css";
111
112
  @import "./styles/runes/plot.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.42.0",
4
+ "version": "0.43.0",
5
5
  "type": "module",
6
6
  "license": "MIT",
7
7
  "repository": {
@@ -86,10 +86,10 @@
86
86
  "generate-tokens": "node scripts/generate-tokens.mjs"
87
87
  },
88
88
  "dependencies": {
89
- "@refrakt-md/runes": "0.42.0",
90
- "@refrakt-md/skeleton": "0.42.0",
91
- "@refrakt-md/transform": "0.42.0",
92
- "@refrakt-md/types": "0.42.0"
89
+ "@refrakt-md/runes": "0.43.0",
90
+ "@refrakt-md/skeleton": "0.43.0",
91
+ "@refrakt-md/transform": "0.43.0",
92
+ "@refrakt-md/types": "0.43.0"
93
93
  },
94
94
  "devDependencies": {
95
95
  "postcss": "^8.4.0"
@@ -0,0 +1,21 @@
1
+ @layer skin {
2
+ /* link — skin (SPEC-160 D8, WORK-655). A wrapped region reads as its content,
3
+ * not as link text; both forms show where focus is, since a stretched link is
4
+ * now reachable by keyboard. Positioning is structure, in @refrakt-md/skeleton
5
+ * (styles/dimensions/link.css). */
6
+ a[data-link="wrap"],
7
+ a[data-link="wrap"]:hover {
8
+ color: inherit;
9
+ text-decoration: none;
10
+ }
11
+ a[data-link]:focus-visible {
12
+ outline: 2px solid var(--rf-color-primary);
13
+ outline-offset: 2px;
14
+ border-radius: inherit;
15
+ }
16
+ /* A stretched link fills its host, which may clip (`card`'s overflow), so its
17
+ * ring is drawn inside the box rather than around it. */
18
+ a[data-link="stretch"]:focus-visible {
19
+ outline-offset: -3px;
20
+ }
21
+ }
@@ -1,6 +1,6 @@
1
1
  @layer skin {
2
2
  /* ─── Section Anatomy Dimension — skin ──────────────────────────────────
3
- * Zone rhythm (margins, gaps, padding), typography, and borders for the 6
3
+ * Zone rhythm (margins, gaps, padding), typography, and borders for the
4
4
  * standard section roles. The flex zone *containers* (header / preamble /
5
5
  * footer) live in @refrakt-md/skeleton (dimensions/sections.css). Rhythm stays
6
6
  * here so rune zone overrides resolve against it by source order.
@@ -17,6 +17,39 @@
17
17
  gap: 0.25rem;
18
18
  }
19
19
 
20
+ /* ─── Eyebrow: a kicker above the title (WORK-656) ───────────────── */
21
+ /* Shared by every rune with an eyebrow; a rune sets only its spacing (and
22
+ * `card` a smaller size). An eyebrow holding a link is a pill whose link
23
+ * covers it; the stretched link itself is structure (skeleton). */
24
+ [data-section="eyebrow"] {
25
+ font-size: var(--rf-text-sm);
26
+ font-weight: var(--rf-weight-semibold);
27
+ letter-spacing: var(--rf-tracking-wider);
28
+ text-transform: uppercase;
29
+ color: var(--rf-color-primary);
30
+ }
31
+ [data-section="eyebrow"]:has(a) {
32
+ padding: 0.25rem 0.875rem;
33
+ border: 1px solid var(--rf-color-border);
34
+ border-radius: var(--rf-radius-full);
35
+ color: var(--rf-color-text);
36
+ font-weight: var(--rf-weight-normal);
37
+ text-transform: none;
38
+ letter-spacing: var(--rf-tracking-normal);
39
+ transition: border-color 150ms ease;
40
+ }
41
+ [data-section="eyebrow"]:has(a):hover {
42
+ border-color: var(--rf-color-muted);
43
+ }
44
+ [data-section="eyebrow"]:has(a) a {
45
+ color: var(--rf-color-primary);
46
+ font-weight: var(--rf-weight-semibold);
47
+ text-decoration: none;
48
+ }
49
+ [data-section="eyebrow"]:has(a) a::before {
50
+ border-radius: inherit;
51
+ }
52
+
20
53
  /* ─── Title: primary heading ──────────────────────────────────────── */
21
54
  /* Two inputs, in priority order:
22
55
  * --rf-prominence-size an explicit author `prominence=` (surfaces.css)
@@ -7,34 +7,8 @@
7
7
  margin-bottom: 1.5rem;
8
8
  }
9
9
  .rf-accordion__eyebrow {
10
- font-size: var(--rf-text-sm);
11
- font-weight: var(--rf-weight-semibold);
12
- letter-spacing: var(--rf-tracking-wider);
13
- text-transform: uppercase;
14
- color: var(--rf-color-primary);
15
10
  margin: 0 0 0.5rem;
16
11
  }
17
- .rf-accordion__eyebrow:has(a) {
18
- padding: 0.25rem 0.875rem;
19
- border: 1px solid var(--rf-color-border);
20
- border-radius: var(--rf-radius-full);
21
- color: var(--rf-color-text);
22
- font-weight: var(--rf-weight-normal);
23
- text-transform: none;
24
- letter-spacing: var(--rf-tracking-normal);
25
- transition: border-color 150ms ease;
26
- }
27
- .rf-accordion__eyebrow:has(a):hover {
28
- border-color: var(--rf-color-muted);
29
- }
30
- .rf-accordion__eyebrow:has(a) a {
31
- color: var(--rf-color-primary);
32
- font-weight: var(--rf-weight-semibold);
33
- text-decoration: none;
34
- }
35
- .rf-accordion__eyebrow:has(a) a::before {
36
- border-radius: inherit;
37
- }
38
12
  .rf-accordion__headline {
39
13
  margin-top: 0;
40
14
  }
@@ -0,0 +1,65 @@
1
+ @layer skin {
2
+ /* actions — skin (SPEC-160 D6). Buttons styled by rank (`data-rank`), not by
3
+ * list position. Size comes from custom properties a host may set
4
+ * (`--action-padding`, `--action-font-size`); the defaults are cta's. The
5
+ * row, the button shape and the mobile stack are structure, in
6
+ * @refrakt-md/skeleton (styles/runes/actions.css). */
7
+ .rf-actions,
8
+ .rf-actions__list {
9
+ gap: 0.75rem;
10
+ }
11
+ .rf-actions__list {
12
+ padding: 0;
13
+ margin: 0;
14
+ }
15
+ .rf-actions__action {
16
+ padding: 0;
17
+ margin: 0;
18
+ }
19
+ .rf-actions__action > a {
20
+ padding: var(--action-padding, 0.625rem 1.5rem);
21
+ border-radius: var(--rf-radius-sm);
22
+ text-decoration: none;
23
+ font-weight: var(--rf-weight-semibold);
24
+ font-size: var(--action-font-size, var(--rf-text-sm));
25
+ transition: all 200ms ease;
26
+ }
27
+ /* The primary action's text follows the colour scheme, so it stays legible in
28
+ * dark mode and over a cover scrim, where `--rf-color-primary` flips. */
29
+ .rf-actions__action[data-rank="primary"] > a {
30
+ background: var(--rf-color-primary);
31
+ color: var(--rf-color-on-primary);
32
+ box-shadow: var(--rf-shadow-sm);
33
+ }
34
+ .rf-actions__action[data-rank="primary"] > a:hover {
35
+ background: var(--rf-color-primary-hover);
36
+ box-shadow: var(--rf-shadow-md);
37
+ transform: translateY(-1px);
38
+ text-decoration: none;
39
+ }
40
+ .rf-actions__action[data-rank="secondary"] > a {
41
+ background: var(--rf-color-surface);
42
+ color: var(--rf-color-text);
43
+ border: 1px solid var(--rf-color-border);
44
+ }
45
+ .rf-actions__action[data-rank="secondary"] > a:hover {
46
+ background: var(--rf-color-surface-hover);
47
+ border-color: var(--rf-color-surface-active);
48
+ text-decoration: none;
49
+ }
50
+ /* A command line sits in the row at a button's height, without the margin a
51
+ * code block takes in prose. */
52
+ .rf-actions__command .rf-codeblock {
53
+ margin: 0;
54
+ }
55
+ .rf-actions__command pre {
56
+ margin: 0;
57
+ padding: var(--action-padding, 0.625rem 1.5rem);
58
+ font-size: var(--action-font-size, var(--rf-text-sm));
59
+ border-radius: var(--rf-radius-sm);
60
+ background: var(--rf-color-code-bg);
61
+ color: var(--rf-color-code-text);
62
+ border: 1px solid var(--rf-color-border);
63
+ white-space: nowrap;
64
+ }
65
+ }
@@ -1,8 +1,8 @@
1
1
  @layer skin {
2
2
  /* Bento — skin. A grid of cells, each a card-in-a-grid-track (SPEC-085). The
3
3
  * container-query grid system, cell flex layout, media placement, sizing knobs,
4
- * collapse queries, and the stretched link live in @refrakt-md/skeleton
5
- * (styles/runes/bento.css). What remains here is skin: the grid gap, the cell
4
+ * and collapse queries live in @refrakt-md/skeleton (styles/runes/bento.css),
5
+ * and the stretched `href` link in its dimensions/link.css. What remains here is skin: the grid gap, the cell
6
6
  * surface chrome + spacing vars, the media-well chrome, type, and bleed resets. */
7
7
 
8
8
  .rf-bento__grid {
@@ -66,14 +66,11 @@
66
66
  margin-bottom: 0;
67
67
  }
68
68
 
69
- /* Eyebrow — a leading paragraph immediately before a heading, the same kicker
70
- * treatment as page-section / recipe. */
69
+ /* Eyebrow — a leading paragraph immediately before a heading. Its type and its
70
+ * linked pill are the sections dimension's (`[data-section="eyebrow"]`); a card
71
+ * sets it one step smaller. */
71
72
  .rf-card__eyebrow {
72
73
  font-size: var(--rf-text-xs);
73
- font-weight: var(--rf-weight-semibold);
74
- letter-spacing: var(--rf-tracking-wider);
75
- text-transform: uppercase;
76
- color: var(--rf-color-primary);
77
74
  margin: 0 0 var(--rf-spacing-xs);
78
75
  }
79
76
 
@@ -16,37 +16,13 @@
16
16
  gap: 0.25rem;
17
17
  margin-bottom: 1.5rem;
18
18
  }
19
- /* Higher specificity needed to override .rf-cta p (0,1,1) */
19
+ /* The eyebrow's type and its linked pill are the sections dimension's
20
+ * (`[data-section="eyebrow"]`); the cta sets only its spacing. */
20
21
  .rf-cta .rf-cta__eyebrow {
21
- font-size: var(--rf-text-sm);
22
- font-weight: var(--rf-weight-semibold);
23
- letter-spacing: var(--rf-tracking-wider);
24
- text-transform: uppercase;
25
- color: var(--rf-color-primary);
26
22
  margin: 0 0 0.75rem;
27
23
  max-width: none;
28
- }
29
- /* Pill-badge variant when eyebrow contains a link */
30
- .rf-cta .rf-cta__eyebrow:has(a) {
31
- padding: 0.25rem 0.875rem;
32
- border: 1px solid var(--rf-color-border);
33
- border-radius: var(--rf-radius-full);
34
- color: var(--rf-color-text);
35
- font-weight: var(--rf-weight-normal);
36
- text-transform: none;
37
- letter-spacing: var(--rf-tracking-normal);
38
- transition: border-color 150ms ease;
39
- }
40
- .rf-cta .rf-cta__eyebrow:has(a):hover {
41
- border-color: var(--rf-color-muted);
42
- }
43
- .rf-cta .rf-cta__eyebrow:has(a) a {
44
- color: var(--rf-color-primary);
45
- font-weight: var(--rf-weight-semibold);
46
- text-decoration: none;
47
- }
48
- .rf-cta .rf-cta__eyebrow:has(a) a::before {
49
- border-radius: inherit;
24
+ /* What it inherited from `.rf-cta p` before it was excluded from it. */
25
+ line-height: var(--rf-leading-relaxed);
50
26
  }
51
27
  .rf-cta__image {
52
28
  margin-bottom: 1.5rem;
@@ -70,7 +46,8 @@
70
46
  background-clip: text;
71
47
  }
72
48
  /* Higher specificity needed to override .rf-cta p (0,1,1) */
73
- .rf-cta p,
49
+ /* The eyebrow is a paragraph too; it is left to the sections dimension. */
50
+ .rf-cta p:not([data-section="eyebrow"]),
74
51
  .rf-cta .rf-cta__blurb {
75
52
  font-size: var(--rf-text-lg);
76
53
  color: var(--rf-color-muted);
@@ -78,45 +55,8 @@
78
55
  margin: 0 auto 2rem;
79
56
  line-height: var(--rf-leading-relaxed);
80
57
  }
81
- .rf-cta ul {
82
- gap: 0.75rem;
83
- padding: 0;
84
- margin: 0;
85
- }
86
- .rf-cta li {
87
- padding: 0;
88
- margin: 0;
89
- }
90
- .rf-cta li a,
91
- .rf-cta nav a {
92
- padding: 0.625rem 1.5rem;
93
- border-radius: var(--rf-radius-sm);
94
- text-decoration: none;
95
- font-weight: var(--rf-weight-semibold);
96
- font-size: var(--rf-text-sm);
97
- transition: all 200ms ease;
98
- }
99
- .rf-cta li:first-child a {
100
- background: var(--rf-color-primary);
101
- color: white;
102
- box-shadow: var(--rf-shadow-sm);
103
- }
104
- .rf-cta li:first-child a:hover {
105
- background: var(--rf-color-primary-hover);
106
- box-shadow: var(--rf-shadow-md);
107
- transform: translateY(-1px);
108
- text-decoration: none;
109
- }
110
- .rf-cta li:not(:first-child) a {
111
- background: var(--rf-color-surface);
112
- color: var(--rf-color-text);
113
- border: 1px solid var(--rf-color-border);
114
- }
115
- .rf-cta li:not(:first-child) a:hover {
116
- background: var(--rf-color-surface-hover);
117
- border-color: var(--rf-color-surface-active);
118
- text-decoration: none;
119
- }
58
+ /* The actions row is the `actions` rune's (styles/runes/actions.css), whose
59
+ * default size is the cta's own. */
120
60
 
121
61
  /* Context-aware: CTA inside a hero gets more vertical space */
122
62
  .rf-cta--in-hero {
@@ -10,34 +10,8 @@
10
10
  margin-bottom: 1.5rem;
11
11
  }
12
12
  .rf-feature__eyebrow {
13
- font-size: var(--rf-text-sm);
14
- font-weight: var(--rf-weight-semibold);
15
- letter-spacing: var(--rf-tracking-wider);
16
- text-transform: uppercase;
17
- color: var(--rf-color-primary);
18
13
  margin: 0 0 0.5rem;
19
14
  }
20
- .rf-feature__eyebrow:has(a) {
21
- padding: 0.25rem 0.875rem;
22
- border: 1px solid var(--rf-color-border);
23
- border-radius: var(--rf-radius-full);
24
- color: var(--rf-color-text);
25
- font-weight: var(--rf-weight-normal);
26
- text-transform: none;
27
- letter-spacing: var(--rf-tracking-normal);
28
- transition: border-color 150ms ease;
29
- }
30
- .rf-feature__eyebrow:has(a):hover {
31
- border-color: var(--rf-color-muted);
32
- }
33
- .rf-feature__eyebrow:has(a) a {
34
- color: var(--rf-color-primary);
35
- font-weight: var(--rf-weight-semibold);
36
- text-decoration: none;
37
- }
38
- .rf-feature__eyebrow:has(a) a::before {
39
- border-radius: inherit;
40
- }
41
15
  .rf-feature__headline {
42
16
  margin-top: 0;
43
17
  }
@@ -19,44 +19,23 @@
19
19
  gap: 0.25rem;
20
20
  margin-bottom: 2rem;
21
21
  }
22
- /* Higher specificity needed to override .rf-hero p (0,1,1) */
22
+ /* The eyebrow's type and its linked pill are the sections dimension's
23
+ * (`[data-section="eyebrow"]`); the hero sets only its spacing. */
23
24
  .rf-hero .rf-hero__eyebrow {
24
- font-size: var(--rf-text-sm);
25
- font-weight: var(--rf-weight-semibold);
26
- letter-spacing: var(--rf-tracking-wider);
27
- text-transform: uppercase;
28
- color: var(--rf-color-primary);
29
25
  margin: 0 0 1rem;
30
26
  max-width: none;
31
- }
32
- /* Pill-badge variant when eyebrow contains a link */
33
- .rf-hero .rf-hero__eyebrow:has(a) {
34
- padding: 0.25rem 0.875rem;
35
- border: 1px solid var(--rf-color-border);
36
- border-radius: var(--rf-radius-full);
37
- color: var(--rf-color-text);
38
- font-weight: var(--rf-weight-normal);
39
- text-transform: none;
40
- letter-spacing: var(--rf-tracking-normal);
41
- transition: border-color 150ms ease;
42
- }
43
- .rf-hero .rf-hero__eyebrow:has(a):hover {
44
- border-color: var(--rf-color-muted);
45
- }
46
- .rf-hero .rf-hero__eyebrow:has(a) a {
47
- color: var(--rf-color-primary);
48
- font-weight: var(--rf-weight-semibold);
49
- text-decoration: none;
50
- }
51
- .rf-hero .rf-hero__eyebrow:has(a) a::before {
52
- border-radius: inherit;
27
+ /* What it inherited from `.rf-hero p` before it was excluded from it. */
28
+ line-height: var(--rf-leading-relaxed);
53
29
  }
54
30
  .rf-hero__image {
55
31
  margin-bottom: 1.5rem;
56
32
  }
33
+ /* The actions row is the `actions` rune's (styles/runes/actions.css); the hero
34
+ * sets only its width and the size of its buttons and command line. */
57
35
  .rf-hero__actions {
36
+ --action-padding: 0.7rem 1.75rem;
37
+ --action-font-size: var(--rf-text);
58
38
  max-width: 720px;
59
- gap: 0.75rem;
60
39
  }
61
40
  .rf-hero[data-align="center"] .rf-hero__preamble,
62
41
  .rf-hero[data-align="center"] > h1,
@@ -73,16 +52,6 @@
73
52
  .rf-hero[data-align="right"] > p {
74
53
  text-align: right;
75
54
  }
76
- .rf-hero__actions pre {
77
- margin: 0;
78
- padding: 0.7rem 1.75rem;
79
- font-size: var(--rf-text);
80
- border-radius: var(--rf-radius-sm);
81
- background: var(--rf-color-code-bg);
82
- color: var(--rf-color-code-text);
83
- border: 1px solid var(--rf-color-border);
84
- white-space: nowrap;
85
- }
86
55
  .rf-hero h1,
87
56
  .rf-hero__headline {
88
57
  /* WORK-538 — read the prominence override first; the fallback is this rune's
@@ -99,7 +68,8 @@
99
68
  background-clip: text;
100
69
  }
101
70
  /* Higher specificity needed to override .rf-hero p (0,1,1) */
102
- .rf-hero p,
71
+ /* The eyebrow is a paragraph too; it is left to the sections dimension. */
72
+ .rf-hero p:not([data-section="eyebrow"]),
103
73
  .rf-hero .rf-hero__blurb {
104
74
  font-size: var(--rf-text-xl);
105
75
  line-height: var(--rf-leading-relaxed);
@@ -112,46 +82,6 @@
112
82
  max-width: 560px;
113
83
  margin-bottom: 2rem;
114
84
  }
115
- .rf-hero ul,
116
- .rf-hero nav {
117
- gap: 0.75rem;
118
- padding: 0;
119
- margin: 0;
120
- }
121
- .rf-hero li {
122
- padding: 0;
123
- margin: 0;
124
- }
125
- .rf-hero li a,
126
- .rf-hero nav a {
127
- padding: 0.7rem 1.75rem;
128
- border-radius: var(--rf-radius-sm);
129
- text-decoration: none;
130
- font-weight: var(--rf-weight-semibold);
131
- font-size: var(--rf-text);
132
- transition: all 200ms ease;
133
- }
134
- .rf-hero li:first-child a {
135
- background: var(--rf-color-primary);
136
- color: white;
137
- box-shadow: var(--rf-shadow-sm);
138
- }
139
- .rf-hero li:first-child a:hover {
140
- background: var(--rf-color-primary-hover);
141
- box-shadow: var(--rf-shadow-md);
142
- transform: translateY(-1px);
143
- text-decoration: none;
144
- }
145
- .rf-hero li:not(:first-child) a {
146
- background: var(--rf-color-surface);
147
- color: var(--rf-color-text);
148
- border: 1px solid var(--rf-color-border);
149
- }
150
- .rf-hero li:not(:first-child) a:hover {
151
- background: var(--rf-color-surface-hover);
152
- border-color: var(--rf-color-surface-active);
153
- text-decoration: none;
154
- }
155
85
  .rf-hero__media {
156
86
  margin-top: 3rem;
157
87
  border-radius: var(--rf-radius-lg);
@@ -190,13 +120,6 @@
190
120
  border-radius: 0;
191
121
  }
192
122
 
193
- /* Legibility over the scrim: the primary action hard-codes white text above,
194
- * which inverts to white-on-near-white once the cover scheme flips
195
- * --rf-color-primary on the dark overlay. Use the scheme's tokens instead. */
196
- .rf-hero--cover li:first-child a {
197
- color: var(--rf-color-on-accent, var(--rf-color-bg));
198
- }
199
-
200
123
  /* The default cover scrim is edge-weighted (a caption-strip treatment); under
201
124
  * the centred band it would leave the headline on undarkened media. With no
202
125
  * explicit `content-place`, darken the well evenly (slightly bottom-weighted). */
@@ -15,34 +15,8 @@
15
15
  margin-top: 0;
16
16
  }
17
17
  .rf-pricing__eyebrow {
18
- font-size: var(--rf-text-sm);
19
- font-weight: var(--rf-weight-semibold);
20
- letter-spacing: var(--rf-tracking-wider);
21
- text-transform: uppercase;
22
- color: var(--rf-color-primary);
23
18
  margin: 0 0 0.5rem;
24
19
  }
25
- .rf-pricing__eyebrow:has(a) {
26
- padding: 0.25rem 0.875rem;
27
- border: 1px solid var(--rf-color-border);
28
- border-radius: var(--rf-radius-full);
29
- color: var(--rf-color-text);
30
- font-weight: var(--rf-weight-normal);
31
- text-transform: none;
32
- letter-spacing: var(--rf-tracking-normal);
33
- transition: border-color 150ms ease;
34
- }
35
- .rf-pricing__eyebrow:has(a):hover {
36
- border-color: var(--rf-color-muted);
37
- }
38
- .rf-pricing__eyebrow:has(a) a {
39
- color: var(--rf-color-primary);
40
- font-weight: var(--rf-weight-semibold);
41
- text-decoration: none;
42
- }
43
- .rf-pricing__eyebrow:has(a) a::before {
44
- border-radius: inherit;
45
- }
46
20
  .rf-pricing__blurb {
47
21
  color: var(--rf-color-muted);
48
22
  margin-bottom: 0;
@@ -6,34 +6,8 @@
6
6
  margin-bottom: 1.5rem;
7
7
  }
8
8
  .rf-reveal__eyebrow {
9
- font-size: var(--rf-text-sm);
10
- font-weight: var(--rf-weight-semibold);
11
- letter-spacing: var(--rf-tracking-wider);
12
- text-transform: uppercase;
13
- color: var(--rf-color-primary);
14
9
  margin: 0 0 0.5rem;
15
10
  }
16
- .rf-reveal__eyebrow:has(a) {
17
- padding: 0.25rem 0.875rem;
18
- border: 1px solid var(--rf-color-border);
19
- border-radius: var(--rf-radius-full);
20
- color: var(--rf-color-text);
21
- font-weight: var(--rf-weight-normal);
22
- text-transform: none;
23
- letter-spacing: var(--rf-tracking-normal);
24
- transition: border-color 150ms ease;
25
- }
26
- .rf-reveal__eyebrow:has(a):hover {
27
- border-color: var(--rf-color-muted);
28
- }
29
- .rf-reveal__eyebrow:has(a) a {
30
- color: var(--rf-color-primary);
31
- font-weight: var(--rf-weight-semibold);
32
- text-decoration: none;
33
- }
34
- .rf-reveal__eyebrow:has(a) a::before {
35
- border-radius: inherit;
36
- }
37
11
  .rf-reveal__headline {
38
12
  margin-top: 0;
39
13
  }
@@ -6,6 +6,23 @@
6
6
  gap: 1.5rem;
7
7
  }
8
8
 
9
+ /* With a split, the content column keeps the header-to-body rhythm. */
10
+ .rf-section__content {
11
+ gap: 1.5rem;
12
+ }
13
+ .rf-section__footer {
14
+ padding-top: var(--rf-spacing-sm);
15
+ border-top: 1px solid var(--rf-color-border);
16
+ font-size: 0.8125em;
17
+ color: var(--rf-color-muted);
18
+ }
19
+ .rf-section__footer > :first-child {
20
+ margin-top: 0;
21
+ }
22
+ .rf-section__footer > :last-child {
23
+ margin-bottom: 0;
24
+ }
25
+
9
26
  /* Header */
10
27
  .rf-section__preamble {
11
28
  gap: 0.5rem;
@@ -13,34 +30,8 @@
13
30
  margin: 0;
14
31
  }
15
32
  .rf-section__eyebrow {
16
- font-size: var(--rf-text-sm);
17
- font-weight: var(--rf-weight-semibold);
18
- letter-spacing: var(--rf-tracking-wider);
19
- text-transform: uppercase;
20
- color: var(--rf-color-primary);
21
33
  margin: 0;
22
34
  }
23
- .rf-section__eyebrow:has(a) {
24
- padding: 0.25rem 0.875rem;
25
- border: 1px solid var(--rf-color-border);
26
- border-radius: var(--rf-radius-full);
27
- color: var(--rf-color-text);
28
- font-weight: var(--rf-weight-normal);
29
- text-transform: none;
30
- letter-spacing: var(--rf-tracking-normal);
31
- transition: border-color 150ms ease;
32
- }
33
- .rf-section__eyebrow:has(a):hover {
34
- border-color: var(--rf-color-muted);
35
- }
36
- .rf-section__eyebrow:has(a) a {
37
- color: var(--rf-color-primary);
38
- font-weight: var(--rf-weight-semibold);
39
- text-decoration: none;
40
- }
41
- .rf-section__eyebrow:has(a) a::before {
42
- border-radius: inherit;
43
- }
44
35
  .rf-section__headline {
45
36
  margin: 0;
46
37
  }
@@ -6,34 +6,8 @@
6
6
  margin-bottom: 1.5rem;
7
7
  }
8
8
  .rf-steps__eyebrow {
9
- font-size: var(--rf-text-sm);
10
- font-weight: var(--rf-weight-semibold);
11
- letter-spacing: var(--rf-tracking-wider);
12
- text-transform: uppercase;
13
- color: var(--rf-color-primary);
14
9
  margin: 0 0 0.5rem;
15
10
  }
16
- .rf-steps__eyebrow:has(a) {
17
- padding: 0.25rem 0.875rem;
18
- border: 1px solid var(--rf-color-border);
19
- border-radius: var(--rf-radius-full);
20
- color: var(--rf-color-text);
21
- font-weight: var(--rf-weight-normal);
22
- text-transform: none;
23
- letter-spacing: var(--rf-tracking-normal);
24
- transition: border-color 150ms ease;
25
- }
26
- .rf-steps__eyebrow:has(a):hover {
27
- border-color: var(--rf-color-muted);
28
- }
29
- .rf-steps__eyebrow:has(a) a {
30
- color: var(--rf-color-primary);
31
- font-weight: var(--rf-weight-semibold);
32
- text-decoration: none;
33
- }
34
- .rf-steps__eyebrow:has(a) a::before {
35
- border-radius: inherit;
36
- }
37
11
  .rf-steps__headline {
38
12
  margin-top: 0;
39
13
  }
@@ -5,34 +5,8 @@
5
5
  margin-bottom: 1.5rem;
6
6
  }
7
7
  .rf-tabs__eyebrow {
8
- font-size: var(--rf-text-sm);
9
- font-weight: var(--rf-weight-semibold);
10
- letter-spacing: var(--rf-tracking-wider);
11
- text-transform: uppercase;
12
- color: var(--rf-color-primary);
13
8
  margin: 0 0 0.5rem;
14
9
  }
15
- .rf-tabs__eyebrow:has(a) {
16
- padding: 0.25rem 0.875rem;
17
- border: 1px solid var(--rf-color-border);
18
- border-radius: var(--rf-radius-full);
19
- color: var(--rf-color-text);
20
- font-weight: var(--rf-weight-normal);
21
- text-transform: none;
22
- letter-spacing: var(--rf-tracking-normal);
23
- transition: border-color 150ms ease;
24
- }
25
- .rf-tabs__eyebrow:has(a):hover {
26
- border-color: var(--rf-color-muted);
27
- }
28
- .rf-tabs__eyebrow:has(a) a {
29
- color: var(--rf-color-primary);
30
- font-weight: var(--rf-weight-semibold);
31
- text-decoration: none;
32
- }
33
- .rf-tabs__eyebrow:has(a) a::before {
34
- border-radius: inherit;
35
- }
36
10
  .rf-tabs__headline {
37
11
  margin-top: 0;
38
12
  }
@@ -1,19 +0,0 @@
1
- @layer skin {
2
- /* PageSection */
3
- .rf-page-section {
4
- padding: 3rem 0;
5
- }
6
- .rf-page-section > h1:first-child,
7
- .rf-page-section > h2:first-child {
8
- margin-top: 0;
9
- }
10
- .rf-page-section--split {
11
- gap: 3rem;
12
- }
13
-
14
- @media (max-width: 768px) {
15
- .rf-page-section--split {
16
- gap: 1.5rem;
17
- }
18
- }
19
- }