@refrakt-md/lumina 0.25.1 → 0.26.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/reading.css';
33
34
  @import './styles/dimensions/state.css';
34
35
  @import './styles/dimensions/media.css';
35
36
  @import './styles/dimensions/surfaces.css';
@@ -913,11 +913,6 @@
913
913
  "{content}"
914
914
  ],
915
915
  "modifiers": {
916
- "dropcap": {
917
- "source": "meta",
918
- "classPattern": ".rf-textblock--{value}",
919
- "dataAttribute": "data-dropcap"
920
- },
921
916
  "columns": {
922
917
  "source": "meta",
923
918
  "classPattern": ".rf-textblock--{value}",
@@ -1636,6 +1631,14 @@
1636
1631
  "default": "bottom",
1637
1632
  "dataAttribute": "data-media-position"
1638
1633
  },
1634
+ "layout": {
1635
+ "source": "meta",
1636
+ "dataAttribute": "data-layout"
1637
+ },
1638
+ "collapse-to": {
1639
+ "source": "meta",
1640
+ "dataAttribute": "data-collapse-to"
1641
+ },
1639
1642
  "align": {
1640
1643
  "source": "meta",
1641
1644
  "default": "center",
@@ -1691,9 +1694,9 @@
1691
1694
  "selector": ".rf-feature__image",
1692
1695
  "source": "autoLabel"
1693
1696
  },
1694
- "definitions": {
1697
+ "items": {
1695
1698
  "tag": "dl",
1696
- "selector": ".rf-feature__definitions",
1699
+ "selector": ".rf-feature__items",
1697
1700
  "source": "autoLabel"
1698
1701
  }
1699
1702
  },
@@ -1701,182 +1704,6 @@
1701
1704
  "valign": {
1702
1705
  "prop": "--split-valign"
1703
1706
  }
1704
- },
1705
- "variants": {
1706
- "media-position": {
1707
- "top": {
1708
- "block": "feature",
1709
- "root": ".rf-feature",
1710
- "dataRune": "feature",
1711
- "childOrder": [
1712
- "{content}"
1713
- ],
1714
- "modifiers": {
1715
- "media-position": {
1716
- "source": "meta",
1717
- "default": "bottom",
1718
- "dataAttribute": "data-media-position"
1719
- },
1720
- "align": {
1721
- "source": "meta",
1722
- "default": "center",
1723
- "classPattern": ".rf-feature--{value}",
1724
- "dataAttribute": "data-align"
1725
- },
1726
- "media-ratio": {
1727
- "source": "meta",
1728
- "dataAttribute": "data-media-ratio"
1729
- },
1730
- "valign": {
1731
- "source": "meta",
1732
- "dataAttribute": "data-valign"
1733
- },
1734
- "collapse": {
1735
- "source": "meta",
1736
- "dataAttribute": "data-collapse"
1737
- }
1738
- },
1739
- "contextModifiers": {
1740
- "hero": {
1741
- "suffix": "in-hero",
1742
- "selector": ".rf-feature--in-hero"
1743
- },
1744
- "grid": {
1745
- "suffix": "in-grid",
1746
- "selector": ".rf-feature--in-grid"
1747
- }
1748
- },
1749
- "staticModifiers": [
1750
- {
1751
- "name": "definitions-grid",
1752
- "selector": ".rf-feature--definitions-grid"
1753
- }
1754
- ],
1755
- "elements": {
1756
- "preamble": {
1757
- "tag": "header",
1758
- "selector": ".rf-feature__preamble",
1759
- "source": "autoLabel"
1760
- },
1761
- "eyebrow": {
1762
- "tag": "eyebrow",
1763
- "selector": ".rf-feature__eyebrow",
1764
- "source": "autoLabel"
1765
- },
1766
- "headline": {
1767
- "tag": "headline",
1768
- "selector": ".rf-feature__headline",
1769
- "source": "autoLabel"
1770
- },
1771
- "blurb": {
1772
- "tag": "blurb",
1773
- "selector": ".rf-feature__blurb",
1774
- "source": "autoLabel"
1775
- },
1776
- "image": {
1777
- "tag": "image",
1778
- "selector": ".rf-feature__image",
1779
- "source": "autoLabel"
1780
- },
1781
- "definitions": {
1782
- "tag": "dl",
1783
- "selector": ".rf-feature__definitions",
1784
- "source": "autoLabel"
1785
- }
1786
- },
1787
- "inlineStyles": {
1788
- "valign": {
1789
- "prop": "--split-valign"
1790
- }
1791
- }
1792
- },
1793
- "bottom": {
1794
- "block": "feature",
1795
- "root": ".rf-feature",
1796
- "dataRune": "feature",
1797
- "childOrder": [
1798
- "{content}"
1799
- ],
1800
- "modifiers": {
1801
- "media-position": {
1802
- "source": "meta",
1803
- "default": "bottom",
1804
- "dataAttribute": "data-media-position"
1805
- },
1806
- "align": {
1807
- "source": "meta",
1808
- "default": "center",
1809
- "classPattern": ".rf-feature--{value}",
1810
- "dataAttribute": "data-align"
1811
- },
1812
- "media-ratio": {
1813
- "source": "meta",
1814
- "dataAttribute": "data-media-ratio"
1815
- },
1816
- "valign": {
1817
- "source": "meta",
1818
- "dataAttribute": "data-valign"
1819
- },
1820
- "collapse": {
1821
- "source": "meta",
1822
- "dataAttribute": "data-collapse"
1823
- }
1824
- },
1825
- "contextModifiers": {
1826
- "hero": {
1827
- "suffix": "in-hero",
1828
- "selector": ".rf-feature--in-hero"
1829
- },
1830
- "grid": {
1831
- "suffix": "in-grid",
1832
- "selector": ".rf-feature--in-grid"
1833
- }
1834
- },
1835
- "staticModifiers": [
1836
- {
1837
- "name": "definitions-grid",
1838
- "selector": ".rf-feature--definitions-grid"
1839
- }
1840
- ],
1841
- "elements": {
1842
- "preamble": {
1843
- "tag": "header",
1844
- "selector": ".rf-feature__preamble",
1845
- "source": "autoLabel"
1846
- },
1847
- "eyebrow": {
1848
- "tag": "eyebrow",
1849
- "selector": ".rf-feature__eyebrow",
1850
- "source": "autoLabel"
1851
- },
1852
- "headline": {
1853
- "tag": "headline",
1854
- "selector": ".rf-feature__headline",
1855
- "source": "autoLabel"
1856
- },
1857
- "blurb": {
1858
- "tag": "blurb",
1859
- "selector": ".rf-feature__blurb",
1860
- "source": "autoLabel"
1861
- },
1862
- "image": {
1863
- "tag": "image",
1864
- "selector": ".rf-feature__image",
1865
- "source": "autoLabel"
1866
- },
1867
- "definitions": {
1868
- "tag": "dl",
1869
- "selector": ".rf-feature__definitions",
1870
- "source": "autoLabel"
1871
- }
1872
- },
1873
- "inlineStyles": {
1874
- "valign": {
1875
- "prop": "--split-valign"
1876
- }
1877
- }
1878
- }
1879
- }
1880
1707
  }
1881
1708
  },
1882
1709
  "Definition": {
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/reading.css';
41
42
  @import './styles/dimensions/state.css';
42
43
  @import './styles/dimensions/media.css';
43
44
  @import './styles/dimensions/surfaces.css';
@@ -92,6 +93,7 @@
92
93
  @import './styles/runes/figure.css';
93
94
  @import './styles/runes/placeholder.css';
94
95
  @import './styles/runes/gallery.css';
96
+ @import './styles/runes/carousel.css';
95
97
  @import './styles/runes/form.css';
96
98
  @import './styles/runes/grid.css';
97
99
  @import './styles/runes/hero.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.25.1",
4
+ "version": "0.26.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.25.1",
90
- "@refrakt-md/skeleton": "0.25.1",
91
- "@refrakt-md/transform": "0.25.1",
92
- "@refrakt-md/types": "0.25.1"
89
+ "@refrakt-md/runes": "0.26.0",
90
+ "@refrakt-md/skeleton": "0.26.0",
91
+ "@refrakt-md/transform": "0.26.0",
92
+ "@refrakt-md/types": "0.26.0"
93
93
  },
94
94
  "devDependencies": {
95
95
  "postcss": "^8.4.0"
@@ -0,0 +1,35 @@
1
+ @layer skin {
2
+ /* Reading register (SPEC-108) — Lumina's editorial treatment of `[data-reading]`.
3
+ * The measure cap + niceties are structural (skeleton); this is the type, rhythm,
4
+ * and drop-cap glyph. `ui` (the default) is left to the base body styling. */
5
+
6
+ /* Prose — long-form reading. */
7
+ [data-reading="prose"] {
8
+ line-height: var(--rf-leading-relaxed);
9
+ }
10
+ [data-reading="prose"] > p {
11
+ margin-bottom: 1em;
12
+ }
13
+ [data-reading="prose"] a {
14
+ text-underline-offset: 0.15em;
15
+ }
16
+
17
+ /* Drop-cap glyph — the theme owns the treatment; the author owns where (the
18
+ * `dropcap` opt-in, honoured only on a prose body). */
19
+ [data-reading="prose"][data-dropcap] > p:first-child::first-letter {
20
+ font-size: 3.5em;
21
+ font-weight: var(--rf-weight-bold);
22
+ line-height: 0.8;
23
+ padding-right: 0.1em;
24
+ margin-top: 0.05em;
25
+ color: var(--rf-color-primary);
26
+ font-family: Georgia, 'Times New Roman', serif;
27
+ }
28
+
29
+ /* Fine print — captions, footnotes, asides: smaller and quieter. */
30
+ [data-reading="fine"] {
31
+ font-size: var(--rf-text-sm);
32
+ line-height: var(--rf-leading-normal);
33
+ color: var(--rf-color-muted);
34
+ }
35
+ }
@@ -0,0 +1,18 @@
1
+ @layer skin {
2
+ /* Carousel — shared nav chrome (SPEC-100). The track structure + nav positioning
3
+ * are skeleton (styles/runes/carousel.css); this is the skin (colour/shape). */
4
+ .rf-carousel__nav {
5
+ border-radius: 50%;
6
+ border: none;
7
+ background: var(--rf-color-surface);
8
+ color: var(--rf-color-text);
9
+ box-shadow: var(--rf-shadow-md);
10
+ cursor: pointer;
11
+ font-size: var(--rf-text-xl);
12
+ opacity: 0.8;
13
+ transition: opacity 0.2s;
14
+ }
15
+ .rf-carousel__nav:hover {
16
+ opacity: 1;
17
+ }
18
+ }
@@ -2,18 +2,18 @@
2
2
  /* Cast */
3
3
 
4
4
  /* Members list — base */
5
- .rf-cast__members {
5
+ .rf-cast__items {
6
6
  padding: 0;
7
7
  margin: 0;
8
8
  }
9
9
 
10
10
  /* Grid layout (default) */
11
- .rf-cast--grid .rf-cast__members {
11
+ .rf-cast--grid .rf-cast__items {
12
12
  gap: 1rem;
13
13
  }
14
14
 
15
15
  /* List layout */
16
- .rf-cast--list .rf-cast__members {
16
+ .rf-cast--list .rf-cast__items {
17
17
  gap: 0.75rem;
18
18
  }
19
19
 
@@ -1,6 +1,7 @@
1
1
  @layer skin {
2
- /* Feature — skin. The preamble/eyebrow/content/definitions-grid/icon layout and
3
- * the media-position flip live in @refrakt-md/skeleton (styles/runes/feature.css). */
2
+ /* Feature — skin. The preamble/eyebrow/content/definitions/icon layout, the
3
+ * `[data-layout]` arrangement, and the media-position flip live in
4
+ * @refrakt-md/skeleton (styles/runes/feature.css). */
4
5
  .rf-feature {
5
6
  padding: 2.5rem 0 2rem;
6
7
  }
@@ -55,24 +56,24 @@
55
56
  .rf-feature[data-align="right"] h2 {
56
57
  text-align: right;
57
58
  }
58
- /* Definitions stack in a single column by default; the `--definitions-grid`
59
- * modifier (SPEC-091 media-position variant: top/bottom) tiles them as a grid. */
60
- .rf-feature__definitions {
59
+ /* Definitions skin. Arrangement + item chrome follow the `layout` axis
60
+ * (SPEC-099): `grid` tiles carded items; `list` stacks flat rows. */
61
+ .rf-feature__items {
61
62
  margin: 0;
62
63
  }
63
- .rf-feature--definitions-grid .rf-feature__definitions {
64
+ .rf-feature[data-layout="grid"] .rf-feature__items,
65
+ .rf-feature[data-layout="carousel"] .rf-feature__items {
64
66
  gap: 1.5rem;
65
67
  }
66
- /* Beside layouts (media on start/end): definitions stay stacked (no grid
67
- * modifier) inside the content track. */
68
+ /* Beside layouts (media on start/end): left-align the heading/preamble. */
68
69
  .rf-feature[data-media-position="start"] .rf-feature__preamble,
69
70
  .rf-feature[data-media-position="end"] .rf-feature__preamble,
70
71
  .rf-feature[data-media-position="start"] h2,
71
72
  .rf-feature[data-media-position="end"] h2 {
72
73
  text-align: left;
73
74
  }
74
- .rf-feature[data-media-position="start"] .rf-feature__feature-item,
75
- .rf-feature[data-media-position="end"] .rf-feature__feature-item {
75
+ /* List arrangement: items are flat rows, not carded tiles. */
76
+ .rf-feature[data-layout="list"] .rf-feature__feature-item {
76
77
  background: none;
77
78
  border: none;
78
79
  border-radius: 0;
@@ -27,20 +27,7 @@
27
27
  text-align: center;
28
28
  font-style: italic;
29
29
  }
30
- .rf-gallery__nav {
31
- border-radius: 50%;
32
- border: none;
33
- background: var(--rf-color-surface);
34
- color: var(--rf-color-text);
35
- box-shadow: var(--rf-shadow-md);
36
- cursor: pointer;
37
- font-size: var(--rf-text-xl);
38
- opacity: 0.8;
39
- transition: opacity 0.2s;
40
- }
41
- .rf-gallery__nav:hover {
42
- opacity: 1;
43
- }
30
+ /* Carousel nav chrome is now the shared `.rf-carousel__nav` (styles/runes/carousel.css). */
44
31
  .rf-gallery[data-layout="masonry"] .rf-gallery__items {
45
32
  column-gap: var(--rf-gallery-gap);
46
33
  }
@@ -4,9 +4,10 @@
4
4
  margin: 2rem 0;
5
5
  }
6
6
 
7
- /* Toolbar — transparent, controls float above the canvas */
7
+ /* Toolbar — transparent, controls float above the canvas (flush to the canvas
8
+ * edges, no horizontal inset). */
8
9
  .rf-preview__toolbar {
9
- padding: 0.25rem 0.25rem 0.5rem;
10
+ padding: 0.25rem 0 0.5rem;
10
11
  }
11
12
  .rf-preview__title {
12
13
  font-size: var(--rf-text-xs);
@@ -16,7 +17,8 @@
16
17
  letter-spacing: var(--rf-tracking-wider);
17
18
  }
18
19
 
19
- /* Controls container (view toggle + theme toggle) */
20
+ /* Toolbar groups view-mode toggle on the left, preview-only controls (viewport
21
+ * + theme) on the right. */
20
22
  .rf-preview__controls {
21
23
  gap: 0.5rem;
22
24
  }
@@ -1,15 +1,8 @@
1
1
  @layer skin {
2
2
 
3
- /* Drop cap decorative first letter */
4
- .rf-textblock--dropcap .rf-textblock__body > p:first-child::first-letter {
5
- font-size: 3.5em;
6
- font-weight: var(--rf-weight-bold);
7
- line-height: 0.8;
8
- padding-right: 0.1em;
9
- margin-top: 0.05em;
10
- color: var(--rf-color-primary);
11
- font-family: Georgia, 'Times New Roman', serif;
12
- }
3
+ /* Drop cap is now the universal SPEC-108 opt-in, styled on
4
+ * `[data-reading="prose"][data-dropcap]` (dimensions/reading.css); textblock's
5
+ * body reads as prose, so it inherits the treatment. */
13
6
 
14
7
  /* Lead paragraph — emphasized opening text */
15
8
  .rf-textblock--lead .rf-textblock__body > p:first-child {