@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.
- package/corpus/README.md +1 -1
- package/corpus/templates/analytics/CHANGELOG.md +5 -0
- package/corpus/templates/clips/CHANGELOG.md +6 -0
- package/corpus/templates/clips/app/i18n/en-US.ts +1 -1
- package/corpus/templates/clips/changelog/2026-10-12-fix-rewind-popover-privacy.md +6 -0
- package/corpus/templates/clips/desktop/src/lookback/LookbackRow.tsx +3 -2
- package/corpus/templates/design/.agents/skills/design-editor-performance/SKILL.md +4 -1
- package/corpus/templates/design/.agents/skills/design-editor-performance/references/measuring.md +13 -3
- package/corpus/templates/design/.generated/bridge/editor-chrome.generated.ts +264 -19
- package/corpus/templates/design/.generated/bridge/hit-test.generated.ts +31 -1
- package/corpus/templates/design/CHANGELOG.md +34 -0
- package/corpus/templates/design/actions/update-file.ts +85 -13
- package/corpus/templates/design/app/components/design/DesignCanvas.tsx +91 -24
- package/corpus/templates/design/app/components/design/EditPanel.tsx +17 -2
- package/corpus/templates/design/app/components/design/LayersPanel.tsx +31 -3
- package/corpus/templates/design/app/components/design/bridge/hit-test.bridge.ts +5 -2
- package/corpus/templates/design/app/components/design/edit-panel/document-colors.ts +14 -0
- package/corpus/templates/design/app/components/design/edit-panel/fill-properties.tsx +26 -2
- package/corpus/templates/design/app/components/design/inspector/DesignColorPicker.tsx +5 -1
- package/corpus/templates/design/app/components/design/multi-screen/linked-screen-preview.ts +2 -0
- package/corpus/templates/design/app/components/design/multi-screen/read-portable-style-snapshot.ts +106 -0
- package/corpus/templates/design/app/components/design/types.ts +1 -0
- package/corpus/templates/design/app/pages/design-editor/code-layer-state.ts +12 -2
- package/corpus/templates/design/app/pages/design-editor/command-types.ts +6 -1
- package/corpus/templates/design/app/pages/design-editor/commands/apply-local-content-update.ts +6 -8
- package/corpus/templates/design/app/pages/design-editor/commands/copy-selection.ts +39 -3
- package/corpus/templates/design/app/pages/design-editor/commands/get-selected-layer-snapshots.ts +4 -0
- package/corpus/templates/design/app/pages/design-editor/commands/persist-frame-geometry-save.ts +3 -3
- package/corpus/templates/design/app/pages/design-editor/commands/persist-tweak-save.ts +5 -1
- package/corpus/templates/design/app/pages/design-editor/commands/redo.ts +6 -1
- package/corpus/templates/design/app/pages/design-editor/commands/save-file-content.ts +56 -17
- package/corpus/templates/design/app/pages/design-editor/commands/screen-element-select.ts +2 -2
- package/corpus/templates/design/app/pages/design-editor/commands/undo.ts +6 -1
- package/corpus/templates/design/app/pages/design-editor/design-editor-view.tsx +2 -0
- package/corpus/templates/design/app/pages/design-editor/domains/use-editor-active-screen-and-geometry.ts +30 -25
- package/corpus/templates/design/app/pages/design-editor/domains/use-editor-clipboard.tsx +11 -0
- package/corpus/templates/design/app/pages/design-editor/domains/use-editor-content-and-components.ts +1 -0
- package/corpus/templates/design/app/pages/design-editor/domains/use-editor-files-and-saving.ts +43 -2
- package/corpus/templates/design/app/pages/design-editor/domains/use-editor-history.ts +2 -0
- package/corpus/templates/design/app/pages/design-editor/domains/use-editor-live-edits-and-presence.ts +13 -28
- package/corpus/templates/design/app/pages/design-editor/domains/use-editor-screen-inspector.ts +24 -0
- package/corpus/templates/design/app/pages/design-editor/effects/publish-agent-selection-context.ts +127 -11
- package/corpus/templates/design/app/pages/design-editor/save-failure.ts +25 -1
- package/corpus/templates/design/app/pages/design-editor/tweak-save.ts +8 -5
- package/corpus/templates/design/app/pages/design-editor/view/left-sidebar.tsx +14 -11
- package/corpus/templates/design/changelog/2026-10-09-dragging-a-heading-by-a-styled-word-now-moves-the-whole-text.md +6 -0
- package/corpus/templates/design/changelog/2026-10-09-nudging-a-screen-with-the-arrow-keys-no-longer-briefly-snaps.md +6 -0
- package/corpus/templates/design/changelog/2026-10-09-selecting-an-element-on-a-large-screen-no-longer-freezes-the.md +6 -0
- package/corpus/templates/design/changelog/2026-10-09-selecting-an-element-that-is-hidden-at-a-breakpoint-no-longe.md +6 -0
- package/corpus/templates/design/changelog/2026-10-09-the-editor-no-longer-says-changes-will-save-when-reconnected.md +6 -0
- package/corpus/templates/design/changelog/2026-10-09-the-layers-panel-lists-auto-layout-children-in-the-same-orde.md +6 -0
- package/corpus/templates/design/changelog/2026-10-09-undo-on-large-screens-responds-faster-and-saving-an-edit-upl.md +6 -0
- package/corpus/templates/design/changelog/2026-10-10-the-fill-picker-s-color-swatches-now-include-the-tailwind-co.md +6 -0
- package/corpus/templates/design/scripts/runtime-budget.json +18 -10
- package/corpus/templates/design/scripts/runtime-budget.ts +89 -12
- package/corpus/templates/design/shared/code-layer.ts +17 -103
- package/corpus/templates/design/shared/memoize-by-content.ts +13 -0
- package/corpus/templates/design/shared/source-workspace.ts +43 -21
- package/corpus/templates/design/shared/text-layer-rule.ts +125 -0
- package/corpus/templates/slides/CHANGELOG.md +6 -0
- package/package.json +1 -1
- package/corpus/templates/analytics/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
- package/corpus/templates/assets/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
- package/corpus/templates/brain/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
- package/corpus/templates/calendar/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
- package/corpus/templates/chat/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
- package/corpus/templates/clips/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
- package/corpus/templates/content/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
- package/corpus/templates/crm/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
- package/corpus/templates/design/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
- package/corpus/templates/dispatch/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
- package/corpus/templates/forms/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
- package/corpus/templates/mail/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
- package/corpus/templates/plan/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
- package/corpus/templates/slides/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
package/corpus/README.md
CHANGED
|
@@ -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
|
-
"
|
|
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:
|
|
@@ -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-
|
|
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.
|
|
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.
|
package/corpus/templates/design/.agents/skills/design-editor-performance/references/measuring.md
CHANGED
|
@@ -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,
|
|
18
|
-
shows the browser
|
|
19
|
-
by
|
|
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 =
|
|
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
|
-
|
|
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 =
|
|
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)
|
|
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
|
-
|
|
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 &&
|
|
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 =
|
|
20559
|
-
|
|
20560
|
-
|
|
20561
|
-
|
|
20562
|
-
|
|
20563
|
-
|
|
20564
|
-
|
|
20565
|
-
|
|
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 &&
|
|
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
|