@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
@@ -0,0 +1,192 @@
1
+ import { ArtifactError, applyOperations, isArtifactError, } from '@artkit-ai/core';
2
+ const DEFAULT_COALESCE_MS = 1000;
3
+ const DEFAULT_MAX_UNDO = 200;
4
+ /** Draft of one artifact with local undo and redo. Batches are applied in order, one at a time. */
5
+ export class DraftSession {
6
+ registry;
7
+ locale;
8
+ coalesceMs;
9
+ maxUndo;
10
+ now;
11
+ base;
12
+ current;
13
+ undoStack = [];
14
+ redoStack = [];
15
+ queue = Promise.resolve();
16
+ pending = 0;
17
+ error;
18
+ lint;
19
+ changes = [];
20
+ snapshot;
21
+ listeners = new Set();
22
+ disposed = false;
23
+ constructor(options) {
24
+ this.registry = options.registry;
25
+ this.locale = options.locale ?? 'en';
26
+ this.coalesceMs = options.coalesceMs ?? DEFAULT_COALESCE_MS;
27
+ this.maxUndo = options.maxUndo ?? DEFAULT_MAX_UNDO;
28
+ this.now = options.now ?? (() => Date.now());
29
+ this.base = options.artifact;
30
+ this.current = { artifact: options.artifact, operations: [], at: 0, typing: false };
31
+ this.lint = this.lintOf(options.artifact);
32
+ this.snapshot = this.buildSnapshot();
33
+ }
34
+ /** The current snapshot. Its identity changes only when the state changes. */
35
+ getSnapshot = () => this.snapshot;
36
+ subscribe = (listener) => {
37
+ this.listeners.add(listener);
38
+ return () => this.listeners.delete(listener);
39
+ };
40
+ /**
41
+ * Applies a batch to the draft. Resolves to `true` when the batch was accepted. A rejected batch leaves the draft
42
+ * untouched and sets `snapshot.error`.
43
+ */
44
+ apply(operations, options = {}) {
45
+ if (operations.length === 0)
46
+ return Promise.resolve(true);
47
+ this.pending += 1;
48
+ this.publish();
49
+ const run = this.queue.then(async () => {
50
+ if (this.disposed)
51
+ return false;
52
+ const typing = options.kind === 'typing' || options.kind === 'continuous';
53
+ try {
54
+ const result = await applyOperations(this.registry, this.current.artifact, operations, {
55
+ locale: this.locale,
56
+ });
57
+ const next = {
58
+ ...this.current.artifact,
59
+ formatVersion: result.formatVersion,
60
+ title: result.title,
61
+ locale: result.locale,
62
+ themeId: result.themeId,
63
+ content: result.content,
64
+ };
65
+ const now = this.now();
66
+ const coalesce = typing && this.current.typing && now - this.current.at <= this.coalesceMs;
67
+ if (!coalesce) {
68
+ this.undoStack.push(this.current);
69
+ if (this.undoStack.length > this.maxUndo)
70
+ this.undoStack.shift();
71
+ }
72
+ this.redoStack = [];
73
+ this.current = {
74
+ artifact: next,
75
+ operations: [...this.current.operations, ...operations],
76
+ at: now,
77
+ typing,
78
+ };
79
+ this.lint = result.lint;
80
+ this.changes = result.diff;
81
+ this.error = undefined;
82
+ return true;
83
+ }
84
+ catch (error) {
85
+ this.error = errorOf(error);
86
+ return false;
87
+ }
88
+ });
89
+ this.queue = run.finally(() => {
90
+ this.pending -= 1;
91
+ this.publish();
92
+ });
93
+ return run.then((accepted) => {
94
+ this.publish();
95
+ return accepted;
96
+ });
97
+ }
98
+ /** Steps back one edit (local). Returns false when there is nothing to undo. */
99
+ undo() {
100
+ const previous = this.undoStack.pop();
101
+ if (!previous)
102
+ return false;
103
+ this.redoStack.push(this.current);
104
+ this.restore(previous);
105
+ return true;
106
+ }
107
+ /** Steps forward after an undo. Returns false when there is nothing to redo. */
108
+ redo() {
109
+ const next = this.redoStack.pop();
110
+ if (!next)
111
+ return false;
112
+ this.undoStack.push(this.current);
113
+ this.restore(next);
114
+ return true;
115
+ }
116
+ /**
117
+ * Adopts an artifact loaded or saved by the application. A clean draft follows the new artifact. A draft that has
118
+ * changes keeps its content, and the base moves to the new version so the next save is a complete one.
119
+ */
120
+ load(artifact) {
121
+ if (artifact.id !== this.base.id)
122
+ throw new ArtifactError('INVALID_OPERATION', 'Load the same artifact.');
123
+ const clean = !this.buildSnapshot().dirty;
124
+ const sameContent = JSON.stringify(artifact.content) === JSON.stringify(this.current.artifact.content);
125
+ this.base = artifact;
126
+ if (clean || sameContent) {
127
+ this.current = { artifact, operations: [], at: 0, typing: false };
128
+ this.undoStack = [];
129
+ this.redoStack = [];
130
+ this.lint = this.lintOf(artifact);
131
+ this.changes = [];
132
+ }
133
+ this.publish();
134
+ }
135
+ /** Stops the session: later batches are ignored and listeners are dropped. */
136
+ dispose() {
137
+ this.disposed = true;
138
+ this.listeners.clear();
139
+ }
140
+ restore(step) {
141
+ this.current = step;
142
+ this.lint = this.lintOf(step.artifact);
143
+ this.changes = [];
144
+ this.error = undefined;
145
+ this.publish();
146
+ }
147
+ lintOf(artifact) {
148
+ const adapter = this.registry.get(artifact.format, this.locale);
149
+ return adapter.lint(artifact.content, {
150
+ locale: artifact.locale,
151
+ theme: this.registry.theme(artifact.themeId, this.locale),
152
+ });
153
+ }
154
+ publish() {
155
+ this.snapshot = this.buildSnapshot();
156
+ for (const listener of this.listeners)
157
+ listener();
158
+ }
159
+ buildSnapshot() {
160
+ const dirty = this.current.operations.length > 0 ||
161
+ JSON.stringify(this.current.artifact.content) !== JSON.stringify(this.base.content) ||
162
+ this.current.artifact.title !== this.base.title;
163
+ return {
164
+ baseVersion: this.base.version,
165
+ artifact: this.current.artifact,
166
+ operations: this.current.operations,
167
+ dirty,
168
+ canUndo: this.undoStack.length > 0,
169
+ canRedo: this.redoStack.length > 0,
170
+ pending: this.pending > 0,
171
+ ...(this.error ? { error: this.error } : {}),
172
+ lint: this.lint,
173
+ changes: this.changes,
174
+ };
175
+ }
176
+ }
177
+ function errorOf(error) {
178
+ if (isArtifactError(error)) {
179
+ const payload = error.toPayload();
180
+ return {
181
+ code: payload.error.code,
182
+ message: payload.error.message,
183
+ issues: payload.error.issues ?? [],
184
+ };
185
+ }
186
+ return {
187
+ code: 'INTERNAL_ERROR',
188
+ message: error instanceof Error ? error.message : String(error),
189
+ issues: [],
190
+ };
191
+ }
192
+ //# sourceMappingURL=editor-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editor-session.js","sourceRoot":"","sources":["../src/editor-session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ import { type Artifact, ArtifactError, type CommitResult } from '@artkit-ai/core';
2
+ import type { ClientExportResult } from './client.js';
3
+ export interface UseArtifactOptions {
4
+ /** Already-known artifact (e.g. from a chat message), shown immediately and cached. */
5
+ initial?: Artifact;
6
+ /** Revalidate the latest version on mount (default true). */
7
+ revalidate?: boolean;
8
+ }
9
+ export interface UseArtifactResult {
10
+ artifact: Artifact | undefined;
11
+ error: unknown;
12
+ loading: boolean;
13
+ /** Fetches the latest version again (specific versions never change). */
14
+ refresh(): Promise<Artifact | undefined>;
15
+ }
16
+ /** Loads an artifact through the client with a shared cache (spec §13.2). Pass undefined to skip. */
17
+ export declare function useArtifact(id: string | undefined, options?: UseArtifactOptions): UseArtifactResult;
18
+ /** Latest known version of an artifact in the cache, updated when commits arrive. */
19
+ export declare function useLatestVersion(id: string | undefined): number | undefined;
20
+ export interface ApplyConflict {
21
+ operations: unknown[];
22
+ baseVersion: number;
23
+ currentVersion?: number;
24
+ }
25
+ export interface ApplyOptions {
26
+ /** Defaults to the latest cached version (loaded when unknown). */
27
+ baseVersion?: number;
28
+ }
29
+ export interface UseApplyOperationsResult {
30
+ apply(operations: unknown[], options?: ApplyOptions): Promise<CommitResult>;
31
+ pending: boolean;
32
+ error: ArtifactError | undefined;
33
+ /** Set on VERSION_CONFLICT: what changed since the base, and the operations that were refused. */
34
+ conflict: ApplyConflict | undefined;
35
+ /** Sends the refused operations again on the latest version. */
36
+ retry(): Promise<CommitResult>;
37
+ reset(): void;
38
+ }
39
+ /** Sends operations with `baseVersion` and surfaces conflicts (spec §13.2). */
40
+ export declare function useApplyOperations(id: string): UseApplyOperationsResult;
41
+ export interface ExportOptions {
42
+ /** Triggers a browser download (default true). */
43
+ download?: boolean;
44
+ options?: Record<string, unknown>;
45
+ /** `auto` (default) exports in the browser when a browser-capable exporter is loaded. */
46
+ prefer?: 'auto' | 'browser' | 'server';
47
+ signal?: AbortSignal;
48
+ }
49
+ export interface UseArtifactExportResult {
50
+ exportArtifact(format: string, options?: ExportOptions): Promise<ClientExportResult>;
51
+ pending: string | undefined;
52
+ error: ArtifactError | undefined;
53
+ warnings: string[];
54
+ /** Formats available for the artifact's kind (server formats plus browser exporters). */
55
+ formats: string[];
56
+ /** Loads the kind's browser exporters so `formats` includes them. */
57
+ loadFormats(): Promise<void>;
58
+ }
59
+ /**
60
+ * Exports in the browser when a loaded exporter with runtime `any`/`browser` handles the format, else
61
+ * through the client (spec §13.2), and triggers a download.
62
+ */
63
+ export declare function useArtifactExport(id: string, format?: string): UseArtifactExportResult;
64
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,QAAQ,EACb,aAAa,EACb,KAAK,YAAY,EAIlB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAetD,MAAM,WAAW,kBAAkB;IACjC,uFAAuF;IACvF,OAAO,CAAC,EAAE,QAAQ,CAAC;IACnB,6DAA6D;IAC7D,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,yEAAyE;IACzE,OAAO,IAAI,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAC;CAC1C;AAED,qGAAqG;AACrG,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,GAAE,kBAAuB,GAAG,iBAAiB,CAmCvG;AAED,qFAAqF;AACrF,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAQ3E;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,OAAO,EAAE,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,mEAAmE;IACnE,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,wBAAwB;IACvC,KAAK,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC5E,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,aAAa,GAAG,SAAS,CAAC;IACjC,kGAAkG;IAClG,QAAQ,EAAE,aAAa,GAAG,SAAS,CAAC;IACpC,gEAAgE;IAChE,KAAK,IAAI,OAAO,CAAC,YAAY,CAAC,CAAC;IAC/B,KAAK,IAAI,IAAI,CAAC;CACf;AAED,+EAA+E;AAC/E,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,wBAAwB,CAmDvE;AAED,MAAM,WAAW,aAAa;IAC5B,kDAAkD;IAClD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,yFAAyF;IACzF,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;IACvC,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,uBAAuB;IACtC,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACrF,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,KAAK,EAAE,aAAa,GAAG,SAAS,CAAC;IACjC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,yFAAyF;IACzF,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,qEAAqE;IACrE,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,uBAAuB,CAyGtF"}
package/dist/hooks.js ADDED
@@ -0,0 +1,205 @@
1
+ import { ArtifactError, isArtifactError, silentLogger, slugify, } from '@artkit-ai/core';
2
+ import { useCallback, useEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react';
3
+ import { useArtkit } from './context.js';
4
+ import { triggerDownload } from './download.js';
5
+ const NO_ENTRY = Object.freeze({ loading: false });
6
+ const noop = () => { };
7
+ const noSubscription = () => noop;
8
+ function toArtifactError(error) {
9
+ if (isArtifactError(error))
10
+ return error;
11
+ return new ArtifactError('INTERNAL_ERROR', 'Internal error while processing the request.', {
12
+ cause: error,
13
+ });
14
+ }
15
+ /** Loads an artifact through the client with a shared cache (spec §13.2). Pass undefined to skip. */
16
+ export function useArtifact(id, options = {}) {
17
+ const { cache } = useArtkit();
18
+ const { initial, revalidate = true } = options;
19
+ const subscribe = useCallback((listener) => (id ? cache.subscribe(id, listener) : noop), [cache, id]);
20
+ const read = () => (id ? cache.entry(id) : NO_ENTRY);
21
+ const entry = useSyncExternalStore(id ? subscribe : noSubscription, read, read);
22
+ useEffect(() => {
23
+ if (initial && initial.id === id)
24
+ cache.put(initial);
25
+ }, [cache, id, initial]);
26
+ useEffect(() => {
27
+ if (!id)
28
+ return;
29
+ cache.load(id, revalidate).catch(noop);
30
+ }, [cache, id, revalidate]);
31
+ const usableInitial = initial && initial.id === id ? initial : undefined;
32
+ const artifact = entry.artifact && (!usableInitial || entry.artifact.version >= usableInitial.version)
33
+ ? entry.artifact
34
+ : (usableInitial ?? entry.artifact);
35
+ const refresh = useCallback(async () => {
36
+ if (!id)
37
+ return undefined;
38
+ return cache.load(id, true);
39
+ }, [cache, id]);
40
+ return {
41
+ artifact,
42
+ error: artifact ? undefined : entry.error,
43
+ loading: !artifact && !entry.error && id !== undefined,
44
+ refresh,
45
+ };
46
+ }
47
+ /** Latest known version of an artifact in the cache, updated when commits arrive. */
48
+ export function useLatestVersion(id) {
49
+ const { cache } = useArtkit();
50
+ const subscribe = useCallback((listener) => (id ? cache.subscribe(id, listener) : noop), [cache, id]);
51
+ const read = () => (id ? cache.latest(id)?.version : undefined);
52
+ return useSyncExternalStore(subscribe, read, read);
53
+ }
54
+ /** Sends operations with `baseVersion` and surfaces conflicts (spec §13.2). */
55
+ export function useApplyOperations(id) {
56
+ const { client, cache } = useArtkit();
57
+ const [state, setState] = useState({
58
+ pending: false,
59
+ });
60
+ const conflictRef = useRef(undefined);
61
+ const apply = useCallback(async (operations, options = {}) => {
62
+ setState({ pending: true });
63
+ let baseVersion = options.baseVersion;
64
+ try {
65
+ baseVersion ??= cache.latest(id)?.version ?? (await cache.load(id)).version;
66
+ const result = await client.apply(id, { baseVersion, operations });
67
+ cache.put(result.artifact);
68
+ conflictRef.current = undefined;
69
+ setState({ pending: false });
70
+ return result;
71
+ }
72
+ catch (caught) {
73
+ const error = toArtifactError(caught);
74
+ let conflict;
75
+ if (error.code === 'VERSION_CONFLICT') {
76
+ const current = error.details.currentVersion;
77
+ conflict = {
78
+ operations,
79
+ baseVersion: baseVersion ?? 0,
80
+ ...(typeof current === 'number' ? { currentVersion: current } : {}),
81
+ };
82
+ cache.load(id, true).catch(noop);
83
+ }
84
+ conflictRef.current = conflict;
85
+ setState({ pending: false, error, ...(conflict ? { conflict } : {}) });
86
+ throw error;
87
+ }
88
+ }, [client, cache, id]);
89
+ const retry = useCallback(async () => {
90
+ const conflict = conflictRef.current;
91
+ if (!conflict)
92
+ throw new ArtifactError('NOT_FOUND', 'There is no conflicting batch to retry.');
93
+ const latest = await cache.load(id, true);
94
+ return apply(conflict.operations, { baseVersion: latest.version });
95
+ }, [apply, cache, id]);
96
+ const reset = useCallback(() => {
97
+ conflictRef.current = undefined;
98
+ setState({ pending: false });
99
+ }, []);
100
+ return { apply, pending: state.pending, error: state.error, conflict: state.conflict, retry, reset };
101
+ }
102
+ /**
103
+ * Exports in the browser when a loaded exporter with runtime `any`/`browser` handles the format, else
104
+ * through the client (spec §13.2), and triggers a download.
105
+ */
106
+ export function useArtifactExport(id, format) {
107
+ const ctx = useArtkit();
108
+ const { client, cache, registry } = ctx;
109
+ const [pending, setPending] = useState(undefined);
110
+ const [error, setError] = useState(undefined);
111
+ const [warnings, setWarnings] = useState([]);
112
+ const [loaded, setLoaded] = useState([]);
113
+ const knownFormat = format ?? cache.latest(id)?.format;
114
+ const browserExporters = useCallback(async (artifactKind) => {
115
+ const fromRegistry = registry.exporters(artifactKind).filter((exporter) => exporter.runtime !== 'node');
116
+ if (!ctx.hasExporters(artifactKind))
117
+ return fromRegistry;
118
+ const lazy = (await ctx.loadExporters(artifactKind)).filter((exporter) => exporter.format === artifactKind && exporter.runtime !== 'node');
119
+ return [...lazy, ...fromRegistry];
120
+ }, [ctx, registry]);
121
+ const loadFormats = useCallback(async () => {
122
+ if (!knownFormat)
123
+ return;
124
+ try {
125
+ setLoaded(await browserExporters(knownFormat));
126
+ }
127
+ catch {
128
+ // Without browser exporters the server formats still work.
129
+ }
130
+ }, [browserExporters, knownFormat]);
131
+ const formats = useMemo(() => {
132
+ if (!knownFormat)
133
+ return [];
134
+ const set = new Set(ctx.exportFormats[knownFormat] ?? []);
135
+ for (const exporter of registry.exporters(knownFormat))
136
+ if (exporter.runtime !== 'node')
137
+ set.add(exporter.target);
138
+ for (const exporter of loaded)
139
+ set.add(exporter.target);
140
+ return [...set];
141
+ }, [ctx.exportFormats, knownFormat, loaded, registry]);
142
+ const exportArtifact = useCallback(async (format, options = {}) => {
143
+ setPending(format);
144
+ setError(undefined);
145
+ setWarnings([]);
146
+ try {
147
+ const artifact = cache.latest(id) ?? (await cache.load(id));
148
+ let result;
149
+ if (options.prefer !== 'server') {
150
+ const exporter = (await browserExporters(artifact.format).catch(() => [])).find((candidate) => candidate.target === format);
151
+ if (exporter) {
152
+ const collected = [];
153
+ let bytes;
154
+ try {
155
+ bytes = await exporter.export(artifact.content, {
156
+ title: artifact.title,
157
+ theme: ctx.themeFor(artifact.themeId),
158
+ locale: artifact.locale,
159
+ assets: ctx.assets ?? {
160
+ resolve: (ref) => Promise.reject(new ArtifactError('NOT_FOUND', `Asset not available in the browser: ${ref}.`)),
161
+ },
162
+ logger: silentLogger,
163
+ warn: (message) => collected.push(message),
164
+ ...(options.signal ? { signal: options.signal } : {}),
165
+ ...(options.options ? { options: options.options } : {}),
166
+ });
167
+ }
168
+ catch (cause) {
169
+ throw isArtifactError(cause)
170
+ ? cause
171
+ : new ArtifactError('EXPORT_FAILED', `Failed to export to ${format}.`, { cause });
172
+ }
173
+ result = {
174
+ bytes,
175
+ mimeType: exporter.mimeType,
176
+ filename: `${slugify(artifact.title)}.${exporter.extension}`,
177
+ warnings: collected,
178
+ };
179
+ }
180
+ else if (options.prefer === 'browser') {
181
+ throw new ArtifactError('EXPORT_FAILED', `No browser exporter for format ${format}.`);
182
+ }
183
+ }
184
+ result ??= await client.export(id, {
185
+ format,
186
+ ...(options.options ? { options: options.options } : {}),
187
+ ...(options.signal ? { signal: options.signal } : {}),
188
+ });
189
+ setWarnings(result.warnings);
190
+ if (options.download !== false)
191
+ triggerDownload(result);
192
+ return result;
193
+ }
194
+ catch (caught) {
195
+ const failure = toArtifactError(caught);
196
+ setError(failure);
197
+ throw failure;
198
+ }
199
+ finally {
200
+ setPending(undefined);
201
+ }
202
+ }, [browserExporters, cache, client, ctx, id]);
203
+ return { exportArtifact, pending, error, warnings, formats, loadFormats };
204
+ }
205
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"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"}
package/dist/i18n.d.ts ADDED
@@ -0,0 +1,135 @@
1
+ /** UI strings in pt-BR and en (spec §18.1). Templates use `{name}` placeholders. */
2
+ export declare const uiMessages: {
3
+ en: {
4
+ loading: string;
5
+ generating: string;
6
+ provisional: string;
7
+ noRenderer: string;
8
+ loadFailed: string;
9
+ retry: string;
10
+ close: string;
11
+ open: string;
12
+ openTitle: string;
13
+ version: string;
14
+ versionShort: string;
15
+ latest: string;
16
+ tabView: string;
17
+ tabCode: string;
18
+ tabEdit: string;
19
+ save: string;
20
+ tabsLabel: string;
21
+ copy: string;
22
+ copied: string;
23
+ export: string;
24
+ exportAs: string;
25
+ exporting: string;
26
+ exported: string;
27
+ exportWarnings: string;
28
+ noExportFormats: string;
29
+ rejectReason: string;
30
+ confirmReject: string;
31
+ cancel: string;
32
+ loadMore: string;
33
+ by: string;
34
+ actor_agent: string;
35
+ actor_user: string;
36
+ actor_system: string;
37
+ changes: string;
38
+ noChanges: string;
39
+ change_added: string;
40
+ change_removed: string;
41
+ change_changed: string;
42
+ change_moved: string;
43
+ diffUnified: string;
44
+ diffSplit: string;
45
+ diffViewLabel: string;
46
+ lineAdded: string;
47
+ lineRemoved: string;
48
+ undo: string;
49
+ redo: string;
50
+ undone: string;
51
+ redone: string;
52
+ saving: string;
53
+ saved: string;
54
+ unsaved: string;
55
+ rolledBack: string;
56
+ dismiss: string;
57
+ readOnly: string;
58
+ lockedBy: string;
59
+ lockedUntil: string;
60
+ reapplyMine: string;
61
+ editorLabel: string;
62
+ lintWarnings: string;
63
+ };
64
+ 'pt-BR': {
65
+ loading: string;
66
+ generating: string;
67
+ provisional: string;
68
+ noRenderer: string;
69
+ loadFailed: string;
70
+ retry: string;
71
+ close: string;
72
+ open: string;
73
+ openTitle: string;
74
+ version: string;
75
+ versionShort: string;
76
+ latest: string;
77
+ tabView: string;
78
+ tabCode: string;
79
+ tabEdit: string;
80
+ save: string;
81
+ tabsLabel: string;
82
+ copy: string;
83
+ copied: string;
84
+ export: string;
85
+ exportAs: string;
86
+ exporting: string;
87
+ exported: string;
88
+ exportWarnings: string;
89
+ noExportFormats: string;
90
+ rejectReason: string;
91
+ confirmReject: string;
92
+ cancel: string;
93
+ loadMore: string;
94
+ by: string;
95
+ actor_agent: string;
96
+ actor_user: string;
97
+ actor_system: string;
98
+ changes: string;
99
+ noChanges: string;
100
+ change_added: string;
101
+ change_removed: string;
102
+ change_changed: string;
103
+ change_moved: string;
104
+ diffUnified: string;
105
+ diffSplit: string;
106
+ diffViewLabel: string;
107
+ lineAdded: string;
108
+ lineRemoved: string;
109
+ undo: string;
110
+ redo: string;
111
+ undone: string;
112
+ redone: string;
113
+ saving: string;
114
+ saved: string;
115
+ unsaved: string;
116
+ rolledBack: string;
117
+ dismiss: string;
118
+ readOnly: string;
119
+ lockedBy: string;
120
+ lockedUntil: string;
121
+ reapplyMine: string;
122
+ editorLabel: string;
123
+ lintWarnings: string;
124
+ };
125
+ };
126
+ export type UiMessageKey = keyof (typeof uiMessages)['en'];
127
+ export type UiMessages = Record<UiMessageKey, string>;
128
+ /** Extra or overriding catalogs, keyed by BCP-47 tag (`es`, `pt-PT`) or language. */
129
+ export type UiMessageOverrides = Record<string, Partial<UiMessages>>;
130
+ export type Translate = (key: UiMessageKey, params?: Record<string, string | number>) => string;
131
+ /**
132
+ * Resolution order: exact override, language override, built-in catalog (pt* → pt-BR, else en), English.
133
+ */
134
+ export declare function createTranslator(locale: string, overrides?: UiMessageOverrides): Translate;
135
+ //# sourceMappingURL=i18n.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../src/i18n.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,eAAO,MAAM,UAAU;;QAEnB,OAAO;QACP,UAAU;QACV,WAAW;QACX,UAAU;QACV,UAAU;QACV,KAAK;QACL,KAAK;QACL,IAAI;QACJ,SAAS;QACT,OAAO;QACP,YAAY;QACZ,MAAM;QACN,OAAO;QACP,OAAO;QACP,OAAO;QACP,IAAI;QACJ,SAAS;QACT,IAAI;QACJ,MAAM;QACN,MAAM;QACN,QAAQ;QACR,SAAS;QACT,QAAQ;QACR,cAAc;QACd,eAAe;QACf,YAAY;QACZ,aAAa;QACb,MAAM;QACN,QAAQ;QACR,EAAE;QACF,WAAW;QACX,UAAU;QACV,YAAY;QACZ,OAAO;QACP,SAAS;QACT,YAAY;QACZ,cAAc;QACd,cAAc;QACd,YAAY;QACZ,WAAW;QACX,SAAS;QACT,aAAa;QACb,SAAS;QACT,WAAW;QACX,IAAI;QACJ,IAAI;QACJ,MAAM;QACN,MAAM;QACN,MAAM;QACN,KAAK;QACL,OAAO;QACP,UAAU;QACV,OAAO;QACP,QAAQ;QACR,QAAQ;QACR,WAAW;QACX,WAAW;QACX,WAAW;QACX,YAAY;;;QAGZ,OAAO;QACP,UAAU;QACV,WAAW;QACX,UAAU;QACV,UAAU;QACV,KAAK;QACL,KAAK;QACL,IAAI;QACJ,SAAS;QACT,OAAO;QACP,YAAY;QACZ,MAAM;QACN,OAAO;QACP,OAAO;QACP,OAAO;QACP,IAAI;QACJ,SAAS;QACT,IAAI;QACJ,MAAM;QACN,MAAM;QACN,QAAQ;QACR,SAAS;QACT,QAAQ;QACR,cAAc;QACd,eAAe;QACf,YAAY;QACZ,aAAa;QACb,MAAM;QACN,QAAQ;QACR,EAAE;QACF,WAAW;QACX,UAAU;QACV,YAAY;QACZ,OAAO;QACP,SAAS;QACT,YAAY;QACZ,cAAc;QACd,cAAc;QACd,YAAY;QACZ,WAAW;QACX,SAAS;QACT,aAAa;QACb,SAAS;QACT,WAAW;QACX,IAAI;QACJ,IAAI;QACJ,MAAM;QACN,MAAM;QACN,MAAM;QACN,KAAK;QACL,OAAO;QACP,UAAU;QACV,OAAO;QACP,QAAQ;QACR,QAAQ;QACR,WAAW;QACX,WAAW;QACX,WAAW;QACX,YAAY;;CAEkC,CAAC;AAEnD,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC;AAC3D,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;AAEtD,qFAAqF;AACrF,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;AAErE,MAAM,MAAM,SAAS,GAAG,CAAC,GAAG,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,KAAK,MAAM,CAAC;AAQhG;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,GAAE,kBAAuB,GAAG,SAAS,CAW9F"}