@ggui-ai/dev-stack 0.20.0 → 0.22.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,6 +20807,8 @@ 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
20813
  if (isOneShot && spentOneShots.has(actionName)) {
20812
20814
  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.`);
@@ -21587,14 +21589,29 @@ var easing = {
21587
21589
  easeInOut: "cubic-bezier(0.4, 0, 0.2, 1)",
21588
21590
  spring: "cubic-bezier(0.175, 0.885, 0.32, 1.275)"
21589
21591
  };
21592
+ var motionVar = {
21593
+ duration: {
21594
+ fast: "var(--ggui-motion-duration-fast)",
21595
+ base: "var(--ggui-motion-duration-base)",
21596
+ slow: "var(--ggui-motion-duration-slow)"
21597
+ },
21598
+ easing: {
21599
+ /** The system's ease-in-out — the default for colour, border and size changes. */
21600
+ standard: "var(--ggui-motion-easing-standard)",
21601
+ /** The decelerating arrival — transforms and entrances. */
21602
+ emphasized: "var(--ggui-motion-easing-emphasized)",
21603
+ /** The accelerating departure. */
21604
+ exit: "var(--ggui-motion-easing-exit)"
21605
+ }
21606
+ };
21590
21607
  var transition = {
21591
21608
  none: "none",
21592
- fast: `${duration.fast} ${easing.easeInOut}`,
21593
- normal: `${duration.normal} ${easing.easeInOut}`,
21594
- slow: `${duration.slow} ${easing.easeInOut}`,
21595
- colors: `color ${duration.normal} ${easing.easeInOut}, background-color ${duration.normal} ${easing.easeInOut}, border-color ${duration.normal} ${easing.easeInOut}`,
21596
- opacity: `opacity ${duration.normal} ${easing.easeInOut}`,
21597
- transform: `transform ${duration.normal} ${easing.easeOut}`
21609
+ fast: `${motionVar.duration.fast} ${motionVar.easing.standard}`,
21610
+ normal: `${motionVar.duration.base} ${motionVar.easing.standard}`,
21611
+ slow: `${motionVar.duration.slow} ${motionVar.easing.standard}`,
21612
+ colors: `color ${motionVar.duration.base} ${motionVar.easing.standard}, background-color ${motionVar.duration.base} ${motionVar.easing.standard}, border-color ${motionVar.duration.base} ${motionVar.easing.standard}`,
21613
+ opacity: `opacity ${motionVar.duration.base} ${motionVar.easing.standard}`,
21614
+ transform: `transform ${motionVar.duration.base} ${motionVar.easing.emphasized}`
21598
21615
  };
21599
21616
  var sizeStyles = {
21600
21617
  xs: {
@@ -21668,7 +21685,7 @@ function Button({ children, variant = "primary", size = "md", fullWidth, loading
21668
21685
  cursor: isDisabled ? "not-allowed" : "pointer",
21669
21686
  opacity: isDisabled ? 0.5 : 1,
21670
21687
  width: fullWidth ? "100%" : void 0,
21671
- transition: `background-color ${duration.normal} ${easing.easeInOut}, box-shadow ${duration.normal} ${easing.easeInOut}, opacity ${duration.normal} ${easing.easeInOut}`,
21688
+ transition: `background-color ${motionVar.duration.base} ${motionVar.easing.standard}, box-shadow ${motionVar.duration.base} ${motionVar.easing.standard}, opacity ${motionVar.duration.base} ${motionVar.easing.standard}`,
21672
21689
  boxShadow: "var(--ggui-shape-shadow-sm, 0 1px 2px rgba(0,0,0,0.05))",
21673
21690
  ...style
21674
21691
  }, ...rest, children: loading ? (0, import_jsx_runtime9.jsx)(Spinner, { size: 16, tone: "inherit" }) : (0, import_jsx_runtime9.jsxs)(import_jsx_runtime9.Fragment, { children: [leftIcon, children, rightIcon] }) });
@@ -21709,7 +21726,7 @@ function Input({ label, placeholder, value, onChange, type = "text", error, help
21709
21726
  border: `1px solid ${hasError ? "var(--ggui-color-error-500, #ef4444)" : "var(--ggui-color-outline, #d4d4d8)"}`,
21710
21727
  backgroundColor: disabled ? "var(--ggui-color-sunken, #fafafa)" : "var(--ggui-color-sunken, #ffffff)",
21711
21728
  color: "var(--ggui-color-onContainer, #18181b)",
21712
- transition: `border-color ${duration.normal} ${easing.easeInOut}, box-shadow ${duration.normal} ${easing.easeInOut}`,
21729
+ transition: `border-color ${motionVar.duration.base} ${motionVar.easing.standard}, box-shadow ${motionVar.duration.base} ${motionVar.easing.standard}`,
21713
21730
  boxSizing: "border-box"
21714
21731
  }, ...rest }), hasMessage && (0, import_jsx_runtime11.jsx)("span", { id: messageId, role: hasError ? "alert" : void 0, style: {
21715
21732
  fontSize: "var(--ggui-font-size-xs, 12px)",
@@ -21741,7 +21758,7 @@ function TextArea({ label, placeholder, value, onChange, rows = 4, error, helper
21741
21758
  color: "var(--ggui-color-onContainer, #18181b)",
21742
21759
  fontSize: "var(--ggui-font-size-sm, 14px)",
21743
21760
  fontFamily: "inherit",
21744
- transition: `border-color ${duration.normal} ${easing.easeInOut}, box-shadow ${duration.normal} ${easing.easeInOut}`,
21761
+ transition: `border-color ${motionVar.duration.base} ${motionVar.easing.standard}, box-shadow ${motionVar.duration.base} ${motionVar.easing.standard}`,
21745
21762
  boxSizing: "border-box",
21746
21763
  resize: autoResize ? "none" : "vertical"
21747
21764
  }, ...rest }), (0, import_jsx_runtime12.jsxs)("div", { style: { display: "flex", justifyContent: "space-between" }, children: [hasMessage && (0, import_jsx_runtime12.jsx)("span", { id: messageId, role: hasError ? "alert" : void 0, style: {
@@ -21782,7 +21799,7 @@ function Select({ label, value, onChange, options, placeholder, error, helperTex
21782
21799
  backgroundPosition: "right 12px center",
21783
21800
  paddingRight: "36px",
21784
21801
  boxSizing: "border-box",
21785
- transition: `border-color ${duration.normal} ${easing.easeInOut}, box-shadow ${duration.normal} ${easing.easeInOut}`
21802
+ transition: `border-color ${motionVar.duration.base} ${motionVar.easing.standard}, box-shadow ${motionVar.duration.base} ${motionVar.easing.standard}`
21786
21803
  }, ...rest, children: [placeholder && (0, import_jsx_runtime13.jsx)("option", { value: "", disabled: true, children: placeholder }), options.map((opt) => (0, import_jsx_runtime13.jsx)("option", { value: opt.value, disabled: opt.disabled, children: opt.label }, opt.value))] }), hasMessage && (0, import_jsx_runtime13.jsx)("span", { id: messageId, role: hasError ? "alert" : void 0, style: {
21787
21804
  fontSize: "var(--ggui-font-size-xs, 12px)",
21788
21805
  color: hasError ? "var(--ggui-color-error-500, #ef4444)" : "var(--ggui-color-onSunken, #52525b)"
@@ -21821,7 +21838,7 @@ function Checkbox({ label, checked, onChange, disabled, description, indetermina
21821
21838
  display: "flex",
21822
21839
  alignItems: "center",
21823
21840
  justifyContent: "center",
21824
- transition: "all 0.2s"
21841
+ transition: `all ${motionVar.duration.base} ${motionVar.easing.standard}`
21825
21842
  }, children: (checked || indeterminate) && (0, import_jsx_runtime14.jsx)("svg", { width: "12", height: "12", viewBox: "0 0 12 12", fill: "none", style: { color: "var(--ggui-color-onPrimary, #ffffff)" }, children: indeterminate ? (0, import_jsx_runtime14.jsx)("path", { d: "M2.5 6H9.5", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round" }) : (0, import_jsx_runtime14.jsx)("path", { d: "M2.5 6L5 8.5L9.5 3.5", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }) }) })] }), (label || description) && (0, import_jsx_runtime14.jsxs)("div", { style: { display: "flex", flexDirection: "column", gap: "2px" }, children: [label && (0, import_jsx_runtime14.jsx)("span", { style: {
21826
21843
  fontSize: "var(--ggui-font-size-sm, 14px)",
21827
21844
  fontWeight: "var(--ggui-font-weight-medium, 500)",
@@ -21859,7 +21876,7 @@ function Toggle({ label, checked, onChange, disabled, size = "md", style, classN
21859
21876
  borderRadius: "9999px",
21860
21877
  backgroundColor: checked ? "var(--ggui-color-primary-600, #0284c7)" : "var(--ggui-color-outline, #d4d4d8)",
21861
21878
  position: "relative",
21862
- transition: `background-color ${duration.normal} ${easing.easeInOut}, box-shadow ${duration.normal} ${easing.easeInOut}`,
21879
+ transition: `background-color ${motionVar.duration.base} ${motionVar.easing.standard}, box-shadow ${motionVar.duration.base} ${motionVar.easing.standard}`,
21863
21880
  flexShrink: 0,
21864
21881
  outline: "none",
21865
21882
  boxShadow: focused ? "0 0 0 3px var(--ggui-color-primary-200, #bae6fd)" : void 0
@@ -21871,7 +21888,7 @@ function Toggle({ label, checked, onChange, disabled, size = "md", style, classN
21871
21888
  position: "absolute",
21872
21889
  top: (config.height - config.knob) / 2,
21873
21890
  left: checked ? config.width - config.knob - (config.height - config.knob) / 2 : (config.height - config.knob) / 2,
21874
- transition: `left ${duration.normal} ${easing.easeInOut}`,
21891
+ transition: `left ${motionVar.duration.base} ${motionVar.easing.standard}`,
21875
21892
  boxShadow: "var(--ggui-shape-shadow-sm, 0 1px 2px rgba(0,0,0,0.05))"
21876
21893
  } }) }), label && (0, import_jsx_runtime15.jsx)("span", { style: {
21877
21894
  fontSize: "var(--ggui-font-size-sm, 14px)",
@@ -21925,7 +21942,7 @@ function RadioGroup({ label, value, onChange, options, direction = "vertical", d
21925
21942
  display: "flex",
21926
21943
  alignItems: "center",
21927
21944
  justifyContent: "center",
21928
- transition: "all 0.2s"
21945
+ transition: `all ${motionVar.duration.base} ${motionVar.easing.standard}`
21929
21946
  }, children: isSelected && (0, import_jsx_runtime16.jsx)("div", { style: {
21930
21947
  width: "8px",
21931
21948
  height: "8px",
@@ -21969,7 +21986,7 @@ function Slider({ label, value = 0, onChange, min = 0, max = 100, step = 1, disa
21969
21986
  height: "6px",
21970
21987
  borderRadius: "3px",
21971
21988
  backgroundColor: disabled ? "var(--ggui-color-outline, #d4d4d8)" : "var(--ggui-color-primary-600, #0284c7)",
21972
- transition: "width 0.1s"
21989
+ transition: `width ${motionVar.duration.fast} ${motionVar.easing.standard}`
21973
21990
  } }), (0, import_jsx_runtime17.jsx)("input", { id: sliderId, type: "range", min, max, step, value, onChange: (e) => onChange?.(Number(e.target.value)), disabled, "aria-labelledby": label ? labelId : void 0, "aria-label": label ? void 0 : "Slider", "aria-valuenow": value, "aria-valuemin": min, "aria-valuemax": max, style: {
21974
21991
  position: "absolute",
21975
21992
  width: "100%",
@@ -21987,7 +22004,7 @@ function Slider({ label, value = 0, onChange, min = 0, max = 100, step = 1, disa
21987
22004
  backgroundColor: "#ffffff",
21988
22005
  border: `2px solid ${disabled ? "var(--ggui-color-outline, #d4d4d8)" : "var(--ggui-color-primary-600, #0284c7)"}`,
21989
22006
  boxShadow: "var(--ggui-shape-shadow-sm, 0 1px 2px rgba(0,0,0,0.05))",
21990
- transition: "left 0.1s",
22007
+ transition: `left ${motionVar.duration.fast} ${motionVar.easing.standard}`,
21991
22008
  pointerEvents: "none"
21992
22009
  } })] })] });
21993
22010
  }
@@ -22199,7 +22216,7 @@ function Progress({ value, max = 100, variant = "default", size = "md", label, s
22199
22216
  height: "100%",
22200
22217
  borderRadius: height / 2,
22201
22218
  backgroundColor: barColor,
22202
- transition: indeterminate ? "none" : "width 0.3s ease",
22219
+ transition: indeterminate ? "none" : `width ${motionVar.duration.slow} ${motionVar.easing.standard}`,
22203
22220
  ...indeterminate ? {
22204
22221
  width: "30%",
22205
22222
  animation: "ggui-progress-indeterminate 1.5s ease-in-out infinite"
@@ -26816,7 +26833,7 @@ function Link({ children, href, external, tone, underline = "hover", style, clas
26816
26833
  color: linkColor,
26817
26834
  textDecoration: underlineStyle,
26818
26835
  cursor: "pointer",
26819
- transition: "color 0.2s",
26836
+ transition: `color ${motionVar.duration.base} ${motionVar.easing.standard}`,
26820
26837
  ...style
26821
26838
  }, onMouseEnter: (e) => {
26822
26839
  if (underline === "hover") {
@@ -26968,7 +26985,7 @@ function Table({ columns, data, sortKey, sortDirection = "asc", onSort, striped
26968
26985
  cursor: col.sortable ? "pointer" : "default"
26969
26986
  }, children: (0, import_jsx_runtime27.jsxs)("span", { style: { display: "inline-flex", alignItems: "center" }, children: [col.header, col.sortable && sortIndicator(sortKey === col.key, sortDirection)] }) }, col.key)) }) }), (0, import_jsx_runtime27.jsx)("tbody", { children: data.map((row, rowIndex) => (0, import_jsx_runtime27.jsx)("tr", { onMouseEnter: hoverable ? () => setHoveredRow(rowIndex) : void 0, onMouseLeave: hoverable ? () => setHoveredRow(null) : void 0, style: {
26970
26987
  backgroundColor: hoverable && hoveredRow === rowIndex ? "var(--ggui-color-sunken, #fafafa)" : striped && rowIndex % 2 === 1 ? "var(--ggui-color-sunken, #fafafa)" : "transparent",
26971
- transition: "background-color 0.15s ease"
26988
+ transition: `background-color ${motionVar.duration.fast} ${motionVar.easing.standard}`
26972
26989
  }, children: columns.map((col) => (0, import_jsx_runtime27.jsx)("td", { style: {
26973
26990
  padding: cellPadding,
26974
26991
  textAlign: col.align || "left",
@@ -27038,7 +27055,7 @@ function Tabs({ items, activeKey, onChange, variant = "line", size = "md", fullW
27038
27055
  background: "none",
27039
27056
  border: "none",
27040
27057
  fontWeight: isActive ? "var(--ggui-font-weight-semibold, 600)" : "var(--ggui-font-weight-medium, 500)",
27041
- transition: `color ${duration.normal} ${easing.easeInOut}, background-color ${duration.normal} ${easing.easeInOut}, border-color ${duration.normal} ${easing.easeInOut}`,
27058
+ transition: `color ${motionVar.duration.base} ${motionVar.easing.standard}, background-color ${motionVar.duration.base} ${motionVar.easing.standard}, border-color ${motionVar.duration.base} ${motionVar.easing.standard}`,
27042
27059
  whiteSpace: "nowrap",
27043
27060
  flex: fullWidth ? 1 : void 0,
27044
27061
  justifyContent: fullWidth ? "center" : void 0
@@ -27320,7 +27337,7 @@ function Toast({ message, variant = "info", title, duration: duration2 = 5e3, on
27320
27337
  }, children: (0, import_jsx_runtime29.jsx)("svg", { width: "16", height: "16", viewBox: "0 0 20 20", fill: "currentColor", children: (0, import_jsx_runtime29.jsx)("path", { fillRule: "evenodd", d: "M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z", clipRule: "evenodd" }) }) })] });
27321
27338
  }
27322
27339
  var chevron = (expanded) => (0, import_jsx_runtime30.jsx)("svg", { width: "16", height: "16", viewBox: "0 0 20 20", fill: "currentColor", "aria-hidden": "true", style: {
27323
- transition: `transform ${duration.normal} ${easing.easeInOut}`,
27340
+ transition: `transform ${motionVar.duration.base} ${motionVar.easing.standard}`,
27324
27341
  transform: expanded ? "rotate(180deg)" : "rotate(0deg)",
27325
27342
  flexShrink: 0
27326
27343
  }, children: (0, import_jsx_runtime30.jsx)("path", { fillRule: "evenodd", d: "M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z", clipRule: "evenodd" }) });
@@ -27393,7 +27410,7 @@ function Accordion({ items, expandedKeys, onChange, multiple = false, variant =
27393
27410
  fontWeight: "var(--ggui-font-weight-medium, 500)",
27394
27411
  color: "var(--ggui-color-onContainer, #18181b)",
27395
27412
  textAlign: "left",
27396
- transition: `background-color ${duration.fast} ${easing.easeInOut}`
27413
+ transition: `background-color ${motionVar.duration.fast} ${motionVar.easing.standard}`
27397
27414
  }, children: [(0, import_jsx_runtime30.jsx)("span", { children: item.title }), chevron(isExpanded)] }) }), (0, import_jsx_runtime30.jsx)("div", { id: `${uniqueId}-panel-${item.key}`, role: "region", "aria-labelledby": `${uniqueId}-header-${item.key}`, hidden: !isExpanded, style: {
27398
27415
  overflow: "hidden"
27399
27416
  }, children: isExpanded && (0, import_jsx_runtime30.jsx)("div", { style: {
@@ -27552,7 +27569,7 @@ function MenuItem({ label, icon, rightElement, onClick, disabled, active, danger
27552
27569
  fontWeight: active ? fontWeight.medium : fontWeight.normal,
27553
27570
  textAlign: "left",
27554
27571
  cursor: disabled ? "not-allowed" : "pointer",
27555
- transition: "background-color 0.15s",
27572
+ transition: `background-color ${motionVar.duration.fast} ${motionVar.easing.standard}`,
27556
27573
  ...style
27557
27574
  }, onMouseEnter: (e) => {
27558
27575
  if (!disabled && !active) {
@@ -27852,7 +27869,7 @@ function Pagination({ currentPage, totalPages, onPageChange, showFirstLast = tru
27852
27869
  fontWeight: active ? fontWeight.medium : fontWeight.normal,
27853
27870
  cursor: disabled ? "not-allowed" : "pointer",
27854
27871
  opacity: disabled ? 0.5 : 1,
27855
- transition: "all 0.15s"
27872
+ transition: `all ${motionVar.duration.fast} ${motionVar.easing.standard}`
27856
27873
  }, children: page });
27857
27874
  return (0, import_jsx_runtime38.jsxs)("nav", { "aria-label": "Pagination", className, style: {
27858
27875
  display: "flex",
@@ -27911,7 +27928,7 @@ function Marker({ index, state }) {
27911
27928
  justifyContent: "center",
27912
27929
  flexShrink: 0,
27913
27930
  boxSizing: "border-box",
27914
- transition: "background-color 0.2s, border-color 0.2s, color 0.2s",
27931
+ transition: `background-color ${motionVar.duration.base} ${motionVar.easing.standard}, border-color ${motionVar.duration.base} ${motionVar.easing.standard}, color ${motionVar.duration.base} ${motionVar.easing.standard}`,
27915
27932
  ...markerStyles[state]
27916
27933
  }, children: state === "completed" ? (0, import_jsx_runtime41.jsx)(Icon, { name: "check", size: 16, tone: "inherit" }) : (0, import_jsx_runtime41.jsx)(Text, { is: "span", size: "sm", weight: "semibold", tone: "inherit", children: index + 1 }) });
27917
27934
  }
@@ -29449,6 +29466,14 @@ var consumed_tokens_manifest_default = {
29449
29466
  "--ggui-font-weight-normal",
29450
29467
  "--ggui-font-weight-semibold",
29451
29468
  "--ggui-letter-spacing-heading",
29469
+ "--ggui-motion-duration-base",
29470
+ "--ggui-motion-duration-fast",
29471
+ "--ggui-motion-duration-slow",
29472
+ "--ggui-motion-easing-emphasized",
29473
+ "--ggui-motion-easing-exit",
29474
+ "--ggui-motion-easing-standard",
29475
+ "--ggui-scrim-opacity",
29476
+ "--ggui-scrim-tint",
29452
29477
  "--ggui-shape-radius-control",
29453
29478
  "--ggui-shape-radius-full",
29454
29479
  "--ggui-shape-radius-lg",
@@ -29600,6 +29625,7 @@ var NAMED_SPACING = { xs: "4px", sm: "8px", md: "16px", lg: "24px", xl: "32px",
29600
29625
  var SIZE_EXP = { xs: -2, sm: -1, base: 0, lg: 1, xl: 2, "2xl": 3, "3xl": 4, "4xl": 5 };
29601
29626
  var ROLE_STOP = { display: "4xl", h1: "3xl", h2: "2xl", body: "base", label: "xs" };
29602
29627
  var LAYER1_SPACING_UNIT_PX = 4;
29628
+ var SCRIM_DEFAULT_OPACITY = "0.45";
29603
29629
  function tokenValue(t) {
29604
29630
  if (t === void 0 || t === null || typeof t !== "object" || !("$value" in t))
29605
29631
  return void 0;
@@ -29631,6 +29657,15 @@ function readToken(t, path, report) {
29631
29657
  function stated(group, key) {
29632
29658
  return tokenValue(group?.[key]);
29633
29659
  }
29660
+ function scrimTint(tone) {
29661
+ if (tone === void 0)
29662
+ return void 0;
29663
+ if (tone === "light")
29664
+ return "#ffffff";
29665
+ if (tone === "dark")
29666
+ return "#000000";
29667
+ return tokenValue(tone);
29668
+ }
29634
29669
  function familyRamp(group, anchor) {
29635
29670
  const statedStops = {};
29636
29671
  for (const stop of STOPS) {
@@ -29833,6 +29868,16 @@ function deriveThemeVariables(doc, mode, options = {}) {
29833
29868
  const sh = doc.shape?.shadow;
29834
29869
  for (const [key, value] of Object.entries(shadow))
29835
29870
  V[`--ggui-shape-shadow-${key}`] = stated(sh, key) ?? String(value);
29871
+ const md = doc.motion?.duration;
29872
+ const me = doc.motion?.easing;
29873
+ V["--ggui-motion-duration-fast"] = stated(md, "fast") ?? duration.fast;
29874
+ V["--ggui-motion-duration-base"] = stated(md, "base") ?? duration.normal;
29875
+ V["--ggui-motion-duration-slow"] = stated(md, "slow") ?? duration.slow;
29876
+ V["--ggui-motion-easing-standard"] = stated(me, "standard") ?? easing.easeInOut;
29877
+ V["--ggui-motion-easing-emphasized"] = stated(me, "emphasized") ?? easing.easeOut;
29878
+ V["--ggui-motion-easing-exit"] = stated(me, "exit") ?? easing.easeIn;
29879
+ V["--ggui-scrim-tint"] = scrimTint(doc.scrim?.tone) ?? V["--ggui-color-ground"];
29880
+ V["--ggui-scrim-opacity"] = tokenValue(doc.scrim?.opacity) ?? SCRIM_DEFAULT_OPACITY;
29836
29881
  if (missing.length > 0)
29837
29882
  throw new ThemeDocumentInvalidError(missing);
29838
29883
  const floor = new Set(NON_THEME_DEFINABLE_TOKENS);
@@ -33025,6 +33070,7 @@ var TOKENS_EXPORTS = [
33025
33070
  "duration",
33026
33071
  "easing",
33027
33072
  "transition",
33073
+ "motionVar",
33028
33074
  "keyframes",
33029
33075
  "thinkingAnimation",
33030
33076
  "thinkingKeyframes",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ggui-ai/dev-stack",
3
- "version": "0.20.0",
3
+ "version": "0.22.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.20.0",
32
- "@ggui-ai/project-config": "0.20.0",
33
- "@ggui-ai/ui-registry": "0.20.0"
31
+ "@ggui-ai/agent-runtime": "0.22.0",
32
+ "@ggui-ai/project-config": "0.22.0",
33
+ "@ggui-ai/ui-registry": "0.22.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.20.0",
44
- "@ggui-ai/mcp-apps-react": "0.20.0",
45
- "@ggui-ai/wire": "0.20.0"
43
+ "@ggui-ai/design": "0.22.0",
44
+ "@ggui-ai/mcp-apps-react": "0.22.0",
45
+ "@ggui-ai/wire": "0.22.0"
46
46
  },
47
47
  "repository": {
48
48
  "type": "git",