@ggui-ai/dev-stack 0.21.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.
@@ -20807,8 +20807,11 @@ function buildWireConfig(opts) {
20807
20807
  ...opts.onDispatchSuppressed !== void 0 ? { onDispatchSuppressed: opts.onDispatchSuppressed } : {},
20808
20808
  dispatch: (actionName, data) => {
20809
20809
  const actionSpec = opts.getActiveActionSpec();
20810
+ if (actionSpec === void 0)
20811
+ opts.onActionSpecAbsent?.(actionName);
20810
20812
  const isOneShot = actionSpec?.[actionName]?.oneShot === true;
20811
- if (isOneShot && spentOneShots.has(actionName)) {
20813
+ const spent = spentOneShots.has(actionName) || opts.getSpentOneShots?.()?.includes(actionName) === true;
20814
+ if (isOneShot && spent) {
20812
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.`);
20813
20816
  opts.onDispatchSuppressed?.({
20814
20817
  reason: "one-shot-spent",
@@ -21105,11 +21108,20 @@ function Container({ children, maxWidth: maxWidth2 = "lg", center = true, paddin
21105
21108
  ...style
21106
21109
  }, children });
21107
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
+ }
21108
21119
  function renderWithTrait(trait, traitProps, root, children) {
21120
+ const marks = frameAttributes(root.frame);
21109
21121
  if (trait === void 0) {
21110
- 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);
21111
21123
  }
21112
- 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);
21113
21125
  }
21114
21126
  function resolveToneCss(tone) {
21115
21127
  switch (tone) {
@@ -21233,9 +21245,14 @@ function Card(props) {
21233
21245
  surface,
21234
21246
  style,
21235
21247
  className,
21248
+ bleed,
21236
21249
  as: Trait,
21237
21250
  ...traitProps
21238
21251
  } = props;
21252
+ const frame = {
21253
+ ...surface !== "transparent" ? { surface: surface ?? "default" } : {},
21254
+ ...bleed === true ? { bleed: true } : {}
21255
+ };
21239
21256
  const resolvedPadding = resolveSpacing(padding);
21240
21257
  const resolvedSurface = resolveSurfaceCss(surface ?? "default");
21241
21258
  const resolvedOnColor = resolveSurfaceOnColorCss(surface ?? "default");
@@ -21253,10 +21270,11 @@ function Card(props) {
21253
21270
  if (scope !== void 0) {
21254
21271
  return renderWithTrait(Trait, traitProps, {
21255
21272
  className: className ? `${className} ${scope.className}` : scope.className,
21256
- style: composedStyle
21273
+ style: composedStyle,
21274
+ frame
21257
21275
  }, (0, import_jsx_runtime4.jsxs)(import_jsx_runtime4.Fragment, { children: [(0, import_jsx_runtime4.jsx)("style", { children: scope.css }), children] }));
21258
21276
  }
21259
- return renderWithTrait(Trait, traitProps, { className, style: composedStyle }, children);
21277
+ return renderWithTrait(Trait, traitProps, { className, style: composedStyle, frame }, children);
21260
21278
  }
21261
21279
  var justifyMap = {
21262
21280
  start: "flex-start",
@@ -21342,7 +21360,9 @@ function Grid(props) {
21342
21360
  return renderWithTrait(Trait, traitProps, { className, style: composedStyle }, children);
21343
21361
  }
21344
21362
  function Box(props) {
21345
- 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 } : {} };
21346
21366
  let computedPadding;
21347
21367
  if (paddingX !== void 0 || paddingY !== void 0) {
21348
21368
  const px = resolveSpacing(paddingX) || "0";
@@ -21367,10 +21387,11 @@ function Box(props) {
21367
21387
  if (scope !== void 0) {
21368
21388
  return renderWithTrait(Trait, traitProps, {
21369
21389
  className: className ? `${className} ${scope.className}` : scope.className,
21370
- style: composedStyle
21390
+ style: composedStyle,
21391
+ ...frame !== void 0 ? { frame } : {}
21371
21392
  }, (0, import_jsx_runtime6.jsxs)(import_jsx_runtime6.Fragment, { children: [(0, import_jsx_runtime6.jsx)("style", { children: scope.css }), children] }));
21372
21393
  }
21373
- return renderWithTrait(Trait, traitProps, { className, style: composedStyle }, children);
21394
+ return renderWithTrait(Trait, traitProps, { className, style: composedStyle, ...frame !== void 0 ? { frame } : {} }, children);
21374
21395
  }
21375
21396
  function Divider({ orientation = "horizontal", margin = "var(--ggui-spacing-md, 16px)", tone, style, className }) {
21376
21397
  const resolvedMargin = typeof margin === "number" ? `${margin}px` : margin;
@@ -32889,6 +32910,8 @@ function framelessSuppressionRule(scopeClass) {
32889
32910
  return `
32890
32911
  .${scopeClass} > :where(:not(style)) { border: none !important; }`;
32891
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))`;
32892
32915
  function structuralScaffolding(scopeClass) {
32893
32916
  return `.${scopeClass} *, .${scopeClass} *::before, .${scopeClass} *::after { box-sizing: border-box; }
32894
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.21.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.21.0",
32
- "@ggui-ai/project-config": "0.21.0",
33
- "@ggui-ai/ui-registry": "0.21.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/mcp-apps-react": "0.21.0",
44
- "@ggui-ai/wire": "0.21.0",
45
- "@ggui-ai/design": "0.21.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",