@happyvertical/smrt-content 0.30.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.
- package/AGENTS.md +194 -0
- package/CLAUDE.md +1 -0
- package/LICENSE +7 -0
- package/README.md +634 -0
- package/dist/__smrt-register__.d.ts +2 -0
- package/dist/__smrt-register__.d.ts.map +1 -0
- package/dist/asset-associable.d.ts +115 -0
- package/dist/asset-associable.d.ts.map +1 -0
- package/dist/body-format.d.ts +29 -0
- package/dist/body-format.d.ts.map +1 -0
- package/dist/body-format.js +604 -0
- package/dist/body-format.js.map +1 -0
- package/dist/content-asset.d.ts +17 -0
- package/dist/content-asset.d.ts.map +1 -0
- package/dist/content-assets.d.ts +10 -0
- package/dist/content-assets.d.ts.map +1 -0
- package/dist/content-chat-handlers.d.ts +115 -0
- package/dist/content-chat-handlers.d.ts.map +1 -0
- package/dist/content-chat-prompts.d.ts +3 -0
- package/dist/content-chat-prompts.d.ts.map +1 -0
- package/dist/content-chat-session.d.ts +26 -0
- package/dist/content-chat-session.d.ts.map +1 -0
- package/dist/content-contribution-attachment.d.ts +42 -0
- package/dist/content-contribution-attachment.d.ts.map +1 -0
- package/dist/content-contribution-attachments.d.ts +8 -0
- package/dist/content-contribution-attachments.d.ts.map +1 -0
- package/dist/content-contribution-config.d.ts +84 -0
- package/dist/content-contribution-config.d.ts.map +1 -0
- package/dist/content-contribution-revision.d.ts +38 -0
- package/dist/content-contribution-revision.d.ts.map +1 -0
- package/dist/content-contribution-revisions.d.ts +8 -0
- package/dist/content-contribution-revisions.d.ts.map +1 -0
- package/dist/content-contribution-type.d.ts +51 -0
- package/dist/content-contribution-type.d.ts.map +1 -0
- package/dist/content-contribution-types.d.ts +7 -0
- package/dist/content-contribution-types.d.ts.map +1 -0
- package/dist/content-contribution.d.ts +161 -0
- package/dist/content-contribution.d.ts.map +1 -0
- package/dist/content-contributions.d.ts +53 -0
- package/dist/content-contributions.d.ts.map +1 -0
- package/dist/content-contributor.d.ts +30 -0
- package/dist/content-contributor.d.ts.map +1 -0
- package/dist/content-contributors.d.ts +13 -0
- package/dist/content-contributors.d.ts.map +1 -0
- package/dist/content-correction.d.ts +39 -0
- package/dist/content-correction.d.ts.map +1 -0
- package/dist/content-corrections.d.ts +9 -0
- package/dist/content-corrections.d.ts.map +1 -0
- package/dist/content-editor-assistant.d.ts +68 -0
- package/dist/content-editor-assistant.d.ts.map +1 -0
- package/dist/content-editor-assistant.js +97 -0
- package/dist/content-editor-assistant.js.map +1 -0
- package/dist/content-feed-parser.d.ts +19 -0
- package/dist/content-feed-parser.d.ts.map +1 -0
- package/dist/content-feed-source.d.ts +52 -0
- package/dist/content-feed-source.d.ts.map +1 -0
- package/dist/content-feed-sources.d.ts +11 -0
- package/dist/content-feed-sources.d.ts.map +1 -0
- package/dist/content-feed-sync.d.ts +23 -0
- package/dist/content-feed-sync.d.ts.map +1 -0
- package/dist/content-governance-assignment.d.ts +42 -0
- package/dist/content-governance-assignment.d.ts.map +1 -0
- package/dist/content-governance-assignments.d.ts +11 -0
- package/dist/content-governance-assignments.d.ts.map +1 -0
- package/dist/content-governance-policies.d.ts +7 -0
- package/dist/content-governance-policies.d.ts.map +1 -0
- package/dist/content-governance-policy.d.ts +29 -0
- package/dist/content-governance-policy.d.ts.map +1 -0
- package/dist/content-governance-profile.d.ts +31 -0
- package/dist/content-governance-profile.d.ts.map +1 -0
- package/dist/content-governance-profiles.d.ts +7 -0
- package/dist/content-governance-profiles.d.ts.map +1 -0
- package/dist/content-governance.d.ts +188 -0
- package/dist/content-governance.d.ts.map +1 -0
- package/dist/content-prompts.d.ts +10 -0
- package/dist/content-prompts.d.ts.map +1 -0
- package/dist/content-reference.d.ts +17 -0
- package/dist/content-reference.d.ts.map +1 -0
- package/dist/content-references.d.ts +55 -0
- package/dist/content-references.d.ts.map +1 -0
- package/dist/content-review.d.ts +34 -0
- package/dist/content-review.d.ts.map +1 -0
- package/dist/content-reviews.d.ts +21 -0
- package/dist/content-reviews.d.ts.map +1 -0
- package/dist/content-transparency.d.ts +72 -0
- package/dist/content-transparency.d.ts.map +1 -0
- package/dist/content-types.d.ts +51 -0
- package/dist/content-types.d.ts.map +1 -0
- package/dist/content-version.d.ts +38 -0
- package/dist/content-version.d.ts.map +1 -0
- package/dist/content-versions.d.ts +16 -0
- package/dist/content-versions.d.ts.map +1 -0
- package/dist/content.d.ts +736 -0
- package/dist/content.d.ts.map +1 -0
- package/dist/contents.d.ts +292 -0
- package/dist/contents.d.ts.map +1 -0
- package/dist/database-utils.d.ts +3 -0
- package/dist/database-utils.d.ts.map +1 -0
- package/dist/index.d.ts +78 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11602 -0
- package/dist/index.js.map +1 -0
- package/dist/manifest.json +12308 -0
- package/dist/mock-smrt-client.d.ts +493 -0
- package/dist/mock-smrt-client.d.ts.map +1 -0
- package/dist/mock-smrt-client.js +390 -0
- package/dist/mock-smrt-client.js.map +1 -0
- package/dist/playground.d.ts +2 -0
- package/dist/playground.d.ts.map +1 -0
- package/dist/playground.js +454 -0
- package/dist/playground.js.map +1 -0
- package/dist/publish-readiness.d.ts +30 -0
- package/dist/publish-readiness.d.ts.map +1 -0
- package/dist/publish-readiness.js +74 -0
- package/dist/publish-readiness.js.map +1 -0
- package/dist/safe-remote-url.d.ts +52 -0
- package/dist/safe-remote-url.d.ts.map +1 -0
- package/dist/serialization.d.ts +78 -0
- package/dist/serialization.d.ts.map +1 -0
- package/dist/smrt-knowledge.json +6130 -0
- package/dist/svelte/api.d.ts +3 -0
- package/dist/svelte/api.d.ts.map +1 -0
- package/dist/svelte/api.js +10 -0
- package/dist/svelte/components/ArticleCard.svelte +159 -0
- package/dist/svelte/components/ArticleCard.svelte.d.ts +17 -0
- package/dist/svelte/components/ArticleCard.svelte.d.ts.map +1 -0
- package/dist/svelte/components/ArticleList.svelte +75 -0
- package/dist/svelte/components/ArticleList.svelte.d.ts +21 -0
- package/dist/svelte/components/ArticleList.svelte.d.ts.map +1 -0
- package/dist/svelte/components/ContentAgentChat.svelte +652 -0
- package/dist/svelte/components/ContentAgentChat.svelte.d.ts +17 -0
- package/dist/svelte/components/ContentAgentChat.svelte.d.ts.map +1 -0
- package/dist/svelte/components/ContentBodyEditor.svelte +1446 -0
- package/dist/svelte/components/ContentBodyEditor.svelte.d.ts +25 -0
- package/dist/svelte/components/ContentBodyEditor.svelte.d.ts.map +1 -0
- package/dist/svelte/components/ContentBodyRenderer.svelte +152 -0
- package/dist/svelte/components/ContentBodyRenderer.svelte.d.ts +10 -0
- package/dist/svelte/components/ContentBodyRenderer.svelte.d.ts.map +1 -0
- package/dist/svelte/components/ContentClaimAuditTool.svelte +441 -0
- package/dist/svelte/components/ContentClaimAuditTool.svelte.d.ts +12 -0
- package/dist/svelte/components/ContentClaimAuditTool.svelte.d.ts.map +1 -0
- package/dist/svelte/components/ContentContributionForm.svelte +226 -0
- package/dist/svelte/components/ContentContributionForm.svelte.d.ts +23 -0
- package/dist/svelte/components/ContentContributionForm.svelte.d.ts.map +1 -0
- package/dist/svelte/components/ContentContributionInbox.svelte +322 -0
- package/dist/svelte/components/ContentContributionInbox.svelte.d.ts +22 -0
- package/dist/svelte/components/ContentContributionInbox.svelte.d.ts.map +1 -0
- package/dist/svelte/components/ContentContributionPortal.svelte +182 -0
- package/dist/svelte/components/ContentContributionPortal.svelte.d.ts +12 -0
- package/dist/svelte/components/ContentContributionPortal.svelte.d.ts.map +1 -0
- package/dist/svelte/components/ContentContributionTypeManager.svelte +281 -0
- package/dist/svelte/components/ContentContributionTypeManager.svelte.d.ts +10 -0
- package/dist/svelte/components/ContentContributionTypeManager.svelte.d.ts.map +1 -0
- package/dist/svelte/components/ContentContributorManager.svelte +140 -0
- package/dist/svelte/components/ContentContributorManager.svelte.d.ts +10 -0
- package/dist/svelte/components/ContentContributorManager.svelte.d.ts.map +1 -0
- package/dist/svelte/components/ContentCorrectionsTool.svelte +361 -0
- package/dist/svelte/components/ContentCorrectionsTool.svelte.d.ts +11 -0
- package/dist/svelte/components/ContentCorrectionsTool.svelte.d.ts.map +1 -0
- package/dist/svelte/components/ContentEditor.svelte +2166 -0
- package/dist/svelte/components/ContentEditor.svelte.d.ts +26 -0
- package/dist/svelte/components/ContentEditor.svelte.d.ts.map +1 -0
- package/dist/svelte/components/ContentGovernanceAssignmentEditor.svelte +199 -0
- package/dist/svelte/components/ContentGovernanceAssignmentEditor.svelte.d.ts +11 -0
- package/dist/svelte/components/ContentGovernanceAssignmentEditor.svelte.d.ts.map +1 -0
- package/dist/svelte/components/ContentGovernanceManager.svelte +340 -0
- package/dist/svelte/components/ContentGovernanceManager.svelte.d.ts +11 -0
- package/dist/svelte/components/ContentGovernanceManager.svelte.d.ts.map +1 -0
- package/dist/svelte/components/ContentGovernancePanel.svelte +2244 -0
- package/dist/svelte/components/ContentGovernancePanel.svelte.d.ts +26 -0
- package/dist/svelte/components/ContentGovernancePanel.svelte.d.ts.map +1 -0
- package/dist/svelte/components/ContentGovernancePolicyEditor.svelte +110 -0
- package/dist/svelte/components/ContentGovernancePolicyEditor.svelte.d.ts +10 -0
- package/dist/svelte/components/ContentGovernancePolicyEditor.svelte.d.ts.map +1 -0
- package/dist/svelte/components/ContentGovernanceProfileEditor.svelte +185 -0
- package/dist/svelte/components/ContentGovernanceProfileEditor.svelte.d.ts +11 -0
- package/dist/svelte/components/ContentGovernanceProfileEditor.svelte.d.ts.map +1 -0
- package/dist/svelte/components/ContentGovernanceTool.svelte +56 -0
- package/dist/svelte/components/ContentGovernanceTool.svelte.d.ts +13 -0
- package/dist/svelte/components/ContentGovernanceTool.svelte.d.ts.map +1 -0
- package/dist/svelte/components/ContentImageBrowser.svelte +243 -0
- package/dist/svelte/components/ContentImageBrowser.svelte.d.ts +18 -0
- package/dist/svelte/components/ContentImageBrowser.svelte.d.ts.map +1 -0
- package/dist/svelte/components/ContentImageChooser.svelte +134 -0
- package/dist/svelte/components/ContentImageChooser.svelte.d.ts +11 -0
- package/dist/svelte/components/ContentImageChooser.svelte.d.ts.map +1 -0
- package/dist/svelte/components/ContentList.svelte +906 -0
- package/dist/svelte/components/ContentList.svelte.d.ts +16 -0
- package/dist/svelte/components/ContentList.svelte.d.ts.map +1 -0
- package/dist/svelte/components/ContentMetadataFields.svelte +107 -0
- package/dist/svelte/components/ContentMetadataFields.svelte.d.ts +8 -0
- package/dist/svelte/components/ContentMetadataFields.svelte.d.ts.map +1 -0
- package/dist/svelte/components/ContentReferencesPanel.svelte +221 -0
- package/dist/svelte/components/ContentReferencesPanel.svelte.d.ts +20 -0
- package/dist/svelte/components/ContentReferencesPanel.svelte.d.ts.map +1 -0
- package/dist/svelte/components/ContentReviewStatusTray.svelte +151 -0
- package/dist/svelte/components/ContentReviewStatusTray.svelte.d.ts +20 -0
- package/dist/svelte/components/ContentReviewStatusTray.svelte.d.ts.map +1 -0
- package/dist/svelte/components/ContentStatusFields.svelte +85 -0
- package/dist/svelte/components/ContentStatusFields.svelte.d.ts +8 -0
- package/dist/svelte/components/ContentStatusFields.svelte.d.ts.map +1 -0
- package/dist/svelte/components/ContentTitleField.svelte +54 -0
- package/dist/svelte/components/ContentTitleField.svelte.d.ts +10 -0
- package/dist/svelte/components/ContentTitleField.svelte.d.ts.map +1 -0
- package/dist/svelte/components/ContentTransparencyReport.svelte +322 -0
- package/dist/svelte/components/ContentTransparencyReport.svelte.d.ts +10 -0
- package/dist/svelte/components/ContentTransparencyReport.svelte.d.ts.map +1 -0
- package/dist/svelte/components/ContentTransparencyTool.svelte +314 -0
- package/dist/svelte/components/ContentTransparencyTool.svelte.d.ts +10 -0
- package/dist/svelte/components/ContentTransparencyTool.svelte.d.ts.map +1 -0
- package/dist/svelte/components/ContentVersionsTool.svelte +291 -0
- package/dist/svelte/components/ContentVersionsTool.svelte.d.ts +10 -0
- package/dist/svelte/components/ContentVersionsTool.svelte.d.ts.map +1 -0
- package/dist/svelte/components/GovernedContentEditor.svelte +409 -0
- package/dist/svelte/components/GovernedContentEditor.svelte.d.ts +35 -0
- package/dist/svelte/components/GovernedContentEditor.svelte.d.ts.map +1 -0
- package/dist/svelte/components/ImageThumbnail.cache.d.ts +14 -0
- package/dist/svelte/components/ImageThumbnail.cache.d.ts.map +1 -0
- package/dist/svelte/components/ImageThumbnail.cache.js +36 -0
- package/dist/svelte/components/ImageThumbnail.svelte +159 -0
- package/dist/svelte/components/ImageThumbnail.svelte.d.ts +8 -0
- package/dist/svelte/components/ImageThumbnail.svelte.d.ts.map +1 -0
- package/dist/svelte/components/Markdown.svelte +125 -0
- package/dist/svelte/components/Markdown.svelte.d.ts +11 -0
- package/dist/svelte/components/Markdown.svelte.d.ts.map +1 -0
- package/dist/svelte/content-editor-form.d.ts +63 -0
- package/dist/svelte/content-editor-form.d.ts.map +1 -0
- package/dist/svelte/content-editor-form.js +94 -0
- package/dist/svelte/content-editor-media.d.ts +12 -0
- package/dist/svelte/content-editor-media.d.ts.map +1 -0
- package/dist/svelte/content-editor-media.js +84 -0
- package/dist/svelte/content-editor-state.svelte.d.ts +35 -0
- package/dist/svelte/content-editor-state.svelte.d.ts.map +1 -0
- package/dist/svelte/content-editor-state.svelte.js +141 -0
- package/dist/svelte/governance-manager-client.d.ts +22 -0
- package/dist/svelte/governance-manager-client.d.ts.map +1 -0
- package/dist/svelte/governance-manager-client.js +1 -0
- package/dist/svelte/i18n.contribution.d.ts +57 -0
- package/dist/svelte/i18n.contribution.d.ts.map +1 -0
- package/dist/svelte/i18n.contribution.js +64 -0
- package/dist/svelte/i18n.editor.d.ts +71 -0
- package/dist/svelte/i18n.editor.d.ts.map +1 -0
- package/dist/svelte/i18n.editor.js +87 -0
- package/dist/svelte/i18n.governance.d.ts +66 -0
- package/dist/svelte/i18n.governance.d.ts.map +1 -0
- package/dist/svelte/i18n.governance.js +66 -0
- package/dist/svelte/i18n.routes.d.ts +66 -0
- package/dist/svelte/i18n.routes.d.ts.map +1 -0
- package/dist/svelte/i18n.routes.js +75 -0
- package/dist/svelte/i18n.tools.d.ts +81 -0
- package/dist/svelte/i18n.tools.d.ts.map +1 -0
- package/dist/svelte/i18n.tools.js +90 -0
- package/dist/svelte/index.d.ts +101 -0
- package/dist/svelte/index.d.ts.map +1 -0
- package/dist/svelte/index.js +63 -0
- package/dist/svelte/playground.d.ts +281 -0
- package/dist/svelte/playground.d.ts.map +1 -0
- package/dist/svelte/playground.js +438 -0
- package/dist/svelte/routes/ContentContributionsRoute.svelte +809 -0
- package/dist/svelte/routes/ContentContributionsRoute.svelte.d.ts +10 -0
- package/dist/svelte/routes/ContentContributionsRoute.svelte.d.ts.map +1 -0
- package/dist/svelte/routes/ContentFactsRoute.svelte +612 -0
- package/dist/svelte/routes/ContentFactsRoute.svelte.d.ts +11 -0
- package/dist/svelte/routes/ContentFactsRoute.svelte.d.ts.map +1 -0
- package/dist/svelte/routes/ContentGovernanceRoute.svelte +218 -0
- package/dist/svelte/routes/ContentGovernanceRoute.svelte.d.ts +10 -0
- package/dist/svelte/routes/ContentGovernanceRoute.svelte.d.ts.map +1 -0
- package/dist/svelte/routes/ContentWorkspaceRoute.svelte +431 -0
- package/dist/svelte/routes/ContentWorkspaceRoute.svelte.d.ts +12 -0
- package/dist/svelte/routes/ContentWorkspaceRoute.svelte.d.ts.map +1 -0
- package/dist/svelte/routes/PublishedArticleRoute.svelte +194 -0
- package/dist/svelte/routes/PublishedArticleRoute.svelte.d.ts +10 -0
- package/dist/svelte/routes/PublishedArticleRoute.svelte.d.ts.map +1 -0
- package/dist/svelte/routes/index.d.ts +8 -0
- package/dist/svelte/routes/index.d.ts.map +1 -0
- package/dist/svelte/routes/index.js +6 -0
- package/dist/svelte/routes/shared.d.ts +90 -0
- package/dist/svelte/routes/shared.d.ts.map +1 -0
- package/dist/svelte/routes/shared.js +104 -0
- package/dist/svelte/types.d.ts +69 -0
- package/dist/svelte/types.d.ts.map +1 -0
- package/dist/svelte/types.js +6 -0
- package/dist/thumbnail-generator.d.ts +174 -0
- package/dist/thumbnail-generator.d.ts.map +1 -0
- package/dist/ui.d.ts +10 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +42 -0
- package/dist/ui.js.map +1 -0
- package/dist/utils.d.ts +18 -0
- package/dist/utils.d.ts.map +1 -0
- package/package.json +119 -0
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
/**
|
|
3
|
+
* Markdown Component
|
|
4
|
+
*
|
|
5
|
+
* A simple markdown renderer with XSS protection.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* <Markdown content="# Hello\n\nThis is **bold** text." />
|
|
9
|
+
*/
|
|
10
|
+
import { renderMarkdownToHtml } from '../../body-format';
|
|
11
|
+
|
|
12
|
+
/** Props for the Markdown component */
|
|
13
|
+
export interface Props {
|
|
14
|
+
/** Markdown content to render */
|
|
15
|
+
content: string;
|
|
16
|
+
/** Optional CSS class for styling */
|
|
17
|
+
class?: string;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
let { content, class: className = '' }: Props = $props();
|
|
21
|
+
|
|
22
|
+
const rendered = $derived(renderMarkdownToHtml(content));
|
|
23
|
+
</script>
|
|
24
|
+
|
|
25
|
+
<div class="markdown-content {className}">
|
|
26
|
+
{@html rendered}
|
|
27
|
+
</div>
|
|
28
|
+
|
|
29
|
+
<style>
|
|
30
|
+
.markdown-content {
|
|
31
|
+
font-size: var(--smrt-typography-body-large-size, 1rem);
|
|
32
|
+
line-height: var(--smrt-typography-body-large-line-height, 1.5);
|
|
33
|
+
color: var(--smrt-color-on-surface);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
.markdown-content :global(h1) {
|
|
37
|
+
font-size: var(--smrt-typography-headline-large-size, 2rem);
|
|
38
|
+
margin: var(--spacing-2xl, 2rem) 0 var(--spacing-lg, 1rem) 0;
|
|
39
|
+
color: var(--smrt-color-on-surface);
|
|
40
|
+
font-weight: var(--smrt-typography-headline-large-weight, 400);
|
|
41
|
+
line-height: var(--smrt-typography-headline-large-line-height, 2.5rem);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.markdown-content :global(h2) {
|
|
45
|
+
font-size: var(--smrt-typography-headline-medium-size, 1.75rem);
|
|
46
|
+
margin: var(--spacing-xl, 1.5rem) 0 var(--spacing-md, 0.75rem) 0;
|
|
47
|
+
color: var(--smrt-color-on-surface);
|
|
48
|
+
font-weight: var(--smrt-typography-headline-medium-weight, 400);
|
|
49
|
+
line-height: var(--smrt-typography-headline-medium-line-height, 2.25rem);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
.markdown-content :global(h3) {
|
|
53
|
+
font-size: var(--smrt-typography-headline-small-size, 1.5rem);
|
|
54
|
+
margin: var(--spacing-lg, 1rem) 0 var(--spacing-sm, 0.5rem) 0;
|
|
55
|
+
color: var(--smrt-color-on-surface);
|
|
56
|
+
font-weight: var(--smrt-typography-headline-small-weight, 400);
|
|
57
|
+
line-height: var(--smrt-typography-headline-small-line-height, 2rem);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
.markdown-content :global(p) {
|
|
61
|
+
margin: var(--spacing-md, 0.75rem) 0;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
.markdown-content :global(p:first-child) {
|
|
65
|
+
margin-top: 0;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
.markdown-content :global(p:last-child) {
|
|
69
|
+
margin-bottom: 0;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
.markdown-content :global(ul) {
|
|
73
|
+
margin: var(--spacing-md, 0.75rem) 0;
|
|
74
|
+
padding-left: var(--spacing-xl, 1.5rem);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
.markdown-content :global(li) {
|
|
78
|
+
margin: var(--spacing-xs, 0.25rem) 0;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
.markdown-content :global(strong) {
|
|
82
|
+
font-weight: var(--smrt-typography-weight-bold, 700);
|
|
83
|
+
color: var(--smrt-color-on-surface);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
.markdown-content :global(em) {
|
|
87
|
+
font-style: italic;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
.markdown-content :global(code) {
|
|
91
|
+
font-family: var(--smrt-font-family-mono, ui-monospace, monospace);
|
|
92
|
+
font-size: 0.875em;
|
|
93
|
+
background: var(--smrt-color-surface-container-high);
|
|
94
|
+
color: var(--smrt-color-on-surface-variant);
|
|
95
|
+
padding: 0.125rem 0.375rem;
|
|
96
|
+
border-radius: var(--smrt-radius-small, 4px);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
.markdown-content :global(pre) {
|
|
100
|
+
background: var(--smrt-color-surface-container-high);
|
|
101
|
+
padding: var(--spacing-md, 0.75rem);
|
|
102
|
+
border-radius: var(--smrt-radius-medium, 8px);
|
|
103
|
+
overflow-x: auto;
|
|
104
|
+
margin: var(--spacing-md, 0.75rem) 0;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
.markdown-content :global(pre code) {
|
|
108
|
+
background: transparent;
|
|
109
|
+
padding: 0;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
.markdown-content :global(a) {
|
|
113
|
+
color: var(--smrt-color-primary);
|
|
114
|
+
text-decoration: underline;
|
|
115
|
+
text-underline-offset: 0.18em;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
.markdown-content :global(img) {
|
|
119
|
+
display: block;
|
|
120
|
+
width: min(100%, 48rem);
|
|
121
|
+
height: auto;
|
|
122
|
+
margin: var(--spacing-lg, 1rem) 0;
|
|
123
|
+
border-radius: var(--smrt-radius-medium, 8px);
|
|
124
|
+
}
|
|
125
|
+
</style>
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** Props for the Markdown component */
|
|
2
|
+
export interface Props {
|
|
3
|
+
/** Markdown content to render */
|
|
4
|
+
content: string;
|
|
5
|
+
/** Optional CSS class for styling */
|
|
6
|
+
class?: string;
|
|
7
|
+
}
|
|
8
|
+
declare const Markdown: import("svelte").Component<Props, {}, "">;
|
|
9
|
+
type Markdown = ReturnType<typeof Markdown>;
|
|
10
|
+
export default Markdown;
|
|
11
|
+
//# sourceMappingURL=Markdown.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Markdown.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/components/Markdown.svelte.ts"],"names":[],"mappings":"AAcA,uCAAuC;AACvC,MAAM,WAAW,KAAK;IACpB,iCAAiC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,qCAAqC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAmBD,QAAA,MAAM,QAAQ,2CAAwC,CAAC;AACvD,KAAK,QAAQ,GAAG,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC;AAC5C,eAAe,QAAQ,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { ContentBodyFormat } from '../body-format';
|
|
2
|
+
export interface ContentEditorAsset {
|
|
3
|
+
id?: string | null;
|
|
4
|
+
name?: string | null;
|
|
5
|
+
title?: string | null;
|
|
6
|
+
filename?: string | null;
|
|
7
|
+
sourceUri?: string | null;
|
|
8
|
+
thumbnailUri?: string | null;
|
|
9
|
+
thumbnailUrl?: string | null;
|
|
10
|
+
deliveryUrl?: string | null;
|
|
11
|
+
url?: string | null;
|
|
12
|
+
src?: string | null;
|
|
13
|
+
}
|
|
14
|
+
export interface ContentEditorReference {
|
|
15
|
+
id?: string | null;
|
|
16
|
+
title?: string | null;
|
|
17
|
+
name?: string | null;
|
|
18
|
+
url?: string | null;
|
|
19
|
+
originalUrl?: string | null;
|
|
20
|
+
source?: string | null;
|
|
21
|
+
_auditOnly?: boolean;
|
|
22
|
+
_auditSourceKind?: string;
|
|
23
|
+
_auditSourceId?: string;
|
|
24
|
+
}
|
|
25
|
+
export type ContentEditorInitialContent = Partial<ContentEditorFormData> & {
|
|
26
|
+
publishDate?: unknown;
|
|
27
|
+
};
|
|
28
|
+
export type ContentEditorSavePayload = Omit<ContentEditorFormData, 'references' | 'assets' | 'publishDate'> & {
|
|
29
|
+
publish_date: string | null;
|
|
30
|
+
};
|
|
31
|
+
export type ContentEditorFormData = {
|
|
32
|
+
title: string;
|
|
33
|
+
description: string;
|
|
34
|
+
body: string;
|
|
35
|
+
bodyFormat: ContentBodyFormat;
|
|
36
|
+
author: string;
|
|
37
|
+
type: string;
|
|
38
|
+
status: string;
|
|
39
|
+
state: string;
|
|
40
|
+
source: string;
|
|
41
|
+
url: string;
|
|
42
|
+
fileKey: string;
|
|
43
|
+
publish_date: string;
|
|
44
|
+
thumbnailAssetId: string | null;
|
|
45
|
+
tags: string[];
|
|
46
|
+
referenceIds: string[];
|
|
47
|
+
references: ContentEditorReference[];
|
|
48
|
+
assetIds: string[];
|
|
49
|
+
assets: ContentEditorAsset[];
|
|
50
|
+
[key: string]: unknown;
|
|
51
|
+
};
|
|
52
|
+
export declare function formatDateTimeLocal(value: unknown): string;
|
|
53
|
+
export declare function normalizePublishDate(value: unknown): string | null;
|
|
54
|
+
export declare function getContentEditorInitialFormData(content: ContentEditorInitialContent | null | undefined): ContentEditorFormData;
|
|
55
|
+
export declare function getContentEditorSavePayload(data: ContentEditorFormData): ContentEditorSavePayload;
|
|
56
|
+
export declare function getContentEditorSnapshot(data: ContentEditorFormData): {
|
|
57
|
+
referenceIds: string[];
|
|
58
|
+
references: ContentEditorReference[];
|
|
59
|
+
assetIds: string[];
|
|
60
|
+
assets: ContentEditorAsset[];
|
|
61
|
+
publish_date: string | null;
|
|
62
|
+
};
|
|
63
|
+
//# sourceMappingURL=content-editor-form.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content-editor-form.d.ts","sourceRoot":"","sources":["../../src/svelte/content-editor-form.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { resolveBodyFormat } from '../body-format';
|
|
2
|
+
function getEmptyContentEditorFormData() {
|
|
3
|
+
return {
|
|
4
|
+
title: '',
|
|
5
|
+
description: '',
|
|
6
|
+
body: '',
|
|
7
|
+
bodyFormat: 'html',
|
|
8
|
+
author: '',
|
|
9
|
+
type: 'article',
|
|
10
|
+
status: 'draft',
|
|
11
|
+
state: 'active',
|
|
12
|
+
source: 'manual',
|
|
13
|
+
url: '',
|
|
14
|
+
fileKey: '',
|
|
15
|
+
publish_date: '',
|
|
16
|
+
thumbnailAssetId: null,
|
|
17
|
+
tags: [],
|
|
18
|
+
referenceIds: [],
|
|
19
|
+
references: [],
|
|
20
|
+
assetIds: [],
|
|
21
|
+
assets: [],
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export function formatDateTimeLocal(value) {
|
|
25
|
+
if (!value) {
|
|
26
|
+
return '';
|
|
27
|
+
}
|
|
28
|
+
const date = value instanceof Date ? value : new Date(value);
|
|
29
|
+
if (Number.isNaN(date.getTime())) {
|
|
30
|
+
return typeof value === 'string' ? value : '';
|
|
31
|
+
}
|
|
32
|
+
const localDate = new Date(date.getTime() - date.getTimezoneOffset() * 60000);
|
|
33
|
+
return localDate.toISOString().slice(0, 16);
|
|
34
|
+
}
|
|
35
|
+
export function normalizePublishDate(value) {
|
|
36
|
+
if (typeof value === 'string') {
|
|
37
|
+
const trimmed = value.trim();
|
|
38
|
+
if (!trimmed) {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
const parsed = new Date(trimmed);
|
|
42
|
+
return Number.isNaN(parsed.getTime()) ? trimmed : parsed.toISOString();
|
|
43
|
+
}
|
|
44
|
+
if (value instanceof Date) {
|
|
45
|
+
return Number.isNaN(value.getTime()) ? null : value.toISOString();
|
|
46
|
+
}
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
export function getContentEditorInitialFormData(content) {
|
|
50
|
+
if (content) {
|
|
51
|
+
const defaults = getEmptyContentEditorFormData();
|
|
52
|
+
return {
|
|
53
|
+
...defaults,
|
|
54
|
+
...content,
|
|
55
|
+
title: content.title ?? defaults.title,
|
|
56
|
+
description: content.description ?? defaults.description,
|
|
57
|
+
body: content.body ?? defaults.body,
|
|
58
|
+
bodyFormat: resolveBodyFormat(content.bodyFormat, content.body),
|
|
59
|
+
author: content.author ?? defaults.author,
|
|
60
|
+
type: content.type ?? defaults.type,
|
|
61
|
+
status: content.status ?? defaults.status,
|
|
62
|
+
state: content.state ?? defaults.state,
|
|
63
|
+
source: content.source ?? defaults.source,
|
|
64
|
+
url: content.url ?? defaults.url,
|
|
65
|
+
fileKey: content.fileKey ?? defaults.fileKey,
|
|
66
|
+
thumbnailAssetId: content.thumbnailAssetId ?? defaults.thumbnailAssetId,
|
|
67
|
+
tags: Array.isArray(content.tags) ? content.tags : [],
|
|
68
|
+
referenceIds: Array.isArray(content.referenceIds)
|
|
69
|
+
? content.referenceIds
|
|
70
|
+
: [],
|
|
71
|
+
references: Array.isArray(content.references) ? content.references : [],
|
|
72
|
+
assetIds: Array.isArray(content.assetIds) ? content.assetIds : [],
|
|
73
|
+
assets: Array.isArray(content.assets) ? content.assets : [],
|
|
74
|
+
publish_date: formatDateTimeLocal(content.publish_date ?? content.publishDate),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
return getEmptyContentEditorFormData();
|
|
78
|
+
}
|
|
79
|
+
export function getContentEditorSavePayload(data) {
|
|
80
|
+
const { references: _references, assets: _assets, publishDate: _publishDate, ...payload } = data;
|
|
81
|
+
return {
|
|
82
|
+
...payload,
|
|
83
|
+
publish_date: normalizePublishDate(data.publish_date),
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
export function getContentEditorSnapshot(data) {
|
|
87
|
+
return {
|
|
88
|
+
...getContentEditorSavePayload(data),
|
|
89
|
+
referenceIds: [...(data.referenceIds || [])],
|
|
90
|
+
references: [...(data.references || [])],
|
|
91
|
+
assetIds: [...(data.assetIds || [])],
|
|
92
|
+
assets: [...(data.assets || [])],
|
|
93
|
+
};
|
|
94
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ImageLike } from '@happyvertical/smrt-images/svelte';
|
|
2
|
+
import type { ContentEditorAsset } from './content-editor-form.js';
|
|
3
|
+
export declare function getContentEditorAssetImageSource(asset: ContentEditorAsset | Record<string, unknown>): string;
|
|
4
|
+
export declare function readContentEditorFileAsDataUrl(file: File): Promise<string>;
|
|
5
|
+
export declare function getContentEditorMimeTypeFromPath(pathname: string): string;
|
|
6
|
+
export declare function createContentEditorImageRecord(apiBaseUrl: string, input: {
|
|
7
|
+
name: string;
|
|
8
|
+
sourceUri: string;
|
|
9
|
+
mimeType: string;
|
|
10
|
+
}): Promise<ContentEditorAsset | null>;
|
|
11
|
+
export declare function resolveContentEditorImageSelection(apiBaseUrl: string, selected: ImageLike | File | string): Promise<ContentEditorAsset | null>;
|
|
12
|
+
//# sourceMappingURL=content-editor-media.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content-editor-media.d.ts","sourceRoot":"","sources":["../../src/svelte/content-editor-media.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC;AAEnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAEnE,wBAAgB,gCAAgC,CAC9C,KAAK,EAAE,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAClD,MAAM,CAUR;AAED,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAO1E;AAED,wBAAgB,gCAAgC,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAmBzE;AAWD,wBAAsB,8BAA8B,CAClD,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE;IACL,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB,GACA,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAgBpC;AAED,wBAAsB,kCAAkC,CACtD,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,SAAS,GAAG,IAAI,GAAG,MAAM,GAClC,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CA6BpC"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { joinApiUrl, normalizeApiBaseUrl } from './api.js';
|
|
2
|
+
export function getContentEditorAssetImageSource(asset) {
|
|
3
|
+
return String(asset?.sourceUri ||
|
|
4
|
+
asset?.thumbnailUri ||
|
|
5
|
+
asset?.thumbnailUrl ||
|
|
6
|
+
asset?.deliveryUrl ||
|
|
7
|
+
asset?.url ||
|
|
8
|
+
asset?.src ||
|
|
9
|
+
'');
|
|
10
|
+
}
|
|
11
|
+
export function readContentEditorFileAsDataUrl(file) {
|
|
12
|
+
return new Promise((resolve, reject) => {
|
|
13
|
+
const reader = new FileReader();
|
|
14
|
+
reader.onload = (event) => resolve(event.target?.result);
|
|
15
|
+
reader.onerror = () => reject(reader.error);
|
|
16
|
+
reader.readAsDataURL(file);
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
export function getContentEditorMimeTypeFromPath(pathname) {
|
|
20
|
+
const extension = pathname.split('.').pop()?.toLowerCase() ?? '';
|
|
21
|
+
switch (extension) {
|
|
22
|
+
case 'avif':
|
|
23
|
+
return 'image/avif';
|
|
24
|
+
case 'gif':
|
|
25
|
+
return 'image/gif';
|
|
26
|
+
case 'jpg':
|
|
27
|
+
case 'jpeg':
|
|
28
|
+
return 'image/jpeg';
|
|
29
|
+
case 'png':
|
|
30
|
+
return 'image/png';
|
|
31
|
+
case 'svg':
|
|
32
|
+
return 'image/svg+xml';
|
|
33
|
+
case 'webp':
|
|
34
|
+
return 'image/webp';
|
|
35
|
+
default:
|
|
36
|
+
return 'application/octet-stream';
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
function getMimeTypeFromUrl(parsedUrl) {
|
|
40
|
+
if (parsedUrl.protocol === 'data:') {
|
|
41
|
+
const [, mimeType] = parsedUrl.href.match(/^data:([^;,]+)/) ?? [];
|
|
42
|
+
return mimeType || 'application/octet-stream';
|
|
43
|
+
}
|
|
44
|
+
return getContentEditorMimeTypeFromPath(parsedUrl.pathname);
|
|
45
|
+
}
|
|
46
|
+
export async function createContentEditorImageRecord(apiBaseUrl, input) {
|
|
47
|
+
const response = await fetch(joinApiUrl(normalizeApiBaseUrl(apiBaseUrl), '/images'), {
|
|
48
|
+
method: 'POST',
|
|
49
|
+
headers: { 'Content-Type': 'application/json' },
|
|
50
|
+
body: JSON.stringify(input),
|
|
51
|
+
});
|
|
52
|
+
if (!response.ok) {
|
|
53
|
+
throw new Error(await response.text());
|
|
54
|
+
}
|
|
55
|
+
const payload = await response.json();
|
|
56
|
+
return (payload?.data ?? payload);
|
|
57
|
+
}
|
|
58
|
+
export async function resolveContentEditorImageSelection(apiBaseUrl, selected) {
|
|
59
|
+
if (selected && typeof selected === 'object' && 'id' in selected) {
|
|
60
|
+
return selected;
|
|
61
|
+
}
|
|
62
|
+
if (selected instanceof File) {
|
|
63
|
+
return createContentEditorImageRecord(apiBaseUrl, {
|
|
64
|
+
name: selected.name || 'Uploaded Image',
|
|
65
|
+
sourceUri: await readContentEditorFileAsDataUrl(selected),
|
|
66
|
+
mimeType: selected.type || 'image/png',
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
if (typeof selected === 'string') {
|
|
70
|
+
let parsedUrl;
|
|
71
|
+
try {
|
|
72
|
+
parsedUrl = new URL(selected);
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
return createContentEditorImageRecord(apiBaseUrl, {
|
|
78
|
+
name: parsedUrl.pathname.split('/').pop() || 'External Image',
|
|
79
|
+
sourceUri: selected,
|
|
80
|
+
mimeType: getMimeTypeFromUrl(parsedUrl),
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { ImageLike } from '@happyvertical/smrt-images/svelte';
|
|
2
|
+
import { type ContentEditorAsset, type ContentEditorFormData, type ContentEditorInitialContent } from './content-editor-form.js';
|
|
3
|
+
export interface CreateContentEditorStateOptions {
|
|
4
|
+
content?: ContentEditorInitialContent | null;
|
|
5
|
+
}
|
|
6
|
+
export type ContentEditorFieldChange = Partial<ContentEditorFormData> & Record<string, unknown>;
|
|
7
|
+
export declare class ContentEditorState {
|
|
8
|
+
private _form;
|
|
9
|
+
private _fieldUndoStack;
|
|
10
|
+
private _lastAppliedFields;
|
|
11
|
+
private _showUndoBanner;
|
|
12
|
+
constructor(options?: CreateContentEditorStateOptions);
|
|
13
|
+
get form(): ContentEditorFormData;
|
|
14
|
+
get snapshot(): {
|
|
15
|
+
referenceIds: string[];
|
|
16
|
+
references: import("./content-editor-form.js").ContentEditorReference[];
|
|
17
|
+
assetIds: string[];
|
|
18
|
+
assets: ContentEditorAsset[];
|
|
19
|
+
publish_date: string | null;
|
|
20
|
+
};
|
|
21
|
+
get savePayload(): import("./content-editor-form.js").ContentEditorSavePayload;
|
|
22
|
+
get showUndoBanner(): boolean;
|
|
23
|
+
get lastAppliedFields(): string[];
|
|
24
|
+
get undoDepth(): number;
|
|
25
|
+
reset(content?: ContentEditorInitialContent | null): void;
|
|
26
|
+
update(change: ContentEditorFieldChange): void;
|
|
27
|
+
applyFieldUpdates(fields: ContentEditorFieldChange): void;
|
|
28
|
+
undoLastFieldUpdate(): void;
|
|
29
|
+
setReferenceIds(referenceIds: string[]): void;
|
|
30
|
+
addAsset(asset: ContentEditorAsset | ImageLike | Record<string, unknown>): void;
|
|
31
|
+
removeAsset(assetId: string): void;
|
|
32
|
+
setThumbnailAsset(assetId: string | null): void;
|
|
33
|
+
}
|
|
34
|
+
export declare function createContentEditorState(options?: CreateContentEditorStateOptions): ContentEditorState;
|
|
35
|
+
//# sourceMappingURL=content-editor-state.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content-editor-state.svelte.d.ts","sourceRoot":"","sources":["../../src/svelte/content-editor-state.svelte.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAC1B,KAAK,2BAA2B,EAIjC,MAAM,0BAA0B,CAAC;AAElC,MAAM,WAAW,+BAA+B;IAC9C,OAAO,CAAC,EAAE,2BAA2B,GAAG,IAAI,CAAC;CAC9C;AAED,MAAM,MAAM,wBAAwB,GAAG,OAAO,CAAC,qBAAqB,CAAC,GACnE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAoD1B,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,KAAK,CAEX;IACF,OAAO,CAAC,eAAe,CAAmC;IAC1D,OAAO,CAAC,kBAAkB,CAAwB;IAClD,OAAO,CAAC,eAAe,CAAiB;gBAE5B,OAAO,GAAE,+BAAoC;IAIzD,IAAI,IAAI,0BAEP;IAED,IAAI,QAAQ;;;;;;MAEX;IAED,IAAI,WAAW,gEAEd;IAED,IAAI,cAAc,YAEjB;IAED,IAAI,iBAAiB,aAEpB;IAED,IAAI,SAAS,WAEZ;IAED,KAAK,CAAC,OAAO,CAAC,EAAE,2BAA2B,GAAG,IAAI;IAOlD,MAAM,CAAC,MAAM,EAAE,wBAAwB;IAOvC,iBAAiB,CAAC,MAAM,EAAE,wBAAwB;IA2BlD,mBAAmB;IAkBnB,eAAe,CAAC,YAAY,EAAE,MAAM,EAAE;IAItC,QAAQ,CAAC,KAAK,EAAE,kBAAkB,GAAG,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAgBxE,WAAW,CAAC,OAAO,EAAE,MAAM;IAW3B,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;CAGzC;AAED,wBAAgB,wBAAwB,CACtC,OAAO,GAAE,+BAAoC,sBAG9C"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { getContentEditorInitialFormData, getContentEditorSavePayload, getContentEditorSnapshot, } from './content-editor-form.js';
|
|
2
|
+
function cloneFieldValue(value) {
|
|
3
|
+
if (Array.isArray(value)) {
|
|
4
|
+
return [...value];
|
|
5
|
+
}
|
|
6
|
+
if (value && typeof value === 'object') {
|
|
7
|
+
return { ...value };
|
|
8
|
+
}
|
|
9
|
+
return value;
|
|
10
|
+
}
|
|
11
|
+
function normalizeFieldUpdateValue(currentValue, newValue) {
|
|
12
|
+
if (Array.isArray(currentValue)) {
|
|
13
|
+
return Array.isArray(newValue)
|
|
14
|
+
? { ok: true, value: [...newValue] }
|
|
15
|
+
: { ok: false };
|
|
16
|
+
}
|
|
17
|
+
if (currentValue === null) {
|
|
18
|
+
return newValue == null || typeof newValue === 'string'
|
|
19
|
+
? { ok: true, value: newValue ?? null }
|
|
20
|
+
: { ok: false };
|
|
21
|
+
}
|
|
22
|
+
switch (typeof currentValue) {
|
|
23
|
+
case 'string':
|
|
24
|
+
return { ok: true, value: newValue == null ? '' : String(newValue) };
|
|
25
|
+
case 'number': {
|
|
26
|
+
const numberValue = Number(newValue);
|
|
27
|
+
return Number.isFinite(numberValue)
|
|
28
|
+
? { ok: true, value: numberValue }
|
|
29
|
+
: { ok: false };
|
|
30
|
+
}
|
|
31
|
+
case 'boolean':
|
|
32
|
+
return typeof newValue === 'boolean'
|
|
33
|
+
? { ok: true, value: newValue }
|
|
34
|
+
: { ok: false };
|
|
35
|
+
case 'undefined':
|
|
36
|
+
return { ok: true, value: cloneFieldValue(newValue) };
|
|
37
|
+
default:
|
|
38
|
+
return { ok: true, value: cloneFieldValue(newValue) };
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
export class ContentEditorState {
|
|
42
|
+
_form = $state(getContentEditorInitialFormData(undefined));
|
|
43
|
+
_fieldUndoStack = $state([]);
|
|
44
|
+
_lastAppliedFields = $state([]);
|
|
45
|
+
_showUndoBanner = $state(false);
|
|
46
|
+
constructor(options = {}) {
|
|
47
|
+
this.reset(options.content);
|
|
48
|
+
}
|
|
49
|
+
get form() {
|
|
50
|
+
return this._form;
|
|
51
|
+
}
|
|
52
|
+
get snapshot() {
|
|
53
|
+
return getContentEditorSnapshot(this._form);
|
|
54
|
+
}
|
|
55
|
+
get savePayload() {
|
|
56
|
+
return getContentEditorSavePayload(this._form);
|
|
57
|
+
}
|
|
58
|
+
get showUndoBanner() {
|
|
59
|
+
return this._showUndoBanner;
|
|
60
|
+
}
|
|
61
|
+
get lastAppliedFields() {
|
|
62
|
+
return this._lastAppliedFields;
|
|
63
|
+
}
|
|
64
|
+
get undoDepth() {
|
|
65
|
+
return this._fieldUndoStack.length;
|
|
66
|
+
}
|
|
67
|
+
reset(content) {
|
|
68
|
+
this._form = getContentEditorInitialFormData(content);
|
|
69
|
+
this._fieldUndoStack = [];
|
|
70
|
+
this._lastAppliedFields = [];
|
|
71
|
+
this._showUndoBanner = false;
|
|
72
|
+
}
|
|
73
|
+
update(change) {
|
|
74
|
+
this._form = {
|
|
75
|
+
...this._form,
|
|
76
|
+
...change,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
applyFieldUpdates(fields) {
|
|
80
|
+
const oldValues = {};
|
|
81
|
+
const appliedFields = [];
|
|
82
|
+
for (const key of Object.keys(fields)) {
|
|
83
|
+
const normalized = normalizeFieldUpdateValue(this._form[key], fields[key]);
|
|
84
|
+
if (!normalized.ok) {
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
oldValues[key] = cloneFieldValue(this._form[key]);
|
|
88
|
+
this._form[key] = normalized.value;
|
|
89
|
+
appliedFields.push(key);
|
|
90
|
+
}
|
|
91
|
+
if (appliedFields.length === 0) {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
this._fieldUndoStack = [...this._fieldUndoStack, oldValues];
|
|
95
|
+
this._lastAppliedFields = appliedFields;
|
|
96
|
+
this._showUndoBanner = true;
|
|
97
|
+
}
|
|
98
|
+
undoLastFieldUpdate() {
|
|
99
|
+
if (this._fieldUndoStack.length === 0) {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
const oldValues = this._fieldUndoStack[this._fieldUndoStack.length - 1];
|
|
103
|
+
this._fieldUndoStack = this._fieldUndoStack.slice(0, -1);
|
|
104
|
+
for (const [key, value] of Object.entries(oldValues)) {
|
|
105
|
+
this._form[key] = value;
|
|
106
|
+
}
|
|
107
|
+
this._lastAppliedFields = Object.keys(oldValues);
|
|
108
|
+
if (this._fieldUndoStack.length === 0) {
|
|
109
|
+
this._showUndoBanner = false;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
setReferenceIds(referenceIds) {
|
|
113
|
+
this._form.referenceIds = [...referenceIds];
|
|
114
|
+
}
|
|
115
|
+
addAsset(asset) {
|
|
116
|
+
const assetId = typeof asset.id === 'string' ? asset.id : '';
|
|
117
|
+
if (!assetId) {
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
if (!this._form.assetIds.includes(assetId)) {
|
|
121
|
+
this._form.assetIds = [...this._form.assetIds, assetId];
|
|
122
|
+
this._form.assets = [...this._form.assets, asset];
|
|
123
|
+
}
|
|
124
|
+
if (!this._form.thumbnailAssetId) {
|
|
125
|
+
this._form.thumbnailAssetId = assetId;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
removeAsset(assetId) {
|
|
129
|
+
this._form.assetIds = this._form.assetIds.filter((id) => id !== assetId);
|
|
130
|
+
this._form.assets = this._form.assets.filter((asset) => asset.id !== assetId);
|
|
131
|
+
if (this._form.thumbnailAssetId === assetId) {
|
|
132
|
+
this._form.thumbnailAssetId = null;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
setThumbnailAsset(assetId) {
|
|
136
|
+
this._form.thumbnailAssetId = assetId;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
export function createContentEditorState(options = {}) {
|
|
140
|
+
return new ContentEditorState(options);
|
|
141
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { ApiResponse, ContentGovernanceAssignmentData, ContentGovernanceDefinitionsData, ContentGovernanceProfileData, ContentReviewPolicyData } from '../mock-smrt-client';
|
|
2
|
+
export interface ContentGovernanceManagerClient {
|
|
3
|
+
contents: {
|
|
4
|
+
getGovernanceDefinitions: () => Promise<ApiResponse<ContentGovernanceDefinitionsData>>;
|
|
5
|
+
};
|
|
6
|
+
contentGovernancePolicies: {
|
|
7
|
+
create: (data: Partial<ContentReviewPolicyData>) => Promise<ApiResponse<ContentReviewPolicyData>>;
|
|
8
|
+
update: (id: string, data: Partial<ContentReviewPolicyData>) => Promise<ApiResponse<ContentReviewPolicyData>>;
|
|
9
|
+
delete: (id: string) => Promise<ApiResponse<void>>;
|
|
10
|
+
};
|
|
11
|
+
contentGovernanceProfiles: {
|
|
12
|
+
create: (data: Partial<ContentGovernanceProfileData>) => Promise<ApiResponse<ContentGovernanceProfileData>>;
|
|
13
|
+
update: (id: string, data: Partial<ContentGovernanceProfileData>) => Promise<ApiResponse<ContentGovernanceProfileData>>;
|
|
14
|
+
delete: (id: string) => Promise<ApiResponse<void>>;
|
|
15
|
+
};
|
|
16
|
+
contentGovernanceAssignments: {
|
|
17
|
+
create: (data: Partial<ContentGovernanceAssignmentData>) => Promise<ApiResponse<ContentGovernanceAssignmentData>>;
|
|
18
|
+
update: (id: string, data: Partial<ContentGovernanceAssignmentData>) => Promise<ApiResponse<ContentGovernanceAssignmentData>>;
|
|
19
|
+
delete: (id: string) => Promise<ApiResponse<void>>;
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=governance-manager-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"governance-manager-client.d.ts","sourceRoot":"","sources":["../../src/svelte/governance-manager-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,+BAA+B,EAC/B,gCAAgC,EAChC,4BAA4B,EAC5B,uBAAuB,EACxB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,EAAE;QACR,wBAAwB,EAAE,MAAM,OAAO,CACrC,WAAW,CAAC,gCAAgC,CAAC,CAC9C,CAAC;KACH,CAAC;IACF,yBAAyB,EAAE;QACzB,MAAM,EAAE,CACN,IAAI,EAAE,OAAO,CAAC,uBAAuB,CAAC,KACnC,OAAO,CAAC,WAAW,CAAC,uBAAuB,CAAC,CAAC,CAAC;QACnD,MAAM,EAAE,CACN,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,OAAO,CAAC,uBAAuB,CAAC,KACnC,OAAO,CAAC,WAAW,CAAC,uBAAuB,CAAC,CAAC,CAAC;QACnD,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;KACpD,CAAC;IACF,yBAAyB,EAAE;QACzB,MAAM,EAAE,CACN,IAAI,EAAE,OAAO,CAAC,4BAA4B,CAAC,KACxC,OAAO,CAAC,WAAW,CAAC,4BAA4B,CAAC,CAAC,CAAC;QACxD,MAAM,EAAE,CACN,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,OAAO,CAAC,4BAA4B,CAAC,KACxC,OAAO,CAAC,WAAW,CAAC,4BAA4B,CAAC,CAAC,CAAC;QACxD,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;KACpD,CAAC;IACF,4BAA4B,EAAE;QAC5B,MAAM,EAAE,CACN,IAAI,EAAE,OAAO,CAAC,+BAA+B,CAAC,KAC3C,OAAO,CAAC,WAAW,CAAC,+BAA+B,CAAC,CAAC,CAAC;QAC3D,MAAM,EAAE,CACN,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,OAAO,CAAC,+BAA+B,CAAC,KAC3C,OAAO,CAAC,WAAW,CAAC,+BAA+B,CAAC,CAAC,CAAC;QAC3D,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;KACpD,CAAC;CACH"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|