@cdmbase/wiki-browser 12.0.18-alpha.27 → 12.0.18-alpha.29
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.
- package/lib/components/markdown/CreateMarkdownDialog.d.ts +9 -0
- package/lib/components/markdown/CreateMarkdownDialog.d.ts.map +1 -0
- package/lib/components/markdown/CreateMarkdownDialog.js +222 -0
- package/lib/components/markdown/CreateMarkdownDialog.js.map +1 -0
- package/lib/components/markdown/GitHubSyncStatusDialog.d.ts +10 -0
- package/lib/components/markdown/GitHubSyncStatusDialog.d.ts.map +1 -0
- package/lib/components/markdown/GitHubSyncStatusDialog.js +72 -0
- package/lib/components/markdown/GitHubSyncStatusDialog.js.map +1 -0
- package/lib/components/markdown/MarkdownEditor.d.ts +11 -0
- package/lib/components/markdown/MarkdownEditor.d.ts.map +1 -0
- package/lib/components/markdown/MarkdownEditor.js +127 -0
- package/lib/components/markdown/MarkdownEditor.js.map +1 -0
- package/lib/compute.d.ts.map +1 -1
- package/lib/compute.js +13 -1
- package/lib/compute.js.map +1 -1
- package/lib/config/env-config.d.ts +4 -0
- package/lib/config/env-config.d.ts.map +1 -1
- package/lib/config/env-config.js +21 -1
- package/lib/config/env-config.js.map +1 -1
- package/lib/pages/Markdown/MarkdownPageLayout.d.ts.map +1 -1
- package/lib/pages/Markdown/MarkdownPageLayout.js +79 -15
- package/lib/pages/Markdown/MarkdownPageLayout.js.map +1 -1
- package/lib/pages/Markdown/MarkdownPageWithParams.d.ts.map +1 -1
- package/lib/pages/Markdown/MarkdownPageWithParams.js +310 -15
- package/lib/pages/Markdown/MarkdownPageWithParams.js.map +1 -1
- package/lib/routes/api.markdown.save.d.ts +29 -0
- package/lib/routes/api.markdown.save.d.ts.map +1 -0
- package/lib/routes/api.markdown.save.js +60 -0
- package/lib/routes/api.markdown.save.js.map +1 -0
- package/lib/routes.json +13 -0
- package/lib/templates/content/content-manifest.json +6287 -1113
- package/lib/templates/content/docs/adminide-modules/file-upload/assets/add-link-frontend.png +0 -0
- package/lib/templates/content/docs/adminide-modules/file-upload/assets/add-package-backend.png +0 -0
- package/lib/templates/content/docs/adminide-modules/file-upload/assets/add-to-backend-module.png +0 -0
- package/lib/templates/content/docs/adminide-modules/file-upload/assets/add-upload-client-frontend.png +0 -0
- package/lib/templates/content/docs/adminide-modules/file-upload/assets/modify-upload-false-server.png +0 -0
- package/lib/templates/content/docs/adminide-modules/file-upload/setup.md +535 -276
- package/lib/templates/content/docs/tests/github-sync-test.md +16 -0
- package/lib/utils/docsNavigation.d.ts +3 -2
- package/lib/utils/docsNavigation.d.ts.map +1 -1
- package/lib/utils/docsNavigation.js +121 -7
- package/lib/utils/docsNavigation.js.map +1 -1
- package/lib/utils/githubSync.d.ts +65 -0
- package/lib/utils/githubSync.d.ts.map +1 -0
- package/lib/utils/githubSync.js +206 -0
- package/lib/utils/githubSync.js.map +1 -0
- package/lib/utils/localFileSync.server.d.ts +44 -0
- package/lib/utils/localFileSync.server.d.ts.map +1 -0
- package/lib/utils/localFileSync.server.js +41 -0
- package/lib/utils/localFileSync.server.js.map +1 -0
- package/lib/utils/markdownLoader.d.ts +5 -1
- package/lib/utils/markdownLoader.d.ts.map +1 -1
- package/lib/utils/markdownLoader.js +78 -3
- package/lib/utils/markdownLoader.js.map +1 -1
- package/package.json +3 -3
- package/lib/templates/content/docs/adminide-modules/account/index.md +0 -14
- package/lib/templates/content/docs/adminide-modules/billing/payments/index.md +0 -14
- package/lib/templates/content/docs/adminide-modules/billing/payments/stripe/index.md +0 -14
- package/lib/templates/content/docs/adminide-modules/file-upload/index.md +0 -16
- package/lib/templates/content/docs/adminide-modules/preferences/index.md +0 -28
- package/lib/templates/content/docs/chrome-extension/index.md +0 -14
- package/lib/templates/content/docs/contributing/folder-setup/index.md +0 -30
- package/lib/templates/content/docs/contributing/index.md +0 -60
- package/lib/templates/content/docs/contributing/react/index.md +0 -14
- package/lib/templates/content/docs/contributing/third-party/index.md +0 -18
- package/lib/templates/content/docs/devops/index.md +0 -14
- package/lib/templates/content/docs/error-handler/index.md +0 -16
- package/lib/templates/content/docs/feature-api/feature-browser/index.md +0 -22
- package/lib/templates/content/docs/feature-api/feature-mobile/index.md +0 -18
- package/lib/templates/content/docs/feature-api/feature-server/index.md +0 -40
- package/lib/templates/content/docs/feature-api/index.md +0 -18
- package/lib/templates/content/docs/graphql/index.md +0 -14
- package/lib/templates/content/docs/help/index.md +0 -14
- package/lib/templates/content/docs/mailing/index.md +0 -14
- package/lib/templates/content/docs/mobile/index.md +0 -14
- package/lib/templates/content/docs/organization/index.md +0 -20
- package/lib/templates/content/docs/security/index.md +0 -18
- package/lib/templates/content/docs/server-side/index.md +0 -14
- package/lib/templates/content/docs/tests/index.md +0 -18
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
interface CreateMarkdownDialogProps {
|
|
3
|
+
isOpen: boolean;
|
|
4
|
+
onClose: () => void;
|
|
5
|
+
onCreate: (categoryId: string, slug: string, title: string, content: string, isNewCategory: boolean, categoryTitle?: string) => Promise<void>;
|
|
6
|
+
}
|
|
7
|
+
export declare const CreateMarkdownDialog: React.FC<CreateMarkdownDialogProps>;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=CreateMarkdownDialog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CreateMarkdownDialog.d.ts","sourceRoot":"","sources":["../../../src/components/markdown/CreateMarkdownDialog.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAGnD,UAAU,yBAAyB;IAC/B,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,CACN,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,OAAO,EACtB,aAAa,CAAC,EAAE,MAAM,KACrB,OAAO,CAAC,IAAI,CAAC,CAAC;CACtB;AAED,eAAO,MAAM,oBAAoB,EAAE,KAAK,CAAC,EAAE,CAAC,yBAAyB,CA8PpE,CAAC"}
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
import {jsx,jsxs}from'react/jsx-runtime';import {useState,useEffect}from'react';import {getAllCategoriesMetadataSync}from'../../utils/markdownLoader.js';const CreateMarkdownDialog = ({
|
|
2
|
+
isOpen,
|
|
3
|
+
onClose,
|
|
4
|
+
onCreate
|
|
5
|
+
}) => {
|
|
6
|
+
const [categoryId, setCategoryId] = useState('');
|
|
7
|
+
const [slug, setSlug] = useState('');
|
|
8
|
+
const [title, setTitle] = useState('');
|
|
9
|
+
const [isCreating, setIsCreating] = useState(false);
|
|
10
|
+
const [error, setError] = useState(null);
|
|
11
|
+
const [categories, setCategories] = useState([]);
|
|
12
|
+
const [isNewCategory, setIsNewCategory] = useState(false);
|
|
13
|
+
const [newCategoryName, setNewCategoryName] = useState('');
|
|
14
|
+
const [newCategoryId, setNewCategoryId] = useState('');
|
|
15
|
+
useEffect(() => {
|
|
16
|
+
if (isOpen) {
|
|
17
|
+
const cats = getAllCategoriesMetadataSync();
|
|
18
|
+
setCategories(cats);
|
|
19
|
+
if (cats.length > 0 && !categoryId && !isNewCategory) {
|
|
20
|
+
setCategoryId(cats[0].id);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}, [isOpen]);
|
|
24
|
+
// Generate category ID from category name
|
|
25
|
+
useEffect(() => {
|
|
26
|
+
if (newCategoryName && isNewCategory) {
|
|
27
|
+
const generatedId = newCategoryName.replace(/[^a-zA-Z0-9]+/g, '').replace(/^[0-9]+/, '') ||
|
|
28
|
+
// Remove leading numbers
|
|
29
|
+
newCategoryName.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');
|
|
30
|
+
setNewCategoryId(generatedId);
|
|
31
|
+
}
|
|
32
|
+
}, [newCategoryName, isNewCategory]);
|
|
33
|
+
// Generate slug from title
|
|
34
|
+
useEffect(() => {
|
|
35
|
+
if (title && !slug) {
|
|
36
|
+
const generatedSlug = title.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');
|
|
37
|
+
setSlug(generatedSlug);
|
|
38
|
+
}
|
|
39
|
+
}, [title, slug]);
|
|
40
|
+
const handleCreate = async () => {
|
|
41
|
+
const finalCategoryId = isNewCategory ? newCategoryId : categoryId;
|
|
42
|
+
if (!finalCategoryId || !slug || !title) {
|
|
43
|
+
setError('Please fill in all required fields');
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
if (isNewCategory && !newCategoryName) {
|
|
47
|
+
setError('Please enter a category name');
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
// Validate slug format
|
|
51
|
+
if (!/^[a-z0-9-]+$/.test(slug)) {
|
|
52
|
+
setError('Slug can only contain lowercase letters, numbers, and hyphens');
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
// Validate category ID format (if new category)
|
|
56
|
+
if (isNewCategory && !/^[a-zA-Z0-9-]+$/.test(newCategoryId)) {
|
|
57
|
+
setError('Category ID can only contain letters, numbers, and hyphens');
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
// Check if category ID already exists
|
|
61
|
+
if (isNewCategory && categories.some(cat => cat.id === newCategoryId)) {
|
|
62
|
+
setError('A category with this ID already exists');
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
setIsCreating(true);
|
|
66
|
+
setError(null);
|
|
67
|
+
try {
|
|
68
|
+
// Create default markdown content with frontmatter
|
|
69
|
+
const content = `---
|
|
70
|
+
meta:
|
|
71
|
+
title: ${title}
|
|
72
|
+
description: ${title}
|
|
73
|
+
date: '${new Date().toISOString().split('T')[0]}T00:00:00'
|
|
74
|
+
updated: '${new Date().toISOString().split('T')[0]}T00:00:00'
|
|
75
|
+
excerpt: ${title} ...
|
|
76
|
+
headers:
|
|
77
|
+
Cache-Control: no-cache
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
# ${title}
|
|
81
|
+
|
|
82
|
+
Start writing your content here...
|
|
83
|
+
|
|
84
|
+
`;
|
|
85
|
+
await onCreate(finalCategoryId, slug, title, content, isNewCategory, isNewCategory ? newCategoryName : undefined);
|
|
86
|
+
// Reset form
|
|
87
|
+
setIsNewCategory(false);
|
|
88
|
+
setNewCategoryName('');
|
|
89
|
+
setNewCategoryId('');
|
|
90
|
+
setCategoryId(categories.length > 0 ? categories[0].id : '');
|
|
91
|
+
setSlug('');
|
|
92
|
+
setTitle('');
|
|
93
|
+
onClose();
|
|
94
|
+
} catch (err) {
|
|
95
|
+
setError(err.message || 'Failed to create page');
|
|
96
|
+
} finally {
|
|
97
|
+
setIsCreating(false);
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
if (!isOpen) return null;
|
|
101
|
+
return jsx("div", {
|
|
102
|
+
className: "fixed inset-0 z-50 flex items-center justify-center bg-black/50",
|
|
103
|
+
onClick: onClose,
|
|
104
|
+
children: jsxs("div", {
|
|
105
|
+
className: "bg-background border border-gray-200 dark:border-gray-800 rounded-lg shadow-xl w-full max-w-md p-6",
|
|
106
|
+
onClick: e => e.stopPropagation(),
|
|
107
|
+
children: [jsx("h2", {
|
|
108
|
+
className: "text-xl font-semibold mb-4",
|
|
109
|
+
children: "Create New Markdown Page"
|
|
110
|
+
}), jsxs("div", {
|
|
111
|
+
className: "space-y-4",
|
|
112
|
+
children: [jsxs("div", {
|
|
113
|
+
children: [jsxs("div", {
|
|
114
|
+
className: "flex items-center justify-between mb-2",
|
|
115
|
+
children: [jsxs("label", {
|
|
116
|
+
className: "block text-sm font-medium",
|
|
117
|
+
children: ["Category ", jsx("span", {
|
|
118
|
+
className: "text-red-500",
|
|
119
|
+
children: "*"
|
|
120
|
+
})]
|
|
121
|
+
}), jsx("button", {
|
|
122
|
+
type: "button",
|
|
123
|
+
onClick: () => {
|
|
124
|
+
setIsNewCategory(!isNewCategory);
|
|
125
|
+
if (!isNewCategory) {
|
|
126
|
+
setCategoryId('');
|
|
127
|
+
setNewCategoryName('');
|
|
128
|
+
setNewCategoryId('');
|
|
129
|
+
} else {
|
|
130
|
+
setNewCategoryName('');
|
|
131
|
+
}
|
|
132
|
+
},
|
|
133
|
+
className: "text-xs text-primary hover:underline",
|
|
134
|
+
children: isNewCategory ? 'Select existing' : '+ Create new category'
|
|
135
|
+
})]
|
|
136
|
+
}), isNewCategory ? jsxs("div", {
|
|
137
|
+
className: "space-y-2",
|
|
138
|
+
children: [jsx("input", {
|
|
139
|
+
type: "text",
|
|
140
|
+
value: newCategoryName,
|
|
141
|
+
onChange: e => setNewCategoryName(e.target.value),
|
|
142
|
+
placeholder: "My New Category",
|
|
143
|
+
className: "w-full px-3 py-2 border border-gray-300 dark:border-gray-700 rounded-md bg-background text-foreground focus:outline-none focus:ring-2 focus:ring-primary"
|
|
144
|
+
}), jsxs("div", {
|
|
145
|
+
children: [jsx("input", {
|
|
146
|
+
type: "text",
|
|
147
|
+
value: newCategoryId,
|
|
148
|
+
onChange: e => setNewCategoryId(e.target.value),
|
|
149
|
+
placeholder: "my-new-category",
|
|
150
|
+
className: "w-full px-3 py-2 border border-gray-300 dark:border-gray-700 rounded-md bg-background text-foreground focus:outline-none focus:ring-2 focus:ring-primary font-mono text-sm"
|
|
151
|
+
}), jsx("p", {
|
|
152
|
+
className: "mt-1 text-xs text-gray-500 dark:text-gray-400",
|
|
153
|
+
children: "Category ID (auto-generated from name)"
|
|
154
|
+
})]
|
|
155
|
+
})]
|
|
156
|
+
}) : jsxs("select", {
|
|
157
|
+
value: categoryId,
|
|
158
|
+
onChange: e => setCategoryId(e.target.value),
|
|
159
|
+
className: "w-full px-3 py-2 border border-gray-300 dark:border-gray-700 rounded-md bg-background text-foreground focus:outline-none focus:ring-2 focus:ring-primary",
|
|
160
|
+
children: [jsx("option", {
|
|
161
|
+
value: "",
|
|
162
|
+
children: "Select a category"
|
|
163
|
+
}), categories.map(cat => jsx("option", {
|
|
164
|
+
value: cat.id,
|
|
165
|
+
children: cat.title
|
|
166
|
+
}, cat.id))]
|
|
167
|
+
})]
|
|
168
|
+
}), jsxs("div", {
|
|
169
|
+
children: [jsxs("label", {
|
|
170
|
+
className: "block text-sm font-medium mb-1",
|
|
171
|
+
children: ["Title ", jsx("span", {
|
|
172
|
+
className: "text-red-500",
|
|
173
|
+
children: "*"
|
|
174
|
+
})]
|
|
175
|
+
}), jsx("input", {
|
|
176
|
+
type: "text",
|
|
177
|
+
value: title,
|
|
178
|
+
onChange: e => setTitle(e.target.value),
|
|
179
|
+
placeholder: "My New Page",
|
|
180
|
+
className: "w-full px-3 py-2 border border-gray-300 dark:border-gray-700 rounded-md bg-background text-foreground focus:outline-none focus:ring-2 focus:ring-primary"
|
|
181
|
+
})]
|
|
182
|
+
}), jsxs("div", {
|
|
183
|
+
children: [jsxs("label", {
|
|
184
|
+
className: "block text-sm font-medium mb-1",
|
|
185
|
+
children: ["Slug ", jsx("span", {
|
|
186
|
+
className: "text-red-500",
|
|
187
|
+
children: "*"
|
|
188
|
+
})]
|
|
189
|
+
}), jsx("input", {
|
|
190
|
+
type: "text",
|
|
191
|
+
value: slug,
|
|
192
|
+
onChange: e => setSlug(e.target.value),
|
|
193
|
+
placeholder: "my-new-page",
|
|
194
|
+
className: "w-full px-3 py-2 border border-gray-300 dark:border-gray-700 rounded-md bg-background text-foreground focus:outline-none focus:ring-2 focus:ring-primary font-mono text-sm"
|
|
195
|
+
}), jsx("p", {
|
|
196
|
+
className: "mt-1 text-xs text-gray-500 dark:text-gray-400",
|
|
197
|
+
children: "URL-friendly identifier (auto-generated from title)"
|
|
198
|
+
})]
|
|
199
|
+
}), error && jsx("div", {
|
|
200
|
+
className: "p-3 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-md",
|
|
201
|
+
children: jsx("p", {
|
|
202
|
+
className: "text-sm text-red-600 dark:text-red-400",
|
|
203
|
+
children: error
|
|
204
|
+
})
|
|
205
|
+
})]
|
|
206
|
+
}), jsxs("div", {
|
|
207
|
+
className: "flex justify-end gap-2 mt-6",
|
|
208
|
+
children: [jsx("button", {
|
|
209
|
+
onClick: onClose,
|
|
210
|
+
disabled: isCreating,
|
|
211
|
+
className: "px-4 py-2 text-sm rounded-md bg-gray-100 dark:bg-gray-800 text-gray-700 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700 disabled:opacity-50",
|
|
212
|
+
children: "Cancel"
|
|
213
|
+
}), jsx("button", {
|
|
214
|
+
onClick: handleCreate,
|
|
215
|
+
disabled: isCreating || !isNewCategory && !categoryId || isNewCategory && !newCategoryId || !slug || !title,
|
|
216
|
+
className: "px-4 py-2 text-sm rounded-md bg-primary text-primary-foreground hover:bg-primary/90 disabled:opacity-50 disabled:cursor-not-allowed",
|
|
217
|
+
children: isCreating ? 'Creating...' : 'Create'
|
|
218
|
+
})]
|
|
219
|
+
})]
|
|
220
|
+
})
|
|
221
|
+
});
|
|
222
|
+
};export{CreateMarkdownDialog};//# sourceMappingURL=CreateMarkdownDialog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CreateMarkdownDialog.js","sources":["../../../src/components/markdown/CreateMarkdownDialog.tsx"],"sourcesContent":[null],"names":["_jsx","_jsxs"],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
interface GitHubSyncStatusDialogProps {
|
|
3
|
+
isOpen: boolean;
|
|
4
|
+
onClose: () => void;
|
|
5
|
+
status: 'success' | 'error' | null;
|
|
6
|
+
message: string;
|
|
7
|
+
}
|
|
8
|
+
export declare const GitHubSyncStatusDialog: React.FC<GitHubSyncStatusDialogProps>;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=GitHubSyncStatusDialog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GitHubSyncStatusDialog.d.ts","sourceRoot":"","sources":["../../../src/components/markdown/GitHubSyncStatusDialog.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,UAAU,2BAA2B;IACjC,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,EAAE,SAAS,GAAG,OAAO,GAAG,IAAI,CAAC;IACnC,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,sBAAsB,EAAE,KAAK,CAAC,EAAE,CAAC,2BAA2B,CA+ExE,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import {jsx,jsxs}from'react/jsx-runtime';const GitHubSyncStatusDialog = ({
|
|
2
|
+
isOpen,
|
|
3
|
+
onClose,
|
|
4
|
+
status,
|
|
5
|
+
message
|
|
6
|
+
}) => {
|
|
7
|
+
if (!isOpen) return null;
|
|
8
|
+
const isSuccess = status === 'success';
|
|
9
|
+
const isError = status === 'error';
|
|
10
|
+
return jsx("div", {
|
|
11
|
+
className: "fixed inset-0 z-50 flex items-center justify-center bg-black/50",
|
|
12
|
+
onClick: onClose,
|
|
13
|
+
children: jsxs("div", {
|
|
14
|
+
className: "bg-background border border-gray-200 dark:border-gray-800 rounded-lg shadow-xl w-full max-w-md p-6",
|
|
15
|
+
onClick: e => e.stopPropagation(),
|
|
16
|
+
children: [jsxs("div", {
|
|
17
|
+
className: "flex items-start gap-4",
|
|
18
|
+
children: [isSuccess && jsx("div", {
|
|
19
|
+
className: "flex-shrink-0",
|
|
20
|
+
children: jsx("div", {
|
|
21
|
+
className: "w-10 h-10 rounded-full bg-green-100 dark:bg-green-900/20 flex items-center justify-center",
|
|
22
|
+
children: jsx("svg", {
|
|
23
|
+
className: "w-6 h-6 text-green-600 dark:text-green-400",
|
|
24
|
+
fill: "none",
|
|
25
|
+
stroke: "currentColor",
|
|
26
|
+
viewBox: "0 0 24 24",
|
|
27
|
+
children: jsx("path", {
|
|
28
|
+
strokeLinecap: "round",
|
|
29
|
+
strokeLinejoin: "round",
|
|
30
|
+
strokeWidth: 2,
|
|
31
|
+
d: "M5 13l4 4L19 7"
|
|
32
|
+
})
|
|
33
|
+
})
|
|
34
|
+
})
|
|
35
|
+
}), isError && jsx("div", {
|
|
36
|
+
className: "flex-shrink-0",
|
|
37
|
+
children: jsx("div", {
|
|
38
|
+
className: "w-10 h-10 rounded-full bg-red-100 dark:bg-red-900/20 flex items-center justify-center",
|
|
39
|
+
children: jsx("svg", {
|
|
40
|
+
className: "w-6 h-6 text-red-600 dark:text-red-400",
|
|
41
|
+
fill: "none",
|
|
42
|
+
stroke: "currentColor",
|
|
43
|
+
viewBox: "0 0 24 24",
|
|
44
|
+
children: jsx("path", {
|
|
45
|
+
strokeLinecap: "round",
|
|
46
|
+
strokeLinejoin: "round",
|
|
47
|
+
strokeWidth: 2,
|
|
48
|
+
d: "M6 18L18 6M6 6l12 12"
|
|
49
|
+
})
|
|
50
|
+
})
|
|
51
|
+
})
|
|
52
|
+
}), jsxs("div", {
|
|
53
|
+
className: "flex-1",
|
|
54
|
+
children: [jsx("h3", {
|
|
55
|
+
className: "text-lg font-semibold mb-2",
|
|
56
|
+
children: isSuccess ? 'Sync Successful' : isError ? 'Sync Failed' : 'Syncing...'
|
|
57
|
+
}), jsx("p", {
|
|
58
|
+
className: `text-sm ${isSuccess ? 'text-green-600 dark:text-green-400' : isError ? 'text-red-600 dark:text-red-400' : 'text-gray-600 dark:text-gray-400'}`,
|
|
59
|
+
children: message
|
|
60
|
+
})]
|
|
61
|
+
})]
|
|
62
|
+
}), jsx("div", {
|
|
63
|
+
className: "flex justify-end mt-6",
|
|
64
|
+
children: jsx("button", {
|
|
65
|
+
onClick: onClose,
|
|
66
|
+
className: "px-4 py-2 text-sm rounded-md bg-primary text-primary-foreground hover:bg-primary/90",
|
|
67
|
+
children: "OK"
|
|
68
|
+
})
|
|
69
|
+
})]
|
|
70
|
+
})
|
|
71
|
+
});
|
|
72
|
+
};export{GitHubSyncStatusDialog};//# sourceMappingURL=GitHubSyncStatusDialog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GitHubSyncStatusDialog.js","sources":["../../../src/components/markdown/GitHubSyncStatusDialog.tsx"],"sourcesContent":[null],"names":[],"mappings":"yCASO,MAAM,sBAAsB,GAA0C,CAAC;AAC1E,EAAA,MAAI;AAAS,EAAA,OAAA;AAEb,EAAA,MAAA;AACA,EAAA;AAEA,CAAA,KAAA;AAoDgC,EAAA,IAAA,CAAA,MAAA,EAAA,OAAA,IAAA;AACA,EAAA,MAAA,SAAA,GAAA,MAAA,KAAA,SAAA;AACE,EAAA,MAAA,OAAA,GAAA,MAAA,KAAA,OAAA;;AAmBtC,IAAE,SAAA,EAAA,iEAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
interface MarkdownEditorProps {
|
|
3
|
+
initialContent: string;
|
|
4
|
+
onSave?: (content: string) => Promise<void>;
|
|
5
|
+
onCancel?: () => void;
|
|
6
|
+
filePath?: string;
|
|
7
|
+
className?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare const MarkdownEditor: React.FC<MarkdownEditorProps>;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=MarkdownEditor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MarkdownEditor.d.ts","sourceRoot":"","sources":["../../../src/components/markdown/MarkdownEditor.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAI3D,UAAU,mBAAmB;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAoLxD,CAAC"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import {jsxs,jsx}from'react/jsx-runtime';import {useState,useRef,useEffect}from'react';import {marked}from'marked';import {cn}from'../../utils/index.js';const MarkdownEditor = ({
|
|
2
|
+
initialContent,
|
|
3
|
+
onSave,
|
|
4
|
+
onCancel,
|
|
5
|
+
filePath,
|
|
6
|
+
className
|
|
7
|
+
}) => {
|
|
8
|
+
const [content, setContent] = useState(initialContent);
|
|
9
|
+
const [preview, setPreview] = useState('');
|
|
10
|
+
const [isSaving, setIsSaving] = useState(false);
|
|
11
|
+
const [error, setError] = useState(null);
|
|
12
|
+
const [viewMode, setViewMode] = useState('split');
|
|
13
|
+
const textareaRef = useRef(null);
|
|
14
|
+
const previewRef = useRef(null);
|
|
15
|
+
// Update preview when content changes
|
|
16
|
+
useEffect(() => {
|
|
17
|
+
const updatePreview = async () => {
|
|
18
|
+
try {
|
|
19
|
+
const html = await marked.parse(content);
|
|
20
|
+
setPreview(html);
|
|
21
|
+
} catch (err) {
|
|
22
|
+
console.error('Error parsing markdown:', err);
|
|
23
|
+
setError('Failed to parse markdown');
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
const timeoutId = setTimeout(updatePreview, 300); // Debounce
|
|
27
|
+
return () => clearTimeout(timeoutId);
|
|
28
|
+
}, [content]);
|
|
29
|
+
// Sync scroll between editor and preview
|
|
30
|
+
const handleScroll = e => {
|
|
31
|
+
if (viewMode === 'split' && previewRef.current) {
|
|
32
|
+
const scrollPercentage = e.currentTarget.scrollTop / (e.currentTarget.scrollHeight - e.currentTarget.clientHeight);
|
|
33
|
+
const previewScroll = scrollPercentage * (previewRef.current.scrollHeight - previewRef.current.clientHeight);
|
|
34
|
+
previewRef.current.scrollTop = previewScroll;
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
const handleSave = async () => {
|
|
38
|
+
if (!onSave) return;
|
|
39
|
+
setIsSaving(true);
|
|
40
|
+
setError(null);
|
|
41
|
+
try {
|
|
42
|
+
await onSave(content);
|
|
43
|
+
} catch (err) {
|
|
44
|
+
setError(err.message || 'Failed to save content');
|
|
45
|
+
} finally {
|
|
46
|
+
setIsSaving(false);
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
const handleCancel = () => {
|
|
50
|
+
setContent(initialContent);
|
|
51
|
+
setError(null);
|
|
52
|
+
if (onCancel) {
|
|
53
|
+
onCancel();
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
const hasChanges = content !== initialContent;
|
|
57
|
+
return jsxs("div", {
|
|
58
|
+
className: cn('flex flex-col h-full', className),
|
|
59
|
+
children: [jsxs("div", {
|
|
60
|
+
className: "flex items-center justify-between p-4 border-b border-gray-200 dark:border-gray-800 bg-background",
|
|
61
|
+
children: [jsxs("div", {
|
|
62
|
+
className: "flex items-center gap-2",
|
|
63
|
+
children: [jsx("button", {
|
|
64
|
+
onClick: () => setViewMode('edit'),
|
|
65
|
+
className: cn('px-3 py-1.5 text-sm rounded-md transition-colors', viewMode === 'edit' ? 'bg-primary text-primary-foreground' : 'bg-gray-100 dark:bg-gray-800 text-gray-700 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700'),
|
|
66
|
+
children: "Edit"
|
|
67
|
+
}), jsx("button", {
|
|
68
|
+
onClick: () => setViewMode('preview'),
|
|
69
|
+
className: cn('px-3 py-1.5 text-sm rounded-md transition-colors', viewMode === 'preview' ? 'bg-primary text-primary-foreground' : 'bg-gray-100 dark:bg-gray-800 text-gray-700 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700'),
|
|
70
|
+
children: "Preview"
|
|
71
|
+
}), jsx("button", {
|
|
72
|
+
onClick: () => setViewMode('split'),
|
|
73
|
+
className: cn('px-3 py-1.5 text-sm rounded-md transition-colors', viewMode === 'split' ? 'bg-primary text-primary-foreground' : 'bg-gray-100 dark:bg-gray-800 text-gray-700 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700'),
|
|
74
|
+
children: "Split"
|
|
75
|
+
})]
|
|
76
|
+
}), jsxs("div", {
|
|
77
|
+
className: "flex items-center gap-2",
|
|
78
|
+
children: [filePath && jsx("span", {
|
|
79
|
+
className: "text-sm text-gray-500 dark:text-gray-400 px-2",
|
|
80
|
+
children: filePath
|
|
81
|
+
}), hasChanges && jsx("span", {
|
|
82
|
+
className: "text-sm text-yellow-600 dark:text-yellow-400 px-2",
|
|
83
|
+
children: "Unsaved changes"
|
|
84
|
+
}), onCancel && jsx("button", {
|
|
85
|
+
onClick: handleCancel,
|
|
86
|
+
disabled: isSaving,
|
|
87
|
+
className: "px-4 py-1.5 text-sm rounded-md bg-gray-100 dark:bg-gray-800 text-gray-700 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700 disabled:opacity-50",
|
|
88
|
+
children: "Cancel"
|
|
89
|
+
}), onSave && jsx("button", {
|
|
90
|
+
onClick: handleSave,
|
|
91
|
+
disabled: isSaving || !hasChanges,
|
|
92
|
+
className: "px-4 py-1.5 text-sm rounded-md bg-primary text-primary-foreground hover:bg-primary/90 disabled:opacity-50 disabled:cursor-not-allowed",
|
|
93
|
+
children: isSaving ? 'Saving...' : 'Save'
|
|
94
|
+
})]
|
|
95
|
+
})]
|
|
96
|
+
}), error && jsx("div", {
|
|
97
|
+
className: "p-3 bg-red-50 dark:bg-red-900/20 border-b border-red-200 dark:border-red-800",
|
|
98
|
+
children: jsx("p", {
|
|
99
|
+
className: "text-sm text-red-600 dark:text-red-400",
|
|
100
|
+
children: error
|
|
101
|
+
})
|
|
102
|
+
}), jsxs("div", {
|
|
103
|
+
className: "flex-1 flex overflow-hidden",
|
|
104
|
+
children: [(viewMode === 'edit' || viewMode === 'split') && jsx("div", {
|
|
105
|
+
className: cn('flex flex-col border-r border-gray-200 dark:border-gray-800', viewMode === 'split' ? 'w-1/2' : 'w-full'),
|
|
106
|
+
children: jsx("textarea", {
|
|
107
|
+
ref: textareaRef,
|
|
108
|
+
value: content,
|
|
109
|
+
onChange: e => setContent(e.target.value),
|
|
110
|
+
onScroll: handleScroll,
|
|
111
|
+
className: "flex-1 w-full p-4 font-mono text-sm bg-background text-foreground border-0 resize-none focus:outline-none",
|
|
112
|
+
placeholder: "Start writing your markdown here...",
|
|
113
|
+
spellCheck: false
|
|
114
|
+
})
|
|
115
|
+
}), (viewMode === 'preview' || viewMode === 'split') && jsx("div", {
|
|
116
|
+
ref: previewRef,
|
|
117
|
+
className: cn('flex-1 overflow-y-auto p-4 bg-background', viewMode === 'split' ? 'w-1/2' : 'w-full'),
|
|
118
|
+
children: jsx("div", {
|
|
119
|
+
className: "prose dark:prose-invert max-w-none",
|
|
120
|
+
dangerouslySetInnerHTML: {
|
|
121
|
+
__html: preview
|
|
122
|
+
}
|
|
123
|
+
})
|
|
124
|
+
})]
|
|
125
|
+
})]
|
|
126
|
+
});
|
|
127
|
+
};export{MarkdownEditor};//# sourceMappingURL=MarkdownEditor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MarkdownEditor.js","sources":["../../../src/components/markdown/MarkdownEditor.tsx"],"sourcesContent":[null],"names":[],"mappings":"yJAYa,MAAA,cAAc,GAAkC,CAAC;gBAO5C;QACR;UACA;UACA;;AAEN,CAAA,KAAA;AACA,EAAA,MAAA,CAAA,mBAAmB,CAAM,GAAiB,QAAM,CAAA,cAAA,CAAA;QAEV,CAAA,OAAA,EAAA,UAAA,CAAA,GAAA,QAAA,CAAA,EAAA,CAAA;QAC7B,CAAA,QAAI,EAAE,WAAA,CAAA,GAAA,QAAA,CAAA,KAAA,CAAA;AACX,EAAA,MAAA,CAAA,KAAM,EAAa,QAAA,CAAA,GAAA,QAAQ,CAAA,IAAM,CAAA;AAC7B,EAAA,MAAA,CAAA,QAAK,EAAA,WAAA,CAAA,GAAA,QAAA,CAAA,OAAA,CAAA;mBACK,GAAA,OAAO,IAAM,CAAA;kBACT,GAAA,MAAC,CAAI,IAAC,CAAC;;YACnB,MAAO;AACL,IAAA,MAAA,aAAO,GAAM;;cAEhB,IAAA,GAAA,MAAA,MAAA,CAAA,KAAA,CAAA,OAAA,CAAA;AACL,QAAA,UAAE,CAAA,IAAA,CAAA;QAEF,OAAM,GAAA,EAAA;AACN,QAAA,OAAO,MAAM,0BAAwB,EAAA,GAAA,CAAA;AACzC,QAAI,QAAQ,CAAC,0BAAC,CAAA;;AAGd,KAAA;UACQ,SAAA,aAAoB,CAAA,aAAc,EAAC,GAAA,CAAA,CAAA;iBAC7B,YAAA,CAAA,SACA;AACN,GAAA,EAAA,CAAA,OAAA,CAAA,CAAA;AAEA;QACJ,YAAC,GAAA,CAAA,IAAA;AACL,IAAA,IAAE,QAAA,KAAA,OAAA,IAAA,UAAA,CAAA,OAAA,EAAA;AAEF,MAAA,MAAgB,gBAAQ,GAAA,CAAI,CAAE,aAAA,CAAA,SAAA,IAAA,CAAA,CAAA,aAAA,CAAA,YAAA,GAAA,CAAA,CAAA,aAAA,CAAA,YAAA,CAAA;AAC1B,MAAA,MAAI,aAAO,GAAA,gBAAA,IAAA,UAAA,CAAA,OAAA,CAAA,YAAA,GAAA,UAAA,CAAA,OAAA,CAAA,YAAA,CAAA;gBAAS,CAAA,OAAA,CAAA,SAAA,GAAA,aAAA;;;AAKpB,EAAA,MAAA,UAAK,GAAA,YAAA;AACD,IAAA,IAAA,CAAA,MAAA,EAAA;eACH,CAAA,IAAA,CAAA;YAAQ,CAAA,IAAA,CAAQ;AACb,IAAA,IAAA;YACH,MAAA,CAAA,OAAA,CAAA;gBAAS,EAAC;cACI,CAAA,GAAA,CAAA,OAAM,IAAC,wBAAC,CAAA;cACtB;AACL,MAAE,WAAA,CAAA,KAAA,CAAA;;;QAIE,YAAa,GAAE,MAAA;cACX,CAAA,cAAW,CAAA;AACX,IAAA,QAAA,CAAA,IAAA,CAAA;QACJ,QAAC,EAAA;AACL,MAAE,QAAA,EAAA;AAEF;AAEA,GAAA;AAU4B,EAAA,MAAA,UAAA,GAAA,OAAA,KAAA,cAAsC;;AAWtC,IAAA,SAAA,EAAA,EAAA,CAAA,sBAAsC,EAAA,SAAA,CAAA;;AAWtC,MAAA,SAAA,EAAA,mGAAsC;;AAiFtE,QAAE,SAAA,EAAA,yBAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/lib/compute.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compute.d.ts","sourceRoot":"","sources":["../src/compute.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"compute.d.ts","sourceRoot":"","sources":["../src/compute.ts"],"names":[],"mappings":"AA+IA,QAAA,MAAM,cAAc,0CAAkC,CAAC;AACvD,QAAA,MAAM,aAAa,0CAAiC,CAAC;AAErD,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC"}
|
package/lib/compute.js
CHANGED
|
@@ -8,7 +8,8 @@ const browseWikikRoutes = {
|
|
|
8
8
|
HELP_ARTICLE: '/help/:categoryId/:articleSlug',
|
|
9
9
|
HELP_CENTER: '/help',
|
|
10
10
|
VERIFY_USER: '/verify-user',
|
|
11
|
-
ADMIN_APPROVAL: '/admin-approval'
|
|
11
|
+
ADMIN_APPROVAL: '/admin-approval',
|
|
12
|
+
SAVE_MARKDOWN: '/api/markdown/save'
|
|
12
13
|
};
|
|
13
14
|
// Generate routes dynamically from categoryMetadata
|
|
14
15
|
const generateRoutesFromCategories = categories => {
|
|
@@ -119,6 +120,17 @@ const wikiDocsPage = [{
|
|
|
119
120
|
hideInMenu: true,
|
|
120
121
|
componentPath: "@cdmbase/wiki-browser/lib/pages/Help/HelpPage.js",
|
|
121
122
|
hasComponent: true
|
|
123
|
+
}, {
|
|
124
|
+
key: 'docs.save.markdown',
|
|
125
|
+
path: `${config.LAYOUT_ROOT}${browseWikikRoutes.SAVE_MARKDOWN}`,
|
|
126
|
+
auth: false,
|
|
127
|
+
exact: true,
|
|
128
|
+
hasAction: true,
|
|
129
|
+
position: IMenuPosition.Lower,
|
|
130
|
+
hideInMenu: true,
|
|
131
|
+
isResourceRoute: true,
|
|
132
|
+
componentPath: "@cdmbase/wiki-browser/lib/routes/api.markdown.save.js",
|
|
133
|
+
hasAction: true
|
|
122
134
|
}
|
|
123
135
|
// Dynamically generated routes from categoryMetadata
|
|
124
136
|
// Article routes are generated first (more specific), then category routes (less specific)
|
package/lib/compute.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compute.js","sources":["../src/compute.ts"],"sourcesContent":[null],"names":[],"mappings":"wQAOA,MAAM,iBAAiB,GAAG;AACtB,EAAA,YAAA,EAAY,GAAK;AACjB,EAAA,aAAA,EAAa,mBAAqB;AAClC,EAAA,YAAA,EAAY,gCAAkC;AAC9C,EAAA,WAAA,EAAW,OAAS;AACpB,EAAA,WAAA,EAAW,cAAgB;AAC3B,EAAA,cAAA,EAAc;
|
|
1
|
+
{"version":3,"file":"compute.js","sources":["../src/compute.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -2,5 +2,9 @@ export declare const config: Readonly<{
|
|
|
2
2
|
LAYOUT_ROOT: string;
|
|
3
3
|
ALLOWED_EMAILS: string[];
|
|
4
4
|
ADMIN_CONTACT_EMAIL: string;
|
|
5
|
+
GITHUB_OWNER: string;
|
|
6
|
+
GITHUB_REPO: string;
|
|
7
|
+
GITHUB_BRANCH: string;
|
|
8
|
+
GITHUB_TOKEN: string;
|
|
5
9
|
} & import("envalid").CleanedEnvAccessors>;
|
|
6
10
|
//# sourceMappingURL=env-config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env-config.d.ts","sourceRoot":"","sources":["../../src/config/env-config.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,MAAM
|
|
1
|
+
{"version":3,"file":"env-config.d.ts","sourceRoot":"","sources":["../../src/config/env-config.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,MAAM;;;;;;;;0CAgCjB,CAAC"}
|
package/lib/config/env-config.js
CHANGED
|
@@ -11,7 +11,27 @@ const config = cleanEnv(env, {
|
|
|
11
11
|
}),
|
|
12
12
|
// Admin contact email for approval requests
|
|
13
13
|
ADMIN_CONTACT_EMAIL: str({
|
|
14
|
-
default: '
|
|
14
|
+
default: '',
|
|
15
15
|
desc: 'Admin email address for approval requests'
|
|
16
|
+
}),
|
|
17
|
+
// GitHub repository owner (username or organization)
|
|
18
|
+
GITHUB_OWNER: str({
|
|
19
|
+
default: '',
|
|
20
|
+
desc: 'GitHub repository owner (username or organization name)'
|
|
21
|
+
}),
|
|
22
|
+
// GitHub repository name
|
|
23
|
+
GITHUB_REPO: str({
|
|
24
|
+
default: '',
|
|
25
|
+
desc: 'GitHub repository name for markdown file syncing'
|
|
26
|
+
}),
|
|
27
|
+
// GitHub branch name
|
|
28
|
+
GITHUB_BRANCH: str({
|
|
29
|
+
default: '',
|
|
30
|
+
desc: 'GitHub branch name for markdown file syncing (defaults to "develop")'
|
|
31
|
+
}),
|
|
32
|
+
// GitHub Personal Access Token
|
|
33
|
+
GITHUB_TOKEN: str({
|
|
34
|
+
default: '',
|
|
35
|
+
desc: 'GitHub Personal Access Token with repo scope for markdown file syncing'
|
|
16
36
|
})
|
|
17
37
|
});export{config};//# sourceMappingURL=env-config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env-config.js","sources":["../../src/config/env-config.ts"],"sourcesContent":[null],"names":[],"mappings":"wFAGA,MAAM,GAAG,GAAG,cAAc,EAAE;AAEf,MAAA,MAAM,GAAG,QAAQ,CAAC,GAAG,EAAE;AAChC,EAAA,WAAA,EAAW,GAAE,CAAA;IACb,OAA8D,EAAA,GAAA;IAC9D,IAAc,EAAA;;AAEV;gBACF,EAAA,IAAA,CAAA;IACF,OAA4C,EAAA,CAAA,sBAAA,CAAA;IAC5C,IAAmB,EAAA;AACf,GAAA,CAAA;AACA;qBACF,EAAA,GAAA,CAAA;AACL,IAAE,OAAA,EAAA,
|
|
1
|
+
{"version":3,"file":"env-config.js","sources":["../../src/config/env-config.ts"],"sourcesContent":[null],"names":[],"mappings":"wFAGA,MAAM,GAAG,GAAG,cAAc,EAAE;AAEf,MAAA,MAAM,GAAG,QAAQ,CAAC,GAAG,EAAE;AAChC,EAAA,WAAA,EAAW,GAAE,CAAA;IACb,OAA8D,EAAA,GAAA;IAC9D,IAAc,EAAA;;AAEV;gBACF,EAAA,IAAA,CAAA;IACF,OAA4C,EAAA,CAAA,sBAAA,CAAA;IAC5C,IAAmB,EAAA;AACf,GAAA,CAAA;AACA;qBACF,EAAA,GAAA,CAAA;IACF,OAAqD,EAAA,EAAA;IACrD,IAAY,EAAA;AACR,GAAA,CAAA;AACA;cACF,EAAA,GAAA,CAAA;IACF,OAAyB,EAAA,EAAA;IACzB,IAAW,EAAA;AACP,GAAA,CAAA;AACA;aACF,EAAA,GAAA,CAAA;IACF,OAAqB,EAAA,EAAA;IACrB,IAAa,EAAA;AACT,GAAA,CAAA;AACA;eACF,EAAA,GAAA,CAAA;IACF,OAA+B,EAAA,EAAA;IAC/B,IAAY,EAAA;AACR,GAAA,CAAA;AACA;cACF,EAAA,GAAA,CAAA;AACL,IAAE,OAAA,EAAA,EAAA;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MarkdownPageLayout.d.ts","sourceRoot":"","sources":["../../../src/pages/Markdown/MarkdownPageLayout.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAO3D,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,iBAAiB,
|
|
1
|
+
{"version":3,"file":"MarkdownPageLayout.d.ts","sourceRoot":"","sources":["../../../src/pages/Markdown/MarkdownPageLayout.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAO3D,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,iBAAiB,CAiYhE,CAAC"}
|