@common-origin/design-system 2.20.0 → 2.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.
Files changed (103) hide show
  1. package/dist/client.js +1015 -499
  2. package/dist/client.js.map +1 -1
  3. package/dist/components/atoms/AILabel/AILabel.d.mts +30 -0
  4. package/dist/components/atoms/AILabel/AILabel.d.ts +30 -0
  5. package/dist/components/atoms/AILabel/AILabel.mjs +94 -0
  6. package/dist/components/atoms/AILabel/AILabel.mjs.map +1 -0
  7. package/dist/components/atoms/AILabel/index.d.mts +1 -0
  8. package/dist/components/atoms/AILabel/index.d.ts +1 -0
  9. package/dist/components/atoms/Badge/Badge.d.mts +16 -4
  10. package/dist/components/atoms/Badge/Badge.d.ts +16 -4
  11. package/dist/components/atoms/Badge/Badge.mjs +4 -5
  12. package/dist/components/atoms/Badge/index.d.mts +1 -1
  13. package/dist/components/atoms/Badge/index.d.ts +1 -1
  14. package/dist/components/atoms/Button/Button.mjs +1 -1
  15. package/dist/components/atoms/CategoryLabel/CategoryLabel.d.mts +23 -8
  16. package/dist/components/atoms/CategoryLabel/CategoryLabel.d.ts +23 -8
  17. package/dist/components/atoms/CategoryLabel/CategoryLabel.mjs +31 -18
  18. package/dist/components/atoms/CategoryLabel/index.d.mts +1 -1
  19. package/dist/components/atoms/CategoryLabel/index.d.ts +1 -1
  20. package/dist/components/atoms/Chip/SuggestionChip.d.mts +24 -0
  21. package/dist/components/atoms/Chip/SuggestionChip.d.ts +24 -0
  22. package/dist/components/atoms/Chip/SuggestionChip.mjs +61 -0
  23. package/dist/components/atoms/Chip/SuggestionChip.mjs.map +1 -0
  24. package/dist/components/atoms/Chip/index.d.mts +1 -0
  25. package/dist/components/atoms/Chip/index.d.ts +1 -0
  26. package/dist/components/atoms/Chip/shared/utils.mjs +1 -1
  27. package/dist/components/atoms/Chip/shared/utils.mjs.map +1 -1
  28. package/dist/components/atoms/Icon/Icon.mjs +1 -1
  29. package/dist/components/atoms/MoneyDisplay/MoneyDisplay.mjs +14 -60
  30. package/dist/components/atoms/StatusBadge/StatusBadge.d.mts +3 -2
  31. package/dist/components/atoms/StatusBadge/StatusBadge.d.ts +3 -2
  32. package/dist/components/atoms/StatusBadge/StatusBadge.mjs +1 -1
  33. package/dist/components/atoms/StatusBadge/StatusBadge.mjs.map +1 -1
  34. package/dist/components/atoms/StatusLabel/StatusLabel.d.mts +5 -2
  35. package/dist/components/atoms/StatusLabel/StatusLabel.d.ts +5 -2
  36. package/dist/components/atoms/StatusLabel/StatusLabel.mjs +5 -2
  37. package/dist/components/atoms/StatusLabel/StatusLabel.mjs.map +1 -1
  38. package/dist/components/atoms/StatusLabel/StatusLabelBase.d.mts +2 -2
  39. package/dist/components/atoms/StatusLabel/StatusLabelBase.d.ts +2 -2
  40. package/dist/components/atoms/StatusLabel/StatusLabelBase.mjs +19 -13
  41. package/dist/components/atoms/StatusLabel/StatusShape.d.mts +4 -0
  42. package/dist/components/atoms/StatusLabel/StatusShape.d.ts +4 -0
  43. package/dist/components/atoms/StatusLabel/StatusShape.mjs +31 -0
  44. package/dist/components/atoms/StatusLabel/StatusShape.mjs.map +1 -0
  45. package/dist/components/atoms/Typography/Typography.mjs +2 -2
  46. package/dist/components/atoms/index.d.mts +1 -0
  47. package/dist/components/atoms/index.d.ts +1 -0
  48. package/dist/components/molecules/AccountCard/AccountCard.mjs +21 -13
  49. package/dist/components/molecules/AgentInput/AgentInput.d.mts +63 -1
  50. package/dist/components/molecules/AgentInput/AgentInput.d.ts +63 -1
  51. package/dist/components/molecules/AgentInput/AgentInput.mjs +476 -112
  52. package/dist/components/molecules/AgentInput/agentInputSpeech.d.mts +2 -0
  53. package/dist/components/molecules/AgentInput/agentInputSpeech.d.ts +2 -0
  54. package/dist/components/molecules/AgentInput/agentInputSpeech.mjs +5 -1
  55. package/dist/components/molecules/AgentInput/agentInputSpeech.mjs.map +1 -1
  56. package/dist/components/molecules/AgentInput/index.d.mts +1 -1
  57. package/dist/components/molecules/AgentInput/index.d.ts +1 -1
  58. package/dist/components/molecules/Alert/Alert.d.mts +4 -4
  59. package/dist/components/molecules/Alert/Alert.d.ts +4 -4
  60. package/dist/components/molecules/Alert/Alert.mjs +5 -4
  61. package/dist/components/molecules/CardLarge/CardLarge.mjs +1 -0
  62. package/dist/components/molecules/ChipGroup/ChipGroup.mjs +2 -0
  63. package/dist/components/molecules/CodeBlock/CodeBlock.mjs +1 -1
  64. package/dist/components/molecules/Dropdown/Dropdown.mjs +2 -2
  65. package/dist/components/molecules/FeatureBlock/FeatureBlock.mjs +1 -0
  66. package/dist/components/molecules/InlineAlert/InlineAlert.mjs +15 -5
  67. package/dist/components/molecules/TabBar/TabBar.mjs +3 -3
  68. package/dist/components/molecules/TransactionListItem/TransactionListItem.d.mts +1 -1
  69. package/dist/components/molecules/TransactionListItem/TransactionListItem.d.ts +1 -1
  70. package/dist/components/molecules/TransactionListItem/TransactionListItem.mjs +15 -31
  71. package/dist/data.js +817 -294
  72. package/dist/data.js.map +1 -1
  73. package/dist/index.js +2 -0
  74. package/dist/index.js.map +1 -1
  75. package/dist/index.mjs +2 -0
  76. package/dist/index.mjs.map +1 -1
  77. package/dist/lib/statusShapes.d.mts +2 -0
  78. package/dist/lib/statusShapes.d.ts +2 -0
  79. package/dist/lib/statusShapes.mjs +16 -0
  80. package/dist/lib/statusShapes.mjs.map +1 -0
  81. package/dist/lib/styleUtils.mjs +2 -2
  82. package/dist/lib/styleUtils.mjs.map +1 -1
  83. package/dist/lib/tokenAliases.mjs +16 -10
  84. package/dist/lib/tokenAliases.mjs.map +1 -1
  85. package/dist/styles/icons.json +171 -1
  86. package/dist/styles/icons.json.mjs +185 -3
  87. package/dist/styles/icons.json.mjs.map +1 -1
  88. package/dist/styles/tokens.d.mts +957 -123
  89. package/dist/styles/tokens.d.ts +957 -123
  90. package/dist/styles/tokens.json +633 -292
  91. package/dist/styles/tokens.json.mjs +633 -292
  92. package/dist/styles/tokens.json.mjs.map +1 -1
  93. package/dist/tokens/index.js +633 -292
  94. package/dist/tokens/index.js.map +1 -1
  95. package/dist/tokens/index.mjs +633 -292
  96. package/dist/tokens/index.mjs.map +1 -1
  97. package/dist/tokens/styles/tokens.d.mts +957 -123
  98. package/dist/tokens/styles/tokens.d.ts +957 -123
  99. package/dist/tokens.css +499 -212
  100. package/dist/types/icons.d.mts +1 -1
  101. package/dist/types/icons.d.ts +1 -1
  102. package/dist/types/icons.mjs.map +1 -1
  103. package/package.json +1 -1
package/dist/client.js CHANGED
@@ -156,31 +156,31 @@ function withCssVariables(tree, path) {
156
156
  var tokens = withCssVariables(data.tokensJson);
157
157
 
158
158
  // Destructure tokens
159
- var semantic$l = tokens.semantic;
159
+ var semantic$n = tokens.semantic;
160
160
  var initials = tokens.component.avatar.initials;
161
- var color$b = semantic$l.color,
162
- size$3 = semantic$l.size;
163
- var radius$6 = semantic$l.radius;
161
+ var color$d = semantic$n.color,
162
+ size$4 = semantic$n.size;
163
+ var radius$6 = semantic$n.radius;
164
164
  var AvatarContainer = /*#__PURE__*/styled__default.default.div.withConfig({
165
165
  shouldForwardProp: function shouldForwardProp(prop) {
166
166
  return !prop.startsWith('$');
167
167
  },
168
168
  displayName: "Avatar__AvatarContainer",
169
169
  componentId: "sc-ezn4ax-0"
170
- })(templateObject_1$M || (templateObject_1$M = __makeTemplateObject(["\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: ", ";\n height: ", ";\n border-radius: ", ";\n background-color: ", ";\n overflow: hidden;\n flex-shrink: 0;\n"], ["\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: ", ";\n height: ", ";\n border-radius: ", ";\n background-color: ", ";\n overflow: hidden;\n flex-shrink: 0;\n"])), function (_a) {
170
+ })(templateObject_1$P || (templateObject_1$P = __makeTemplateObject(["\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: ", ";\n height: ", ";\n border-radius: ", ";\n background-color: ", ";\n overflow: hidden;\n flex-shrink: 0;\n"], ["\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: ", ";\n height: ", ";\n border-radius: ", ";\n background-color: ", ";\n overflow: hidden;\n flex-shrink: 0;\n"])), function (_a) {
171
171
  var $size = _a.$size;
172
- return size$3.avatar[$size];
172
+ return size$4.avatar[$size];
173
173
  }, function (_a) {
174
174
  var $size = _a.$size;
175
- return size$3.avatar[$size];
176
- }, radius$6.full, color$b.fill.muted);
175
+ return size$4.avatar[$size];
176
+ }, radius$6.full, color$d.fill.muted);
177
177
  var AvatarImage = /*#__PURE__*/styled__default.default.img.withConfig({
178
178
  shouldForwardProp: function shouldForwardProp(prop) {
179
179
  return !prop.startsWith('$');
180
180
  },
181
181
  displayName: "Avatar__AvatarImage",
182
182
  componentId: "sc-ezn4ax-1"
183
- })(templateObject_2$y || (templateObject_2$y = __makeTemplateObject(["\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: ", ";\n /* Remove the img role since the container already has role=\"img\" */\n"], ["\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: ", ";\n /* Remove the img role since the container already has role=\"img\" */\n"])), radius$6.full);
183
+ })(templateObject_2$z || (templateObject_2$z = __makeTemplateObject(["\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: ", ";\n /* Remove the img role since the container already has role=\"img\" */\n"], ["\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: ", ";\n /* Remove the img role since the container already has role=\"img\" */\n"])), radius$6.full);
184
184
  var AvatarInitials = /*#__PURE__*/styled__default.default.span.withConfig({
185
185
  shouldForwardProp: function shouldForwardProp(prop) {
186
186
  return !prop.startsWith('$');
@@ -192,7 +192,7 @@ var AvatarInitials = /*#__PURE__*/styled__default.default.span.withConfig({
192
192
  ])), initials.fontFamily, initials.fontWeight, function (_a) {
193
193
  var $size = _a.$size;
194
194
  return initials.fontSize[$size];
195
- }, color$b.text["default"], initials.lineHeight);
195
+ }, color$d.text["default"], initials.lineHeight);
196
196
  // Helper function to get initials from name
197
197
  var getInitials = function getInitials(name) {
198
198
  return name.split(' ').map(function (word) {
@@ -246,7 +246,7 @@ var Avatar = function Avatar(_a) {
246
246
  })
247
247
  }));
248
248
  };
249
- var templateObject_1$M, templateObject_2$y, templateObject_3$w;
249
+ var templateObject_1$P, templateObject_2$z, templateObject_3$w;
250
250
 
251
251
  // Breakpoints from the semantic tokens (decision 0014)
252
252
  var breakpoints$1 = {
@@ -281,7 +281,7 @@ var forcedColorsEdge = "".concat(forcedColors, " {\n border: ").concat(tokens.s
281
281
  var reducedMotion = '@media (prefers-reduced-motion: reduce)';
282
282
  // No `from` keyframe: the fade starts from the element's current opacity, including a
283
283
  // still-running entrance, so closing mid-entrance doesn't jump back to fully visible.
284
- var fadeOut$1 = styled.keyframes(templateObject_1$L || (templateObject_1$L = __makeTemplateObject(["\n to { opacity: 0; }\n"], ["\n to { opacity: 0; }\n"
284
+ var fadeOut$1 = styled.keyframes(templateObject_1$O || (templateObject_1$O = __makeTemplateObject(["\n to { opacity: 0; }\n"], ["\n to { opacity: 0; }\n"
285
285
  // Exit for overlays that unmount (use with usePresence). Append `exitAnimation` to each of
286
286
  // the element's `animation` declarations while it exits: the entrance stays in the list,
287
287
  // so it isn't restarted, and the fade runs on top of it. A fade is already the
@@ -295,7 +295,7 @@ var fadeOut$1 = styled.keyframes(templateObject_1$L || (templateObject_1$L = __m
295
295
  // reduced-motion form, so it needs no fallback of its own. While it fades, the backdrop
296
296
  // still catches clicks (so they can't reach the page behind it) and the panel is inert.
297
297
  // Exits accelerate: things leaving speed up as they go (decision 0037).
298
- var exitAnimation = styled.css(templateObject_2$x || (templateObject_2$x = __makeTemplateObject([", ", " ", " ", " forwards"], [", ", " ", " ", " forwards"
298
+ var exitAnimation = styled.css(templateObject_2$y || (templateObject_2$y = __makeTemplateObject([", ", " ", " ", " forwards"], [", ", " ", " ", " forwards"
299
299
  // Content for screen readers only. The 1px size and -1px margin are part of the standard
300
300
  // visually-hidden technique, not design values, so they aren't tokens.
301
301
  ])), fadeOut$1, tokens.semantic.motion.duration.fast, tokens.semantic.motion.easing.accelerate);
@@ -333,11 +333,11 @@ var rowStates = {
333
333
  },
334
334
  hover: {
335
335
  background: rowFill['accent-muted-hover'],
336
- text: rowText['accent-hover']
336
+ text: rowText.accent
337
337
  },
338
338
  pressed: {
339
339
  background: rowFill['accent-muted-pressed'],
340
- text: rowText['accent-pressed']
340
+ text: rowText.accent
341
341
  }
342
342
  }
343
343
  };
@@ -399,44 +399,44 @@ var rowForcedColors = function rowForcedColors(_a) {
399
399
  // the descendants' own rules.
400
400
  return "".concat(forcedColors, " {\n ").concat(selected ? "background-color: Highlight;\n ".concat(text('HighlightText'), "\n && * {\n color: inherit;\n background-color: transparent;\n }") : '', "\n ").concat(!disabled && focused ? hover : '', "\n ").concat(disabled ? '' : "&:hover {\n ".concat(hover, "\n }"), "\n }");
401
401
  };
402
- var templateObject_1$L, templateObject_2$x, templateObject_3$v;
402
+ var templateObject_1$O, templateObject_2$y, templateObject_3$v;
403
403
 
404
404
  var _a$a = tokens.semantic,
405
- typography$2 = _a$a.typography,
406
- color$a = _a$a.color,
405
+ typography$3 = _a$a.typography,
406
+ color$c = _a$a.color,
407
407
  letterSpacing = _a$a.letterSpacing;
408
408
  var getTypographyStyles = function getTypographyStyles(variant) {
409
409
  var styles = {
410
- display: "font: ".concat(typography$2.display, "; letter-spacing: ").concat(letterSpacing.tighter, ";"),
411
- h1: "font: ".concat(typography$2.h1, "; letter-spacing: ").concat(letterSpacing.tighter, ";"),
412
- h2: "font: ".concat(typography$2.h2, "; letter-spacing: ").concat(letterSpacing.tight, ";"),
413
- h3: "font: ".concat(typography$2.h3, "; letter-spacing: ").concat(letterSpacing.tight, ";"),
414
- h4: "font: ".concat(typography$2.h4, "; letter-spacing: ").concat(letterSpacing.tight, ";"),
415
- h5: "font: ".concat(typography$2.h5, "; letter-spacing: ").concat(letterSpacing.normal, ";"),
416
- h6: "font: ".concat(typography$2.h6, "; letter-spacing: ").concat(letterSpacing.normal, ";"),
417
- subtitle: "font: ".concat(typography$2.subtitle, ";"),
418
- body: "font: ".concat(typography$2.body, ";"),
419
- small: "font: ".concat(typography$2.small, ";"),
420
- overline: "font: ".concat(typography$2.overline, ";"),
421
- caption: "font: ".concat(typography$2.caption, "; text-transform: uppercase;"),
410
+ display: "font: ".concat(typography$3.display, "; letter-spacing: ").concat(letterSpacing.tighter, ";"),
411
+ h1: "font: ".concat(typography$3.h1, "; letter-spacing: ").concat(letterSpacing.tighter, ";"),
412
+ h2: "font: ".concat(typography$3.h2, "; letter-spacing: ").concat(letterSpacing.tight, ";"),
413
+ h3: "font: ".concat(typography$3.h3, "; letter-spacing: ").concat(letterSpacing.tight, ";"),
414
+ h4: "font: ".concat(typography$3.h4, "; letter-spacing: ").concat(letterSpacing.tight, ";"),
415
+ h5: "font: ".concat(typography$3.h5, "; letter-spacing: ").concat(letterSpacing.normal, ";"),
416
+ h6: "font: ".concat(typography$3.h6, "; letter-spacing: ").concat(letterSpacing.normal, ";"),
417
+ subtitle: "font: ".concat(typography$3.subtitle, ";"),
418
+ body: "font: ".concat(typography$3.body, ";"),
419
+ small: "font: ".concat(typography$3.small, ";"),
420
+ overline: "font: ".concat(typography$3.overline, ";"),
421
+ caption: "font: ".concat(typography$3.caption, "; text-transform: uppercase;"),
422
422
  button1: "font: ".concat(tokens.component.button.sizes.large.font, ";"),
423
423
  button2: "font: ".concat(tokens.component.button.sizes.medium.font, ";"),
424
- button3: "font: ".concat(tokens.component.button.sizes.small.font, ";"),
425
- label: "font: ".concat(typography$2.label, ";")
424
+ button3: "font: ".concat(tokens.component.button.sizes.small.font, "; font-weight: ").concat(tokens.component.button.sizes.small.fontWeight, ";"),
425
+ label: "font: ".concat(typography$3.label, ";")
426
426
  };
427
427
  return styles[variant] || styles.body;
428
428
  };
429
429
  var getTextColor = function getTextColor(colorVariant) {
430
430
  var colorMap = {
431
- "default": color$a.text["default"],
432
- emphasis: color$a.text.emphasis,
433
- subdued: color$a.text.muted,
434
- inverse: color$a.text.inverse,
435
- disabled: color$a.text.disabled,
436
- interactive: color$a.text.accent,
437
- error: color$a.text.danger,
438
- success: color$a.text.success,
439
- warning: color$a.text.warning
431
+ "default": color$c.text["default"],
432
+ emphasis: color$c.text["default"],
433
+ subdued: color$c.text.muted,
434
+ inverse: color$c.text.inverse,
435
+ disabled: color$c.text.disabled,
436
+ interactive: color$c.text.accent,
437
+ error: color$c.text.danger,
438
+ success: color$c.text.success,
439
+ warning: color$c.text.warning
440
440
  };
441
441
  return colorMap[colorVariant] || colorMap["default"];
442
442
  };
@@ -467,7 +467,7 @@ var StyledTypography = /*#__PURE__*/styled__default.default.span.withConfig({
467
467
  },
468
468
  displayName: "Typography__StyledTypography",
469
469
  componentId: "sc-17mqo4k-0"
470
- })(templateObject_1$K || (templateObject_1$K = __makeTemplateObject(["\n ", "\n color: ", ";\n margin: 0;\n"], ["\n ", "\n color: ", ";\n margin: 0;\n"
470
+ })(templateObject_1$N || (templateObject_1$N = __makeTemplateObject(["\n ", "\n color: ", ";\n margin: 0;\n"], ["\n ", "\n color: ", ";\n margin: 0;\n"
471
471
  /**
472
472
  * Typography is an atomic component for rendering text with semantic meaning and consistent styling.
473
473
  *
@@ -529,20 +529,20 @@ var Typography = function Typography(_a) {
529
529
  children: children
530
530
  });
531
531
  };
532
- var templateObject_1$K;
532
+ var templateObject_1$N;
533
533
 
534
- var semantic$k = tokens.semantic;
535
- var color$9 = semantic$k.color;
536
- var radius$5 = semantic$k.radius;
534
+ var semantic$m = tokens.semantic;
535
+ var color$b = semantic$m.color;
536
+ var radius$5 = semantic$m.radius;
537
537
  var _a$9 = tokens.component.badge,
538
538
  dot = _a$9.dot,
539
539
  count = _a$9.count,
540
540
  ring = _a$9.ring;
541
- var scaleIn$2 = styled.keyframes(templateObject_1$J || (templateObject_1$J = __makeTemplateObject(["\n from {\n transform: scale(0.8);\n opacity: 0;\n }\n to {\n transform: scale(1);\n opacity: 1;\n }\n"], ["\n from {\n transform: scale(0.8);\n opacity: 0;\n }\n to {\n transform: scale(1);\n opacity: 1;\n }\n"])));
541
+ var scaleIn$2 = styled.keyframes(templateObject_1$M || (templateObject_1$M = __makeTemplateObject(["\n from {\n transform: scale(0.8);\n opacity: 0;\n }\n to {\n transform: scale(1);\n opacity: 1;\n }\n"], ["\n from {\n transform: scale(0.8);\n opacity: 0;\n }\n to {\n transform: scale(1);\n opacity: 1;\n }\n"])));
542
542
  var BadgeWrapper = /*#__PURE__*/styled__default.default.span.withConfig({
543
543
  displayName: "Badge__BadgeWrapper",
544
544
  componentId: "sc-tjz4pp-0"
545
- })(templateObject_2$w || (templateObject_2$w = __makeTemplateObject(["\n position: relative;\n display: inline-flex;\n vertical-align: middle;\n flex-shrink: 0;\n"], ["\n position: relative;\n display: inline-flex;\n vertical-align: middle;\n flex-shrink: 0;\n"])));
545
+ })(templateObject_2$x || (templateObject_2$x = __makeTemplateObject(["\n position: relative;\n display: inline-flex;\n vertical-align: middle;\n flex-shrink: 0;\n"], ["\n position: relative;\n display: inline-flex;\n vertical-align: middle;\n flex-shrink: 0;\n"])));
546
546
  var BadgeIndicator = /*#__PURE__*/styled__default.default.span.withConfig({
547
547
  shouldForwardProp: function shouldForwardProp(prop) {
548
548
  return !prop.startsWith('$');
@@ -556,23 +556,22 @@ var BadgeIndicator = /*#__PURE__*/styled__default.default.span.withConfig({
556
556
  }, function (props) {
557
557
  return props.$isDot ? dot.size : count.height;
558
558
  }, function (props) {
559
- return props.$isDot ? '0' : "0 ".concat(semantic$k.space.inset.xs);
560
- }, radius$5.full, count.lineHeight, ring.width, semantic$k.surface.base, scaleIn$2, semantic$k.motion.duration.moderate, semantic$k.motion.easing.decelerate, reducedMotion, function (props) {
561
- return props.$isDot ? "".concat(forcedColors, " { forced-color-adjust: none; background-color: CanvasText; }") : "".concat(forcedColors, " { border: ").concat(semantic$k.border.width.thin, " solid currentColor; }");
559
+ return props.$isDot ? '0' : "0 ".concat(semantic$m.space.inset.xs);
560
+ }, radius$5.full, count.lineHeight, ring.width, semantic$m.surface.base, scaleIn$2, semantic$m.motion.duration.moderate, semantic$m.motion.easing.decelerate, reducedMotion, function (props) {
561
+ return props.$isDot ? "".concat(forcedColors, " { forced-color-adjust: none; background-color: CanvasText; }") : "".concat(forcedColors, " { border: ").concat(semantic$m.border.width.thin, " solid currentColor; }");
562
562
  }, function (props) {
563
563
  switch (props.$variant) {
564
+ // 'primary', 'error', 'warning' and 'success' are deprecated aliases for 'accent', removed in
565
+ // 3.0: 'primary' (#169), and the status colours, because a badge's colour alone can't carry a
566
+ // status (decision 0045, #263)
564
567
  case 'accent':
565
568
  case 'primary':
566
- // Deprecated alias for 'accent', removed in 3.0 (#169)
567
- return "\n background-color: ".concat(color$9.fill.accent, ";\n color: ").concat(color$9.text.inverse, ";\n ");
568
569
  case 'error':
569
- return "\n background-color: ".concat(color$9.fill.danger, ";\n color: ").concat(color$9.text.inverse, ";\n ");
570
570
  case 'warning':
571
- return "\n background-color: ".concat(color$9.fill.warning, ";\n color: ").concat(color$9.text.inverse, ";\n ");
572
571
  case 'success':
573
- return "\n background-color: ".concat(color$9.fill.success, ";\n color: ").concat(color$9.text.inverse, ";\n ");
572
+ return "\n background-color: ".concat(color$b.fill.accent, ";\n color: ").concat(color$b.text.inverse, ";\n ");
574
573
  default:
575
- return "\n background-color: ".concat(color$9.fill.emphasis, ";\n color: ").concat(color$9.text.inverse, ";\n ");
574
+ return "\n background-color: ".concat(color$b.fill.emphasis, ";\n color: ").concat(color$b.text.inverse, ";\n ");
576
575
  }
577
576
  });
578
577
  var ScreenReaderOnly$1 = /*#__PURE__*/styled__default.default.span.withConfig({
@@ -616,16 +615,17 @@ var Badge = function Badge(_a) {
616
615
  })]
617
616
  });
618
617
  };
619
- var templateObject_1$J, templateObject_2$w, templateObject_3$u, templateObject_4$n;
618
+ var templateObject_1$M, templateObject_2$x, templateObject_3$u, templateObject_4$n;
620
619
 
621
620
  // Props whose values are token keys keep their published vocabulary in 2.x (P7), but read the
622
621
  // semantic grammar's names (decision 0031, #189). Each map covers every key the prop type allows,
623
622
  // so TypeScript fails here if a key is added without a mapping.
624
- var semantic$j = tokens.semantic;
625
- var color$8 = semantic$j.color,
626
- space$e = semantic$j.space,
627
- radius$4 = semantic$j.radius,
628
- surface = semantic$j.surface;
623
+ var semantic$l = tokens.semantic;
624
+ var color$a = semantic$l.color,
625
+ space$e = semantic$l.space,
626
+ radius$4 = semantic$l.radius,
627
+ surface = semantic$l.surface,
628
+ opacity = semantic$l.opacity;
629
629
  /** Box's spacing props (`p`, `m`, `gap`…): the old layout scale's keys, read from `space`. */
630
630
  var spaceByLayoutKey = {
631
631
  none: space$e[0],
@@ -645,7 +645,7 @@ var spaceByLayoutKey = {
645
645
  '10xl': space$e[2000],
646
646
  '11xl': space$e[2400],
647
647
  // A keyword, not a step: it stays until the keyword question is settled (0031)
648
- auto: semantic$j.spacing.layout.auto
648
+ auto: semantic$l.spacing.layout.auto
649
649
  };
650
650
  /** Box's `borderRadius` prop: the old radius keys, read from `radius`. */
651
651
  var radiusByKey = {
@@ -665,73 +665,78 @@ var backgroundByKey = {
665
665
  page: surface.base,
666
666
  subtle: surface.raised,
667
667
  overlay: surface.scrim,
668
- emphasis: color$8.fill.emphasis,
669
- 'emphasis-hover': color$8.fill['emphasis-hover'],
670
- 'emphasis-active': color$8.fill['emphasis-pressed'],
671
- surface: color$8.fill.muted,
672
- inverse: color$8.fill.inverse,
673
- interactive: color$8.fill.accent,
674
- 'interactive-hover': color$8.fill['accent-hover'],
675
- 'interactive-active': color$8.fill['accent-pressed'],
676
- 'interactive-subtle': color$8.fill['accent-muted'],
677
- 'interactive-subtle-hover': color$8.fill['accent-muted-hover'],
678
- 'interactive-subtle-active': color$8.fill['accent-muted-pressed'],
679
- error: color$8.fill.danger,
680
- 'error-hover': color$8.fill['danger-hover'],
681
- 'error-active': color$8.fill['danger-pressed'],
682
- 'error-subtle': color$8.fill['danger-muted'],
683
- success: color$8.fill.success,
684
- 'success-subtle': color$8.fill['success-muted'],
685
- warning: color$8.fill.warning,
686
- 'warning-subtle': color$8.fill['warning-muted'],
687
- disabled: color$8.fill.disabled,
688
- neutral: color$8.fill["default"],
689
- 'neutral-hover': color$8.fill['default-hover'],
690
- 'neutral-active': color$8.fill['default-pressed'],
691
- transparent: color$8.fill.none,
692
- 'hover-overlay': color$8.fill['none-hover'],
693
- 'active-overlay': color$8.fill['none-pressed'],
694
- 'inverse-overlay': color$8.fill['inverse-none-hover'],
668
+ emphasis: color$a.fill.emphasis,
669
+ // A strong fill's states mix its content colour in at the state-layer opacity (decision 0048)
670
+ 'emphasis-hover': "color-mix(in srgb, ".concat(color$a.fill.emphasis, ", ").concat(color$a.text.inverse, " calc(").concat(opacity.state.hover, " * 100%))"),
671
+ 'emphasis-active': "color-mix(in srgb, ".concat(color$a.fill.emphasis, ", ").concat(color$a.text.inverse, " calc(").concat(opacity.state.pressed, " * 100%))"),
672
+ surface: color$a.fill.muted,
673
+ inverse: color$a.fill.inverse,
674
+ interactive: color$a.fill.accent,
675
+ 'interactive-hover': color$a.fill['accent-hover'],
676
+ 'interactive-active': color$a.fill['accent-pressed'],
677
+ 'interactive-subtle': color$a.fill['accent-muted'],
678
+ 'interactive-subtle-hover': color$a.fill['accent-muted-hover'],
679
+ 'interactive-subtle-active': color$a.fill['accent-muted-pressed'],
680
+ error: color$a.fill.danger,
681
+ 'error-hover': color$a.fill['danger-hover'],
682
+ 'error-active': color$a.fill['danger-pressed'],
683
+ 'error-subtle': color$a.fill['danger-muted'],
684
+ success: color$a.fill.success,
685
+ 'success-subtle': color$a.fill['success-muted'],
686
+ warning: color$a.fill.warning,
687
+ 'warning-subtle': color$a.fill['warning-muted'],
688
+ disabled: color$a.fill.disabled,
689
+ neutral: color$a.fill["default"],
690
+ 'neutral-hover': color$a.fill['default-hover'],
691
+ 'neutral-active': color$a.fill['default-pressed'],
692
+ transparent: color$a.fill.none,
693
+ 'hover-overlay': color$a.fill['none-hover'],
694
+ 'active-overlay': color$a.fill['none-pressed'],
695
+ 'inverse-overlay': color$a.fill['inverse-none-hover'],
695
696
  // Moved to the component tier (decision 0031 §6)
696
697
  progressTrack: tokens.component.track.background
697
698
  };
698
699
  /** Box's `color` prop: text colours, old and new keys. */
699
700
  var textColorByKey = {
700
- "default": color$8.text["default"],
701
- emphasis: color$8.text.emphasis,
702
- inverse: color$8.text.inverse,
703
- disabled: color$8.text.disabled,
704
- success: color$8.text.success,
705
- warning: color$8.text.warning,
706
- muted: color$8.text.muted,
707
- accent: color$8.text.accent,
708
- 'accent-hover': color$8.text['accent-hover'],
709
- 'accent-pressed': color$8.text['accent-pressed'],
710
- danger: color$8.text.danger,
711
- subdued: color$8.text.muted,
712
- interactive: color$8.text.accent,
713
- 'interactive-hover': color$8.text['accent-hover'],
714
- 'interactive-active': color$8.text['accent-pressed'],
715
- error: color$8.text.danger
701
+ "default": color$a.text["default"],
702
+ emphasis: color$a.text["default"],
703
+ inverse: color$a.text.inverse,
704
+ disabled: color$a.text.disabled,
705
+ success: color$a.text.success,
706
+ warning: color$a.text.warning,
707
+ muted: color$a.text.muted,
708
+ accent: color$a.text.accent,
709
+ 'accent-hover': color$a.text.accent,
710
+ 'accent-pressed': color$a.text.accent,
711
+ danger: color$a.text.danger,
712
+ serious: color$a.text.serious,
713
+ ai: color$a.text.ai,
714
+ subdued: color$a.text.muted,
715
+ interactive: color$a.text.accent,
716
+ 'interactive-hover': color$a.text.accent,
717
+ 'interactive-active': color$a.text.accent,
718
+ error: color$a.text.danger
716
719
  };
717
720
  /** Box's border props: border colours, old and new keys. */
718
721
  var borderColorByKey = {
719
- "default": color$8.border["default"],
720
- success: color$8.border.success,
721
- warning: color$8.border.warning,
722
- none: color$8.border.none,
723
- emphasis: color$8.border.emphasis,
724
- input: color$8.border.input,
725
- 'input-hover': color$8.border['input-hover'],
726
- focus: color$8.border.focus,
727
- accent: color$8.border.accent,
728
- danger: color$8.border.danger,
729
- subtle: color$8.border.emphasis,
730
- control: color$8.border.input,
722
+ "default": color$a.border["default"],
723
+ success: color$a.border.success,
724
+ warning: color$a.border.warning,
725
+ none: color$a.border.none,
726
+ emphasis: color$a.border["default"],
727
+ input: color$a.border.input,
728
+ 'input-hover': color$a.border['input-hover'],
729
+ focus: color$a.border.focus,
730
+ accent: color$a.border.accent,
731
+ danger: color$a.border.danger,
732
+ serious: color$a.border.serious,
733
+ ai: color$a.border.ai,
734
+ subtle: color$a.border["default"],
735
+ control: color$a.border.input,
731
736
  // `strong` split by use (0031); as a generic firm outline it is the hovered-input border
732
- strong: color$8.border['input-hover'],
733
- interactive: color$8.border.accent,
734
- error: color$8.border.danger
737
+ strong: color$a.border['input-hover'],
738
+ interactive: color$a.border.accent,
739
+ error: color$a.border.danger
735
740
  };
736
741
 
737
742
  var StyledBox = /*#__PURE__*/styled__default.default.div.withConfig({
@@ -743,9 +748,9 @@ var StyledBox = /*#__PURE__*/styled__default.default.div.withConfig({
743
748
  })(templateObject_51 || (templateObject_51 = __makeTemplateObject(["\n ", "\n \n // Flexbox\n ", "\n ", "\n ", "\n ", "\n ", "\n \n // Margin\n ", "\n ", "\n ", "\n ", "\n ", "\n ", "\n ", "\n \n // Padding\n ", "\n ", "\n ", "\n ", "\n ", "\n ", "\n ", "\n \n // Size\n ", "\n ", "\n ", "\n ", "\n ", "\n ", "\n \n // Position\n ", "\n ", "\n ", "\n ", "\n ", "\n \n // Borders\n ", "\n ", "\n ", "\n ", "\n ", "\n ", "\n \n // Background & Color\n ", "\n ", "\n \n // Elevation (shadow)\n ", "\n \n // Cursor\n ", "\n \n // Transition\n ", "\n \n // Hover states\n ", "\n \n // Overflow\n ", "\n ", "\n ", "\n"], ["\n ", "\n \n // Flexbox\n ", "\n ", "\n ", "\n ", "\n ", "\n \n // Margin\n ", "\n ", "\n ", "\n ", "\n ", "\n ", "\n ", "\n \n // Padding\n ", "\n ", "\n ", "\n ", "\n ", "\n ", "\n ", "\n \n // Size\n ", "\n ", "\n ", "\n ", "\n ", "\n ", "\n \n // Position\n ", "\n ", "\n ", "\n ", "\n ", "\n \n // Borders\n ", "\n ", "\n ", "\n ", "\n ", "\n ", "\n \n // Background & Color\n ", "\n ", "\n \n // Elevation (shadow)\n ", "\n \n // Cursor\n ", "\n \n // Transition\n ", "\n \n // Hover states\n ", "\n \n // Overflow\n ", "\n ", "\n ", "\n"
744
749
  // Transform component that maps clean props to $-prefixed props for styled-components
745
750
  ])), function (props) {
746
- return props.$display && styled.css(templateObject_1$I || (templateObject_1$I = __makeTemplateObject(["display: ", ";"], ["display: ", ";"])), props.$display);
751
+ return props.$display && styled.css(templateObject_1$L || (templateObject_1$L = __makeTemplateObject(["display: ", ";"], ["display: ", ";"])), props.$display);
747
752
  }, function (props) {
748
- return props.$flexDirection && styled.css(templateObject_2$v || (templateObject_2$v = __makeTemplateObject(["flex-direction: ", ";"], ["flex-direction: ", ";"])), props.$flexDirection);
753
+ return props.$flexDirection && styled.css(templateObject_2$w || (templateObject_2$w = __makeTemplateObject(["flex-direction: ", ";"], ["flex-direction: ", ";"])), props.$flexDirection);
749
754
  }, function (props) {
750
755
  return props.$justifyContent && styled.css(templateObject_3$t || (templateObject_3$t = __makeTemplateObject(["justify-content: ", ";"], ["justify-content: ", ";"])), props.$justifyContent);
751
756
  }, function (props) {
@@ -779,35 +784,35 @@ var StyledBox = /*#__PURE__*/styled__default.default.div.withConfig({
779
784
  }, function (props) {
780
785
  return props.$pl && styled.css(templateObject_18$2 || (templateObject_18$2 = __makeTemplateObject(["padding-left: ", ";"], ["padding-left: ", ";"])), spaceByLayoutKey[props.$pl]);
781
786
  }, function (props) {
782
- return props.$px && styled.css(templateObject_19$1 || (templateObject_19$1 = __makeTemplateObject(["\n padding-left: ", ";\n padding-right: ", ";\n "], ["\n padding-left: ", ";\n padding-right: ", ";\n "])), spaceByLayoutKey[props.$px], spaceByLayoutKey[props.$px]);
787
+ return props.$px && styled.css(templateObject_19$2 || (templateObject_19$2 = __makeTemplateObject(["\n padding-left: ", ";\n padding-right: ", ";\n "], ["\n padding-left: ", ";\n padding-right: ", ";\n "])), spaceByLayoutKey[props.$px], spaceByLayoutKey[props.$px]);
783
788
  }, function (props) {
784
- return props.$py && styled.css(templateObject_20$1 || (templateObject_20$1 = __makeTemplateObject(["\n padding-top: ", ";\n padding-bottom: ", ";\n "], ["\n padding-top: ", ";\n padding-bottom: ", ";\n "])), spaceByLayoutKey[props.$py], spaceByLayoutKey[props.$py]);
789
+ return props.$py && styled.css(templateObject_20$2 || (templateObject_20$2 = __makeTemplateObject(["\n padding-top: ", ";\n padding-bottom: ", ";\n "], ["\n padding-top: ", ";\n padding-bottom: ", ";\n "])), spaceByLayoutKey[props.$py], spaceByLayoutKey[props.$py]);
785
790
  }, function (props) {
786
- return props.$width && styled.css(templateObject_21$1 || (templateObject_21$1 = __makeTemplateObject(["width: ", ";"], ["width: ", ";"])), props.$width);
791
+ return props.$width && styled.css(templateObject_21$2 || (templateObject_21$2 = __makeTemplateObject(["width: ", ";"], ["width: ", ";"])), props.$width);
787
792
  }, function (props) {
788
- return props.$height && styled.css(templateObject_22$1 || (templateObject_22$1 = __makeTemplateObject(["height: ", ";"], ["height: ", ";"])), props.$height);
793
+ return props.$height && styled.css(templateObject_22$2 || (templateObject_22$2 = __makeTemplateObject(["height: ", ";"], ["height: ", ";"])), props.$height);
789
794
  }, function (props) {
790
- return props.$maxWidth && styled.css(templateObject_23$1 || (templateObject_23$1 = __makeTemplateObject(["max-width: ", ";"], ["max-width: ", ";"])), props.$maxWidth);
795
+ return props.$maxWidth && styled.css(templateObject_23$2 || (templateObject_23$2 = __makeTemplateObject(["max-width: ", ";"], ["max-width: ", ";"])), props.$maxWidth);
791
796
  }, function (props) {
792
- return props.$maxHeight && styled.css(templateObject_24$1 || (templateObject_24$1 = __makeTemplateObject(["max-height: ", ";"], ["max-height: ", ";"])), props.$maxHeight);
797
+ return props.$maxHeight && styled.css(templateObject_24$2 || (templateObject_24$2 = __makeTemplateObject(["max-height: ", ";"], ["max-height: ", ";"])), props.$maxHeight);
793
798
  }, function (props) {
794
- return props.$minWidth && styled.css(templateObject_25$1 || (templateObject_25$1 = __makeTemplateObject(["min-width: ", ";"], ["min-width: ", ";"])), props.$minWidth);
799
+ return props.$minWidth && styled.css(templateObject_25$2 || (templateObject_25$2 = __makeTemplateObject(["min-width: ", ";"], ["min-width: ", ";"])), props.$minWidth);
795
800
  }, function (props) {
796
- return props.$minHeight && styled.css(templateObject_26$1 || (templateObject_26$1 = __makeTemplateObject(["min-height: ", ";"], ["min-height: ", ";"])), props.$minHeight);
801
+ return props.$minHeight && styled.css(templateObject_26$2 || (templateObject_26$2 = __makeTemplateObject(["min-height: ", ";"], ["min-height: ", ";"])), props.$minHeight);
797
802
  }, function (props) {
798
- return props.$position && styled.css(templateObject_27$1 || (templateObject_27$1 = __makeTemplateObject(["position: ", ";"], ["position: ", ";"])), props.$position);
803
+ return props.$position && styled.css(templateObject_27$2 || (templateObject_27$2 = __makeTemplateObject(["position: ", ";"], ["position: ", ";"])), props.$position);
799
804
  }, function (props) {
800
- return props.$top && styled.css(templateObject_28$1 || (templateObject_28$1 = __makeTemplateObject(["top: ", ";"], ["top: ", ";"])), props.$top);
805
+ return props.$top && styled.css(templateObject_28$2 || (templateObject_28$2 = __makeTemplateObject(["top: ", ";"], ["top: ", ";"])), props.$top);
801
806
  }, function (props) {
802
- return props.$right && styled.css(templateObject_29$1 || (templateObject_29$1 = __makeTemplateObject(["right: ", ";"], ["right: ", ";"])), props.$right);
807
+ return props.$right && styled.css(templateObject_29$2 || (templateObject_29$2 = __makeTemplateObject(["right: ", ";"], ["right: ", ";"])), props.$right);
803
808
  }, function (props) {
804
- return props.$bottom && styled.css(templateObject_30$1 || (templateObject_30$1 = __makeTemplateObject(["bottom: ", ";"], ["bottom: ", ";"])), props.$bottom);
809
+ return props.$bottom && styled.css(templateObject_30$2 || (templateObject_30$2 = __makeTemplateObject(["bottom: ", ";"], ["bottom: ", ";"])), props.$bottom);
805
810
  }, function (props) {
806
- return props.$left && styled.css(templateObject_31$1 || (templateObject_31$1 = __makeTemplateObject(["left: ", ";"], ["left: ", ";"])), props.$left);
811
+ return props.$left && styled.css(templateObject_31$2 || (templateObject_31$2 = __makeTemplateObject(["left: ", ";"], ["left: ", ";"])), props.$left);
807
812
  }, function (props) {
808
- return props.$borderRadius && styled.css(templateObject_32$1 || (templateObject_32$1 = __makeTemplateObject(["border-radius: ", ";"], ["border-radius: ", ";"])), radiusByKey[props.$borderRadius]);
813
+ return props.$borderRadius && styled.css(templateObject_32$2 || (templateObject_32$2 = __makeTemplateObject(["border-radius: ", ";"], ["border-radius: ", ";"])), radiusByKey[props.$borderRadius]);
809
814
  }, function (props) {
810
- return props.$border && styled.css(templateObject_33$1 || (templateObject_33$1 = __makeTemplateObject(["border: ", " solid ", ";"], ["border: ", " solid ", ";"])), tokens.semantic.border.width.thin, borderColorByKey[props.$border]);
815
+ return props.$border && styled.css(templateObject_33$2 || (templateObject_33$2 = __makeTemplateObject(["border: ", " solid ", ";"], ["border: ", " solid ", ";"])), tokens.semantic.border.width.thin, borderColorByKey[props.$border]);
811
816
  }, function (props) {
812
817
  return props.$borderTop && styled.css(templateObject_34$1 || (templateObject_34$1 = __makeTemplateObject(["border-top: ", " solid ", ";"], ["border-top: ", " solid ", ";"])), tokens.semantic.border.width.thin, borderColorByKey[props.$borderTop]);
813
818
  }, function (props) {
@@ -967,7 +972,7 @@ var BoxTransform = function BoxTransform(props) {
967
972
  }));
968
973
  };
969
974
  var Box = BoxTransform;
970
- var templateObject_1$I, templateObject_2$v, templateObject_3$t, templateObject_4$m, templateObject_5$i, templateObject_6$d, templateObject_7$b, templateObject_8$8, templateObject_9$6, templateObject_10$4, templateObject_11$4, templateObject_12$4, templateObject_13$4, templateObject_14$2, templateObject_15$2, templateObject_16$2, templateObject_17$2, templateObject_18$2, templateObject_19$1, templateObject_20$1, templateObject_21$1, templateObject_22$1, templateObject_23$1, templateObject_24$1, templateObject_25$1, templateObject_26$1, templateObject_27$1, templateObject_28$1, templateObject_29$1, templateObject_30$1, templateObject_31$1, templateObject_32$1, templateObject_33$1, templateObject_34$1, templateObject_35$1, templateObject_36, templateObject_37, templateObject_38, templateObject_39, templateObject_40, templateObject_41, templateObject_42, templateObject_43, templateObject_44, templateObject_45, templateObject_46, templateObject_47, templateObject_48, templateObject_49, templateObject_50, templateObject_51;
975
+ var templateObject_1$L, templateObject_2$w, templateObject_3$t, templateObject_4$m, templateObject_5$i, templateObject_6$d, templateObject_7$b, templateObject_8$8, templateObject_9$6, templateObject_10$4, templateObject_11$4, templateObject_12$4, templateObject_13$4, templateObject_14$2, templateObject_15$2, templateObject_16$2, templateObject_17$2, templateObject_18$2, templateObject_19$2, templateObject_20$2, templateObject_21$2, templateObject_22$2, templateObject_23$2, templateObject_24$2, templateObject_25$2, templateObject_26$2, templateObject_27$2, templateObject_28$2, templateObject_29$2, templateObject_30$2, templateObject_31$2, templateObject_32$2, templateObject_33$2, templateObject_34$1, templateObject_35$1, templateObject_36, templateObject_37, templateObject_38, templateObject_39, templateObject_40, templateObject_41, templateObject_42, templateObject_43, templateObject_44, templateObject_45, templateObject_46, templateObject_47, templateObject_48, templateObject_49, templateObject_50, templateObject_51;
971
976
 
972
977
  var IconStyled = /*#__PURE__*/styled__default.default.span.withConfig({
973
978
  shouldForwardProp: function shouldForwardProp(prop) {
@@ -975,7 +980,7 @@ var IconStyled = /*#__PURE__*/styled__default.default.span.withConfig({
975
980
  },
976
981
  displayName: "Icon__IconStyled",
977
982
  componentId: "sc-1105czq-0"
978
- })(templateObject_1$H || (templateObject_1$H = __makeTemplateObject(["\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: ", ";\n height: ", ";\n \n svg {\n width: 100%;\n height: 100%;\n display: block;\n }\n \n /* Use semantic icon colors */\n color: ", ";\n"], ["\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: ", ";\n height: ", ";\n \n svg {\n width: 100%;\n height: 100%;\n display: block;\n }\n \n /* Use semantic icon colors */\n color: ", ";\n"])), function (_a) {
983
+ })(templateObject_1$K || (templateObject_1$K = __makeTemplateObject(["\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: ", ";\n height: ", ";\n \n svg {\n width: 100%;\n height: 100%;\n display: block;\n }\n \n /* Use semantic icon colors */\n color: ", ";\n"], ["\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: ", ";\n height: ", ";\n \n svg {\n width: 100%;\n height: 100%;\n display: block;\n }\n \n /* Use semantic icon colors */\n color: ", ";\n"])), function (_a) {
979
984
  var $size = _a.$size;
980
985
  return tokens.semantic.size.icon[$size];
981
986
  }, function (_a) {
@@ -987,7 +992,7 @@ var IconStyled = /*#__PURE__*/styled__default.default.span.withConfig({
987
992
  case 'default':
988
993
  return tokens.semantic.color.icon["default"];
989
994
  case 'emphasis':
990
- return tokens.semantic.color.icon.emphasis;
995
+ return tokens.semantic.color.icon["default"];
991
996
  case 'subdued':
992
997
  return tokens.semantic.color.icon.muted;
993
998
  case 'disabled':
@@ -1052,17 +1057,17 @@ var Icon = function Icon(_a) {
1052
1057
  }))
1053
1058
  });
1054
1059
  };
1055
- var templateObject_1$H;
1060
+ var templateObject_1$K;
1056
1061
 
1057
1062
  var button$1 = tokens.component.button,
1058
- semantic$i = tokens.semantic;
1063
+ semantic$k = tokens.semantic;
1059
1064
  // Height comes from size.control as a minimum and the content is centred, so there is no
1060
1065
  // vertical padding (decision 0034). Horizontal padding comes from the semantic spacing scale:
1061
1066
  // no component spacing tokens (decision 0022)
1062
- var inset = semantic$i.space.inset;
1063
- var control$1 = semantic$i.size.control;
1067
+ var inset = semantic$k.space.inset;
1068
+ var control$1 = semantic$k.size.control;
1064
1069
  // Base styles shared between button and link
1065
- var baseButtonStyles = "\n box-sizing: border-box;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: ".concat(tokens.semantic.space[100], ";\n height: max-content;\n cursor: pointer;\n border: none;\n text-decoration: none;\n transition: ").concat(semantic$i.motion.transition.feedback, ";\n white-space: nowrap;\n user-select: none;\n \n &:focus {\n outline: ").concat(button$1.focus.outline, ";\n outline-offset: ").concat(semantic$i.border.focusOffset, ";\n }\n\n &:disabled {\n cursor: not-allowed;\n }\n\n ").concat(forcedColorsEdge, "\n");
1070
+ var baseButtonStyles = "\n box-sizing: border-box;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: ".concat(tokens.semantic.space[100], ";\n height: max-content;\n cursor: pointer;\n border: none;\n text-decoration: none;\n transition: ").concat(semantic$k.motion.transition.feedback, ";\n white-space: nowrap;\n user-select: none;\n \n &:focus {\n outline: ").concat(button$1.focus.outline, ";\n outline-offset: ").concat(semantic$k.border.focusOffset, ";\n }\n\n &:disabled {\n cursor: not-allowed;\n }\n\n ").concat(forcedColorsEdge, "\n");
1066
1071
  // Dynamic variant styles using component tokens
1067
1072
  var getVariantStyles$1 = function getVariantStyles(_a) {
1068
1073
  var $variant = _a.$variant;
@@ -1125,7 +1130,7 @@ var getSizeStyles = function getSizeStyles(_a) {
1125
1130
  var $size = _a.$size;
1126
1131
  switch ($size) {
1127
1132
  case 'small':
1128
- return "\n font: ".concat(button$1.sizes.small.font, ";\n min-height: ").concat(control$1.sm, ";\n padding: 0 ").concat(inset.md, ";\n ");
1133
+ return "\n font: ".concat(button$1.sizes.small.font, ";\n font-weight: ").concat(button$1.sizes.small.fontWeight, ";\n min-height: ").concat(control$1.sm, ";\n padding: 0 ").concat(inset.md, ";\n ");
1129
1134
  case 'medium':
1130
1135
  return "\n font: ".concat(button$1.sizes.medium.font, ";\n min-height: ").concat(control$1.md, ";\n padding: 0 ").concat(inset.lg, ";\n ");
1131
1136
  case 'large':
@@ -1139,14 +1144,14 @@ var StyledButton = /*#__PURE__*/styled__default.default.button.withConfig({
1139
1144
  },
1140
1145
  displayName: "Button__StyledButton",
1141
1146
  componentId: "sc-1eiuum9-0"
1142
- })(templateObject_1$G || (templateObject_1$G = __makeTemplateObject(["\n ", "\n border-radius: ", ";\n \n ", "\n ", "\n"], ["\n ", "\n border-radius: ", ";\n \n ", "\n ", "\n"])), baseButtonStyles, button$1.primary.borderRadius, getVariantStyles$1, getSizeStyles);
1147
+ })(templateObject_1$J || (templateObject_1$J = __makeTemplateObject(["\n ", "\n border-radius: ", ";\n \n ", "\n ", "\n"], ["\n ", "\n border-radius: ", ";\n \n ", "\n ", "\n"])), baseButtonStyles, button$1.primary.borderRadius, getVariantStyles$1, getSizeStyles);
1143
1148
  var StyledLink = /*#__PURE__*/styled__default.default.a.withConfig({
1144
1149
  shouldForwardProp: function shouldForwardProp(prop) {
1145
1150
  return !prop.startsWith('$');
1146
1151
  },
1147
1152
  displayName: "Button__StyledLink",
1148
1153
  componentId: "sc-1eiuum9-1"
1149
- })(templateObject_2$u || (templateObject_2$u = __makeTemplateObject(["\n ", "\n border-radius: ", ";\n \n ", "\n ", "\n"], ["\n ", "\n border-radius: ", ";\n \n ", "\n ", "\n"
1154
+ })(templateObject_2$v || (templateObject_2$v = __makeTemplateObject(["\n ", "\n border-radius: ", ";\n \n ", "\n ", "\n"], ["\n ", "\n border-radius: ", ";\n \n ", "\n ", "\n"
1150
1155
  // Helper function to get icon size based on button size
1151
1156
  ])), baseButtonStyles, button$1.primary.borderRadius, getVariantStyles$1, getSizeStyles);
1152
1157
  // Helper function to get icon size based on button size
@@ -1249,24 +1254,35 @@ var Button = function Button(_a) {
1249
1254
  children: renderButtonContent(children, iconName, size)
1250
1255
  }));
1251
1256
  };
1252
- var templateObject_1$G, templateObject_2$u;
1257
+ var templateObject_1$J, templateObject_2$v;
1253
1258
 
1254
- var semantic$h = tokens.semantic;
1255
- var color$7 = semantic$h.color;
1259
+ var semantic$j = tokens.semantic;
1260
+ var color$9 = semantic$j.color;
1256
1261
  var label$2 = tokens.component.badge.label;
1257
- var category = color$7.category;
1258
- var radius$3 = semantic$h.radius;
1259
- var space$d = semantic$h.space;
1260
- var labelHeight$1 = semantic$h.size.label;
1261
- // Text on white or the -subtle fill (outlined and minimal), at least 4.5:1 (#115)
1262
+ var category = color$9.category;
1263
+ var radius$3 = semantic$j.radius;
1264
+ var space$d = semantic$j.space;
1265
+ var labelHeight$1 = semantic$j.size.label;
1266
+ var displayColor = {
1267
+ olive: 'olive',
1268
+ periwinkle: 'periwinkle',
1269
+ rose: 'rose',
1270
+ magenta: 'magenta',
1271
+ gray: 'gray',
1272
+ blue: 'periwinkle',
1273
+ purple: 'magenta',
1274
+ pink: 'rose',
1275
+ yellow: 'olive',
1276
+ green: 'olive',
1277
+ red: 'rose',
1278
+ orange: 'rose'
1279
+ };
1280
+ // Text on white or the -muted fill (outlined and minimal), at least 4.5:1 (#115)
1262
1281
  var categoryText = {
1263
- blue: category['blue-text'],
1264
- purple: category['purple-text'],
1265
- pink: category['pink-text'],
1266
- yellow: category['yellow-text'],
1267
- green: category['green-text'],
1268
- red: category['red-text'],
1269
- orange: category['orange-text'],
1282
+ olive: category['olive-text'],
1283
+ periwinkle: category['periwinkle-text'],
1284
+ rose: category['rose-text'],
1285
+ magenta: category['magenta-text'],
1270
1286
  gray: category['gray-text']
1271
1287
  };
1272
1288
  var StyledCategoryLabel = /*#__PURE__*/styled__default.default.span.withConfig({
@@ -1275,10 +1291,10 @@ var StyledCategoryLabel = /*#__PURE__*/styled__default.default.span.withConfig({
1275
1291
  },
1276
1292
  displayName: "CategoryLabel__StyledCategoryLabel",
1277
1293
  componentId: "sc-1jx7bjo-0"
1278
- })(templateObject_1$F || (templateObject_1$F = __makeTemplateObject(["\n box-sizing: border-box; /* the height includes padding and border, without relying on a global reset */\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border-radius: ", ";\n white-space: nowrap;\n user-select: none;\n border-style: solid;\n border-width: ", ";\n \n /* Size styles */\n height: ", ";\n padding: ", ";\n font: ", ";\n /* After the font shorthand, which would otherwise reset it */\n font-weight: ", ";\n gap: ", ";\n \n /* Variant + Color styles */\n background-color: ", ";\n \n /* Outlined and minimal text uses the AA text token, not the base colour (issue 115) */\n color: ", ";\n \n border-color: ", ";\n"], ["\n box-sizing: border-box; /* the height includes padding and border, without relying on a global reset */\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border-radius: ", ";\n white-space: nowrap;\n user-select: none;\n border-style: solid;\n border-width: ", ";\n \n /* Size styles */\n height: ", ";\n padding: ", ";\n font: ", ";\n /* After the font shorthand, which would otherwise reset it */\n font-weight: ", ";\n gap: ", ";\n \n /* Variant + Color styles */\n background-color: ", ";\n \n /* Outlined and minimal text uses the AA text token, not the base colour (issue 115) */\n color: ", ";\n \n border-color: ", ";\n"
1294
+ })(templateObject_1$I || (templateObject_1$I = __makeTemplateObject(["\n box-sizing: border-box; /* the height includes padding and border, without relying on a global reset */\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border-radius: ", ";\n white-space: nowrap;\n user-select: none;\n border-style: solid;\n border-width: ", ";\n \n /* Size styles */\n height: ", ";\n padding: ", ";\n font: ", ";\n /* After the font shorthand, which would otherwise reset it */\n font-weight: ", ";\n gap: ", ";\n \n /* Variant + Color styles */\n background-color: ", ";\n \n /* Outlined and minimal text uses the AA text token, not the base colour (issue 115) */\n color: ", ";\n \n border-color: ", ";\n"], ["\n box-sizing: border-box; /* the height includes padding and border, without relying on a global reset */\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border-radius: ", ";\n white-space: nowrap;\n user-select: none;\n border-style: solid;\n border-width: ", ";\n \n /* Size styles */\n height: ", ";\n padding: ", ";\n font: ", ";\n /* After the font shorthand, which would otherwise reset it */\n font-weight: ", ";\n gap: ", ";\n \n /* Variant + Color styles */\n background-color: ", ";\n \n /* Outlined and minimal text uses the AA text token, not the base colour (issue 115) */\n color: ", ";\n \n border-color: ", ";\n"
1279
1295
  // The visible content, hidden from assistive technology when an aria-label replaces it.
1280
1296
  // display: contents keeps the root's flex layout and gap.
1281
- ])), radius$3.full, semantic$h.border.width.thin, function (_a) {
1297
+ ])), radius$3.full, semantic$j.border.width.thin, function (_a) {
1282
1298
  var $size = _a.$size;
1283
1299
  return labelHeight$1[$size];
1284
1300
  }, function (_a) {
@@ -1302,7 +1318,7 @@ var StyledCategoryLabel = /*#__PURE__*/styled__default.default.span.withConfig({
1302
1318
  var $color = _a.$color,
1303
1319
  $variant = _a.$variant;
1304
1320
  if ($variant === 'filled') {
1305
- return color$7.text.inverse;
1321
+ return color$9.text.inverse;
1306
1322
  }
1307
1323
  return categoryText[$color];
1308
1324
  }, function (_a) {
@@ -1318,7 +1334,7 @@ var StyledCategoryLabel = /*#__PURE__*/styled__default.default.span.withConfig({
1318
1334
  var VisibleContent$1 = /*#__PURE__*/styled__default.default.span.withConfig({
1319
1335
  displayName: "CategoryLabel__VisibleContent",
1320
1336
  componentId: "sc-1jx7bjo-1"
1321
- })(templateObject_2$t || (templateObject_2$t = __makeTemplateObject(["\n display: contents;\n"], ["\n display: contents;\n"])));
1337
+ })(templateObject_2$u || (templateObject_2$u = __makeTemplateObject(["\n display: contents;\n"], ["\n display: contents;\n"])));
1322
1338
  var HiddenLabel = /*#__PURE__*/styled__default.default.span.withConfig({
1323
1339
  displayName: "CategoryLabel__HiddenLabel",
1324
1340
  componentId: "sc-1jx7bjo-2"
@@ -1326,16 +1342,17 @@ var HiddenLabel = /*#__PURE__*/styled__default.default.span.withConfig({
1326
1342
  /**
1327
1343
  * CategoryLabel colour-codes an item's category, such as a transaction's (decision 0018).
1328
1344
  *
1329
- * A static, chip-like label with 8 category colours, 3 visual variants and an optional icon.
1330
- * Category colours carry no status meaning; for status use StatusLabel.
1345
+ * A static, chip-like label with 4 display colours plus grey, 3 visual variants and an optional
1346
+ * icon. Category colours carry no meaning (decision 0043); for status use StatusLabel. Beyond five
1347
+ * categories, the icon and text tell them apart.
1331
1348
  *
1332
1349
  * @example
1333
1350
  * ```tsx
1334
- * <CategoryLabel color="orange" icon="creditCard">
1351
+ * <CategoryLabel color="rose" icon="creditCard">
1335
1352
  * Shopping
1336
1353
  * </CategoryLabel>
1337
1354
  *
1338
- * <CategoryLabel color="blue" variant="outlined" size="medium">
1355
+ * <CategoryLabel color="periwinkle" variant="outlined" size="medium">
1339
1356
  * Travel
1340
1357
  * </CategoryLabel>
1341
1358
  * ```
@@ -1343,16 +1360,17 @@ var HiddenLabel = /*#__PURE__*/styled__default.default.span.withConfig({
1343
1360
  /**
1344
1361
  * CategoryLabel colour-codes an item's category, such as a transaction's (decision 0018).
1345
1362
  *
1346
- * A static, chip-like label with 8 category colours, 3 visual variants and an optional icon.
1347
- * Category colours carry no status meaning; for status use StatusLabel.
1363
+ * A static, chip-like label with 4 display colours plus grey, 3 visual variants and an optional
1364
+ * icon. Category colours carry no meaning (decision 0043); for status use StatusLabel. Beyond five
1365
+ * categories, the icon and text tell them apart.
1348
1366
  *
1349
1367
  * @example
1350
1368
  * ```tsx
1351
- * <CategoryLabel color="orange" icon="creditCard">
1369
+ * <CategoryLabel color="rose" icon="creditCard">
1352
1370
  * Shopping
1353
1371
  * </CategoryLabel>
1354
1372
  *
1355
- * <CategoryLabel color="blue" variant="outlined" size="medium">
1373
+ * <CategoryLabel color="periwinkle" variant="outlined" size="medium">
1356
1374
  * Travel
1357
1375
  * </CategoryLabel>
1358
1376
  * ```
@@ -1360,7 +1378,7 @@ var HiddenLabel = /*#__PURE__*/styled__default.default.span.withConfig({
1360
1378
  var CategoryLabel = function CategoryLabel(_a) {
1361
1379
  var children = _a.children,
1362
1380
  _b = _a.color,
1363
- color = _b === void 0 ? 'blue' : _b,
1381
+ color = _b === void 0 ? 'periwinkle' : _b,
1364
1382
  _c = _a.variant,
1365
1383
  variant = _c === void 0 ? 'filled' : _c,
1366
1384
  _d = _a.size,
@@ -1372,7 +1390,7 @@ var CategoryLabel = function CategoryLabel(_a) {
1372
1390
  // A blank aria-label is no label at all, so it falls back like a missing one
1373
1391
  var accessibleLabel = (ariaLabel === null || ariaLabel === void 0 ? void 0 : ariaLabel.trim()) ? ariaLabel : undefined;
1374
1392
  return jsxRuntime.jsxs(StyledCategoryLabel, {
1375
- "$color": color,
1393
+ "$color": displayColor[color],
1376
1394
  "$variant": variant,
1377
1395
  "$size": size,
1378
1396
  "data-testid": dataTestId,
@@ -1389,7 +1407,7 @@ var CategoryLabel = function CategoryLabel(_a) {
1389
1407
  });
1390
1408
  };
1391
1409
  CategoryLabel.displayName = 'CategoryLabel';
1392
- var templateObject_1$F, templateObject_2$t, templateObject_3$s;
1410
+ var templateObject_1$I, templateObject_2$u, templateObject_3$s;
1393
1411
 
1394
1412
  // CategoryBadge sizes on the decision 0018 scale
1395
1413
  var toLabelSize = {
@@ -1413,8 +1431,8 @@ var CategoryBadge = function CategoryBadge(_a) {
1413
1431
  };
1414
1432
  CategoryBadge.displayName = 'CategoryBadge';
1415
1433
 
1416
- var chip$1 = tokens.component.chip,
1417
- semantic$g = tokens.semantic;
1434
+ var chip$2 = tokens.component.chip,
1435
+ semantic$i = tokens.semantic;
1418
1436
  // Helper function to get variant styles matching Button's approach
1419
1437
  var getVariantStyles = function getVariantStyles(_a) {
1420
1438
  var $variant = _a.$variant,
@@ -1427,34 +1445,34 @@ var getVariantStyles = function getVariantStyles(_a) {
1427
1445
  // A selected disabled chip looks like any disabled chip; the checkmark keeps the
1428
1446
  // selected state visible (#110)
1429
1447
  if ($disabled) {
1430
- var disabled = chip$1.variants.subtle.disabled;
1448
+ var disabled = chip$2.variants.subtle.disabled;
1431
1449
  return "\n background-color: ".concat(disabled.backgroundColor, ";\n color: ").concat(disabled.textColor, ";\n ");
1432
1450
  }
1433
1451
  var _b = tokens.semantic.color,
1434
1452
  fill = _b.fill,
1435
1453
  text = _b.text;
1436
1454
  var interactiveStates = $clickable;
1437
- return "\n background-color: ".concat(fill['accent-muted'], ";\n color: ").concat(text.accent, ";\n \n &:hover {\n background-color: ").concat(interactiveStates ? fill['accent-muted-hover'] : fill['accent-muted'], ";\n color: ").concat(interactiveStates ? text['accent-hover'] : text.accent, ";\n }\n \n &:active {\n background-color: ").concat(interactiveStates ? fill['accent-muted-pressed'] : fill['accent-muted'], ";\n color: ").concat(interactiveStates ? text['accent-pressed'] : text.accent, ";\n }\n\n /* Forced colours drop the fill, so a selected chip takes the system selection colours\n (decision 0038); its checkmark follows the text colour */\n ").concat(forcedColors, " {\n forced-color-adjust: none;\n background-color: Highlight;\n border-color: Highlight;\n color: HighlightText;\n }\n ");
1455
+ return "\n background-color: ".concat(fill['accent-muted'], ";\n color: ").concat(text.accent, ";\n \n &:hover {\n background-color: ").concat(interactiveStates ? fill['accent-muted-hover'] : fill['accent-muted'], ";\n color: ").concat(interactiveStates ? text.accent : text.accent, ";\n }\n \n &:active {\n background-color: ").concat(interactiveStates ? fill['accent-muted-pressed'] : fill['accent-muted'], ";\n color: ").concat(interactiveStates ? text.accent : text.accent, ";\n }\n\n /* Forced colours drop the fill, so a selected chip takes the system selection colours\n (decision 0038); its checkmark follows the text colour */\n ").concat(forcedColors, " {\n forced-color-adjust: none;\n background-color: Highlight;\n border-color: Highlight;\n color: HighlightText;\n }\n ");
1438
1456
  }
1439
1457
  switch ($variant) {
1440
1458
  case 'emphasis':
1441
- return "\n background-color: ".concat(chip$1.variants.emphasis.backgroundColor, ";\n color: ").concat(chip$1.variants.emphasis.textColor, ";\n \n &:hover {\n background-color: ").concat($disabled ? chip$1.variants.emphasis.disabled.backgroundColor : $clickable ? chip$1.variants.emphasis.hover.backgroundColor : chip$1.variants.emphasis.backgroundColor, ";\n }\n \n &:active {\n background-color: ").concat($disabled ? chip$1.variants.emphasis.disabled.backgroundColor : $clickable ? chip$1.variants.emphasis.active.backgroundColor : chip$1.variants.emphasis.backgroundColor, ";\n }\n \n ").concat($disabled ? "\n background-color: ".concat(chip$1.variants.emphasis.disabled.backgroundColor, ";\n color: ").concat(chip$1.variants.emphasis.disabled.textColor, ";\n ") : '', "\n ");
1459
+ return "\n background-color: ".concat(chip$2.variants.emphasis.backgroundColor, ";\n color: ").concat(chip$2.variants.emphasis.textColor, ";\n \n &:hover {\n background-color: ").concat($disabled ? chip$2.variants.emphasis.disabled.backgroundColor : $clickable ? chip$2.variants.emphasis.hover.backgroundColor : chip$2.variants.emphasis.backgroundColor, ";\n }\n \n &:active {\n background-color: ").concat($disabled ? chip$2.variants.emphasis.disabled.backgroundColor : $clickable ? chip$2.variants.emphasis.active.backgroundColor : chip$2.variants.emphasis.backgroundColor, ";\n }\n \n ").concat($disabled ? "\n background-color: ".concat(chip$2.variants.emphasis.disabled.backgroundColor, ";\n color: ").concat(chip$2.variants.emphasis.disabled.textColor, ";\n ") : '', "\n ");
1442
1460
  case 'subtle':
1443
- return "\n background-color: ".concat(chip$1.variants.subtle.backgroundColor, ";\n color: ").concat(chip$1.variants.subtle.textColor, ";\n \n &:hover {\n background-color: ").concat($disabled ? chip$1.variants.subtle.disabled.backgroundColor : $clickable ? chip$1.variants.subtle.hover.backgroundColor : chip$1.variants.subtle.backgroundColor, ";\n }\n \n &:active {\n background-color: ").concat($disabled ? chip$1.variants.subtle.disabled.backgroundColor : $clickable ? chip$1.variants.subtle.active.backgroundColor : chip$1.variants.subtle.backgroundColor, ";\n }\n \n ").concat($disabled ? "\n background-color: ".concat(chip$1.variants.subtle.disabled.backgroundColor, ";\n color: ").concat(chip$1.variants.subtle.disabled.textColor, ";\n ") : '', "\n ");
1461
+ return "\n background-color: ".concat(chip$2.variants.subtle.backgroundColor, ";\n color: ").concat(chip$2.variants.subtle.textColor, ";\n \n &:hover {\n background-color: ").concat($disabled ? chip$2.variants.subtle.disabled.backgroundColor : $clickable ? chip$2.variants.subtle.hover.backgroundColor : chip$2.variants.subtle.backgroundColor, ";\n }\n \n &:active {\n background-color: ").concat($disabled ? chip$2.variants.subtle.disabled.backgroundColor : $clickable ? chip$2.variants.subtle.active.backgroundColor : chip$2.variants.subtle.backgroundColor, ";\n }\n \n ").concat($disabled ? "\n background-color: ".concat(chip$2.variants.subtle.disabled.backgroundColor, ";\n color: ").concat(chip$2.variants.subtle.disabled.textColor, ";\n ") : '', "\n ");
1444
1462
  case 'interactive':
1445
- return "\n background-color: ".concat(chip$1.variants.interactive.backgroundColor, ";\n color: ").concat(chip$1.variants.interactive.textColor, ";\n \n &:hover {\n background-color: ").concat($disabled ? chip$1.variants.interactive.disabled.backgroundColor : $clickable ? chip$1.variants.interactive.hover.backgroundColor : chip$1.variants.interactive.backgroundColor, ";\n }\n \n &:active {\n background-color: ").concat($disabled ? chip$1.variants.interactive.disabled.backgroundColor : $clickable ? chip$1.variants.interactive.active.backgroundColor : chip$1.variants.interactive.backgroundColor, ";\n }\n \n ").concat($disabled ? "\n background-color: ".concat(chip$1.variants.interactive.disabled.backgroundColor, ";\n color: ").concat(chip$1.variants.interactive.disabled.textColor, ";\n ") : '', "\n ");
1463
+ return "\n background-color: ".concat(chip$2.variants.interactive.backgroundColor, ";\n color: ").concat(chip$2.variants.interactive.textColor, ";\n \n &:hover {\n background-color: ").concat($disabled ? chip$2.variants.interactive.disabled.backgroundColor : $clickable ? chip$2.variants.interactive.hover.backgroundColor : chip$2.variants.interactive.backgroundColor, ";\n }\n \n &:active {\n background-color: ").concat($disabled ? chip$2.variants.interactive.disabled.backgroundColor : $clickable ? chip$2.variants.interactive.active.backgroundColor : chip$2.variants.interactive.backgroundColor, ";\n }\n \n ").concat($disabled ? "\n background-color: ".concat(chip$2.variants.interactive.disabled.backgroundColor, ";\n color: ").concat(chip$2.variants.interactive.disabled.textColor, ";\n ") : '', "\n ");
1446
1464
  case 'default':
1447
1465
  default:
1448
- return "\n background-color: ".concat(chip$1["default"].backgroundColor, ";\n color: ").concat(chip$1["default"].textColor, ";\n \n &:hover {\n background-color: ").concat($disabled ? chip$1.disabled.backgroundColor : $clickable ? chip$1.hover.backgroundColor : chip$1["default"].backgroundColor, ";\n }\n \n &:active {\n background-color: ").concat($disabled ? chip$1.disabled.backgroundColor : $clickable ? chip$1.active.backgroundColor : chip$1["default"].backgroundColor, ";\n }\n \n ").concat($disabled ? "\n background-color: ".concat(chip$1.disabled.backgroundColor, ";\n color: ").concat(chip$1.disabled.textColor, ";\n ") : '', "\n ");
1466
+ return "\n background-color: ".concat(chip$2["default"].backgroundColor, ";\n color: ").concat(chip$2["default"].textColor, ";\n \n &:hover {\n background-color: ").concat($disabled ? chip$2.disabled.backgroundColor : $clickable ? chip$2.hover.backgroundColor : chip$2["default"].backgroundColor, ";\n }\n \n &:active {\n background-color: ").concat($disabled ? chip$2.disabled.backgroundColor : $clickable ? chip$2.active.backgroundColor : chip$2["default"].backgroundColor, ";\n }\n \n ").concat($disabled ? "\n background-color: ".concat(chip$2.disabled.backgroundColor, ";\n color: ").concat(chip$2.disabled.textColor, ";\n ") : '', "\n ");
1449
1467
  }
1450
1468
  };
1451
1469
  // Chips have one size: 24px from the label scale as a minimum, with the content centred
1452
1470
  // and no vertical padding (decisions 0034 and 0035). Horizontal padding comes from the
1453
1471
  // semantic spacing scale (decision 0022).
1454
- var sizeStyles = "\n font: ".concat(chip$1.sizes.medium.font, ";\n min-height: ").concat(semantic$g.size.label.medium, ";\n padding: 0 ").concat(semantic$g.space.inset.sm, ";\n");
1472
+ var sizeStyles = "\n font: ".concat(chip$2.sizes.medium.font, ";\n min-height: ").concat(semantic$i.size.label.medium, ";\n padding: 0 ").concat(semantic$i.space.inset.sm, ";\n");
1455
1473
 
1456
- var chip = tokens.component.chip,
1457
- semantic$f = tokens.semantic;
1474
+ var chip$1 = tokens.component.chip,
1475
+ semantic$h = tokens.semantic;
1458
1476
  // Base styled component using direct prop interpolation like Button
1459
1477
  var StyledChip = /*#__PURE__*/styled__default.default.span.withConfig({
1460
1478
  shouldForwardProp: function shouldForwardProp(prop) {
@@ -1462,18 +1480,18 @@ var StyledChip = /*#__PURE__*/styled__default.default.span.withConfig({
1462
1480
  },
1463
1481
  displayName: "ChipBase__StyledChip",
1464
1482
  componentId: "sc-moa6zc-0"
1465
- })(templateObject_1$E || (templateObject_1$E = __makeTemplateObject(["\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: fit-content;\n height: max-content;\n border-radius: ", ";\n box-sizing: border-box;\n user-select: none;\n white-space: nowrap;\n transition: ", ";\n cursor: ", ";\n \n /* Forced colours: an edge, and GrayText when disabled, since a span gets no system disabled\n colour (decision 0038). Before the variant styles, so a selected chip's Highlight border wins. */\n ", "\n ", "\n\n ", "\n ", "\n \n &:focus-visible {\n outline: ", ";\n outline-offset: ", ";\n }\n\n"], ["\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: fit-content;\n height: max-content;\n border-radius: ", ";\n box-sizing: border-box;\n user-select: none;\n white-space: nowrap;\n transition: ", ";\n cursor: ", ";\n \n /* Forced colours: an edge, and GrayText when disabled, since a span gets no system disabled\n colour (decision 0038). Before the variant styles, so a selected chip's Highlight border wins. */\n ", "\n ", "\n\n ", "\n ", "\n \n &:focus-visible {\n outline: ", ";\n outline-offset: ", ";\n }\n\n"
1483
+ })(templateObject_1$H || (templateObject_1$H = __makeTemplateObject(["\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: fit-content;\n height: max-content;\n border-radius: ", ";\n box-sizing: border-box;\n user-select: none;\n white-space: nowrap;\n transition: ", ";\n cursor: ", ";\n \n /* Forced colours: an edge, and GrayText when disabled, since a span gets no system disabled\n colour (decision 0038). Before the variant styles, so a selected chip's Highlight border wins. */\n ", "\n ", "\n\n ", "\n ", "\n \n &:focus-visible {\n outline: ", ";\n outline-offset: ", ";\n }\n\n"], ["\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: fit-content;\n height: max-content;\n border-radius: ", ";\n box-sizing: border-box;\n user-select: none;\n white-space: nowrap;\n transition: ", ";\n cursor: ", ";\n \n /* Forced colours: an edge, and GrayText when disabled, since a span gets no system disabled\n colour (decision 0038). Before the variant styles, so a selected chip's Highlight border wins. */\n ", "\n ", "\n\n ", "\n ", "\n \n &:focus-visible {\n outline: ", ";\n outline-offset: ", ";\n }\n\n"
1466
1484
  // Icon container for selected indicator or leading icons
1467
- ])), chip["default"].borderRadius, semantic$f.motion.transition.feedback, function (props) {
1485
+ ])), chip$1["default"].borderRadius, semantic$h.motion.transition.feedback, function (props) {
1468
1486
  return props.$disabled ? 'not-allowed' : props.$clickable ? 'pointer' : 'default';
1469
1487
  }, forcedColorsEdge, function (props) {
1470
1488
  return props.$disabled ? "".concat(forcedColors, " { color: GrayText; }") : '';
1471
- }, getVariantStyles, sizeStyles, chip.focus.outline, semantic$f.border.focusOffset);
1489
+ }, getVariantStyles, sizeStyles, chip$1.focus.outline, semantic$h.border.focusOffset);
1472
1490
  // Icon container for selected indicator or leading icons
1473
1491
  var IconContainer = /*#__PURE__*/styled__default.default.span.withConfig({
1474
1492
  displayName: "ChipBase__IconContainer",
1475
1493
  componentId: "sc-moa6zc-1"
1476
- })(templateObject_2$s || (templateObject_2$s = __makeTemplateObject(["\n display: inline-flex;\n align-items: center;\n margin-right: ", ";\n"], ["\n display: inline-flex;\n align-items: center;\n margin-right: ", ";\n"
1494
+ })(templateObject_2$t || (templateObject_2$t = __makeTemplateObject(["\n display: inline-flex;\n align-items: center;\n margin-right: ", ";\n"], ["\n display: inline-flex;\n align-items: center;\n margin-right: ", ";\n"
1477
1495
  // Close button for dismissible chips
1478
1496
  ])), tokens.semantic.space[100]);
1479
1497
  // Close button for dismissible chips
@@ -1483,10 +1501,10 @@ var CloseButton = /*#__PURE__*/styled__default.default.button.withConfig({
1483
1501
  },
1484
1502
  displayName: "ChipBase__CloseButton",
1485
1503
  componentId: "sc-moa6zc-2"
1486
- })(templateObject_3$r || (templateObject_3$r = __makeTemplateObject(["\n display: inline-flex;\n align-items: center;\n justify-content: center;\n margin-left: ", ";\n background: transparent;\n border: none;\n position: relative;\n width: ", ";\n height: ", ";\n padding: ", ";\n\n /* The pointer target is at least 24 \xD7 24px (WCAG 2.5.8, decision 0039): an invisible hit area\n as tall as the chip, centred on the 20px button. It stays inside the chip and its padding, so\n it can't overlap another target. */\n &::before {\n content: '';\n position: absolute;\n top: 50%;\n left: 50%;\n width: ", ";\n height: ", ";\n transform: translate(-50%, -50%);\n }\n border-radius: ", ";\n cursor: ", ";\n color: inherit;\n transition: ", ";\n \n &:hover:not(:disabled) {\n background-color: ", ";\n }\n \n &:active:not(:disabled) {\n background-color: ", ";\n }\n \n &:disabled {\n color: ", ";\n }\n \n &:focus-visible {\n outline: ", ";\n outline-offset: ", ";\n border-radius: ", ";\n }\n"], ["\n display: inline-flex;\n align-items: center;\n justify-content: center;\n margin-left: ", ";\n background: transparent;\n border: none;\n position: relative;\n width: ", ";\n height: ", ";\n padding: ", ";\n\n /* The pointer target is at least 24 \xD7 24px (WCAG 2.5.8, decision 0039): an invisible hit area\n as tall as the chip, centred on the 20px button. It stays inside the chip and its padding, so\n it can't overlap another target. */\n &::before {\n content: '';\n position: absolute;\n top: 50%;\n left: 50%;\n width: ", ";\n height: ", ";\n transform: translate(-50%, -50%);\n }\n border-radius: ", ";\n cursor: ", ";\n color: inherit;\n transition: ", ";\n \n &:hover:not(:disabled) {\n background-color: ", ";\n }\n \n &:active:not(:disabled) {\n background-color: ", ";\n }\n \n &:disabled {\n color: ", ";\n }\n \n &:focus-visible {\n outline: ", ";\n outline-offset: ", ";\n border-radius: ", ";\n }\n"])), tokens.semantic.space[200], chip.closeButton.size, chip.closeButton.size, tokens.semantic.space[0], semantic$f.size.label.medium, semantic$f.size.label.medium, tokens.semantic.radius.xs, function (props) {
1504
+ })(templateObject_3$r || (templateObject_3$r = __makeTemplateObject(["\n display: inline-flex;\n align-items: center;\n justify-content: center;\n margin-left: ", ";\n background: transparent;\n border: none;\n position: relative;\n width: ", ";\n height: ", ";\n padding: ", ";\n\n /* The pointer target is at least 24 \xD7 24px (WCAG 2.5.8, decision 0039): an invisible hit area\n as tall as the chip, centred on the 20px button. It stays inside the chip and its padding, so\n it can't overlap another target. */\n &::before {\n content: '';\n position: absolute;\n top: 50%;\n left: 50%;\n width: ", ";\n height: ", ";\n transform: translate(-50%, -50%);\n }\n border-radius: ", ";\n cursor: ", ";\n color: inherit;\n transition: ", ";\n \n &:hover:not(:disabled) {\n background-color: ", ";\n }\n \n &:active:not(:disabled) {\n background-color: ", ";\n }\n \n &:disabled {\n color: ", ";\n }\n \n &:focus-visible {\n outline: ", ";\n outline-offset: ", ";\n border-radius: ", ";\n }\n"], ["\n display: inline-flex;\n align-items: center;\n justify-content: center;\n margin-left: ", ";\n background: transparent;\n border: none;\n position: relative;\n width: ", ";\n height: ", ";\n padding: ", ";\n\n /* The pointer target is at least 24 \xD7 24px (WCAG 2.5.8, decision 0039): an invisible hit area\n as tall as the chip, centred on the 20px button. It stays inside the chip and its padding, so\n it can't overlap another target. */\n &::before {\n content: '';\n position: absolute;\n top: 50%;\n left: 50%;\n width: ", ";\n height: ", ";\n transform: translate(-50%, -50%);\n }\n border-radius: ", ";\n cursor: ", ";\n color: inherit;\n transition: ", ";\n \n &:hover:not(:disabled) {\n background-color: ", ";\n }\n \n &:active:not(:disabled) {\n background-color: ", ";\n }\n \n &:disabled {\n color: ", ";\n }\n \n &:focus-visible {\n outline: ", ";\n outline-offset: ", ";\n border-radius: ", ";\n }\n"])), tokens.semantic.space[200], chip$1.closeButton.size, chip$1.closeButton.size, tokens.semantic.space[0], semantic$h.size.label.medium, semantic$h.size.label.medium, tokens.semantic.radius.xs, function (props) {
1487
1505
  return props.$disabled ? 'not-allowed' : 'pointer';
1488
- }, semantic$f.motion.transition.feedback, tokens.semantic.color.fill['none-hover'], tokens.semantic.color.fill['none-pressed'], tokens.semantic.color.text.disabled, chip.focus.outline, semantic$f.border.focusOffset, chip["default"].borderRadius);
1489
- var templateObject_1$E, templateObject_2$s, templateObject_3$r;
1506
+ }, semantic$h.motion.transition.feedback, tokens.semantic.color.fill['none-hover'], tokens.semantic.color.fill['none-pressed'], tokens.semantic.color.text.disabled, chip$1.focus.outline, semantic$h.border.focusOffset, chip$1["default"].borderRadius);
1507
+ var templateObject_1$H, templateObject_2$t, templateObject_3$r;
1490
1508
 
1491
1509
  /**
1492
1510
  * Chip - a static, non-interactive label for tags, categories and metadata.
@@ -1723,11 +1741,61 @@ var BooleanChip = function BooleanChip(_a) {
1723
1741
  }));
1724
1742
  };
1725
1743
 
1744
+ var chip = tokens.component.chip,
1745
+ semantic$g = tokens.semantic;
1746
+ var color$8 = semantic$g.color;
1747
+ // Outlined, with the naked fill ladder on hover and press (decisions 0030, 0046): the edge keeps it
1748
+ // visible on white, the page and AgentInput's docked band
1749
+ var StyledSuggestionChip = /*#__PURE__*/styled__default.default.button.withConfig({
1750
+ displayName: "SuggestionChip__StyledSuggestionChip",
1751
+ componentId: "sc-1k0njm-0"
1752
+ })(templateObject_1$G || (templateObject_1$G = __makeTemplateObject(["\n display: inline-flex;\n align-items: center;\n max-width: 100%;\n margin: 0;\n box-sizing: border-box;\n border: ", " solid ", ";\n border-radius: ", ";\n background-color: ", ";\n color: ", ";\n cursor: pointer;\n text-align: start;\n /* A long suggestion wraps inside the chip rather than being cut off (issue 279) */\n white-space: normal;\n overflow-wrap: anywhere;\n transition: ", ";\n ", "\n\n &:hover:not(:disabled) {\n background-color: ", ";\n }\n\n &:active:not(:disabled) {\n background-color: ", ";\n }\n\n &:focus-visible {\n outline: ", ";\n outline-offset: ", ";\n }\n\n &:disabled {\n border-color: ", ";\n color: ", ";\n cursor: not-allowed;\n }\n\n /* Forced colours: a native button gets ButtonBorder and GrayText; keep the edge (decision 0038) */\n ", " {\n border-color: ButtonBorder;\n\n &:disabled {\n border-color: GrayText;\n }\n }\n"], ["\n display: inline-flex;\n align-items: center;\n max-width: 100%;\n margin: 0;\n box-sizing: border-box;\n border: ", " solid ", ";\n border-radius: ", ";\n background-color: ", ";\n color: ", ";\n cursor: pointer;\n text-align: start;\n /* A long suggestion wraps inside the chip rather than being cut off (issue 279) */\n white-space: normal;\n overflow-wrap: anywhere;\n transition: ", ";\n ", "\n\n &:hover:not(:disabled) {\n background-color: ", ";\n }\n\n &:active:not(:disabled) {\n background-color: ", ";\n }\n\n &:focus-visible {\n outline: ", ";\n outline-offset: ", ";\n }\n\n &:disabled {\n border-color: ", ";\n color: ", ";\n cursor: not-allowed;\n }\n\n /* Forced colours: a native button gets ButtonBorder and GrayText; keep the edge (decision 0038) */\n ", " {\n border-color: ButtonBorder;\n\n &:disabled {\n border-color: GrayText;\n }\n }\n"
1753
+ /**
1754
+ * SuggestionChip - Offers text to put in the agent input
1755
+ *
1756
+ * The Suggestion chip type from decision 0046 (amending 0016): the one chip that acts on click.
1757
+ * Picking it fills the input so the user can edit before sending; it never sends or runs a command,
1758
+ * which is why it's a chip and not a Button. AgentInput renders these from its `suggestions` prop.
1759
+ *
1760
+ * Features:
1761
+ * - A native button: Enter and Space pick it, and its text is its accessible name
1762
+ * - Outlined, with the naked hover and pressed fills; no selected state
1763
+ * - One chip height (24px minimum, decision 0035); long text wraps instead of being cut off
1764
+ */])), semantic$g.border.width.thin, color$8.border.input, chip["default"].borderRadius, color$8.fill.none, color$8.text["default"], semantic$g.motion.transition.feedback, sizeStyles, color$8.fill['none-hover'], color$8.fill['none-pressed'], chip.focus.outline, semantic$g.border.focusOffset, color$8.border["default"], color$8.text.disabled, forcedColors);
1765
+ /**
1766
+ * SuggestionChip - Offers text to put in the agent input
1767
+ *
1768
+ * The Suggestion chip type from decision 0046 (amending 0016): the one chip that acts on click.
1769
+ * Picking it fills the input so the user can edit before sending; it never sends or runs a command,
1770
+ * which is why it's a chip and not a Button. AgentInput renders these from its `suggestions` prop.
1771
+ *
1772
+ * Features:
1773
+ * - A native button: Enter and Space pick it, and its text is its accessible name
1774
+ * - Outlined, with the naked hover and pressed fills; no selected state
1775
+ * - One chip height (24px minimum, decision 0035); long text wraps instead of being cut off
1776
+ */
1777
+ var SuggestionChip = function SuggestionChip(_a) {
1778
+ var children = _a.children,
1779
+ onClick = _a.onClick,
1780
+ _b = _a.disabled,
1781
+ disabled = _b === void 0 ? false : _b,
1782
+ dataTestId = _a["data-testid"];
1783
+ return jsxRuntime.jsx(StyledSuggestionChip, {
1784
+ type: "button",
1785
+ onClick: onClick,
1786
+ disabled: disabled,
1787
+ "data-testid": dataTestId,
1788
+ children: children
1789
+ });
1790
+ };
1791
+ SuggestionChip.displayName = 'SuggestionChip';
1792
+ var templateObject_1$G;
1793
+
1726
1794
  var space$c = tokens.semantic.space;
1727
1795
  var StyledContainer$2 = /*#__PURE__*/styled__default.default.div.withConfig({
1728
1796
  displayName: "Container__StyledContainer",
1729
1797
  componentId: "sc-17dbj6n-0"
1730
- })(templateObject_1$D || (templateObject_1$D = __makeTemplateObject(["\n width: 100%;\n margin-left: auto;\n margin-right: auto;\n padding-left: ", ";\n padding-right: ", ";\n \n ", " {\n max-width: ", ";\n }\n \n ", " {\n max-width: ", ";\n }\n \n ", " {\n max-width: ", ";\n }\n \n ", " {\n max-width: ", ";\n }\n \n ", " {\n max-width: ", ";\n }\n"], ["\n width: 100%;\n margin-left: auto;\n margin-right: auto;\n padding-left: ", ";\n padding-right: ", ";\n \n ", " {\n max-width: ", ";\n }\n \n ", " {\n max-width: ", ";\n }\n \n ", " {\n max-width: ", ";\n }\n \n ", " {\n max-width: ", ";\n }\n \n ", " {\n max-width: ", ";\n }\n"])), space$c[600], space$c[600], media$1.sm, breakpoints$1.sm, media$1.md, breakpoints$1.md, media$1.lg, breakpoints$1.lg, media$1.xl, breakpoints$1.xl, media$1['2xl'], breakpoints$1['2xl']);
1798
+ })(templateObject_1$F || (templateObject_1$F = __makeTemplateObject(["\n width: 100%;\n margin-left: auto;\n margin-right: auto;\n padding-left: ", ";\n padding-right: ", ";\n \n ", " {\n max-width: ", ";\n }\n \n ", " {\n max-width: ", ";\n }\n \n ", " {\n max-width: ", ";\n }\n \n ", " {\n max-width: ", ";\n }\n \n ", " {\n max-width: ", ";\n }\n"], ["\n width: 100%;\n margin-left: auto;\n margin-right: auto;\n padding-left: ", ";\n padding-right: ", ";\n \n ", " {\n max-width: ", ";\n }\n \n ", " {\n max-width: ", ";\n }\n \n ", " {\n max-width: ", ";\n }\n \n ", " {\n max-width: ", ";\n }\n \n ", " {\n max-width: ", ";\n }\n"])), space$c[600], space$c[600], media$1.sm, breakpoints$1.sm, media$1.md, breakpoints$1.md, media$1.lg, breakpoints$1.lg, media$1.xl, breakpoints$1.xl, media$1['2xl'], breakpoints$1['2xl']);
1731
1799
  var Container$1 = function Container(_a) {
1732
1800
  var children = _a.children,
1733
1801
  props = __rest(_a, ["children"]);
@@ -1735,12 +1803,12 @@ var Container$1 = function Container(_a) {
1735
1803
  children: children
1736
1804
  }));
1737
1805
  };
1738
- var templateObject_1$D;
1806
+ var templateObject_1$F;
1739
1807
 
1740
1808
  var PictureWrapper = /*#__PURE__*/styled__default.default.div.withConfig({
1741
1809
  displayName: "Picture__PictureWrapper",
1742
1810
  componentId: "sc-11d9tei-0"
1743
- })(templateObject_1$C || (templateObject_1$C = __makeTemplateObject(["\n margin: 0 auto;\n \n ", " {\n margin-left: 0;\n margin-right: 0;\n }\n"], ["\n margin: 0 auto;\n \n ", " {\n margin-left: 0;\n margin-right: 0;\n }\n"
1811
+ })(templateObject_1$E || (templateObject_1$E = __makeTemplateObject(["\n margin: 0 auto;\n \n ", " {\n margin-left: 0;\n margin-right: 0;\n }\n"], ["\n margin: 0 auto;\n \n ", " {\n margin-left: 0;\n margin-right: 0;\n }\n"
1744
1812
  // A clickable image answers input on the image itself (decision 0029, #185): it fades on hover and
1745
1813
  // one step further while pressed, and draws the system focus ring around the image, following its
1746
1814
  // rounded corners. Fading isn't movement, so it stays under reduced motion.
@@ -1748,7 +1816,7 @@ var PictureWrapper = /*#__PURE__*/styled__default.default.div.withConfig({
1748
1816
  // A clickable image answers input on the image itself (decision 0029, #185): it fades on hover and
1749
1817
  // one step further while pressed, and draws the system focus ring around the image, following its
1750
1818
  // rounded corners. Fading isn't movement, so it stays under reduced motion.
1751
- var clickableImage = styled.css(templateObject_2$r || (templateObject_2$r = __makeTemplateObject(["\n display: block;\n cursor: pointer;\n\n img {\n transition: ", ";\n }\n\n &:hover img {\n opacity: ", ";\n }\n\n &:active img {\n opacity: ", ";\n }\n\n &:focus-visible {\n outline: none;\n }\n\n &:focus-visible img {\n outline: ", ";\n outline-offset: ", ";\n }\n"], ["\n display: block;\n cursor: pointer;\n\n img {\n transition: ", ";\n }\n\n &:hover img {\n opacity: ", ";\n }\n\n &:active img {\n opacity: ", ";\n }\n\n &:focus-visible {\n outline: none;\n }\n\n &:focus-visible img {\n outline: ", ";\n outline-offset: ", ";\n }\n"])), tokens.semantic.motion.transition.press, tokens.semantic.opacity.hover, tokens.semantic.opacity.pressed, tokens.semantic.border.focus, tokens.semantic.border.focusOffset);
1819
+ var clickableImage = styled.css(templateObject_2$s || (templateObject_2$s = __makeTemplateObject(["\n display: block;\n cursor: pointer;\n\n img {\n transition: ", ";\n }\n\n &:hover img {\n opacity: ", ";\n }\n\n &:active img {\n opacity: ", ";\n }\n\n &:focus-visible {\n outline: none;\n }\n\n &:focus-visible img {\n outline: ", ";\n outline-offset: ", ";\n }\n"], ["\n display: block;\n cursor: pointer;\n\n img {\n transition: ", ";\n }\n\n &:hover img {\n opacity: ", ";\n }\n\n &:active img {\n opacity: ", ";\n }\n\n &:focus-visible {\n outline: none;\n }\n\n &:focus-visible img {\n outline: ", ";\n outline-offset: ", ";\n }\n"])), tokens.semantic.motion.transition.press, tokens.semantic.opacity.hover, tokens.semantic.opacity.pressed, tokens.semantic.border.focus, tokens.semantic.border.focusOffset);
1752
1820
  var ImageLink = /*#__PURE__*/styled__default.default.a.withConfig({
1753
1821
  displayName: "Picture__ImageLink",
1754
1822
  componentId: "sc-11d9tei-1"
@@ -1790,18 +1858,18 @@ var Picture = function Picture(_a) {
1790
1858
  }) : image
1791
1859
  });
1792
1860
  };
1793
- var templateObject_1$C, templateObject_2$r, templateObject_3$q, templateObject_4$l, templateObject_5$h;
1861
+ var templateObject_1$E, templateObject_2$s, templateObject_3$q, templateObject_4$l, templateObject_5$h;
1794
1862
 
1795
1863
  var _a$8 = tokens.semantic,
1796
- typography$1 = _a$8.typography,
1797
- color$6 = _a$8.color;
1864
+ typography$2 = _a$8.typography,
1865
+ color$7 = _a$8.color;
1798
1866
  var TimeStyled = /*#__PURE__*/styled__default.default.time.withConfig({
1799
1867
  displayName: "DateFormatter__TimeStyled",
1800
1868
  componentId: "sc-5464cc-0"
1801
- })(templateObject_1$B || (templateObject_1$B = __makeTemplateObject(["\n font: ", ";\n color: ", ";\n"], ["\n font: ", ";\n color: ", ";\n"
1869
+ })(templateObject_1$D || (templateObject_1$D = __makeTemplateObject(["\n font: ", ";\n color: ", ";\n"], ["\n font: ", ";\n color: ", ";\n"
1802
1870
  /**
1803
1871
  * Formats a date with smart relative/absolute logic
1804
- */])), typography$1.label, color$6.text.muted);
1872
+ */])), typography$2.label, color$7.text.muted);
1805
1873
  /**
1806
1874
  * Formats a date with smart relative/absolute logic
1807
1875
  */
@@ -1844,21 +1912,21 @@ var DateFormatter = function DateFormatter(_a) {
1844
1912
  children: displayText
1845
1913
  });
1846
1914
  };
1847
- var templateObject_1$B;
1915
+ var templateObject_1$D;
1848
1916
 
1849
1917
  var _a$7 = tokens.semantic,
1850
1918
  motion$5 = _a$7.motion,
1851
1919
  border$3 = _a$7.border,
1852
1920
  space$b = _a$7.space,
1853
- size$2 = _a$7.size,
1921
+ size$3 = _a$7.size,
1854
1922
  _b$2 = tokens.component,
1855
1923
  iconButton = _b$2.iconButton,
1856
1924
  button = _b$2.button;
1857
1925
  // Height and width come from size.control as a minimum (decision 0034)
1858
1926
  var control = {
1859
- small: size$2.control.sm,
1860
- medium: size$2.control.md,
1861
- large: size$2.control.lg
1927
+ small: size$3.control.sm,
1928
+ medium: size$3.control.md,
1929
+ large: size$3.control.lg
1862
1930
  };
1863
1931
  // Padding comes from the semantic spacing scale: no component spacing tokens (decision 0022)
1864
1932
  var padding = {
@@ -1905,7 +1973,7 @@ var IconButtonStyled = /*#__PURE__*/styled__default.default.button.withConfig({
1905
1973
  },
1906
1974
  displayName: "IconButton__IconButtonStyled",
1907
1975
  componentId: "sc-k8b14t-0"
1908
- })(templateObject_1$A || (templateObject_1$A = __makeTemplateObject(["\n background-color: ", ";\n color: ", ";\n border: none;\n border-radius: ", ";\n transition: ", ";\n box-sizing: border-box;\n display: flex;\n justify-content: center;\n align-items: center;\n height: max-content;\n cursor: pointer;\n position: relative;\n\n min-width: ", ";\n min-height: ", ";\n padding: ", ";\n\n &:hover:not(:disabled) {\n background-color: ", ";\n }\n\n &:active:not(:disabled) {\n background-color: ", ";\n }\n\n &:focus {\n outline: ", ";\n outline-offset: ", ";\n }\n\n &:disabled {\n background-color: ", ";\n color: ", ";\n cursor: not-allowed;\n }\n\n ", "\n"], ["\n background-color: ", ";\n color: ", ";\n border: none;\n border-radius: ", ";\n transition: ", ";\n box-sizing: border-box;\n display: flex;\n justify-content: center;\n align-items: center;\n height: max-content;\n cursor: pointer;\n position: relative;\n\n min-width: ", ";\n min-height: ", ";\n padding: ", ";\n\n &:hover:not(:disabled) {\n background-color: ", ";\n }\n\n &:active:not(:disabled) {\n background-color: ", ";\n }\n\n &:focus {\n outline: ", ";\n outline-offset: ", ";\n }\n\n &:disabled {\n background-color: ", ";\n color: ", ";\n cursor: not-allowed;\n }\n\n ", "\n"])), function (_a) {
1976
+ })(templateObject_1$C || (templateObject_1$C = __makeTemplateObject(["\n background-color: ", ";\n color: ", ";\n border: none;\n border-radius: ", ";\n transition: ", ";\n box-sizing: border-box;\n display: flex;\n justify-content: center;\n align-items: center;\n height: max-content;\n cursor: pointer;\n position: relative;\n\n min-width: ", ";\n min-height: ", ";\n padding: ", ";\n\n &:hover:not(:disabled) {\n background-color: ", ";\n }\n\n &:active:not(:disabled) {\n background-color: ", ";\n }\n\n &:focus {\n outline: ", ";\n outline-offset: ", ";\n }\n\n &:disabled {\n background-color: ", ";\n color: ", ";\n cursor: not-allowed;\n }\n\n ", "\n"], ["\n background-color: ", ";\n color: ", ";\n border: none;\n border-radius: ", ";\n transition: ", ";\n box-sizing: border-box;\n display: flex;\n justify-content: center;\n align-items: center;\n height: max-content;\n cursor: pointer;\n position: relative;\n\n min-width: ", ";\n min-height: ", ";\n padding: ", ";\n\n &:hover:not(:disabled) {\n background-color: ", ";\n }\n\n &:active:not(:disabled) {\n background-color: ", ";\n }\n\n &:focus {\n outline: ", ";\n outline-offset: ", ";\n }\n\n &:disabled {\n background-color: ", ";\n color: ", ";\n cursor: not-allowed;\n }\n\n ", "\n"])), function (_a) {
1909
1977
  var $variant = _a.$variant;
1910
1978
  return colours($variant).bg;
1911
1979
  }, function (_a) {
@@ -1983,7 +2051,7 @@ var IconButton = function IconButton(_a) {
1983
2051
  })
1984
2052
  }));
1985
2053
  };
1986
- var templateObject_1$A;
2054
+ var templateObject_1$C;
1987
2055
 
1988
2056
  var StyledWrapper = /*#__PURE__*/styled__default.default.span.withConfig({
1989
2057
  shouldForwardProp: function shouldForwardProp(prop) {
@@ -1991,7 +2059,7 @@ var StyledWrapper = /*#__PURE__*/styled__default.default.span.withConfig({
1991
2059
  },
1992
2060
  displayName: "MoneyDisplay__StyledWrapper",
1993
2061
  componentId: "sc-1mddej3-0"
1994
- })(templateObject_1$z || (templateObject_1$z = __makeTemplateObject(["\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n text-align: ", ";\n font-weight: ", ";\n"], ["\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n text-align: ", ";\n font-weight: ", ";\n"
2062
+ })(templateObject_1$B || (templateObject_1$B = __makeTemplateObject(["\n display: inline-flex;\n align-items: center;\n text-align: ", ";\n font-weight: ", ";\n"], ["\n display: inline-flex;\n align-items: center;\n text-align: ", ";\n font-weight: ", ";\n"
1995
2063
  // Map size to Typography variant
1996
2064
  ])), function (_a) {
1997
2065
  var $align = _a.$align;
@@ -2007,35 +2075,8 @@ var sizeToTypographyVariant = {
2007
2075
  large: 'h3',
2008
2076
  xlarge: 'h2'
2009
2077
  };
2010
- // Map size to Icon size for consistent visual alignment
2011
- var sizeToIconSize = {
2012
- small: 'xs',
2013
- medium: 'sm',
2014
- large: 'md',
2015
- xlarge: 'lg'
2016
- };
2017
- /**
2018
- * Generates aria-label with spelled out amount
2019
- */
2020
- var generateAriaLabel = function generateAriaLabel(amount, currency, locale) {
2021
- var _a, _b;
2022
- var formatter = new Intl.NumberFormat(locale, {
2023
- style: 'currency',
2024
- currency: currency,
2025
- minimumFractionDigits: 2,
2026
- maximumFractionDigits: 2
2027
- });
2028
- // Get parts to spell out the amount
2029
- var parts = formatter.formatToParts(Math.abs(amount));
2030
- var integerPart = ((_a = parts.find(function (p) {
2031
- return p.type === 'integer';
2032
- })) === null || _a === void 0 ? void 0 : _a.value) || '0';
2033
- var fractionPart = ((_b = parts.find(function (p) {
2034
- return p.type === 'fraction';
2035
- })) === null || _b === void 0 ? void 0 : _b.value) || '00';
2036
- var sign = amount < 0 ? 'negative ' : '';
2037
- return "".concat(sign).concat(integerPart, " dollars and ").concat(fractionPart, " cents");
2038
- };
2078
+ // The minus sign, not a hyphen, so it reads and copies as minus (decision 0045)
2079
+ var MINUS = "\u2212";
2039
2080
  var MoneyDisplay = function MoneyDisplay(_a) {
2040
2081
  var amount = _a.amount,
2041
2082
  _b = _a.currency,
@@ -2061,51 +2102,33 @@ var MoneyDisplay = function MoneyDisplay(_a) {
2061
2102
  maximumFractionDigits: 2
2062
2103
  });
2063
2104
  var formattedAmount = formatter.format(Math.abs(amount));
2064
- // Determine if we need to show a sign icon
2065
- var showPositiveIcon = showSign && amount > 0 || variant === 'positive';
2066
- var showNegativeIcon = amount < 0 || variant === 'negative';
2067
- // Generate accessibility label
2068
- var ariaLabel = generateAriaLabel(amount, currency, locale);
2069
- // Get typography variant and icon size
2105
+ // A signed amount carries its sign as text, so the sign survives copying and is read aloud, and the
2106
+ // role colour repeats it (decision 0045). Negative amounts always show their sign.
2107
+ var isNegative = amount < 0 || variant === 'negative';
2108
+ var isPositive = !isNegative && (showSign && amount > 0 || variant === 'positive');
2109
+ var sign = isNegative ? MINUS : isPositive ? '+' : '';
2070
2110
  var typographyVariant = sizeToTypographyVariant[size];
2071
- var iconSize = sizeToIconSize[size];
2072
- // Determine icon color based on variant
2073
- var iconColor = variant === 'positive' || showPositiveIcon ? 'success' : variant === 'negative' || showNegativeIcon ? 'error' : variant === 'neutral' ? 'subdued' : 'default';
2074
- // Amount always uses default color (except neutral which stays subdued)
2075
- var amountColor = variant === 'neutral' ? 'subdued' : 'default';
2076
- return jsxRuntime.jsxs(StyledWrapper, {
2111
+ var amountColor = isNegative ? 'error' : isPositive ? 'success' : variant === 'neutral' ? 'subdued' : 'default';
2112
+ return jsxRuntime.jsx(StyledWrapper, {
2077
2113
  "$align": align,
2078
2114
  "$weight": weight,
2079
- "aria-label": ariaLabel,
2080
2115
  "data-testid": dataTestId,
2081
- children: [showPositiveIcon && !showNegativeIcon &&
2082
- // The amount is shown without a sign, so the icon is the sign and needs a name (#85)
2083
- jsxRuntime.jsx(Icon, {
2084
- name: "addRing",
2085
- size: iconSize,
2086
- iconColor: iconColor,
2087
- "aria-label": "Plus"
2088
- }), showNegativeIcon && jsxRuntime.jsx(Icon, {
2089
- name: "remove",
2090
- size: iconSize,
2091
- iconColor: iconColor,
2092
- "aria-label": "Minus"
2093
- }), jsxRuntime.jsx(Typography, {
2116
+ children: jsxRuntime.jsxs(Typography, {
2094
2117
  variant: typographyVariant,
2095
2118
  color: amountColor,
2096
2119
  as: "span",
2097
- children: formattedAmount
2098
- })]
2120
+ children: [sign, formattedAmount]
2121
+ })
2099
2122
  });
2100
2123
  };
2101
- var templateObject_1$z;
2124
+ var templateObject_1$B;
2102
2125
 
2103
2126
  // Destructure tokens
2104
- var semantic$e = tokens.semantic;
2105
- var _a$6 = __assign(__assign({}, semantic$e), {
2127
+ var semantic$f = tokens.semantic;
2128
+ var _a$6 = __assign(__assign({}, semantic$f), {
2106
2129
  component: tokens.component
2107
2130
  }),
2108
- color$5 = _a$6.color,
2131
+ color$6 = _a$6.color,
2109
2132
  motion$4 = _a$6.motion,
2110
2133
  radius$2 = _a$6.radius,
2111
2134
  component$2 = _a$6.component;
@@ -2116,9 +2139,9 @@ var ProgressBarContainer = /*#__PURE__*/styled__default.default.div.withConfig({
2116
2139
  displayName: "ProgressBar__ProgressBarContainer",
2117
2140
  componentId: "sc-1nco33q-0"
2118
2141
  })(templateObject_3$p || (templateObject_3$p = __makeTemplateObject(["\n background-color: ", ";\n border-radius: ", ";\n overflow: hidden;\n\n /* Forced colours drop the track's fill, so the track gets an edge (decision 0038) */\n ", "\n\n ", "\n\n ", "\n"], ["\n background-color: ", ";\n border-radius: ", ";\n overflow: hidden;\n\n /* Forced colours drop the track's fill, so the track gets an edge (decision 0038) */\n ", "\n\n ", "\n\n ", "\n"])), tokens.component.track.background, radius$2.xs, forcedColorsEdge, function (props) {
2119
- return props.$variant === 'horizontal' && styled.css(templateObject_1$y || (templateObject_1$y = __makeTemplateObject(["\n width: 100%;\n height: ", ";\n "], ["\n width: 100%;\n height: ", ";\n "])), props.$height ? component$2.progressBar.sizes[props.$height].height : component$2.progressBar.sizes.md.height);
2142
+ return props.$variant === 'horizontal' && styled.css(templateObject_1$A || (templateObject_1$A = __makeTemplateObject(["\n width: 100%;\n height: ", ";\n "], ["\n width: 100%;\n height: ", ";\n "])), props.$height ? component$2.progressBar.sizes[props.$height].height : component$2.progressBar.sizes.md.height);
2120
2143
  }, function (props) {
2121
- return props.$variant === 'vertical' && styled.css(templateObject_2$q || (templateObject_2$q = __makeTemplateObject(["\n width: ", ";\n height: 100%;\n "], ["\n width: ", ";\n height: 100%;\n "])), props.$width ? component$2.progressBar.sizes[props.$width].height : component$2.progressBar.sizes.md.height);
2144
+ return props.$variant === 'vertical' && styled.css(templateObject_2$r || (templateObject_2$r = __makeTemplateObject(["\n width: ", ";\n height: 100%;\n "], ["\n width: ", ";\n height: 100%;\n "])), props.$width ? component$2.progressBar.sizes[props.$width].height : component$2.progressBar.sizes.md.height);
2122
2145
  });
2123
2146
  var ProgressBarFill = /*#__PURE__*/styled__default.default.div.withConfig({
2124
2147
  shouldForwardProp: function shouldForwardProp(prop) {
@@ -2130,15 +2153,15 @@ var ProgressBarFill = /*#__PURE__*/styled__default.default.div.withConfig({
2130
2153
  var backgroundColor;
2131
2154
  switch (props.$color) {
2132
2155
  case 'success':
2133
- backgroundColor = color$5.fill.success;
2156
+ backgroundColor = color$6.fill.success;
2134
2157
  break;
2135
2158
  case 'error':
2136
- backgroundColor = color$5.fill.danger;
2159
+ backgroundColor = color$6.fill.danger;
2137
2160
  break;
2138
2161
  case 'default':
2139
2162
  default:
2140
2163
  // Near-black, like Slider's fill (decision 0029)
2141
- backgroundColor = color$5.fill.emphasis;
2164
+ backgroundColor = color$6.fill.emphasis;
2142
2165
  break;
2143
2166
  }
2144
2167
  return styled.css(templateObject_4$k || (templateObject_4$k = __makeTemplateObject(["background-color: ", ";"], ["background-color: ", ";"])), backgroundColor);
@@ -2179,7 +2202,7 @@ var ProgressBar = function ProgressBar(_a) {
2179
2202
  })
2180
2203
  });
2181
2204
  };
2182
- var templateObject_1$y, templateObject_2$q, templateObject_3$p, templateObject_4$k, templateObject_5$g, templateObject_6$c, templateObject_7$a;
2205
+ var templateObject_1$A, templateObject_2$r, templateObject_3$p, templateObject_4$k, templateObject_5$g, templateObject_6$c, templateObject_7$a;
2183
2206
 
2184
2207
  // Destructure tokens for cleaner access
2185
2208
  var separatorTokens = tokens.component.separator;
@@ -2191,7 +2214,7 @@ var StyledDivider = /*#__PURE__*/styled__default.default.div.withConfig({
2191
2214
  },
2192
2215
  displayName: "Divider__StyledDivider",
2193
2216
  componentId: "sc-1l0c8ja-0"
2194
- })(templateObject_1$x || (templateObject_1$x = __makeTemplateObject(["\n border: none;\n \n /* Apply orientation */\n ", "\n \n /* Apply variant styles */\n ", "\n \n /* Apply size styles (spacing) */\n ", "\n"], ["\n border: none;\n \n /* Apply orientation */\n ", "\n \n /* Apply variant styles */\n ", "\n \n /* Apply size styles (spacing) */\n ", "\n"
2217
+ })(templateObject_1$z || (templateObject_1$z = __makeTemplateObject(["\n border: none;\n \n /* Apply orientation */\n ", "\n \n /* Apply variant styles */\n ", "\n \n /* Apply size styles (spacing) */\n ", "\n"], ["\n border: none;\n \n /* Apply orientation */\n ", "\n \n /* Apply variant styles */\n ", "\n \n /* Apply size styles (spacing) */\n ", "\n"
2195
2218
  /**
2196
2219
  * Divider is an atomic component that provides visual separation between content sections.
2197
2220
  *
@@ -2304,7 +2327,7 @@ var Divider = function Divider(_a) {
2304
2327
  "aria-orientation": orientation
2305
2328
  });
2306
2329
  };
2307
- var templateObject_1$x;
2330
+ var templateObject_1$z;
2308
2331
 
2309
2332
  var StyledStack = /*#__PURE__*/styled__default.default.div.withConfig({
2310
2333
  shouldForwardProp: function shouldForwardProp(prop) {
@@ -2312,7 +2335,7 @@ var StyledStack = /*#__PURE__*/styled__default.default.div.withConfig({
2312
2335
  },
2313
2336
  displayName: "Stack__StyledStack",
2314
2337
  componentId: "sc-1ehkxgy-0"
2315
- })(templateObject_1$w || (templateObject_1$w = __makeTemplateObject(["\n display: flex;\n flex-direction: var(--stack-direction);\n align-items: var(--stack-align-items);\n justify-content: var(--stack-justify-content);\n gap: var(--stack-gap);\n flex-wrap: var(--stack-wrap);\n"], ["\n display: flex;\n flex-direction: var(--stack-direction);\n align-items: var(--stack-align-items);\n justify-content: var(--stack-justify-content);\n gap: var(--stack-gap);\n flex-wrap: var(--stack-wrap);\n"
2338
+ })(templateObject_1$y || (templateObject_1$y = __makeTemplateObject(["\n display: flex;\n flex-direction: var(--stack-direction);\n align-items: var(--stack-align-items);\n justify-content: var(--stack-justify-content);\n gap: var(--stack-gap);\n flex-wrap: var(--stack-wrap);\n"], ["\n display: flex;\n flex-direction: var(--stack-direction);\n align-items: var(--stack-align-items);\n justify-content: var(--stack-justify-content);\n gap: var(--stack-gap);\n flex-wrap: var(--stack-wrap);\n"
2316
2339
  // Each gap name maps to the space step that replaced its old spacing.layout token (decision 0031),
2317
2340
  // so every gap keeps its value
2318
2341
  ])));
@@ -2366,7 +2389,41 @@ var Stack = function Stack(_a) {
2366
2389
  children: children
2367
2390
  });
2368
2391
  };
2369
- var templateObject_1$w;
2392
+ var templateObject_1$y;
2393
+
2394
+ // Shape indicators for the six coloured statuses (decision 0045): filled silhouettes on the
2395
+ // 24px grid, each the same outline as its status icon. Internal: they aren't public icons, so a
2396
+ // bare shape can't be shown without its label. The shape indicator (#264) and the small
2397
+ // StatusLabel and InlineAlert sizes render them at 12px or more, with a darker edge.
2398
+ var statusShapes = {
2399
+ error: 'M22.5 12L17.25 21.0933L6.75 21.0933L1.5 12L6.75 2.9067L17.25 2.9067Z',
2400
+ serious: 'M12 2L22 12L12 22L2 12Z',
2401
+ warning: 'M12 2.5L22 20.5L2 20.5Z',
2402
+ success: 'M12 2A10 10 0 1 1 12 22A10 10 0 1 1 12 2Z',
2403
+ info: 'M7 2H17A5 5 0 0 1 22 7V17A5 5 0 0 1 17 22H7A5 5 0 0 1 2 17V7A5 5 0 0 1 7 2Z',
2404
+ inProgress: 'M12 2A10 10 0 1 1 12 22A10 10 0 1 1 12 2ZM12 4A8 8 0 1 0 12 20A8 8 0 1 0 12 4ZM12 6A6 6 0 0 1 12 18Z'
2405
+ };
2406
+
2407
+ // The shape indicator: at least 12px (decision 0045), filled with the current text colour, which is
2408
+ // the label's role colour at 5.3:1 or more on its tint, so it needs no edge. Decorative: the text
2409
+ // beside it names the status. Internal to the status family (#264): not exported from the package.
2410
+ var Mark = /*#__PURE__*/styled__default.default.svg.withConfig({
2411
+ displayName: "StatusShape__Mark",
2412
+ componentId: "sc-1yzi9jt-0"
2413
+ })(templateObject_1$x || (templateObject_1$x = __makeTemplateObject(["\n flex: none;\n width: ", ";\n height: ", ";\n fill: currentColor;\n"], ["\n flex: none;\n width: ", ";\n height: ", ";\n fill: currentColor;\n"])), tokens.semantic.size.icon.xs, tokens.semantic.size.icon.xs);
2414
+ var StatusShape = function StatusShape(_a) {
2415
+ var shape = _a.shape;
2416
+ return jsxRuntime.jsx(Mark, {
2417
+ viewBox: "0 0 24 24",
2418
+ "aria-hidden": "true",
2419
+ focusable: "false",
2420
+ "data-shape": shape,
2421
+ children: jsxRuntime.jsx("path", {
2422
+ d: statusShapes[shape]
2423
+ })
2424
+ });
2425
+ };
2426
+ var templateObject_1$x;
2370
2427
 
2371
2428
  // Destructure tokens for cleaner access
2372
2429
  var statusColors = tokens.component.status;
@@ -2379,52 +2436,55 @@ var _b$1 = tokens.semantic.motion,
2379
2436
  easing$3 = _b$1.easing;
2380
2437
  var labelHeight = tokens.semantic.size.label;
2381
2438
  var label$1 = tokens.component.badge.label;
2382
- var scaleIn$1 = styled.keyframes(templateObject_1$v || (templateObject_1$v = __makeTemplateObject(["\n from {\n opacity: 0;\n transform: scale(0.8);\n }\n to {\n opacity: 1;\n transform: scale(1);\n }\n"], ["\n from {\n opacity: 0;\n transform: scale(0.8);\n }\n to {\n opacity: 1;\n transform: scale(1);\n }\n"])));
2439
+ var scaleIn$1 = styled.keyframes(templateObject_1$w || (templateObject_1$w = __makeTemplateObject(["\n from {\n opacity: 0;\n transform: scale(0.8);\n }\n to {\n opacity: 1;\n transform: scale(1);\n }\n"], ["\n from {\n opacity: 0;\n transform: scale(0.8);\n }\n to {\n opacity: 1;\n transform: scale(1);\n }\n"])));
2383
2440
  var getStatusConfig = function getStatusConfig(status) {
2441
+ // Each status's icon and, for the coloured statuses, its shape indicator (decision 0045). The
2442
+ // neutral statuses have no shape: at the small size they're plain text.
2384
2443
  var configs = {
2385
2444
  pending: {
2386
2445
  color: statusColors.pending.text,
2387
2446
  bgColor: statusColors.pending.background,
2388
- icon: 'refresh',
2389
- // Fallback until 'clock' icon is added
2447
+ icon: 'statusPending',
2390
2448
  label: 'Pending'
2391
2449
  },
2392
2450
  completed: {
2393
2451
  color: statusColors.completed.text,
2394
2452
  bgColor: statusColors.completed.background,
2395
- icon: 'check',
2453
+ icon: 'statusSuccess',
2454
+ shape: 'success',
2396
2455
  label: 'Completed'
2397
2456
  },
2398
2457
  failed: {
2399
2458
  color: statusColors.failed.text,
2400
2459
  bgColor: statusColors.failed.background,
2401
- icon: 'close',
2460
+ icon: 'statusError',
2461
+ shape: 'error',
2402
2462
  label: 'Failed'
2403
2463
  },
2404
2464
  cancelled: {
2405
2465
  color: statusColors.cancelled.text,
2406
2466
  bgColor: statusColors.cancelled.background,
2407
- icon: 'cancel',
2467
+ icon: 'statusCancelled',
2408
2468
  label: 'Cancelled'
2409
2469
  },
2410
2470
  processing: {
2411
2471
  color: statusColors.processing.text,
2412
2472
  bgColor: statusColors.processing.background,
2413
- icon: 'refresh',
2473
+ icon: 'statusInProgress',
2474
+ shape: 'inProgress',
2414
2475
  label: 'Processing'
2415
2476
  },
2416
2477
  scheduled: {
2417
2478
  color: statusColors.scheduled.text,
2418
2479
  bgColor: statusColors.scheduled.background,
2419
- icon: 'bell',
2420
- // Fallback until 'calendar' icon is added
2480
+ icon: 'statusScheduled',
2421
2481
  label: 'Scheduled'
2422
2482
  }
2423
2483
  };
2424
2484
  return configs[status];
2425
2485
  };
2426
2486
  // Size configuration
2427
- var sizeConfig$1 = {
2487
+ var sizeConfig$2 = {
2428
2488
  small: {
2429
2489
  height: labelHeight.small,
2430
2490
  padding: "".concat(space$9[100], " ").concat(space$9[200]),
@@ -2446,9 +2506,9 @@ var StyledStatusLabel = /*#__PURE__*/styled__default.default.span.withConfig({
2446
2506
  },
2447
2507
  displayName: "StatusLabelBase__StyledStatusLabel",
2448
2508
  componentId: "sc-1ye9xz5-0"
2449
- })(templateObject_2$p || (templateObject_2$p = __makeTemplateObject(["\n box-sizing: border-box; /* the height includes padding, without relying on a global reset */\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border-radius: ", ";\n white-space: nowrap;\n user-select: none;\n animation: ", " ", " ", ";\n transition: ", ";\n\n /* Under reduced motion the label appears without scaling in, and colours change at once */\n ", " {\n animation: none;\n transition: none;\n }\n\n /* Forced colours drop the fill, so the label keeps its shape with an edge (decision 0038) */\n ", "\n \n /* Size styles */\n ", "\n \n /* Status color styles */\n ", "\n"], ["\n box-sizing: border-box; /* the height includes padding, without relying on a global reset */\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border-radius: ", ";\n white-space: nowrap;\n user-select: none;\n animation: ", " ", " ", ";\n transition: ", ";\n\n /* Under reduced motion the label appears without scaling in, and colours change at once */\n ", " {\n animation: none;\n transition: none;\n }\n\n /* Forced colours drop the fill, so the label keeps its shape with an edge (decision 0038) */\n ", "\n \n /* Size styles */\n ", "\n \n /* Status color styles */\n ", "\n"])), radius$1.full, scaleIn$1, duration$3.moderate, easing$3.decelerate, transition.feedback, reducedMotion, forcedColorsEdge, function (_a) {
2509
+ })(templateObject_2$q || (templateObject_2$q = __makeTemplateObject(["\n box-sizing: border-box; /* the height includes padding, without relying on a global reset */\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border-radius: ", ";\n white-space: nowrap;\n user-select: none;\n animation: ", " ", " ", ";\n transition: ", ";\n\n /* Under reduced motion the label appears without scaling in, and colours change at once */\n ", " {\n animation: none;\n transition: none;\n }\n\n /* Forced colours drop the fill, so the label keeps its shape with an edge (decision 0038) */\n ", "\n \n /* Size styles */\n ", "\n \n /* Status color styles */\n ", "\n"], ["\n box-sizing: border-box; /* the height includes padding, without relying on a global reset */\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border-radius: ", ";\n white-space: nowrap;\n user-select: none;\n animation: ", " ", " ", ";\n transition: ", ";\n\n /* Under reduced motion the label appears without scaling in, and colours change at once */\n ", " {\n animation: none;\n transition: none;\n }\n\n /* Forced colours drop the fill, so the label keeps its shape with an edge (decision 0038) */\n ", "\n \n /* Size styles */\n ", "\n \n /* Status color styles */\n ", "\n"])), radius$1.full, scaleIn$1, duration$3.moderate, easing$3.decelerate, transition.feedback, reducedMotion, forcedColorsEdge, function (_a) {
2450
2510
  var $size = _a.$size;
2451
- var size = sizeConfig$1[$size];
2511
+ var size = sizeConfig$2[$size];
2452
2512
  return "\n height: ".concat(size.height, ";\n padding: ").concat(size.padding, ";\n font: ").concat(size.font, ";\n font-weight: ").concat(label$1.fontWeight, ";\n gap: ").concat(size.gap, ";\n ");
2453
2513
  }, function (_a) {
2454
2514
  var $status = _a.$status;
@@ -2470,13 +2530,13 @@ var VisibleContent = /*#__PURE__*/styled__default.default.span.withConfig({
2470
2530
  })(templateObject_4$j || (templateObject_4$j = __makeTemplateObject(["\n display: contents;\n"], ["\n display: contents;\n"
2471
2531
  /**
2472
2532
  * Shared implementation of StatusLabel and the deprecated StatusBadge. Internal: not exported
2473
- * from the package. `showIcon` exists only for StatusBadge; StatusLabel always shows the icon
2474
- * (decision 0018).
2533
+ * from the package. `showIcon` exists only for StatusBadge. StatusLabel always shows the status icon
2534
+ * at the medium size, and at the small size the shape for coloured statuses (decisions 0018, 0045).
2475
2535
  */])));
2476
2536
  /**
2477
2537
  * Shared implementation of StatusLabel and the deprecated StatusBadge. Internal: not exported
2478
- * from the package. `showIcon` exists only for StatusBadge; StatusLabel always shows the icon
2479
- * (decision 0018).
2538
+ * from the package. `showIcon` exists only for StatusBadge. StatusLabel always shows the status icon
2539
+ * at the medium size, and at the small size the shape for coloured statuses (decisions 0018, 0045).
2480
2540
  */
2481
2541
  var StatusLabelBase = function StatusLabelBase(_a) {
2482
2542
  var status = _a.status,
@@ -2490,7 +2550,7 @@ var StatusLabelBase = function StatusLabelBase(_a) {
2490
2550
  dataTestId = _a["data-testid"],
2491
2551
  ariaLabel = _a["aria-label"];
2492
2552
  var statusConfig = getStatusConfig(status);
2493
- var sizeStyles = sizeConfig$1[size];
2553
+ var sizeStyles = sizeConfig$2[size];
2494
2554
  var displayLabel = label || statusConfig.label;
2495
2555
  // A blank aria-label is no label at all, so it falls back like a missing one
2496
2556
  var accessibleLabel = (ariaLabel === null || ariaLabel === void 0 ? void 0 : ariaLabel.trim()) ? ariaLabel : undefined;
@@ -2504,10 +2564,12 @@ var StatusLabelBase = function StatusLabelBase(_a) {
2504
2564
  "data-testid": dataTestId,
2505
2565
  children: [jsxRuntime.jsxs(VisibleContent, {
2506
2566
  "aria-hidden": accessibleLabel ? 'true' : undefined,
2507
- children: [showIcon && jsxRuntime.jsx(Icon, {
2567
+ children: [showIcon && size === 'medium' && jsxRuntime.jsx(Icon, {
2508
2568
  name: statusConfig.icon,
2509
2569
  size: sizeStyles.iconSize,
2510
2570
  iconColor: "inherit"
2571
+ }), showIcon && size === 'small' && statusConfig.shape && jsxRuntime.jsx(StatusShape, {
2572
+ shape: statusConfig.shape
2511
2573
  }), displayLabel, jsxRuntime.jsxs(ScreenReaderOnly, {
2512
2574
  children: [status, " status"]
2513
2575
  })]
@@ -2516,13 +2578,13 @@ var StatusLabelBase = function StatusLabelBase(_a) {
2516
2578
  })]
2517
2579
  });
2518
2580
  };
2519
- var templateObject_1$v, templateObject_2$p, templateObject_3$o, templateObject_4$j;
2581
+ var templateObject_1$w, templateObject_2$q, templateObject_3$o, templateObject_4$j;
2520
2582
 
2521
2583
  /**
2522
2584
  * StatusBadge displays a transaction or task status.
2523
2585
  *
2524
2586
  * @deprecated Renamed to `StatusLabel` (same `status`, `size`, `label`, `liveRegion`), which always
2525
- * shows the icon. StatusBadge is removed in 3.0 (decision 0018).
2587
+ * shows its status icon or shape. StatusBadge is removed in 3.0 (decision 0018).
2526
2588
  */
2527
2589
  var StatusBadge = function StatusBadge(props) {
2528
2590
  return jsxRuntime.jsx(StatusLabelBase, __assign({}, props));
@@ -2532,8 +2594,11 @@ StatusBadge.displayName = 'StatusBadge';
2532
2594
  /**
2533
2595
  * StatusLabel conveys the status of something, such as a transaction or task (decision 0018).
2534
2596
  *
2535
- * Uses only the status colour tokens and always shows an icon with its text, so status is never
2536
- * conveyed by colour alone. Not interactive. Announces changes politely to screen readers.
2597
+ * Uses only the status colour tokens and always shows its text, so status is never conveyed by
2598
+ * colour alone (decision 0045). Medium shows the status icon. Small shows the status shape for
2599
+ * completed, failed and processing, and text only for the neutral pending, scheduled and
2600
+ * cancelled, so keep the label visible. Not interactive. Announces changes politely to screen
2601
+ * readers.
2537
2602
  *
2538
2603
  * @example
2539
2604
  * ```tsx
@@ -2550,19 +2615,19 @@ var StatusLabel = function StatusLabel(props) {
2550
2615
  };
2551
2616
  StatusLabel.displayName = 'StatusLabel';
2552
2617
 
2553
- var semantic$d = tokens.semantic;
2554
- var color$4 = semantic$d.color,
2555
- size$1 = semantic$d.size;
2618
+ var semantic$e = tokens.semantic;
2619
+ var color$5 = semantic$e.color,
2620
+ size$2 = semantic$e.size;
2556
2621
  var label = tokens.component.badge.label;
2557
- var space$8 = semantic$d.space;
2558
- var radius = semantic$d.radius;
2622
+ var space$8 = semantic$e.space;
2623
+ var radius = semantic$e.radius;
2559
2624
  var StyledTag = /*#__PURE__*/styled__default.default.span.withConfig({
2560
2625
  shouldForwardProp: function shouldForwardProp(prop) {
2561
2626
  return !prop.startsWith('$');
2562
2627
  },
2563
2628
  displayName: "Tag__StyledTag",
2564
2629
  componentId: "sc-lzfmti-0"
2565
- })(templateObject_1$u || (templateObject_1$u = __makeTemplateObject(["\n box-sizing: border-box; /* the height includes padding and border, without relying on a global reset */\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border-radius: ", ";\n user-select: none;\n white-space: nowrap;\n\n /* Size (decision 0018): small has no vertical padding so the text line fits inside 20px */\n height: ", ";\n padding: ", ";\n font: ", ";\n font-weight: ", ";\n \n /* Variant styles */\n background-color: ", ";\n \n color: ", ";\n \n border: ", ";\n"], ["\n box-sizing: border-box; /* the height includes padding and border, without relying on a global reset */\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border-radius: ", ";\n user-select: none;\n white-space: nowrap;\n\n /* Size (decision 0018): small has no vertical padding so the text line fits inside 20px */\n height: ", ";\n padding: ", ";\n font: ", ";\n font-weight: ", ";\n \n /* Variant styles */\n background-color: ", ";\n \n color: ", ";\n \n border: ", ";\n"
2630
+ })(templateObject_1$v || (templateObject_1$v = __makeTemplateObject(["\n box-sizing: border-box; /* the height includes padding and border, without relying on a global reset */\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border-radius: ", ";\n user-select: none;\n white-space: nowrap;\n\n /* Size (decision 0018): small has no vertical padding so the text line fits inside 20px */\n height: ", ";\n padding: ", ";\n font: ", ";\n font-weight: ", ";\n \n /* Variant styles */\n background-color: ", ";\n \n color: ", ";\n \n border: ", ";\n"], ["\n box-sizing: border-box; /* the height includes padding and border, without relying on a global reset */\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border-radius: ", ";\n user-select: none;\n white-space: nowrap;\n\n /* Size (decision 0018): small has no vertical padding so the text line fits inside 20px */\n height: ", ";\n padding: ", ";\n font: ", ";\n font-weight: ", ";\n \n /* Variant styles */\n background-color: ", ";\n \n color: ", ";\n \n border: ", ";\n"
2566
2631
  /**
2567
2632
  * Tag component for categorizing and labeling content
2568
2633
  *
@@ -2570,7 +2635,7 @@ var StyledTag = /*#__PURE__*/styled__default.default.span.withConfig({
2570
2635
  * Tags help users quickly identify and understand content classification.
2571
2636
  */])), radius.sm, function (_a) {
2572
2637
  var $size = _a.$size;
2573
- return size$1.label[$size];
2638
+ return size$2.label[$size];
2574
2639
  }, function (_a) {
2575
2640
  var $size = _a.$size;
2576
2641
  return $size === 'small' ? "0 ".concat(space$8[200]) : "".concat(space$8[100], " ").concat(space$8[200]);
@@ -2578,33 +2643,33 @@ var StyledTag = /*#__PURE__*/styled__default.default.span.withConfig({
2578
2643
  var $variant = _a.$variant;
2579
2644
  switch ($variant) {
2580
2645
  case 'interactive':
2581
- return color$4.fill['accent-muted'];
2646
+ return color$5.fill['accent-muted'];
2582
2647
  case 'success':
2583
- return color$4.fill['success-muted'];
2648
+ return color$5.fill['success-muted'];
2584
2649
  case 'warning':
2585
- return color$4.fill['warning-muted'];
2650
+ return color$5.fill['warning-muted'];
2586
2651
  case 'error':
2587
- return color$4.fill['danger-muted'];
2652
+ return color$5.fill['danger-muted'];
2588
2653
  case 'emphasis':
2589
- return color$4.fill.emphasis;
2654
+ return color$5.fill.emphasis;
2590
2655
  default:
2591
- return color$4.fill.muted;
2656
+ return color$5.fill.muted;
2592
2657
  }
2593
2658
  }, function (_a) {
2594
2659
  var $variant = _a.$variant;
2595
2660
  switch ($variant) {
2596
2661
  case 'interactive':
2597
- return color$4.text.accent;
2662
+ return color$5.text.accent;
2598
2663
  case 'success':
2599
- return color$4.text.success;
2664
+ return color$5.text.success;
2600
2665
  case 'warning':
2601
- return color$4.text.warning;
2666
+ return color$5.text.warning;
2602
2667
  case 'error':
2603
- return color$4.text.danger;
2668
+ return color$5.text.danger;
2604
2669
  case 'emphasis':
2605
- return color$4.text.inverse;
2670
+ return color$5.text.inverse;
2606
2671
  default:
2607
- return color$4.text["default"];
2672
+ return color$5.text["default"];
2608
2673
  }
2609
2674
  }, function (_a) {
2610
2675
  var $variant = _a.$variant,
@@ -2612,17 +2677,17 @@ var StyledTag = /*#__PURE__*/styled__default.default.span.withConfig({
2612
2677
  if (!$border) return 'none';
2613
2678
  switch ($variant) {
2614
2679
  case 'interactive':
2615
- return "".concat(semantic$d.border.width.thin, " solid ").concat(color$4.border.accent);
2680
+ return "".concat(semantic$e.border.width.thin, " solid ").concat(color$5.border.accent);
2616
2681
  case 'success':
2617
- return "".concat(semantic$d.border.width.thin, " solid ").concat(color$4.border.success);
2682
+ return "".concat(semantic$e.border.width.thin, " solid ").concat(color$5.border.success);
2618
2683
  case 'warning':
2619
- return "".concat(semantic$d.border.width.thin, " solid ").concat(color$4.border.warning);
2684
+ return "".concat(semantic$e.border.width.thin, " solid ").concat(color$5.border.warning);
2620
2685
  case 'error':
2621
- return "".concat(semantic$d.border.width.thin, " solid ").concat(color$4.border.danger);
2686
+ return "".concat(semantic$e.border.width.thin, " solid ").concat(color$5.border.danger);
2622
2687
  case 'emphasis':
2623
- return "".concat(semantic$d.border.width.thin, " solid ").concat(color$4.fill.emphasis);
2688
+ return "".concat(semantic$e.border.width.thin, " solid ").concat(color$5.fill.emphasis);
2624
2689
  default:
2625
- return "".concat(semantic$d.border.width.thin, " solid ").concat(color$4.border["default"]);
2690
+ return "".concat(semantic$e.border.width.thin, " solid ").concat(color$5.border["default"]);
2626
2691
  }
2627
2692
  });
2628
2693
  /**
@@ -2654,7 +2719,91 @@ var Tag = function Tag(_a) {
2654
2719
  children: children
2655
2720
  }));
2656
2721
  };
2657
- var templateObject_1$u;
2722
+ var templateObject_1$v;
2723
+
2724
+ var semantic$d = tokens.semantic;
2725
+ var color$4 = semantic$d.color,
2726
+ typography$1 = semantic$d.typography,
2727
+ size$1 = semantic$d.size;
2728
+ var labels = {
2729
+ suggested: 'Suggested',
2730
+ removal: 'Will be removed'
2731
+ };
2732
+ var sizeConfig$1 = {
2733
+ small: {
2734
+ font: typography$1.caption,
2735
+ gap: semantic$d.space[100],
2736
+ icon: 'xs'
2737
+ },
2738
+ medium: {
2739
+ font: typography$1.small,
2740
+ gap: semantic$d.space[200],
2741
+ icon: 'sm'
2742
+ }
2743
+ };
2744
+ var StyledAILabel = /*#__PURE__*/styled__default.default.span.withConfig({
2745
+ shouldForwardProp: function shouldForwardProp(prop) {
2746
+ return !prop.startsWith('$');
2747
+ },
2748
+ displayName: "AILabel__StyledAILabel",
2749
+ componentId: "sc-qknkn-0"
2750
+ })(templateObject_1$u || (templateObject_1$u = __makeTemplateObject(["\n box-sizing: border-box;\n display: inline-flex;\n align-items: center;\n min-height: ", ";\n gap: ", ";\n font: ", ";\n color: ", ";\n white-space: nowrap;\n"], ["\n box-sizing: border-box;\n display: inline-flex;\n align-items: center;\n min-height: ", ";\n gap: ", ";\n font: ", ";\n color: ", ";\n white-space: nowrap;\n"])), function (_a) {
2751
+ var $size = _a.$size;
2752
+ return size$1.label[$size];
2753
+ }, function (_a) {
2754
+ var $size = _a.$size;
2755
+ return sizeConfig$1[$size].gap;
2756
+ }, function (_a) {
2757
+ var $size = _a.$size;
2758
+ return sizeConfig$1[$size].font;
2759
+ }, color$4.text.ai);
2760
+ var StyledIcon = /*#__PURE__*/styled__default.default.span.withConfig({
2761
+ displayName: "AILabel__StyledIcon",
2762
+ componentId: "sc-qknkn-1"
2763
+ })(templateObject_2$p || (templateObject_2$p = __makeTemplateObject(["\n display: inline-flex;\n color: ", ";\n"], ["\n display: inline-flex;\n color: ", ";\n"
2764
+ /**
2765
+ * AILabel marks content an agent has proposed but the user hasn't accepted (decision 0046): the AI
2766
+ * icon and a fixed label in the AI colour, never colour alone (decision 0043). It isn't a status
2767
+ * (use StatusLabel) or a category (use CategoryLabel), and it doesn't label AI features in general.
2768
+ *
2769
+ * @example
2770
+ * ```tsx
2771
+ * <AILabel /> // "Suggested"
2772
+ * <AILabel kind="removal" /> // "Will be removed"
2773
+ * ```
2774
+ */])), color$4.icon.ai);
2775
+ /**
2776
+ * AILabel marks content an agent has proposed but the user hasn't accepted (decision 0046): the AI
2777
+ * icon and a fixed label in the AI colour, never colour alone (decision 0043). It isn't a status
2778
+ * (use StatusLabel) or a category (use CategoryLabel), and it doesn't label AI features in general.
2779
+ *
2780
+ * @example
2781
+ * ```tsx
2782
+ * <AILabel /> // "Suggested"
2783
+ * <AILabel kind="removal" /> // "Will be removed"
2784
+ * ```
2785
+ */
2786
+ var AILabel = function AILabel(_a) {
2787
+ var _b = _a.kind,
2788
+ kind = _b === void 0 ? 'suggested' : _b,
2789
+ _c = _a.size,
2790
+ labelSize = _c === void 0 ? 'medium' : _c,
2791
+ dataTestId = _a["data-testid"];
2792
+ return jsxRuntime.jsxs(StyledAILabel, {
2793
+ "$size": labelSize,
2794
+ "data-testid": dataTestId,
2795
+ children: [jsxRuntime.jsx(StyledIcon, {
2796
+ "aria-hidden": "true",
2797
+ children: jsxRuntime.jsx(Icon, {
2798
+ name: "ai",
2799
+ size: sizeConfig$1[labelSize].icon,
2800
+ iconColor: "inherit"
2801
+ })
2802
+ }), labels[kind]]
2803
+ });
2804
+ };
2805
+ AILabel.displayName = 'AILabel';
2806
+ var templateObject_1$u, templateObject_2$p;
2658
2807
 
2659
2808
  // Destructure tokens for cleaner access
2660
2809
  var semantic$c = tokens.semantic;
@@ -2666,7 +2815,10 @@ var StyledBalanceSection = /*#__PURE__*/styled__default.default.div.withConfig({
2666
2815
  var StyledTrendSection = /*#__PURE__*/styled__default.default.div.withConfig({
2667
2816
  displayName: "AccountCard__StyledTrendSection",
2668
2817
  componentId: "sc-1erp7zn-1"
2669
- })(templateObject_2$o || (templateObject_2$o = __makeTemplateObject(["\n display: flex;\n align-items: center;\n gap: ", ";\n"], ["\n display: flex;\n align-items: center;\n gap: ", ";\n"])), space$7[100]);
2818
+ })(templateObject_2$o || (templateObject_2$o = __makeTemplateObject(["\n display: flex;\n align-items: center;\n gap: ", ";\n color: ", ";\n font: ", ";\n"], ["\n display: flex;\n align-items: center;\n gap: ", ";\n color: ", ";\n font: ", ";\n"])), space$7[100], function (_a) {
2819
+ var $color = _a.$color;
2820
+ return $color;
2821
+ }, semantic$c.typography.small);
2670
2822
  /*#__PURE__*/styled__default.default.div.withConfig({
2671
2823
  displayName: "AccountCard__StyledActions",
2672
2824
  componentId: "sc-1erp7zn-2"
@@ -2687,10 +2839,12 @@ var trendToIcon = {
2687
2839
  down: 'arrowDown',
2688
2840
  neutral: 'arrowRight'
2689
2841
  };
2842
+ // A trend is a differential indicator (decision 0045): the arrow and the signed value carry the
2843
+ // direction, and the role colour repeats it. Category colours carry no meaning, so they aren't used.
2690
2844
  var trendToColor = {
2691
- up: 'green',
2692
- down: 'red',
2693
- neutral: 'blue'
2845
+ up: semantic$c.color.text.success,
2846
+ down: semantic$c.color.text.danger,
2847
+ neutral: semantic$c.color.text.muted
2694
2848
  };
2695
2849
  /**
2696
2850
  * AccountCard component
@@ -2785,16 +2939,19 @@ var AccountCard = function AccountCard(_a) {
2785
2939
  }), jsxRuntime.jsx(Typography, {
2786
2940
  color: "subdued",
2787
2941
  children: "Available"
2788
- }), trend && trendValue && jsxRuntime.jsx(StyledTrendSection, {
2942
+ }), trend && trendValue &&
2943
+ // A group rather than an image, so screen readers read the value as well as the direction
2944
+ jsxRuntime.jsxs(StyledTrendSection, {
2945
+ role: "group",
2789
2946
  "aria-label": "Trend ".concat(trend),
2790
- role: "img",
2791
- children: jsxRuntime.jsx(CategoryLabel, {
2792
- size: "medium",
2793
- icon: trendIcon,
2794
- color: trendColor,
2795
- variant: "minimal",
2947
+ "$color": trendColor,
2948
+ children: [jsxRuntime.jsx(Icon, {
2949
+ name: trendIcon,
2950
+ size: "sm",
2951
+ iconColor: "inherit"
2952
+ }), jsxRuntime.jsx("span", {
2796
2953
  children: trendValue
2797
- })
2954
+ })]
2798
2955
  })]
2799
2956
  })
2800
2957
  })]
@@ -3370,6 +3527,10 @@ function detectSpeechRecognitionConstructor(targetWindow) {
3370
3527
  function normalizeTranscript(input) {
3371
3528
  return input.replace(/\s+/g, ' ').trim();
3372
3529
  }
3530
+ /** Typed text: like a transcript, but line breaks are kept (spaces around them are dropped). */
3531
+ function normalizeMessage(input) {
3532
+ return input.replace(/[^\S\n]+/g, ' ').replace(/ ?\n ?/g, '\n').trim();
3533
+ }
3373
3534
  function mapSpeechErrorCode(error) {
3374
3535
  switch (error) {
3375
3536
  case 'not-allowed':
@@ -3456,94 +3617,165 @@ function agentInputStateTransition(currentState, event) {
3456
3617
 
3457
3618
  var semantic$a = tokens.semantic,
3458
3619
  component$1 = tokens.component;
3459
- var DEFAULT_IDLE_HELPER = 'Ask about transactions, spending, or transfers';
3460
3620
  var DEFAULT_LISTENING_MESSAGE = 'Listening… speak now';
3461
3621
  var DEFAULT_PROCESSING_MESSAGE = 'Finishing voice input…';
3622
+ // The counter appears from this share of maxLength
3623
+ var COUNTER_THRESHOLD = 0.8;
3624
+ // Layout effects warn during server rendering in React 18
3625
+ var useIsomorphicLayoutEffect = typeof window !== 'undefined' ? React.useLayoutEffect : React.useEffect;
3462
3626
  var rotateRing = styled.keyframes(templateObject_1$q || (templateObject_1$q = __makeTemplateObject(["\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n"], ["\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n"])));
3463
3627
  var Container = /*#__PURE__*/styled__default.default.div.withConfig({
3628
+ shouldForwardProp: function shouldForwardProp(prop) {
3629
+ return !prop.startsWith('$');
3630
+ },
3464
3631
  displayName: "AgentInput__Container",
3465
3632
  componentId: "sc-fhl996-0"
3466
- })(templateObject_2$l || (templateObject_2$l = __makeTemplateObject(["\n display: flex;\n flex-direction: column;\n gap: ", ";\n width: 100%;\n"], ["\n display: flex;\n flex-direction: column;\n gap: ", ";\n width: 100%;\n"])), semantic$a.space[200]);
3633
+ })(templateObject_3$k || (templateObject_3$k = __makeTemplateObject(["\n display: flex;\n flex-direction: column;\n gap: ", ";\n width: 100%;\n\n ", "\n"], ["\n display: flex;\n flex-direction: column;\n gap: ", ";\n width: 100%;\n\n ", "\n"])), semantic$a.space[200], function (_a) {
3634
+ var $docked = _a.$docked;
3635
+ return $docked && styled.css(templateObject_2$l || (templateObject_2$l = __makeTemplateObject(["\n position: sticky;\n bottom: 0;\n z-index: ", ";\n /* The band hides content scrolling past the field and status line (decisions 0006, 0031) */\n background-color: ", ";\n padding-top: ", ";\n /* Clears the home indicator; zero unless the page sets viewport-fit=cover */\n padding-bottom: env(safe-area-inset-bottom, 0px);\n "], ["\n position: sticky;\n bottom: 0;\n z-index: ", ";\n /* The band hides content scrolling past the field and status line (decisions 0006, 0031) */\n background-color: ", ";\n padding-top: ", ";\n /* Clears the home indicator; zero unless the page sets viewport-fit=cover */\n padding-bottom: env(safe-area-inset-bottom, 0px);\n "])), semantic$a.layer.sticky, semantic$a.surface.base, semantic$a.space[300]);
3636
+ });
3467
3637
  var ControlsRow = /*#__PURE__*/styled__default.default.div.withConfig({
3468
3638
  displayName: "AgentInput__ControlsRow",
3469
3639
  componentId: "sc-fhl996-1"
3470
- })(templateObject_3$k || (templateObject_3$k = __makeTemplateObject(["\n width: 100%;\n"], ["\n width: 100%;\n"])));
3640
+ })(templateObject_4$f || (templateObject_4$f = __makeTemplateObject(["\n width: 100%;\n"], ["\n width: 100%;\n"])));
3471
3641
  var InputShell = /*#__PURE__*/styled__default.default.div.withConfig({
3472
3642
  displayName: "AgentInput__InputShell",
3473
3643
  componentId: "sc-fhl996-2"
3474
- })(templateObject_4$f || (templateObject_4$f = __makeTemplateObject(["\n display: flex;\n align-items: center;\n gap: ", ";\n width: 100%;\n padding: ", " ", " ", " ", ";\n background-color: ", ";\n border: ", " solid ", ";\n border-radius: ", ";\n box-shadow: ", ";\n transition: border-color ", " ", ", outline ", " ", ";\n\n &:focus-within {\n border-color: ", ";\n outline: ", ";\n outline-offset: ", ";\n }\n\n &[data-disabled='true'] {\n background-color: ", ";\n border-color: ", ";\n }\n"], ["\n display: flex;\n align-items: center;\n gap: ", ";\n width: 100%;\n padding: ", " ", " ", " ", ";\n background-color: ", ";\n border: ", " solid ", ";\n border-radius: ", ";\n box-shadow: ", ";\n transition: border-color ", " ", ", outline ", " ", ";\n\n &:focus-within {\n border-color: ", ";\n outline: ", ";\n outline-offset: ", ";\n }\n\n &[data-disabled='true'] {\n background-color: ", ";\n border-color: ", ";\n }\n"])), semantic$a.space[200], semantic$a.space[100], semantic$a.space[200], semantic$a.space[100], semantic$a.space.inset.lg, component$1.input["default"].backgroundColor, component$1.input["default"].borderWidth, component$1.input["default"].borderColor, semantic$a.radius['3xl'], semantic$a.elevation.raised, semantic$a.motion.duration.moderate, semantic$a.motion.easing.standard, semantic$a.motion.duration.moderate, semantic$a.motion.easing.standard, component$1.input.focus.borderColor, component$1.input.focus.outline, semantic$a.border.focusOffset, component$1.input.disabled.backgroundColor, component$1.input.disabled.borderColor);
3475
- var Input = /*#__PURE__*/styled__default.default.input.withConfig({
3644
+ })(templateObject_5$c || (templateObject_5$c = __makeTemplateObject(["\n display: flex;\n /* Actions sit beside the last line as the field grows */\n align-items: flex-end;\n gap: ", ";\n width: 100%;\n padding: ", " ", " ", " ", ";\n background-color: ", ";\n border: ", " solid ", ";\n border-radius: ", ";\n box-shadow: ", ";\n transition: border-color ", " ", ", outline ", " ", ";\n\n &:focus-within {\n border-color: ", ";\n outline: ", ";\n outline-offset: ", ";\n }\n\n &[data-disabled='true'] {\n background-color: ", ";\n border-color: ", ";\n }\n"], ["\n display: flex;\n /* Actions sit beside the last line as the field grows */\n align-items: flex-end;\n gap: ", ";\n width: 100%;\n padding: ", " ", " ", " ", ";\n background-color: ", ";\n border: ", " solid ", ";\n border-radius: ", ";\n box-shadow: ", ";\n transition: border-color ", " ", ", outline ", " ", ";\n\n &:focus-within {\n border-color: ", ";\n outline: ", ";\n outline-offset: ", ";\n }\n\n &[data-disabled='true'] {\n background-color: ", ";\n border-color: ", ";\n }\n"
3645
+ // One row is a control-height field; it grows with its content to six rows, then scrolls.
3646
+ // The height is set from scrollHeight in resizeField; 1lh is the body line height.
3647
+ ])), semantic$a.space[200], semantic$a.space[100], semantic$a.space[200], semantic$a.space[100], semantic$a.space.inset.lg, component$1.input["default"].backgroundColor, component$1.input["default"].borderWidth, component$1.input["default"].borderColor, semantic$a.radius['3xl'], semantic$a.elevation.raised, semantic$a.motion.duration.moderate, semantic$a.motion.easing.standard, semantic$a.motion.duration.moderate, semantic$a.motion.easing.standard, component$1.input.focus.borderColor, component$1.input.focus.outline, semantic$a.border.focusOffset, component$1.input.disabled.backgroundColor, component$1.input.disabled.borderColor);
3648
+ // One row is a control-height field; it grows with its content to six rows, then scrolls.
3649
+ // The height is set from scrollHeight in resizeField; 1lh is the body line height.
3650
+ var Input = /*#__PURE__*/styled__default.default.textarea.withConfig({
3476
3651
  displayName: "AgentInput__Input",
3477
3652
  componentId: "sc-fhl996-3"
3478
- })(templateObject_5$c || (templateObject_5$c = __makeTemplateObject(["\n flex: 1;\n min-width: 0;\n min-height: ", ";\n border: none;\n background: transparent;\n font: ", ";\n color: ", ";\n outline: none;\n\n &::placeholder {\n color: ", ";\n /* Firefox fades placeholders to 0.54 by default, which would undo the 4.5:1 contrast */\n opacity: 1;\n }\n\n &:disabled {\n color: ", ";\n cursor: not-allowed;\n }\n"], ["\n flex: 1;\n min-width: 0;\n min-height: ", ";\n border: none;\n background: transparent;\n font: ", ";\n color: ", ";\n outline: none;\n\n &::placeholder {\n color: ", ";\n /* Firefox fades placeholders to 0.54 by default, which would undo the 4.5:1 contrast */\n opacity: 1;\n }\n\n &:disabled {\n color: ", ";\n cursor: not-allowed;\n }\n"])), semantic$a.size.control.lg, semantic$a.typography.body, semantic$a.color.text["default"], component$1.input.placeholder.textColor, semantic$a.color.text.disabled);
3653
+ })(templateObject_6$9 || (templateObject_6$9 = __makeTemplateObject(["\n display: block;\n flex: 1;\n min-width: 0;\n box-sizing: border-box;\n height: ", ";\n min-height: ", ";\n max-height: calc(5lh + ", ");\n margin: 0;\n padding: calc((", " - 1lh) / 2) 0;\n resize: none;\n overflow-y: hidden;\n border: none;\n background: transparent;\n font: ", ";\n color: ", ";\n outline: none;\n\n &::placeholder {\n color: ", ";\n /* Firefox fades placeholders to 0.54 by default, which would undo the 4.5:1 contrast */\n opacity: 1;\n }\n\n &:disabled {\n color: ", ";\n cursor: not-allowed;\n }\n"], ["\n display: block;\n flex: 1;\n min-width: 0;\n box-sizing: border-box;\n height: ", ";\n min-height: ", ";\n max-height: calc(5lh + ", ");\n margin: 0;\n padding: calc((", " - 1lh) / 2) 0;\n resize: none;\n overflow-y: hidden;\n border: none;\n background: transparent;\n font: ", ";\n color: ", ";\n outline: none;\n\n &::placeholder {\n color: ", ";\n /* Firefox fades placeholders to 0.54 by default, which would undo the 4.5:1 contrast */\n opacity: 1;\n }\n\n &:disabled {\n color: ", ";\n cursor: not-allowed;\n }\n"])), semantic$a.size.control.lg, semantic$a.size.control.lg, semantic$a.size.control.lg, semantic$a.size.control.lg, semantic$a.typography.body, semantic$a.color.text["default"], component$1.input.placeholder.textColor, semantic$a.color.text.disabled);
3479
3654
  var InputActions = /*#__PURE__*/styled__default.default.div.withConfig({
3480
3655
  displayName: "AgentInput__InputActions",
3481
3656
  componentId: "sc-fhl996-4"
3482
- })(templateObject_6$9 || (templateObject_6$9 = __makeTemplateObject(["\n display: inline-flex;\n align-items: center;\n gap: ", ";\n"], ["\n display: inline-flex;\n align-items: center;\n gap: ", ";\n"])), semantic$a.space[200]);
3657
+ })(templateObject_7$7 || (templateObject_7$7 = __makeTemplateObject(["\n display: inline-flex;\n align-items: center;\n gap: ", ";\n /* Centres the buttons on a one-row field, and keeps them level with the last line as it grows */\n padding-bottom: calc((", " - ", ") / 2);\n"], ["\n display: inline-flex;\n align-items: center;\n gap: ", ";\n /* Centres the buttons on a one-row field, and keeps them level with the last line as it grows */\n padding-bottom: calc((", " - ", ") / 2);\n"])), semantic$a.space[200], semantic$a.size.control.lg, semantic$a.size.control.md);
3483
3658
  var CircularActionIconButton = /*#__PURE__*/styled__default.default(IconButton).withConfig({
3484
3659
  displayName: "AgentInput__CircularActionIconButton",
3485
3660
  componentId: "sc-fhl996-5"
3486
- })(templateObject_7$7 || (templateObject_7$7 = __makeTemplateObject(["\n border-radius: ", ";\n"], ["\n border-radius: ", ";\n"])), semantic$a.radius.full);
3661
+ })(templateObject_8$6 || (templateObject_8$6 = __makeTemplateObject(["\n border-radius: ", ";\n"], ["\n border-radius: ", ";\n"])), semantic$a.radius.full);
3487
3662
  var InputWrapper = /*#__PURE__*/styled__default.default.div.withConfig({
3488
3663
  displayName: "AgentInput__InputWrapper",
3489
3664
  componentId: "sc-fhl996-6"
3490
- })(templateObject_8$6 || (templateObject_8$6 = __makeTemplateObject(["\n flex: 1;\n min-width: 0;\n"], ["\n flex: 1;\n min-width: 0;\n"])));
3665
+ })(templateObject_9$5 || (templateObject_9$5 = __makeTemplateObject(["\n flex: 1;\n min-width: 0;\n"], ["\n flex: 1;\n min-width: 0;\n"])));
3491
3666
  var MicButtonWrapper = /*#__PURE__*/styled__default.default.div.withConfig({
3492
3667
  shouldForwardProp: function shouldForwardProp(prop) {
3493
3668
  return !prop.startsWith('$');
3494
3669
  },
3495
3670
  displayName: "AgentInput__MicButtonWrapper",
3496
3671
  componentId: "sc-fhl996-7"
3497
- })(templateObject_9$5 || (templateObject_9$5 = __makeTemplateObject(["\n position: relative;\n display: inline-flex;\n border-radius: ", ";\n\n & > button {\n position: relative;\n z-index: 1;\n }\n"], ["\n position: relative;\n display: inline-flex;\n border-radius: ", ";\n\n & > button {\n position: relative;\n z-index: 1;\n }\n"
3672
+ })(templateObject_10$3 || (templateObject_10$3 = __makeTemplateObject(["\n position: relative;\n display: inline-flex;\n border-radius: ", ";\n\n & > button {\n position: relative;\n z-index: 1;\n }\n"], ["\n position: relative;\n display: inline-flex;\n border-radius: ", ";\n\n & > button {\n position: relative;\n z-index: 1;\n }\n"
3498
3673
  // Masks read only alpha, so the opaque stop is a mask value, not a colour (decision 0010).
3499
3674
  // eslint-disable-next-line no-restricted-syntax
3500
3675
  ])), semantic$a.radius.full);
3501
3676
  // Masks read only alpha, so the opaque stop is a mask value, not a colour (decision 0010).
3502
3677
  // eslint-disable-next-line no-restricted-syntax
3503
- var ringMask = styled.css(templateObject_10$3 || (templateObject_10$3 = __makeTemplateObject(["radial-gradient(farthest-side, transparent calc(100% - var(--ring-thickness)), #000 calc(100% - var(--ring-thickness)))"], ["radial-gradient(farthest-side, transparent calc(100% - var(--ring-thickness)), #000 calc(100% - var(--ring-thickness)))"])));
3678
+ var ringMask = styled.css(templateObject_11$3 || (templateObject_11$3 = __makeTemplateObject(["radial-gradient(farthest-side, transparent calc(100% - var(--ring-thickness)), #000 calc(100% - var(--ring-thickness)))"], ["radial-gradient(farthest-side, transparent calc(100% - var(--ring-thickness)), #000 calc(100% - var(--ring-thickness)))"])));
3504
3679
  var MicListeningRing = /*#__PURE__*/styled__default.default.span.withConfig({
3505
3680
  shouldForwardProp: function shouldForwardProp(prop) {
3506
3681
  return !prop.startsWith('$');
3507
3682
  },
3508
3683
  displayName: "AgentInput__MicListeningRing",
3509
3684
  componentId: "sc-fhl996-8"
3510
- })(templateObject_12$3 || (templateObject_12$3 = __makeTemplateObject(["\n --ring-thickness: ", ";\n position: absolute;\n inset: calc(-1 * ", " - ", ");\n border-radius: ", ";\n pointer-events: none;\n z-index: 0;\n background: conic-gradient(\n from 0deg,\n ", " 0deg,\n ", " 110deg,\n ", " 210deg,\n ", " 300deg,\n ", " 360deg\n );\n mask: ", ";\n -webkit-mask: ", ";\n\n ", "\n\n @media (prefers-reduced-motion: reduce) {\n animation: none;\n }\n"], ["\n --ring-thickness: ", ";\n position: absolute;\n inset: calc(-1 * ", " - ", ");\n border-radius: ", ";\n pointer-events: none;\n z-index: 0;\n background: conic-gradient(\n from 0deg,\n ", " 0deg,\n ", " 110deg,\n ", " 210deg,\n ", " 300deg,\n ", " 360deg\n );\n mask: ", ";\n -webkit-mask: ", ";\n\n ", "\n\n @media (prefers-reduced-motion: reduce) {\n animation: none;\n }\n"])), semantic$a.border.width.thick, semantic$a.space[100], semantic$a.border.focusOffset, semantic$a.radius.full, semantic$a.color.fill['accent-muted'], semantic$a.color.fill.accent, semantic$a.color.fill['accent-hover'], semantic$a.color.fill.accent, semantic$a.color.fill['accent-muted'], ringMask, ringMask, function (_a) {
3685
+ })(templateObject_13$3 || (templateObject_13$3 = __makeTemplateObject(["\n --ring-thickness: ", ";\n position: absolute;\n inset: calc(-1 * ", " - ", ");\n border-radius: ", ";\n pointer-events: none;\n z-index: 0;\n background: conic-gradient(\n from 0deg,\n ", " 0deg,\n ", " 110deg,\n ", " 210deg,\n ", " 300deg,\n ", " 360deg\n );\n mask: ", ";\n -webkit-mask: ", ";\n\n ", "\n\n @media (prefers-reduced-motion: reduce) {\n animation: none;\n }\n"], ["\n --ring-thickness: ", ";\n position: absolute;\n inset: calc(-1 * ", " - ", ");\n border-radius: ", ";\n pointer-events: none;\n z-index: 0;\n background: conic-gradient(\n from 0deg,\n ", " 0deg,\n ", " 110deg,\n ", " 210deg,\n ", " 300deg,\n ", " 360deg\n );\n mask: ", ";\n -webkit-mask: ", ";\n\n ", "\n\n @media (prefers-reduced-motion: reduce) {\n animation: none;\n }\n"
3686
+ // Maximum suggestions shown (decision 0046, #280)
3687
+ ])), semantic$a.border.width.thick, semantic$a.space[100], semantic$a.border.focusOffset, semantic$a.radius.full, semantic$a.color.fill['accent-muted'], semantic$a.color.fill.accent, semantic$a.color.fill['accent-hover'], semantic$a.color.fill.accent, semantic$a.color.fill['accent-muted'], ringMask, ringMask, function (_a) {
3511
3688
  var $reducedMotion = _a.$reducedMotion;
3512
- return !$reducedMotion && styled.css(templateObject_11$3 || (templateObject_11$3 = __makeTemplateObject(["\n animation: ", " 1300ms linear infinite;\n "], ["\n animation: ", " 1300ms linear infinite;\n "])), rotateRing);
3689
+ return !$reducedMotion && styled.css(templateObject_12$3 || (templateObject_12$3 = __makeTemplateObject(["\n animation: ", " 1300ms linear infinite;\n "], ["\n animation: ", " 1300ms linear infinite;\n "])), rotateRing);
3513
3690
  });
3691
+ // Maximum suggestions shown (decision 0046, #280)
3692
+ var MAX_SUGGESTIONS = 3;
3693
+ var regionEnter = styled.keyframes(templateObject_14$1 || (templateObject_14$1 = __makeTemplateObject(["\n from {\n opacity: 0;\n transform: translateY(", ");\n }\n"], ["\n from {\n opacity: 0;\n transform: translateY(", ");\n }\n"])), semantic$a.motion.distance.sm);
3694
+ var regionFadeIn = styled.keyframes(templateObject_15$1 || (templateObject_15$1 = __makeTemplateObject(["\n from {\n opacity: 0;\n }\n"], ["\n from {\n opacity: 0;\n }\n"
3695
+ // Leaving content fades, then its space closes, as with Alert's dismiss (decision 0015). A grid
3696
+ // row from 1fr to 0fr collapses to the content's own height without measuring it.
3697
+ ])));
3698
+ // Leaving content fades, then its space closes, as with Alert's dismiss (decision 0015). A grid
3699
+ // row from 1fr to 0fr collapses to the content's own height without measuring it.
3700
+ var regionFadeThenCollapse = styled.keyframes(templateObject_16$1 || (templateObject_16$1 = __makeTemplateObject(["\n 0%, 50% {\n grid-template-rows: 1fr;\n }\n 0% {\n opacity: 1;\n }\n 50%, 100% {\n opacity: 0;\n }\n 100% {\n grid-template-rows: 0fr;\n }\n"], ["\n 0%, 50% {\n grid-template-rows: 1fr;\n }\n 0% {\n opacity: 1;\n }\n 50%, 100% {\n opacity: 0;\n }\n 100% {\n grid-template-rows: 0fr;\n }\n"])));
3701
+ var regionFadeOut = styled.keyframes(templateObject_17$1 || (templateObject_17$1 = __makeTemplateObject(["\n to {\n opacity: 0;\n }\n"], ["\n to {\n opacity: 0;\n }\n"
3702
+ // One part of the region above the field: the review bar or the suggestions
3703
+ ])));
3704
+ // One part of the region above the field: the review bar or the suggestions
3705
+ var RegionItem = /*#__PURE__*/styled__default.default.div.withConfig({
3706
+ shouldForwardProp: function shouldForwardProp(prop) {
3707
+ return !prop.startsWith('$');
3708
+ },
3709
+ displayName: "AgentInput__RegionItem",
3710
+ componentId: "sc-fhl996-9"
3711
+ })(templateObject_21$1 || (templateObject_21$1 = __makeTemplateObject(["\n display: grid;\n grid-template-rows: 1fr;\n animation: ", " ", " ", ";\n\n ", " {\n animation-name: ", ";\n }\n\n ", "\n"], ["\n display: grid;\n grid-template-rows: 1fr;\n animation: ", " ", " ", ";\n\n ", " {\n animation-name: ", ";\n }\n\n ", "\n"
3712
+ // Clips while the row collapses. Its bottom padding is the space to the next part, so it closes too.
3713
+ ])), regionEnter, semantic$a.motion.duration.moderate, semantic$a.motion.easing.decelerate, reducedMotion, regionFadeIn, function (_a) {
3714
+ var $exiting = _a.$exiting,
3715
+ $reducedExit = _a.$reducedExit;
3716
+ return $exiting && styled.css(templateObject_20$1 || (templateObject_20$1 = __makeTemplateObject(["\n pointer-events: none;\n animation: ", ";\n "], ["\n pointer-events: none;\n animation: ", ";\n "])), $reducedExit ? styled.css(templateObject_18$1 || (templateObject_18$1 = __makeTemplateObject(["", " ", " ", " forwards"], ["", " ", " ", " forwards"])), regionFadeOut, semantic$a.motion.duration.fast, semantic$a.motion.easing.accelerate) : styled.css(templateObject_19$1 || (templateObject_19$1 = __makeTemplateObject(["", " calc(2 * ", ") ", " forwards"], ["", " calc(2 * ", ") ", " forwards"])), regionFadeThenCollapse, semantic$a.motion.duration.fast, semantic$a.motion.easing.accelerate));
3717
+ });
3718
+ // Clips while the row collapses. Its bottom padding is the space to the next part, so it closes too.
3719
+ var RegionItemContent = /*#__PURE__*/styled__default.default.div.withConfig({
3720
+ displayName: "AgentInput__RegionItemContent",
3721
+ componentId: "sc-fhl996-10"
3722
+ })(templateObject_22$1 || (templateObject_22$1 = __makeTemplateObject(["\n min-height: 0;\n overflow: hidden;\n padding-bottom: ", ";\n padding-left: ", ";\n"], ["\n min-height: 0;\n overflow: hidden;\n padding-bottom: ", ";\n padding-left: ", ";\n"
3723
+ // The summary first, then the actions, left-aligned after it; they wrap below on narrow screens (0021)
3724
+ ])), semantic$a.space[200], semantic$a.space[500]);
3725
+ // The summary first, then the actions, left-aligned after it; they wrap below on narrow screens (0021)
3726
+ var ReviewBar = /*#__PURE__*/styled__default.default.div.withConfig({
3727
+ displayName: "AgentInput__ReviewBar",
3728
+ componentId: "sc-fhl996-11"
3729
+ })(templateObject_23$1 || (templateObject_23$1 = __makeTemplateObject(["\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n column-gap: ", ";\n row-gap: ", ";\n"], ["\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n column-gap: ", ";\n row-gap: ", ";\n"])), semantic$a.space[300], semantic$a.space[200]);
3730
+ var ReviewActions = /*#__PURE__*/styled__default.default.div.withConfig({
3731
+ displayName: "AgentInput__ReviewActions",
3732
+ componentId: "sc-fhl996-12"
3733
+ })(templateObject_24$1 || (templateObject_24$1 = __makeTemplateObject(["\n display: flex;\n flex-wrap: wrap;\n gap: ", ";\n"], ["\n display: flex;\n flex-wrap: wrap;\n gap: ", ";\n"])), semantic$a.space[200]);
3734
+ var SuggestionList = /*#__PURE__*/styled__default.default.ul.withConfig({
3735
+ displayName: "AgentInput__SuggestionList",
3736
+ componentId: "sc-fhl996-13"
3737
+ })(templateObject_25$1 || (templateObject_25$1 = __makeTemplateObject(["\n display: flex;\n flex-wrap: wrap;\n gap: ", ";\n margin: 0;\n padding: 0;\n list-style: none;\n\n & > li {\n max-width: 100%;\n }\n"], ["\n display: flex;\n flex-wrap: wrap;\n gap: ", ";\n margin: 0;\n padding: 0;\n list-style: none;\n\n & > li {\n max-width: 100%;\n }\n"])), semantic$a.space[200]);
3514
3738
  var StatusRow = /*#__PURE__*/styled__default.default.div.withConfig({
3515
3739
  displayName: "AgentInput__StatusRow",
3516
- componentId: "sc-fhl996-9"
3517
- })(templateObject_13$3 || (templateObject_13$3 = __makeTemplateObject(["\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: ", ";\n min-height: ", ";\n"], ["\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: ", ";\n min-height: ", ";\n"])), semantic$a.space[300], semantic$a.space[600]);
3740
+ componentId: "sc-fhl996-14"
3741
+ })(templateObject_26$1 || (templateObject_26$1 = __makeTemplateObject(["\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: ", ";\n min-height: ", ";\n"], ["\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: ", ";\n min-height: ", ";\n"])), semantic$a.space[300], semantic$a.space[600]);
3518
3742
  var StatusText = /*#__PURE__*/styled__default.default.div.withConfig({
3519
3743
  shouldForwardProp: function shouldForwardProp(prop) {
3520
3744
  return !prop.startsWith('$');
3521
3745
  },
3522
3746
  displayName: "AgentInput__StatusText",
3523
- componentId: "sc-fhl996-10"
3524
- })(templateObject_14$1 || (templateObject_14$1 = __makeTemplateObject(["\n padding-left: ", ";\n"], ["\n padding-left: ", ";\n"])), semantic$a.space[500]);
3747
+ componentId: "sc-fhl996-15"
3748
+ })(templateObject_27$1 || (templateObject_27$1 = __makeTemplateObject(["\n padding-left: ", ";\n"], ["\n padding-left: ", ";\n"])), semantic$a.space[500]);
3525
3749
  var StatusAnnouncement = /*#__PURE__*/styled__default.default.div.withConfig({
3526
3750
  displayName: "AgentInput__StatusAnnouncement",
3527
- componentId: "sc-fhl996-11"
3528
- })(templateObject_15$1 || (templateObject_15$1 = __makeTemplateObject([""], [""])));
3751
+ componentId: "sc-fhl996-16"
3752
+ })(templateObject_28$1 || (templateObject_28$1 = __makeTemplateObject([""], [""])));
3753
+ var StatusEnd = /*#__PURE__*/styled__default.default.div.withConfig({
3754
+ displayName: "AgentInput__StatusEnd",
3755
+ componentId: "sc-fhl996-17"
3756
+ })(templateObject_29$1 || (templateObject_29$1 = __makeTemplateObject(["\n display: inline-flex;\n align-items: center;\n gap: ", ";\n"], ["\n display: inline-flex;\n align-items: center;\n gap: ", ";\n"])), semantic$a.space[300]);
3757
+ var VisuallyHidden = /*#__PURE__*/styled__default.default.span.withConfig({
3758
+ displayName: "AgentInput__VisuallyHidden",
3759
+ componentId: "sc-fhl996-18"
3760
+ })(templateObject_30$1 || (templateObject_30$1 = __makeTemplateObject(["\n ", "\n"], ["\n ", "\n"])), visuallyHidden);
3529
3761
  var MeterContainer = /*#__PURE__*/styled__default.default.div.withConfig({
3530
3762
  displayName: "AgentInput__MeterContainer",
3531
- componentId: "sc-fhl996-12"
3532
- })(templateObject_16$1 || (templateObject_16$1 = __makeTemplateObject(["\n display: inline-flex;\n align-items: flex-end;\n gap: ", ";\n height: ", ";\n"], ["\n display: inline-flex;\n align-items: flex-end;\n gap: ", ";\n height: ", ";\n"])), semantic$a.space[100], semantic$a.space[400]);
3763
+ componentId: "sc-fhl996-19"
3764
+ })(templateObject_31$1 || (templateObject_31$1 = __makeTemplateObject(["\n display: inline-flex;\n align-items: flex-end;\n gap: ", ";\n height: ", ";\n"], ["\n display: inline-flex;\n align-items: flex-end;\n gap: ", ";\n height: ", ";\n"])), semantic$a.space[100], semantic$a.space[400]);
3533
3765
  var MeterBar = /*#__PURE__*/styled__default.default.div.withConfig({
3534
3766
  shouldForwardProp: function shouldForwardProp(prop) {
3535
3767
  return !prop.startsWith('$');
3536
3768
  },
3537
3769
  displayName: "AgentInput__MeterBar",
3538
- componentId: "sc-fhl996-13"
3539
- })(templateObject_17$1 || (templateObject_17$1 = __makeTemplateObject(["\n width: ", ";\n border-radius: ", ";\n background-color: ", ";\n height: ", ";\n transition: height ", " ", ";\n"], ["\n width: ", ";\n border-radius: ", ";\n background-color: ", ";\n height: ", ";\n transition: height ", " ", ";\n"])), semantic$a.space[100], semantic$a.radius.xs, semantic$a.color.fill.accent, function (_a) {
3770
+ componentId: "sc-fhl996-20"
3771
+ })(templateObject_32$1 || (templateObject_32$1 = __makeTemplateObject(["\n width: ", ";\n border-radius: ", ";\n background-color: ", ";\n height: ", ";\n transition: height ", " ", ";\n"], ["\n width: ", ";\n border-radius: ", ";\n background-color: ", ";\n height: ", ";\n transition: height ", " ", ";\n"])), semantic$a.space[100], semantic$a.radius.xs, semantic$a.color.fill.accent, function (_a) {
3540
3772
  var $height = _a.$height;
3541
3773
  return "".concat($height * 100, "%");
3542
3774
  }, semantic$a.motion.duration.fast, semantic$a.motion.easing.decelerate);
3543
3775
  var VisuallyHiddenLabel = /*#__PURE__*/styled__default.default.label.withConfig({
3544
3776
  displayName: "AgentInput__VisuallyHiddenLabel",
3545
- componentId: "sc-fhl996-14"
3546
- })(templateObject_18$1 || (templateObject_18$1 = __makeTemplateObject(["\n ", "\n"], ["\n ", "\n"])), visuallyHidden);
3777
+ componentId: "sc-fhl996-21"
3778
+ })(templateObject_33$1 || (templateObject_33$1 = __makeTemplateObject(["\n ", "\n"], ["\n ", "\n"])), visuallyHidden);
3547
3779
  function getInitialState(hasText) {
3548
3780
  return hasText ? 'typing' : 'idle';
3549
3781
  }
@@ -3551,60 +3783,104 @@ function createMeterBars(level) {
3551
3783
  var clampedLevel = Math.max(0, Math.min(level, 1));
3552
3784
  return [0.25 + clampedLevel * 0.75, 0.2 + clampedLevel * 0.6, 0.3 + clampedLevel * 0.7, 0.2 + clampedLevel * 0.5];
3553
3785
  }
3554
- var AgentInput = function AgentInput(_a) {
3786
+ // Declared separately so the react-hooks lint rules analyse it (they skip functions inline in forwardRef)
3787
+ // Development builds warn about props that break the pattern. Bundlers replace process.env.NODE_ENV
3788
+ // with a literal; without a bundler, a browser has no process, so reading it throws.
3789
+ function readIsProduction() {
3790
+ try {
3791
+ return process.env.NODE_ENV === 'production';
3792
+ } catch (_a) {
3793
+ return false;
3794
+ }
3795
+ }
3796
+ var isProduction = readIsProduction();
3797
+ // A part of the region above the field. It stays mounted while it fades out and its space closes.
3798
+ function RegionPart(_a) {
3799
+ var show = _a.show,
3800
+ reducedExit = _a.reducedExit,
3801
+ children = _a.children;
3802
+ var _b = usePresence(show, reducedExit ? EXIT_DURATION_MS : EXIT_DURATION_MS * 2),
3803
+ isPresent = _b.isPresent,
3804
+ isExiting = _b.isExiting;
3805
+ var ref = React.useRef(null);
3806
+ // Leaving controls drop out of the tab order and can't be activated
3807
+ useInert(ref, isExiting);
3808
+ if (!isPresent) return null;
3809
+ return jsxRuntime.jsx(RegionItem, {
3810
+ ref: ref,
3811
+ "$exiting": isExiting,
3812
+ "$reducedExit": reducedExit,
3813
+ "aria-hidden": isExiting || undefined,
3814
+ children: jsxRuntime.jsx(RegionItemContent, {
3815
+ children: children
3816
+ })
3817
+ });
3818
+ }
3819
+ function AgentInputWithRef(_a, ref) {
3820
+ var _this = this;
3821
+ var _b;
3555
3822
  var value = _a.value,
3556
- _b = _a.defaultValue,
3557
- defaultValue = _b === void 0 ? '' : _b,
3823
+ _c = _a.defaultValue,
3824
+ defaultValue = _c === void 0 ? '' : _c,
3558
3825
  onChange = _a.onChange,
3559
3826
  onSubmit = _a.onSubmit,
3560
- _c = _a.placeholder,
3561
- placeholder = _c === void 0 ? 'Ask a question' : _c,
3562
- _d = _a.disabled,
3563
- disabled = _d === void 0 ? false : _d,
3827
+ onStop = _a.onStop,
3828
+ review = _a.review,
3829
+ suggestions = _a.suggestions,
3830
+ onSuggestionSelect = _a.onSuggestionSelect,
3831
+ _d = _a.placeholder,
3832
+ placeholder = _d === void 0 ? 'Ask a question' : _d,
3833
+ maxLength = _a.maxLength,
3834
+ _e = _a.disabled,
3835
+ disabled = _e === void 0 ? false : _e,
3564
3836
  isSubmitting = _a.isSubmitting,
3565
- _e = _a.enableVoice,
3566
- enableVoice = _e === void 0 ? true : _e,
3567
- _f = _a.autoSubmitOnVoiceFinal,
3568
- autoSubmitOnVoiceFinal = _f === void 0 ? true : _f,
3569
- _g = _a.voiceLanguage,
3570
- voiceLanguage = _g === void 0 ? 'en-AU' : _g,
3571
- _h = _a.noSpeechTimeoutMs,
3572
- noSpeechTimeoutMs = _h === void 0 ? 8000 : _h,
3837
+ _f = _a.enableVoice,
3838
+ enableVoice = _f === void 0 ? true : _f,
3839
+ _g = _a.autoSubmitOnVoiceFinal,
3840
+ autoSubmitOnVoiceFinal = _g === void 0 ? true : _g,
3841
+ _h = _a.voiceLanguage,
3842
+ voiceLanguage = _h === void 0 ? 'en-AU' : _h,
3843
+ _j = _a.noSpeechTimeoutMs,
3844
+ noSpeechTimeoutMs = _j === void 0 ? 8000 : _j,
3573
3845
  onVoiceStart = _a.onVoiceStart,
3574
3846
  onVoiceStop = _a.onVoiceStop,
3575
3847
  onVoiceInterim = _a.onVoiceInterim,
3576
3848
  onVoiceFinal = _a.onVoiceFinal,
3577
3849
  onVoiceError = _a.onVoiceError,
3850
+ _k = _a.helperText,
3851
+ helperText = _k === void 0 ? '' : _k,
3578
3852
  statusMessage = _a.statusMessage,
3579
3853
  errorMessage = _a.errorMessage,
3580
- _j = _a.label,
3581
- label = _j === void 0 ? 'Agent input' : _j,
3854
+ _l = _a.label,
3855
+ label = _l === void 0 ? 'Agent input' : _l,
3856
+ _m = _a.docked,
3857
+ docked = _m === void 0 ? false : _m,
3582
3858
  dataTestId = _a["data-testid"];
3583
3859
  var isControlled = value !== undefined;
3584
- var _k = React.useState(defaultValue),
3585
- internalValue = _k[0],
3586
- setInternalValue = _k[1];
3587
- var _l = React.useState(getInitialState(normalizeTranscript(value !== null && value !== void 0 ? value : defaultValue).length > 0)),
3588
- machineState = _l[0],
3589
- setMachineState = _l[1];
3590
- var _m = React.useState(''),
3591
- interimTranscript = _m[0],
3592
- setInterimTranscript = _m[1];
3593
- var _o = React.useState(false),
3594
- internalSubmitting = _o[0],
3595
- setInternalSubmitting = _o[1];
3596
- var _p = React.useState(undefined),
3597
- internalErrorMessage = _p[0],
3598
- setInternalErrorMessage = _p[1];
3599
- var _q = React.useState(false),
3600
- voiceSupported = _q[0],
3601
- setVoiceSupported = _q[1];
3860
+ var _o = React.useState(defaultValue),
3861
+ internalValue = _o[0],
3862
+ setInternalValue = _o[1];
3863
+ var _p = React.useState(getInitialState(normalizeTranscript(value !== null && value !== void 0 ? value : defaultValue).length > 0)),
3864
+ machineState = _p[0],
3865
+ setMachineState = _p[1];
3866
+ var _q = React.useState(''),
3867
+ interimTranscript = _q[0],
3868
+ setInterimTranscript = _q[1];
3602
3869
  var _r = React.useState(false),
3603
- prefersReducedMotion = _r[0],
3604
- setPrefersReducedMotion = _r[1];
3605
- var _s = React.useState(0),
3606
- meterLevel = _s[0],
3607
- setMeterLevel = _s[1];
3870
+ internalSubmitting = _r[0],
3871
+ setInternalSubmitting = _r[1];
3872
+ var _s = React.useState(undefined),
3873
+ internalErrorMessage = _s[0],
3874
+ setInternalErrorMessage = _s[1];
3875
+ var _t = React.useState(false),
3876
+ voiceSupported = _t[0],
3877
+ setVoiceSupported = _t[1];
3878
+ var _u = React.useState(false),
3879
+ prefersReducedMotion = _u[0],
3880
+ setPrefersReducedMotion = _u[1];
3881
+ var _v = React.useState(0),
3882
+ meterLevel = _v[0],
3883
+ setMeterLevel = _v[1];
3608
3884
  var recognitionRef = React.useRef(null);
3609
3885
  var noSpeechTimeoutRef = React.useRef(null);
3610
3886
  var isStoppingRef = React.useRef(false);
@@ -3612,10 +3888,19 @@ var AgentInput = function AgentInput(_a) {
3612
3888
  var audioStreamRef = React.useRef(null);
3613
3889
  var audioContextRef = React.useRef(null);
3614
3890
  var meterRafRef = React.useRef(null);
3891
+ var inputRef = React.useRef(null);
3615
3892
  var inputId = React.useId();
3616
3893
  var statusId = "".concat(inputId, "-status");
3894
+ var counterId = "".concat(inputId, "-counter");
3617
3895
  var currentValue = isControlled ? value !== null && value !== void 0 ? value : '' : internalValue;
3896
+ // Read after onSubmit settles, when the closure's value may be stale
3897
+ var currentValueRef = React.useRef(currentValue);
3898
+ React.useEffect(function () {
3899
+ currentValueRef.current = currentValue;
3900
+ }, [currentValue]);
3618
3901
  var hasText = normalizeTranscript(currentValue).length > 0;
3902
+ var messageLength = normalizeMessage(currentValue).length;
3903
+ var isOverLimit = maxLength !== undefined && messageLength > maxLength;
3619
3904
  var effectiveSubmitting = isSubmitting !== null && isSubmitting !== void 0 ? isSubmitting : internalSubmitting;
3620
3905
  var effectiveState = disabled ? 'disabled' : machineState;
3621
3906
  var isListening = effectiveState === 'listening';
@@ -3638,7 +3923,7 @@ var AgentInput = function AgentInput(_a) {
3638
3923
  }
3639
3924
  }, []);
3640
3925
  var stopMeter = React.useCallback(function () {
3641
- return __awaiter(void 0, void 0, void 0, function () {
3926
+ return __awaiter(_this, void 0, void 0, function () {
3642
3927
  return __generator(this, function (_a) {
3643
3928
  switch (_a.label) {
3644
3929
  case 0:
@@ -3666,7 +3951,7 @@ var AgentInput = function AgentInput(_a) {
3666
3951
  });
3667
3952
  }, []);
3668
3953
  var startMeter = React.useCallback(function () {
3669
- return __awaiter(void 0, void 0, void 0, function () {
3954
+ return __awaiter(_this, void 0, void 0, function () {
3670
3955
  var stream, audioContext, analyser_1, source, data_1, _loop_;
3671
3956
  var _b;
3672
3957
  return __generator(this, function (_c) {
@@ -3727,15 +4012,22 @@ var AgentInput = function AgentInput(_a) {
3727
4012
  });
3728
4013
  }, [onVoiceError, updateMachineState]);
3729
4014
  var submitPayload = React.useCallback(function (rawText, source) {
3730
- return __awaiter(void 0, void 0, void 0, function () {
4015
+ return __awaiter(_this, void 0, void 0, function () {
3731
4016
  var text;
3732
4017
  return __generator(this, function (_b) {
3733
4018
  switch (_b.label) {
3734
4019
  case 0:
3735
- text = normalizeTranscript(rawText);
4020
+ text = source === 'text' ? normalizeMessage(rawText) : normalizeTranscript(rawText);
3736
4021
  if (!text || disabled || effectiveSubmitting) {
3737
4022
  return [2 /*return*/];
3738
4023
  }
4024
+ if (maxLength !== undefined && text.length > maxLength) {
4025
+ // A long transcript goes into the field to be shortened, unless the user has typed since
4026
+ if (source === 'voice-final' && !normalizeMessage(currentValueRef.current)) {
4027
+ updateValue(text);
4028
+ }
4029
+ return [2 /*return*/];
4030
+ }
3739
4031
  updateMachineState({
3740
4032
  type: 'SUBMIT'
3741
4033
  });
@@ -3757,14 +4049,18 @@ var AgentInput = function AgentInput(_a) {
3757
4049
  type: 'SUBMIT_SUCCESS'
3758
4050
  });
3759
4051
  setInterimTranscript('');
3760
- updateValue('');
4052
+ // Keep a follow-up typed while submitting
4053
+ if (normalizeMessage(currentValueRef.current) === text) {
4054
+ updateValue('');
4055
+ }
3761
4056
  return [3 /*break*/, 5];
3762
4057
  case 3:
3763
4058
  _b.sent();
3764
4059
  updateMachineState({
3765
4060
  type: 'SUBMIT_ERROR'
3766
4061
  });
3767
- if (source === 'voice-final') {
4062
+ // Restore the transcript unless the user has typed something since
4063
+ if (source === 'voice-final' && !normalizeMessage(currentValueRef.current)) {
3768
4064
  updateValue(text);
3769
4065
  }
3770
4066
  setInternalErrorMessage('Submission failed. Please try again.');
@@ -3779,13 +4075,13 @@ var AgentInput = function AgentInput(_a) {
3779
4075
  }
3780
4076
  });
3781
4077
  });
3782
- }, [disabled, effectiveSubmitting, isSubmitting, onSubmit, updateMachineState, updateValue]);
4078
+ }, [disabled, effectiveSubmitting, isSubmitting, maxLength, onSubmit, updateMachineState, updateValue]);
3783
4079
  var stopListening = React.useCallback(function (emitStopEvent_1) {
3784
4080
  var args_1 = [];
3785
4081
  for (var _i = 1; _i < arguments.length; _i++) {
3786
4082
  args_1[_i - 1] = arguments[_i];
3787
4083
  }
3788
- return __awaiter(void 0, __spreadArray([emitStopEvent_1], args_1, true), void 0, function (emitStopEvent, preserveState) {
4084
+ return __awaiter(_this, __spreadArray([emitStopEvent_1], args_1, true), void 0, function (emitStopEvent, preserveState) {
3789
4085
  if (preserveState === void 0) {
3790
4086
  preserveState = false;
3791
4087
  }
@@ -3821,7 +4117,7 @@ var AgentInput = function AgentInput(_a) {
3821
4117
  });
3822
4118
  }, [clearNoSpeechTimeout, hasText, onVoiceStop, stopMeter, updateMachineState]);
3823
4119
  var onNoSpeechTimeout = React.useCallback(function () {
3824
- return __awaiter(void 0, void 0, void 0, function () {
4120
+ return __awaiter(_this, void 0, void 0, function () {
3825
4121
  var message;
3826
4122
  return __generator(this, function (_a) {
3827
4123
  switch (_a.label) {
@@ -3845,7 +4141,7 @@ var AgentInput = function AgentInput(_a) {
3845
4141
  });
3846
4142
  }, [clearNoSpeechTimeout, onVoiceError, stopListening, updateMachineState]);
3847
4143
  var beginListening = React.useCallback(function () {
3848
- return __awaiter(void 0, void 0, void 0, function () {
4144
+ return __awaiter(_this, void 0, void 0, function () {
3849
4145
  return __generator(this, function (_b) {
3850
4146
  switch (_b.label) {
3851
4147
  case 0:
@@ -3889,7 +4185,7 @@ var AgentInput = function AgentInput(_a) {
3889
4185
  recognition.interimResults = true;
3890
4186
  recognition.continuous = false;
3891
4187
  recognition.onresult = function (event) {
3892
- return __awaiter(void 0, void 0, void 0, function () {
4188
+ return __awaiter(_this, void 0, void 0, function () {
3893
4189
  var interim, finalText, index, result, normalizedInterim, normalizedFinal;
3894
4190
  return __generator(this, function (_a) {
3895
4191
  switch (_a.label) {
@@ -3947,7 +4243,7 @@ var AgentInput = function AgentInput(_a) {
3947
4243
  });
3948
4244
  };
3949
4245
  recognition.onerror = function (event) {
3950
- return __awaiter(void 0, void 0, void 0, function () {
4246
+ return __awaiter(_this, void 0, void 0, function () {
3951
4247
  var mappedCode;
3952
4248
  return __generator(this, function (_a) {
3953
4249
  switch (_a.label) {
@@ -3963,7 +4259,7 @@ var AgentInput = function AgentInput(_a) {
3963
4259
  });
3964
4260
  };
3965
4261
  recognition.onend = function () {
3966
- return __awaiter(void 0, void 0, void 0, function () {
4262
+ return __awaiter(_this, void 0, void 0, function () {
3967
4263
  return __generator(this, function (_a) {
3968
4264
  switch (_a.label) {
3969
4265
  case 0:
@@ -3992,6 +4288,95 @@ var AgentInput = function AgentInput(_a) {
3992
4288
  stopMeter();
3993
4289
  };
3994
4290
  }, [autoSubmitOnVoiceFinal, clearNoSpeechTimeout, emitVoiceError, enableVoice, hasText, noSpeechTimeoutMs, onNoSpeechTimeout, onVoiceFinal, onVoiceInterim, stopListening, stopMeter, submitPayload, updateMachineState, updateValue, voiceLanguage]);
4291
+ var focusField = React.useCallback(function (cursor) {
4292
+ var input = inputRef.current;
4293
+ if (!input) return;
4294
+ input.focus();
4295
+ if (!cursor) return;
4296
+ var placeCursor = function placeCursor() {
4297
+ if (cursor === 'all') {
4298
+ input.select();
4299
+ return;
4300
+ }
4301
+ var position = cursor === 'start' ? 0 : input.value.length;
4302
+ input.setSelectionRange(position, position);
4303
+ };
4304
+ placeCursor();
4305
+ // Again after the render a prefill in the same handler triggers, so 'end' lands after the new text
4306
+ window.setTimeout(placeCursor, 0);
4307
+ }, []);
4308
+ React.useImperativeHandle(ref, function () {
4309
+ return {
4310
+ focus: function focus(options) {
4311
+ return focusField(options === null || options === void 0 ? void 0 : options.cursor);
4312
+ },
4313
+ clear: function clear() {
4314
+ setInterimTranscript('');
4315
+ updateValue('');
4316
+ }
4317
+ };
4318
+ }, [focusField, updateValue]);
4319
+ // The region above the field (decision 0046). The last review and suggestions shown are kept, so
4320
+ // they can fade out after the product removes them.
4321
+ var _w = React.useState(review),
4322
+ shownReview = _w[0],
4323
+ setShownReview = _w[1];
4324
+ var _x = React.useState(null),
4325
+ lastReviewAction = _x[0],
4326
+ setLastReviewAction = _x[1];
4327
+ if (review && review !== shownReview) {
4328
+ setShownReview(review);
4329
+ // A new proposal or change replaces what the last Discard or Undo announced
4330
+ if (lastReviewAction) setLastReviewAction(null);
4331
+ }
4332
+ // A proposal replacing an open one is announced as an update (decision 0047). Consecutive
4333
+ // replacements alternate a trailing no-break space, so the live region's text changes each time
4334
+ // even when the summary doesn't; screen readers don't speak it.
4335
+ var openProposalId = (review === null || review === void 0 ? void 0 : review.state) === 'proposal' ? review.id : null;
4336
+ var _y = React.useState(openProposalId),
4337
+ announcedProposalId = _y[0],
4338
+ setAnnouncedProposalId = _y[1];
4339
+ var _z = React.useState(0),
4340
+ replacementCount = _z[0],
4341
+ setReplacementCount = _z[1];
4342
+ if (openProposalId !== announcedProposalId) {
4343
+ setAnnouncedProposalId(openProposalId);
4344
+ setReplacementCount(openProposalId !== null && announcedProposalId !== null ? replacementCount + 1 : 0);
4345
+ }
4346
+ var cappedSuggestions = React.useMemo(function () {
4347
+ return (suggestions !== null && suggestions !== void 0 ? suggestions : []).slice(0, MAX_SUGGESTIONS);
4348
+ }, [suggestions]);
4349
+ var showSuggestions = cappedSuggestions.length > 0 && !hasText && (review === null || review === void 0 ? void 0 : review.state) !== 'proposal';
4350
+ var _0 = React.useState(cappedSuggestions),
4351
+ shownSuggestions = _0[0],
4352
+ setShownSuggestions = _0[1];
4353
+ if (showSuggestions && cappedSuggestions !== shownSuggestions) {
4354
+ setShownSuggestions(cappedSuggestions);
4355
+ }
4356
+ var suggestionCount = (_b = suggestions === null || suggestions === void 0 ? void 0 : suggestions.length) !== null && _b !== void 0 ? _b : 0;
4357
+ React.useEffect(function () {
4358
+ if (!isProduction && suggestionCount > MAX_SUGGESTIONS) {
4359
+ console.warn("AgentInput shows at most ".concat(MAX_SUGGESTIONS, " suggestions (decision 0046); ").concat(suggestionCount, " were passed, so the rest are hidden."));
4360
+ }
4361
+ }, [suggestionCount]);
4362
+ var reviewAnnouncement = review ? review.state === 'proposal' ? "".concat(replacementCount > 0 ? 'Proposal updated. ' : '').concat(review.summary, ". Accept or discard.").concat(replacementCount > 0 && replacementCount % 2 === 0 ? "\xA0" : '') : 'Changes applied. Undo available.' : lastReviewAction === 'discarded' ? 'Suggestion discarded.' : lastReviewAction === 'undone' ? 'Changes undone.' : '';
4363
+ var onReviewDiscard = function onReviewDiscard(onDiscard) {
4364
+ setLastReviewAction('discarded');
4365
+ onDiscard();
4366
+ // The bar is leaving, so focus goes to the field rather than being lost
4367
+ focusField();
4368
+ };
4369
+ var onReviewUndo = function onReviewUndo(onUndo) {
4370
+ setLastReviewAction('undone');
4371
+ onUndo();
4372
+ focusField();
4373
+ };
4374
+ var onPickSuggestion = function onPickSuggestion(text) {
4375
+ updateValue(text);
4376
+ onSuggestionSelect === null || onSuggestionSelect === void 0 ? void 0 : onSuggestionSelect(text);
4377
+ // Fills, never sends: the user reviews the text in the field first
4378
+ focusField('end');
4379
+ };
3995
4380
  React.useEffect(function () {
3996
4381
  var mediaQuery = window.matchMedia('(prefers-reduced-motion: reduce)');
3997
4382
  var sync = function sync() {
@@ -4023,8 +4408,40 @@ var AgentInput = function AgentInput(_a) {
4023
4408
  if (!interimTranscript) {
4024
4409
  return currentValue;
4025
4410
  }
4026
- return normalizeTranscript([currentValue, interimTranscript].filter(Boolean).join(' '));
4411
+ return normalizeMessage([currentValue, interimTranscript].filter(Boolean).join(' '));
4027
4412
  }, [currentValue, interimTranscript]);
4413
+ var lastFieldWidthRef = React.useRef(0);
4414
+ var resizeField = React.useCallback(function () {
4415
+ var field = inputRef.current;
4416
+ // Hidden (for example in a closed sheet): measure when it's shown, via the observer below
4417
+ if (!field || field.clientWidth === 0) return;
4418
+ lastFieldWidthRef.current = field.clientWidth;
4419
+ // Collapsing the field to measure it shrinks the page for a moment; some engines clamp a page
4420
+ // scrolled to the bottom when that happens, so restore its scroll position
4421
+ var scrollX = window.scrollX,
4422
+ scrollY = window.scrollY;
4423
+ field.style.height = 'auto';
4424
+ field.style.height = "".concat(field.scrollHeight, "px");
4425
+ if (window.scrollY !== scrollY) window.scrollTo(scrollX, scrollY);
4426
+ // Scroll only once max-height (six rows) clips the content
4427
+ field.style.overflowY = field.scrollHeight > field.clientHeight ? 'auto' : 'hidden';
4428
+ }, []);
4429
+ useIsomorphicLayoutEffect(function () {
4430
+ resizeField();
4431
+ }, [displayedValue, resizeField]);
4432
+ // Text rewraps when the field's width changes (layout, or being shown), not only the window's
4433
+ React.useEffect(function () {
4434
+ var field = inputRef.current;
4435
+ if (!field || typeof ResizeObserver === 'undefined') return;
4436
+ var observer = new ResizeObserver(function () {
4437
+ // Its own height changes trigger this too; only a width change can rewrap the text
4438
+ if (field.clientWidth !== lastFieldWidthRef.current) resizeField();
4439
+ });
4440
+ observer.observe(field);
4441
+ return function () {
4442
+ return observer.disconnect();
4443
+ };
4444
+ }, [resizeField]);
4028
4445
  var onTextChange = function onTextChange(event) {
4029
4446
  updateValue(event.target.value);
4030
4447
  if (effectiveState === 'error') {
@@ -4036,10 +4453,18 @@ var AgentInput = function AgentInput(_a) {
4036
4453
  }
4037
4454
  };
4038
4455
  var onInputKeyDown = function onInputKeyDown(event) {
4039
- return __awaiter(void 0, void 0, void 0, function () {
4456
+ return __awaiter(_this, void 0, void 0, function () {
4457
+ var isComposing;
4040
4458
  return __generator(this, function (_a) {
4041
4459
  switch (_a.label) {
4042
4460
  case 0:
4461
+ isComposing = event.nativeEvent.isComposing || event.keyCode === 229;
4462
+ // Escape during an IME composition cancels the composition, not the request
4463
+ if (event.key === 'Escape' && onStop && effectiveSubmitting && !isComposing) {
4464
+ event.preventDefault();
4465
+ onStop();
4466
+ return [2 /*return*/];
4467
+ }
4043
4468
  if (!(event.key === 'Escape' && isListening)) return [3 /*break*/, 2];
4044
4469
  event.preventDefault();
4045
4470
  return [4 /*yield*/, stopListening(true)];
@@ -4047,7 +4472,7 @@ var AgentInput = function AgentInput(_a) {
4047
4472
  _a.sent();
4048
4473
  return [2 /*return*/];
4049
4474
  case 2:
4050
- if (!(event.key === 'Enter')) return [3 /*break*/, 4];
4475
+ if (!(event.key === 'Enter' && !event.shiftKey && !isComposing)) return [3 /*break*/, 4];
4051
4476
  event.preventDefault();
4052
4477
  return [4 /*yield*/, submitPayload(currentValue, 'text')];
4053
4478
  case 3:
@@ -4060,7 +4485,7 @@ var AgentInput = function AgentInput(_a) {
4060
4485
  });
4061
4486
  };
4062
4487
  var onMicToggle = function onMicToggle() {
4063
- return __awaiter(void 0, void 0, void 0, function () {
4488
+ return __awaiter(_this, void 0, void 0, function () {
4064
4489
  return __generator(this, function (_a) {
4065
4490
  switch (_a.label) {
4066
4491
  case 0:
@@ -4080,40 +4505,105 @@ var AgentInput = function AgentInput(_a) {
4080
4505
  });
4081
4506
  };
4082
4507
  var statusByState = {
4083
- idle: statusMessage || DEFAULT_IDLE_HELPER,
4084
- typing: statusMessage || DEFAULT_IDLE_HELPER,
4508
+ idle: statusMessage || helperText,
4509
+ typing: statusMessage || helperText,
4085
4510
  listening: statusMessage || DEFAULT_LISTENING_MESSAGE,
4086
4511
  processingFinalTranscript: statusMessage || DEFAULT_PROCESSING_MESSAGE,
4087
4512
  submitting: statusMessage || 'Submitting…',
4088
4513
  error: errorMessage || internalErrorMessage || 'Voice input failed. Try again.',
4089
- disabled: statusMessage || DEFAULT_IDLE_HELPER
4514
+ disabled: statusMessage || helperText
4090
4515
  };
4091
- var unsupportedMessage = defaultVoiceErrorMessage('not-supported');
4092
- var shouldShowUnsupported = enableVoice && !hasVoice;
4093
- var resolvedStatus = shouldShowUnsupported ? unsupportedMessage : statusByState[effectiveState];
4094
- var isStatusError = effectiveState === 'error' || shouldShowUnsupported;
4516
+ var overLimitMessage = isOverLimit && maxLength !== undefined ? "Over the ".concat(maxLength, "-character limit. Shorten your message to send.") : undefined;
4517
+ // A product-set error shows in any state. Unsupported voice hides the mic without a message.
4518
+ var resolvedStatus = errorMessage || overLimitMessage || statusByState[effectiveState];
4519
+ var isStatusError = Boolean(errorMessage) || isOverLimit || effectiveState === 'error';
4095
4520
  var meterBars = createMeterBars(meterLevel);
4096
- var sendDisabled = disabled || effectiveSubmitting || normalizeTranscript(currentValue).length === 0;
4521
+ var showStop = Boolean(onStop) && effectiveSubmitting;
4522
+ var sendDisabled = disabled || effectiveSubmitting || isOverLimit || messageLength === 0;
4523
+ var showCounter = maxLength !== undefined && messageLength >= maxLength * COUNTER_THRESHOLD;
4524
+ // Announced once when the limit is reached; going over is announced by the status line
4525
+ var limitAnnouncement = maxLength !== undefined && messageLength === maxLength ? "Character limit reached: ".concat(maxLength, " characters") : '';
4097
4526
  return jsxRuntime.jsxs(Container, {
4098
4527
  "data-testid": dataTestId,
4528
+ "$docked": docked,
4529
+ "data-docked": docked || undefined,
4099
4530
  children: [jsxRuntime.jsx(VisuallyHiddenLabel, {
4100
4531
  htmlFor: inputId,
4101
4532
  children: label
4102
- }), jsxRuntime.jsx(ControlsRow, {
4103
- children: jsxRuntime.jsx(InputWrapper, {
4533
+ }), jsxRuntime.jsxs(ControlsRow, {
4534
+ children: [jsxRuntime.jsx(RegionPart, {
4535
+ show: Boolean(review),
4536
+ reducedExit: prefersReducedMotion,
4537
+ children: shownReview && jsxRuntime.jsxs(ReviewBar, {
4538
+ "data-testid": "agent-input-review",
4539
+ children: [jsxRuntime.jsx(Typography, {
4540
+ variant: "small",
4541
+ color: "default",
4542
+ children: shownReview.state === 'proposal' ? shownReview.summary : 'Changes applied'
4543
+ }), jsxRuntime.jsx(ReviewActions, {
4544
+ children: shownReview.state === 'proposal' ? jsxRuntime.jsxs(jsxRuntime.Fragment, {
4545
+ children: [jsxRuntime.jsx(Button, {
4546
+ variant: "primary",
4547
+ size: "small",
4548
+ onClick: shownReview.onAccept,
4549
+ children: "Accept"
4550
+ }), jsxRuntime.jsx(Button, {
4551
+ variant: "secondary",
4552
+ size: "small",
4553
+ onClick: function onClick() {
4554
+ return onReviewDiscard(shownReview.onDiscard);
4555
+ },
4556
+ children: "Discard"
4557
+ })]
4558
+ }) : jsxRuntime.jsx(Button, {
4559
+ variant: "naked",
4560
+ size: "small",
4561
+ onClick: function onClick() {
4562
+ return onReviewUndo(shownReview.onUndo);
4563
+ },
4564
+ children: "Undo"
4565
+ })
4566
+ })]
4567
+ })
4568
+ }), jsxRuntime.jsx(RegionPart, {
4569
+ show: showSuggestions,
4570
+ reducedExit: prefersReducedMotion,
4571
+ children: jsxRuntime.jsx(SuggestionList, {
4572
+ "aria-label": "Suggestions",
4573
+ "data-testid": "agent-input-suggestions",
4574
+ children: shownSuggestions.map(function (suggestion, index) {
4575
+ return jsxRuntime.jsx("li", {
4576
+ children: jsxRuntime.jsx(SuggestionChip, {
4577
+ onClick: function onClick() {
4578
+ return onPickSuggestion(suggestion);
4579
+ },
4580
+ children: suggestion
4581
+ })
4582
+ }, "".concat(index, "-").concat(suggestion));
4583
+ })
4584
+ })
4585
+ }), jsxRuntime.jsx(VisuallyHidden, {
4586
+ "aria-live": "polite",
4587
+ "aria-atomic": "true",
4588
+ "data-testid": "agent-input-review-announcement",
4589
+ children: reviewAnnouncement
4590
+ }), jsxRuntime.jsx(InputWrapper, {
4104
4591
  children: jsxRuntime.jsxs(InputShell, {
4105
- "data-disabled": disabled || effectiveSubmitting,
4592
+ "data-disabled": disabled,
4106
4593
  children: [jsxRuntime.jsx(Input, {
4594
+ ref: inputRef,
4107
4595
  id: inputId,
4108
- type: "text",
4596
+ rows: 1,
4597
+ enterKeyHint: "send",
4109
4598
  "aria-label": label,
4110
4599
  value: displayedValue,
4111
4600
  onChange: onTextChange,
4112
4601
  onKeyDown: onInputKeyDown,
4113
4602
  placeholder: placeholder,
4114
- disabled: disabled || effectiveSubmitting,
4603
+ disabled: disabled,
4115
4604
  readOnly: isListening,
4116
- "aria-describedby": statusId
4605
+ "aria-describedby": showCounter ? "".concat(statusId, " ").concat(counterId) : statusId,
4606
+ "aria-invalid": isOverLimit || undefined
4117
4607
  }), jsxRuntime.jsxs(InputActions, {
4118
4608
  children: [hasVoice && jsxRuntime.jsxs(MicButtonWrapper, {
4119
4609
  "$isListening": isListening,
@@ -4133,7 +4623,17 @@ var AgentInput = function AgentInput(_a) {
4133
4623
  disabled: disabled || effectiveSubmitting,
4134
4624
  type: "button"
4135
4625
  })]
4136
- }), jsxRuntime.jsx(CircularActionIconButton, {
4626
+ }), showStop ? jsxRuntime.jsx(CircularActionIconButton, {
4627
+ variant: "secondary",
4628
+ size: "medium",
4629
+ iconName: "stop",
4630
+ onClick: function onClick() {
4631
+ return onStop === null || onStop === void 0 ? void 0 : onStop();
4632
+ },
4633
+ disabled: disabled,
4634
+ "aria-label": "Stop",
4635
+ type: "button"
4636
+ }) : jsxRuntime.jsx(CircularActionIconButton, {
4137
4637
  variant: "secondary",
4138
4638
  size: "medium",
4139
4639
  iconName: "directionUp",
@@ -4146,7 +4646,7 @@ var AgentInput = function AgentInput(_a) {
4146
4646
  })]
4147
4647
  })]
4148
4648
  })
4149
- })
4649
+ })]
4150
4650
  }), jsxRuntime.jsxs(StatusRow, {
4151
4651
  children: [jsxRuntime.jsx(StatusText, {
4152
4652
  "$isError": isStatusError,
@@ -4155,24 +4655,44 @@ var AgentInput = function AgentInput(_a) {
4155
4655
  role: "status",
4156
4656
  "aria-live": "polite",
4157
4657
  "aria-atomic": "true",
4158
- children: jsxRuntime.jsx(Typography, {
4658
+ children: resolvedStatus && jsxRuntime.jsx(Typography, {
4159
4659
  variant: "small",
4160
4660
  color: isStatusError ? 'error' : 'subdued',
4161
4661
  children: resolvedStatus
4162
4662
  })
4163
4663
  })
4164
- }), isListening && !prefersReducedMotion && jsxRuntime.jsx(MeterContainer, {
4165
- "aria-hidden": "true",
4166
- children: meterBars.map(function (barHeight, index) {
4167
- return jsxRuntime.jsx(MeterBar, {
4168
- "$height": barHeight
4169
- }, "meter-".concat(index));
4170
- })
4664
+ }), jsxRuntime.jsxs(StatusEnd, {
4665
+ children: [isListening && !prefersReducedMotion && jsxRuntime.jsx(MeterContainer, {
4666
+ "aria-hidden": "true",
4667
+ children: meterBars.map(function (barHeight, index) {
4668
+ return jsxRuntime.jsx(MeterBar, {
4669
+ "$height": barHeight
4670
+ }, "meter-".concat(index));
4671
+ })
4672
+ }), showCounter && jsxRuntime.jsx(Typography, {
4673
+ variant: "small",
4674
+ color: isOverLimit ? 'error' : 'subdued',
4675
+ children: jsxRuntime.jsxs("span", {
4676
+ id: counterId,
4677
+ "data-testid": "agent-input-counter",
4678
+ children: [messageLength, "/", maxLength, jsxRuntime.jsx(VisuallyHidden, {
4679
+ children: " characters"
4680
+ })]
4681
+ })
4682
+ })]
4683
+ }), maxLength !== undefined && jsxRuntime.jsx(VisuallyHidden, {
4684
+ role: "status",
4685
+ "aria-live": "polite",
4686
+ "aria-atomic": "true",
4687
+ "data-testid": "agent-input-limit-announcement",
4688
+ children: limitAnnouncement
4171
4689
  })]
4172
4690
  })]
4173
4691
  });
4174
- };
4175
- var templateObject_1$q, templateObject_2$l, templateObject_3$k, templateObject_4$f, templateObject_5$c, templateObject_6$9, templateObject_7$7, templateObject_8$6, templateObject_9$5, templateObject_10$3, templateObject_11$3, templateObject_12$3, templateObject_13$3, templateObject_14$1, templateObject_15$1, templateObject_16$1, templateObject_17$1, templateObject_18$1;
4692
+ }
4693
+ var AgentInput = /*#__PURE__*/React.forwardRef(AgentInputWithRef);
4694
+ AgentInput.displayName = 'AgentInput';
4695
+ var templateObject_1$q, templateObject_2$l, templateObject_3$k, templateObject_4$f, templateObject_5$c, templateObject_6$9, templateObject_7$7, templateObject_8$6, templateObject_9$5, templateObject_10$3, templateObject_11$3, templateObject_12$3, templateObject_13$3, templateObject_14$1, templateObject_15$1, templateObject_16$1, templateObject_17$1, templateObject_18$1, templateObject_19$1, templateObject_20$1, templateObject_21$1, templateObject_22$1, templateObject_23$1, templateObject_24$1, templateObject_25$1, templateObject_26$1, templateObject_27$1, templateObject_28$1, templateObject_29$1, templateObject_30$1, templateObject_31$1, templateObject_32$1, templateObject_33$1;
4176
4696
 
4177
4697
  var semantic$9 = tokens.semantic;
4178
4698
  var alert = tokens.component.alert;
@@ -4199,11 +4719,12 @@ var fadeOut = styled.keyframes(templateObject_2$k || (templateObject_2$k = __mak
4199
4719
  // The generated names of the two exits (full, and reduced motion)
4200
4720
  var EXIT_ANIMATION_NAMES = [fadeThenCollapse.getName(), fadeOut.getName()];
4201
4721
  // Default icons by variant
4722
+ // Each severity's status icon (decision 0045): decorative, because the title and message say it
4202
4723
  var variantIcons$1 = {
4203
- error: 'crossCircle',
4204
- warning: 'bell',
4205
- info: 'info',
4206
- success: 'checkRing'
4724
+ error: 'statusError',
4725
+ warning: 'statusWarning',
4726
+ info: 'statusInfo',
4727
+ success: 'statusSuccess'
4207
4728
  };
4208
4729
  // Icon colors by variant (using semantic icon color tokens)
4209
4730
  var variantIconColors = {
@@ -4448,11 +4969,12 @@ var semantic$8 = tokens.semantic;
4448
4969
  var color$2 = semantic$8.color,
4449
4970
  typography = semantic$8.typography,
4450
4971
  size = semantic$8.size;
4972
+ // Each severity's status icon and, at the small size, its shape (decision 0045)
4451
4973
  var variantIcons = {
4452
- error: 'crossCircle',
4453
- warning: 'bell',
4454
- info: 'info',
4455
- success: 'checkRing'
4974
+ error: 'statusError',
4975
+ warning: 'statusWarning',
4976
+ info: 'statusInfo',
4977
+ success: 'statusSuccess'
4456
4978
  };
4457
4979
  var variantTextColors = {
4458
4980
  error: color$2.text.danger,
@@ -4460,6 +4982,12 @@ var variantTextColors = {
4460
4982
  info: color$2.text.accent,
4461
4983
  success: color$2.text.success
4462
4984
  };
4985
+ var variantShapes = {
4986
+ error: 'error',
4987
+ warning: 'warning',
4988
+ info: 'info',
4989
+ success: 'success'
4990
+ };
4463
4991
  var sizeConfig = {
4464
4992
  small: {
4465
4993
  font: typography.caption,
@@ -4560,7 +5088,9 @@ var InlineAlert = function InlineAlert(_a) {
4560
5088
  children: hasMessage && jsxRuntime.jsxs(jsxRuntime.Fragment, {
4561
5089
  children: [jsxRuntime.jsx(StyledIconLine, {
4562
5090
  "aria-hidden": "true",
4563
- children: jsxRuntime.jsx(Icon, {
5091
+ children: alertSize === 'small' ? jsxRuntime.jsx(StatusShape, {
5092
+ shape: variantShapes[variant]
5093
+ }) : jsxRuntime.jsx(Icon, {
4564
5094
  name: variantIcons[variant],
4565
5095
  size: sizeConfig[alertSize].icon,
4566
5096
  iconColor: "inherit"
@@ -5006,7 +5536,7 @@ var _a$1 = tokens.semantic,
5006
5536
  var StyledCodeBlock = /*#__PURE__*/styled__default.default.pre.withConfig({
5007
5537
  displayName: "CodeBlock__StyledCodeBlock",
5008
5538
  componentId: "sc-1p1t0kp-0"
5009
- })(templateObject_1$h || (templateObject_1$h = __makeTemplateObject(["\n background-color: ", ";\n border: ", ";\n border-radius: ", ";\n padding: ", ";\n font-family: ", ";\n font-size: ", ";\n line-height: ", ";\n color: ", ";\n overflow-x: auto;\n overflow-y: ", ";\n margin: ", " 0;\n position: relative;\n transition: max-height ", " ", ";\n\n ", " {\n transition: none;\n }\n \n ", "\n\n /* The block is focusable so keyboard users can scroll it; it shows the system focus ring\n (decision 0029) */\n &:focus-visible {\n outline: ", ";\n outline-offset: ", ";\n }\n"], ["\n background-color: ", ";\n border: ", ";\n border-radius: ", ";\n padding: ", ";\n font-family: ", ";\n font-size: ", ";\n line-height: ", ";\n color: ", ";\n overflow-x: auto;\n overflow-y: ", ";\n margin: ", " 0;\n position: relative;\n transition: max-height ", " ", ";\n\n ", " {\n transition: none;\n }\n \n ", "\n\n /* The block is focusable so keyboard users can scroll it; it shows the system focus ring\n (decision 0029) */\n &:focus-visible {\n outline: ", ";\n outline-offset: ", ";\n }\n"])), tokens.semantic.surface.raised, border$1.emphasis, tokens.semantic.radius.sm, tokens.semantic.space[300], tokens.component.codeBlock.fontFamily, tokens.component.codeBlock.fontSize, tokens.component.codeBlock.lineHeight, color$1.text["default"], function (_a) {
5539
+ })(templateObject_1$h || (templateObject_1$h = __makeTemplateObject(["\n background-color: ", ";\n border: ", ";\n border-radius: ", ";\n padding: ", ";\n font-family: ", ";\n font-size: ", ";\n line-height: ", ";\n color: ", ";\n overflow-x: auto;\n overflow-y: ", ";\n margin: ", " 0;\n position: relative;\n transition: max-height ", " ", ";\n\n ", " {\n transition: none;\n }\n \n ", "\n\n /* The block is focusable so keyboard users can scroll it; it shows the system focus ring\n (decision 0029) */\n &:focus-visible {\n outline: ", ";\n outline-offset: ", ";\n }\n"], ["\n background-color: ", ";\n border: ", ";\n border-radius: ", ";\n padding: ", ";\n font-family: ", ";\n font-size: ", ";\n line-height: ", ";\n color: ", ";\n overflow-x: auto;\n overflow-y: ", ";\n margin: ", " 0;\n position: relative;\n transition: max-height ", " ", ";\n\n ", " {\n transition: none;\n }\n \n ", "\n\n /* The block is focusable so keyboard users can scroll it; it shows the system focus ring\n (decision 0029) */\n &:focus-visible {\n outline: ", ";\n outline-offset: ", ";\n }\n"])), tokens.semantic.surface.raised, border$1["default"], tokens.semantic.radius.sm, tokens.semantic.space[300], tokens.component.codeBlock.fontFamily, tokens.component.codeBlock.fontSize, tokens.component.codeBlock.lineHeight, color$1.text["default"], function (_a) {
5010
5540
  var $isExpanded = _a.$isExpanded,
5011
5541
  $needsExpansion = _a.$needsExpansion;
5012
5542
  return $needsExpansion && !$isExpanded ? 'hidden' : 'auto';
@@ -5567,7 +6097,7 @@ var DropdownMenu = /*#__PURE__*/styled__default.default.div.withConfig({
5567
6097
  },
5568
6098
  displayName: "Dropdown__DropdownMenu",
5569
6099
  componentId: "sc-kz07c4-3"
5570
- })(templateObject_4$9 || (templateObject_4$9 = __makeTemplateObject(["\n position: absolute;\n top: 100%;\n left: 0;\n right: 0;\n z-index: ", ";\n background-color: ", ";\n /* A decorative outline: elevation separates the menu, and only the trigger is a control edge (decision 0025) */\n border: ", ";\n border-radius: ", ";\n box-shadow: ", ";\n margin-top: ", ";\n overflow: hidden;\n opacity: ", ";\n visibility: ", ";\n transform: ", ";\n transition: opacity ", " ", ",\n visibility ", " ", ",\n transform ", " ", ";\n max-height: ", ";\n overflow-y: auto;\n\n ", " {\n transform: none;\n }\n"], ["\n position: absolute;\n top: 100%;\n left: 0;\n right: 0;\n z-index: ", ";\n background-color: ", ";\n /* A decorative outline: elevation separates the menu, and only the trigger is a control edge (decision 0025) */\n border: ", ";\n border-radius: ", ";\n box-shadow: ", ";\n margin-top: ", ";\n overflow: hidden;\n opacity: ", ";\n visibility: ", ";\n transform: ", ";\n transition: opacity ", " ", ",\n visibility ", " ", ",\n transform ", " ", ";\n max-height: ", ";\n overflow-y: auto;\n\n ", " {\n transform: none;\n }\n"])), tokens.semantic.layer.dropdown, input$1["default"].backgroundColor, border.emphasis, input$1["default"].borderRadius, elevation$1.floating, space$4[100], function (_a) {
6100
+ })(templateObject_4$9 || (templateObject_4$9 = __makeTemplateObject(["\n position: absolute;\n top: 100%;\n left: 0;\n right: 0;\n z-index: ", ";\n background-color: ", ";\n /* A decorative outline: elevation separates the menu, and only the trigger is a control edge (decision 0025) */\n border: ", ";\n border-radius: ", ";\n box-shadow: ", ";\n margin-top: ", ";\n overflow: hidden;\n opacity: ", ";\n visibility: ", ";\n transform: ", ";\n transition: opacity ", " ", ",\n visibility ", " ", ",\n transform ", " ", ";\n max-height: ", ";\n overflow-y: auto;\n\n ", " {\n transform: none;\n }\n"], ["\n position: absolute;\n top: 100%;\n left: 0;\n right: 0;\n z-index: ", ";\n background-color: ", ";\n /* A decorative outline: elevation separates the menu, and only the trigger is a control edge (decision 0025) */\n border: ", ";\n border-radius: ", ";\n box-shadow: ", ";\n margin-top: ", ";\n overflow: hidden;\n opacity: ", ";\n visibility: ", ";\n transform: ", ";\n transition: opacity ", " ", ",\n visibility ", " ", ",\n transform ", " ", ";\n max-height: ", ";\n overflow-y: auto;\n\n ", " {\n transform: none;\n }\n"])), tokens.semantic.layer.dropdown, input$1["default"].backgroundColor, border["default"], input$1["default"].borderRadius, elevation$1.floating, space$4[100], function (_a) {
5571
6101
  var $isOpen = _a.$isOpen;
5572
6102
  return $isOpen ? 1 : 0;
5573
6103
  }, function (_a) {
@@ -5590,7 +6120,7 @@ var DropdownOption = /*#__PURE__*/styled__default.default.button.withConfig({
5590
6120
  selected: $isSelected,
5591
6121
  focused: $isFocused
5592
6122
  });
5593
- }, border.emphasis);
6123
+ }, border["default"]);
5594
6124
  var StyledHelperText$3 = /*#__PURE__*/styled__default.default.div.withConfig({
5595
6125
  displayName: "Dropdown__StyledHelperText",
5596
6126
  componentId: "sc-kz07c4-5"
@@ -7571,7 +8101,7 @@ var semantic = tokens.semantic;
7571
8101
  var StyledTabList = /*#__PURE__*/styled__default.default.div.withConfig({
7572
8102
  displayName: "TabBar__StyledTabList",
7573
8103
  componentId: "sc-1g9ib0y-0"
7574
- })(templateObject_1$3 || (templateObject_1$3 = __makeTemplateObject(["\n display: flex;\n align-items: center;\n border-bottom: ", " solid ", ";\n overflow-x: auto;\n overflow-y: hidden;\n -webkit-overflow-scrolling: touch;\n scrollbar-width: thin;\n \n &::-webkit-scrollbar {\n height: ", ";\n }\n \n &::-webkit-scrollbar-track {\n background: ", ";\n }\n \n &::-webkit-scrollbar-thumb {\n background: ", ";\n border-radius: ", ";\n }\n"], ["\n display: flex;\n align-items: center;\n border-bottom: ", " solid ", ";\n overflow-x: auto;\n overflow-y: hidden;\n -webkit-overflow-scrolling: touch;\n scrollbar-width: thin;\n \n &::-webkit-scrollbar {\n height: ", ";\n }\n \n &::-webkit-scrollbar-track {\n background: ", ";\n }\n \n &::-webkit-scrollbar-thumb {\n background: ", ";\n border-radius: ", ";\n }\n"])), semantic.border.width.thin, semantic.color.border.emphasis, tokens.component.tabBar.scrollbar.height, semantic.surface.raised, semantic.color.border["default"], semantic.radius.sm);
8104
+ })(templateObject_1$3 || (templateObject_1$3 = __makeTemplateObject(["\n display: flex;\n align-items: center;\n border-bottom: ", " solid ", ";\n overflow-x: auto;\n overflow-y: hidden;\n -webkit-overflow-scrolling: touch;\n scrollbar-width: thin;\n \n &::-webkit-scrollbar {\n height: ", ";\n }\n \n &::-webkit-scrollbar-track {\n background: ", ";\n }\n \n &::-webkit-scrollbar-thumb {\n background: ", ";\n border-radius: ", ";\n }\n"], ["\n display: flex;\n align-items: center;\n border-bottom: ", " solid ", ";\n overflow-x: auto;\n overflow-y: hidden;\n -webkit-overflow-scrolling: touch;\n scrollbar-width: thin;\n \n &::-webkit-scrollbar {\n height: ", ";\n }\n \n &::-webkit-scrollbar-track {\n background: ", ";\n }\n \n &::-webkit-scrollbar-thumb {\n background: ", ";\n border-radius: ", ";\n }\n"])), semantic.border.width.thin, semantic.color.border["default"], tokens.component.tabBar.scrollbar.height, semantic.surface.raised, semantic.color.border["default"], semantic.radius.sm);
7575
8105
  var StyledTab = /*#__PURE__*/styled__default.default.button.withConfig({
7576
8106
  shouldForwardProp: function shouldForwardProp(prop) {
7577
8107
  return !prop.startsWith('$');
@@ -7591,11 +8121,11 @@ var StyledTab = /*#__PURE__*/styled__default.default.button.withConfig({
7591
8121
  }, function (props) {
7592
8122
  return props.$isActive ? semantic.color.fill['accent-muted-hover'] : 'transparent';
7593
8123
  }, function (props) {
7594
- return props.$isActive ? semantic.color.text['accent-hover'] : semantic.color.text["default"];
8124
+ return props.$isActive ? semantic.color.text.accent : semantic.color.text["default"];
7595
8125
  }, function (props) {
7596
8126
  return props.$isActive ? semantic.color.fill['accent-muted-pressed'] : 'transparent';
7597
8127
  }, function (props) {
7598
- return props.$isActive ? semantic.color.text['accent-pressed'] : semantic.color.text["default"];
8128
+ return props.$isActive ? semantic.color.text.accent : semantic.color.text["default"];
7599
8129
  }, function (props) {
7600
8130
  return props.$disabled ? '0.5' : '1';
7601
8131
  }, semantic.border.focus, semantic.border.focusOffset);
@@ -7916,28 +8446,30 @@ var StyledTruncatedText = /*#__PURE__*/styled__default.default.span.withConfig({
7916
8446
  ])));
7917
8447
  // Map categories to CategoryLabel configurations
7918
8448
  var categoryConfig = {
8449
+ // Display colours carry no meaning (decision 0043); five coloured categories share four colours,
8450
+ // so the icon and label tell dining and bills apart
7919
8451
  shopping: {
7920
- color: 'purple',
8452
+ color: 'magenta',
7921
8453
  icon: 'paper',
7922
8454
  label: 'Shopping'
7923
8455
  },
7924
8456
  dining: {
7925
- color: 'orange',
8457
+ color: 'rose',
7926
8458
  icon: 'paper',
7927
8459
  label: 'Dining'
7928
8460
  },
7929
8461
  transport: {
7930
- color: 'blue',
8462
+ color: 'periwinkle',
7931
8463
  icon: 'paper',
7932
8464
  label: 'Transport'
7933
8465
  },
7934
8466
  entertainment: {
7935
- color: 'pink',
8467
+ color: 'olive',
7936
8468
  icon: 'star',
7937
8469
  label: 'Entertainment'
7938
8470
  },
7939
8471
  bills: {
7940
- color: 'red',
8472
+ color: 'rose',
7941
8473
  icon: 'paper',
7942
8474
  label: 'Bills'
7943
8475
  },
@@ -7947,12 +8479,6 @@ var categoryConfig = {
7947
8479
  label: 'Other'
7948
8480
  }
7949
8481
  };
7950
- // Map status to badge variant
7951
- var statusToBadgeVariant = {
7952
- completed: 'success',
7953
- pending: 'warning',
7954
- failed: 'error'
7955
- };
7956
8482
  /**
7957
8483
  * TransactionListItem component
7958
8484
  *
@@ -7960,7 +8486,7 @@ var statusToBadgeVariant = {
7960
8486
  * status, and optional metadata (category, receipt, notes). Minimum height 72px
7961
8487
  * with interactive states for clickable items.
7962
8488
  *
7963
- * Composes: Avatar, Badge, MoneyDisplay, Icon, DateFormatter, Typography, Stack
8489
+ * Composes: Avatar, CategoryLabel, StatusLabel, MoneyDisplay, Icon, DateFormatter, Typography, Stack
7964
8490
  */
7965
8491
  var TransactionListItem = function TransactionListItem(_a) {
7966
8492
  var merchant = _a.merchant,
@@ -7984,8 +8510,6 @@ var TransactionListItem = function TransactionListItem(_a) {
7984
8510
  var amountVariant = amount > 0 ? 'positive' : amount < 0 ? 'negative' : 'default';
7985
8511
  // Get category configuration
7986
8512
  var categoryData = category ? categoryConfig[category] : undefined;
7987
- // Get badge variant from status
7988
- var badgeVariant = statusToBadgeVariant[status];
7989
8513
  var handleClick = function handleClick() {
7990
8514
  if (isClickable && onClick) {
7991
8515
  onClick();
@@ -8003,19 +8527,10 @@ var TransactionListItem = function TransactionListItem(_a) {
8003
8527
  onKeyDown: handleKeyDown,
8004
8528
  tabIndex: isClickable ? 0 : undefined,
8005
8529
  role: isClickable ? 'button' : undefined,
8006
- "aria-label": isClickable ? "".concat(merchant, " transaction, ").concat(amount < 0 ? 'expense' : 'income', " of ").concat(Math.abs(amount)) : undefined,
8530
+ "aria-label": isClickable ? "".concat(merchant, " transaction, ").concat(amount < 0 ? 'expense' : 'income', " of ").concat(Math.abs(amount)).concat(status === 'completed' ? '' : ", ".concat(status)) : undefined,
8007
8531
  "data-testid": dataTestId,
8008
8532
  children: [jsxRuntime.jsx(StyledAvatarSection, {
8009
- children: status === 'pending' ? jsxRuntime.jsx(Badge, {
8010
- variant: badgeVariant,
8011
- dot: true,
8012
- "aria-label": "Pending transaction",
8013
- children: jsxRuntime.jsx(Avatar, {
8014
- name: merchant,
8015
- picture: merchantLogo,
8016
- size: "md"
8017
- })
8018
- }) : jsxRuntime.jsx(Avatar, {
8533
+ children: jsxRuntime.jsx(Avatar, {
8019
8534
  name: merchant,
8020
8535
  picture: merchantLogo,
8021
8536
  size: "md"
@@ -8035,11 +8550,10 @@ var TransactionListItem = function TransactionListItem(_a) {
8035
8550
  variant: "minimal",
8036
8551
  "aria-label": "Category: ".concat(categoryData.label),
8037
8552
  children: categoryData.label
8038
- }), status === 'failed' && jsxRuntime.jsx(Badge, {
8039
- variant: "error",
8040
- dot: true,
8041
- "aria-label": "Failed transaction",
8042
- children: jsxRuntime.jsx("span", {})
8553
+ }), status !== 'completed' && jsxRuntime.jsx(StatusLabel, {
8554
+ status: status,
8555
+ size: "small",
8556
+ liveRegion: false
8043
8557
  })]
8044
8558
  }), jsxRuntime.jsx(MoneyDisplay, {
8045
8559
  amount: amount,
@@ -8292,6 +8806,7 @@ var ResponsiveGrid = function ResponsiveGrid(_a) {
8292
8806
  };
8293
8807
  var templateObject_1, templateObject_2, templateObject_3, templateObject_4, templateObject_5, templateObject_6, templateObject_7, templateObject_8, templateObject_9, templateObject_10, templateObject_11, templateObject_12, templateObject_13, templateObject_14, templateObject_15, templateObject_16, templateObject_17, templateObject_18, templateObject_19, templateObject_20, templateObject_21, templateObject_22, templateObject_23, templateObject_24, templateObject_25, templateObject_26, templateObject_27, templateObject_28, templateObject_29, templateObject_30, templateObject_31, templateObject_32, templateObject_33, templateObject_34, templateObject_35;
8294
8808
 
8809
+ exports.AILabel = AILabel;
8295
8810
  exports.AccountCard = AccountCard;
8296
8811
  exports.ActionSheet = ActionSheet;
8297
8812
  exports.AgentInput = AgentInput;
@@ -8343,6 +8858,7 @@ exports.StatusBadge = StatusBadge;
8343
8858
  exports.StatusLabel = StatusLabel;
8344
8859
  exports.StyledInputBase = StyledInputBase;
8345
8860
  exports.StyledTextAreaBase = StyledTextAreaBase;
8861
+ exports.SuggestionChip = SuggestionChip;
8346
8862
  exports.TabBar = TabBar;
8347
8863
  exports.Tag = Tag;
8348
8864
  exports.TextField = TextField;