@usetheo/ui 0.1.0-next.0 → 0.1.0-next.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 (135) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +116 -9
  3. package/dist/index.d.ts +1 -1
  4. package/dist/index.js.map +1 -1
  5. package/dist/plugin-Atb0VKtr.d.ts +172 -0
  6. package/dist/slide/index.d.ts +212 -0
  7. package/dist/slide/index.js +714 -0
  8. package/dist/slide/index.js.map +1 -0
  9. package/dist/slide/plugins/emoji/index.d.ts +29 -0
  10. package/dist/slide/plugins/emoji/index.js +157 -0
  11. package/dist/slide/plugins/emoji/index.js.map +1 -0
  12. package/dist/slide/plugins/math/index.d.ts +13 -0
  13. package/dist/slide/plugins/math/index.js +145 -0
  14. package/dist/slide/plugins/math/index.js.map +1 -0
  15. package/dist/slide/plugins/mermaid/index.d.ts +55 -0
  16. package/dist/slide/plugins/mermaid/index.js +218 -0
  17. package/dist/slide/plugins/mermaid/index.js.map +1 -0
  18. package/dist/slide/plugins/shiki/index.d.ts +18 -0
  19. package/dist/slide/plugins/shiki/index.js +87 -0
  20. package/dist/slide/plugins/shiki/index.js.map +1 -0
  21. package/dist/slide/themes/default.css +256 -0
  22. package/dist/slide/themes/layouts.css +143 -0
  23. package/dist/slide/themes/violet-forge.css +256 -0
  24. package/dist/slide-deck/index.css +52 -0
  25. package/dist/slide-deck/index.css.map +1 -0
  26. package/dist/slide-deck/index.d.ts +377 -0
  27. package/dist/slide-deck/index.js +1797 -0
  28. package/dist/slide-deck/index.js.map +1 -0
  29. package/dist/whiteboard/index.d.ts +258 -0
  30. package/dist/whiteboard/index.js +738 -0
  31. package/dist/whiteboard/index.js.map +1 -0
  32. package/package.json +141 -9
  33. package/registry/r/agent-composer.json +4 -4
  34. package/registry/r/agent-editor.json +9 -9
  35. package/registry/r/agent-error-card.json +2 -2
  36. package/registry/r/agent-event.json +4 -4
  37. package/registry/r/agent-handoff.json +2 -2
  38. package/registry/r/agent-profile.json +2 -2
  39. package/registry/r/agent-starting-state.json +2 -2
  40. package/registry/r/agent-stream.json +9 -9
  41. package/registry/r/agent-streaming.json +2 -2
  42. package/registry/r/agent-timeline.json +4 -4
  43. package/registry/r/approval-card.json +4 -4
  44. package/registry/r/artifact-preview.json +2 -2
  45. package/registry/r/attachment-chip.json +4 -4
  46. package/registry/r/audit-log-entry.json +3 -3
  47. package/registry/r/auto-compact-notice.json +2 -2
  48. package/registry/r/avatar.json +2 -2
  49. package/registry/r/badge.json +2 -2
  50. package/registry/r/browser-controls.json +2 -2
  51. package/registry/r/build-log-stream.json +2 -2
  52. package/registry/r/button.json +2 -2
  53. package/registry/r/capability-indicator.json +3 -3
  54. package/registry/r/card.json +2 -2
  55. package/registry/r/chat-composer.json +3 -3
  56. package/registry/r/chat-message.json +3 -3
  57. package/registry/r/chat-thread.json +2 -2
  58. package/registry/r/checkbox.json +2 -2
  59. package/registry/r/command-palette.json +4 -4
  60. package/registry/r/context-card.json +3 -3
  61. package/registry/r/context-window-bar.json +2 -2
  62. package/registry/r/cost-meter.json +2 -2
  63. package/registry/r/created-files-card.json +3 -3
  64. package/registry/r/cron-job-card.json +2 -2
  65. package/registry/r/cron-jobs-list.json +3 -3
  66. package/registry/r/deployment-row.json +3 -3
  67. package/registry/r/dialog.json +2 -2
  68. package/registry/r/diff-viewer.json +2 -2
  69. package/registry/r/domain-config.json +6 -6
  70. package/registry/r/empty-state.json +3 -3
  71. package/registry/r/env-var-editor.json +5 -5
  72. package/registry/r/folder-context-card.json +3 -3
  73. package/registry/r/folder-selector.json +2 -2
  74. package/registry/r/form-field.json +2 -2
  75. package/registry/r/hook-config.json +2 -2
  76. package/registry/r/hook-event-log.json +2 -2
  77. package/registry/r/input.json +2 -2
  78. package/registry/r/intent-selector.json +3 -3
  79. package/registry/r/label.json +2 -2
  80. package/registry/r/lane-board.json +2 -2
  81. package/registry/r/login-split.json +2 -2
  82. package/registry/r/mcp-server-card.json +2 -2
  83. package/registry/r/mcp-server-list.json +3 -3
  84. package/registry/r/memory-editor.json +3 -3
  85. package/registry/r/mention-menu.json +3 -3
  86. package/registry/r/metrics-panel.json +2 -2
  87. package/registry/r/model-card.json +3 -3
  88. package/registry/r/model-selector.json +2 -2
  89. package/registry/r/permission-matrix.json +2 -2
  90. package/registry/r/permission-modal.json +4 -4
  91. package/registry/r/preview-env-card.json +5 -5
  92. package/registry/r/preview-panel.json +3 -3
  93. package/registry/r/progress-checklist.json +3 -3
  94. package/registry/r/project-card.json +5 -5
  95. package/registry/r/project-switcher.json +2 -2
  96. package/registry/r/quick-action-chips.json +3 -3
  97. package/registry/r/radio-group.json +2 -2
  98. package/registry/r/recent-folders-list.json +2 -2
  99. package/registry/r/rollback-ui.json +4 -4
  100. package/registry/r/rule-card.json +3 -3
  101. package/registry/r/rule-editor.json +10 -10
  102. package/registry/r/rule-types.json +1 -1
  103. package/registry/r/run-stats.json +2 -2
  104. package/registry/r/running-tasks-panel.json +2 -2
  105. package/registry/r/scroll-area.json +2 -2
  106. package/registry/r/select.json +2 -2
  107. package/registry/r/session-list-item.json +2 -2
  108. package/registry/r/session-timeline.json +2 -2
  109. package/registry/r/sheet.json +2 -2
  110. package/registry/r/sidebar.json +2 -2
  111. package/registry/r/skeleton.json +2 -2
  112. package/registry/r/skill-card.json +4 -4
  113. package/registry/r/skill-editor.json +10 -10
  114. package/registry/r/skills-list.json +3 -3
  115. package/registry/r/social-auth-row.json +3 -3
  116. package/registry/r/steps-rail.json +2 -2
  117. package/registry/r/sub-agent-dispatch.json +2 -2
  118. package/registry/r/switch.json +2 -2
  119. package/registry/r/system-prompt-editor.json +2 -2
  120. package/registry/r/tabs.json +2 -2
  121. package/registry/r/task-header.json +4 -4
  122. package/registry/r/task-plan.json +2 -2
  123. package/registry/r/terminal-panel.json +2 -2
  124. package/registry/r/textarea.json +2 -2
  125. package/registry/r/theme-provider.json +2 -2
  126. package/registry/r/theme-script.json +1 -1
  127. package/registry/r/theo-ui-provider.json +2 -2
  128. package/registry/r/toast.json +2 -2
  129. package/registry/r/token-usage-chart.json +2 -2
  130. package/registry/r/tool-call-card.json +3 -3
  131. package/registry/r/tool-call.json +2 -2
  132. package/registry/r/tool-result.json +2 -2
  133. package/registry/r/tools-list.json +3 -3
  134. package/registry/r/tooltip.json +2 -2
  135. package/registry/r/topnav.json +2 -2
@@ -0,0 +1,256 @@
1
+ /*
2
+ * Slide primitive — `default` theme.
3
+ *
4
+ * Inherit-first design (mirrors the Whiteboard SVG using `currentColor`):
5
+ * the slide's foreground and background come from the parent. The consumer's
6
+ * surface (Tailwind classes, `<ThemeProvider>`, dashboard chrome) decides
7
+ * light/dark — the theme just provides typography + relative tints derived
8
+ * from `currentColor` via `color-mix()`.
9
+ *
10
+ * Result: the slide automatically follows the host's color scheme without
11
+ * needing a `colorScheme` prop or `prefers-color-scheme` media query.
12
+ *
13
+ * All selectors are scoped to `.theo-slide[data-theo-slide-theme="default"]`
14
+ * so themes coexist on the same page without bleed.
15
+ */
16
+
17
+ @import "./layouts.css";
18
+
19
+ .theo-slide[data-theo-slide-theme="default"] {
20
+ --theo-slide-canvas-width: 1280px;
21
+ --theo-slide-canvas-height: 720px;
22
+ --theo-slide-padding: 64px;
23
+ --theo-slide-font-base: 28px;
24
+ --theo-slide-font-family: var(
25
+ --vf-font-family-sans,
26
+ system-ui,
27
+ -apple-system,
28
+ "Segoe UI",
29
+ sans-serif
30
+ );
31
+ --theo-slide-font-mono: var(--vf-font-family-mono, ui-monospace, "JetBrains Mono", monospace);
32
+
33
+ /* Derived tints — relative to the inherited `currentColor`. They lighten or
34
+ darken automatically depending on whether the parent's color is dark
35
+ (light surface) or light (dark surface). */
36
+ --theo-slide-color-muted: color-mix(in srgb, currentColor 60%, transparent);
37
+ --theo-slide-color-tint-strong: color-mix(in srgb, currentColor 12%, transparent);
38
+ --theo-slide-color-tint-weak: color-mix(in srgb, currentColor 6%, transparent);
39
+ --theo-slide-color-border: color-mix(in srgb, currentColor 20%, transparent);
40
+
41
+ color: inherit;
42
+ background: transparent;
43
+ font-family: var(--theo-slide-font-family);
44
+ font-size: var(--theo-slide-font-base);
45
+ line-height: 1.5;
46
+ }
47
+
48
+ .theo-slide[data-theo-slide-theme="default"] h1,
49
+ .theo-slide[data-theo-slide-theme="default"] h2,
50
+ .theo-slide[data-theo-slide-theme="default"] h3,
51
+ .theo-slide[data-theo-slide-theme="default"] h4,
52
+ .theo-slide[data-theo-slide-theme="default"] h5,
53
+ .theo-slide[data-theo-slide-theme="default"] h6 {
54
+ color: inherit;
55
+ line-height: 1.2;
56
+ margin: 0 0 0.5em 0;
57
+ font-weight: 600;
58
+ }
59
+
60
+ .theo-slide[data-theo-slide-theme="default"] h1 {
61
+ font-size: 1.8em;
62
+ }
63
+ .theo-slide[data-theo-slide-theme="default"] h2 {
64
+ font-size: 1.4em;
65
+ }
66
+ .theo-slide[data-theo-slide-theme="default"] h3 {
67
+ font-size: 1.2em;
68
+ }
69
+ .theo-slide[data-theo-slide-theme="default"] h4 {
70
+ font-size: 1.05em;
71
+ }
72
+ .theo-slide[data-theo-slide-theme="default"] h5 {
73
+ font-size: 1em;
74
+ }
75
+ .theo-slide[data-theo-slide-theme="default"] h6 {
76
+ font-size: 0.9em;
77
+ color: var(--theo-slide-color-muted);
78
+ }
79
+
80
+ .theo-slide[data-theo-slide-theme="default"] p {
81
+ margin: 0 0 0.75em 0;
82
+ }
83
+
84
+ .theo-slide[data-theo-slide-theme="default"] ul,
85
+ .theo-slide[data-theo-slide-theme="default"] ol {
86
+ margin: 0 0 0.75em 0;
87
+ padding-left: 1.5em;
88
+ }
89
+
90
+ .theo-slide[data-theo-slide-theme="default"] li {
91
+ margin: 0.25em 0;
92
+ }
93
+
94
+ .theo-slide[data-theo-slide-theme="default"] blockquote {
95
+ margin: 0 0 0.75em 0;
96
+ padding: 0.25em 0.75em;
97
+ border-left: 4px solid var(--theo-slide-color-border);
98
+ color: var(--theo-slide-color-muted);
99
+ }
100
+
101
+ .theo-slide[data-theo-slide-theme="default"] a {
102
+ color: currentColor;
103
+ text-decoration: underline;
104
+ text-underline-offset: 2px;
105
+ font-weight: 600;
106
+ }
107
+
108
+ .theo-slide[data-theo-slide-theme="default"] code {
109
+ font-family: var(--theo-slide-font-mono);
110
+ font-size: 0.9em;
111
+ padding: 0.1em 0.4em;
112
+ border-radius: 4px;
113
+ background: var(--theo-slide-color-tint-strong);
114
+ color: inherit;
115
+ }
116
+
117
+ .theo-slide[data-theo-slide-theme="default"] pre {
118
+ font-family: var(--theo-slide-font-mono);
119
+ background: var(--theo-slide-color-tint-strong);
120
+ color: inherit;
121
+ padding: 0.75em 1em;
122
+ border-radius: 8px;
123
+ overflow: auto;
124
+ font-size: 0.85em;
125
+ }
126
+
127
+ .theo-slide[data-theo-slide-theme="default"] pre code {
128
+ padding: 0;
129
+ background: transparent;
130
+ font-size: inherit;
131
+ }
132
+
133
+ .theo-slide[data-theo-slide-theme="default"] hr {
134
+ border: none;
135
+ border-top: 1px solid var(--theo-slide-color-border);
136
+ margin: 1em 0;
137
+ }
138
+
139
+ .theo-slide[data-theo-slide-theme="default"] table {
140
+ border-collapse: collapse;
141
+ margin: 0 0 0.75em 0;
142
+ }
143
+
144
+ .theo-slide[data-theo-slide-theme="default"] th,
145
+ .theo-slide[data-theo-slide-theme="default"] td {
146
+ border: 1px solid var(--theo-slide-color-border);
147
+ padding: 0.4em 0.75em;
148
+ text-align: left;
149
+ }
150
+
151
+ .theo-slide[data-theo-slide-theme="default"] thead th {
152
+ background: var(--theo-slide-color-tint-weak);
153
+ font-weight: 600;
154
+ }
155
+
156
+ .theo-slide[data-theo-slide-theme="default"] tbody tr:nth-child(even) td {
157
+ background: var(--theo-slide-color-tint-weak);
158
+ }
159
+
160
+ .theo-slide[data-theo-slide-theme="default"] img {
161
+ max-width: 100%;
162
+ height: auto;
163
+ border-radius: 6px;
164
+ }
165
+
166
+ .theo-slide[data-theo-slide-theme="default"] em {
167
+ font-style: italic;
168
+ }
169
+ .theo-slide[data-theo-slide-theme="default"] strong {
170
+ font-weight: 600;
171
+ }
172
+ .theo-slide[data-theo-slide-theme="default"] del {
173
+ text-decoration: line-through;
174
+ color: var(--theo-slide-color-muted);
175
+ }
176
+ .theo-slide[data-theo-slide-theme="default"] kbd {
177
+ font-family: var(--theo-slide-font-mono);
178
+ font-size: 0.85em;
179
+ padding: 0.1em 0.4em;
180
+ border: 1px solid var(--theo-slide-color-border);
181
+ border-radius: 4px;
182
+ background: var(--theo-slide-color-tint-weak);
183
+ }
184
+
185
+ /* ─────────────────────────────────────────────────────────────────
186
+ * GFM alerts — `> [!NOTE]`, `> [!TIP]`, `> [!IMPORTANT]`,
187
+ * `> [!WARNING]`, `> [!CAUTION]`
188
+ * Pre-processed in mdast (alerts.ts) → <aside class="theo-slide-alert"
189
+ * data-theo-slide-alert-type="…"> rich-content plan T1.2.
190
+ * ───────────────────────────────────────────────────────────────── */
191
+ .theo-slide[data-theo-slide-theme="default"] aside.theo-slide-alert {
192
+ margin: 0 0 0.75em 0;
193
+ padding: 0.75em 1em;
194
+ border-left: 4px solid currentColor;
195
+ border-radius: 0.4em;
196
+ background: color-mix(in srgb, currentColor 8%, transparent);
197
+ }
198
+ .theo-slide[data-theo-slide-theme="default"] aside.theo-slide-alert::before {
199
+ display: block;
200
+ margin-bottom: 0.35em;
201
+ font-weight: 600;
202
+ font-size: 0.9em;
203
+ letter-spacing: 0.05em;
204
+ text-transform: uppercase;
205
+ }
206
+ .theo-slide[data-theo-slide-theme="default"] aside.theo-slide-alert > :first-child {
207
+ margin-top: 0;
208
+ }
209
+ .theo-slide[data-theo-slide-theme="default"] aside.theo-slide-alert > :last-child {
210
+ margin-bottom: 0;
211
+ }
212
+
213
+ .theo-slide[data-theo-slide-theme="default"] aside[data-theo-slide-alert-type="note"] {
214
+ border-color: #3b82f6;
215
+ background: color-mix(in srgb, #3b82f6 10%, transparent);
216
+ }
217
+ .theo-slide[data-theo-slide-theme="default"] aside[data-theo-slide-alert-type="note"]::before {
218
+ content: "ⓘ Note";
219
+ color: #3b82f6;
220
+ }
221
+
222
+ .theo-slide[data-theo-slide-theme="default"] aside[data-theo-slide-alert-type="tip"] {
223
+ border-color: #10b981;
224
+ background: color-mix(in srgb, #10b981 10%, transparent);
225
+ }
226
+ .theo-slide[data-theo-slide-theme="default"] aside[data-theo-slide-alert-type="tip"]::before {
227
+ content: "✓ Tip";
228
+ color: #10b981;
229
+ }
230
+
231
+ .theo-slide[data-theo-slide-theme="default"] aside[data-theo-slide-alert-type="important"] {
232
+ border-color: #a855f7;
233
+ background: color-mix(in srgb, #a855f7 10%, transparent);
234
+ }
235
+ .theo-slide[data-theo-slide-theme="default"] aside[data-theo-slide-alert-type="important"]::before {
236
+ content: "! Important";
237
+ color: #a855f7;
238
+ }
239
+
240
+ .theo-slide[data-theo-slide-theme="default"] aside[data-theo-slide-alert-type="warning"] {
241
+ border-color: #f59e0b;
242
+ background: color-mix(in srgb, #f59e0b 10%, transparent);
243
+ }
244
+ .theo-slide[data-theo-slide-theme="default"] aside[data-theo-slide-alert-type="warning"]::before {
245
+ content: "⚠ Warning";
246
+ color: #f59e0b;
247
+ }
248
+
249
+ .theo-slide[data-theo-slide-theme="default"] aside[data-theo-slide-alert-type="caution"] {
250
+ border-color: #ef4444;
251
+ background: color-mix(in srgb, #ef4444 10%, transparent);
252
+ }
253
+ .theo-slide[data-theo-slide-theme="default"] aside[data-theo-slide-alert-type="caution"]::before {
254
+ content: "✗ Caution";
255
+ color: #ef4444;
256
+ }
@@ -0,0 +1,143 @@
1
+ /*
2
+ * Slide layouts (rich-content plan T2.2).
3
+ *
4
+ * Selectors are scoped by `[data-theo-slide-layout]` on the outer `<section>`.
5
+ * Themes (`default`, `violet-forge`) @import this file so layouts work across
6
+ * the design system without duplication.
7
+ *
8
+ * Each layout uses CSS grid for placement. `default` is a no-op so existing
9
+ * slides remain pixel-identical. The 7 layouts cover the 80% case for tech
10
+ * presentations: title hero, dual columns, image-prose, code-output, chapter
11
+ * dividers. Custom layouts require consumer CSS overriding the data-attr
12
+ * selector.
13
+ */
14
+
15
+ /* Default — vertical flow (no grid). Preserves existing slide rendering. */
16
+ .theo-slide[data-theo-slide-layout="default"] {
17
+ /* no-op */
18
+ }
19
+
20
+ /* Title — centered hero. Used for cover slides and section dividers. */
21
+ .theo-slide[data-theo-slide-layout="title"] {
22
+ display: grid;
23
+ place-items: center;
24
+ text-align: center;
25
+ }
26
+ .theo-slide[data-theo-slide-layout="title"] h1 {
27
+ font-size: 2.8em;
28
+ letter-spacing: -0.02em;
29
+ }
30
+ .theo-slide[data-theo-slide-layout="title"] h2 {
31
+ font-size: 1.6em;
32
+ font-weight: 500;
33
+ color: color-mix(in srgb, currentColor 70%, transparent);
34
+ }
35
+
36
+ /* Two-column — equal split. First child block goes left, rest stack right. */
37
+ .theo-slide[data-theo-slide-layout="two-column"] {
38
+ display: grid;
39
+ grid-template-columns: 1fr 1fr;
40
+ gap: 32px;
41
+ align-items: start;
42
+ }
43
+ .theo-slide[data-theo-slide-layout="two-column"] > * {
44
+ min-width: 0;
45
+ }
46
+
47
+ /* Image-right — text left (1.5fr), image right (1fr). */
48
+ .theo-slide[data-theo-slide-layout="image-right"] {
49
+ display: grid;
50
+ grid-template-columns: 1.5fr 1fr;
51
+ gap: 32px;
52
+ align-items: center;
53
+ }
54
+ .theo-slide[data-theo-slide-layout="image-right"] img {
55
+ grid-column: 2;
56
+ max-width: 100%;
57
+ height: auto;
58
+ border-radius: 8px;
59
+ justify-self: end;
60
+ }
61
+
62
+ /* Image-left — mirror of image-right. */
63
+ .theo-slide[data-theo-slide-layout="image-left"] {
64
+ display: grid;
65
+ grid-template-columns: 1fr 1.5fr;
66
+ gap: 32px;
67
+ align-items: center;
68
+ }
69
+ .theo-slide[data-theo-slide-layout="image-left"] img {
70
+ grid-column: 1;
71
+ grid-row: 1;
72
+ max-width: 100%;
73
+ height: auto;
74
+ border-radius: 8px;
75
+ }
76
+
77
+ /* Code-output — code block left (slightly wider), prose right. */
78
+ .theo-slide[data-theo-slide-layout="code-output"] {
79
+ display: grid;
80
+ grid-template-columns: 1.2fr 1fr;
81
+ gap: 24px;
82
+ align-items: start;
83
+ }
84
+ .theo-slide[data-theo-slide-layout="code-output"] pre {
85
+ margin: 0;
86
+ }
87
+
88
+ /* Section — full-bleed chapter divider with tinted backdrop. */
89
+ .theo-slide[data-theo-slide-layout="section"] {
90
+ display: grid;
91
+ place-items: center;
92
+ text-align: center;
93
+ background: color-mix(in srgb, currentColor 10%, transparent);
94
+ }
95
+ .theo-slide[data-theo-slide-layout="section"] h1 {
96
+ font-size: 3.6em;
97
+ letter-spacing: -0.03em;
98
+ margin: 0;
99
+ }
100
+ .theo-slide[data-theo-slide-layout="section"] p {
101
+ font-size: 1.1em;
102
+ color: color-mix(in srgb, currentColor 65%, transparent);
103
+ }
104
+
105
+ /* ─────────────────────────────────────────────────────────────────
106
+ * Header / Footer / Pagination overlays (rich-content T5.1).
107
+ * Plain text divs absolute-positioned in the canvas. They don't push
108
+ * content; they sit ON TOP. Sized in slide units (28px base).
109
+ * ───────────────────────────────────────────────────────────────── */
110
+ .theo-slide .theo-slide-header {
111
+ position: absolute;
112
+ top: 16px;
113
+ left: 32px;
114
+ right: 32px;
115
+ font-size: 0.6em;
116
+ opacity: 0.7;
117
+ pointer-events: none;
118
+ white-space: nowrap;
119
+ overflow: hidden;
120
+ text-overflow: ellipsis;
121
+ }
122
+ .theo-slide .theo-slide-footer {
123
+ position: absolute;
124
+ bottom: 16px;
125
+ left: 32px;
126
+ right: 96px;
127
+ font-size: 0.6em;
128
+ opacity: 0.7;
129
+ text-align: center;
130
+ pointer-events: none;
131
+ white-space: nowrap;
132
+ overflow: hidden;
133
+ text-overflow: ellipsis;
134
+ }
135
+ .theo-slide .theo-slide-paginate {
136
+ position: absolute;
137
+ bottom: 16px;
138
+ right: 32px;
139
+ font-size: 0.55em;
140
+ opacity: 0.5;
141
+ font-variant-numeric: tabular-nums;
142
+ pointer-events: none;
143
+ }
@@ -0,0 +1,256 @@
1
+ /*
2
+ * Slide primitive — `violet-forge` theme.
3
+ *
4
+ * Branded variant: same inherit-first foundation as the `default` theme, but
5
+ * with a Violet Forge accent (links, code backgrounds, blockquote bar)
6
+ * blended with `currentColor` via `color-mix()`. The brand hue stays
7
+ * recognizable across light and dark surfaces because the accent is mixed
8
+ * with the inherited foreground.
9
+ */
10
+
11
+ @import "./layouts.css";
12
+
13
+ .theo-slide[data-theo-slide-theme="violet-forge"] {
14
+ --theo-slide-canvas-width: 1280px;
15
+ --theo-slide-canvas-height: 720px;
16
+ --theo-slide-padding: 64px;
17
+ --theo-slide-font-base: 28px;
18
+ --theo-slide-font-family: var(
19
+ --vf-font-family-sans,
20
+ system-ui,
21
+ -apple-system,
22
+ "Segoe UI",
23
+ sans-serif
24
+ );
25
+ --theo-slide-font-mono: var(--vf-font-family-mono, ui-monospace, "JetBrains Mono", monospace);
26
+
27
+ /* Violet accent — the brand hue. Used for relative mixing so it adapts
28
+ to light/dark surfaces (mixed with `currentColor`). */
29
+ --theo-slide-accent: #7c3aed;
30
+
31
+ /* Derived tints — relative to inherited `currentColor` so they auto-flip
32
+ when the parent surface flips. */
33
+ --theo-slide-color-muted: color-mix(in srgb, currentColor 60%, transparent);
34
+ --theo-slide-color-tint-strong: color-mix(in srgb, var(--theo-slide-accent) 15%, transparent);
35
+ --theo-slide-color-tint-weak: color-mix(in srgb, var(--theo-slide-accent) 7%, transparent);
36
+ --theo-slide-color-border: color-mix(in srgb, var(--theo-slide-accent) 30%, transparent);
37
+ --theo-slide-color-link: color-mix(in srgb, var(--theo-slide-accent) 70%, currentColor);
38
+ --theo-slide-color-blockquote-bar: color-mix(in srgb, var(--theo-slide-accent) 60%, currentColor);
39
+
40
+ color: inherit;
41
+ background: transparent;
42
+ font-family: var(--theo-slide-font-family);
43
+ font-size: var(--theo-slide-font-base);
44
+ line-height: 1.5;
45
+ }
46
+
47
+ .theo-slide[data-theo-slide-theme="violet-forge"] h1,
48
+ .theo-slide[data-theo-slide-theme="violet-forge"] h2,
49
+ .theo-slide[data-theo-slide-theme="violet-forge"] h3,
50
+ .theo-slide[data-theo-slide-theme="violet-forge"] h4,
51
+ .theo-slide[data-theo-slide-theme="violet-forge"] h5,
52
+ .theo-slide[data-theo-slide-theme="violet-forge"] h6 {
53
+ color: inherit;
54
+ line-height: 1.2;
55
+ margin: 0 0 0.5em 0;
56
+ font-weight: 600;
57
+ }
58
+
59
+ .theo-slide[data-theo-slide-theme="violet-forge"] h1 {
60
+ font-size: 1.8em;
61
+ letter-spacing: -0.02em;
62
+ }
63
+ .theo-slide[data-theo-slide-theme="violet-forge"] h2 {
64
+ font-size: 1.4em;
65
+ }
66
+ .theo-slide[data-theo-slide-theme="violet-forge"] h3 {
67
+ font-size: 1.2em;
68
+ }
69
+ .theo-slide[data-theo-slide-theme="violet-forge"] h4 {
70
+ font-size: 1.05em;
71
+ }
72
+ .theo-slide[data-theo-slide-theme="violet-forge"] h5 {
73
+ font-size: 1em;
74
+ }
75
+ .theo-slide[data-theo-slide-theme="violet-forge"] h6 {
76
+ font-size: 0.9em;
77
+ color: var(--theo-slide-color-muted);
78
+ }
79
+
80
+ .theo-slide[data-theo-slide-theme="violet-forge"] p {
81
+ margin: 0 0 0.75em 0;
82
+ }
83
+ .theo-slide[data-theo-slide-theme="violet-forge"] ul,
84
+ .theo-slide[data-theo-slide-theme="violet-forge"] ol {
85
+ margin: 0 0 0.75em 0;
86
+ padding-left: 1.5em;
87
+ }
88
+ .theo-slide[data-theo-slide-theme="violet-forge"] li {
89
+ margin: 0.25em 0;
90
+ }
91
+
92
+ .theo-slide[data-theo-slide-theme="violet-forge"] blockquote {
93
+ margin: 0 0 0.75em 0;
94
+ padding: 0.25em 0.75em;
95
+ border-left: 4px solid var(--theo-slide-color-blockquote-bar);
96
+ color: var(--theo-slide-color-muted);
97
+ }
98
+
99
+ .theo-slide[data-theo-slide-theme="violet-forge"] a {
100
+ color: var(--theo-slide-color-link);
101
+ text-decoration: underline;
102
+ text-underline-offset: 2px;
103
+ font-weight: 600;
104
+ }
105
+
106
+ .theo-slide[data-theo-slide-theme="violet-forge"] code {
107
+ font-family: var(--theo-slide-font-mono);
108
+ font-size: 0.9em;
109
+ padding: 0.1em 0.4em;
110
+ border-radius: 4px;
111
+ background: var(--theo-slide-color-tint-strong);
112
+ color: inherit;
113
+ }
114
+
115
+ .theo-slide[data-theo-slide-theme="violet-forge"] pre {
116
+ font-family: var(--theo-slide-font-mono);
117
+ background: var(--theo-slide-color-tint-strong);
118
+ color: inherit;
119
+ padding: 0.75em 1em;
120
+ border-radius: 8px;
121
+ overflow: auto;
122
+ font-size: 0.85em;
123
+ }
124
+
125
+ .theo-slide[data-theo-slide-theme="violet-forge"] pre code {
126
+ padding: 0;
127
+ background: transparent;
128
+ font-size: inherit;
129
+ }
130
+
131
+ .theo-slide[data-theo-slide-theme="violet-forge"] hr {
132
+ border: none;
133
+ border-top: 1px solid var(--theo-slide-color-border);
134
+ margin: 1em 0;
135
+ }
136
+
137
+ .theo-slide[data-theo-slide-theme="violet-forge"] table {
138
+ border-collapse: collapse;
139
+ margin: 0 0 0.75em 0;
140
+ }
141
+
142
+ .theo-slide[data-theo-slide-theme="violet-forge"] th,
143
+ .theo-slide[data-theo-slide-theme="violet-forge"] td {
144
+ border: 1px solid var(--theo-slide-color-border);
145
+ padding: 0.4em 0.75em;
146
+ text-align: left;
147
+ }
148
+
149
+ .theo-slide[data-theo-slide-theme="violet-forge"] thead th {
150
+ background: var(--theo-slide-color-tint-weak);
151
+ font-weight: 600;
152
+ }
153
+
154
+ .theo-slide[data-theo-slide-theme="violet-forge"] tbody tr:nth-child(even) td {
155
+ background: var(--theo-slide-color-tint-weak);
156
+ }
157
+
158
+ .theo-slide[data-theo-slide-theme="violet-forge"] img {
159
+ max-width: 100%;
160
+ height: auto;
161
+ border-radius: 6px;
162
+ }
163
+
164
+ .theo-slide[data-theo-slide-theme="violet-forge"] em {
165
+ font-style: italic;
166
+ }
167
+ .theo-slide[data-theo-slide-theme="violet-forge"] strong {
168
+ font-weight: 600;
169
+ }
170
+ .theo-slide[data-theo-slide-theme="violet-forge"] del {
171
+ text-decoration: line-through;
172
+ color: var(--theo-slide-color-muted);
173
+ }
174
+ .theo-slide[data-theo-slide-theme="violet-forge"] kbd {
175
+ font-family: var(--theo-slide-font-mono);
176
+ font-size: 0.85em;
177
+ padding: 0.1em 0.4em;
178
+ border: 1px solid var(--theo-slide-color-border);
179
+ border-radius: 4px;
180
+ background: var(--theo-slide-color-tint-weak);
181
+ }
182
+
183
+ /* ─────────────────────────────────────────────────────────────────
184
+ * GFM alerts (rich-content T1.2) — Violet Forge palette.
185
+ * Same structure as `default`; only the accent colors differ
186
+ * so callouts feel native to the design system.
187
+ * ───────────────────────────────────────────────────────────────── */
188
+ .theo-slide[data-theo-slide-theme="violet-forge"] aside.theo-slide-alert {
189
+ margin: 0 0 0.75em 0;
190
+ padding: 0.75em 1em;
191
+ border-left: 4px solid currentColor;
192
+ border-radius: 0.4em;
193
+ background: color-mix(in srgb, currentColor 8%, transparent);
194
+ }
195
+ .theo-slide[data-theo-slide-theme="violet-forge"] aside.theo-slide-alert::before {
196
+ display: block;
197
+ margin-bottom: 0.35em;
198
+ font-weight: 600;
199
+ font-size: 0.9em;
200
+ letter-spacing: 0.06em;
201
+ text-transform: uppercase;
202
+ }
203
+ .theo-slide[data-theo-slide-theme="violet-forge"] aside.theo-slide-alert > :first-child {
204
+ margin-top: 0;
205
+ }
206
+ .theo-slide[data-theo-slide-theme="violet-forge"] aside.theo-slide-alert > :last-child {
207
+ margin-bottom: 0;
208
+ }
209
+
210
+ .theo-slide[data-theo-slide-theme="violet-forge"] aside[data-theo-slide-alert-type="note"] {
211
+ border-color: #6366f1;
212
+ background: color-mix(in srgb, #6366f1 12%, transparent);
213
+ }
214
+ .theo-slide[data-theo-slide-theme="violet-forge"] aside[data-theo-slide-alert-type="note"]::before {
215
+ content: "ⓘ Note";
216
+ color: #6366f1;
217
+ }
218
+
219
+ .theo-slide[data-theo-slide-theme="violet-forge"] aside[data-theo-slide-alert-type="tip"] {
220
+ border-color: #22d3ee;
221
+ background: color-mix(in srgb, #22d3ee 12%, transparent);
222
+ }
223
+ .theo-slide[data-theo-slide-theme="violet-forge"] aside[data-theo-slide-alert-type="tip"]::before {
224
+ content: "✓ Tip";
225
+ color: #22d3ee;
226
+ }
227
+
228
+ .theo-slide[data-theo-slide-theme="violet-forge"] aside[data-theo-slide-alert-type="important"] {
229
+ border-color: #c084fc;
230
+ background: color-mix(in srgb, #c084fc 12%, transparent);
231
+ }
232
+ .theo-slide[data-theo-slide-theme="violet-forge"]
233
+ aside[data-theo-slide-alert-type="important"]::before {
234
+ content: "★ Important";
235
+ color: #c084fc;
236
+ }
237
+
238
+ .theo-slide[data-theo-slide-theme="violet-forge"] aside[data-theo-slide-alert-type="warning"] {
239
+ border-color: #facc15;
240
+ background: color-mix(in srgb, #facc15 12%, transparent);
241
+ }
242
+ .theo-slide[data-theo-slide-theme="violet-forge"]
243
+ aside[data-theo-slide-alert-type="warning"]::before {
244
+ content: "⚠ Warning";
245
+ color: #facc15;
246
+ }
247
+
248
+ .theo-slide[data-theo-slide-theme="violet-forge"] aside[data-theo-slide-alert-type="caution"] {
249
+ border-color: #f87171;
250
+ background: color-mix(in srgb, #f87171 12%, transparent);
251
+ }
252
+ .theo-slide[data-theo-slide-theme="violet-forge"]
253
+ aside[data-theo-slide-alert-type="caution"]::before {
254
+ content: "✗ Caution";
255
+ color: #f87171;
256
+ }
@@ -0,0 +1,52 @@
1
+ /* src/components/composites/slide-deck/transitions.css */
2
+ .theo-slide-deck-slide-frame {
3
+ --theo-slide-deck-transition-duration: 250ms;
4
+ position: absolute;
5
+ inset: 0;
6
+ }
7
+ .theo-slide-deck-slide-frame[data-theo-slide-deck-transition=fade] > [data-theo-slide-deck-slide-state=incoming] {
8
+ animation: theo-slide-deck-fade-in var(--theo-slide-deck-transition-duration) ease-out;
9
+ }
10
+ @keyframes theo-slide-deck-fade-in {
11
+ from {
12
+ opacity: 0;
13
+ }
14
+ to {
15
+ opacity: 1;
16
+ }
17
+ }
18
+ .theo-slide-deck-slide-frame[data-theo-slide-deck-transition=slide][data-theo-slide-deck-direction=next] > [data-theo-slide-deck-slide-state=incoming] {
19
+ animation: theo-slide-deck-slide-in-right var(--theo-slide-deck-transition-duration) ease-out;
20
+ }
21
+ .theo-slide-deck-slide-frame[data-theo-slide-deck-transition=slide][data-theo-slide-deck-direction=prev] > [data-theo-slide-deck-slide-state=incoming] {
22
+ animation: theo-slide-deck-slide-in-left var(--theo-slide-deck-transition-duration) ease-out;
23
+ }
24
+ @keyframes theo-slide-deck-slide-in-right {
25
+ from {
26
+ transform: translateX(30%);
27
+ opacity: 0;
28
+ }
29
+ to {
30
+ transform: translateX(0);
31
+ opacity: 1;
32
+ }
33
+ }
34
+ @keyframes theo-slide-deck-slide-in-left {
35
+ from {
36
+ transform: translateX(-30%);
37
+ opacity: 0;
38
+ }
39
+ to {
40
+ transform: translateX(0);
41
+ opacity: 1;
42
+ }
43
+ }
44
+ @media (prefers-reduced-motion: reduce) {
45
+ .theo-slide-deck-slide-frame,
46
+ .theo-slide-deck-slide-frame * {
47
+ animation-duration: 0ms !important;
48
+ animation-iteration-count: 1 !important;
49
+ transition-duration: 0ms !important;
50
+ }
51
+ }
52
+ /*# sourceMappingURL=index.css.map */