@artkit-ai/react 0.0.0-stage → 0.2.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 (103) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +145 -2
  3. package/dist/cache.d.ts +31 -0
  4. package/dist/cache.d.ts.map +1 -0
  5. package/dist/cache.js +95 -0
  6. package/dist/cache.js.map +1 -0
  7. package/dist/client.d.ts +68 -0
  8. package/dist/client.d.ts.map +1 -0
  9. package/dist/client.js +233 -0
  10. package/dist/client.js.map +1 -0
  11. package/dist/components/card.d.ts +22 -0
  12. package/dist/components/card.d.ts.map +1 -0
  13. package/dist/components/card.js +16 -0
  14. package/dist/components/card.js.map +1 -0
  15. package/dist/components/editor.d.ts +41 -0
  16. package/dist/components/editor.d.ts.map +1 -0
  17. package/dist/components/editor.js +111 -0
  18. package/dist/components/editor.js.map +1 -0
  19. package/dist/components/icons.d.ts +8 -0
  20. package/dist/components/icons.d.ts.map +1 -0
  21. package/dist/components/icons.js +14 -0
  22. package/dist/components/icons.js.map +1 -0
  23. package/dist/components/panel.d.ts +31 -0
  24. package/dist/components/panel.d.ts.map +1 -0
  25. package/dist/components/panel.js +132 -0
  26. package/dist/components/panel.js.map +1 -0
  27. package/dist/components/shared.d.ts +67 -0
  28. package/dist/components/shared.d.ts.map +1 -0
  29. package/dist/components/shared.js +100 -0
  30. package/dist/components/shared.js.map +1 -0
  31. package/dist/components/view.d.ts +39 -0
  32. package/dist/components/view.d.ts.map +1 -0
  33. package/dist/components/view.js +76 -0
  34. package/dist/components/view.js.map +1 -0
  35. package/dist/context.d.ts +64 -0
  36. package/dist/context.d.ts.map +1 -0
  37. package/dist/context.js +13 -0
  38. package/dist/context.js.map +1 -0
  39. package/dist/controls.d.ts +145 -0
  40. package/dist/controls.d.ts.map +1 -0
  41. package/dist/controls.js +188 -0
  42. package/dist/controls.js.map +1 -0
  43. package/dist/download.d.ts +4 -0
  44. package/dist/download.d.ts.map +1 -0
  45. package/dist/download.js +20 -0
  46. package/dist/download.js.map +1 -0
  47. package/dist/editor-session.d.ts +96 -0
  48. package/dist/editor-session.d.ts.map +1 -0
  49. package/dist/editor-session.js +192 -0
  50. package/dist/editor-session.js.map +1 -0
  51. package/dist/hooks.d.ts +64 -0
  52. package/dist/hooks.d.ts.map +1 -0
  53. package/dist/hooks.js +205 -0
  54. package/dist/hooks.js.map +1 -0
  55. package/dist/i18n.d.ts +135 -0
  56. package/dist/i18n.d.ts.map +1 -0
  57. package/dist/i18n.js +145 -0
  58. package/dist/i18n.js.map +1 -0
  59. package/dist/index.d.ts +19 -0
  60. package/dist/index.d.ts.map +1 -0
  61. package/dist/index.js +18 -0
  62. package/dist/index.js.map +1 -0
  63. package/dist/kit-css.d.ts +3 -0
  64. package/dist/kit-css.d.ts.map +1 -0
  65. package/dist/kit-css.js +5 -0
  66. package/dist/kit-css.js.map +1 -0
  67. package/dist/partial-json.d.ts +8 -0
  68. package/dist/partial-json.d.ts.map +1 -0
  69. package/dist/partial-json.js +176 -0
  70. package/dist/partial-json.js.map +1 -0
  71. package/dist/provider.d.ts +42 -0
  72. package/dist/provider.d.ts.map +1 -0
  73. package/dist/provider.js +95 -0
  74. package/dist/provider.js.map +1 -0
  75. package/dist/styles.d.ts +25 -0
  76. package/dist/styles.d.ts.map +1 -0
  77. package/dist/styles.js +203 -0
  78. package/dist/styles.js.map +1 -0
  79. package/dist/toolbar.d.ts +90 -0
  80. package/dist/toolbar.d.ts.map +1 -0
  81. package/dist/toolbar.js +233 -0
  82. package/dist/toolbar.js.map +1 -0
  83. package/package.json +50 -3
  84. package/src/cache.ts +109 -0
  85. package/src/client.ts +342 -0
  86. package/src/components/card.tsx +86 -0
  87. package/src/components/editor.tsx +292 -0
  88. package/src/components/icons.tsx +14 -0
  89. package/src/components/panel.tsx +334 -0
  90. package/src/components/shared.tsx +198 -0
  91. package/src/components/view.tsx +196 -0
  92. package/src/context.ts +87 -0
  93. package/src/controls.tsx +587 -0
  94. package/src/download.ts +23 -0
  95. package/src/editor-session.ts +260 -0
  96. package/src/hooks.ts +296 -0
  97. package/src/i18n.ts +155 -0
  98. package/src/index.ts +128 -0
  99. package/src/kit-css.ts +5 -0
  100. package/src/partial-json.ts +160 -0
  101. package/src/provider.tsx +176 -0
  102. package/src/styles.ts +222 -0
  103. package/src/toolbar.tsx +536 -0
package/dist/client.js ADDED
@@ -0,0 +1,233 @@
1
+ import { ArtifactError, ERROR_CODES, isArtifactError, } from '@artkit-ai/core';
2
+ const STATUS_TO_CODE = {
3
+ 404: 'NOT_FOUND',
4
+ 403: 'PERMISSION_DENIED',
5
+ 409: 'VERSION_CONFLICT',
6
+ 423: 'LOCKED',
7
+ 413: 'LIMIT_EXCEEDED',
8
+ 422: 'INVALID_CONTENT',
9
+ };
10
+ function isErrorCode(value) {
11
+ return typeof value === 'string' && ERROR_CODES.includes(value);
12
+ }
13
+ function toIssues(value) {
14
+ if (!Array.isArray(value))
15
+ return undefined;
16
+ const issues = [];
17
+ for (const item of value) {
18
+ if (item === null || typeof item !== 'object')
19
+ continue;
20
+ const { path, message, hint } = item;
21
+ if (typeof message !== 'string')
22
+ continue;
23
+ issues.push({
24
+ path: typeof path === 'string' ? path : '',
25
+ message,
26
+ ...(typeof hint === 'string' ? { hint } : {}),
27
+ });
28
+ }
29
+ return issues;
30
+ }
31
+ /** Rebuilds an `ArtifactError` from an HTTP error response (`ModelErrorPayload` body, spec CONVENTIONS). */
32
+ export async function errorFromResponse(response) {
33
+ let body;
34
+ try {
35
+ body = await response.json();
36
+ }
37
+ catch {
38
+ body = undefined;
39
+ }
40
+ const error = body?.error;
41
+ const fallbackCode = STATUS_TO_CODE[response.status] ?? 'INTERNAL_ERROR';
42
+ if (error && typeof error === 'object' && typeof error.message === 'string') {
43
+ const issues = toIssues(error.issues);
44
+ const details = error.details && typeof error.details === 'object' && !Array.isArray(error.details)
45
+ ? error.details
46
+ : undefined;
47
+ return new ArtifactError(isErrorCode(error.code) ? error.code : fallbackCode, error.message, {
48
+ ...(issues ? { issues } : {}),
49
+ details: { ...details, status: response.status },
50
+ });
51
+ }
52
+ return new ArtifactError(fallbackCode, `Request failed with status ${response.status}.`, {
53
+ details: { status: response.status },
54
+ });
55
+ }
56
+ /** Parses `Content-Disposition`, preferring the RFC 5987 `filename*` form. */
57
+ export function filenameFromDisposition(header) {
58
+ if (!header)
59
+ return undefined;
60
+ const extended = /filename\*\s*=\s*(?:UTF-8|utf-8)?''([^;]+)/.exec(header);
61
+ if (extended?.[1]) {
62
+ try {
63
+ return sanitizeFilename(decodeURIComponent(extended[1].trim().replace(/^"|"$/g, '')));
64
+ }
65
+ catch {
66
+ // Fall through to the plain form when the encoded name is malformed.
67
+ }
68
+ }
69
+ const plain = /filename\s*=\s*("([^"]*)"|[^;]+)/.exec(header);
70
+ const value = plain?.[2] ?? plain?.[1];
71
+ return value ? sanitizeFilename(value.trim()) : undefined;
72
+ }
73
+ // The name ends up in a download attribute: strip any path a hostile server could smuggle in.
74
+ function sanitizeFilename(name) {
75
+ const base = name.split(/[\\/]/).pop()?.trim();
76
+ return base ? base : undefined;
77
+ }
78
+ function parseWarnings(header) {
79
+ if (!header)
80
+ return [];
81
+ try {
82
+ const parsed = JSON.parse(decodeURIComponent(header));
83
+ return Array.isArray(parsed) ? parsed.filter((item) => typeof item === 'string') : [];
84
+ }
85
+ catch {
86
+ return [];
87
+ }
88
+ }
89
+ function isAbortError(error) {
90
+ return typeof error === 'object' && error !== null && error.name === 'AbortError';
91
+ }
92
+ /** Reference client for the `@artkit-ai/node` routes (HTTP contract in docs/CONVENTIONS.md). */
93
+ export function createHttpClient(options = {}) {
94
+ const base = (options.baseUrl ?? '/api/artifacts').replace(/\/+$/, '');
95
+ const doFetch = options.fetch ?? ((input, init) => globalThis.fetch(input, init));
96
+ const path = (id, suffix) => `${base}${id === undefined ? '' : `/${encodeURIComponent(id)}`}${suffix ? `/${suffix}` : ''}`;
97
+ function withQuery(url, query) {
98
+ const params = new URLSearchParams();
99
+ for (const [key, value] of Object.entries(query))
100
+ if (value !== undefined && value !== '')
101
+ params.set(key, String(value));
102
+ const text = params.toString();
103
+ return text ? `${url}?${text}` : url;
104
+ }
105
+ async function send(method, url, body, signal) {
106
+ const headers = new Headers(typeof options.headers === 'function' ? await options.headers() : options.headers);
107
+ if (body !== undefined)
108
+ headers.set('Content-Type', 'application/json');
109
+ if (!headers.has('Accept'))
110
+ headers.set('Accept', 'application/json');
111
+ let response;
112
+ try {
113
+ response = await doFetch(url, {
114
+ method,
115
+ headers,
116
+ ...(body === undefined ? {} : { body: JSON.stringify(body) }),
117
+ ...(signal ? { signal } : {}),
118
+ ...(options.credentials ? { credentials: options.credentials } : {}),
119
+ });
120
+ }
121
+ catch (cause) {
122
+ if (isAbortError(cause))
123
+ throw cause;
124
+ throw new ArtifactError('INTERNAL_ERROR', 'Network request failed.', {
125
+ cause,
126
+ details: { network: true },
127
+ });
128
+ }
129
+ if (!response.ok)
130
+ throw await errorFromResponse(response);
131
+ return response;
132
+ }
133
+ async function json(method, url, body, signal) {
134
+ const response = await send(method, url, body, signal);
135
+ if (response.status === 204)
136
+ return undefined;
137
+ try {
138
+ return (await response.json());
139
+ }
140
+ catch (cause) {
141
+ throw new ArtifactError('INTERNAL_ERROR', 'Invalid JSON response.', {
142
+ cause,
143
+ details: { status: response.status },
144
+ });
145
+ }
146
+ }
147
+ return {
148
+ list: (filter = {}, page = {}, opts) => json('GET', withQuery(path(), { ...filter, limit: page.limit, cursor: page.cursor }), undefined, opts?.signal),
149
+ create: (request, opts) => json('POST', path(), request, opts?.signal),
150
+ get: (id, opts) => json('GET', path(id), undefined, opts?.signal),
151
+ read: (id, opts = {}) => json('GET', withQuery(path(id, 'read'), {
152
+ mode: opts.mode,
153
+ range: opts.range,
154
+ maxTokens: opts.maxTokens,
155
+ cursor: opts.cursor,
156
+ }), undefined, opts.signal),
157
+ apply: (id, input, opts) => json('POST', path(id, 'apply'), input, opts?.signal),
158
+ preview: (id, input, opts) => json('POST', path(id, 'preview'), input, opts?.signal),
159
+ lock: (id, opts) => json('POST', path(id, 'lock'), opts?.ttlMs === undefined ? {} : { ttlMs: opts.ttlMs }, opts?.signal),
160
+ async unlock(id, lock, opts) {
161
+ await send('DELETE', path(id, 'lock'), lock, opts?.signal);
162
+ },
163
+ getLock: (id, opts) => json('GET', path(id, 'lock'), undefined, opts?.signal),
164
+ async export(id, input) {
165
+ const response = await send('POST', path(id, 'export'), {
166
+ format: input.format,
167
+ ...(input.options ? { options: input.options } : {}),
168
+ }, input.signal);
169
+ const bytes = new Uint8Array(await response.arrayBuffer());
170
+ const mimeType = response.headers.get('Content-Type')?.split(';')[0]?.trim() || 'application/octet-stream';
171
+ return {
172
+ bytes,
173
+ mimeType,
174
+ filename: filenameFromDisposition(response.headers.get('Content-Disposition')) ?? `${id}.${input.format}`,
175
+ warnings: parseWarnings(response.headers.get('X-Artkit-Warnings')),
176
+ };
177
+ },
178
+ };
179
+ }
180
+ // ---------------------------------------------------------------------------------------------------
181
+ // In-process client
182
+ // ---------------------------------------------------------------------------------------------------
183
+ function normalizeError(error) {
184
+ if (isArtifactError(error) || isAbortError(error))
185
+ return error;
186
+ return new ArtifactError('INTERNAL_ERROR', 'Internal error while processing the request.', {
187
+ cause: error,
188
+ });
189
+ }
190
+ /**
191
+ * Wraps a core `ArtifactService` in-process (playground, tests, local apps). The scope is fixed by the
192
+ * application, never by the UI; pass a function to resolve it per call (e.g. after a login change).
193
+ */
194
+ export function createServiceClient(service, scope) {
195
+ const current = () => (typeof scope === 'function' ? scope() : scope);
196
+ const run = async (fn) => {
197
+ try {
198
+ return await fn(current());
199
+ }
200
+ catch (error) {
201
+ throw normalizeError(error);
202
+ }
203
+ };
204
+ return {
205
+ list: (filter, page) => run((s) => service.list(s, filter, page)),
206
+ create: (request) => run((s) => service.create(s, request)),
207
+ get: (id) => run((s) => service.get(s, id)),
208
+ read: (id, opts = {}) => run((s) => {
209
+ const { signal: _signal, ...rest } = opts;
210
+ return service.read(s, id, rest);
211
+ }),
212
+ apply: (id, input) => run((s) => service.apply(s, { artifactId: id, ...input })),
213
+ preview: (id, input) => run((s) => service.preview(s, { artifactId: id, ...input })),
214
+ lock: (id, opts) => run((s) => service.lock(s, id, opts?.ttlMs)),
215
+ unlock: (_id, lock) => run((s) => service.unlock(s, lock)),
216
+ getLock: (id) => run((s) => service.getLock(s, id)),
217
+ export: (id, input) => run(async (s) => {
218
+ const result = await service.export(s, {
219
+ artifactId: id,
220
+ format: input.format,
221
+ ...(input.options ? { options: input.options } : {}),
222
+ ...(input.signal ? { signal: input.signal } : {}),
223
+ });
224
+ return {
225
+ bytes: result.bytes,
226
+ mimeType: result.mimeType,
227
+ filename: result.filename,
228
+ warnings: result.warnings,
229
+ };
230
+ }),
231
+ };
232
+ }
233
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { ArtifactSummary } from '@artkit-ai/core';
2
+ import { type ReactNode } from 'react';
3
+ import { type Slots } from './shared.js';
4
+ export type ArtifactCardPart = 'body' | 'title' | 'meta' | 'open';
5
+ export interface ArtifactCardProps {
6
+ /** Summary or full artifact (only the summary fields are used). */
7
+ artifact: Pick<ArtifactSummary, 'id' | 'format' | 'title' | 'version'>;
8
+ onOpen?(artifact: ArtifactCardProps['artifact']): void;
9
+ /** Render the open action as a link instead of a button. */
10
+ href?: string;
11
+ /** Shows a "generating" badge while the agent is still streaming the artifact. */
12
+ streaming?: boolean;
13
+ /** Extra actions rendered after the open action. */
14
+ actions?: ReactNode;
15
+ /** Icon or thumbnail rendered before the text. */
16
+ icon?: ReactNode;
17
+ className?: string;
18
+ slots?: Slots<ArtifactCardPart>;
19
+ }
20
+ /** Compact card for chat messages: title, format, version and an open action (spec §13.1). */
21
+ export declare function ArtifactCard(props: ArtifactCardProps): import("react").JSX.Element;
22
+ //# sourceMappingURL=card.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"card.d.ts","sourceRoot":"","sources":["../../src/components/card.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEvD,OAAO,EAAE,KAAK,SAAS,EAAS,MAAM,OAAO,CAAC;AAG9C,OAAO,EAAmC,KAAK,KAAK,EAAQ,MAAM,aAAa,CAAC;AAEhF,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;AAElE,MAAM,WAAW,iBAAiB;IAChC,mEAAmE;IACnE,QAAQ,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC,CAAC;IACvE,MAAM,CAAC,CAAC,QAAQ,EAAE,iBAAiB,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC;IACvD,4DAA4D;IAC5D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kFAAkF;IAClF,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,oDAAoD;IACpD,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,kDAAkD;IAClD,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAC;CACjC;AAED,8FAA8F;AAC9F,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,+BA2DpD"}
@@ -0,0 +1,16 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { ArrowUpRight } from 'lucide-react';
3
+ import { useId } from 'react';
4
+ import { useArtkit } from '../context.js';
5
+ import { KindIcon } from './icons.js';
6
+ import { cx, formatLabel, rootAttributes, slot } from './shared.js';
7
+ /** Compact card for chat messages: title, format, version and an open action (spec §13.1). */
8
+ export function ArtifactCard(props) {
9
+ const ctx = useArtkit();
10
+ const { t } = ctx;
11
+ const { artifact } = props;
12
+ const openLabel = t('openTitle', { title: artifact.title });
13
+ const titleId = useId();
14
+ return (_jsxs("article", { className: cx('ak-root ak-card', props.className), ...rootAttributes(ctx), "aria-labelledby": titleId, "data-format": artifact.format, children: [props.icon ?? (_jsx("span", { className: "ak-card-icon", children: _jsx(KindIcon, { format: artifact.format }) })), _jsxs("div", { ...slot(props.slots, 'body', 'ak-card-body'), children: [_jsx("h3", { id: titleId, ...slot(props.slots, 'title', 'ak-card-title'), children: artifact.title }), _jsxs("div", { ...slot(props.slots, 'meta', 'ak-card-meta'), children: [_jsx("span", { children: formatLabel(ctx, artifact.format) }), _jsxs("span", { children: [_jsx("span", { className: "ak-sr-only", children: `${t('version')} ${artifact.version}` }), _jsx("span", { "aria-hidden": "true", children: t('versionShort', { version: artifact.version }) })] }), props.streaming ? (_jsx("span", { className: "ak-badge", "data-variant": "provisional", role: "status", children: t('generating') })) : null] })] }), props.href ? (_jsxs("a", { ...slot(props.slots, 'open', 'ak-button'), href: props.href, "aria-label": openLabel, onClick: props.onOpen ? () => props.onOpen?.(artifact) : undefined, children: [t('open'), _jsx(ArrowUpRight, { "aria-hidden": "true" })] })) : props.onOpen ? (_jsxs("button", { type: "button", ...slot(props.slots, 'open', 'ak-button'), "aria-label": openLabel, onClick: () => props.onOpen?.(artifact), children: [t('open'), _jsx(ArrowUpRight, { "aria-hidden": "true" })] })) : null, props.actions] }));
15
+ }
16
+ //# sourceMappingURL=card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"card.js","sourceRoot":"","sources":["../../src/components/card.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import type { Artifact } from '@artkit-ai/core';
2
+ import { type DraftSnapshot } from '../editor-session.js';
3
+ import { type Slots } from './shared.js';
4
+ /**
5
+ * What the application receives when the user clicks Save. The library does not store anything: the application
6
+ * decides what saving means (a new version, a database row, a sync to another system, nothing at all).
7
+ */
8
+ export interface SaveEvent {
9
+ artifactId: string;
10
+ format: string;
11
+ /** Version the draft started from. Pass it back as `baseVersion` when you apply `operations` yourself. */
12
+ baseVersion: number;
13
+ title: string;
14
+ locale: string;
15
+ themeId: string;
16
+ /** Full content of the draft. */
17
+ content: unknown;
18
+ /** Operations applied since `baseVersion`, in order. */
19
+ operations: unknown[];
20
+ }
21
+ export type ArtifactEditorPart = 'toolbar' | 'status' | 'body';
22
+ export interface ArtifactEditorProps {
23
+ /** Artifact to edit. Its content is the starting point of the draft. */
24
+ artifact?: Artifact;
25
+ /** Load the artifact by id through the client when `artifact` is not given. */
26
+ id?: string;
27
+ /** Read-only edition: the format editor is hidden and the view is shown instead. */
28
+ readOnly?: boolean;
29
+ /** Save action. Called with the draft; the application persists it and passes the saved artifact back. */
30
+ onSave?(event: SaveEvent): void | Promise<void>;
31
+ /** Called after every change of the draft. */
32
+ onChange?(snapshot: DraftSnapshot): void;
33
+ className?: string;
34
+ slots?: Slots<ArtifactEditorPart>;
35
+ }
36
+ /**
37
+ * Editor of one artifact (spec §11.6). Edits are applied to a local draft; nothing reaches the server. The Save button
38
+ * emits the draft through `onSave`, and Ctrl/Cmd+S does the same. Undo and redo are local.
39
+ */
40
+ export declare function ArtifactEditor(props: ArtifactEditorProps): import("react").JSX.Element;
41
+ //# sourceMappingURL=editor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editor.d.ts","sourceRoot":"","sources":["../../src/components/editor.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAA8B,MAAM,iBAAiB,CAAC;AAI5E,OAAO,EAAgB,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAGxE,OAAO,EAA4D,KAAK,KAAK,EAAQ,MAAM,aAAa,CAAC;AAGzG;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,0GAA0G;IAC1G,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,iCAAiC;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,wDAAwD;IACxD,UAAU,EAAE,OAAO,EAAE,CAAC;CACvB;AAED,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE/D,MAAM,WAAW,mBAAmB;IAClC,wEAAwE;IACxE,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,+EAA+E;IAC/E,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,oFAAoF;IACpF,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,0GAA0G;IAC1G,MAAM,CAAC,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,8CAA8C;IAC9C,QAAQ,CAAC,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,kBAAkB,CAAC,CAAC;CACnC;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,+BA8BxD"}
@@ -0,0 +1,111 @@
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Redo2, Save, Undo2 } from 'lucide-react';
3
+ import { Suspense, use, useEffect, useMemo, useState, useSyncExternalStore } from 'react';
4
+ import { useArtkit } from '../context.js';
5
+ import { DraftSession } from '../editor-session.js';
6
+ import { useArtifact } from '../hooks.js';
7
+ import { hashString } from '../styles.js';
8
+ import { cx, ErrorBoundary, ErrorMessage, Loading, rootAttributes, slot } from './shared.js';
9
+ import { ArtifactView, renderContext } from './view.js';
10
+ /**
11
+ * Editor of one artifact (spec §11.6). Edits are applied to a local draft; nothing reaches the server. The Save button
12
+ * emits the draft through `onSave`, and Ctrl/Cmd+S does the same. Undo and redo are local.
13
+ */
14
+ export function ArtifactEditor(props) {
15
+ const ctx = useArtkit();
16
+ const fetched = useArtifact(props.artifact ? undefined : props.id);
17
+ const artifact = props.artifact ?? fetched.artifact;
18
+ if (!artifact) {
19
+ return (_jsx("div", { className: cx('ak-root ak-editor', props.className), ...rootAttributes(ctx), children: fetched.error ? (_jsx(ErrorMessage, { error: fetched.error, onRetry: () => void fetched.refresh().catch(() => undefined) })) : (_jsx(Loading, {})) }));
20
+ }
21
+ const editable = !props.readOnly && ctx.hasEditor(artifact.format) && ctx.registry.has(artifact.format);
22
+ if (!editable) {
23
+ return (_jsx("div", { className: cx('ak-root ak-editor', props.className), ...rootAttributes(ctx, artifact.themeId), "data-readonly": "true", children: _jsx(ArtifactView, { artifact: artifact }) }));
24
+ }
25
+ return _jsx(EditingHost, { ...props, artifact: artifact }, artifact.id);
26
+ }
27
+ function EditingHost({ artifact, readOnly, onSave, onChange, className, slots, }) {
28
+ const ctx = useArtkit();
29
+ const [session] = useState(() => new DraftSession({ registry: ctx.registry, artifact, locale: ctx.locale }));
30
+ const snapshot = useSyncExternalStore(session.subscribe, session.getSnapshot, session.getSnapshot);
31
+ const [saving, setSaving] = useState(false);
32
+ const [saveError, setSaveError] = useState();
33
+ // A newer artifact from the application (after a save, or a reload) moves the draft forward.
34
+ useEffect(() => {
35
+ if (artifact.version !== session.getSnapshot().baseVersion ||
36
+ artifact.id !== session.getSnapshot().artifact.id) {
37
+ session.load(artifact);
38
+ }
39
+ }, [artifact, session]);
40
+ useEffect(() => {
41
+ onChange?.(snapshot);
42
+ }, [snapshot, onChange]);
43
+ const draft = snapshot.artifact;
44
+ const canSave = Boolean(onSave) && snapshot.dirty && !saving && !readOnly;
45
+ async function save() {
46
+ if (!canSave || !onSave)
47
+ return;
48
+ setSaving(true);
49
+ setSaveError(undefined);
50
+ try {
51
+ await onSave({
52
+ artifactId: draft.id,
53
+ format: draft.format,
54
+ baseVersion: snapshot.baseVersion,
55
+ title: draft.title,
56
+ locale: draft.locale,
57
+ themeId: draft.themeId,
58
+ content: draft.content,
59
+ operations: snapshot.operations,
60
+ });
61
+ }
62
+ catch (error) {
63
+ setSaveError(error);
64
+ }
65
+ finally {
66
+ setSaving(false);
67
+ }
68
+ }
69
+ function onKeyDown(event) {
70
+ if (event.defaultPrevented || !(event.metaKey || event.ctrlKey))
71
+ return;
72
+ const key = event.key.toLowerCase();
73
+ if (key === 's') {
74
+ event.preventDefault();
75
+ void save();
76
+ }
77
+ else if (key === 'z' && !event.shiftKey) {
78
+ event.preventDefault();
79
+ session.undo();
80
+ }
81
+ else if (key === 'y' || (key === 'z' && event.shiftKey)) {
82
+ event.preventDefault();
83
+ session.redo();
84
+ }
85
+ }
86
+ const emit = (operations, options) => {
87
+ void session.apply(operations, { ...(options?.kind ? { kind: options.kind } : {}) });
88
+ };
89
+ const actions = {
90
+ canUndo: snapshot.canUndo,
91
+ canRedo: snapshot.canRedo,
92
+ undo: () => session.undo(),
93
+ redo: () => session.redo(),
94
+ dirty: snapshot.dirty,
95
+ saving,
96
+ canSave,
97
+ save: () => void save(),
98
+ };
99
+ return (_jsxs("section", { className: cx('ak-root ak-editor', className), ...rootAttributes(ctx, draft.themeId), "data-dirty": snapshot.dirty || undefined, onKeyDown: onKeyDown, children: [snapshot.error ? _jsx(ErrorMessage, { error: snapshot.error, onDismiss: () => session.undo() }) : null, saveError ? _jsx(ErrorMessage, { error: saveError }) : null, _jsx("div", { ...slot(slots, 'body', 'ak-editor-body'), children: _jsx(ErrorBoundary, { fallback: (error) => _jsx(ErrorMessage, { error: error }), children: _jsx(Suspense, { fallback: _jsx(Loading, {}), children: _jsx(LoadedEditor, { slots: slots, actions: actions, format: draft.format, content: draft.content, ctx: ctx, themeId: draft.themeId, locale: draft.locale, emit: emit, readOnly: Boolean(readOnly), lint: snapshot.lint }) }) }) })] }));
100
+ }
101
+ function LoadedEditor({ format, content, ctx, themeId, locale, emit, readOnly, lint, actions, slots, }) {
102
+ const { Editor, css, toolbar } = use(ctx.loadEditor(format));
103
+ const renderCtx = useMemo(() => renderContext(ctx, themeId, locale, 'screen', false), [ctx, themeId, locale]);
104
+ return (_jsxs(_Fragment, { children: [css ? (_jsx("style", { href: `artkit-editor-${format}-${hashString(css)}`, precedence: "artkit", nonce: ctx.nonce, children: css })) : null, toolbar === 'format' ? null : _jsx(HostToolbar, { actions: actions, slots: slots }), _jsx(Editor, { content: content, ctx: renderCtx, emit: emit, readOnly: readOnly, lint: lint, actions: actions })] }));
105
+ }
106
+ /** Undo, redo, save status and save, drawn by the host above editors that do not draw their own toolbar. */
107
+ function HostToolbar({ actions, slots }) {
108
+ const { t } = useArtkit();
109
+ return (_jsxs("header", { ...slot(slots, 'toolbar', 'ak-editor-toolbar'), children: [_jsxs("div", { className: "ak-editor-history", children: [_jsx("button", { type: "button", className: "ak-button", "data-variant": "quiet", disabled: !actions.canUndo, onClick: actions.undo, "aria-label": t('undo'), title: t('undo'), children: _jsx(Undo2, { "aria-hidden": "true" }) }), _jsx("button", { type: "button", className: "ak-button", "data-variant": "quiet", disabled: !actions.canRedo, onClick: actions.redo, "aria-label": t('redo'), title: t('redo'), children: _jsx(Redo2, { "aria-hidden": "true" }) })] }), _jsx("span", { ...slot(slots, 'status', 'ak-editor-status'), role: "status", "aria-live": "polite", children: actions.dirty ? t('unsaved') : t('saved') }), _jsxs("button", { type: "button", className: "ak-button", "data-variant": "primary", disabled: !actions.canSave, onClick: actions.save, children: [_jsx(Save, { "aria-hidden": "true" }), actions.saving ? t('saving') : t('save')] })] }));
110
+ }
111
+ //# sourceMappingURL=editor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editor.js","sourceRoot":"","sources":["../../src/components/editor.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { type LucideIcon } from 'lucide-react';
2
+ /** Lucide icon per native kind; unknown kinds get a generic file. */
3
+ export declare const KIND_ICONS: Record<string, LucideIcon>;
4
+ export declare function KindIcon({ format, className }: {
5
+ format: string;
6
+ className?: string;
7
+ }): import("react").JSX.Element;
8
+ //# sourceMappingURL=icons.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icons.d.ts","sourceRoot":"","sources":["../../src/components/icons.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,UAAU,EAAiC,MAAM,cAAc,CAAC;AAE9F,qEAAqE;AACrE,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAKjD,CAAC;AAEF,wBAAgB,QAAQ,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,+BAGrF"}
@@ -0,0 +1,14 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { File, FileText, Presentation, Sheet, Workflow } from 'lucide-react';
3
+ /** Lucide icon per native kind; unknown kinds get a generic file. */
4
+ export const KIND_ICONS = {
5
+ document: FileText,
6
+ sheet: Sheet,
7
+ slides: Presentation,
8
+ diagram: Workflow,
9
+ };
10
+ export function KindIcon({ format, className }) {
11
+ const Icon = KIND_ICONS[format] ?? File;
12
+ return _jsx(Icon, { "aria-hidden": "true", focusable: "false", className: className });
13
+ }
14
+ //# sourceMappingURL=icons.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icons.js","sourceRoot":"","sources":["../../src/components/icons.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAmB,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAE9F,qEAAqE;AACrE,MAAM,CAAC,MAAM,UAAU,GAA+B;IACpD,QAAQ,EAAE,QAAQ;IAClB,KAAK,EAAE,KAAK;IACZ,MAAM,EAAE,YAAY;IACpB,OAAO,EAAE,QAAQ;CAClB,CAAC;AAEF,MAAM,UAAU,QAAQ,CAAC,EAAE,MAAM,EAAE,SAAS,EAA0C;IACpF,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC;IACxC,OAAO,KAAC,IAAI,mBAAa,MAAM,EAAC,SAAS,EAAC,OAAO,EAAC,SAAS,EAAE,SAAS,GAAI,CAAC;AAC7E,CAAC"}
@@ -0,0 +1,31 @@
1
+ import type { Artifact } from '@artkit-ai/core';
2
+ import { type ReactNode } from 'react';
3
+ import type { DraftSnapshot } from '../editor-session.js';
4
+ import { type ArtifactEditorProps } from './editor.js';
5
+ import { type Slots } from './shared.js';
6
+ export type PanelTab = 'view' | 'edit' | 'code';
7
+ export type ArtifactPanelPart = 'header' | 'title' | 'toolbar' | 'tabs' | 'body' | 'code';
8
+ export interface ArtifactPanelProps {
9
+ id?: string;
10
+ artifact?: Artifact;
11
+ tab?: PanelTab;
12
+ defaultTab?: PanelTab;
13
+ onTabChange?(tab: PanelTab): void;
14
+ /** Save action of the editor tab: the application decides what saving means. */
15
+ onSave?: ArtifactEditorProps['onSave'];
16
+ /** Draft changes, forwarded from the editor tab. */
17
+ onChange?(snapshot: DraftSnapshot): void;
18
+ /** Export formats; defaults to the provider's server formats plus browser exporters. */
19
+ exportFormats?: string[];
20
+ onClose?(): void;
21
+ /** Extra controls rendered in the header. */
22
+ headerActions?: ReactNode;
23
+ className?: string;
24
+ slots?: Slots<ArtifactPanelPart>;
25
+ }
26
+ /**
27
+ * Side panel of one artifact: View, Edit and Code tabs and the export menu (spec §13.1). There is no history, approval
28
+ * or archive here: the application owns versions and publication.
29
+ */
30
+ export declare function ArtifactPanel(props: ArtifactPanelProps): import("react").JSX.Element;
31
+ //# sourceMappingURL=panel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"panel.d.ts","sourceRoot":"","sources":["../../src/components/panel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEhD,OAAO,EAEL,KAAK,SAAS,EAOf,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAG1D,OAAO,EAAkB,KAAK,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,EAML,KAAK,KAAK,EAGX,MAAM,aAAa,CAAC;AAGrB,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAChD,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAE1F,MAAM,WAAW,kBAAkB;IACjC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,GAAG,CAAC,EAAE,QAAQ,CAAC;IACf,UAAU,CAAC,EAAE,QAAQ,CAAC;IACtB,WAAW,CAAC,CAAC,GAAG,EAAE,QAAQ,GAAG,IAAI,CAAC;IAClC,gFAAgF;IAChF,MAAM,CAAC,EAAE,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IACvC,oDAAoD;IACpD,QAAQ,CAAC,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAC;IACzC,wFAAwF;IACxF,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,OAAO,CAAC,IAAI,IAAI,CAAC;IACjB,6CAA6C;IAC7C,aAAa,CAAC,EAAE,SAAS,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC,CAAC;CAClC;AAKD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,+BAkItD"}