@crewlethq/ui 0.35.1 → 0.37.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.
- package/README.md +90 -1
- package/dist/AgentHandoffPanel/AgentHandoffPanel.d.ts +99 -0
- package/dist/AgentHandoffPanel/index.d.ts +3 -0
- package/dist/AgentHandoffPanel/index.js +16 -0
- package/dist/AgentHandoffPanel-JWSW62GU.css +151 -0
- package/dist/ArrangeFrame/index.js +1 -1
- package/dist/{ArrangeFrame-3PLZAG22.css → ArrangeFrame-QXOQTFAH.css} +22 -5
- package/dist/ArrangeList/index.js +4 -3
- package/dist/ArtifactAccess/ArtifactAccess.d.ts +40 -0
- package/dist/ArtifactAccess/index.d.ts +3 -0
- package/dist/ArtifactAccess/index.js +2 -0
- package/dist/ArtifactAccess-Y53ZTRFS.css +31 -0
- package/dist/ArtifactBar/ArtifactBar.d.ts +2 -1
- package/dist/ArtifactBar/index.js +2 -2
- package/dist/{ArtifactBar-HV5AT4RG.css → ArtifactBar-FWPBBKQ5.css} +8 -0
- package/dist/ArtifactCard/ArtifactCard.d.ts +1 -6
- package/dist/ArtifactCard/index.d.ts +2 -1
- package/dist/ArtifactCard/index.js +4 -3
- package/dist/ArtifactCover/index.js +3 -2
- package/dist/ArtifactKindIllustration/ArtifactKindIllustration.d.ts +16 -7
- package/dist/ArtifactKindIllustration/index.js +1 -1
- package/dist/{ArtifactKindIllustration-5FPRJQ3P.css → ArtifactKindIllustration-KLFL7KBG.css} +37 -1
- package/dist/ArtifactMakeRow/ArtifactMakeRow.d.ts +39 -0
- package/dist/ArtifactMakeRow/index.d.ts +4 -0
- package/dist/ArtifactMakeRow/index.js +4 -0
- package/dist/ArtifactMakeRow-XBA2MPSY.css +167 -0
- package/dist/ArtifactNameCell/ArtifactNameCell.d.ts +37 -0
- package/dist/ArtifactNameCell/index.d.ts +4 -0
- package/dist/ArtifactNameCell/index.js +4 -0
- package/dist/ArtifactNameCell-RTVP4LO4.css +104 -0
- package/dist/ArtifactPanel/ArtifactPanel.d.ts +8 -1
- package/dist/ArtifactPanel/index.js +1 -1
- package/dist/{ArtifactPanel-HW3SU7CP.css → ArtifactPanel-KKUUIPEU.css} +9 -0
- package/dist/AuthLayout/index.js +2 -2
- package/dist/AvatarPicker/index.js +2 -2
- package/dist/Canvas/index.js +2 -2
- package/dist/CanvasBoard/CanvasBoard.d.ts +27 -13
- package/dist/CanvasBoard/index.d.ts +1 -1
- package/dist/CanvasBoard/index.js +4 -4
- package/dist/{CanvasBoard-5NNSKY6A.css → CanvasBoard-TS4P356F.css} +13 -6
- package/dist/CanvasToolbar/index.js +3 -3
- package/dist/Card/index.js +1 -1
- package/dist/{Card-KJOYHDTJ.css → Card-QOVASQNU.css} +17 -12
- package/dist/Checkbox/index.js +3 -2
- package/dist/ChoiceButtons/index.js +1 -1
- package/dist/{ChoiceButtons-DJ5EOGUA.css → ChoiceButtons-FLIFXFFS.css} +10 -0
- package/dist/ChoiceList/index.js +1 -1
- package/dist/{ChoiceList-RBL7FNQL.css → ChoiceList-EA2W6MOS.css} +36 -5
- package/dist/Combobox/index.js +3 -2
- package/dist/CommandPalette/index.js +3 -2
- package/dist/CommentThread/index.js +6 -5
- package/dist/Composer/Composer.d.ts +4 -0
- package/dist/Composer/index.js +3 -2
- package/dist/{Composer-ABGJIAIR.css → Composer-PXITWNEK.css} +26 -15
- package/dist/ConfirmField/index.js +3 -2
- package/dist/DataTable/index.js +4 -3
- package/dist/DataView/index.js +7 -6
- package/dist/DatasetSource/DatasetSource.d.ts +4 -0
- package/dist/DatasetSource/index.js +1 -1
- package/dist/{DatasetSource-XFPZBRXL.css → DatasetSource-SMGX4PS5.css} +38 -4
- package/dist/DateTimePicker/index.js +2 -1
- package/dist/{DateTimePicker-HG2KQXQ6.css → DateTimePicker-2IVTKFV2.css} +15 -2
- package/dist/DocTabsEditor/index.js +3 -2
- package/dist/Document/Document.d.ts +15 -3
- package/dist/Document/index.js +2 -1
- package/dist/{Document-JUGCSQ4L.css → Document-YFWTWXJP.css} +34 -2
- package/dist/{Editor-BVQHBF7L.js → Editor-HORWMUM3.js} +2 -1
- package/dist/FilterChip/index.js +1 -1
- package/dist/{FilterChip-EZ4QMW4E.css → FilterChip-VL33P3JL.css} +5 -1
- package/dist/Input/index.js +2 -1
- package/dist/{Input-GBZSFXLU.css → Input-ABGOFENS.css} +46 -10
- package/dist/LayersList/index.js +1 -1
- package/dist/{LayersList-NQZEIPZB.css → LayersList-TBNF4XGL.css} +16 -3
- package/dist/LinkInterstitial/index.js +2 -2
- package/dist/ListInput/index.js +3 -2
- package/dist/LivePreview/LivePreview.d.ts +120 -28
- package/dist/LivePreview/budget.d.ts +64 -20
- package/dist/LivePreview/index.d.ts +6 -4
- package/dist/LivePreview/index.js +1 -1
- package/dist/LivePreview/stills.d.ts +57 -0
- package/dist/LivePreview-BROGKR4N.css +113 -0
- package/dist/PresenterView/index.js +2 -2
- package/dist/PrincipalPicker/index.js +4 -3
- package/dist/RichEditor/index.js +1 -1
- package/dist/Select/index.js +2 -1
- package/dist/{Select-A54YS5EP.css → Select-W3CHTZXP.css} +18 -2
- package/dist/ShareDialog/index.js +3 -2
- package/dist/SheetColumnEditor/index.js +6 -5
- package/dist/SheetGrid/index.js +3 -3
- package/dist/SlideCompare/index.js +2 -2
- package/dist/SlideFilmstrip/index.js +2 -2
- package/dist/{SlideFilmstrip-4ITZLMO4.css → SlideFilmstrip-PAT7P4OG.css} +26 -7
- package/dist/SlideGrid/index.js +2 -2
- package/dist/{SlideGrid-S4LTJ4UU.css → SlideGrid-FJA33DV4.css} +11 -1
- package/dist/SlideStage/index.js +1 -1
- package/dist/{SlideStage-S2FISF4C.css → SlideStage-ZTTEQSS2.css} +4 -2
- package/dist/SourceEditor/index.js +2 -1
- package/dist/{SourceEditor-G2C3STPX.css → SourceEditor-QAYE2JS6.css} +19 -12
- package/dist/Switcher/index.js +4 -3
- package/dist/TagsInput/index.js +2 -1
- package/dist/{TagsInput-XMXTI5Q4.css → TagsInput-7EGBBXHS.css} +7 -1
- package/dist/ThemeGallery/index.js +1 -1
- package/dist/{ThemeGallery-HSUKBDWY.css → ThemeGallery-X35Y25EX.css} +26 -5
- package/dist/TimeWindowPicker/index.js +4 -3
- package/dist/{TimeWindowPicker-T763GLXH.css → TimeWindowPicker-DEFDV77Z.css} +15 -2
- package/dist/TreeCanvas/index.js +3 -3
- package/dist/VersionTimeline/index.js +2 -2
- package/dist/{chunk-V43UVX4H.js → chunk-27GD7LVR.js} +1 -1
- package/dist/{chunk-6JVRY5DQ.js → chunk-44WJLPQS.js} +2 -2
- package/dist/{chunk-ONL54WMH.js → chunk-46RL3E54.js} +1 -1
- package/dist/{chunk-UHJQDFKQ.js → chunk-4ZJLOKSS.js} +1 -1
- package/dist/{chunk-ACA27MZH.js → chunk-5QXRI35B.js} +1 -1
- package/dist/{chunk-LL5AFXU7.js → chunk-5RT5O4JR.js} +1 -1
- package/dist/{chunk-GMU6SQ6B.js → chunk-66NGUD5S.js} +2 -2
- package/dist/{chunk-3Y56GQPM.js → chunk-7VAUGG6B.js} +1 -1
- package/dist/{chunk-2CQLNML5.js → chunk-AOLCZDZ6.js} +3 -1
- package/dist/{chunk-NKZCJRKO.js → chunk-APDKUGSH.js} +2 -2
- package/dist/chunk-BGLKLXL3.js +29 -0
- package/dist/{chunk-Z6VW6CXX.js → chunk-BIQDJOJZ.js} +1 -1
- package/dist/{chunk-YSJC7AZC.js → chunk-BWOIUOO3.js} +1 -1
- package/dist/{chunk-PI7HKLIT.js → chunk-D7GNNID2.js} +3 -1
- package/dist/chunk-EAKC24BW.js +51 -0
- package/dist/{chunk-CCLNGVCM.js → chunk-EARDAJQY.js} +1 -1
- package/dist/chunk-EOQFPZEE.js +138 -0
- package/dist/{chunk-THROPJZC.js → chunk-F23N4MVU.js} +1 -1
- package/dist/{chunk-J6YZ4IYV.js → chunk-FG4O64DV.js} +3 -3
- package/dist/{chunk-E35CMI5D.js → chunk-FHHYXZSP.js} +31 -13
- package/dist/{chunk-AYB6AYNH.js → chunk-GMLAKNFY.js} +1 -1
- package/dist/{chunk-ZB5O3ELS.js → chunk-GRYZ5EP3.js} +4 -2
- package/dist/{chunk-QFNWMWWY.js → chunk-GS7ZTHPF.js} +4 -4
- package/dist/{chunk-ILAEBSLJ.js → chunk-H5NOLRGH.js} +2 -2
- package/dist/{chunk-W3UVOZKL.js → chunk-IPAU6FLH.js} +6 -2
- package/dist/{chunk-6QFAK2WV.js → chunk-IUYUS2SO.js} +4 -1
- package/dist/{chunk-22CQQDFW.js → chunk-JML75PGJ.js} +1 -1
- package/dist/{chunk-AXBRWRGV.js → chunk-JQLS3MZB.js} +1 -1
- package/dist/{chunk-FGYET26P.js → chunk-KJW2AS57.js} +1 -1
- package/dist/{chunk-QIXMNOBD.js → chunk-KYZMN6I6.js} +2 -2
- package/dist/{chunk-73A7D5CE.js → chunk-L4WZSVMT.js} +3 -1
- package/dist/{chunk-ULPL26BU.js → chunk-N5SKHIAP.js} +1 -1
- package/dist/{chunk-LV4APO72.js → chunk-NQGPD6NX.js} +1 -1
- package/dist/{chunk-7UYONN6K.js → chunk-OHA6WSAG.js} +6 -11
- package/dist/chunk-P5VGSVWG.js +39 -0
- package/dist/chunk-P6WFZDKS.js +111 -0
- package/dist/{chunk-CPEPST4S.js → chunk-PJIPUEJ3.js} +1 -1
- package/dist/{chunk-QS4ZGTEU.js → chunk-PPFX6GRK.js} +1 -1
- package/dist/{chunk-7DZDSSJS.js → chunk-RH2NCQBZ.js} +5 -4
- package/dist/{chunk-3VD3G3IL.js → chunk-T5RQGI6O.js} +1 -1
- package/dist/{chunk-F2KY4RLI.js → chunk-TVRBQMIX.js} +5 -3
- package/dist/{chunk-W7QBBKUE.js → chunk-UBZDYOCA.js} +7 -3
- package/dist/{chunk-QEFHYUCY.js → chunk-UWGUKMBK.js} +1 -1
- package/dist/{chunk-5YLON2PW.js → chunk-UYZZV4DZ.js} +1 -1
- package/dist/{chunk-BQ7AKL2N.js → chunk-VKKUGZ3G.js} +3 -1
- package/dist/{chunk-DEJHAOC5.js → chunk-WMXAX6VA.js} +1 -1
- package/dist/{chunk-VDPJGP4Q.js → chunk-WX2NIG4G.js} +1 -1
- package/dist/chunk-WYKWXRJ4.js +456 -0
- package/dist/{chunk-ZU3DUXD2.js → chunk-WZGYIVYH.js} +1 -1
- package/dist/{chunk-HUVG2FFT.js → chunk-Y5BD4MTE.js} +4 -2
- package/dist/chunk-YSGLEHND.js +56 -0
- package/dist/generated/index.d.ts +4 -0
- package/dist/generated/index.js +105 -100
- package/dist/index.js +105 -100
- package/dist/styles.css +1036 -163
- package/dist/utils/focusModality.d.ts +41 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.js +2 -1
- package/package.json +3 -3
- package/dist/LivePreview-SRO7KHO4.css +0 -65
- package/dist/chunk-KF6YGL4B.js +0 -160
- package/dist/chunk-TYKQ33CL.js +0 -35
- package/dist/{chunk-3P4Y5RX6.js → chunk-4BYHAOHH.js} +1 -1
- package/dist/{chunk-KD2IRYCT.js → chunk-5WDXPHEW.js} +1 -1
- package/dist/{chunk-OSFA5ROT.js → chunk-FEJANUZK.js} +0 -0
- package/dist/{chunk-FJJHD73S.js → chunk-GYBDPCRC.js} +1 -1
- package/dist/{chunk-VHZ3AXJD.js → chunk-NQCY44B3.js} +1 -1
- package/dist/{chunk-3WCNHYXE.js → chunk-PNNYVN52.js} +0 -0
- package/dist/{chunk-FF5OZV77.js → chunk-W3HYWD63.js} +2 -2
|
@@ -0,0 +1,456 @@
|
|
|
1
|
+
import { cx } from './chunk-ODEQTPFM.js';
|
|
2
|
+
import './LivePreview-BROGKR4N.css';
|
|
3
|
+
import { createContext, useMemo, useContext, useRef, useState, useCallback, useEffect, useLayoutEffect } from 'react';
|
|
4
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
// src/LivePreview/budget.ts
|
|
7
|
+
var LIVE_PREVIEW_MAX = 6;
|
|
8
|
+
var LIVE_PREVIEW_MAX_FRAMES = 12;
|
|
9
|
+
var immediately = (run) => {
|
|
10
|
+
run();
|
|
11
|
+
return () => {
|
|
12
|
+
};
|
|
13
|
+
};
|
|
14
|
+
var perFrame = (run) => {
|
|
15
|
+
if (typeof requestAnimationFrame === "undefined") return immediately(run);
|
|
16
|
+
let timer;
|
|
17
|
+
const frame = requestAnimationFrame(() => {
|
|
18
|
+
timer = setTimeout(run, 0);
|
|
19
|
+
});
|
|
20
|
+
return () => {
|
|
21
|
+
cancelAnimationFrame(frame);
|
|
22
|
+
if (timer !== void 0) clearTimeout(timer);
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
function createLivePreviewBudget(max = LIVE_PREVIEW_MAX, schedule = immediately, maxFrames = LIVE_PREVIEW_MAX_FRAMES) {
|
|
26
|
+
const rendering = /* @__PURE__ */ new Set();
|
|
27
|
+
const frames = /* @__PURE__ */ new Set();
|
|
28
|
+
const parked = /* @__PURE__ */ new Set();
|
|
29
|
+
const queue = [];
|
|
30
|
+
let pending = null;
|
|
31
|
+
const pick = () => {
|
|
32
|
+
if (rendering.size >= max) return null;
|
|
33
|
+
for (const ask of queue) {
|
|
34
|
+
if (!ask.frame || frames.size < maxFrames) return { ask, victim: void 0 };
|
|
35
|
+
const victim = parked.values().next().value;
|
|
36
|
+
if (victim) return { ask, victim };
|
|
37
|
+
}
|
|
38
|
+
return null;
|
|
39
|
+
};
|
|
40
|
+
const drop = (ask) => {
|
|
41
|
+
rendering.delete(ask);
|
|
42
|
+
frames.delete(ask);
|
|
43
|
+
parked.delete(ask);
|
|
44
|
+
};
|
|
45
|
+
const next = () => {
|
|
46
|
+
if (pending || !pick()) return;
|
|
47
|
+
let ran = false;
|
|
48
|
+
const cancel = schedule(() => {
|
|
49
|
+
ran = true;
|
|
50
|
+
pending = null;
|
|
51
|
+
const chosen = pick();
|
|
52
|
+
if (chosen) {
|
|
53
|
+
if (chosen.victim) {
|
|
54
|
+
drop(chosen.victim);
|
|
55
|
+
chosen.victim.reclaim?.();
|
|
56
|
+
}
|
|
57
|
+
queue.splice(queue.indexOf(chosen.ask), 1);
|
|
58
|
+
rendering.add(chosen.ask);
|
|
59
|
+
if (chosen.ask.frame) frames.add(chosen.ask);
|
|
60
|
+
chosen.ask.grant();
|
|
61
|
+
}
|
|
62
|
+
next();
|
|
63
|
+
});
|
|
64
|
+
if (!ran) pending = cancel;
|
|
65
|
+
};
|
|
66
|
+
const withdraw = (ask) => {
|
|
67
|
+
const at = queue.indexOf(ask);
|
|
68
|
+
if (at >= 0) queue.splice(at, 1);
|
|
69
|
+
if (queue.length === 0 && pending) {
|
|
70
|
+
pending();
|
|
71
|
+
pending = null;
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
return {
|
|
75
|
+
max,
|
|
76
|
+
maxFrames,
|
|
77
|
+
request(grant, reclaim, frame = false) {
|
|
78
|
+
const ask = { grant, reclaim, frame };
|
|
79
|
+
queue.push(ask);
|
|
80
|
+
next();
|
|
81
|
+
let done = false;
|
|
82
|
+
const held = () => rendering.has(ask) || frames.has(ask);
|
|
83
|
+
const release = () => {
|
|
84
|
+
if (done) return;
|
|
85
|
+
done = true;
|
|
86
|
+
if (held()) {
|
|
87
|
+
drop(ask);
|
|
88
|
+
next();
|
|
89
|
+
} else withdraw(ask);
|
|
90
|
+
};
|
|
91
|
+
return {
|
|
92
|
+
release,
|
|
93
|
+
drawn() {
|
|
94
|
+
if (done || !rendering.has(ask)) return;
|
|
95
|
+
if (!ask.frame) {
|
|
96
|
+
release();
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
rendering.delete(ask);
|
|
100
|
+
next();
|
|
101
|
+
},
|
|
102
|
+
park() {
|
|
103
|
+
if (done) return;
|
|
104
|
+
if (!held()) {
|
|
105
|
+
release();
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
if (!ask.frame) return;
|
|
109
|
+
parked.add(ask);
|
|
110
|
+
next();
|
|
111
|
+
},
|
|
112
|
+
resume() {
|
|
113
|
+
if (done || !held()) return false;
|
|
114
|
+
parked.delete(ask);
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
},
|
|
119
|
+
live: () => rendering.size,
|
|
120
|
+
frames: () => frames.size,
|
|
121
|
+
parked: () => parked.size,
|
|
122
|
+
waiting: () => queue.length
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// src/LivePreview/stills.ts
|
|
127
|
+
var LIVE_PREVIEW_STILLS_KEPT = 200;
|
|
128
|
+
function createLivePreviewStills(kept = LIVE_PREVIEW_STILLS_KEPT) {
|
|
129
|
+
const held = /* @__PURE__ */ new Map();
|
|
130
|
+
const sized = /* @__PURE__ */ new Map();
|
|
131
|
+
let watcher = null;
|
|
132
|
+
return {
|
|
133
|
+
get(key) {
|
|
134
|
+
const got = held.get(key);
|
|
135
|
+
if (got !== void 0) {
|
|
136
|
+
held.delete(key);
|
|
137
|
+
held.set(key, got);
|
|
138
|
+
}
|
|
139
|
+
return got;
|
|
140
|
+
},
|
|
141
|
+
put(key, value) {
|
|
142
|
+
held.delete(key);
|
|
143
|
+
held.set(key, value);
|
|
144
|
+
while (held.size > kept) held.delete(held.keys().next().value);
|
|
145
|
+
},
|
|
146
|
+
forget(key) {
|
|
147
|
+
held.delete(key);
|
|
148
|
+
},
|
|
149
|
+
watch(el, told) {
|
|
150
|
+
if (typeof ResizeObserver === "undefined") return () => {
|
|
151
|
+
};
|
|
152
|
+
watcher ??= new ResizeObserver((entries) => {
|
|
153
|
+
for (const entry of entries) {
|
|
154
|
+
const rect = entry.target.getBoundingClientRect();
|
|
155
|
+
sized.get(entry.target)?.({ w: rect.width, h: rect.height });
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
sized.set(el, told);
|
|
159
|
+
watcher.observe(el);
|
|
160
|
+
return () => {
|
|
161
|
+
sized.delete(el);
|
|
162
|
+
watcher?.unobserve(el);
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
var LOADS = "iframe, frame, video, audio, object, embed";
|
|
168
|
+
function copyOf(nodes) {
|
|
169
|
+
return nodes.flatMap((node) => {
|
|
170
|
+
if (!(node instanceof Element)) return [node.cloneNode(true)];
|
|
171
|
+
if (node.matches(LOADS)) return [];
|
|
172
|
+
const copy = node.cloneNode(true);
|
|
173
|
+
const drawn = node.querySelectorAll("canvas");
|
|
174
|
+
copy.querySelectorAll("canvas").forEach((blank, i) => {
|
|
175
|
+
const image = pictureOf(drawn[i], blank);
|
|
176
|
+
if (image) blank.replaceWith(image);
|
|
177
|
+
});
|
|
178
|
+
for (const loads of copy.querySelectorAll(LOADS)) loads.remove();
|
|
179
|
+
if (node instanceof HTMLCanvasElement) return [pictureOf(node, copy) ?? copy];
|
|
180
|
+
return [copy];
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
function pictureOf(canvas, copy) {
|
|
184
|
+
let src;
|
|
185
|
+
try {
|
|
186
|
+
src = canvas.toDataURL();
|
|
187
|
+
} catch {
|
|
188
|
+
return null;
|
|
189
|
+
}
|
|
190
|
+
const image = canvas.ownerDocument.createElement("img");
|
|
191
|
+
image.src = src;
|
|
192
|
+
image.alt = "";
|
|
193
|
+
for (const { name, value } of copy.attributes) if (name !== "width" && name !== "height") image.setAttribute(name, value);
|
|
194
|
+
image.style.width = `${canvas.clientWidth}px`;
|
|
195
|
+
image.style.height = `${canvas.clientHeight}px`;
|
|
196
|
+
return image;
|
|
197
|
+
}
|
|
198
|
+
var LIVE_PREVIEW_DWELL_MS = 120;
|
|
199
|
+
var LIVE_PREVIEW_MARGIN = "100% 0px";
|
|
200
|
+
var LIVE_PREVIEW_RENDER_MS = 15e3;
|
|
201
|
+
var DefaultShared = { budget: createLivePreviewBudget(LIVE_PREVIEW_MAX, perFrame), stills: createLivePreviewStills() };
|
|
202
|
+
var SharedContext = createContext(DefaultShared);
|
|
203
|
+
function LivePreviewBudgetProvider({
|
|
204
|
+
max = LIVE_PREVIEW_MAX,
|
|
205
|
+
maxFrames = LIVE_PREVIEW_MAX_FRAMES,
|
|
206
|
+
kept = LIVE_PREVIEW_STILLS_KEPT,
|
|
207
|
+
children
|
|
208
|
+
}) {
|
|
209
|
+
const budget = useMemo(() => createLivePreviewBudget(max, perFrame, maxFrames), [max, maxFrames]);
|
|
210
|
+
const stills = useMemo(() => createLivePreviewStills(kept), [kept]);
|
|
211
|
+
const shared = useMemo(() => ({ budget, stills }), [budget, stills]);
|
|
212
|
+
return /* @__PURE__ */ jsx(SharedContext.Provider, { value: shared, children });
|
|
213
|
+
}
|
|
214
|
+
var NOOP = { ready: () => {
|
|
215
|
+
}, fail: () => {
|
|
216
|
+
} };
|
|
217
|
+
var SignalContext = createContext(NOOP);
|
|
218
|
+
function useLivePreview() {
|
|
219
|
+
return useContext(SignalContext);
|
|
220
|
+
}
|
|
221
|
+
function scrollRoot(el) {
|
|
222
|
+
for (let at = el.parentElement; at; at = at.parentElement) {
|
|
223
|
+
const style = getComputedStyle(at);
|
|
224
|
+
if (/(auto|scroll|overlay)/.test(`${style.overflowY} ${style.overflowX}`)) return at;
|
|
225
|
+
}
|
|
226
|
+
return null;
|
|
227
|
+
}
|
|
228
|
+
function afterDrawn(then) {
|
|
229
|
+
let off = false;
|
|
230
|
+
let frame = 0;
|
|
231
|
+
const paint = (left) => {
|
|
232
|
+
if (off) return;
|
|
233
|
+
if (left === 0 || typeof requestAnimationFrame === "undefined") then();
|
|
234
|
+
else frame = requestAnimationFrame(() => paint(left - 1));
|
|
235
|
+
};
|
|
236
|
+
const fonts = typeof document === "undefined" ? void 0 : document.fonts;
|
|
237
|
+
if (fonts) void fonts.ready.then(() => paint(2));
|
|
238
|
+
else paint(2);
|
|
239
|
+
return () => {
|
|
240
|
+
off = true;
|
|
241
|
+
if (frame && typeof cancelAnimationFrame !== "undefined") cancelAnimationFrame(frame);
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
var PREVIEW_FILL_MAX_CUT = 0.2;
|
|
245
|
+
function fitTo(size, width, height, fit) {
|
|
246
|
+
if (!height || fit === "width") {
|
|
247
|
+
const k = size.w / width;
|
|
248
|
+
return { width, height: height ?? size.h / k, transform: `translate(0px, 0px) scale(${k})` };
|
|
249
|
+
}
|
|
250
|
+
const contain = Math.min(size.w / width, size.h / height);
|
|
251
|
+
const cover = Math.max(size.w / width, size.h / height);
|
|
252
|
+
const cut = 1 - contain / cover;
|
|
253
|
+
if (fit === "fill" && cut <= PREVIEW_FILL_MAX_CUT) {
|
|
254
|
+
const left2 = (size.w - width * cover) / 2;
|
|
255
|
+
return { width, height, transform: `translate(${left2}px, 0px) scale(${cover})` };
|
|
256
|
+
}
|
|
257
|
+
const left = (size.w - width * contain) / 2;
|
|
258
|
+
const top = (size.h - height * contain) / 2;
|
|
259
|
+
return { width, height, transform: `translate(${left}px, ${top}px) scale(${contain})` };
|
|
260
|
+
}
|
|
261
|
+
function stillOf(live, width, box) {
|
|
262
|
+
const rect = box.getBoundingClientRect();
|
|
263
|
+
const from = width === void 0 ? live : live.querySelector(":scope > .crewlet-preview-scale > .crewlet-preview-scale__layer") ?? live;
|
|
264
|
+
return { nodes: copyOf([...from.childNodes]), width, size: { w: rect.width, h: rect.height } };
|
|
265
|
+
}
|
|
266
|
+
function LivePreview(props) {
|
|
267
|
+
return /* @__PURE__ */ jsx(Preview, { ...props }, props.snapshot ?? "");
|
|
268
|
+
}
|
|
269
|
+
function Preview({ children, fallback, width, rootMargin = LIVE_PREVIEW_MARGIN, disabled = false, frame = false, snapshot, dwellMs = LIVE_PREVIEW_DWELL_MS, onStateChange, className }) {
|
|
270
|
+
const { budget, stills } = useContext(SharedContext);
|
|
271
|
+
const box = useRef(null);
|
|
272
|
+
const liveLayer = useRef(null);
|
|
273
|
+
const stillLayer = useRef(null);
|
|
274
|
+
const slot = useRef(null);
|
|
275
|
+
const granted = useRef(false);
|
|
276
|
+
const [kept] = useState(() => snapshot !== void 0 && !frame && !disabled ? stills.get(snapshot) : void 0);
|
|
277
|
+
const [state, setState] = useState(kept === "failed" ? "failed" : kept ? "ready" : "idle");
|
|
278
|
+
const current = useRef(state);
|
|
279
|
+
current.current = state;
|
|
280
|
+
const [still, setStill] = useState(kept && kept !== "failed" ? { drawing: kept, fresh: false } : null);
|
|
281
|
+
const [near, setNear] = useState(false);
|
|
282
|
+
const done = state === "failed" || state === "ready" && !frame;
|
|
283
|
+
const settle = useCallback((next) => {
|
|
284
|
+
slot.current?.release();
|
|
285
|
+
slot.current = null;
|
|
286
|
+
granted.current = false;
|
|
287
|
+
setState(next);
|
|
288
|
+
}, []);
|
|
289
|
+
useEffect(() => {
|
|
290
|
+
const el = box.current;
|
|
291
|
+
if (!el || disabled || done || typeof IntersectionObserver === "undefined") return void 0;
|
|
292
|
+
const seen = new IntersectionObserver((entries) => setNear(entries.some((e) => e.isIntersecting)), { root: scrollRoot(el), rootMargin });
|
|
293
|
+
seen.observe(el);
|
|
294
|
+
return () => seen.disconnect();
|
|
295
|
+
}, [disabled, done, rootMargin]);
|
|
296
|
+
const reclaim = useCallback(() => {
|
|
297
|
+
slot.current = null;
|
|
298
|
+
granted.current = false;
|
|
299
|
+
setState("idle");
|
|
300
|
+
}, []);
|
|
301
|
+
useEffect(() => {
|
|
302
|
+
if (disabled || done) return void 0;
|
|
303
|
+
const held = slot.current;
|
|
304
|
+
if (!near) {
|
|
305
|
+
if (held && granted.current) held.park();
|
|
306
|
+
else if (held) {
|
|
307
|
+
held.release();
|
|
308
|
+
slot.current = null;
|
|
309
|
+
}
|
|
310
|
+
setState((s) => s === "waiting" ? "idle" : s);
|
|
311
|
+
return void 0;
|
|
312
|
+
}
|
|
313
|
+
if (held) {
|
|
314
|
+
if (granted.current) held.resume();
|
|
315
|
+
return void 0;
|
|
316
|
+
}
|
|
317
|
+
setState("waiting");
|
|
318
|
+
const dwell = setTimeout(() => {
|
|
319
|
+
granted.current = false;
|
|
320
|
+
slot.current = budget.request(
|
|
321
|
+
() => {
|
|
322
|
+
granted.current = true;
|
|
323
|
+
setState("live");
|
|
324
|
+
},
|
|
325
|
+
reclaim,
|
|
326
|
+
frame
|
|
327
|
+
);
|
|
328
|
+
}, dwellMs);
|
|
329
|
+
return () => clearTimeout(dwell);
|
|
330
|
+
}, [near, disabled, done, frame, budget, dwellMs, reclaim]);
|
|
331
|
+
useEffect(() => {
|
|
332
|
+
if (!disabled) return;
|
|
333
|
+
slot.current?.release();
|
|
334
|
+
slot.current = null;
|
|
335
|
+
granted.current = false;
|
|
336
|
+
setStill(null);
|
|
337
|
+
setState((s) => s === "failed" ? s : "idle");
|
|
338
|
+
}, [disabled]);
|
|
339
|
+
useEffect(
|
|
340
|
+
() => () => {
|
|
341
|
+
slot.current?.release();
|
|
342
|
+
slot.current = null;
|
|
343
|
+
},
|
|
344
|
+
[]
|
|
345
|
+
);
|
|
346
|
+
useEffect(() => {
|
|
347
|
+
if (state !== "live") return void 0;
|
|
348
|
+
const t = setTimeout(() => settle("failed"), LIVE_PREVIEW_RENDER_MS);
|
|
349
|
+
return () => clearTimeout(t);
|
|
350
|
+
}, [state, settle]);
|
|
351
|
+
const capture = useRef(null);
|
|
352
|
+
useEffect(() => () => capture.current?.(), []);
|
|
353
|
+
const signals = useMemo(
|
|
354
|
+
() => ({
|
|
355
|
+
ready: () => {
|
|
356
|
+
if (current.current !== "live" || capture.current) return;
|
|
357
|
+
slot.current?.drawn();
|
|
358
|
+
if (frame) {
|
|
359
|
+
setState("ready");
|
|
360
|
+
return;
|
|
361
|
+
}
|
|
362
|
+
capture.current = afterDrawn(() => {
|
|
363
|
+
capture.current = null;
|
|
364
|
+
const live = liveLayer.current;
|
|
365
|
+
const el = box.current;
|
|
366
|
+
if (current.current !== "live" || !live || !el) return;
|
|
367
|
+
const drawing = stillOf(live, width, el);
|
|
368
|
+
if (snapshot !== void 0) stills.put(snapshot, drawing);
|
|
369
|
+
setStill({ drawing, fresh: true });
|
|
370
|
+
settle("ready");
|
|
371
|
+
});
|
|
372
|
+
},
|
|
373
|
+
fail: () => {
|
|
374
|
+
if (current.current === "failed") return;
|
|
375
|
+
capture.current?.();
|
|
376
|
+
capture.current = null;
|
|
377
|
+
if (snapshot !== void 0 && !frame) stills.put(snapshot, "failed");
|
|
378
|
+
settle("failed");
|
|
379
|
+
}
|
|
380
|
+
}),
|
|
381
|
+
[frame, width, snapshot, stills, settle]
|
|
382
|
+
);
|
|
383
|
+
useLayoutEffect(() => {
|
|
384
|
+
const target = stillLayer.current;
|
|
385
|
+
const el = box.current;
|
|
386
|
+
if (!still || !target || !el) return void 0;
|
|
387
|
+
const { drawing } = still;
|
|
388
|
+
const placed = drawing.nodes.some((n) => n.isConnected) ? copyOf(drawing.nodes) : drawing.nodes;
|
|
389
|
+
if (drawing.width === void 0) {
|
|
390
|
+
target.replaceChildren(...placed);
|
|
391
|
+
return stills.watch(el, (size) => {
|
|
392
|
+
if (Math.abs(size.w - drawing.size.w) < 1 && Math.abs(size.h - drawing.size.h) < 1) return;
|
|
393
|
+
if (snapshot !== void 0) stills.forget(snapshot);
|
|
394
|
+
setStill(null);
|
|
395
|
+
setState("idle");
|
|
396
|
+
});
|
|
397
|
+
}
|
|
398
|
+
const outer = target.ownerDocument.createElement("span");
|
|
399
|
+
outer.className = "crewlet-preview-scale";
|
|
400
|
+
const layer = target.ownerDocument.createElement("span");
|
|
401
|
+
layer.className = "crewlet-preview-scale__layer";
|
|
402
|
+
layer.append(...placed);
|
|
403
|
+
outer.append(layer);
|
|
404
|
+
target.replaceChildren(outer);
|
|
405
|
+
const scale = (size) => {
|
|
406
|
+
if (size.w <= 0) return;
|
|
407
|
+
const fitted = fitTo(size, drawing.width, void 0, "width");
|
|
408
|
+
layer.style.width = `${fitted.width}px`;
|
|
409
|
+
layer.style.height = `${fitted.height}px`;
|
|
410
|
+
layer.style.transform = fitted.transform;
|
|
411
|
+
};
|
|
412
|
+
const rect = el.getBoundingClientRect();
|
|
413
|
+
scale({ w: rect.width, h: rect.height });
|
|
414
|
+
return stills.watch(el, scale);
|
|
415
|
+
}, [still, snapshot, stills]);
|
|
416
|
+
useEffect(() => onStateChange?.(state), [state, onStateChange]);
|
|
417
|
+
const mounted = state === "live" || frame && state === "ready";
|
|
418
|
+
return /* @__PURE__ */ jsxs(
|
|
419
|
+
"span",
|
|
420
|
+
{
|
|
421
|
+
ref: box,
|
|
422
|
+
className: cx("crewlet-live-preview", className),
|
|
423
|
+
"data-state": state,
|
|
424
|
+
"data-still": still ? "" : void 0,
|
|
425
|
+
"data-fresh": still?.fresh ? "" : void 0,
|
|
426
|
+
"data-frame": frame ? "" : void 0,
|
|
427
|
+
"aria-hidden": "true",
|
|
428
|
+
children: [
|
|
429
|
+
/* @__PURE__ */ jsx("span", { className: "crewlet-live-preview__fallback", children: fallback }),
|
|
430
|
+
still ? /* @__PURE__ */ jsx("span", { ref: stillLayer, className: "crewlet-live-preview__still", inert: true }) : null,
|
|
431
|
+
mounted ? /* @__PURE__ */ jsx("span", { ref: liveLayer, className: "crewlet-live-preview__live", inert: true, children: /* @__PURE__ */ jsx(SignalContext.Provider, { value: signals, children: width === void 0 ? children : /* @__PURE__ */ jsx(PreviewScale, { width, children }) }) }) : null
|
|
432
|
+
]
|
|
433
|
+
}
|
|
434
|
+
);
|
|
435
|
+
}
|
|
436
|
+
function PreviewScale({ children, width, height, fit = "width" }) {
|
|
437
|
+
const box = useRef(null);
|
|
438
|
+
const [size, setSize] = useState(null);
|
|
439
|
+
useLayoutEffect(() => {
|
|
440
|
+
const el = box.current;
|
|
441
|
+
if (!el) return void 0;
|
|
442
|
+
const measure = () => {
|
|
443
|
+
const rect = el.getBoundingClientRect();
|
|
444
|
+
if (rect.width > 0) setSize((was) => was && was.w === rect.width && was.h === rect.height ? was : { w: rect.width, h: rect.height });
|
|
445
|
+
};
|
|
446
|
+
measure();
|
|
447
|
+
if (typeof ResizeObserver === "undefined") return void 0;
|
|
448
|
+
const watch = new ResizeObserver(measure);
|
|
449
|
+
watch.observe(el);
|
|
450
|
+
return () => watch.disconnect();
|
|
451
|
+
}, []);
|
|
452
|
+
const layer = size ? fitTo(size, width, height, fit) : { width, visibility: "hidden" };
|
|
453
|
+
return /* @__PURE__ */ jsx("span", { ref: box, className: "crewlet-preview-scale", children: /* @__PURE__ */ jsx("span", { className: "crewlet-preview-scale__layer", style: layer, children }) });
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
export { LIVE_PREVIEW_DWELL_MS, LIVE_PREVIEW_MARGIN, LIVE_PREVIEW_MAX, LIVE_PREVIEW_MAX_FRAMES, LIVE_PREVIEW_RENDER_MS, LIVE_PREVIEW_STILLS_KEPT, LivePreview, LivePreviewBudgetProvider, PREVIEW_FILL_MAX_CUT, PreviewScale, createLivePreviewBudget, createLivePreviewStills, immediately, perFrame, useLivePreview };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { HeadingLevelProvider } from './chunk-PQADV6P6.js';
|
|
2
2
|
import { IconButton } from './chunk-4FQT6ZAY.js';
|
|
3
3
|
import { cx } from './chunk-ODEQTPFM.js';
|
|
4
|
-
import './ArtifactPanel-
|
|
4
|
+
import './ArtifactPanel-KKUUIPEU.css';
|
|
5
5
|
import { useId, useRef, useLayoutEffect, useEffect } from 'react';
|
|
6
6
|
import { MinimizeGlyph, MaximizeGlyph, XGlyph } from '@crewlethq/icons/glyphs';
|
|
7
7
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
@@ -19,6 +19,7 @@ function ArtifactPanel({
|
|
|
19
19
|
expanded = false,
|
|
20
20
|
onExpandedChange,
|
|
21
21
|
actions,
|
|
22
|
+
footer,
|
|
22
23
|
focusOnOpen = true,
|
|
23
24
|
labels,
|
|
24
25
|
className,
|
|
@@ -82,7 +83,8 @@ function ArtifactPanel({
|
|
|
82
83
|
/* @__PURE__ */ jsx(IconButton, { label: words.close(title), icon: /* @__PURE__ */ jsx(XGlyph, { size: "sm" }), size: "sm", variant: "ghost", onClick: onClose })
|
|
83
84
|
] })
|
|
84
85
|
] }),
|
|
85
|
-
/* @__PURE__ */ jsx("div", { className: "crewlet-artifact-panel__body", children: /* @__PURE__ */ jsx(HeadingLevelProvider, { level: 3, children }) })
|
|
86
|
+
/* @__PURE__ */ jsx("div", { className: "crewlet-artifact-panel__body", children: /* @__PURE__ */ jsx(HeadingLevelProvider, { level: 3, children }) }),
|
|
87
|
+
footer ? /* @__PURE__ */ jsx("div", { className: "crewlet-artifact-panel__foot", children: footer }) : null
|
|
86
88
|
]
|
|
87
89
|
}
|
|
88
90
|
);
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { useLayoutEffect } from 'react';
|
|
2
|
+
|
|
3
|
+
// src/utils/focusModality.ts
|
|
4
|
+
var FOCUS_MODALITY_ATTRIBUTE = "data-crewlet-focus";
|
|
5
|
+
var MODIFIERS = /* @__PURE__ */ new Set(["Shift", "Control", "Alt", "Meta", "CapsLock", "Fn"]);
|
|
6
|
+
var TEXT_INPUT_TYPES = /* @__PURE__ */ new Set(["", "text", "search", "email", "url", "tel", "password", "number", "date", "datetime-local", "month", "time", "week"]);
|
|
7
|
+
function isTextEntry(target) {
|
|
8
|
+
if (!(target instanceof Element)) return false;
|
|
9
|
+
if (target instanceof HTMLTextAreaElement) return true;
|
|
10
|
+
if (target instanceof HTMLInputElement) return TEXT_INPUT_TYPES.has(target.type);
|
|
11
|
+
if (target instanceof HTMLElement && target.isContentEditable) return true;
|
|
12
|
+
return target.closest('[contenteditable]:not([contenteditable="false"])') !== null;
|
|
13
|
+
}
|
|
14
|
+
var trackers = /* @__PURE__ */ new WeakMap();
|
|
15
|
+
function trackFocusModality(doc = document) {
|
|
16
|
+
let tracker = trackers.get(doc);
|
|
17
|
+
if (!tracker) {
|
|
18
|
+
const root = doc.documentElement;
|
|
19
|
+
const set = (modality) => {
|
|
20
|
+
if (root.getAttribute(FOCUS_MODALITY_ATTRIBUTE) !== modality) root.setAttribute(FOCUS_MODALITY_ATTRIBUTE, modality);
|
|
21
|
+
};
|
|
22
|
+
const onKey = (event) => {
|
|
23
|
+
if (MODIFIERS.has(event.key) || event.metaKey || event.ctrlKey) return;
|
|
24
|
+
if (event.key === "Tab" || !isTextEntry(event.target)) set("keyboard");
|
|
25
|
+
};
|
|
26
|
+
const onPointer = () => set("pointer");
|
|
27
|
+
if (!root.hasAttribute(FOCUS_MODALITY_ATTRIBUTE)) set("pointer");
|
|
28
|
+
doc.addEventListener("keydown", onKey, true);
|
|
29
|
+
doc.addEventListener("pointerdown", onPointer, true);
|
|
30
|
+
const created = {
|
|
31
|
+
count: 0,
|
|
32
|
+
release: () => {
|
|
33
|
+
doc.removeEventListener("keydown", onKey, true);
|
|
34
|
+
doc.removeEventListener("pointerdown", onPointer, true);
|
|
35
|
+
root.removeAttribute(FOCUS_MODALITY_ATTRIBUTE);
|
|
36
|
+
trackers.delete(doc);
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
trackers.set(doc, created);
|
|
40
|
+
tracker = created;
|
|
41
|
+
}
|
|
42
|
+
const held = tracker;
|
|
43
|
+
held.count += 1;
|
|
44
|
+
let released = false;
|
|
45
|
+
return () => {
|
|
46
|
+
if (released) return;
|
|
47
|
+
released = true;
|
|
48
|
+
held.count -= 1;
|
|
49
|
+
if (held.count === 0) held.release();
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
function useFocusModality() {
|
|
53
|
+
useLayoutEffect(() => trackFocusModality(), []);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export { FOCUS_MODALITY_ATTRIBUTE, trackFocusModality, useFocusModality };
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export * from '../AccessDeniedCard/index.js';
|
|
2
2
|
export * from '../Accordion/index.js';
|
|
3
3
|
export * from '../AddPill/index.js';
|
|
4
|
+
export * from '../AgentHandoffPanel/index.js';
|
|
4
5
|
export * from '../Announcer/index.js';
|
|
5
6
|
export * from '../AppShell/index.js';
|
|
6
7
|
export * from '../ArrangeBoard/index.js';
|
|
@@ -8,12 +9,15 @@ export * from '../ArrangeFrame/index.js';
|
|
|
8
9
|
export * from '../ArrangeGrid/index.js';
|
|
9
10
|
export * from '../ArrangeGroup/index.js';
|
|
10
11
|
export * from '../ArrangeList/index.js';
|
|
12
|
+
export * from '../ArtifactAccess/index.js';
|
|
11
13
|
export * from '../ArtifactBar/index.js';
|
|
12
14
|
export * from '../ArtifactCard/index.js';
|
|
13
15
|
export * from '../ArtifactCover/index.js';
|
|
14
16
|
export * from '../ArtifactIcon/index.js';
|
|
15
17
|
export * from '../ArtifactKindGlyph/index.js';
|
|
16
18
|
export * from '../ArtifactKindIllustration/index.js';
|
|
19
|
+
export * from '../ArtifactMakeRow/index.js';
|
|
20
|
+
export * from '../ArtifactNameCell/index.js';
|
|
17
21
|
export * from '../ArtifactPanel/index.js';
|
|
18
22
|
export * from '../AuthLayout/index.js';
|
|
19
23
|
export * from '../Avatar/index.js';
|