@sp-days-framework/docusaurus-plugin-slidev 1.0.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 (50) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +286 -0
  3. package/lib/index.d.ts +7 -0
  4. package/lib/index.d.ts.map +1 -0
  5. package/lib/index.js +14 -0
  6. package/lib/index.js.map +1 -0
  7. package/lib/plugin/builder.d.ts +31 -0
  8. package/lib/plugin/builder.d.ts.map +1 -0
  9. package/lib/plugin/builder.js +421 -0
  10. package/lib/plugin/builder.js.map +1 -0
  11. package/lib/plugin/index.d.ts +18 -0
  12. package/lib/plugin/index.d.ts.map +1 -0
  13. package/lib/plugin/index.js +148 -0
  14. package/lib/plugin/index.js.map +1 -0
  15. package/lib/plugin/scanner.d.ts +12 -0
  16. package/lib/plugin/scanner.d.ts.map +1 -0
  17. package/lib/plugin/scanner.js +119 -0
  18. package/lib/plugin/scanner.js.map +1 -0
  19. package/lib/theme/SlidevCard/index.d.ts +12 -0
  20. package/lib/theme/SlidevCard/index.d.ts.map +1 -0
  21. package/lib/theme/SlidevCard/index.js +74 -0
  22. package/lib/theme/SlidevCard/index.js.map +1 -0
  23. package/lib/theme/SlidevCard/styles.module.css +206 -0
  24. package/lib/theme/SlidevOverview/index.d.ts +6 -0
  25. package/lib/theme/SlidevOverview/index.d.ts.map +1 -0
  26. package/lib/theme/SlidevOverview/index.js +165 -0
  27. package/lib/theme/SlidevOverview/index.js.map +1 -0
  28. package/lib/theme/SlidevOverview/styles.module.css +283 -0
  29. package/lib/theme/SlidevPresentation/index.d.ts +6 -0
  30. package/lib/theme/SlidevPresentation/index.d.ts.map +1 -0
  31. package/lib/theme/SlidevPresentation/index.js +75 -0
  32. package/lib/theme/SlidevPresentation/index.js.map +1 -0
  33. package/lib/theme/SlidevPresentation/styles.module.css +178 -0
  34. package/lib/types/index.d.ts +171 -0
  35. package/lib/types/index.d.ts.map +1 -0
  36. package/lib/types/index.js +6 -0
  37. package/lib/types/index.js.map +1 -0
  38. package/lib/utils/fileSystem.d.ts +19 -0
  39. package/lib/utils/fileSystem.d.ts.map +1 -0
  40. package/lib/utils/fileSystem.js +89 -0
  41. package/lib/utils/fileSystem.js.map +1 -0
  42. package/lib/utils/icons.d.ts +23 -0
  43. package/lib/utils/icons.d.ts.map +1 -0
  44. package/lib/utils/icons.js +37 -0
  45. package/lib/utils/icons.js.map +1 -0
  46. package/lib/utils/logger.d.ts +43 -0
  47. package/lib/utils/logger.d.ts.map +1 -0
  48. package/lib/utils/logger.js +92 -0
  49. package/lib/utils/logger.js.map +1 -0
  50. package/package.json +75 -0
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ /**
3
+ * Scanner utility for discovering Slidev presentations
4
+ */
5
+ var __importDefault = (this && this.__importDefault) || function (mod) {
6
+ return (mod && mod.__esModule) ? mod : { "default": mod };
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.scanPresentations = scanPresentations;
10
+ const fs_1 = __importDefault(require("fs"));
11
+ const path_1 = __importDefault(require("path"));
12
+ const gray_matter_1 = __importDefault(require("gray-matter"));
13
+ const logger_1 = require("../utils/logger");
14
+ /**
15
+ * Recursively scans a directory for Slidev markdown files
16
+ * @param dir Directory to scan
17
+ * @param baseDir Base directory for relative path calculation
18
+ * @returns Array of file paths relative to baseDir
19
+ */
20
+ function scanDirectory(dir, baseDir) {
21
+ const files = [];
22
+ if (!fs_1.default.existsSync(dir)) {
23
+ return files;
24
+ }
25
+ const entries = fs_1.default.readdirSync(dir, { withFileTypes: true });
26
+ for (const entry of entries) {
27
+ const fullPath = path_1.default.join(dir, entry.name);
28
+ if (entry.isDirectory()) {
29
+ // Skip node_modules and hidden directories
30
+ if (entry.name === "node_modules" || entry.name.startsWith(".")) {
31
+ continue;
32
+ }
33
+ // Recursively scan subdirectories
34
+ files.push(...scanDirectory(fullPath, baseDir));
35
+ }
36
+ else if (entry.isFile() && entry.name.endsWith(".md")) {
37
+ // Add markdown files
38
+ const relativePath = path_1.default.relative(baseDir, fullPath);
39
+ files.push(relativePath);
40
+ }
41
+ }
42
+ return files;
43
+ }
44
+ /**
45
+ * Generates a presentation ID from a file path
46
+ * Examples:
47
+ * 'presentation.md' -> 'presentation'
48
+ * 'module-01/slides.md' -> 'module-01-slides'
49
+ * 'workshop/intro.md' -> 'workshop-intro'
50
+ */
51
+ function generatePresentationId(filePath) {
52
+ // Remove .md extension
53
+ const withoutExt = filePath.replace(/\.md$/, "");
54
+ // Replace path separators and spaces with hyphens
55
+ const id = withoutExt
56
+ .replace(/[/\\]/g, "-")
57
+ .replace(/\s+/g, "-")
58
+ .toLowerCase();
59
+ return id;
60
+ }
61
+ /**
62
+ * Extracts frontmatter metadata from a Slidev markdown file
63
+ */
64
+ function extractMetadata(filePath) {
65
+ try {
66
+ const content = fs_1.default.readFileSync(filePath, "utf-8");
67
+ const { data } = (0, gray_matter_1.default)(content);
68
+ return data;
69
+ }
70
+ catch (error) {
71
+ (0, logger_1.logWarn)(`Failed to extract frontmatter from ${(0, logger_1.formatPath)(filePath)}: ${error}`);
72
+ return {};
73
+ }
74
+ }
75
+ /**
76
+ * Scans for Slidev presentations and extracts metadata
77
+ */
78
+ async function scanPresentations(options, context) {
79
+ const sourceDir = path_1.default.resolve(context.siteDir, options.sourceDir);
80
+ // Scan for markdown files
81
+ const markdownFiles = scanDirectory(sourceDir, sourceDir);
82
+ if (markdownFiles.length === 0) {
83
+ (0, logger_1.logWarn)(`No Slidev presentations found in ${(0, logger_1.formatPath)(sourceDir)}`);
84
+ return [];
85
+ }
86
+ (0, logger_1.logInfo)(`Found ${(0, logger_1.formatNumber)(markdownFiles.length)} Slidev file(s) in: ${(0, logger_1.formatPath)(sourceDir)}`);
87
+ // Extract metadata for each file
88
+ const presentations = markdownFiles.map((relativePath) => {
89
+ const sourceAbsolutePath = path_1.default.join(sourceDir, relativePath);
90
+ const id = generatePresentationId(relativePath);
91
+ const frontmatter = extractMetadata(sourceAbsolutePath);
92
+ // Generate title from frontmatter or filename
93
+ const title = frontmatter.title || path_1.default.basename(relativePath, ".md");
94
+ // Generate URL path
95
+ const baseUrl = context.baseUrl.endsWith("/")
96
+ ? context.baseUrl.slice(0, -1)
97
+ : context.baseUrl;
98
+ const url = `${baseUrl}/${options.outputDir}/${id}/`;
99
+ // Generate output path
100
+ const outputPath = path_1.default.join(context.siteDir, "static", options.outputDir, id);
101
+ // Generate preview URL - points to the presentation with slide number parameter
102
+ // Slidev supports ?clicks=0 to show first slide without any build steps
103
+ const previewUrl = `${baseUrl}/${options.outputDir}/${id}/?clicks=0`;
104
+ return {
105
+ id,
106
+ title,
107
+ description: frontmatter.description,
108
+ theme: frontmatter.theme,
109
+ author: frontmatter.author,
110
+ sourcePath: relativePath,
111
+ sourceAbsolutePath,
112
+ url,
113
+ outputPath,
114
+ previewUrl,
115
+ };
116
+ });
117
+ return presentations;
118
+ }
119
+ //# sourceMappingURL=scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../src/plugin/scanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * SlidevCard Component
3
+ * Displays a single Slidev presentation card
4
+ */
5
+ import type { PresentationMetadata } from '../../types';
6
+ interface SlidevCardProps {
7
+ presentation: PresentationMetadata;
8
+ isDev: boolean;
9
+ }
10
+ export default function SlidevCard({ presentation, isDev }: SlidevCardProps): JSX.Element;
11
+ export {};
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/theme/SlidevCard/index.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAIxD,UAAU,eAAe;IACvB,YAAY,EAAE,oBAAoB,CAAC;IACnC,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,eAAe,GAAG,GAAG,CAAC,OAAO,CA0ExF"}
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ /**
3
+ * SlidevCard Component
4
+ * Displays a single Slidev presentation card
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || (function () {
23
+ var ownKeys = function(o) {
24
+ ownKeys = Object.getOwnPropertyNames || function (o) {
25
+ var ar = [];
26
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
+ return ar;
28
+ };
29
+ return ownKeys(o);
30
+ };
31
+ return function (mod) {
32
+ if (mod && mod.__esModule) return mod;
33
+ var result = {};
34
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
+ __setModuleDefault(result, mod);
36
+ return result;
37
+ };
38
+ })();
39
+ var __importDefault = (this && this.__importDefault) || function (mod) {
40
+ return (mod && mod.__esModule) ? mod : { "default": mod };
41
+ };
42
+ Object.defineProperty(exports, "__esModule", { value: true });
43
+ exports.default = SlidevCard;
44
+ const react_1 = __importStar(require("react"));
45
+ const icons_1 = require("../../utils/icons");
46
+ const styles_module_css_1 = __importDefault(require("./styles.module.css"));
47
+ function SlidevCard({ presentation, isDev }) {
48
+ const [isLoading, setIsLoading] = (0, react_1.useState)(true);
49
+ const handleIframeLoad = () => {
50
+ setIsLoading(false);
51
+ };
52
+ const cardContent = (react_1.default.createElement(react_1.default.Fragment, null,
53
+ react_1.default.createElement("div", { className: styles_module_css_1.default.preview }, !isDev && presentation.previewUrl ? (react_1.default.createElement(react_1.default.Fragment, null,
54
+ isLoading && (react_1.default.createElement("div", { className: styles_module_css_1.default.previewLoading },
55
+ react_1.default.createElement("div", { className: styles_module_css_1.default.spinner }))),
56
+ react_1.default.createElement("iframe", { src: presentation.previewUrl, className: `${styles_module_css_1.default.previewIframe} ${isLoading ? styles_module_css_1.default.previewIframeLoading : styles_module_css_1.default.previewIframeLoaded}`, title: `Preview of ${presentation.title}`, loading: "lazy", onLoad: handleIframeLoad }))) : (react_1.default.createElement(icons_1.PresentationIcon, { className: styles_module_css_1.default.previewIcon, width: 160, height: 90 }))),
57
+ react_1.default.createElement("div", { className: styles_module_css_1.default.content },
58
+ react_1.default.createElement("div", { className: styles_module_css_1.default.header },
59
+ react_1.default.createElement("h3", { className: styles_module_css_1.default.title }, presentation.title),
60
+ isDev && react_1.default.createElement("span", { className: `${styles_module_css_1.default.badge} ${styles_module_css_1.default.unavailableBadge}` }, "Build Required")),
61
+ presentation.description && (react_1.default.createElement("p", { className: styles_module_css_1.default.description }, presentation.description)),
62
+ presentation.author && (react_1.default.createElement("div", { className: styles_module_css_1.default.metadata },
63
+ react_1.default.createElement("div", { className: styles_module_css_1.default.metadataItem },
64
+ react_1.default.createElement("svg", { className: styles_module_css_1.default.icon, viewBox: "0 0 16 16", fill: "currentColor" },
65
+ react_1.default.createElement("path", { d: "M8 8a3 3 0 100-6 3 3 0 000 6zm0 1a6 6 0 00-6 6h12a6 6 0 00-6-6z" })),
66
+ react_1.default.createElement("span", null, presentation.author)))))));
67
+ // In dev mode, render as a link to the placeholder page
68
+ if (isDev) {
69
+ return (react_1.default.createElement("a", { href: presentation.url, className: styles_module_css_1.default.card }, cardContent));
70
+ }
71
+ // In production, render as a link that opens in new window
72
+ return (react_1.default.createElement("a", { href: presentation.url, className: styles_module_css_1.default.card, target: "_blank", rel: "noopener noreferrer" }, cardContent));
73
+ }
74
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/theme/SlidevCard/index.tsx"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYH,6BA0EC;AApFD,+CAAwC;AAExC,6CAAqD;AACrD,4EAAyC;AAOzC,SAAwB,UAAU,CAAC,EAAE,YAAY,EAAE,KAAK,EAAmB;IACzE,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,IAAA,gBAAQ,EAAC,IAAI,CAAC,CAAC;IAEjD,MAAM,gBAAgB,GAAG,GAAG,EAAE;QAC5B,YAAY,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,CAClB;QACE,uCAAK,SAAS,EAAE,2BAAM,CAAC,OAAO,IAC3B,CAAC,KAAK,IAAI,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,CACnC;YACG,SAAS,IAAI,CACZ,uCAAK,SAAS,EAAE,2BAAM,CAAC,cAAc;gBACnC,uCAAK,SAAS,EAAE,2BAAM,CAAC,OAAO,GAAQ,CAClC,CACP;YACD,0CACE,GAAG,EAAE,YAAY,CAAC,UAAU,EAC5B,SAAS,EAAE,GAAG,2BAAM,CAAC,aAAa,IAAI,SAAS,CAAC,CAAC,CAAC,2BAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC,2BAAM,CAAC,mBAAmB,EAAE,EAC5G,KAAK,EAAE,cAAc,YAAY,CAAC,KAAK,EAAE,EACzC,OAAO,EAAC,MAAM,EACd,MAAM,EAAE,gBAAgB,GACxB,CACD,CACJ,CAAC,CAAC,CAAC,CACF,8BAAC,wBAAgB,IAAC,SAAS,EAAE,2BAAM,CAAC,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,GAAI,CAC5E,CACG;QAEN,uCAAK,SAAS,EAAE,2BAAM,CAAC,OAAO;YAC5B,uCAAK,SAAS,EAAE,2BAAM,CAAC,MAAM;gBAC3B,sCAAI,SAAS,EAAE,2BAAM,CAAC,KAAK,IAAG,YAAY,CAAC,KAAK,CAAM;gBACrD,KAAK,IAAI,wCAAM,SAAS,EAAE,GAAG,2BAAM,CAAC,KAAK,IAAI,2BAAM,CAAC,gBAAgB,EAAE,qBAAuB,CAC1F;YAEL,YAAY,CAAC,WAAW,IAAI,CAC3B,qCAAG,SAAS,EAAE,2BAAM,CAAC,WAAW,IAAG,YAAY,CAAC,WAAW,CAAK,CACjE;YAEA,YAAY,CAAC,MAAM,IAAI,CACtB,uCAAK,SAAS,EAAE,2BAAM,CAAC,QAAQ;gBAC7B,uCAAK,SAAS,EAAE,2BAAM,CAAC,YAAY;oBACjC,uCAAK,SAAS,EAAE,2BAAM,CAAC,IAAI,EAAE,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,cAAc;wBAClE,wCAAM,CAAC,EAAC,iEAAiE,GAAE,CACvE;oBACN,4CAAO,YAAY,CAAC,MAAM,CAAQ,CAC9B,CACF,CACP,CACG,CACL,CACJ,CAAC;IAEF,wDAAwD;IACxD,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,CACL,qCAAG,IAAI,EAAE,YAAY,CAAC,GAAG,EAAE,SAAS,EAAE,2BAAM,CAAC,IAAI,IAC9C,WAAW,CACV,CACL,CAAC;IACJ,CAAC;IAED,2DAA2D;IAC3D,OAAO,CACL,qCACE,IAAI,EAAE,YAAY,CAAC,GAAG,EACtB,SAAS,EAAE,2BAAM,CAAC,IAAI,EACtB,MAAM,EAAC,QAAQ,EACf,GAAG,EAAC,qBAAqB,IAExB,WAAW,CACV,CACL,CAAC;AACJ,CAAC"}
@@ -0,0 +1,206 @@
1
+ .card {
2
+ display: flex;
3
+ flex-direction: row;
4
+ gap: 1rem;
5
+ padding: 1rem;
6
+ border-radius: 8px;
7
+ transition: all 0.3s ease;
8
+ text-decoration: none !important;
9
+ background: var(--ifm-card-background-color);
10
+ box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
11
+ border: 1px solid var(--ifm-color-emphasis-200);
12
+ width: 530px;
13
+ height: 150px;
14
+ flex-shrink: 0;
15
+ }
16
+
17
+ .card:hover {
18
+ transform: translateY(-4px);
19
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
20
+ text-decoration: none;
21
+ border-color: var(--ifm-color-primary);
22
+ }
23
+
24
+ .preview {
25
+ flex-shrink: 0;
26
+ height: 115px;
27
+ width: 204px;
28
+ display: flex;
29
+ align-items: center;
30
+ justify-content: center;
31
+ background: var(--ifm-color-emphasis-100);
32
+ border-radius: 6px;
33
+ align-self: center;
34
+ overflow: hidden;
35
+ position: relative;
36
+ }
37
+
38
+ .previewLoading {
39
+ position: absolute;
40
+ top: 0;
41
+ left: 0;
42
+ right: 0;
43
+ bottom: 0;
44
+ display: flex;
45
+ align-items: center;
46
+ justify-content: center;
47
+ background: var(--ifm-color-emphasis-100);
48
+ z-index: 1;
49
+ }
50
+
51
+ .spinner {
52
+ width: 24px;
53
+ height: 24px;
54
+ border: 3px solid var(--ifm-color-emphasis-300);
55
+ border-top-color: var(--ifm-color-primary);
56
+ border-radius: 50%;
57
+ animation: spin 0.8s linear infinite;
58
+ }
59
+
60
+ @keyframes spin {
61
+ to {
62
+ transform: rotate(360deg);
63
+ }
64
+ }
65
+
66
+ .previewIframe {
67
+ width: 960px;
68
+ height: 540px;
69
+ border: none;
70
+ position: absolute;
71
+ top: 50%;
72
+ left: 50%;
73
+ transform: translate(-50%, -50%) scale(0.22);
74
+ transform-origin: center center;
75
+ pointer-events: none;
76
+ background: white;
77
+ border-radius: 6px;
78
+ transition: opacity 0.3s ease;
79
+ }
80
+
81
+ .previewIframeLoading {
82
+ opacity: 0;
83
+ }
84
+
85
+ .previewIframeLoaded {
86
+ opacity: 1;
87
+ }
88
+
89
+ .previewIcon {
90
+ color: var(--ifm-color-primary);
91
+ opacity: 0.7;
92
+ }
93
+
94
+ .content {
95
+ flex-grow: 1;
96
+ min-width: 0;
97
+ display: flex;
98
+ flex-direction: column;
99
+ overflow: hidden;
100
+ }
101
+
102
+ .header {
103
+ display: flex;
104
+ align-items: flex-start;
105
+ justify-content: space-between;
106
+ margin-bottom: 0.5rem;
107
+ gap: 0.5rem;
108
+ }
109
+
110
+ .title {
111
+ margin: 0;
112
+ font-size: 1.1rem;
113
+ font-weight: 600;
114
+ color: var(--ifm-color-primary);
115
+ flex-grow: 1;
116
+ /* Truncate to single line */
117
+ overflow: hidden;
118
+ text-overflow: ellipsis;
119
+ white-space: nowrap;
120
+ }
121
+
122
+ .badge {
123
+ display: inline-flex;
124
+ align-items: center;
125
+ padding: 0.2rem 0.6rem;
126
+ border-radius: 12px;
127
+ font-size: 0.7rem;
128
+ font-weight: 500;
129
+ background: var(--ifm-color-warning-contrast-background);
130
+ color: var(--ifm-color-warning-contrast-foreground);
131
+ white-space: nowrap;
132
+ flex-shrink: 0;
133
+ }
134
+
135
+ .description {
136
+ margin-bottom: 0.5rem;
137
+ color: var(--ifm-color-emphasis-700);
138
+ font-size: 0.9rem;
139
+ line-height: 1.5;
140
+ /* Truncate to max 2 lines */
141
+ display: -webkit-box;
142
+ -webkit-box-orient: vertical;
143
+ -webkit-line-clamp: 2;
144
+ line-clamp: 2;
145
+ overflow: hidden;
146
+ text-overflow: ellipsis;
147
+ }
148
+
149
+ .metadata {
150
+ display: flex;
151
+ align-items: center;
152
+ gap: 0.75rem;
153
+ font-size: 0.85rem;
154
+ color: var(--ifm-color-emphasis-600);
155
+ margin-top: auto; /* Push to bottom */
156
+ min-height: 1.5rem; /* Reserve space even if empty */
157
+ }
158
+
159
+ .metadataItem {
160
+ display: flex;
161
+ align-items: center;
162
+ gap: 0.25rem;
163
+ }
164
+
165
+ .icon {
166
+ width: 14px;
167
+ height: 14px;
168
+ opacity: 0.7;
169
+ }
170
+
171
+ .unavailableBadge {
172
+ background: var(--ifm-color-warning-lightest);
173
+ color: black;
174
+ }
175
+
176
+ @media (max-width: 768px) {
177
+ .card {
178
+ padding: 1rem;
179
+ flex-direction: column;
180
+ width: 100%;
181
+ height: auto;
182
+ }
183
+
184
+ .preview {
185
+ width: 100%;
186
+ height: auto;
187
+ aspect-ratio: 16 / 9;
188
+ align-self: stretch;
189
+ }
190
+
191
+ .previewIframe {
192
+ width: 960px;
193
+ height: 540px;
194
+ transform: translate(-50%, -50%) scale(calc(100vw / 960 * 0.9));
195
+ }
196
+
197
+ .title {
198
+ font-size: 1rem;
199
+ }
200
+
201
+ .metadata {
202
+ flex-direction: column;
203
+ align-items: flex-start;
204
+ gap: 0.5rem;
205
+ }
206
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * SlidevOverview Component
3
+ * Main overview page that displays all Slidev presentations
4
+ */
5
+ export default function SlidevOverview(): JSX.Element;
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/theme/SlidevOverview/index.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAkBH,MAAM,CAAC,OAAO,UAAU,cAAc,IAAI,GAAG,CAAC,OAAO,CAyMpD"}
@@ -0,0 +1,165 @@
1
+ "use strict";
2
+ /**
3
+ * SlidevOverview Component
4
+ * Main overview page that displays all Slidev presentations
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || (function () {
23
+ var ownKeys = function(o) {
24
+ ownKeys = Object.getOwnPropertyNames || function (o) {
25
+ var ar = [];
26
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
+ return ar;
28
+ };
29
+ return ownKeys(o);
30
+ };
31
+ return function (mod) {
32
+ if (mod && mod.__esModule) return mod;
33
+ var result = {};
34
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
+ __setModuleDefault(result, mod);
36
+ return result;
37
+ };
38
+ })();
39
+ var __importDefault = (this && this.__importDefault) || function (mod) {
40
+ return (mod && mod.__esModule) ? mod : { "default": mod };
41
+ };
42
+ Object.defineProperty(exports, "__esModule", { value: true });
43
+ exports.default = SlidevOverview;
44
+ const react_1 = __importStar(require("react"));
45
+ const Layout_1 = __importDefault(require("@theme/Layout"));
46
+ const useGlobalData_1 = require("@docusaurus/useGlobalData");
47
+ const SlidevCard_1 = __importDefault(require("../SlidevCard"));
48
+ const icons_1 = require("../../utils/icons");
49
+ const styles_module_css_1 = __importDefault(require("./styles.module.css"));
50
+ const STORAGE_KEYS = {
51
+ viewMode: 'slidev-plugin-view-mode',
52
+ sortOrder: 'slidev-plugin-sort-order',
53
+ };
54
+ function SlidevOverview() {
55
+ const { presentations, config, isDev } = (0, useGlobalData_1.usePluginData)('docusaurus-plugin-slidev');
56
+ // Load preferences from sessionStorage
57
+ const [viewMode, setViewMode] = (0, react_1.useState)(() => {
58
+ if (typeof window !== 'undefined') {
59
+ return sessionStorage.getItem(STORAGE_KEYS.viewMode) || 'grid';
60
+ }
61
+ return 'grid';
62
+ });
63
+ const [sortOrder, setSortOrder] = (0, react_1.useState)(() => {
64
+ if (typeof window !== 'undefined') {
65
+ return sessionStorage.getItem(STORAGE_KEYS.sortOrder) || 'asc';
66
+ }
67
+ return 'asc';
68
+ });
69
+ // Save preferences to sessionStorage
70
+ (0, react_1.useEffect)(() => {
71
+ if (typeof window !== 'undefined') {
72
+ sessionStorage.setItem(STORAGE_KEYS.viewMode, viewMode);
73
+ }
74
+ }, [viewMode]);
75
+ (0, react_1.useEffect)(() => {
76
+ if (typeof window !== 'undefined') {
77
+ sessionStorage.setItem(STORAGE_KEYS.sortOrder, sortOrder);
78
+ }
79
+ }, [sortOrder]);
80
+ // Sort presentations by name
81
+ const sortedPresentations = (0, react_1.useMemo)(() => {
82
+ const sorted = [...presentations];
83
+ return sorted.sort((a, b) => {
84
+ const comparison = a.title.localeCompare(b.title);
85
+ return sortOrder === 'asc' ? comparison : -comparison;
86
+ });
87
+ }, [presentations, sortOrder]);
88
+ // Create a map of presentation ID to sort order for CSS ordering
89
+ const sortOrderMap = (0, react_1.useMemo)(() => {
90
+ const map = new Map();
91
+ sortedPresentations.forEach((presentation, index) => {
92
+ map.set(presentation.id, index);
93
+ });
94
+ return map;
95
+ }, [sortedPresentations]);
96
+ // Toggle sort order
97
+ const toggleSort = () => {
98
+ setSortOrder(sortOrder === 'asc' ? 'desc' : 'asc');
99
+ };
100
+ // Toggle view mode
101
+ const toggleView = () => {
102
+ setViewMode(viewMode === 'grid' ? 'details' : 'grid');
103
+ };
104
+ // Get title and tagline from config or use defaults
105
+ const title = config.overviewTitle || 'Slidev Presentations';
106
+ const tagline = config.overviewTagline || 'Interactive presentation overview';
107
+ return (react_1.default.createElement(Layout_1.default, { title: title, description: tagline },
108
+ react_1.default.createElement("div", { className: styles_module_css_1.default.container },
109
+ presentations.length > 0 && (react_1.default.createElement("div", { className: styles_module_css_1.default.controls },
110
+ react_1.default.createElement("button", { className: styles_module_css_1.default.controlButton, onClick: toggleSort, title: sortOrder === 'asc' ? 'Sort Z-A' : 'Sort A-Z' }, sortOrder === 'asc' ? (react_1.default.createElement(icons_1.SortAscIcon, { width: 20, height: 20 })) : (react_1.default.createElement(icons_1.SortDescIcon, { width: 20, height: 20 }))),
111
+ react_1.default.createElement("button", { className: styles_module_css_1.default.controlButton, onClick: toggleView, title: viewMode === 'grid' ? 'Switch to Details' : 'Switch to Grid' }, viewMode === 'grid' ? (react_1.default.createElement("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "currentColor" },
112
+ react_1.default.createElement("path", { d: "M3 13h8v-2H3v2zm0 4h8v-2H3v2zm0-8h8V7H3v2zm10 0v2h8V9h-8zm0 8h8v-2h-8v2zm0-4h8v-2h-8v2z" }))) : (react_1.default.createElement("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "currentColor" },
113
+ react_1.default.createElement("path", { d: "M3 3v8h8V3H3zm6 6H5V5h4v4zm-6 4v8h8v-8H3zm6 6H5v-4h4v4zm4-16v8h8V3h-8zm6 6h-4V5h4v4zm-6 4v8h8v-8h-8zm6 6h-4v-4h4v4z" })))))),
114
+ react_1.default.createElement("div", { className: styles_module_css_1.default.headerWrapper },
115
+ react_1.default.createElement("header", { className: styles_module_css_1.default.header },
116
+ react_1.default.createElement("h1", { className: styles_module_css_1.default.title }, title),
117
+ react_1.default.createElement("p", { className: styles_module_css_1.default.subtitle }, tagline))),
118
+ isDev && (react_1.default.createElement("div", { className: styles_module_css_1.default.devModeWarning },
119
+ react_1.default.createElement("div", { className: styles_module_css_1.default.warningTitle },
120
+ react_1.default.createElement("svg", { className: styles_module_css_1.default.warningIcon, viewBox: "0 0 24 24" },
121
+ react_1.default.createElement("path", { fill: "currentColor", d: "M12 1.67c.955 0 1.845.467 2.39 1.247l.105.16l8.114 13.548a2.914 2.914 0 0 1-2.307 4.363l-.195.008H3.882a2.914 2.914 0 0 1-2.582-4.2l.099-.185l8.11-13.538A2.91 2.91 0 0 1 12 1.67M12.01 15l-.127.007a1 1 0 0 0 0 1.986L12 17l.127-.007a1 1 0 0 0 0-1.986zM12 8a1 1 0 0 0-.993.883L11 9v4l.007.117a1 1 0 0 0 1.986 0L13 13V9l-.007-.117A1 1 0 0 0 12 8" })),
122
+ "Development Mode"),
123
+ react_1.default.createElement("p", { className: styles_module_css_1.default.warningText },
124
+ "Slidev presentations are only available after building the site.",
125
+ react_1.default.createElement("br", null),
126
+ "Run ",
127
+ react_1.default.createElement("code", { className: styles_module_css_1.default.warningCode }, "npm run build"),
128
+ " to generate presentations, then ",
129
+ react_1.default.createElement("code", { className: styles_module_css_1.default.warningCode }, "npm run serve"),
130
+ " to view them.",
131
+ react_1.default.createElement("br", null)))),
132
+ presentations.length === 0 ? (react_1.default.createElement("div", { className: styles_module_css_1.default.emptyState },
133
+ react_1.default.createElement("svg", { className: styles_module_css_1.default.emptyStateIcon, viewBox: "0 0 24 24" },
134
+ react_1.default.createElement("path", { fill: "none", stroke: "currentColor", "stroke-linecap": "round", "stroke-linejoin": "round", "stroke-width": "2", d: "M3 4h1m4 0h13M4 4v10a2 2 0 0 0 2 2h10m3.42-.592c.359-.362.58-.859.58-1.408V4m-8 12v4m-3 0h6m-7-8l2-2m4 0l2-2M3 3l18 18" })),
135
+ react_1.default.createElement("h2", { className: styles_module_css_1.default.emptyStateTitle }, "No Presentations Found"),
136
+ react_1.default.createElement("p", { className: styles_module_css_1.default.emptyStateText },
137
+ "Create a Slidev presentation in the ",
138
+ react_1.default.createElement("code", null, config.sourceDir),
139
+ " directory."),
140
+ react_1.default.createElement("code", { className: styles_module_css_1.default.emptyStateCode },
141
+ "echo \"# My First Slide\" > ",
142
+ config.sourceDir,
143
+ "/presentation.md"))) : (react_1.default.createElement(react_1.default.Fragment, null,
144
+ react_1.default.createElement("div", { className: styles_module_css_1.default.contentContainer },
145
+ react_1.default.createElement("div", { className: `${styles_module_css_1.default.detailsTable} ${viewMode === 'details' ? styles_module_css_1.default.visible : styles_module_css_1.default.hidden}` },
146
+ react_1.default.createElement("table", null,
147
+ react_1.default.createElement("thead", null,
148
+ react_1.default.createElement("tr", null,
149
+ react_1.default.createElement("th", null, "Title"),
150
+ react_1.default.createElement("th", null, "Description"),
151
+ react_1.default.createElement("th", null, "Author"))),
152
+ react_1.default.createElement("tbody", null, presentations.map((presentation) => {
153
+ const order = sortOrderMap.get(presentation.id) ?? 0;
154
+ return (react_1.default.createElement("tr", { key: presentation.id, style: { order } },
155
+ react_1.default.createElement("td", null, isDev ? (react_1.default.createElement("span", { className: styles_module_css_1.default.detailsTitle }, presentation.title)) : (react_1.default.createElement("a", { href: presentation.url, className: styles_module_css_1.default.detailsLink, target: "_blank", rel: "noopener noreferrer" }, presentation.title))),
156
+ react_1.default.createElement("td", { className: styles_module_css_1.default.detailsDescription }, presentation.description || '—'),
157
+ react_1.default.createElement("td", null, presentation.author || '—')));
158
+ })))),
159
+ react_1.default.createElement("div", { className: `${styles_module_css_1.default.grid} ${viewMode === 'grid' ? styles_module_css_1.default.visible : styles_module_css_1.default.hidden}` }, presentations.map((presentation) => {
160
+ const order = sortOrderMap.get(presentation.id) ?? 0;
161
+ return (react_1.default.createElement("div", { key: presentation.id, style: { order } },
162
+ react_1.default.createElement(SlidevCard_1.default, { presentation: presentation, isDev: isDev })));
163
+ }))))))));
164
+ }
165
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/theme/SlidevOverview/index.tsx"],"names":[],"mappings":"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"}