@agent-native/core-corpus 0.207.1-nightly-20261012095125 → 0.207.1

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 (75) hide show
  1. package/corpus/README.md +1 -1
  2. package/corpus/templates/analytics/CHANGELOG.md +5 -0
  3. package/corpus/templates/clips/CHANGELOG.md +6 -0
  4. package/corpus/templates/clips/app/i18n/en-US.ts +1 -1
  5. package/corpus/templates/clips/changelog/2026-10-12-fix-rewind-popover-privacy.md +6 -0
  6. package/corpus/templates/clips/desktop/src/lookback/LookbackRow.tsx +3 -2
  7. package/corpus/templates/design/.agents/skills/design-editor-performance/SKILL.md +4 -1
  8. package/corpus/templates/design/.agents/skills/design-editor-performance/references/measuring.md +13 -3
  9. package/corpus/templates/design/.generated/bridge/editor-chrome.generated.ts +264 -19
  10. package/corpus/templates/design/.generated/bridge/hit-test.generated.ts +31 -1
  11. package/corpus/templates/design/CHANGELOG.md +34 -0
  12. package/corpus/templates/design/actions/update-file.ts +85 -13
  13. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +91 -24
  14. package/corpus/templates/design/app/components/design/EditPanel.tsx +17 -2
  15. package/corpus/templates/design/app/components/design/LayersPanel.tsx +31 -3
  16. package/corpus/templates/design/app/components/design/bridge/hit-test.bridge.ts +5 -2
  17. package/corpus/templates/design/app/components/design/edit-panel/document-colors.ts +14 -0
  18. package/corpus/templates/design/app/components/design/edit-panel/fill-properties.tsx +26 -2
  19. package/corpus/templates/design/app/components/design/inspector/DesignColorPicker.tsx +5 -1
  20. package/corpus/templates/design/app/components/design/multi-screen/linked-screen-preview.ts +2 -0
  21. package/corpus/templates/design/app/components/design/multi-screen/read-portable-style-snapshot.ts +106 -0
  22. package/corpus/templates/design/app/components/design/types.ts +1 -0
  23. package/corpus/templates/design/app/pages/design-editor/code-layer-state.ts +12 -2
  24. package/corpus/templates/design/app/pages/design-editor/command-types.ts +6 -1
  25. package/corpus/templates/design/app/pages/design-editor/commands/apply-local-content-update.ts +6 -8
  26. package/corpus/templates/design/app/pages/design-editor/commands/copy-selection.ts +39 -3
  27. package/corpus/templates/design/app/pages/design-editor/commands/get-selected-layer-snapshots.ts +4 -0
  28. package/corpus/templates/design/app/pages/design-editor/commands/persist-frame-geometry-save.ts +3 -3
  29. package/corpus/templates/design/app/pages/design-editor/commands/persist-tweak-save.ts +5 -1
  30. package/corpus/templates/design/app/pages/design-editor/commands/redo.ts +6 -1
  31. package/corpus/templates/design/app/pages/design-editor/commands/save-file-content.ts +56 -17
  32. package/corpus/templates/design/app/pages/design-editor/commands/screen-element-select.ts +2 -2
  33. package/corpus/templates/design/app/pages/design-editor/commands/undo.ts +6 -1
  34. package/corpus/templates/design/app/pages/design-editor/design-editor-view.tsx +2 -0
  35. package/corpus/templates/design/app/pages/design-editor/domains/use-editor-active-screen-and-geometry.ts +30 -25
  36. package/corpus/templates/design/app/pages/design-editor/domains/use-editor-clipboard.tsx +11 -0
  37. package/corpus/templates/design/app/pages/design-editor/domains/use-editor-content-and-components.ts +1 -0
  38. package/corpus/templates/design/app/pages/design-editor/domains/use-editor-files-and-saving.ts +43 -2
  39. package/corpus/templates/design/app/pages/design-editor/domains/use-editor-history.ts +2 -0
  40. package/corpus/templates/design/app/pages/design-editor/domains/use-editor-live-edits-and-presence.ts +13 -28
  41. package/corpus/templates/design/app/pages/design-editor/domains/use-editor-screen-inspector.ts +24 -0
  42. package/corpus/templates/design/app/pages/design-editor/effects/publish-agent-selection-context.ts +127 -11
  43. package/corpus/templates/design/app/pages/design-editor/save-failure.ts +25 -1
  44. package/corpus/templates/design/app/pages/design-editor/tweak-save.ts +8 -5
  45. package/corpus/templates/design/app/pages/design-editor/view/left-sidebar.tsx +14 -11
  46. package/corpus/templates/design/changelog/2026-10-09-dragging-a-heading-by-a-styled-word-now-moves-the-whole-text.md +6 -0
  47. package/corpus/templates/design/changelog/2026-10-09-nudging-a-screen-with-the-arrow-keys-no-longer-briefly-snaps.md +6 -0
  48. package/corpus/templates/design/changelog/2026-10-09-selecting-an-element-on-a-large-screen-no-longer-freezes-the.md +6 -0
  49. package/corpus/templates/design/changelog/2026-10-09-selecting-an-element-that-is-hidden-at-a-breakpoint-no-longe.md +6 -0
  50. package/corpus/templates/design/changelog/2026-10-09-the-editor-no-longer-says-changes-will-save-when-reconnected.md +6 -0
  51. package/corpus/templates/design/changelog/2026-10-09-the-layers-panel-lists-auto-layout-children-in-the-same-orde.md +6 -0
  52. package/corpus/templates/design/changelog/2026-10-09-undo-on-large-screens-responds-faster-and-saving-an-edit-upl.md +6 -0
  53. package/corpus/templates/design/changelog/2026-10-10-the-fill-picker-s-color-swatches-now-include-the-tailwind-co.md +6 -0
  54. package/corpus/templates/design/scripts/runtime-budget.json +18 -10
  55. package/corpus/templates/design/scripts/runtime-budget.ts +89 -12
  56. package/corpus/templates/design/shared/code-layer.ts +17 -103
  57. package/corpus/templates/design/shared/memoize-by-content.ts +13 -0
  58. package/corpus/templates/design/shared/source-workspace.ts +43 -21
  59. package/corpus/templates/design/shared/text-layer-rule.ts +125 -0
  60. package/corpus/templates/slides/CHANGELOG.md +6 -0
  61. package/package.json +1 -1
  62. package/corpus/templates/analytics/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
  63. package/corpus/templates/assets/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
  64. package/corpus/templates/brain/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
  65. package/corpus/templates/calendar/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
  66. package/corpus/templates/chat/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
  67. package/corpus/templates/clips/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
  68. package/corpus/templates/content/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
  69. package/corpus/templates/crm/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
  70. package/corpus/templates/design/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
  71. package/corpus/templates/dispatch/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
  72. package/corpus/templates/forms/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
  73. package/corpus/templates/mail/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
  74. package/corpus/templates/plan/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
  75. package/corpus/templates/slides/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
package/corpus/README.md CHANGED
@@ -32,4 +32,4 @@ rg -n "defineAction|useActionQuery" node_modules/@agent-native/core-corpus/corpu
32
32
 
33
33
  ## Generated Counts
34
34
 
35
- - template files: 12088
35
+ - template files: 12051
@@ -9,6 +9,11 @@ time from the command menu (Cmd+K → "What's new") or from Settings.
9
9
 
10
10
  - Analytics finds data definitions faster and identifies user-organization relationships more clearly.
11
11
 
12
+ ### Fixed
13
+
14
+ - Create private Design storyboards for session replay screenshot exports.
15
+ - Replay screenshots wait for the fonts used in the captured frame
16
+
12
17
  ## 2026-10-10
13
18
 
14
19
  ### Improved
@@ -3,6 +3,12 @@
3
3
  All notable user-facing changes to Clips are documented here. Open it any time
4
4
  from the command menu (Cmd+K → "What's new") or from Settings.
5
5
 
6
+ ## 2026-10-12
7
+
8
+ ### Fixed
9
+
10
+ - The Rewind popover fits in the tray and explains that screen history stays on-device until included in a recording or approved for sharing.
11
+
6
12
  ## 2026-10-11
7
13
 
8
14
  ### Improved
@@ -17,7 +17,7 @@ const messages = {
17
17
  turnOnRewind: "Turn on Rewind",
18
18
  rewindOffTitle: "Turn on Rewind",
19
19
  rewindOffBody:
20
- "Rewind keeps a local history of your screen so you can include the last few minutes before a recording. Footage uploads only when you include it or approve it.",
20
+ "Off by default. Screen history stays on this device until you add it to a recording or approve a request to share it.",
21
21
  requestFailed:
22
22
  "Couldn't include earlier screen time. The recording continues without it.",
23
23
  localOnlyUnavailable:
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-10-12
4
+ ---
5
+
6
+ The Rewind popover fits in the tray and explains that screen history stays on-device until included in a recording or approved for sharing.
@@ -187,15 +187,16 @@ export function LookbackRow({
187
187
  <PopoverContent
188
188
  align="start"
189
189
  side="bottom"
190
+ collisionPadding={8}
190
191
  sideOffset={6}
191
192
  data-popover-resize-overlay="true"
192
- className="w-[248px] p-3"
193
+ className="max-h-[var(--radix-popover-content-available-height)] w-[248px] overflow-y-auto p-3"
193
194
  >
194
195
  <div className="grid gap-2">
195
196
  <span className="text-xs font-medium">
196
197
  {t("lookbackContext.rewindOffTitle")}
197
198
  </span>
198
- <p className="text-xs text-[var(--fg-subtle)]">
199
+ <p className="text-xs text-[var(--fg-muted)]">
199
200
  {t("lookbackContext.rewindOffBody")}
200
201
  </p>
201
202
  <Button
@@ -74,7 +74,10 @@ warm count are constants at the top of `MultiScreenCanvas.tsx`.
74
74
  and compares with `scripts/runtime-budget.json`. It exits 0 within budget,
75
75
  1 over budget, and 2 when a step did not take effect. It runs as the
76
76
  `Runtime budget` check of the Design E2E workflow, on the same pull requests
77
- that workflow already runs for. The gates (heap, blanked screens, live
77
+ that workflow already runs for. It measures in full Chromium, where static
78
+ previews get a renderer of their own as they do in Chrome. Heap gates named
79
+ `editorHeap…` read the editor's renderer; `totalHeap…` sums every
80
+ renderer, previews included. The gates (heap, blanked screens, live
78
81
  editors) each carry their reason in the JSON; editor churn and frame times
79
82
  are reported only, because shared runners are too noisy for a fixed limit.
80
83
  When a change improves a gated number, lower its `max` in the same PR.
@@ -14,12 +14,22 @@ DATABASE_URL=postgres://postgres@127.0.0.1:5432/design_perf AUTH_DISABLED=1 \
14
14
  pnpm perf:runtime-budget --base-url http://127.0.0.1:9444
15
15
  ```
16
16
 
17
- `--design <id>` reuses an existing board instead of seeding one, and `--headed`
18
- shows the browser. `e2e/fixtures/seed-perf-stress-design.ts` creates the board
19
- by itself when you want to drive it by hand.
17
+ `--design <id>` reuses an existing board instead of seeding one, `--headed`
18
+ shows the browser, and `--channel` picks the Playwright Chromium channel
19
+ (`chromium` by default, `chrome` for installed Chrome). Install full Chromium
20
+ with `pnpm exec playwright install chromium`; the headless shell alone is not
21
+ enough. `e2e/fixtures/seed-perf-stress-design.ts` creates the board by itself
22
+ when you want to drive it by hand.
20
23
 
21
24
  ## Traps that faked results
22
25
 
26
+ - **Playwright's default headless browser has no site isolation.**
27
+ `chromium.launch({ headless: true })` runs Chrome Headless Shell, which keeps
28
+ every frame in one renderer. Chrome gives the sandboxed previews a renderer
29
+ of their own, so in the shell their paint lands on the editor's main thread
30
+ and their heap counts as the editor's. The budget launches the `chromium`
31
+ channel and reports could-not-measure when previews share the editor's
32
+ renderer.
23
33
  - **A gesture that never happened measures nothing.** Assert that the screen
24
34
  moved, the text changed, or the card count went up before reading a timing.
25
35
  A drag probe that sets `style.left` from script never reproduces drag jank;
@@ -903,6 +903,105 @@ export const editorChromeBridgeScript: string = `"use strict";
903
903
  return index;
904
904
  }
905
905
 
906
+ // shared/text-layer-rule.ts
907
+ var TEXT_LAYER_TAGS = /* @__PURE__ */ new Set([
908
+ "a",
909
+ "button",
910
+ "em",
911
+ "h1",
912
+ "h2",
913
+ "h3",
914
+ "h4",
915
+ "h5",
916
+ "h6",
917
+ "label",
918
+ "li",
919
+ "p",
920
+ "span",
921
+ "strong"
922
+ ]);
923
+ var INLINE_TEXT_TAGS = /* @__PURE__ */ new Set([
924
+ "a",
925
+ "abbr",
926
+ "b",
927
+ "bdi",
928
+ "bdo",
929
+ "br",
930
+ "cite",
931
+ "code",
932
+ "data",
933
+ "dfn",
934
+ "em",
935
+ "i",
936
+ "kbd",
937
+ "mark",
938
+ "q",
939
+ "s",
940
+ "samp",
941
+ "small",
942
+ "span",
943
+ "strong",
944
+ "sub",
945
+ "sup",
946
+ "time",
947
+ "u",
948
+ "var",
949
+ "wbr"
950
+ ]);
951
+ var EMPTY_STYLE_LENGTH = /^(0|0px|0rem|auto|initial|inherit|unset)$/i;
952
+ var EMPTY_STYLE_PAINT = /^(none|transparent|initial|inherit|unset|0|0px)$/i;
953
+ function bareClassToken(token) {
954
+ return token.slice(token.lastIndexOf(":") + 1).replace(/^-/, "");
955
+ }
956
+ function styleValueIsPresent(value, empties) {
957
+ if (typeof value !== "string") return false;
958
+ const trimmed = value.trim();
959
+ return trimmed.length > 0 && !empties.test(trimmed);
960
+ }
961
+ function classPaints(token) {
962
+ const bare = bareClassToken(token);
963
+ if (/^bg-/.test(bare)) {
964
+ return !/^bg-(transparent|none|inherit|current|clip-|origin-|fixed|local|scroll|bottom|center|left|right|top|repeat|no-repeat|auto|cover|contain|blend-)/.test(
965
+ bare
966
+ );
967
+ }
968
+ if (/^border(-[xytrbles])?(-\\d+)?$/.test(bare)) return !/-0$/.test(bare);
969
+ if (/^ring(-\\d+)?$/.test(bare)) return bare !== "ring-0";
970
+ if (/^outline(-\\d+)?$/.test(bare)) return bare !== "outline-0";
971
+ if (/^shadow(-(sm|md|lg|xl|2xl|inner))?$/.test(bare)) return true;
972
+ return false;
973
+ }
974
+ function classPads(token) {
975
+ const match = /^(p|px|py|pt|pr|pb|pl|ps|pe)-(.+)$/.exec(
976
+ bareClassToken(token)
977
+ );
978
+ return Boolean(match) && match[2] !== "0";
979
+ }
980
+ function paintsBox(classes, style) {
981
+ return classes.some(classPaints) || [
982
+ "background",
983
+ "background-color",
984
+ "background-image",
985
+ "border",
986
+ "border-width",
987
+ "box-shadow",
988
+ "outline"
989
+ ].some(
990
+ (property) => styleValueIsPresent(style(property), EMPTY_STYLE_PAINT)
991
+ );
992
+ }
993
+ function padsBox(classes, style) {
994
+ return classes.some(classPads) || [
995
+ "padding",
996
+ "padding-top",
997
+ "padding-right",
998
+ "padding-bottom",
999
+ "padding-left"
1000
+ ].some(
1001
+ (property) => styleValueIsPresent(style(property), EMPTY_STYLE_LENGTH)
1002
+ );
1003
+ }
1004
+
906
1005
  // app/components/design/bridge/editor-chrome.bridge.ts
907
1006
  (function() {
908
1007
  var readOnly = __READ_ONLY__;
@@ -912,6 +1011,7 @@ export const editorChromeBridgeScript: string = `"use strict";
912
1011
  var designCanvasBoardSurface = !!__DESIGN_CANVAS_BOARD_SURFACE__;
913
1012
  var designCanvasContentOffsetX = Number(__DESIGN_CANVAS_CONTENT_OFFSET_X__) || 0;
914
1013
  var designCanvasContentOffsetY = Number(__DESIGN_CANVAS_CONTENT_OFFSET_Y__) || 0;
1014
+ var portableStyleSnapshotsReadOnDemand = Boolean(window.frameElement);
915
1015
  function clipboardScreenContext() {
916
1016
  return !designCanvasBoardSurface && designCanvasScreenId ? { screenId: designCanvasScreenId } : {};
917
1017
  }
@@ -3328,6 +3428,9 @@ export const editorChromeBridgeScript: string = `"use strict";
3328
3428
  height: rect.height + padY * 2
3329
3429
  };
3330
3430
  }
3431
+ function hasLayoutBox(el) {
3432
+ return el.getClientRects().length > 0;
3433
+ }
3331
3434
  function outermostSvgAncestor(el) {
3332
3435
  var owner = el && el.ownerSVGElement;
3333
3436
  if (!owner) return null;
@@ -4416,6 +4519,13 @@ export const editorChromeBridgeScript: string = `"use strict";
4416
4519
  }
4417
4520
  var portableStyleProbeDoc;
4418
4521
  var portableStyleProbeContainer;
4522
+ var portableStyleProbeHost;
4523
+ function releasePortableStyleProbe() {
4524
+ portableStyleProbeHost?.remove();
4525
+ portableStyleProbeHost = void 0;
4526
+ portableStyleProbeDoc = void 0;
4527
+ portableStyleProbeContainer = void 0;
4528
+ }
4419
4529
  function portableStyleProbeDocument() {
4420
4530
  if (portableStyleProbeDoc !== void 0) return portableStyleProbeDoc;
4421
4531
  if (!document.body) return null;
@@ -4423,11 +4533,16 @@ export const editorChromeBridgeScript: string = `"use strict";
4423
4533
  try {
4424
4534
  frame = document.createElement("iframe");
4425
4535
  frame.setAttribute("aria-hidden", "true");
4536
+ frame.setAttribute(
4537
+ "data-agent-native-edit-overlay",
4538
+ "portable-style-probe"
4539
+ );
4426
4540
  frame.tabIndex = -1;
4427
4541
  frame.style.cssText = "position:fixed!important;width:0!important;height:0!important;border:0!important;visibility:hidden!important;pointer-events:none!important;";
4428
4542
  document.body.appendChild(frame);
4429
4543
  var probeDoc = frame.contentDocument;
4430
4544
  if (probeDoc) {
4545
+ portableStyleProbeHost = frame;
4431
4546
  portableStyleProbeDoc = probeDoc;
4432
4547
  portableStyleProbeContainer = probeDoc.body;
4433
4548
  } else {
@@ -4442,11 +4557,13 @@ export const editorChromeBridgeScript: string = `"use strict";
4442
4557
  "all: initial !important;position: fixed !important;left: 0 !important;top: 0 !important;width: 0 !important;height: 0 !important;overflow: hidden !important;contain: strict !important;"
4443
4558
  );
4444
4559
  document.body.appendChild(fallbackHost);
4560
+ portableStyleProbeHost = fallbackHost;
4445
4561
  portableStyleProbeDoc = document;
4446
4562
  portableStyleProbeContainer = fallbackHost.attachShadow({
4447
4563
  mode: "open"
4448
4564
  });
4449
4565
  }
4566
+ window.setTimeout(releasePortableStyleProbe, 0);
4450
4567
  } catch (err) {
4451
4568
  frame?.remove();
4452
4569
  console.warn("Portable style probe unavailable", err);
@@ -5245,6 +5362,72 @@ export const editorChromeBridgeScript: string = `"use strict";
5245
5362
  nodes
5246
5363
  };
5247
5364
  }
5365
+ var srgbColorContext;
5366
+ var srgbColorByValue = /* @__PURE__ */ new Map();
5367
+ var SRGB_COLOR_SENTINEL = "#010203";
5368
+ function srgbColor(value) {
5369
+ var known = srgbColorByValue.get(value);
5370
+ if (known !== void 0) return known;
5371
+ if (srgbColorContext === void 0) {
5372
+ srgbColorContext = document.createElement("canvas").getContext("2d", { willReadFrequently: true });
5373
+ }
5374
+ if (!srgbColorContext) return value;
5375
+ srgbColorContext.fillStyle = SRGB_COLOR_SENTINEL;
5376
+ srgbColorContext.fillStyle = value;
5377
+ if (srgbColorContext.fillStyle === SRGB_COLOR_SENTINEL) return value;
5378
+ srgbColorContext.clearRect(0, 0, 1, 1);
5379
+ srgbColorContext.fillRect(0, 0, 1, 1);
5380
+ var hex = "#";
5381
+ srgbColorContext.getImageData(0, 0, 1, 1).data.forEach(function(channel) {
5382
+ hex += channel.toString(16).padStart(2, "0");
5383
+ });
5384
+ srgbColorByValue.set(value, hex);
5385
+ return hex;
5386
+ }
5387
+ function srgbColorTokens(value) {
5388
+ return value.replace(
5389
+ /\\b(?:oklch|oklab|lch|lab|hwb|color)\\([^()]*\\)/g,
5390
+ srgbColor
5391
+ );
5392
+ }
5393
+ function hasOwnText(el) {
5394
+ for (var child = el.firstChild; child; child = child.nextSibling) {
5395
+ if (child.nodeType === 3 && child.textContent?.trim()) return true;
5396
+ }
5397
+ return false;
5398
+ }
5399
+ function paintedColorStyles(el) {
5400
+ var cs = window.getComputedStyle(el);
5401
+ var styles = {};
5402
+ var read = function(property) {
5403
+ styles[property] = srgbColorTokens(cs.getPropertyValue(property));
5404
+ };
5405
+ if (hasOwnText(el)) read("color");
5406
+ read("background-color");
5407
+ if (cs.backgroundImage !== "none") read("background-image");
5408
+ ["top", "right", "bottom", "left"].forEach(function(side) {
5409
+ if (portableBorderSidePaints(cs, side)) read("border-" + side + "-color");
5410
+ });
5411
+ if (cs.boxShadow !== "none") read("box-shadow");
5412
+ if (el instanceof SVGGeometryElement || el instanceof SVGTextContentElement) {
5413
+ if (cs.fill !== "none") read("fill");
5414
+ if (cs.stroke !== "none") read("stroke");
5415
+ }
5416
+ return styles;
5417
+ }
5418
+ var SUBTREE_COLOR_NODE_LIMIT = 5e3;
5419
+ function collectSubtreeColorStyles(root) {
5420
+ srgbColorByValue.clear();
5421
+ var nodes = [paintedColorStyles(root)];
5422
+ var walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT);
5423
+ for (var node = walker.nextNode(); node; node = walker.nextNode()) {
5424
+ if (nodes.length >= SUBTREE_COLOR_NODE_LIMIT) {
5425
+ return { nodes, truncated: true };
5426
+ }
5427
+ nodes.push(paintedColorStyles(node));
5428
+ }
5429
+ return { nodes, truncated: false };
5430
+ }
5248
5431
  var INLINE_STYLE_PROPERTIES = [
5249
5432
  "position",
5250
5433
  "left",
@@ -5776,7 +5959,7 @@ export const editorChromeBridgeScript: string = `"use strict";
5776
5959
  )
5777
5960
  };
5778
5961
  }
5779
- function getElementInfo(el, portableComputedStylesCache, includePortableStyleSnapshot = true, sharedPositionComputedStylesCache) {
5962
+ function getElementInfo(el, portableComputedStylesCache, includePortableStyleSnapshot = !portableStyleSnapshotsReadOnDemand, sharedPositionComputedStylesCache) {
5780
5963
  var cs = window.getComputedStyle(el);
5781
5964
  var positionComputedStylesCache = sharedPositionComputedStylesCache || /* @__PURE__ */ new WeakMap();
5782
5965
  var positionRenderOffset = appliedContentOffset();
@@ -5890,6 +6073,7 @@ export const editorChromeBridgeScript: string = `"use strict";
5890
6073
  vectorStrokeCanAlign: vectorStrokeCanAlign(el),
5891
6074
  portableStyleSnapshot: portableStyleSnapshot === null ? void 0 : portableStyleSnapshot,
5892
6075
  styleSnapshotCaptureFailed: portableStyleSnapshot === null ? true : void 0,
6076
+ styleSnapshotReadOnDemand: portableStyleSnapshotsReadOnDemand || void 0,
5893
6077
  boundingRect,
5894
6078
  parentBoundingRect: designParent ? rectInfoForElement(designParent) : void 0,
5895
6079
  ...positionCoordinateContext && positionReferenceRect ? {
@@ -6095,7 +6279,6 @@ export const editorChromeBridgeScript: string = `"use strict";
6095
6279
  );
6096
6280
  });
6097
6281
  }
6098
- portableStyleProbeDocument();
6099
6282
  var portableComputedStylesCache = createPortableStyleComputedStylesCache();
6100
6283
  try {
6101
6284
  return targets.map(function(target) {
@@ -9394,13 +9577,14 @@ export const editorChromeBridgeScript: string = `"use strict";
9394
9577
  setSelectionOverlayResizeChromeVisible(
9395
9578
  !readOnly && !activeTextEditEl && members.length < 2
9396
9579
  );
9397
- if (members.length === 0 || selectionChromeHidden) {
9580
+ var laidOutMembers = members.filter(hasLayoutBox);
9581
+ if (laidOutMembers.length === 0 || selectionChromeHidden) {
9398
9582
  if (multiSelectionBoundsOverlay) {
9399
9583
  multiSelectionBoundsOverlay.style.display = "none";
9400
9584
  }
9401
9585
  return;
9402
9586
  }
9403
- var rects = members.map(function(el) {
9587
+ var rects = laidOutMembers.map(function(el) {
9404
9588
  return el.getBoundingClientRect();
9405
9589
  });
9406
9590
  var left = Math.min.apply(
@@ -9464,9 +9648,12 @@ export const editorChromeBridgeScript: string = `"use strict";
9464
9648
  scalePassiveSelectionOverlay(overlay);
9465
9649
  }
9466
9650
  function positionOverlay(overlay, el) {
9467
- if (!el || !document.documentElement.contains(el)) {
9651
+ if (!el || !document.documentElement.contains(el) || !hasLayoutBox(el)) {
9468
9652
  overlay.style.display = "none";
9469
- if (overlay === selectionOverlay) hideSelectionOverlay();
9653
+ if (overlay === selectionOverlay) {
9654
+ hideSelectionOverlay();
9655
+ syncOverlayObservers();
9656
+ }
9470
9657
  return;
9471
9658
  }
9472
9659
  var placedRotatedLocalBox = positionOverlayForRotatedLocalBox(overlay, el);
@@ -11451,8 +11638,7 @@ export const editorChromeBridgeScript: string = `"use strict";
11451
11638
  highlightOverlay.style.pointerEvents = highlightPointerEvents;
11452
11639
  var elements = [];
11453
11640
  var layerCandidates = [];
11454
- portableStyleProbeDocument();
11455
- var portableComputedStylesCache = createPortableStyleComputedStylesCache();
11641
+ var portableComputedStylesCache = portableStyleSnapshotsReadOnDemand ? void 0 : createPortableStyleComputedStylesCache();
11456
11642
  try {
11457
11643
  pointTargets.forEach(function(pointTarget) {
11458
11644
  if (!pointTarget || pointTarget.nodeType !== 1) return;
@@ -14785,7 +14971,7 @@ export const editorChromeBridgeScript: string = `"use strict";
14785
14971
  for (var i = 0; i < children.length; i += 1) {
14786
14972
  var child = children[i];
14787
14973
  var childTag = (child.tagName || "").toLowerCase();
14788
- if (BRIDGE_LEAF_TAGS.indexOf(childTag) === -1 && BRIDGE_TEXT_TAGS.indexOf(childTag) === -1 && BRIDGE_INTERACTIVE_LEAF_TAGS.indexOf(childTag) === -1) {
14974
+ if (BRIDGE_LEAF_TAGS.indexOf(childTag) === -1 && !INLINE_TEXT_TAGS.has(childTag) && BRIDGE_INTERACTIVE_LEAF_TAGS.indexOf(childTag) === -1) {
14789
14975
  return false;
14790
14976
  }
14791
14977
  if (child.children.length && !hasOnlyLeafContent(child)) return false;
@@ -20505,6 +20691,34 @@ export const editorChromeBridgeScript: string = `"use strict";
20505
20691
  }
20506
20692
  return hitEl;
20507
20693
  }
20694
+ function isCodeLayerTextBlock(el) {
20695
+ if (el.getAttribute("data-agent-native-group") === "true") return false;
20696
+ var primitive = el.getAttribute("data-an-primitive");
20697
+ if (primitive) return primitive === "text";
20698
+ if ((el.getAttribute("data-agent-native-component") || "").trim()) {
20699
+ return false;
20700
+ }
20701
+ if (!TEXT_LAYER_TAGS.has(el.tagName.toLowerCase())) return false;
20702
+ var classes = Array.from(el.classList);
20703
+ var inlineStyle = el.style;
20704
+ var styleValue = function(property) {
20705
+ return inlineStyle?.getPropertyValue(property) || void 0;
20706
+ };
20707
+ if (paintsBox(classes, styleValue) || padsBox(classes, styleValue)) {
20708
+ return false;
20709
+ }
20710
+ for (var i = 0; i < el.children.length; i += 1) {
20711
+ var child = el.children[i];
20712
+ if (!INLINE_TEXT_TAGS.has(child.tagName.toLowerCase()) || child.children.length > 0) {
20713
+ return false;
20714
+ }
20715
+ }
20716
+ return true;
20717
+ }
20718
+ function textBlockOwningRun(el) {
20719
+ var parent = el?.parentElement;
20720
+ return el && parent && INLINE_TEXT_TAGS.has(el.tagName.toLowerCase()) && isCodeLayerTextBlock(parent) ? parent : el;
20721
+ }
20508
20722
  function nextStackCandidate(candidateKeys, currentKey) {
20509
20723
  if (!candidateKeys || candidateKeys.length === 0) return null;
20510
20724
  var idx = candidateKeys.indexOf(currentKey);
@@ -20555,15 +20769,17 @@ export const editorChromeBridgeScript: string = `"use strict";
20555
20769
  }
20556
20770
  var selectedAlive = !!selectedEl && document.documentElement.contains(selectedEl);
20557
20771
  var selectedRect = selectedAlive && selectedEl.getBoundingClientRect ? selectedEl.getBoundingClientRect() : null;
20558
- var dragTarget = dragTargetForPointerDown({
20559
- selectedEl,
20560
- selectedAlive,
20561
- selectedRect,
20562
- hitEl: hitTarget,
20563
- hitRaw: hit,
20564
- point: { x: e.clientX, y: e.clientY },
20565
- preferSelected: selectedLayerDragPriorityEnabled
20566
- });
20772
+ var dragTarget = textBlockOwningRun(
20773
+ dragTargetForPointerDown({
20774
+ selectedEl,
20775
+ selectedAlive,
20776
+ selectedRect,
20777
+ hitEl: hitTarget,
20778
+ hitRaw: hit,
20779
+ point: { x: e.clientX, y: e.clientY },
20780
+ preferSelected: selectedLayerDragPriorityEnabled
20781
+ })
20782
+ );
20567
20783
  if (window.__DND_DEBUG)
20568
20784
  dndLog("shield:down", {
20569
20785
  hit: getSelector(hit),
@@ -22541,7 +22757,7 @@ export const editorChromeBridgeScript: string = `"use strict";
22541
22757
  payload: collectSelectableElementInfos(
22542
22758
  Boolean(e.data.deep),
22543
22759
  readSelectablePoint(e.data.atPoint),
22544
- e.data.includePortableStyleSnapshot !== false
22760
+ e.data.includePortableStyleSnapshot !== false && !portableStyleSnapshotsReadOnDemand
22545
22761
  )
22546
22762
  },
22547
22763
  "*"
@@ -23617,6 +23833,35 @@ export const editorChromeBridgeScript: string = `"use strict";
23617
23833
  inlineExportResources: function(html) {
23618
23834
  return inlineRuntimeSnapshotResources(html, 5e6);
23619
23835
  },
23836
+ collectPortableStyleSnapshot: function(screenId, selector, instanceIndex) {
23837
+ if (screenId !== designCanvasScreenId) return null;
23838
+ var target;
23839
+ try {
23840
+ target = document.querySelectorAll(selector)[instanceIndex - 1] || null;
23841
+ } catch (_error) {
23842
+ return { status: "failed" };
23843
+ }
23844
+ var snapshot = target ? collectPortableStyleSnapshot(target) : void 0;
23845
+ if (snapshot === null) return { status: "failed" };
23846
+ if (snapshot === void 0) return { status: "missing" };
23847
+ return { status: "captured", snapshot };
23848
+ },
23849
+ collectSubtreeColorStyles: function(screenId, selector, instanceIndex) {
23850
+ if (screenId !== designCanvasScreenId) return null;
23851
+ var target;
23852
+ try {
23853
+ target = document.querySelectorAll(selector)[instanceIndex - 1] || null;
23854
+ } catch (_error) {
23855
+ return { status: "failed" };
23856
+ }
23857
+ if (!target || isDocumentRootElement(target))
23858
+ return { status: "missing" };
23859
+ var read = collectSubtreeColorStyles(target);
23860
+ return {
23861
+ status: read.truncated ? "truncated" : "captured",
23862
+ nodes: read.nodes
23863
+ };
23864
+ },
23620
23865
  updateConfig: function(next) {
23621
23866
  if (!next || typeof next !== "object") return;
23622
23867
  var nextReadOnly = typeof next.readOnly === "boolean" ? next.readOnly : readOnly;
@@ -4,6 +4,36 @@
4
4
  /** Compiled IIFE string for hit-test.bridge.ts — inject into an iframe via srcdoc or a <script> tag. */
5
5
  export const hitTestBridgeScript: string = `"use strict";
6
6
  (() => {
7
+ // shared/text-layer-rule.ts
8
+ var INLINE_TEXT_TAGS = /* @__PURE__ */ new Set([
9
+ "a",
10
+ "abbr",
11
+ "b",
12
+ "bdi",
13
+ "bdo",
14
+ "br",
15
+ "cite",
16
+ "code",
17
+ "data",
18
+ "dfn",
19
+ "em",
20
+ "i",
21
+ "kbd",
22
+ "mark",
23
+ "q",
24
+ "s",
25
+ "samp",
26
+ "small",
27
+ "span",
28
+ "strong",
29
+ "sub",
30
+ "sup",
31
+ "time",
32
+ "u",
33
+ "var",
34
+ "wbr"
35
+ ]);
36
+
7
37
  // app/components/design/bridge/hit-test.bridge.ts
8
38
  (function() {
9
39
  var insertionGuide = null;
@@ -93,7 +123,7 @@ export const hitTestBridgeScript: string = `"use strict";
93
123
  for (var i = 0; i < children.length; i += 1) {
94
124
  var child = children[i];
95
125
  var childTag = (child.tagName || "").toLowerCase();
96
- if (BRIDGE_LEAF_TAGS.indexOf(childTag) === -1 && BRIDGE_TEXT_TAGS.indexOf(childTag) === -1 && BRIDGE_INTERACTIVE_LEAF_TAGS.indexOf(childTag) === -1) {
126
+ if (BRIDGE_LEAF_TAGS.indexOf(childTag) === -1 && !INLINE_TEXT_TAGS.has(childTag) && BRIDGE_INTERACTIVE_LEAF_TAGS.indexOf(childTag) === -1) {
97
127
  return false;
98
128
  }
99
129
  if (child.children.length && !hasOnlyLeafContent(child)) return false;
@@ -3,6 +3,12 @@
3
3
  All notable user-facing changes to Design are documented here. Open it any time
4
4
  from the command menu (Cmd+K → "What's new") or from Settings.
5
5
 
6
+ ## 2026-10-12
7
+
8
+ ### Fixed
9
+
10
+ - Cached templates remain available during temporary refresh errors, with an option to retry.
11
+
6
12
  ## 2026-10-11
7
13
 
8
14
  ### Improved
@@ -12,6 +18,17 @@ from the command menu (Cmd+K → "What's new") or from Settings.
12
18
 
13
19
  ### Fixed
14
20
 
21
+ - Accept authenticated private storyboard uploads from Analytics.
22
+ - Analytics can securely add replay screenshots to a Design storyboard
23
+ - Analytics replay screenshots can use the active workspace upload connection while keeping the storyboard private.
24
+ - Check private screenshot storage before creating a storyboard
25
+ - Design history no longer saves a stale version when the design changes during a large snapshot upload.
26
+ - Design history now includes saved files before collaboration starts.
27
+ - Design keeps browser zoom keys out of inspector inputs, restores Control+Shift+? on Mac, and keeps cut from deleting content edited while the clipboard write is pending.
28
+ - Design now preserves source consistency when checkpointing edits and deleting files during collaboration.
29
+ - Saved templates appear when you return to the template library.
30
+ - Scrubbing after a numeric edit keeps the latest committed value when the gesture is canceled.
31
+ - The Home composer waits for your organization to load before accepting a new design prompt.
15
32
  - Replay screenshots can be handed off to Design boards.
16
33
 
17
34
  Agent reads of Design boards require authentication, including WebMCP reads. Anonymous WebMCP no longer offers `get-design`; public shared-design links and HTTP reads remain available under their existing access checks.
@@ -20,6 +37,7 @@ from the command menu (Cmd+K → "What's new") or from Settings.
20
37
 
21
38
  ### Improved
22
39
 
40
+ - The fill picker's color swatches now include the Tailwind colors used inside the selected layer.
23
41
  - Canvas navigation does less work on large boards.
24
42
  - ChatGPT and other MCP widgets open the standard minimal-UI editor, with the title and share bar, the bottom tool bar, and the inspector as a right panel at every width.
25
43
  - Images are optimized automatically before prompt upload.
@@ -29,6 +47,8 @@ from the command menu (Cmd+K → "What's new") or from Settings.
29
47
 
30
48
  ### Fixed
31
49
 
50
+ - Design layer snapshots no longer include temporary editor elements.
51
+ - Position controls keep accurate coordinates when a canvas preview refreshes.
32
52
  - Board Position values stay consistent when selecting and editing layers
33
53
  - Design preserves small reference images when you attach larger documents
34
54
  - Home suggestions keep their slot stable through profile errors and generation.
@@ -46,6 +66,10 @@ from the command menu (Cmd+K → "What's new") or from Settings.
46
66
 
47
67
  ### Improved
48
68
 
69
+ - Design keeps hidden Code source reads quiet and speeds layer identity work.
70
+ - Design keeps Layers rows and rename focus stable as layers are inserted.
71
+ - Share button now has an export chevron menu with downloads, agent prompt, and publish
72
+ - Undo on large screens responds faster, and saving an edit uploads only the change instead of the whole screen.
49
73
  - Journey storyboards keep full branch names and percentages readable and explain grouped paths.
50
74
  - Journey storyboards support up to 2,000 steps.
51
75
  - Large Design storyboards stay responsive during pan and zoom
@@ -60,6 +84,16 @@ from the command menu (Cmd+K → "What's new") or from Settings.
60
84
 
61
85
  ### Fixed
62
86
 
87
+ - Canvas selection follows the depth of the selected layers.
88
+ - Delete includes Screens added by a Shift-marquee to an existing selection.
89
+ - Design keeps canvas gestures and shortcuts working during editor interactions.
90
+ - Design protects Cut and undo history, and improves text and shadow handling for imports.
91
+ - Dragging a heading by a styled word now moves the whole text, and short drags inside a stack of text reorder within that stack
92
+ - Nudging a screen with the arrow keys no longer briefly snaps it back to its old position
93
+ - Selecting an element on a large screen no longer freezes the editor, and the agent now always sees what you selected
94
+ - Selecting an element that is hidden at a breakpoint no longer draws a stray box in that frame's corner
95
+ - The editor no longer says changes will save when reconnected when a save failed for another reason.
96
+ - The layers panel lists auto-layout children in the same order they appear on the canvas, and dragging rows reorders them the way the panel shows
63
97
  - Canvas selection keeps keyboard shortcuts active after clicking editor tabs
64
98
  - Design creates a mobile leaderboard on the fixed 320 × 50 ad canvas.
65
99
  - Fix private replay screenshot previews across Design canvases and previews