@artkit-ai/react 0.1.0 → 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 (89) hide show
  1. package/dist/cache.d.ts +7 -11
  2. package/dist/cache.d.ts.map +1 -1
  3. package/dist/cache.js +32 -53
  4. package/dist/cache.js.map +1 -1
  5. package/dist/client.d.ts +4 -15
  6. package/dist/client.d.ts.map +1 -1
  7. package/dist/client.js +2 -29
  8. package/dist/client.js.map +1 -1
  9. package/dist/components/card.d.ts +2 -2
  10. package/dist/components/card.d.ts.map +1 -1
  11. package/dist/components/card.js +3 -3
  12. package/dist/components/card.js.map +1 -1
  13. package/dist/components/editor.d.ts +31 -18
  14. package/dist/components/editor.d.ts.map +1 -1
  15. package/dist/components/editor.js +81 -131
  16. package/dist/components/editor.js.map +1 -1
  17. package/dist/components/icons.d.ts +2 -2
  18. package/dist/components/icons.d.ts.map +1 -1
  19. package/dist/components/icons.js +2 -2
  20. package/dist/components/icons.js.map +1 -1
  21. package/dist/components/panel.d.ts +13 -16
  22. package/dist/components/panel.d.ts.map +1 -1
  23. package/dist/components/panel.js +13 -97
  24. package/dist/components/panel.js.map +1 -1
  25. package/dist/components/shared.d.ts +2 -6
  26. package/dist/components/shared.d.ts.map +1 -1
  27. package/dist/components/shared.js +2 -6
  28. package/dist/components/shared.js.map +1 -1
  29. package/dist/components/view.d.ts +7 -8
  30. package/dist/components/view.d.ts.map +1 -1
  31. package/dist/components/view.js +16 -15
  32. package/dist/components/view.js.map +1 -1
  33. package/dist/context.d.ts +14 -9
  34. package/dist/context.d.ts.map +1 -1
  35. package/dist/context.js.map +1 -1
  36. package/dist/editor-session.d.ts +77 -165
  37. package/dist/editor-session.d.ts.map +1 -1
  38. package/dist/editor-session.js +164 -586
  39. package/dist/editor-session.js.map +1 -1
  40. package/dist/hooks.d.ts +2 -23
  41. package/dist/hooks.d.ts.map +1 -1
  42. package/dist/hooks.js +24 -116
  43. package/dist/hooks.js.map +1 -1
  44. package/dist/i18n.d.ts +4 -66
  45. package/dist/i18n.d.ts.map +1 -1
  46. package/dist/i18n.js +6 -68
  47. package/dist/i18n.js.map +1 -1
  48. package/dist/index.d.ts +6 -9
  49. package/dist/index.d.ts.map +1 -1
  50. package/dist/index.js +4 -8
  51. package/dist/index.js.map +1 -1
  52. package/dist/provider.d.ts +1 -1
  53. package/dist/provider.d.ts.map +1 -1
  54. package/dist/provider.js +12 -12
  55. package/dist/provider.js.map +1 -1
  56. package/dist/styles.d.ts +1 -1
  57. package/dist/styles.d.ts.map +1 -1
  58. package/dist/styles.js +4 -4
  59. package/package.json +2 -2
  60. package/src/cache.ts +32 -55
  61. package/src/client.ts +7 -55
  62. package/src/components/card.tsx +6 -7
  63. package/src/components/editor.tsx +208 -308
  64. package/src/components/icons.tsx +2 -2
  65. package/src/components/panel.tsx +43 -300
  66. package/src/components/shared.tsx +3 -12
  67. package/src/components/view.tsx +26 -29
  68. package/src/context.ts +16 -11
  69. package/src/editor-session.ts +197 -675
  70. package/src/hooks.ts +25 -140
  71. package/src/i18n.ts +6 -68
  72. package/src/index.ts +7 -39
  73. package/src/provider.tsx +13 -13
  74. package/src/styles.ts +4 -4
  75. package/dist/components/approval.d.ts +0 -34
  76. package/dist/components/approval.d.ts.map +0 -1
  77. package/dist/components/approval.js +0 -80
  78. package/dist/components/approval.js.map +0 -1
  79. package/dist/components/version-diff.d.ts +0 -35
  80. package/dist/components/version-diff.d.ts.map +0 -1
  81. package/dist/components/version-diff.js +0 -85
  82. package/dist/components/version-diff.js.map +0 -1
  83. package/dist/line-diff.d.ts +0 -25
  84. package/dist/line-diff.d.ts.map +0 -1
  85. package/dist/line-diff.js +0 -96
  86. package/dist/line-diff.js.map +0 -1
  87. package/src/components/approval.tsx +0 -219
  88. package/src/components/version-diff.tsx +0 -266
  89. package/src/line-diff.ts +0 -111
@@ -1 +0,0 @@
1
- {"version":3,"file":"approval.d.ts","sourceRoot":"","sources":["../../src/components/approval.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEhD,OAAO,EAAE,KAAK,aAAa,EAAmB,MAAM,OAAO,CAAC;AAG5D,OAAO,EAKL,KAAK,KAAK,EAIX,MAAM,aAAa,CAAC;AAGrB,MAAM,MAAM,oBAAoB,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;AAE5E,MAAM,WAAW,qBAAqB;IACpC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,iDAAiD;IACjD,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,UAAU,CAAC,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IACtC,UAAU,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,oBAAoB,CAAC,CAAC;CACrC;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,+BA8H5D;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,OAAO,CAAC;IACd,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,IAAI,IAAI,CAAC;IACjB,QAAQ,IAAI,IAAI,CAAC;IACjB,aAAa,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,aAAa,CAAA;KAAE,CAAC;CAC/D;AAED,uFAAuF;AACvF,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,+BA6ChD"}
@@ -1,80 +0,0 @@
1
- import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { Check, X } from 'lucide-react';
3
- import { useId, useState } from 'react';
4
- import { useArtkit } from '../context.js';
5
- import { useArtifact } from '../hooks.js';
6
- import { cx, ErrorMessage, Loading, rootAttributes, StatusBadge, slot, useAnnouncer, } from './shared.js';
7
- import { ArtifactVersionDiff } from './version-diff.js';
8
- /**
9
- * Review of the version waiting for approval (spec §13.1, §15.3): diff against the last published
10
- * version (`meta.publishedVersion`) or the previous one, plus approve and reject with a reason.
11
- */
12
- export function ArtifactApproval(props) {
13
- const ctx = useArtkit();
14
- const { t, client, cache } = ctx;
15
- const id = props.id ?? props.artifact?.id;
16
- const query = useArtifact(id, props.artifact ? { initial: props.artifact } : {});
17
- const artifact = query.artifact;
18
- const [busy, setBusy] = useState(undefined);
19
- const [error, setError] = useState(undefined);
20
- const [rejecting, setRejecting] = useState(false);
21
- const [reason, setReason] = useState('');
22
- const [live, announce] = useAnnouncer();
23
- const requireReason = props.requireReason ?? true;
24
- if (!artifact) {
25
- return (_jsx("div", { className: cx('ak-root ak-approval', props.className), ...rootAttributes(ctx), children: query.error ? _jsx(ErrorMessage, { error: query.error }) : _jsx(Loading, {}) }));
26
- }
27
- const baseVersion = artifact.meta.publishedVersion !== undefined && artifact.meta.publishedVersion < artifact.version
28
- ? artifact.meta.publishedVersion
29
- : artifact.version > 1
30
- ? artifact.version - 1
31
- : undefined;
32
- const pending = artifact.status === 'pending_approval';
33
- async function decide(action) {
34
- if (!artifact)
35
- return;
36
- const trimmed = reason.trim();
37
- if (action === 'reject' && requireReason && !trimmed)
38
- return;
39
- setBusy(action);
40
- setError(undefined);
41
- try {
42
- const updated = await client.setStatus(artifact.id, action, action === 'reject' ? trimmed || undefined : undefined);
43
- cache.put(updated);
44
- if (action === 'approve') {
45
- announce(t('approved', { version: artifact.version }));
46
- props.onApproved?.(updated);
47
- }
48
- else {
49
- announce(t('rejected', { version: artifact.version }));
50
- setRejecting(false);
51
- setReason('');
52
- props.onRejected?.(updated, trimmed);
53
- }
54
- }
55
- catch (caught) {
56
- setError(caught);
57
- }
58
- finally {
59
- setBusy(undefined);
60
- }
61
- }
62
- return (_jsxs("section", { className: cx('ak-root ak-approval', props.className), ...rootAttributes(ctx, artifact.themeId), "aria-label": t('approvalTitle', { version: artifact.version }), children: [live, _jsxs("header", { ...slot(props.slots, 'header', 'ak-panel-header'), children: [_jsx("h2", { className: "ak-panel-title", children: artifact.title }), _jsx(StatusBadge, { status: artifact.status }), _jsxs("span", { className: "ak-history-meta", children: [t('approvalTitle', { version: artifact.version }), ' · ', baseVersion === undefined
63
- ? t('approvalFirstVersion')
64
- : t('approvalComparedTo', { version: baseVersion })] })] }), _jsx("div", { ...slot(props.slots, 'diff', ''), children: baseVersion === undefined ? (_jsx(ArtifactVersionDiff, { after: artifact, showLines: false })) : (_jsx(ArtifactVersionDiff, { id: artifact.id, from: baseVersion, after: artifact })) }), error ? _jsx(ErrorMessage, { error: error, onDismiss: () => setError(undefined) }) : null, pending ? (_jsx("div", { ...slot(props.slots, 'actions', 'ak-approval-actions'), children: rejecting ? (_jsx(RejectForm, { busy: busy !== undefined, requireReason: requireReason, reason: reason, onReasonChange: setReason, onSubmit: () => void decide('reject'), onCancel: () => setRejecting(false), ...(props.slots?.reason ? { textareaProps: props.slots.reason } : {}) })) : (_jsxs(_Fragment, { children: [_jsxs("button", { type: "button", className: "ak-button", "data-variant": "primary", disabled: busy !== undefined, onClick: () => void decide('approve'), children: [_jsx(Check, { "aria-hidden": "true" }), t('action_approve')] }), _jsxs("button", { type: "button", className: "ak-button", "data-variant": "danger", disabled: busy !== undefined, onClick: () => setRejecting(true), children: [_jsx(X, { "aria-hidden": "true" }), t('action_reject')] })] })) })) : (_jsx("p", { className: "ak-notice", children: t('notPending') }))] }));
65
- }
66
- /** Inline rejection form shared by the approval view and the panel. Escape cancels. */
67
- export function RejectForm(props) {
68
- const { t } = useArtkit();
69
- const reasonId = useId();
70
- return (_jsxs("form", { className: "ak-form", onSubmit: (event) => {
71
- event.preventDefault();
72
- props.onSubmit();
73
- }, children: [_jsx("label", { htmlFor: reasonId, children: t('rejectReason') }), _jsx("textarea", { id: reasonId, className: cx('ak-textarea', props.textareaProps?.className), style: props.textareaProps?.style, value: props.reason, required: props.requireReason, "aria-describedby": `${reasonId}-help`, onChange: (event) => props.onReasonChange(event.target.value), onKeyDown: (event) => {
74
- if (event.key === 'Escape')
75
- props.onCancel();
76
- },
77
- // biome-ignore lint/a11y/noAutofocus: the reason field is the only purpose of the revealed form.
78
- autoFocus: true }), _jsx("span", { id: `${reasonId}-help`, className: "ak-history-meta", children: t('rejectReasonRequired') }), _jsxs("div", { className: "ak-approval-actions", children: [_jsxs("button", { type: "submit", className: "ak-button", "data-variant": "danger", disabled: props.busy || (props.requireReason && !props.reason.trim()), children: [_jsx(X, { "aria-hidden": "true" }), t('confirmReject')] }), _jsx("button", { type: "button", className: "ak-button", onClick: props.onCancel, children: t('cancel') })] })] }));
79
- }
80
- //# sourceMappingURL=approval.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"approval.js","sourceRoot":"","sources":["../../src/components/approval.tsx"],"names":[],"mappings":"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"}
@@ -1,35 +0,0 @@
1
- import type { Artifact, ChangeSummary } from '@artkit-ai/core';
2
- import { type ArtkitContextValue } from '../context.js';
3
- import { type LineDiffEntry } from '../line-diff.js';
4
- import { type Slots } from './shared.js';
5
- export type DiffLayout = 'unified' | 'split';
6
- export type ArtifactVersionDiffPart = 'toolbar' | 'changes' | 'lines';
7
- export interface ArtifactVersionDiffProps {
8
- /** Load both versions by id. */
9
- id?: string;
10
- /** Older version; defaults to the one before `to`. */
11
- from?: number;
12
- /** Newer version; defaults to the latest. */
13
- to?: number;
14
- /** Or pass both artifacts directly. */
15
- before?: Artifact;
16
- after?: Artifact;
17
- layout?: DiffLayout;
18
- defaultLayout?: DiffLayout;
19
- onLayoutChange?(layout: DiffLayout): void;
20
- /** Show the structural change list from `kind.diff` (default true). */
21
- showChanges?: boolean;
22
- /** Show the line diff of the full projections (default true). */
23
- showLines?: boolean;
24
- className?: string;
25
- slots?: Slots<ArtifactVersionDiffPart>;
26
- }
27
- export interface VersionComparison {
28
- changes: ChangeSummary[];
29
- lines: LineDiffEntry[];
30
- }
31
- /** Structural changes plus a line diff of the full text projections. `before` undefined means empty. */
32
- export declare function compareVersions(ctx: ArtkitContextValue, before: Artifact | undefined, after: Artifact): VersionComparison;
33
- /** Side-by-side or highlighted comparison between two versions (spec §13.1). */
34
- export declare function ArtifactVersionDiff(props: ArtifactVersionDiffProps): import("react").JSX.Element;
35
- //# sourceMappingURL=version-diff.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"version-diff.d.ts","sourceRoot":"","sources":["../../src/components/version-diff.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAG/D,OAAO,EAAE,KAAK,kBAAkB,EAAa,MAAM,eAAe,CAAC;AAEnE,OAAO,EAAa,KAAK,aAAa,EAAe,MAAM,iBAAiB,CAAC;AAC7E,OAAO,EAAyD,KAAK,KAAK,EAAQ,MAAM,aAAa,CAAC;AAEtG,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,OAAO,CAAC;AAC7C,MAAM,MAAM,uBAAuB,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;AAEtE,MAAM,WAAW,wBAAwB;IACvC,gCAAgC;IAChC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,sDAAsD;IACtD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,uCAAuC;IACvC,MAAM,CAAC,EAAE,QAAQ,CAAC;IAClB,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,aAAa,CAAC,EAAE,UAAU,CAAC;IAC3B,cAAc,CAAC,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;IAC1C,uEAAuE;IACvE,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,iEAAiE;IACjE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,uBAAuB,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,KAAK,EAAE,aAAa,EAAE,CAAC;CACxB;AAED,wGAAwG;AACxG,wBAAgB,eAAe,CAC7B,GAAG,EAAE,kBAAkB,EACvB,MAAM,EAAE,QAAQ,GAAG,SAAS,EAC5B,KAAK,EAAE,QAAQ,GACd,iBAAiB,CA6BnB;AAED,gFAAgF;AAChF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,wBAAwB,+BA4FlE"}
@@ -1,85 +0,0 @@
1
- import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { Columns2, Rows2 } from 'lucide-react';
3
- import { useMemo, useState } from 'react';
4
- import { useArtkit } from '../context.js';
5
- import { useArtifact } from '../hooks.js';
6
- import { diffLines, toSplitRows } from '../line-diff.js';
7
- import { ChangeList, cx, ErrorMessage, Loading, rootAttributes, slot } from './shared.js';
8
- /** Structural changes plus a line diff of the full text projections. `before` undefined means empty. */
9
- export function compareVersions(ctx, before, after) {
10
- const kind = ctx.registry.get(after.kind);
11
- const beforeContent = before?.content ?? kind.empty();
12
- const changes = [];
13
- if (before && before.title !== after.title) {
14
- changes.push({
15
- type: 'changed',
16
- target: 'envelope:title',
17
- summary: `'${before.title}' → '${after.title}'`,
18
- });
19
- }
20
- try {
21
- changes.push(...kind.diff(beforeContent, after.content));
22
- }
23
- catch {
24
- // The text diff below still shows what changed.
25
- }
26
- const project = (content, artifact) => {
27
- try {
28
- return kind.project(content, {
29
- mode: 'full',
30
- locale: artifact.locale,
31
- theme: ctx.themeFor(artifact.themeId),
32
- }).text;
33
- }
34
- catch {
35
- return JSON.stringify(content, null, 2);
36
- }
37
- };
38
- const lines = diffLines(before ? project(beforeContent, before) : '', project(after.content, after));
39
- return { changes, lines };
40
- }
41
- /** Side-by-side or highlighted comparison between two versions (spec §13.1). */
42
- export function ArtifactVersionDiff(props) {
43
- const ctx = useArtkit();
44
- const { t } = ctx;
45
- const [ownLayout, setOwnLayout] = useState(props.defaultLayout ?? 'unified');
46
- const layout = props.layout ?? ownLayout;
47
- const setLayout = (next) => {
48
- setOwnLayout(next);
49
- props.onLayoutChange?.(next);
50
- };
51
- const afterQuery = useArtifact(props.after ? undefined : props.id, props.to === undefined ? {} : { version: props.to });
52
- const after = props.after ?? afterQuery.artifact;
53
- const fromVersion = props.from ?? (after && after.version > 1 ? after.version - 1 : undefined);
54
- const beforeQuery = useArtifact(props.before || fromVersion === undefined ? undefined : (props.id ?? after?.id), {
55
- ...(fromVersion === undefined ? {} : { version: fromVersion }),
56
- });
57
- const before = props.before ?? (fromVersion === undefined ? undefined : beforeQuery.artifact);
58
- const comparison = useMemo(() => (after && ctx.registry.has(after.kind) ? compareVersions(ctx, before, after) : undefined), [ctx, before, after]);
59
- const error = afterQuery.error ?? beforeQuery.error;
60
- const waiting = !after || (fromVersion !== undefined && !before);
61
- const attrs = rootAttributes(ctx, after?.themeId);
62
- if (error) {
63
- return (_jsx("div", { className: cx('ak-root ak-diff', props.className), ...attrs, children: _jsx(ErrorMessage, { error: error }) }));
64
- }
65
- if (waiting || !comparison || !after) {
66
- return (_jsx("div", { className: cx('ak-root ak-diff', props.className), ...attrs, children: _jsx(Loading, {}) }));
67
- }
68
- const beforeLabel = before ? t('diffBefore', { version: before.version }) : '—';
69
- const afterLabel = t('diffAfter', { version: after.version });
70
- return (_jsxs("div", { className: cx('ak-root ak-diff', props.className), ...attrs, children: [props.showChanges === false ? null : (_jsx("section", { "aria-label": t('changes'), children: _jsx(ChangeList, { changes: comparison.changes, ...slot(props.slots, 'changes', '') }) })), props.showLines === false ? null : (_jsxs(_Fragment, { children: [_jsxs("fieldset", { ...slot(props.slots, 'toolbar', 'ak-diff-toolbar'), children: [_jsx("legend", { className: "ak-sr-only", children: t('diffViewLabel') }), ['unified', 'split'].map((option) => (_jsxs("button", { type: "button", className: "ak-button", "aria-pressed": layout === option, onClick: () => setLayout(option), children: [option === 'unified' ? _jsx(Rows2, { "aria-hidden": "true" }) : _jsx(Columns2, { "aria-hidden": "true" }), option === 'unified' ? t('diffUnified') : t('diffSplit')] }, option)))] }), layout === 'unified' ? (_jsx(UnifiedLines, { lines: comparison.lines, caption: `${beforeLabel} → ${afterLabel}`, slots: props.slots })) : (_jsx(SplitLines, { lines: comparison.lines, beforeLabel: beforeLabel, afterLabel: afterLabel, slots: props.slots }))] }))] }));
71
- }
72
- function Marker({ type }) {
73
- const { t } = useArtkit();
74
- if (type === 'equal')
75
- return _jsx("td", { className: "ak-diff-marker" });
76
- return (_jsxs("td", { className: "ak-diff-marker", children: [_jsx("span", { "aria-hidden": "true", children: type === 'insert' ? '+' : '−' }), _jsx("span", { className: "ak-sr-only", children: type === 'insert' ? t('lineAdded') : t('lineRemoved') })] }));
77
- }
78
- function UnifiedLines({ lines, caption, slots, }) {
79
- return (_jsxs("table", { ...slot(slots, 'lines', 'ak-diff-lines'), "data-layout": "unified", children: [_jsx("caption", { className: "ak-sr-only", children: caption }), _jsx("tbody", { children: lines.map((line) => (_jsxs("tr", { className: "ak-diff-line", "data-type": line.type, children: [_jsx("th", { scope: "row", children: line.oldLine ?? '' }), _jsx("th", { scope: "row", children: line.newLine ?? '' }), _jsx(Marker, { type: line.type }), _jsx("td", { children: line.text })] }, `${line.type}:${line.oldLine ?? '-'}:${line.newLine ?? '-'}`))) })] }));
80
- }
81
- function SplitLines({ lines, beforeLabel, afterLabel, slots, }) {
82
- const rows = useMemo(() => toSplitRows(lines), [lines]);
83
- return (_jsxs("table", { ...slot(slots, 'lines', 'ak-diff-lines'), "data-layout": "split", children: [_jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { scope: "col", colSpan: 3, children: beforeLabel }), _jsx("th", { scope: "col", colSpan: 3, children: afterLabel })] }) }), _jsx("tbody", { children: rows.map((row) => (_jsxs("tr", { children: [_jsx("th", { scope: "row", children: row.left?.oldLine ?? '' }), row.left && row.left.type !== 'equal' ? (_jsx(Marker, { type: "delete" })) : (_jsx("td", { className: "ak-diff-marker" })), _jsx("td", { className: "ak-diff-cell", "data-type": row.left && row.left.type !== 'equal' ? 'delete' : undefined, children: row.left?.text ?? '' }), _jsx("th", { scope: "row", children: row.right?.newLine ?? '' }), row.right && row.right.type !== 'equal' ? (_jsx(Marker, { type: "insert" })) : (_jsx("td", { className: "ak-diff-marker" })), _jsx("td", { className: "ak-diff-cell", "data-type": row.right && row.right.type !== 'equal' ? 'insert' : undefined, children: row.right?.text ?? '' })] }, `${row.left?.oldLine ?? '-'}:${row.right?.newLine ?? '-'}`))) })] }));
84
- }
85
- //# sourceMappingURL=version-diff.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"version-diff.js","sourceRoot":"","sources":["../../src/components/version-diff.tsx"],"names":[],"mappings":"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"}
@@ -1,25 +0,0 @@
1
- export type LineDiffType = 'equal' | 'insert' | 'delete';
2
- export interface LineDiffEntry {
3
- type: LineDiffType;
4
- text: string;
5
- /** 1-based line number in the old text (equal and delete). */
6
- oldLine?: number;
7
- /** 1-based line number in the new text (equal and insert). */
8
- newLine?: number;
9
- }
10
- export interface LineDiffOptions {
11
- /**
12
- * Upper bound for the LCS table (rows × columns) after trimming the common prefix and suffix.
13
- * Above it the middle is reported as a block replacement, keeping memory bounded on huge projections.
14
- */
15
- maxCells?: number;
16
- }
17
- /** Line diff based on the longest common subsequence, with common prefix/suffix trimmed first. */
18
- export declare function diffLines(before: string, after: string, options?: LineDiffOptions): LineDiffEntry[];
19
- export interface SplitRow {
20
- left?: LineDiffEntry;
21
- right?: LineDiffEntry;
22
- }
23
- /** Pairs deletions with the insertions that follow them, for a side-by-side layout. */
24
- export declare function toSplitRows(entries: LineDiffEntry[]): SplitRow[];
25
- //# sourceMappingURL=line-diff.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"line-diff.d.ts","sourceRoot":"","sources":["../src/line-diff.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEzD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,YAAY,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,8DAA8D;IAC9D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8DAA8D;IAC9D,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAID,kGAAkG;AAClG,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB,GAAG,aAAa,EAAE,CA0DvG;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB;AAED,uFAAuF;AACvF,wBAAgB,WAAW,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,QAAQ,EAAE,CAsBhE"}
package/dist/line-diff.js DELETED
@@ -1,96 +0,0 @@
1
- const splitLines = (text) => (text === '' ? [] : text.replace(/\r\n?/g, '\n').split('\n'));
2
- /** Line diff based on the longest common subsequence, with common prefix/suffix trimmed first. */
3
- export function diffLines(before, after, options = {}) {
4
- const a = splitLines(before);
5
- const b = splitLines(after);
6
- const maxCells = options.maxCells ?? 4_000_000;
7
- let start = 0;
8
- while (start < a.length && start < b.length && a[start] === b[start])
9
- start++;
10
- let endA = a.length;
11
- let endB = b.length;
12
- while (endA > start && endB > start && a[endA - 1] === b[endB - 1]) {
13
- endA--;
14
- endB--;
15
- }
16
- const out = [];
17
- for (let i = 0; i < start; i++)
18
- out.push({ type: 'equal', text: a[i], oldLine: i + 1, newLine: i + 1 });
19
- const midA = a.slice(start, endA);
20
- const midB = b.slice(start, endB);
21
- const n = midA.length;
22
- const m = midB.length;
23
- if (n > 0 && m > 0 && n * m <= maxCells) {
24
- // lengths[i][j] = LCS length of midA[i..] and midB[j..], stored flat.
25
- const width = m + 1;
26
- const lengths = new Uint32Array((n + 1) * width);
27
- for (let i = n - 1; i >= 0; i--) {
28
- for (let j = m - 1; j >= 0; j--) {
29
- lengths[i * width + j] =
30
- midA[i] === midB[j]
31
- ? lengths[(i + 1) * width + j + 1] + 1
32
- : Math.max(lengths[(i + 1) * width + j], lengths[i * width + j + 1]);
33
- }
34
- }
35
- let i = 0;
36
- let j = 0;
37
- while (i < n && j < m) {
38
- if (midA[i] === midB[j]) {
39
- out.push({ type: 'equal', text: midA[i], oldLine: start + i + 1, newLine: start + j + 1 });
40
- i++;
41
- j++;
42
- }
43
- else if (lengths[(i + 1) * width + j] >= lengths[i * width + j + 1]) {
44
- out.push({ type: 'delete', text: midA[i], oldLine: start + i + 1 });
45
- i++;
46
- }
47
- else {
48
- out.push({ type: 'insert', text: midB[j], newLine: start + j + 1 });
49
- j++;
50
- }
51
- }
52
- for (; i < n; i++)
53
- out.push({ type: 'delete', text: midA[i], oldLine: start + i + 1 });
54
- for (; j < m; j++)
55
- out.push({ type: 'insert', text: midB[j], newLine: start + j + 1 });
56
- }
57
- else {
58
- for (let k = 0; k < n; k++)
59
- out.push({ type: 'delete', text: midA[k], oldLine: start + k + 1 });
60
- for (let k = 0; k < m; k++)
61
- out.push({ type: 'insert', text: midB[k], newLine: start + k + 1 });
62
- }
63
- for (let k = 0; k < a.length - endA; k++) {
64
- out.push({ type: 'equal', text: a[endA + k], oldLine: endA + k + 1, newLine: endB + k + 1 });
65
- }
66
- return out;
67
- }
68
- /** Pairs deletions with the insertions that follow them, for a side-by-side layout. */
69
- export function toSplitRows(entries) {
70
- const rows = [];
71
- let index = 0;
72
- while (index < entries.length) {
73
- const entry = entries[index];
74
- if (entry.type === 'equal') {
75
- rows.push({ left: entry, right: entry });
76
- index++;
77
- continue;
78
- }
79
- const deletes = [];
80
- const inserts = [];
81
- while (index < entries.length && entries[index].type === 'delete')
82
- deletes.push(entries[index++]);
83
- while (index < entries.length && entries[index].type === 'insert')
84
- inserts.push(entries[index++]);
85
- for (let k = 0; k < Math.max(deletes.length, inserts.length); k++) {
86
- const row = {};
87
- if (deletes[k])
88
- row.left = deletes[k];
89
- if (inserts[k])
90
- row.right = inserts[k];
91
- rows.push(row);
92
- }
93
- }
94
- return rows;
95
- }
96
- //# sourceMappingURL=line-diff.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"line-diff.js","sourceRoot":"","sources":["../src/line-diff.ts"],"names":[],"mappings":"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"}
@@ -1,219 +0,0 @@
1
- import type { Artifact } from '@artkit-ai/core';
2
- import { Check, X } from 'lucide-react';
3
- import { type CSSProperties, useId, useState } from 'react';
4
- import { useArtkit } from '../context.js';
5
- import { useArtifact } from '../hooks.js';
6
- import {
7
- cx,
8
- ErrorMessage,
9
- Loading,
10
- rootAttributes,
11
- type Slots,
12
- StatusBadge,
13
- slot,
14
- useAnnouncer,
15
- } from './shared.js';
16
- import { ArtifactVersionDiff } from './version-diff.js';
17
-
18
- export type ArtifactApprovalPart = 'header' | 'diff' | 'actions' | 'reason';
19
-
20
- export interface ArtifactApprovalProps {
21
- id?: string;
22
- artifact?: Artifact;
23
- /** Require a reason to reject (default true). */
24
- requireReason?: boolean;
25
- onApproved?(artifact: Artifact): void;
26
- onRejected?(artifact: Artifact, reason: string): void;
27
- className?: string;
28
- slots?: Slots<ArtifactApprovalPart>;
29
- }
30
-
31
- /**
32
- * Review of the version waiting for approval (spec §13.1, §15.3): diff against the last published
33
- * version (`meta.publishedVersion`) or the previous one, plus approve and reject with a reason.
34
- */
35
- export function ArtifactApproval(props: ArtifactApprovalProps) {
36
- const ctx = useArtkit();
37
- const { t, client, cache } = ctx;
38
- const id = props.id ?? props.artifact?.id;
39
- const query = useArtifact(id, props.artifact ? { initial: props.artifact } : {});
40
- const artifact = query.artifact;
41
- const [busy, setBusy] = useState<'approve' | 'reject' | undefined>(undefined);
42
- const [error, setError] = useState<unknown>(undefined);
43
- const [rejecting, setRejecting] = useState(false);
44
- const [reason, setReason] = useState('');
45
- const [live, announce] = useAnnouncer();
46
- const requireReason = props.requireReason ?? true;
47
-
48
- if (!artifact) {
49
- return (
50
- <div className={cx('ak-root ak-approval', props.className)} {...rootAttributes(ctx)}>
51
- {query.error ? <ErrorMessage error={query.error} /> : <Loading />}
52
- </div>
53
- );
54
- }
55
-
56
- const baseVersion =
57
- artifact.meta.publishedVersion !== undefined && artifact.meta.publishedVersion < artifact.version
58
- ? artifact.meta.publishedVersion
59
- : artifact.version > 1
60
- ? artifact.version - 1
61
- : undefined;
62
- const pending = artifact.status === 'pending_approval';
63
-
64
- async function decide(action: 'approve' | 'reject') {
65
- if (!artifact) return;
66
- const trimmed = reason.trim();
67
- if (action === 'reject' && requireReason && !trimmed) return;
68
- setBusy(action);
69
- setError(undefined);
70
- try {
71
- const updated = await client.setStatus(
72
- artifact.id,
73
- action,
74
- action === 'reject' ? trimmed || undefined : undefined,
75
- );
76
- cache.put(updated);
77
- if (action === 'approve') {
78
- announce(t('approved', { version: artifact.version }));
79
- props.onApproved?.(updated);
80
- } else {
81
- announce(t('rejected', { version: artifact.version }));
82
- setRejecting(false);
83
- setReason('');
84
- props.onRejected?.(updated, trimmed);
85
- }
86
- } catch (caught) {
87
- setError(caught);
88
- } finally {
89
- setBusy(undefined);
90
- }
91
- }
92
-
93
- return (
94
- <section
95
- className={cx('ak-root ak-approval', props.className)}
96
- {...rootAttributes(ctx, artifact.themeId)}
97
- aria-label={t('approvalTitle', { version: artifact.version })}
98
- >
99
- {live}
100
- <header {...slot(props.slots, 'header', 'ak-panel-header')}>
101
- <h2 className="ak-panel-title">{artifact.title}</h2>
102
- <StatusBadge status={artifact.status} />
103
- <span className="ak-history-meta">
104
- {t('approvalTitle', { version: artifact.version })}
105
- {' · '}
106
- {baseVersion === undefined
107
- ? t('approvalFirstVersion')
108
- : t('approvalComparedTo', { version: baseVersion })}
109
- </span>
110
- </header>
111
- <div {...slot(props.slots, 'diff', '')}>
112
- {baseVersion === undefined ? (
113
- <ArtifactVersionDiff after={artifact} showLines={false} />
114
- ) : (
115
- <ArtifactVersionDiff id={artifact.id} from={baseVersion} after={artifact} />
116
- )}
117
- </div>
118
- {error ? <ErrorMessage error={error} onDismiss={() => setError(undefined)} /> : null}
119
- {pending ? (
120
- <div {...slot(props.slots, 'actions', 'ak-approval-actions')}>
121
- {rejecting ? (
122
- <RejectForm
123
- busy={busy !== undefined}
124
- requireReason={requireReason}
125
- reason={reason}
126
- onReasonChange={setReason}
127
- onSubmit={() => void decide('reject')}
128
- onCancel={() => setRejecting(false)}
129
- {...(props.slots?.reason ? { textareaProps: props.slots.reason } : {})}
130
- />
131
- ) : (
132
- <>
133
- <button
134
- type="button"
135
- className="ak-button"
136
- data-variant="primary"
137
- disabled={busy !== undefined}
138
- onClick={() => void decide('approve')}
139
- >
140
- <Check aria-hidden="true" />
141
- {t('action_approve')}
142
- </button>
143
- <button
144
- type="button"
145
- className="ak-button"
146
- data-variant="danger"
147
- disabled={busy !== undefined}
148
- onClick={() => setRejecting(true)}
149
- >
150
- <X aria-hidden="true" />
151
- {t('action_reject')}
152
- </button>
153
- </>
154
- )}
155
- </div>
156
- ) : (
157
- <p className="ak-notice">{t('notPending')}</p>
158
- )}
159
- </section>
160
- );
161
- }
162
-
163
- export interface RejectFormProps {
164
- busy: boolean;
165
- requireReason: boolean;
166
- reason: string;
167
- onReasonChange(reason: string): void;
168
- onSubmit(): void;
169
- onCancel(): void;
170
- textareaProps?: { className?: string; style?: CSSProperties };
171
- }
172
-
173
- /** Inline rejection form shared by the approval view and the panel. Escape cancels. */
174
- export function RejectForm(props: RejectFormProps) {
175
- const { t } = useArtkit();
176
- const reasonId = useId();
177
- return (
178
- <form
179
- className="ak-form"
180
- onSubmit={(event) => {
181
- event.preventDefault();
182
- props.onSubmit();
183
- }}
184
- >
185
- <label htmlFor={reasonId}>{t('rejectReason')}</label>
186
- <textarea
187
- id={reasonId}
188
- className={cx('ak-textarea', props.textareaProps?.className)}
189
- style={props.textareaProps?.style}
190
- value={props.reason}
191
- required={props.requireReason}
192
- aria-describedby={`${reasonId}-help`}
193
- onChange={(event) => props.onReasonChange(event.target.value)}
194
- onKeyDown={(event) => {
195
- if (event.key === 'Escape') props.onCancel();
196
- }}
197
- // biome-ignore lint/a11y/noAutofocus: the reason field is the only purpose of the revealed form.
198
- autoFocus
199
- />
200
- <span id={`${reasonId}-help`} className="ak-history-meta">
201
- {t('rejectReasonRequired')}
202
- </span>
203
- <div className="ak-approval-actions">
204
- <button
205
- type="submit"
206
- className="ak-button"
207
- data-variant="danger"
208
- disabled={props.busy || (props.requireReason && !props.reason.trim())}
209
- >
210
- <X aria-hidden="true" />
211
- {t('confirmReject')}
212
- </button>
213
- <button type="button" className="ak-button" onClick={props.onCancel}>
214
- {t('cancel')}
215
- </button>
216
- </div>
217
- </form>
218
- );
219
- }