@kubohiroya/turbowarp-extension-data-editor 0.5.0 → 0.7.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 (48) hide show
  1. package/README.ja.md +9 -4
  2. package/README.md +7 -4
  3. package/dist/build-info.json +3 -3
  4. package/dist/descendants.js +1 -0
  5. package/dist/dialog-window.d.ts +8 -0
  6. package/dist/dialog-window.js +155 -0
  7. package/dist/preview.d.ts +3 -0
  8. package/dist/preview.js +100 -0
  9. package/dist/react.css +70 -0
  10. package/dist/react.d.ts +3 -0
  11. package/dist/react.js +12 -4
  12. package/dist/registry.d.ts +3 -0
  13. package/dist/registry.js +38 -9
  14. package/dist/rjsf.d.ts +2 -1
  15. package/dist/rjsf.js +10 -0
  16. package/dist/session.d.ts +1 -0
  17. package/dist/session.js +6 -0
  18. package/dist/turbowarp/bridge.js +42 -1
  19. package/dist/turbowarp/fixed-fields.d.ts +1 -1
  20. package/dist/turbowarp/fixed-fields.js +7 -2
  21. package/dist/turbowarp/icon.d.ts +3 -1
  22. package/dist/turbowarp/icon.js +5 -1
  23. package/dist/turbowarp.d.ts +2 -0
  24. package/dist/types.d.ts +8 -0
  25. package/dist/view.js +1 -0
  26. package/dist/webpack4/index.js +1 -1
  27. package/dist/webpack4/metafile.json +57 -31
  28. package/dist/webpack4/react.js +173 -4
  29. package/dist/webpack4/react.js.map +3 -3
  30. package/dist/webpack4/rjsf.js +13 -1
  31. package/dist/webpack4/rjsf.js.map +2 -2
  32. package/dist/webpack4/{shared-QIOZ73LT.js → shared-FW4MRLXW.js} +148 -8
  33. package/dist/webpack4/shared-FW4MRLXW.js.map +7 -0
  34. package/dist/webpack4/turbowarp.js +55 -5
  35. package/dist/webpack4/turbowarp.js.map +2 -2
  36. package/docs/README.md +3 -3
  37. package/docs/block-editor-descendants.md +1 -1
  38. package/docs/block-editor-e2e.md +6 -122
  39. package/docs/block-editor.md +1 -1
  40. package/docs/block-preview.md +45 -0
  41. package/docs/ci-success-gate.md +9 -29
  42. package/docs/dialog-window.md +50 -0
  43. package/docs/fixed-input-contracts.md +3 -1
  44. package/docs/github-pages.md +21 -57
  45. package/docs/package-distribution.md +3 -3
  46. package/docs/shared-extension-security.ja.md +6 -6
  47. package/package.json +2 -6
  48. package/dist/webpack4/shared-QIOZ73LT.js.map +0 -7
package/dist/rjsf.js CHANGED
@@ -105,6 +105,16 @@ export function createBlockEditorService(options) {
105
105
  const api = Object.freeze({
106
106
  ...fixed,
107
107
  apiVersion: EDITOR_API_VERSION,
108
+ registerPreview: (definition) => {
109
+ const remove = registry.registerPreview(definition);
110
+ notify();
111
+ let active = true;
112
+ return () => { if (active) {
113
+ active = false;
114
+ remove();
115
+ notify();
116
+ } };
117
+ },
108
118
  register: (definition) => {
109
119
  const custom = definition;
110
120
  const editor = !custom.mount && Object.hasOwn(definition, 'schema')
package/dist/session.d.ts CHANGED
@@ -12,6 +12,7 @@ export declare class EditorSession implements EditorViewContext {
12
12
  setValidationIssues(issues: readonly ValidationIssue[]): void;
13
13
  getState(): SessionState;
14
14
  subscribe(listener: () => void): () => void;
15
+ getSnapshot(): BlockSnapshot;
15
16
  mount(container: HTMLElement): () => void;
16
17
  save(): Promise<SaveResult>;
17
18
  /** Closing is refused while saving; the host must keep the modal open. */
package/dist/session.js CHANGED
@@ -158,6 +158,12 @@ export class EditorSession {
158
158
  __classPrivateFieldGet(this, _EditorSession_listeners, "f").add(listener);
159
159
  return () => { __classPrivateFieldGet(this, _EditorSession_listeners, "f").delete(listener); };
160
160
  }
161
+ getSnapshot() {
162
+ __classPrivateFieldGet(this, _EditorSession_instances, "m", _EditorSession_assertOpen).call(this);
163
+ return isFixedInputEditor(__classPrivateFieldGet(this, _EditorSession_definition, "f"))
164
+ ? captureFixedSnapshot(__classPrivateFieldGet(this, _EditorSession_snapshot, "f"), this.reference, __classPrivateFieldGet(this, _EditorSession_definition, "f"))
165
+ : captureSnapshot(__classPrivateFieldGet(this, _EditorSession_snapshot, "f"), this.reference);
166
+ }
161
167
  mount(container) {
162
168
  return __classPrivateFieldGet(this, _EditorSession_view, "f").mount(container, __classPrivateFieldGet(this, _EditorSession_definition, "f").mount, this);
163
169
  }
@@ -6,10 +6,14 @@ import createBlockEditorErrorSession from './error-session.js';
6
6
  const fixedDeclaration = (registry, snapshot) => snapshot && typeof registry.resolveFixed === 'function' &&
7
7
  registry.resolveFixed(snapshot.opcode);
8
8
  const openBlockEditorSession = ({ registry, reference, host, descendants }) => {
9
+ var _a;
9
10
  const snapshot = host.readBlock ? host.readBlock(reference) : null;
10
11
  // A fixed registration owns only this block; legacy aggregate traversal stays fail-closed.
11
12
  if (fixedDeclaration(registry, snapshot))
12
13
  return supportsFixedInputEditing(host) ? registry.open(reference, host) : undefined;
14
+ // A preview owns this icon's scene/action, not a separate live renderer for every descendant.
15
+ if (snapshot && ((_a = registry.resolvePreview) === null || _a === void 0 ? void 0 : _a.call(registry, snapshot.opcode)))
16
+ return registry.open(reference, host);
13
17
  return descendants && supportsDescendantEditing(host) ?
14
18
  registry.openDescendants(reference, host) : registry.open(reference, host);
15
19
  };
@@ -22,6 +26,19 @@ const createBlockEditorBridge = ({ ScratchBlocks, workspace, vm, service, label,
22
26
  enableFixedInputs: fixedInputs,
23
27
  onError });
24
28
  const decorations = new Map();
29
+ let stopHover = null;
30
+ const clearHover = () => {
31
+ const stop = stopHover;
32
+ stopHover = null;
33
+ if (stop) {
34
+ try {
35
+ stop();
36
+ }
37
+ catch (error) {
38
+ onError(error);
39
+ }
40
+ }
41
+ };
25
42
  let disposed = false;
26
43
  let timer = null;
27
44
  let activeSession = null;
@@ -81,6 +98,7 @@ const createBlockEditorBridge = ({ ScratchBlocks, workspace, vm, service, label,
81
98
  };
82
99
  const open = block => {
83
100
  var _a, _b;
101
+ clearHover();
84
102
  if (activeSession && ['editing', 'saving'].includes(activeSession.getState().status))
85
103
  return;
86
104
  const reference = { targetId: vm.editingTarget.id, blockId: block.id };
@@ -141,10 +159,31 @@ const createBlockEditorBridge = ({ ScratchBlocks, workspace, vm, service, label,
141
159
  element: field.fieldGroup_,
142
160
  label,
143
161
  canOpen: () => available(block),
144
- onOpen: () => open(block)
162
+ onOpen: () => open(block),
163
+ onHover: () => {
164
+ var _a, _b;
165
+ if (!available(block) || activeSession && ['editing', 'saving'].includes(activeSession.getState().status))
166
+ return;
167
+ clearHover();
168
+ const preview = (_b = (_a = service.registry).resolvePreview) === null || _b === void 0 ? void 0 : _b.call(_a, block.type);
169
+ const snapshot = host.readBlock({ targetId: vm.editingTarget.id, blockId: block.id });
170
+ if ((preview === null || preview === void 0 ? void 0 : preview.hover) && snapshot) {
171
+ try {
172
+ const stop = preview.hover(field.fieldGroup_, snapshot);
173
+ if (typeof stop !== 'function')
174
+ throw new TypeError('hover() must return a cleanup function.');
175
+ stopHover = stop;
176
+ }
177
+ catch (error) {
178
+ onError(error);
179
+ }
180
+ }
181
+ },
182
+ onLeave: clearHover
145
183
  });
146
184
  decorations.set(block.id, { field,
147
185
  cleanup: () => {
186
+ clearHover();
148
187
  unbind();
149
188
  if (field.imageElement_)
150
189
  field.imageElement_.tooltip = tooltip;
@@ -158,6 +197,7 @@ const createBlockEditorBridge = ({ ScratchBlocks, workspace, vm, service, label,
158
197
  }
159
198
  };
160
199
  const schedule = () => {
200
+ clearHover();
161
201
  checkSession();
162
202
  clearTimeout(timer);
163
203
  timer = setTimeout(refresh, 0);
@@ -184,6 +224,7 @@ const createBlockEditorBridge = ({ ScratchBlocks, workspace, vm, service, label,
184
224
  refresh,
185
225
  dispose: () => {
186
226
  disposed = true;
227
+ clearHover();
187
228
  clearTimeout(timer);
188
229
  unregister();
189
230
  workspace.removeChangeListener(schedule);
@@ -61,7 +61,7 @@ export function inspectFixedArgument({ ScratchBlocks, block, vmBlock, target, ar
61
61
  };
62
62
  slot: {
63
63
  kind: string;
64
- value: string;
64
+ value: string | number;
65
65
  };
66
66
  metadata: {
67
67
  role: any;
@@ -217,7 +217,12 @@ export function inspectFixedArgument({ ScratchBlocks, block, vmBlock, target, ar
217
217
  if (!safeField(field, Class))
218
218
  return unavailable('unsupported', 'The field class, methods or validator is unsupported.', raw);
219
219
  const value = inherited(Class.prototype, 'getValue').call(field);
220
- if (!Object.is(value, raw))
220
+ // SB3 numeric primitives remain numbers in the VM while FieldNumber displays a string.
221
+ // Preserve the original VM primitive in the snapshot; only equivalent native numeric text
222
+ // is a synchronized representation. Other field families still require exact raw identity.
223
+ const numericPrimitive = kind === 'number' && typeof raw === 'number' && Number.isFinite(raw) &&
224
+ typeof value === 'string' && token.test(value.trim()) && Number(value) === raw;
225
+ if (!Object.is(value, raw) && !numericPrimitive)
221
226
  return null;
222
227
  if (typeof value !== 'string')
223
228
  return unavailable('unsupported', 'The native field value is not a string.', raw);
@@ -231,7 +236,7 @@ export function inspectFixedArgument({ ScratchBlocks, block, vmBlock, target, ar
231
236
  restoreHandles: inherited(Class.prototype, 'updateSliderHandles_'),
232
237
  restoreDom: inherited(Class.prototype, 'updateDom_'),
233
238
  ...(kind === 'color' ? { restoreState: colorState(owner, field) } : {}) };
234
- return { slot: { kind: 'literal', value }, metadata: { role, source: direct ? 'field' : 'shadow',
239
+ return { slot: { kind: 'literal', value: numericPrimitive ? raw : value }, metadata: { role, source: direct ? 'field' : 'shadow',
235
240
  identity: JSON.stringify(sourceIdentity), field: { blockId: owner.id, name, type: { text: 'FieldTextInput', number: 'FieldNumber', menu: 'FieldDropdown', color: 'FieldColourSlider' }[kind] } },
236
241
  ...(role === 'editable' ? { binding } : {}), signatureParts: [...sourceIdentity, observedFields] };
237
242
  }
@@ -1,7 +1,9 @@
1
1
  export default bindBlockEditorIcon;
2
- declare function bindBlockEditorIcon({ element, label, canOpen, onOpen }: {
2
+ declare function bindBlockEditorIcon({ element, label, canOpen, onOpen, onHover, onLeave }: {
3
3
  element: any;
4
4
  label: any;
5
5
  canOpen: any;
6
6
  onOpen: any;
7
+ onHover?: (() => void) | undefined;
8
+ onLeave?: (() => void) | undefined;
7
9
  }): () => void;
@@ -1,5 +1,5 @@
1
1
  // Decorate one known FieldImage; never search or intercept unrelated workspace DOM.
2
- const bindBlockEditorIcon = ({ element, label, canOpen, onOpen }) => {
2
+ const bindBlockEditorIcon = ({ element, label, canOpen, onOpen, onHover = () => { }, onLeave = () => { } }) => {
3
3
  const attributes = ['role', 'tabindex', 'aria-label', 'data-block-editor-icon'];
4
4
  const previous = attributes.map(name => element.getAttribute(name));
5
5
  const oldCursor = element.style.cursor;
@@ -48,7 +48,11 @@ const bindBlockEditorIcon = ({ element, label, canOpen, onOpen }) => {
48
48
  onOpen();
49
49
  }
50
50
  };
51
+ const enter = () => { if (canOpen())
52
+ onHover === null || onHover === void 0 ? void 0 : onHover(); };
53
+ const leave = () => onLeave === null || onLeave === void 0 ? void 0 : onLeave();
51
54
  const listeners = [
55
+ ['pointerenter', enter], ['pointerleave', leave], ['focus', enter], ['blur', leave],
52
56
  ['pointerdown', down], ['pointermove', move], ['pointerup', up], ['pointercancel', cancel],
53
57
  ['mousedown', stop], ['mouseup', stop], ['click', stop], ['dblclick', stop],
54
58
  ['touchstart', stop], ['touchend', stop], ['touchmove', stop], ['keydown', key]
@@ -59,6 +59,8 @@ export declare function bindBlockEditorIcon(options: {
59
59
  readonly label: string;
60
60
  readonly canOpen: () => boolean;
61
61
  readonly onOpen: () => void;
62
+ readonly onHover?: () => void;
63
+ readonly onLeave?: () => void;
62
64
  }): () => void;
63
65
  /** Supply editor arguments to include other literal inputs as parenthesized identifiers. */
64
66
  export declare function readBlockEditorAppearance(block: object | null, ScratchBlocks: object, editableArguments?: readonly string[]): TurboWarpNodeAppearance;
package/dist/types.d.ts CHANGED
@@ -54,6 +54,7 @@ export interface SessionState {
54
54
  readonly error: unknown;
55
55
  }
56
56
  export interface EditorViewContext {
57
+ getSnapshot?(): BlockSnapshot;
57
58
  getDraft(): JsonObject;
58
59
  /** Fixed views obtain only safe presentation data, never live host objects. */
59
60
  getFixedInputView?(): FixedInputViewDescription | undefined;
@@ -72,6 +73,13 @@ export interface EditorDescriptor {
72
73
  readonly opcodes: readonly string[];
73
74
  readonly editableArguments: readonly string[];
74
75
  }
76
+ /** Optional presentation companion. It shares the draft and lifetime of the existing form. */
77
+ export interface BlockPreviewDefinition {
78
+ readonly extensionId: string;
79
+ readonly opcodes: readonly string[];
80
+ mount(container: HTMLElement, context: EditorViewContext, snapshot: BlockSnapshot): () => void;
81
+ hover?(anchor: HTMLElement | SVGElement, snapshot: BlockSnapshot): () => void;
82
+ }
75
83
  export interface EditorDefinition extends EditorDescriptor {
76
84
  read(snapshot: BlockSnapshot): JsonObject;
77
85
  validate(draft: JsonObject, snapshot: BlockSnapshot): readonly ValidationIssue[] | Promise<readonly ValidationIssue[]>;
package/dist/view.js CHANGED
@@ -35,6 +35,7 @@ export class EditorView {
35
35
  subscriptions.clear();
36
36
  };
37
37
  const context = Object.freeze({
38
+ ...(owner.getSnapshot ? { getSnapshot: () => { assertMounted(); return owner.getSnapshot(); } } : {}),
38
39
  getDraft: () => owner.getDraft(),
39
40
  ...(owner.getFixedInputView ? { getFixedInputView: () => {
40
41
  assertMounted();
@@ -10,7 +10,7 @@ import {
10
10
  sameFixedSnapshot,
11
11
  supportsFixedInputEditing,
12
12
  supportsFixedInputs
13
- } from "./shared-QIOZ73LT.js";
13
+ } from "./shared-FW4MRLXW.js";
14
14
  import {
15
15
  BlockEditorConflictError,
16
16
  BlockEditorStructureError,
@@ -10,8 +10,13 @@
10
10
  "imports": [],
11
11
  "format": "esm"
12
12
  },
13
+ "dist/preview.js": {
14
+ "bytes": 4540,
15
+ "imports": [],
16
+ "format": "esm"
17
+ },
13
18
  "dist/view.js": {
14
- "bytes": 4215,
19
+ "bytes": 4330,
15
20
  "imports": [],
16
21
  "format": "esm"
17
22
  },
@@ -1868,7 +1873,7 @@
1868
1873
  "format": "esm"
1869
1874
  },
1870
1875
  "dist/session.js": {
1871
- "bytes": 28647,
1876
+ "bytes": 29156,
1872
1877
  "imports": [
1873
1878
  {
1874
1879
  "path": "dist/data.js",
@@ -1940,7 +1945,7 @@
1940
1945
  "format": "esm"
1941
1946
  },
1942
1947
  "dist/descendants.js": {
1943
- "bytes": 24370,
1948
+ "bytes": 24407,
1944
1949
  "imports": [
1945
1950
  {
1946
1951
  "path": "dist/data.js",
@@ -1976,13 +1981,18 @@
1976
1981
  "format": "esm"
1977
1982
  },
1978
1983
  "dist/registry.js": {
1979
- "bytes": 9498,
1984
+ "bytes": 11958,
1980
1985
  "imports": [
1981
1986
  {
1982
1987
  "path": "dist/data.js",
1983
1988
  "kind": "import-statement",
1984
1989
  "original": "./data.js"
1985
1990
  },
1991
+ {
1992
+ "path": "dist/preview.js",
1993
+ "kind": "import-statement",
1994
+ "original": "./preview.js"
1995
+ },
1986
1996
  {
1987
1997
  "path": "dist/session.js",
1988
1998
  "kind": "import-statement",
@@ -14055,7 +14065,7 @@
14055
14065
  "format": "esm"
14056
14066
  },
14057
14067
  "dist/rjsf.js": {
14058
- "bytes": 15030,
14068
+ "bytes": 15344,
14059
14069
  "imports": [
14060
14070
  {
14061
14071
  "path": "react",
@@ -14170,14 +14180,24 @@
14170
14180
  "imports": [],
14171
14181
  "format": "esm"
14172
14182
  },
14183
+ "dist/dialog-window.js": {
14184
+ "bytes": 7349,
14185
+ "imports": [],
14186
+ "format": "esm"
14187
+ },
14173
14188
  "dist/react.js": {
14174
- "bytes": 14377,
14189
+ "bytes": 14863,
14175
14190
  "imports": [
14176
14191
  {
14177
14192
  "path": "dist/field-errors.js",
14178
14193
  "kind": "import-statement",
14179
14194
  "original": "./field-errors.js"
14180
14195
  },
14196
+ {
14197
+ "path": "dist/dialog-window.js",
14198
+ "kind": "import-statement",
14199
+ "original": "./dialog-window.js"
14200
+ },
14181
14201
  {
14182
14202
  "path": "dist/field-errors.js",
14183
14203
  "kind": "import-statement",
@@ -14213,7 +14233,7 @@
14213
14233
  "format": "esm"
14214
14234
  },
14215
14235
  "dist/turbowarp/fixed-fields.js": {
14216
- "bytes": 15007,
14236
+ "bytes": 15532,
14217
14237
  "imports": [],
14218
14238
  "format": "esm"
14219
14239
  },
@@ -14270,7 +14290,7 @@
14270
14290
  "format": "esm"
14271
14291
  },
14272
14292
  "dist/turbowarp/icon.js": {
14273
- "bytes": 2885,
14293
+ "bytes": 3218,
14274
14294
  "imports": [],
14275
14295
  "format": "esm"
14276
14296
  },
@@ -14285,7 +14305,7 @@
14285
14305
  "format": "esm"
14286
14306
  },
14287
14307
  "dist/turbowarp/bridge.js": {
14288
- "bytes": 9167,
14308
+ "bytes": 10982,
14289
14309
  "imports": [
14290
14310
  {
14291
14311
  "path": "dist/turbowarp/host.js",
@@ -14361,7 +14381,7 @@
14361
14381
  "kind": "import-statement"
14362
14382
  },
14363
14383
  {
14364
- "path": "dist/webpack4/shared-QIOZ73LT.js",
14384
+ "path": "dist/webpack4/shared-FW4MRLXW.js",
14365
14385
  "kind": "import-statement"
14366
14386
  },
14367
14387
  {
@@ -14405,12 +14425,12 @@
14405
14425
  "imports": [],
14406
14426
  "exports": [],
14407
14427
  "inputs": {},
14408
- "bytes": 1928761
14428
+ "bytes": 1929265
14409
14429
  },
14410
14430
  "dist/webpack4/rjsf.js": {
14411
14431
  "imports": [
14412
14432
  {
14413
- "path": "dist/webpack4/shared-QIOZ73LT.js",
14433
+ "path": "dist/webpack4/shared-FW4MRLXW.js",
14414
14434
  "kind": "import-statement"
14415
14435
  },
14416
14436
  {
@@ -15483,7 +15503,7 @@
15483
15503
  "bytesInOutput": 275
15484
15504
  },
15485
15505
  "dist/rjsf.js": {
15486
- "bytesInOutput": 11742
15506
+ "bytesInOutput": 12016
15487
15507
  },
15488
15508
  "dist/config/feature-flags.js": {
15489
15509
  "bytesInOutput": 274
@@ -16809,13 +16829,13 @@
16809
16829
  "bytesInOutput": 11025
16810
16830
  }
16811
16831
  },
16812
- "bytes": 896935
16832
+ "bytes": 897209
16813
16833
  },
16814
16834
  "dist/webpack4/react.js.map": {
16815
16835
  "imports": [],
16816
16836
  "exports": [],
16817
16837
  "inputs": {},
16818
- "bytes": 30867
16838
+ "bytes": 43883
16819
16839
  },
16820
16840
  "dist/webpack4/react.js": {
16821
16841
  "imports": [
@@ -16842,17 +16862,20 @@
16842
16862
  "dist/field-errors.js": {
16843
16863
  "bytesInOutput": 3769
16844
16864
  },
16865
+ "dist/dialog-window.js": {
16866
+ "bytesInOutput": 6802
16867
+ },
16845
16868
  "dist/react.js": {
16846
- "bytesInOutput": 13029
16869
+ "bytesInOutput": 13396
16847
16870
  }
16848
16871
  },
16849
- "bytes": 17088
16872
+ "bytes": 24283
16850
16873
  },
16851
16874
  "dist/webpack4/turbowarp.js.map": {
16852
16875
  "imports": [],
16853
16876
  "exports": [],
16854
16877
  "inputs": {},
16855
- "bytes": 118563
16878
+ "bytes": 122586
16856
16879
  },
16857
16880
  "dist/webpack4/turbowarp.js": {
16858
16881
  "imports": [
@@ -16861,7 +16884,7 @@
16861
16884
  "kind": "import-statement"
16862
16885
  },
16863
16886
  {
16864
- "path": "dist/webpack4/shared-QIOZ73LT.js",
16887
+ "path": "dist/webpack4/shared-FW4MRLXW.js",
16865
16888
  "kind": "import-statement"
16866
16889
  },
16867
16890
  {
@@ -16891,7 +16914,7 @@
16891
16914
  "bytesInOutput": 2252
16892
16915
  },
16893
16916
  "dist/turbowarp/fixed-fields.js": {
16894
- "bytesInOutput": 13374
16917
+ "bytesInOutput": 13606
16895
16918
  },
16896
16919
  "dist/turbowarp/fixed-transaction.js": {
16897
16920
  "bytesInOutput": 19836
@@ -16900,7 +16923,7 @@
16900
16923
  "bytesInOutput": 13371
16901
16924
  },
16902
16925
  "dist/turbowarp/icon.js": {
16903
- "bytesInOutput": 2576
16926
+ "bytesInOutput": 2917
16904
16927
  },
16905
16928
  "dist/turbowarp/appearance.js": {
16906
16929
  "bytesInOutput": 1884
@@ -16909,13 +16932,13 @@
16909
16932
  "bytesInOutput": 835
16910
16933
  },
16911
16934
  "dist/turbowarp/bridge.js": {
16912
- "bytesInOutput": 7193
16935
+ "bytesInOutput": 8571
16913
16936
  },
16914
16937
  "dist/turbowarp.js": {
16915
16938
  "bytesInOutput": 1134
16916
16939
  }
16917
16940
  },
16918
- "bytes": 63580
16941
+ "bytes": 65531
16919
16942
  },
16920
16943
  "dist/webpack4/shared-FYUILHED.js.map": {
16921
16944
  "imports": [],
@@ -16933,13 +16956,13 @@
16933
16956
  },
16934
16957
  "bytes": 44
16935
16958
  },
16936
- "dist/webpack4/shared-QIOZ73LT.js.map": {
16959
+ "dist/webpack4/shared-FW4MRLXW.js.map": {
16937
16960
  "imports": [],
16938
16961
  "exports": [],
16939
16962
  "inputs": {},
16940
- "bytes": 204661
16963
+ "bytes": 216305
16941
16964
  },
16942
- "dist/webpack4/shared-QIOZ73LT.js": {
16965
+ "dist/webpack4/shared-FW4MRLXW.js": {
16943
16966
  "imports": [
16944
16967
  {
16945
16968
  "path": "dist/webpack4/shared-BKTRZUZH.js",
@@ -16981,25 +17004,28 @@
16981
17004
  "bytesInOutput": 795
16982
17005
  },
16983
17006
  "dist/view.js": {
16984
- "bytesInOutput": 3765
17007
+ "bytesInOutput": 3894
16985
17008
  },
16986
17009
  "dist/prepared-save.js": {
16987
17010
  "bytesInOutput": 1886
16988
17011
  },
16989
17012
  "dist/session.js": {
16990
- "bytesInOutput": 26276
17013
+ "bytesInOutput": 26754
16991
17014
  },
16992
17015
  "dist/subtree.js": {
16993
17016
  "bytesInOutput": 4426
16994
17017
  },
16995
17018
  "dist/descendants.js": {
16996
- "bytesInOutput": 22584
17019
+ "bytesInOutput": 22617
17020
+ },
17021
+ "dist/preview.js": {
17022
+ "bytesInOutput": 3801
16997
17023
  },
16998
17024
  "dist/registry.js": {
16999
- "bytesInOutput": 8369
17025
+ "bytesInOutput": 10668
17000
17026
  }
17001
17027
  },
17002
- "bytes": 116031
17028
+ "bytes": 122791
17003
17029
  },
17004
17030
  "dist/webpack4/shared-BKTRZUZH.js.map": {
17005
17031
  "imports": [],