@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.
Files changed (118) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +145 -2
  3. package/dist/cache.d.ts +35 -0
  4. package/dist/cache.d.ts.map +1 -0
  5. package/dist/cache.js +116 -0
  6. package/dist/cache.js.map +1 -0
  7. package/dist/client.d.ts +79 -0
  8. package/dist/client.d.ts.map +1 -0
  9. package/dist/client.js +260 -0
  10. package/dist/client.js.map +1 -0
  11. package/dist/components/approval.d.ts +34 -0
  12. package/dist/components/approval.d.ts.map +1 -0
  13. package/dist/components/approval.js +80 -0
  14. package/dist/components/approval.js.map +1 -0
  15. package/dist/components/card.d.ts +22 -0
  16. package/dist/components/card.d.ts.map +1 -0
  17. package/dist/components/card.js +16 -0
  18. package/dist/components/card.js.map +1 -0
  19. package/dist/components/editor.d.ts +28 -0
  20. package/dist/components/editor.d.ts.map +1 -0
  21. package/dist/components/editor.js +161 -0
  22. package/dist/components/editor.js.map +1 -0
  23. package/dist/components/icons.d.ts +8 -0
  24. package/dist/components/icons.d.ts.map +1 -0
  25. package/dist/components/icons.js +14 -0
  26. package/dist/components/icons.js.map +1 -0
  27. package/dist/components/panel.d.ts +34 -0
  28. package/dist/components/panel.d.ts.map +1 -0
  29. package/dist/components/panel.js +216 -0
  30. package/dist/components/panel.js.map +1 -0
  31. package/dist/components/shared.d.ts +71 -0
  32. package/dist/components/shared.d.ts.map +1 -0
  33. package/dist/components/shared.js +104 -0
  34. package/dist/components/shared.js.map +1 -0
  35. package/dist/components/version-diff.d.ts +35 -0
  36. package/dist/components/version-diff.d.ts.map +1 -0
  37. package/dist/components/version-diff.js +85 -0
  38. package/dist/components/version-diff.js.map +1 -0
  39. package/dist/components/view.d.ts +40 -0
  40. package/dist/components/view.d.ts.map +1 -0
  41. package/dist/components/view.js +75 -0
  42. package/dist/components/view.js.map +1 -0
  43. package/dist/context.d.ts +59 -0
  44. package/dist/context.d.ts.map +1 -0
  45. package/dist/context.js +13 -0
  46. package/dist/context.js.map +1 -0
  47. package/dist/controls.d.ts +145 -0
  48. package/dist/controls.d.ts.map +1 -0
  49. package/dist/controls.js +188 -0
  50. package/dist/controls.js.map +1 -0
  51. package/dist/download.d.ts +4 -0
  52. package/dist/download.d.ts.map +1 -0
  53. package/dist/download.js +20 -0
  54. package/dist/download.js.map +1 -0
  55. package/dist/editor-session.d.ts +184 -0
  56. package/dist/editor-session.d.ts.map +1 -0
  57. package/dist/editor-session.js +614 -0
  58. package/dist/editor-session.js.map +1 -0
  59. package/dist/hooks.d.ts +85 -0
  60. package/dist/hooks.d.ts.map +1 -0
  61. package/dist/hooks.js +297 -0
  62. package/dist/hooks.js.map +1 -0
  63. package/dist/i18n.d.ts +197 -0
  64. package/dist/i18n.d.ts.map +1 -0
  65. package/dist/i18n.js +207 -0
  66. package/dist/i18n.js.map +1 -0
  67. package/dist/index.d.ts +22 -0
  68. package/dist/index.d.ts.map +1 -0
  69. package/dist/index.js +22 -0
  70. package/dist/index.js.map +1 -0
  71. package/dist/kit-css.d.ts +3 -0
  72. package/dist/kit-css.d.ts.map +1 -0
  73. package/dist/kit-css.js +5 -0
  74. package/dist/kit-css.js.map +1 -0
  75. package/dist/line-diff.d.ts +25 -0
  76. package/dist/line-diff.d.ts.map +1 -0
  77. package/dist/line-diff.js +96 -0
  78. package/dist/line-diff.js.map +1 -0
  79. package/dist/partial-json.d.ts +8 -0
  80. package/dist/partial-json.d.ts.map +1 -0
  81. package/dist/partial-json.js +176 -0
  82. package/dist/partial-json.js.map +1 -0
  83. package/dist/provider.d.ts +42 -0
  84. package/dist/provider.d.ts.map +1 -0
  85. package/dist/provider.js +95 -0
  86. package/dist/provider.js.map +1 -0
  87. package/dist/styles.d.ts +25 -0
  88. package/dist/styles.d.ts.map +1 -0
  89. package/dist/styles.js +203 -0
  90. package/dist/styles.js.map +1 -0
  91. package/dist/toolbar.d.ts +90 -0
  92. package/dist/toolbar.d.ts.map +1 -0
  93. package/dist/toolbar.js +233 -0
  94. package/dist/toolbar.js.map +1 -0
  95. package/package.json +50 -3
  96. package/src/cache.ts +132 -0
  97. package/src/client.ts +390 -0
  98. package/src/components/approval.tsx +219 -0
  99. package/src/components/card.tsx +87 -0
  100. package/src/components/editor.tsx +392 -0
  101. package/src/components/icons.tsx +14 -0
  102. package/src/components/panel.tsx +591 -0
  103. package/src/components/shared.tsx +207 -0
  104. package/src/components/version-diff.tsx +266 -0
  105. package/src/components/view.tsx +199 -0
  106. package/src/context.ts +82 -0
  107. package/src/controls.tsx +587 -0
  108. package/src/download.ts +23 -0
  109. package/src/editor-session.ts +738 -0
  110. package/src/hooks.ts +411 -0
  111. package/src/i18n.ts +217 -0
  112. package/src/index.ts +160 -0
  113. package/src/kit-css.ts +5 -0
  114. package/src/line-diff.ts +111 -0
  115. package/src/partial-json.ts +160 -0
  116. package/src/provider.tsx +176 -0
  117. package/src/styles.ts +222 -0
  118. 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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"}
@@ -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"}