supadeck 0.0.5 → 0.0.7

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 (59) hide show
  1. package/dist/cli/index.js +30532 -88
  2. package/dist/content/rehype-shiki-code-blocks.d.ts +9 -0
  3. package/dist/index.js +2808 -11
  4. package/dist/metafile-esm.json +1 -0
  5. package/dist/runtime/main.js +2868 -21
  6. package/dist/runtime/themes/base/theme.css +183 -145
  7. package/dist/runtime/themes/default/index.js +312 -15
  8. package/dist/runtime/themes/default/theme.css +17 -0
  9. package/dist/runtime/themes/sunset/index.js +2737 -10
  10. package/dist/runtime/vite-config.js +30206 -196
  11. package/package.json +16 -10
  12. package/dist/cli/export.js +0 -35
  13. package/dist/cli/serve.js +0 -12
  14. package/dist/cli/templates.js +0 -69
  15. package/dist/cli/workspace.js +0 -26
  16. package/dist/content/parse-deck.js +0 -136
  17. package/dist/content/remark-unwrap-jsx-paragraphs.js +0 -63
  18. package/dist/export/pdf.js +0 -40
  19. package/dist/runtime/App.js +0 -45
  20. package/dist/runtime/components/Callout.js +0 -13
  21. package/dist/runtime/components/Center.js +0 -4
  22. package/dist/runtime/components/Columns.js +0 -4
  23. package/dist/runtime/components/Disclosure.js +0 -5
  24. package/dist/runtime/components/Frame.js +0 -4
  25. package/dist/runtime/components/index.js +0 -4
  26. package/dist/runtime/default-components.js +0 -38
  27. package/dist/runtime/hooks/slides.js +0 -45
  28. package/dist/runtime/layout/DeckSlide.js +0 -6
  29. package/dist/runtime/layout/SlideFrame.js +0 -6
  30. package/dist/runtime/mdx-components.d.ts +0 -2
  31. package/dist/runtime/mdx-components.js +0 -17
  32. package/dist/runtime/primitives/DeckChrome.js +0 -6
  33. package/dist/runtime/primitives/DeckNavigation.js +0 -4
  34. package/dist/runtime/primitives/DeckProgress.js +0 -5
  35. package/dist/runtime/primitives/DeckTitle.js +0 -4
  36. package/dist/runtime/public-components.d.ts +0 -22
  37. package/dist/runtime/public-components.js +0 -24
  38. package/dist/runtime/styles/base.css +0 -201
  39. package/dist/runtime/tailwind-hmr.js +0 -67
  40. package/dist/runtime/tailwind-sources.js +0 -42
  41. package/dist/runtime/theme-components.d.ts +0 -3
  42. package/dist/runtime/theme-components.js +0 -18
  43. package/dist/runtime/theme-resolution.js +0 -62
  44. package/dist/runtime/theme-types.js +0 -1
  45. package/dist/runtime/themes/base/DefaultDeck.js +0 -10
  46. package/dist/runtime/themes/default/DefaultDeck.d.ts +0 -2
  47. package/dist/runtime/themes/default/DefaultDeck.js +0 -11
  48. package/dist/runtime/themes/default/DefaultThemeDeck.js +0 -22
  49. package/dist/runtime/themes/default/components.js +0 -79
  50. package/dist/runtime/themes/default.css +0 -10
  51. package/dist/runtime/themes/sunset.css +0 -10
  52. package/dist/runtime/themes/supabase/SupabaseDeck.d.ts +0 -2
  53. package/dist/runtime/themes/supabase/SupabaseDeck.js +0 -23
  54. package/dist/runtime/themes/supabase/components.d.ts +0 -65
  55. package/dist/runtime/themes/supabase/components.js +0 -80
  56. package/dist/runtime/themes/supabase/index.d.ts +0 -4
  57. package/dist/runtime/themes/supabase/index.js +0 -17
  58. package/dist/runtime/themes/supabase/theme.css +0 -523
  59. package/dist/runtime/utils/use-current-slide.js +0 -19
@@ -1,65 +0,0 @@
1
- import type React from 'react';
2
- import type { MdxComponentMap } from '../../theme-types.js';
3
- export interface SupabaseMarkProps extends React.ComponentProps<'svg'> {
4
- size?: 'footer' | 'hero';
5
- }
6
- export declare function SupabaseMark({ size, className, ...props }: SupabaseMarkProps): import("react/jsx-runtime").JSX.Element;
7
- export interface SectionSlideProps {
8
- children: React.ReactNode;
9
- className?: string;
10
- }
11
- export declare function SectionSlide({ children, className }: SectionSlideProps): import("react/jsx-runtime").JSX.Element;
12
- export interface DividerProps {
13
- centered?: boolean;
14
- className?: string;
15
- }
16
- export declare function Divider({ centered, className }: DividerProps): import("react/jsx-runtime").JSX.Element;
17
- export interface TagProps {
18
- children: React.ReactNode;
19
- tone?: 'default' | 'red' | 'yellow';
20
- className?: string;
21
- }
22
- export declare function Tag({ children, tone, className }: TagProps): import("react/jsx-runtime").JSX.Element;
23
- export interface WideProps {
24
- children: React.ReactNode;
25
- className?: string;
26
- }
27
- export declare function Wide({ children, className }: WideProps): import("react/jsx-runtime").JSX.Element;
28
- export interface CardGridProps {
29
- children: React.ReactNode;
30
- columns?: number;
31
- className?: string;
32
- }
33
- export declare function CardGrid({ children, columns, className }: CardGridProps): import("react/jsx-runtime").JSX.Element;
34
- export interface CardProps {
35
- title: React.ReactNode;
36
- children: React.ReactNode;
37
- tone?: 'default' | 'red' | 'yellow';
38
- className?: string;
39
- }
40
- export declare function Card({ title, children, tone, className }: CardProps): import("react/jsx-runtime").JSX.Element;
41
- export interface StatGridProps {
42
- children: React.ReactNode;
43
- columns?: number;
44
- className?: string;
45
- }
46
- export declare function StatGrid({ children, columns, className }: StatGridProps): import("react/jsx-runtime").JSX.Element;
47
- export interface StatProps {
48
- value: React.ReactNode;
49
- label: React.ReactNode;
50
- className?: string;
51
- }
52
- export declare function Stat({ value, label, className }: StatProps): import("react/jsx-runtime").JSX.Element;
53
- export interface StatusListProps {
54
- children: React.ReactNode;
55
- className?: string;
56
- }
57
- export declare function StatusList({ children, className }: StatusListProps): import("react/jsx-runtime").JSX.Element;
58
- export interface StatusItemProps {
59
- status: 'live' | 'partial' | 'planned' | 'unknown';
60
- name: React.ReactNode;
61
- note?: React.ReactNode;
62
- className?: string;
63
- }
64
- export declare function StatusItem({ status, name, note, className }: StatusItemProps): import("react/jsx-runtime").JSX.Element;
65
- export declare function createSupabaseComponents(): MdxComponentMap;
@@ -1,80 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useId } from 'react';
3
- function cx(...values) {
4
- return values.filter(Boolean).join(' ');
5
- }
6
- export function SupabaseMark({ size = 'footer', className, ...props }) {
7
- const id = useId();
8
- const primaryGradientId = `${id}-primary`;
9
- const shadowGradientId = `${id}-shadow`;
10
- const dimensions = size === 'hero'
11
- ? { width: 48, height: 50 }
12
- : { width: 22, height: 22 };
13
- return (_jsxs("svg", { viewBox: "0 0 109 113", fill: "none", xmlns: "http://www.w3.org/2000/svg", "aria-hidden": "true", className: cx('supabase-mark', className), ...dimensions, ...props, children: [_jsx("path", { d: "M63.7076 110.284C60.8481 113.885 55.0502 111.912 54.9813 107.314L53.9738 40.0627L99.1935 40.0627C107.384 40.0627 111.952 49.5228 106.859 55.9372L63.7076 110.284Z", fill: `url(#${primaryGradientId})` }), _jsx("path", { d: "M63.7076 110.284C60.8481 113.885 55.0502 111.912 54.9813 107.314L53.9738 40.0627L99.1935 40.0627C107.384 40.0627 111.952 49.5228 106.859 55.9372L63.7076 110.284Z", fill: `url(#${shadowGradientId})`, fillOpacity: "0.2" }), _jsx("path", { d: "M45.317 2.07103C48.1765 -1.53037 53.9745 0.442937 54.0434 5.041L54.4849 72.2922H9.83113C1.64038 72.2922 -2.92775 62.8321 2.1655 56.4177L45.317 2.07103Z", fill: "#3ECF8E" }), _jsxs("defs", { children: [_jsxs("linearGradient", { id: primaryGradientId, x1: "53.9738", y1: "54.974", x2: "94.1635", y2: "71.8295", gradientUnits: "userSpaceOnUse", children: [_jsx("stop", { stopColor: "#249361" }), _jsx("stop", { offset: "1", stopColor: "#3ECF8E" })] }), _jsxs("linearGradient", { id: shadowGradientId, x1: "36.1558", y1: "30.578", x2: "54.4844", y2: "65.0806", gradientUnits: "userSpaceOnUse", children: [_jsx("stop", {}), _jsx("stop", { offset: "1", stopOpacity: "0" })] })] })] }));
14
- }
15
- export function SectionSlide({ children, className }) {
16
- return _jsx("div", { className: cx('supabase-section-slide', className), children: children });
17
- }
18
- export function Divider({ centered = false, className }) {
19
- return _jsx("div", { className: cx('divider', centered && 'center-divider', className), "aria-hidden": "true" });
20
- }
21
- export function Tag({ children, tone = 'default', className }) {
22
- return _jsx("span", { className: cx('tag', tone !== 'default' && tone, className), children: children });
23
- }
24
- export function Wide({ children, className }) {
25
- return _jsx("div", { className: cx('supabase-wide', className), children: children });
26
- }
27
- export function CardGrid({ children, columns = 3, className }) {
28
- return (_jsx("div", { className: cx('row', className), style: { '--supabase-columns': String(columns) }, children: children }));
29
- }
30
- export function Card({ title, children, tone = 'default', className }) {
31
- return (_jsxs("div", { className: cx('card', className), children: [_jsx("h3", { className: cx(tone !== 'default' && `tone-${tone}`), children: title }), _jsx("div", { children: children })] }));
32
- }
33
- export function StatGrid({ children, columns = 2, className }) {
34
- return (_jsx("div", { className: cx('stat-grid', className), style: { '--supabase-columns': String(columns) }, children: children }));
35
- }
36
- export function Stat({ value, label, className }) {
37
- return (_jsxs("div", { className: cx('stat', className), children: [_jsx("div", { className: "stat-value", children: value }), _jsx("div", { className: "stat-label", children: label })] }));
38
- }
39
- export function StatusList({ children, className }) {
40
- return _jsx("div", { className: cx('status-list', className), children: children });
41
- }
42
- const STATUS_LABELS = {
43
- live: 'live',
44
- partial: 'partial',
45
- planned: 'planned',
46
- unknown: '?'
47
- };
48
- export function StatusItem({ status, name, note, className }) {
49
- return (_jsxs("div", { className: cx('status-item', className), children: [_jsx("span", { className: cx('status-badge', status), children: STATUS_LABELS[status] }), _jsx("span", { className: "status-name", children: name }), note ? _jsx("span", { className: "status-note", children: note }) : null] }));
50
- }
51
- export function createSupabaseComponents() {
52
- return {
53
- h1: (props) => _jsx("h1", { ...props }),
54
- h2: (props) => _jsx("h2", { ...props }),
55
- h3: (props) => _jsx("h3", { ...props }),
56
- p: (props) => _jsx("p", { ...props }),
57
- a: ({ className, ...props }) => (_jsx("a", { className: cx('supabase-link', className), ...props })),
58
- ul: ({ className, ...props }) => (_jsx("ul", { className: cx('supabase-list', className), ...props })),
59
- ol: ({ className, ...props }) => (_jsx("ol", { className: cx('supabase-list', 'supabase-list-ordered', className), ...props })),
60
- li: (props) => _jsx("li", { ...props }),
61
- code: ({ className, ...props }) => (_jsx("code", { className: cx('supabase-inline-code', className), ...props })),
62
- pre: ({ className, ...props }) => (_jsx("pre", { className: cx('supabase-pre', className), ...props })),
63
- table: ({ className, ...props }) => (_jsx("table", { className: cx('supabase-table', className), ...props })),
64
- th: ({ className, ...props }) => (_jsx("th", { className: cx('supabase-th', className), ...props })),
65
- td: ({ className, ...props }) => (_jsx("td", { className: cx('supabase-td', className), ...props })),
66
- blockquote: ({ className, ...props }) => (_jsx("blockquote", { className: cx('supabase-quote', className), ...props })),
67
- SectionSlide,
68
- SupabaseMark,
69
- Divider,
70
- Tag,
71
- Wide,
72
- CardGrid,
73
- Card,
74
- StatGrid,
75
- Stat,
76
- StatusList,
77
- StatusItem
78
- };
79
- }
80
- //# sourceMappingURL=components.js.map
@@ -1,4 +0,0 @@
1
- import type { ThemeModule } from '../../theme-types.js';
2
- import './theme.css';
3
- declare const supabaseTheme: ThemeModule;
4
- export default supabaseTheme;
@@ -1,17 +0,0 @@
1
- import { createSupabaseComponents } from './components.js';
2
- import { SupabaseDeck } from './SupabaseDeck.js';
3
- import './theme.css';
4
- const supabaseTheme = {
5
- Deck: SupabaseDeck,
6
- components: createSupabaseComponents(),
7
- setup({ config, rootElement, helpers }) {
8
- rootElement.style.setProperty('--slide-aspect-ratio', helpers.parseAspectRatio(config.aspectRatio));
9
- rootElement.dataset.transition = config.transition ?? 'fade';
10
- rootElement.dataset.theme = 'supabase';
11
- return () => {
12
- delete rootElement.dataset.theme;
13
- };
14
- }
15
- };
16
- export default supabaseTheme;
17
- //# sourceMappingURL=index.js.map
@@ -1,523 +0,0 @@
1
- @import "tailwindcss";
2
-
3
- :root {
4
- --supabase-background: #080808;
5
- --supabase-foreground: #e0e0e0;
6
- --supabase-heading: #ffffff;
7
- --supabase-accent: #3ecf8e;
8
- --supabase-muted: #888888;
9
- --supabase-dim: #555555;
10
- --supabase-border: rgba(255, 255, 255, 0.1);
11
- --supabase-footer-border: rgba(255, 255, 255, 0.07);
12
- --supabase-footer-height: 56px;
13
- --supabase-max-width: 900px;
14
- --supabase-wide-width: 1100px;
15
- }
16
-
17
- *,
18
- *::before,
19
- *::after {
20
- box-sizing: border-box;
21
- }
22
-
23
- html,
24
- body,
25
- #root {
26
- min-height: 100%;
27
- margin: 0;
28
- }
29
-
30
- body {
31
- min-height: 100vh;
32
- overflow: hidden;
33
- background: var(--supabase-background);
34
- color: var(--supabase-foreground);
35
- font-family:
36
- -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
37
- user-select: none;
38
- }
39
-
40
- button {
41
- font: inherit;
42
- }
43
-
44
- .supabase-deck-shell {
45
- min-height: 100vh;
46
- background: var(--supabase-background);
47
- }
48
-
49
- .supabase-stage {
50
- min-height: calc(100vh - var(--supabase-footer-height));
51
- }
52
-
53
- .supabase-slide {
54
- display: flex;
55
- min-height: calc(100vh - var(--supabase-footer-height));
56
- align-items: center;
57
- justify-content: center;
58
- padding: 48px 64px 72px;
59
- }
60
-
61
- .supabase-slide-inner {
62
- width: 100%;
63
- max-width: var(--supabase-max-width);
64
- }
65
-
66
- .supabase-slide[data-transition="fade"] .supabase-slide-inner {
67
- animation: supabase-fade-in 0.25s ease;
68
- }
69
-
70
- .supabase-slide[data-transition="slide"] .supabase-slide-inner {
71
- animation: supabase-slide-in 0.25s ease;
72
- }
73
-
74
- @keyframes supabase-fade-in {
75
- from {
76
- opacity: 0;
77
- transform: translateY(6px);
78
- }
79
-
80
- to {
81
- opacity: 1;
82
- transform: translateY(0);
83
- }
84
- }
85
-
86
- @keyframes supabase-slide-in {
87
- from {
88
- opacity: 0;
89
- transform: translateX(20px);
90
- }
91
-
92
- to {
93
- opacity: 1;
94
- transform: translateX(0);
95
- }
96
- }
97
-
98
- .supabase-section-slide {
99
- display: flex;
100
- width: 100%;
101
- flex-direction: column;
102
- align-items: center;
103
- text-align: center;
104
- }
105
-
106
- .supabase-wide {
107
- width: 100%;
108
- max-width: var(--supabase-wide-width);
109
- margin: 0 auto;
110
- }
111
-
112
- .supabase-wide > :first-child {
113
- margin-top: 0;
114
- }
115
-
116
- .supabase-wide > :last-child {
117
- margin-bottom: 0;
118
- }
119
-
120
- .supabase-mark {
121
- flex-shrink: 0;
122
- }
123
-
124
- h1,
125
- h2,
126
- h3,
127
- p,
128
- ul,
129
- ol,
130
- blockquote,
131
- pre,
132
- table {
133
- margin: 0;
134
- }
135
-
136
- h1 {
137
- color: var(--supabase-heading);
138
- font-size: clamp(2.8rem, 6vw, 3rem);
139
- font-weight: 800;
140
- line-height: 1.1;
141
- letter-spacing: -0.03em;
142
- }
143
-
144
- h2 {
145
- color: var(--supabase-heading);
146
- font-size: clamp(2rem, 4vw, 2.2rem);
147
- font-weight: 700;
148
- letter-spacing: -0.02em;
149
- }
150
-
151
- h3 {
152
- color: var(--supabase-accent);
153
- font-size: 1.35rem;
154
- font-weight: 600;
155
- letter-spacing: -0.01em;
156
- }
157
-
158
- p,
159
- li,
160
- blockquote {
161
- color: #cccccc;
162
- font-size: 1.15rem;
163
- line-height: 1.7;
164
- }
165
-
166
- .supabase-slide-inner > * + * {
167
- margin-top: 20px;
168
- }
169
-
170
- .supabase-list,
171
- .supabase-list-ordered {
172
- padding-left: 1.2em;
173
- }
174
-
175
- .supabase-list > li + li,
176
- .supabase-list-ordered > li + li {
177
- margin-top: 0.5em;
178
- }
179
-
180
- .green {
181
- color: var(--supabase-accent);
182
- }
183
-
184
- .bold {
185
- color: var(--supabase-heading);
186
- font-weight: 600;
187
- }
188
-
189
- .dim {
190
- color: var(--supabase-muted);
191
- }
192
-
193
- .highlight {
194
- border-radius: 4px;
195
- background: rgba(62, 207, 142, 0.12);
196
- padding: 2px 8px;
197
- color: var(--supabase-accent);
198
- }
199
-
200
- .mono {
201
- font-family: "SF Mono", "Fira Code", monospace;
202
- font-size: 0.95em;
203
- }
204
-
205
- .strikethrough {
206
- color: var(--supabase-dim);
207
- text-decoration: line-through;
208
- }
209
-
210
- .divider {
211
- width: 60px;
212
- height: 3px;
213
- border-radius: 999px;
214
- background: var(--supabase-accent);
215
- }
216
-
217
- .center-divider {
218
- margin-left: auto;
219
- margin-right: auto;
220
- }
221
-
222
- .tag {
223
- display: inline-block;
224
- margin-bottom: 16px;
225
- border: 1px solid rgba(62, 207, 142, 0.4);
226
- border-radius: 4px;
227
- padding: 3px 10px;
228
- color: var(--supabase-accent);
229
- font-size: 0.75rem;
230
- font-weight: 600;
231
- letter-spacing: 0.08em;
232
- text-transform: uppercase;
233
- }
234
-
235
- .tag.red {
236
- border-color: rgba(255, 107, 107, 0.4);
237
- color: #ff6b6b;
238
- }
239
-
240
- .tag.yellow {
241
- border-color: rgba(255, 200, 50, 0.4);
242
- color: #ffc832;
243
- }
244
-
245
- .row {
246
- display: grid;
247
- width: 100%;
248
- grid-template-columns: repeat(var(--supabase-columns, 3), minmax(0, 1fr));
249
- gap: 24px;
250
- }
251
-
252
- .card,
253
- .stat {
254
- border: 1px solid var(--supabase-border);
255
- border-radius: 12px;
256
- padding: 28px 32px;
257
- }
258
-
259
- .card > * + * {
260
- margin-top: 12px;
261
- }
262
-
263
- .card h3.tone-red {
264
- color: #ff6b6b;
265
- }
266
-
267
- .card h3.tone-yellow {
268
- color: #ffc832;
269
- }
270
-
271
- .card p,
272
- .card li {
273
- font-size: 1.05rem;
274
- }
275
-
276
- .stat-grid {
277
- display: grid;
278
- width: 100%;
279
- grid-template-columns: repeat(var(--supabase-columns, 2), minmax(0, 1fr));
280
- gap: 20px;
281
- }
282
-
283
- .stat-value {
284
- margin-bottom: 6px;
285
- color: var(--supabase-accent);
286
- font-size: 2.6rem;
287
- font-weight: 800;
288
- line-height: 1;
289
- letter-spacing: -0.03em;
290
- }
291
-
292
- .stat-label {
293
- color: var(--supabase-muted);
294
- font-size: 0.95rem;
295
- }
296
-
297
- .status-list {
298
- display: flex;
299
- flex-direction: column;
300
- gap: 13px;
301
- }
302
-
303
- .status-item {
304
- display: flex;
305
- align-items: center;
306
- gap: 10px;
307
- }
308
-
309
- .status-name {
310
- min-width: 145px;
311
- color: var(--supabase-foreground);
312
- font-size: 1rem;
313
- font-weight: 600;
314
- }
315
-
316
- .status-note {
317
- color: #666666;
318
- font-size: 0.88rem;
319
- }
320
-
321
- .status-badge {
322
- display: inline-block;
323
- width: 68px;
324
- flex-shrink: 0;
325
- border-radius: 3px;
326
- padding: 2px 0;
327
- text-align: center;
328
- font-size: 0.66rem;
329
- font-weight: 700;
330
- letter-spacing: 0.07em;
331
- text-transform: uppercase;
332
- }
333
-
334
- .status-badge.live {
335
- background: rgba(62, 207, 142, 0.13);
336
- color: var(--supabase-accent);
337
- }
338
-
339
- .status-badge.partial {
340
- background: rgba(255, 200, 50, 0.13);
341
- color: #ffc832;
342
- }
343
-
344
- .status-badge.planned,
345
- .status-badge.unknown {
346
- background: rgba(255, 255, 255, 0.05);
347
- color: var(--supabase-dim);
348
- }
349
-
350
- .supabase-table {
351
- width: 100%;
352
- border-collapse: collapse;
353
- margin-top: 8px;
354
- }
355
-
356
- .supabase-th {
357
- border-bottom: 1px solid rgba(255, 255, 255, 0.08);
358
- padding: 10px 16px;
359
- color: var(--supabase-dim);
360
- text-align: left;
361
- font-size: 0.8rem;
362
- font-weight: 600;
363
- letter-spacing: 0.06em;
364
- text-transform: uppercase;
365
- }
366
-
367
- .supabase-td {
368
- border-bottom: 1px solid rgba(255, 255, 255, 0.06);
369
- padding: 14px 16px;
370
- vertical-align: top;
371
- color: #cccccc;
372
- font-size: 1.05rem;
373
- }
374
-
375
- .supabase-table tr:last-child .supabase-td {
376
- border-bottom: none;
377
- }
378
-
379
- .supabase-link {
380
- color: var(--supabase-accent);
381
- }
382
-
383
- .supabase-inline-code {
384
- border-radius: 4px;
385
- background: rgb(54, 54, 54);
386
- padding: 2px 8px;
387
- color: var(--supabase-foreground);
388
- font-family: "SF Mono", "Fira Code", monospace;
389
- font-size: 0.95em;
390
- }
391
-
392
- .supabase-pre {
393
- overflow-x: auto;
394
- border: 1px solid var(--supabase-border);
395
- border-radius: 12px;
396
- background: rgba(255, 255, 255, 0.04);
397
- padding: 22px 24px;
398
- }
399
-
400
- .supabase-pre code {
401
- background: transparent;
402
- padding: 0;
403
- }
404
-
405
- .supabase-quote {
406
- border-left: 3px solid rgba(62, 207, 142, 0.45);
407
- padding-left: 16px;
408
- color: var(--supabase-muted);
409
- }
410
-
411
- .supabase-footer {
412
- position: fixed;
413
- right: 0;
414
- bottom: 0;
415
- left: 0;
416
- display: flex;
417
- height: var(--supabase-footer-height);
418
- align-items: center;
419
- gap: 16px;
420
- border-top: 1px solid var(--supabase-footer-border);
421
- background: rgba(8, 8, 8, 0.95);
422
- padding: 0 32px;
423
- backdrop-filter: blur(8px);
424
- }
425
-
426
- .supabase-breadcrumb {
427
- display: flex;
428
- min-width: 0;
429
- flex: 1;
430
- align-items: center;
431
- gap: 8px;
432
- overflow: hidden;
433
- }
434
-
435
- .supabase-breadcrumb-item {
436
- position: relative;
437
- border: 0;
438
- background: transparent;
439
- padding: 0;
440
- color: var(--supabase-dim);
441
- white-space: nowrap;
442
- cursor: pointer;
443
- font-size: 0.78rem;
444
- font-weight: 500;
445
- letter-spacing: 0.04em;
446
- transition: color 0.15s ease;
447
- }
448
-
449
- .supabase-breadcrumb-item:hover {
450
- color: #aaaaaa;
451
- }
452
-
453
- .supabase-breadcrumb-item.active {
454
- color: var(--supabase-accent);
455
- }
456
-
457
- .supabase-breadcrumb-item + .supabase-breadcrumb-item::before {
458
- content: "/";
459
- margin-right: 8px;
460
- color: #333333;
461
- }
462
-
463
- .supabase-counter {
464
- flex-shrink: 0;
465
- color: #444444;
466
- font-size: 0.78rem;
467
- font-variant-numeric: tabular-nums;
468
- }
469
-
470
- .supabase-print-deck {
471
- background: var(--supabase-background);
472
- }
473
-
474
- .supabase-slide-print {
475
- min-height: 100vh;
476
- break-after: page;
477
- page-break-after: always;
478
- }
479
-
480
- @media (max-width: 960px) {
481
- body {
482
- overflow: auto;
483
- }
484
-
485
- .supabase-slide {
486
- min-height: auto;
487
- padding: 32px 24px 88px;
488
- }
489
-
490
- .row,
491
- .stat-grid {
492
- grid-template-columns: 1fr;
493
- }
494
-
495
- .supabase-footer {
496
- padding: 0 20px;
497
- }
498
-
499
- .status-item {
500
- flex-wrap: wrap;
501
- }
502
- }
503
-
504
- @media print {
505
- @page {
506
- size: landscape;
507
- margin: 0;
508
- }
509
-
510
- body {
511
- overflow: visible;
512
- }
513
-
514
- .supabase-footer {
515
- display: none;
516
- }
517
-
518
- .supabase-slide,
519
- .supabase-slide-print {
520
- min-height: 100vh;
521
- padding-bottom: 48px;
522
- }
523
- }
@@ -1,19 +0,0 @@
1
- export function parseAspectRatio(input) {
2
- const value = String(input ?? "16:9");
3
- const parts = value.split(":").map((part) => Number(part.trim()));
4
- if (parts.length !== 2 ||
5
- parts.some((part) => !Number.isFinite(part) || part <= 0)) {
6
- return "16 / 9";
7
- }
8
- return `${parts[0]} / ${parts[1]}`;
9
- }
10
- export function clamp(value, min, max) {
11
- return Math.min(max, Math.max(min, value));
12
- }
13
- export function getHashIndex(total) {
14
- const raw = Number(window.location.hash.replace("#", ""));
15
- if (!Number.isFinite(raw) || raw < 1) {
16
- return 0;
17
- }
18
- return clamp(raw - 1, 0, Math.max(total - 1, 0));
19
- }