@happyvertical/smrt-content 0.51.39 → 0.53.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 +6 -0
- package/README.md +86 -0
- package/dist/body-format.d.ts +104 -0
- package/dist/body-format.d.ts.map +1 -1
- package/dist/body-format.js +439 -48
- package/dist/body-format.js.map +1 -1
- package/dist/chunks/content-query-C6RcW8V_.js +4131 -0
- package/dist/chunks/content-query-C6RcW8V_.js.map +1 -0
- package/dist/chunks/{content-versions-CvOoDLSK.js → content-versions-HUeMI1TV.js} +2 -2
- package/dist/chunks/{content-versions-CvOoDLSK.js.map → content-versions-HUeMI1TV.js.map} +1 -1
- package/dist/chunks/{contents-BB7RIBx2.js → contents-CHa5soKR.js} +4 -6
- package/dist/chunks/contents-CHa5soKR.js.map +1 -0
- package/dist/content-query.d.ts.map +1 -1
- package/dist/content.d.ts +13 -1
- package/dist/content.d.ts.map +1 -1
- package/dist/contents.d.ts.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -6
- package/dist/manifest.json +113 -23
- package/dist/server/content-list-data-surface.d.ts +1 -1
- package/dist/server/content-list-data-surface.d.ts.map +1 -1
- package/dist/server.js +3 -3
- package/dist/server.js.map +1 -1
- package/dist/smrt-knowledge.json +92 -10
- package/dist/svelte/components/ContentBodyEditor.svelte +898 -38
- package/dist/svelte/components/ContentBodyEditor.svelte.d.ts +67 -0
- package/dist/svelte/components/ContentBodyEditor.svelte.d.ts.map +1 -1
- package/dist/svelte/components/ContentBodyRenderer.svelte +36 -11
- package/dist/svelte/components/ContentBodyRenderer.svelte.d.ts +2 -0
- package/dist/svelte/components/ContentBodyRenderer.svelte.d.ts.map +1 -1
- package/dist/svelte/components/ContentClaimAuditTool.svelte +45 -2
- package/dist/svelte/components/ContentCorrectionsTool.svelte +24 -2
- package/dist/svelte/components/ContentEditor.svelte +67 -17
- package/dist/svelte/components/ContentEditor.svelte.d.ts +12 -0
- package/dist/svelte/components/ContentEditor.svelte.d.ts.map +1 -1
- package/dist/svelte/components/ContentGovernancePanel.svelte +4 -2
- package/dist/svelte/components/ContentMetadataFields.svelte +141 -51
- package/dist/svelte/components/ContentMetadataFields.svelte.d.ts +20 -0
- package/dist/svelte/components/ContentMetadataFields.svelte.d.ts.map +1 -1
- package/dist/svelte/components/ContentPictureDrawer.svelte +611 -0
- package/dist/svelte/components/ContentPictureDrawer.svelte.d.ts +68 -0
- package/dist/svelte/components/ContentPictureDrawer.svelte.d.ts.map +1 -0
- package/dist/svelte/components/ContentReviewStatusTray.svelte +2 -2
- package/dist/svelte/components/ContentStatusFields.svelte +85 -38
- package/dist/svelte/components/ContentStatusFields.svelte.d.ts +10 -0
- package/dist/svelte/components/ContentStatusFields.svelte.d.ts.map +1 -1
- package/dist/svelte/components/ContentTitleField.svelte +109 -12
- package/dist/svelte/components/ContentTitleField.svelte.d.ts +12 -0
- package/dist/svelte/components/ContentTitleField.svelte.d.ts.map +1 -1
- package/dist/svelte/components/ContentTransparencyReport.svelte +3 -1
- package/dist/svelte/components/ContentTransparencyTool.svelte +18 -3
- package/dist/svelte/components/ContentVersionsTool.svelte +26 -2
- package/dist/svelte/components/content-field-mode.d.ts +20 -0
- package/dist/svelte/components/content-field-mode.d.ts.map +1 -0
- package/dist/svelte/components/content-field-mode.js +26 -0
- package/dist/svelte/content-editor-media.d.ts +14 -0
- package/dist/svelte/content-editor-media.d.ts.map +1 -1
- package/dist/svelte/content-editor-media.js +41 -0
- package/dist/svelte/content-editor-state.svelte.d.ts +17 -0
- package/dist/svelte/content-editor-state.svelte.d.ts.map +1 -1
- package/dist/svelte/content-editor-state.svelte.js +46 -0
- package/dist/svelte/i18n.editor.d.ts +49 -0
- package/dist/svelte/i18n.editor.d.ts.map +1 -1
- package/dist/svelte/i18n.editor.js +53 -1
- package/dist/svelte/index.d.ts +10 -5
- package/dist/svelte/index.d.ts.map +1 -1
- package/dist/svelte/index.js +5 -3
- package/package.json +27 -25
- package/dist/chunks/content-query-DPJCcD1V.js +0 -4092
- package/dist/chunks/content-query-DPJCcD1V.js.map +0 -1
- package/dist/chunks/contents-BB7RIBx2.js.map +0 -1
|
@@ -1,17 +1,53 @@
|
|
|
1
1
|
import type { ImageLike } from '@happyvertical/smrt-images/svelte';
|
|
2
|
+
import { type Snippet } from 'svelte';
|
|
2
3
|
import { type ContentBodyFormat, type ContentBodyImage, type ImageAssetLike } from '../../body-format';
|
|
3
4
|
export interface ContentBodyEditorChange {
|
|
4
5
|
body: string;
|
|
5
6
|
bodyFormat: ContentBodyFormat;
|
|
6
7
|
images: ContentBodyImage[];
|
|
7
8
|
}
|
|
9
|
+
/** The person asked to change a picture in the story (see `onRequestImageChange`). */
|
|
10
|
+
export interface ContentBodyImageChangeRequest {
|
|
11
|
+
/** The picture's index among the body's images. */
|
|
12
|
+
index: number;
|
|
13
|
+
/** Its stored asset id, when it has one. */
|
|
14
|
+
assetId: string | null;
|
|
15
|
+
/** Its alt text. */
|
|
16
|
+
alt: string;
|
|
17
|
+
/** Its source URL as shown in the editor. */
|
|
18
|
+
src: string;
|
|
19
|
+
/**
|
|
20
|
+
* True when it came from pressing and holding the picture: the host opens
|
|
21
|
+
* its request box already listening for speech.
|
|
22
|
+
*/
|
|
23
|
+
listen: boolean;
|
|
24
|
+
/** Where the picture is on screen (viewport pixels), to anchor a popover. */
|
|
25
|
+
rect: {
|
|
26
|
+
top: number;
|
|
27
|
+
left: number;
|
|
28
|
+
width: number;
|
|
29
|
+
height: number;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
8
32
|
export interface Props {
|
|
9
33
|
/** The body content string being edited, in HTML or the configured format. */
|
|
10
34
|
value: string;
|
|
11
35
|
/** Format of the body content: HTML, Markdown, or auto-detected. */
|
|
12
36
|
format?: ContentBodyFormat | null;
|
|
37
|
+
/**
|
|
38
|
+
* Show the "Save as" HTML/Markdown picker in the toolbar. Off by default:
|
|
39
|
+
* the storage format is a technical choice most editors should not face, so
|
|
40
|
+
* hosts opt in for technical users. The body keeps its `format` either way.
|
|
41
|
+
*/
|
|
42
|
+
showFormatPicker?: boolean;
|
|
13
43
|
/** Placeholder text shown when the editor is empty. */
|
|
14
44
|
placeholder?: string;
|
|
45
|
+
/** DOM id of the editable surface (default `content-body-input`). */
|
|
46
|
+
id?: string;
|
|
47
|
+
/** Field name; also the control id agents address (default `body`). */
|
|
48
|
+
name?: string;
|
|
49
|
+
/** Accessible and agent-facing label (default "Story"). */
|
|
50
|
+
label?: string;
|
|
15
51
|
/** Index of the currently selected image in the body, or -1 for none. */
|
|
16
52
|
selectedImageIndex?: number;
|
|
17
53
|
/** Fired when the body content or embedded images change. */
|
|
@@ -22,11 +58,42 @@ export interface Props {
|
|
|
22
58
|
onSelectImage?: (index: number) => void;
|
|
23
59
|
/** Fired when the user sets an image as the content thumbnail. */
|
|
24
60
|
onUseImageAsThumbnail?: (assetId: string) => void;
|
|
61
|
+
/**
|
|
62
|
+
* Asset id of the current main picture (thumbnail). The selected image's
|
|
63
|
+
* "Use as main picture" button shows as pressed when it is this one.
|
|
64
|
+
*/
|
|
65
|
+
mainImageAssetId?: string | null;
|
|
25
66
|
/** Resolves an image file, asset, or ID to a persisted image URL or object. */
|
|
26
67
|
onResolveImage?: (selected: ImageLike | File | string) => Promise<unknown> | unknown;
|
|
68
|
+
/**
|
|
69
|
+
* The image panel (chooser/editor) the toolbar's image button opens. When
|
|
70
|
+
* provided it renders between the toolbar and the writing surface, sliding
|
|
71
|
+
* open above the text, and the image button reports `aria-expanded` /
|
|
72
|
+
* `aria-controls`. Without it the button only fires `onOpenImageChooser`.
|
|
73
|
+
*/
|
|
74
|
+
imagePanel?: Snippet;
|
|
75
|
+
/** Whether the image panel is open (controlled by the parent). */
|
|
76
|
+
imagePanelOpen?: boolean;
|
|
77
|
+
/** Accessible name of the image panel region (default "Pictures"). */
|
|
78
|
+
imagePanelLabel?: string;
|
|
79
|
+
/** Fired when the panel asks to close (Escape inside it). */
|
|
80
|
+
onCloseImagePanel?: () => void;
|
|
81
|
+
/**
|
|
82
|
+
* The person wants a picture changed. With it, a selected or hovered
|
|
83
|
+
* picture shows a "Change this picture" button, the picture toolbar gets
|
|
84
|
+
* one too, and pressing and holding a picture (about half a second, without
|
|
85
|
+
* moving; moving is still a drag) asks with `listen: true`. Without it
|
|
86
|
+
* none of these show.
|
|
87
|
+
*/
|
|
88
|
+
onRequestImageChange?: (request: ContentBodyImageChangeRequest) => void;
|
|
27
89
|
}
|
|
28
90
|
declare const ContentBodyEditor: import("svelte").Component<Props, {
|
|
29
91
|
insertImageAsset: (asset: ImageAssetLike | null | undefined) => void;
|
|
92
|
+
replaceImage: (index: number, asset: (ImageAssetLike & {
|
|
93
|
+
height?: unknown;
|
|
94
|
+
}) | null | undefined) => boolean;
|
|
95
|
+
previewImage: (index: number, src: string | null) => boolean;
|
|
96
|
+
clearImagePreviews: () => void;
|
|
30
97
|
focusImage: (index: number) => void;
|
|
31
98
|
}, "">;
|
|
32
99
|
type ContentBodyEditor = ReturnType<typeof ContentBodyEditor>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContentBodyEditor.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/components/ContentBodyEditor.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"ContentBodyEditor.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/components/ContentBodyEditor.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC;AAYnE,OAAO,EAAa,KAAK,OAAO,EAAE,MAAM,QAAQ,CAAC;AAEjD,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EAIrB,KAAK,cAAc,EAIpB,MAAM,mBAAmB,CAAC;AAI3B,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,iBAAiB,CAAC;IAC9B,MAAM,EAAE,gBAAgB,EAAE,CAAC;CAC5B;AAED,sFAAsF;AACtF,MAAM,WAAW,6BAA6B;IAC5C,mDAAmD;IACnD,KAAK,EAAE,MAAM,CAAC;IACd,4CAA4C;IAC5C,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,oBAAoB;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,6CAA6C;IAC7C,GAAG,EAAE,MAAM,CAAC;IACZ;;;OAGG;IACH,MAAM,EAAE,OAAO,CAAC;IAChB,6EAA6E;IAC7E,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CACpE;AAED,MAAM,WAAW,KAAK;IACpB,8EAA8E;IAC9E,KAAK,EAAE,MAAM,CAAC;IACd,oEAAoE;IACpE,MAAM,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAClC;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,uDAAuD;IACvD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qEAAqE;IACrE,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,uEAAuE;IACvE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2DAA2D;IAC3D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yEAAyE;IACzE,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,uBAAuB,KAAK,IAAI,CAAC;IACrD,4DAA4D;IAC5D,kBAAkB,CAAC,EAAE,MAAM,IAAI,CAAC;IAChC,4DAA4D;IAC5D,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,kEAAkE;IAClE,qBAAqB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAClD;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,+EAA+E;IAC/E,cAAc,CAAC,EAAE,CACf,QAAQ,EAAE,SAAS,GAAG,IAAI,GAAG,MAAM,KAChC,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IAChC;;;;;OAKG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,kEAAkE;IAClE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,sEAAsE;IACtE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,6DAA6D;IAC7D,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC/B;;;;;;OAMG;IACH,oBAAoB,CAAC,EAAE,CAAC,OAAO,EAAE,6BAA6B,KAAK,IAAI,CAAC;CACzE;AA6rDD,QAAA,MAAM,iBAAiB;8BAn4BW,cAAc,GAAG,IAAI,GAAG,SAAS;0BAW1D,MAAM,SACN,CAAC,cAAc,GAAG;QAAE,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,GAAG,IAAI,GAAG,SAAS,KAChE,OAAO;0BA+BoB,MAAM,OAAO,MAAM,GAAG,IAAI,KAAG,OAAO;;wBA+BtC,MAAM;MAwzB6B,CAAC;AAChE,KAAK,iBAAiB,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC9D,eAAe,iBAAiB,CAAC"}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import {
|
|
3
3
|
type ContentBodyFormat,
|
|
4
|
+
renderContentBodyHtml,
|
|
4
5
|
resolveBodyFormat,
|
|
5
|
-
sanitizeHtml,
|
|
6
6
|
} from '../../body-format';
|
|
7
|
-
import Markdown from './Markdown.svelte';
|
|
8
7
|
|
|
9
8
|
export interface Props {
|
|
10
9
|
/** The body content to render as HTML or Markdown. */
|
|
@@ -13,21 +12,31 @@ export interface Props {
|
|
|
13
12
|
format?: ContentBodyFormat | null;
|
|
14
13
|
/** CSS class to apply to the rendered container. */
|
|
15
14
|
class?: string;
|
|
15
|
+
/** Replace the thumbnail block's image URL (see `renderContentBodyHtml`). */
|
|
16
|
+
thumbnailSrc?: string | null;
|
|
16
17
|
}
|
|
17
18
|
|
|
18
|
-
let {
|
|
19
|
+
let {
|
|
20
|
+
content,
|
|
21
|
+
format = null,
|
|
22
|
+
class: className = '',
|
|
23
|
+
thumbnailSrc = null,
|
|
24
|
+
}: Props = $props();
|
|
19
25
|
|
|
20
26
|
const resolvedFormat = $derived(resolveBodyFormat(format, content));
|
|
21
|
-
|
|
27
|
+
// Both formats render through the same sanitizer and into the same container,
|
|
28
|
+
// so image placements (header, wrap left/right) look identical whichever
|
|
29
|
+
// format the body was saved in.
|
|
30
|
+
const safeHtml = $derived(
|
|
31
|
+
renderContentBodyHtml(content || '', resolvedFormat, { thumbnailSrc }),
|
|
32
|
+
);
|
|
22
33
|
</script>
|
|
23
34
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
</div>
|
|
30
|
-
{/if}
|
|
35
|
+
<div
|
|
36
|
+
class="content-body-renderer {resolvedFormat === 'markdown' ? 'markdown-content' : ''} {className}"
|
|
37
|
+
>
|
|
38
|
+
{@html safeHtml}
|
|
39
|
+
</div>
|
|
31
40
|
|
|
32
41
|
<style>
|
|
33
42
|
.content-body-renderer {
|
|
@@ -152,4 +161,20 @@ const safeHtml = $derived(sanitizeHtml(content || ''));
|
|
|
152
161
|
.content-body-renderer :global(img[data-smrt-inline-image][data-smrt-placement='right']) {
|
|
153
162
|
width: min(45%, 22rem);
|
|
154
163
|
}
|
|
164
|
+
|
|
165
|
+
.content-body-renderer :global(img[data-smrt-thumbnail][data-smrt-placement='right']) {
|
|
166
|
+
margin-top: 0.25rem;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/* Phones: wrapped images stack full width above the text they sat beside. */
|
|
170
|
+
@media (max-width: 36rem) {
|
|
171
|
+
.content-body-renderer :global(figure[data-smrt-placement='left']),
|
|
172
|
+
.content-body-renderer :global(figure[data-smrt-placement='right']),
|
|
173
|
+
.content-body-renderer :global(img[data-smrt-placement='left']),
|
|
174
|
+
.content-body-renderer :global(img[data-smrt-placement='right']) {
|
|
175
|
+
float: none;
|
|
176
|
+
width: 100% !important;
|
|
177
|
+
margin: var(--spacing-md, 0.75rem) 0;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
155
180
|
</style>
|
|
@@ -6,6 +6,8 @@ export interface Props {
|
|
|
6
6
|
format?: ContentBodyFormat | null;
|
|
7
7
|
/** CSS class to apply to the rendered container. */
|
|
8
8
|
class?: string;
|
|
9
|
+
/** Replace the thumbnail block's image URL (see `renderContentBodyHtml`). */
|
|
10
|
+
thumbnailSrc?: string | null;
|
|
9
11
|
}
|
|
10
12
|
declare const ContentBodyRenderer: import("svelte").Component<Props, {}, "">;
|
|
11
13
|
type ContentBodyRenderer = ReturnType<typeof ContentBodyRenderer>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContentBodyRenderer.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/components/ContentBodyRenderer.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,KAAK,iBAAiB,EAGvB,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"ContentBodyRenderer.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/components/ContentBodyRenderer.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,KAAK,iBAAiB,EAGvB,MAAM,mBAAmB,CAAC;AAG3B,MAAM,WAAW,KAAK;IACpB,sDAAsD;IACtD,OAAO,EAAE,MAAM,CAAC;IAChB,uEAAuE;IACvE,MAAM,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAClC,oDAAoD;IACpD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6EAA6E;IAC7E,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AA6BD,QAAA,MAAM,mBAAmB,2CAAwC,CAAC;AAClE,KAAK,mBAAmB,GAAG,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAClE,eAAe,mBAAmB,CAAC"}
|
|
@@ -320,6 +320,13 @@ async function recheckFactClaims(claimIds: string[]) {
|
|
|
320
320
|
</div>
|
|
321
321
|
|
|
322
322
|
<style>
|
|
323
|
+
/* The tool lays itself out by its own width, not the viewport, so it
|
|
324
|
+
fits a full page, a side panel, the assistant dock or a phone. */
|
|
325
|
+
.governance-tool {
|
|
326
|
+
container-type: inline-size;
|
|
327
|
+
container-name: governance-tool;
|
|
328
|
+
}
|
|
329
|
+
|
|
323
330
|
.governance-tool,
|
|
324
331
|
.tool-list,
|
|
325
332
|
.tool-card-body {
|
|
@@ -349,9 +356,10 @@ async function recheckFactClaims(claimIds: string[]) {
|
|
|
349
356
|
}
|
|
350
357
|
|
|
351
358
|
.tool-card {
|
|
352
|
-
border: 1px solid var(--smrt-color-outline-variant);
|
|
359
|
+
border: var(--smrt-card-border, 1px solid var(--smrt-color-outline-variant));
|
|
360
|
+
box-shadow: var(--smrt-card-shadow, none);
|
|
353
361
|
border-radius: 0.65rem;
|
|
354
|
-
background: var(--smrt-color-surface);
|
|
362
|
+
background: var(--smrt-card-background, var(--smrt-color-surface));
|
|
355
363
|
padding: 0.75rem;
|
|
356
364
|
}
|
|
357
365
|
|
|
@@ -433,4 +441,39 @@ async function recheckFactClaims(claimIds: string[]) {
|
|
|
433
441
|
background: color-mix(in srgb, var(--smrt-color-warning) 12%, transparent);
|
|
434
442
|
color: var(--smrt-color-on-warning-container);
|
|
435
443
|
}
|
|
444
|
+
|
|
445
|
+
.claim-audit-select {
|
|
446
|
+
min-width: 2.75rem;
|
|
447
|
+
min-height: 2.75rem;
|
|
448
|
+
align-items: center;
|
|
449
|
+
justify-content: center;
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
.tool-card summary {
|
|
453
|
+
min-height: 2.75rem;
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
.tool-card.nested {
|
|
457
|
+
background: color-mix(in srgb, var(--smrt-color-on-surface) 6%, transparent);
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
@container governance-tool (max-width: 30rem) {
|
|
461
|
+
.claim-audit-toolbar {
|
|
462
|
+
flex-direction: column;
|
|
463
|
+
align-items: stretch;
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
.claim-audit-toolbar :global(button),
|
|
467
|
+
.claim-audit-actions :global(button) {
|
|
468
|
+
width: 100%;
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
.claim-audit-actions {
|
|
472
|
+
justify-content: stretch;
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
.tool-card summary {
|
|
476
|
+
flex-wrap: wrap;
|
|
477
|
+
}
|
|
478
|
+
}
|
|
436
479
|
</style>
|
|
@@ -254,6 +254,13 @@ async function issueCorrection() {
|
|
|
254
254
|
</div>
|
|
255
255
|
|
|
256
256
|
<style>
|
|
257
|
+
/* The tool lays itself out by its own width, not the viewport, so it
|
|
258
|
+
fits a full page, a side panel, the assistant dock or a phone. */
|
|
259
|
+
.governance-tool {
|
|
260
|
+
container-type: inline-size;
|
|
261
|
+
container-name: governance-tool;
|
|
262
|
+
}
|
|
263
|
+
|
|
257
264
|
.governance-tool,
|
|
258
265
|
.tool-list,
|
|
259
266
|
.workflow-field {
|
|
@@ -272,8 +279,9 @@ async function issueCorrection() {
|
|
|
272
279
|
display: flex;
|
|
273
280
|
flex-direction: column;
|
|
274
281
|
gap: 0.4rem;
|
|
275
|
-
background: var(--smrt-color-surface);
|
|
276
|
-
border: 1px solid var(--smrt-color-outline-variant);
|
|
282
|
+
background: var(--smrt-card-background, var(--smrt-color-surface));
|
|
283
|
+
border: var(--smrt-card-border, 1px solid var(--smrt-color-outline-variant));
|
|
284
|
+
box-shadow: var(--smrt-card-shadow, none);
|
|
277
285
|
border-radius: 0.75rem;
|
|
278
286
|
padding: 0.85rem;
|
|
279
287
|
}
|
|
@@ -340,4 +348,18 @@ async function issueCorrection() {
|
|
|
340
348
|
background: color-mix(in srgb, var(--smrt-color-primary) 10%, transparent);
|
|
341
349
|
color: var(--smrt-color-on-primary-container);
|
|
342
350
|
}
|
|
351
|
+
|
|
352
|
+
.checkbox-row {
|
|
353
|
+
min-height: 2.75rem;
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
@container governance-tool (max-width: 30rem) {
|
|
357
|
+
.governance-tool > :global(button) {
|
|
358
|
+
width: 100%;
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
.tool-card-header {
|
|
362
|
+
flex-wrap: wrap;
|
|
363
|
+
}
|
|
364
|
+
}
|
|
343
365
|
</style>
|
|
@@ -43,6 +43,7 @@ import ContentBodyEditor, {
|
|
|
43
43
|
type ContentBodyEditorChange,
|
|
44
44
|
} from './ContentBodyEditor.svelte';
|
|
45
45
|
import ContentImageChooser from './ContentImageChooser.svelte';
|
|
46
|
+
import type { ContentFieldMode } from './content-field-mode.js';
|
|
46
47
|
|
|
47
48
|
const { t } = useI18n();
|
|
48
49
|
|
|
@@ -67,6 +68,11 @@ export interface Props {
|
|
|
67
68
|
hideActions?: boolean;
|
|
68
69
|
/** Hide the AI chat sidebar completely. */
|
|
69
70
|
hideChat?: boolean;
|
|
71
|
+
/**
|
|
72
|
+
* Show the body editor's "Save as" HTML/Markdown picker. Off by default:
|
|
73
|
+
* the storage format is a technical choice most editors should not face.
|
|
74
|
+
*/
|
|
75
|
+
showBodyFormatPicker?: boolean;
|
|
70
76
|
/** Policy object defining which fields the assistant can modify. */
|
|
71
77
|
assistantFieldAllowList?: ContentEditorAssistantFieldUpdateAllowList;
|
|
72
78
|
/** Fired when the assistant context changes (for session tracking). */
|
|
@@ -79,6 +85,12 @@ export interface Props {
|
|
|
79
85
|
onSave: (data: ContentEditorSavePayload) => void;
|
|
80
86
|
/** Fired when the user cancels editing without saving. */
|
|
81
87
|
onCancel: () => void;
|
|
88
|
+
/**
|
|
89
|
+
* `full` (default) shows every field. `simple` is for everyday editors:
|
|
90
|
+
* Type, State and References are hidden, Metadata becomes a collapsed
|
|
91
|
+
* "Details" section, and optional fields say so.
|
|
92
|
+
*/
|
|
93
|
+
mode?: ContentFieldMode;
|
|
82
94
|
}
|
|
83
95
|
|
|
84
96
|
let {
|
|
@@ -92,14 +104,23 @@ let {
|
|
|
92
104
|
agentChatNotice = null,
|
|
93
105
|
hideActions = false,
|
|
94
106
|
hideChat = false,
|
|
107
|
+
showBodyFormatPicker = false,
|
|
95
108
|
assistantFieldAllowList = {},
|
|
96
109
|
onAssistantContextChange = undefined,
|
|
97
110
|
onChange = undefined,
|
|
98
111
|
onFactAuditChange = undefined,
|
|
99
112
|
onSave,
|
|
100
113
|
onCancel,
|
|
114
|
+
mode = 'full',
|
|
101
115
|
}: Props = $props();
|
|
102
116
|
|
|
117
|
+
const simpleMode = $derived(mode === 'simple');
|
|
118
|
+
function optionalLabel(label: string): string {
|
|
119
|
+
return simpleMode
|
|
120
|
+
? t(M['content.content_fields.optional'], { label })
|
|
121
|
+
: label;
|
|
122
|
+
}
|
|
123
|
+
|
|
103
124
|
// Unique per-instance form id so triggerSave() targets THIS editor's form even
|
|
104
125
|
// when multiple ContentEditor / GovernedContentEditor instances are mounted
|
|
105
126
|
// (a hardcoded id + getElementById would resolve to the first match in the DOM).
|
|
@@ -906,6 +927,19 @@ function handleImageSelect(selected: ImageLike | File | string) {
|
|
|
906
927
|
})();
|
|
907
928
|
}
|
|
908
929
|
|
|
930
|
+
// An attached picture whose file or row is gone is left out of the media
|
|
931
|
+
// list (with a console warning) instead of showing a broken image.
|
|
932
|
+
let brokenAssetImages = $state<Record<string, true>>({});
|
|
933
|
+
|
|
934
|
+
function hideBrokenAssetImage(assetId: string) {
|
|
935
|
+
if (!assetId || brokenAssetImages[assetId]) return;
|
|
936
|
+
console.warn(
|
|
937
|
+
'[ContentEditor] Leaving out an attached picture that could not be loaded',
|
|
938
|
+
assetId,
|
|
939
|
+
);
|
|
940
|
+
brokenAssetImages = { ...brokenAssetImages, [assetId]: true };
|
|
941
|
+
}
|
|
942
|
+
|
|
909
943
|
function getAssetImageSource(asset: ContentEditorAsset): string {
|
|
910
944
|
return String(asset?.sourceUri || asset?.url || asset?.src || '');
|
|
911
945
|
}
|
|
@@ -1009,8 +1043,9 @@ function removeAsset(id: string) {
|
|
|
1009
1043
|
{/if}
|
|
1010
1044
|
<div class="editor-toolbar">
|
|
1011
1045
|
<div class="editor-toolbar-left">
|
|
1046
|
+
{#if !simpleMode}
|
|
1012
1047
|
<div class="mui-field">
|
|
1013
|
-
<Select id="type-select" bind:value={formData.type} class="mui-input">
|
|
1048
|
+
<Select id="type-select" name="type" bind:value={formData.type} class="mui-input">
|
|
1014
1049
|
<option value="article">Article</option>
|
|
1015
1050
|
<option value="document">Document</option>
|
|
1016
1051
|
<option value="mirror">Mirror</option>
|
|
@@ -1018,15 +1053,16 @@ function removeAsset(id: string) {
|
|
|
1018
1053
|
<label for="type-select">Type</label>
|
|
1019
1054
|
</div>
|
|
1020
1055
|
<div class="mui-field">
|
|
1021
|
-
<Select id="state-select" bind:value={formData.state} class="mui-input">
|
|
1056
|
+
<Select id="state-select" name="state" bind:value={formData.state} class="mui-input">
|
|
1022
1057
|
<option value="active">Active</option>
|
|
1023
1058
|
<option value="highlighted">Highlighted</option>
|
|
1024
1059
|
<option value="deprecated">Deprecated</option>
|
|
1025
1060
|
</Select>
|
|
1026
1061
|
<label for="state-select">State</label>
|
|
1027
1062
|
</div>
|
|
1063
|
+
{/if}
|
|
1028
1064
|
<div class="mui-field">
|
|
1029
|
-
<Select id="status-select" bind:value={formData.status} class="mui-input">
|
|
1065
|
+
<Select id="status-select" name="status" aria-label={t(M['content.content_fields.status'])} bind:value={formData.status} class="mui-input">
|
|
1030
1066
|
<option value="draft">Draft</option>
|
|
1031
1067
|
<option value="published">Published</option>
|
|
1032
1068
|
<option value="archived">Archived</option>
|
|
@@ -1034,8 +1070,8 @@ function removeAsset(id: string) {
|
|
|
1034
1070
|
<label for="status-select">Status</label>
|
|
1035
1071
|
</div>
|
|
1036
1072
|
<div class="mui-field">
|
|
1037
|
-
<Input id="publish-date-input" type="datetime-local" bind:value={formData.publish_date} class="mui-input" />
|
|
1038
|
-
<label for="publish-date-input">{t(M['content.content_editor.publish_date'])}</label>
|
|
1073
|
+
<Input id="publish-date-input" name="publish_date" aria-label={simpleMode ? optionalLabel(t(M['content.content_fields.publish_date'])) : t(M['content.content_editor.publish_date'])} type="datetime-local" bind:value={formData.publish_date} class="mui-input" />
|
|
1074
|
+
<label for="publish-date-input">{simpleMode ? optionalLabel(t(M['content.content_fields.publish_date'])) : t(M['content.content_editor.publish_date'])}</label>
|
|
1039
1075
|
</div>
|
|
1040
1076
|
</div>
|
|
1041
1077
|
{#if showActions}
|
|
@@ -1054,6 +1090,8 @@ function removeAsset(id: string) {
|
|
|
1054
1090
|
|
|
1055
1091
|
<Input
|
|
1056
1092
|
type="text"
|
|
1093
|
+
name="title"
|
|
1094
|
+
aria-label={t(M['content.content_fields.title'])}
|
|
1057
1095
|
class="document-title-input"
|
|
1058
1096
|
bind:value={formData.title}
|
|
1059
1097
|
placeholder={t(M['content.content_editor.document_title_placeholder'])}
|
|
@@ -1085,6 +1123,7 @@ function removeAsset(id: string) {
|
|
|
1085
1123
|
bind:this={bodyEditor}
|
|
1086
1124
|
value={formData.body || ''}
|
|
1087
1125
|
format={formData.bodyFormat}
|
|
1126
|
+
showFormatPicker={showBodyFormatPicker}
|
|
1088
1127
|
selectedImageIndex={selectedBodyImageIndex}
|
|
1089
1128
|
onChange={handleBodyChange}
|
|
1090
1129
|
onOpenImageChooser={() => showInlineImageUploader = !showInlineImageUploader}
|
|
@@ -1139,6 +1178,7 @@ function removeAsset(id: string) {
|
|
|
1139
1178
|
<div class="media-grid">
|
|
1140
1179
|
{#each formData.assets as asset, index (asset.id || `asset-${index}`)}
|
|
1141
1180
|
{@const assetId = typeof asset.id === 'string' ? asset.id : ''}
|
|
1181
|
+
{#if !(assetId && brokenAssetImages[assetId])}
|
|
1142
1182
|
<div
|
|
1143
1183
|
class="media-item"
|
|
1144
1184
|
class:is-thumbnail={assetId === formData.thumbnailAssetId}
|
|
@@ -1146,7 +1186,12 @@ function removeAsset(id: string) {
|
|
|
1146
1186
|
title={t(M['content.content_editor.drag_into_body'])}
|
|
1147
1187
|
ondragstart={(event) => handleAttachedImageDragStart(event, asset)}
|
|
1148
1188
|
>
|
|
1149
|
-
<img
|
|
1189
|
+
<img
|
|
1190
|
+
class="media-item-image"
|
|
1191
|
+
src={getAssetImageSource(asset)}
|
|
1192
|
+
alt={asset.name || 'Asset image'}
|
|
1193
|
+
onerror={() => hideBrokenAssetImage(assetId)}
|
|
1194
|
+
/>
|
|
1150
1195
|
<div class="media-item-overlay">
|
|
1151
1196
|
{#if assetId && assetId !== formData.thumbnailAssetId}
|
|
1152
1197
|
<Button variant="ghost" size="sm" type="button" class="btn-make-thumbnail" aria-label={t(M['content.content_editor.make_thumbnail'])} title={t(M['content.content_editor.make_thumbnail'])} onclick={() => setThumbnail(assetId)}>
|
|
@@ -1163,6 +1208,7 @@ function removeAsset(id: string) {
|
|
|
1163
1208
|
<div class="thumbnail-badge">Thumbnail</div>
|
|
1164
1209
|
{/if}
|
|
1165
1210
|
</div>
|
|
1211
|
+
{/if}
|
|
1166
1212
|
{/each}
|
|
1167
1213
|
</div>
|
|
1168
1214
|
{:else}
|
|
@@ -1193,25 +1239,27 @@ function removeAsset(id: string) {
|
|
|
1193
1239
|
</div>
|
|
1194
1240
|
</details>
|
|
1195
1241
|
|
|
1196
|
-
<!-- Metadata Panel -->
|
|
1197
|
-
<details class="editor-drawer" open>
|
|
1242
|
+
<!-- Metadata Panel ("Details", collapsed, in simple mode) -->
|
|
1243
|
+
<details class="editor-drawer" open={!simpleMode}>
|
|
1198
1244
|
<summary class="editor-drawer-header">
|
|
1199
|
-
Metadata
|
|
1245
|
+
{#if simpleMode}{t(M['content.content_fields.details'])}{:else}Metadata{/if}
|
|
1200
1246
|
<svg class="drawer-icon" viewBox="0 0 24 24" width="20" height="20" stroke="currentColor" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"><polyline points="6 9 12 15 18 9"></polyline></svg>
|
|
1201
1247
|
</summary>
|
|
1202
1248
|
<div class="editor-drawer-content">
|
|
1203
1249
|
<label>
|
|
1204
|
-
Author:
|
|
1205
|
-
<Input type="text" bind:value={formData.author} placeholder={t(M['content.content_editor.author_name_placeholder'])} />
|
|
1250
|
+
{simpleMode ? optionalLabel(t(M['content.content_fields.author'])) : 'Author:'}
|
|
1251
|
+
<Input type="text" name="author" aria-label={optionalLabel(t(M['content.content_fields.author']))} bind:value={formData.author} placeholder={t(M['content.content_editor.author_name_placeholder'])} />
|
|
1206
1252
|
</label>
|
|
1207
1253
|
<label>
|
|
1208
|
-
Description:
|
|
1209
|
-
<Textarea bind:value={formData.description} rows={2} placeholder={t(M['content.content_editor.brief_summary_placeholder'])}></Textarea>
|
|
1254
|
+
{simpleMode ? optionalLabel(t(M['content.content_fields.summary'])) : 'Description:'}
|
|
1255
|
+
<Textarea name="description" aria-label={simpleMode ? optionalLabel(t(M['content.content_fields.summary'])) : t(M['content.content_fields.description'])} bind:value={formData.description} rows={2} placeholder={t(M['content.content_editor.brief_summary_placeholder'])}></Textarea>
|
|
1210
1256
|
</label>
|
|
1211
1257
|
<label>
|
|
1212
|
-
{t(M['content.content_editor.tags_comma_separated'])}
|
|
1258
|
+
{simpleMode ? optionalLabel(t(M['content.content_fields.tags'])) : t(M['content.content_editor.tags_comma_separated'])}
|
|
1213
1259
|
<Input
|
|
1214
1260
|
type="text"
|
|
1261
|
+
name="tags"
|
|
1262
|
+
aria-label={optionalLabel(t(M['content.content_fields.tags']))}
|
|
1215
1263
|
value={(formData.tags || []).join(', ')}
|
|
1216
1264
|
placeholder={t(M['content.content_editor.tags_placeholder'])}
|
|
1217
1265
|
oninput={(event) => parseTagsInput((event.currentTarget as HTMLInputElement).value)}
|
|
@@ -1220,7 +1268,8 @@ function removeAsset(id: string) {
|
|
|
1220
1268
|
</div>
|
|
1221
1269
|
</details>
|
|
1222
1270
|
|
|
1223
|
-
<!-- References Panel -->
|
|
1271
|
+
<!-- References Panel (hidden in simple mode) -->
|
|
1272
|
+
{#if !simpleMode}
|
|
1224
1273
|
<details class="editor-drawer" open>
|
|
1225
1274
|
<summary class="editor-drawer-header">
|
|
1226
1275
|
References
|
|
@@ -1427,14 +1476,15 @@ function removeAsset(id: string) {
|
|
|
1427
1476
|
|
|
1428
1477
|
<label>
|
|
1429
1478
|
URL:
|
|
1430
|
-
<Input type="url" bind:value={formData.url} />
|
|
1479
|
+
<Input type="url" name="url" aria-label={t(M['content.content_fields.url'])} bind:value={formData.url} />
|
|
1431
1480
|
</label>
|
|
1432
1481
|
<label>
|
|
1433
1482
|
{t(M['content.content_editor.file_key'])}
|
|
1434
|
-
<Input type="text" bind:value={formData.fileKey} />
|
|
1483
|
+
<Input type="text" name="fileKey" aria-label={t(M['content.content_editor.file_key'])} bind:value={formData.fileKey} />
|
|
1435
1484
|
</label>
|
|
1436
1485
|
</div>
|
|
1437
1486
|
</details>
|
|
1487
|
+
{/if}
|
|
1438
1488
|
</Form>
|
|
1439
1489
|
|
|
1440
1490
|
{#if showChatSidebar}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { ContentEditorAssistantContextChange, ContentEditorAssistantFieldUpdateAllowList } from '../../content-editor-assistant';
|
|
2
2
|
import type { ContentData, FactAuditStateData } from '../../mock-smrt-client';
|
|
3
3
|
import { type ContentEditorSavePayload, getContentEditorSnapshot } from '../content-editor-form';
|
|
4
|
+
import type { ContentFieldMode } from './content-field-mode.js';
|
|
4
5
|
type ContentEditorSnapshot = ReturnType<typeof getContentEditorSnapshot>;
|
|
5
6
|
export interface Props {
|
|
6
7
|
/** Base URL for API requests to load and save content. */
|
|
@@ -23,6 +24,11 @@ export interface Props {
|
|
|
23
24
|
hideActions?: boolean;
|
|
24
25
|
/** Hide the AI chat sidebar completely. */
|
|
25
26
|
hideChat?: boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Show the body editor's "Save as" HTML/Markdown picker. Off by default:
|
|
29
|
+
* the storage format is a technical choice most editors should not face.
|
|
30
|
+
*/
|
|
31
|
+
showBodyFormatPicker?: boolean;
|
|
26
32
|
/** Policy object defining which fields the assistant can modify. */
|
|
27
33
|
assistantFieldAllowList?: ContentEditorAssistantFieldUpdateAllowList;
|
|
28
34
|
/** Fired when the assistant context changes (for session tracking). */
|
|
@@ -35,6 +41,12 @@ export interface Props {
|
|
|
35
41
|
onSave: (data: ContentEditorSavePayload) => void;
|
|
36
42
|
/** Fired when the user cancels editing without saving. */
|
|
37
43
|
onCancel: () => void;
|
|
44
|
+
/**
|
|
45
|
+
* `full` (default) shows every field. `simple` is for everyday editors:
|
|
46
|
+
* Type, State and References are hidden, Metadata becomes a collapsed
|
|
47
|
+
* "Details" section, and optional fields say so.
|
|
48
|
+
*/
|
|
49
|
+
mode?: ContentFieldMode;
|
|
38
50
|
}
|
|
39
51
|
declare const ContentEditor: import("svelte").Component<Props, {
|
|
40
52
|
triggerSave: () => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContentEditor.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/components/ContentEditor.svelte.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAEV,mCAAmC,EACnC,0CAA0C,EAE3C,MAAM,gCAAgC,CAAC;AAKxC,OAAO,KAAK,EACV,WAAW,EAEX,kBAAkB,EAEnB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAKL,KAAK,wBAAwB,EAG7B,wBAAwB,EAEzB,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"ContentEditor.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/components/ContentEditor.svelte.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAEV,mCAAmC,EACnC,0CAA0C,EAE3C,MAAM,gCAAgC,CAAC;AAKxC,OAAO,KAAK,EACV,WAAW,EAEX,kBAAkB,EAEnB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAKL,KAAK,wBAAwB,EAG7B,wBAAwB,EAEzB,MAAM,wBAAwB,CAAC;AAQhC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAGhE,KAAK,qBAAqB,GAAG,UAAU,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAEzE,MAAM,WAAW,KAAK;IACpB,0DAA0D;IAC1D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gEAAgE;IAChE,OAAO,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IAC7B,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0EAA0E;IAC1E,SAAS,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACtC,8CAA8C;IAC9C,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,+CAA+C;IAC/C,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,yDAAyD;IACzD,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,+DAA+D;IAC/D,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,+CAA+C;IAC/C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,oEAAoE;IACpE,uBAAuB,CAAC,EAAE,0CAA0C,CAAC;IACrE,uEAAuE;IACvE,wBAAwB,CAAC,EAAE,mCAAmC,CAAC;IAC/D,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,qBAAqB,KAAK,IAAI,CAAC;IACjD,4DAA4D;IAC5D,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI,KAAK,IAAI,CAAC;IAC/D,qEAAqE;IACrE,MAAM,EAAE,CAAC,IAAI,EAAE,wBAAwB,KAAK,IAAI,CAAC;IACjD,0DAA0D;IAC1D,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB;;;;OAIG;IACH,IAAI,CAAC,EAAE,gBAAgB,CAAC;CACzB;AAizCD,QAAA,MAAM,aAAa;;MAAwC,CAAC;AAC5D,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AACtD,eAAe,aAAa,CAAC"}
|
|
@@ -1894,6 +1894,8 @@ function getVersionProvenanceCopy(version: ContentVersionData) {
|
|
|
1894
1894
|
}
|
|
1895
1895
|
|
|
1896
1896
|
.factual-workflow {
|
|
1897
|
+
container-type: inline-size;
|
|
1898
|
+
container-name: governance-panel;
|
|
1897
1899
|
display: flex;
|
|
1898
1900
|
flex-direction: column;
|
|
1899
1901
|
gap: 1.25rem;
|
|
@@ -1904,7 +1906,7 @@ function getVersionProvenanceCopy(version: ContentVersionData) {
|
|
|
1904
1906
|
gap: 1.25rem;
|
|
1905
1907
|
}
|
|
1906
1908
|
|
|
1907
|
-
@
|
|
1909
|
+
@container governance-panel (min-width: 56rem) {
|
|
1908
1910
|
.workflow-grid {
|
|
1909
1911
|
grid-template-columns: repeat(2, minmax(0, 1fr));
|
|
1910
1912
|
}
|
|
@@ -2156,7 +2158,7 @@ function getVersionProvenanceCopy(version: ContentVersionData) {
|
|
|
2156
2158
|
gap: 1rem;
|
|
2157
2159
|
}
|
|
2158
2160
|
|
|
2159
|
-
@
|
|
2161
|
+
@container governance-panel (min-width: 56rem) {
|
|
2160
2162
|
.transparency-grid {
|
|
2161
2163
|
grid-template-columns: repeat(2, minmax(0, 1fr));
|
|
2162
2164
|
}
|