@refrakt-md/lumina 0.4.0 → 0.5.1

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.
Files changed (88) hide show
  1. package/base.css +18 -0
  2. package/contracts/structures.json +1360 -3
  3. package/dist/config.d.ts +2 -3
  4. package/dist/config.d.ts.map +1 -1
  5. package/dist/config.js +6 -229
  6. package/dist/config.js.map +1 -1
  7. package/dist/icons.d.ts +3 -0
  8. package/dist/icons.d.ts.map +1 -0
  9. package/dist/icons.js +86 -0
  10. package/dist/icons.js.map +1 -0
  11. package/dist/transform.d.ts +2 -0
  12. package/dist/transform.d.ts.map +1 -1
  13. package/dist/transform.js +2 -0
  14. package/dist/transform.js.map +1 -1
  15. package/index.css +12 -0
  16. package/package.json +18 -11
  17. package/styles/elements/blockquote.css +8 -4
  18. package/styles/elements/code.css +40 -0
  19. package/styles/global.css +0 -7
  20. package/styles/layouts/blog.css +267 -0
  21. package/styles/layouts/default.css +26 -6
  22. package/styles/layouts/docs.css +84 -18
  23. package/styles/layouts/mobile.css +84 -0
  24. package/styles/runes/bento.css +2 -0
  25. package/styles/runes/codegroup.css +7 -2
  26. package/styles/runes/design-context.css +25 -0
  27. package/styles/runes/feature.css +30 -14
  28. package/styles/runes/form.css +1 -2
  29. package/styles/runes/grid.css +25 -7
  30. package/styles/runes/hero.css +15 -0
  31. package/styles/runes/map.css +113 -0
  32. package/styles/runes/palette.css +91 -0
  33. package/styles/runes/preview.css +188 -0
  34. package/styles/runes/sandbox.css +23 -0
  35. package/styles/runes/spacing.css +110 -0
  36. package/styles/runes/steps.css +21 -3
  37. package/styles/runes/swatch.css +28 -0
  38. package/styles/runes/symbol.css +164 -0
  39. package/styles/runes/tabs.css +6 -0
  40. package/styles/runes/testimonial.css +2 -3
  41. package/styles/runes/timeline.css +43 -24
  42. package/styles/runes/typography.css +104 -0
  43. package/svelte/elements.ts +1 -0
  44. package/{sveltekit → svelte}/index.ts +0 -8
  45. package/svelte/layouts/BlogLayout.svelte +173 -0
  46. package/svelte/layouts/DefaultLayout.svelte +67 -0
  47. package/svelte/layouts/DocsLayout.svelte +155 -0
  48. package/{sveltekit → svelte}/manifest.json +1 -1
  49. package/svelte/registry.ts +2 -0
  50. package/svelte/tokens.css +6 -0
  51. package/dist/lib/engine.d.ts +0 -13
  52. package/dist/lib/engine.d.ts.map +0 -1
  53. package/dist/lib/engine.js +0 -218
  54. package/dist/lib/engine.js.map +0 -1
  55. package/dist/lib/helpers.d.ts +0 -14
  56. package/dist/lib/helpers.d.ts.map +0 -1
  57. package/dist/lib/helpers.js +0 -26
  58. package/dist/lib/helpers.js.map +0 -1
  59. package/dist/lib/types.d.ts +0 -74
  60. package/dist/lib/types.d.ts.map +0 -1
  61. package/dist/lib/types.js +0 -2
  62. package/dist/lib/types.js.map +0 -1
  63. package/sveltekit/components/Accordion.svelte +0 -26
  64. package/sveltekit/components/Bento.svelte +0 -50
  65. package/sveltekit/components/Chart.svelte +0 -121
  66. package/sveltekit/components/CodeGroup.svelte +0 -88
  67. package/sveltekit/components/Comparison.svelte +0 -209
  68. package/sveltekit/components/DataTable.svelte +0 -154
  69. package/sveltekit/components/Details.svelte +0 -23
  70. package/sveltekit/components/Diagram.svelte +0 -45
  71. package/sveltekit/components/Embed.svelte +0 -36
  72. package/sveltekit/components/Form.svelte +0 -194
  73. package/sveltekit/components/Grid.svelte +0 -42
  74. package/sveltekit/components/Nav.svelte +0 -62
  75. package/sveltekit/components/Pricing.svelte +0 -20
  76. package/sveltekit/components/Reveal.svelte +0 -62
  77. package/sveltekit/components/Storyboard.svelte +0 -41
  78. package/sveltekit/components/Tabs.svelte +0 -75
  79. package/sveltekit/components/Testimonial.svelte +0 -26
  80. package/sveltekit/elements/Blockquote.svelte +0 -37
  81. package/sveltekit/elements/Pre.svelte +0 -77
  82. package/sveltekit/elements/Table.svelte +0 -40
  83. package/sveltekit/elements.ts +0 -11
  84. package/sveltekit/layouts/BlogLayout.svelte +0 -382
  85. package/sveltekit/layouts/DefaultLayout.svelte +0 -70
  86. package/sveltekit/layouts/DocsLayout.svelte +0 -133
  87. package/sveltekit/registry.ts +0 -59
  88. package/sveltekit/tokens.css +0 -71
@@ -0,0 +1,25 @@
1
+ /* Design Context — unified token card wrapper */
2
+ .rf-design-context {
3
+ margin: 1.5rem 0;
4
+ border: 1px solid var(--rf-color-border, #e5e7eb);
5
+ border-radius: 0.75rem;
6
+ overflow: hidden;
7
+ }
8
+ .rf-design-context__title {
9
+ font-size: 1.125rem;
10
+ font-weight: 600;
11
+ padding: 1rem 1.25rem;
12
+ border-bottom: 1px solid var(--rf-color-border, #e5e7eb);
13
+ background: var(--rf-color-bg-muted, #f9fafb);
14
+ }
15
+ .rf-design-context__sections {
16
+ display: flex;
17
+ flex-direction: column;
18
+ }
19
+ .rf-design-context__sections > * {
20
+ padding: 1.25rem;
21
+ margin: 0;
22
+ }
23
+ .rf-design-context__sections > * + * {
24
+ border-top: 1px dashed var(--rf-color-border, #e5e7eb);
25
+ }
@@ -2,48 +2,64 @@
2
2
  .rf-feature {
3
3
  padding: 2.5rem 0 2rem;
4
4
  }
5
- .rf-feature__main {
5
+ .rf-feature__body {
6
6
  display: contents;
7
7
  }
8
8
  .rf-feature h2 {
9
9
  text-align: center;
10
10
  margin-bottom: 2rem;
11
11
  }
12
+ .rf-feature dl {
13
+ display: grid;
14
+ grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
15
+ gap: 1.5rem;
16
+ margin: 0;
17
+ }
12
18
  .rf-feature--split {
13
19
  display: grid;
14
20
  align-items: center;
21
+ grid-template-columns: 1fr 1fr;
15
22
  gap: 3rem;
16
23
  }
24
+ .rf-feature--split .rf-feature__body {
25
+ display: block;
26
+ }
17
27
  .rf-feature--split h2 {
18
28
  text-align: left;
19
29
  }
20
30
  .rf-feature--split dl {
21
31
  display: block;
22
32
  }
23
- .rf-feature dl {
24
- display: grid;
25
- grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
26
- gap: 1.5rem;
27
- margin: 0;
33
+ .rf-feature--split .rf-feature-definition {
34
+ border: none;
35
+ background: none;
36
+ padding: 0.75rem 0;
37
+ }
38
+ .rf-feature--mirror .rf-feature__showcase {
39
+ order: -1;
28
40
  }
29
41
  .rf-feature-definition {
30
42
  padding: 1.75rem;
31
43
  border-radius: var(--rf-radius-md);
32
44
  border: 1px solid var(--rf-color-border);
33
45
  background: var(--rf-color-bg);
34
- box-shadow: var(--rf-shadow-sm);
35
- transition: box-shadow 200ms ease, border-color 200ms ease, transform 200ms ease;
36
- }
37
- .rf-feature-definition:hover {
38
- box-shadow: var(--rf-shadow-lg);
39
- border-color: var(--rf-color-surface-active);
40
- transform: translateY(-2px);
41
46
  }
42
47
  .rf-feature-definition dt {
43
48
  font-weight: 650;
44
49
  font-size: 1.05rem;
45
- margin-bottom: 0.5rem;
50
+ margin-bottom: 0.75rem;
46
51
  letter-spacing: -0.01em;
52
+ color: var(--rf-color-text);
53
+ }
54
+ .rf-feature-definition dt:has(> .rf-icon) {
55
+ display: flex;
56
+ flex-direction: column;
57
+ }
58
+ .rf-feature-definition dt > .rf-icon {
59
+ width: 1.5rem;
60
+ height: 1.5rem;
61
+ margin-bottom: 0.5rem;
62
+ color: var(--rf-color-accent);
47
63
  }
48
64
  .rf-feature-definition dd {
49
65
  margin: 0;
@@ -11,8 +11,7 @@
11
11
  flex-direction: column;
12
12
  gap: 1.25rem;
13
13
  }
14
- .rf-form meta,
15
- .rf-form span[property] { display: none; }
14
+ .rf-form meta { display: none; }
16
15
  /* Honeypot */
17
16
  .rf-form__hp {
18
17
  position: absolute;
@@ -1,13 +1,31 @@
1
1
  /* Grid */
2
2
  .rf-grid {
3
+ margin: 1.5rem 0;
4
+ }
5
+ .rf-grid [data-layout="grid"] {
3
6
  display: grid;
4
7
  grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
5
8
  gap: 1.5rem;
6
- margin: 1.5rem 0;
7
- }
8
- .rf-grid__item p:first-child {
9
- margin-top: 0;
10
- }
11
- .rf-grid__item p:last-child {
12
- margin-bottom: 0;
13
9
  }
10
+ /* Explicit column counts override auto-fit */
11
+ .rf-grid [data-columns="1"] { grid-template-columns: 1fr; }
12
+ .rf-grid [data-columns="2"] { grid-template-columns: repeat(2, 1fr); }
13
+ .rf-grid [data-columns="3"] { grid-template-columns: repeat(3, 1fr); }
14
+ .rf-grid [data-columns="4"] { grid-template-columns: repeat(4, 1fr); }
15
+ .rf-grid [data-columns="5"] { grid-template-columns: repeat(5, 1fr); }
16
+ .rf-grid [data-columns="6"] { grid-template-columns: repeat(6, 1fr); }
17
+ /* Flow */
18
+ .rf-grid [data-flow="column"] { grid-auto-flow: column; }
19
+ .rf-grid [data-flow="dense"] { grid-auto-flow: dense; }
20
+ .rf-grid [data-flow="row dense"] { grid-auto-flow: row dense; }
21
+ .rf-grid [data-flow="column dense"] { grid-auto-flow: column dense; }
22
+ /* Spans */
23
+ .rf-grid [data-colspan="2"] { grid-column: span 2; }
24
+ .rf-grid [data-colspan="3"] { grid-column: span 3; }
25
+ .rf-grid [data-colspan="4"] { grid-column: span 4; }
26
+ .rf-grid [data-rowspan="2"] { grid-row: span 2; }
27
+ .rf-grid [data-rowspan="3"] { grid-row: span 3; }
28
+ .rf-grid [data-rowspan="4"] { grid-row: span 4; }
29
+ /* Item styling */
30
+ .rf-grid [data-name="item"] p:first-child { margin-top: 0; }
31
+ .rf-grid [data-name="item"] p:last-child { margin-bottom: 0; }
@@ -9,12 +9,17 @@
9
9
  .rf-hero__actions {
10
10
  max-width: 720px;
11
11
  margin: 0 auto;
12
+ display: flex;
13
+ align-items: center;
14
+ gap: 0.75rem;
15
+ flex-wrap: wrap;
12
16
  }
13
17
  .rf-hero--center {
14
18
  text-align: center;
15
19
  }
16
20
  .rf-hero--center .rf-hero__actions {
17
21
  margin: 0 auto;
22
+ justify-content: center;
18
23
  }
19
24
  .rf-hero--left {
20
25
  text-align: left;
@@ -28,6 +33,16 @@
28
33
  .rf-hero--right .rf-hero__actions {
29
34
  margin: 0 0 0 auto;
30
35
  }
36
+ .rf-hero__actions pre {
37
+ margin: 0;
38
+ padding: 0.7rem 1.75rem;
39
+ font-size: 0.95rem;
40
+ border-radius: var(--rf-radius-sm);
41
+ background: var(--rf-color-code-bg);
42
+ color: var(--rf-color-code-text);
43
+ border: 1px solid var(--rf-color-border);
44
+ white-space: nowrap;
45
+ }
31
46
  .rf-hero h1 {
32
47
  font-size: 3.25rem;
33
48
  font-weight: 800;
@@ -0,0 +1,113 @@
1
+ /* ── Map Rune ── */
2
+
3
+ .rf-map {
4
+ margin: 2rem 0;
5
+ border-radius: var(--rf-radius-lg, 0.75rem);
6
+ overflow: hidden;
7
+ border: 1px solid var(--rf-color-border);
8
+ }
9
+
10
+ /* Height variants */
11
+ .rf-map--small .rf-map__container { height: 200px; }
12
+ .rf-map--medium .rf-map__container { height: 400px; }
13
+ .rf-map--large .rf-map__container { height: 600px; }
14
+ .rf-map--full .rf-map__container { height: 80vh; min-height: 400px; }
15
+
16
+ .rf-map__container {
17
+ width: 100%;
18
+ position: relative;
19
+ background: var(--rf-color-surface, #f8f9fa);
20
+ }
21
+
22
+ /* Fallback list shown while Leaflet loads */
23
+ .rf-map__fallback {
24
+ padding: 1.5rem;
25
+ margin: 0;
26
+ list-style: decimal inside;
27
+ font-size: 0.925rem;
28
+ color: var(--rf-color-muted);
29
+ }
30
+
31
+ .rf-map__fallback li {
32
+ padding: 0.25rem 0;
33
+ }
34
+
35
+ .rf-map__fallback strong {
36
+ color: var(--rf-color-text);
37
+ }
38
+
39
+ /* Accessible text list (visible to screen readers, hidden visually) */
40
+ .rf-map__pins {
41
+ position: absolute;
42
+ width: 1px;
43
+ height: 1px;
44
+ padding: 0;
45
+ margin: -1px;
46
+ overflow: hidden;
47
+ clip: rect(0, 0, 0, 0);
48
+ white-space: nowrap;
49
+ border: 0;
50
+ }
51
+
52
+ /* MapPin in fallback / a11y list */
53
+ .rf-map-pin {
54
+ padding: 0.25rem 0;
55
+ }
56
+
57
+ .rf-map-pin__description {
58
+ color: var(--rf-color-muted);
59
+ font-style: italic;
60
+ }
61
+
62
+ .rf-map-pin__group {
63
+ display: inline-block;
64
+ font-size: 0.75rem;
65
+ padding: 0.1rem 0.5rem;
66
+ border-radius: var(--rf-radius-sm, 0.25rem);
67
+ background: var(--rf-color-surface, #f0f0f0);
68
+ color: var(--rf-color-muted);
69
+ margin-left: 0.5rem;
70
+ }
71
+
72
+ /* Hide meta tags and property spans inside the map */
73
+ .rf-map meta,
74
+ .rf-map span[property] {
75
+ display: none;
76
+ }
77
+
78
+ /* Leaflet popup overrides to match theme */
79
+ .rf-map .leaflet-popup-content-wrapper {
80
+ border-radius: var(--rf-radius-md, 0.5rem);
81
+ font-family: var(--rf-font-sans, inherit);
82
+ font-size: 0.875rem;
83
+ color: var(--rf-color-text);
84
+ }
85
+
86
+ .rf-map .leaflet-popup-content {
87
+ margin: 0.75rem 1rem;
88
+ line-height: 1.5;
89
+ }
90
+
91
+ .rf-map .leaflet-popup-content strong {
92
+ display: block;
93
+ font-size: 0.95rem;
94
+ margin-bottom: 0.25rem;
95
+ }
96
+
97
+ .rf-map .leaflet-popup-content em {
98
+ color: var(--rf-color-muted);
99
+ }
100
+
101
+ .rf-map .leaflet-popup-content small {
102
+ color: var(--rf-color-muted);
103
+ font-size: 0.8rem;
104
+ }
105
+
106
+ .rf-map .leaflet-popup-content a {
107
+ color: var(--rf-color-primary);
108
+ text-decoration: none;
109
+ }
110
+
111
+ .rf-map .leaflet-popup-content a:hover {
112
+ text-decoration: underline;
113
+ }
@@ -0,0 +1,91 @@
1
+ /* Palette — color swatch grid */
2
+ .rf-palette {
3
+ margin: 1.5rem 0;
4
+ }
5
+ .rf-palette__title {
6
+ font-size: 1.125rem;
7
+ font-weight: 600;
8
+ margin-bottom: 1rem;
9
+ }
10
+ .rf-palette__group {
11
+ margin-bottom: 1.5rem;
12
+ }
13
+ .rf-palette__group:last-child {
14
+ margin-bottom: 0;
15
+ }
16
+ .rf-palette__group-title {
17
+ font-size: 0.8rem;
18
+ font-weight: 600;
19
+ text-transform: uppercase;
20
+ letter-spacing: 0.05em;
21
+ color: var(--rf-color-text-muted, #6b7280);
22
+ margin-bottom: 0.75rem;
23
+ }
24
+ .rf-palette__grid {
25
+ display: grid;
26
+ grid-template-columns: repeat(var(--rf-palette-cols, 4), 1fr);
27
+ gap: 0.75rem;
28
+ }
29
+ .rf-palette__swatch {
30
+ display: flex;
31
+ flex-direction: column;
32
+ gap: 0.375rem;
33
+ }
34
+ .rf-palette__swatch-color {
35
+ height: 5rem;
36
+ border-radius: var(--rf-radius-md, 8px);
37
+ border: 1px solid rgba(0, 0, 0, 0.08);
38
+ }
39
+ .rf-palette__swatch-name {
40
+ font-weight: 500;
41
+ font-size: 0.875rem;
42
+ }
43
+ .rf-palette__swatch-value {
44
+ font-family: var(--rf-font-mono, monospace);
45
+ font-size: 0.75rem;
46
+ color: var(--rf-color-text-muted, #6b7280);
47
+ }
48
+ .rf-palette__swatch-contrast {
49
+ font-family: var(--rf-font-mono, monospace);
50
+ font-size: 0.7rem;
51
+ color: var(--rf-color-text-muted, #6b7280);
52
+ }
53
+ .rf-palette__swatch-a11y {
54
+ display: flex;
55
+ gap: 0.5rem;
56
+ font-size: 0.7rem;
57
+ font-weight: 500;
58
+ }
59
+ .rf-palette__swatch-a11y--pass {
60
+ color: var(--rf-color-success, #10b981);
61
+ }
62
+ .rf-palette__swatch-a11y--fail {
63
+ color: var(--rf-color-danger, #ef4444);
64
+ }
65
+
66
+ /* Neutral scale — horizontal gradient strip */
67
+ .rf-palette__scale {
68
+ display: flex;
69
+ border-radius: var(--rf-radius-md, 8px);
70
+ overflow: hidden;
71
+ margin-bottom: 0.5rem;
72
+ }
73
+ .rf-palette__scale-stop {
74
+ flex: 1;
75
+ padding: 1.25rem 0.5rem 0.5rem;
76
+ display: flex;
77
+ align-items: flex-end;
78
+ justify-content: center;
79
+ min-height: 4rem;
80
+ font-size: 0.625rem;
81
+ font-family: var(--rf-font-mono, monospace);
82
+ }
83
+ .rf-palette__scale + .rf-palette__swatch-name {
84
+ margin-top: 0.25rem;
85
+ font-size: 0.8rem;
86
+ }
87
+
88
+ /* Context-aware: no outer margin when inside design-context */
89
+ .rf-palette--in-design-context {
90
+ margin: 0;
91
+ }
@@ -0,0 +1,188 @@
1
+ /* Preview — Component showcase with theme toggle and width control */
2
+ .rf-preview {
3
+ margin: 2rem 0;
4
+ border: 1px solid var(--rf-color-border);
5
+ border-radius: var(--rf-radius-lg);
6
+ overflow: hidden;
7
+ }
8
+
9
+ /* Width variants */
10
+ .rf-preview[data-width="medium"] {
11
+ width: calc(100% + 4rem);
12
+ margin-left: -2rem;
13
+ }
14
+ @container (min-width: 1008px) {
15
+ .rf-preview[data-width="wide"] {
16
+ width: calc(100% + 8rem);
17
+ margin-left: -4rem;
18
+ max-width: 76rem;
19
+ }
20
+ }
21
+ .rf-preview[data-width="full"] {
22
+ width: 100vw;
23
+ margin-left: calc(-50vw + 50%);
24
+ }
25
+
26
+ /* Toolbar */
27
+ .rf-preview__toolbar {
28
+ display: flex;
29
+ align-items: center;
30
+ justify-content: space-between;
31
+ padding: 0.5rem 1rem;
32
+ background: var(--rf-color-surface);
33
+ border-bottom: 1px solid var(--rf-color-border);
34
+ min-height: 2.5rem;
35
+ }
36
+ .rf-preview__title {
37
+ font-size: 0.75rem;
38
+ font-weight: 600;
39
+ color: var(--rf-color-muted);
40
+ text-transform: uppercase;
41
+ letter-spacing: 0.05em;
42
+ }
43
+
44
+ /* Controls container (view toggle + theme toggle) */
45
+ .rf-preview__controls {
46
+ display: flex;
47
+ align-items: center;
48
+ gap: 0.5rem;
49
+ }
50
+
51
+ /* View toggle pill (code/preview) */
52
+ .rf-preview__view-toggle {
53
+ display: flex;
54
+ gap: 0.125rem;
55
+ background: var(--rf-color-surface-active);
56
+ border-radius: var(--rf-radius-full);
57
+ padding: 0.125rem;
58
+ }
59
+
60
+ /* Theme toggle pill */
61
+ .rf-preview__toggle {
62
+ display: flex;
63
+ gap: 0.125rem;
64
+ background: var(--rf-color-surface-active);
65
+ border-radius: var(--rf-radius-full);
66
+ padding: 0.125rem;
67
+ }
68
+ .rf-preview__toggle-btn {
69
+ display: flex;
70
+ align-items: center;
71
+ justify-content: center;
72
+ width: 1.625rem;
73
+ height: 1.625rem;
74
+ border: none;
75
+ border-radius: var(--rf-radius-full);
76
+ background: transparent;
77
+ color: var(--rf-color-muted);
78
+ cursor: pointer;
79
+ transition: background 150ms ease, color 150ms ease;
80
+ padding: 0;
81
+ }
82
+ .rf-preview__toggle-btn:hover {
83
+ color: var(--rf-color-text);
84
+ }
85
+ .rf-preview__toggle-btn--active {
86
+ background: var(--rf-color-bg);
87
+ color: var(--rf-color-text);
88
+ box-shadow: var(--rf-shadow-xs);
89
+ }
90
+
91
+ /* Canvas */
92
+ .rf-preview__canvas {
93
+ padding: 2rem 2.5rem;
94
+ background: var(--rf-color-bg);
95
+ }
96
+ .rf-preview__canvas > *:first-child {
97
+ margin-top: 0;
98
+ }
99
+ .rf-preview__canvas > *:last-child {
100
+ margin-bottom: 0;
101
+ }
102
+
103
+ /* Viewport simulation toggle pill */
104
+ .rf-preview__viewport-toggle {
105
+ display: flex;
106
+ gap: 0.125rem;
107
+ background: var(--rf-color-surface-active);
108
+ border-radius: var(--rf-radius-full);
109
+ padding: 0.125rem;
110
+ }
111
+
112
+ /* Viewport simulation frame */
113
+ .rf-preview__viewport-frame {
114
+ position: relative;
115
+ overflow: hidden;
116
+ transition: max-width 300ms ease;
117
+ }
118
+ .rf-preview__viewport-frame--constrained {
119
+ margin: 0 auto;
120
+ border: 1px dashed var(--rf-color-border);
121
+ border-radius: var(--rf-radius-sm);
122
+ }
123
+ .rf-preview__viewport-label {
124
+ position: absolute;
125
+ top: 0.25rem;
126
+ right: 0.5rem;
127
+ font-size: 0.625rem;
128
+ color: var(--rf-color-muted);
129
+ font-variant-numeric: tabular-nums;
130
+ pointer-events: none;
131
+ z-index: 1;
132
+ }
133
+
134
+ /* Source code view */
135
+ .rf-preview__source {
136
+ overflow: auto;
137
+ }
138
+ .rf-preview__source pre {
139
+ margin: 0;
140
+ border-radius: 0;
141
+ }
142
+ .rf-preview__source .rf-codeblock,
143
+ .rf-preview__source .rf-code-wrapper {
144
+ border-radius: 0;
145
+ }
146
+
147
+ /* Source tabs (data-source panels) */
148
+ .rf-preview__source-tabs {
149
+ display: flex;
150
+ gap: 0;
151
+ background: var(--rf-color-surface);
152
+ border-bottom: 1px solid var(--rf-color-border);
153
+ }
154
+ .rf-preview__source-tab {
155
+ padding: 0.5rem 1rem;
156
+ border: none;
157
+ background: transparent;
158
+ color: var(--rf-color-muted);
159
+ font-size: 0.75rem;
160
+ font-weight: 500;
161
+ cursor: pointer;
162
+ border-bottom: 2px solid transparent;
163
+ transition: color 150ms ease, border-color 150ms ease;
164
+ }
165
+ .rf-preview__source-tab:hover {
166
+ color: var(--rf-color-text);
167
+ }
168
+ .rf-preview__source-tab--active {
169
+ color: var(--rf-color-text);
170
+ border-bottom-color: var(--rf-color-primary);
171
+ }
172
+
173
+ /* Small containers: edge-to-edge bleed */
174
+ @container (max-width: 1008px) {
175
+ .rf-preview {
176
+ margin-left: calc(-1 * var(--rf-content-padding, 1.5rem));
177
+ margin-right: calc(-1 * var(--rf-content-padding, 1.5rem));
178
+ border-radius: 0;
179
+ border-left: none;
180
+ border-right: none;
181
+ }
182
+ .rf-preview__toolbar {
183
+ padding: 0.5rem calc(var(--rf-content-padding, 1.5rem) + 1rem) 0.5rem var(--rf-content-padding, 1.5rem);
184
+ }
185
+ .rf-preview__canvas {
186
+ padding: 1.5rem var(--rf-content-padding, 1.5rem);
187
+ }
188
+ }
@@ -0,0 +1,23 @@
1
+ /* Sandbox — Isolated HTML/CSS/JS rendering via iframe */
2
+ .rf-sandbox {
3
+ margin: 1.5rem 0;
4
+ border-radius: var(--rf-radius-md);
5
+ overflow: hidden;
6
+ }
7
+
8
+ .rf-sandbox iframe {
9
+ display: block;
10
+ width: 100%;
11
+ border: none;
12
+ }
13
+
14
+ /* Static fallback (pre/code shown before hydration) */
15
+ .rf-sandbox pre {
16
+ margin: 0;
17
+ }
18
+
19
+ /* When inside preview, remove sandbox margin */
20
+ .rf-preview .rf-sandbox {
21
+ margin: 0;
22
+ border-radius: 0;
23
+ }
@@ -0,0 +1,110 @@
1
+ /* Spacing — spacing scale, radii, and shadow display */
2
+ .rf-spacing {
3
+ margin: 1.5rem 0;
4
+ }
5
+ .rf-spacing__title {
6
+ font-size: 1.125rem;
7
+ font-weight: 600;
8
+ margin-bottom: 1rem;
9
+ }
10
+ .rf-spacing__section {
11
+ margin-bottom: 2rem;
12
+ }
13
+ .rf-spacing__section:last-child {
14
+ margin-bottom: 0;
15
+ }
16
+ .rf-spacing__section-title {
17
+ font-size: 0.8rem;
18
+ font-weight: 600;
19
+ text-transform: uppercase;
20
+ letter-spacing: 0.05em;
21
+ color: var(--rf-color-text-muted, #6b7280);
22
+ margin-bottom: 0.75rem;
23
+ }
24
+
25
+ /* Spacing scale — proportional bars */
26
+ .rf-spacing__scale {
27
+ display: flex;
28
+ flex-direction: column;
29
+ gap: 0.375rem;
30
+ }
31
+ .rf-spacing__scale-item {
32
+ display: flex;
33
+ align-items: center;
34
+ gap: 0.75rem;
35
+ }
36
+ .rf-spacing__scale-bar {
37
+ height: 1.25rem;
38
+ background: var(--rf-color-primary, #0ea5e9);
39
+ border-radius: var(--rf-radius-sm, 4px);
40
+ opacity: 0.8;
41
+ min-width: 4px;
42
+ }
43
+ .rf-spacing__scale-label {
44
+ font-size: 0.75rem;
45
+ font-family: var(--rf-font-mono, monospace);
46
+ color: var(--rf-color-text, #1a1a2e);
47
+ white-space: nowrap;
48
+ flex-shrink: 0;
49
+ }
50
+ .rf-spacing__scale-multiplier {
51
+ color: var(--rf-color-text-muted, #6b7280);
52
+ margin-left: 0.25rem;
53
+ }
54
+
55
+ /* Radius — rounded corner samples */
56
+ .rf-spacing__radii {
57
+ display: flex;
58
+ gap: 1.25rem;
59
+ flex-wrap: wrap;
60
+ align-items: flex-end;
61
+ }
62
+ .rf-spacing__radius-item {
63
+ display: flex;
64
+ flex-direction: column;
65
+ align-items: center;
66
+ gap: 0.375rem;
67
+ }
68
+ .rf-spacing__radius-sample {
69
+ width: 3.5rem;
70
+ height: 3.5rem;
71
+ border: 2px solid var(--rf-color-border, #e5e7eb);
72
+ background: var(--rf-color-surface-raised, #f9fafb);
73
+ }
74
+ .rf-spacing__radius-label {
75
+ font-weight: 500;
76
+ font-size: 0.8rem;
77
+ }
78
+ .rf-spacing__radius-value {
79
+ font-size: 0.7rem;
80
+ font-family: var(--rf-font-mono, monospace);
81
+ color: var(--rf-color-text-muted, #6b7280);
82
+ }
83
+
84
+ /* Shadows — sample cards */
85
+ .rf-spacing__shadows {
86
+ display: flex;
87
+ gap: 1.5rem;
88
+ flex-wrap: wrap;
89
+ }
90
+ .rf-spacing__shadow-item {
91
+ display: flex;
92
+ flex-direction: column;
93
+ align-items: center;
94
+ gap: 0.5rem;
95
+ }
96
+ .rf-spacing__shadow-sample {
97
+ width: 5rem;
98
+ height: 3.5rem;
99
+ background: var(--rf-color-surface, #fff);
100
+ border-radius: var(--rf-radius-md, 8px);
101
+ }
102
+ .rf-spacing__shadow-label {
103
+ font-weight: 500;
104
+ font-size: 0.8rem;
105
+ }
106
+
107
+ /* Context-aware: no outer margin when inside design-context */
108
+ .rf-spacing--in-design-context {
109
+ margin: 0;
110
+ }