@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,132 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { ChevronDown, Copy, Download, X } from 'lucide-react';
3
+ import { useCallback, useEffect, useId, useMemo, useRef, useState, } from 'react';
4
+ import { useArtkit } from '../context.js';
5
+ import { useArtifact, useArtifactExport } from '../hooks.js';
6
+ import { ArtifactEditor } from './editor.js';
7
+ import { cx, ErrorMessage, formatLabel, Loading, rootAttributes, slot, useAnnouncer, } from './shared.js';
8
+ import { ArtifactView } from './view.js';
9
+ const TABS = ['view', 'edit', 'code'];
10
+ const TAB_LABEL = { view: 'tabView', edit: 'tabEdit', code: 'tabCode' };
11
+ /**
12
+ * Side panel of one artifact: View, Edit and Code tabs and the export menu (spec §13.1). There is no history, approval
13
+ * or archive here: the application owns versions and publication.
14
+ */
15
+ export function ArtifactPanel(props) {
16
+ const ctx = useArtkit();
17
+ const { t } = ctx;
18
+ const id = props.id ?? props.artifact?.id;
19
+ const latestQuery = useArtifact(id, props.artifact ? { initial: props.artifact } : {});
20
+ const latest = latestQuery.artifact;
21
+ const [ownTab, setOwnTab] = useState(props.defaultTab ?? 'view');
22
+ const tab = props.tab ?? ownTab;
23
+ const selectTab = (next) => {
24
+ setOwnTab(next);
25
+ props.onTabChange?.(next);
26
+ };
27
+ const exporter = useArtifactExport(id ?? '', latest?.format);
28
+ const [live, announce] = useAnnouncer();
29
+ const baseId = useId();
30
+ if (!latest || !id) {
31
+ return (_jsx("aside", { className: cx('ak-root ak-panel', props.className), ...rootAttributes(ctx), children: latestQuery.error ? (_jsx(ErrorMessage, { error: latestQuery.error, onRetry: () => void latestQuery.refresh().catch(() => undefined) })) : (_jsx(Loading, {})) }));
32
+ }
33
+ async function exportAs(format) {
34
+ try {
35
+ const result = await exporter.exportArtifact(format, {});
36
+ announce(t('exported', { filename: result.filename }));
37
+ }
38
+ catch {
39
+ // The hook keeps the error; it is rendered below.
40
+ }
41
+ }
42
+ const tabId = (name) => `${baseId}-tab-${name}`;
43
+ const panelId = (name) => `${baseId}-panel-${name}`;
44
+ const onTabKeyDown = (event) => {
45
+ const index = TABS.indexOf(tab);
46
+ let next;
47
+ if (event.key === 'ArrowRight')
48
+ next = TABS[(index + 1) % TABS.length];
49
+ else if (event.key === 'ArrowLeft')
50
+ next = TABS[(index + TABS.length - 1) % TABS.length];
51
+ else if (event.key === 'Home')
52
+ next = TABS[0];
53
+ else if (event.key === 'End')
54
+ next = TABS[TABS.length - 1];
55
+ if (!next)
56
+ return;
57
+ event.preventDefault();
58
+ selectTab(next);
59
+ document.getElementById(tabId(next))?.focus();
60
+ };
61
+ const exportFormats = props.exportFormats ?? exporter.formats;
62
+ return (_jsxs("aside", { className: cx('ak-root ak-panel', props.className), ...rootAttributes(ctx, latest.themeId), "aria-labelledby": `${baseId}-title`, "data-format": latest.format, children: [live, _jsxs("header", { ...slot(props.slots, 'header', 'ak-panel-header'), children: [_jsx("h2", { id: `${baseId}-title`, ...slot(props.slots, 'title', 'ak-panel-title'), children: latest.title }), _jsx("span", { className: "ak-history-meta", children: formatLabel(ctx, latest.format) }), _jsx("span", { className: "ak-badge", children: t('versionShort', { version: latest.version }) }), props.headerActions, _jsx(ExportMenu, { formats: exportFormats, pending: exporter.pending, onOpen: () => void exporter.loadFormats(), onSelect: (format) => void exportAs(format) }), props.onClose ? (_jsx("button", { type: "button", className: "ak-button", "data-variant": "quiet", onClick: props.onClose, "aria-label": t('close'), children: _jsx(X, { "aria-hidden": "true" }) })) : null] }), exporter.error ? _jsx(ErrorMessage, { error: exporter.error, className: "ak-panel-notice" }) : null, _jsx("div", { role: "tablist", "aria-label": latest.title, ...slot(props.slots, 'tabs', 'ak-tabs'), children: TABS.map((name) => (_jsx("button", { id: tabId(name), type: "button", role: "tab", className: "ak-tab", "aria-selected": tab === name, "aria-controls": panelId(name), tabIndex: tab === name ? 0 : -1, onClick: () => selectTab(name), onKeyDown: onTabKeyDown, children: t(TAB_LABEL[name]) }, name))) }), _jsxs("div", { id: panelId(tab), role: "tabpanel", "aria-labelledby": tabId(tab), ...slot(props.slots, 'body', 'ak-panel-body'), children: [tab === 'view' ? _jsx(ArtifactView, { artifact: latest }) : null, tab === 'edit' ? (_jsx(ArtifactEditor, { artifact: latest, ...(props.onSave ? { onSave: props.onSave } : {}), ...(props.onChange ? { onChange: props.onChange } : {}) })) : null, tab === 'code' ? _jsx(CodeTab, { artifact: latest, slots: props.slots }) : null] })] }));
63
+ }
64
+ function CodeTab({ artifact, slots, }) {
65
+ const { t } = useArtkit();
66
+ const [copied, setCopied] = useState(false);
67
+ const text = useMemo(() => (artifact ? JSON.stringify(artifact.content, null, 2) : ''), [artifact]);
68
+ if (!artifact)
69
+ return _jsx(Loading, {});
70
+ const clipboard = typeof navigator === 'undefined' ? undefined : navigator.clipboard;
71
+ return (_jsxs("div", { className: "ak-code-tab", children: [clipboard ? (_jsxs("button", { type: "button", className: "ak-button", onClick: () => {
72
+ clipboard.writeText(text).then(() => setCopied(true), () => setCopied(false));
73
+ }, children: [_jsx(Copy, { "aria-hidden": "true" }), copied ? t('copied') : t('copy')] })) : null, _jsx("pre", { ...slot(slots, 'code', 'ak-code'), children: _jsx("code", { children: text }) })] }));
74
+ }
75
+ function ExportMenu(props) {
76
+ const { t } = useArtkit();
77
+ const [open, setOpen] = useState(false);
78
+ const button = useRef(null);
79
+ const list = useRef(null);
80
+ const menuId = useId();
81
+ const items = useCallback(() => [...(list.current?.querySelectorAll('[role="menuitem"]') ?? [])], []);
82
+ useEffect(() => {
83
+ if (open)
84
+ items()[0]?.focus();
85
+ }, [open, items]);
86
+ const close = (refocus) => {
87
+ setOpen(false);
88
+ if (refocus)
89
+ button.current?.focus();
90
+ };
91
+ const onMenuKeyDown = (event) => {
92
+ const all = items();
93
+ const index = all.indexOf(document.activeElement);
94
+ let next;
95
+ if (event.key === 'ArrowDown')
96
+ next = all[(index + 1) % all.length];
97
+ else if (event.key === 'ArrowUp')
98
+ next = all[(index - 1 + all.length) % all.length];
99
+ else if (event.key === 'Home')
100
+ next = all[0];
101
+ else if (event.key === 'End')
102
+ next = all[all.length - 1];
103
+ else if (event.key === 'Escape') {
104
+ event.preventDefault();
105
+ close(true);
106
+ return;
107
+ }
108
+ else if (event.key === 'Tab') {
109
+ close(false);
110
+ return;
111
+ }
112
+ if (next) {
113
+ event.preventDefault();
114
+ next.focus();
115
+ }
116
+ };
117
+ return (_jsxs("div", { className: "ak-menu", children: [_jsxs("button", { ref: button, type: "button", className: "ak-button", "aria-haspopup": "menu", "aria-expanded": open, "aria-controls": open ? menuId : undefined, disabled: props.pending !== undefined, onClick: () => {
118
+ if (!open)
119
+ props.onOpen();
120
+ setOpen(!open);
121
+ }, onKeyDown: (event) => {
122
+ if (event.key === 'ArrowDown' && !open) {
123
+ event.preventDefault();
124
+ props.onOpen();
125
+ setOpen(true);
126
+ }
127
+ }, children: [_jsx(Download, { "aria-hidden": "true" }), props.pending ? t('exporting') : t('export'), _jsx(ChevronDown, { "aria-hidden": "true" })] }), open ? (_jsx("div", { ref: list, id: menuId, role: "menu", className: "ak-menu-list", "aria-label": t('export'), tabIndex: -1, onKeyDown: onMenuKeyDown, children: props.formats.length === 0 ? (_jsx("p", { className: "ak-menu-item", children: t('noExportFormats') })) : (props.formats.map((format) => (_jsx("button", { type: "button", role: "menuitem", className: "ak-menu-item", tabIndex: -1, "aria-label": t('exportAs', { format: format.toUpperCase() }), onClick: () => {
128
+ close(true);
129
+ props.onSelect(format);
130
+ }, children: format.toUpperCase() }, format)))) })) : null] }));
131
+ }
132
+ //# sourceMappingURL=panel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"panel.js","sourceRoot":"","sources":["../../src/components/panel.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ import type { ChangeSummary } from '@artkit-ai/core';
2
+ import { Component, type CSSProperties, type ErrorInfo, type ReactNode } from 'react';
3
+ import { type ArtkitContextValue } from '../context.js';
4
+ /**
5
+ * Customization without forking (spec §13.5): each named part of a component accepts extra classes and
6
+ * inline styles. Base classes (`ak-*`) stay, so overrides compose with the default CSS.
7
+ */
8
+ export type Slots<Part extends string> = Partial<Record<Part, {
9
+ className?: string;
10
+ style?: CSSProperties;
11
+ }>>;
12
+ export declare function cx(...classes: (string | false | null | undefined)[]): string;
13
+ export declare function slot<Part extends string>(slots: Slots<Part> | undefined, part: Part, base: string): {
14
+ className: string;
15
+ style?: CSSProperties;
16
+ };
17
+ /** Attributes of every artkit root element: theme scope and forced light/dark. */
18
+ export declare function rootAttributes(ctx: ArtkitContextValue, themeId?: string): Record<string, string>;
19
+ export declare function errorMessage(error: unknown, fallback: string): string;
20
+ export declare function ErrorMessage({ error, onRetry, onDismiss, className, style, }: {
21
+ error: unknown;
22
+ onRetry?: () => void;
23
+ onDismiss?: () => void;
24
+ className?: string;
25
+ style?: CSSProperties;
26
+ }): import("react").JSX.Element;
27
+ export declare function Loading({ label, className, style, }: {
28
+ label?: string;
29
+ className?: string;
30
+ style?: CSSProperties;
31
+ }): import("react").JSX.Element;
32
+ /**
33
+ * Polite live region for screen readers (spec §18.2). The text is cleared first so repeating the same
34
+ * message is announced again.
35
+ */
36
+ export declare function useAnnouncer(): [ReactNode, (message: string) => void];
37
+ export declare function ChangeList({ changes, className, style, }: {
38
+ changes: ChangeSummary[];
39
+ className?: string;
40
+ style?: CSSProperties;
41
+ }): import("react").JSX.Element;
42
+ interface BoundaryProps {
43
+ fallback: (error: unknown, reset: () => void) => ReactNode;
44
+ onReset?: () => void;
45
+ children?: ReactNode;
46
+ }
47
+ /** Catches loader and renderer failures so one broken kind does not take the page down. */
48
+ export declare class ErrorBoundary extends Component<BoundaryProps, {
49
+ error: unknown;
50
+ failed: boolean;
51
+ }> {
52
+ state: {
53
+ error: unknown;
54
+ failed: boolean;
55
+ };
56
+ static getDerivedStateFromError(error: unknown): {
57
+ error: unknown;
58
+ failed: boolean;
59
+ };
60
+ componentDidCatch(_error: unknown, _info: ErrorInfo): void;
61
+ reset: () => void;
62
+ render(): ReactNode;
63
+ }
64
+ export declare function formatDate(value: string, locale: string): string;
65
+ export declare function formatLabel(ctx: ArtkitContextValue, format: string): string;
66
+ export {};
67
+ //# sourceMappingURL=shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/components/shared.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGrD,OAAO,EACL,SAAS,EACT,KAAK,aAAa,EAClB,KAAK,SAAS,EACd,KAAK,SAAS,EAKf,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,KAAK,kBAAkB,EAAa,MAAM,eAAe,CAAC;AAGnE;;;GAGG;AACH,MAAM,MAAM,KAAK,CAAC,IAAI,SAAS,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,aAAa,CAAA;CAAE,CAAC,CAAC,CAAC;AAE9G,wBAAgB,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,MAAM,GAAG,KAAK,GAAG,IAAI,GAAG,SAAS,CAAC,EAAE,GAAG,MAAM,CAE5E;AAED,wBAAgB,IAAI,CAAC,IAAI,SAAS,MAAM,EACtC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,SAAS,EAC9B,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,MAAM,GACX;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,aAAa,CAAA;CAAE,CAG9C;AAED,kFAAkF;AAClF,wBAAgB,cAAc,CAAC,GAAG,EAAE,kBAAkB,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAKhG;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMrE;AAED,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,OAAO,EACP,SAAS,EACT,SAAS,EACT,KAAK,GACN,EAAE;IACD,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB,+BAkBA;AAED,wBAAgB,OAAO,CAAC,EACtB,KAAK,EACL,SAAS,EACT,KAAK,GACN,EAAE;IACD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB,+BAOA;AAED;;;GAGG;AACH,wBAAgB,YAAY,IAAI,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC,CAerE;AAED,wBAAgB,UAAU,CAAC,EACzB,OAAO,EACP,SAAS,EACT,KAAK,GACN,EAAE;IACD,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB,+BAcA;AAaD,UAAU,aAAa;IACrB,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,IAAI,KAAK,SAAS,CAAC;IAC3D,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,2FAA2F;AAC3F,qBAAa,aAAc,SAAQ,SAAS,CAAC,aAAa,EAAE;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC;IACrF,KAAK;QAAK,KAAK,EAAe,OAAO;QAAE,MAAM;MAAU;IAEhE,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,OAAO;;;MAE7C;IAEQ,iBAAiB,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,GAAG,IAAI,CAElE;IAED,KAAK,aAGH;IAEO,MAAM,cAGd;CACF;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAQhE;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAE3E"}
@@ -0,0 +1,100 @@
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 errorMessage(error, fallback) {
21
+ if (isArtifactError(error)) {
22
+ const hint = error.issues.find((issue) => issue.hint)?.hint;
23
+ return hint ? `${error.message} ${hint}` : error.message;
24
+ }
25
+ return fallback;
26
+ }
27
+ export function ErrorMessage({ error, onRetry, onDismiss, className, style, }) {
28
+ const { t } = useArtkit();
29
+ 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] }));
30
+ }
31
+ export function Loading({ label, className, style, }) {
32
+ const { t } = useArtkit();
33
+ return (_jsx("div", { className: cx('ak-loading', className), style: style, role: "status", "aria-busy": "true", children: label ?? t('loading') }));
34
+ }
35
+ /**
36
+ * Polite live region for screen readers (spec §18.2). The text is cleared first so repeating the same
37
+ * message is announced again.
38
+ */
39
+ export function useAnnouncer() {
40
+ const [message, setMessage] = useState('');
41
+ const frame = useRef(undefined);
42
+ useEffect(() => () => clearTimeout(frame.current), []);
43
+ const announce = useCallback((text) => {
44
+ setMessage('');
45
+ clearTimeout(frame.current);
46
+ frame.current = setTimeout(() => setMessage(text), 30);
47
+ }, []);
48
+ const node = (_jsx("div", { className: "ak-sr-only", role: "status", "aria-live": "polite", "aria-atomic": "true", children: message }));
49
+ return [node, announce];
50
+ }
51
+ export function ChangeList({ changes, className, style, }) {
52
+ const { t } = useArtkit();
53
+ if (changes.length === 0)
54
+ return _jsx("p", { className: "ak-notice", children: t('noChanges') });
55
+ 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))) }));
56
+ }
57
+ // Targets can repeat (changed + moved); a per-target counter keeps keys stable across renders.
58
+ function withKeys(changes) {
59
+ const seen = new Map();
60
+ return changes.map((change) => {
61
+ const base = `${change.type}:${change.target}`;
62
+ const count = seen.get(base) ?? 0;
63
+ seen.set(base, count + 1);
64
+ return { change, key: count === 0 ? base : `${base}#${count}` };
65
+ });
66
+ }
67
+ /** Catches loader and renderer failures so one broken kind does not take the page down. */
68
+ export class ErrorBoundary extends Component {
69
+ state = { error: undefined, failed: false };
70
+ static getDerivedStateFromError(error) {
71
+ return { error, failed: true };
72
+ }
73
+ componentDidCatch(_error, _info) {
74
+ // Rendering the fallback is enough; the host app can wrap its own reporting boundary around us.
75
+ }
76
+ reset = () => {
77
+ this.props.onReset?.();
78
+ this.setState({ error: undefined, failed: false });
79
+ };
80
+ render() {
81
+ if (this.state.failed)
82
+ return this.props.fallback(this.state.error, this.reset);
83
+ return this.props.children;
84
+ }
85
+ }
86
+ export function formatDate(value, locale) {
87
+ const date = new Date(value);
88
+ if (Number.isNaN(date.getTime()))
89
+ return value;
90
+ try {
91
+ return new Intl.DateTimeFormat(locale, { dateStyle: 'short', timeStyle: 'short' }).format(date);
92
+ }
93
+ catch {
94
+ return date.toISOString();
95
+ }
96
+ }
97
+ export function formatLabel(ctx, format) {
98
+ return ctx.registry.has(format) ? ctx.registry.get(format).label : format;
99
+ }
100
+ //# 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,39 @@
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 the artifact by id. */
9
+ id?: string;
10
+ /**
11
+ * Content still being streamed by the model: a partial object or the raw JSON text so far. It goes
12
+ * through `format.parsePartial` and shows as a provisional preview until a newer committed version
13
+ * arrives (spec §13.4).
14
+ */
15
+ partial?: unknown;
16
+ /** Kind of the partial content when no artifact exists yet. */
17
+ format?: string;
18
+ /** Theme and locale of the partial content when no artifact exists yet. */
19
+ themeId?: string;
20
+ locale?: string;
21
+ mode?: RenderContext['mode'];
22
+ className?: string;
23
+ slots?: Slots<ArtifactViewPart>;
24
+ }
25
+ /** Turns streamed content into renderable content, or undefined while nothing complete arrived yet. */
26
+ export declare function previewContent(ctx: ArtkitContextValue, format: string, partial: unknown): unknown;
27
+ export declare function renderContext(ctx: ArtkitContextValue, themeId: string | undefined, locale: string, mode: RenderContext['mode'], provisional: boolean): RenderContext;
28
+ /** Read-only view of any artifact by kind (spec §13.1). */
29
+ export declare function ArtifactView(props: ArtifactViewProps): import("react").JSX.Element;
30
+ interface FormatRendererProps {
31
+ format: string;
32
+ content: unknown;
33
+ ctx: RenderContext;
34
+ className?: string;
35
+ }
36
+ /** Lazy kind renderer with a JSON fallback when the kind has no renderer loader. */
37
+ export declare function FormatRenderer(props: FormatRendererProps): import("react").JSX.Element;
38
+ export {};
39
+ //# 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,8CAA8C;IAC9C,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,+DAA+D;IAC/D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,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,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAUjG;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,+BAuFpD;AAED,UAAU,mBAAmB;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,aAAa,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,oFAAoF;AACpF,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,+BAsBxD"}
@@ -0,0 +1,76 @@
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, format, partial) {
10
+ if (!ctx.registry.has(format))
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
+ // Adapters take the streamed text; structured partials (e.g. a workbook JSON) are serialized first.
17
+ return ctx.registry.get(format).parsePartial(typeof raw === 'string' ? raw : JSON.stringify(raw));
18
+ }
19
+ catch {
20
+ return undefined;
21
+ }
22
+ }
23
+ export function renderContext(ctx, themeId, locale, mode, provisional) {
24
+ return {
25
+ theme: ctx.themeFor(themeId),
26
+ locale,
27
+ mode,
28
+ ...(provisional ? { provisional: true } : {}),
29
+ ...(ctx.resolveAssetUrl ? { resolveAssetUrl: ctx.resolveAssetUrl } : {}),
30
+ };
31
+ }
32
+ /** Read-only view of any artifact by kind (spec §13.1). */
33
+ export function ArtifactView(props) {
34
+ const ctx = useArtkit();
35
+ const { t } = ctx;
36
+ const loaded = useArtifact(props.artifact ? undefined : props.id);
37
+ const committed = props.artifact ?? loaded.artifact;
38
+ // Remember which committed version was on screen when streaming started: any other version arriving
39
+ // afterwards is the commit that replaces the preview, even if the caller still passes `partial`.
40
+ const streamStart = useRef(null);
41
+ const stillLoading = !props.artifact && props.id !== undefined && loaded.loading;
42
+ if (props.partial === undefined)
43
+ streamStart.current = null;
44
+ else if (streamStart.current === null && !stillLoading)
45
+ streamStart.current = { version: committed?.version };
46
+ const showPartial = props.partial !== undefined &&
47
+ (streamStart.current === null || committed?.version === streamStart.current.version);
48
+ const format = props.format ?? committed?.format;
49
+ const partialContent = useMemo(() => (showPartial && format ? previewContent(ctx, format, props.partial) : undefined), [ctx, format, props.partial, showPartial]);
50
+ const themeId = committed?.themeId ?? props.themeId;
51
+ const locale = committed?.locale ?? props.locale ?? ctx.locale;
52
+ const mode = props.mode ?? 'screen';
53
+ const rootClass = cx('ak-root ak-view', props.className);
54
+ const attrs = rootAttributes(ctx, themeId);
55
+ if (showPartial) {
56
+ 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 || !format ? (_jsx(Loading, { label: t('generating'), ...slot(props.slots, 'loading', '') })) : (_jsx("div", { ...slot(props.slots, 'body', 'ak-view-body'), children: _jsx(FormatRenderer, { format: format, content: partialContent, ctx: renderContext(ctx, themeId, locale, mode, true) }) }))] }));
57
+ }
58
+ if (!committed) {
59
+ 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', '') })) }));
60
+ }
61
+ return (_jsx("div", { className: rootClass, ...attrs, lang: committed.locale, "data-format": committed.format, "data-version": committed.version, children: _jsx("div", { ...slot(props.slots, 'body', 'ak-view-body'), children: _jsx(FormatRenderer, { format: committed.format, content: committed.content, ctx: renderContext(ctx, themeId, locale, mode, false) }) }) }));
62
+ }
63
+ /** Lazy kind renderer with a JSON fallback when the kind has no renderer loader. */
64
+ export function FormatRenderer(props) {
65
+ const ctx = useArtkit();
66
+ if (!ctx.hasRenderer(props.format)) {
67
+ return (_jsxs("div", { className: props.className, children: [_jsx("p", { className: "ak-notice", children: ctx.t('noRenderer', { format: props.format }) }), _jsx("pre", { className: "ak-code", children: _jsx("code", { children: JSON.stringify(props.content, null, 2) }) })] }));
68
+ }
69
+ return (_jsx(ErrorBoundary, { onReset: () => ctx.resetLoad('renderer', props.format), fallback: (error, reset) => _jsx(ErrorMessage, { error: error, onRetry: reset }), children: _jsx(Suspense, { fallback: _jsx(Loading, {}), children: _jsx(LoadedRenderer, { ...props }) }) }));
70
+ }
71
+ function LoadedRenderer({ format, content, ctx: renderCtx, className }) {
72
+ const ctx = useArtkit();
73
+ const { Renderer, css } = use(ctx.loadRenderer(format));
74
+ return (_jsxs(_Fragment, { children: [css ? (_jsx("style", { href: `artkit-kind-${format}-${hashString(css)}`, precedence: "artkit", nonce: ctx.nonce, children: css })) : null, _jsx(Renderer, { content: content, ctx: renderCtx, ...(className ? { className } : {}) })] }));
75
+ }
76
+ //# 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,64 @@
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
+ * Who draws the undo, redo and save controls. `host` (default): the editor host shows them above the format editor.
22
+ * `format`: the format editor receives `actions` and draws them inside its own toolbar.
23
+ */
24
+ toolbar?: 'host' | 'format';
25
+ }
26
+ /**
27
+ * Lazy loaders per format, so the bundle only pulls what is shown (spec §13.6). Typical use:
28
+ * `renderers: { document: () => import('@artkit-ai/kind-document/react').then((m) => ({ Renderer: m.DocumentRenderer, css: m.documentCss })) }`.
29
+ */
30
+ export interface ArtifactLoaders {
31
+ renderers?: Record<string, () => Promise<RendererModule>>;
32
+ editors?: Record<string, () => Promise<EditorModule>>;
33
+ exporters?: Record<string, () => Promise<AnyArtifactExporter[]>>;
34
+ }
35
+ export type ColorScheme = 'light' | 'dark' | 'system';
36
+ export interface ArtkitContextValue {
37
+ registry: ArtifactRegistry;
38
+ client: ArtifactClient;
39
+ cache: ArtifactCache;
40
+ locale: string;
41
+ t: Translate;
42
+ appTheme: Theme;
43
+ colorScheme: ColorScheme;
44
+ /** Theme of an artifact: provider themes, then registry themes, then the application theme. */
45
+ themeFor(themeId: string | undefined): Theme;
46
+ resolveAssetUrl?: (ref: string) => string | undefined;
47
+ assets?: AssetResolver;
48
+ /** Formats the server can export, per format. */
49
+ exportFormats: Record<string, readonly string[]>;
50
+ hasRenderer(format: string): boolean;
51
+ hasEditor(format: string): boolean;
52
+ hasExporters(format: string): boolean;
53
+ loadRenderer(format: string): Promise<RendererModule>;
54
+ loadEditor(format: string): Promise<EditorModule>;
55
+ loadExporters(format: string): Promise<AnyArtifactExporter[]>;
56
+ /** Forgets a failed load so it can be retried. */
57
+ resetLoad(type: 'renderer' | 'editor' | 'exporters', format: string): void;
58
+ nonce?: string;
59
+ }
60
+ export declare const ArtkitContext: import("react").Context<ArtkitContextValue | null>;
61
+ /** The artkit context, or null outside `<ArtifactProvider>` (for components that also work standalone). */
62
+ export declare function useOptionalArtkit(): ArtkitContextValue | null;
63
+ export declare function useArtkit(): ArtkitContextValue;
64
+ //# 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;AAmEtE,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"}