@open-aippt/core 1.13.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.
Files changed (142) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +98 -0
  3. package/bin.js +2 -0
  4. package/dist/build-DxTqmvsO.js +17 -0
  5. package/dist/cli/bin.d.ts +1 -0
  6. package/dist/cli/bin.js +86 -0
  7. package/dist/config-CjzqjrEA.js +4280 -0
  8. package/dist/config-DIC-yVPp.d.ts +23 -0
  9. package/dist/design-cpzS8aud.js +35 -0
  10. package/dist/dev-BYuTeJbA.js +20 -0
  11. package/dist/format-BCeKbTOM.js +1605 -0
  12. package/dist/index.d.ts +134 -0
  13. package/dist/index.js +467 -0
  14. package/dist/locale/index.d.ts +24 -0
  15. package/dist/locale/index.js +3 -0
  16. package/dist/preview-DlQvnJPq.js +18 -0
  17. package/dist/sync-BPZ0m27m.js +139 -0
  18. package/dist/sync-EsYusbbL.js +3 -0
  19. package/dist/types-CHmFPIG_.d.ts +430 -0
  20. package/dist/vite/index.d.ts +14 -0
  21. package/dist/vite/index.js +4 -0
  22. package/env.d.ts +59 -0
  23. package/package.json +103 -0
  24. package/skills/apply-comments/SKILL.md +83 -0
  25. package/skills/create-slide/SKILL.md +91 -0
  26. package/skills/create-theme/SKILL.md +250 -0
  27. package/skills/current-slide/SKILL.md +110 -0
  28. package/skills/slide-authoring/SKILL.md +625 -0
  29. package/src/app/app.tsx +47 -0
  30. package/src/app/components/asset-view.tsx +966 -0
  31. package/src/app/components/history-provider.tsx +120 -0
  32. package/src/app/components/image-placeholder.tsx +243 -0
  33. package/src/app/components/inspector/asset-picker-dialog.tsx +196 -0
  34. package/src/app/components/inspector/comment-widget.tsx +93 -0
  35. package/src/app/components/inspector/image-crop-dialog.tsx +212 -0
  36. package/src/app/components/inspector/inspect-overlay.tsx +387 -0
  37. package/src/app/components/inspector/inspector-panel.tsx +1115 -0
  38. package/src/app/components/inspector/inspector-provider.tsx +1218 -0
  39. package/src/app/components/inspector/save-bar.tsx +48 -0
  40. package/src/app/components/language-toggle.tsx +39 -0
  41. package/src/app/components/notes-drawer.tsx +120 -0
  42. package/src/app/components/overview-grid.tsx +363 -0
  43. package/src/app/components/panel/panel-fields.tsx +60 -0
  44. package/src/app/components/panel/panel-shell.tsx +80 -0
  45. package/src/app/components/panel/save-card.tsx +142 -0
  46. package/src/app/components/pdf-progress-toast.tsx +32 -0
  47. package/src/app/components/player.tsx +466 -0
  48. package/src/app/components/pptx-progress-toast.tsx +32 -0
  49. package/src/app/components/present/blackout-overlay.tsx +18 -0
  50. package/src/app/components/present/control-bar.tsx +315 -0
  51. package/src/app/components/present/help-overlay.tsx +57 -0
  52. package/src/app/components/present/jump-input.tsx +74 -0
  53. package/src/app/components/present/laser-pointer.tsx +39 -0
  54. package/src/app/components/present/progress-bar.tsx +26 -0
  55. package/src/app/components/present/use-idle.ts +46 -0
  56. package/src/app/components/present/use-pointer-near-bottom.ts +34 -0
  57. package/src/app/components/present/use-presenter-channel.ts +66 -0
  58. package/src/app/components/present/use-touch-swipe.ts +66 -0
  59. package/src/app/components/shared-element.tsx +48 -0
  60. package/src/app/components/sidebar/folder-item.tsx +258 -0
  61. package/src/app/components/sidebar/icon-picker.tsx +61 -0
  62. package/src/app/components/sidebar/mobile-pill.tsx +34 -0
  63. package/src/app/components/sidebar/sidebar-footer.tsx +105 -0
  64. package/src/app/components/sidebar/sidebar.tsx +284 -0
  65. package/src/app/components/slide-canvas.tsx +102 -0
  66. package/src/app/components/slide-transition-layer.tsx +844 -0
  67. package/src/app/components/style-panel/design-provider.tsx +148 -0
  68. package/src/app/components/style-panel/style-panel.tsx +349 -0
  69. package/src/app/components/style-panel/use-design.ts +112 -0
  70. package/src/app/components/theme-toggle.tsx +59 -0
  71. package/src/app/components/themes/theme-detail.tsx +305 -0
  72. package/src/app/components/themes/themes-gallery.tsx +149 -0
  73. package/src/app/components/thumbnail-rail.tsx +805 -0
  74. package/src/app/components/ui/badge.tsx +45 -0
  75. package/src/app/components/ui/button.tsx +99 -0
  76. package/src/app/components/ui/card.tsx +92 -0
  77. package/src/app/components/ui/context-menu.tsx +237 -0
  78. package/src/app/components/ui/dialog.tsx +157 -0
  79. package/src/app/components/ui/dropdown-menu.tsx +245 -0
  80. package/src/app/components/ui/input.tsx +25 -0
  81. package/src/app/components/ui/label.tsx +24 -0
  82. package/src/app/components/ui/popover.tsx +75 -0
  83. package/src/app/components/ui/progress.tsx +31 -0
  84. package/src/app/components/ui/scroll-area.tsx +53 -0
  85. package/src/app/components/ui/select.tsx +196 -0
  86. package/src/app/components/ui/separator.tsx +28 -0
  87. package/src/app/components/ui/slider.tsx +61 -0
  88. package/src/app/components/ui/sonner.tsx +48 -0
  89. package/src/app/components/ui/tabs.tsx +79 -0
  90. package/src/app/components/ui/textarea.tsx +22 -0
  91. package/src/app/components/ui/toggle-group.tsx +83 -0
  92. package/src/app/components/ui/toggle.tsx +45 -0
  93. package/src/app/components/ui/tooltip.tsx +58 -0
  94. package/src/app/favicon.ico +0 -0
  95. package/src/app/index.html +13 -0
  96. package/src/app/lib/assets.ts +242 -0
  97. package/src/app/lib/design-presets.ts +94 -0
  98. package/src/app/lib/design.ts +58 -0
  99. package/src/app/lib/export-html.ts +326 -0
  100. package/src/app/lib/export-pdf.ts +298 -0
  101. package/src/app/lib/export-pptx.ts +284 -0
  102. package/src/app/lib/folders.ts +239 -0
  103. package/src/app/lib/inspector/fiber.test.ts +154 -0
  104. package/src/app/lib/inspector/fiber.ts +85 -0
  105. package/src/app/lib/inspector/use-comments.ts +74 -0
  106. package/src/app/lib/inspector/use-editor.ts +73 -0
  107. package/src/app/lib/inspector/use-notes.ts +134 -0
  108. package/src/app/lib/locale-store.ts +67 -0
  109. package/src/app/lib/page-context.tsx +38 -0
  110. package/src/app/lib/print-ready.test.ts +32 -0
  111. package/src/app/lib/print-ready.ts +51 -0
  112. package/src/app/lib/sdk.test.ts +13 -0
  113. package/src/app/lib/sdk.ts +37 -0
  114. package/src/app/lib/slides.ts +26 -0
  115. package/src/app/lib/step-context.tsx +261 -0
  116. package/src/app/lib/themes.ts +22 -0
  117. package/src/app/lib/transition.ts +30 -0
  118. package/src/app/lib/use-agent-socket.ts +18 -0
  119. package/src/app/lib/use-click-page-navigation.ts +60 -0
  120. package/src/app/lib/use-is-mobile.ts +21 -0
  121. package/src/app/lib/use-locale.ts +8 -0
  122. package/src/app/lib/use-prefers-reduced-motion.ts +19 -0
  123. package/src/app/lib/use-slide-module.ts +48 -0
  124. package/src/app/lib/use-wheel-page-navigation.ts +99 -0
  125. package/src/app/lib/utils.test.ts +25 -0
  126. package/src/app/lib/utils.ts +6 -0
  127. package/src/app/main.tsx +14 -0
  128. package/src/app/routes/assets.tsx +9 -0
  129. package/src/app/routes/home-shell.tsx +213 -0
  130. package/src/app/routes/home.tsx +807 -0
  131. package/src/app/routes/presenter.tsx +418 -0
  132. package/src/app/routes/slide.tsx +1108 -0
  133. package/src/app/routes/themes.tsx +34 -0
  134. package/src/app/styles.css +429 -0
  135. package/src/app/virtual.d.ts +51 -0
  136. package/src/locale/en.ts +416 -0
  137. package/src/locale/format.ts +12 -0
  138. package/src/locale/index.ts +6 -0
  139. package/src/locale/ja.ts +422 -0
  140. package/src/locale/types.ts +443 -0
  141. package/src/locale/zh-cn.ts +414 -0
  142. package/src/locale/zh-tw.ts +414 -0
@@ -0,0 +1,34 @@
1
+ import { useNavigate, useParams } from 'react-router-dom';
2
+ import { useLocale } from '@/lib/use-locale';
3
+ import { FolderIconChip } from '../components/sidebar/folder-item';
4
+ import { ThemeDetail } from '../components/themes/theme-detail';
5
+ import { ThemesGallery } from '../components/themes/themes-gallery';
6
+ import { themes as themeRegistry } from '../lib/themes';
7
+
8
+ export function ThemesGalleryPage() {
9
+ const navigate = useNavigate();
10
+ const t = useLocale();
11
+ return (
12
+ <>
13
+ <header className="mb-8 md:mb-12">
14
+ <div className="flex flex-wrap items-center gap-3">
15
+ <FolderIconChip icon={{ type: 'emoji', value: '🎨' }} className="size-7 text-2xl" />
16
+ <h1 className="font-heading text-[32px] font-semibold leading-[1.05] tracking-[-0.025em] md:text-[44px]">
17
+ {t.themes.title}
18
+ </h1>
19
+ <span className="folio ml-1 self-end pb-2">
20
+ {themeRegistry.length.toString().padStart(2, '0')}
21
+ </span>
22
+ </div>
23
+ </header>
24
+ <ThemesGallery onOpen={(id) => navigate(`/themes/${encodeURIComponent(id)}`)} />
25
+ </>
26
+ );
27
+ }
28
+
29
+ export function ThemeDetailPage() {
30
+ const { themeId } = useParams<{ themeId: string }>();
31
+ const navigate = useNavigate();
32
+ if (!themeId) return null;
33
+ return <ThemeDetail themeId={themeId} onBack={() => navigate('/themes')} />;
34
+ }
@@ -0,0 +1,429 @@
1
+ @import "tailwindcss";
2
+ @import "tw-animate-css";
3
+ @import "shadcn/tailwind.css";
4
+ @import "@fontsource-variable/geist";
5
+
6
+ @custom-variant dark (&:is(.dark *));
7
+
8
+ @theme inline {
9
+ --font-sans: "Geist Variable", -apple-system, BlinkMacSystemFont, sans-serif;
10
+ --font-heading: "Geist Variable", -apple-system, BlinkMacSystemFont, system-ui, sans-serif;
11
+ --font-serif:
12
+ ui-serif, "New York", "Iowan Old Style", "Apple Garamond", "Big Caslon", "Charter", Georgia,
13
+ serif;
14
+ --font-mono: ui-monospace, "JetBrains Mono", "SF Mono", "Menlo", "Cascadia Code", monospace;
15
+
16
+ --color-sidebar-ring: var(--sidebar-ring);
17
+ --color-sidebar-border: var(--sidebar-border);
18
+ --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
19
+ --color-sidebar-accent: var(--sidebar-accent);
20
+ --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
21
+ --color-sidebar-primary: var(--sidebar-primary);
22
+ --color-sidebar-foreground: var(--sidebar-foreground);
23
+ --color-sidebar: var(--sidebar);
24
+ --color-chart-5: var(--chart-5);
25
+ --color-chart-4: var(--chart-4);
26
+ --color-chart-3: var(--chart-3);
27
+ --color-chart-2: var(--chart-2);
28
+ --color-chart-1: var(--chart-1);
29
+ --color-ring: var(--ring);
30
+ --color-input: var(--input);
31
+ --color-border: var(--border);
32
+ --color-hairline: var(--hairline);
33
+ --color-destructive: var(--destructive);
34
+ --color-accent-foreground: var(--accent-foreground);
35
+ --color-accent: var(--accent);
36
+ --color-muted-foreground: var(--muted-foreground);
37
+ --color-muted: var(--muted);
38
+ --color-secondary-foreground: var(--secondary-foreground);
39
+ --color-secondary: var(--secondary);
40
+ --color-primary-foreground: var(--primary-foreground);
41
+ --color-primary: var(--primary);
42
+ --color-popover-foreground: var(--popover-foreground);
43
+ --color-popover: var(--popover);
44
+ --color-card-foreground: var(--card-foreground);
45
+ --color-card: var(--card);
46
+ --color-canvas: var(--canvas);
47
+ --color-foreground: var(--foreground);
48
+ --color-background: var(--background);
49
+ --color-brand: var(--brand);
50
+ --color-brand-foreground: var(--brand-foreground);
51
+ --color-brand-soft: var(--brand-soft);
52
+
53
+ --radius-sm: calc(var(--radius) * 0.6);
54
+ --radius-md: calc(var(--radius) * 0.85);
55
+ --radius-lg: var(--radius);
56
+ --radius-xl: calc(var(--radius) * 1.4);
57
+ --radius-2xl: calc(var(--radius) * 1.8);
58
+ --radius-3xl: calc(var(--radius) * 2.2);
59
+ --radius-4xl: calc(var(--radius) * 2.6);
60
+
61
+ --shadow-edge: 0 0 0 0.5px oklch(0 0 0 / 0.06), 0 1px 0 oklch(0 0 0 / 0.025);
62
+ --shadow-floating:
63
+ 0 0 0 0.5px oklch(0 0 0 / 0.08), 0 1px 1px oklch(0 0 0 / 0.04),
64
+ 0 4px 16px -2px oklch(0 0 0 / 0.08);
65
+ --shadow-overlay:
66
+ 0 0 0 0.5px oklch(0 0 0 / 0.1), 0 8px 28px -4px oklch(0 0 0 / 0.18),
67
+ 0 24px 64px -12px oklch(0 0 0 / 0.2);
68
+ }
69
+
70
+ :root {
71
+ /* Warm paper, ink foreground. Not pure white / pure black — those read as
72
+ "default browser"; the slight warmth gives the surface a quiet voice. */
73
+ --background: oklch(0.985 0.004 75);
74
+ --foreground: oklch(0.2 0.012 60);
75
+ --canvas: oklch(0.974 0.005 75);
76
+
77
+ --card: oklch(1 0 0);
78
+ --card-foreground: oklch(0.2 0.012 60);
79
+ --popover: oklch(0.998 0.002 75);
80
+ --popover-foreground: oklch(0.2 0.012 60);
81
+
82
+ --primary: oklch(0.215 0.012 60);
83
+ --primary-foreground: oklch(0.985 0.004 75);
84
+ --secondary: oklch(0.96 0.006 75);
85
+ --secondary-foreground: oklch(0.215 0.012 60);
86
+ --muted: oklch(0.955 0.008 75);
87
+ --muted-foreground: oklch(0.485 0.012 60);
88
+ --accent: oklch(0.945 0.012 75);
89
+ --accent-foreground: oklch(0.215 0.012 60);
90
+ --destructive: oklch(0.55 0.21 27);
91
+
92
+ --border: oklch(0.895 0.008 70);
93
+ --hairline: oklch(0.86 0.008 70);
94
+ --input: oklch(0.91 0.008 70);
95
+ --ring: oklch(0.55 0.18 28);
96
+
97
+ /* Vermillion — refined editorial red. Single accent across the app;
98
+ restraint is the point. */
99
+ --brand: oklch(0.555 0.185 28);
100
+ --brand-foreground: oklch(0.985 0.004 75);
101
+ --brand-soft: oklch(0.555 0.185 28 / 0.1);
102
+
103
+ --chart-1: oklch(0.555 0.185 28);
104
+ --chart-2: oklch(0.55 0.1 60);
105
+ --chart-3: oklch(0.45 0.06 245);
106
+ --chart-4: oklch(0.55 0.12 160);
107
+ --chart-5: oklch(0.4 0.04 60);
108
+
109
+ /* Tight, considered radius — drops the trendy 10px squish for 6px crisp. */
110
+ --radius: 0.375rem;
111
+
112
+ --sidebar: oklch(0.972 0.005 75);
113
+ --sidebar-foreground: oklch(0.215 0.012 60);
114
+ --sidebar-primary: oklch(0.215 0.012 60);
115
+ --sidebar-primary-foreground: oklch(0.985 0.004 75);
116
+ --sidebar-accent: oklch(0.94 0.01 75);
117
+ --sidebar-accent-foreground: oklch(0.215 0.012 60);
118
+ --sidebar-border: oklch(0.895 0.008 70);
119
+ --sidebar-ring: oklch(0.55 0.18 28);
120
+ }
121
+
122
+ .dark {
123
+ --background: oklch(0.155 0.005 70);
124
+ --foreground: oklch(0.945 0.005 80);
125
+ --canvas: oklch(0.135 0.005 70);
126
+
127
+ --card: oklch(0.195 0.006 70);
128
+ --card-foreground: oklch(0.945 0.005 80);
129
+ --popover: oklch(0.21 0.006 70);
130
+ --popover-foreground: oklch(0.945 0.005 80);
131
+
132
+ --primary: oklch(0.94 0.005 80);
133
+ --primary-foreground: oklch(0.18 0.008 70);
134
+ --secondary: oklch(0.245 0.006 70);
135
+ --secondary-foreground: oklch(0.945 0.005 80);
136
+ --muted: oklch(0.235 0.006 70);
137
+ --muted-foreground: oklch(0.68 0.008 75);
138
+ --accent: oklch(0.27 0.008 70);
139
+ --accent-foreground: oklch(0.945 0.005 80);
140
+ --destructive: oklch(0.68 0.2 25);
141
+
142
+ --border: oklch(1 0 0 / 0.1);
143
+ --hairline: oklch(1 0 0 / 0.06);
144
+ --input: oklch(1 0 0 / 0.13);
145
+ --ring: oklch(0.62 0.18 28);
146
+
147
+ --brand: oklch(0.66 0.19 28);
148
+ --brand-foreground: oklch(0.155 0.005 70);
149
+ --brand-soft: oklch(0.66 0.19 28 / 0.18);
150
+
151
+ --chart-1: oklch(0.66 0.19 28);
152
+ --chart-2: oklch(0.7 0.1 60);
153
+ --chart-3: oklch(0.65 0.08 245);
154
+ --chart-4: oklch(0.65 0.12 160);
155
+ --chart-5: oklch(0.6 0.04 60);
156
+
157
+ --sidebar: oklch(0.18 0.006 70);
158
+ --sidebar-foreground: oklch(0.945 0.005 80);
159
+ --sidebar-primary: oklch(0.94 0.005 80);
160
+ --sidebar-primary-foreground: oklch(0.18 0.008 70);
161
+ --sidebar-accent: oklch(0.265 0.008 70);
162
+ --sidebar-accent-foreground: oklch(0.945 0.005 80);
163
+ --sidebar-border: oklch(1 0 0 / 0.1);
164
+ --sidebar-ring: oklch(0.62 0.18 28);
165
+ }
166
+
167
+ /* Tabular numerics — pages, counts, hex values, slider readouts.
168
+ Declared as a Tailwind v4 `@utility` so it can be `@apply`d (e.g. by
169
+ .folio below) and used as a className token. */
170
+ @utility nums {
171
+ font-feature-settings:
172
+ "tnum" on,
173
+ "cv11" on;
174
+ font-variant-numeric: tabular-nums;
175
+ }
176
+
177
+ @layer base {
178
+ * {
179
+ @apply border-border outline-ring/50;
180
+ }
181
+ html {
182
+ @apply font-sans;
183
+ text-rendering: optimizeLegibility;
184
+ -webkit-font-smoothing: antialiased;
185
+ -moz-osx-font-smoothing: grayscale;
186
+ font-feature-settings:
187
+ "ss01" on,
188
+ "cv11" on,
189
+ "calt" on;
190
+ }
191
+ body {
192
+ @apply bg-background text-foreground;
193
+ font-feature-settings:
194
+ "ss01" on,
195
+ "cv11" on,
196
+ "calt" on,
197
+ "tnum" off;
198
+ letter-spacing: -0.005em;
199
+ }
200
+ ::selection {
201
+ background: var(--brand-soft);
202
+ color: var(--foreground);
203
+ }
204
+ }
205
+
206
+ @layer components {
207
+ /*
208
+ * Eyebrow label — the single typographic gesture used for *every* section
209
+ * label across the app. Tracked-out small caps in muted ink.
210
+ */
211
+ .eyebrow {
212
+ @apply font-sans text-[10px] font-semibold uppercase text-muted-foreground;
213
+ letter-spacing: 0.14em;
214
+ }
215
+
216
+ /* Hairline divider — 0.5px on retina, snaps to 1px elsewhere. */
217
+ .hairline {
218
+ background: var(--hairline);
219
+ }
220
+
221
+ /* Subtle paper texture for "studio" surfaces (sidebar, gallery bg).
222
+ Pure-CSS noise via SVG; cheap, dark-mode aware via mix-blend. */
223
+ .paper {
224
+ position: relative;
225
+ isolation: isolate;
226
+ }
227
+ .paper::before {
228
+ content: "";
229
+ position: absolute;
230
+ inset: 0;
231
+ background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='160' height='160'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='2' seed='3'/><feColorMatrix values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.55 0'/></filter><rect width='100%' height='100%' filter='url(%23n)'/></svg>");
232
+ opacity: 0.025;
233
+ pointer-events: none;
234
+ z-index: 0;
235
+ mix-blend-mode: multiply;
236
+ }
237
+ .dark .paper::before {
238
+ opacity: 0.05;
239
+ mix-blend-mode: screen;
240
+ }
241
+ .paper > * {
242
+ position: relative;
243
+ z-index: 1;
244
+ }
245
+
246
+ /* Numeric folio-style page count. */
247
+ .folio {
248
+ @apply nums font-mono text-[10px] uppercase tracking-[0.16em] text-muted-foreground;
249
+ }
250
+ }
251
+
252
+ /*
253
+ * Comment input cue — kept from the original design but retoned to match
254
+ * the new palette (warm vermillion + amber instead of the AI-classic
255
+ * blue/violet halo). Plays once on first open, then settles.
256
+ */
257
+ @property --comment-cue-angle {
258
+ syntax: "<angle>";
259
+ initial-value: 0deg;
260
+ inherits: false;
261
+ }
262
+
263
+ .comment-cue {
264
+ position: relative;
265
+ isolation: isolate;
266
+ }
267
+
268
+ .comment-cue::before {
269
+ content: "";
270
+ position: absolute;
271
+ inset: -1px;
272
+ border-radius: calc(var(--radius-md) + 1px);
273
+ padding: 1.25px;
274
+ background: conic-gradient(
275
+ from var(--comment-cue-angle),
276
+ transparent 0deg,
277
+ transparent 250deg,
278
+ oklch(0.78 0.14 60 / 0.55) 295deg,
279
+ oklch(0.62 0.2 28 / 0.85) 325deg,
280
+ oklch(0.78 0.14 60 / 0.55) 350deg,
281
+ transparent 360deg
282
+ );
283
+ -webkit-mask:
284
+ linear-gradient(#000 0 0) content-box,
285
+ linear-gradient(#000 0 0);
286
+ -webkit-mask-composite: xor;
287
+ mask:
288
+ linear-gradient(#000 0 0) content-box,
289
+ linear-gradient(#000 0 0);
290
+ mask-composite: exclude;
291
+ pointer-events: none;
292
+ opacity: 0;
293
+ z-index: 1;
294
+ animation: comment-cue-trace 1500ms cubic-bezier(0.22, 0.61, 0.36, 1) 220ms 1 both;
295
+ }
296
+
297
+ .comment-cue::after {
298
+ content: "";
299
+ position: absolute;
300
+ inset: -10px;
301
+ border-radius: calc(var(--radius-md) + 10px);
302
+ background:
303
+ radial-gradient(80% 60% at 30% 50%, oklch(0.62 0.2 28 / 0.18), transparent 70%),
304
+ radial-gradient(70% 60% at 75% 60%, oklch(0.78 0.14 60 / 0.16), transparent 70%);
305
+ filter: blur(14px);
306
+ opacity: 0;
307
+ z-index: -1;
308
+ pointer-events: none;
309
+ animation: comment-cue-halo 1700ms ease-out 180ms 1 both;
310
+ }
311
+
312
+ @keyframes comment-cue-trace {
313
+ 0% {
314
+ --comment-cue-angle: 0deg;
315
+ opacity: 0;
316
+ }
317
+ 18% {
318
+ opacity: 1;
319
+ }
320
+ 82% {
321
+ opacity: 1;
322
+ }
323
+ 100% {
324
+ --comment-cue-angle: 360deg;
325
+ opacity: 0;
326
+ }
327
+ }
328
+
329
+ @keyframes comment-cue-halo {
330
+ 0% {
331
+ opacity: 0;
332
+ transform: scale(0.97);
333
+ }
334
+ 40% {
335
+ opacity: 1;
336
+ transform: scale(1);
337
+ }
338
+ 100% {
339
+ opacity: 0;
340
+ transform: scale(1.015);
341
+ }
342
+ }
343
+
344
+ @media (prefers-reduced-motion: reduce) {
345
+ .comment-cue::before,
346
+ .comment-cue::after {
347
+ animation: none;
348
+ }
349
+ }
350
+
351
+ /*
352
+ * Indeterminate "line loader" — a hairline track with a short bar that
353
+ * glides back and forth. Used for full-screen loading states in place of
354
+ * a spinner; quieter, more typographic, easier on the eye.
355
+ */
356
+ @keyframes osd-line-loader {
357
+ 0% {
358
+ transform: translateX(0%);
359
+ }
360
+ 50% {
361
+ transform: translateX(300%);
362
+ }
363
+ 100% {
364
+ transform: translateX(0%);
365
+ }
366
+ }
367
+
368
+ .line-loader-bar {
369
+ animation: osd-line-loader 1.4s cubic-bezier(0.4, 0, 0.6, 1) infinite;
370
+ }
371
+
372
+ @media (prefers-reduced-motion: reduce) {
373
+ .line-loader-bar {
374
+ animation: none;
375
+ transform: translateX(150%);
376
+ }
377
+ }
378
+
379
+ [data-osd-freeze-motion],
380
+ [data-osd-freeze-motion] *,
381
+ [data-osd-freeze-motion] *::before,
382
+ [data-osd-freeze-motion] *::after {
383
+ /* biome-ignore lint/complexity/noImportantStyles: Thumbnail previews must override arbitrary slide-authored motion, including inline styles. */
384
+ animation-duration: 1ms !important;
385
+ /* biome-ignore lint/complexity/noImportantStyles: Thumbnail previews must override arbitrary slide-authored motion, including inline styles. */
386
+ animation-delay: 0s !important;
387
+ /* biome-ignore lint/complexity/noImportantStyles: Thumbnail previews must override arbitrary slide-authored motion, including inline styles. */
388
+ animation-iteration-count: 1 !important;
389
+ /* biome-ignore lint/complexity/noImportantStyles: Thumbnail previews must override arbitrary slide-authored motion, including inline styles. */
390
+ animation-fill-mode: forwards !important;
391
+ /* biome-ignore lint/complexity/noImportantStyles: Thumbnail previews must override arbitrary slide-authored motion, including inline styles. */
392
+ transition: none !important;
393
+ /* biome-ignore lint/complexity/noImportantStyles: Thumbnail previews must override arbitrary slide-authored motion, including inline styles. */
394
+ scroll-behavior: auto !important;
395
+ /* biome-ignore lint/complexity/noImportantStyles: Thumbnail previews must override arbitrary slide-authored motion, including inline styles. */
396
+ view-transition-name: none !important;
397
+ }
398
+
399
+ /*
400
+ * Custom scrollbar — slim, ink-on-paper. Removes the chunky default that
401
+ * fights the calm surfaces.
402
+ */
403
+ @media (pointer: fine) {
404
+ *::-webkit-scrollbar {
405
+ width: 10px;
406
+ height: 10px;
407
+ }
408
+ *::-webkit-scrollbar-track {
409
+ background: transparent;
410
+ }
411
+ *::-webkit-scrollbar-thumb {
412
+ background: oklch(0 0 0 / 0.1);
413
+ border: 3px solid transparent;
414
+ background-clip: content-box;
415
+ border-radius: 999px;
416
+ }
417
+ *::-webkit-scrollbar-thumb:hover {
418
+ background: oklch(0 0 0 / 0.18);
419
+ background-clip: content-box;
420
+ }
421
+ .dark *::-webkit-scrollbar-thumb {
422
+ background: oklch(1 0 0 / 0.1);
423
+ background-clip: content-box;
424
+ }
425
+ .dark *::-webkit-scrollbar-thumb:hover {
426
+ background: oklch(1 0 0 / 0.18);
427
+ background-clip: content-box;
428
+ }
429
+ }
@@ -0,0 +1,51 @@
1
+ declare module 'virtual:open-aippt/slides' {
2
+ import type { SlideModule } from './lib/sdk';
3
+ export const slideIds: string[];
4
+ export const slideThemes: Record<string, string>;
5
+ export const slideCreatedAt: Record<string, number>;
6
+ export function loadSlide(id: string): Promise<SlideModule>;
7
+ }
8
+
9
+ declare module 'virtual:open-aippt/config' {
10
+ import type { Locale } from '../locale/types';
11
+
12
+ const config: {
13
+ base?: string;
14
+ slidesDir?: string;
15
+ port?: number;
16
+ locale?: Locale;
17
+ version: string;
18
+ build: {
19
+ showSlideBrowser: boolean;
20
+ showSlideUi: boolean;
21
+ allowHtmlDownload: boolean;
22
+ };
23
+ };
24
+ export default config;
25
+ }
26
+
27
+ declare module 'virtual:open-aippt/folders' {
28
+ import type { FoldersManifest } from './lib/sdk';
29
+
30
+ const manifest: FoldersManifest;
31
+ export default manifest;
32
+ }
33
+
34
+ declare module 'virtual:open-aippt/themes' {
35
+ import type { DesignSystem } from './lib/design';
36
+ import type { Page } from './lib/sdk';
37
+
38
+ export type ThemeMeta = {
39
+ id: string;
40
+ name: string;
41
+ description: string;
42
+ body: string;
43
+ hasDemo: boolean;
44
+ };
45
+
46
+ export const themes: ThemeMeta[];
47
+ export function loadThemeDemo(id: string): Promise<{
48
+ default: Page[];
49
+ design?: DesignSystem;
50
+ }>;
51
+ }