@ggui-ai/dev-stack 0.22.0 → 0.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -20810,7 +20810,8 @@ function buildWireConfig(opts) {
20810
20810
  if (actionSpec === void 0)
20811
20811
  opts.onActionSpecAbsent?.(actionName);
20812
20812
  const isOneShot = actionSpec?.[actionName]?.oneShot === true;
20813
- if (isOneShot && spentOneShots.has(actionName)) {
20813
+ const spent = spentOneShots.has(actionName) || opts.getSpentOneShots?.()?.includes(actionName) === true;
20814
+ if (isOneShot && spent) {
20814
20815
  console.warn(`[ggui] dispatch('${actionName}') suppressed: this action is declared oneShot and already fired for this render. A second gesture is NOT sent to the agent \u2014 the submitted control is spent for the render's lifetime. If the action is meant to repeat, remove \`oneShot\` from its contract entry.`);
20815
20816
  opts.onDispatchSuppressed?.({
20816
20817
  reason: "one-shot-spent",
@@ -21107,11 +21108,20 @@ function Container({ children, maxWidth: maxWidth2 = "lg", center = true, paddin
21107
21108
  ...style
21108
21109
  }, children });
21109
21110
  }
21111
+ function frameAttributes(frame) {
21112
+ if (frame === void 0)
21113
+ return {};
21114
+ return {
21115
+ ...frame.surface !== void 0 ? { "data-ggui-surface": frame.surface } : {},
21116
+ ...frame.bleed === true ? { "data-ggui-bleed": "" } : {}
21117
+ };
21118
+ }
21110
21119
  function renderWithTrait(trait, traitProps, root, children) {
21120
+ const marks = frameAttributes(root.frame);
21111
21121
  if (trait === void 0) {
21112
- return (0, import_react9.createElement)("div", { className: root.className, style: root.style }, children);
21122
+ return (0, import_react9.createElement)("div", { className: root.className, style: root.style, ...marks }, children);
21113
21123
  }
21114
- return (0, import_react9.createElement)(trait, { ...traitProps, className: root.className, style: root.style }, children);
21124
+ return (0, import_react9.createElement)(trait, { ...traitProps, className: root.className, style: root.style, ...marks }, children);
21115
21125
  }
21116
21126
  function resolveToneCss(tone) {
21117
21127
  switch (tone) {
@@ -21235,9 +21245,14 @@ function Card(props) {
21235
21245
  surface,
21236
21246
  style,
21237
21247
  className,
21248
+ bleed,
21238
21249
  as: Trait,
21239
21250
  ...traitProps
21240
21251
  } = props;
21252
+ const frame = {
21253
+ ...surface !== "transparent" ? { surface: surface ?? "default" } : {},
21254
+ ...bleed === true ? { bleed: true } : {}
21255
+ };
21241
21256
  const resolvedPadding = resolveSpacing(padding);
21242
21257
  const resolvedSurface = resolveSurfaceCss(surface ?? "default");
21243
21258
  const resolvedOnColor = resolveSurfaceOnColorCss(surface ?? "default");
@@ -21255,10 +21270,11 @@ function Card(props) {
21255
21270
  if (scope !== void 0) {
21256
21271
  return renderWithTrait(Trait, traitProps, {
21257
21272
  className: className ? `${className} ${scope.className}` : scope.className,
21258
- style: composedStyle
21273
+ style: composedStyle,
21274
+ frame
21259
21275
  }, (0, import_jsx_runtime4.jsxs)(import_jsx_runtime4.Fragment, { children: [(0, import_jsx_runtime4.jsx)("style", { children: scope.css }), children] }));
21260
21276
  }
21261
- return renderWithTrait(Trait, traitProps, { className, style: composedStyle }, children);
21277
+ return renderWithTrait(Trait, traitProps, { className, style: composedStyle, frame }, children);
21262
21278
  }
21263
21279
  var justifyMap = {
21264
21280
  start: "flex-start",
@@ -21344,7 +21360,9 @@ function Grid(props) {
21344
21360
  return renderWithTrait(Trait, traitProps, { className, style: composedStyle }, children);
21345
21361
  }
21346
21362
  function Box(props) {
21347
- const { children, padding, paddingX, paddingY, margin, surface, assetColor, assetSemantic, radius: radius2, style, className, as: Trait, ...traitProps } = props;
21363
+ const { children, padding, paddingX, paddingY, margin, surface, assetColor, assetSemantic, radius: radius2, style, className, bleed, as: Trait, ...traitProps } = props;
21364
+ const markedSurface = surface !== void 0 && surface !== "transparent" ? surface : void 0;
21365
+ const frame = markedSurface === void 0 && bleed !== true ? void 0 : { ...markedSurface !== void 0 ? { surface: markedSurface } : {}, ...bleed === true ? { bleed: true } : {} };
21348
21366
  let computedPadding;
21349
21367
  if (paddingX !== void 0 || paddingY !== void 0) {
21350
21368
  const px = resolveSpacing(paddingX) || "0";
@@ -21369,10 +21387,11 @@ function Box(props) {
21369
21387
  if (scope !== void 0) {
21370
21388
  return renderWithTrait(Trait, traitProps, {
21371
21389
  className: className ? `${className} ${scope.className}` : scope.className,
21372
- style: composedStyle
21390
+ style: composedStyle,
21391
+ ...frame !== void 0 ? { frame } : {}
21373
21392
  }, (0, import_jsx_runtime6.jsxs)(import_jsx_runtime6.Fragment, { children: [(0, import_jsx_runtime6.jsx)("style", { children: scope.css }), children] }));
21374
21393
  }
21375
- return renderWithTrait(Trait, traitProps, { className, style: composedStyle }, children);
21394
+ return renderWithTrait(Trait, traitProps, { className, style: composedStyle, ...frame !== void 0 ? { frame } : {} }, children);
21376
21395
  }
21377
21396
  function Divider({ orientation = "horizontal", margin = "var(--ggui-spacing-md, 16px)", tone, style, className }) {
21378
21397
  const resolvedMargin = typeof margin === "number" ? `${margin}px` : margin;
@@ -32891,6 +32910,8 @@ function framelessSuppressionRule(scopeClass) {
32891
32910
  return `
32892
32911
  .${scopeClass} > :where(:not(style)) { border: none !important; }`;
32893
32912
  }
32913
+ var EXPANDED_FRAME = { outerRadiusVar: "--ggui-shape-radius-xl", insetPx: 16 };
32914
+ var EXPANDED_FRAME_INNER_RADIUS = `max(0px, calc(var(${EXPANDED_FRAME.outerRadiusVar}) - ${EXPANDED_FRAME.insetPx}px))`;
32894
32915
  function structuralScaffolding(scopeClass) {
32895
32916
  return `.${scopeClass} *, .${scopeClass} *::before, .${scopeClass} *::after { box-sizing: border-box; }
32896
32917
  .${scopeClass} h1, .${scopeClass} h2, .${scopeClass} h3, .${scopeClass} h4, .${scopeClass} h5, .${scopeClass} h6, .${scopeClass} button, .${scopeClass} input, .${scopeClass} textarea, .${scopeClass} select { font-family: inherit; }`;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ggui-ai/dev-stack",
3
- "version": "0.22.0",
3
+ "version": "0.23.0",
4
4
  "description": "Shared local dev engine for the ggui protocol: local UI registry discovery, compile-on-demand, filesystem watcher with SSE, and a read-only HTTP surface for dev tooling. Framework-neutral — agent runtime supervision plugs in via an adapter seam, so no agent SDK is hardcoded.",
5
5
  "keywords": [
6
6
  "ggui",
@@ -28,9 +28,9 @@
28
28
  "dependencies": {
29
29
  "chokidar": "^4.0.3",
30
30
  "esbuild": "^0.28.2",
31
- "@ggui-ai/agent-runtime": "0.22.0",
32
- "@ggui-ai/project-config": "0.22.0",
33
- "@ggui-ai/ui-registry": "0.22.0"
31
+ "@ggui-ai/agent-runtime": "0.23.0",
32
+ "@ggui-ai/project-config": "0.23.0",
33
+ "@ggui-ai/ui-registry": "0.23.0"
34
34
  },
35
35
  "devDependencies": {
36
36
  "@types/node": "^24.0.0",
@@ -40,9 +40,9 @@
40
40
  "react-dom": "^19.0.0",
41
41
  "typescript": "^5.0.0",
42
42
  "vitest": "^3.2.6",
43
- "@ggui-ai/design": "0.22.0",
44
- "@ggui-ai/mcp-apps-react": "0.22.0",
45
- "@ggui-ai/wire": "0.22.0"
43
+ "@ggui-ai/design": "0.23.0",
44
+ "@ggui-ai/mcp-apps-react": "0.23.0",
45
+ "@ggui-ai/wire": "0.23.0"
46
46
  },
47
47
  "repository": {
48
48
  "type": "git",