stagecraft 0.1.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.
Files changed (133) hide show
  1. package/AGENT.md +792 -0
  2. package/LICENSE +21 -0
  3. package/README.md +210 -0
  4. package/bin/cli.js +51 -0
  5. package/bin/export.js +137 -0
  6. package/bin/init.js +52 -0
  7. package/bin/lib/edit-ops.js +405 -0
  8. package/bin/serve.js +278 -0
  9. package/dist/stagecraft.bundle.css +4443 -0
  10. package/dist/stagecraft.bundle.js +7621 -0
  11. package/dist/themes/brand.bundle.css +5262 -0
  12. package/dist/themes/neon.bundle.css +5289 -0
  13. package/dist/themes/paper.bundle.css +5276 -0
  14. package/dist/themes/phosphor.bundle.css +4443 -0
  15. package/dist/themes/shopware.bundle.css +5850 -0
  16. package/examples/closing-card.js +74 -0
  17. package/examples/orchestration-graph.js +156 -0
  18. package/examples/terminal-log.js +109 -0
  19. package/examples/token-stream.js +96 -0
  20. package/examples/whoami.js +90 -0
  21. package/package.json +41 -0
  22. package/src/components/activity-list.js +75 -0
  23. package/src/components/agenda.js +79 -0
  24. package/src/components/bar-chart.js +162 -0
  25. package/src/components/before-after.js +135 -0
  26. package/src/components/bento.js +73 -0
  27. package/src/components/big-number.js +87 -0
  28. package/src/components/callout.js +75 -0
  29. package/src/components/checklist.js +81 -0
  30. package/src/components/code-block.js +141 -0
  31. package/src/components/code-diff.js +98 -0
  32. package/src/components/compare.js +85 -0
  33. package/src/components/counter.js +80 -0
  34. package/src/components/cta.js +69 -0
  35. package/src/components/cycle.js +146 -0
  36. package/src/components/definition.js +96 -0
  37. package/src/components/donut-chart.js +179 -0
  38. package/src/components/full-image.js +82 -0
  39. package/src/components/funnel.js +111 -0
  40. package/src/components/gauge.js +147 -0
  41. package/src/components/heatmap.js +141 -0
  42. package/src/components/image-grid.js +80 -0
  43. package/src/components/image-text.js +96 -0
  44. package/src/components/kinetic-text.js +72 -0
  45. package/src/components/kpi.js +106 -0
  46. package/src/components/line-chart.js +215 -0
  47. package/src/components/manifesto.js +104 -0
  48. package/src/components/marquee.js +63 -0
  49. package/src/components/matrix2x2.js +151 -0
  50. package/src/components/pillars.js +80 -0
  51. package/src/components/pricing.js +90 -0
  52. package/src/components/process-flow.js +133 -0
  53. package/src/components/progress.js +136 -0
  54. package/src/components/punchline.js +82 -0
  55. package/src/components/pyramid.js +107 -0
  56. package/src/components/qanda.js +60 -0
  57. package/src/components/quote.js +70 -0
  58. package/src/components/roadmap.js +130 -0
  59. package/src/components/section-card.js +45 -0
  60. package/src/components/shift-arrow.js +41 -0
  61. package/src/components/spark-line.js +147 -0
  62. package/src/components/spotlight.js +85 -0
  63. package/src/components/statement.js +106 -0
  64. package/src/components/stats.js +91 -0
  65. package/src/components/steps.js +83 -0
  66. package/src/components/swot.js +110 -0
  67. package/src/components/team-grid.js +87 -0
  68. package/src/components/testimonial.js +99 -0
  69. package/src/components/timeline.js +91 -0
  70. package/src/components/tip.js +63 -0
  71. package/src/components/venn.js +198 -0
  72. package/src/edit-mode.js +1256 -0
  73. package/src/engine.js +823 -0
  74. package/src/helpers.js +169 -0
  75. package/src/transitions.js +101 -0
  76. package/starter/index.html +40 -0
  77. package/starter/slides/00-title.js +12 -0
  78. package/starter/stagecraft.config.js +8 -0
  79. package/themes/brand/base.css +4 -0
  80. package/themes/brand/components-business.css +173 -0
  81. package/themes/brand/components-chart.css +65 -0
  82. package/themes/brand/components-content.css +126 -0
  83. package/themes/brand/components-data.css +162 -0
  84. package/themes/brand/components-diagram.css +115 -0
  85. package/themes/brand/components-layout.css +112 -0
  86. package/themes/brand/components.css +46 -0
  87. package/themes/brand/manifest.json +20 -0
  88. package/themes/brand/tokens.css +20 -0
  89. package/themes/brand/transitions.css +4 -0
  90. package/themes/neon/base.css +10 -0
  91. package/themes/neon/components-business.css +189 -0
  92. package/themes/neon/components-chart.css +70 -0
  93. package/themes/neon/components-content.css +112 -0
  94. package/themes/neon/components-data.css +160 -0
  95. package/themes/neon/components-diagram.css +109 -0
  96. package/themes/neon/components-layout.css +87 -0
  97. package/themes/neon/components.css +87 -0
  98. package/themes/neon/manifest.json +21 -0
  99. package/themes/neon/tokens.css +17 -0
  100. package/themes/neon/transitions.css +13 -0
  101. package/themes/paper/base.css +9 -0
  102. package/themes/paper/components-business.css +196 -0
  103. package/themes/paper/components-chart.css +74 -0
  104. package/themes/paper/components-content.css +108 -0
  105. package/themes/paper/components-data.css +168 -0
  106. package/themes/paper/components-diagram.css +89 -0
  107. package/themes/paper/components-layout.css +105 -0
  108. package/themes/paper/components.css +60 -0
  109. package/themes/paper/manifest.json +10 -0
  110. package/themes/paper/tokens.css +21 -0
  111. package/themes/paper/transitions.css +11 -0
  112. package/themes/phosphor/base.css +511 -0
  113. package/themes/phosphor/components-business.css +818 -0
  114. package/themes/phosphor/components-chart.css +415 -0
  115. package/themes/phosphor/components-content.css +530 -0
  116. package/themes/phosphor/components-data.css +824 -0
  117. package/themes/phosphor/components-diagram.css +427 -0
  118. package/themes/phosphor/components-layout.css +450 -0
  119. package/themes/phosphor/components.css +223 -0
  120. package/themes/phosphor/manifest.json +11 -0
  121. package/themes/phosphor/tokens.css +17 -0
  122. package/themes/phosphor/transitions.css +213 -0
  123. package/themes/shopware/base.css +94 -0
  124. package/themes/shopware/components-business.css +344 -0
  125. package/themes/shopware/components-chart.css +121 -0
  126. package/themes/shopware/components-content.css +169 -0
  127. package/themes/shopware/components-data.css +219 -0
  128. package/themes/shopware/components-diagram.css +129 -0
  129. package/themes/shopware/components-layout.css +166 -0
  130. package/themes/shopware/components.css +83 -0
  131. package/themes/shopware/manifest.json +21 -0
  132. package/themes/shopware/tokens.css +68 -0
  133. package/themes/shopware/transitions.css +22 -0
@@ -0,0 +1,126 @@
1
+ /* Stagecraft — Brand theme: content / typography component overrides.
2
+ * Statement · QandA · Manifesto · Punchline · Definition ·
3
+ * ImageGrid · Spotlight · Marquee */
4
+
5
+ @import url('../phosphor/components-content.css');
6
+
7
+ /* ===========================================================================
8
+ * Statement — no per-word blur on emphasis; no text-shadow halo
9
+ * ===========================================================================*/
10
+ :root[data-theme="brand"] .statement-text {
11
+ font-weight: 600;
12
+ letter-spacing: -0.035em;
13
+ }
14
+ :root[data-theme="brand"] .statement .st-em,
15
+ :root[data-theme="brand"] .statement .st-em--amber,
16
+ :root[data-theme="brand"] .statement .st-em--blue {
17
+ text-shadow: none;
18
+ }
19
+
20
+ /* ===========================================================================
21
+ * QandA — drop the big amber glow on the answer
22
+ * ===========================================================================*/
23
+ :root[data-theme="brand"] .qa-q {
24
+ font-style: normal;
25
+ color: var(--dim);
26
+ font-weight: 400;
27
+ }
28
+ :root[data-theme="brand"] .qa-q::before { color: var(--dim-2); }
29
+ :root[data-theme="brand"] .qa-a {
30
+ color: var(--accent);
31
+ text-shadow: none;
32
+ font-weight: 600;
33
+ }
34
+ :root[data-theme="brand"] .qa-attr { letter-spacing: 0.12em; }
35
+
36
+ /* ===========================================================================
37
+ * Manifesto — restrained numerals, no text-shadow
38
+ * ===========================================================================*/
39
+ :root[data-theme="brand"] .mf-num {
40
+ color: var(--accent);
41
+ text-shadow: none;
42
+ font-weight: 500;
43
+ }
44
+ :root[data-theme="brand"] .mf-text { font-weight: 500; }
45
+ :root[data-theme="brand"] .mf-text .mf-em { font-weight: 600; }
46
+ :root[data-theme="brand"] .mf-intro { letter-spacing: 0.12em; }
47
+
48
+ /* ===========================================================================
49
+ * Punchline — payoff stays accent but without blur/scale showmanship
50
+ * ===========================================================================*/
51
+ :root[data-theme="brand"] .pl-payoff {
52
+ text-shadow: none;
53
+ font-weight: 600;
54
+ letter-spacing: -0.035em;
55
+ /* keep entrance fade-up, drop the blur-in */
56
+ filter: none;
57
+ transform: translateY(16px);
58
+ }
59
+ :root[data-theme="brand"] .pl-payoff.in {
60
+ filter: none;
61
+ transform: translateY(0);
62
+ }
63
+
64
+ /* ===========================================================================
65
+ * Definition — dictionary entry stays restrained
66
+ * ===========================================================================*/
67
+ :root[data-theme="brand"] .df-term {
68
+ font-weight: 600;
69
+ letter-spacing: -0.035em;
70
+ }
71
+ :root[data-theme="brand"] .df-mark {
72
+ background: var(--accent-soft);
73
+ }
74
+
75
+ /* ===========================================================================
76
+ * ImageGrid — kill the rotation cascade (too whimsical for boardroom)
77
+ * ===========================================================================*/
78
+ :root[data-theme="brand"] .image-grid.ig--cascade .ig-cell,
79
+ :root[data-theme="brand"] .image-grid.ig--cascade .ig-cell:nth-child(even) {
80
+ transform: translateY(20px); /* plain vertical entry, no rotate */
81
+ }
82
+ :root[data-theme="brand"] .image-grid.ig--cascade .ig-cell.in {
83
+ transform: translateY(0);
84
+ }
85
+ :root[data-theme="brand"] .ig-frame::after {
86
+ box-shadow: inset 0 0 0 1px var(--dim-2);
87
+ }
88
+ :root[data-theme="brand"] .ig-cell:hover .ig-img {
89
+ transform: none; /* no zoom-on-hover */
90
+ filter: saturate(0.95) contrast(1.02);
91
+ }
92
+
93
+ /* ===========================================================================
94
+ * Spotlight — kill the layered halo; use a single clean accent border
95
+ * ===========================================================================*/
96
+ :root[data-theme="brand"] .sp-focus {
97
+ background: var(--bg-elevated);
98
+ border: 1px solid var(--accent);
99
+ box-shadow: none;
100
+ }
101
+ :root[data-theme="brand"] .sp-icon {
102
+ color: var(--accent);
103
+ text-shadow: none;
104
+ }
105
+ :root[data-theme="brand"] .sp-heading {
106
+ color: var(--accent);
107
+ font-weight: 600;
108
+ }
109
+ :root[data-theme="brand"] .sp-ctx-item { letter-spacing: 0.1em; }
110
+
111
+ /* ===========================================================================
112
+ * Marquee — restrained ticker, no italic glow row
113
+ * ===========================================================================*/
114
+ :root[data-theme="brand"] .mq-item {
115
+ font-weight: 600;
116
+ letter-spacing: -0.02em;
117
+ text-transform: none;
118
+ color: var(--fg);
119
+ }
120
+ :root[data-theme="brand"] .mq-track--b .mq-item {
121
+ color: var(--accent);
122
+ text-shadow: none;
123
+ font-style: normal;
124
+ font-weight: 600;
125
+ }
126
+ :root[data-theme="brand"] .mq-sep { color: var(--dim-2); }
@@ -0,0 +1,162 @@
1
+ /* Stagecraft — Brand theme: data-viz component overrides.
2
+ * KPI · DonutChart · LineChart · Gauge · SparkLine · Heatmap ·
3
+ * Roadmap · SWOT · CodeBlock · CodeDiff
4
+ *
5
+ * CodeBlock & CodeDiff intentionally keep --mono. Everything else
6
+ * gets the Inter body font and loses every kind of glow.
7
+ */
8
+
9
+ @import url('../phosphor/components-data.css');
10
+
11
+ /* ===========================================================================
12
+ * KPI — flat card, no halo on .in, no text-shadow on the number
13
+ * ===========================================================================*/
14
+ :root[data-theme="brand"] .kpi.in {
15
+ border-color: var(--dim-2);
16
+ box-shadow: none;
17
+ }
18
+ :root[data-theme="brand"] .kpi {
19
+ border-left: 2px solid var(--accent);
20
+ }
21
+ :root[data-theme="brand"] .kpi-num {
22
+ font-weight: 600;
23
+ /* text-shadow already neutralized via --accent-glow */
24
+ }
25
+ :root[data-theme="brand"] .kpi-label,
26
+ :root[data-theme="brand"] .kpi-head {
27
+ letter-spacing: 0.12em;
28
+ }
29
+
30
+ /* ===========================================================================
31
+ * DonutChart — flat legend dots, no arc drop shadow
32
+ * ===========================================================================*/
33
+ :root[data-theme="brand"] .donut-arc {
34
+ filter: none;
35
+ }
36
+ :root[data-theme="brand"] .donut-dot {
37
+ box-shadow: none;
38
+ }
39
+ :root[data-theme="brand"] .donut-legend-row {
40
+ font-family: var(--body);
41
+ }
42
+
43
+ /* ===========================================================================
44
+ * LineChart — no line glow, axis labels in Inter
45
+ * ===========================================================================*/
46
+ :root[data-theme="brand"] .lc-line {
47
+ filter: none;
48
+ stroke-width: 2;
49
+ }
50
+ :root[data-theme="brand"] .lc-grid {
51
+ stroke: var(--dim-2);
52
+ stroke-dasharray: none; /* solid faint grid for a corporate look */
53
+ opacity: 1;
54
+ }
55
+ :root[data-theme="brand"] .lc-y-label,
56
+ :root[data-theme="brand"] .lc-x-label {
57
+ font-family: var(--body);
58
+ font-size: 13px;
59
+ letter-spacing: 0.02em;
60
+ }
61
+ :root[data-theme="brand"] .lc-dot-leg {
62
+ box-shadow: none;
63
+ }
64
+
65
+ /* ===========================================================================
66
+ * Gauge — flat fill, no drop shadow, numbers in Inter
67
+ * ===========================================================================*/
68
+ :root[data-theme="brand"] .g-fill {
69
+ filter: none;
70
+ }
71
+ :root[data-theme="brand"] .g-num {
72
+ font-weight: 600;
73
+ text-shadow: none;
74
+ }
75
+
76
+ /* ===========================================================================
77
+ * SparkLine — same: flat, no line glow
78
+ * ===========================================================================*/
79
+ :root[data-theme="brand"] .sparkline {
80
+ background: var(--bg-elevated);
81
+ border: 1px solid var(--dim-2);
82
+ }
83
+ :root[data-theme="brand"] .sl-num {
84
+ font-weight: 600;
85
+ text-shadow: none;
86
+ }
87
+ :root[data-theme="brand"] .sl-line {
88
+ filter: none;
89
+ }
90
+
91
+ /* ===========================================================================
92
+ * Heatmap — grid stays the same; labels in Inter
93
+ * ===========================================================================*/
94
+ :root[data-theme="brand"] .hm-x-label,
95
+ :root[data-theme="brand"] .hm-y-label {
96
+ font-family: var(--body);
97
+ letter-spacing: 0.04em;
98
+ }
99
+
100
+ /* ===========================================================================
101
+ * Roadmap — flat bars, drop the inset 3px stripe glow
102
+ * ===========================================================================*/
103
+ :root[data-theme="brand"] .rm-bar {
104
+ box-shadow: inset 3px 0 0 var(--rm-bar-color);
105
+ }
106
+ :root[data-theme="brand"] .rm-month {
107
+ font-family: var(--body);
108
+ letter-spacing: 0.08em;
109
+ }
110
+
111
+ /* ===========================================================================
112
+ * SWOT — flat quadrants, no inset glow
113
+ * ===========================================================================*/
114
+ :root[data-theme="brand"] .swot-cell.in {
115
+ background: color-mix(in srgb, var(--swot-color) 4%, var(--bg));
116
+ box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--swot-color) 35%, var(--dim-2));
117
+ }
118
+ :root[data-theme="brand"] .swot-letter {
119
+ font-weight: 700;
120
+ text-shadow: none;
121
+ }
122
+ :root[data-theme="brand"] .swot-title {
123
+ letter-spacing: 0.12em;
124
+ }
125
+
126
+ /* ===========================================================================
127
+ * CodeBlock — code stays mono (intentional). Just clean up highlight glow.
128
+ * ===========================================================================*/
129
+ :root[data-theme="brand"] .codeblock {
130
+ background: var(--bg-elevated);
131
+ border: 1px solid var(--dim-2);
132
+ }
133
+ :root[data-theme="brand"] .cb-head {
134
+ font-family: var(--body);
135
+ }
136
+ :root[data-theme="brand"] .cb-file {
137
+ font-family: var(--body);
138
+ }
139
+ :root[data-theme="brand"] .cb-lang {
140
+ font-family: var(--body);
141
+ letter-spacing: 0.12em;
142
+ }
143
+ :root[data-theme="brand"] .cb-line--highlight {
144
+ background: var(--accent-soft);
145
+ box-shadow: inset 2px 0 0 var(--accent);
146
+ }
147
+
148
+ /* ===========================================================================
149
+ * CodeDiff — same: mono in the diff body, Inter in chrome
150
+ * ===========================================================================*/
151
+ :root[data-theme="brand"] .codediff {
152
+ background: var(--bg-elevated);
153
+ border: 1px solid var(--dim-2);
154
+ }
155
+ :root[data-theme="brand"] .cd-head,
156
+ :root[data-theme="brand"] .cd-file,
157
+ :root[data-theme="brand"] .cd-lang,
158
+ :root[data-theme="brand"] .cd-stats {
159
+ font-family: var(--body);
160
+ }
161
+ :root[data-theme="brand"] .cd-lang { letter-spacing: 0.12em; }
162
+ /* Keep red/green semantic colors — they're load-bearing for diffs. */
@@ -0,0 +1,115 @@
1
+ /* Stagecraft — Brand theme: diagram component overrides.
2
+ * Pillars · Timeline · Pyramid · Cycle · Funnel */
3
+
4
+ @import url('../phosphor/components-diagram.css');
5
+
6
+ /* Brand-local diag vars — replace the phosphor scoped ones. */
7
+ :root[data-theme="brand"] {
8
+ --diag-card-bg: var(--bg-elevated);
9
+ --diag-card-border: var(--dim-2);
10
+ }
11
+
12
+ /* ===========================================================================
13
+ * Pillars — tighter spacing, no pulse-on-hover glow drift
14
+ * ===========================================================================*/
15
+ :root[data-theme="brand"] .pillars-wrap { gap: clamp(1rem, 2vw, 1.8rem); }
16
+ :root[data-theme="brand"] .pillar {
17
+ padding: clamp(0.8rem, 1.4vw, 1.2rem) clamp(0.6rem, 1vw, 0.9rem);
18
+ gap: clamp(0.5rem, 1vw, 0.8rem);
19
+ }
20
+ :root[data-theme="brand"] .pillar-icon {
21
+ color: var(--accent);
22
+ font-size: 2.4rem;
23
+ /* Drop the pulse animation completely — boardroom mode. */
24
+ }
25
+ :root[data-theme="brand"] .pillar:hover .pillar-icon {
26
+ animation: none;
27
+ }
28
+ :root[data-theme="brand"] .pillar-heading {
29
+ font-weight: 600;
30
+ letter-spacing: -0.015em;
31
+ font-size: clamp(1.2rem, 2vw, 1.7rem);
32
+ }
33
+ :root[data-theme="brand"] .pillars-intro {
34
+ font-style: normal;
35
+ letter-spacing: 0.08em;
36
+ text-transform: uppercase;
37
+ font-size: clamp(0.8rem, 1.1vw, 1rem);
38
+ }
39
+
40
+ /* ===========================================================================
41
+ * Timeline — clean line, no soft halo on active dot
42
+ * ===========================================================================*/
43
+ :root[data-theme="brand"] .tl-event.active .tl-dot {
44
+ background: var(--accent);
45
+ border-color: var(--accent);
46
+ box-shadow: none; /* drop the 4px halo ring */
47
+ }
48
+ :root[data-theme="brand"] .tl-event.tc-accent.active .tl-dot,
49
+ :root[data-theme="brand"] .tl-event.tc-blue.active .tl-dot,
50
+ :root[data-theme="brand"] .tl-event.tc-amber.active .tl-dot,
51
+ :root[data-theme="brand"] .tl-event.tc-red.active .tl-dot {
52
+ box-shadow: none;
53
+ }
54
+ :root[data-theme="brand"] .tl-heading {
55
+ font-weight: 600;
56
+ }
57
+
58
+ /* ===========================================================================
59
+ * Pyramid — squared layers, no clip-path trapezoid (schlicht)
60
+ * ===========================================================================*/
61
+ :root[data-theme="brand"] .pyr-shape {
62
+ background: var(--bg-elevated);
63
+ border: 1px solid var(--dim-2);
64
+ clip-path: none;
65
+ padding: clamp(1rem, 1.8vw, 1.4rem) clamp(1.4rem, 2.5vw, 2rem);
66
+ }
67
+ :root[data-theme="brand"] .pyramid--down .pyr-shape { clip-path: none; }
68
+ :root[data-theme="brand"] .pyr-label { font-weight: 600; }
69
+ :root[data-theme="brand"] .pyr-layer.pyc-accent .pyr-shape {
70
+ background: var(--bg-elevated);
71
+ border-left: 2px solid var(--accent);
72
+ }
73
+ :root[data-theme="brand"] .pyr-layer.pyc-blue .pyr-shape { background: var(--bg-elevated); border-left: 2px solid var(--blue); }
74
+ :root[data-theme="brand"] .pyr-layer.pyc-amber .pyr-shape { background: var(--bg-elevated); border-left: 2px solid var(--amber); }
75
+ :root[data-theme="brand"] .pyr-layer.pyc-red .pyr-shape { background: var(--bg-elevated); border-left: 2px solid var(--red); }
76
+
77
+ /* ===========================================================================
78
+ * Cycle — grey ring, blue arcs/arrows kept clean
79
+ * ===========================================================================*/
80
+ :root[data-theme="brand"] .cyc-ring {
81
+ stroke: var(--dim-2);
82
+ stroke-dasharray: none;
83
+ opacity: 1;
84
+ }
85
+ :root[data-theme="brand"] .cyc-arc {
86
+ stroke: var(--accent);
87
+ stroke-width: 1.5;
88
+ }
89
+ :root[data-theme="brand"] .cyc-arrow {
90
+ stroke: var(--accent);
91
+ stroke-width: 2;
92
+ }
93
+ :root[data-theme="brand"] .cyc-item {
94
+ background: var(--bg-elevated);
95
+ border-radius: 0;
96
+ }
97
+ :root[data-theme="brand"] .cyc-label { font-weight: 600; }
98
+
99
+ /* ===========================================================================
100
+ * Funnel — flat plates with subtle accent left border
101
+ * ===========================================================================*/
102
+ :root[data-theme="brand"] .fn-shape {
103
+ background: var(--bg-elevated);
104
+ border-top: 1px solid var(--dim-2);
105
+ border-bottom: 1px solid var(--dim-2);
106
+ }
107
+ :root[data-theme="brand"] .fn-label { font-weight: 600; letter-spacing: 0.06em; }
108
+ :root[data-theme="brand"] .fn-value { font-weight: 600; }
109
+ :root[data-theme="brand"] .fn-stage.fnc-accent .fn-shape {
110
+ background: var(--bg-elevated);
111
+ border-color: var(--accent);
112
+ }
113
+ :root[data-theme="brand"] .fn-stage.fnc-blue .fn-shape { background: var(--bg-elevated); border-color: var(--blue); }
114
+ :root[data-theme="brand"] .fn-stage.fnc-amber .fn-shape { background: var(--bg-elevated); border-color: var(--amber); }
115
+ :root[data-theme="brand"] .fn-stage.fnc-red .fn-shape { background: var(--bg-elevated); border-color: var(--red); }
@@ -0,0 +1,112 @@
1
+ /* Stagecraft — Brand theme: layout component overrides.
2
+ *
3
+ * Strategy: inherit the phosphor structural CSS, then strip glow / heavy
4
+ * shadows / colored borders and lean on Inter + subtle dim-2 separators.
5
+ * Brand is the boardroom theme — no theatrics. */
6
+
7
+ @import url('../phosphor/components-layout.css');
8
+
9
+ /* ===========================================================================
10
+ * ImageText
11
+ * ===========================================================================*/
12
+ :root[data-theme="brand"] .it-img-frame {
13
+ /* Phosphor stacks a glow + drop-shadow. Brand: thin clean frame only. */
14
+ box-shadow: inset 0 0 0 1px var(--dim-2);
15
+ }
16
+ :root[data-theme="brand"] .it-img {
17
+ filter: saturate(0.95) contrast(1.02);
18
+ }
19
+ :root[data-theme="brand"] .it-heading {
20
+ font-weight: 600;
21
+ }
22
+ :root[data-theme="brand"] .it-caption {
23
+ letter-spacing: 0.12em;
24
+ }
25
+
26
+ /* ===========================================================================
27
+ * FullImage
28
+ * ===========================================================================*/
29
+ :root[data-theme="brand"] .fi-headline {
30
+ font-weight: 600;
31
+ text-shadow: 0 2px 12px rgba(0, 0, 0, 0.5);
32
+ }
33
+
34
+ /* ===========================================================================
35
+ * Quote
36
+ * ===========================================================================*/
37
+ :root[data-theme="brand"] .q-mark {
38
+ /* Restrained accent — text-shadow already nulled via --accent-glow. */
39
+ color: var(--accent);
40
+ font-weight: 300;
41
+ }
42
+ :root[data-theme="brand"] .q-text {
43
+ font-style: normal; /* schlicht */
44
+ font-weight: 400;
45
+ letter-spacing: -0.01em;
46
+ }
47
+ :root[data-theme="brand"] .q-author { font-weight: 600; }
48
+
49
+ /* ===========================================================================
50
+ * BigNumber
51
+ * ===========================================================================*/
52
+ :root[data-theme="brand"] .bn-num {
53
+ color: var(--accent);
54
+ font-weight: 600;
55
+ letter-spacing: -0.04em;
56
+ /* text-shadow already neutralized */
57
+ }
58
+ :root[data-theme="brand"] .bn-unit {
59
+ color: var(--accent);
60
+ opacity: 0.7;
61
+ }
62
+ :root[data-theme="brand"] .bn-label {
63
+ font-weight: 400;
64
+ color: var(--fg);
65
+ }
66
+ :root[data-theme="brand"] .bn-caption {
67
+ letter-spacing: 0.12em;
68
+ }
69
+
70
+ /* ===========================================================================
71
+ * Stats
72
+ * ===========================================================================*/
73
+ :root[data-theme="brand"] .stat {
74
+ background: var(--bg-elevated);
75
+ border: 1px solid var(--dim-2);
76
+ /* Phosphor uses a top accent bar (::before). We keep it but neuter the glow. */
77
+ }
78
+ :root[data-theme="brand"] .stat::before { display: none; }
79
+ :root[data-theme="brand"] .stat--accent { border-left: 2px solid var(--accent); }
80
+ :root[data-theme="brand"] .stat--amber { border-left: 2px solid var(--amber); }
81
+ :root[data-theme="brand"] .stat--blue { border-left: 2px solid var(--blue); }
82
+ :root[data-theme="brand"] .stat--red { border-left: 2px solid var(--red); }
83
+ :root[data-theme="brand"] .stat-num {
84
+ font-weight: 600;
85
+ letter-spacing: -0.035em;
86
+ }
87
+ :root[data-theme="brand"] .stat--accent .stat-num { color: var(--accent); }
88
+ :root[data-theme="brand"] .stat-label {
89
+ letter-spacing: 0.08em;
90
+ text-transform: uppercase;
91
+ font-size: clamp(0.75rem, 1vw, 0.9rem);
92
+ color: var(--dim);
93
+ }
94
+
95
+ /* ===========================================================================
96
+ * Bento
97
+ * ===========================================================================*/
98
+ :root[data-theme="brand"] .bento-cell {
99
+ background: var(--bg-elevated);
100
+ border: 1px solid var(--dim-2);
101
+ }
102
+ :root[data-theme="brand"] .bento-cell--accent {
103
+ border-color: var(--accent);
104
+ /* box-shadow already neutralized via --accent-glow */
105
+ }
106
+ :root[data-theme="brand"] .bento-cell--accent .bento-heading { color: var(--accent); }
107
+ :root[data-theme="brand"] .bento-cell--amber { border-color: color-mix(in srgb, var(--amber) 50%, var(--dim-2)); }
108
+ :root[data-theme="brand"] .bento-cell--blue { border-color: color-mix(in srgb, var(--blue) 50%, var(--dim-2)); }
109
+ :root[data-theme="brand"] .bento-heading {
110
+ font-weight: 600;
111
+ letter-spacing: -0.015em;
112
+ }
@@ -0,0 +1,46 @@
1
+ /* Stagecraft — Brand theme: Layer-2 component overrides.
2
+ *
3
+ * We import the phosphor root component file for the small set of
4
+ * "core" components (KineticText, SectionCard, ActivityList, Compare,
5
+ * Counter, ShiftArrow) — they're already restrained enough — and then
6
+ * layer per-family Brand overrides on top. Each per-family file imports
7
+ * its phosphor counterpart, so the cascade is:
8
+ *
9
+ * phosphor base -> phosphor family -> brand family override
10
+ */
11
+
12
+ @import url('../phosphor/components.css');
13
+
14
+ /* Family overrides */
15
+ @import url('./components-layout.css');
16
+ @import url('./components-diagram.css');
17
+ @import url('./components-chart.css');
18
+ @import url('./components-data.css');
19
+ @import url('./components-business.css');
20
+ @import url('./components-content.css');
21
+
22
+ /* -------------------------------------------------------------------------
23
+ * Brand polish on the "core 6" that live in phosphor/components.css
24
+ * ----------------------------------------------------------------------- */
25
+
26
+ /* SectionCard — tighter dot accents, weightier title */
27
+ :root[data-theme="brand"] .sec-title { font-weight: 600; }
28
+ :root[data-theme="brand"] .sec-num { letter-spacing: 0.25em; }
29
+
30
+ /* ActivityList */
31
+ :root[data-theme="brand"] .activity .num { letter-spacing: 0.18em; }
32
+ :root[data-theme="brand"] .activity .name { font-weight: 600; }
33
+
34
+ /* Counter — accent number gets blue (clean, no glow because --accent-glow=transparent) */
35
+ :root[data-theme="brand"] .counter-num { font-weight: 600; }
36
+
37
+ /* ShiftArrow */
38
+ :root[data-theme="brand"] .shift-from,
39
+ :root[data-theme="brand"] .shift-to { font-weight: 500; }
40
+
41
+ /* Compare — corporate caret style on the new column */
42
+ :root[data-theme="brand"] .compare-h { letter-spacing: 0.18em; }
43
+ :root[data-theme="brand"] .compare-h.new::before { color: var(--accent); }
44
+
45
+ /* KineticText — keep the soft fade, just slightly heavier accent weight */
46
+ :root[data-theme="brand"] .kinetic .line.accent { font-weight: 500; }
@@ -0,0 +1,20 @@
1
+ {
2
+ "name": "brand",
3
+ "displayName": "Brand",
4
+ "description": "Corporate, schlicht, dark. Inter on blue accent.",
5
+ "fonts": [
6
+ "https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap"
7
+ ],
8
+ "stylesheets": [
9
+ "tokens.css",
10
+ "base.css",
11
+ "components.css",
12
+ "components-layout.css",
13
+ "components-diagram.css",
14
+ "components-chart.css",
15
+ "components-data.css",
16
+ "components-business.css",
17
+ "components-content.css",
18
+ "transitions.css"
19
+ ]
20
+ }
@@ -0,0 +1,20 @@
1
+ /* Stagecraft — Brand theme tokens */
2
+ :root[data-theme="brand"] {
3
+ --bg: #0E1117;
4
+ --bg-elevated: #161B22;
5
+ --fg: #F0F6FC;
6
+ --dim: #7D8590;
7
+ --dim-2: #21262D;
8
+ --accent: #189EFF; /* Shopware-ish blue */
9
+ --accent-soft: rgba(24, 158, 255, 0.10);
10
+ /* Brand is glow-free. Keeping the var defined as transparent neutralizes
11
+ every box-shadow / text-shadow that the phosphor base relies on
12
+ without us having to rewrite every selector. */
13
+ --accent-glow: transparent;
14
+ --blue: #189EFF;
15
+ --amber: #DBAB0A;
16
+ --red: #F85149;
17
+ --mono: ui-monospace, SFMono-Regular, "JetBrains Mono", Menlo, monospace;
18
+ --display: 'Inter', system-ui, sans-serif;
19
+ --body: 'Inter', system-ui, sans-serif;
20
+ }
@@ -0,0 +1,4 @@
1
+ @import url('../phosphor/transitions.css');
2
+
3
+ /* Brand: muted glitch — no overlay */
4
+ :root[data-theme="brand"] .tx-glitch-overlay { display: none; }
@@ -0,0 +1,10 @@
1
+ @import url('../phosphor/base.css');
2
+
3
+ :root[data-theme="neon"] body::before {
4
+ background: radial-gradient(ellipse at center, rgba(255, 45, 230, 0.05) 0%, transparent 60%);
5
+ }
6
+
7
+ :root[data-theme="neon"] .caret { box-shadow: 0 0 16px var(--accent-glow); }
8
+
9
+ /* Stronger glow on focal elements */
10
+ :root[data-theme="neon"] .ui-dots .dot.active { box-shadow: 0 0 18px var(--accent-glow); }