@sp-days-framework/docusaurus-plugin-slidev 1.1.0-beta2 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/docs/advanced-configuration.mdx +103 -24
  2. package/docs/changelog.mdx +41 -9
  3. package/docs/install.mdx +28 -19
  4. package/docs/slide-directory.mdx +184 -0
  5. package/docs/slidev-link.mdx +40 -0
  6. package/lib/plugin/builder.d.ts +9 -3
  7. package/lib/plugin/builder.d.ts.map +1 -1
  8. package/lib/plugin/builder.js +130 -39
  9. package/lib/plugin/builder.js.map +1 -1
  10. package/lib/plugin/index.d.ts.map +1 -1
  11. package/lib/plugin/index.js +108 -26
  12. package/lib/plugin/index.js.map +1 -1
  13. package/lib/plugin/scanner.d.ts +9 -2
  14. package/lib/plugin/scanner.d.ts.map +1 -1
  15. package/lib/plugin/scanner.js +180 -29
  16. package/lib/plugin/scanner.js.map +1 -1
  17. package/lib/theme/SlidevCard/index.d.ts.map +1 -1
  18. package/lib/theme/SlidevCard/index.js +1 -2
  19. package/lib/theme/SlidevCard/index.js.map +1 -1
  20. package/lib/theme/SlidevCard/styles.module.css +6 -2
  21. package/lib/theme/SlidevCategoryCard/index.d.ts +11 -0
  22. package/lib/theme/SlidevCategoryCard/index.d.ts.map +1 -0
  23. package/lib/theme/SlidevCategoryCard/index.js +31 -0
  24. package/lib/theme/SlidevCategoryCard/index.js.map +1 -0
  25. package/lib/theme/SlidevCategoryCard/styles.module.css +158 -0
  26. package/lib/theme/SlidevLink/index.d.ts +32 -0
  27. package/lib/theme/SlidevLink/index.d.ts.map +1 -0
  28. package/lib/theme/SlidevLink/index.js +139 -0
  29. package/lib/theme/SlidevLink/index.js.map +1 -0
  30. package/lib/theme/SlidevLink/styles.module.css +228 -0
  31. package/lib/theme/SlidevListItem/index.d.ts +18 -0
  32. package/lib/theme/SlidevListItem/index.d.ts.map +1 -0
  33. package/lib/theme/SlidevListItem/index.js +44 -0
  34. package/lib/theme/SlidevListItem/index.js.map +1 -0
  35. package/lib/theme/SlidevListItem/styles.module.css +128 -0
  36. package/lib/theme/SlidevOverview/index.d.ts +1 -0
  37. package/lib/theme/SlidevOverview/index.d.ts.map +1 -1
  38. package/lib/theme/SlidevOverview/index.js +156 -71
  39. package/lib/theme/SlidevOverview/index.js.map +1 -1
  40. package/lib/theme/SlidevOverview/styles.module.css +176 -147
  41. package/lib/types/index.d.ts +85 -6
  42. package/lib/types/index.d.ts.map +1 -1
  43. package/lib/utils/fileSystem.d.ts +53 -0
  44. package/lib/utils/fileSystem.d.ts.map +1 -1
  45. package/lib/utils/fileSystem.js +151 -0
  46. package/lib/utils/fileSystem.js.map +1 -1
  47. package/lib/utils/icons.d.ts +34 -0
  48. package/lib/utils/icons.d.ts.map +1 -1
  49. package/lib/utils/icons.js +60 -0
  50. package/lib/utils/icons.js.map +1 -1
  51. package/lib/utils/logger.d.ts +11 -2
  52. package/lib/utils/logger.d.ts.map +1 -1
  53. package/lib/utils/logger.js +64 -8
  54. package/lib/utils/logger.js.map +1 -1
  55. package/package.json +2 -1
  56. package/publish-package-docs.js +11 -3
@@ -0,0 +1,139 @@
1
+ "use strict";
2
+ /**
3
+ * SlidevLink Component
4
+ * Embeddable slide preview component for use in MDX documentation
5
+ *
6
+ * Usage:
7
+ * ```mdx
8
+ * import SlidevLink from '@theme/SlidevLink';
9
+ *
10
+ * <SlidevLink link="/slides/module-01-introduction" />
11
+ * ```
12
+ */
13
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ var desc = Object.getOwnPropertyDescriptor(m, k);
16
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
17
+ desc = { enumerable: true, get: function() { return m[k]; } };
18
+ }
19
+ Object.defineProperty(o, k2, desc);
20
+ }) : (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ o[k2] = m[k];
23
+ }));
24
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
25
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
26
+ }) : function(o, v) {
27
+ o["default"] = v;
28
+ });
29
+ var __importStar = (this && this.__importStar) || (function () {
30
+ var ownKeys = function(o) {
31
+ ownKeys = Object.getOwnPropertyNames || function (o) {
32
+ var ar = [];
33
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
34
+ return ar;
35
+ };
36
+ return ownKeys(o);
37
+ };
38
+ return function (mod) {
39
+ if (mod && mod.__esModule) return mod;
40
+ var result = {};
41
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
42
+ __setModuleDefault(result, mod);
43
+ return result;
44
+ };
45
+ })();
46
+ var __importDefault = (this && this.__importDefault) || function (mod) {
47
+ return (mod && mod.__esModule) ? mod : { "default": mod };
48
+ };
49
+ Object.defineProperty(exports, "__esModule", { value: true });
50
+ exports.default = SlidevLink;
51
+ const react_1 = __importStar(require("react"));
52
+ const useGlobalData_1 = require("@docusaurus/useGlobalData");
53
+ const icons_1 = require("../../utils/icons");
54
+ const styles_module_css_1 = __importDefault(require("./styles.module.css"));
55
+ /**
56
+ * Normalize URL path for comparison
57
+ * Handles trailing slashes and leading slashes consistently
58
+ */
59
+ function normalizePath(url) {
60
+ // Remove trailing slash if present
61
+ let normalized = url.endsWith('/') ? url.slice(0, -1) : url;
62
+ // Ensure leading slash
63
+ if (!normalized.startsWith('/')) {
64
+ normalized = '/' + normalized;
65
+ }
66
+ return normalized.toLowerCase();
67
+ }
68
+ /**
69
+ * Find a presentation by URL across all plugin instances
70
+ */
71
+ function findPresentationByUrl(link, pluginId) {
72
+ const normalizedLink = normalizePath(link);
73
+ try {
74
+ // Try specific plugin ID first
75
+ const dataKey = pluginId
76
+ ? `docusaurus-plugin-slidev-${pluginId}`
77
+ : 'docusaurus-plugin-slidev';
78
+ // Try to get plugin data - this may throw if not found
79
+ const data = (0, useGlobalData_1.usePluginData)(dataKey);
80
+ if (data?.presentations) {
81
+ const found = data.presentations.find(p => normalizePath(p.url) === normalizedLink);
82
+ if (found) {
83
+ return { presentation: found, isDev: data.isDev };
84
+ }
85
+ }
86
+ }
87
+ catch {
88
+ // Plugin data not found for specified ID
89
+ }
90
+ // Try default plugin ID if a specific one was requested but not found
91
+ if (pluginId && pluginId !== 'default') {
92
+ try {
93
+ const data = (0, useGlobalData_1.usePluginData)('docusaurus-plugin-slidev');
94
+ if (data?.presentations) {
95
+ const found = data.presentations.find(p => normalizePath(p.url) === normalizedLink);
96
+ if (found) {
97
+ return { presentation: found, isDev: data.isDev };
98
+ }
99
+ }
100
+ }
101
+ catch {
102
+ // Default plugin also not found
103
+ }
104
+ }
105
+ return { presentation: null, isDev: false };
106
+ }
107
+ function SlidevLink({ link, width = '550px', pluginId }) {
108
+ const [isLoading, setIsLoading] = (0, react_1.useState)(true);
109
+ const { presentation, isDev } = findPresentationByUrl(link, pluginId);
110
+ const handleIframeLoad = () => {
111
+ setIsLoading(false);
112
+ };
113
+ // Error state - presentation not found
114
+ if (!presentation) {
115
+ return (react_1.default.createElement("div", { className: styles_module_css_1.default.errorCard, style: { width } },
116
+ react_1.default.createElement("div", { className: styles_module_css_1.default.errorPreview },
117
+ react_1.default.createElement("svg", { className: styles_module_css_1.default.errorIcon, viewBox: "0 0 24 24", fill: "currentColor" },
118
+ react_1.default.createElement("path", { d: "M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z" }))),
119
+ react_1.default.createElement("div", { className: styles_module_css_1.default.errorContent },
120
+ react_1.default.createElement("h4", { className: styles_module_css_1.default.errorTitle }, "Presentation Not Found"),
121
+ react_1.default.createElement("p", { className: styles_module_css_1.default.errorMessage },
122
+ react_1.default.createElement("code", { className: styles_module_css_1.default.errorPath }, link),
123
+ react_1.default.createElement("br", null),
124
+ "is not available"))));
125
+ }
126
+ const cardContent = (react_1.default.createElement(react_1.default.Fragment, null,
127
+ react_1.default.createElement("div", { className: styles_module_css_1.default.preview }, !isDev && presentation.previewUrl ? (react_1.default.createElement(react_1.default.Fragment, null,
128
+ isLoading && (react_1.default.createElement("div", { className: styles_module_css_1.default.previewLoading },
129
+ react_1.default.createElement("div", { className: styles_module_css_1.default.spinner }))),
130
+ 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: 120, height: 67 }))),
131
+ react_1.default.createElement("div", { className: styles_module_css_1.default.content },
132
+ react_1.default.createElement("div", { className: styles_module_css_1.default.header },
133
+ react_1.default.createElement("h4", { className: styles_module_css_1.default.title }, presentation.title),
134
+ isDev && react_1.default.createElement("span", { className: styles_module_css_1.default.badge }, "Build Required")),
135
+ presentation.description && (react_1.default.createElement("p", { className: styles_module_css_1.default.description }, presentation.description)))));
136
+ // Render as clickable card
137
+ return (react_1.default.createElement("a", { href: presentation.url, className: styles_module_css_1.default.card, style: { width }, target: "_blank", rel: "noopener noreferrer" }, cardContent));
138
+ }
139
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/theme/SlidevLink/index.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+FH,6BAiFC;AA9KD,+CAAwC;AACxC,6DAA0D;AAE1D,6CAAqD;AACrD,4EAAyC;AAwBzC;;;GAGG;AACH,SAAS,aAAa,CAAC,GAAW;IAC9B,mCAAmC;IACnC,IAAI,UAAU,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAC5D,uBAAuB;IACvB,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9B,UAAU,GAAG,GAAG,GAAG,UAAU,CAAC;IAClC,CAAC;IACD,OAAO,UAAU,CAAC,WAAW,EAAE,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB,CAC1B,IAAY,EACZ,QAAiB;IAEjB,MAAM,cAAc,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAE3C,IAAI,CAAC;QACD,+BAA+B;QAC/B,MAAM,OAAO,GAAG,QAAQ;YACpB,CAAC,CAAC,4BAA4B,QAAQ,EAAE;YACxC,CAAC,CAAC,0BAA0B,CAAC;QAEjC,uDAAuD;QACvD,MAAM,IAAI,GAAG,IAAA,6BAAa,EAAC,OAAO,CAAkC,CAAC;QAErE,IAAI,IAAI,EAAE,aAAa,EAAE,CAAC;YACtB,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CACtC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,cAAc,CAC1C,CAAC;YACF,IAAI,KAAK,EAAE,CAAC;gBACR,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;YACtD,CAAC;QACL,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACL,yCAAyC;IAC7C,CAAC;IAED,sEAAsE;IACtE,IAAI,QAAQ,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QACrC,IAAI,CAAC;YACD,MAAM,IAAI,GAAG,IAAA,6BAAa,EAAC,0BAA0B,CAAkC,CAAC;YAExF,IAAI,IAAI,EAAE,aAAa,EAAE,CAAC;gBACtB,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CACtC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,cAAc,CAC1C,CAAC;gBACF,IAAI,KAAK,EAAE,CAAC;oBACR,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;gBACtD,CAAC;YACL,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACL,gCAAgC;QACpC,CAAC;IACL,CAAC;IAED,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAChD,CAAC;AAED,SAAwB,UAAU,CAAC,EAC/B,IAAI,EACJ,KAAK,GAAG,OAAO,EACf,QAAQ,EACM;IACd,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,IAAA,gBAAQ,EAAC,IAAI,CAAC,CAAC;IACjD,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,qBAAqB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAEtE,MAAM,gBAAgB,GAAG,GAAG,EAAE;QAC1B,YAAY,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC,CAAC;IAEF,uCAAuC;IACvC,IAAI,CAAC,YAAY,EAAE,CAAC;QAChB,OAAO,CACH,uCAAK,SAAS,EAAE,2BAAM,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE;YAC9C,uCAAK,SAAS,EAAE,2BAAM,CAAC,YAAY;gBAC/B,uCAAK,SAAS,EAAE,2BAAM,CAAC,SAAS,EAAE,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,cAAc;oBACrE,wCAAM,CAAC,EAAC,kGAAkG,GAAG,CAC3G,CACJ;YACN,uCAAK,SAAS,EAAE,2BAAM,CAAC,YAAY;gBAC/B,sCAAI,SAAS,EAAE,2BAAM,CAAC,UAAU,6BAA6B;gBAC7D,qCAAG,SAAS,EAAE,2BAAM,CAAC,YAAY;oBAC7B,wCAAM,SAAS,EAAE,2BAAM,CAAC,SAAS,IAAG,IAAI,CAAQ;oBAChD,yCAAM;uCAEN,CACF,CACJ,CACT,CAAC;IACN,CAAC;IAED,MAAM,WAAW,GAAG,CAChB;QACI,uCAAK,SAAS,EAAE,2BAAM,CAAC,OAAO,IACzB,CAAC,KAAK,IAAI,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,CACjC;YACK,SAAS,IAAI,CACV,uCAAK,SAAS,EAAE,2BAAM,CAAC,cAAc;gBACjC,uCAAK,SAAS,EAAE,2BAAM,CAAC,OAAO,GAAQ,CACpC,CACT;YACD,0CACI,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,GAC1B,CACH,CACN,CAAC,CAAC,CAAC,CACA,8BAAC,wBAAgB,IAAC,SAAS,EAAE,2BAAM,CAAC,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,GAAI,CAC9E,CACC;QAEN,uCAAK,SAAS,EAAE,2BAAM,CAAC,OAAO;YAC1B,uCAAK,SAAS,EAAE,2BAAM,CAAC,MAAM;gBACzB,sCAAI,SAAS,EAAE,2BAAM,CAAC,KAAK,IAAG,YAAY,CAAC,KAAK,CAAM;gBACrD,KAAK,IAAI,wCAAM,SAAS,EAAE,2BAAM,CAAC,KAAK,qBAAuB,CAC5D;YAEL,YAAY,CAAC,WAAW,IAAI,CACzB,qCAAG,SAAS,EAAE,2BAAM,CAAC,WAAW,IAAG,YAAY,CAAC,WAAW,CAAK,CACnE,CACC,CACP,CACN,CAAC;IAEF,2BAA2B;IAC3B,OAAO,CACH,qCACI,IAAI,EAAE,YAAY,CAAC,GAAG,EACtB,SAAS,EAAE,2BAAM,CAAC,IAAI,EACtB,KAAK,EAAE,EAAE,KAAK,EAAE,EAChB,MAAM,EAAC,QAAQ,EACf,GAAG,EAAC,qBAAqB,IAExB,WAAW,CACZ,CACP,CAAC;AACN,CAAC"}
@@ -0,0 +1,228 @@
1
+ /**
2
+ * SlidevLink Component Styles
3
+ * Reuses design patterns from SlidevCard with some adjustments for inline use
4
+ */
5
+
6
+ .card {
7
+ display: inline-flex;
8
+ flex-direction: row;
9
+ gap: 0.75rem;
10
+ padding: 0.75rem;
11
+ border-radius: 8px;
12
+ transition: all 0.2s ease;
13
+ text-decoration: none !important;
14
+ background: var(--ifm-card-background-color);
15
+ box-shadow: 0 2px 8px 0 rgba(0, 0, 0, 0.08);
16
+ border: 1px solid var(--ifm-color-emphasis-200);
17
+ max-width: 100%;
18
+ }
19
+
20
+ .card:hover {
21
+ transform: translateY(-2px);
22
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12);
23
+ text-decoration: none;
24
+ border-color: var(--ifm-color-primary);
25
+ }
26
+
27
+ .preview {
28
+ flex-shrink: 0;
29
+ height: 80px;
30
+ width: 142px;
31
+ display: flex;
32
+ align-items: center;
33
+ justify-content: center;
34
+ background: var(--ifm-color-emphasis-100);
35
+ border-radius: 4px;
36
+ align-self: center;
37
+ overflow: hidden;
38
+ position: relative;
39
+ }
40
+
41
+ .previewLoading {
42
+ position: absolute;
43
+ top: 0;
44
+ left: 0;
45
+ right: 0;
46
+ bottom: 0;
47
+ display: flex;
48
+ align-items: center;
49
+ justify-content: center;
50
+ background: var(--ifm-color-emphasis-100);
51
+ z-index: 1;
52
+ }
53
+
54
+ .spinner {
55
+ width: 20px;
56
+ height: 20px;
57
+ border: 2px solid var(--ifm-color-emphasis-300);
58
+ border-top-color: var(--ifm-color-primary);
59
+ border-radius: 50%;
60
+ animation: spin 0.8s linear infinite;
61
+ }
62
+
63
+ @keyframes spin {
64
+ to {
65
+ transform: rotate(360deg);
66
+ }
67
+ }
68
+
69
+ .previewIframe {
70
+ width: 960px;
71
+ height: 540px;
72
+ border: none;
73
+ position: absolute;
74
+ top: 50%;
75
+ left: 50%;
76
+ transform: translate(-50%, -50%) scale(0.15);
77
+ transform-origin: center center;
78
+ pointer-events: none;
79
+ background: white;
80
+ border-radius: 4px;
81
+ transition: opacity 0.3s ease;
82
+ }
83
+
84
+ .previewIframeLoading {
85
+ opacity: 0;
86
+ }
87
+
88
+ .previewIframeLoaded {
89
+ opacity: 1;
90
+ }
91
+
92
+ .previewIcon {
93
+ color: var(--ifm-color-primary);
94
+ opacity: 0.6;
95
+ }
96
+
97
+ .content {
98
+ flex-grow: 1;
99
+ min-width: 0;
100
+ display: flex;
101
+ flex-direction: column;
102
+ justify-content: center;
103
+ overflow: hidden;
104
+ }
105
+
106
+ .header {
107
+ display: flex;
108
+ align-items: center;
109
+ gap: 0.5rem;
110
+ margin-bottom: 0.25rem;
111
+ }
112
+
113
+ .title {
114
+ margin: 0;
115
+ font-size: 0.95rem;
116
+ font-weight: 600;
117
+ color: var(--ifm-color-primary);
118
+ flex-grow: 1;
119
+ overflow: hidden;
120
+ text-overflow: ellipsis;
121
+ white-space: nowrap;
122
+ }
123
+
124
+ .badge {
125
+ display: inline-flex;
126
+ align-items: center;
127
+ padding: 0.15rem 0.5rem;
128
+ border-radius: 10px;
129
+ font-size: 0.65rem;
130
+ font-weight: 500;
131
+ background: var(--ifm-color-warning-contrast-background);
132
+ color: var(--ifm-color-warning-contrast-foreground);
133
+ white-space: nowrap;
134
+ flex-shrink: 0;
135
+ }
136
+
137
+ .description {
138
+ margin: 0;
139
+ color: var(--ifm-color-emphasis-700);
140
+ font-size: 0.8rem;
141
+ line-height: 1.4;
142
+ display: -webkit-box;
143
+ -webkit-box-orient: vertical;
144
+ -webkit-line-clamp: 2;
145
+ line-clamp: 2;
146
+ overflow: hidden;
147
+ text-overflow: ellipsis;
148
+ }
149
+
150
+ /* Error State Styles */
151
+ .errorCard {
152
+ display: inline-flex;
153
+ flex-direction: row;
154
+ gap: 0.75rem;
155
+ padding: 0.75rem;
156
+ border-radius: 8px;
157
+ background: var(--ifm-color-danger-contrast-background);
158
+ border: 1px solid var(--ifm-color-danger-dark);
159
+ max-width: 100%;
160
+ }
161
+
162
+ .errorPreview {
163
+ flex-shrink: 0;
164
+ height: 80px;
165
+ width: 142px;
166
+ display: flex;
167
+ align-items: center;
168
+ justify-content: center;
169
+ background: rgba(var(--ifm-color-danger-rgb), 0.1);
170
+ border-radius: 4px;
171
+ }
172
+
173
+ .errorIcon {
174
+ width: 40px;
175
+ height: 40px;
176
+ color: var(--ifm-color-danger-dark);
177
+ opacity: 0.8;
178
+ }
179
+
180
+ .errorContent {
181
+ flex-grow: 1;
182
+ min-width: 0;
183
+ display: flex;
184
+ flex-direction: column;
185
+ justify-content: center;
186
+ }
187
+
188
+ .errorTitle {
189
+ margin: 0 0 0.25rem 0;
190
+ font-size: 0.95rem;
191
+ font-weight: 600;
192
+ color: var(--ifm-color-danger-darkest);
193
+ }
194
+
195
+ .errorMessage {
196
+ margin: 0;
197
+ font-size: 0.8rem;
198
+ color: var(--ifm-color-danger-dark);
199
+ line-height: 1.4;
200
+ }
201
+
202
+ .errorPath {
203
+ font-size: 0.75rem;
204
+ background: rgba(var(--ifm-color-danger-rgb), 0.1);
205
+ padding: 0.1rem 0.3rem;
206
+ border-radius: 3px;
207
+ word-break: break-all;
208
+ }
209
+
210
+ /* Responsive adjustments */
211
+ @media (max-width: 480px) {
212
+ .card,
213
+ .errorCard {
214
+ flex-direction: column;
215
+ width: 100% !important;
216
+ }
217
+
218
+ .preview,
219
+ .errorPreview {
220
+ width: 100%;
221
+ height: auto;
222
+ aspect-ratio: 16 / 9;
223
+ }
224
+
225
+ .previewIframe {
226
+ transform: translate(-50%, -50%) scale(calc(100% / 960 * 0.95));
227
+ }
228
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * SlidevListItem Component
3
+ * Displays a single item (presentation or category) in list/details view
4
+ */
5
+ import type { PresentationMetadata, CategoryMetadata } from '../../types';
6
+ interface PresentationListItemProps {
7
+ type: 'presentation';
8
+ presentation: PresentationMetadata;
9
+ isDev: boolean;
10
+ }
11
+ interface CategoryListItemProps {
12
+ type: 'category';
13
+ category: CategoryMetadata;
14
+ }
15
+ type SlidevListItemProps = PresentationListItemProps | CategoryListItemProps;
16
+ export default function SlidevListItem(props: SlidevListItemProps): JSX.Element;
17
+ export {};
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/theme/SlidevListItem/index.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAI1E,UAAU,yBAAyB;IAC/B,IAAI,EAAE,cAAc,CAAC;IACrB,YAAY,EAAE,oBAAoB,CAAC;IACnC,KAAK,EAAE,OAAO,CAAC;CAClB;AAED,UAAU,qBAAqB;IAC3B,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,gBAAgB,CAAC;CAC9B;AAED,KAAK,mBAAmB,GAAG,yBAAyB,GAAG,qBAAqB,CAAC;AAE7E,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,GAAG,CAAC,OAAO,CA8D9E"}
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ /**
3
+ * SlidevListItem Component
4
+ * Displays a single item (presentation or category) in list/details view
5
+ */
6
+ var __importDefault = (this && this.__importDefault) || function (mod) {
7
+ return (mod && mod.__esModule) ? mod : { "default": mod };
8
+ };
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.default = SlidevListItem;
11
+ const react_1 = __importDefault(require("react"));
12
+ const Link_1 = __importDefault(require("@docusaurus/Link"));
13
+ const icons_1 = require("../../utils/icons");
14
+ const styles_module_css_1 = __importDefault(require("./styles.module.css"));
15
+ function SlidevListItem(props) {
16
+ if (props.type === 'category') {
17
+ const { category } = props;
18
+ return (react_1.default.createElement(Link_1.default, { to: category.url, className: `${styles_module_css_1.default.listItem} ${styles_module_css_1.default.categoryItem}` },
19
+ react_1.default.createElement("div", { className: styles_module_css_1.default.titleSection },
20
+ react_1.default.createElement(icons_1.FolderIcon, { className: styles_module_css_1.default.icon, width: 18, height: 18 }),
21
+ react_1.default.createElement("span", { className: styles_module_css_1.default.title }, category.label)),
22
+ react_1.default.createElement("div", { className: styles_module_css_1.default.descriptionSection }, category.description || '—'),
23
+ react_1.default.createElement("div", { className: styles_module_css_1.default.metaSection },
24
+ react_1.default.createElement("span", { className: styles_module_css_1.default.badge },
25
+ category.count,
26
+ " presentation",
27
+ category.count !== 1 ? 's' : ''))));
28
+ }
29
+ const { presentation, isDev } = props;
30
+ const content = (react_1.default.createElement(react_1.default.Fragment, null,
31
+ react_1.default.createElement("div", { className: styles_module_css_1.default.titleSection },
32
+ react_1.default.createElement(icons_1.PresentationIcon, { className: styles_module_css_1.default.icon, width: 18, height: 18 }),
33
+ react_1.default.createElement("span", { className: styles_module_css_1.default.title }, presentation.title),
34
+ isDev && react_1.default.createElement("span", { className: styles_module_css_1.default.devBadge }, "Build Required")),
35
+ react_1.default.createElement("div", { className: styles_module_css_1.default.descriptionSection }, presentation.description || '—'),
36
+ react_1.default.createElement("div", { className: styles_module_css_1.default.metaSection }, presentation.author && (react_1.default.createElement("div", { className: styles_module_css_1.default.author },
37
+ react_1.default.createElement(icons_1.AuthorIcon, { className: styles_module_css_1.default.authorIcon, width: 14, height: 14 }),
38
+ react_1.default.createElement("span", null, presentation.author))))));
39
+ if (isDev) {
40
+ return (react_1.default.createElement("a", { href: presentation.url, className: styles_module_css_1.default.listItem }, content));
41
+ }
42
+ return (react_1.default.createElement("a", { href: presentation.url, className: styles_module_css_1.default.listItem, target: "_blank", rel: "noopener noreferrer" }, content));
43
+ }
44
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/theme/SlidevListItem/index.tsx"],"names":[],"mappings":";AAAA;;;GAGG;;;;;AAqBH,iCA8DC;AAjFD,kDAA0B;AAC1B,4DAAoC;AAEpC,6CAA6E;AAC7E,4EAAyC;AAezC,SAAwB,cAAc,CAAC,KAA0B;IAC7D,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC5B,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;QAC3B,OAAO,CACH,8BAAC,cAAI,IAAC,EAAE,EAAE,QAAQ,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,2BAAM,CAAC,QAAQ,IAAI,2BAAM,CAAC,YAAY,EAAE;YAC1E,uCAAK,SAAS,EAAE,2BAAM,CAAC,YAAY;gBAC/B,8BAAC,kBAAU,IAAC,SAAS,EAAE,2BAAM,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,GAAI;gBAC7D,wCAAM,SAAS,EAAE,2BAAM,CAAC,KAAK,IAAG,QAAQ,CAAC,KAAK,CAAQ,CACpD;YACN,uCAAK,SAAS,EAAE,2BAAM,CAAC,kBAAkB,IACpC,QAAQ,CAAC,WAAW,IAAI,GAAG,CAC1B;YACN,uCAAK,SAAS,EAAE,2BAAM,CAAC,WAAW;gBAC9B,wCAAM,SAAS,EAAE,2BAAM,CAAC,KAAK;oBACxB,QAAQ,CAAC,KAAK;;oBAAe,QAAQ,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAC1D,CACL,CACH,CACV,CAAC;IACN,CAAC;IAED,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;IAEtC,MAAM,OAAO,GAAG,CACZ;QACI,uCAAK,SAAS,EAAE,2BAAM,CAAC,YAAY;YAC/B,8BAAC,wBAAgB,IAAC,SAAS,EAAE,2BAAM,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,GAAI;YACnE,wCAAM,SAAS,EAAE,2BAAM,CAAC,KAAK,IAAG,YAAY,CAAC,KAAK,CAAQ;YACzD,KAAK,IAAI,wCAAM,SAAS,EAAE,2BAAM,CAAC,QAAQ,qBAAuB,CAC/D;QACN,uCAAK,SAAS,EAAE,2BAAM,CAAC,kBAAkB,IACpC,YAAY,CAAC,WAAW,IAAI,GAAG,CAC9B;QACN,uCAAK,SAAS,EAAE,2BAAM,CAAC,WAAW,IAC7B,YAAY,CAAC,MAAM,IAAI,CACpB,uCAAK,SAAS,EAAE,2BAAM,CAAC,MAAM;YACzB,8BAAC,kBAAU,IAAC,SAAS,EAAE,2BAAM,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,GAAI;YACnE,4CAAO,YAAY,CAAC,MAAM,CAAQ,CAChC,CACT,CACC,CACP,CACN,CAAC;IAEF,IAAI,KAAK,EAAE,CAAC;QACR,OAAO,CACH,qCAAG,IAAI,EAAE,YAAY,CAAC,GAAG,EAAE,SAAS,EAAE,2BAAM,CAAC,QAAQ,IAChD,OAAO,CACR,CACP,CAAC;IACN,CAAC;IAED,OAAO,CACH,qCACI,IAAI,EAAE,YAAY,CAAC,GAAG,EACtB,SAAS,EAAE,2BAAM,CAAC,QAAQ,EAC1B,MAAM,EAAC,QAAQ,EACf,GAAG,EAAC,qBAAqB,IAExB,OAAO,CACR,CACP,CAAC;AACN,CAAC"}
@@ -0,0 +1,128 @@
1
+ .listItem {
2
+ display: flex;
3
+ flex-direction: row;
4
+ align-items: center;
5
+ gap: 1rem;
6
+ padding: 0.875rem 1rem;
7
+ border-radius: 8px;
8
+ transition: all 0.2s ease;
9
+ text-decoration: none !important;
10
+ background: var(--ifm-card-background-color);
11
+ border: 1px solid var(--ifm-color-emphasis-200);
12
+ width: 100%;
13
+ }
14
+
15
+ .listItem:hover {
16
+ background: var(--ifm-color-emphasis-100);
17
+ border-color: var(--ifm-color-primary);
18
+ text-decoration: none;
19
+ }
20
+
21
+ .categoryItem {
22
+ border-color: var(--ifm-color-primary-darkest);
23
+ }
24
+
25
+ .titleSection {
26
+ display: flex;
27
+ align-items: center;
28
+ gap: 0.5rem;
29
+ width: 30%;
30
+ min-width: 200px;
31
+ flex-shrink: 0;
32
+ }
33
+
34
+ .icon {
35
+ color: var(--ifm-color-primary);
36
+ flex-shrink: 0;
37
+ }
38
+
39
+ .title {
40
+ font-weight: 600;
41
+ color: var(--ifm-color-primary);
42
+ overflow: hidden;
43
+ text-overflow: ellipsis;
44
+ white-space: nowrap;
45
+ }
46
+
47
+ .devBadge {
48
+ display: inline-flex;
49
+ align-items: center;
50
+ padding: 0.15rem 0.5rem;
51
+ border-radius: 10px;
52
+ font-size: 0.65rem;
53
+ font-weight: 500;
54
+ background: var(--ifm-color-warning-lightest);
55
+ color: black;
56
+ white-space: nowrap;
57
+ flex-shrink: 0;
58
+ }
59
+
60
+ .descriptionSection {
61
+ flex-grow: 1;
62
+ color: var(--ifm-color-emphasis-700);
63
+ font-size: 0.9rem;
64
+ overflow: hidden;
65
+ text-overflow: ellipsis;
66
+ white-space: nowrap;
67
+ text-align: left;
68
+ }
69
+
70
+ .metaSection {
71
+ display: flex;
72
+ align-items: center;
73
+ justify-content: flex-end;
74
+ min-width: 150px;
75
+ flex-shrink: 0;
76
+ }
77
+
78
+ .author {
79
+ display: flex;
80
+ align-items: center;
81
+ gap: 0.25rem;
82
+ color: var(--ifm-color-emphasis-600);
83
+ font-size: 0.85rem;
84
+ }
85
+
86
+ .authorIcon {
87
+ opacity: 0.7;
88
+ }
89
+
90
+ .badge {
91
+ display: inline-flex;
92
+ align-items: center;
93
+ padding: 0.2rem 0.6rem;
94
+ border-radius: 12px;
95
+ font-size: 0.7rem;
96
+ font-weight: 500;
97
+ background: var(--ifm-color-primary-lightest);
98
+ color: var(--ifm-color-primary-contrast-background);
99
+ white-space: nowrap;
100
+ }
101
+
102
+ @media (max-width: 768px) {
103
+ .listItem {
104
+ flex-direction: column;
105
+ align-items: flex-start;
106
+ gap: 0.5rem;
107
+ }
108
+
109
+ .titleSection {
110
+ width: 100%;
111
+ min-width: 0;
112
+ }
113
+
114
+ .descriptionSection {
115
+ width: 100%;
116
+ white-space: normal;
117
+ display: -webkit-box;
118
+ -webkit-box-orient: vertical;
119
+ -webkit-line-clamp: 2;
120
+ line-clamp: 2;
121
+ }
122
+
123
+ .metaSection {
124
+ width: 100%;
125
+ justify-content: flex-start;
126
+ min-width: 0;
127
+ }
128
+ }
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * SlidevOverview Component
3
3
  * Main overview page that displays all Slidev presentations
4
+ * Supports directory grouping and category navigation
4
5
  */
5
6
  export default function SlidevOverview(): JSX.Element;
6
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/theme/SlidevOverview/index.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AA+BH,MAAM,CAAC,OAAO,UAAU,cAAc,IAAI,GAAG,CAAC,OAAO,CAoRpD"}