@refrakt-md/lumina 0.7.1 → 0.7.2

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.
@@ -9,7 +9,34 @@
9
9
  "dataRune": "accordion",
10
10
  "childOrder": [
11
11
  "{content}"
12
- ]
12
+ ],
13
+ "elements": {
14
+ "header": {
15
+ "tag": "header",
16
+ "selector": ".rf-accordion__header",
17
+ "source": "autoLabel"
18
+ },
19
+ "eyebrow": {
20
+ "tag": "eyebrow",
21
+ "selector": ".rf-accordion__eyebrow",
22
+ "source": "autoLabel"
23
+ },
24
+ "headline": {
25
+ "tag": "headline",
26
+ "selector": ".rf-accordion__headline",
27
+ "source": "autoLabel"
28
+ },
29
+ "blurb": {
30
+ "tag": "blurb",
31
+ "selector": ".rf-accordion__blurb",
32
+ "source": "autoLabel"
33
+ },
34
+ "image": {
35
+ "tag": "image",
36
+ "selector": ".rf-accordion__image",
37
+ "source": "autoLabel"
38
+ }
39
+ }
13
40
  },
14
41
  "AccordionItem": {
15
42
  "block": "accordion-item",
@@ -523,7 +550,34 @@
523
550
  "dataRune": "tabgroup",
524
551
  "childOrder": [
525
552
  "{content}"
526
- ]
553
+ ],
554
+ "elements": {
555
+ "header": {
556
+ "tag": "header",
557
+ "selector": ".rf-tabs__header",
558
+ "source": "autoLabel"
559
+ },
560
+ "eyebrow": {
561
+ "tag": "eyebrow",
562
+ "selector": ".rf-tabs__eyebrow",
563
+ "source": "autoLabel"
564
+ },
565
+ "headline": {
566
+ "tag": "headline",
567
+ "selector": ".rf-tabs__headline",
568
+ "source": "autoLabel"
569
+ },
570
+ "blurb": {
571
+ "tag": "blurb",
572
+ "selector": ".rf-tabs__blurb",
573
+ "source": "autoLabel"
574
+ },
575
+ "image": {
576
+ "tag": "image",
577
+ "selector": ".rf-tabs__image",
578
+ "source": "autoLabel"
579
+ }
580
+ }
527
581
  },
528
582
  "Tab": {
529
583
  "block": "tab",
@@ -639,6 +693,33 @@
639
693
  "classPattern": ".rf-reveal--{value}",
640
694
  "dataAttribute": "data-mode"
641
695
  }
696
+ },
697
+ "elements": {
698
+ "header": {
699
+ "tag": "header",
700
+ "selector": ".rf-reveal__header",
701
+ "source": "autoLabel"
702
+ },
703
+ "eyebrow": {
704
+ "tag": "eyebrow",
705
+ "selector": ".rf-reveal__eyebrow",
706
+ "source": "autoLabel"
707
+ },
708
+ "headline": {
709
+ "tag": "headline",
710
+ "selector": ".rf-reveal__headline",
711
+ "source": "autoLabel"
712
+ },
713
+ "blurb": {
714
+ "tag": "blurb",
715
+ "selector": ".rf-reveal__blurb",
716
+ "source": "autoLabel"
717
+ },
718
+ "image": {
719
+ "tag": "image",
720
+ "selector": ".rf-reveal__image",
721
+ "source": "autoLabel"
722
+ }
642
723
  }
643
724
  },
644
725
  "RevealStep": {
@@ -686,6 +767,33 @@
686
767
  "suffix": "in-feature",
687
768
  "selector": ".rf-hero--in-feature"
688
769
  }
770
+ },
771
+ "elements": {
772
+ "header": {
773
+ "tag": "header",
774
+ "selector": ".rf-hero__header",
775
+ "source": "autoLabel"
776
+ },
777
+ "eyebrow": {
778
+ "tag": "eyebrow",
779
+ "selector": ".rf-hero__eyebrow",
780
+ "source": "autoLabel"
781
+ },
782
+ "headline": {
783
+ "tag": "headline",
784
+ "selector": ".rf-hero__headline",
785
+ "source": "autoLabel"
786
+ },
787
+ "blurb": {
788
+ "tag": "blurb",
789
+ "selector": ".rf-hero__blurb",
790
+ "source": "autoLabel"
791
+ },
792
+ "image": {
793
+ "tag": "image",
794
+ "selector": ".rf-hero__image",
795
+ "source": "autoLabel"
796
+ }
689
797
  }
690
798
  },
691
799
  "CallToAction": {
@@ -704,6 +812,33 @@
704
812
  "suffix": "in-pricing",
705
813
  "selector": ".rf-cta--in-pricing"
706
814
  }
815
+ },
816
+ "elements": {
817
+ "header": {
818
+ "tag": "header",
819
+ "selector": ".rf-cta__header",
820
+ "source": "autoLabel"
821
+ },
822
+ "eyebrow": {
823
+ "tag": "eyebrow",
824
+ "selector": ".rf-cta__eyebrow",
825
+ "source": "autoLabel"
826
+ },
827
+ "headline": {
828
+ "tag": "headline",
829
+ "selector": ".rf-cta__headline",
830
+ "source": "autoLabel"
831
+ },
832
+ "blurb": {
833
+ "tag": "blurb",
834
+ "selector": ".rf-cta__blurb",
835
+ "source": "autoLabel"
836
+ },
837
+ "image": {
838
+ "tag": "image",
839
+ "selector": ".rf-cta__image",
840
+ "source": "autoLabel"
841
+ }
707
842
  }
708
843
  },
709
844
  "Bento": {
@@ -727,6 +862,33 @@
727
862
  "dataAttribute": "data-gap"
728
863
  }
729
864
  },
865
+ "elements": {
866
+ "header": {
867
+ "tag": "header",
868
+ "selector": ".rf-bento__header",
869
+ "source": "autoLabel"
870
+ },
871
+ "eyebrow": {
872
+ "tag": "eyebrow",
873
+ "selector": ".rf-bento__eyebrow",
874
+ "source": "autoLabel"
875
+ },
876
+ "headline": {
877
+ "tag": "headline",
878
+ "selector": ".rf-bento__headline",
879
+ "source": "autoLabel"
880
+ },
881
+ "blurb": {
882
+ "tag": "blurb",
883
+ "selector": ".rf-bento__blurb",
884
+ "source": "autoLabel"
885
+ },
886
+ "image": {
887
+ "tag": "image",
888
+ "selector": ".rf-bento__image",
889
+ "source": "autoLabel"
890
+ }
891
+ },
730
892
  "inlineStyles": {
731
893
  "columns": "--bento-columns",
732
894
  "gap": "--bento-gap"
@@ -784,6 +946,33 @@
784
946
  "suffix": "in-grid",
785
947
  "selector": ".rf-feature--in-grid"
786
948
  }
949
+ },
950
+ "elements": {
951
+ "header": {
952
+ "tag": "header",
953
+ "selector": ".rf-feature__header",
954
+ "source": "autoLabel"
955
+ },
956
+ "eyebrow": {
957
+ "tag": "eyebrow",
958
+ "selector": ".rf-feature__eyebrow",
959
+ "source": "autoLabel"
960
+ },
961
+ "headline": {
962
+ "tag": "headline",
963
+ "selector": ".rf-feature__headline",
964
+ "source": "autoLabel"
965
+ },
966
+ "blurb": {
967
+ "tag": "blurb",
968
+ "selector": ".rf-feature__blurb",
969
+ "source": "autoLabel"
970
+ },
971
+ "image": {
972
+ "tag": "image",
973
+ "selector": ".rf-feature__image",
974
+ "source": "autoLabel"
975
+ }
787
976
  }
788
977
  },
789
978
  "FeatureDefinition": {
@@ -801,7 +990,34 @@
801
990
  "dataRune": "steps",
802
991
  "childOrder": [
803
992
  "{content}"
804
- ]
993
+ ],
994
+ "elements": {
995
+ "header": {
996
+ "tag": "header",
997
+ "selector": ".rf-steps__header",
998
+ "source": "autoLabel"
999
+ },
1000
+ "eyebrow": {
1001
+ "tag": "eyebrow",
1002
+ "selector": ".rf-steps__eyebrow",
1003
+ "source": "autoLabel"
1004
+ },
1005
+ "headline": {
1006
+ "tag": "headline",
1007
+ "selector": ".rf-steps__headline",
1008
+ "source": "autoLabel"
1009
+ },
1010
+ "blurb": {
1011
+ "tag": "blurb",
1012
+ "selector": ".rf-steps__blurb",
1013
+ "source": "autoLabel"
1014
+ },
1015
+ "image": {
1016
+ "tag": "image",
1017
+ "selector": ".rf-steps__image",
1018
+ "source": "autoLabel"
1019
+ }
1020
+ }
805
1021
  },
806
1022
  "Step": {
807
1023
  "block": "step",
@@ -830,7 +1046,34 @@
830
1046
  "dataRune": "pricing",
831
1047
  "childOrder": [
832
1048
  "{content}"
833
- ]
1049
+ ],
1050
+ "elements": {
1051
+ "header": {
1052
+ "tag": "header",
1053
+ "selector": ".rf-pricing__header",
1054
+ "source": "autoLabel"
1055
+ },
1056
+ "eyebrow": {
1057
+ "tag": "eyebrow",
1058
+ "selector": ".rf-pricing__eyebrow",
1059
+ "source": "autoLabel"
1060
+ },
1061
+ "headline": {
1062
+ "tag": "headline",
1063
+ "selector": ".rf-pricing__headline",
1064
+ "source": "autoLabel"
1065
+ },
1066
+ "blurb": {
1067
+ "tag": "blurb",
1068
+ "selector": ".rf-pricing__blurb",
1069
+ "source": "autoLabel"
1070
+ },
1071
+ "image": {
1072
+ "tag": "image",
1073
+ "selector": ".rf-pricing__image",
1074
+ "source": "autoLabel"
1075
+ }
1076
+ }
834
1077
  },
835
1078
  "Tier": {
836
1079
  "block": "tier",
@@ -1851,6 +2094,28 @@
1851
2094
  }
1852
2095
  }
1853
2096
  },
2097
+ "Mockup": {
2098
+ "block": "mockup",
2099
+ "root": ".rf-mockup",
2100
+ "dataRune": "mockup",
2101
+ "childOrder": [
2102
+ "{content}"
2103
+ ],
2104
+ "modifiers": {
2105
+ "device": {
2106
+ "source": "meta",
2107
+ "default": "browser",
2108
+ "classPattern": ".rf-mockup--{value}",
2109
+ "dataAttribute": "data-device"
2110
+ },
2111
+ "color": {
2112
+ "source": "meta",
2113
+ "default": "dark",
2114
+ "classPattern": ".rf-mockup--{value}",
2115
+ "dataAttribute": "data-color"
2116
+ }
2117
+ }
2118
+ },
1854
2119
  "HowTo": {
1855
2120
  "block": "howto",
1856
2121
  "root": ".rf-howto",
package/index.css CHANGED
@@ -55,6 +55,7 @@
55
55
  @import './styles/runes/lore.css';
56
56
  @import './styles/runes/itinerary.css';
57
57
  @import './styles/runes/map.css';
58
+ @import './styles/runes/mockup.css';
58
59
  @import './styles/runes/nav.css';
59
60
  @import './styles/runes/organization.css';
60
61
  @import './styles/runes/page-section.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 framework adapters",
4
- "version": "0.7.1",
4
+ "version": "0.7.2",
5
5
  "type": "module",
6
6
  "license": "MIT",
7
7
  "repository": {
@@ -46,10 +46,10 @@
46
46
  "build": "tsc"
47
47
  },
48
48
  "dependencies": {
49
- "@refrakt-md/runes": "0.7.1",
50
- "@refrakt-md/transform": "0.7.1",
51
- "@refrakt-md/types": "0.7.1",
52
- "@refrakt-md/svelte": "0.7.1"
49
+ "@refrakt-md/runes": "0.7.2",
50
+ "@refrakt-md/transform": "0.7.2",
51
+ "@refrakt-md/types": "0.7.2",
52
+ "@refrakt-md/svelte": "0.7.2"
53
53
  },
54
54
  "peerDependencies": {
55
55
  "svelte": "^5.0.0",
@@ -5,6 +5,42 @@
5
5
  overflow: hidden;
6
6
  margin: 1.5rem 0;
7
7
  }
8
+ .rf-accordion__header {
9
+ margin-bottom: 1.5rem;
10
+ }
11
+ .rf-accordion__eyebrow {
12
+ font-size: 0.8125rem;
13
+ font-weight: 600;
14
+ letter-spacing: 0.05em;
15
+ text-transform: uppercase;
16
+ color: var(--rf-color-primary);
17
+ margin: 0 0 0.5rem;
18
+ }
19
+ .rf-accordion__eyebrow:has(a) {
20
+ display: inline-block;
21
+ position: relative;
22
+ padding: 0.25rem 0.875rem;
23
+ border: 1px solid var(--rf-color-border);
24
+ border-radius: var(--rf-radius-full);
25
+ color: var(--rf-color-text);
26
+ font-weight: 400;
27
+ text-transform: none;
28
+ letter-spacing: 0;
29
+ transition: border-color 150ms ease;
30
+ }
31
+ .rf-accordion__eyebrow:has(a):hover { border-color: var(--rf-color-muted); }
32
+ .rf-accordion__eyebrow:has(a) a { color: var(--rf-color-primary); font-weight: 600; text-decoration: none; }
33
+ .rf-accordion__eyebrow:has(a) a::before { content: ''; position: absolute; inset: 0; border-radius: inherit; }
34
+ .rf-accordion__headline {
35
+ margin-top: 0;
36
+ }
37
+ .rf-accordion__blurb {
38
+ color: var(--rf-color-muted);
39
+ margin-bottom: 0;
40
+ }
41
+ .rf-accordion__image {
42
+ margin-bottom: 1rem;
43
+ }
8
44
  .rf-accordion__items {
9
45
  display: contents;
10
46
  }
@@ -2,6 +2,42 @@
2
2
  .rf-bento {
3
3
  margin: 1.5rem 0;
4
4
  }
5
+ .rf-bento__header {
6
+ margin-bottom: 1.5rem;
7
+ }
8
+ .rf-bento__eyebrow {
9
+ font-size: 0.8125rem;
10
+ font-weight: 600;
11
+ letter-spacing: 0.05em;
12
+ text-transform: uppercase;
13
+ color: var(--rf-color-primary);
14
+ margin: 0 0 0.5rem;
15
+ }
16
+ .rf-bento__eyebrow:has(a) {
17
+ display: inline-block;
18
+ position: relative;
19
+ padding: 0.25rem 0.875rem;
20
+ border: 1px solid var(--rf-color-border);
21
+ border-radius: var(--rf-radius-full);
22
+ color: var(--rf-color-text);
23
+ font-weight: 400;
24
+ text-transform: none;
25
+ letter-spacing: 0;
26
+ transition: border-color 150ms ease;
27
+ }
28
+ .rf-bento__eyebrow:has(a):hover { border-color: var(--rf-color-muted); }
29
+ .rf-bento__eyebrow:has(a) a { color: var(--rf-color-primary); font-weight: 600; text-decoration: none; }
30
+ .rf-bento__eyebrow:has(a) a::before { content: ''; position: absolute; inset: 0; border-radius: inherit; }
31
+ .rf-bento__headline {
32
+ margin-top: 0;
33
+ }
34
+ .rf-bento__blurb {
35
+ color: var(--rf-color-muted);
36
+ margin-bottom: 0;
37
+ }
38
+ .rf-bento__image {
39
+ margin-bottom: 1rem;
40
+ }
5
41
  .rf-bento__grid {
6
42
  display: grid;
7
43
  grid-template-columns: repeat(var(--bento-columns, 4), 1fr);
@@ -3,9 +3,53 @@
3
3
  text-align: center;
4
4
  padding: 3.5rem 2rem 3rem;
5
5
  }
6
+ .rf-cta__header {
7
+ margin-bottom: 1.5rem;
8
+ }
9
+ /* Higher specificity needed to override .rf-cta p (0,1,1) */
10
+ .rf-cta .rf-cta__eyebrow {
11
+ font-size: 0.875rem;
12
+ font-weight: 600;
13
+ letter-spacing: 0.05em;
14
+ text-transform: uppercase;
15
+ color: var(--rf-color-primary);
16
+ margin: 0 0 0.75rem;
17
+ max-width: none;
18
+ }
19
+ /* Pill-badge variant when eyebrow contains a link */
20
+ .rf-cta .rf-cta__eyebrow:has(a) {
21
+ display: inline-block;
22
+ position: relative;
23
+ padding: 0.25rem 0.875rem;
24
+ border: 1px solid var(--rf-color-border);
25
+ border-radius: var(--rf-radius-full);
26
+ color: var(--rf-color-text);
27
+ font-weight: 400;
28
+ text-transform: none;
29
+ letter-spacing: 0;
30
+ transition: border-color 150ms ease;
31
+ }
32
+ .rf-cta .rf-cta__eyebrow:has(a):hover {
33
+ border-color: var(--rf-color-muted);
34
+ }
35
+ .rf-cta .rf-cta__eyebrow:has(a) a {
36
+ color: var(--rf-color-primary);
37
+ font-weight: 600;
38
+ text-decoration: none;
39
+ }
40
+ .rf-cta .rf-cta__eyebrow:has(a) a::before {
41
+ content: '';
42
+ position: absolute;
43
+ inset: 0;
44
+ border-radius: inherit;
45
+ }
46
+ .rf-cta__image {
47
+ margin-bottom: 1.5rem;
48
+ }
6
49
  .rf-cta h1,
7
50
  .rf-cta h2,
8
- .rf-cta h3 {
51
+ .rf-cta h3,
52
+ .rf-cta__headline {
9
53
  font-size: 2.5rem;
10
54
  font-weight: 750;
11
55
  letter-spacing: -0.03em;
@@ -17,7 +61,9 @@
17
61
  -webkit-text-fill-color: transparent;
18
62
  background-clip: text;
19
63
  }
20
- .rf-cta p {
64
+ /* Higher specificity needed to override .rf-cta p (0,1,1) */
65
+ .rf-cta p,
66
+ .rf-cta .rf-cta__blurb {
21
67
  font-size: 1.15rem;
22
68
  color: var(--rf-color-muted);
23
69
  max-width: 540px;
@@ -2,6 +2,43 @@
2
2
  .rf-feature {
3
3
  padding: 2.5rem 0 2rem;
4
4
  }
5
+ .rf-feature__header {
6
+ margin-bottom: 1.5rem;
7
+ text-align: center;
8
+ }
9
+ .rf-feature__eyebrow {
10
+ font-size: 0.8125rem;
11
+ font-weight: 600;
12
+ letter-spacing: 0.05em;
13
+ text-transform: uppercase;
14
+ color: var(--rf-color-primary);
15
+ margin: 0 0 0.5rem;
16
+ }
17
+ .rf-feature__eyebrow:has(a) {
18
+ display: inline-block;
19
+ position: relative;
20
+ padding: 0.25rem 0.875rem;
21
+ border: 1px solid var(--rf-color-border);
22
+ border-radius: var(--rf-radius-full);
23
+ color: var(--rf-color-text);
24
+ font-weight: 400;
25
+ text-transform: none;
26
+ letter-spacing: 0;
27
+ transition: border-color 150ms ease;
28
+ }
29
+ .rf-feature__eyebrow:has(a):hover { border-color: var(--rf-color-muted); }
30
+ .rf-feature__eyebrow:has(a) a { color: var(--rf-color-primary); font-weight: 600; text-decoration: none; }
31
+ .rf-feature__eyebrow:has(a) a::before { content: ''; position: absolute; inset: 0; border-radius: inherit; }
32
+ .rf-feature__headline {
33
+ margin-top: 0;
34
+ }
35
+ .rf-feature__blurb {
36
+ color: var(--rf-color-muted);
37
+ margin-bottom: 0;
38
+ }
39
+ .rf-feature__image {
40
+ margin-bottom: 1rem;
41
+ }
5
42
  .rf-feature__body {
6
43
  display: contents;
7
44
  }
@@ -24,6 +61,7 @@
24
61
  .rf-feature--split .rf-feature__body {
25
62
  display: block;
26
63
  }
64
+ .rf-feature--split .rf-feature__header,
27
65
  .rf-feature--split h2 {
28
66
  text-align: left;
29
67
  }
@@ -6,6 +6,49 @@
6
6
  background-position: center;
7
7
  overflow: hidden;
8
8
  }
9
+ .rf-hero__header {
10
+ margin-bottom: 2rem;
11
+ }
12
+ /* Higher specificity needed to override .rf-hero p (0,1,1) */
13
+ .rf-hero .rf-hero__eyebrow {
14
+ font-size: 0.875rem;
15
+ font-weight: 600;
16
+ letter-spacing: 0.05em;
17
+ text-transform: uppercase;
18
+ color: var(--rf-color-primary);
19
+ margin: 0 0 1rem;
20
+ max-width: none;
21
+ }
22
+ /* Pill-badge variant when eyebrow contains a link */
23
+ .rf-hero .rf-hero__eyebrow:has(a) {
24
+ display: inline-block;
25
+ position: relative;
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: 400;
31
+ text-transform: none;
32
+ letter-spacing: 0;
33
+ transition: border-color 150ms ease;
34
+ }
35
+ .rf-hero .rf-hero__eyebrow:has(a):hover {
36
+ border-color: var(--rf-color-muted);
37
+ }
38
+ .rf-hero .rf-hero__eyebrow:has(a) a {
39
+ color: var(--rf-color-primary);
40
+ font-weight: 600;
41
+ text-decoration: none;
42
+ }
43
+ .rf-hero .rf-hero__eyebrow:has(a) a::before {
44
+ content: '';
45
+ position: absolute;
46
+ inset: 0;
47
+ border-radius: inherit;
48
+ }
49
+ .rf-hero__image {
50
+ margin-bottom: 1.5rem;
51
+ }
9
52
  .rf-hero__actions {
10
53
  max-width: 720px;
11
54
  margin: 0 auto;
@@ -43,7 +86,8 @@
43
86
  border: 1px solid var(--rf-color-border);
44
87
  white-space: nowrap;
45
88
  }
46
- .rf-hero h1 {
89
+ .rf-hero h1,
90
+ .rf-hero__headline {
47
91
  font-size: 3.25rem;
48
92
  font-weight: 800;
49
93
  letter-spacing: -0.035em;
@@ -54,13 +98,16 @@
54
98
  -webkit-text-fill-color: transparent;
55
99
  background-clip: text;
56
100
  }
57
- .rf-hero p {
101
+ /* Higher specificity needed to override .rf-hero p (0,1,1) */
102
+ .rf-hero p,
103
+ .rf-hero .rf-hero__blurb {
58
104
  font-size: 1.2rem;
59
105
  line-height: 1.65;
60
106
  color: var(--rf-color-muted);
61
107
  margin: 0 0 2rem;
62
108
  }
63
- .rf-hero--center p {
109
+ .rf-hero--center p,
110
+ .rf-hero--center .rf-hero__blurb {
64
111
  max-width: 560px;
65
112
  margin-left: auto;
66
113
  margin-right: auto;
@@ -0,0 +1,503 @@
1
+ /* Mockup — Device frame chrome around content */
2
+
3
+ .rf-mockup {
4
+ --mockup-bezel-dark: #1a1a1a;
5
+ --mockup-bezel-light: #e5e5e5;
6
+ --mockup-bezel: var(--mockup-bezel-dark);
7
+ --mockup-chrome: #2a2a2a;
8
+ --mockup-chrome-text: #999;
9
+ --mockup-shadow: var(--rf-shadow-lg);
10
+ --mockup-scale: 1;
11
+ display: inline-block;
12
+ margin: 1.5rem 0;
13
+ transform: scale(var(--mockup-scale));
14
+ transform-origin: top center;
15
+ }
16
+
17
+ /* ── Color modifiers ── */
18
+
19
+ .rf-mockup--dark {
20
+ --mockup-bezel: var(--mockup-bezel-dark);
21
+ --mockup-chrome: #2a2a2a;
22
+ --mockup-chrome-text: #999;
23
+ --mockup-shadow: 0 8px 24px rgba(0, 0, 0, 0.25), 0 2px 6px rgba(0, 0, 0, 0.15);
24
+ }
25
+
26
+ .rf-mockup--light {
27
+ --mockup-bezel: var(--mockup-bezel-light);
28
+ --mockup-chrome: #f5f5f5;
29
+ --mockup-chrome-text: #666;
30
+ --mockup-shadow: 0 8px 24px rgba(0, 0, 0, 0.1), 0 2px 6px rgba(0, 0, 0, 0.06);
31
+ }
32
+
33
+ .rf-mockup--auto {
34
+ --mockup-bezel: var(--mockup-bezel-dark);
35
+ --mockup-chrome: #2a2a2a;
36
+ --mockup-chrome-text: #999;
37
+ }
38
+
39
+ /* ── Frame (wraps everything) ── */
40
+
41
+ .rf-mockup__frame {
42
+ position: relative;
43
+ box-shadow: var(--mockup-shadow);
44
+ }
45
+
46
+ /* ── Viewport (content area) ── */
47
+
48
+ .rf-mockup__viewport {
49
+ overflow: auto;
50
+ background: var(--rf-color-bg);
51
+ }
52
+
53
+ .rf-mockup__viewport > *:first-child {
54
+ margin-top: 0;
55
+ }
56
+
57
+ .rf-mockup__viewport > *:last-child {
58
+ margin-bottom: 0;
59
+ }
60
+
61
+ /* ── Label ── */
62
+
63
+ .rf-mockup__label {
64
+ text-align: center;
65
+ font-size: 0.75rem;
66
+ font-weight: 500;
67
+ color: var(--rf-color-muted);
68
+ margin-top: 0.75rem;
69
+ }
70
+
71
+ /* ═══════════════════════════════════════
72
+ MOBILE DEVICES
73
+ ═══════════════════════════════════════ */
74
+
75
+ /* ── Bezel (mobile/tablet outer shell) ── */
76
+
77
+ .rf-mockup__bezel {
78
+ background: var(--mockup-bezel);
79
+ display: flex;
80
+ flex-direction: column;
81
+ overflow: hidden;
82
+ }
83
+
84
+ /* ── Notch variants ── */
85
+
86
+ .rf-mockup__notch {
87
+ position: absolute;
88
+ top: 0;
89
+ left: 50%;
90
+ transform: translateX(-50%);
91
+ z-index: 2;
92
+ }
93
+
94
+ .rf-mockup__notch--dynamic-island {
95
+ width: 120px;
96
+ height: 34px;
97
+ top: 12px;
98
+ background: #000;
99
+ border-radius: 20px;
100
+ }
101
+
102
+ .rf-mockup__notch--classic {
103
+ width: 150px;
104
+ height: 28px;
105
+ top: 0;
106
+ background: var(--mockup-bezel);
107
+ border-radius: 0 0 20px 20px;
108
+ }
109
+
110
+ .rf-mockup__notch--punch-hole {
111
+ width: 12px;
112
+ height: 12px;
113
+ top: 16px;
114
+ background: #000;
115
+ border-radius: var(--rf-radius-full);
116
+ }
117
+
118
+ /* ── Status bar ── */
119
+
120
+ .rf-mockup__status-bar {
121
+ display: flex;
122
+ align-items: center;
123
+ justify-content: space-between;
124
+ padding: 0 1.5rem;
125
+ height: 44px;
126
+ font-size: 0.75rem;
127
+ font-weight: 600;
128
+ color: var(--rf-color-text);
129
+ background: var(--rf-color-bg);
130
+ position: relative;
131
+ z-index: 1;
132
+ }
133
+
134
+ .rf-mockup__status-time {
135
+ font-variant-numeric: tabular-nums;
136
+ }
137
+
138
+ .rf-mockup__status-icons::after {
139
+ content: '\25CF\25CF\25CF \25AE 100%';
140
+ font-size: 0.625rem;
141
+ letter-spacing: 0.05em;
142
+ color: var(--rf-color-muted);
143
+ }
144
+
145
+ /* ── Home indicator ── */
146
+
147
+ .rf-mockup__home-indicator {
148
+ display: flex;
149
+ justify-content: center;
150
+ align-items: center;
151
+ height: 32px;
152
+ background: var(--rf-color-bg);
153
+ }
154
+
155
+ .rf-mockup__home-indicator::after {
156
+ content: '';
157
+ display: block;
158
+ width: 134px;
159
+ height: 5px;
160
+ background: var(--rf-color-text);
161
+ border-radius: var(--rf-radius-full);
162
+ opacity: 0.2;
163
+ }
164
+
165
+ /* ── iPhone 15 ── */
166
+
167
+ .rf-mockup--iphone-15 .rf-mockup__frame {
168
+ width: 393px;
169
+ border-radius: 55px;
170
+ }
171
+
172
+ .rf-mockup--iphone-15 .rf-mockup__bezel {
173
+ border-radius: 55px;
174
+ border: 10px solid var(--mockup-bezel);
175
+ }
176
+
177
+ .rf-mockup--iphone-15 .rf-mockup__viewport {
178
+ height: 852px;
179
+ border-radius: 0;
180
+ }
181
+
182
+ /* ── iPhone SE ── */
183
+
184
+ .rf-mockup--iphone-se .rf-mockup__frame {
185
+ width: 375px;
186
+ border-radius: 40px;
187
+ }
188
+
189
+ .rf-mockup--iphone-se .rf-mockup__bezel {
190
+ border-radius: 40px;
191
+ border: 10px solid var(--mockup-bezel);
192
+ padding-bottom: 60px;
193
+ }
194
+
195
+ .rf-mockup--iphone-se .rf-mockup__notch--classic {
196
+ position: relative;
197
+ top: auto;
198
+ left: auto;
199
+ transform: none;
200
+ width: 100%;
201
+ height: 60px;
202
+ background: var(--mockup-bezel);
203
+ border-radius: 0;
204
+ }
205
+
206
+ .rf-mockup--iphone-se .rf-mockup__bezel::after {
207
+ content: '';
208
+ position: absolute;
209
+ bottom: 14px;
210
+ left: 50%;
211
+ transform: translateX(-50%);
212
+ width: 36px;
213
+ height: 36px;
214
+ border: 2px solid var(--mockup-chrome-text);
215
+ border-radius: var(--rf-radius-full);
216
+ opacity: 0.5;
217
+ }
218
+
219
+ .rf-mockup--iphone-se .rf-mockup__viewport {
220
+ height: 667px;
221
+ }
222
+
223
+ /* ── Pixel ── */
224
+
225
+ .rf-mockup--pixel .rf-mockup__frame {
226
+ width: 412px;
227
+ border-radius: 40px;
228
+ }
229
+
230
+ .rf-mockup--pixel .rf-mockup__bezel {
231
+ border-radius: 40px;
232
+ border: 8px solid var(--mockup-bezel);
233
+ }
234
+
235
+ .rf-mockup--pixel .rf-mockup__viewport {
236
+ height: 915px;
237
+ }
238
+
239
+ /* ── Generic phone ── */
240
+
241
+ .rf-mockup--phone .rf-mockup__frame {
242
+ width: 390px;
243
+ border-radius: 48px;
244
+ }
245
+
246
+ .rf-mockup--phone .rf-mockup__bezel {
247
+ border-radius: 48px;
248
+ border: 10px solid var(--mockup-bezel);
249
+ }
250
+
251
+ .rf-mockup--phone .rf-mockup__viewport {
252
+ height: 844px;
253
+ }
254
+
255
+ /* ═══════════════════════════════════════
256
+ TABLET DEVICES
257
+ ═══════════════════════════════════════ */
258
+
259
+ /* ── iPad ── */
260
+
261
+ .rf-mockup--ipad .rf-mockup__frame {
262
+ width: 820px;
263
+ border-radius: 24px;
264
+ }
265
+
266
+ .rf-mockup--ipad .rf-mockup__bezel {
267
+ border-radius: 24px;
268
+ border: 12px solid var(--mockup-bezel);
269
+ }
270
+
271
+ .rf-mockup--ipad .rf-mockup__viewport {
272
+ height: 1180px;
273
+ }
274
+
275
+ /* ── Generic tablet ── */
276
+
277
+ .rf-mockup--tablet .rf-mockup__frame {
278
+ width: 800px;
279
+ border-radius: 20px;
280
+ }
281
+
282
+ .rf-mockup--tablet .rf-mockup__bezel {
283
+ border-radius: 20px;
284
+ border: 14px solid var(--mockup-bezel);
285
+ }
286
+
287
+ .rf-mockup--tablet .rf-mockup__viewport {
288
+ height: 1100px;
289
+ }
290
+
291
+ /* ═══════════════════════════════════════
292
+ DESKTOP DEVICES
293
+ ═══════════════════════════════════════ */
294
+
295
+ /* ── Title bar (browser / macbook) ── */
296
+
297
+ .rf-mockup__title-bar {
298
+ display: flex;
299
+ align-items: center;
300
+ gap: 0.75rem;
301
+ padding: 0.625rem 1rem;
302
+ background: var(--mockup-chrome);
303
+ min-height: 2.5rem;
304
+ }
305
+
306
+ /* ── Traffic lights ── */
307
+
308
+ .rf-mockup__traffic-lights {
309
+ display: flex;
310
+ gap: 0.5rem;
311
+ flex-shrink: 0;
312
+ }
313
+
314
+ .rf-mockup__traffic-light {
315
+ display: block;
316
+ width: 12px;
317
+ height: 12px;
318
+ border-radius: var(--rf-radius-full);
319
+ }
320
+
321
+ .rf-mockup__traffic-light--close {
322
+ background: #ff5f57;
323
+ }
324
+
325
+ .rf-mockup__traffic-light--minimize {
326
+ background: #febc2e;
327
+ }
328
+
329
+ .rf-mockup__traffic-light--maximize {
330
+ background: #28c840;
331
+ }
332
+
333
+ /* ── Address bar (browser only) ── */
334
+
335
+ .rf-mockup__address-bar {
336
+ flex: 1;
337
+ display: flex;
338
+ align-items: center;
339
+ max-width: 60%;
340
+ margin: 0 auto;
341
+ padding: 0.25rem 0.75rem;
342
+ background: rgba(255, 255, 255, 0.08);
343
+ border-radius: var(--rf-radius-sm);
344
+ min-height: 1.75rem;
345
+ }
346
+
347
+ .rf-mockup__url {
348
+ font-size: 0.75rem;
349
+ font-family: var(--rf-font-sans);
350
+ color: var(--mockup-chrome-text);
351
+ white-space: nowrap;
352
+ overflow: hidden;
353
+ text-overflow: ellipsis;
354
+ }
355
+
356
+ /* ── Browser ── */
357
+
358
+ .rf-mockup--browser .rf-mockup__frame {
359
+ width: 100%;
360
+ max-width: 960px;
361
+ border-radius: var(--rf-radius-lg) var(--rf-radius-lg) 0 0;
362
+ overflow: hidden;
363
+ }
364
+
365
+ .rf-mockup--browser .rf-mockup__title-bar {
366
+ border-radius: var(--rf-radius-lg) var(--rf-radius-lg) 0 0;
367
+ }
368
+
369
+ .rf-mockup--browser .rf-mockup__viewport {
370
+ height: 800px;
371
+ border: 1px solid var(--rf-color-border);
372
+ border-top: none;
373
+ }
374
+
375
+ /* ── Browser dark ── */
376
+
377
+ .rf-mockup--browser-dark .rf-mockup__frame {
378
+ width: 100%;
379
+ max-width: 960px;
380
+ border-radius: var(--rf-radius-lg) var(--rf-radius-lg) 0 0;
381
+ overflow: hidden;
382
+ }
383
+
384
+ .rf-mockup--browser-dark .rf-mockup__title-bar {
385
+ background: #1a1a1a;
386
+ border-radius: var(--rf-radius-lg) var(--rf-radius-lg) 0 0;
387
+ }
388
+
389
+ .rf-mockup--browser-dark .rf-mockup__address-bar {
390
+ background: rgba(255, 255, 255, 0.06);
391
+ }
392
+
393
+ .rf-mockup--browser-dark .rf-mockup__viewport {
394
+ height: 800px;
395
+ border: 1px solid rgba(255, 255, 255, 0.1);
396
+ border-top: none;
397
+ }
398
+
399
+ /* ── MacBook ── */
400
+
401
+ .rf-mockup--macbook .rf-mockup__frame {
402
+ width: 1440px;
403
+ max-width: 100%;
404
+ }
405
+
406
+ .rf-mockup--macbook .rf-mockup__title-bar {
407
+ border-radius: var(--rf-radius-md) var(--rf-radius-md) 0 0;
408
+ border: 3px solid var(--mockup-bezel);
409
+ border-bottom: none;
410
+ }
411
+
412
+ .rf-mockup--macbook .rf-mockup__viewport {
413
+ height: 900px;
414
+ border: 3px solid var(--mockup-bezel);
415
+ border-top: none;
416
+ border-bottom: none;
417
+ }
418
+
419
+ /* ── Keyboard ── */
420
+
421
+ .rf-mockup__keyboard {
422
+ background: linear-gradient(to bottom, var(--mockup-bezel), color-mix(in srgb, var(--mockup-bezel), #000 15%));
423
+ padding: 0.5rem 2rem 0.75rem;
424
+ border-radius: 0 0 var(--rf-radius-md) var(--rf-radius-md);
425
+ display: flex;
426
+ justify-content: center;
427
+ }
428
+
429
+ .rf-mockup__trackpad {
430
+ width: 40%;
431
+ height: 6px;
432
+ background: color-mix(in srgb, var(--mockup-bezel), #fff 10%);
433
+ border-radius: var(--rf-radius-full);
434
+ margin-top: 0.25rem;
435
+ }
436
+
437
+ /* ═══════════════════════════════════════
438
+ SPECIAL DEVICES
439
+ ═══════════════════════════════════════ */
440
+
441
+ /* ── Watch ── */
442
+
443
+ .rf-mockup--watch .rf-mockup__frame {
444
+ width: 198px;
445
+ border-radius: 40px;
446
+ position: relative;
447
+ }
448
+
449
+ .rf-mockup--watch .rf-mockup__bezel {
450
+ border-radius: 40px;
451
+ border: 14px solid var(--mockup-bezel);
452
+ }
453
+
454
+ .rf-mockup--watch .rf-mockup__bezel::after {
455
+ content: '';
456
+ position: absolute;
457
+ right: -6px;
458
+ top: 35%;
459
+ width: 6px;
460
+ height: 28px;
461
+ background: var(--mockup-bezel);
462
+ border-radius: 0 3px 3px 0;
463
+ }
464
+
465
+ .rf-mockup--watch .rf-mockup__viewport {
466
+ height: 242px;
467
+ border-radius: 26px;
468
+ }
469
+
470
+ /* ── None (no frame) ── */
471
+
472
+ .rf-mockup--none .rf-mockup__frame {
473
+ box-shadow: none;
474
+ }
475
+
476
+ .rf-mockup--none .rf-mockup__viewport {
477
+ border: 1px dashed var(--rf-color-border);
478
+ border-radius: var(--rf-radius-sm);
479
+ }
480
+
481
+ /* ═══════════════════════════════════════
482
+ CONTEXT: inside preview
483
+ ═══════════════════════════════════════ */
484
+
485
+ .rf-preview .rf-mockup {
486
+ margin: 0;
487
+ }
488
+
489
+ /* ═══════════════════════════════════════
490
+ DARK MODE
491
+ ═══════════════════════════════════════ */
492
+
493
+ @media (prefers-color-scheme: dark) {
494
+ .rf-mockup--auto {
495
+ --mockup-bezel: var(--mockup-bezel-light);
496
+ --mockup-chrome: #3a3a3a;
497
+ --mockup-chrome-text: #aaa;
498
+ }
499
+
500
+ .rf-mockup--light .rf-mockup__address-bar {
501
+ background: rgba(0, 0, 0, 0.15);
502
+ }
503
+ }
@@ -2,13 +2,45 @@
2
2
  .rf-pricing {
3
3
  padding: 2rem 0;
4
4
  }
5
- .rf-pricing > header {
5
+ .rf-pricing > header,
6
+ .rf-pricing__header {
6
7
  text-align: center;
7
8
  margin-bottom: 2rem;
8
9
  }
9
- .rf-pricing > header h1 {
10
+ .rf-pricing > header h1,
11
+ .rf-pricing__headline {
10
12
  margin-top: 0;
11
13
  }
14
+ .rf-pricing__eyebrow {
15
+ font-size: 0.8125rem;
16
+ font-weight: 600;
17
+ letter-spacing: 0.05em;
18
+ text-transform: uppercase;
19
+ color: var(--rf-color-primary);
20
+ margin: 0 0 0.5rem;
21
+ }
22
+ .rf-pricing__eyebrow:has(a) {
23
+ display: inline-block;
24
+ position: relative;
25
+ padding: 0.25rem 0.875rem;
26
+ border: 1px solid var(--rf-color-border);
27
+ border-radius: var(--rf-radius-full);
28
+ color: var(--rf-color-text);
29
+ font-weight: 400;
30
+ text-transform: none;
31
+ letter-spacing: 0;
32
+ transition: border-color 150ms ease;
33
+ }
34
+ .rf-pricing__eyebrow:has(a):hover { border-color: var(--rf-color-muted); }
35
+ .rf-pricing__eyebrow:has(a) a { color: var(--rf-color-primary); font-weight: 600; text-decoration: none; }
36
+ .rf-pricing__eyebrow:has(a) a::before { content: ''; position: absolute; inset: 0; border-radius: inherit; }
37
+ .rf-pricing__blurb {
38
+ color: var(--rf-color-muted);
39
+ margin-bottom: 0;
40
+ }
41
+ .rf-pricing__image {
42
+ margin-bottom: 1rem;
43
+ }
12
44
  .rf-pricing__tiers {
13
45
  display: grid;
14
46
  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
@@ -2,6 +2,42 @@
2
2
  .rf-reveal {
3
3
  margin: 1.5rem 0;
4
4
  }
5
+ .rf-reveal__header {
6
+ margin-bottom: 1.5rem;
7
+ }
8
+ .rf-reveal__eyebrow {
9
+ font-size: 0.8125rem;
10
+ font-weight: 600;
11
+ letter-spacing: 0.05em;
12
+ text-transform: uppercase;
13
+ color: var(--rf-color-primary);
14
+ margin: 0 0 0.5rem;
15
+ }
16
+ .rf-reveal__eyebrow:has(a) {
17
+ display: inline-block;
18
+ position: relative;
19
+ padding: 0.25rem 0.875rem;
20
+ border: 1px solid var(--rf-color-border);
21
+ border-radius: var(--rf-radius-full);
22
+ color: var(--rf-color-text);
23
+ font-weight: 400;
24
+ text-transform: none;
25
+ letter-spacing: 0;
26
+ transition: border-color 150ms ease;
27
+ }
28
+ .rf-reveal__eyebrow:has(a):hover { border-color: var(--rf-color-muted); }
29
+ .rf-reveal__eyebrow:has(a) a { color: var(--rf-color-primary); font-weight: 600; text-decoration: none; }
30
+ .rf-reveal__eyebrow:has(a) a::before { content: ''; position: absolute; inset: 0; border-radius: inherit; }
31
+ .rf-reveal__headline {
32
+ margin-top: 0;
33
+ }
34
+ .rf-reveal__blurb {
35
+ color: var(--rf-color-muted);
36
+ margin-bottom: 0;
37
+ }
38
+ .rf-reveal__image {
39
+ margin-bottom: 1rem;
40
+ }
5
41
  .rf-reveal__steps {
6
42
  display: flex;
7
43
  flex-direction: column;
@@ -3,6 +3,42 @@
3
3
  counter-reset: step;
4
4
  margin: 1.5rem 0;
5
5
  }
6
+ .rf-steps__header {
7
+ margin-bottom: 1.5rem;
8
+ }
9
+ .rf-steps__eyebrow {
10
+ font-size: 0.8125rem;
11
+ font-weight: 600;
12
+ letter-spacing: 0.05em;
13
+ text-transform: uppercase;
14
+ color: var(--rf-color-primary);
15
+ margin: 0 0 0.5rem;
16
+ }
17
+ .rf-steps__eyebrow:has(a) {
18
+ display: inline-block;
19
+ position: relative;
20
+ padding: 0.25rem 0.875rem;
21
+ border: 1px solid var(--rf-color-border);
22
+ border-radius: var(--rf-radius-full);
23
+ color: var(--rf-color-text);
24
+ font-weight: 400;
25
+ text-transform: none;
26
+ letter-spacing: 0;
27
+ transition: border-color 150ms ease;
28
+ }
29
+ .rf-steps__eyebrow:has(a):hover { border-color: var(--rf-color-muted); }
30
+ .rf-steps__eyebrow:has(a) a { color: var(--rf-color-primary); font-weight: 600; text-decoration: none; }
31
+ .rf-steps__eyebrow:has(a) a::before { content: ''; position: absolute; inset: 0; border-radius: inherit; }
32
+ .rf-steps__headline {
33
+ margin-top: 0;
34
+ }
35
+ .rf-steps__blurb {
36
+ color: var(--rf-color-muted);
37
+ margin-bottom: 0;
38
+ }
39
+ .rf-steps__image {
40
+ margin-bottom: 1rem;
41
+ }
6
42
  .rf-steps ol {
7
43
  list-style: none;
8
44
  padding-left: 0;
@@ -6,6 +6,42 @@
6
6
  margin: 1.5rem 0;
7
7
  background: var(--rf-color-bg);
8
8
  }
9
+ .rf-tabs__header {
10
+ margin-bottom: 1.5rem;
11
+ }
12
+ .rf-tabs__eyebrow {
13
+ font-size: 0.8125rem;
14
+ font-weight: 600;
15
+ letter-spacing: 0.05em;
16
+ text-transform: uppercase;
17
+ color: var(--rf-color-primary);
18
+ margin: 0 0 0.5rem;
19
+ }
20
+ .rf-tabs__eyebrow:has(a) {
21
+ display: inline-block;
22
+ position: relative;
23
+ padding: 0.25rem 0.875rem;
24
+ border: 1px solid var(--rf-color-border);
25
+ border-radius: var(--rf-radius-full);
26
+ color: var(--rf-color-text);
27
+ font-weight: 400;
28
+ text-transform: none;
29
+ letter-spacing: 0;
30
+ transition: border-color 150ms ease;
31
+ }
32
+ .rf-tabs__eyebrow:has(a):hover { border-color: var(--rf-color-muted); }
33
+ .rf-tabs__eyebrow:has(a) a { color: var(--rf-color-primary); font-weight: 600; text-decoration: none; }
34
+ .rf-tabs__eyebrow:has(a) a::before { content: ''; position: absolute; inset: 0; border-radius: inherit; }
35
+ .rf-tabs__headline {
36
+ margin-top: 0;
37
+ }
38
+ .rf-tabs__blurb {
39
+ color: var(--rf-color-muted);
40
+ margin-bottom: 0;
41
+ }
42
+ .rf-tabs__image {
43
+ margin-bottom: 1rem;
44
+ }
9
45
  .rf-tabs__tabs,
10
46
  .rf-tabs__panels {
11
47
  list-style: none;