@refrakt-md/skeleton 0.22.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/README.md +41 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/index.css +145 -0
- package/package.json +37 -0
- package/styles/dimensions/checklist.css +43 -0
- package/styles/dimensions/cover.css +91 -0
- package/styles/dimensions/guest-posture.css +19 -0
- package/styles/dimensions/media.css +38 -0
- package/styles/dimensions/metadata.css +66 -0
- package/styles/dimensions/sections.css +22 -0
- package/styles/dimensions/sequence.css +109 -0
- package/styles/dimensions/state.css +28 -0
- package/styles/global.css +37 -0
- package/styles/layouts/blog.css +38 -0
- package/styles/layouts/default.css +51 -0
- package/styles/layouts/docs.css +82 -0
- package/styles/layouts/mobile.css +39 -0
- package/styles/layouts/on-this-page.css +4 -0
- package/styles/layouts/plan.css +103 -0
- package/styles/layouts/search.css +80 -0
- package/styles/layouts/split.css +127 -0
- package/styles/layouts/theme-toggle.css +26 -0
- package/styles/layouts/version-switcher.css +10 -0
- package/styles/runes/accordion.css +55 -0
- package/styles/runes/aggregate.css +13 -0
- package/styles/runes/annotate.css +55 -0
- package/styles/runes/audio.css +70 -0
- package/styles/runes/bento.css +118 -0
- package/styles/runes/bg.css +29 -0
- package/styles/runes/blog.css +13 -0
- package/styles/runes/bond.css +36 -0
- package/styles/runes/breadcrumb.css +16 -0
- package/styles/runes/budget.css +42 -0
- package/styles/runes/card.css +37 -0
- package/styles/runes/cast.css +33 -0
- package/styles/runes/changelog.css +9 -0
- package/styles/runes/character.css +22 -0
- package/styles/runes/chart.css +32 -0
- package/styles/runes/codegroup.css +25 -0
- package/styles/runes/collection.css +51 -0
- package/styles/runes/compare.css +19 -0
- package/styles/runes/comparison.css +54 -0
- package/styles/runes/conversation.css +29 -0
- package/styles/runes/cta.css +46 -0
- package/styles/runes/datatable.css +16 -0
- package/styles/runes/design-context.css +6 -0
- package/styles/runes/details.css +19 -0
- package/styles/runes/diagram.css +17 -0
- package/styles/runes/diff.css +40 -0
- package/styles/runes/drawer.css +118 -0
- package/styles/runes/embed.css +20 -0
- package/styles/runes/event.css +5 -0
- package/styles/runes/expand.css +7 -0
- package/styles/runes/faction.css +13 -0
- package/styles/runes/feature.css +56 -0
- package/styles/runes/figure.css +23 -0
- package/styles/runes/file-ref.css +2 -0
- package/styles/runes/form.css +55 -0
- package/styles/runes/gallery.css +128 -0
- package/styles/runes/grid.css +62 -0
- package/styles/runes/hero.css +130 -0
- package/styles/runes/hint.css +28 -0
- package/styles/runes/howto.css +35 -0
- package/styles/runes/itinerary.css +41 -0
- package/styles/runes/juxtapose.css +61 -0
- package/styles/runes/lore.css +12 -0
- package/styles/runes/map.css +45 -0
- package/styles/runes/mediatext.css +37 -0
- package/styles/runes/milestone.css +31 -0
- package/styles/runes/mockup.css +144 -0
- package/styles/runes/nav.css +258 -0
- package/styles/runes/organization.css +6 -0
- package/styles/runes/page-section.css +12 -0
- package/styles/runes/pagination.css +39 -0
- package/styles/runes/palette.css +33 -0
- package/styles/runes/placeholder.css +7 -0
- package/styles/runes/plan-history.css +38 -0
- package/styles/runes/plan-progress.css +10 -0
- package/styles/runes/playlist.css +61 -0
- package/styles/runes/plot.css +23 -0
- package/styles/runes/preview.css +45 -0
- package/styles/runes/pricing.css +40 -0
- package/styles/runes/progress.css +22 -0
- package/styles/runes/pullquote.css +39 -0
- package/styles/runes/realm.css +14 -0
- package/styles/runes/recipe.css +40 -0
- package/styles/runes/relationships.css +49 -0
- package/styles/runes/reveal.css +29 -0
- package/styles/runes/sandbox.css +30 -0
- package/styles/runes/section.css +36 -0
- package/styles/runes/showcase.css +12 -0
- package/styles/runes/spacing.css +45 -0
- package/styles/runes/steps.css +65 -0
- package/styles/runes/storyboard.css +22 -0
- package/styles/runes/swatch.css +12 -0
- package/styles/runes/symbol.css +8 -0
- package/styles/runes/tabs.css +28 -0
- package/styles/runes/testimonial.css +13 -0
- package/styles/runes/textblock.css +25 -0
- package/styles/runes/timeline.css +31 -0
- package/styles/runes/toc.css +10 -0
- package/styles/runes/track.css +55 -0
- package/styles/runes/typography.css +33 -0
- package/styles/runes/xref.css +5 -0
package/README.md
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# @refrakt-md/skeleton
|
|
2
|
+
|
|
3
|
+
The structural cascade layer and the layer-order contract every refrakt theme
|
|
4
|
+
builds on (SPEC-094 §3 — the skeleton/skin split).
|
|
5
|
+
|
|
6
|
+
```css
|
|
7
|
+
@import '@refrakt-md/skeleton'; /* must load first */
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
Importing this entry first emits the one line the whole split rests on:
|
|
11
|
+
|
|
12
|
+
```css
|
|
13
|
+
@layer skeleton, skin;
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Once the order is declared, layer **contents** may load in any source order or
|
|
17
|
+
from any package, and a theme's `@layer skin` still wins where it overlaps
|
|
18
|
+
`@layer skeleton` — with ordinary single-class / attribute selectors and **no
|
|
19
|
+
`!important`**.
|
|
20
|
+
|
|
21
|
+
## The two layers
|
|
22
|
+
|
|
23
|
+
- **`@layer skeleton`** (this package) — framework-agnostic *structure*: the
|
|
24
|
+
rules a rune breaks without (`display`/`grid`/`flex`/`position`/`overflow`, gap
|
|
25
|
+
& margin resets, the media↔content split geometry, the stretched-link
|
|
26
|
+
mechanism). References tokens by name; never sets their values, colour, border,
|
|
27
|
+
radius, shadow, or font.
|
|
28
|
+
- **`@layer skin`** (a theme, e.g. `@refrakt-md/lumina`) — aesthetics: colour,
|
|
29
|
+
background, border presence/style, radius, shadow, type, and the token
|
|
30
|
+
*values*.
|
|
31
|
+
|
|
32
|
+
## The token contract
|
|
33
|
+
|
|
34
|
+
The `./contract` entry re-exports the `TokenContract` type (the token **names** a
|
|
35
|
+
skin must populate) plus the layer-name constants. Values live in the skin; a
|
|
36
|
+
breaking structural change bumps *this* package's version, not a skin's.
|
|
37
|
+
|
|
38
|
+
```ts
|
|
39
|
+
import type { TokenContract } from '@refrakt-md/skeleton/contract';
|
|
40
|
+
import { LAYER_ORDER_DECLARATION } from '@refrakt-md/skeleton/contract';
|
|
41
|
+
```
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@refrakt-md/skeleton` — the structural cascade layer + the layer-order and
|
|
3
|
+
* token-name contracts every refrakt theme builds on.
|
|
4
|
+
*
|
|
5
|
+
* The CSS half (`@refrakt-md/skeleton` → `index.css`) ships `@layer skeleton` and
|
|
6
|
+
* the `@layer skeleton, skin;` order declaration. This module is the *contract*
|
|
7
|
+
* half: the token names a theme must populate (re-exported from
|
|
8
|
+
* `@refrakt-md/types`, so the contract has one definition) plus the layer-name
|
|
9
|
+
* constants the loader and tests reference.
|
|
10
|
+
*
|
|
11
|
+
* The contract describes names, never values — a skin supplies the values for
|
|
12
|
+
* these tokens, and a breaking structural change bumps *this* package's version
|
|
13
|
+
* (not any one skin's), which is why the contract is owned here rather than in a
|
|
14
|
+
* theme.
|
|
15
|
+
*/
|
|
16
|
+
export type { TokenContract } from '@refrakt-md/types';
|
|
17
|
+
/** The two cascade layers, in priority order (skin wins over skeleton). */
|
|
18
|
+
export declare const SKELETON_LAYER = "skeleton";
|
|
19
|
+
export declare const SKIN_LAYER = "skin";
|
|
20
|
+
/** The order declaration that must be emitted before any layer content. Importing
|
|
21
|
+
* `@refrakt-md/skeleton` (the CSS entry) emits this; the constant lets the loader
|
|
22
|
+
* and tests assert the contract without parsing the stylesheet. */
|
|
23
|
+
export declare const LAYER_ORDER_DECLARATION = "@layer skeleton, skin;";
|
|
24
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,2EAA2E;AAC3E,eAAO,MAAM,cAAc,aAAa,CAAC;AACzC,eAAO,MAAM,UAAU,SAAS,CAAC;AAEjC;;oEAEoE;AACpE,eAAO,MAAM,uBAAuB,2BAA6C,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@refrakt-md/skeleton` — the structural cascade layer + the layer-order and
|
|
3
|
+
* token-name contracts every refrakt theme builds on.
|
|
4
|
+
*
|
|
5
|
+
* The CSS half (`@refrakt-md/skeleton` → `index.css`) ships `@layer skeleton` and
|
|
6
|
+
* the `@layer skeleton, skin;` order declaration. This module is the *contract*
|
|
7
|
+
* half: the token names a theme must populate (re-exported from
|
|
8
|
+
* `@refrakt-md/types`, so the contract has one definition) plus the layer-name
|
|
9
|
+
* constants the loader and tests reference.
|
|
10
|
+
*
|
|
11
|
+
* The contract describes names, never values — a skin supplies the values for
|
|
12
|
+
* these tokens, and a breaking structural change bumps *this* package's version
|
|
13
|
+
* (not any one skin's), which is why the contract is owned here rather than in a
|
|
14
|
+
* theme.
|
|
15
|
+
*/
|
|
16
|
+
/** The two cascade layers, in priority order (skin wins over skeleton). */
|
|
17
|
+
export const SKELETON_LAYER = 'skeleton';
|
|
18
|
+
export const SKIN_LAYER = 'skin';
|
|
19
|
+
/** The order declaration that must be emitted before any layer content. Importing
|
|
20
|
+
* `@refrakt-md/skeleton` (the CSS entry) emits this; the constant lets the loader
|
|
21
|
+
* and tests assert the contract without parsing the stylesheet. */
|
|
22
|
+
export const LAYER_ORDER_DECLARATION = `@layer ${SKELETON_LAYER}, ${SKIN_LAYER};`;
|
|
23
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,2EAA2E;AAC3E,MAAM,CAAC,MAAM,cAAc,GAAG,UAAU,CAAC;AACzC,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC;AAEjC;;oEAEoE;AACpE,MAAM,CAAC,MAAM,uBAAuB,GAAG,UAAU,cAAc,KAAK,UAAU,GAAG,CAAC"}
|
package/index.css
ADDED
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/* @refrakt-md/skeleton — the cascade-layer contract every refrakt theme builds on.
|
|
2
|
+
*
|
|
3
|
+
* This single line is the keystone of the skeleton/skin split (SPEC-094 §3): it
|
|
4
|
+
* declares the layer order up front, so once it loads first, layer *contents* may
|
|
5
|
+
* arrive in any source order or from any package and a theme's `@layer skin` still
|
|
6
|
+
* wins where it overlaps `@layer skeleton` — with ordinary single-class/attribute
|
|
7
|
+
* selectors and zero `!important`. The SvelteKit loader's only obligation is to
|
|
8
|
+
* import this entry before any layer content (WORK-436 / WORK-410 §3).
|
|
9
|
+
*
|
|
10
|
+
* The `skeleton` layer is the framework-agnostic *structure* layer: the rules a
|
|
11
|
+
* rune breaks without — `display` / `grid-*` / `flex-*` / `position` / `inset` /
|
|
12
|
+
* `z-index` / `overflow`, gap and margin resets, the media↔content split geometry,
|
|
13
|
+
* the stretched-link mechanism. It references design tokens by name
|
|
14
|
+
* (`var(--rune-padding)`) but never sets their values, colour, border, radius,
|
|
15
|
+
* shadow, or font — those are skin. The per-file re-bucketing (WORK-438) moves
|
|
16
|
+
* Lumina's structure here group by group; each structure file is imported with
|
|
17
|
+
* `layer(skeleton)` so the raw files need no `@layer` wrapper of their own. */
|
|
18
|
+
@layer skeleton, skin;
|
|
19
|
+
|
|
20
|
+
/* Structure is promoted out of Lumina's @layer skin into @layer skeleton group by
|
|
21
|
+
* group (WORK-438, Phase 2), strictly bottom-up: the base layers first (global),
|
|
22
|
+
* then the dimension/layout layers, and only then the runes — because a rune's
|
|
23
|
+
* structural margins/gaps deliberately override the dimension and layout rules by
|
|
24
|
+
* source order, and that win only survives the layer split once those layers are
|
|
25
|
+
* also in @layer skeleton. (A skin rule beats any skeleton rule regardless of
|
|
26
|
+
* specificity, so promoting a rune ahead of the dimension it overrides hands the
|
|
27
|
+
* win to the still-skin dimension — e.g. sections.css `[data-section="header"]
|
|
28
|
+
* { margin-bottom: 3rem }` would beat a rune header's tighter margin.) */
|
|
29
|
+
|
|
30
|
+
/* ── Foundation ── */
|
|
31
|
+
@import './styles/global.css' layer(skeleton);
|
|
32
|
+
|
|
33
|
+
/* ── Dimension structure ── */
|
|
34
|
+
@import './styles/dimensions/state.css' layer(skeleton);
|
|
35
|
+
@import './styles/dimensions/media.css' layer(skeleton);
|
|
36
|
+
@import './styles/dimensions/cover.css' layer(skeleton);
|
|
37
|
+
@import './styles/dimensions/metadata.css' layer(skeleton);
|
|
38
|
+
@import './styles/dimensions/sections.css' layer(skeleton);
|
|
39
|
+
@import './styles/dimensions/checklist.css' layer(skeleton);
|
|
40
|
+
@import './styles/dimensions/sequence.css' layer(skeleton);
|
|
41
|
+
@import './styles/dimensions/guest-posture.css' layer(skeleton);
|
|
42
|
+
|
|
43
|
+
/* ── Layout structure ── */
|
|
44
|
+
@import './styles/layouts/split.css' layer(skeleton);
|
|
45
|
+
@import './styles/layouts/default.css' layer(skeleton);
|
|
46
|
+
@import './styles/layouts/docs.css' layer(skeleton);
|
|
47
|
+
@import './styles/layouts/blog.css' layer(skeleton);
|
|
48
|
+
@import './styles/layouts/mobile.css' layer(skeleton);
|
|
49
|
+
@import './styles/layouts/on-this-page.css' layer(skeleton);
|
|
50
|
+
@import './styles/layouts/search.css' layer(skeleton);
|
|
51
|
+
@import './styles/layouts/theme-toggle.css' layer(skeleton);
|
|
52
|
+
@import './styles/layouts/version-switcher.css' layer(skeleton);
|
|
53
|
+
@import './styles/layouts/plan.css' layer(skeleton);
|
|
54
|
+
|
|
55
|
+
/* ── Rune structure ── */
|
|
56
|
+
@import './styles/runes/card.css' layer(skeleton);
|
|
57
|
+
@import './styles/runes/hint.css' layer(skeleton);
|
|
58
|
+
@import './styles/runes/steps.css' layer(skeleton);
|
|
59
|
+
@import './styles/runes/pricing.css' layer(skeleton);
|
|
60
|
+
@import './styles/runes/cta.css' layer(skeleton);
|
|
61
|
+
@import './styles/runes/hero.css' layer(skeleton);
|
|
62
|
+
@import './styles/runes/feature.css' layer(skeleton);
|
|
63
|
+
@import './styles/runes/testimonial.css' layer(skeleton);
|
|
64
|
+
@import './styles/runes/bento.css' layer(skeleton);
|
|
65
|
+
@import './styles/runes/comparison.css' layer(skeleton);
|
|
66
|
+
@import './styles/runes/symbol.css' layer(skeleton);
|
|
67
|
+
@import './styles/runes/changelog.css' layer(skeleton);
|
|
68
|
+
@import './styles/runes/tabs.css' layer(skeleton);
|
|
69
|
+
@import './styles/runes/codegroup.css' layer(skeleton);
|
|
70
|
+
@import './styles/runes/accordion.css' layer(skeleton);
|
|
71
|
+
@import './styles/runes/details.css' layer(skeleton);
|
|
72
|
+
@import './styles/runes/breadcrumb.css' layer(skeleton);
|
|
73
|
+
@import './styles/runes/toc.css' layer(skeleton);
|
|
74
|
+
@import './styles/runes/pagination.css' layer(skeleton);
|
|
75
|
+
@import './styles/runes/reveal.css' layer(skeleton);
|
|
76
|
+
@import './styles/runes/expand.css' layer(skeleton);
|
|
77
|
+
@import './styles/runes/grid.css' layer(skeleton);
|
|
78
|
+
@import './styles/runes/figure.css' layer(skeleton);
|
|
79
|
+
@import './styles/runes/embed.css' layer(skeleton);
|
|
80
|
+
@import './styles/runes/collection.css' layer(skeleton);
|
|
81
|
+
@import './styles/runes/datatable.css' layer(skeleton);
|
|
82
|
+
@import './styles/runes/sandbox.css' layer(skeleton);
|
|
83
|
+
@import './styles/runes/conversation.css' layer(skeleton);
|
|
84
|
+
@import './styles/runes/progress.css' layer(skeleton);
|
|
85
|
+
@import './styles/runes/diagram.css' layer(skeleton);
|
|
86
|
+
@import './styles/runes/gallery.css' layer(skeleton);
|
|
87
|
+
@import './styles/runes/diff.css' layer(skeleton);
|
|
88
|
+
@import './styles/runes/chart.css' layer(skeleton);
|
|
89
|
+
@import './styles/runes/juxtapose.css' layer(skeleton);
|
|
90
|
+
@import './styles/runes/annotate.css' layer(skeleton);
|
|
91
|
+
@import './styles/runes/drawer.css' layer(skeleton);
|
|
92
|
+
@import './styles/runes/nav.css' layer(skeleton);
|
|
93
|
+
@import './styles/runes/mockup.css' layer(skeleton);
|
|
94
|
+
/* ── Plugin: storytelling ── */
|
|
95
|
+
@import './styles/runes/character.css' layer(skeleton);
|
|
96
|
+
@import './styles/runes/realm.css' layer(skeleton);
|
|
97
|
+
@import './styles/runes/faction.css' layer(skeleton);
|
|
98
|
+
@import './styles/runes/lore.css' layer(skeleton);
|
|
99
|
+
@import './styles/runes/plot.css' layer(skeleton);
|
|
100
|
+
@import './styles/runes/bond.css' layer(skeleton);
|
|
101
|
+
@import './styles/runes/storyboard.css' layer(skeleton);
|
|
102
|
+
|
|
103
|
+
/* ── Remaining core runes ── */
|
|
104
|
+
@import './styles/runes/aggregate.css' layer(skeleton);
|
|
105
|
+
@import './styles/runes/bg.css' layer(skeleton);
|
|
106
|
+
@import './styles/runes/blog.css' layer(skeleton);
|
|
107
|
+
@import './styles/runes/compare.css' layer(skeleton);
|
|
108
|
+
@import './styles/runes/file-ref.css' layer(skeleton);
|
|
109
|
+
@import './styles/runes/form.css' layer(skeleton);
|
|
110
|
+
@import './styles/runes/mediatext.css' layer(skeleton);
|
|
111
|
+
@import './styles/runes/page-section.css' layer(skeleton);
|
|
112
|
+
@import './styles/runes/placeholder.css' layer(skeleton);
|
|
113
|
+
@import './styles/runes/pullquote.css' layer(skeleton);
|
|
114
|
+
@import './styles/runes/relationships.css' layer(skeleton);
|
|
115
|
+
@import './styles/runes/section.css' layer(skeleton);
|
|
116
|
+
@import './styles/runes/showcase.css' layer(skeleton);
|
|
117
|
+
@import './styles/runes/textblock.css' layer(skeleton);
|
|
118
|
+
@import './styles/runes/xref.css' layer(skeleton);
|
|
119
|
+
/* ── Plugin: business ── */
|
|
120
|
+
@import './styles/runes/cast.css' layer(skeleton);
|
|
121
|
+
@import './styles/runes/organization.css' layer(skeleton);
|
|
122
|
+
@import './styles/runes/timeline.css' layer(skeleton);
|
|
123
|
+
@import './styles/runes/budget.css' layer(skeleton);
|
|
124
|
+
/* ── Plugin: places ── */
|
|
125
|
+
@import './styles/runes/event.css' layer(skeleton);
|
|
126
|
+
@import './styles/runes/map.css' layer(skeleton);
|
|
127
|
+
@import './styles/runes/itinerary.css' layer(skeleton);
|
|
128
|
+
/* ── Plugin: media ── */
|
|
129
|
+
@import './styles/runes/playlist.css' layer(skeleton);
|
|
130
|
+
@import './styles/runes/track.css' layer(skeleton);
|
|
131
|
+
@import './styles/runes/audio.css' layer(skeleton);
|
|
132
|
+
/* ── Plugin: learning ── */
|
|
133
|
+
@import './styles/runes/howto.css' layer(skeleton);
|
|
134
|
+
@import './styles/runes/recipe.css' layer(skeleton);
|
|
135
|
+
/* ── Plugin: design ── */
|
|
136
|
+
@import './styles/runes/swatch.css' layer(skeleton);
|
|
137
|
+
@import './styles/runes/palette.css' layer(skeleton);
|
|
138
|
+
@import './styles/runes/typography.css' layer(skeleton);
|
|
139
|
+
@import './styles/runes/spacing.css' layer(skeleton);
|
|
140
|
+
@import './styles/runes/design-context.css' layer(skeleton);
|
|
141
|
+
@import './styles/runes/preview.css' layer(skeleton);
|
|
142
|
+
/* ── Plugin: plan ── */
|
|
143
|
+
@import './styles/runes/plan-progress.css' layer(skeleton);
|
|
144
|
+
@import './styles/runes/milestone.css' layer(skeleton);
|
|
145
|
+
@import './styles/runes/plan-history.css' layer(skeleton);
|
package/package.json
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@refrakt-md/skeleton",
|
|
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.22.0",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/refrakt-md/refrakt.git",
|
|
10
|
+
"directory": "packages/skeleton"
|
|
11
|
+
},
|
|
12
|
+
"bugs": "https://github.com/refrakt-md/refrakt/issues",
|
|
13
|
+
"homepage": "https://github.com/refrakt-md/refrakt",
|
|
14
|
+
"publishConfig": {
|
|
15
|
+
"access": "public"
|
|
16
|
+
},
|
|
17
|
+
"main": "dist/index.js",
|
|
18
|
+
"types": "dist/index.d.ts",
|
|
19
|
+
"exports": {
|
|
20
|
+
".": "./index.css",
|
|
21
|
+
"./contract": {
|
|
22
|
+
"types": "./dist/index.d.ts",
|
|
23
|
+
"default": "./dist/index.js"
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
"files": [
|
|
27
|
+
"dist",
|
|
28
|
+
"index.css",
|
|
29
|
+
"styles"
|
|
30
|
+
],
|
|
31
|
+
"dependencies": {
|
|
32
|
+
"@refrakt-md/types": "0.22.0"
|
|
33
|
+
},
|
|
34
|
+
"scripts": {
|
|
35
|
+
"build": "tsc"
|
|
36
|
+
}
|
|
37
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/* checklist — structure. The indicator gutter, the indicator box placement + size,
|
|
2
|
+
* and the density-driven gutter/size/collapse. The indicator's fill / border /
|
|
3
|
+
* radius / shadow and the item text treatment (colour, weight, strikethrough) are
|
|
4
|
+
* skin (Lumina's dimensions/checklist.css). [data-checked] is uncontested by
|
|
5
|
+
* layouts and sections, so the split is behavior-preserving. */
|
|
6
|
+
|
|
7
|
+
/* All checklist items get left padding for the indicator. */
|
|
8
|
+
[data-checked] {
|
|
9
|
+
position: relative;
|
|
10
|
+
padding-left: 1.75rem;
|
|
11
|
+
list-style: none;
|
|
12
|
+
margin-left: -1.5rem;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/* Indicator base — positioned left of text (the box; its chrome is skin). */
|
|
16
|
+
[data-checked]::before {
|
|
17
|
+
content: '';
|
|
18
|
+
position: absolute;
|
|
19
|
+
left: 0.125rem;
|
|
20
|
+
top: 0.5em;
|
|
21
|
+
width: 1rem;
|
|
22
|
+
height: 1rem;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/* === Density interaction === */
|
|
26
|
+
|
|
27
|
+
/* Compact: tighter gutter + smaller indicator. */
|
|
28
|
+
[data-density="compact"] [data-checked] {
|
|
29
|
+
padding-left: 1.5rem;
|
|
30
|
+
}
|
|
31
|
+
[data-density="compact"] [data-checked]::before {
|
|
32
|
+
width: 0.75rem;
|
|
33
|
+
height: 0.75rem;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/* Minimal: indicators only, no text. */
|
|
37
|
+
[data-density="minimal"] [data-checked] {
|
|
38
|
+
font-size: 0;
|
|
39
|
+
padding-left: 0;
|
|
40
|
+
display: inline-block;
|
|
41
|
+
width: 1rem;
|
|
42
|
+
height: 1rem;
|
|
43
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/* cover — structure (SPEC-089). The grid-overlay layout: the media well and the
|
|
2
|
+
* content box share one grid cell, the well fills and crops its guest, and the
|
|
3
|
+
* overlaid box positions over it (content-place). Mutually exclusive with the
|
|
4
|
+
* media|content split (media-position=cover vs start/end/top/bottom), so it never
|
|
5
|
+
* contends with layouts/split.css. The scrim, radii, and the overlay's surface
|
|
6
|
+
* padding are skin (Lumina's dimensions/cover.css). */
|
|
7
|
+
|
|
8
|
+
/* ── full scope — the whole content overlays the media well ── */
|
|
9
|
+
[data-media-position="cover"]:not([data-cover-scope="header"]) {
|
|
10
|
+
display: grid;
|
|
11
|
+
grid-template: minmax(0, 1fr) / minmax(0, 1fr);
|
|
12
|
+
aspect-ratio: var(--frame-aspect, var(--cover-aspect, 3 / 4));
|
|
13
|
+
container-type: size;
|
|
14
|
+
overflow: hidden;
|
|
15
|
+
isolation: isolate;
|
|
16
|
+
}
|
|
17
|
+
[data-media-position="cover"]:not([data-cover-scope="header"]) > [data-section="media"],
|
|
18
|
+
[data-media-position="cover"]:not([data-cover-scope="header"]) > [data-name="content"] {
|
|
19
|
+
grid-area: 1 / 1;
|
|
20
|
+
margin: 0;
|
|
21
|
+
min-width: 0;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/* ── header scope — only the cover band overlays; body flows below ── */
|
|
25
|
+
[data-cover-scope="header"] > [data-name="cover-band"] {
|
|
26
|
+
display: grid;
|
|
27
|
+
grid-template: minmax(0, 1fr) / minmax(0, 1fr);
|
|
28
|
+
aspect-ratio: var(--frame-aspect, 16 / 9);
|
|
29
|
+
overflow: hidden;
|
|
30
|
+
isolation: isolate;
|
|
31
|
+
container-type: size;
|
|
32
|
+
}
|
|
33
|
+
/* On narrow screens a 16/9 band is too short to seat the preamble over the
|
|
34
|
+
* scrim, so default it to a taller (≥1:1) poster shape; explicit frame-aspect
|
|
35
|
+
* still wins. */
|
|
36
|
+
@media (max-width: 40rem) {
|
|
37
|
+
[data-cover-scope="header"] > [data-name="cover-band"] {
|
|
38
|
+
aspect-ratio: var(--frame-aspect, 4 / 5);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
[data-cover-scope="header"] > [data-name="cover-band"] > [data-section="media"],
|
|
42
|
+
[data-cover-scope="header"] > [data-name="cover-band"] > [data-name="preamble"] {
|
|
43
|
+
grid-area: 1 / 1;
|
|
44
|
+
margin: 0;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/* ── shared: the media well fills, the overlaid box positions ── */
|
|
48
|
+
[data-media-position="cover"] [data-section="media"] {
|
|
49
|
+
position: relative;
|
|
50
|
+
height: 100%;
|
|
51
|
+
overflow: hidden;
|
|
52
|
+
}
|
|
53
|
+
[data-media-position="cover"] [data-section="media"] > :is(img, video) {
|
|
54
|
+
width: 100%;
|
|
55
|
+
height: 100%;
|
|
56
|
+
object-fit: cover;
|
|
57
|
+
}
|
|
58
|
+
/* SPEC-101 — non-img/video guests (a sandbox, an embed) fill the well too. */
|
|
59
|
+
[data-media-position="cover"] [data-section="media"] > :not(img, video) {
|
|
60
|
+
display: block;
|
|
61
|
+
width: 100%;
|
|
62
|
+
height: 100%;
|
|
63
|
+
}
|
|
64
|
+
[data-media-position="cover"] [data-section="media"] .rf-sandbox {
|
|
65
|
+
margin: 0;
|
|
66
|
+
}
|
|
67
|
+
[data-media-position="cover"] [data-section="media"] .rf-sandbox iframe {
|
|
68
|
+
height: 100%;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/* The overlaid box (full: content; header: preamble) anchors via content-place. */
|
|
72
|
+
[data-media-position="cover"]:not([data-cover-scope="header"]) > [data-name="content"],
|
|
73
|
+
[data-cover-scope="header"] > [data-name="cover-band"] > [data-name="preamble"] {
|
|
74
|
+
position: relative;
|
|
75
|
+
z-index: 1;
|
|
76
|
+
align-self: var(--cover-place-block, end);
|
|
77
|
+
justify-self: var(--cover-place-inline, stretch);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/* ── auto / unset placement — adapts to the cover region's orientation ── */
|
|
81
|
+
[data-media-position="cover"]:not([data-cover-scope="header"]):is([data-content-place="auto"], :not([data-content-place])) > [data-name="content"],
|
|
82
|
+
[data-cover-scope="header"]:is([data-content-place="auto"], :not([data-content-place])) > [data-name="cover-band"] > [data-name="preamble"] {
|
|
83
|
+
align-self: end;
|
|
84
|
+
justify-self: stretch;
|
|
85
|
+
}
|
|
86
|
+
@container (min-aspect-ratio: 1 / 1) {
|
|
87
|
+
[data-media-position="cover"]:not([data-cover-scope="header"]):is([data-content-place="auto"], :not([data-content-place])) > [data-name="content"] {
|
|
88
|
+
align-self: center;
|
|
89
|
+
justify-self: start;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/* Media-guest interaction posture (SPEC-090) — structure.
|
|
2
|
+
*
|
|
3
|
+
* A presentational media-slot guest is non-interactive at the pointer level (so a
|
|
4
|
+
* linked tile links reliably / a cover backdrop never steals interaction), and a
|
|
5
|
+
* demoted tabbed guest's static tab strip is hidden (the non-enhanced render is
|
|
6
|
+
* the fallback; the behaviours layer skips JS enhancement for it).
|
|
7
|
+
*
|
|
8
|
+
* This is wholly structural (pointer-events + a display reset), so it lives in the
|
|
9
|
+
* skeleton. It moves here only now that the tabs/codegroup tab-strip structure is
|
|
10
|
+
* also skeleton (same WORK-438 increment): the hide rule's specificity (0,3,0)
|
|
11
|
+
* beats `.rf-tabs__tabs { display:flex }` (0,1,0) in-layer. While the rune strip
|
|
12
|
+
* was unlayered/skin and this was skin, it relied on source order + specificity;
|
|
13
|
+
* promoting it earlier would have resurfaced the inert strip. */
|
|
14
|
+
[data-section="media"][data-guest-posture="presentational"] {
|
|
15
|
+
pointer-events: none;
|
|
16
|
+
}
|
|
17
|
+
[data-section="media"][data-guest-posture="presentational"] :is(.rf-tabs__tabs, .rf-codegroup__tabs) {
|
|
18
|
+
display: none;
|
|
19
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/* Media Slots Dimension — structure layer.
|
|
2
|
+
* Slot sizing and fit (the geometry a media slot breaks without); the rounded
|
|
3
|
+
* corners are skin. */
|
|
4
|
+
|
|
5
|
+
[data-media="portrait"] {
|
|
6
|
+
aspect-ratio: 1 / 1;
|
|
7
|
+
object-fit: cover;
|
|
8
|
+
width: var(--media-portrait-size, 5rem);
|
|
9
|
+
height: var(--media-portrait-size, 5rem);
|
|
10
|
+
}
|
|
11
|
+
[data-media="cover"] {
|
|
12
|
+
width: 100%;
|
|
13
|
+
object-fit: cover;
|
|
14
|
+
}
|
|
15
|
+
[data-media="thumbnail"] {
|
|
16
|
+
width: var(--media-thumbnail-size, 3rem);
|
|
17
|
+
height: var(--media-thumbnail-size, 3rem);
|
|
18
|
+
object-fit: cover;
|
|
19
|
+
flex-shrink: 0;
|
|
20
|
+
}
|
|
21
|
+
[data-media="hero"] {
|
|
22
|
+
width: 100%;
|
|
23
|
+
object-fit: cover;
|
|
24
|
+
}
|
|
25
|
+
[data-media="icon"] {
|
|
26
|
+
width: var(--media-icon-size, 2rem);
|
|
27
|
+
height: var(--media-icon-size, 2rem);
|
|
28
|
+
object-fit: contain;
|
|
29
|
+
flex-shrink: 0;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/* Density × media — sizing + visibility */
|
|
33
|
+
[data-density="compact"] [data-media="portrait"] {
|
|
34
|
+
--media-portrait-size: 3rem;
|
|
35
|
+
}
|
|
36
|
+
[data-density="minimal"] [data-media] {
|
|
37
|
+
display: none;
|
|
38
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/* metadata — structure. The zone-layout primitives (bar, definition-list) and the
|
|
2
|
+
* visually-hidden label mechanism. [data-zone-layout] is layout-uncontested (no
|
|
3
|
+
* layout file targets it), and a rune overriding these resolves correctly (skin
|
|
4
|
+
* beats skeleton). Spacing values (gap / padding / rhythm margins), borders,
|
|
5
|
+
* radius, colour, type, and the rating glyph stay skin (Lumina's
|
|
6
|
+
* dimensions/metadata.css). */
|
|
7
|
+
|
|
8
|
+
/* Rating — star-row is an inline flex row (the glyph + colours are skin). */
|
|
9
|
+
[data-meta-type="rating"] { display: inline-flex; }
|
|
10
|
+
|
|
11
|
+
/* ── Layout: bar (SPEC-080) ──
|
|
12
|
+
* Horizontal flex row of fields; wraps by default (`data-wrap="false"` keeps it
|
|
13
|
+
* on one line); a field tagged `data-align="end"` (and everything after it) is
|
|
14
|
+
* pushed to the right edge. */
|
|
15
|
+
[data-zone-layout="bar"] {
|
|
16
|
+
display: flex;
|
|
17
|
+
flex-wrap: wrap;
|
|
18
|
+
align-items: center;
|
|
19
|
+
}
|
|
20
|
+
[data-zone-layout="bar"][data-wrap="false"] { flex-wrap: nowrap; }
|
|
21
|
+
[data-zone-layout="bar"] [data-align="end"] { margin-left: auto; }
|
|
22
|
+
|
|
23
|
+
/* ── Layout: definition-list ──
|
|
24
|
+
* Each row stacks dt over dd; rows flow into auto-fit columns that collapse to a
|
|
25
|
+
* single column on narrow containers without a media-query step. */
|
|
26
|
+
[data-zone-layout="definition-list"] {
|
|
27
|
+
display: grid;
|
|
28
|
+
grid-template-columns: repeat(auto-fit, minmax(8rem, 1fr));
|
|
29
|
+
}
|
|
30
|
+
[data-zone-layout="definition-list"] > [data-name="row"] {
|
|
31
|
+
display: flex;
|
|
32
|
+
flex-direction: column;
|
|
33
|
+
min-width: 0;
|
|
34
|
+
}
|
|
35
|
+
[data-zone-layout="definition-list"] dd { margin: 0; }
|
|
36
|
+
/* Multi-value dd (fields with `splitOn`) renders a row of chips inside the cell. */
|
|
37
|
+
[data-zone-layout="definition-list"] dd[data-multi-value] {
|
|
38
|
+
display: flex;
|
|
39
|
+
flex-wrap: wrap;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/* Visually hidden labels — accessible to screen readers only (the sr-only clip
|
|
43
|
+
* mechanism; the box collapse + clip are correctness, not taste). */
|
|
44
|
+
[data-meta-label-hidden] {
|
|
45
|
+
position: absolute;
|
|
46
|
+
width: 1px;
|
|
47
|
+
height: 1px;
|
|
48
|
+
padding: 0;
|
|
49
|
+
margin: -1px;
|
|
50
|
+
overflow: hidden;
|
|
51
|
+
clip: rect(0, 0, 0, 0);
|
|
52
|
+
white-space: nowrap;
|
|
53
|
+
border: 0;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/* ── Mobile: definition-list falls back to a label-left / value-right grid via
|
|
57
|
+
* `display: contents` on each row (drops the per-item box). ── */
|
|
58
|
+
@media (max-width: 48rem) {
|
|
59
|
+
[data-zone-layout="definition-list"] {
|
|
60
|
+
grid-template-columns: max-content 1fr;
|
|
61
|
+
align-items: baseline;
|
|
62
|
+
}
|
|
63
|
+
[data-zone-layout="definition-list"] > [data-name="row"] {
|
|
64
|
+
display: contents;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/* sections — structure. The zone containers that are flex layouts: the header
|
|
2
|
+
* chrome row, the preamble stack, the footer action row. The zone rhythm (margins,
|
|
3
|
+
* gaps, padding), type, borders, and the media-zone margin reset are skin (Lumina's
|
|
4
|
+
* dimensions/sections.css) — kept there so a rune's own zone overrides resolve
|
|
5
|
+
* against them by source order, and so the header→body rhythm a rune tightens
|
|
6
|
+
* (e.g. hint) stays a same-layer contest. */
|
|
7
|
+
|
|
8
|
+
[data-section="header"] {
|
|
9
|
+
display: flex;
|
|
10
|
+
flex-wrap: wrap;
|
|
11
|
+
align-items: center;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
[data-section="preamble"] {
|
|
15
|
+
display: flex;
|
|
16
|
+
flex-direction: column;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
[data-section="footer"] {
|
|
20
|
+
display: flex;
|
|
21
|
+
flex-wrap: wrap;
|
|
22
|
+
}
|