@artkit-ai/react 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/README.md +145 -2
- package/dist/cache.d.ts +35 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/cache.js +116 -0
- package/dist/cache.js.map +1 -0
- package/dist/client.d.ts +79 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +260 -0
- package/dist/client.js.map +1 -0
- package/dist/components/approval.d.ts +34 -0
- package/dist/components/approval.d.ts.map +1 -0
- package/dist/components/approval.js +80 -0
- package/dist/components/approval.js.map +1 -0
- package/dist/components/card.d.ts +22 -0
- package/dist/components/card.d.ts.map +1 -0
- package/dist/components/card.js +16 -0
- package/dist/components/card.js.map +1 -0
- package/dist/components/editor.d.ts +28 -0
- package/dist/components/editor.d.ts.map +1 -0
- package/dist/components/editor.js +161 -0
- package/dist/components/editor.js.map +1 -0
- package/dist/components/icons.d.ts +8 -0
- package/dist/components/icons.d.ts.map +1 -0
- package/dist/components/icons.js +14 -0
- package/dist/components/icons.js.map +1 -0
- package/dist/components/panel.d.ts +34 -0
- package/dist/components/panel.d.ts.map +1 -0
- package/dist/components/panel.js +216 -0
- package/dist/components/panel.js.map +1 -0
- package/dist/components/shared.d.ts +71 -0
- package/dist/components/shared.d.ts.map +1 -0
- package/dist/components/shared.js +104 -0
- package/dist/components/shared.js.map +1 -0
- package/dist/components/version-diff.d.ts +35 -0
- package/dist/components/version-diff.d.ts.map +1 -0
- package/dist/components/version-diff.js +85 -0
- package/dist/components/version-diff.js.map +1 -0
- package/dist/components/view.d.ts +40 -0
- package/dist/components/view.d.ts.map +1 -0
- package/dist/components/view.js +75 -0
- package/dist/components/view.js.map +1 -0
- package/dist/context.d.ts +59 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +13 -0
- package/dist/context.js.map +1 -0
- package/dist/controls.d.ts +145 -0
- package/dist/controls.d.ts.map +1 -0
- package/dist/controls.js +188 -0
- package/dist/controls.js.map +1 -0
- package/dist/download.d.ts +4 -0
- package/dist/download.d.ts.map +1 -0
- package/dist/download.js +20 -0
- package/dist/download.js.map +1 -0
- package/dist/editor-session.d.ts +184 -0
- package/dist/editor-session.d.ts.map +1 -0
- package/dist/editor-session.js +614 -0
- package/dist/editor-session.js.map +1 -0
- package/dist/hooks.d.ts +85 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +297 -0
- package/dist/hooks.js.map +1 -0
- package/dist/i18n.d.ts +197 -0
- package/dist/i18n.d.ts.map +1 -0
- package/dist/i18n.js +207 -0
- package/dist/i18n.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/kit-css.d.ts +3 -0
- package/dist/kit-css.d.ts.map +1 -0
- package/dist/kit-css.js +5 -0
- package/dist/kit-css.js.map +1 -0
- package/dist/line-diff.d.ts +25 -0
- package/dist/line-diff.d.ts.map +1 -0
- package/dist/line-diff.js +96 -0
- package/dist/line-diff.js.map +1 -0
- package/dist/partial-json.d.ts +8 -0
- package/dist/partial-json.d.ts.map +1 -0
- package/dist/partial-json.js +176 -0
- package/dist/partial-json.js.map +1 -0
- package/dist/provider.d.ts +42 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/provider.js +95 -0
- package/dist/provider.js.map +1 -0
- package/dist/styles.d.ts +25 -0
- package/dist/styles.d.ts.map +1 -0
- package/dist/styles.js +203 -0
- package/dist/styles.js.map +1 -0
- package/dist/toolbar.d.ts +90 -0
- package/dist/toolbar.d.ts.map +1 -0
- package/dist/toolbar.js +233 -0
- package/dist/toolbar.js.map +1 -0
- package/package.json +50 -3
- package/src/cache.ts +132 -0
- package/src/client.ts +390 -0
- package/src/components/approval.tsx +219 -0
- package/src/components/card.tsx +87 -0
- package/src/components/editor.tsx +392 -0
- package/src/components/icons.tsx +14 -0
- package/src/components/panel.tsx +591 -0
- package/src/components/shared.tsx +207 -0
- package/src/components/version-diff.tsx +266 -0
- package/src/components/view.tsx +199 -0
- package/src/context.ts +82 -0
- package/src/controls.tsx +587 -0
- package/src/download.ts +23 -0
- package/src/editor-session.ts +738 -0
- package/src/hooks.ts +411 -0
- package/src/i18n.ts +217 -0
- package/src/index.ts +160 -0
- package/src/kit-css.ts +5 -0
- package/src/line-diff.ts +111 -0
- package/src/partial-json.ts +160 -0
- package/src/provider.tsx +176 -0
- package/src/styles.ts +222 -0
- package/src/toolbar.tsx +536 -0
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { isArtifactError } from '@artkit-ai/core';
|
|
3
|
+
import { RotateCw } from 'lucide-react';
|
|
4
|
+
import { Component, useCallback, useEffect, useRef, useState, } from 'react';
|
|
5
|
+
import { useArtkit } from '../context.js';
|
|
6
|
+
export function cx(...classes) {
|
|
7
|
+
return classes.filter(Boolean).join(' ');
|
|
8
|
+
}
|
|
9
|
+
export function slot(slots, part, base) {
|
|
10
|
+
const custom = slots?.[part];
|
|
11
|
+
return { className: cx(base, custom?.className), ...(custom?.style ? { style: custom.style } : {}) };
|
|
12
|
+
}
|
|
13
|
+
/** Attributes of every artkit root element: theme scope and forced light/dark. */
|
|
14
|
+
export function rootAttributes(ctx, themeId) {
|
|
15
|
+
return {
|
|
16
|
+
...(themeId ? { 'data-ak-theme': themeId } : {}),
|
|
17
|
+
...(ctx.colorScheme !== 'system' ? { 'data-theme': ctx.colorScheme } : {}),
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export function StatusBadge({ status, className }) {
|
|
21
|
+
const { t } = useArtkit();
|
|
22
|
+
return (_jsx("span", { className: cx('ak-badge', className), "data-status": status, children: t(`status_${status}`) }));
|
|
23
|
+
}
|
|
24
|
+
export function errorMessage(error, fallback) {
|
|
25
|
+
if (isArtifactError(error)) {
|
|
26
|
+
const hint = error.issues.find((issue) => issue.hint)?.hint;
|
|
27
|
+
return hint ? `${error.message} ${hint}` : error.message;
|
|
28
|
+
}
|
|
29
|
+
return fallback;
|
|
30
|
+
}
|
|
31
|
+
export function ErrorMessage({ error, onRetry, onDismiss, className, style, }) {
|
|
32
|
+
const { t } = useArtkit();
|
|
33
|
+
return (_jsxs("div", { role: "alert", className: cx('ak-alert', className), style: style, children: [_jsx("span", { children: errorMessage(error, t('loadFailed')) }), ' ', onRetry ? (_jsxs("button", { type: "button", className: "ak-button", onClick: onRetry, children: [_jsx(RotateCw, { "aria-hidden": "true" }), t('retry')] })) : null, onDismiss ? (_jsx("button", { type: "button", className: "ak-button", onClick: onDismiss, children: t('dismiss') })) : null] }));
|
|
34
|
+
}
|
|
35
|
+
export function Loading({ label, className, style, }) {
|
|
36
|
+
const { t } = useArtkit();
|
|
37
|
+
return (_jsx("div", { className: cx('ak-loading', className), style: style, role: "status", "aria-busy": "true", children: label ?? t('loading') }));
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Polite live region for screen readers (spec §18.2). The text is cleared first so repeating the same
|
|
41
|
+
* message is announced again.
|
|
42
|
+
*/
|
|
43
|
+
export function useAnnouncer() {
|
|
44
|
+
const [message, setMessage] = useState('');
|
|
45
|
+
const frame = useRef(undefined);
|
|
46
|
+
useEffect(() => () => clearTimeout(frame.current), []);
|
|
47
|
+
const announce = useCallback((text) => {
|
|
48
|
+
setMessage('');
|
|
49
|
+
clearTimeout(frame.current);
|
|
50
|
+
frame.current = setTimeout(() => setMessage(text), 30);
|
|
51
|
+
}, []);
|
|
52
|
+
const node = (_jsx("div", { className: "ak-sr-only", role: "status", "aria-live": "polite", "aria-atomic": "true", children: message }));
|
|
53
|
+
return [node, announce];
|
|
54
|
+
}
|
|
55
|
+
export function ChangeList({ changes, className, style, }) {
|
|
56
|
+
const { t } = useArtkit();
|
|
57
|
+
if (changes.length === 0)
|
|
58
|
+
return _jsx("p", { className: "ak-notice", children: t('noChanges') });
|
|
59
|
+
return (_jsx("ul", { className: cx('ak-changes', className), style: style, children: withKeys(changes).map(({ change, key }) => (_jsxs("li", { className: "ak-change", "data-type": change.type, children: [_jsx("span", { className: "ak-change-type", children: t(`change_${change.type}`) }), _jsx("span", { className: "ak-change-target", children: change.target }), _jsx("span", { className: "ak-change-summary", children: change.summary })] }, key))) }));
|
|
60
|
+
}
|
|
61
|
+
// Targets can repeat (changed + moved); a per-target counter keeps keys stable across renders.
|
|
62
|
+
function withKeys(changes) {
|
|
63
|
+
const seen = new Map();
|
|
64
|
+
return changes.map((change) => {
|
|
65
|
+
const base = `${change.type}:${change.target}`;
|
|
66
|
+
const count = seen.get(base) ?? 0;
|
|
67
|
+
seen.set(base, count + 1);
|
|
68
|
+
return { change, key: count === 0 ? base : `${base}#${count}` };
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
/** Catches loader and renderer failures so one broken kind does not take the page down. */
|
|
72
|
+
export class ErrorBoundary extends Component {
|
|
73
|
+
state = { error: undefined, failed: false };
|
|
74
|
+
static getDerivedStateFromError(error) {
|
|
75
|
+
return { error, failed: true };
|
|
76
|
+
}
|
|
77
|
+
componentDidCatch(_error, _info) {
|
|
78
|
+
// Rendering the fallback is enough; the host app can wrap its own reporting boundary around us.
|
|
79
|
+
}
|
|
80
|
+
reset = () => {
|
|
81
|
+
this.props.onReset?.();
|
|
82
|
+
this.setState({ error: undefined, failed: false });
|
|
83
|
+
};
|
|
84
|
+
render() {
|
|
85
|
+
if (this.state.failed)
|
|
86
|
+
return this.props.fallback(this.state.error, this.reset);
|
|
87
|
+
return this.props.children;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
export function formatDate(value, locale) {
|
|
91
|
+
const date = new Date(value);
|
|
92
|
+
if (Number.isNaN(date.getTime()))
|
|
93
|
+
return value;
|
|
94
|
+
try {
|
|
95
|
+
return new Intl.DateTimeFormat(locale, { dateStyle: 'short', timeStyle: 'short' }).format(date);
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return date.toISOString();
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
export function kindLabel(ctx, kind) {
|
|
102
|
+
return ctx.registry.has(kind) ? ctx.registry.get(kind).label : kind;
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/components/shared.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { Artifact, ChangeSummary } from '@artkit-ai/core';
|
|
2
|
+
import { type ArtkitContextValue } from '../context.js';
|
|
3
|
+
import { type LineDiffEntry } from '../line-diff.js';
|
|
4
|
+
import { type Slots } from './shared.js';
|
|
5
|
+
export type DiffLayout = 'unified' | 'split';
|
|
6
|
+
export type ArtifactVersionDiffPart = 'toolbar' | 'changes' | 'lines';
|
|
7
|
+
export interface ArtifactVersionDiffProps {
|
|
8
|
+
/** Load both versions by id. */
|
|
9
|
+
id?: string;
|
|
10
|
+
/** Older version; defaults to the one before `to`. */
|
|
11
|
+
from?: number;
|
|
12
|
+
/** Newer version; defaults to the latest. */
|
|
13
|
+
to?: number;
|
|
14
|
+
/** Or pass both artifacts directly. */
|
|
15
|
+
before?: Artifact;
|
|
16
|
+
after?: Artifact;
|
|
17
|
+
layout?: DiffLayout;
|
|
18
|
+
defaultLayout?: DiffLayout;
|
|
19
|
+
onLayoutChange?(layout: DiffLayout): void;
|
|
20
|
+
/** Show the structural change list from `kind.diff` (default true). */
|
|
21
|
+
showChanges?: boolean;
|
|
22
|
+
/** Show the line diff of the full projections (default true). */
|
|
23
|
+
showLines?: boolean;
|
|
24
|
+
className?: string;
|
|
25
|
+
slots?: Slots<ArtifactVersionDiffPart>;
|
|
26
|
+
}
|
|
27
|
+
export interface VersionComparison {
|
|
28
|
+
changes: ChangeSummary[];
|
|
29
|
+
lines: LineDiffEntry[];
|
|
30
|
+
}
|
|
31
|
+
/** Structural changes plus a line diff of the full text projections. `before` undefined means empty. */
|
|
32
|
+
export declare function compareVersions(ctx: ArtkitContextValue, before: Artifact | undefined, after: Artifact): VersionComparison;
|
|
33
|
+
/** Side-by-side or highlighted comparison between two versions (spec §13.1). */
|
|
34
|
+
export declare function ArtifactVersionDiff(props: ArtifactVersionDiffProps): import("react").JSX.Element;
|
|
35
|
+
//# sourceMappingURL=version-diff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version-diff.d.ts","sourceRoot":"","sources":["../../src/components/version-diff.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAG/D,OAAO,EAAE,KAAK,kBAAkB,EAAa,MAAM,eAAe,CAAC;AAEnE,OAAO,EAAa,KAAK,aAAa,EAAe,MAAM,iBAAiB,CAAC;AAC7E,OAAO,EAAyD,KAAK,KAAK,EAAQ,MAAM,aAAa,CAAC;AAEtG,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,OAAO,CAAC;AAC7C,MAAM,MAAM,uBAAuB,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;AAEtE,MAAM,WAAW,wBAAwB;IACvC,gCAAgC;IAChC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,sDAAsD;IACtD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,uCAAuC;IACvC,MAAM,CAAC,EAAE,QAAQ,CAAC;IAClB,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,aAAa,CAAC,EAAE,UAAU,CAAC;IAC3B,cAAc,CAAC,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;IAC1C,uEAAuE;IACvE,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,iEAAiE;IACjE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,uBAAuB,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,KAAK,EAAE,aAAa,EAAE,CAAC;CACxB;AAED,wGAAwG;AACxG,wBAAgB,eAAe,CAC7B,GAAG,EAAE,kBAAkB,EACvB,MAAM,EAAE,QAAQ,GAAG,SAAS,EAC5B,KAAK,EAAE,QAAQ,GACd,iBAAiB,CA6BnB;AAED,gFAAgF;AAChF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,wBAAwB,+BA4FlE"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Columns2, Rows2 } from 'lucide-react';
|
|
3
|
+
import { useMemo, useState } from 'react';
|
|
4
|
+
import { useArtkit } from '../context.js';
|
|
5
|
+
import { useArtifact } from '../hooks.js';
|
|
6
|
+
import { diffLines, toSplitRows } from '../line-diff.js';
|
|
7
|
+
import { ChangeList, cx, ErrorMessage, Loading, rootAttributes, slot } from './shared.js';
|
|
8
|
+
/** Structural changes plus a line diff of the full text projections. `before` undefined means empty. */
|
|
9
|
+
export function compareVersions(ctx, before, after) {
|
|
10
|
+
const kind = ctx.registry.get(after.kind);
|
|
11
|
+
const beforeContent = before?.content ?? kind.empty();
|
|
12
|
+
const changes = [];
|
|
13
|
+
if (before && before.title !== after.title) {
|
|
14
|
+
changes.push({
|
|
15
|
+
type: 'changed',
|
|
16
|
+
target: 'envelope:title',
|
|
17
|
+
summary: `'${before.title}' → '${after.title}'`,
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
try {
|
|
21
|
+
changes.push(...kind.diff(beforeContent, after.content));
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
// The text diff below still shows what changed.
|
|
25
|
+
}
|
|
26
|
+
const project = (content, artifact) => {
|
|
27
|
+
try {
|
|
28
|
+
return kind.project(content, {
|
|
29
|
+
mode: 'full',
|
|
30
|
+
locale: artifact.locale,
|
|
31
|
+
theme: ctx.themeFor(artifact.themeId),
|
|
32
|
+
}).text;
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return JSON.stringify(content, null, 2);
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
const lines = diffLines(before ? project(beforeContent, before) : '', project(after.content, after));
|
|
39
|
+
return { changes, lines };
|
|
40
|
+
}
|
|
41
|
+
/** Side-by-side or highlighted comparison between two versions (spec §13.1). */
|
|
42
|
+
export function ArtifactVersionDiff(props) {
|
|
43
|
+
const ctx = useArtkit();
|
|
44
|
+
const { t } = ctx;
|
|
45
|
+
const [ownLayout, setOwnLayout] = useState(props.defaultLayout ?? 'unified');
|
|
46
|
+
const layout = props.layout ?? ownLayout;
|
|
47
|
+
const setLayout = (next) => {
|
|
48
|
+
setOwnLayout(next);
|
|
49
|
+
props.onLayoutChange?.(next);
|
|
50
|
+
};
|
|
51
|
+
const afterQuery = useArtifact(props.after ? undefined : props.id, props.to === undefined ? {} : { version: props.to });
|
|
52
|
+
const after = props.after ?? afterQuery.artifact;
|
|
53
|
+
const fromVersion = props.from ?? (after && after.version > 1 ? after.version - 1 : undefined);
|
|
54
|
+
const beforeQuery = useArtifact(props.before || fromVersion === undefined ? undefined : (props.id ?? after?.id), {
|
|
55
|
+
...(fromVersion === undefined ? {} : { version: fromVersion }),
|
|
56
|
+
});
|
|
57
|
+
const before = props.before ?? (fromVersion === undefined ? undefined : beforeQuery.artifact);
|
|
58
|
+
const comparison = useMemo(() => (after && ctx.registry.has(after.kind) ? compareVersions(ctx, before, after) : undefined), [ctx, before, after]);
|
|
59
|
+
const error = afterQuery.error ?? beforeQuery.error;
|
|
60
|
+
const waiting = !after || (fromVersion !== undefined && !before);
|
|
61
|
+
const attrs = rootAttributes(ctx, after?.themeId);
|
|
62
|
+
if (error) {
|
|
63
|
+
return (_jsx("div", { className: cx('ak-root ak-diff', props.className), ...attrs, children: _jsx(ErrorMessage, { error: error }) }));
|
|
64
|
+
}
|
|
65
|
+
if (waiting || !comparison || !after) {
|
|
66
|
+
return (_jsx("div", { className: cx('ak-root ak-diff', props.className), ...attrs, children: _jsx(Loading, {}) }));
|
|
67
|
+
}
|
|
68
|
+
const beforeLabel = before ? t('diffBefore', { version: before.version }) : '—';
|
|
69
|
+
const afterLabel = t('diffAfter', { version: after.version });
|
|
70
|
+
return (_jsxs("div", { className: cx('ak-root ak-diff', props.className), ...attrs, children: [props.showChanges === false ? null : (_jsx("section", { "aria-label": t('changes'), children: _jsx(ChangeList, { changes: comparison.changes, ...slot(props.slots, 'changes', '') }) })), props.showLines === false ? null : (_jsxs(_Fragment, { children: [_jsxs("fieldset", { ...slot(props.slots, 'toolbar', 'ak-diff-toolbar'), children: [_jsx("legend", { className: "ak-sr-only", children: t('diffViewLabel') }), ['unified', 'split'].map((option) => (_jsxs("button", { type: "button", className: "ak-button", "aria-pressed": layout === option, onClick: () => setLayout(option), children: [option === 'unified' ? _jsx(Rows2, { "aria-hidden": "true" }) : _jsx(Columns2, { "aria-hidden": "true" }), option === 'unified' ? t('diffUnified') : t('diffSplit')] }, option)))] }), layout === 'unified' ? (_jsx(UnifiedLines, { lines: comparison.lines, caption: `${beforeLabel} → ${afterLabel}`, slots: props.slots })) : (_jsx(SplitLines, { lines: comparison.lines, beforeLabel: beforeLabel, afterLabel: afterLabel, slots: props.slots }))] }))] }));
|
|
71
|
+
}
|
|
72
|
+
function Marker({ type }) {
|
|
73
|
+
const { t } = useArtkit();
|
|
74
|
+
if (type === 'equal')
|
|
75
|
+
return _jsx("td", { className: "ak-diff-marker" });
|
|
76
|
+
return (_jsxs("td", { className: "ak-diff-marker", children: [_jsx("span", { "aria-hidden": "true", children: type === 'insert' ? '+' : '−' }), _jsx("span", { className: "ak-sr-only", children: type === 'insert' ? t('lineAdded') : t('lineRemoved') })] }));
|
|
77
|
+
}
|
|
78
|
+
function UnifiedLines({ lines, caption, slots, }) {
|
|
79
|
+
return (_jsxs("table", { ...slot(slots, 'lines', 'ak-diff-lines'), "data-layout": "unified", children: [_jsx("caption", { className: "ak-sr-only", children: caption }), _jsx("tbody", { children: lines.map((line) => (_jsxs("tr", { className: "ak-diff-line", "data-type": line.type, children: [_jsx("th", { scope: "row", children: line.oldLine ?? '' }), _jsx("th", { scope: "row", children: line.newLine ?? '' }), _jsx(Marker, { type: line.type }), _jsx("td", { children: line.text })] }, `${line.type}:${line.oldLine ?? '-'}:${line.newLine ?? '-'}`))) })] }));
|
|
80
|
+
}
|
|
81
|
+
function SplitLines({ lines, beforeLabel, afterLabel, slots, }) {
|
|
82
|
+
const rows = useMemo(() => toSplitRows(lines), [lines]);
|
|
83
|
+
return (_jsxs("table", { ...slot(slots, 'lines', 'ak-diff-lines'), "data-layout": "split", children: [_jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { scope: "col", colSpan: 3, children: beforeLabel }), _jsx("th", { scope: "col", colSpan: 3, children: afterLabel })] }) }), _jsx("tbody", { children: rows.map((row) => (_jsxs("tr", { children: [_jsx("th", { scope: "row", children: row.left?.oldLine ?? '' }), row.left && row.left.type !== 'equal' ? (_jsx(Marker, { type: "delete" })) : (_jsx("td", { className: "ak-diff-marker" })), _jsx("td", { className: "ak-diff-cell", "data-type": row.left && row.left.type !== 'equal' ? 'delete' : undefined, children: row.left?.text ?? '' }), _jsx("th", { scope: "row", children: row.right?.newLine ?? '' }), row.right && row.right.type !== 'equal' ? (_jsx(Marker, { type: "insert" })) : (_jsx("td", { className: "ak-diff-marker" })), _jsx("td", { className: "ak-diff-cell", "data-type": row.right && row.right.type !== 'equal' ? 'insert' : undefined, children: row.right?.text ?? '' })] }, `${row.left?.oldLine ?? '-'}:${row.right?.newLine ?? '-'}`))) })] }));
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=version-diff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version-diff.js","sourceRoot":"","sources":["../../src/components/version-diff.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { Artifact, RenderContext } from '@artkit-ai/core';
|
|
2
|
+
import { type ArtkitContextValue } from '../context.js';
|
|
3
|
+
import { type Slots } from './shared.js';
|
|
4
|
+
export type ArtifactViewPart = 'body' | 'badge' | 'loading' | 'error';
|
|
5
|
+
export interface ArtifactViewProps {
|
|
6
|
+
/** Committed artifact to show. */
|
|
7
|
+
artifact?: Artifact;
|
|
8
|
+
/** Alternatively, load by id (latest or `version`). */
|
|
9
|
+
id?: string;
|
|
10
|
+
version?: number;
|
|
11
|
+
/**
|
|
12
|
+
* Content still being streamed by the model: a partial object or the raw JSON text so far. It goes
|
|
13
|
+
* through `kind.parsePartial` and shows as a provisional preview until a newer committed version
|
|
14
|
+
* arrives (spec §13.4).
|
|
15
|
+
*/
|
|
16
|
+
partial?: unknown;
|
|
17
|
+
/** Kind of the partial content when no artifact exists yet. */
|
|
18
|
+
kind?: string;
|
|
19
|
+
/** Theme and locale of the partial content when no artifact exists yet. */
|
|
20
|
+
themeId?: string;
|
|
21
|
+
locale?: string;
|
|
22
|
+
mode?: RenderContext['mode'];
|
|
23
|
+
className?: string;
|
|
24
|
+
slots?: Slots<ArtifactViewPart>;
|
|
25
|
+
}
|
|
26
|
+
/** Turns streamed content into renderable content, or undefined while nothing complete arrived yet. */
|
|
27
|
+
export declare function previewContent(ctx: ArtkitContextValue, kind: string, partial: unknown): unknown;
|
|
28
|
+
export declare function renderContext(ctx: ArtkitContextValue, themeId: string | undefined, locale: string, mode: RenderContext['mode'], provisional: boolean): RenderContext;
|
|
29
|
+
/** Read-only view of any artifact by kind (spec §13.1). */
|
|
30
|
+
export declare function ArtifactView(props: ArtifactViewProps): import("react").JSX.Element;
|
|
31
|
+
interface KindRendererProps {
|
|
32
|
+
kind: string;
|
|
33
|
+
content: unknown;
|
|
34
|
+
ctx: RenderContext;
|
|
35
|
+
className?: string;
|
|
36
|
+
}
|
|
37
|
+
/** Lazy kind renderer with a JSON fallback when the kind has no renderer loader. */
|
|
38
|
+
export declare function KindRenderer(props: KindRendererProps): import("react").JSX.Element;
|
|
39
|
+
export {};
|
|
40
|
+
//# sourceMappingURL=view.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../src/components/view.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAE/D,OAAO,EAAE,KAAK,kBAAkB,EAAa,MAAM,eAAe,CAAC;AAInE,OAAO,EAA4D,KAAK,KAAK,EAAQ,MAAM,aAAa,CAAC;AAEzG,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC;AAEtE,MAAM,WAAW,iBAAiB;IAChC,kCAAkC;IAClC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,uDAAuD;IACvD,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,+DAA+D;IAC/D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2EAA2E;IAC3E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAC;CACjC;AAED,uGAAuG;AACvG,wBAAgB,cAAc,CAAC,GAAG,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAS/F;AAED,wBAAgB,aAAa,CAC3B,GAAG,EAAE,kBAAkB,EACvB,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,EAC3B,WAAW,EAAE,OAAO,GACnB,aAAa,CAQf;AAED,2DAA2D;AAC3D,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,+BA0FpD;AAED,UAAU,iBAAiB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,aAAa,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,oFAAoF;AACpF,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,+BAsBpD"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Suspense, use, useMemo, useRef } from 'react';
|
|
3
|
+
import { useArtkit } from '../context.js';
|
|
4
|
+
import { useArtifact } from '../hooks.js';
|
|
5
|
+
import { parsePartialJson } from '../partial-json.js';
|
|
6
|
+
import { hashString } from '../styles.js';
|
|
7
|
+
import { cx, ErrorBoundary, ErrorMessage, Loading, rootAttributes, slot } from './shared.js';
|
|
8
|
+
/** Turns streamed content into renderable content, or undefined while nothing complete arrived yet. */
|
|
9
|
+
export function previewContent(ctx, kind, partial) {
|
|
10
|
+
if (!ctx.registry.has(kind))
|
|
11
|
+
return undefined;
|
|
12
|
+
const raw = typeof partial === 'string' && /^\s*[[{]/.test(partial) ? parsePartialJson(partial) : partial;
|
|
13
|
+
if (raw === undefined)
|
|
14
|
+
return undefined;
|
|
15
|
+
try {
|
|
16
|
+
return ctx.registry.get(kind).parsePartial(raw);
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export function renderContext(ctx, themeId, locale, mode, provisional) {
|
|
23
|
+
return {
|
|
24
|
+
theme: ctx.themeFor(themeId),
|
|
25
|
+
locale,
|
|
26
|
+
mode,
|
|
27
|
+
...(provisional ? { provisional: true } : {}),
|
|
28
|
+
...(ctx.resolveAssetUrl ? { resolveAssetUrl: ctx.resolveAssetUrl } : {}),
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
/** Read-only view of any artifact by kind (spec §13.1). */
|
|
32
|
+
export function ArtifactView(props) {
|
|
33
|
+
const ctx = useArtkit();
|
|
34
|
+
const { t } = ctx;
|
|
35
|
+
const loaded = useArtifact(props.artifact ? undefined : props.id, props.version === undefined ? {} : { version: props.version });
|
|
36
|
+
const committed = props.artifact ?? loaded.artifact;
|
|
37
|
+
// Remember which committed version was on screen when streaming started: any other version arriving
|
|
38
|
+
// afterwards is the commit that replaces the preview, even if the caller still passes `partial`.
|
|
39
|
+
const streamStart = useRef(null);
|
|
40
|
+
const stillLoading = !props.artifact && props.id !== undefined && loaded.loading;
|
|
41
|
+
if (props.partial === undefined)
|
|
42
|
+
streamStart.current = null;
|
|
43
|
+
else if (streamStart.current === null && !stillLoading)
|
|
44
|
+
streamStart.current = { version: committed?.version };
|
|
45
|
+
const showPartial = props.partial !== undefined &&
|
|
46
|
+
(streamStart.current === null || committed?.version === streamStart.current.version);
|
|
47
|
+
const kind = props.kind ?? committed?.kind;
|
|
48
|
+
const partialContent = useMemo(() => (showPartial && kind ? previewContent(ctx, kind, props.partial) : undefined), [ctx, kind, props.partial, showPartial]);
|
|
49
|
+
const themeId = committed?.themeId ?? props.themeId;
|
|
50
|
+
const locale = committed?.locale ?? props.locale ?? ctx.locale;
|
|
51
|
+
const mode = props.mode ?? 'screen';
|
|
52
|
+
const rootClass = cx('ak-root ak-view', props.className);
|
|
53
|
+
const attrs = rootAttributes(ctx, themeId);
|
|
54
|
+
if (showPartial) {
|
|
55
|
+
return (_jsxs("div", { className: rootClass, ...attrs, "data-provisional": "true", lang: locale, "aria-busy": "true", children: [_jsx("span", { ...slot(props.slots, 'badge', 'ak-badge ak-view-badge'), "data-variant": "provisional", role: "status", children: t('provisional') }), partialContent === undefined || !kind ? (_jsx(Loading, { label: t('generating'), ...slot(props.slots, 'loading', '') })) : (_jsx("div", { ...slot(props.slots, 'body', 'ak-view-body'), children: _jsx(KindRenderer, { kind: kind, content: partialContent, ctx: renderContext(ctx, themeId, locale, mode, true) }) }))] }));
|
|
56
|
+
}
|
|
57
|
+
if (!committed) {
|
|
58
|
+
return (_jsx("div", { className: rootClass, ...attrs, children: loaded.error ? (_jsx(ErrorMessage, { error: loaded.error, onRetry: () => void loaded.refresh().catch(() => undefined), ...slot(props.slots, 'error', '') })) : (_jsx(Loading, { ...slot(props.slots, 'loading', '') })) }));
|
|
59
|
+
}
|
|
60
|
+
return (_jsx("div", { className: rootClass, ...attrs, lang: committed.locale, "data-kind": committed.kind, "data-version": committed.version, children: _jsx("div", { ...slot(props.slots, 'body', 'ak-view-body'), children: _jsx(KindRenderer, { kind: committed.kind, content: committed.content, ctx: renderContext(ctx, themeId, locale, mode, false) }) }) }));
|
|
61
|
+
}
|
|
62
|
+
/** Lazy kind renderer with a JSON fallback when the kind has no renderer loader. */
|
|
63
|
+
export function KindRenderer(props) {
|
|
64
|
+
const ctx = useArtkit();
|
|
65
|
+
if (!ctx.hasRenderer(props.kind)) {
|
|
66
|
+
return (_jsxs("div", { className: props.className, children: [_jsx("p", { className: "ak-notice", children: ctx.t('noRenderer', { kind: props.kind }) }), _jsx("pre", { className: "ak-code", children: _jsx("code", { children: JSON.stringify(props.content, null, 2) }) })] }));
|
|
67
|
+
}
|
|
68
|
+
return (_jsx(ErrorBoundary, { onReset: () => ctx.resetLoad('renderer', props.kind), fallback: (error, reset) => _jsx(ErrorMessage, { error: error, onRetry: reset }), children: _jsx(Suspense, { fallback: _jsx(Loading, {}), children: _jsx(LoadedRenderer, { ...props }) }) }));
|
|
69
|
+
}
|
|
70
|
+
function LoadedRenderer({ kind, content, ctx: renderCtx, className }) {
|
|
71
|
+
const ctx = useArtkit();
|
|
72
|
+
const { Renderer, css } = use(ctx.loadRenderer(kind));
|
|
73
|
+
return (_jsxs(_Fragment, { children: [css ? (_jsx("style", { href: `artkit-kind-${kind}-${hashString(css)}`, precedence: "artkit", nonce: ctx.nonce, children: css })) : null, _jsx(Renderer, { content: content, ctx: renderCtx, ...(className ? { className } : {}) })] }));
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=view.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"view.js","sourceRoot":"","sources":["../../src/components/view.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { AnyArtifactExporter, ArtifactRegistry, AssetResolver, EditorBindings, RenderContext, Theme } from '@artkit-ai/core';
|
|
2
|
+
import { type ComponentType } from 'react';
|
|
3
|
+
import type { ArtifactCache } from './cache.js';
|
|
4
|
+
import type { ArtifactClient } from './client.js';
|
|
5
|
+
import type { Translate } from './i18n.js';
|
|
6
|
+
export interface RendererProps<Content = unknown> {
|
|
7
|
+
content: Content;
|
|
8
|
+
ctx: RenderContext;
|
|
9
|
+
className?: string;
|
|
10
|
+
}
|
|
11
|
+
/** What a kind's `/react` entry provides. */
|
|
12
|
+
export interface RendererModule {
|
|
13
|
+
Renderer: ComponentType<RendererProps<any>>;
|
|
14
|
+
css?: string;
|
|
15
|
+
}
|
|
16
|
+
/** What a kind's `/edit` entry provides. */
|
|
17
|
+
export interface EditorModule {
|
|
18
|
+
Editor: ComponentType<EditorBindings<any, any>>;
|
|
19
|
+
css?: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Lazy loaders per kind, so the bundle only pulls what is shown (spec §13.6). Typical use:
|
|
23
|
+
* `renderers: { document: () => import('@artkit-ai/kind-document/react').then((m) => ({ Renderer: m.DocumentRenderer, css: m.documentCss })) }`.
|
|
24
|
+
*/
|
|
25
|
+
export interface ArtifactLoaders {
|
|
26
|
+
renderers?: Record<string, () => Promise<RendererModule>>;
|
|
27
|
+
editors?: Record<string, () => Promise<EditorModule>>;
|
|
28
|
+
exporters?: Record<string, () => Promise<AnyArtifactExporter[]>>;
|
|
29
|
+
}
|
|
30
|
+
export type ColorScheme = 'light' | 'dark' | 'system';
|
|
31
|
+
export interface ArtkitContextValue {
|
|
32
|
+
registry: ArtifactRegistry;
|
|
33
|
+
client: ArtifactClient;
|
|
34
|
+
cache: ArtifactCache;
|
|
35
|
+
locale: string;
|
|
36
|
+
t: Translate;
|
|
37
|
+
appTheme: Theme;
|
|
38
|
+
colorScheme: ColorScheme;
|
|
39
|
+
/** Theme of an artifact: provider themes, then registry themes, then the application theme. */
|
|
40
|
+
themeFor(themeId: string | undefined): Theme;
|
|
41
|
+
resolveAssetUrl?: (ref: string) => string | undefined;
|
|
42
|
+
assets?: AssetResolver;
|
|
43
|
+
/** Formats the server can export, per kind. */
|
|
44
|
+
exportFormats: Record<string, readonly string[]>;
|
|
45
|
+
hasRenderer(kind: string): boolean;
|
|
46
|
+
hasEditor(kind: string): boolean;
|
|
47
|
+
hasExporters(kind: string): boolean;
|
|
48
|
+
loadRenderer(kind: string): Promise<RendererModule>;
|
|
49
|
+
loadEditor(kind: string): Promise<EditorModule>;
|
|
50
|
+
loadExporters(kind: string): Promise<AnyArtifactExporter[]>;
|
|
51
|
+
/** Forgets a failed load so it can be retried. */
|
|
52
|
+
resetLoad(type: 'renderer' | 'editor' | 'exporters', kind: string): void;
|
|
53
|
+
nonce?: string;
|
|
54
|
+
}
|
|
55
|
+
export declare const ArtkitContext: import("react").Context<ArtkitContextValue | null>;
|
|
56
|
+
/** The artkit context, or null outside `<ArtifactProvider>` (for components that also work standalone). */
|
|
57
|
+
export declare function useOptionalArtkit(): ArtkitContextValue | null;
|
|
58
|
+
export declare function useArtkit(): ArtkitContextValue;
|
|
59
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
|
package/dist/context.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { createContext, useContext } from 'react';
|
|
2
|
+
export const ArtkitContext = createContext(null);
|
|
3
|
+
/** The artkit context, or null outside `<ArtifactProvider>` (for components that also work standalone). */
|
|
4
|
+
export function useOptionalArtkit() {
|
|
5
|
+
return useContext(ArtkitContext);
|
|
6
|
+
}
|
|
7
|
+
export function useArtkit() {
|
|
8
|
+
const value = useContext(ArtkitContext);
|
|
9
|
+
if (!value)
|
|
10
|
+
throw new Error('artkit components and hooks must be rendered inside <ArtifactProvider>.');
|
|
11
|
+
return value;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAQA,OAAO,EAAsB,aAAa,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AA8DtE,MAAM,CAAC,MAAM,aAAa,GAAG,aAAa,CAA4B,IAAI,CAAC,CAAC;AAE5E,2GAA2G;AAC3G,MAAM,UAAU,iBAAiB;IAC/B,OAAO,UAAU,CAAC,aAAa,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,MAAM,KAAK,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;IACxC,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,yEAAyE,CAAC,CAAC;IACvG,OAAO,KAAK,CAAC;AACf,CAAC"}
|