@refrakt-md/skeleton 0.41.3 → 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/index.css CHANGED
@@ -36,6 +36,7 @@
36
36
  @import "./styles/dimensions/cover.css" layer(skeleton);
37
37
  @import "./styles/dimensions/metadata.css" layer(skeleton);
38
38
  @import "./styles/dimensions/sections.css" layer(skeleton);
39
+ @import "./styles/dimensions/link.css" layer(skeleton);
39
40
  @import "./styles/dimensions/reading.css" layer(skeleton);
40
41
  @import "./styles/dimensions/checklist.css" layer(skeleton);
41
42
  @import "./styles/dimensions/sequence.css" layer(skeleton);
@@ -54,6 +55,7 @@
54
55
  @import "./styles/layouts/plan.css" layer(skeleton);
55
56
 
56
57
  /* ── Rune structure ── */
58
+ @import "./styles/runes/actions.css" layer(skeleton);
57
59
  @import "./styles/runes/card.css" layer(skeleton);
58
60
  @import "./styles/runes/hint.css" layer(skeleton);
59
61
  @import "./styles/runes/steps.css" layer(skeleton);
@@ -110,7 +112,6 @@
110
112
  @import "./styles/runes/file-ref.css" layer(skeleton);
111
113
  @import "./styles/runes/form.css" layer(skeleton);
112
114
  @import "./styles/runes/mediatext.css" layer(skeleton);
113
- @import "./styles/runes/page-section.css" layer(skeleton);
114
115
  @import "./styles/runes/placeholder.css" layer(skeleton);
115
116
  @import "./styles/runes/pullquote.css" layer(skeleton);
116
117
  @import "./styles/runes/relationships.css" layer(skeleton);
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@refrakt-md/skeleton",
3
3
  "description": "The structural cascade layer + layer-order contract every refrakt theme builds on — ships `@layer skeleton` and the `@layer skeleton, skin;` order declaration, plus the token-name contract",
4
- "version": "0.41.3",
4
+ "version": "0.43.0",
5
5
  "type": "module",
6
6
  "license": "MIT",
7
7
  "repository": {
@@ -29,7 +29,7 @@
29
29
  "styles"
30
30
  ],
31
31
  "dependencies": {
32
- "@refrakt-md/types": "0.41.3"
32
+ "@refrakt-md/types": "0.43.0"
33
33
  },
34
34
  "scripts": {
35
35
  "build": "tsc"
@@ -0,0 +1,25 @@
1
+ /* link — structure (SPEC-160 D8, WORK-655). Whole-region links, keyed on the
2
+ * `data-link` attribute the identity transform writes, so they work around any
3
+ * rune and need no rune CSS.
4
+ *
5
+ * - wrap: a real `<a>` around content with nothing interactive in it.
6
+ * - stretch: an `<a>` laid over its host (`card`/`bento-cell` `href`, or a
7
+ * `{% link %}` around interactive content); the content's own links and
8
+ * controls sit above it and stay clickable. */
9
+
10
+ a[data-link="wrap"] {
11
+ display: block;
12
+ }
13
+
14
+ :has(> [data-link="stretch"]) {
15
+ position: relative;
16
+ }
17
+ [data-link="stretch"] {
18
+ position: absolute;
19
+ inset: 0;
20
+ z-index: 0;
21
+ }
22
+ :has(> [data-link="stretch"]) :is(a, button, input, select, textarea, summary):not([data-link]) {
23
+ position: relative;
24
+ z-index: 1;
25
+ }
@@ -20,3 +20,17 @@
20
20
  display: flex;
21
21
  flex-wrap: wrap;
22
22
  }
23
+
24
+ /* An eyebrow holding a link is a pill whose link covers it (WORK-656). The
25
+ * stretched link is structure; the pill's chrome is skin (Lumina's
26
+ * dimensions/sections.css). Keyed on the role, so every rune with an eyebrow
27
+ * gets it, `card` included. */
28
+ [data-section="eyebrow"]:has(a) {
29
+ display: inline-block;
30
+ position: relative;
31
+ }
32
+ [data-section="eyebrow"]:has(a) a::before {
33
+ content: "";
34
+ position: absolute;
35
+ inset: 0;
36
+ }
@@ -1,19 +1,10 @@
1
- /* accordion — structure. The eyebrow stretched-link, the items passthrough, the
1
+ /* accordion — structure. The items passthrough, the
2
2
  * item-header flex + native-marker hide + chevron box/glyph/open-rotate mechanism,
3
3
  * the title/count flex, and the ::details-content collapse mechanism. Type,
4
4
  * borders, spacing, the chevron tint, transitions, and prose are skin (Lumina's
5
5
  * styles/runes/accordion.css). The chevron glyph is the registry mask
6
6
  * --rf-icon-accordion-chevron (SPEC-094 §8 / WORK-437). */
7
7
 
8
- .rf-accordion__eyebrow:has(a) {
9
- display: inline-block;
10
- position: relative;
11
- }
12
- .rf-accordion__eyebrow:has(a) a::before {
13
- content: "";
14
- position: absolute;
15
- inset: 0;
16
- }
17
8
  .rf-accordion__items {
18
9
  display: contents;
19
10
  }
@@ -0,0 +1,39 @@
1
+ /* actions — structure (SPEC-160 D6). The action row, the button-shaped link, and
2
+ * the mobile stack. The look (padding, fill, rank) is skin: Lumina's
3
+ * styles/runes/actions.css. A host positions the row by setting
4
+ * `--actions-justify` (hero and cta do, from their alignment). */
5
+
6
+ .rf-actions {
7
+ display: flex;
8
+ align-items: center;
9
+ flex-wrap: wrap;
10
+ justify-content: var(--actions-justify, flex-start);
11
+ }
12
+ .rf-actions__list {
13
+ display: flex;
14
+ flex-wrap: wrap;
15
+ list-style: none;
16
+ justify-content: var(--actions-justify, flex-start);
17
+ }
18
+ .rf-actions__action > a {
19
+ display: inline-flex;
20
+ align-items: center;
21
+ }
22
+
23
+ /* Mobile: stack actions full-width so a command line and the buttons line up. */
24
+ @media (max-width: 640px) {
25
+ .rf-actions,
26
+ .rf-actions__list {
27
+ flex-direction: column;
28
+ align-items: stretch;
29
+ }
30
+ .rf-actions__command pre {
31
+ width: 100%;
32
+ box-sizing: border-box;
33
+ }
34
+ .rf-actions__action > a {
35
+ justify-content: center;
36
+ width: 100%;
37
+ box-sizing: border-box;
38
+ }
39
+ }
@@ -1,6 +1,7 @@
1
1
  /* bento — structure. The container-query grid system: the grid track + cell
2
2
  * spans, the cell flex layout + media placement, the row/content sizing knobs,
3
- * the collapse queries, the stretched link, and metadata hiding. The cell surface
3
+ * the collapse queries, and metadata hiding (the stretched `href` link is the
4
+ * shared dimensions/link.css). The cell surface
4
5
  * chrome, spacing vars (padding/edge/gap), type, and the media-well chrome stay
5
6
  * skin (Lumina's styles/runes/bento.css). bento-cell is a hand-rolled surface
6
7
  * outside the data-elevation axis, so its padding has no surfaces competitor. */
@@ -157,17 +158,6 @@
157
158
  height: auto;
158
159
  }
159
160
 
160
- /* Whole-cell link — stretched overlay; nested links stay clickable. */
161
- .rf-bento-cell__link {
162
- position: absolute;
163
- inset: 0;
164
- z-index: 0;
165
- }
166
- .rf-bento-cell a:not(.rf-bento-cell__link) {
167
- position: relative;
168
- z-index: 1;
169
- }
170
-
171
161
  /* ─── Binary collapse — single stacked column with auto rows below breakpoint. ─── */
172
162
  @container rf-bento (max-width: 640px) {
173
163
  :is(.rf-bento[data-collapse="sm"], .rf-bento[data-collapse=""]) .rf-bento__grid {
@@ -1,11 +1,11 @@
1
- /* card — structure (SPEC-070). Pure layout only: the stretched-link positioning,
2
- * the clip, the split vertical-align, the collection-grid height filling, and the
3
- * intrinsic-height scale. ALL spacing stays skin in Lumina's card.css — the root
1
+ /* card — structure (SPEC-070). Pure layout only: the clip, the split
2
+ * vertical-align, the collection-grid height filling, and the intrinsic-height
3
+ * scale. The stretched `href` link is the shared dimensions/link.css. ALL spacing stays skin in Lumina's card.css — the root
4
4
  * `padding` overrides the surface-elevation padding (skin) by source order, and
5
5
  * the split gaps + zone-reset margins are same-layer rhythm contests. */
6
6
 
7
7
  .rf-card {
8
- position: relative; /* anchor for the stretched link */
8
+ position: relative; /* anchor for the stretched link (dimensions/link.css) */
9
9
  overflow: hidden; /* clip non-media layers to the rounded box */
10
10
  }
11
11
 
@@ -46,14 +46,3 @@
46
46
  .rf-card[data-height="xl"] {
47
47
  min-height: 34rem;
48
48
  }
49
-
50
- /* Whole-card stretched link; real links in body/footer sit above it. */
51
- .rf-card__link {
52
- position: absolute;
53
- inset: 0;
54
- z-index: 0;
55
- }
56
- .rf-card a:not(.rf-card__link) {
57
- position: relative;
58
- z-index: 1;
59
- }
@@ -1,46 +1,14 @@
1
- /* cta — structure. The preamble layout + stretched-link eyebrow, the action-button
2
- * flex row + its mobile stack, list resets. All spacing, type, the headline
3
- * gradient, surface chrome, and colour stay skin (Lumina's styles/runes/cta.css). */
1
+ /* cta — structure. The preamble layout and the centred
2
+ * actions row (the row itself is the `actions` rune's, styles/runes/actions.css).
3
+ * All spacing, type, the headline gradient, surface chrome, and colour stay skin
4
+ * (Lumina's styles/runes/cta.css). */
4
5
 
5
6
  .rf-cta__preamble {
6
7
  flex-direction: column;
7
8
  align-items: center;
8
9
  }
9
10
 
10
- /* Linked eyebrow → pill with a stretched link (chrome is skin). */
11
- .rf-cta .rf-cta__eyebrow:has(a) {
12
- display: inline-block;
13
- position: relative;
14
- }
15
- .rf-cta .rf-cta__eyebrow:has(a) a::before {
16
- content: "";
17
- position: absolute;
18
- inset: 0;
19
- }
20
-
21
- /* Action-button row. */
22
- .rf-cta ul {
23
- display: flex;
24
- justify-content: center;
25
- flex-wrap: wrap;
26
- list-style: none;
27
- }
28
- .rf-cta li a,
29
- .rf-cta nav a {
30
- display: inline-flex;
31
- align-items: center;
32
- }
33
-
34
- /* Mobile: stack action buttons full-width so multi-button CTAs line up. */
35
- @media (max-width: 640px) {
36
- .rf-cta ul {
37
- flex-direction: column;
38
- align-items: stretch;
39
- }
40
- .rf-cta li a,
41
- .rf-cta nav a {
42
- justify-content: center;
43
- width: 100%;
44
- box-sizing: border-box;
45
- }
11
+ /* The actions row is centred. */
12
+ .rf-cta__actions {
13
+ --actions-justify: center;
46
14
  }
@@ -1,4 +1,4 @@
1
- /* feature — structure. The preamble flex + eyebrow stretched-link, the content
1
+ /* feature — structure. The preamble flex, the content
2
2
  * display reset, the definitions grid, the feature-item icon stack, and the
3
3
  * media-position flip. Spacing, type, surface chrome, alignment (text-align), and
4
4
  * colour stay skin (Lumina's styles/runes/feature.css). */
@@ -8,16 +8,6 @@
8
8
  align-items: flex-start;
9
9
  }
10
10
 
11
- .rf-feature__eyebrow:has(a) {
12
- display: inline-block;
13
- position: relative;
14
- }
15
- .rf-feature__eyebrow:has(a) a::before {
16
- content: "";
17
- position: absolute;
18
- inset: 0;
19
- }
20
-
21
11
  .rf-feature__content {
22
12
  display: contents;
23
13
  }
@@ -1,7 +1,7 @@
1
- /* hero — structure. The relative root (scrim/overlay anchor), the preamble +
2
- * eyebrow stretched-link, the actions/button flex rows and their alignment via
3
- * auto-margins + the mobile stack, the media-position flip, the responsive image
4
- * box, and the cover-band height/containment authority (which wins over the
1
+ /* hero — structure. The relative root (scrim/overlay anchor), the preamble,
2
+ * the actions row's position via auto-margins (the row itself is the `actions`
3
+ * rune's, styles/runes/actions.css), the media-position flip, the responsive
4
+ * image box, and the cover-band height/containment authority (which wins over the
5
5
  * shared cover layer by specificity). All spacing, type, the headline gradient,
6
6
  * surface chrome, scrim, radii, and text-align stay skin (Lumina's
7
7
  * styles/runes/hero.css). */
@@ -19,28 +19,15 @@
19
19
  align-items: center;
20
20
  }
21
21
 
22
- /* Linked eyebrow → pill with a stretched link (chrome is skin). */
23
- .rf-hero .rf-hero__eyebrow:has(a) {
24
- display: inline-block;
25
- position: relative;
26
- }
27
- .rf-hero .rf-hero__eyebrow:has(a) a::before {
28
- content: "";
29
- position: absolute;
30
- inset: 0;
31
- }
32
-
33
22
  .rf-hero__actions {
34
- display: flex;
35
- align-items: center;
36
- flex-wrap: wrap;
37
23
  margin: 0 auto;
38
24
  }
39
25
 
40
- /* Alignment — auto-margins + flex alignment position the preamble/actions. */
26
+ /* Alignment — auto-margins position the preamble and the actions row, and
27
+ * `--actions-justify` aligns the buttons inside it. */
41
28
  .rf-hero[data-align="center"] .rf-hero__actions {
29
+ --actions-justify: center;
42
30
  margin: 0 auto;
43
- justify-content: center;
44
31
  }
45
32
  .rf-hero[data-align="left"] .rf-hero__preamble {
46
33
  align-items: flex-start;
@@ -52,6 +39,7 @@
52
39
  align-items: flex-end;
53
40
  }
54
41
  .rf-hero[data-align="right"] .rf-hero__actions {
42
+ --actions-justify: flex-end;
55
43
  margin: 0 0 0 auto;
56
44
  }
57
45
  .rf-hero[data-align="center"] > p,
@@ -60,22 +48,6 @@
60
48
  margin-right: auto;
61
49
  }
62
50
 
63
- .rf-hero ul,
64
- .rf-hero nav {
65
- display: flex;
66
- flex-wrap: wrap;
67
- list-style: none;
68
- }
69
- .rf-hero[data-align="center"] ul,
70
- .rf-hero[data-align="center"] nav {
71
- justify-content: center;
72
- }
73
- .rf-hero li a,
74
- .rf-hero nav a {
75
- display: inline-flex;
76
- align-items: center;
77
- }
78
-
79
51
  /* BUG-001 — content-first DOM inverts the shared media-first stacked contract. */
80
52
  .rf-hero[data-media-position="bottom"] {
81
53
  display: block;
@@ -122,26 +94,3 @@
122
94
  align-self: center;
123
95
  justify-self: stretch;
124
96
  }
125
-
126
- /* Mobile: stack actions full-width so the code block and button line up. */
127
- @media (max-width: 640px) {
128
- .rf-hero__actions {
129
- flex-direction: column;
130
- align-items: stretch;
131
- }
132
- .rf-hero__actions pre {
133
- width: 100%;
134
- box-sizing: border-box;
135
- }
136
- .rf-hero ul,
137
- .rf-hero nav {
138
- flex-direction: column;
139
- align-items: stretch;
140
- }
141
- .rf-hero li a,
142
- .rf-hero nav a {
143
- justify-content: center;
144
- width: 100%;
145
- box-sizing: border-box;
146
- }
147
- }
@@ -1,6 +1,5 @@
1
1
  /* pricing — structure. The tiers grid, the tier flex-column (so CTAs drop to a
2
- * common baseline via margin-top:auto), the preamble/eyebrow layout +
3
- * stretched-link, and list resets. All spacing, type, surface chrome, colour, and
2
+ * common baseline via margin-top:auto), the preamble layout, and list resets. All spacing, type, surface chrome, colour, and
4
3
  * shadow stay skin (Lumina's styles/runes/pricing.css). */
5
4
 
6
5
  .rf-pricing > header,
@@ -9,17 +8,6 @@
9
8
  align-items: flex-start;
10
9
  }
11
10
 
12
- /* Linked eyebrow → pill with a stretched link (chrome is skin). */
13
- .rf-pricing__eyebrow:has(a) {
14
- display: inline-block;
15
- position: relative;
16
- }
17
- .rf-pricing__eyebrow:has(a) a::before {
18
- content: "";
19
- position: absolute;
20
- inset: 0;
21
- }
22
-
23
11
  .rf-pricing__tiers,
24
12
  .rf-pricing > ul[data-layout="grid"] {
25
13
  display: grid;
@@ -1,17 +1,8 @@
1
- /* reveal — structure. The eyebrow stretched-link, the steps flex column, the
1
+ /* reveal — structure. The steps flex column, the
2
2
  * hidden-step collapse (height/overflow), the metadata hide, and the control
3
3
  * button flex. The animation (opacity/transform/transition), spacing, type,
4
4
  * borders, and surface chrome are skin (Lumina's styles/runes/reveal.css). */
5
5
 
6
- .rf-reveal__eyebrow:has(a) {
7
- display: inline-block;
8
- position: relative;
9
- }
10
- .rf-reveal__eyebrow:has(a) a::before {
11
- content: "";
12
- position: absolute;
13
- inset: 0;
14
- }
15
6
  .rf-reveal__steps {
16
7
  display: flex;
17
8
  flex-direction: column;
@@ -1,23 +1,38 @@
1
- /* section — structure. The column stack, the preamble flex + eyebrow stretched-
2
- * link, the responsive image box, the full-width body, and the header alignment
1
+ /* section — structure. The column stack, the preamble flex, the responsive image
2
+ * box, the full-width body, and the header alignment
3
3
  * (align-items + auto-margins). Type, gaps, max-width, radii, and text-align are
4
- * skin. */
5
- .rf-section {
4
+ * skin.
5
+ *
6
+ * The split (`media-position`, SPEC-160 D2) is the shared layout's, keyed on
7
+ * `[data-media-position]` in layouts/split.css and the cover dimension. The
8
+ * column stack is `:where()` so it never outranks those attribute selectors,
9
+ * which this file loads after. */
10
+ :where(.rf-section) {
6
11
  display: flex;
7
12
  flex-direction: column;
8
13
  }
9
- .rf-section__preamble {
14
+ .rf-section__content {
10
15
  display: flex;
11
16
  flex-direction: column;
17
+ min-width: 0;
18
+ }
19
+
20
+ /* Intrinsic-height scale (SPEC-089), as on `card` — for cover sections. */
21
+ .rf-section[data-height="sm"] {
22
+ min-height: 12rem;
23
+ }
24
+ .rf-section[data-height="md"] {
25
+ min-height: 18rem;
26
+ }
27
+ .rf-section[data-height="lg"] {
28
+ min-height: 26rem;
12
29
  }
13
- .rf-section__eyebrow:has(a) {
14
- display: inline-block;
15
- position: relative;
30
+ .rf-section[data-height="xl"] {
31
+ min-height: 34rem;
16
32
  }
17
- .rf-section__eyebrow:has(a) a::before {
18
- content: "";
19
- position: absolute;
20
- inset: 0;
33
+ .rf-section__preamble {
34
+ display: flex;
35
+ flex-direction: column;
21
36
  }
22
37
  .rf-section__image {
23
38
  max-width: 100%;
@@ -1,6 +1,5 @@
1
1
  /* steps — structure. The step counter mechanism, the step item positioning, the
2
- * counter-badge box placement, the preamble/eyebrow layout + stretched-link, list
3
- * resets, and the media-position flip. All spacing, type, surface, and the badge
2
+ * counter-badge box placement, the preamble layout, list resets, and the media-position flip. All spacing, type, surface, and the badge
4
3
  * chrome stay skin (Lumina's styles/runes/steps.css). */
5
4
 
6
5
  .rf-steps {
@@ -12,17 +11,6 @@
12
11
  align-items: flex-start;
13
12
  }
14
13
 
15
- /* Linked eyebrow → pill with a stretched link (chrome is skin). */
16
- .rf-steps__eyebrow:has(a) {
17
- display: inline-block;
18
- position: relative;
19
- }
20
- .rf-steps__eyebrow:has(a) a::before {
21
- content: "";
22
- position: absolute;
23
- inset: 0;
24
- }
25
-
26
14
  .rf-steps ol {
27
15
  list-style: none;
28
16
  }
@@ -1,19 +1,9 @@
1
- /* tabs — structure. The eyebrow stretched-link, the scrollable tab strip (display
1
+ /* tabs — structure. The scrollable tab strip (display
2
2
  * + overflow), and the tab-button flex. The strip's `display: flex` is what
3
3
  * guest-posture's hide rule overrides — now both skeleton, resolved by specificity.
4
4
  * Type, colour, borders, spacing, and the active treatment are skin (Lumina's
5
5
  * styles/runes/tabs.css). */
6
6
 
7
- .rf-tabs__eyebrow:has(a) {
8
- display: inline-block;
9
- position: relative;
10
- }
11
- .rf-tabs__eyebrow:has(a) a::before {
12
- content: "";
13
- position: absolute;
14
- inset: 0;
15
- }
16
-
17
7
  /* Tab bar — the scrollable strip. */
18
8
  .rf-tabs__tabs {
19
9
  display: flex;
@@ -1,12 +0,0 @@
1
- /* page-section — structure. The split two-column grid (+ mobile collapse). Padding,
2
- * heading resets, and the gap are skin. */
3
- .rf-page-section--split {
4
- display: grid;
5
- grid-template-columns: 1fr 1fr;
6
- align-items: start;
7
- }
8
- @media (max-width: 768px) {
9
- .rf-page-section--split {
10
- grid-template-columns: 1fr;
11
- }
12
- }