dsh-ptc-plus 0.4.3 → 0.4.10

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 (66) hide show
  1. package/README.en.md +15 -3
  2. package/README.md +15 -3
  3. package/client.js +1157 -533
  4. package/cordis.patch.yml +12 -2
  5. package/docs/README.md +2 -0
  6. package/docs/adr/0005-temporary-rejected-cell-edit-transport.md +60 -4
  7. package/docs/adr/0017-track-the-latest-dsh-public-surface.md +5 -1
  8. package/docs/adr/0019-plugin-settings-and-kill-switch.md +14 -3
  9. package/docs/adr/0020-optional-cordis-tools-in-ptc-mode.md +2 -2
  10. package/docs/adr/0023-global-user-bindings.md +1 -1
  11. package/docs/adr/0028-attach-to-the-host-ptc-execution-seam.md +82 -18
  12. package/docs/adr/0030-serve-both-typert-codec-generations-from-one-codec.md +3 -3
  13. package/docs/adr/0032-own-session-log-facts-in-a-host-only-projection.md +27 -0
  14. package/docs/adr/0033-gate-client-visual-usability-in-a-browser.md +23 -0
  15. package/docs/architecture.md +6 -4
  16. package/docs/binding-review-placement-design.md +29 -21
  17. package/docs/client-ui.md +20 -8
  18. package/docs/client-visual-contract.md +48 -0
  19. package/docs/durability-design.md +12 -0
  20. package/docs/installation.md +48 -9
  21. package/docs/publishing.md +4 -4
  22. package/docs/release-notes.md +109 -0
  23. package/docs/runtime-reference.md +8 -2
  24. package/docs/user-bindings.en.md +2 -2
  25. package/docs/user-bindings.md +3 -3
  26. package/docs/verification-optimization-work.md +26 -0
  27. package/docs/verification.md +7 -1
  28. package/index.js +28 -7
  29. package/internal/compiler-platform.js +5 -3
  30. package/internal/compiler-service.js +2 -9
  31. package/internal/cordis-tools-owner.js +75 -16
  32. package/internal/direct-surface-owner.js +333 -7
  33. package/internal/edit-transport-owner.js +8 -5
  34. package/internal/execution-provider-owner.js +157 -0
  35. package/internal/execution-seam-compat.js +69 -113
  36. package/internal/isolated-worker.js +12 -8
  37. package/internal/recovery-tips.js +50 -21
  38. package/internal/rejected-cell-editor.js +11 -21
  39. package/internal/runtime-bridge-owner.js +88 -57
  40. package/internal/runtime-contexts.js +13 -13
  41. package/internal/session-events.js +40 -4
  42. package/internal/session-journal-recovery.js +678 -181
  43. package/internal/session-log-view.js +189 -43
  44. package/internal/session-runtime.js +58 -10
  45. package/internal/settings-compat.js +12 -2
  46. package/internal/user-bindings-owner.js +6 -5
  47. package/locale/en.json +6 -0
  48. package/locale/zh.json +6 -0
  49. package/package.json +18 -13
  50. package/src/client-authoring-view.js +222 -141
  51. package/src/client-binding-review.js +2 -0
  52. package/src/client-code-editor.js +6 -0
  53. package/src/client-copy.js +10 -0
  54. package/src/client-feature-gates.js +12 -5
  55. package/src/client-host-compat.js +23 -2
  56. package/src/client-primitives.js +249 -0
  57. package/src/client-repl-view.js +3 -3
  58. package/src/client-settings-view.js +2 -29
  59. package/src/client-styles.js +92 -33
  60. package/src/client-tool-view.js +8 -3
  61. package/src/client-workbench.js +9 -7
  62. package/src/client.js +72 -46
  63. package/assets/ptc-plus-bindings-en.png +0 -0
  64. package/assets/ptc-plus-bindings-zh.png +0 -0
  65. package/assets/ptc-plus-repair-en.png +0 -0
  66. package/assets/ptc-plus-repair-zh.png +0 -0
package/client.js CHANGED
@@ -1,4 +1,139 @@
1
1
  (() => {
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __commonJS = (cb, mod) => function __require() {
9
+ try {
10
+ return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
11
+ } catch (e) {
12
+ throw mod = 0, e;
13
+ }
14
+ };
15
+ var __copyProps = (to, from2, except, desc) => {
16
+ if (from2 && typeof from2 === "object" || typeof from2 === "function") {
17
+ for (let key of __getOwnPropNames(from2))
18
+ if (!__hasOwnProp.call(to, key) && key !== except)
19
+ __defProp(to, key, { get: () => from2[key], enumerable: !(desc = __getOwnPropDesc(from2, key)) || desc.enumerable });
20
+ }
21
+ return to;
22
+ };
23
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
24
+ // If the importer is in node compatibility mode or this is not an ESM
25
+ // file that has been converted to a CommonJS file using a Babel-
26
+ // compatible transform (i.e. "__esModule" has not been set), then set
27
+ // "default" to the CommonJS "module.exports" for node compatibility.
28
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
29
+ mod
30
+ ));
31
+
32
+ // node_modules/react-is/cjs/react-is.development.js
33
+ var require_react_is_development = __commonJS({
34
+ "node_modules/react-is/cjs/react-is.development.js"(exports) {
35
+ "use strict";
36
+ (function() {
37
+ function typeOf(object) {
38
+ if ("object" === typeof object && null !== object) {
39
+ var $$typeof = object.$$typeof;
40
+ switch ($$typeof) {
41
+ case REACT_ELEMENT_TYPE:
42
+ switch (object = object.type, object) {
43
+ case REACT_FRAGMENT_TYPE:
44
+ case REACT_PROFILER_TYPE:
45
+ case REACT_STRICT_MODE_TYPE:
46
+ case REACT_SUSPENSE_TYPE:
47
+ case REACT_SUSPENSE_LIST_TYPE:
48
+ case REACT_VIEW_TRANSITION_TYPE:
49
+ return object;
50
+ default:
51
+ switch (object = object && object.$$typeof, object) {
52
+ case REACT_CONTEXT_TYPE:
53
+ case REACT_FORWARD_REF_TYPE:
54
+ case REACT_LAZY_TYPE:
55
+ case REACT_MEMO_TYPE:
56
+ return object;
57
+ case REACT_CONSUMER_TYPE:
58
+ return object;
59
+ default:
60
+ return $$typeof;
61
+ }
62
+ }
63
+ case REACT_PORTAL_TYPE:
64
+ return $$typeof;
65
+ }
66
+ }
67
+ }
68
+ var REACT_ELEMENT_TYPE = /* @__PURE__ */ Symbol.for("react.transitional.element"), REACT_PORTAL_TYPE = /* @__PURE__ */ Symbol.for("react.portal"), REACT_FRAGMENT_TYPE = /* @__PURE__ */ Symbol.for("react.fragment"), REACT_STRICT_MODE_TYPE = /* @__PURE__ */ Symbol.for("react.strict_mode"), REACT_PROFILER_TYPE = /* @__PURE__ */ Symbol.for("react.profiler"), REACT_CONSUMER_TYPE = /* @__PURE__ */ Symbol.for("react.consumer"), REACT_CONTEXT_TYPE = /* @__PURE__ */ Symbol.for("react.context"), REACT_FORWARD_REF_TYPE = /* @__PURE__ */ Symbol.for("react.forward_ref"), REACT_SUSPENSE_TYPE = /* @__PURE__ */ Symbol.for("react.suspense"), REACT_SUSPENSE_LIST_TYPE = /* @__PURE__ */ Symbol.for("react.suspense_list"), REACT_MEMO_TYPE = /* @__PURE__ */ Symbol.for("react.memo"), REACT_LAZY_TYPE = /* @__PURE__ */ Symbol.for("react.lazy"), REACT_VIEW_TRANSITION_TYPE = /* @__PURE__ */ Symbol.for("react.view_transition"), REACT_CLIENT_REFERENCE = /* @__PURE__ */ Symbol.for("react.client.reference");
69
+ exports.ContextConsumer = REACT_CONSUMER_TYPE;
70
+ exports.ContextProvider = REACT_CONTEXT_TYPE;
71
+ exports.Element = REACT_ELEMENT_TYPE;
72
+ exports.ForwardRef = REACT_FORWARD_REF_TYPE;
73
+ exports.Fragment = REACT_FRAGMENT_TYPE;
74
+ exports.Lazy = REACT_LAZY_TYPE;
75
+ exports.Memo = REACT_MEMO_TYPE;
76
+ exports.Portal = REACT_PORTAL_TYPE;
77
+ exports.Profiler = REACT_PROFILER_TYPE;
78
+ exports.StrictMode = REACT_STRICT_MODE_TYPE;
79
+ exports.Suspense = REACT_SUSPENSE_TYPE;
80
+ exports.SuspenseList = REACT_SUSPENSE_LIST_TYPE;
81
+ exports.isContextConsumer = function(object) {
82
+ return typeOf(object) === REACT_CONSUMER_TYPE;
83
+ };
84
+ exports.isContextProvider = function(object) {
85
+ return typeOf(object) === REACT_CONTEXT_TYPE;
86
+ };
87
+ exports.isElement = function(object) {
88
+ return "object" === typeof object && null !== object && object.$$typeof === REACT_ELEMENT_TYPE;
89
+ };
90
+ exports.isForwardRef = function(object) {
91
+ return typeOf(object) === REACT_FORWARD_REF_TYPE;
92
+ };
93
+ exports.isFragment = function(object) {
94
+ return typeOf(object) === REACT_FRAGMENT_TYPE;
95
+ };
96
+ exports.isLazy = function(object) {
97
+ return typeOf(object) === REACT_LAZY_TYPE;
98
+ };
99
+ exports.isMemo = function(object) {
100
+ return typeOf(object) === REACT_MEMO_TYPE;
101
+ };
102
+ exports.isPortal = function(object) {
103
+ return typeOf(object) === REACT_PORTAL_TYPE;
104
+ };
105
+ exports.isProfiler = function(object) {
106
+ return typeOf(object) === REACT_PROFILER_TYPE;
107
+ };
108
+ exports.isStrictMode = function(object) {
109
+ return typeOf(object) === REACT_STRICT_MODE_TYPE;
110
+ };
111
+ exports.isSuspense = function(object) {
112
+ return typeOf(object) === REACT_SUSPENSE_TYPE;
113
+ };
114
+ exports.isSuspenseList = function(object) {
115
+ return typeOf(object) === REACT_SUSPENSE_LIST_TYPE;
116
+ };
117
+ exports.isValidElementType = function(type) {
118
+ return "string" === typeof type || "function" === typeof type || type === REACT_FRAGMENT_TYPE || type === REACT_PROFILER_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || type === REACT_VIEW_TRANSITION_TYPE || "object" === typeof type && null !== type && (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_CONSUMER_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_CLIENT_REFERENCE || void 0 !== type.getModuleId) ? true : false;
119
+ };
120
+ exports.typeOf = typeOf;
121
+ })();
122
+ }
123
+ });
124
+
125
+ // node_modules/react-is/index.js
126
+ var require_react_is = __commonJS({
127
+ "node_modules/react-is/index.js"(exports, module) {
128
+ "use strict";
129
+ if (false) {
130
+ module.exports = null;
131
+ } else {
132
+ module.exports = require_react_is_development();
133
+ }
134
+ }
135
+ });
136
+
2
137
  // node_modules/@deepseek-ai/cosmokit/lib/index.js
3
138
  function isNullable(value) {
4
139
  return value === null || value === void 0;
@@ -1815,11 +1950,141 @@
1815
1950
  return Object.freeze({ state, description, code: code2, output, ptc: true, features: Object.freeze(features) });
1816
1951
  }
1817
1952
 
1953
+ // src/client-host-compat.js
1954
+ var import_react_is = __toESM(require_react_is(), 1);
1955
+ function isHostComponent(component) {
1956
+ if (typeof component === "function") return true;
1957
+ if (typeof component !== "object" || component === null) return false;
1958
+ const seen = /* @__PURE__ */ new Set();
1959
+ while ((0, import_react_is.isValidElementType)(component)) {
1960
+ if (typeof component !== "object" || component === null) return true;
1961
+ if (seen.has(component)) return false;
1962
+ seen.add(component);
1963
+ if (component.$$typeof === import_react_is.ForwardRef) return typeof component.render === "function";
1964
+ if (component.$$typeof === import_react_is.Lazy) return typeof component._init === "function" && typeof component._payload === "object" && component._payload !== null;
1965
+ if (component.$$typeof !== import_react_is.Memo) return false;
1966
+ if (component.compare != null && typeof component.compare !== "function") return false;
1967
+ component = component.type;
1968
+ }
1969
+ return false;
1970
+ }
1971
+ var HOST_ICON_EXPORTS = Object.freeze({
1972
+ check: ["IconCheckOutlineRegular", "IconCheckOutline14"],
1973
+ chevron: ["IconChevronDownOutlineRegular", "IconChevronDownOutline14"],
1974
+ inspect: ["IconInspectOutlineRegular", "IconInspectOutline12"],
1975
+ sparkle: ["IconSparkleRegular", "IconSparkle16"],
1976
+ close: ["IconCloseOutlineRegular", "IconCloseOutline16"],
1977
+ search: ["IconSearchOutlineRegular", "IconSearchOutline16"],
1978
+ plus: ["IconPlusOutlineRegular", "IconPlusOutline16"],
1979
+ refresh: ["IconRefreshOutlineRegular", "IconRefreshOutline16"],
1980
+ trash: ["IconTrashOutlineRegular", "IconTrashOutline16"],
1981
+ edit: ["IconEditOutlineRegular", "IconEditOutline16"],
1982
+ play: ["IconPlayOutlineRegular", "IconPlayOutline16"],
1983
+ stop: ["IconStopFillRegular", "IconStopFill16"]
1984
+ });
1985
+ var ABSENT_HOST_ICON = () => null;
1986
+ ABSENT_HOST_ICON.absentHostIcon = true;
1987
+ function isHostIconComponent(icon) {
1988
+ return isHostComponent(icon) && icon.absentHostIcon !== true;
1989
+ }
1990
+ function hostIconComponents(primitives) {
1991
+ return Object.fromEntries(Object.entries(HOST_ICON_EXPORTS).map(([name2, candidates]) => [
1992
+ name2,
1993
+ candidates.map((candidate) => primitives?.[candidate]).find(isHostComponent) ?? ABSENT_HOST_ICON
1994
+ ]));
1995
+ }
1996
+ var MENU_CHILDREN_PROBE_SENTINEL = "ptcPlusMenuChildrenProbe";
1997
+ function readMenuChildrenProbe(container) {
1998
+ if (container === null || container === void 0) return false;
1999
+ return container.querySelector(`.${MENU_CHILDREN_PROBE_SENTINEL}`) !== null;
2000
+ }
2001
+ function createMenuChildrenEvidence() {
2002
+ let supported;
2003
+ return {
2004
+ supported: () => supported,
2005
+ record(value) {
2006
+ supported ??= value === true;
2007
+ }
2008
+ };
2009
+ }
2010
+ function sessionPresetValue(projected, summary) {
2011
+ if (projected !== void 0) return projected;
2012
+ const values = summary?.projectionValues;
2013
+ return values !== void 0 && Object.hasOwn(values, "agentPreset") ? values.agentPreset : summary?.agentPreset;
2014
+ }
2015
+ function currentSessionId(snapshot2, remembered) {
2016
+ if (snapshot2?.current !== void 0) return snapshot2.current;
2017
+ const held = (id2) => id2 !== void 0 && (snapshot2?.byId?.[id2]?.retainedBy?.mainView ?? 0) > 0;
2018
+ if (held(remembered)) return remembered;
2019
+ for (const row of Object.values(snapshot2?.byId ?? {})) {
2020
+ if ((row?.retainedBy?.mainView ?? 0) > 0) return row.id;
2021
+ }
2022
+ return void 0;
2023
+ }
2024
+ function sessionUsesPtcPreset(preset) {
2025
+ return preset === "ptc" || preset === "code";
2026
+ }
2027
+ function useSessionPreset({ sessionId, useProjection, useSessions }) {
2028
+ const projected = useProjection("agentPreset");
2029
+ return typeof useSessions === "function" ? useSessions((state) => sessionPresetValue(projected, state.byId?.[sessionId])) : projected;
2030
+ }
2031
+ function watchCurrentSessionPreset(sessions, listener) {
2032
+ let source;
2033
+ let unsubscribeProjection;
2034
+ let selected;
2035
+ const sync = () => {
2036
+ const snapshot2 = sessions.list.getSnapshot();
2037
+ const current = currentSessionId(snapshot2, selected);
2038
+ selected = current;
2039
+ const summary = current === void 0 ? void 0 : snapshot2.byId?.[current];
2040
+ const next = current === void 0 ? void 0 : sessions.binding?.(current)?.session?.projections?.faceOf?.("agentPreset");
2041
+ if (source !== next) {
2042
+ unsubscribeProjection?.();
2043
+ source = next;
2044
+ unsubscribeProjection = source?.subscribe(sync);
2045
+ }
2046
+ listener(sessionPresetValue(source?.getSnapshot(), summary));
2047
+ };
2048
+ const unsubscribeList = sessions.list.subscribe(sync);
2049
+ const dispose = () => {
2050
+ unsubscribeList();
2051
+ unsubscribeProjection?.();
2052
+ };
2053
+ try {
2054
+ sync();
2055
+ } catch (error) {
2056
+ dispose();
2057
+ throw error;
2058
+ }
2059
+ return dispose;
2060
+ }
2061
+ function isIdleSessionComposer(owner, sessionId) {
2062
+ return Object.hasOwn(owner, "sessionId") ? owner.sessionId === sessionId && owner.pendingInteraction === void 0 : owner.session?.sessionId === sessionId && Array.isArray(owner.interactions) && owner.interactions.length === 0;
2063
+ }
2064
+ var BUNDLE_PATCH_ROW_ID = "ptc-plus";
2065
+ function settingsCardSeats(bundleName) {
2066
+ return [
2067
+ { slot: "settings.plugin.item", identity: { key: SETTINGS_NAMESPACE } },
2068
+ { slot: "plugins.row.config", identity: { key: `${bundleName}#${BUNDLE_PATCH_ROW_ID}` } }
2069
+ ];
2070
+ }
2071
+ function publishSettingsCard(ctx, { bundleName, locale, injectProps, component }) {
2072
+ let live;
2073
+ const releases = settingsCardSeats(bundleName).map(({ slot, identity }) => ctx.slots.inject(
2074
+ slot,
2075
+ () => {
2076
+ live = slot;
2077
+ return ctx.slots.register({ name: slot, ...identity, locale, inject: injectProps }, component);
2078
+ }
2079
+ ));
2080
+ return { seat: () => live, releases };
2081
+ }
2082
+
1818
2083
  // src/client-tool-view.js
1819
2084
  function createPtcToolView(React, deps) {
1820
2085
  const { CodeBlock, DisclosureRow, icons } = deps;
1821
2086
  const h = React.createElement;
1822
- const hasDisclosureRow = typeof DisclosureRow === "function" || typeof DisclosureRow === "object" && DisclosureRow !== null;
2087
+ const hasDisclosureRow = isHostComponent(DisclosureRow);
1823
2088
  function PTCPlusToolRow({ toolName, block, inspect, t: t2 }) {
1824
2089
  const [open, setOpen] = React.useState(false);
1825
2090
  const view = derivePtcToolView(block, toolName);
@@ -1851,7 +2116,7 @@
1851
2116
  "div",
1852
2117
  { className: "ptcPlusToolSection" },
1853
2118
  h("span", { className: "ptcPlusToolSectionLabel" }, t2("tool.source")),
1854
- typeof CodeBlock === "function" ? h(CodeBlock, {
2119
+ isHostComponent(CodeBlock) ? h(CodeBlock, {
1855
2120
  code: view.code,
1856
2121
  lang: "typescript",
1857
2122
  className: "ptcPlusToolCode",
@@ -1905,6 +2170,11 @@
1905
2170
  expandOnRowClick: true,
1906
2171
  previewChevron: false,
1907
2172
  keepContentWhenOpen: true,
2173
+ className: "ptcPlusToolDisclosure",
2174
+ rowClassName: "ptcPlusToolRow",
2175
+ contentClassName: "ptcPlusToolDisclosureContent",
2176
+ contentLayoutClassName: "ptcPlusToolDisclosureLayout",
2177
+ titleClassName: "ptcPlusToolTitle",
1908
2178
  collapsedContent,
1909
2179
  children: body
1910
2180
  })
@@ -2025,8 +2295,8 @@
2025
2295
  function featureEnabled(snapshot2, feature) {
2026
2296
  const rule = FEATURE_SETTINGS[feature];
2027
2297
  if (rule === void 0) throw new Error(`Unknown client feature: ${feature}`);
2028
- if (snapshot2?.status !== "ready" || snapshot2.value?.enabled !== true) return false;
2029
- const value = snapshot2.value;
2298
+ const value = snapshot2?.status === "ready" && snapshot2.value !== void 0 ? snapshot2.value : CONFIG_DEFAULTS;
2299
+ if (value.enabled === false) return false;
2030
2300
  return rule.every((key) => value[key] !== false);
2031
2301
  }
2032
2302
  function registerGated(scope, { subscribe, isEnabled, register }) {
@@ -2055,7 +2325,6 @@
2055
2325
  function createPtcSettingsView(React, deps) {
2056
2326
  const { ActionButton, BindingsDialog, Modal, useWorkbenchController, icons } = deps;
2057
2327
  const h = React.createElement;
2058
- const focusableSelector = 'button:not(:disabled),input:not(:disabled),textarea:not(:disabled),select:not(:disabled),[href],[tabindex]:not([tabindex="-1"]),[contenteditable=true],summary';
2059
2328
  function fieldInput(field, value, disabled, onChange, label) {
2060
2329
  if (field.type === "boolean") {
2061
2330
  return h("input", {
@@ -2065,6 +2334,7 @@
2065
2334
  checked: value === true,
2066
2335
  disabled,
2067
2336
  "aria-label": label,
2337
+ "data-modal-autofocus": field.key === "enabled" && !disabled ? true : void 0,
2068
2338
  onChange: (event) => onChange(field, event.target.checked)
2069
2339
  });
2070
2340
  }
@@ -2262,30 +2532,7 @@
2262
2532
  }
2263
2533
  function PTCPlusSettingsDialog(props) {
2264
2534
  const { t: t2, onClose } = props;
2265
- const body = React.useRef(null);
2266
2535
  const [bindingsOpen, setBindingsOpen] = React.useState(false);
2267
- React.useEffect(() => {
2268
- const dialog = body.current?.closest("[role=dialog]");
2269
- const target = body.current?.querySelector(focusableSelector) ?? dialog?.querySelector(focusableSelector);
2270
- target?.focus({ preventScroll: true });
2271
- }, []);
2272
- React.useEffect(() => {
2273
- const trapFocus = (event) => {
2274
- if (event.key !== "Tab" || bindingsOpen) return;
2275
- const dialog = body.current?.closest("[role=dialog]");
2276
- if (dialog === void 0 || dialog === null) return;
2277
- const controls = [...dialog.querySelectorAll(focusableSelector)].filter((element) => !element.closest('[hidden], [inert], [aria-hidden="true"]'));
2278
- const first = controls[0];
2279
- const last2 = controls.at(-1);
2280
- const active = document.activeElement;
2281
- if (!dialog.contains(active) || event.shiftKey && active === first || !event.shiftKey && active === last2) {
2282
- event.preventDefault();
2283
- (event.shiftKey ? last2 : first)?.focus({ preventScroll: true });
2284
- }
2285
- };
2286
- document.addEventListener("keydown", trapFocus);
2287
- return () => document.removeEventListener("keydown", trapFocus);
2288
- }, [bindingsOpen]);
2289
2536
  const close = () => {
2290
2537
  if (!bindingsOpen) onClose();
2291
2538
  };
@@ -2299,142 +2546,29 @@
2299
2546
  contentClassName: "ptcPlusSettingsDialogContent"
2300
2547
  }, h(
2301
2548
  "div",
2302
- { className: "ptcPlusSettingsDialog", ref: body },
2549
+ { className: "ptcPlusSettingsDialog" },
2303
2550
  h(PTCPlusSettingsCard, { ...props, view: "dialog", onBindingsOpenChange: setBindingsOpen })
2304
2551
  ));
2305
2552
  }
2306
2553
  return { PTCPlusSettingsCard, PTCPlusSettingsDialog };
2307
2554
  }
2308
2555
 
2309
- // src/client-host-compat.js
2310
- var HOST_ICON_EXPORTS = Object.freeze({
2311
- check: ["IconCheckOutlineRegular", "IconCheckOutline14"],
2312
- chevron: ["IconChevronDownOutlineRegular", "IconChevronDownOutline14"],
2313
- inspect: ["IconInspectOutlineRegular", "IconInspectOutline12"],
2314
- sparkle: ["IconSparkleRegular", "IconSparkle16"],
2315
- close: ["IconCloseOutlineRegular", "IconCloseOutline16"],
2316
- search: ["IconSearchOutlineRegular", "IconSearchOutline16"],
2317
- plus: ["IconPlusOutlineRegular", "IconPlusOutline16"],
2318
- refresh: ["IconRefreshOutlineRegular", "IconRefreshOutline16"],
2319
- trash: ["IconTrashOutlineRegular", "IconTrashOutline16"],
2320
- edit: ["IconEditOutlineRegular", "IconEditOutline16"],
2321
- play: ["IconPlayOutlineRegular", "IconPlayOutline16"],
2322
- stop: ["IconStopFillRegular", "IconStopFill16"]
2323
- });
2324
- var ABSENT_HOST_ICON = () => null;
2325
- ABSENT_HOST_ICON.absentHostIcon = true;
2326
- function isHostIconComponent(icon) {
2327
- return typeof icon === "function" && icon.absentHostIcon !== true;
2328
- }
2329
- function hostIconComponents(primitives) {
2330
- return Object.fromEntries(Object.entries(HOST_ICON_EXPORTS).map(([name2, candidates]) => [
2331
- name2,
2332
- candidates.map((candidate) => primitives?.[candidate]).find((value) => typeof value === "function") ?? ABSENT_HOST_ICON
2333
- ]));
2334
- }
2335
- var MENU_CHILDREN_PROBE_SENTINEL = "ptcPlusMenuChildrenProbe";
2336
- function readMenuChildrenProbe(container) {
2337
- if (container === null || container === void 0) return false;
2338
- return container.querySelector(`.${MENU_CHILDREN_PROBE_SENTINEL}`) !== null;
2339
- }
2340
- function createMenuChildrenEvidence() {
2341
- let supported;
2342
- return {
2343
- supported: () => supported,
2344
- record(value) {
2345
- supported ??= value === true;
2346
- }
2347
- };
2348
- }
2349
- function sessionPresetValue(projected, summary) {
2350
- if (projected !== void 0) return projected;
2351
- const values = summary?.projectionValues;
2352
- return values !== void 0 && Object.hasOwn(values, "agentPreset") ? values.agentPreset : summary?.agentPreset;
2353
- }
2354
- function currentSessionId(snapshot2, remembered) {
2355
- if (snapshot2?.current !== void 0) return snapshot2.current;
2356
- const held = (id2) => id2 !== void 0 && (snapshot2?.byId?.[id2]?.retainedBy?.mainView ?? 0) > 0;
2357
- if (held(remembered)) return remembered;
2358
- for (const row of Object.values(snapshot2?.byId ?? {})) {
2359
- if ((row?.retainedBy?.mainView ?? 0) > 0) return row.id;
2360
- }
2361
- return void 0;
2362
- }
2363
- function sessionUsesPtcPreset(preset) {
2364
- return preset === "ptc" || preset === "code";
2365
- }
2366
- function useSessionPreset({ sessionId, useProjection, useSessions }) {
2367
- const projected = useProjection("agentPreset");
2368
- return typeof useSessions === "function" ? useSessions((state) => sessionPresetValue(projected, state.byId?.[sessionId])) : projected;
2369
- }
2370
- function watchCurrentSessionPreset(sessions, listener) {
2371
- let source;
2372
- let unsubscribeProjection;
2373
- let selected;
2374
- const sync = () => {
2375
- const snapshot2 = sessions.list.getSnapshot();
2376
- const current = currentSessionId(snapshot2, selected);
2377
- selected = current;
2378
- const summary = current === void 0 ? void 0 : snapshot2.byId?.[current];
2379
- const next = current === void 0 ? void 0 : sessions.binding?.(current)?.session?.projections?.faceOf?.("agentPreset");
2380
- if (source !== next) {
2381
- unsubscribeProjection?.();
2382
- source = next;
2383
- unsubscribeProjection = source?.subscribe(sync);
2384
- }
2385
- listener(sessionPresetValue(source?.getSnapshot(), summary));
2386
- };
2387
- const unsubscribeList = sessions.list.subscribe(sync);
2388
- const dispose = () => {
2389
- unsubscribeList();
2390
- unsubscribeProjection?.();
2391
- };
2392
- try {
2393
- sync();
2394
- } catch (error) {
2395
- dispose();
2396
- throw error;
2397
- }
2398
- return dispose;
2399
- }
2400
- function isIdleSessionComposer(owner, sessionId) {
2401
- return Object.hasOwn(owner, "sessionId") ? owner.sessionId === sessionId && owner.pendingInteraction === void 0 : owner.session?.sessionId === sessionId && Array.isArray(owner.interactions) && owner.interactions.length === 0;
2402
- }
2403
- var BUNDLE_PATCH_ROW_ID = "ptc-plus";
2404
- function settingsCardSeats(bundleName) {
2405
- return [
2406
- { slot: "settings.plugin.item", identity: { key: SETTINGS_NAMESPACE } },
2407
- { slot: "plugins.row.config", identity: { key: `${bundleName}#${BUNDLE_PATCH_ROW_ID}` } }
2408
- ];
2409
- }
2410
- function publishSettingsCard(ctx, { bundleName, locale, injectProps, component }) {
2411
- let live;
2412
- const releases = settingsCardSeats(bundleName).map(({ slot, identity }) => ctx.slots.inject(
2413
- slot,
2414
- () => {
2415
- live = slot;
2416
- return ctx.slots.register({ name: slot, ...identity, locale, inject: injectProps }, component);
2417
- }
2418
- ));
2419
- return { seat: () => live, releases };
2420
- }
2421
-
2422
- // src/client-repl-view.js
2423
- function createReplView(React, deps) {
2424
- const {
2425
- CodeBlock,
2426
- featureEnabled: featureEnabled2,
2427
- normalizeReplMemorySnapshot: normalizeReplMemorySnapshot2,
2428
- unavailableReplMemorySnapshot: unavailableReplMemorySnapshot2,
2429
- useSessionPreset: useSessionPreset2,
2430
- sessionUsesPtcPreset: sessionUsesPtcPreset2,
2431
- useWorkbenchController,
2432
- UserBindingsWorkbench,
2433
- icons: { search: IconSearchOutline16, chevron: IconChevronDownOutline14 }
2434
- } = deps;
2435
- const h = React.createElement;
2436
- function ReplComposer() {
2437
- return null;
2556
+ // src/client-repl-view.js
2557
+ function createReplView(React, deps) {
2558
+ const {
2559
+ CodeBlock,
2560
+ featureEnabled: featureEnabled2,
2561
+ normalizeReplMemorySnapshot: normalizeReplMemorySnapshot2,
2562
+ unavailableReplMemorySnapshot: unavailableReplMemorySnapshot2,
2563
+ useSessionPreset: useSessionPreset2,
2564
+ sessionUsesPtcPreset: sessionUsesPtcPreset2,
2565
+ useWorkbenchController,
2566
+ UserBindingsWorkbench,
2567
+ icons: { search: IconSearchOutline16, chevron: IconChevronDownOutline14 }
2568
+ } = deps;
2569
+ const h = React.createElement;
2570
+ function ReplComposer() {
2571
+ return null;
2438
2572
  }
2439
2573
  function ReplBindingInspector({ entry, preview, t: t2 }) {
2440
2574
  const readable = preview?.status === "readable";
@@ -2448,7 +2582,7 @@
2448
2582
  h("span", null, t2("memory.location", entry.definition))
2449
2583
  ),
2450
2584
  h("div", { className: "ptcPlusObservationLabel" }, t2("console.definition")),
2451
- typeof CodeBlock === "function" ? h(CodeBlock, {
2585
+ isHostComponent(CodeBlock) ? h(CodeBlock, {
2452
2586
  code: entry.definition.source,
2453
2587
  lang: "typescript",
2454
2588
  className: "ptcPlusObservationCode",
@@ -2813,7 +2947,7 @@
2813
2947
  line: binding.definition.line,
2814
2948
  column: binding.definition.column
2815
2949
  })),
2816
- typeof CodeBlock === "function" ? h(CodeBlock, {
2950
+ isHostComponent(CodeBlock) ? h(CodeBlock, {
2817
2951
  code: binding.definition.source,
2818
2952
  lang: "typescript",
2819
2953
  className: "ptcPlusReplCode",
@@ -3350,6 +3484,7 @@
3350
3484
  };
3351
3485
  const review = {
3352
3486
  getSnapshot: () => snapshot2,
3487
+ isCurrentCandidate: (candidate) => !disposed && attached && snapshot2.action === null && sameCandidate(snapshot2.candidate, candidate),
3353
3488
  subscribe(listener) {
3354
3489
  listeners.add(listener);
3355
3490
  return () => listeners.delete(listener);
@@ -3411,9 +3546,12 @@
3411
3546
  ActionButton,
3412
3547
  IconButton,
3413
3548
  Menu,
3549
+ MenuFallback,
3414
3550
  Toast,
3415
3551
  Tooltip,
3416
3552
  CodeBlock,
3553
+ Modal,
3554
+ createPortal,
3417
3555
  BindingsDialog,
3418
3556
  PTCPlusSettingsDialog,
3419
3557
  useWorkbenchController,
@@ -3432,6 +3570,44 @@
3432
3570
  }
3433
3571
  } = deps;
3434
3572
  const h = React.createElement;
3573
+ function EnlargeIcon() {
3574
+ return h(
3575
+ "svg",
3576
+ { width: 16, height: 16, viewBox: "0 0 16 16", fill: "none", "aria-hidden": true },
3577
+ h("path", {
3578
+ d: "M6 2H2v4m8-4h4v4M2 10v4h4m8-4v4h-4",
3579
+ stroke: "currentColor",
3580
+ strokeWidth: 1.5,
3581
+ strokeLinecap: "round",
3582
+ strokeLinejoin: "round"
3583
+ })
3584
+ );
3585
+ }
3586
+ function RestoreIcon() {
3587
+ return h(
3588
+ "svg",
3589
+ { width: 16, height: 16, viewBox: "0 0 16 16", fill: "none", "aria-hidden": true },
3590
+ h("path", {
3591
+ d: "M2 6h4V2m4 0v4h4M6 14v-4H2m12 0h-4v4",
3592
+ stroke: "currentColor",
3593
+ strokeWidth: 1.5,
3594
+ strokeLinecap: "round",
3595
+ strokeLinejoin: "round"
3596
+ })
3597
+ );
3598
+ }
3599
+ function ReviewCloseIcon() {
3600
+ return h(
3601
+ "svg",
3602
+ { width: 16, height: 16, viewBox: "0 0 16 16", fill: "none", "aria-hidden": true },
3603
+ h("path", {
3604
+ d: "m4 4 8 8m0-8-8 8",
3605
+ stroke: "currentColor",
3606
+ strokeWidth: 1.5,
3607
+ strokeLinecap: "round"
3608
+ })
3609
+ );
3610
+ }
3435
3611
  const settingsPath = (t2) => t2({
3436
3612
  "settings.plugin.item": "settings.pathSettings",
3437
3613
  "plugins.row.config": "settings.pathPlugins"
@@ -3453,10 +3629,10 @@
3453
3629
  anchorRef.current = element;
3454
3630
  review.access = element;
3455
3631
  }, [review]);
3456
- const firstItemRef = React.useRef(null);
3457
- const manageItemRef = React.useRef(null);
3632
+ const menuBodyRef = React.useRef(null);
3458
3633
  const reloadItemRef = React.useRef(null);
3459
- const settingsItemRef = React.useRef(null);
3634
+ const disabledGroupRef = React.useRef(null);
3635
+ const [disabledOpen, setDisabledOpen] = React.useState(false);
3460
3636
  const focused = React.useRef(false);
3461
3637
  const dialogReturnFocus = React.useRef(null);
3462
3638
  const hoverTimer = React.useRef(void 0);
@@ -3517,7 +3693,10 @@
3517
3693
  React.useEffect(() => cancelHoverOpen, [cancelHoverOpen]);
3518
3694
  const showMenu = (mode) => {
3519
3695
  cancelHoverOpen();
3520
- if (!menuOpen && quickAccess) void refreshCatalog();
3696
+ if (!menuOpen) {
3697
+ setDisabledOpen(false);
3698
+ if (quickAccess) void refreshCatalog();
3699
+ }
3521
3700
  setMenu({ key: view.candidateKey, mode, step: "root" });
3522
3701
  };
3523
3702
  const hoverMenu = (event) => {
@@ -3528,10 +3707,19 @@
3528
3707
  showMenu("hover");
3529
3708
  }, HOVER_DWELL_MS);
3530
3709
  };
3531
- const menuElement = () => manageItemRef.current?.closest("[role=menu]") ?? firstItemRef.current?.closest("[role=menu]");
3710
+ const menuElement = () => menuBodyRef.current;
3532
3711
  const captureCatalogFocus = () => {
3533
3712
  catalogFocus.current = menuElement()?.contains(document.activeElement) ? document.activeElement : null;
3534
3713
  };
3714
+ const focusMenuItem = (next) => {
3715
+ next?.focus({ preventScroll: true });
3716
+ const scroll = menuElement()?.querySelector(".ptcPlusBindingMenuScroll");
3717
+ if (!scroll?.contains(next)) return;
3718
+ const viewport = scroll.getBoundingClientRect();
3719
+ const item = next.getBoundingClientRect();
3720
+ const offset = item.height > scroll.clientHeight ? item.top + item.height / 2 - (viewport.top + viewport.height / 2) : item.top < viewport.top ? item.top - viewport.top : item.bottom > viewport.bottom ? item.bottom - viewport.bottom : 0;
3721
+ scroll.scrollTop += offset;
3722
+ };
3535
3723
  const menuAnchorRect = () => {
3536
3724
  const anchor = anchorRef.current;
3537
3725
  if (!anchor) return null;
@@ -3574,17 +3762,18 @@
3574
3762
  }
3575
3763
  if (catalogStatus === "writing" || catalogStatus === "loading") return;
3576
3764
  const target = catalogFocus.current;
3577
- catalogFocus.current = null;
3578
- if (!target || document.activeElement !== document.body) return;
3765
+ if (!target || document.activeElement !== document.body && document.activeElement !== target) return;
3579
3766
  const root = menuElement();
3580
- const next = root?.contains(target) && !target.disabled ? target : reloadItemRef.current?.closest("button") ?? root?.querySelector("button:not(:disabled)");
3581
- next?.focus({ preventScroll: true });
3767
+ const bindingId = target.dataset.bindingId;
3768
+ const currentRow = bindingId === void 0 ? null : [...root?.querySelectorAll("[data-binding-id]") ?? []].find((row) => row.dataset.bindingId === bindingId);
3769
+ const next = root?.contains(target) && !target.disabled ? target : currentRow ?? (bindingId !== void 0 && catalog?.entries.some((entry) => entry.id === bindingId && !entry.enabled) ? disabledGroupRef.current : null) ?? reloadItemRef.current ?? root?.querySelector("button:not(:disabled)");
3770
+ focusMenuItem(next);
3582
3771
  }, [catalogStatus, menuOpen]);
3583
3772
  React.useLayoutEffect(() => {
3584
3773
  if (!menuOpen || menu.mode === "hover") return;
3585
3774
  let cancelled = false;
3586
3775
  queueMicrotask(() => {
3587
- if (!cancelled && anchorRef.current?.getClientRects().length) menuElement()?.querySelector("button:not(:disabled)")?.focus({ preventScroll: true });
3776
+ if (!cancelled && anchorRef.current?.getClientRects().length) focusMenuItem(menuElement()?.querySelector("button:not(:disabled)"));
3588
3777
  });
3589
3778
  return () => {
3590
3779
  cancelled = true;
@@ -3597,7 +3786,7 @@
3597
3786
  setProbing(false);
3598
3787
  }, [probing, menuChildren]);
3599
3788
  React.useEffect(() => {
3600
- if (toast === null || typeof Toast === "function") return void 0;
3789
+ if (toast === null || isHostComponent(Toast)) return void 0;
3601
3790
  const timer = setTimeout(() => setToast(null), 2500);
3602
3791
  return () => clearTimeout(timer);
3603
3792
  }, [toast]);
@@ -3622,7 +3811,7 @@
3622
3811
  className: "ptcPlusAuthorButton",
3623
3812
  "aria-label": label,
3624
3813
  // Older UI-kit lines ship no Tooltip primitive; the native title carries the hint there.
3625
- title: typeof Tooltip === "function" || menuOpen || managing || settingsOpen ? void 0 : hint,
3814
+ title: isHostComponent(Tooltip) || menuOpen || managing || settingsOpen ? void 0 : hint,
3626
3815
  "aria-haspopup": "menu",
3627
3816
  "aria-expanded": menuOpen,
3628
3817
  onPointerEnter: hoverMenu,
@@ -3645,23 +3834,58 @@
3645
3834
  "data-attention": view.message !== null
3646
3835
  }, "1") : null
3647
3836
  );
3837
+ const catalogRow = (entry) => ({
3838
+ id: `global:${entry.id}`,
3839
+ bindingId: entry.id,
3840
+ disabled: catalog === null,
3841
+ label: h(
3842
+ "span",
3843
+ { className: "ptcPlusBindingQuickRow", "data-enabled": entry.enabled },
3844
+ h(
3845
+ "span",
3846
+ { className: "ptcPlusBindingQuickName" },
3847
+ h("strong", { title: entry.name }, entry.name),
3848
+ h("span", { className: "ptcPlusBindingQuickState" }, t2(entry.enabled ? "bindings.enabled" : "bindings.disabledEntry"))
3849
+ ),
3850
+ h("span", { className: "ptcPlusBindingQuickPurpose", title: entry.purpose }, entry.purpose)
3851
+ )
3852
+ });
3853
+ const enabledEntries = (catalog?.entries ?? []).filter((entry) => entry.enabled);
3854
+ const disabledEntries = (catalog?.entries ?? []).filter((entry) => !entry.enabled);
3648
3855
  const catalogItems = !quickAccess ? [] : [
3649
3856
  { id: "global-heading", type: "label", text: t2("bindings.quickHeading") },
3650
- ...(catalog?.entries ?? []).map((entry) => ({
3651
- id: `global:${entry.id}`,
3652
- disabled: catalog === null,
3653
- label: h(
3654
- "span",
3655
- { className: "ptcPlusBindingQuickRow", "data-enabled": entry.enabled },
3656
- h(
3657
- "span",
3658
- { className: "ptcPlusBindingQuickName" },
3659
- h("strong", { title: entry.name }, entry.name),
3660
- h("span", { className: "ptcPlusBindingQuickState" }, t2(entry.enabled ? "bindings.enabled" : "bindings.disabledEntry"))
3661
- ),
3662
- h("span", { className: "ptcPlusBindingQuickPurpose", title: entry.purpose }, entry.purpose)
3663
- )
3664
- })),
3857
+ ...catalog === null || catalog.entries.length === 0 ? [] : [
3858
+ { id: "enabled-heading", type: "label", text: t2("bindings.quickEnabled", { count: enabledEntries.length }) },
3859
+ ...enabledEntries.map(catalogRow),
3860
+ ...enabledEntries.length === 0 ? [{ id: "no-enabled", type: "label", text: t2("bindings.quickNoEnabled") }] : [],
3861
+ ...disabledEntries.length === 0 ? [] : [
3862
+ { id: "disabled-group", label: h(
3863
+ React.Fragment,
3864
+ null,
3865
+ h(
3866
+ "svg",
3867
+ {
3868
+ className: "ptcPlusMenuGroupChevron",
3869
+ "aria-hidden": true,
3870
+ width: 14,
3871
+ height: 14,
3872
+ viewBox: "0 0 14 14",
3873
+ fill: "none",
3874
+ "data-expanded": disabledOpen
3875
+ },
3876
+ h("path", {
3877
+ d: "m5 3 4 4-4 4",
3878
+ stroke: "currentColor",
3879
+ strokeWidth: 1.5,
3880
+ strokeLinecap: "round",
3881
+ strokeLinejoin: "round"
3882
+ })
3883
+ ),
3884
+ h("span", null, t2("bindings.quickDisabled", { count: disabledEntries.length }))
3885
+ ) },
3886
+ ...disabledOpen ? disabledEntries.map(catalogRow) : []
3887
+ ]
3888
+ ],
3665
3889
  ...catalog !== null && catalog.entries.length === 0 ? [{ id: "empty", type: "label", text: t2("memory.globalEmpty") }] : [],
3666
3890
  ...catalog === null && catalogStatus !== "error" ? [{ id: "pending", type: "label", text: t2(catalogStatus === "writing" ? "bindings.quickSaving" : "bindings.quickLoading") }] : [],
3667
3891
  ...catalogError === null ? [] : [{ id: "error", type: "label", text: t2("bindings.failed", { error: catalogError }) }]
@@ -3682,13 +3906,14 @@
3682
3906
  ),
3683
3907
  h("span", { className: "ptcPlusBindingQuickPurpose", title: entry.purpose }, entry.purpose)
3684
3908
  )
3685
- })),
3686
- // The back row also anchors menu lookup, so the step still owns its list
3687
- // when the catalog is momentarily empty.
3688
- { id: "edit-back", label: h("span", { className: "ptcPlusBindingMenuAction", ref: firstItemRef }, t2("bindings.back")) }
3909
+ }))
3689
3910
  ];
3690
3911
  const selectMenuItem = (id2) => {
3691
3912
  if (!anchorRef.current?.getClientRects().length) return;
3913
+ if (id2 === "disabled-group") {
3914
+ setDisabledOpen((open) => !open);
3915
+ return;
3916
+ }
3692
3917
  if (id2 === "edit") {
3693
3918
  setMenu((current) => current === null ? current : { ...current, step: "edit" });
3694
3919
  return;
@@ -3723,17 +3948,16 @@
3723
3948
  setManaging(true);
3724
3949
  } else if (id2 === view.candidateKey) openBindingReview(review, view.candidate);
3725
3950
  };
3726
- const actionCopy = (id2, copy, ref) => h("span", {
3727
- ref,
3951
+ const actionCopy = (id2, copy) => h("span", {
3728
3952
  className: "ptcPlusBindingMenuAction",
3729
3953
  title: id2 === "settings" ? settingsPath(t2) : void 0
3730
3954
  }, t2(copy));
3731
- const actionButton = (id2, copy, ref) => h("button", {
3955
+ const actionButton = (id2, copy) => h("button", {
3732
3956
  type: "button",
3733
3957
  role: "menuitem",
3734
3958
  className: "ptcPlusMenuButton",
3735
3959
  onClick: () => selectMenuItem(id2)
3736
- }, actionCopy(id2, copy, ref));
3960
+ }, actionCopy(id2, copy));
3737
3961
  const actionSections = [
3738
3962
  canAuthor ? h(
3739
3963
  "div",
@@ -3749,16 +3973,50 @@
3749
3973
  h(
3750
3974
  "div",
3751
3975
  { key: "utilities", className: "ptcPlusMenuUtilities" },
3752
- quickAccess ? actionButton("manage", "bindings.manage", manageItemRef) : null,
3753
- actionButton("settings", "settings.menuEntry", settingsItemRef)
3976
+ quickAccess ? actionButton("manage", "bindings.manage") : null,
3977
+ actionButton("settings", "settings.menuEntry")
3754
3978
  )
3755
3979
  ];
3756
- const actionsInRegion = menu?.step === "edit" ? null : h("div", { className: "ptcPlusMenuActions" }, actionSections);
3757
- const actionsPinned = menuChildrenRegion || menu?.step === "edit" ? [] : [{
3758
- id: "ptc-plus-actions",
3759
- type: "label",
3760
- text: h("div", { className: "ptcPlusMenuActions ptcPlusMenuActionsPinned" }, actionSections)
3761
- }];
3980
+ const menuEntries = menu?.step === "edit" ? editItems : [
3981
+ ...hasDraft ? [{ id: "draft-heading", type: "label", text: t2("bindings.quickDrafts") }, {
3982
+ id: view.candidateKey,
3983
+ label: h(
3984
+ "span",
3985
+ { className: "ptcPlusDraftMenuItem" },
3986
+ h("strong", null, view.candidate.entry.name),
3987
+ h("span", null, t2(bindingReviewStatus(view)))
3988
+ )
3989
+ }, ...quickAccess ? [{ id: "draft-separator", type: "separator" }] : []] : [],
3990
+ ...catalogItems,
3991
+ ...quickAccess && catalogError !== null ? [{ id: "reload", label: t2("bindings.reload") }] : []
3992
+ ];
3993
+ const menuContent = h(
3994
+ "div",
3995
+ {
3996
+ className: "ptcPlusBindingMenuContent",
3997
+ ref: menuBodyRef,
3998
+ // A reopened menu can acquire foreground focus while an earlier write is
3999
+ // pending. Recovery follows the live menu, not the initiating operation.
4000
+ onFocusCapture: (event) => {
4001
+ catalogFocus.current = event.target;
4002
+ },
4003
+ onBlurCapture: (event) => {
4004
+ if (!event.currentTarget.contains(event.relatedTarget)) catalogFocus.current = null;
4005
+ }
4006
+ },
4007
+ h("div", { className: "ptcPlusBindingMenuScroll" }, ...menuEntries.map((entry) => entry.type === "separator" ? h("div", { key: entry.id, role: "separator", className: "ptcPlusOwnedMenuSeparator" }) : entry.type === "label" ? h("div", { key: entry.id, className: "ptcPlusMenuGroupLabel" }, entry.text) : h("button", {
4008
+ key: entry.id,
4009
+ type: "button",
4010
+ role: "menuitem",
4011
+ className: "ptcPlusOwnedMenuRow",
4012
+ disabled: entry.disabled,
4013
+ "data-binding-id": entry.bindingId,
4014
+ ref: entry.id === "reload" ? reloadItemRef : entry.id === "disabled-group" ? disabledGroupRef : void 0,
4015
+ "aria-expanded": entry.id === "disabled-group" ? disabledOpen : void 0,
4016
+ onClick: () => selectMenuItem(entry.id)
4017
+ }, entry.label))),
4018
+ h("div", { className: "ptcPlusMenuActions" }, menu?.step === "edit" ? h("div", { className: "ptcPlusMenuUtilities" }, actionButton("edit-back", "bindings.back")) : actionSections)
4019
+ );
3762
4020
  return h(
3763
4021
  "span",
3764
4022
  {
@@ -3773,38 +4031,22 @@
3773
4031
  "data-text": isHostIconComponent(IconSparkle16) ? void 0 : true,
3774
4032
  ref: attachAnchor
3775
4033
  },
3776
- !hasDraft && !quickAccess ? null : h(Menu, {
4034
+ !hasDraft && !quickAccess ? null : h(menuChildrenRegion ? Menu : MenuFallback, {
3777
4035
  className: "ptcPlusAuthorButtonShell",
3778
4036
  open: menuOpen,
3779
- anchor: typeof Tooltip === "function" ? h(Tooltip, { label: hint, delayMs: 700, disabled: menuOpen || managing || settingsOpen }, starButton) : starButton,
4037
+ anchor: isHostComponent(Tooltip) ? h(Tooltip, { label: hint, delayMs: 700, disabled: menuOpen || managing || settingsOpen }, starButton) : starButton,
3780
4038
  portal: true,
3781
4039
  side: "top",
3782
4040
  dense: true,
4041
+ listClassName: "ptcPlusBindingMenu",
3783
4042
  // A hovered menu leaves with the pointer once it leaves the trigger and the
3784
4043
  // list for the published grace, which re-entering either cancels; click and
3785
4044
  // keyboard menus stay until dismissed.
3786
4045
  closeOnPointerLeave: menu !== null && menu.mode === "hover",
3787
4046
  getAnchorRect: menuAnchorRect,
3788
4047
  onClose: hideMenu,
3789
- items: menu?.step === "edit" ? editItems : [
3790
- ...hasDraft ? [
3791
- { id: "draft-heading", type: "label", text: t2("bindings.quickDrafts") },
3792
- {
3793
- id: view.candidateKey,
3794
- label: h(
3795
- "span",
3796
- { className: "ptcPlusDraftMenuItem", ref: firstItemRef },
3797
- h("strong", null, view.candidate.entry.name),
3798
- h("span", null, t2(bindingReviewStatus(view)))
3799
- )
3800
- },
3801
- ...quickAccess ? [{ id: "draft-separator", type: "separator" }] : []
3802
- ] : [],
3803
- ...catalogItems,
3804
- ...quickAccess && catalogError !== null ? [{ id: "reload", label: h("span", { ref: reloadItemRef }, t2("bindings.reload")) }] : []
3805
- ],
3806
- children: actionsInRegion,
3807
- ...actionsPinned.length === 0 ? {} : { footer: actionsPinned },
4048
+ items: [],
4049
+ children: menuContent,
3808
4050
  onSelect: selectMenuItem
3809
4051
  }),
3810
4052
  // The probe mounts the host Menu's own `children` region inside a hidden
@@ -3841,7 +4083,7 @@
3841
4083
  queueMicrotask(() => anchorRef.current?.querySelector(".ptcPlusAuthorButton")?.focus({ preventScroll: true }));
3842
4084
  }
3843
4085
  }) : null,
3844
- toast === null ? null : typeof Toast === "function" ? h(Toast, {
4086
+ toast === null ? null : isHostComponent(Toast) ? h(Toast, {
3845
4087
  key: toast.sequence,
3846
4088
  text: toast.text,
3847
4089
  anchor: anchorRef.current,
@@ -3862,7 +4104,7 @@
3862
4104
  showName ? h("strong", null, candidate.entry.name) : null,
3863
4105
  h("span", { className: "ptcPlusBindingMeta" }, `${candidate.entry.scope} - ${candidate.entry.symbols.join(", ")}`),
3864
4106
  candidate.entry.purpose ? h("p", { className: "ptcPlusMessage" }, candidate.entry.purpose) : null,
3865
- typeof CodeBlock === "function" ? h(CodeBlock, {
4107
+ isHostComponent(CodeBlock) ? h(CodeBlock, {
3866
4108
  code: candidate.entry.source,
3867
4109
  lang: "typescript",
3868
4110
  className: "ptcPlusBindingCommandCode",
@@ -3903,20 +4145,15 @@
3903
4145
  }
3904
4146
  function focusComposer(anchor) {
3905
4147
  if (!anchor || anchor.getClientRects().length === 0) return;
3906
- for (let parent = anchor.parentElement; parent; parent = parent.parentElement) {
3907
- const editable2 = [...parent.querySelectorAll('textarea, [contenteditable="true"]')].find((element) => element.getClientRects().length > 0 && !element.disabled);
3908
- if (editable2) {
3909
- editable2.focus({ preventScroll: true });
3910
- return;
3911
- }
3912
- }
3913
4148
  anchor.focus({ preventScroll: true });
3914
4149
  }
3915
- function openBindingReview(review, candidate = review.getSnapshot().candidate) {
3916
- if (!review.display("expanded", candidate)) return;
4150
+ function openBindingReview(review, candidate = review.getSnapshot().candidate, visibility = "enlarged") {
4151
+ if (!review.display(visibility, candidate)) return;
3917
4152
  requestAnimationFrame(() => {
3918
- if (review.getSnapshot().candidate === candidate && review.panel?.getClientRects().length) {
3919
- review.panel.focus({ preventScroll: true });
4153
+ const current = review.getSnapshot();
4154
+ if (review.isCurrentCandidate(candidate) && current.reachable && current.visibility === "expanded" && review.panel?.getClientRects().length) {
4155
+ if (review.previewAvailable === false) focusBindingReviewAccess(review);
4156
+ else review.panel.focus({ preventScroll: true });
3920
4157
  }
3921
4158
  });
3922
4159
  }
@@ -3926,60 +4163,6 @@
3926
4163
  if (button?.getClientRects().length) button.focus({ preventScroll: true });
3927
4164
  else focusComposer(anchor);
3928
4165
  }
3929
- function fitBindingReview(panel) {
3930
- const body = panel?.querySelector(".ptcPlusBindingDockBody");
3931
- const anchor = panel?.parentElement;
3932
- if (!anchor || typeof ResizeObserver !== "function") return void 0;
3933
- const ancestors = [];
3934
- let seat = panel;
3935
- let viewport;
3936
- for (let parent = panel.parentElement; parent; parent = parent.parentElement) {
3937
- ancestors.push(parent);
3938
- if (/auto|scroll|hidden|clip/.test(getComputedStyle(parent).overflowY)) {
3939
- viewport = parent;
3940
- break;
3941
- }
3942
- seat = parent;
3943
- }
3944
- if (!viewport) return void 0;
3945
- let frame;
3946
- const update = () => {
3947
- if (!panel.getClientRects().length) return;
3948
- const top2 = Math.max(
3949
- viewport.getBoundingClientRect().top + viewport.clientTop,
3950
- window.visualViewport?.offsetTop ?? 0
3951
- );
3952
- const offset = anchor.getBoundingClientRect().bottom - seat.getBoundingClientRect().top + 8;
3953
- panel.style.setProperty("--ptc-plus-review-offset", `${Math.max(8, Math.ceil(offset))}px`);
3954
- const room = Math.max(0, seat.getBoundingClientRect().top - top2 - 16);
3955
- panel.style.setProperty("--ptc-plus-review-height", `${Math.floor(room)}px`);
3956
- if (body) {
3957
- const chrome2 = panel.scrollHeight - body.offsetHeight + 2;
3958
- const available = Math.max(0, room - chrome2);
3959
- panel.dataset.scroll = available < 80 ? "panel" : "body";
3960
- body.style.setProperty("--ptc-plus-review-space", `${Math.floor(available)}px`);
3961
- }
3962
- };
3963
- const schedule = () => {
3964
- cancelAnimationFrame(frame);
3965
- frame = requestAnimationFrame(update);
3966
- };
3967
- const observer = new ResizeObserver(schedule);
3968
- for (const element of [panel, ...panel.children, ...ancestors]) observer.observe(element);
3969
- window.visualViewport?.addEventListener("resize", schedule);
3970
- window.visualViewport?.addEventListener("scroll", schedule);
3971
- update();
3972
- return () => {
3973
- observer.disconnect();
3974
- cancelAnimationFrame(frame);
3975
- window.visualViewport?.removeEventListener("resize", schedule);
3976
- window.visualViewport?.removeEventListener("scroll", schedule);
3977
- panel.style.removeProperty("--ptc-plus-review-offset");
3978
- panel.style.removeProperty("--ptc-plus-review-height");
3979
- delete panel.dataset.scroll;
3980
- body?.style.removeProperty("--ptc-plus-review-space");
3981
- };
3982
- }
3983
4166
  function BindingReviewDock({ sessionId, useProjection, t: t2 }) {
3984
4167
  const raw = useProjection("ptcPlusBindingDraft");
3985
4168
  const projection = React.useMemo(() => bindingDraftProjection(raw), [raw]);
@@ -3998,12 +4181,71 @@
3998
4181
  }, [review, projection]);
3999
4182
  const title = React.useId();
4000
4183
  const content2 = React.useId();
4001
- const expanded = view.visibility === "expanded";
4184
+ const anchor = React.useRef(null);
4185
+ const layer2 = React.useRef(null);
4186
+ const [compact, setCompact] = React.useState(false);
4187
+ const enlarged = view.visibility === "enlarged";
4188
+ const expanded = enlarged || view.visibility === "expanded" && !compact;
4002
4189
  const candidateKey = view.candidateKey;
4003
- React.useLayoutEffect(
4004
- () => fitBindingReview(review.panel),
4005
- [review, candidateKey, expanded, view.visibility, view.message]
4006
- );
4190
+ React.useLayoutEffect(() => {
4191
+ if (enlarged || !view.reachable || view.visibility === "hidden" || view.candidate === null) return void 0;
4192
+ let frame;
4193
+ let previous;
4194
+ const place = () => {
4195
+ const rect = anchor.current?.getBoundingClientRect();
4196
+ const surface = layer2.current;
4197
+ if (rect && surface) {
4198
+ const viewport = window.visualViewport;
4199
+ const leftEdge = (viewport?.offsetLeft ?? 0) + 8;
4200
+ const topEdge = (viewport?.offsetTop ?? 0) + 8;
4201
+ const rightEdge = leftEdge + (viewport?.width ?? window.innerWidth) - 16;
4202
+ const bottomEdge = topEdge + (viewport?.height ?? window.innerHeight) - 16;
4203
+ const width = Math.min(rect.width, rightEdge - leftEdge);
4204
+ const left = Math.max(leftEdge, Math.min(rect.left, rightEdge - width));
4205
+ if (surface.style.width !== `${width}px`) surface.style.width = `${width}px`;
4206
+ const panel2 = surface.querySelector(".ptcPlusBindingDock");
4207
+ const head = panel2?.querySelector(".ptcPlusBindingDockHead");
4208
+ const actions = panel2?.querySelector(".ptcPlusBindingDockActions");
4209
+ const body = panel2?.querySelector(".ptcPlusBindingDockBody");
4210
+ const panelStyle = panel2 && getComputedStyle(panel2);
4211
+ const border = (parseFloat(panelStyle?.borderTopWidth) || 0) + (parseFloat(panelStyle?.borderBottomWidth) || 0);
4212
+ const chrome2 = (head?.getBoundingClientRect().height ?? 0) + border;
4213
+ const bottom = Math.max(topEdge, Math.min(Math.max(topEdge + chrome2, rect.top - 8), rect.top, bottomEdge));
4214
+ const height = bottom - topEdge;
4215
+ const geometry = [width, left, bottom, height, chrome2].join(",");
4216
+ if (geometry !== previous) {
4217
+ previous = geometry;
4218
+ surface.style.left = `${left}px`;
4219
+ surface.style.bottom = `${window.innerHeight - bottom}px`;
4220
+ surface.style.setProperty("--ptc-plus-review-space", `${height}px`);
4221
+ }
4222
+ if (rect.width > 0) {
4223
+ const available = surface.getBoundingClientRect().height >= chrome2 && bottom <= rect.top;
4224
+ review.previewAvailable = available;
4225
+ if (surface.dataset.available !== String(available)) {
4226
+ surface.dataset.available = String(available);
4227
+ if (available) {
4228
+ surface.removeAttribute("inert");
4229
+ surface.removeAttribute("aria-hidden");
4230
+ } else {
4231
+ surface.setAttribute("inert", "");
4232
+ surface.setAttribute("aria-hidden", "true");
4233
+ }
4234
+ }
4235
+ }
4236
+ if (head && actions && body && rect.width > 0) {
4237
+ const minimumBody = parseFloat(getComputedStyle(body).minBlockSize);
4238
+ const required = chrome2 + actions.getBoundingClientRect().height + minimumBody;
4239
+ setCompact(surface.getBoundingClientRect().height < required);
4240
+ }
4241
+ }
4242
+ frame = requestAnimationFrame(place);
4243
+ };
4244
+ place();
4245
+ return () => {
4246
+ cancelAnimationFrame(frame);
4247
+ };
4248
+ }, [candidateKey, enlarged, view.reachable, view.visibility, view.candidate === null]);
4007
4249
  const close = () => {
4008
4250
  review.display("hidden");
4009
4251
  requestAnimationFrame(() => focusBindingReviewAccess(review));
@@ -4012,101 +4254,125 @@
4012
4254
  if (review.panel?.contains(document.activeElement)) review.panel.focus({ preventScroll: true });
4013
4255
  void review.act(operation, activate);
4014
4256
  };
4257
+ const restorePreview = () => openBindingReview(review, view.candidate, "expanded");
4015
4258
  if (view.candidate === null || view.visibility === "hidden") return null;
4016
- return h(
4017
- "div",
4018
- { className: "ptcPlusBindingDockAnchor" },
4019
- h(
4020
- "section",
4021
- {
4022
- key: candidateKey,
4023
- className: "ptcPlusBindingDock",
4024
- "aria-labelledby": title,
4025
- tabIndex: -1,
4026
- ref: (element) => {
4027
- review.panel = element;
4028
- },
4029
- onFocusCapture: () => {
4030
- focused.current = true;
4031
- },
4032
- onBlurCapture: (event) => {
4033
- if (event.relatedTarget || review.getSnapshot().action === null) focused.current = false;
4034
- },
4035
- "aria-busy": view.busy
4259
+ const panel = h(
4260
+ "section",
4261
+ {
4262
+ key: candidateKey,
4263
+ className: "ptcPlusBindingDock",
4264
+ "aria-labelledby": title,
4265
+ tabIndex: -1,
4266
+ ref: (element) => {
4267
+ review.panel = element;
4268
+ },
4269
+ onFocusCapture: () => {
4270
+ focused.current = true;
4036
4271
  },
4272
+ onBlurCapture: (event) => {
4273
+ if (event.relatedTarget || review.getSnapshot().action === null) focused.current = false;
4274
+ },
4275
+ "aria-busy": view.busy,
4276
+ "data-compact": !enlarged && compact
4277
+ },
4278
+ h(
4279
+ "div",
4280
+ { className: "ptcPlusBindingDockHead" },
4037
4281
  h(
4038
- "div",
4039
- { className: "ptcPlusBindingDockHead" },
4282
+ enlarged ? "div" : "button",
4283
+ {
4284
+ type: enlarged ? void 0 : "button",
4285
+ className: "ptcPlusBindingDockToggle",
4286
+ "aria-label": enlarged ? void 0 : t2(expanded ? "bindings.reviewCollapse" : "bindings.reviewExpand"),
4287
+ "aria-expanded": enlarged ? void 0 : expanded,
4288
+ "aria-controls": expanded && !enlarged ? content2 : void 0,
4289
+ onClick: enlarged ? void 0 : () => review.display(compact ? "enlarged" : expanded ? "collapsed" : "expanded")
4290
+ },
4291
+ h("span", { className: "ptcPlusBindingDockSymbol", "aria-hidden": true }, "</>"),
4040
4292
  h(
4041
- "button",
4042
- {
4043
- type: "button",
4044
- className: "ptcPlusBindingDockToggle",
4045
- "aria-label": t2(expanded ? "bindings.reviewCollapse" : "bindings.reviewExpand"),
4046
- "aria-expanded": expanded,
4047
- "aria-controls": expanded ? content2 : void 0,
4048
- onClick: () => review.display(expanded ? "collapsed" : "expanded")
4049
- },
4050
- h("span", { className: "ptcPlusBindingDockSymbol", "aria-hidden": true }, "</>"),
4051
- h(
4052
- "span",
4053
- { className: "ptcPlusBindingDockHeading" },
4054
- h("strong", { id: title, title: view.candidate.entry.name }, view.candidate.entry.name),
4055
- h(
4056
- "span",
4057
- { role: "status", title: t2(bindingReviewStatus(view)) },
4058
- `${t2("bindings.reviewTitle")} \xB7 ${t2(bindingReviewStatus(view))}`
4059
- )
4060
- ),
4293
+ "span",
4294
+ { className: "ptcPlusBindingDockHeading" },
4295
+ h("strong", { id: title, title: view.candidate.entry.name }, view.candidate.entry.name),
4061
4296
  h(
4062
4297
  "span",
4063
- { className: "ptcPlusBindingDockChevron", "aria-hidden": true },
4064
- h(IconChevronDownOutline14, { size: 16 })
4298
+ { role: "status", title: t2(bindingReviewStatus(view)) },
4299
+ `${t2("bindings.reviewTitle")} \xB7 ${t2(bindingReviewStatus(view))}`
4065
4300
  )
4066
4301
  ),
4067
- h(IconButton, { icon: IconCloseOutline16, label: t2("bindings.reviewClose"), onClick: close })
4302
+ enlarged ? null : h(
4303
+ "span",
4304
+ { className: "ptcPlusBindingDockChevron", "aria-hidden": true },
4305
+ h(IconChevronDownOutline14, { size: 16 })
4306
+ )
4068
4307
  ),
4069
- !expanded ? null : h(
4070
- React.Fragment,
4071
- null,
4072
- h(
4073
- "div",
4074
- {
4075
- className: "ptcPlusBindingDockBody",
4076
- id: content2,
4077
- tabIndex: 0,
4078
- role: "region",
4079
- "aria-label": t2("bindings.source")
4080
- },
4081
- h(BindingCandidateContent, { candidate: view.candidate, t: t2, showName: false })
4082
- ),
4308
+ h(
4309
+ "div",
4310
+ { className: "ptcPlusBindingDockControls" },
4311
+ h(IconButton, {
4312
+ icon: enlarged ? RestoreIcon : EnlargeIcon,
4313
+ label: t2(enlarged ? "bindings.reviewRestore" : "bindings.reviewEnlarge"),
4314
+ onClick: enlarged ? restorePreview : () => review.display("enlarged", view.candidate)
4315
+ }),
4316
+ h(IconButton, {
4317
+ icon: isHostIconComponent(IconCloseOutline16) ? IconCloseOutline16 : ReviewCloseIcon,
4318
+ label: t2("bindings.reviewClose"),
4319
+ onClick: close
4320
+ })
4321
+ )
4322
+ ),
4323
+ !enlarged && view.visibility !== "expanded" ? null : h(
4324
+ React.Fragment,
4325
+ null,
4326
+ h(
4327
+ "div",
4328
+ {
4329
+ className: "ptcPlusBindingDockBody",
4330
+ id: content2,
4331
+ tabIndex: 0,
4332
+ inert: !expanded ? "" : void 0,
4333
+ "aria-hidden": !expanded ? true : void 0,
4334
+ role: "region",
4335
+ "aria-label": t2("bindings.source")
4336
+ },
4083
4337
  view.message === null ? null : h("p", { className: "ptcPlusMessage ptcPlusDanger", role: "status" }, t2(view.message)),
4084
- h(
4085
- "div",
4086
- { className: "ptcPlusBindingDockActions" },
4087
- h(ActionButton, {
4088
- className: "ptcPlusBindingDockDiscard",
4089
- "data-kind": "ghost",
4090
- disabled: !view.writable || view.busy,
4091
- onClick: () => act("discard-draft")
4092
- }, t2("bindings.draftDiscard")),
4093
- h(ActionButton, {
4094
- disabled: !view.writable || view.busy,
4095
- onClick: () => act("save-draft", false)
4096
- }, t2("bindings.draftSave")),
4097
- h(ActionButton, {
4098
- "data-kind": "primary",
4099
- disabled: !view.writable || view.busy,
4100
- onClick: () => act("save-draft", true)
4101
- }, t2("bindings.draftSaveEnable")),
4102
- view.message === null ? null : h(ActionButton, {
4103
- disabled: view.busy,
4104
- onClick: () => review.reset()
4105
- }, t2("bindings.reviewRetry"))
4106
- )
4338
+ view.message === null ? null : h(ActionButton, {
4339
+ disabled: view.busy,
4340
+ onClick: () => review.reset()
4341
+ }, t2("bindings.reviewRetry")),
4342
+ h(BindingCandidateContent, { candidate: view.candidate, t: t2, showName: false })
4343
+ ),
4344
+ h(
4345
+ "div",
4346
+ {
4347
+ className: "ptcPlusBindingDockActions",
4348
+ inert: !expanded ? "" : void 0,
4349
+ "aria-hidden": !expanded ? true : void 0
4350
+ },
4351
+ h(ActionButton, {
4352
+ className: "ptcPlusBindingDockDiscard",
4353
+ "data-kind": "ghost",
4354
+ disabled: !view.writable || view.busy,
4355
+ onClick: () => act("discard-draft")
4356
+ }, t2("bindings.draftDiscard")),
4357
+ h(ActionButton, {
4358
+ disabled: !view.writable || view.busy,
4359
+ onClick: () => act("save-draft", false)
4360
+ }, t2("bindings.draftSave")),
4361
+ h(ActionButton, {
4362
+ "data-kind": "primary",
4363
+ disabled: !view.writable || view.busy,
4364
+ onClick: () => act("save-draft", true)
4365
+ }, t2("bindings.draftSaveEnable"))
4107
4366
  )
4108
4367
  )
4109
4368
  );
4369
+ return h("div", { className: "ptcPlusBindingDockAnchor", ref: anchor }, enlarged ? h(Modal, {
4370
+ open: view.reachable,
4371
+ title: `${view.candidate.entry.name} \xB7 ${t2("bindings.reviewTitle")}`,
4372
+ headless: true,
4373
+ className: "ptcPlusBindingReviewModal",
4374
+ onClose: restorePreview
4375
+ }, panel) : !view.reachable ? null : createPortal(h("div", { className: "ptcPlusBindingPreviewLayer", ref: layer2 }, panel), document.body));
4110
4376
  }
4111
4377
  function BindingCommandCard({ node, sessionId, t: t2, useProjection }) {
4112
4378
  const projection = bindingDraftProjection(useProjection?.("ptcPlusBindingDraft"));
@@ -29728,6 +29994,149 @@
29728
29994
  return true;
29729
29995
  });
29730
29996
 
29997
+ // src/client-styles.js
29998
+ var CLIENT_STYLE_ID = "ptc-plus-client-style";
29999
+ var CLIENT_CSS = `
30000
+ .ptcPlusTool,.ptcPlusComposerBindingAnchor{--ptc-plus-warning-label:color-mix(in srgb,var(--dsw-alias-state-warn-primary,#a15c00) 65%,var(--dsw-alias-label-primary,#18191c))}.ptcPlusTool{font-family:inherit;font-size:13px;line-height:18px}.ptcPlusTool .ptcPlusToolRow{box-sizing:border-box;height:auto;min-height:24px;align-items:flex-start;padding-block:3px}.ptcPlusToolDisclosureContent{min-width:0;flex:1}.ptcPlusTool .ptcPlusToolDisclosureLayout{min-width:0;align-items:flex-start}.ptcPlusTool .ptcPlusToolTitle,.ptcPlusTool .ptcPlusToolSummary,.ptcPlusTool .ptcPlusToolSummaryLine,.ptcPlusTool .ptcPlusToolState,.ptcPlusTool .ptcPlusToolDescription,.ptcPlusTool .ptcPlusToolSep{font-size:13px;line-height:18px}.ptcPlusTool .ptcPlusToolTitle{flex:none;margin-inline-end:6px}.ptcPlusTool .ptcPlusToolState{flex:none;white-space:nowrap}.ptcPlusTool .ptcPlusToolSep{display:inline-block;min-width:6px}.ptcPlusToolSummary{display:flex;min-width:0;align-items:baseline}.ptcPlusToolSummaryLine{display:flex;min-width:0;align-items:baseline;overflow:hidden}.ptcPlusToolDescription{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ptcPlusToolSummary .ptcPlusToolDescription{flex:1}.ptcPlusToolPreview{display:flex;flex:1;min-width:0;flex-direction:column;gap:4px;margin-inline-start:6px}.ptcPlusToolPreview .ptcPlusToolSummaryLine{display:block}.ptcPlusToolPreview .ptcPlusToolDescription{display:inline;white-space:normal;overflow-wrap:anywhere}.ptcPlusToolPreview .ptcPlusFeatures{margin:0}
30001
+ .ptcPlusBindingMenuContent{font-family:inherit;font-size:13px;line-height:18px;display:flex;flex-direction:column;min-width:0;min-height:0;width:100%;max-block-size:min(440px,60dvh,var(--ptc-plus-menu-space,100dvh));overflow:hidden}.ptcPlusBindingMenuScroll{flex:1 1 auto;min-height:0;overflow:auto;overscroll-behavior:contain;scrollbar-gutter:stable}.ptcPlusMenuGroupChevron{display:block;align-self:center;width:14px;height:14px;flex:none;margin-inline-end:6px}.ptcPlusMenuGroupChevron[data-expanded=true]{transform:rotate(90deg)}.ptcPlusOwnedMenuRow{appearance:none;box-sizing:border-box;display:flex;align-items:center;width:100%;min-width:0;min-height:38px;padding:8px 10px;border:0;border-radius:6px;background:transparent;color:inherit;font:inherit;text-align:start;cursor:pointer}.ptcPlusOwnedMenuRow:hover{background:var(--dsw-alias-interactive-bg-hover)}.ptcPlusOwnedMenuRow:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary,#4d6bfe);outline-offset:-2px}.ptcPlusOwnedMenuRow:disabled{opacity:.5;cursor:default}.ptcPlusOwnedMenuSeparator{margin:6px 0;border-top:1px solid var(--dsw-alias-border-l2)}
30002
+ .ptcPlusBindingDockAnchor{position:relative;flex:none;min-width:0;block-size:0;width:min(calc(100% - 32px),44rem);margin-inline:auto}
30003
+ .ptcPlusBindingPreviewLayer{position:fixed;z-index:40;block-size:min(440px,45dvh,var(--ptc-plus-review-space,100dvh));display:flex;align-items:flex-end;pointer-events:none;font-family:inherit;font-size:13px;line-height:18px}.ptcPlusBindingPreviewLayer[data-available=false]{visibility:hidden;pointer-events:none}.ptcPlusBindingDock{position:relative;font-family:inherit;font-size:13px;line-height:18px;box-sizing:border-box;min-width:0;display:flex;flex-direction:column;border:1px solid var(--dsw-alias-border-l3,rgba(0,0,0,.1));border-radius:14px;background:var(--dsw-alias-bg-base,#fff);color:var(--dsw-alias-label-primary,#18191c);box-shadow:0 8px 32px rgba(0,0,0,.14),0 2px 6px rgba(0,0,0,.06);width:100%;max-block-size:100%;pointer-events:auto;overflow:hidden;overscroll-behavior:contain}
30004
+ .ptcPlusBindingDockHead{display:flex;flex:none;align-items:center;gap:4px;min-width:0;padding:0 10px 0 0}.ptcPlusBindingDockControls{display:flex;flex:none;align-items:center;gap:12px}.ptcPlusBindingDockToggle{box-sizing:border-box;appearance:none;display:flex;flex:1;align-items:center;gap:10px;min-width:0;min-height:54px;padding:10px 12px;border:0;background:transparent;color:inherit;text-align:start;font:inherit;cursor:pointer}.ptcPlusBindingDockToggle:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(38,49,72,.06))}.ptcPlusBindingDockToggle:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary,#4d6bfe);outline-offset:-3px}.ptcPlusBindingDockSymbol{display:grid;place-items:center;flex:none;width:30px;height:30px;border-radius:8px;background:var(--dsw-alias-bg-layer-2,#f3f4f6);color:var(--dsw-alias-label-secondary,#52565d);font:600 13px ui-monospace,monospace}.ptcPlusBindingDockHeading{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px;font-size:13px;line-height:18px}.ptcPlusBindingDockHeading strong,.ptcPlusBindingDockHeading>span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ptcPlusBindingDockHeading>span{font-size:11px;color:var(--dsw-alias-label-secondary,#52565d)}.ptcPlusBindingDockChevron{display:flex;flex:none;transform:rotate(180deg);transition:transform .16s ease}.ptcPlusBindingDockToggle[aria-expanded=true] .ptcPlusBindingDockChevron{transform:rotate(0deg)}
30005
+ .ptcPlusBindingDockBody{box-sizing:border-box;flex:1 1 auto;min-width:0;min-block-size:41px;max-block-size:20rem;overflow:auto;overscroll-behavior:contain;scrollbar-gutter:stable;border-top:1px solid var(--dsw-alias-border-l3,rgba(0,0,0,.1))}.ptcPlusBindingDockBody:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary,#4d6bfe);outline-offset:-2px}.ptcPlusBindingDockBody .ptcPlusAuthoringDraft{border:0;padding:12px 14px;background:transparent;gap:10px}.ptcPlusBindingDockBody .ptcPlusBindingCommandSource,.ptcPlusBindingDockBody .ptcPlusBindingCommandCode{max-height:none;margin:0}.ptcPlusBindingDockBody pre{font-size:12px;line-height:19px}.ptcPlusBindingDockBody .ptcPlusBindingMeta{font:11px/17px ui-monospace,monospace;overflow-wrap:anywhere}.ptcPlusBindingDockActions{display:flex;flex:none;flex-wrap:wrap;align-items:center;gap:6px;padding:10px 12px;border-top:1px solid var(--dsw-alias-border-l3,rgba(0,0,0,.1))}.ptcPlusBindingDockActions>button{width:auto;min-width:0;white-space:normal}.ptcPlusBindingDockDiscard{margin-inline-end:auto}.ptcPlusBindingDock .ptcPlusMessage{margin:0;font-size:12px;line-height:19px}.ptcPlusBindingDockBody>.ptcPlusMessage{padding:8px 12px;overflow-wrap:anywhere}.ptcPlusBindingDock[data-compact=true]>.ptcPlusBindingDockBody,.ptcPlusBindingDock[data-compact=true]>.ptcPlusBindingDockActions{position:absolute;inset-inline:0;visibility:hidden;pointer-events:none}.ptcPlusComposerBindingAnchor{display:inline-flex;min-width:1px;min-height:1px}.ptcPlusComposerBindingAnchor .ptcPlusAuthorButton{position:relative}.ptcPlusDraftBadge{position:absolute;top:-2px;right:-3px;display:grid;place-items:center;box-sizing:border-box;min-width:14px;height:14px;padding-inline:3px;border:1.5px solid var(--dsw-alias-bg-base,#fff);border-radius:8px;background:var(--dsw-alias-state-business-primary,#4d6bfe);color:#fff;font:600 9px/1 system-ui,sans-serif;pointer-events:none}.ptcPlusDraftBadge[data-attention=true]{background:var(--ptc-plus-warning-label);color:var(--dsw-alias-bg-base,#fff)}.ptcPlusDraftMenuItem{display:flex;min-width:0;max-width:240px;flex-direction:column;gap:3px;white-space:normal;overflow-wrap:anywhere}.ptcPlusDraftMenuItem strong{font-size:12px;font-weight:600}.ptcPlusDraftMenuItem>span{font-size:11px;color:var(--dsw-alias-label-secondary,#52565d)}.ptcPlusComposerBindingAnchor[data-text=true] .ptcPlusAuthorButtonShell{width:auto}
30006
+ .ptcPlusBindingReviewModal.ptcPlusBindingReviewModal{box-sizing:border-box;display:flex;flex-direction:column;width:min(1200px,calc(100vw - 48px));max-width:100%;height:min(900px,88dvh);max-height:100%;min-height:0;padding:0;gap:0;border-radius:14px;overflow:hidden}.ptcPlusBindingReviewModal .ptcPlusBindingDock{position:relative;inset:auto;flex:1;min-height:0;max-block-size:none;border:0;border-radius:0;box-shadow:none;overflow:hidden}.ptcPlusBindingReviewModal .ptcPlusBindingDockToggle{cursor:default;padding:16px 20px}.ptcPlusBindingReviewModal .ptcPlusBindingDockToggle:hover{background:transparent}.ptcPlusBindingReviewModal .ptcPlusBindingDockBody{min-block-size:0;max-block-size:none}.ptcPlusBindingReviewModal .ptcPlusAuthoringDraft{padding:18px 20px;gap:14px}.ptcPlusBindingReviewModal .ptcPlusBindingDockBody pre{font-size:13px;line-height:21px}.ptcPlusBindingReviewModal .ptcPlusBindingDockActions{padding:12px 20px}.ptcPlusBindingReviewModal .ptcPlusBindingDockHead{padding-inline-end:16px}
30007
+ @media(max-height:400px){.ptcPlusBindingReviewModal.ptcPlusBindingReviewModal{height:calc(100dvh - 24px)}.ptcPlusBindingReviewModal .ptcPlusBindingDockToggle{padding-block:8px}.ptcPlusBindingReviewModal .ptcPlusBindingDockActions{padding-block:6px}}
30008
+ @media(max-width:560px){.ptcPlusBindingDockAnchor{width:calc(100% - 16px)}.ptcPlusBindingReviewModal.ptcPlusBindingReviewModal{width:calc(100vw - 48px);height:calc(100dvh - 24px)}.ptcPlusBindingReviewModal .ptcPlusBindingDockToggle{padding:12px}.ptcPlusBindingReviewModal .ptcPlusBindingDockHead{padding-inline-end:8px}.ptcPlusBindingReviewModal .ptcPlusAuthoringDraft{padding:12px}.ptcPlusBindingReviewModal .ptcPlusBindingDockActions{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);padding:10px 12px}.ptcPlusBindingReviewModal .ptcPlusBindingDockDiscard{grid-column:1/-1;justify-self:start}}
30009
+ .ptcPlusBindingCommand .ptcPlusMessage{margin:0}.ptcPlusBindingSourceDetails{min-width:0}.ptcPlusBindingSourceDetails>summary{cursor:pointer;font-size:12px;line-height:20px}.ptcPlusBindingItem>button,.ptcPlusGlobalItem>button{align-self:center}.ptcPlusAuthoringDraft>strong{font-size:13px;line-height:20px;overflow-wrap:anywhere}.ptcPlusBindingCommand .ptcPlusBindingCommandState{max-width:100%;box-sizing:border-box;white-space:normal}.ptcPlusBindingCommand .ptcPlusAuthoringDraft{min-width:0;padding:0;border:0;border-radius:0;background:transparent}
30010
+ .ptcPlusCard{list-style:none;border:0.5px solid var(--dsw-alias-border-l4);border-radius:16px;background:var(--dsw-alias-bg-layer-3);overflow:hidden;transition:border-color .16s ease,background-color .16s ease}
30011
+ .ptcPlusCard:hover{border-color:var(--dsw-alias-label-dimmed)}
30012
+ .ptcPlusRow>.ptcPlusSelect{width:auto;max-width:100%;flex:none}
30013
+ .ptcPlusCard[data-open=true]{background:var(--dsw-alias-bg-layer-2);border-color:var(--dsw-alias-label-dimmed)}
30014
+ .ptcPlusHeader{appearance:none;width:100%;display:flex;align-items:center;gap:12px;padding:14px 16px;border:0;background:transparent;color:inherit;font:inherit;text-align:left;cursor:pointer;border-radius:12px}
30015
+ .ptcPlusHeader:hover{background:var(--dsw-alias-interactive-bg-hover)}.ptcPlusHeader:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:-2px}
30016
+ .ptcPlusButton:focus-visible,.ptcPlusInput:focus-visible,.ptcPlusSelect:focus-visible,.ptcPlusTextarea:focus-visible,.ptcPlusBindingSelect:focus-visible,.ptcPlusReplBindingTrigger:focus-visible,.ptcPlusReplInspect:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:1px}
30017
+ .ptcPlusBindingSelect:disabled,.ptcPlusSelect:disabled,.ptcPlusTextarea:disabled{cursor:not-allowed;opacity:.4}
30018
+ .ptcPlusHeadText{display:flex;flex:1;min-width:0;flex-direction:column;align-items:flex-start;gap:3px}.ptcPlusName{font-size:15px;font-weight:600;line-height:1.4}.ptcPlusDescription{color:var(--dsw-alias-label-tertiary);font-size:13px;line-height:1.5;overflow-wrap:anywhere}.ptcPlusStatus{display:inline-flex;align-items:center;flex:none;padding:1px 8px;border-radius:999px;corner-shape:round;background:var(--dsw-alias-bg-module-platform);color:var(--dsw-alias-label-secondary);font-size:11px;font-weight:500;line-height:17px;white-space:nowrap}.ptcPlusStatus[data-enabled=true]{color:var(--dsw-alias-state-success-primary);background:var(--dsw-alias-state-success-tertiary)}.ptcPlusStatus[data-enabled=false]{color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-module-platform)}
30019
+ .ptcPlusChevron{display:flex;color:var(--dsw-alias-label-tertiary);transition:transform .18s ease}.ptcPlusChevron[data-open=true]{transform:rotate(180deg)}.ptcPlusBody{display:grid;grid-template-rows:0fr;transition:grid-template-rows .2s ease}.ptcPlusBody[data-open=true]{grid-template-rows:1fr}.ptcPlusBodyInner{min-height:0;overflow:hidden}.ptcPlusFields{margin:0 16px;padding:8px 0 12px;border-top:0.5px solid var(--dsw-alias-border-l2)}
30020
+ .ptcPlusGroup+.ptcPlusGroup{margin-top:20px;padding-top:12px;border-top:1px solid var(--dsw-alias-border-l2)}.ptcPlusGroupTitle{margin:0;padding:8px 0;color:var(--dsw-alias-label-secondary);font-size:13px;font-weight:600;letter-spacing:0;line-height:20px}.ptcPlusRow{display:flex;align-items:center;gap:12px;min-height:48px;border-top:0.5px solid var(--dsw-alias-border-l2)}.ptcPlusGroupTitle+.ptcPlusRow{border-top:0}.ptcPlusMain{flex:1;min-width:0}.ptcPlusLabel{font-size:13px;font-weight:500;line-height:1.5}.ptcPlusDetail,.ptcPlusMessage{color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:1.5;overflow-wrap:anywhere}.ptcPlusInput{box-sizing:border-box;min-width:72px;width:140px;height:34px;padding:0 12px;border:0.5px solid var(--dsw-alias-border-l4);border-radius:8px;background:var(--dsw-alias-bg-layer-3);color:var(--dsw-alias-label-primary);font:inherit;font-size:13px;line-height:1.5}.ptcPlusInput:focus-visible{border-color:var(--dsw-alias-brand-primary);outline:none}.ptcPlusCheck{width:18px;height:18px;accent-color:var(--dsw-alias-brand-primary)}
30021
+ .ptcPlusFooter{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:8px}.ptcPlusButton{appearance:none;display:inline-flex;align-items:center;justify-content:center;gap:5px;min-height:32px;padding:4px 14px;border:0.5px solid var(--dsw-alias-border-l3);border-radius:8px;background:transparent;color:var(--dsw-alias-label-secondary);cursor:pointer;font:inherit;font-size:13px;line-height:1.5;transition:color .16s ease,border-color .16s ease,background-color .16s ease}.ptcPlusButton:hover:not(:disabled){border-color:var(--dsw-alias-label-dimmed);color:var(--dsw-alias-label-primary)}.ptcPlusButton[data-kind=primary]{background:var(--dsw-alias-label-primary);border-color:transparent;color:var(--dsw-alias-bg-layer-3)}.ptcPlusButton[data-kind=primary]:hover:not(:disabled){background:var(--dsw-alias-label-primary-dimmed);border-color:transparent;color:var(--dsw-alias-bg-layer-3)}.ptcPlusButton[data-kind=ghost]{border-color:transparent}.ptcPlusButton[data-kind=ghost]:hover:not(:disabled){border-color:var(--dsw-alias-border-l3)}.ptcPlusButton[data-kind=danger]{color:var(--dsw-alias-state-error-primary)}.ptcPlusButton[data-kind=danger]:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover-danger);border-color:var(--dsw-alias-state-error-primary);color:var(--dsw-alias-state-error-primary)}.ptcPlusButton:disabled,.ptcPlusInput:disabled,.ptcPlusCheck:disabled{cursor:not-allowed;opacity:.4}
30022
+ .ptcPlusSettingAction{padding:4px 0 12px}
30023
+ .ptcPlusSettingsModal.ptcPlusSettingsModal{width:min(760px,calc(100vw - 32px));max-width:none;max-height:calc(100dvh - 40px);border-radius:8px}.ptcPlusSettingsDialogContent{min-height:0;overflow:auto;overscroll-behavior:contain}.ptcPlusSettingsDialog{min-width:0}.ptcPlusSettingsDialog .ptcPlusFields{margin:0;padding:0 0 12px;border-top:0}
30024
+ .ptcPlusDanger{color:var(--dsw-alias-state-error-primary)}
30025
+ .ptcPlusActiveShell{display:inline-flex;align-items:center}.ptcPlusActive{appearance:none;display:inline-flex;height:24px;align-items:center;gap:5px;padding:0 8px;border:1px solid color-mix(in srgb,var(--dsw-alias-state-success-primary,#16794f) 32%,transparent);border-radius:6px;background:var(--dsw-alias-state-success-tertiary,#e7f7ef);color:var(--dsw-alias-state-success-primary,#16794f);cursor:help;font-family:inherit;font-size:12px;font-weight:600;line-height:18px;white-space:nowrap;transition:background-color .14s ease,border-color .14s ease}.ptcPlusActive:hover,.ptcPlusActive[aria-expanded=true]{border-color:color-mix(in srgb,var(--dsw-alias-state-success-primary,#16794f) 48%,transparent);background:color-mix(in srgb,var(--dsw-alias-state-success-primary,#16794f) 16%,var(--dsw-alias-bg-layer-3,#fff))}.ptcPlusActive:focus-visible{outline:2px solid var(--dsw-alias-state-success-primary,#16794f);outline-offset:2px}.ptcPlusReplPopover{position:fixed;z-index:2147483000;inset:auto;display:none;box-sizing:border-box;margin:0;padding:0;border:0;overflow:visible;background:transparent;color:var(--dsw-alias-label-primary,#18191c)}.ptcPlusReplPopover:popover-open,.ptcPlusReplPopover[data-open=true]{display:block}.ptcPlusReplPopover::backdrop{background:transparent}.ptcPlusReplCard{display:flex;max-height:inherit;overflow:hidden;flex-direction:column;border:1px solid color-mix(in srgb,var(--dsw-alias-state-success-primary,#16794f) 22%,var(--dsw-alias-border-l2,rgba(0,0,0,.1)));border-top:3px solid var(--dsw-alias-state-success-primary,#16794f);border-radius:8px;background:var(--dsw-alias-bg-layer-3,#fff);box-shadow:0 14px 36px rgba(16,24,40,.2),0 3px 10px rgba(16,24,40,.1);color:var(--dsw-alias-label-primary,#18191c);white-space:normal}.ptcPlusReplHead{display:grid;flex:none;grid-template-columns:auto minmax(0,1fr);align-items:center;column-gap:8px;padding:11px 13px 10px;border-bottom:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.1));background:color-mix(in srgb,var(--dsw-alias-state-success-primary,#16794f) 7%,var(--dsw-alias-bg-layer-3,#fff))}.ptcPlusReplStatusDot{grid-row:1/3;width:8px;height:8px;border-radius:50%;background:var(--dsw-alias-state-success-primary,#16794f);box-shadow:0 0 0 3px color-mix(in srgb,var(--dsw-alias-state-success-primary,#16794f) 14%,transparent)}.ptcPlusReplTitle,.ptcPlusReplSummary{display:block;min-width:0}.ptcPlusReplTitle{font-size:13px;font-weight:600;line-height:19px}.ptcPlusReplSummary{min-height:16px;overflow-wrap:anywhere;color:var(--dsw-alias-label-tertiary,#74777d);font-size:11px;line-height:16px}.ptcPlusReplList{min-height:0;margin:0;padding:5px 0;overflow:auto;overscroll-behavior:contain;list-style:none;scrollbar-gutter:stable}.ptcPlusReplBinding{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:4px 10px;padding:7px 12px}.ptcPlusReplBinding:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(38,49,72,.06))}.ptcPlusReplIdentity{display:flex;min-width:0;align-items:center;gap:7px}.ptcPlusReplName{min-width:0;overflow:hidden;font:12px/18px ui-monospace,SFMono-Regular,Consolas,monospace;text-overflow:ellipsis;white-space:nowrap}.ptcPlusReplKind{flex:none;padding:1px 6px;border:1px solid color-mix(in srgb,currentColor 22%,transparent);border-radius:999px;background:color-mix(in srgb,currentColor 10%,transparent);font-size:10px;font-weight:600;line-height:15px}.ptcPlusReplKind[data-kind=variable]{color:var(--dsw-alias-state-business-primary,#315fbd)}.ptcPlusReplKind[data-kind=function]{color:#7651b5}.ptcPlusReplKind[data-kind=class]{color:var(--dsw-alias-state-warn-primary,#946200)}.ptcPlusReplKind[data-kind=import]{color:#14766f}.ptcPlusReplPreview{grid-column:1;min-width:0;overflow:hidden;color:var(--dsw-alias-label-tertiary,#74777d);font:11px/16px ui-monospace,SFMono-Regular,Consolas,monospace;text-overflow:ellipsis;white-space:nowrap}.ptcPlusReplInspect{grid-column:2;grid-row:1/3;display:inline-flex;align-items:center;gap:4px;padding:3px 5px;border:0;border-radius:4px;background:transparent;color:var(--dsw-alias-label-secondary,#52565d);cursor:pointer;font:500 11px/17px inherit;white-space:nowrap}.ptcPlusReplInspect:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(38,49,72,.06));color:var(--dsw-alias-state-business-primary,#4d6bfe)}.ptcPlusReplInspect:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary,#4d6bfe);outline-offset:1px}.ptcPlusReplDefinition{grid-column:1/-1;min-width:0;margin-top:4px;padding:8px;border-left:2px solid var(--dsw-alias-state-business-primary,#4d6bfe);background:var(--dsw-alias-bg-layer-2,rgba(38,49,72,.03))}.ptcPlusReplLocation{display:block;margin-bottom:5px;color:var(--dsw-alias-label-tertiary,#74777d);font-size:10px;line-height:15px}.ptcPlusReplCode{max-height:180px;margin:0;overflow:auto;color:inherit;font:11px/16px ui-monospace,SFMono-Regular,Consolas,monospace;white-space:pre-wrap;overflow-wrap:anywhere}.ptcPlusReplEmpty,.ptcPlusReplMore{display:block;color:var(--dsw-alias-label-tertiary,#74777d)}.ptcPlusReplEmpty{padding:18px 13px;font-size:12px;line-height:18px}.ptcPlusReplMore{padding:8px 13px;border-top:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.1));background:var(--dsw-alias-bg-layer-2,rgba(38,49,72,.03));font-size:11px;line-height:17px}
30026
+ .ptcPlusReplTabs{display:flex;flex:none;padding:6px 8px 0;border-bottom:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.1))}.ptcPlusReplTab{flex:1;padding:5px 6px;border:0;border-bottom:2px solid transparent;background:transparent;color:var(--dsw-alias-label-secondary,#52565d);cursor:pointer;font-family:inherit;font-size:11px;font-weight:600;line-height:17px}.ptcPlusReplTab[aria-selected=true]{border-bottom-color:var(--dsw-alias-state-business-primary,#4d6bfe);color:var(--dsw-alias-label-primary,#18191c)}.ptcPlusGlobalPane{display:flex;min-height:0;flex-direction:column;gap:8px;padding:8px 12px}.ptcPlusGlobalList{min-height:0;margin:0 -12px -8px;padding:5px 0;overflow:auto;list-style:none}.ptcPlusGlobalItem{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:6px 10px;padding:7px 12px;border-radius:8px}.ptcPlusGlobalItem:hover{background:var(--dsw-alias-interactive-bg-hover)}.ptcPlusGlobalItem .ptcPlusGlobalSource,.ptcPlusGlobalItem .ptcPlusReplEmpty{grid-column:1/-1}.ptcPlusAuthoringDraft{display:flex;flex-direction:column;gap:6px;padding:10px 12px;border:0.5px solid var(--dsw-alias-border-l4);border-radius:12px;background:var(--dsw-alias-bg-layer-3)}.ptcPlusGlobalSource{max-height:180px;margin:6px 0 0;padding:8px 10px;overflow:auto;background:var(--dsw-alias-markdown-code-block);border-radius:8px;font:12px/18px ui-monospace,SFMono-Regular,Consolas,monospace;white-space:pre-wrap;overflow-wrap:anywhere}
30027
+ .ptcPlusReplList{max-height:min(52vh,480px)}.ptcPlusReplBinding{grid-template-columns:minmax(0,1fr) 24px;gap:3px 8px;min-height:36px;padding:5px 12px;content-visibility:auto;contain-intrinsic-size:36px;cursor:pointer;transition:background-color .16s ease}.ptcPlusReplBinding:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary,#4d6bfe);outline-offset:-2px}.ptcPlusReplBinding[data-expanded=true]{background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#4d6bfe) 5%,transparent)}.ptcPlusReplName{grid-column:1}.ptcPlusReplName[data-kind=variable]{color:var(--dsw-alias-state-business-primary,#315fbd)}.ptcPlusReplName[data-kind=function]{color:#7651b5}.ptcPlusReplName[data-kind=class]{color:var(--dsw-alias-state-warn-primary,#946200)}.ptcPlusReplName[data-kind=import]{color:#14766f}.ptcPlusReplPreview{grid-column:1}.ptcPlusReplChevron{grid-column:2;grid-row:1/3;display:flex;align-items:center;justify-content:center;color:var(--dsw-alias-label-tertiary,#74777d);transition:transform .2s ease}.ptcPlusReplChevron[data-open=true]{transform:rotate(180deg)}.ptcPlusReplDefinitionWrap{grid-column:1/-1;display:grid;grid-template-rows:0fr;min-width:0;transition:grid-template-rows .24s cubic-bezier(.2,.7,.2,1)}.ptcPlusReplDefinitionWrap[data-open=true]{grid-template-rows:1fr}.ptcPlusReplDefinitionInner{min-height:0;overflow:hidden}
30028
+ .ptcPlusDraftBadge[data-attention=true]{background:var(--dsw-alias-bg-base,#fff);color:var(--ptc-plus-warning-label)}
30029
+ .ptcPlusToolSummary+.ptcPlusFeatures{margin-top:4px}.ptcPlusFeatures{display:flex;min-width:0;flex-wrap:wrap;gap:3px 14px;margin:0 0 5px 23px}.ptcPlusFeature{display:inline-flex;min-width:0;max-width:100%;align-items:center;gap:5px;color:var(--dsw-alias-label-secondary,#52565d);font-size:11px;line-height:17px}.ptcPlusFeature::before{width:4px;height:4px;flex:none;border-radius:50%;background:var(--dsw-alias-state-business-primary,#4d6bfe);content:''}.ptcPlusFeatureName{min-width:0;font-weight:500;overflow-wrap:anywhere}.ptcPlusFeatureDetail{min-width:0;overflow:hidden;color:var(--dsw-alias-label-tertiary,#74777d);font-family:ui-monospace,SFMono-Regular,Consolas,monospace;text-overflow:ellipsis;white-space:nowrap}
30030
+ .ptcPlusToolBody{margin:4px 0 8px 23px;border-left:2px solid var(--dsw-alias-border-l2,rgba(0,0,0,.1));background:var(--dsw-alias-bg-layer-2,rgba(38,49,72,.03))}.ptcPlusToolSection{display:flex;min-width:0;flex-direction:column;gap:4px;padding:9px 11px}.ptcPlusToolSection+.ptcPlusToolSection{border-top:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.1))}.ptcPlusToolSectionLabel{color:var(--dsw-alias-label-tertiary,#74777d);font-size:10px;font-weight:600;line-height:16px;text-transform:uppercase}.ptcPlusToolCode{max-height:320px;margin:0;overflow:auto;color:inherit;font:12px/18px ui-monospace,SFMono-Regular,Consolas,monospace;white-space:pre-wrap;overflow-wrap:anywhere}.ptcPlusIoCard{display:flex;flex-direction:column;border:1px solid var(--dsw-alias-border-l1,rgba(0,0,0,.1));border-radius:12px;background:var(--dsw-alias-markdown-code-block,rgba(38,49,72,.06));overflow:hidden}.ptcPlusIoText{max-height:320px;margin:0;padding:12px 16px;overflow:auto;color:var(--dsw-alias-label-secondary,#52565d);font:12px/18px ui-monospace,SFMono-Regular,Consolas,monospace;white-space:pre-wrap;overflow-wrap:anywhere}.ptcPlusIoText[data-error]{color:var(--dsw-alias-state-error-primary,#c43d3d)}.ptcPlusInspect{display:inline-flex;align-self:flex-start;align-items:center;gap:4px;margin:4px 0 2px 4px;padding:2px 8px;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.1));border-radius:999px;background:var(--dsw-alias-bg-base,#fff);color:var(--dsw-alias-label-secondary,#52565d);cursor:pointer;opacity:0;font-size:11px;line-height:16px;transition:opacity .1s ease;display:inline-flex}.ptcPlusTool:hover .ptcPlusInspect,.ptcPlusInspect:focus-visible{opacity:1}.ptcPlusInspect:hover{background:var(--dsw-alias-interactive-bg-hover-solid,rgba(38,49,72,.06));color:var(--dsw-alias-label-primary,#18191c)}
30031
+ .ptcPlusAuthorButtonShell{display:inline-flex;width:28px;height:28px;flex:none;align-items:center;justify-content:center}.ptcPlusAuthorButton{appearance:none;display:inline-flex;box-sizing:border-box;width:28px;height:28px;align-items:center;justify-content:center;padding:0;border:0;border-radius:6px;background:transparent;color:var(--dsw-alias-label-secondary,#52565d);cursor:pointer}.ptcPlusAuthorButton:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(38,49,72,.06));color:var(--dsw-alias-state-business-primary,#4d6bfe)}.ptcPlusAuthorButton:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary,#4d6bfe);outline-offset:1px}.ptcPlusAuthorButtonShell[data-text=true]{width:auto}.ptcPlusAuthorButtonLabel{padding:0 4px;font-size:12px;line-height:18px;font-weight:500}.ptcPlusComposerNotice{max-width:160px;color:var(--dsw-alias-label-secondary,#52565d);font-size:11px;line-height:17px;overflow-wrap:anywhere}.ptcPlusButton>svg{flex:none;margin-right:5px;vertical-align:-2px}
30032
+ @media(max-width:760px){.ptcPlusBindingsGrid{grid-template-columns:1fr}.ptcPlusBindingFields{grid-template-columns:1fr}.ptcPlusBindingField[data-wide=true]{grid-column:auto}.ptcPlusBindingSourceGrid{grid-template-columns:1fr}.ptcPlusBindingDebugBody{grid-template-columns:1fr}.ptcPlusBindingDebugBody .ptcPlusButton{width:100%}.ptcPlusBindingDebugWarning{grid-column:1}}
30033
+ @media(max-width:560px){.ptcPlusHeader{padding:12px}.ptcPlusFields{margin:0 12px}.ptcPlusSettingsModal.ptcPlusSettingsModal{width:calc(100vw - 16px);max-height:calc(100dvh - 16px)}.ptcPlusSettingsDialog .ptcPlusFields{margin:0}.ptcPlusRow{align-items:flex-start;flex-direction:column;gap:6px;padding:10px 0}.ptcPlusInput{width:100%}.ptcPlusFooter,.ptcPlusBindingsHead{align-items:stretch;flex-direction:column}.ptcPlusButton{width:100%}.ptcPlusFeatures,.ptcPlusToolBody{margin-left:0}.ptcPlusToolSummary .ptcPlusToolDescription{white-space:normal;overflow-wrap:anywhere}}
30034
+ @media(prefers-reduced-motion:reduce){.ptcPlusHeader,.ptcPlusChevron,.ptcPlusBody,.ptcPlusButton,.ptcPlusActive,.ptcPlusToolChevron,.ptcPlusReplChevron,.ptcPlusReplDefinitionWrap,.ptcPlusInspect,.ptcPlusBindingDockChevron{transition:none}}
30035
+ /* The summary button owns disclosure; definition content is a separate grid item. */
30036
+ .ptcPlusReplBinding{padding:0;cursor:default}.ptcPlusReplBindingTrigger{appearance:none;display:grid;width:100%;grid-column:1/-1;grid-template-columns:minmax(0,1fr) 24px;gap:3px 8px;min-height:36px;padding:5px 12px;border:0;background:transparent;color:inherit;text-align:left;cursor:pointer;font:inherit;transition:background-color .16s ease}.ptcPlusReplBindingTrigger:hover,.ptcPlusReplBindingTrigger[aria-expanded=true]{background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#4d6bfe) 5%,transparent)}.ptcPlusReplBindingTrigger:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary,#4d6bfe);outline-offset:-2px}
30037
+ /* High-contrast TypeScript-like token colors adapt to the active text theme. */
30038
+ .ptcPlusReplCard .ptcPlusReplName[data-kind=variable]{color:color-mix(in srgb,#005cc5 55%,var(--dsw-alias-label-primary,#18191c))}
30039
+ .ptcPlusReplCard .ptcPlusReplName[data-kind=function]{color:color-mix(in srgb,#795e26 55%,var(--dsw-alias-label-primary,#18191c))}
30040
+ .ptcPlusReplCard .ptcPlusReplName[data-kind=class]{color:color-mix(in srgb,#267f99 55%,var(--dsw-alias-label-primary,#18191c))}
30041
+ .ptcPlusReplCard .ptcPlusReplName[data-kind=import]{color:color-mix(in srgb,#af00db 55%,var(--dsw-alias-label-primary,#18191c))}
30042
+ /* Keep the session-header action on the same compact 32px rhythm as DSH chrome. */
30043
+ .ptcPlusActiveShell{display:inline-flex;height:28px;align-items:center;justify-content:center;line-height:0;vertical-align:middle}.ptcPlusActive{box-sizing:border-box;height:28px;justify-content:center;gap:6px;padding:0 6px;border:0;background:transparent;font-family:inherit;font-size:13px;font-weight:500;line-height:18px}.ptcPlusActive::before{width:6px;height:6px;flex:none;border-radius:50%;background:currentColor;box-shadow:0 0 0 2px color-mix(in srgb,currentColor 18%,transparent);content:''}.ptcPlusActive:hover,.ptcPlusActive[aria-expanded=true]{background:var(--dsw-alias-interactive-bg-hover,rgba(38,49,72,.06))}.ptcPlusActiveLabel{display:inline-flex;height:18px;align-items:center;line-height:18px}
30044
+ @media(max-width:560px){.ptcPlusActiveShell{display:none}}
30045
+ /* The compatibility probe never paints: it exists so the entry can read whether
30046
+ the installed Menu mounted the region it was given. */
30047
+ .ptcPlusMenuProbe{display:none}
30048
+ .ptcPlusBindingMenu{display:flex;flex-direction:column;overflow:hidden;width:min(320px,calc(100vw - 24px));min-width:0;max-height:min(440px,60dvh);border-radius:12px}.ptcPlusBindingQuickRow{display:flex;flex:1;min-width:0;flex-direction:column;gap:3px;white-space:normal}.ptcPlusBindingQuickName{display:flex;align-items:center;justify-content:space-between;gap:12px;font-size:13px}.ptcPlusBindingQuickName strong{min-width:0;overflow:hidden;text-overflow:ellipsis;font-weight:500;white-space:nowrap}.ptcPlusBindingQuickState{flex:none;min-width:5em;text-align:end;font-size:11px;color:var(--dsw-alias-label-tertiary)}.ptcPlusBindingQuickRow[data-enabled=true] .ptcPlusBindingQuickState{color:var(--dsw-alias-state-success-primary)}.ptcPlusBindingQuickPurpose{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--dsw-alias-label-tertiary);font-size:12px}.ptcPlusBindingMenuAction{font-size:13px}
30049
+ .ptcPlusMenuActions{flex:none;margin-top:0;border-top:1px solid var(--dsw-alias-border-l3,rgba(0,0,0,.1))}.ptcPlusMenuAuthoring{padding:6px 4px}.ptcPlusMenuGroupLabel{padding:0 4px 4px;color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:16px}.ptcPlusMenuActionGrid,.ptcPlusMenuUtilities{display:flex;gap:6px;min-width:0}.ptcPlusMenuUtilities{padding:4px}.ptcPlusMenuAuthoring+.ptcPlusMenuUtilities{border-top:1px solid var(--dsw-alias-border-l3,rgba(0,0,0,.1))}.ptcPlusMenuButton{box-sizing:border-box;appearance:none;display:flex;flex:1;align-items:center;justify-content:center;min-width:0;min-height:34px;padding:6px 8px;border:1px solid var(--dsw-alias-border-l3,rgba(0,0,0,.1));border-radius:7px;background:transparent;color:var(--dsw-alias-label-primary);font:inherit;text-align:center;cursor:pointer}.ptcPlusMenuButton:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(38,49,72,.06))}.ptcPlusMenuButton:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary,#4d6bfe);outline-offset:-2px}.ptcPlusMenuButton .ptcPlusBindingMenuAction{white-space:normal;overflow-wrap:anywhere;line-height:18px}.ptcPlusMenuUtilities .ptcPlusMenuButton{border-color:transparent;color:var(--dsw-alias-label-secondary)}.ptcPlusMenuUtilities .ptcPlusBindingMenuAction{font-size:12px}
30050
+ @media(max-height:440px){.ptcPlusMenuAuthoring .ptcPlusMenuGroupLabel{display:none}.ptcPlusMenuAuthoring{padding-block:4px}.ptcPlusMenuButton{min-height:30px;padding:4px}}
30051
+ .ptcPlusBindingMenu.ptcPlusFallbackMenuList{overflow:hidden}
30052
+ /* Fallbacks used only when the installed generation ships no Menu or Modal. */
30053
+ .ptcPlusFallbackMenu{display:inline-flex}.ptcPlusFallbackMenuList{position:fixed;z-index:60;box-sizing:border-box;min-width:min(220px,calc(100vw - 24px));max-width:min(320px,calc(100vw - 24px));overflow:auto;overscroll-behavior:contain;padding:6px;border:1px solid var(--dsw-alias-border-l3,rgba(0,0,0,.1));border-radius:12px;background:var(--dsw-alias-bg-layer-3,#fff);color:var(--dsw-alias-label-primary,#18191c);box-shadow:0 8px 32px rgba(0,0,0,.14)}
30054
+ .ptcPlusFallbackMenuItem{display:flex;box-sizing:border-box;width:100%;align-items:center;gap:6px;padding:8px 10px;border:0;border-radius:8px;background:transparent;color:inherit;font:inherit;font-size:13px;text-align:start;cursor:pointer}
30055
+ .ptcPlusFallbackMenuItem:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover,rgba(38,49,72,.06))}
30056
+ .ptcPlusFallbackMenuItem:disabled{opacity:.5;cursor:not-allowed}
30057
+ .ptcPlusFallbackMenuLabel{padding:6px 10px 2px;color:var(--dsw-alias-label-tertiary,#74777d);font-size:11px;line-height:16px}
30058
+ .ptcPlusFallbackMenuSeparator{height:1px;margin:4px 6px;background:var(--dsw-alias-border-l3,rgba(0,0,0,.1))}
30059
+ .ptcPlusFallbackModalBackdrop{position:fixed;inset:0;z-index:50;display:grid;place-items:center;background:rgba(16,24,40,.35)}
30060
+ .ptcPlusFallbackModal{box-sizing:border-box;width:min(760px,calc(100vw - 32px));max-height:calc(100dvh - 40px);overflow:auto;padding:16px 18px;border:1px solid var(--dsw-alias-border-l3,rgba(0,0,0,.1));border-radius:8px;background:var(--dsw-alias-bg-base,#fff);color:var(--dsw-alias-label-primary,#18191c)}
30061
+ .ptcPlusFallbackModalHead{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:12px}.ptcPlusFallbackModalHead h2{margin:0;font-size:17px;line-height:24px}
30062
+
30063
+ `;
30064
+ var BINDING_WORKBENCH_CSS = `
30065
+ .ptcPlusCandidateContext{min-width:0;margin-top:4px;padding:12px;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;background:var(--dsw-alias-bg-module-platform)}.ptcPlusCandidateContext h4{margin:0 0 10px;color:var(--dsw-alias-label-primary);font-size:12px;font-weight:600;line-height:18px}.ptcPlusCandidateContext dl{display:grid;gap:12px;margin:0}.ptcPlusCandidateContext dt{color:var(--dsw-alias-label-secondary);font-size:12px;line-height:20px}.ptcPlusCandidateContext dd{min-width:0;margin:0}.ptcPlusCandidateDeclaration{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:4px 12px}.ptcPlusCandidateDeclaration dd{display:inline-flex;align-items:center;gap:4px;max-width:100%;box-sizing:border-box;padding:2px 8px;border-radius:6px;background:var(--dsw-alias-bg-layer-3);color:var(--dsw-alias-label-secondary);font-size:11px;line-height:18px;overflow-wrap:anywhere}.ptcPlusCandidateDeclaration dd[data-included=true]{background:var(--dsw-alias-state-business-tertiary);color:var(--dsw-alias-state-business-primary)}.ptcPlusCandidateDeclaration svg{flex:none}.ptcPlusCandidatePrompt{display:grid;gap:6px}.ptcPlusCandidatePrompt dd{padding:8px 10px;border:1px solid var(--dsw-alias-border-l2);border-radius:6px;background:var(--dsw-alias-bg-layer-3);color:var(--dsw-alias-label-primary);font-size:12px;line-height:20px;white-space:pre-wrap;overflow-wrap:anywhere}.ptcPlusCandidatePrompt dd[data-empty=true]{padding:0;border:0;background:transparent;color:var(--dsw-alias-label-tertiary)}
30066
+ .ptcPlusBindings{margin-top:16px;padding-top:14px;border-top:0.5px solid var(--dsw-alias-border-l2)}.ptcPlusBindingsHead{display:flex;align-items:center;justify-content:space-between;gap:12px}.ptcPlusBindingsTitle{margin:0;font-size:15px;font-weight:600;line-height:1.4}.ptcPlusBindingsActions{display:flex;flex-wrap:wrap;gap:8px}.ptcPlusBindingsGrid{display:grid;grid-template-columns:minmax(240px,.7fr) minmax(340px,1.3fr);gap:12px;margin-top:12px;align-items:start}.ptcPlusBindingPane{display:flex;min-width:0;flex-direction:column;gap:8px}
30067
+ .ptcPlusBindingList{display:flex;min-width:0;margin:0;padding:8px;flex-direction:column;gap:2px;border:0.5px solid var(--dsw-alias-border-l4);border-radius:16px;background:var(--dsw-alias-bg-layer-3);list-style:none}.ptcPlusBindingItem{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:2px 10px;padding:6px 8px;border-radius:8px;transition:background-color .12s ease}.ptcPlusBindingItem:hover{background:var(--dsw-alias-interactive-bg-hover)}.ptcPlusBindingItem[data-selected=true]{background:var(--dsw-alias-bg-module-platform)}.ptcPlusBindingSelect{display:flex;min-width:0;padding:0;border:0;background:transparent;color:inherit;text-align:left;cursor:pointer;flex-direction:column;align-items:flex-start;gap:1px}.ptcPlusBindingSelect:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:1px}.ptcPlusBindingName{display:block;min-width:0;max-width:100%;overflow:hidden;font:500 13px/20px ui-monospace,SFMono-Regular,Consolas,monospace;text-overflow:ellipsis;white-space:nowrap}.ptcPlusBindingMeta{display:block;min-width:0;max-width:100%;overflow:hidden;color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:16px;text-overflow:ellipsis;white-space:nowrap}.ptcPlusBindingState{display:inline-flex;align-items:center;gap:5px;padding:1px 8px;border-radius:999px;corner-shape:round;font-size:11px;font-weight:500;line-height:17px;white-space:nowrap}.ptcPlusBindingState[data-enabled=true]{color:var(--dsw-alias-state-success-primary);background:var(--dsw-alias-state-success-tertiary)}.ptcPlusBindingState[data-enabled=false]{color:var(--dsw-alias-state-warn-primary);background:var(--dsw-alias-state-warn-tertiary)}.ptcPlusBindingStateDot{width:6px;height:6px;border-radius:50%;background:currentColor}.ptcPlusBindingToggle{grid-column:2;grid-row:1/3;align-self:center;justify-self:end;min-height:26px;padding:2px 10px;font-size:12px;line-height:17px;border-radius:999px;corner-shape:round}.ptcPlusBindingRun{display:flex;flex-wrap:wrap;align-items:center;gap:8px;padding-top:10px;border-top:0.5px solid var(--dsw-alias-border-l2)}.ptcPlusBindingRun .ptcPlusInput{flex:1;min-width:160px;width:auto}
30068
+ .ptcPlusBindingEditor{display:flex;min-width:0;flex-direction:column;border:0.5px solid var(--dsw-alias-border-l4);border-radius:16px;background:var(--dsw-alias-bg-layer-3);overflow:hidden}.ptcPlusBindingSection{display:flex;min-width:0;flex-direction:column;gap:12px;padding:14px 16px}.ptcPlusBindingSection+.ptcPlusBindingSection{border-top:0.5px solid var(--dsw-alias-border-l2)}.ptcPlusBindingSectionTitle{margin:0;font-size:13px;font-weight:600;line-height:1.5}.ptcPlusBindingFields{display:grid;min-width:0;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px 12px}.ptcPlusBindingField{display:flex;min-width:0;flex-direction:column;gap:5px}.ptcPlusBindingField[data-wide=true]{grid-column:1/-1}.ptcPlusBindingFieldLabel{color:var(--dsw-alias-label-primary);font-size:13px;font-weight:500;line-height:1.5}.ptcPlusBindingEditor .ptcPlusInput,.ptcPlusSelect{box-sizing:border-box;width:100%;min-width:0;height:34px;padding:0 12px;border:0.5px solid var(--dsw-alias-border-l4);border-radius:8px;background:var(--dsw-alias-bg-layer-3);color:var(--dsw-alias-label-primary);font:inherit;font-size:13px;line-height:1.5}.ptcPlusBindingEditor .ptcPlusInput:focus-visible,.ptcPlusSelect:focus-visible{border-color:var(--dsw-alias-brand-primary);outline:none}.ptcPlusTextarea{box-sizing:border-box;width:100%;min-height:220px;resize:vertical;padding:10px 12px;border:0.5px solid var(--dsw-alias-border-l4);border-radius:8px;background:var(--dsw-alias-bg-layer-3);color:var(--dsw-alias-label-primary);font:12px/18px ui-monospace,SFMono-Regular,Consolas,monospace;tab-size:2}.ptcPlusTextarea:focus-visible{border-color:var(--dsw-alias-brand-primary);outline:none}.ptcPlusDeclaration{box-sizing:border-box;max-height:220px;margin:0;padding:12px;overflow:auto;background:var(--dsw-alias-markdown-code-block);border-radius:12px;color:var(--dsw-alias-label-primary);font:12px/18px ui-monospace,SFMono-Regular,Consolas,monospace;white-space:pre-wrap;overflow-wrap:anywhere}.ptcPlusBindingSourceGrid{display:grid;min-width:0;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:12px}.ptcPlusBindingSourceEditor,.ptcPlusBindingSourcePreview{display:flex;min-width:0;flex-direction:column;gap:6px}.ptcPlusBindingSourcePreview .ptcPlusCodeBlock{max-height:220px;overflow:auto}
30069
+ .ptcPlusBindingLifecycle{display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;gap:8px}.ptcPlusBindingDebug{display:flex;min-width:0;flex-direction:column;gap:10px;padding:12px 16px;border-top:0.5px solid var(--dsw-alias-border-l2)}.ptcPlusBindingDebugSummary{display:flex;align-items:center;gap:6px;margin:0;cursor:pointer;color:var(--dsw-alias-label-secondary);font-size:13px;font-weight:500;line-height:1.5;list-style:none}.ptcPlusBindingDebugSummary::-webkit-details-marker{display:none}.ptcPlusBindingDebugSummary::after{content:'';width:7px;height:7px;border-right:1.5px solid currentColor;border-bottom:1.5px solid currentColor;transform:rotate(45deg);transition:transform .16s ease}.ptcPlusBindingDebug[open] .ptcPlusBindingDebugSummary::after{transform:rotate(-135deg)}.ptcPlusBindingDebugBody{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr) auto;align-items:end;gap:10px}.ptcPlusBindingDebugBody .ptcPlusBindingField{min-width:0}.ptcPlusBindingDebugBody .ptcPlusButton{align-self:end}.ptcPlusBindingDebugWarning{grid-column:1/-1;color:var(--dsw-alias-state-warn-label);font-size:12px;line-height:1.5}.ptcPlusBindingOutput{grid-column:1/-1;margin:0;padding:10px 12px;overflow:auto;background:var(--dsw-alias-markdown-code-block);border-radius:8px;color:var(--dsw-alias-label-secondary);font:12px/18px ui-monospace,SFMono-Regular,Consolas,monospace;white-space:pre-wrap;overflow-wrap:anywhere}
30070
+ .ptcPlusBindingCommand{display:flex;min-width:0;flex-direction:column;gap:6px;margin:6px 0 10px;padding:10px 12px;border:0.5px solid var(--dsw-alias-border-l4);border-radius:8px;background:var(--dsw-alias-bg-layer-3)}.ptcPlusBindingCommandHeader{display:flex;min-width:0;flex-wrap:wrap;align-items:center;gap:8px}.ptcPlusBindingCommandTitle{margin:0;font-size:13px;font-weight:600;line-height:1.5}.ptcPlusBindingCommandState{display:inline-flex;align-items:center;gap:5px;padding:1px 8px;border-radius:999px;corner-shape:round;background:var(--dsw-alias-bg-module-platform);color:var(--dsw-alias-label-secondary);font-size:11px;font-weight:500;line-height:17px;white-space:nowrap}.ptcPlusBindingCommand[data-phase=pending] .ptcPlusBindingCommandState{background:var(--dsw-alias-state-business-tertiary);color:var(--dsw-alias-state-business-primary)}.ptcPlusBindingCommand[data-phase=ready] .ptcPlusBindingCommandState{background:var(--dsw-alias-state-success-tertiary);color:var(--dsw-alias-state-success-primary)}.ptcPlusBindingCommand[data-phase=failed] .ptcPlusBindingCommandState{background:var(--dsw-alias-interactive-bg-hover-danger);color:var(--dsw-alias-state-error-primary)}.ptcPlusBindingCommandStateDot{width:6px;height:6px;border-radius:50%;background:currentColor}.ptcPlusBindingCommandRequirement{margin:0;overflow:auto;color:var(--dsw-alias-label-primary);font:12px/18px ui-monospace,SFMono-Regular,Consolas,monospace;white-space:pre-wrap;overflow-wrap:anywhere}.ptcPlusBindingCommandSource{max-height:280px;margin:0;padding:10px 12px;overflow:auto;background:var(--dsw-alias-markdown-code-block);border-radius:8px;color:var(--dsw-alias-label-primary);font:12px/18px ui-monospace,SFMono-Regular,Consolas,monospace;white-space:pre-wrap;overflow-wrap:anywhere}.ptcPlusBindingCommandCode{max-height:300px;overflow:auto}.ptcPlusBindingCommandActions{display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;gap:8px}
30071
+
30072
+ `;
30073
+ var REPL_CONSOLE_CSS = `
30074
+ .ptcPlusBindingsSurface .ptcPlusBindingSection.ptcPlusModelPrompt{padding:12px 0}.ptcPlusModelPrompt .ptcPlusBindingSectionTitle{margin:0 0 10px}.ptcPlusModelPrompt textarea.ptcPlusInput{height:auto;min-height:80px;padding:8px 12px;resize:vertical}.ptcPlusModelPrompt .ptcPlusPromptToggle{flex-direction:row;align-items:center;justify-content:space-between;cursor:pointer}.ptcPlusModelPrompt .ptcPlusCheck{flex:none}.ptcPlusEditorHead .ptcPlusBindingLifecycle{min-width:0}.ptcPlusEditorHead .ptcPlusButton{width:auto}
30075
+ .ptcPlusConsole{box-sizing:border-box;flex:1;min-width:0;min-height:0;width:100%;height:100%;overflow:auto;padding:20px 24px;color:var(--dsw-alias-label-primary);container-type:inline-size}
30076
+ .ptcPlusConsoleSection{min-width:0}.ptcPlusConsoleSection+.ptcPlusConsoleSection{margin-top:22px;padding-top:20px;border-top:1px solid var(--dsw-alias-border-l2)}
30077
+ .ptcPlusObservationHead,.ptcPlusObservationTitle{display:flex;flex-wrap:wrap;align-items:center;gap:8px 12px}.ptcPlusObservationHead{justify-content:space-between;margin-bottom:14px}
30078
+ .ptcPlusObservationTitle h2{margin:0;font-size:15px;font-weight:600;line-height:22px}.ptcPlusObservationCount{font-size:13px;color:var(--dsw-alias-label-tertiary)}.ptcPlusObservationTime{font-size:11px;line-height:18px;color:var(--dsw-alias-label-tertiary)}
30079
+ .ptcPlusObservationGrid{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:24px}.ptcPlusObservationCatalog{min-width:0}
30080
+ .ptcPlusObservationFilters{display:flex;gap:10px;align-items:center;margin-bottom:8px}.ptcPlusObservationFilters>.ptcPlusSelect{width:120px;height:32px;flex:none;font-size:12px}
30081
+ .ptcPlusSearch{display:flex;align-items:center;gap:8px;box-sizing:border-box;min-width:0;flex:1;height:32px;padding:0 10px;border:1px solid var(--dsw-alias-border-l2);border-radius:6px;color:var(--dsw-alias-label-tertiary)}
30082
+ .ptcPlusSearch>svg{flex:none}.ptcPlusSearch input{min-width:0;width:100%;height:100%;padding:0;border:0;outline:none;background:transparent;color:var(--dsw-alias-label-primary);font:12px/20px inherit}.ptcPlusSearch:focus-within{outline:2px solid var(--dsw-alias-state-business-primary,#4d6bfe);outline-offset:1px}
30083
+ .ptcPlusObservations{height:256px;overflow:auto;overscroll-behavior:contain;scrollbar-gutter:stable;min-width:0;border:1px solid var(--dsw-alias-border-l2);border-radius:6px}
30084
+ .ptcPlusObservationTable{width:100%;table-layout:fixed;border-collapse:separate;border-spacing:0;font-size:12px;text-align:left}.ptcPlusObservationTable th{position:sticky;top:0;z-index:1;height:32px;padding:0 10px;background:var(--dsw-alias-bg-layer-3);color:var(--dsw-alias-label-tertiary);font-weight:500;border-bottom:1px solid var(--dsw-alias-border-l2)}
30085
+ .ptcPlusObservationTable th:first-child{width:34%}.ptcPlusObservationTable th:nth-child(2){width:16%}.ptcPlusObservationTable th:nth-child(3){width:72px}.ptcPlusObservationTable td{height:34px;padding:0 10px;border-bottom:1px solid var(--dsw-alias-border-l2);overflow:hidden}.ptcPlusObservationTable tr:last-child td{border-bottom:0}.ptcPlusObservationTable tbody tr{cursor:pointer}.ptcPlusObservationTable tbody tr:hover{background:var(--dsw-alias-interactive-bg-hover)}.ptcPlusObservationTable tr[data-selected=true]{background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#4d6bfe) 7%,transparent)}
30086
+ .ptcPlusObservationSelect{display:block;width:100%;min-width:0;height:34px;padding:0;border:0;background:transparent;color:inherit;cursor:pointer;text-align:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font:12px/20px ui-monospace,SFMono-Regular,Consolas,monospace}.ptcPlusObservationKind{color:var(--dsw-alias-label-tertiary);white-space:nowrap}
30087
+ .ptcPlusObservationValue{display:flex;min-width:0;align-items:center;gap:6px}.ptcPlusObservationValue code{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font:11px/18px ui-monospace,SFMono-Regular,Consolas,monospace}.ptcPlusObservationState{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:18px}.ptcPlusObservationValue .ptcPlusObservationState{flex:none}.ptcPlusObservationEmpty{padding:12px}
30088
+ .ptcPlusBindingInspector{box-sizing:border-box;min-width:0;max-height:296px;overflow:auto;padding-left:24px;border-left:1px solid var(--dsw-alias-border-l2)}
30089
+ .ptcPlusInspectorHead{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:6px 12px;margin:0 0 12px}.ptcPlusInspectorHead strong{min-width:0;overflow-wrap:anywhere;font:600 13px/20px ui-monospace,SFMono-Regular,Consolas,monospace}.ptcPlusInspectorHead span{font-size:11px;color:var(--dsw-alias-label-tertiary)}
30090
+ .ptcPlusObservationLabel{display:flex;align-items:center;justify-content:space-between;gap:8px;margin:12px 0 6px;font-size:12px;line-height:18px;color:var(--dsw-alias-label-secondary)}
30091
+ .ptcPlusObservationCode{max-height:184px;margin:0;overflow:auto;border-radius:6px;font:12px/20px ui-monospace,SFMono-Regular,Consolas,monospace;white-space:pre-wrap;overflow-wrap:anywhere}.ptcPlusObservationPreview{margin:0;padding:10px 12px;border:1px solid var(--dsw-alias-border-l2);border-radius:6px;white-space:pre-wrap;overflow-wrap:anywhere;font:12px/20px ui-monospace,SFMono-Regular,Consolas,monospace}.ptcPlusObservationUnavailable{margin:0;color:var(--dsw-alias-label-tertiary);font-size:12px}
30092
+ .ptcPlusBindingsSurface{min-width:0;container-type:inline-size}.ptcPlusBindingsSurface .ptcPlusBindings{margin:0;padding:0;border:0}.ptcPlusBindingsSurface .ptcPlusBindingsGrid{grid-template-columns:220px minmax(0,1fr);gap:20px;margin-top:12px}.ptcPlusBindingsSurface .ptcPlusBindingsTitle{font-size:15px;line-height:22px}
30093
+ .ptcPlusBindingPane{min-width:0}.ptcPlusBindingPane>.ptcPlusSearch{flex:none;margin-bottom:2px}.ptcPlusBindingsSurface .ptcPlusBindingsHead{flex-direction:row;flex-wrap:wrap;align-items:center;gap:8px}.ptcPlusBindingsSurface .ptcPlusBindingList{max-height:350px;overflow:auto;gap:0;padding:0;border:0;border-radius:0;background:transparent}.ptcPlusBindingsSurface .ptcPlusBindingItem{min-height:52px;padding:8px;border-radius:4px;box-sizing:border-box;border-bottom:1px solid var(--dsw-alias-border-l2)}.ptcPlusBindingsSurface .ptcPlusBindingItem[data-selected=true]{background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#4d6bfe) 7%,transparent)}
30094
+ .ptcPlusBindingsSurface .ptcPlusBindingName{font-size:12px;font-weight:500;white-space:normal;overflow-wrap:anywhere}.ptcPlusBindingsSurface .ptcPlusBindingMeta{font-size:11px;line-height:16px}.ptcPlusBindingsSurface .ptcPlusBindingEditor{border:0;border-radius:0;background:transparent;overflow:visible}
30095
+ .ptcPlusBindingSwitch{appearance:none;position:relative;align-self:center;flex:none;width:30px;height:18px;padding:2px;border:0;border-radius:9px;background:var(--dsw-alias-label-dimmed,#a5a7ad);cursor:pointer}.ptcPlusBindingSwitch span{display:block;width:14px;height:14px;border-radius:50%;background:#fff;box-shadow:0 1px 2px #0002;transition:transform .15s ease}.ptcPlusBindingSwitch[aria-checked=true]{background:var(--dsw-alias-state-business-primary,#4d6bfe)}.ptcPlusBindingSwitch[aria-checked=true] span{transform:translateX(12px)}.ptcPlusBindingSwitch:disabled{cursor:not-allowed;opacity:.5}
30096
+ .ptcPlusEditorHead{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:8px 12px;min-height:32px;margin-bottom:8px}.ptcPlusEditorFile{min-width:0;overflow-wrap:anywhere;font:600 13px/20px ui-monospace,SFMono-Regular,Consolas,monospace}.ptcPlusBindingLifecycle{gap:6px}
30097
+ .ptcPlusIconButton{display:inline-flex;align-items:center;justify-content:center;flex:none;box-sizing:border-box;width:30px;height:30px;padding:0;border:1px solid var(--dsw-alias-border-l2);border-radius:6px;background:transparent;color:var(--dsw-alias-label-secondary);cursor:pointer}.ptcPlusIconButton:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}.ptcPlusIconButton[data-kind=danger]:hover{color:var(--dsw-alias-state-error-primary)}.ptcPlusIconButton:disabled{opacity:.4;cursor:not-allowed}
30098
+ .ptcPlusCodeEditor{min-width:0;overflow:hidden;border:1px solid var(--dsw-alias-border-l2);border-radius:6px;--ptc-code-keyword:color-mix(in srgb,#a13d96 75%,var(--dsw-alias-label-primary));--ptc-code-string:color-mix(in srgb,#af643c 75%,var(--dsw-alias-label-primary));--ptc-code-number:color-mix(in srgb,#477ac2 75%,var(--dsw-alias-label-primary));--ptc-code-type:color-mix(in srgb,#258579 75%,var(--dsw-alias-label-primary));--ptc-code-function:color-mix(in srgb,#825bbe 75%,var(--dsw-alias-label-primary))}.ptcPlusCodeEditor:focus-within{border-color:var(--dsw-alias-state-business-primary,#4d6bfe)}.ptcPlusCodeEditor .cm-editor{height:336px}.ptcPlusCodeEditor .cm-scroller{min-height:0}.ptcPlusCodeEditor .cm-line{overflow-wrap:anywhere}
30099
+ .ptcPlusBindingsSurface .ptcPlusBindingSection{display:block;padding:0;margin-top:0;border:0;border-bottom:1px solid var(--dsw-alias-border-l2)}.ptcPlusBindingSection>summary,.ptcPlusBindingsSurface .ptcPlusBindingDebugSummary{padding:11px 0;cursor:pointer;font-size:12px;font-weight:500;color:var(--dsw-alias-label-secondary)}.ptcPlusEntrySettings .ptcPlusBindingFields{padding:0 0 14px}.ptcPlusBindingsSurface .ptcPlusBindingSourcePreview{display:block}.ptcPlusBindingSourcePreview>.ptcPlusCodeBlock{margin-bottom:12px}.ptcPlusBindingsSurface .ptcPlusBindingDebug{display:block;padding:0;border-top:0}.ptcPlusBindingsSurface .ptcPlusBindingDebugBody{grid-template-columns:minmax(0,1fr) minmax(0,1fr);padding-bottom:12px}
30100
+ .ptcPlusBindingsSurface .ptcPlusBindingRun{gap:6px;margin-top:10px}.ptcPlusBindingsSurface .ptcPlusBindingRun .ptcPlusInput{flex-basis:100%;min-width:0;width:100%;height:32px;font-size:12px}.ptcPlusBindingsSurface .ptcPlusMessage[role=status]{grid-column:1/-1;margin:0}
30101
+ .ptcPlusSessionEmpty{box-sizing:border-box;width:100%;padding:16px 18px;border:1px dashed var(--dsw-alias-border-l2);border-radius:6px;color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:20px}.ptcPlusObservationGrid[data-empty=true]{grid-template-columns:minmax(0,1fr)}.ptcPlusObservationGrid[data-empty=true] .ptcPlusObservations{height:auto;min-height:94px}
30102
+ .ptcPlusSourceSection{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:0 12px;border-bottom:1px solid var(--dsw-alias-border-l2)}.ptcPlusSourceToggle{display:flex;min-width:0;align-items:center;gap:6px;padding:12px 0;border:0;background:transparent;color:var(--dsw-alias-label-secondary);text-align:left;cursor:pointer;font:500 12px/20px inherit}.ptcPlusSourceToggle svg{flex:none}.ptcPlusSourceFilename{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--dsw-alias-label-tertiary);font:11px/20px ui-monospace,SFMono-Regular,Consolas,monospace}.ptcPlusSourceActions{display:flex;flex-wrap:wrap;gap:6px;padding:6px 0}.ptcPlusSourceBody{grid-column:1/-1;min-width:0;margin-bottom:12px}.ptcPlusSourceCode{max-height:336px;overflow:auto;margin:0;border-radius:6px;font:12px/20px ui-monospace,SFMono-Regular,Consolas,monospace;white-space:pre-wrap;overflow-wrap:anywhere}
30103
+ .ptcPlusWorkbenchFeedback{min-height:22px;padding:4px 0;color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:18px;overflow-wrap:anywhere}.ptcPlusBindings[aria-busy=true] button:disabled,.ptcPlusBindings[aria-busy=true] input:disabled{opacity:1}.ptcPlusBindings[aria-busy=true] button:disabled{cursor:wait}
30104
+ .ptcPlusExecution{min-width:0;margin:0 0 12px;border:1px solid var(--dsw-alias-border-l2);border-radius:6px;overflow:hidden;background:var(--dsw-alias-bg-layer-3)}.ptcPlusExecution>summary{padding:10px 12px;cursor:pointer;font-size:12px;font-weight:500;line-height:20px;color:var(--dsw-alias-label-secondary)}.ptcPlusExecutionToolbar{display:flex;flex-wrap:wrap;align-items:center;gap:8px;padding:8px 12px;border-top:1px solid var(--dsw-alias-border-l2);border-bottom:1px solid var(--dsw-alias-border-l2)}.ptcPlusExecutionLanguage{font:11px/18px ui-monospace,SFMono-Regular,Consolas,monospace;color:var(--dsw-alias-label-secondary)}.ptcPlusExecutionState{font-size:11px;line-height:18px;color:var(--dsw-alias-label-tertiary)}.ptcPlusExecutionActions{display:flex;align-items:center;gap:6px;margin-left:auto}.ptcPlusExecutionActions .ptcPlusButton{min-width:68px;min-height:30px;padding:3px 10px;font-size:12px}
30105
+ .ptcPlusExecutionHistory{min-height:48px;max-height:320px;overflow:auto;overscroll-behavior:contain;scrollbar-gutter:stable}.ptcPlusExecutionHistory:empty{min-height:0}.ptcPlusExecutionRecord{min-width:0;padding:10px 12px;border-bottom:1px solid var(--dsw-alias-border-l2)}.ptcPlusExecutionCommand,.ptcPlusExecutionOutput{margin:0;white-space:pre-wrap;overflow-wrap:anywhere;font:12px/20px ui-monospace,SFMono-Regular,Consolas,monospace}.ptcPlusExecutionCommand{color:var(--dsw-alias-label-secondary)}.ptcPlusExecutionCommand>span{color:var(--dsw-alias-label-tertiary)}.ptcPlusExecutionResult{flex-direction:row;gap:12px;margin-top:8px;padding:12px 16px}.ptcPlusExecutionOutputLabel{flex:none;color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:20px}.ptcPlusExecutionOutput{flex:1;min-width:0;max-height:240px;overflow:auto;overscroll-behavior:contain;scrollbar-gutter:stable;color:var(--dsw-alias-label-secondary)}.ptcPlusExecutionOutput:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary,#4d6bfe);outline-offset:-2px}.ptcPlusExecutionOutput[data-error=true]{color:var(--dsw-alias-state-error-primary)}.ptcPlusExecutionDuration{display:block;margin-top:4px;color:var(--dsw-alias-label-tertiary);font-size:10px;line-height:16px}.ptcPlusExecutionInput .ptcPlusCodeEditor{border:0;border-radius:0}.ptcPlusExecutionInput .cm-editor{height:108px}.ptcPlusExecutionInput .cm-content{min-height:88px}
30106
+ @container(max-width:460px){.ptcPlusSourceSection{grid-template-columns:minmax(0,1fr)}.ptcPlusSourceToggle{padding-bottom:6px}.ptcPlusSourceActions{justify-content:flex-end}.ptcPlusExecutionToolbar{gap:6px;padding:8px}.ptcPlusExecutionActions{gap:4px}.ptcPlusSourceFilename{display:none}}
30107
+ .ptcPlusBindingsModal.ptcPlusBindingsModal{width:min(1200px,calc(100vw - 32px));max-width:none;max-height:calc(100dvh - 40px);border-radius:8px}.ptcPlusBindingsDialog{box-sizing:border-box;max-height:calc(100dvh - 40px);overflow:auto;padding:24px}.ptcPlusBindingsDialogHead{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-bottom:16px}.ptcPlusBindingsDialogHead h2{margin:0;font-size:17px;line-height:24px}.ptcPlusDialogClose{display:flex;flex:none;align-items:center;justify-content:center;width:32px;height:32px;padding:0;border:0;border-radius:4px;background:transparent;color:inherit;cursor:pointer}.ptcPlusDialogClose:hover{background:var(--dsw-alias-interactive-bg-hover)}.ptcPlusConsole button:focus-visible,.ptcPlusBindingsDialog button:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary,#4d6bfe);outline-offset:-2px}
30108
+ @container(max-width:780px){.ptcPlusObservationGrid{grid-template-columns:minmax(0,1fr);gap:16px}.ptcPlusBindingInspector{max-height:none;padding:12px 0 0;border-left:0;border-top:1px solid var(--dsw-alias-border-l2)}.ptcPlusObservations{height:200px}.ptcPlusBindingsSurface .ptcPlusBindingsGrid{grid-template-columns:minmax(0,1fr);gap:18px}.ptcPlusBindingsSurface .ptcPlusBindingList{max-height:180px}.ptcPlusBindingsSurface .ptcPlusBindingFields,.ptcPlusBindingsSurface .ptcPlusBindingDebugBody{grid-template-columns:minmax(0,1fr)}.ptcPlusObservationTable th:first-child{width:35%}.ptcPlusObservationTable th:nth-child(2){width:64px}.ptcPlusObservationTable th:nth-child(3){width:64px}}
30109
+ @media(max-width:560px){.ptcPlusConsole{padding:14px 12px}.ptcPlusBindingsModal.ptcPlusBindingsModal{width:calc(100vw - 16px);max-height:calc(100dvh - 16px)}.ptcPlusBindingsDialog{padding:16px;max-height:calc(100dvh - 16px)}.ptcPlusObservationFilters>.ptcPlusSelect{width:105px}.ptcPlusObservationTable th,.ptcPlusObservationTable td{padding:0 6px}.ptcPlusObservationValue{gap:3px}.ptcPlusObservationState{font-size:10px}.ptcPlusEditorHead{align-items:flex-start}.ptcPlusEditorHead>.ptcPlusBindingLifecycle{margin-left:auto}.ptcPlusSourceBody .cm-editor{height:300px}}
30110
+ .ptcPlusReplIdentity{grid-column:1}.ptcPlusReplReuse{flex:none;padding:0 5px;border-radius:999px;background:var(--dsw-alias-bg-layer-2,rgba(38,49,72,.06));color:var(--dsw-alias-label-tertiary,#74777d);font:500 10px/15px system-ui,sans-serif;white-space:nowrap}
30111
+ .ptcPlusObservationReuseTotal{font-size:13px;color:var(--dsw-alias-label-tertiary)}.ptcPlusObservationReuse{color:var(--dsw-alias-label-tertiary);white-space:nowrap;font-variant-numeric:tabular-nums}
30112
+ `;
30113
+ var CLIENT_PLUGIN_ID = true ? "dsh-ptc-plus" : "dsh-ptc-plus";
30114
+ var CLIENT_STYLE_TAG = `${CLIENT_PLUGIN_ID}/client.css`;
30115
+ var CODEMIRROR_STYLE_TAG = `${CLIENT_PLUGIN_ID}/codemirror.css`;
30116
+ function installStyles() {
30117
+ if (typeof document === "undefined") return () => {
30118
+ };
30119
+ const style = document.createElement("style");
30120
+ style.id = CLIENT_STYLE_ID;
30121
+ style.dataset.plugin = CLIENT_PLUGIN_ID;
30122
+ style.dataset.pluginCss = CLIENT_STYLE_TAG;
30123
+ style.textContent = `${CLIENT_CSS}${BINDING_WORKBENCH_CSS}${REPL_CONSOLE_CSS}`;
30124
+ document.head.append(style);
30125
+ return () => style.remove();
30126
+ }
30127
+ function captureUnownedStyles() {
30128
+ if (typeof document === "undefined") return /* @__PURE__ */ new Set();
30129
+ return new Set(document.querySelectorAll("style:not([data-plugin])"));
30130
+ }
30131
+ function adoptUnownedStyles(known, tagId = CODEMIRROR_STYLE_TAG) {
30132
+ if (typeof document === "undefined") return;
30133
+ for (const style of document.querySelectorAll("style:not([data-plugin])")) {
30134
+ if (known?.has(style)) continue;
30135
+ style.dataset.plugin = CLIENT_PLUGIN_ID;
30136
+ style.dataset.pluginCss = tagId;
30137
+ }
30138
+ }
30139
+
29731
30140
  // src/client-code-editor.js
29732
30141
  var editorTheme = EditorView.theme({
29733
30142
  "&": { backgroundColor: "var(--dsw-alias-bg-layer-3)", color: "var(--dsw-alias-label-primary)", fontSize: "12px" },
@@ -29761,6 +30170,7 @@
29761
30170
  latest.current = { value, onChange, onRun };
29762
30171
  const accessExtensions = () => [EditorState.readOnly.of(disabled), EditorView.editable.of(!disabled)];
29763
30172
  React.useLayoutEffect(() => {
30173
+ const unowned = captureUnownedStyles();
29764
30174
  const editor = new EditorView({
29765
30175
  parent: parent.current,
29766
30176
  state: EditorState.create({ doc: value, extensions: [
@@ -29784,6 +30194,7 @@
29784
30194
  })
29785
30195
  ] })
29786
30196
  });
30197
+ adoptUnownedStyles(unowned);
29787
30198
  view.current = editor;
29788
30199
  return () => {
29789
30200
  view.current = null;
@@ -30184,6 +30595,9 @@
30184
30595
  "bindings.openHint": "PTC Plus \xB7 \u5168\u5C40\u7ED1\u5B9A\u4E0E\u8BBE\u7F6E",
30185
30596
  "bindings.draftHint": "PTC Plus \u63D2\u4EF6 \xB7 \u7ED1\u5B9A\u8349\u7A3F\u5F85\u5904\u7406\uFF0C\u70B9\u51FB\u67E5\u770B",
30186
30597
  "bindings.quickHeading": "\u5168\u5C40\u7528\u6237\u7ED1\u5B9A \xB7 \u5BF9\u6240\u6709\u4F1A\u8BDD\u751F\u6548",
30598
+ "bindings.quickEnabled": "\u5DF2\u542F\u7528\uFF08{count}\uFF09",
30599
+ "bindings.quickDisabled": "\u505C\u7528\uFF08{count}\uFF09",
30600
+ "bindings.quickNoEnabled": "\u6682\u65E0\u542F\u7528\u7ED1\u5B9A",
30187
30601
  "bindings.quickDrafts": "\u5F85\u5904\u7406\u8349\u7A3F",
30188
30602
  "bindings.quickLoading": "\u6B63\u5728\u8BFB\u53D6\u7ED1\u5B9A\u2026",
30189
30603
  "bindings.quickSaving": "\u6B63\u5728\u4FDD\u5B58\u2026",
@@ -30196,6 +30610,8 @@
30196
30610
  "bindings.reviewExpand": "\u5C55\u5F00\u7ED1\u5B9A\u8349\u7A3F",
30197
30611
  "bindings.reviewCollapse": "\u6298\u53E0\u7ED1\u5B9A\u8349\u7A3F",
30198
30612
  "bindings.reviewClose": "\u5173\u95ED\u7ED1\u5B9A\u8349\u7A3F\u9762\u677F",
30613
+ "bindings.reviewEnlarge": "\u653E\u5927\u67E5\u770B\u7ED1\u5B9A\u8349\u7A3F",
30614
+ "bindings.reviewRestore": "\u7F29\u5C0F\u663E\u793A\u7ED1\u5B9A\u8349\u7A3F",
30199
30615
  "bindings.reviewOpen": "\u6253\u5F00\u8349\u7A3F",
30200
30616
  "bindings.reviewMenuLabel": "\u7ED1\u5B9A\u8349\u7A3F\uFF08{count}\uFF09",
30201
30617
  "bindings.reviewLoading": "\u6B63\u5728\u786E\u8BA4\u8349\u7A3F\u64CD\u4F5C\u8D44\u683C\u2026",
@@ -30355,6 +30771,9 @@
30355
30771
  "bindings.openHint": "PTC Plus \xB7 Global bindings and settings",
30356
30772
  "bindings.draftHint": "PTC Plus plugin \xB7 Binding draft pending; click to review",
30357
30773
  "bindings.quickHeading": "Global bindings \xB7 Applies to all sessions",
30774
+ "bindings.quickEnabled": "Enabled ({count})",
30775
+ "bindings.quickDisabled": "Disabled ({count})",
30776
+ "bindings.quickNoEnabled": "No enabled bindings",
30358
30777
  "bindings.quickDrafts": "Pending drafts",
30359
30778
  "bindings.quickLoading": "Loading bindings\u2026",
30360
30779
  "bindings.quickSaving": "Saving\u2026",
@@ -30367,6 +30786,8 @@
30367
30786
  "bindings.reviewExpand": "Expand binding draft",
30368
30787
  "bindings.reviewCollapse": "Collapse binding draft",
30369
30788
  "bindings.reviewClose": "Close binding draft panel",
30789
+ "bindings.reviewEnlarge": "Enlarge binding draft",
30790
+ "bindings.reviewRestore": "Shrink binding draft",
30370
30791
  "bindings.reviewOpen": "Open draft",
30371
30792
  "bindings.reviewMenuLabel": "Binding drafts ({count})",
30372
30793
  "bindings.reviewLoading": "Confirming draft actions\u2026",
@@ -30443,120 +30864,6 @@
30443
30864
  })])
30444
30865
  ));
30445
30866
 
30446
- // src/client-styles.js
30447
- var CLIENT_STYLE_ID = "ptc-plus-client-style";
30448
- var CLIENT_CSS = `
30449
- .ptcPlusBindingDockAnchor{position:relative;flex:none;block-size:0;min-width:0;width:min(calc(100% - 32px),44rem);margin-inline:auto}
30450
- .ptcPlusBindingDock{position:absolute;inset-inline:0;bottom:var(--ptc-plus-review-offset,8px);box-sizing:border-box;min-width:0;display:flex;flex-direction:column;border:1px solid var(--dsw-alias-border-l3,rgba(0,0,0,.1));border-radius:14px;background:var(--dsw-alias-bg-base,#fff);color:var(--dsw-alias-label-primary,#18191c);box-shadow:0 8px 32px rgba(0,0,0,.14),0 2px 6px rgba(0,0,0,.06);max-block-size:var(--ptc-plus-review-height,80dvh);overflow:auto;overscroll-behavior:contain}
30451
- .ptcPlusBindingDockHead{display:flex;flex:none;align-items:center;gap:4px;min-width:0;padding:0 10px 0 0}.ptcPlusBindingDockToggle{appearance:none;display:flex;flex:1;align-items:center;gap:10px;min-width:0;min-height:54px;padding:10px 12px;border:0;background:transparent;color:inherit;text-align:start;font:inherit;cursor:pointer}.ptcPlusBindingDockToggle:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(38,49,72,.06))}.ptcPlusBindingDockToggle:focus-visible{outline:2px solid var(--dsw-alias-interactive-primary,#4d6bfe);outline-offset:-3px}.ptcPlusBindingDockSymbol{display:grid;place-items:center;flex:none;width:30px;height:30px;border-radius:8px;background:var(--dsw-alias-bg-layer-2,#f3f4f6);color:var(--dsw-alias-label-secondary,#52565d);font:600 13px ui-monospace,monospace}.ptcPlusBindingDockHeading{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px;font-size:13px;line-height:18px}.ptcPlusBindingDockHeading strong,.ptcPlusBindingDockHeading>span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ptcPlusBindingDockHeading>span{font-size:11px;color:var(--dsw-alias-label-secondary,#52565d)}.ptcPlusBindingDockChevron{display:flex;flex:none;transform:rotate(180deg);transition:transform .16s ease}.ptcPlusBindingDockToggle[aria-expanded=true] .ptcPlusBindingDockChevron{transform:rotate(0deg)}
30452
- .ptcPlusBindingDockBody{flex:none;min-width:0;max-block-size:min(32dvh,20rem,var(--ptc-plus-review-space,100dvh));overflow:auto;overscroll-behavior:contain;scrollbar-gutter:stable;border-top:1px solid var(--dsw-alias-border-l3,rgba(0,0,0,.1))}.ptcPlusBindingDock[data-scroll=panel] .ptcPlusBindingDockBody{max-block-size:none;overflow:visible;scrollbar-gutter:auto}.ptcPlusBindingDockBody:focus-visible{outline:2px solid var(--dsw-alias-interactive-primary);outline-offset:-2px}.ptcPlusBindingDockBody .ptcPlusAuthoringDraft{border:0;padding:12px 14px;background:transparent;gap:10px}.ptcPlusBindingDockBody .ptcPlusBindingCommandSource,.ptcPlusBindingDockBody .ptcPlusBindingCommandCode{max-height:none;margin:0}.ptcPlusBindingDockBody pre{font-size:12px;line-height:19px}.ptcPlusBindingDockBody .ptcPlusBindingMeta{font:11px/17px ui-monospace,monospace;overflow-wrap:anywhere}.ptcPlusBindingDockActions{display:flex;flex:none;flex-wrap:wrap;align-items:center;gap:6px;padding:10px 12px;border-top:1px solid var(--dsw-alias-border-l3,rgba(0,0,0,.1))}.ptcPlusBindingDockActions>button{min-width:0;white-space:normal}.ptcPlusBindingDockDiscard{margin-inline-end:auto}.ptcPlusBindingDock .ptcPlusMessage{margin:0;font-size:12px;line-height:19px}.ptcPlusBindingDock>.ptcPlusMessage{padding:8px 12px}.ptcPlusComposerBindingAnchor{display:inline-flex;min-width:1px;min-height:1px}.ptcPlusComposerBindingAnchor .ptcPlusAuthorButton{position:relative}.ptcPlusDraftBadge{position:absolute;top:-2px;right:-3px;display:grid;place-items:center;box-sizing:border-box;min-width:14px;height:14px;padding-inline:3px;border:1.5px solid var(--dsw-alias-bg-base,#fff);border-radius:8px;background:var(--dsw-alias-state-business-primary,#4d6bfe);color:#fff;font:600 9px/1 system-ui,sans-serif;pointer-events:none}.ptcPlusDraftBadge[data-attention=true]{background:var(--dsw-alias-state-warning-primary,#a15c00)}.ptcPlusDraftMenuItem{display:flex;min-width:0;max-width:240px;flex-direction:column;gap:3px;white-space:normal;overflow-wrap:anywhere}.ptcPlusDraftMenuItem strong{font-size:12px;font-weight:600}.ptcPlusDraftMenuItem>span{font-size:11px;color:var(--dsw-alias-label-secondary,#52565d)}.ptcPlusComposerBindingAnchor[data-text=true] .ptcPlusAuthorButtonShell{width:auto}
30453
- .ptcPlusBindingCommand .ptcPlusMessage{margin:0}.ptcPlusBindingSourceDetails{min-width:0}.ptcPlusBindingSourceDetails>summary{cursor:pointer;font-size:12px;line-height:20px}.ptcPlusBindingItem>button,.ptcPlusGlobalItem>button{align-self:center}.ptcPlusAuthoringDraft>strong{font-size:13px;line-height:20px;overflow-wrap:anywhere}.ptcPlusBindingCommand .ptcPlusBindingCommandState{max-width:100%;box-sizing:border-box;white-space:normal}.ptcPlusBindingCommand .ptcPlusAuthoringDraft{min-width:0;padding:0;border:0;border-radius:0;background:transparent}
30454
- .ptcPlusCard{list-style:none;border:0.5px solid var(--dsw-alias-border-l4);border-radius:16px;background:var(--dsw-alias-bg-layer-3);overflow:hidden;transition:border-color .16s ease,background-color .16s ease}
30455
- .ptcPlusCard:hover{border-color:var(--dsw-alias-label-dimmed)}
30456
- .ptcPlusRow>.ptcPlusSelect{width:auto;max-width:100%;flex:none}
30457
- .ptcPlusCard[data-open=true]{background:var(--dsw-alias-bg-layer-2);border-color:var(--dsw-alias-label-dimmed)}
30458
- .ptcPlusHeader{appearance:none;width:100%;display:flex;align-items:center;gap:12px;padding:14px 16px;border:0;background:transparent;color:inherit;font:inherit;text-align:left;cursor:pointer;border-radius:12px}
30459
- .ptcPlusHeader:hover{background:var(--dsw-alias-interactive-bg-hover)}.ptcPlusHeader:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:-2px}
30460
- .ptcPlusButton:focus-visible,.ptcPlusInput:focus-visible,.ptcPlusSelect:focus-visible,.ptcPlusTextarea:focus-visible,.ptcPlusBindingSelect:focus-visible,.ptcPlusReplBindingTrigger:focus-visible,.ptcPlusReplInspect:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:1px}
30461
- .ptcPlusHeadText{display:flex;flex:1;min-width:0;flex-direction:column;align-items:flex-start;gap:3px}.ptcPlusName{font-size:15px;font-weight:600;line-height:1.4}.ptcPlusDescription{color:var(--dsw-alias-label-tertiary);font-size:13px;line-height:1.5;overflow-wrap:anywhere}.ptcPlusStatus{display:inline-flex;align-items:center;flex:none;padding:1px 8px;border-radius:999px;corner-shape:round;background:var(--dsw-alias-bg-module-platform);color:var(--dsw-alias-label-secondary);font-size:11px;font-weight:500;line-height:17px;white-space:nowrap}.ptcPlusStatus[data-enabled=true]{color:var(--dsw-alias-state-success-primary);background:var(--dsw-alias-state-success-tertiary)}.ptcPlusStatus[data-enabled=false]{color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-module-platform)}
30462
- .ptcPlusChevron{display:flex;color:var(--dsw-alias-label-tertiary);transition:transform .18s ease}.ptcPlusChevron[data-open=true]{transform:rotate(180deg)}.ptcPlusBody{display:grid;grid-template-rows:0fr;transition:grid-template-rows .2s ease}.ptcPlusBody[data-open=true]{grid-template-rows:1fr}.ptcPlusBodyInner{min-height:0;overflow:hidden}.ptcPlusFields{margin:0 16px;padding:8px 0 12px;border-top:0.5px solid var(--dsw-alias-border-l2)}
30463
- .ptcPlusGroup+.ptcPlusGroup{margin-top:20px;padding-top:12px;border-top:1px solid var(--dsw-alias-border-l2)}.ptcPlusGroupTitle{margin:0;padding:8px 0;color:var(--dsw-alias-label-secondary);font-size:13px;font-weight:600;letter-spacing:0;line-height:20px}.ptcPlusRow{display:flex;align-items:center;gap:12px;min-height:48px;border-top:0.5px solid var(--dsw-alias-border-l2)}.ptcPlusGroupTitle+.ptcPlusRow{border-top:0}.ptcPlusMain{flex:1;min-width:0}.ptcPlusLabel{font-size:13px;font-weight:500;line-height:1.5}.ptcPlusDetail,.ptcPlusMessage{color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:1.5;overflow-wrap:anywhere}.ptcPlusInput{box-sizing:border-box;min-width:72px;width:140px;height:34px;padding:0 12px;border:0.5px solid var(--dsw-alias-border-l4);border-radius:8px;background:var(--dsw-alias-bg-layer-3);color:var(--dsw-alias-label-primary);font:inherit;font-size:13px;line-height:1.5}.ptcPlusInput:focus-visible{border-color:var(--dsw-alias-brand-primary);outline:none}.ptcPlusCheck{width:18px;height:18px;accent-color:var(--dsw-alias-brand-primary)}
30464
- .ptcPlusFooter{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:8px}.ptcPlusButton{appearance:none;display:inline-flex;align-items:center;justify-content:center;gap:5px;min-height:32px;padding:4px 14px;border:0.5px solid var(--dsw-alias-border-l3);border-radius:8px;background:transparent;color:var(--dsw-alias-label-secondary);cursor:pointer;font:inherit;font-size:13px;line-height:1.5;transition:color .16s ease,border-color .16s ease,background-color .16s ease}.ptcPlusButton:hover:not(:disabled){border-color:var(--dsw-alias-label-dimmed);color:var(--dsw-alias-label-primary)}.ptcPlusButton[data-kind=primary]{background:var(--dsw-alias-label-primary);border-color:transparent;color:var(--dsw-alias-bg-layer-3)}.ptcPlusButton[data-kind=primary]:hover:not(:disabled){background:var(--dsw-alias-label-primary-dimmed);border-color:transparent;color:var(--dsw-alias-bg-layer-3)}.ptcPlusButton[data-kind=ghost]{border-color:transparent}.ptcPlusButton[data-kind=ghost]:hover:not(:disabled){border-color:var(--dsw-alias-border-l3)}.ptcPlusButton[data-kind=danger]{color:var(--dsw-alias-state-error-primary)}.ptcPlusButton[data-kind=danger]:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover-danger);border-color:var(--dsw-alias-state-error-primary);color:var(--dsw-alias-state-error-primary)}.ptcPlusButton:disabled,.ptcPlusInput:disabled,.ptcPlusCheck:disabled{cursor:not-allowed;opacity:.4}
30465
- .ptcPlusSettingAction{padding:4px 0 12px}
30466
- .ptcPlusSettingsModal.ptcPlusSettingsModal{width:min(760px,calc(100vw - 32px));max-width:none;max-height:calc(100dvh - 40px);border-radius:8px}.ptcPlusSettingsDialogContent{min-height:0;overflow:auto;overscroll-behavior:contain}.ptcPlusSettingsDialog{min-width:0}.ptcPlusSettingsDialog .ptcPlusFields{margin:0;padding:0 0 12px;border-top:0}
30467
- .ptcPlusDanger{color:var(--dsw-alias-state-error-primary)}
30468
- .ptcPlusActiveShell{display:inline-flex;align-items:center}.ptcPlusActive{appearance:none;display:inline-flex;height:24px;align-items:center;gap:5px;padding:0 8px;border:1px solid color-mix(in srgb,var(--dsw-alias-state-success-primary,#16794f) 32%,transparent);border-radius:6px;background:var(--dsw-alias-state-success-tertiary,#e7f7ef);color:var(--dsw-alias-state-success-primary,#16794f);cursor:help;font-family:inherit;font-size:12px;font-weight:600;line-height:18px;white-space:nowrap;transition:background-color .14s ease,border-color .14s ease}.ptcPlusActive:hover,.ptcPlusActive[aria-expanded=true]{border-color:color-mix(in srgb,var(--dsw-alias-state-success-primary,#16794f) 48%,transparent);background:color-mix(in srgb,var(--dsw-alias-state-success-primary,#16794f) 16%,var(--dsw-alias-bg-layer-3,#fff))}.ptcPlusActive:focus-visible{outline:2px solid var(--dsw-alias-state-success-primary,#16794f);outline-offset:2px}.ptcPlusReplPopover{position:fixed;z-index:2147483000;inset:auto;display:none;box-sizing:border-box;margin:0;padding:0;border:0;overflow:visible;background:transparent;color:var(--dsw-alias-label-primary,#18191c)}.ptcPlusReplPopover:popover-open,.ptcPlusReplPopover[data-open=true]{display:block}.ptcPlusReplPopover::backdrop{background:transparent}.ptcPlusReplCard{display:flex;max-height:inherit;overflow:hidden;flex-direction:column;border:1px solid color-mix(in srgb,var(--dsw-alias-state-success-primary,#16794f) 22%,var(--dsw-alias-border-l2,rgba(0,0,0,.1)));border-top:3px solid var(--dsw-alias-state-success-primary,#16794f);border-radius:8px;background:var(--dsw-alias-bg-layer-3,#fff);box-shadow:0 14px 36px rgba(16,24,40,.2),0 3px 10px rgba(16,24,40,.1);color:var(--dsw-alias-label-primary,#18191c);white-space:normal}.ptcPlusReplHead{display:grid;flex:none;grid-template-columns:auto minmax(0,1fr);align-items:center;column-gap:8px;padding:11px 13px 10px;border-bottom:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.1));background:color-mix(in srgb,var(--dsw-alias-state-success-primary,#16794f) 7%,var(--dsw-alias-bg-layer-3,#fff))}.ptcPlusReplStatusDot{grid-row:1/3;width:8px;height:8px;border-radius:50%;background:var(--dsw-alias-state-success-primary,#16794f);box-shadow:0 0 0 3px color-mix(in srgb,var(--dsw-alias-state-success-primary,#16794f) 14%,transparent)}.ptcPlusReplTitle,.ptcPlusReplSummary{display:block;min-width:0}.ptcPlusReplTitle{font-size:13px;font-weight:600;line-height:19px}.ptcPlusReplSummary{min-height:16px;overflow-wrap:anywhere;color:var(--dsw-alias-label-tertiary,#74777d);font-size:11px;line-height:16px}.ptcPlusReplList{min-height:0;margin:0;padding:5px 0;overflow:auto;overscroll-behavior:contain;list-style:none;scrollbar-gutter:stable}.ptcPlusReplBinding{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:4px 10px;padding:7px 12px}.ptcPlusReplBinding:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(38,49,72,.06))}.ptcPlusReplIdentity{display:flex;min-width:0;align-items:center;gap:7px}.ptcPlusReplName{min-width:0;overflow:hidden;font:12px/18px ui-monospace,SFMono-Regular,Consolas,monospace;text-overflow:ellipsis;white-space:nowrap}.ptcPlusReplKind{flex:none;padding:1px 6px;border:1px solid color-mix(in srgb,currentColor 22%,transparent);border-radius:999px;background:color-mix(in srgb,currentColor 10%,transparent);font-size:10px;font-weight:600;line-height:15px}.ptcPlusReplKind[data-kind=variable]{color:var(--dsw-alias-interactive-primary,#315fbd)}.ptcPlusReplKind[data-kind=function]{color:#7651b5}.ptcPlusReplKind[data-kind=class]{color:var(--dsw-alias-state-warning-primary,#946200)}.ptcPlusReplKind[data-kind=import]{color:#14766f}.ptcPlusReplPreview{grid-column:1;min-width:0;overflow:hidden;color:var(--dsw-alias-label-tertiary,#74777d);font:11px/16px ui-monospace,SFMono-Regular,Consolas,monospace;text-overflow:ellipsis;white-space:nowrap}.ptcPlusReplInspect{grid-column:2;grid-row:1/3;display:inline-flex;align-items:center;gap:4px;padding:3px 5px;border:0;border-radius:4px;background:transparent;color:var(--dsw-alias-label-secondary,#52565d);cursor:pointer;font:500 11px/17px inherit;white-space:nowrap}.ptcPlusReplInspect:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(38,49,72,.06));color:var(--dsw-alias-interactive-primary,#4d6bfe)}.ptcPlusReplInspect:focus-visible{outline:2px solid var(--dsw-alias-interactive-primary,#4d6bfe);outline-offset:1px}.ptcPlusReplDefinition{grid-column:1/-1;min-width:0;margin-top:4px;padding:8px;border-left:2px solid var(--dsw-alias-interactive-primary,#4d6bfe);background:var(--dsw-alias-bg-layer-2,rgba(38,49,72,.03))}.ptcPlusReplLocation{display:block;margin-bottom:5px;color:var(--dsw-alias-label-tertiary,#74777d);font-size:10px;line-height:15px}.ptcPlusReplCode{max-height:180px;margin:0;overflow:auto;color:inherit;font:11px/16px ui-monospace,SFMono-Regular,Consolas,monospace;white-space:pre-wrap;overflow-wrap:anywhere}.ptcPlusReplEmpty,.ptcPlusReplMore{display:block;color:var(--dsw-alias-label-tertiary,#74777d)}.ptcPlusReplEmpty{padding:18px 13px;font-size:12px;line-height:18px}.ptcPlusReplMore{padding:8px 13px;border-top:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.1));background:var(--dsw-alias-bg-layer-2,rgba(38,49,72,.03));font-size:11px;line-height:17px}
30469
- .ptcPlusReplTabs{display:flex;flex:none;padding:6px 8px 0;border-bottom:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.1))}.ptcPlusReplTab{flex:1;padding:5px 6px;border:0;border-bottom:2px solid transparent;background:transparent;color:var(--dsw-alias-label-secondary,#52565d);cursor:pointer;font-family:inherit;font-size:11px;font-weight:600;line-height:17px}.ptcPlusReplTab[aria-selected=true]{border-bottom-color:var(--dsw-alias-interactive-primary,#4d6bfe);color:var(--dsw-alias-label-primary,#18191c)}.ptcPlusGlobalPane{display:flex;min-height:0;flex-direction:column;gap:8px;padding:8px 12px}.ptcPlusGlobalList{min-height:0;margin:0 -12px -8px;padding:5px 0;overflow:auto;list-style:none}.ptcPlusGlobalItem{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:6px 10px;padding:7px 12px;border-radius:8px}.ptcPlusGlobalItem:hover{background:var(--dsw-alias-interactive-bg-hover)}.ptcPlusGlobalItem .ptcPlusGlobalSource,.ptcPlusGlobalItem .ptcPlusReplEmpty{grid-column:1/-1}.ptcPlusAuthoringDraft{display:flex;flex-direction:column;gap:6px;padding:10px 12px;border:0.5px solid var(--dsw-alias-border-l4);border-radius:12px;background:var(--dsw-alias-bg-layer-3)}.ptcPlusGlobalSource{max-height:180px;margin:6px 0 0;padding:8px 10px;overflow:auto;background:var(--dsw-alias-markdown-code-block);border-radius:8px;font:12px/18px ui-monospace,SFMono-Regular,Consolas,monospace;white-space:pre-wrap;overflow-wrap:anywhere}
30470
- .ptcPlusReplList{max-height:min(52vh,480px)}.ptcPlusReplBinding{grid-template-columns:minmax(0,1fr) 24px;gap:3px 8px;min-height:36px;padding:5px 12px;content-visibility:auto;contain-intrinsic-size:36px;cursor:pointer;transition:background-color .16s ease}.ptcPlusReplBinding:focus-visible{outline:2px solid var(--dsw-alias-interactive-primary,#4d6bfe);outline-offset:-2px}.ptcPlusReplBinding[data-expanded=true]{background:color-mix(in srgb,var(--dsw-alias-interactive-primary,#4d6bfe) 5%,transparent)}.ptcPlusReplName{grid-column:1}.ptcPlusReplName[data-kind=variable]{color:var(--dsw-alias-interactive-primary,#315fbd)}.ptcPlusReplName[data-kind=function]{color:#7651b5}.ptcPlusReplName[data-kind=class]{color:var(--dsw-alias-state-warning-primary,#946200)}.ptcPlusReplName[data-kind=import]{color:#14766f}.ptcPlusReplPreview{grid-column:1}.ptcPlusReplChevron{grid-column:2;grid-row:1/3;display:flex;align-items:center;justify-content:center;color:var(--dsw-alias-label-tertiary,#74777d);transition:transform .2s ease}.ptcPlusReplChevron[data-open=true]{transform:rotate(180deg)}.ptcPlusReplDefinitionWrap{grid-column:1/-1;display:grid;grid-template-rows:0fr;min-width:0;transition:grid-template-rows .24s cubic-bezier(.2,.7,.2,1)}.ptcPlusReplDefinitionWrap[data-open=true]{grid-template-rows:1fr}.ptcPlusReplDefinitionInner{min-height:0;overflow:hidden}
30471
- .ptcPlusTool{display:flex;min-width:0;flex-direction:column}.ptcPlusToolPreview{display:flex;min-width:0;flex:1 1 auto;flex-direction:row;align-items:center;overflow:hidden;margin-left:7px}.ptcPlusToolPreview .ptcPlusFeatures{flex:0 1 auto;flex-wrap:nowrap;overflow:hidden;margin:0 0 0 7px}.ptcPlusToolSummaryLine{box-sizing:border-box;display:flex;min-width:0;min-height:20px;flex:1 1 auto;align-items:center;gap:7px;padding:0;color:inherit;line-height:20px}.ptcPlusToolSummary{box-sizing:border-box;display:flex;min-width:0;min-height:32px;align-items:center;gap:7px;padding:0;color:inherit;line-height:20px}.ptcPlusToolSummary[data-expandable=true]{cursor:pointer}.ptcPlusToolSummary[data-expandable=true]:hover .ptcPlusToolTitle{color:var(--dsw-alias-interactive-primary,#4d6bfe)}.ptcPlusToolSummary:focus-visible{outline:2px solid var(--dsw-alias-interactive-primary,#4d6bfe);outline-offset:2px}.ptcPlusToolLeading{display:flex;width:16px;height:20px;flex:none;align-items:center;justify-content:center;color:var(--dsw-alias-label-tertiary,#74777d)}.ptcPlusToolChevron{transition:transform .16s ease}.ptcPlusToolChevron[data-open=true]{transform:rotate(180deg)}.ptcPlusToolTitle{display:flex;height:20px;flex:none;align-items:center;font-size:13px;font-weight:500;line-height:20px}.ptcPlusToolState{display:flex;height:20px;flex:none;align-items:center;color:var(--dsw-alias-label-tertiary,#74777d);font-size:11px;line-height:20px}.ptcPlusToolSummaryLine[data-state=running] .ptcPlusToolState,.ptcPlusToolSummary[data-state=running] .ptcPlusToolState{color:var(--dsw-alias-interactive-primary,#4d6bfe)}.ptcPlusToolSummaryLine[data-state=error] .ptcPlusToolState,.ptcPlusToolSummary[data-state=error] .ptcPlusToolState{color:var(--dsw-alias-state-danger-primary,#c43d3d)}.ptcPlusToolSummaryLine[data-state=stopped] .ptcPlusToolState,.ptcPlusToolSummary[data-state=stopped] .ptcPlusToolState{color:var(--dsw-alias-state-warning-primary,#a15c00)}.ptcPlusToolSep{width:3px;height:3px;flex:none;border-radius:50%;background:var(--dsw-alias-label-tertiary,#74777d)}.ptcPlusToolDescription{display:flex;min-width:0;min-height:20px;flex:1 1 auto;align-items:center;overflow:hidden;color:var(--dsw-alias-label-secondary,#52565d);font-size:13px;line-height:20px;text-overflow:ellipsis;white-space:nowrap}.ptcPlusToolPreview .ptcPlusFeature{flex:none;max-width:180px;white-space:nowrap}.ptcPlusToolPreview .ptcPlusFeatureDetail{max-width:120px}.ptcPlusToolSummaryLine[data-state=error] .ptcPlusToolDescription,.ptcPlusToolSummary[data-state=error] .ptcPlusToolDescription{color:var(--dsw-alias-state-danger-primary,#c43d3d)}.ptcPlusToolSummaryLine[data-state=stopped] .ptcPlusToolDescription,.ptcPlusToolSummary[data-state=stopped] .ptcPlusToolDescription{color:var(--dsw-alias-state-warning-primary,#a15c00)}
30472
- .ptcPlusFeatures{display:flex;min-width:0;flex-wrap:wrap;gap:3px 14px;margin:0 0 5px 23px}.ptcPlusFeature{display:inline-flex;min-width:0;align-items:center;gap:5px;color:var(--dsw-alias-label-secondary,#52565d);font-size:11px;line-height:17px}.ptcPlusFeature::before{width:4px;height:4px;flex:none;border-radius:50%;background:var(--dsw-alias-interactive-primary,#4d6bfe);content:''}.ptcPlusFeatureName{font-weight:500}.ptcPlusFeatureDetail{min-width:0;overflow:hidden;color:var(--dsw-alias-label-tertiary,#74777d);font-family:ui-monospace,SFMono-Regular,Consolas,monospace;text-overflow:ellipsis;white-space:nowrap}
30473
- .ptcPlusToolBody{margin:4px 0 8px 23px;border-left:2px solid var(--dsw-alias-border-l2,rgba(0,0,0,.1));background:var(--dsw-alias-bg-layer-2,rgba(38,49,72,.03))}.ptcPlusToolSection{display:flex;min-width:0;flex-direction:column;gap:4px;padding:9px 11px}.ptcPlusToolSection+.ptcPlusToolSection{border-top:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.1))}.ptcPlusToolSectionLabel{color:var(--dsw-alias-label-tertiary,#74777d);font-size:10px;font-weight:600;line-height:16px;text-transform:uppercase}.ptcPlusToolCode{max-height:320px;margin:0;overflow:auto;color:inherit;font:12px/18px ui-monospace,SFMono-Regular,Consolas,monospace;white-space:pre-wrap;overflow-wrap:anywhere}.ptcPlusIoCard{display:flex;flex-direction:column;border:1px solid var(--dsw-alias-border-l1,rgba(0,0,0,.1));border-radius:12px;background:var(--dsw-alias-markdown-code-block,rgba(38,49,72,.06));overflow:hidden}.ptcPlusIoText{max-height:320px;margin:0;padding:12px 16px;overflow:auto;color:var(--dsw-alias-label-secondary,#52565d);font:12px/18px ui-monospace,SFMono-Regular,Consolas,monospace;white-space:pre-wrap;overflow-wrap:anywhere}.ptcPlusIoText[data-error]{color:var(--dsw-alias-state-error-primary,#c43d3d)}.ptcPlusInspect{display:inline-flex;align-self:flex-start;align-items:center;gap:4px;margin:4px 0 2px 4px;padding:2px 8px;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.1));border-radius:999px;background:var(--dsw-alias-bg-base,#fff);color:var(--dsw-alias-label-secondary,#52565d);cursor:pointer;opacity:0;font-size:11px;line-height:16px;transition:opacity .1s ease;display:inline-flex}.ptcPlusTool:hover .ptcPlusInspect,.ptcPlusInspect:focus-visible{opacity:1}.ptcPlusInspect:hover{background:var(--dsw-alias-interactive-bg-hover-solid,rgba(38,49,72,.06));color:var(--dsw-alias-label-primary,#18191c)}
30474
- .ptcPlusAuthorButtonShell{display:inline-flex;width:28px;height:28px;flex:none;align-items:center;justify-content:center}.ptcPlusAuthorButton{appearance:none;display:inline-flex;box-sizing:border-box;width:28px;height:28px;align-items:center;justify-content:center;padding:0;border:0;border-radius:6px;background:transparent;color:var(--dsw-alias-label-secondary,#52565d);cursor:pointer}.ptcPlusAuthorButton:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(38,49,72,.06));color:var(--dsw-alias-interactive-primary,#4d6bfe)}.ptcPlusAuthorButton:focus-visible{outline:2px solid var(--dsw-alias-interactive-primary,#4d6bfe);outline-offset:1px}.ptcPlusAuthorButtonShell[data-text=true]{width:auto}.ptcPlusAuthorButtonLabel{padding:0 4px;font-size:12px;line-height:18px;font-weight:500}.ptcPlusComposerNotice{max-width:160px;color:var(--dsw-alias-label-secondary,#52565d);font-size:11px;line-height:17px;overflow-wrap:anywhere}.ptcPlusButton>svg{flex:none;margin-right:5px;vertical-align:-2px}
30475
- @media(max-width:760px){.ptcPlusBindingsGrid{grid-template-columns:1fr}.ptcPlusBindingFields{grid-template-columns:1fr}.ptcPlusBindingField[data-wide=true]{grid-column:auto}.ptcPlusBindingSourceGrid{grid-template-columns:1fr}.ptcPlusBindingDebugBody{grid-template-columns:1fr}.ptcPlusBindingDebugBody .ptcPlusButton{width:100%}.ptcPlusBindingDebugWarning{grid-column:1}}
30476
- @media(max-width:560px){.ptcPlusHeader{padding:12px}.ptcPlusFields{margin:0 12px}.ptcPlusSettingsModal.ptcPlusSettingsModal{width:calc(100vw - 16px);max-height:calc(100dvh - 16px)}.ptcPlusSettingsDialog .ptcPlusFields{margin:0}.ptcPlusRow{align-items:flex-start;flex-direction:column;gap:6px;padding:10px 0}.ptcPlusInput{width:100%}.ptcPlusFooter,.ptcPlusBindingsHead{align-items:stretch;flex-direction:column}.ptcPlusButton{width:100%}.ptcPlusFeatures,.ptcPlusToolBody{margin-left:0}.ptcPlusToolSummary .ptcPlusToolDescription{white-space:normal;overflow-wrap:anywhere}}
30477
- @media(prefers-reduced-motion:reduce){.ptcPlusHeader,.ptcPlusChevron,.ptcPlusBody,.ptcPlusButton,.ptcPlusActive,.ptcPlusToolChevron,.ptcPlusReplChevron,.ptcPlusReplDefinitionWrap,.ptcPlusInspect,.ptcPlusBindingDockChevron{transition:none}}
30478
- /* The summary button owns disclosure; definition content is a separate grid item. */
30479
- .ptcPlusReplBinding{padding:0;cursor:default}.ptcPlusReplBindingTrigger{appearance:none;display:grid;width:100%;grid-column:1/-1;grid-template-columns:minmax(0,1fr) 24px;gap:3px 8px;min-height:36px;padding:5px 12px;border:0;background:transparent;color:inherit;text-align:left;cursor:pointer;font:inherit;transition:background-color .16s ease}.ptcPlusReplBindingTrigger:hover,.ptcPlusReplBindingTrigger[aria-expanded=true]{background:color-mix(in srgb,var(--dsw-alias-interactive-primary,#4d6bfe) 5%,transparent)}.ptcPlusReplBindingTrigger:focus-visible{outline:2px solid var(--dsw-alias-interactive-primary,#4d6bfe);outline-offset:-2px}
30480
- /* High-contrast TypeScript-like token colors adapt to the active text theme. */
30481
- .ptcPlusReplCard .ptcPlusReplName[data-kind=variable]{color:color-mix(in srgb,#005cc5 78%,var(--dsw-alias-label-primary,#18191c))}
30482
- .ptcPlusReplCard .ptcPlusReplName[data-kind=function]{color:color-mix(in srgb,#795e26 78%,var(--dsw-alias-label-primary,#18191c))}
30483
- .ptcPlusReplCard .ptcPlusReplName[data-kind=class]{color:color-mix(in srgb,#267f99 78%,var(--dsw-alias-label-primary,#18191c))}
30484
- .ptcPlusReplCard .ptcPlusReplName[data-kind=import]{color:color-mix(in srgb,#af00db 78%,var(--dsw-alias-label-primary,#18191c))}
30485
- /* Keep the session-header action on the same compact 32px rhythm as DSH chrome. */
30486
- .ptcPlusActiveShell{display:inline-flex;height:28px;align-items:center;justify-content:center;line-height:0;vertical-align:middle}.ptcPlusActive{box-sizing:border-box;height:28px;justify-content:center;gap:6px;padding:0 6px;border:0;background:transparent;font-family:inherit;font-size:13px;font-weight:500;line-height:18px}.ptcPlusActive::before{width:6px;height:6px;flex:none;border-radius:50%;background:currentColor;box-shadow:0 0 0 2px color-mix(in srgb,currentColor 18%,transparent);content:''}.ptcPlusActive:hover,.ptcPlusActive[aria-expanded=true]{background:var(--dsw-alias-interactive-bg-hover,rgba(38,49,72,.06))}.ptcPlusActiveLabel{display:inline-flex;height:18px;align-items:center;line-height:18px}
30487
- @media(max-width:560px){.ptcPlusActiveShell{display:none}}
30488
- /* The compatibility probe never paints: it exists so the entry can read whether
30489
- the installed Menu mounted the region it was given. */
30490
- .ptcPlusMenuProbe{display:none}
30491
- /* The pinned carrier is a Client-owned label cell: the host already draws the
30492
- hairline above it, and the cell's own type must not leak into the grid. The
30493
- compound selector is load-bearing: the base .ptcPlusMenuActions rule is
30494
- declared later in this sheet, so an equal-specificity override loses and the
30495
- grid would draw a second hairline under the host's. */
30496
- .ptcPlusMenuActions.ptcPlusMenuActionsPinned{margin-top:0;border-top:0;font-size:13px;line-height:18px;color:var(--dsw-alias-label-primary)}
30497
- [role=menu]:has(.ptcPlusBindingMenuAction,.ptcPlusDraftMenuItem){width:min(320px,calc(100vw - 24px));min-width:0;max-height:min(440px,60dvh,var(--ptc-plus-menu-space,100dvh));border-radius:12px}.ptcPlusBindingQuickRow{display:flex;min-width:0;flex-direction:column;gap:3px;white-space:normal}.ptcPlusBindingQuickName{display:flex;align-items:center;justify-content:space-between;gap:12px;font-size:13px}.ptcPlusBindingQuickName strong{min-width:0;overflow:hidden;text-overflow:ellipsis;font-weight:500;white-space:nowrap}.ptcPlusBindingQuickState{flex:none;min-width:5em;text-align:end;font-size:11px;color:var(--dsw-alias-label-tertiary)}.ptcPlusBindingQuickRow[data-enabled=true] .ptcPlusBindingQuickState{color:var(--dsw-alias-state-success-primary)}.ptcPlusBindingQuickPurpose{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--dsw-alias-label-tertiary);font-size:12px}.ptcPlusBindingMenuAction{font-size:13px}
30498
- .ptcPlusMenuActions{margin-top:6px;border-top:1px solid var(--dsw-alias-border-l3,rgba(0,0,0,.1))}.ptcPlusMenuAuthoring{padding:8px 4px}.ptcPlusMenuGroupLabel{padding:0 4px 6px;color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:16px}.ptcPlusMenuActionGrid,.ptcPlusMenuUtilities{display:flex;gap:6px;min-width:0}.ptcPlusMenuUtilities{padding:6px 4px}.ptcPlusMenuAuthoring+.ptcPlusMenuUtilities{border-top:1px solid var(--dsw-alias-border-l3,rgba(0,0,0,.1))}.ptcPlusMenuButton{appearance:none;display:flex;flex:1;align-items:center;justify-content:center;min-width:0;min-height:34px;padding:6px 8px;border:1px solid var(--dsw-alias-border-l3,rgba(0,0,0,.1));border-radius:7px;background:transparent;color:var(--dsw-alias-label-primary);font:inherit;text-align:center;cursor:pointer}.ptcPlusMenuButton:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(38,49,72,.06))}.ptcPlusMenuButton:focus-visible{outline:2px solid var(--dsw-alias-interactive-primary,#4d6bfe);outline-offset:-2px}.ptcPlusMenuButton .ptcPlusBindingMenuAction{white-space:normal;overflow-wrap:anywhere;line-height:18px}.ptcPlusMenuUtilities .ptcPlusMenuButton{border-color:transparent;color:var(--dsw-alias-label-secondary)}.ptcPlusMenuUtilities .ptcPlusBindingMenuAction{font-size:12px}
30499
-
30500
- `;
30501
- var BINDING_WORKBENCH_CSS = `
30502
- .ptcPlusCandidateContext{min-width:0;margin-top:4px;padding:12px;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;background:var(--dsw-alias-bg-module-platform)}.ptcPlusCandidateContext h4{margin:0 0 10px;color:var(--dsw-alias-label-primary);font-size:12px;font-weight:600;line-height:18px}.ptcPlusCandidateContext dl{display:grid;gap:12px;margin:0}.ptcPlusCandidateContext dt{color:var(--dsw-alias-label-secondary);font-size:12px;line-height:20px}.ptcPlusCandidateContext dd{min-width:0;margin:0}.ptcPlusCandidateDeclaration{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:4px 12px}.ptcPlusCandidateDeclaration dd{display:inline-flex;align-items:center;gap:4px;max-width:100%;box-sizing:border-box;padding:2px 8px;border-radius:6px;background:var(--dsw-alias-bg-layer-3);color:var(--dsw-alias-label-secondary);font-size:11px;line-height:18px;overflow-wrap:anywhere}.ptcPlusCandidateDeclaration dd[data-included=true]{background:var(--dsw-alias-state-business-tertiary);color:var(--dsw-alias-state-business-primary)}.ptcPlusCandidateDeclaration svg{flex:none}.ptcPlusCandidatePrompt{display:grid;gap:6px}.ptcPlusCandidatePrompt dd{padding:8px 10px;border:1px solid var(--dsw-alias-border-l2);border-radius:6px;background:var(--dsw-alias-bg-layer-3);color:var(--dsw-alias-label-primary);font-size:12px;line-height:20px;white-space:pre-wrap;overflow-wrap:anywhere}.ptcPlusCandidatePrompt dd[data-empty=true]{padding:0;border:0;background:transparent;color:var(--dsw-alias-label-tertiary)}
30503
- .ptcPlusBindings{margin-top:16px;padding-top:14px;border-top:0.5px solid var(--dsw-alias-border-l2)}.ptcPlusBindingsHead{display:flex;align-items:center;justify-content:space-between;gap:12px}.ptcPlusBindingsTitle{margin:0;font-size:15px;font-weight:600;line-height:1.4}.ptcPlusBindingsActions{display:flex;flex-wrap:wrap;gap:8px}.ptcPlusBindingsGrid{display:grid;grid-template-columns:minmax(240px,.7fr) minmax(340px,1.3fr);gap:12px;margin-top:12px;align-items:start}.ptcPlusBindingPane{display:flex;min-width:0;flex-direction:column;gap:8px}
30504
- .ptcPlusBindingList{display:flex;min-width:0;margin:0;padding:8px;flex-direction:column;gap:2px;border:0.5px solid var(--dsw-alias-border-l4);border-radius:16px;background:var(--dsw-alias-bg-layer-3);list-style:none}.ptcPlusBindingItem{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:2px 10px;padding:6px 8px;border-radius:8px;transition:background-color .12s ease}.ptcPlusBindingItem:hover{background:var(--dsw-alias-interactive-bg-hover)}.ptcPlusBindingItem[data-selected=true]{background:var(--dsw-alias-bg-module-platform)}.ptcPlusBindingSelect{display:flex;min-width:0;padding:0;border:0;background:transparent;color:inherit;text-align:left;cursor:pointer;flex-direction:column;align-items:flex-start;gap:1px}.ptcPlusBindingSelect:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:1px}.ptcPlusBindingName{display:block;min-width:0;max-width:100%;overflow:hidden;font:500 13px/20px ui-monospace,SFMono-Regular,Consolas,monospace;text-overflow:ellipsis;white-space:nowrap}.ptcPlusBindingMeta{display:block;min-width:0;max-width:100%;overflow:hidden;color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:16px;text-overflow:ellipsis;white-space:nowrap}.ptcPlusBindingState{display:inline-flex;align-items:center;gap:5px;padding:1px 8px;border-radius:999px;corner-shape:round;font-size:11px;font-weight:500;line-height:17px;white-space:nowrap}.ptcPlusBindingState[data-enabled=true]{color:var(--dsw-alias-state-success-primary);background:var(--dsw-alias-state-success-tertiary)}.ptcPlusBindingState[data-enabled=false]{color:var(--dsw-alias-state-warn-primary);background:var(--dsw-alias-state-warn-tertiary)}.ptcPlusBindingStateDot{width:6px;height:6px;border-radius:50%;background:currentColor}.ptcPlusBindingToggle{grid-column:2;grid-row:1/3;align-self:center;justify-self:end;min-height:26px;padding:2px 10px;font-size:12px;line-height:17px;border-radius:999px;corner-shape:round}.ptcPlusBindingRun{display:flex;flex-wrap:wrap;align-items:center;gap:8px;padding-top:10px;border-top:0.5px solid var(--dsw-alias-border-l2)}.ptcPlusBindingRun .ptcPlusInput{flex:1;min-width:160px;width:auto}
30505
- .ptcPlusBindingEditor{display:flex;min-width:0;flex-direction:column;border:0.5px solid var(--dsw-alias-border-l4);border-radius:16px;background:var(--dsw-alias-bg-layer-3);overflow:hidden}.ptcPlusBindingSection{display:flex;min-width:0;flex-direction:column;gap:12px;padding:14px 16px}.ptcPlusBindingSection+.ptcPlusBindingSection{border-top:0.5px solid var(--dsw-alias-border-l2)}.ptcPlusBindingSectionTitle{margin:0;font-size:13px;font-weight:600;line-height:1.5}.ptcPlusBindingFields{display:grid;min-width:0;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px 12px}.ptcPlusBindingField{display:flex;min-width:0;flex-direction:column;gap:5px}.ptcPlusBindingField[data-wide=true]{grid-column:1/-1}.ptcPlusBindingFieldLabel{color:var(--dsw-alias-label-primary);font-size:13px;font-weight:500;line-height:1.5}.ptcPlusBindingEditor .ptcPlusInput,.ptcPlusSelect{box-sizing:border-box;width:100%;min-width:0;height:34px;padding:0 12px;border:0.5px solid var(--dsw-alias-border-l4);border-radius:8px;background:var(--dsw-alias-bg-layer-3);color:var(--dsw-alias-label-primary);font:inherit;font-size:13px;line-height:1.5}.ptcPlusBindingEditor .ptcPlusInput:focus-visible,.ptcPlusSelect:focus-visible{border-color:var(--dsw-alias-brand-primary);outline:none}.ptcPlusTextarea{box-sizing:border-box;width:100%;min-height:220px;resize:vertical;padding:10px 12px;border:0.5px solid var(--dsw-alias-border-l4);border-radius:8px;background:var(--dsw-alias-bg-layer-3);color:var(--dsw-alias-label-primary);font:12px/18px ui-monospace,SFMono-Regular,Consolas,monospace;tab-size:2}.ptcPlusTextarea:focus-visible{border-color:var(--dsw-alias-brand-primary);outline:none}.ptcPlusDeclaration{box-sizing:border-box;max-height:220px;margin:0;padding:12px;overflow:auto;background:var(--dsw-alias-markdown-code-block);border-radius:12px;color:var(--dsw-alias-label-primary);font:12px/18px ui-monospace,SFMono-Regular,Consolas,monospace;white-space:pre-wrap;overflow-wrap:anywhere}.ptcPlusBindingSourceGrid{display:grid;min-width:0;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:12px}.ptcPlusBindingSourceEditor,.ptcPlusBindingSourcePreview{display:flex;min-width:0;flex-direction:column;gap:6px}.ptcPlusBindingSourcePreview .ptcPlusCodeBlock{max-height:220px;overflow:auto}
30506
- .ptcPlusBindingLifecycle{display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;gap:8px}.ptcPlusBindingDebug{display:flex;min-width:0;flex-direction:column;gap:10px;padding:12px 16px;border-top:0.5px solid var(--dsw-alias-border-l2)}.ptcPlusBindingDebugSummary{display:flex;align-items:center;gap:6px;margin:0;cursor:pointer;color:var(--dsw-alias-label-secondary);font-size:13px;font-weight:500;line-height:1.5;list-style:none}.ptcPlusBindingDebugSummary::-webkit-details-marker{display:none}.ptcPlusBindingDebugSummary::after{content:'';width:7px;height:7px;border-right:1.5px solid currentColor;border-bottom:1.5px solid currentColor;transform:rotate(45deg);transition:transform .16s ease}.ptcPlusBindingDebug[open] .ptcPlusBindingDebugSummary::after{transform:rotate(-135deg)}.ptcPlusBindingDebugBody{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr) auto;align-items:end;gap:10px}.ptcPlusBindingDebugBody .ptcPlusBindingField{min-width:0}.ptcPlusBindingDebugBody .ptcPlusButton{align-self:end}.ptcPlusBindingDebugWarning{grid-column:1/-1;color:var(--dsw-alias-state-warn-label);font-size:12px;line-height:1.5}.ptcPlusBindingOutput{grid-column:1/-1;margin:0;padding:10px 12px;overflow:auto;background:var(--dsw-alias-markdown-code-block);border-radius:8px;color:var(--dsw-alias-label-secondary);font:12px/18px ui-monospace,SFMono-Regular,Consolas,monospace;white-space:pre-wrap;overflow-wrap:anywhere}
30507
- .ptcPlusBindingCommand{display:flex;min-width:0;flex-direction:column;gap:6px;margin:6px 0 10px;padding:10px 12px;border:0.5px solid var(--dsw-alias-border-l4);border-radius:8px;background:var(--dsw-alias-bg-layer-3)}.ptcPlusBindingCommandHeader{display:flex;min-width:0;flex-wrap:wrap;align-items:center;gap:8px}.ptcPlusBindingCommandTitle{margin:0;font-size:13px;font-weight:600;line-height:1.5}.ptcPlusBindingCommandState{display:inline-flex;align-items:center;gap:5px;padding:1px 8px;border-radius:999px;corner-shape:round;background:var(--dsw-alias-bg-module-platform);color:var(--dsw-alias-label-secondary);font-size:11px;font-weight:500;line-height:17px;white-space:nowrap}.ptcPlusBindingCommand[data-phase=pending] .ptcPlusBindingCommandState{background:var(--dsw-alias-state-business-tertiary);color:var(--dsw-alias-state-business-primary)}.ptcPlusBindingCommand[data-phase=ready] .ptcPlusBindingCommandState{background:var(--dsw-alias-state-success-tertiary);color:var(--dsw-alias-state-success-primary)}.ptcPlusBindingCommand[data-phase=failed] .ptcPlusBindingCommandState{background:var(--dsw-alias-interactive-bg-hover-danger);color:var(--dsw-alias-state-error-primary)}.ptcPlusBindingCommandStateDot{width:6px;height:6px;border-radius:50%;background:currentColor}.ptcPlusBindingCommandRequirement{margin:0;overflow:auto;color:var(--dsw-alias-label-primary);font:12px/18px ui-monospace,SFMono-Regular,Consolas,monospace;white-space:pre-wrap;overflow-wrap:anywhere}.ptcPlusBindingCommandSource{max-height:280px;margin:0;padding:10px 12px;overflow:auto;background:var(--dsw-alias-markdown-code-block);border-radius:8px;color:var(--dsw-alias-label-primary);font:12px/18px ui-monospace,SFMono-Regular,Consolas,monospace;white-space:pre-wrap;overflow-wrap:anywhere}.ptcPlusBindingCommandCode{max-height:300px;overflow:auto}.ptcPlusBindingCommandActions{display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;gap:8px}
30508
-
30509
- `;
30510
- var REPL_CONSOLE_CSS = `
30511
- .ptcPlusBindingsSurface .ptcPlusBindingSection.ptcPlusModelPrompt{padding:12px 0}.ptcPlusModelPrompt .ptcPlusBindingSectionTitle{margin:0 0 10px}.ptcPlusModelPrompt textarea.ptcPlusInput{height:auto;min-height:80px;padding:8px 12px;resize:vertical}.ptcPlusModelPrompt .ptcPlusPromptToggle{flex-direction:row;align-items:center;justify-content:space-between;cursor:pointer}.ptcPlusModelPrompt .ptcPlusCheck{flex:none}.ptcPlusEditorHead .ptcPlusBindingLifecycle{min-width:0}.ptcPlusEditorHead .ptcPlusButton{width:auto}
30512
- .ptcPlusConsole{box-sizing:border-box;flex:1;min-width:0;min-height:0;width:100%;height:100%;overflow:auto;padding:20px 24px;color:var(--dsw-alias-label-primary);container-type:inline-size}
30513
- .ptcPlusConsoleSection{min-width:0}.ptcPlusConsoleSection+.ptcPlusConsoleSection{margin-top:22px;padding-top:20px;border-top:1px solid var(--dsw-alias-border-l2)}
30514
- .ptcPlusObservationHead,.ptcPlusObservationTitle{display:flex;flex-wrap:wrap;align-items:center;gap:8px 12px}.ptcPlusObservationHead{justify-content:space-between;margin-bottom:14px}
30515
- .ptcPlusObservationTitle h2{margin:0;font-size:15px;font-weight:600;line-height:22px}.ptcPlusObservationCount{font-size:13px;color:var(--dsw-alias-label-tertiary)}.ptcPlusObservationTime{font-size:11px;line-height:18px;color:var(--dsw-alias-label-tertiary)}
30516
- .ptcPlusObservationGrid{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:24px}.ptcPlusObservationCatalog{min-width:0}
30517
- .ptcPlusObservationFilters{display:flex;gap:10px;align-items:center;margin-bottom:8px}.ptcPlusObservationFilters>.ptcPlusSelect{width:120px;height:32px;flex:none;font-size:12px}
30518
- .ptcPlusSearch{display:flex;align-items:center;gap:8px;box-sizing:border-box;min-width:0;flex:1;height:32px;padding:0 10px;border:1px solid var(--dsw-alias-border-l2);border-radius:6px;color:var(--dsw-alias-label-tertiary)}
30519
- .ptcPlusSearch>svg{flex:none}.ptcPlusSearch input{min-width:0;width:100%;height:100%;padding:0;border:0;outline:none;background:transparent;color:var(--dsw-alias-label-primary);font:12px/20px inherit}.ptcPlusSearch:focus-within{outline:2px solid var(--dsw-alias-interactive-primary,#4d6bfe);outline-offset:1px}
30520
- .ptcPlusObservations{height:256px;overflow:auto;overscroll-behavior:contain;scrollbar-gutter:stable;min-width:0;border:1px solid var(--dsw-alias-border-l2);border-radius:6px}
30521
- .ptcPlusObservationTable{width:100%;table-layout:fixed;border-collapse:separate;border-spacing:0;font-size:12px;text-align:left}.ptcPlusObservationTable th{position:sticky;top:0;z-index:1;height:32px;padding:0 10px;background:var(--dsw-alias-bg-layer-3);color:var(--dsw-alias-label-tertiary);font-weight:500;border-bottom:1px solid var(--dsw-alias-border-l2)}
30522
- .ptcPlusObservationTable th:first-child{width:34%}.ptcPlusObservationTable th:nth-child(2){width:16%}.ptcPlusObservationTable th:nth-child(3){width:72px}.ptcPlusObservationTable td{height:34px;padding:0 10px;border-bottom:1px solid var(--dsw-alias-border-l2);overflow:hidden}.ptcPlusObservationTable tr:last-child td{border-bottom:0}.ptcPlusObservationTable tbody tr{cursor:pointer}.ptcPlusObservationTable tbody tr:hover{background:var(--dsw-alias-interactive-bg-hover)}.ptcPlusObservationTable tr[data-selected=true]{background:color-mix(in srgb,var(--dsw-alias-interactive-primary,#4d6bfe) 7%,transparent)}
30523
- .ptcPlusObservationSelect{display:block;width:100%;min-width:0;height:34px;padding:0;border:0;background:transparent;color:inherit;cursor:pointer;text-align:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font:12px/20px ui-monospace,SFMono-Regular,Consolas,monospace}.ptcPlusObservationKind{color:var(--dsw-alias-label-tertiary);white-space:nowrap}
30524
- .ptcPlusObservationValue{display:flex;min-width:0;align-items:center;gap:6px}.ptcPlusObservationValue code{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font:11px/18px ui-monospace,SFMono-Regular,Consolas,monospace}.ptcPlusObservationState{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:18px}.ptcPlusObservationValue .ptcPlusObservationState{flex:none}.ptcPlusObservationEmpty{padding:12px}
30525
- .ptcPlusBindingInspector{box-sizing:border-box;min-width:0;max-height:296px;overflow:auto;padding-left:24px;border-left:1px solid var(--dsw-alias-border-l2)}
30526
- .ptcPlusInspectorHead{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:6px 12px;margin:0 0 12px}.ptcPlusInspectorHead strong{min-width:0;overflow-wrap:anywhere;font:600 13px/20px ui-monospace,SFMono-Regular,Consolas,monospace}.ptcPlusInspectorHead span{font-size:11px;color:var(--dsw-alias-label-tertiary)}
30527
- .ptcPlusObservationLabel{display:flex;align-items:center;justify-content:space-between;gap:8px;margin:12px 0 6px;font-size:12px;line-height:18px;color:var(--dsw-alias-label-secondary)}
30528
- .ptcPlusObservationCode{max-height:184px;margin:0;overflow:auto;border-radius:6px;font:12px/20px ui-monospace,SFMono-Regular,Consolas,monospace;white-space:pre-wrap;overflow-wrap:anywhere}.ptcPlusObservationPreview{margin:0;padding:10px 12px;border:1px solid var(--dsw-alias-border-l2);border-radius:6px;white-space:pre-wrap;overflow-wrap:anywhere;font:12px/20px ui-monospace,SFMono-Regular,Consolas,monospace}.ptcPlusObservationUnavailable{margin:0;color:var(--dsw-alias-label-tertiary);font-size:12px}
30529
- .ptcPlusBindingsSurface{min-width:0;container-type:inline-size}.ptcPlusBindingsSurface .ptcPlusBindings{margin:0;padding:0;border:0}.ptcPlusBindingsSurface .ptcPlusBindingsGrid{grid-template-columns:220px minmax(0,1fr);gap:20px;margin-top:12px}.ptcPlusBindingsSurface .ptcPlusBindingsTitle{font-size:15px;line-height:22px}
30530
- .ptcPlusBindingPane{min-width:0}.ptcPlusBindingPane>.ptcPlusSearch{flex:none;margin-bottom:2px}.ptcPlusBindingsSurface .ptcPlusBindingsHead{flex-direction:row;flex-wrap:wrap;align-items:center;gap:8px}.ptcPlusBindingsSurface .ptcPlusBindingList{max-height:350px;overflow:auto;gap:0;padding:0;border:0;border-radius:0;background:transparent}.ptcPlusBindingsSurface .ptcPlusBindingItem{min-height:52px;padding:8px;border-radius:4px;box-sizing:border-box;border-bottom:1px solid var(--dsw-alias-border-l2)}.ptcPlusBindingsSurface .ptcPlusBindingItem[data-selected=true]{background:color-mix(in srgb,var(--dsw-alias-interactive-primary,#4d6bfe) 7%,transparent)}
30531
- .ptcPlusBindingsSurface .ptcPlusBindingName{font-size:12px;font-weight:500;white-space:normal;overflow-wrap:anywhere}.ptcPlusBindingsSurface .ptcPlusBindingMeta{font-size:11px;line-height:16px}.ptcPlusBindingsSurface .ptcPlusBindingEditor{border:0;border-radius:0;background:transparent;overflow:visible}
30532
- .ptcPlusBindingSwitch{appearance:none;position:relative;align-self:center;flex:none;width:30px;height:18px;padding:2px;border:0;border-radius:9px;background:var(--dsw-alias-label-dimmed,#a5a7ad);cursor:pointer}.ptcPlusBindingSwitch span{display:block;width:14px;height:14px;border-radius:50%;background:#fff;box-shadow:0 1px 2px #0002;transition:transform .15s ease}.ptcPlusBindingSwitch[aria-checked=true]{background:var(--dsw-alias-interactive-primary,#4d6bfe)}.ptcPlusBindingSwitch[aria-checked=true] span{transform:translateX(12px)}.ptcPlusBindingSwitch:disabled{cursor:not-allowed;opacity:.5}
30533
- .ptcPlusEditorHead{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:8px 12px;min-height:32px;margin-bottom:8px}.ptcPlusEditorFile{min-width:0;overflow-wrap:anywhere;font:600 13px/20px ui-monospace,SFMono-Regular,Consolas,monospace}.ptcPlusBindingLifecycle{gap:6px}
30534
- .ptcPlusIconButton{display:inline-flex;align-items:center;justify-content:center;flex:none;box-sizing:border-box;width:30px;height:30px;padding:0;border:1px solid var(--dsw-alias-border-l2);border-radius:6px;background:transparent;color:var(--dsw-alias-label-secondary);cursor:pointer}.ptcPlusIconButton:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}.ptcPlusIconButton[data-kind=danger]:hover{color:var(--dsw-alias-state-error-primary)}.ptcPlusIconButton:disabled{opacity:.4;cursor:not-allowed}
30535
- .ptcPlusCodeEditor{min-width:0;overflow:hidden;border:1px solid var(--dsw-alias-border-l2);border-radius:6px;--ptc-code-keyword:color-mix(in srgb,#a13d96 75%,var(--dsw-alias-label-primary));--ptc-code-string:color-mix(in srgb,#af643c 75%,var(--dsw-alias-label-primary));--ptc-code-number:color-mix(in srgb,#477ac2 75%,var(--dsw-alias-label-primary));--ptc-code-type:color-mix(in srgb,#258579 75%,var(--dsw-alias-label-primary));--ptc-code-function:color-mix(in srgb,#825bbe 75%,var(--dsw-alias-label-primary))}.ptcPlusCodeEditor:focus-within{border-color:var(--dsw-alias-interactive-primary,#4d6bfe)}.ptcPlusCodeEditor .cm-editor{height:336px}.ptcPlusCodeEditor .cm-scroller{min-height:0}.ptcPlusCodeEditor .cm-line{overflow-wrap:anywhere}
30536
- .ptcPlusBindingsSurface .ptcPlusBindingSection{display:block;padding:0;margin-top:0;border:0;border-bottom:1px solid var(--dsw-alias-border-l2)}.ptcPlusBindingSection>summary,.ptcPlusBindingsSurface .ptcPlusBindingDebugSummary{padding:11px 0;cursor:pointer;font-size:12px;font-weight:500;color:var(--dsw-alias-label-secondary)}.ptcPlusEntrySettings .ptcPlusBindingFields{padding:0 0 14px}.ptcPlusBindingsSurface .ptcPlusBindingSourcePreview{display:block}.ptcPlusBindingSourcePreview>.ptcPlusCodeBlock{margin-bottom:12px}.ptcPlusBindingsSurface .ptcPlusBindingDebug{display:block;padding:0;border-top:0}.ptcPlusBindingsSurface .ptcPlusBindingDebugBody{grid-template-columns:minmax(0,1fr) minmax(0,1fr);padding-bottom:12px}
30537
- .ptcPlusBindingsSurface .ptcPlusBindingRun{gap:6px;margin-top:10px}.ptcPlusBindingsSurface .ptcPlusBindingRun .ptcPlusInput{flex-basis:100%;min-width:0;width:100%;height:32px;font-size:12px}.ptcPlusBindingsSurface .ptcPlusMessage[role=status]{grid-column:1/-1;margin:0}
30538
- .ptcPlusSessionEmpty{box-sizing:border-box;width:100%;padding:16px 18px;border:1px dashed var(--dsw-alias-border-l2);border-radius:6px;color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:20px}.ptcPlusObservationGrid[data-empty=true]{grid-template-columns:minmax(0,1fr)}.ptcPlusObservationGrid[data-empty=true] .ptcPlusObservations{height:auto;min-height:94px}
30539
- .ptcPlusSourceSection{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:0 12px;border-bottom:1px solid var(--dsw-alias-border-l2)}.ptcPlusSourceToggle{display:flex;min-width:0;align-items:center;gap:6px;padding:12px 0;border:0;background:transparent;color:var(--dsw-alias-label-secondary);text-align:left;cursor:pointer;font:500 12px/20px inherit}.ptcPlusSourceToggle svg{flex:none}.ptcPlusSourceFilename{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--dsw-alias-label-tertiary);font:11px/20px ui-monospace,SFMono-Regular,Consolas,monospace}.ptcPlusSourceActions{display:flex;flex-wrap:wrap;gap:6px;padding:6px 0}.ptcPlusSourceBody{grid-column:1/-1;min-width:0;margin-bottom:12px}.ptcPlusSourceCode{max-height:336px;overflow:auto;margin:0;border-radius:6px;font:12px/20px ui-monospace,SFMono-Regular,Consolas,monospace;white-space:pre-wrap;overflow-wrap:anywhere}
30540
- .ptcPlusWorkbenchFeedback{min-height:22px;padding:4px 0;color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:18px;overflow-wrap:anywhere}.ptcPlusBindings[aria-busy=true] button:disabled,.ptcPlusBindings[aria-busy=true] input:disabled{opacity:1}.ptcPlusBindings[aria-busy=true] button:disabled{cursor:wait}
30541
- .ptcPlusExecution{min-width:0;margin:0 0 12px;border:1px solid var(--dsw-alias-border-l2);border-radius:6px;overflow:hidden;background:var(--dsw-alias-bg-layer-3)}.ptcPlusExecution>summary{padding:10px 12px;cursor:pointer;font-size:12px;font-weight:500;line-height:20px;color:var(--dsw-alias-label-secondary)}.ptcPlusExecutionToolbar{display:flex;flex-wrap:wrap;align-items:center;gap:8px;padding:8px 12px;border-top:1px solid var(--dsw-alias-border-l2);border-bottom:1px solid var(--dsw-alias-border-l2)}.ptcPlusExecutionLanguage{font:11px/18px ui-monospace,SFMono-Regular,Consolas,monospace;color:var(--dsw-alias-label-secondary)}.ptcPlusExecutionState{font-size:11px;line-height:18px;color:var(--dsw-alias-label-tertiary)}.ptcPlusExecutionActions{display:flex;align-items:center;gap:6px;margin-left:auto}.ptcPlusExecutionActions .ptcPlusButton{min-width:68px;min-height:30px;padding:3px 10px;font-size:12px}
30542
- .ptcPlusExecutionHistory{min-height:48px;max-height:320px;overflow:auto;overscroll-behavior:contain;scrollbar-gutter:stable}.ptcPlusExecutionHistory:empty{min-height:0}.ptcPlusExecutionRecord{min-width:0;padding:10px 12px;border-bottom:1px solid var(--dsw-alias-border-l2)}.ptcPlusExecutionCommand,.ptcPlusExecutionOutput{margin:0;white-space:pre-wrap;overflow-wrap:anywhere;font:12px/20px ui-monospace,SFMono-Regular,Consolas,monospace}.ptcPlusExecutionCommand{color:var(--dsw-alias-label-secondary)}.ptcPlusExecutionCommand>span{color:var(--dsw-alias-label-tertiary)}.ptcPlusExecutionResult{flex-direction:row;gap:12px;margin-top:8px;padding:12px 16px}.ptcPlusExecutionOutputLabel{flex:none;color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:20px}.ptcPlusExecutionOutput{flex:1;min-width:0;max-height:240px;overflow:auto;overscroll-behavior:contain;scrollbar-gutter:stable;color:var(--dsw-alias-label-secondary)}.ptcPlusExecutionOutput:focus-visible{outline:2px solid var(--dsw-alias-interactive-primary);outline-offset:-2px}.ptcPlusExecutionOutput[data-error=true]{color:var(--dsw-alias-state-error-primary)}.ptcPlusExecutionDuration{display:block;margin-top:4px;color:var(--dsw-alias-label-tertiary);font-size:10px;line-height:16px}.ptcPlusExecutionInput .ptcPlusCodeEditor{border:0;border-radius:0}.ptcPlusExecutionInput .cm-editor{height:108px}.ptcPlusExecutionInput .cm-content{min-height:88px}
30543
- @container(max-width:460px){.ptcPlusSourceSection{grid-template-columns:minmax(0,1fr)}.ptcPlusSourceToggle{padding-bottom:6px}.ptcPlusSourceActions{justify-content:flex-end}.ptcPlusExecutionToolbar{gap:6px;padding:8px}.ptcPlusExecutionActions{gap:4px}.ptcPlusSourceFilename{display:none}}
30544
- .ptcPlusBindingsModal.ptcPlusBindingsModal{width:min(1200px,calc(100vw - 32px));max-width:none;max-height:calc(100dvh - 40px);border-radius:8px}.ptcPlusBindingsDialog{box-sizing:border-box;max-height:calc(100dvh - 40px);overflow:auto;padding:24px}.ptcPlusBindingsDialogHead{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-bottom:16px}.ptcPlusBindingsDialogHead h2{margin:0;font-size:17px;line-height:24px}.ptcPlusDialogClose{display:flex;flex:none;align-items:center;justify-content:center;width:32px;height:32px;padding:0;border:0;border-radius:4px;background:transparent;color:inherit;cursor:pointer}.ptcPlusDialogClose:hover{background:var(--dsw-alias-interactive-bg-hover)}.ptcPlusConsole button:focus-visible,.ptcPlusBindingsDialog button:focus-visible{outline:2px solid var(--dsw-alias-interactive-primary);outline-offset:-2px}
30545
- @container(max-width:780px){.ptcPlusObservationGrid{grid-template-columns:minmax(0,1fr);gap:16px}.ptcPlusBindingInspector{max-height:none;padding:12px 0 0;border-left:0;border-top:1px solid var(--dsw-alias-border-l2)}.ptcPlusObservations{height:200px}.ptcPlusBindingsSurface .ptcPlusBindingsGrid{grid-template-columns:minmax(0,1fr);gap:18px}.ptcPlusBindingsSurface .ptcPlusBindingList{max-height:180px}.ptcPlusBindingsSurface .ptcPlusBindingFields,.ptcPlusBindingsSurface .ptcPlusBindingDebugBody{grid-template-columns:minmax(0,1fr)}.ptcPlusObservationTable th:first-child{width:35%}.ptcPlusObservationTable th:nth-child(2){width:64px}.ptcPlusObservationTable th:nth-child(3){width:64px}}
30546
- @media(max-width:560px){.ptcPlusConsole{padding:14px 12px}.ptcPlusBindingsModal.ptcPlusBindingsModal{width:calc(100vw - 16px);max-height:calc(100dvh - 16px)}.ptcPlusBindingsDialog{padding:16px;max-height:calc(100dvh - 16px)}.ptcPlusObservationFilters>.ptcPlusSelect{width:105px}.ptcPlusObservationTable th,.ptcPlusObservationTable td{padding:0 6px}.ptcPlusObservationValue{gap:3px}.ptcPlusObservationState{font-size:10px}.ptcPlusEditorHead{align-items:flex-start}.ptcPlusEditorHead>.ptcPlusBindingLifecycle{margin-left:auto}.ptcPlusSourceBody .cm-editor{height:300px}}
30547
- .ptcPlusReplIdentity{grid-column:1}.ptcPlusReplReuse{flex:none;padding:0 5px;border-radius:999px;background:var(--dsw-alias-bg-layer-2,rgba(38,49,72,.06));color:var(--dsw-alias-label-tertiary,#74777d);font:500 10px/15px system-ui,sans-serif;white-space:nowrap}
30548
- .ptcPlusObservationReuseTotal{font-size:13px;color:var(--dsw-alias-label-tertiary)}.ptcPlusObservationReuse{color:var(--dsw-alias-label-tertiary);white-space:nowrap;font-variant-numeric:tabular-nums}
30549
- `;
30550
- function installStyles() {
30551
- if (document.getElementById(CLIENT_STYLE_ID) !== null) return () => {
30552
- };
30553
- const style = document.createElement("style");
30554
- style.id = CLIENT_STYLE_ID;
30555
- style.textContent = `${CLIENT_CSS}${BINDING_WORKBENCH_CSS}${REPL_CONSOLE_CSS}`;
30556
- document.head.append(style);
30557
- return () => style.remove();
30558
- }
30559
-
30560
30867
  // src/client-catalog.js
30561
30868
  function createCatalogOwner({ callUserBindings }) {
30562
30869
  const sources = /* @__PURE__ */ new Set();
@@ -31145,7 +31452,7 @@
31145
31452
  "details",
31146
31453
  { className: "ptcPlusBindingSection ptcPlusBindingSourcePreview", open: true },
31147
31454
  h("summary", { className: "ptcPlusBindingFieldLabel" }, t2("bindings.declaration")),
31148
- state.declaration === "" ? h("p", { className: "ptcPlusMessage" }, t2("bindings.unvalidated")) : typeof CodeBlock === "function" ? h(CodeBlock, {
31455
+ state.declaration === "" ? h("p", { className: "ptcPlusMessage" }, t2("bindings.unvalidated")) : isHostComponent(CodeBlock) ? h(CodeBlock, {
31149
31456
  code: state.declaration,
31150
31457
  lang: "typescript",
31151
31458
  className: "ptcPlusCodeBlock",
@@ -31217,7 +31524,7 @@
31217
31524
  disabled: state.busy,
31218
31525
  label: t2("bindings.source"),
31219
31526
  onChange: (value) => edit("source", value)
31220
- }) : state.sourceOpen && typeof CodeBlock === "function" ? h(CodeBlock, {
31527
+ }) : state.sourceOpen && isHostComponent(CodeBlock) ? h(CodeBlock, {
31221
31528
  code: state.draft.source,
31222
31529
  lang: "typescript",
31223
31530
  className: "ptcPlusSourceCode",
@@ -31321,10 +31628,12 @@
31321
31628
  const content2 = React.useRef(null);
31322
31629
  const localReturnFocus = React.useRef(null);
31323
31630
  const returnFocus = returnFocusRef ?? localReturnFocus;
31324
- React.useEffect(() => {
31631
+ const attachContent = React.useCallback((element) => {
31632
+ content2.current = element;
31633
+ if (element === null) return;
31325
31634
  const previous = document.activeElement;
31326
- if (!content2.current.contains(previous) && canReturnFocus(previous)) returnFocus.current = previous;
31327
- content2.current.querySelector("button")?.focus();
31635
+ if (!element.contains(previous) && canReturnFocus(previous)) returnFocus.current = previous;
31636
+ element.querySelector("button")?.focus();
31328
31637
  }, [returnFocus]);
31329
31638
  const close = () => {
31330
31639
  const target = canReturnFocus(returnFocus.current) ? returnFocus.current : getReturnFocus?.();
@@ -31347,7 +31656,7 @@
31347
31656
  { open: true, onClose: close, title: t2("bindings.title"), headless: true, className: "ptcPlusBindingsModal" },
31348
31657
  h(
31349
31658
  "div",
31350
- { className: "ptcPlusBindingsDialog", ref: content2, onKeyDown: trapFocus },
31659
+ { className: "ptcPlusBindingsDialog", ref: attachContent, onKeyDown: trapFocus },
31351
31660
  h(
31352
31661
  "div",
31353
31662
  { className: "ptcPlusBindingsDialogHead" },
@@ -31530,22 +31839,350 @@
31530
31839
  });
31531
31840
  }
31532
31841
 
31842
+ // src/client-primitives.js
31843
+ function menuEntry(React, item, onSelect) {
31844
+ const h = React.createElement;
31845
+ const content2 = item.label ?? item.text ?? null;
31846
+ if (item.type === "separator") {
31847
+ return h("div", { key: item.id, className: "ptcPlusFallbackMenuSeparator", role: "separator" });
31848
+ }
31849
+ if (item.type === "label") {
31850
+ return h("div", { key: item.id, className: "ptcPlusFallbackMenuLabel" }, content2);
31851
+ }
31852
+ return h("button", {
31853
+ key: item.id,
31854
+ type: "button",
31855
+ role: "menuitem",
31856
+ className: "ptcPlusFallbackMenuItem",
31857
+ disabled: item.disabled === true,
31858
+ onClick: () => onSelect?.(item.id)
31859
+ }, content2);
31860
+ }
31861
+ function useCompositionGuard(React, open) {
31862
+ const composing = React.useRef(false);
31863
+ const ended = React.useRef(false);
31864
+ React.useEffect(() => {
31865
+ composing.current = false;
31866
+ ended.current = false;
31867
+ if (!open) return void 0;
31868
+ const start = () => {
31869
+ composing.current = true;
31870
+ };
31871
+ const end = () => {
31872
+ composing.current = false;
31873
+ ended.current = true;
31874
+ };
31875
+ const release = () => {
31876
+ ended.current = false;
31877
+ };
31878
+ const blur = () => {
31879
+ composing.current = false;
31880
+ ended.current = false;
31881
+ };
31882
+ document.addEventListener("compositionstart", start, true);
31883
+ document.addEventListener("compositionend", end, true);
31884
+ document.addEventListener("keyup", release, true);
31885
+ window.addEventListener("blur", blur);
31886
+ return () => {
31887
+ document.removeEventListener("compositionstart", start, true);
31888
+ document.removeEventListener("compositionend", end, true);
31889
+ document.removeEventListener("keyup", release, true);
31890
+ window.removeEventListener("blur", blur);
31891
+ composing.current = false;
31892
+ ended.current = false;
31893
+ };
31894
+ }, [open]);
31895
+ return (event) => {
31896
+ const guarded = composing.current || ended.current || event.isComposing === true || event.keyCode === 229;
31897
+ ended.current = false;
31898
+ return guarded;
31899
+ };
31900
+ }
31901
+ function createFallbackMenu(React, createPortal = (content2) => content2) {
31902
+ const h = React.createElement;
31903
+ return function FallbackMenu({
31904
+ open,
31905
+ items = [],
31906
+ children,
31907
+ footer,
31908
+ className,
31909
+ listClassName,
31910
+ autoFocus,
31911
+ anchor,
31912
+ onClose,
31913
+ onSelect,
31914
+ portal = false,
31915
+ side = "bottom",
31916
+ align = "start",
31917
+ getAnchorRect,
31918
+ closeOnPointerLeave = false
31919
+ }) {
31920
+ const root = React.useRef(null);
31921
+ const list = React.useRef(null);
31922
+ const closeTimer = React.useRef(null);
31923
+ const close = React.useRef(onClose);
31924
+ close.current = onClose;
31925
+ const isComposing = useCompositionGuard(React, open);
31926
+ const cancelClose = () => {
31927
+ clearTimeout(closeTimer.current);
31928
+ closeTimer.current = null;
31929
+ };
31930
+ const scheduleClose = () => {
31931
+ if (!closeOnPointerLeave) return;
31932
+ cancelClose();
31933
+ closeTimer.current = setTimeout(() => close.current?.(), 180);
31934
+ };
31935
+ React.useEffect(() => cancelClose, [open]);
31936
+ React.useLayoutEffect(() => {
31937
+ if (!open) return void 0;
31938
+ const place = () => {
31939
+ const rect = getAnchorRect?.() ?? root.current?.getBoundingClientRect();
31940
+ const surface2 = list.current;
31941
+ if (!rect || !surface2) return;
31942
+ const viewport = window.visualViewport;
31943
+ const viewportTop = viewport?.offsetTop ?? 0;
31944
+ const viewportLeft = viewport?.offsetLeft ?? 0;
31945
+ const viewportHeight = viewport?.height ?? window.innerHeight;
31946
+ const viewportWidth = viewport?.width ?? window.innerWidth;
31947
+ const available = Math.max(0, side === "top" ? rect.top - viewportTop - 12 : viewportTop + viewportHeight - rect.bottom - 12);
31948
+ surface2.style.maxHeight = `${available}px`;
31949
+ const measured = surface2.getBoundingClientRect();
31950
+ const left = align === "end" ? rect.right - measured.width : rect.left;
31951
+ surface2.style.left = `${Math.max(viewportLeft + 8, Math.min(left, viewportLeft + viewportWidth - measured.width - 8))}px`;
31952
+ surface2.style.top = `${side === "top" ? Math.max(viewportTop + 8, rect.top - measured.height - 4) : rect.bottom + 4}px`;
31953
+ };
31954
+ place();
31955
+ window.addEventListener("resize", place);
31956
+ window.addEventListener("scroll", place, true);
31957
+ window.visualViewport?.addEventListener("resize", place);
31958
+ window.visualViewport?.addEventListener("scroll", place);
31959
+ return () => {
31960
+ window.removeEventListener("resize", place);
31961
+ window.removeEventListener("scroll", place, true);
31962
+ window.visualViewport?.removeEventListener("resize", place);
31963
+ window.visualViewport?.removeEventListener("scroll", place);
31964
+ };
31965
+ }, [open, side, align, getAnchorRect, children, items, footer]);
31966
+ React.useEffect(() => {
31967
+ if (!open) return void 0;
31968
+ if (autoFocus) list.current?.querySelector("button:not(:disabled)")?.focus();
31969
+ const onKeyDown = (event) => {
31970
+ if (event.defaultPrevented || isComposing(event)) return;
31971
+ if (event.key === "Escape") {
31972
+ event.preventDefault();
31973
+ event.stopPropagation();
31974
+ if (!event.repeat) close.current?.();
31975
+ return;
31976
+ }
31977
+ if (!root.current?.contains(event.target) && !list.current?.contains(event.target)) return;
31978
+ if (!["ArrowDown", "ArrowUp", "Home", "End"].includes(event.key)) return;
31979
+ const controls = [...list.current.querySelectorAll("button:not(:disabled)")];
31980
+ if (controls.length === 0) return;
31981
+ const current = controls.indexOf(document.activeElement);
31982
+ const next = event.key === "Home" ? 0 : event.key === "End" ? controls.length - 1 : (current + (event.key === "ArrowDown" ? 1 : -1) + controls.length) % controls.length;
31983
+ event.preventDefault();
31984
+ controls[next].focus();
31985
+ };
31986
+ const onPointerDown = (event) => {
31987
+ if (root.current?.contains(event.target) || list.current?.contains(event.target)) return;
31988
+ close.current?.();
31989
+ };
31990
+ document.addEventListener("keydown", onKeyDown);
31991
+ document.addEventListener("pointerdown", onPointerDown, true);
31992
+ return () => {
31993
+ document.removeEventListener("keydown", onKeyDown);
31994
+ document.removeEventListener("pointerdown", onPointerDown, true);
31995
+ };
31996
+ }, [open, autoFocus]);
31997
+ const rows = (list2) => list2.map((item) => menuEntry(React, item, onSelect));
31998
+ const surface = open ? h(
31999
+ "div",
32000
+ {
32001
+ ref: list,
32002
+ className: ["ptcPlusFallbackMenuList", listClassName].filter(Boolean).join(" "),
32003
+ role: "menu",
32004
+ onPointerEnter: cancelClose,
32005
+ onPointerLeave: scheduleClose
32006
+ },
32007
+ ...rows(items),
32008
+ ...Array.isArray(footer) ? rows(footer) : [],
32009
+ children ?? null
32010
+ ) : null;
32011
+ return h(
32012
+ "span",
32013
+ {
32014
+ ref: root,
32015
+ className: ["ptcPlusFallbackMenu", className].filter(Boolean).join(" "),
32016
+ onPointerEnter: cancelClose,
32017
+ onPointerLeave: scheduleClose
32018
+ },
32019
+ anchor ?? null,
32020
+ portal && surface !== null ? createPortal(surface, document.body) : surface
32021
+ );
32022
+ };
32023
+ }
32024
+ function createFallbackModal(React, createPortal = (content2) => content2) {
32025
+ const h = React.createElement;
32026
+ const modalStack = [];
32027
+ return function FallbackModal({ open, onClose, title, closeLabel, description, className, contentClassName, headless, children }) {
32028
+ const root = React.useRef(null);
32029
+ const close = React.useRef(onClose);
32030
+ close.current = onClose;
32031
+ const isComposing = useCompositionGuard(React, open);
32032
+ const focusable = 'button:not(:disabled),input:not(:disabled),textarea:not(:disabled),select:not(:disabled),[href],[tabindex]:not([tabindex="-1"])';
32033
+ React.useLayoutEffect(() => {
32034
+ if (!open) return void 0;
32035
+ const previous = document.activeElement;
32036
+ const surface2 = root.current;
32037
+ const target = surface2?.querySelector("[data-modal-autofocus]:not(:disabled)") ?? surface2?.querySelector(focusable) ?? surface2;
32038
+ target?.focus({ preventScroll: true });
32039
+ modalStack.push(surface2);
32040
+ const onDocumentKeyDown = (event) => {
32041
+ if (modalStack.at(-1) === surface2) onKeyDown(event);
32042
+ };
32043
+ document.addEventListener("keydown", onDocumentKeyDown);
32044
+ return () => {
32045
+ document.removeEventListener("keydown", onDocumentKeyDown);
32046
+ modalStack.splice(modalStack.indexOf(surface2), 1);
32047
+ if (document.activeElement === document.body || surface2?.contains(document.activeElement)) previous?.focus?.({ preventScroll: true });
32048
+ };
32049
+ }, [open]);
32050
+ const onKeyDown = (event) => {
32051
+ if (event.defaultPrevented || isComposing(event)) return;
32052
+ if (event.key === "Escape") {
32053
+ event.preventDefault();
32054
+ event.stopPropagation();
32055
+ if (!event.repeat) close.current?.();
32056
+ } else if (event.key === "Tab") {
32057
+ const controls = [...root.current.querySelectorAll(focusable)].filter((control) => control.getClientRects().length > 0);
32058
+ const target = event.shiftKey ? controls.at(-1) : controls[0];
32059
+ const boundary = event.shiftKey ? controls[0] : controls.at(-1);
32060
+ if (controls.length === 0 || document.activeElement === boundary || !root.current.contains(document.activeElement)) {
32061
+ event.preventDefault();
32062
+ (target ?? root.current).focus({ preventScroll: true });
32063
+ }
32064
+ }
32065
+ };
32066
+ if (!open) return null;
32067
+ const body = h("div", { className: contentClassName ?? "ptcPlusFallbackModalBody" }, children);
32068
+ const surface = ["ptcPlusFallbackModal", className].filter(Boolean).join(" ");
32069
+ return createPortal(h("div", {
32070
+ className: "ptcPlusFallbackModalBackdrop",
32071
+ onPointerDown: (event) => {
32072
+ if (event.target === event.currentTarget) onClose?.();
32073
+ }
32074
+ }, h(
32075
+ "div",
32076
+ { ref: root, tabIndex: -1, className: surface, role: "dialog", "aria-modal": "true", "aria-label": title },
32077
+ headless === true ? null : h(
32078
+ "div",
32079
+ { className: "ptcPlusFallbackModalHead" },
32080
+ h("h2", null, title),
32081
+ h(
32082
+ "button",
32083
+ { type: "button", className: "ptcPlusDialogClose", "aria-label": closeLabel ?? title, onClick: () => onClose?.() },
32084
+ closeLabel ?? "\xD7"
32085
+ )
32086
+ ),
32087
+ headless === true || description === void 0 ? null : h("p", { className: "ptcPlusDetail" }, description),
32088
+ headless === true ? children : body
32089
+ )), document.body);
32090
+ };
32091
+ }
32092
+ function resolvePrimitives(primitives, React, createPortal) {
32093
+ return Object.freeze({
32094
+ Button: primitives.Button,
32095
+ CodeBlock: primitives.CodeBlock,
32096
+ DisclosureRow: primitives.DisclosureRow,
32097
+ Menu: isHostComponent(primitives.Menu) ? primitives.Menu : createFallbackMenu(React, createPortal),
32098
+ MenuFallback: createFallbackMenu(React, createPortal),
32099
+ Modal: isHostComponent(primitives.Modal) ? primitives.Modal : createFallbackModal(React, createPortal),
32100
+ Toast: primitives.Toast,
32101
+ Tooltip: primitives.Tooltip
32102
+ });
32103
+ }
32104
+ function createActionButton(React, Button) {
32105
+ const h = React.createElement;
32106
+ return function ActionButton({ className = "", "data-kind": kind, ...props }) {
32107
+ const classes = className.split(/\s+/).filter((name2) => name2 !== "" && name2 !== "ptcPlusButton");
32108
+ return isHostComponent(Button) ? h(Button, {
32109
+ type: "button",
32110
+ ...props,
32111
+ size: "sm",
32112
+ variant: kind === "primary" ? "primary" : kind === "ghost" ? "ghost" : "outline",
32113
+ className: classes.join(" ")
32114
+ }) : h("button", { type: "button", ...props, className: ["ptcPlusButton", ...classes].join(" "), "data-kind": kind });
32115
+ };
32116
+ }
32117
+
31533
32118
  // src/client.js
32119
+ var UNAVAILABLE_PREFERENCE = Object.freeze({
32120
+ status: "unavailable",
32121
+ writable: false,
32122
+ value: CONFIG_DEFAULTS
32123
+ });
32124
+ function createPreferenceScope(ctx) {
32125
+ const listeners = /* @__PURE__ */ new Set();
32126
+ const registrations = /* @__PURE__ */ new Map();
32127
+ let bound;
32128
+ const notify = () => {
32129
+ for (const listener of [...listeners]) listener();
32130
+ };
32131
+ const sync = () => {
32132
+ const next = registrations.get("configForms") ?? registrations.get("settingsScope");
32133
+ if (bound === next) return;
32134
+ bound = next;
32135
+ notify();
32136
+ };
32137
+ const adopt = (name2, scope) => {
32138
+ if (scope === void 0 || scope === null) return void 0;
32139
+ const registration = { scope };
32140
+ const unsubscribe = typeof scope.subscribe === "function" ? scope.subscribe(() => {
32141
+ if (bound === registration) notify();
32142
+ }) : void 0;
32143
+ registrations.set(name2, registration);
32144
+ sync();
32145
+ return () => {
32146
+ unsubscribe?.();
32147
+ if (registrations.get(name2) !== registration) return;
32148
+ registrations.delete(name2);
32149
+ sync();
32150
+ };
32151
+ };
32152
+ ctx.inject(["configForms"], (scope) => adopt("configForms", scope.configForms.get(SETTINGS_NAMESPACE)));
32153
+ ctx.inject(["settingsScope"], (scope) => adopt("settingsScope", scope.settingsScope.bind({ namespace: SETTINGS_NAMESPACE })));
32154
+ return Object.freeze({
32155
+ getSnapshot: () => bound?.scope.getSnapshot() ?? UNAVAILABLE_PREFERENCE,
32156
+ subscribe(listener) {
32157
+ listeners.add(listener);
32158
+ return () => listeners.delete(listener);
32159
+ },
32160
+ set: (key, value) => bound?.scope.set(key, value),
32161
+ mutate: (patch) => bound?.scope.mutate(patch)
32162
+ });
32163
+ }
31534
32164
  window.__ModuleLoader__.load({
31535
32165
  // Replaced by the bundle entry with the package name from package.json.
31536
32166
  id: "dsh-ptc-plus",
31537
32167
  factory: (require2) => {
31538
32168
  const React = require2("react");
31539
- const primitives = require2("@deepseek-ai/dsh-client-ui-primitives");
32169
+ const { createPortal } = require2("react-dom");
32170
+ let primitives;
32171
+ try {
32172
+ primitives = require2("@deepseek-ai/dsh-client-ui-primitives") ?? {};
32173
+ } catch {
32174
+ primitives = {};
32175
+ }
31540
32176
  const {
31541
32177
  Button,
31542
32178
  CodeBlock,
31543
32179
  DisclosureRow,
31544
32180
  Menu,
32181
+ MenuFallback,
31545
32182
  Modal,
31546
32183
  Toast,
31547
32184
  Tooltip
31548
- } = primitives;
32185
+ } = resolvePrimitives(primitives, React, createPortal);
31549
32186
  const {
31550
32187
  check: IconCheckOutline14,
31551
32188
  chevron: IconChevronDownOutline14,
@@ -31571,16 +32208,9 @@
31571
32208
  "aria-label": label,
31572
32209
  title: label
31573
32210
  }, isHostIconComponent(Icon) ? h(Icon, { size: 16 }) : label);
31574
- return typeof Tooltip === "function" ? h(Tooltip, { label, delayMs: 400 }, button) : button;
31575
- }
31576
- function ActionButton({ className = "", "data-kind": kind, ...props }) {
31577
- return typeof Button === "function" ? h(Button, {
31578
- ...props,
31579
- size: "sm",
31580
- variant: kind === "primary" ? "primary" : kind === "ghost" ? "ghost" : "outline",
31581
- className: className.split(" ").filter((name2) => name2 !== "ptcPlusButton").join(" ")
31582
- }) : h("button", { ...props, className, "data-kind": kind });
32211
+ return isHostComponent(Tooltip) ? h(Tooltip, { label, delayMs: 400 }, button) : button;
31583
32212
  }
32213
+ const ActionButton = createActionButton(React, Button);
31584
32214
  const BindingConsole = createBindingConsole(React, {
31585
32215
  TypeScriptEditor,
31586
32216
  IconButton,
@@ -31592,31 +32222,9 @@
31592
32222
  DisclosureRow,
31593
32223
  icons: { chevron: IconChevronDownOutline14, check: IconCheckOutline14, inspect: IconInspectOutline12 }
31594
32224
  });
31595
- function settingsPreferenceScope(ctx) {
31596
- return new Promise((resolve2, reject) => {
31597
- let settled = false;
31598
- let configFormsWatcher;
31599
- let settingsScopeWatcher;
31600
- const take = (name2, scope) => {
31601
- if (settled) return;
31602
- settled = true;
31603
- if (name2 !== "configForms" && typeof configFormsWatcher === "function") configFormsWatcher();
31604
- if (name2 !== "settingsScope" && typeof settingsScopeWatcher === "function") settingsScopeWatcher();
31605
- resolve2(name2 === "configForms" ? scope.configForms.get(SETTINGS_NAMESPACE) : scope.settingsScope.bind({ namespace: SETTINGS_NAMESPACE }));
31606
- };
31607
- try {
31608
- configFormsWatcher = ctx.inject(["configForms"], (scope) => take("configForms", scope));
31609
- if (!settled) {
31610
- settingsScopeWatcher = ctx.inject(["settingsScope"], (scope) => take("settingsScope", scope));
31611
- }
31612
- } catch (error) {
31613
- reject(error);
31614
- }
31615
- });
31616
- }
31617
32225
  async function apply(ctx) {
31618
32226
  const rpc = await createClientRpc(ctx);
31619
- const preferenceScope = await settingsPreferenceScope(ctx);
32227
+ const preferenceScope = createPreferenceScope(ctx);
31620
32228
  ctx.effect(() => ctx.locale.register(LOCALE_NS, SETTINGS_COPY), "ptc-plus: settings dictionaries");
31621
32229
  ctx.effect(installStyles, "ptc-plus: client styles");
31622
32230
  async function callUserBindings(endpoint, payload = {}, signal = void 0) {
@@ -31766,9 +32374,12 @@
31766
32374
  ActionButton,
31767
32375
  IconButton,
31768
32376
  Menu,
32377
+ MenuFallback,
31769
32378
  Toast,
31770
32379
  Tooltip,
31771
32380
  CodeBlock,
32381
+ Modal,
32382
+ createPortal,
31772
32383
  BindingsDialog,
31773
32384
  PTCPlusSettingsDialog,
31774
32385
  useWorkbenchController,
@@ -31814,7 +32425,7 @@
31814
32425
  ctx.slots.inject("conversation.input.dock", () => ctx.slots.inject("conversation.input.left", () => registerGated(ctx, settingsGate("bindings", () => ctx.slots.register({
31815
32426
  name: "conversation.input.dock",
31816
32427
  id: "ptc-plus-binding-review",
31817
- order: 30,
32428
+ order: -30,
31818
32429
  locale: LOCALE_NS
31819
32430
  }, (props) => typeof props.useProjection === "function" && props.sessionId !== void 0 ? h(BindingReviewDock, { ...props, key: props.sessionId }) : null)))));
31820
32431
  const availability = createBindingCommandAvailability(ctx);
@@ -31853,3 +32464,16 @@
31853
32464
  }
31854
32465
  });
31855
32466
  })();
32467
+ /*! Bundled license information:
32468
+
32469
+ react-is/cjs/react-is.development.js:
32470
+ (**
32471
+ * @license React
32472
+ * react-is.development.js
32473
+ *
32474
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
32475
+ *
32476
+ * This source code is licensed under the MIT license found in the
32477
+ * LICENSE file in the root directory of this source tree.
32478
+ *)
32479
+ */