@artkit-ai/react 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +145 -2
  3. package/dist/cache.d.ts +35 -0
  4. package/dist/cache.d.ts.map +1 -0
  5. package/dist/cache.js +116 -0
  6. package/dist/cache.js.map +1 -0
  7. package/dist/client.d.ts +79 -0
  8. package/dist/client.d.ts.map +1 -0
  9. package/dist/client.js +260 -0
  10. package/dist/client.js.map +1 -0
  11. package/dist/components/approval.d.ts +34 -0
  12. package/dist/components/approval.d.ts.map +1 -0
  13. package/dist/components/approval.js +80 -0
  14. package/dist/components/approval.js.map +1 -0
  15. package/dist/components/card.d.ts +22 -0
  16. package/dist/components/card.d.ts.map +1 -0
  17. package/dist/components/card.js +16 -0
  18. package/dist/components/card.js.map +1 -0
  19. package/dist/components/editor.d.ts +28 -0
  20. package/dist/components/editor.d.ts.map +1 -0
  21. package/dist/components/editor.js +161 -0
  22. package/dist/components/editor.js.map +1 -0
  23. package/dist/components/icons.d.ts +8 -0
  24. package/dist/components/icons.d.ts.map +1 -0
  25. package/dist/components/icons.js +14 -0
  26. package/dist/components/icons.js.map +1 -0
  27. package/dist/components/panel.d.ts +34 -0
  28. package/dist/components/panel.d.ts.map +1 -0
  29. package/dist/components/panel.js +216 -0
  30. package/dist/components/panel.js.map +1 -0
  31. package/dist/components/shared.d.ts +71 -0
  32. package/dist/components/shared.d.ts.map +1 -0
  33. package/dist/components/shared.js +104 -0
  34. package/dist/components/shared.js.map +1 -0
  35. package/dist/components/version-diff.d.ts +35 -0
  36. package/dist/components/version-diff.d.ts.map +1 -0
  37. package/dist/components/version-diff.js +85 -0
  38. package/dist/components/version-diff.js.map +1 -0
  39. package/dist/components/view.d.ts +40 -0
  40. package/dist/components/view.d.ts.map +1 -0
  41. package/dist/components/view.js +75 -0
  42. package/dist/components/view.js.map +1 -0
  43. package/dist/context.d.ts +59 -0
  44. package/dist/context.d.ts.map +1 -0
  45. package/dist/context.js +13 -0
  46. package/dist/context.js.map +1 -0
  47. package/dist/controls.d.ts +145 -0
  48. package/dist/controls.d.ts.map +1 -0
  49. package/dist/controls.js +188 -0
  50. package/dist/controls.js.map +1 -0
  51. package/dist/download.d.ts +4 -0
  52. package/dist/download.d.ts.map +1 -0
  53. package/dist/download.js +20 -0
  54. package/dist/download.js.map +1 -0
  55. package/dist/editor-session.d.ts +184 -0
  56. package/dist/editor-session.d.ts.map +1 -0
  57. package/dist/editor-session.js +614 -0
  58. package/dist/editor-session.js.map +1 -0
  59. package/dist/hooks.d.ts +85 -0
  60. package/dist/hooks.d.ts.map +1 -0
  61. package/dist/hooks.js +297 -0
  62. package/dist/hooks.js.map +1 -0
  63. package/dist/i18n.d.ts +197 -0
  64. package/dist/i18n.d.ts.map +1 -0
  65. package/dist/i18n.js +207 -0
  66. package/dist/i18n.js.map +1 -0
  67. package/dist/index.d.ts +22 -0
  68. package/dist/index.d.ts.map +1 -0
  69. package/dist/index.js +22 -0
  70. package/dist/index.js.map +1 -0
  71. package/dist/kit-css.d.ts +3 -0
  72. package/dist/kit-css.d.ts.map +1 -0
  73. package/dist/kit-css.js +5 -0
  74. package/dist/kit-css.js.map +1 -0
  75. package/dist/line-diff.d.ts +25 -0
  76. package/dist/line-diff.d.ts.map +1 -0
  77. package/dist/line-diff.js +96 -0
  78. package/dist/line-diff.js.map +1 -0
  79. package/dist/partial-json.d.ts +8 -0
  80. package/dist/partial-json.d.ts.map +1 -0
  81. package/dist/partial-json.js +176 -0
  82. package/dist/partial-json.js.map +1 -0
  83. package/dist/provider.d.ts +42 -0
  84. package/dist/provider.d.ts.map +1 -0
  85. package/dist/provider.js +95 -0
  86. package/dist/provider.js.map +1 -0
  87. package/dist/styles.d.ts +25 -0
  88. package/dist/styles.d.ts.map +1 -0
  89. package/dist/styles.js +203 -0
  90. package/dist/styles.js.map +1 -0
  91. package/dist/toolbar.d.ts +90 -0
  92. package/dist/toolbar.d.ts.map +1 -0
  93. package/dist/toolbar.js +233 -0
  94. package/dist/toolbar.js.map +1 -0
  95. package/package.json +50 -3
  96. package/src/cache.ts +132 -0
  97. package/src/client.ts +390 -0
  98. package/src/components/approval.tsx +219 -0
  99. package/src/components/card.tsx +87 -0
  100. package/src/components/editor.tsx +392 -0
  101. package/src/components/icons.tsx +14 -0
  102. package/src/components/panel.tsx +591 -0
  103. package/src/components/shared.tsx +207 -0
  104. package/src/components/version-diff.tsx +266 -0
  105. package/src/components/view.tsx +199 -0
  106. package/src/context.ts +82 -0
  107. package/src/controls.tsx +587 -0
  108. package/src/download.ts +23 -0
  109. package/src/editor-session.ts +738 -0
  110. package/src/hooks.ts +411 -0
  111. package/src/i18n.ts +217 -0
  112. package/src/index.ts +160 -0
  113. package/src/kit-css.ts +5 -0
  114. package/src/line-diff.ts +111 -0
  115. package/src/partial-json.ts +160 -0
  116. package/src/provider.tsx +176 -0
  117. package/src/styles.ts +222 -0
  118. package/src/toolbar.tsx +536 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styles.js","sourceRoot":"","sources":["../src/styles.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ import { type Theme } from '@artkit-ai/core';
2
+ import { type LucideIcon } from 'lucide-react';
3
+ import { type ReactNode } from 'react';
4
+ export interface ToolbarProps {
5
+ label: string;
6
+ children: ReactNode;
7
+ className?: string;
8
+ /** Stick to the top of the scrolling editor (default true). */
9
+ sticky?: boolean;
10
+ }
11
+ export declare function Toolbar({ label, children, className, sticky }: ToolbarProps): import("react").JSX.Element;
12
+ export declare function ToolbarGroup({ label, children }: {
13
+ label?: string;
14
+ children: ReactNode;
15
+ }): import("react").JSX.Element;
16
+ export declare function ToolbarSpacer(): import("react").JSX.Element;
17
+ export interface ToolbarButtonProps {
18
+ icon?: LucideIcon;
19
+ label: string;
20
+ onClick(): void;
21
+ /** Toggle state (`aria-pressed`). */
22
+ pressed?: boolean;
23
+ disabled?: boolean;
24
+ /** Shown in the tooltip, e.g. "Ctrl+B". */
25
+ shortcut?: string;
26
+ /** Show the text next to the icon (actions that need a word, e.g. "Present"). */
27
+ showLabel?: boolean;
28
+ variant?: 'default' | 'primary' | 'danger';
29
+ /** Keep the editor selection on mouse down (default true). */
30
+ keepFocus?: boolean;
31
+ }
32
+ export declare function ToolbarButton({ icon: Icon, label, onClick, pressed, disabled, shortcut, showLabel, variant, keepFocus, }: ToolbarButtonProps): import("react").JSX.Element;
33
+ export interface ToolbarOption<T extends string> {
34
+ value: T;
35
+ label: string;
36
+ }
37
+ export interface ToolbarSelectProps<T extends string> {
38
+ label: string;
39
+ value: T;
40
+ options: readonly ToolbarOption<T>[];
41
+ onChange(value: T): void;
42
+ disabled?: boolean;
43
+ /** Fixed width in px for stable layouts. */
44
+ width?: number;
45
+ }
46
+ export declare function ToolbarSelect<T extends string>({ label, value, options, onChange, disabled, width, }: ToolbarSelectProps<T>): import("react").JSX.Element;
47
+ export interface ToolbarMenuItem {
48
+ key: string;
49
+ label: string;
50
+ icon?: LucideIcon;
51
+ onSelect(): void;
52
+ disabled?: boolean;
53
+ /** Checked state for option menus (shows a check mark). */
54
+ checked?: boolean;
55
+ shortcut?: string;
56
+ danger?: boolean;
57
+ }
58
+ export interface ToolbarMenuProps {
59
+ icon?: LucideIcon;
60
+ label: string;
61
+ items: readonly (ToolbarMenuItem | 'separator')[];
62
+ disabled?: boolean;
63
+ showLabel?: boolean;
64
+ keepFocus?: boolean;
65
+ }
66
+ export declare function ToolbarMenu({ icon: Icon, label, items, disabled, showLabel, keepFocus, }: ToolbarMenuProps): import("react").JSX.Element;
67
+ export interface ToolbarColorOption {
68
+ /** Theme token or hex. */
69
+ value: string;
70
+ label: string;
71
+ /** Hex used to paint the swatch. */
72
+ swatch: string;
73
+ }
74
+ /** Swatches for the theme color tokens (labels in pt-BR or English). */
75
+ export declare function themeSwatches(theme: Theme, locale?: string): ToolbarColorOption[];
76
+ export interface ToolbarColorProps {
77
+ icon: LucideIcon;
78
+ label: string;
79
+ value?: string | null;
80
+ colors: readonly ToolbarColorOption[];
81
+ onChange(value: string | null): void;
82
+ /** Label of the "no color" option; omitted when not allowed. */
83
+ noneLabel?: string;
84
+ disabled?: boolean;
85
+ keepFocus?: boolean;
86
+ }
87
+ export declare function ToolbarColor({ icon: Icon, label, value, colors, onChange, noneLabel, disabled, keepFocus, }: ToolbarColorProps): import("react").JSX.Element;
88
+ /** Toolbar styles (Mouts design system); embedded in `artkitCss` and in every kind editor CSS. */
89
+ export declare const toolbarCss = "\n.ak-tb{display:flex;flex-wrap:wrap;align-items:center;gap:4px;padding:6px;background:var(--ak-color-background,#fff);color:var(--ak-color-text,#1d2f3c);border:1px solid var(--ak-color-border,#dde0e2);border-radius:var(--ak-radius-md,8px);font-family:var(--ak-font-body,\"Sora\",system-ui,sans-serif);font-size:13px;line-height:1}\n.ak-tb--sticky{position:sticky;top:0;z-index:5}\n.ak-tb-group{display:inline-flex;align-items:center;gap:2px;margin:0;padding:0 0 0 6px;border:0;border-left:1px solid var(--ak-color-border,#dde0e2);min-inline-size:0}\n.ak-tb-group:first-child{padding-left:0;border-left:0}\n.ak-tb-spacer{flex:1}\n.ak-tb-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}\n.ak-tb-button{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-width:32px;height:32px;padding:0 6px;border:1px solid transparent;border-radius:var(--ak-radius-sm,6px);background:none;color:var(--ak-color-muted,#56636d);font:inherit;font-weight:600;cursor:pointer;white-space:nowrap;transition:background-color .15s,color .15s,border-color .15s}\n.ak-tb-button svg{width:16px;height:16px;flex-shrink:0}\n.ak-tb-button--text{padding:0 10px;color:var(--ak-color-text,#1d2f3c)}\n.ak-tb-button:hover:not(:disabled){background:var(--ak-color-hover,#f2f3f4);color:var(--ak-color-text,#1d2f3c)}\n.ak-tb-button:active:not(:disabled){background:var(--ak-color-active,#e8eaec)}\n.ak-tb-button[aria-pressed=\"true\"],.ak-tb-button[aria-expanded=\"true\"]{background:var(--ak-color-fill-accent,#e7f2ef);color:var(--ak-color-accent,#0f7a5a);border-color:var(--ak-color-accent,#0f7a5a)}\n.ak-tb-button[data-variant=\"primary\"]{background:var(--ak-gradient-button);color:var(--ak-color-on-primary,#1d2f3c);border-color:transparent}\n.ak-tb-button[data-variant=\"primary\"]:hover:not(:disabled){background:var(--ak-gradient-button-hover)}\n.ak-tb-button[data-variant=\"danger\"]{color:var(--ak-color-danger,#9f343a)}\n.ak-tb-button[data-variant=\"danger\"]:hover:not(:disabled){background:var(--ak-color-fill-danger,#f5ebeb)}\n.ak-tb-button:disabled,.ak-tb-select:disabled{opacity:.4;cursor:not-allowed}\n.ak-tb-button:focus-visible,.ak-tb-select:focus-visible,.ak-tb-menu-item:focus-visible,.ak-tb-swatch:focus-visible{outline:2px solid var(--ak-color-focus,#0f7a5a);outline-offset:2px}\n.ak-tb-button--menu{padding:0 4px 0 6px;gap:2px}\n.ak-tb-button--menu.ak-tb-button--text{padding:0 6px 0 10px}\n.ak-tb-button .ak-tb-caret{width:12px;height:12px;opacity:.7}\n.ak-tb-color-icon{position:relative;display:inline-flex;flex-direction:column;align-items:center;gap:1px}\n.ak-tb-color-bar{display:block;width:16px;height:3px;border-radius:2px;border:1px solid var(--ak-color-border,#dde0e2)}\n.ak-tb-select{height:32px;max-width:200px;padding:0 8px;font:inherit;font-size:13px;color:var(--ak-color-text,#1d2f3c);background:var(--ak-color-background,#fff);border:1px solid var(--ak-color-border-strong,#8e979d);border-radius:var(--ak-radius-sm,6px);cursor:pointer}\n.ak-tb-anchor{position:relative;display:inline-flex}\n.ak-tb-popover{position:absolute;top:calc(100% + 4px);left:0;z-index:30;display:flex;flex-direction:column;min-width:200px;max-height:360px;overflow:auto;padding:4px;background:var(--ak-color-background,#fff);border:1px solid var(--ak-color-border-strong,#8e979d);border-radius:var(--ak-radius-md,8px)}\n.ak-tb-menu-item{display:flex;align-items:center;gap:8px;width:100%;min-height:32px;padding:0 10px;border:0;border-radius:var(--ak-radius-sm,6px);background:none;color:var(--ak-color-text,#1d2f3c);font:inherit;font-size:13px;text-align:left;cursor:pointer}\n.ak-tb-menu-item svg{width:16px;height:16px;flex-shrink:0;color:var(--ak-color-muted,#56636d)}\n.ak-tb-menu-item:hover:not(:disabled),.ak-tb-menu-item:focus{background:var(--ak-color-hover,#f2f3f4)}\n.ak-tb-menu-item:disabled{opacity:.4;cursor:not-allowed}\n.ak-tb-menu-item[data-danger]{color:var(--ak-color-danger,#9f343a)}\n.ak-tb-menu-item[aria-checked=\"true\"]{color:var(--ak-color-accent,#0f7a5a);font-weight:600}\n.ak-tb-menu-label{flex:1}\n.ak-tb-check{display:inline-flex;width:16px}\n.ak-tb-check svg{color:var(--ak-color-accent,#0f7a5a)}\n.ak-tb-kbd{font-family:var(--ak-font-mono,ui-monospace,monospace);font-size:11px;color:var(--ak-color-muted,#56636d)}\n.ak-tb-separator{width:100%;height:1px;margin:4px 0;border:0;background:var(--ak-color-border,#dde0e2)}\n.ak-tb-palette{display:grid;grid-template-columns:repeat(5,28px);gap:6px;min-width:0;padding:8px}\n.ak-tb-swatch{width:28px;height:28px;padding:0;border:1px solid var(--ak-color-border-strong,#8e979d);border-radius:var(--ak-radius-sm,6px);cursor:pointer}\n.ak-tb-swatch[aria-checked=\"true\"]{box-shadow:inset 0 0 0 2px var(--ak-color-background,#fff);border:2px solid var(--ak-color-accent,#0f7a5a)}\n.ak-tb-palette-none{grid-column:1/-1}\n";
90
+ //# sourceMappingURL=toolbar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolbar.d.ts","sourceRoot":"","sources":["../src/toolbar.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,233 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { COLOR_TOKENS } from '@artkit-ai/core';
3
+ import { Check, ChevronDown, X } from 'lucide-react';
4
+ import { useCallback, useEffect, useId, useRef, useState, } from 'react';
5
+ /*
6
+ * Standard editor toolbar shared by every kind editor (document, sheet, slides, diagram) so all of them
7
+ * look and behave the same: icon buttons with tooltips and shortcuts, grouped with dividers, selects,
8
+ * dropdown menus and theme color palettes. Keyboard model follows the WAI-ARIA toolbar pattern: one tab
9
+ * stop, arrows/Home/End move between controls, menus open with Enter/Space/ArrowDown and close with Escape.
10
+ */
11
+ const ITEM = '[data-ak-tb-item]:not([disabled])';
12
+ function cx(...classes) {
13
+ return classes.filter(Boolean).join(' ');
14
+ }
15
+ /** Keeps the editor selection (text, cells) when a toolbar control is clicked with the mouse. */
16
+ function keepSelection(event) {
17
+ event.preventDefault();
18
+ }
19
+ export function Toolbar({ label, children, className, sticky = true }) {
20
+ const ref = useRef(null);
21
+ // Roving tab index: only the active control is tabbable.
22
+ const sync = useCallback((focusIndex) => {
23
+ const items = [...(ref.current?.querySelectorAll(ITEM) ?? [])].filter((item) => !item.closest('[data-ak-tb-popover]'));
24
+ const active = focusIndex ?? Math.max(0, items.indexOf(document.activeElement));
25
+ items.forEach((item, index) => {
26
+ item.tabIndex = index === active ? 0 : -1;
27
+ });
28
+ return items;
29
+ }, []);
30
+ useEffect(() => {
31
+ sync(0);
32
+ });
33
+ const onKeyDown = (event) => {
34
+ if (event.target.closest('[data-ak-tb-popover]'))
35
+ return;
36
+ if (event.target.tagName === 'SELECT' &&
37
+ (event.key === 'ArrowUp' || event.key === 'ArrowDown'))
38
+ return;
39
+ const items = sync();
40
+ const current = items.indexOf(event.target);
41
+ if (current < 0)
42
+ return;
43
+ let next = -1;
44
+ if (event.key === 'ArrowRight')
45
+ next = (current + 1) % items.length;
46
+ else if (event.key === 'ArrowLeft')
47
+ next = (current - 1 + items.length) % items.length;
48
+ else if (event.key === 'Home')
49
+ next = 0;
50
+ else if (event.key === 'End')
51
+ next = items.length - 1;
52
+ if (next < 0)
53
+ return;
54
+ event.preventDefault();
55
+ sync(next);
56
+ items[next]?.focus();
57
+ };
58
+ return (_jsx("div", { ref: ref, role: "toolbar", "aria-label": label, className: cx('ak-tb', sticky && 'ak-tb--sticky', className), onKeyDown: onKeyDown, onFocus: (event) => {
59
+ if (event.target.matches(ITEM))
60
+ sync([...sync()].indexOf(event.target));
61
+ }, children: children }));
62
+ }
63
+ export function ToolbarGroup({ label, children }) {
64
+ return (_jsxs("fieldset", { className: "ak-tb-group", children: [label ? _jsx("legend", { className: "ak-tb-sr-only", children: label }) : null, children] }));
65
+ }
66
+ export function ToolbarSpacer() {
67
+ return _jsx("span", { className: "ak-tb-spacer", "aria-hidden": "true" });
68
+ }
69
+ function tooltip(label, shortcut) {
70
+ return shortcut ? `${label} (${shortcut})` : label;
71
+ }
72
+ export function ToolbarButton({ icon: Icon, label, onClick, pressed, disabled, shortcut, showLabel, variant = 'default', keepFocus = true, }) {
73
+ return (_jsxs("button", { type: "button", "data-ak-tb-item": "", className: cx('ak-tb-button', (showLabel || !Icon) && 'ak-tb-button--text'), "data-variant": variant === 'default' ? undefined : variant, "aria-label": showLabel ? undefined : label, title: tooltip(label, shortcut), "aria-pressed": pressed, "aria-keyshortcuts": shortcut?.replace(/Ctrl/g, 'Control'), disabled: disabled, onMouseDown: keepFocus ? keepSelection : undefined, onClick: onClick, children: [Icon ? _jsx(Icon, { "aria-hidden": "true" }) : null, showLabel || !Icon ? _jsx("span", { children: label }) : null] }));
74
+ }
75
+ export function ToolbarSelect({ label, value, options, onChange, disabled, width, }) {
76
+ return (_jsx("select", { "data-ak-tb-item": "", className: "ak-tb-select", "aria-label": label, title: label, value: value, disabled: disabled, style: width ? { width } : undefined, onChange: (event) => onChange(event.target.value), children: options.map((option) => (_jsx("option", { value: option.value, children: option.label }, option.value))) }));
77
+ }
78
+ /** Popover anchored under a toolbar trigger; closes on Escape, outside click and selection. */
79
+ function usePopover() {
80
+ const [open, setOpen] = useState(false);
81
+ const root = useRef(null);
82
+ const trigger = useRef(null);
83
+ useEffect(() => {
84
+ if (!open)
85
+ return;
86
+ const onDown = (event) => {
87
+ if (!root.current?.contains(event.target))
88
+ setOpen(false);
89
+ };
90
+ document.addEventListener('mousedown', onDown);
91
+ return () => document.removeEventListener('mousedown', onDown);
92
+ }, [open]);
93
+ const close = (refocus = true) => {
94
+ setOpen(false);
95
+ if (refocus)
96
+ trigger.current?.focus();
97
+ };
98
+ return { open, setOpen, root, trigger, close };
99
+ }
100
+ function focusItems(container, index) {
101
+ const items = [...(container?.querySelectorAll('[role^="menuitem"]:not([disabled])') ?? [])];
102
+ if (items.length === 0)
103
+ return;
104
+ const target = index === 'first' ? 0 : index === 'last' ? items.length - 1 : (index + items.length) % items.length;
105
+ items[target]?.focus();
106
+ }
107
+ function menuKeys(event, close) {
108
+ const items = [...event.currentTarget.querySelectorAll('[role^="menuitem"]:not([disabled])')];
109
+ const current = items.indexOf(document.activeElement);
110
+ const columns = Number(event.currentTarget.dataset.columns ?? 1);
111
+ const step = {
112
+ ArrowDown: columns,
113
+ ArrowUp: -columns,
114
+ ArrowRight: columns > 1 ? 1 : 0,
115
+ ArrowLeft: columns > 1 ? -1 : 0,
116
+ }[event.key];
117
+ if (event.key === 'Escape') {
118
+ event.preventDefault();
119
+ event.stopPropagation();
120
+ close();
121
+ }
122
+ else if (step) {
123
+ event.preventDefault();
124
+ focusItems(event.currentTarget, current + step);
125
+ }
126
+ else if (event.key === 'Home' || event.key === 'End') {
127
+ event.preventDefault();
128
+ focusItems(event.currentTarget, event.key === 'Home' ? 'first' : 'last');
129
+ }
130
+ }
131
+ export function ToolbarMenu({ icon: Icon, label, items, disabled, showLabel, keepFocus = true, }) {
132
+ const { open, setOpen, root, trigger, close } = usePopover();
133
+ const list = useRef(null);
134
+ const id = useId();
135
+ useEffect(() => {
136
+ if (open)
137
+ focusItems(list.current, 'first');
138
+ }, [open]);
139
+ const hasChecks = items.some((item) => item !== 'separator' && item.checked !== undefined);
140
+ return (_jsxs("span", { ref: root, className: "ak-tb-anchor", children: [_jsxs("button", { ref: trigger, type: "button", "data-ak-tb-item": "", className: cx('ak-tb-button', 'ak-tb-button--menu', (showLabel || !Icon) && 'ak-tb-button--text'), "aria-label": showLabel ? undefined : label, title: label, "aria-haspopup": "menu", "aria-expanded": open, "aria-controls": open ? id : undefined, disabled: disabled, onMouseDown: keepFocus ? keepSelection : undefined, onClick: () => setOpen(!open), onKeyDown: (event) => {
141
+ if (event.key === 'ArrowDown' && !open) {
142
+ event.preventDefault();
143
+ setOpen(true);
144
+ }
145
+ }, children: [Icon ? _jsx(Icon, { "aria-hidden": "true" }) : null, showLabel || !Icon ? _jsx("span", { children: label }) : null, _jsx(ChevronDown, { "aria-hidden": "true", className: "ak-tb-caret" })] }), open ? (_jsx("div", { ref: list, id: id, role: "menu", "aria-label": label, className: "ak-tb-popover", "data-ak-tb-popover": "", onKeyDown: (event) => menuKeys(event, () => close()), children: items.map((item, index) => item === 'separator' ? (_jsx("hr", { className: "ak-tb-separator" }, `sep-${index}`)) : (_jsxs("button", { type: "button", ...(item.checked === undefined
146
+ ? { role: 'menuitem' }
147
+ : { role: 'menuitemradio', 'aria-checked': item.checked }), tabIndex: -1, className: "ak-tb-menu-item", "data-danger": item.danger ? '' : undefined, disabled: item.disabled, onMouseDown: keepFocus ? keepSelection : undefined, onClick: () => {
148
+ close(!keepFocus);
149
+ item.onSelect();
150
+ }, children: [hasChecks ? (_jsx("span", { className: "ak-tb-check", "aria-hidden": "true", children: item.checked ? _jsx(Check, {}) : null })) : null, item.icon ? _jsx(item.icon, { "aria-hidden": "true" }) : null, _jsx("span", { className: "ak-tb-menu-label", children: item.label }), item.shortcut ? _jsx("kbd", { className: "ak-tb-kbd", children: item.shortcut }) : null] }, item.key))) })) : null] }));
151
+ }
152
+ /** Swatches for the theme color tokens (labels in pt-BR or English). */
153
+ export function themeSwatches(theme, locale = 'en') {
154
+ const pt = locale.toLowerCase().startsWith('pt');
155
+ const names = {
156
+ text: ['Text', 'Texto'],
157
+ muted: ['Muted', 'Suave'],
158
+ accent: ['Accent', 'Destaque'],
159
+ background: ['Background', 'Fundo'],
160
+ surface: ['Surface', 'Superfície'],
161
+ info: ['Info', 'Informação'],
162
+ warning: ['Warning', 'Atenção'],
163
+ success: ['Success', 'Sucesso'],
164
+ danger: ['Danger', 'Perigo'],
165
+ };
166
+ return COLOR_TOKENS.map((token) => ({
167
+ value: token,
168
+ label: names[token][pt ? 1 : 0],
169
+ swatch: theme.colors[token],
170
+ }));
171
+ }
172
+ export function ToolbarColor({ icon: Icon, label, value, colors, onChange, noneLabel, disabled, keepFocus = true, }) {
173
+ const { open, setOpen, root, trigger, close } = usePopover();
174
+ const grid = useRef(null);
175
+ const id = useId();
176
+ const current = colors.find((color) => color.value === value);
177
+ useEffect(() => {
178
+ if (open)
179
+ focusItems(grid.current, 'first');
180
+ }, [open]);
181
+ return (_jsxs("span", { ref: root, className: "ak-tb-anchor", children: [_jsxs("button", { ref: trigger, type: "button", "data-ak-tb-item": "", className: "ak-tb-button ak-tb-button--menu ak-tb-button--color", "aria-label": `${label}${current ? `: ${current.label}` : ''}`, title: label, "aria-haspopup": "menu", "aria-expanded": open, "aria-controls": open ? id : undefined, disabled: disabled, onMouseDown: keepFocus ? keepSelection : undefined, onClick: () => setOpen(!open), children: [_jsxs("span", { className: "ak-tb-color-icon", children: [_jsx(Icon, { "aria-hidden": "true" }), _jsx("span", { className: "ak-tb-color-bar", style: { background: current?.swatch ?? 'transparent' } })] }), _jsx(ChevronDown, { "aria-hidden": "true", className: "ak-tb-caret" })] }), open ? (_jsxs("div", { ref: grid, id: id, role: "menu", "aria-label": label, className: "ak-tb-popover ak-tb-palette", "data-ak-tb-popover": "", "data-columns": "5", onKeyDown: (event) => menuKeys(event, () => close()), children: [colors.map((color) => (_jsx("button", { type: "button", role: "menuitemradio", "aria-checked": color.value === value, "aria-label": color.label, title: color.label, tabIndex: -1, className: "ak-tb-swatch", style: { background: color.swatch }, onMouseDown: keepFocus ? keepSelection : undefined, onClick: () => {
182
+ close(!keepFocus);
183
+ onChange(color.value);
184
+ } }, color.value))), noneLabel ? (_jsxs("button", { type: "button", role: "menuitemradio", "aria-checked": !value, tabIndex: -1, className: "ak-tb-menu-item ak-tb-palette-none", onMouseDown: keepFocus ? keepSelection : undefined, onClick: () => {
185
+ close(!keepFocus);
186
+ onChange(null);
187
+ }, children: [_jsx(X, { "aria-hidden": "true" }), _jsx("span", { className: "ak-tb-menu-label", children: noneLabel })] })) : null] })) : null] }));
188
+ }
189
+ /** Toolbar styles (Mouts design system); embedded in `artkitCss` and in every kind editor CSS. */
190
+ export const toolbarCss = `
191
+ .ak-tb{display:flex;flex-wrap:wrap;align-items:center;gap:4px;padding:6px;background:var(--ak-color-background,#fff);color:var(--ak-color-text,#1d2f3c);border:1px solid var(--ak-color-border,#dde0e2);border-radius:var(--ak-radius-md,8px);font-family:var(--ak-font-body,"Sora",system-ui,sans-serif);font-size:13px;line-height:1}
192
+ .ak-tb--sticky{position:sticky;top:0;z-index:5}
193
+ .ak-tb-group{display:inline-flex;align-items:center;gap:2px;margin:0;padding:0 0 0 6px;border:0;border-left:1px solid var(--ak-color-border,#dde0e2);min-inline-size:0}
194
+ .ak-tb-group:first-child{padding-left:0;border-left:0}
195
+ .ak-tb-spacer{flex:1}
196
+ .ak-tb-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}
197
+ .ak-tb-button{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-width:32px;height:32px;padding:0 6px;border:1px solid transparent;border-radius:var(--ak-radius-sm,6px);background:none;color:var(--ak-color-muted,#56636d);font:inherit;font-weight:600;cursor:pointer;white-space:nowrap;transition:background-color .15s,color .15s,border-color .15s}
198
+ .ak-tb-button svg{width:16px;height:16px;flex-shrink:0}
199
+ .ak-tb-button--text{padding:0 10px;color:var(--ak-color-text,#1d2f3c)}
200
+ .ak-tb-button:hover:not(:disabled){background:var(--ak-color-hover,#f2f3f4);color:var(--ak-color-text,#1d2f3c)}
201
+ .ak-tb-button:active:not(:disabled){background:var(--ak-color-active,#e8eaec)}
202
+ .ak-tb-button[aria-pressed="true"],.ak-tb-button[aria-expanded="true"]{background:var(--ak-color-fill-accent,#e7f2ef);color:var(--ak-color-accent,#0f7a5a);border-color:var(--ak-color-accent,#0f7a5a)}
203
+ .ak-tb-button[data-variant="primary"]{background:var(--ak-gradient-button);color:var(--ak-color-on-primary,#1d2f3c);border-color:transparent}
204
+ .ak-tb-button[data-variant="primary"]:hover:not(:disabled){background:var(--ak-gradient-button-hover)}
205
+ .ak-tb-button[data-variant="danger"]{color:var(--ak-color-danger,#9f343a)}
206
+ .ak-tb-button[data-variant="danger"]:hover:not(:disabled){background:var(--ak-color-fill-danger,#f5ebeb)}
207
+ .ak-tb-button:disabled,.ak-tb-select:disabled{opacity:.4;cursor:not-allowed}
208
+ .ak-tb-button:focus-visible,.ak-tb-select:focus-visible,.ak-tb-menu-item:focus-visible,.ak-tb-swatch:focus-visible{outline:2px solid var(--ak-color-focus,#0f7a5a);outline-offset:2px}
209
+ .ak-tb-button--menu{padding:0 4px 0 6px;gap:2px}
210
+ .ak-tb-button--menu.ak-tb-button--text{padding:0 6px 0 10px}
211
+ .ak-tb-button .ak-tb-caret{width:12px;height:12px;opacity:.7}
212
+ .ak-tb-color-icon{position:relative;display:inline-flex;flex-direction:column;align-items:center;gap:1px}
213
+ .ak-tb-color-bar{display:block;width:16px;height:3px;border-radius:2px;border:1px solid var(--ak-color-border,#dde0e2)}
214
+ .ak-tb-select{height:32px;max-width:200px;padding:0 8px;font:inherit;font-size:13px;color:var(--ak-color-text,#1d2f3c);background:var(--ak-color-background,#fff);border:1px solid var(--ak-color-border-strong,#8e979d);border-radius:var(--ak-radius-sm,6px);cursor:pointer}
215
+ .ak-tb-anchor{position:relative;display:inline-flex}
216
+ .ak-tb-popover{position:absolute;top:calc(100% + 4px);left:0;z-index:30;display:flex;flex-direction:column;min-width:200px;max-height:360px;overflow:auto;padding:4px;background:var(--ak-color-background,#fff);border:1px solid var(--ak-color-border-strong,#8e979d);border-radius:var(--ak-radius-md,8px)}
217
+ .ak-tb-menu-item{display:flex;align-items:center;gap:8px;width:100%;min-height:32px;padding:0 10px;border:0;border-radius:var(--ak-radius-sm,6px);background:none;color:var(--ak-color-text,#1d2f3c);font:inherit;font-size:13px;text-align:left;cursor:pointer}
218
+ .ak-tb-menu-item svg{width:16px;height:16px;flex-shrink:0;color:var(--ak-color-muted,#56636d)}
219
+ .ak-tb-menu-item:hover:not(:disabled),.ak-tb-menu-item:focus{background:var(--ak-color-hover,#f2f3f4)}
220
+ .ak-tb-menu-item:disabled{opacity:.4;cursor:not-allowed}
221
+ .ak-tb-menu-item[data-danger]{color:var(--ak-color-danger,#9f343a)}
222
+ .ak-tb-menu-item[aria-checked="true"]{color:var(--ak-color-accent,#0f7a5a);font-weight:600}
223
+ .ak-tb-menu-label{flex:1}
224
+ .ak-tb-check{display:inline-flex;width:16px}
225
+ .ak-tb-check svg{color:var(--ak-color-accent,#0f7a5a)}
226
+ .ak-tb-kbd{font-family:var(--ak-font-mono,ui-monospace,monospace);font-size:11px;color:var(--ak-color-muted,#56636d)}
227
+ .ak-tb-separator{width:100%;height:1px;margin:4px 0;border:0;background:var(--ak-color-border,#dde0e2)}
228
+ .ak-tb-palette{display:grid;grid-template-columns:repeat(5,28px);gap:6px;min-width:0;padding:8px}
229
+ .ak-tb-swatch{width:28px;height:28px;padding:0;border:1px solid var(--ak-color-border-strong,#8e979d);border-radius:var(--ak-radius-sm,6px);cursor:pointer}
230
+ .ak-tb-swatch[aria-checked="true"]{box-shadow:inset 0 0 0 2px var(--ak-color-background,#fff);border:2px solid var(--ak-color-accent,#0f7a5a)}
231
+ .ak-tb-palette-none{grid-column:1/-1}
232
+ `;
233
+ //# sourceMappingURL=toolbar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolbar.js","sourceRoot":"","sources":["../src/toolbar.tsx"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,53 @@
1
1
  {
2
2
  "name": "@artkit-ai/react",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.1.0",
4
+ "description": "React host for artkit artifacts: provider, view, editor, panel, card, approval, version diff, hooks and streaming preview.",
5
+ "license": "Apache-2.0",
6
+ "type": "module",
7
+ "sideEffects": false,
8
+ "keywords": [
9
+ "artkit",
10
+ "ai",
11
+ "agents",
12
+ "artifacts"
13
+ ],
14
+ "exports": {
15
+ ".": {
16
+ "@artkit/source": "./src/index.ts",
17
+ "types": "./dist/index.d.ts",
18
+ "import": "./dist/index.js"
19
+ },
20
+ "./package.json": "./package.json"
21
+ },
22
+ "files": [
23
+ "dist",
24
+ "src",
25
+ "README.md"
26
+ ],
27
+ "engines": {
28
+ "node": ">=22"
29
+ },
30
+ "repository": {
31
+ "type": "git",
32
+ "url": "git+https://github.com/gustavonpco/artkit.git",
33
+ "directory": "packages/react"
34
+ },
35
+ "publishConfig": {
36
+ "access": "public",
37
+ "provenance": true
38
+ },
39
+ "dependencies": {
40
+ "lucide-react": "^1.68.0",
41
+ "@artkit-ai/core": "^0.1.0"
42
+ },
43
+ "peerDependencies": {
44
+ "react": "^19.0.0",
45
+ "react-dom": "^19.0.0"
46
+ },
47
+ "devDependencies": {
48
+ "zod": "^4.6.7"
49
+ },
50
+ "scripts": {
51
+ "build": "tsc -b"
52
+ }
6
53
  }
package/src/cache.ts ADDED
@@ -0,0 +1,132 @@
1
+ import type { Artifact } from '@artkit-ai/core';
2
+ import type { ArtifactClient } from './client.js';
3
+
4
+ export interface CacheEntry {
5
+ artifact?: Artifact;
6
+ error?: unknown;
7
+ loading: boolean;
8
+ }
9
+
10
+ const EMPTY: CacheEntry = Object.freeze({ loading: false }) as CacheEntry;
11
+
12
+ const keyOf = (id: string, version?: number) => `${id}@${version ?? 'latest'}`;
13
+
14
+ /**
15
+ * Artifact cache shared by the hooks under one provider (spec §13.2). Versions are immutable, so an
16
+ * entry for a specific version never needs revalidation; the `latest` entry only moves forward and is
17
+ * revalidated on demand. Listeners are per artifact id so history and editors hear about new commits.
18
+ */
19
+ export class ArtifactCache {
20
+ private readonly entries = new Map<string, CacheEntry>();
21
+ private readonly inflight = new Map<string, Promise<Artifact>>();
22
+ private readonly listeners = new Map<string, Set<() => void>>();
23
+
24
+ constructor(private readonly client: ArtifactClient) {}
25
+
26
+ entry(id: string, version?: number): CacheEntry {
27
+ return this.entries.get(keyOf(id, version)) ?? EMPTY;
28
+ }
29
+
30
+ latest(id: string): Artifact | undefined {
31
+ return this.entries.get(keyOf(id))?.artifact;
32
+ }
33
+
34
+ subscribe(id: string, listener: () => void): () => void {
35
+ const set = this.listeners.get(id) ?? new Set();
36
+ set.add(listener);
37
+ this.listeners.set(id, set);
38
+ return () => {
39
+ set.delete(listener);
40
+ if (set.size === 0) this.listeners.delete(id);
41
+ };
42
+ }
43
+
44
+ private notify(id: string): void {
45
+ for (const listener of [...(this.listeners.get(id) ?? [])]) listener();
46
+ }
47
+
48
+ private set(id: string, version: number | undefined, entry: CacheEntry): void {
49
+ this.entries.set(keyOf(id, version), entry);
50
+ }
51
+
52
+ /**
53
+ * Records a known artifact version (commit result, prop, status change). `latest` only moves forward,
54
+ * except that a status change on the same version replaces it.
55
+ */
56
+ put(artifact: Artifact): void {
57
+ const current = this.latest(artifact.id);
58
+ const sameVersionChanged =
59
+ current !== undefined &&
60
+ artifact.version === current.version &&
61
+ (artifact.status !== current.status ||
62
+ artifact.meta.updatedAt !== current.meta.updatedAt ||
63
+ artifact.meta.publishedVersion !== current.meta.publishedVersion);
64
+ const known = this.entries.get(keyOf(artifact.id, artifact.version))?.artifact;
65
+ if (current && !sameVersionChanged && artifact.version <= current.version && known) return;
66
+ this.set(artifact.id, artifact.version, { artifact, loading: false });
67
+ if (!current || artifact.version > current.version || sameVersionChanged) {
68
+ this.set(artifact.id, undefined, { artifact, loading: false });
69
+ }
70
+ this.notify(artifact.id);
71
+ }
72
+
73
+ /** Loads unless a fresh value is cached. `force` revalidates `latest` (specific versions never change). */
74
+ load(id: string, version?: number, force = false): Promise<Artifact> {
75
+ const key = keyOf(id, version);
76
+ const existing = this.entries.get(key);
77
+ if (existing?.artifact && (version !== undefined || !force)) return Promise.resolve(existing.artifact);
78
+ const pending = this.inflight.get(key);
79
+ if (pending) return pending;
80
+ this.set(id, version, { ...(existing ?? {}), loading: true });
81
+ this.notify(id);
82
+ const promise = this.client.get(id, version === undefined ? undefined : { version }).then(
83
+ (artifact) => {
84
+ this.inflight.delete(key);
85
+ if (version === undefined) {
86
+ // A commit may have landed while the request was in flight; never move `latest` backwards.
87
+ const current = this.latest(id);
88
+ if (current && current.version > artifact.version) {
89
+ this.set(id, undefined, { artifact: current, loading: false });
90
+ this.notify(id);
91
+ return current;
92
+ }
93
+ }
94
+ this.set(artifact.id, artifact.version, { artifact, loading: false });
95
+ if (version === undefined) this.set(id, undefined, { artifact, loading: false });
96
+ else if (!this.latest(id) || this.latest(id)!.version < artifact.version)
97
+ this.set(id, undefined, { artifact, loading: false });
98
+ this.notify(id);
99
+ return artifact;
100
+ },
101
+ (error: unknown) => {
102
+ this.inflight.delete(key);
103
+ const previous = this.entries.get(key);
104
+ this.set(id, version, {
105
+ ...(previous?.artifact ? { artifact: previous.artifact } : {}),
106
+ error,
107
+ loading: false,
108
+ });
109
+ this.notify(id);
110
+ throw error;
111
+ },
112
+ );
113
+ this.inflight.set(key, promise);
114
+ return promise;
115
+ }
116
+
117
+ /** Signals listeners of an id without changing entries (e.g. history must refetch after a restore). */
118
+ touch(id: string): void {
119
+ this.notify(id);
120
+ }
121
+ }
122
+
123
+ const caches = new WeakMap<ArtifactClient, ArtifactCache>();
124
+
125
+ export function cacheFor(client: ArtifactClient): ArtifactCache {
126
+ let cache = caches.get(client);
127
+ if (!cache) {
128
+ cache = new ArtifactCache(client);
129
+ caches.set(client, cache);
130
+ }
131
+ return cache;
132
+ }