@flyingrobots/bijou 4.4.1 → 5.0.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 (173) hide show
  1. package/README.md +9 -1
  2. package/dist/adapters/test/index.d.ts.map +1 -1
  3. package/dist/adapters/test/index.js +1 -3
  4. package/dist/adapters/test/index.js.map +1 -1
  5. package/dist/adapters/test/runtime.d.ts.map +1 -1
  6. package/dist/adapters/test/runtime.js +4 -3
  7. package/dist/adapters/test/runtime.js.map +1 -1
  8. package/dist/context-theme.d.ts +25 -0
  9. package/dist/context-theme.d.ts.map +1 -1
  10. package/dist/context-theme.js +19 -0
  11. package/dist/context-theme.js.map +1 -1
  12. package/dist/context.d.ts +13 -1
  13. package/dist/context.d.ts.map +1 -1
  14. package/dist/context.js +24 -3
  15. package/dist/context.js.map +1 -1
  16. package/dist/core/components/alert-v3.d.ts.map +1 -1
  17. package/dist/core/components/alert-v3.js +5 -4
  18. package/dist/core/components/alert-v3.js.map +1 -1
  19. package/dist/core/components/alert.d.ts.map +1 -1
  20. package/dist/core/components/alert.js +7 -8
  21. package/dist/core/components/alert.js.map +1 -1
  22. package/dist/core/components/badge.d.ts.map +1 -1
  23. package/dist/core/components/badge.js +19 -18
  24. package/dist/core/components/badge.js.map +1 -1
  25. package/dist/core/components/box-v3.d.ts.map +1 -1
  26. package/dist/core/components/box-v3.js +29 -29
  27. package/dist/core/components/box-v3.js.map +1 -1
  28. package/dist/core/components/dag-edges.d.ts +21 -4
  29. package/dist/core/components/dag-edges.d.ts.map +1 -1
  30. package/dist/core/components/dag-edges.js +79 -16
  31. package/dist/core/components/dag-edges.js.map +1 -1
  32. package/dist/core/components/dag-layout.d.ts +3 -4
  33. package/dist/core/components/dag-layout.d.ts.map +1 -1
  34. package/dist/core/components/dag-layout.js +42 -9
  35. package/dist/core/components/dag-layout.js.map +1 -1
  36. package/dist/core/components/dag-render.d.ts +3 -2
  37. package/dist/core/components/dag-render.d.ts.map +1 -1
  38. package/dist/core/components/dag-render.js +20 -37
  39. package/dist/core/components/dag-render.js.map +1 -1
  40. package/dist/core/components/dag.d.ts +7 -4
  41. package/dist/core/components/dag.d.ts.map +1 -1
  42. package/dist/core/components/dag.js.map +1 -1
  43. package/dist/core/components/explainability.d.ts.map +1 -1
  44. package/dist/core/components/explainability.js +30 -87
  45. package/dist/core/components/explainability.js.map +1 -1
  46. package/dist/core/components/guided-flow.d.ts +32 -0
  47. package/dist/core/components/guided-flow.d.ts.map +1 -0
  48. package/dist/core/components/guided-flow.js +131 -0
  49. package/dist/core/components/guided-flow.js.map +1 -0
  50. package/dist/core/components/hyperlink.d.ts.map +1 -1
  51. package/dist/core/components/hyperlink.js +7 -4
  52. package/dist/core/components/hyperlink.js.map +1 -1
  53. package/dist/core/components/index.d.ts +4 -2
  54. package/dist/core/components/index.d.ts.map +1 -1
  55. package/dist/core/components/index.js +1 -0
  56. package/dist/core/components/index.js.map +1 -1
  57. package/dist/core/components/markdown-parse.d.ts +4 -0
  58. package/dist/core/components/markdown-parse.d.ts.map +1 -1
  59. package/dist/core/components/markdown-parse.js +66 -2
  60. package/dist/core/components/markdown-parse.js.map +1 -1
  61. package/dist/core/components/markdown-render.d.ts.map +1 -1
  62. package/dist/core/components/markdown-render.js +220 -14
  63. package/dist/core/components/markdown-render.js.map +1 -1
  64. package/dist/core/components/markdown.d.ts +4 -3
  65. package/dist/core/components/markdown.d.ts.map +1 -1
  66. package/dist/core/components/markdown.js +6 -5
  67. package/dist/core/components/markdown.js.map +1 -1
  68. package/dist/core/components/paginator.d.ts.map +1 -1
  69. package/dist/core/components/paginator.js +5 -3
  70. package/dist/core/components/paginator.js.map +1 -1
  71. package/dist/core/components/perf-overlay.d.ts.map +1 -1
  72. package/dist/core/components/perf-overlay.js +3 -2
  73. package/dist/core/components/perf-overlay.js.map +1 -1
  74. package/dist/core/components/preference-list.d.ts.map +1 -1
  75. package/dist/core/components/preference-list.js +75 -37
  76. package/dist/core/components/preference-list.js.map +1 -1
  77. package/dist/core/components/progress.d.ts.map +1 -1
  78. package/dist/core/components/progress.js +4 -3
  79. package/dist/core/components/progress.js.map +1 -1
  80. package/dist/core/components/separator-v3.d.ts.map +1 -1
  81. package/dist/core/components/separator-v3.js +11 -11
  82. package/dist/core/components/separator-v3.js.map +1 -1
  83. package/dist/core/components/separator.d.ts.map +1 -1
  84. package/dist/core/components/separator.js +4 -1
  85. package/dist/core/components/separator.js.map +1 -1
  86. package/dist/core/components/skeleton.d.ts.map +1 -1
  87. package/dist/core/components/skeleton.js +3 -2
  88. package/dist/core/components/skeleton.js.map +1 -1
  89. package/dist/core/components/surface-text.d.ts +7 -0
  90. package/dist/core/components/surface-text.d.ts.map +1 -1
  91. package/dist/core/components/surface-text.js +33 -25
  92. package/dist/core/components/surface-text.js.map +1 -1
  93. package/dist/core/components/table-v3.d.ts +5 -2
  94. package/dist/core/components/table-v3.d.ts.map +1 -1
  95. package/dist/core/components/table-v3.js +26 -16
  96. package/dist/core/components/table-v3.js.map +1 -1
  97. package/dist/core/components/table.d.ts +16 -2
  98. package/dist/core/components/table.d.ts.map +1 -1
  99. package/dist/core/components/table.js +136 -18
  100. package/dist/core/components/table.js.map +1 -1
  101. package/dist/core/forms/filter-interactive.d.ts.map +1 -1
  102. package/dist/core/forms/filter-interactive.js +2 -4
  103. package/dist/core/forms/filter-interactive.js.map +1 -1
  104. package/dist/core/forms/multiselect.d.ts.map +1 -1
  105. package/dist/core/forms/multiselect.js +2 -4
  106. package/dist/core/forms/multiselect.js.map +1 -1
  107. package/dist/core/forms/note.d.ts.map +1 -1
  108. package/dist/core/forms/note.js +2 -1
  109. package/dist/core/forms/note.js.map +1 -1
  110. package/dist/core/forms/select.d.ts.map +1 -1
  111. package/dist/core/forms/select.js +2 -4
  112. package/dist/core/forms/select.js.map +1 -1
  113. package/dist/core/forms/textarea-editor.d.ts.map +1 -1
  114. package/dist/core/forms/textarea-editor.js +7 -5
  115. package/dist/core/forms/textarea-editor.js.map +1 -1
  116. package/dist/core/layout/geometry.d.ts +39 -0
  117. package/dist/core/layout/geometry.d.ts.map +1 -0
  118. package/dist/core/layout/geometry.js +201 -0
  119. package/dist/core/layout/geometry.js.map +1 -0
  120. package/dist/core/numeric.d.ts +16 -0
  121. package/dist/core/numeric.d.ts.map +1 -0
  122. package/dist/core/numeric.js +37 -0
  123. package/dist/core/numeric.js.map +1 -0
  124. package/dist/core/render/differ.d.ts.map +1 -1
  125. package/dist/core/render/differ.js +15 -13
  126. package/dist/core/render/differ.js.map +1 -1
  127. package/dist/core/runtime-viewport.d.ts.map +1 -1
  128. package/dist/core/runtime-viewport.js +2 -3
  129. package/dist/core/runtime-viewport.js.map +1 -1
  130. package/dist/core/text/grapheme.d.ts +51 -0
  131. package/dist/core/text/grapheme.d.ts.map +1 -1
  132. package/dist/core/text/grapheme.js +68 -0
  133. package/dist/core/text/grapheme.js.map +1 -1
  134. package/dist/core/text/icon-presentation.d.ts +10 -0
  135. package/dist/core/text/icon-presentation.d.ts.map +1 -0
  136. package/dist/core/text/icon-presentation.js +12 -0
  137. package/dist/core/text/icon-presentation.js.map +1 -0
  138. package/dist/core/text/index.d.ts +2 -1
  139. package/dist/core/text/index.d.ts.map +1 -1
  140. package/dist/core/text/index.js +2 -1
  141. package/dist/core/text/index.js.map +1 -1
  142. package/dist/core/theme/color.d.ts +32 -0
  143. package/dist/core/theme/color.d.ts.map +1 -1
  144. package/dist/core/theme/color.js +68 -0
  145. package/dist/core/theme/color.js.map +1 -1
  146. package/dist/core/theme/graph-types.d.ts +5 -0
  147. package/dist/core/theme/graph-types.d.ts.map +1 -1
  148. package/dist/core/theme/graph.d.ts.map +1 -1
  149. package/dist/core/theme/graph.js +52 -5
  150. package/dist/core/theme/graph.js.map +1 -1
  151. package/dist/core/theme/index.d.ts +2 -1
  152. package/dist/core/theme/index.d.ts.map +1 -1
  153. package/dist/core/theme/index.js +1 -1
  154. package/dist/core/theme/index.js.map +1 -1
  155. package/dist/core/theme/presets.d.ts +3 -2
  156. package/dist/core/theme/presets.d.ts.map +1 -1
  157. package/dist/core/theme/presets.js +18 -29
  158. package/dist/core/theme/presets.js.map +1 -1
  159. package/dist/factory.d.ts +3 -0
  160. package/dist/factory.d.ts.map +1 -1
  161. package/dist/factory.js +4 -6
  162. package/dist/factory.js.map +1 -1
  163. package/dist/index.d.ts +8 -6
  164. package/dist/index.d.ts.map +1 -1
  165. package/dist/index.js +8 -6
  166. package/dist/index.js.map +1 -1
  167. package/dist/ports/context.d.ts +6 -1
  168. package/dist/ports/context.d.ts.map +1 -1
  169. package/dist/ports/surface.d.ts +6 -4
  170. package/dist/ports/surface.d.ts.map +1 -1
  171. package/dist/ports/surface.js +40 -23
  172. package/dist/ports/surface.js.map +1 -1
  173. package/package.json +1 -1
package/README.md CHANGED
@@ -45,10 +45,18 @@ const panel = boxSurface(
45
45
 
46
46
  Select the family based on the interaction semantic, not just the visual shape.
47
47
 
48
+ Render-path naming follows one house rule: the base family name is the public
49
+ component, and a `*Surface()` companion means “the same family on the composable
50
+ surface path.” If there is no `*Surface()` companion, the family is either
51
+ already surface-native, intentionally string-first, or both paths would be
52
+ fake duplication rather than a real second API.
53
+
48
54
  ### Status and Feedback
49
55
  - **`badge()`**: Compact, inline status.
50
56
  - **`note()`**: Non-urgent explanation.
51
57
  - **`alert()`**: Persistent, in-flow message.
58
+ - **`guidedFlow()`**: Calm multi-step assistance with one explicit next action.
59
+ - **`explainability()`**: AI- or machine-mediated recommendation with visible provenance and evidence.
52
60
  - *Use `@flyingrobots/bijou-tui` notifications for stacking, history, or active routing.*
53
61
 
54
62
  ### Selection and Prompts
@@ -72,7 +80,7 @@ Select the family based on the interaction semantic, not just the visual shape.
72
80
 
73
81
  - **[GUIDE.md](./GUIDE.md)**: Productive-fast path.
74
82
  - **[ADVANCED_GUIDE.md](./ADVANCED_GUIDE.md)**: Rendering doctrine, themes, and testing.
75
- - **[Design System](../../docs/design-system/README.md)**: Semantic guidance and component families.
83
+ - **[Design System](../../docs/design-system/README.md)**: Foundations, token vocabulary, and component families.
76
84
 
77
85
  ---
78
86
  Built with 💎 by [FLYING ROBOTS](https://github.com/flyingrobots)
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/adapters/test/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACxE,OAAO,EAAe,KAAK,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACpE,OAAO,EAAU,KAAK,aAAa,EAAE,KAAK,MAAM,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAa,KAAK,gBAAgB,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAC9E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAOtD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAC;AAGxD,OAAO,EAAE,WAAW,EAAE,KAAK,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACpE,OAAO,EAAE,MAAM,EAAE,KAAK,aAAa,EAAE,KAAK,MAAM,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,KAAK,gBAAgB,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAC9E,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,KAAK,UAAU,EAAE,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACpF,OAAO,EACL,YAAY,EACZ,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EACjB,aAAa,GACd,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC3E,OAAO,EAAE,8BAA8B,EAAE,MAAM,kBAAkB,CAAC;AAElE;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,sEAAsE;IACtE,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B,wEAAwE;IACxE,EAAE,CAAC,EAAE,aAAa,CAAC;IACnB,oDAAoD;IACpD,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,wDAAwD;IACxD,KAAK,CAAC,EAAE,gBAAgB,GAAG,SAAS,GAAG,SAAS,CAAC;IACjD,gDAAgD;IAChD,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,2EAA2E;IAC3E,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,0EAA0E;IAC1E,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,8DAA8D;IAC9D,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB;AASD;;;GAGG;AACH,MAAM,WAAW,WAAY,SAAQ,YAAY;IAC/C,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,kBAAuB,GAAG,WAAW,CAyB/E"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/adapters/test/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACxE,OAAO,EAAe,KAAK,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACpE,OAAO,EAAU,KAAK,aAAa,EAAE,KAAK,MAAM,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAa,KAAK,gBAAgB,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAC9E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAKtD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAC;AAGxD,OAAO,EAAE,WAAW,EAAE,KAAK,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACpE,OAAO,EAAE,MAAM,EAAE,KAAK,aAAa,EAAE,KAAK,MAAM,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,KAAK,gBAAgB,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAC9E,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,KAAK,UAAU,EAAE,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACpF,OAAO,EACL,YAAY,EACZ,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EACjB,aAAa,GACd,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC3E,OAAO,EAAE,8BAA8B,EAAE,MAAM,kBAAkB,CAAC;AAElE;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,sEAAsE;IACtE,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B,wEAAwE;IACxE,EAAE,CAAC,EAAE,aAAa,CAAC;IACnB,oDAAoD;IACpD,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,wDAAwD;IACxD,KAAK,CAAC,EAAE,gBAAgB,GAAG,SAAS,GAAG,SAAS,CAAC;IACjD,gDAAgD;IAChD,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,2EAA2E;IAC3E,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,0EAA0E;IAC1E,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,8DAA8D;IAC9D,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB;AASD;;;GAGG;AACH,MAAM,WAAW,WAAY,SAAQ,YAAY;IAC/C,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,kBAAuB,GAAG,WAAW,CAwB/E"}
@@ -5,7 +5,6 @@ import { plainStyle } from './style.js';
5
5
  import { createResolved } from '../../core/theme/resolve.js';
6
6
  import { CYAN_MAGENTA } from '../../core/theme/presets.js';
7
7
  import { createThemeAccessors } from '../../core/theme/accessors.js';
8
- import { createTokenGraph } from '../../core/theme/graph.js';
9
8
  import { systemClock } from '../../core/clock.js';
10
9
  export { mockRuntime } from './runtime.js';
11
10
  export { mockIO } from './io.js';
@@ -44,7 +43,6 @@ export function createTestContext(options = {}) {
44
43
  : options.io);
45
44
  const style = options.style ?? plainStyle();
46
45
  const theme = createResolved(options.theme ?? CYAN_MAGENTA, options.noColor ?? false, options.colorScheme ?? 'dark');
47
- const tokenGraph = createTokenGraph((options.theme ?? CYAN_MAGENTA));
48
46
  const mode = options.mode ?? 'interactive';
49
47
  return {
50
48
  theme,
@@ -53,7 +51,7 @@ export function createTestContext(options = {}) {
53
51
  io,
54
52
  clock,
55
53
  style,
56
- tokenGraph,
54
+ tokenGraph: theme.tokenGraph,
57
55
  resolveBCSS: () => ({}),
58
56
  ...createThemeAccessors(theme),
59
57
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/adapters/test/index.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,WAAW,EAA2B,MAAM,cAAc,CAAC;AACpE,OAAO,EAAE,MAAM,EAAmC,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,SAAS,EAAyC,MAAM,YAAY,CAAC;AAG9E,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAG7D,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD,OAAO,EAAE,WAAW,EAA2B,MAAM,cAAc,CAAC;AACpE,OAAO,EAAE,MAAM,EAAmC,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,SAAS,EAAyC,MAAM,YAAY,CAAC;AAC9E,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,UAAU,EAAwC,MAAM,kBAAkB,CAAC;AACpF,OAAO,EACL,YAAY,EACZ,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EACjB,aAAa,GACd,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC3E,OAAO,EAAE,8BAA8B,EAAE,MAAM,kBAAkB,CAAC;AAwBlE,SAAS,WAAW,CAAC,KAA2D;IAC9E,OAAO,OAAO,KAAK,KAAK,QAAQ;WAC3B,KAAK,KAAK,IAAI;WACd,KAAK,IAAI,KAAK;WACd,OAAO,KAAK,CAAC,GAAG,KAAK,UAAU,CAAC;AACvC,CAAC;AAWD;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,iBAAiB,CAAC,UAA8B,EAAE;IAChE,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7C,MAAM,cAAc,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC;IAC1D,MAAM,KAAK,GAAG,cAAc,KAAK,SAAS;QACxC,CAAC,CAAC,WAAW,EAAE;QACf,CAAC,CAAC,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC;IAC/E,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,KAAK,SAAS;QAC/C,CAAC,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE;QAClC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAChB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,UAAU,EAAE,CAAC;IAC5C,MAAM,KAAK,GAAG,cAAc,CAAC,OAAO,CAAC,KAAK,IAAI,YAAY,EAAE,OAAO,CAAC,OAAO,IAAI,KAAK,EAAE,OAAO,CAAC,WAAW,IAAI,MAAM,CAAC,CAAC;IACrH,MAAM,UAAU,GAAG,gBAAgB,CAAC,CAAC,OAAO,CAAC,KAAK,IAAI,YAAY,CAAgC,CAAC,CAAC;IACpG,MAAM,IAAI,GAAe,OAAO,CAAC,IAAI,IAAI,aAAa,CAAC;IAEvD,OAAO;QACL,KAAK;QACL,IAAI;QACJ,OAAO;QACP,EAAE;QACF,KAAK;QACL,KAAK;QACL,UAAU;QACV,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC;QACvB,GAAG,oBAAoB,CAAC,KAAK,CAAC;KAC/B,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/adapters/test/index.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,WAAW,EAA2B,MAAM,cAAc,CAAC;AACpE,OAAO,EAAE,MAAM,EAAmC,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,SAAS,EAAyC,MAAM,YAAY,CAAC;AAG9E,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAErE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD,OAAO,EAAE,WAAW,EAA2B,MAAM,cAAc,CAAC;AACpE,OAAO,EAAE,MAAM,EAAmC,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,SAAS,EAAyC,MAAM,YAAY,CAAC;AAC9E,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,UAAU,EAAwC,MAAM,kBAAkB,CAAC;AACpF,OAAO,EACL,YAAY,EACZ,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EACjB,aAAa,GACd,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC3E,OAAO,EAAE,8BAA8B,EAAE,MAAM,kBAAkB,CAAC;AAwBlE,SAAS,WAAW,CAAC,KAA2D;IAC9E,OAAO,OAAO,KAAK,KAAK,QAAQ;WAC3B,KAAK,KAAK,IAAI;WACd,KAAK,IAAI,KAAK;WACd,OAAO,KAAK,CAAC,GAAG,KAAK,UAAU,CAAC;AACvC,CAAC;AAWD;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,iBAAiB,CAAC,UAA8B,EAAE;IAChE,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7C,MAAM,cAAc,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC;IAC1D,MAAM,KAAK,GAAG,cAAc,KAAK,SAAS;QACxC,CAAC,CAAC,WAAW,EAAE;QACf,CAAC,CAAC,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC;IAC/E,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,KAAK,SAAS;QAC/C,CAAC,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE;QAClC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAChB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,UAAU,EAAE,CAAC;IAC5C,MAAM,KAAK,GAAG,cAAc,CAAC,OAAO,CAAC,KAAK,IAAI,YAAY,EAAE,OAAO,CAAC,OAAO,IAAI,KAAK,EAAE,OAAO,CAAC,WAAW,IAAI,MAAM,CAAC,CAAC;IACrH,MAAM,IAAI,GAAe,OAAO,CAAC,IAAI,IAAI,aAAa,CAAC;IAEvD,OAAO;QACL,KAAK;QACL,IAAI;QACJ,OAAO;QACP,EAAE;QACF,KAAK;QACL,KAAK;QACL,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC;QACvB,GAAG,oBAAoB,CAAC,KAAK,CAAC;KAC/B,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../src/adapters/test/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAE1D;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,oEAAoE;IACpE,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,mDAAmD;IACnD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,kDAAkD;IAClD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iDAAiD;IACjD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,OAAO,GAAE,kBAAuB,GAAG,WAAW,CAiBzE"}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../src/adapters/test/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAG1D;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,oEAAoE;IACpE,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,mDAAmD;IACnD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,kDAAkD;IAClD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iDAAiD;IACjD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,OAAO,GAAE,kBAAuB,GAAG,WAAW,CAiBzE"}
@@ -1,3 +1,4 @@
1
+ import { sanitizePositiveInt } from '../../core/numeric.js';
1
2
  /**
2
3
  * Create an in-memory {@link RuntimePort} for tests.
3
4
  *
@@ -20,9 +21,9 @@ export function mockRuntime(options = {}) {
20
21
  },
21
22
  stdoutIsTTY: options.stdoutIsTTY ?? true,
22
23
  stdinIsTTY: options.stdinIsTTY ?? true,
23
- columns: options.columns ?? 80,
24
- rows: options.rows ?? 24,
25
- refreshRate: options.refreshRate ?? 60,
24
+ columns: sanitizePositiveInt(options.columns, 80),
25
+ rows: sanitizePositiveInt(options.rows, 24),
26
+ refreshRate: sanitizePositiveInt(options.refreshRate, 60),
26
27
  };
27
28
  }
28
29
  //# sourceMappingURL=runtime.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../src/adapters/test/runtime.ts"],"names":[],"mappings":"AAoBA;;;;;;;;GAQG;AACH,MAAM,UAAU,WAAW,CAAC,UAA8B,EAAE;IAC1D,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC;IACjC,OAAO;QACL;;;;WAIG;QACH,GAAG,CAAC,GAAW;YACb,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC;QACD,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,IAAI;QACxC,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,IAAI;QACtC,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;QAC9B,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE;QACxB,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,EAAE;KACvC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../src/adapters/test/runtime.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAoB5D;;;;;;;;GAQG;AACH,MAAM,UAAU,WAAW,CAAC,UAA8B,EAAE;IAC1D,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC;IACjC,OAAO;QACL;;;;WAIG;QACH,GAAG,CAAC,GAAW;YACb,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC;QACD,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,IAAI;QACxC,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,IAAI;QACtC,OAAO,EAAE,mBAAmB,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;QACjD,IAAI,EAAE,mBAAmB,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QAC3C,WAAW,EAAE,mBAAmB,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;KAC1D,CAAC;AACJ,CAAC"}
@@ -1,6 +1,20 @@
1
1
  import type { BijouContext } from './ports/context.js';
2
2
  import { type ResolvedTheme } from './core/theme/resolve.js';
3
3
  import type { Theme } from './core/theme/tokens.js';
4
+ /** Notification emitted when the observed theme graph changes. */
5
+ export interface ThemeChange {
6
+ /** The context whose theme graph emitted the change. */
7
+ readonly ctx: BijouContext;
8
+ /** Token path that changed. `'*'` means broad invalidation after import. */
9
+ readonly path: string;
10
+ /** True when the underlying graph requested a full recompute. */
11
+ readonly fullReload: boolean;
12
+ }
13
+ /** Disposable subscription returned by {@link observeTheme}. */
14
+ export interface ThemeObservation {
15
+ /** Stop observing future theme changes. */
16
+ dispose(): void;
17
+ }
4
18
  /**
5
19
  * Clone a Bijou context with a different already-resolved theme.
6
20
  *
@@ -12,4 +26,15 @@ export declare function cloneContextWithResolvedTheme(ctx: BijouContext, theme:
12
26
  * Clone a Bijou context with a different theme definition.
13
27
  */
14
28
  export declare function cloneContextWithTheme(ctx: BijouContext, theme: Theme): BijouContext;
29
+ /**
30
+ * Observe theme/token updates for a context.
31
+ *
32
+ * This is the supported third-party authoring seam for reacting to in-place
33
+ * token-graph updates. Handlers should invalidate any cached theme-derived
34
+ * work and re-read tokens through the accessor layer on the provided context.
35
+ *
36
+ * When a caller replaces the entire context object, dispose the old
37
+ * observation and subscribe to the new context instead.
38
+ */
39
+ export declare function observeTheme(ctx: BijouContext, handler: (change: ThemeChange) => void): ThemeObservation;
15
40
  //# sourceMappingURL=context-theme.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"context-theme.d.ts","sourceRoot":"","sources":["../src/context-theme.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,EAAkB,KAAK,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAEpD;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAC3C,GAAG,EAAE,YAAY,EACjB,KAAK,EAAE,aAAa,GACnB,YAAY,CAOd;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,YAAY,EACjB,KAAK,EAAE,KAAK,GACX,YAAY,CAKd"}
1
+ {"version":3,"file":"context-theme.d.ts","sourceRoot":"","sources":["../src/context-theme.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,EAAkB,KAAK,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAEpD,kEAAkE;AAClE,MAAM,WAAW,WAAW;IAC1B,wDAAwD;IACxD,QAAQ,CAAC,GAAG,EAAE,YAAY,CAAC;IAC3B,4EAA4E;IAC5E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,iEAAiE;IACjE,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAC9B;AAED,gEAAgE;AAChE,MAAM,WAAW,gBAAgB;IAC/B,2CAA2C;IAC3C,OAAO,IAAI,IAAI,CAAC;CACjB;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAC3C,GAAG,EAAE,YAAY,EACjB,KAAK,EAAE,aAAa,GACnB,YAAY,CAOd;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,YAAY,EACjB,KAAK,EAAE,KAAK,GACX,YAAY,CAKd;AAED;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAC1B,GAAG,EAAE,YAAY,EACjB,OAAO,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,GACrC,gBAAgB,CAQlB"}
@@ -20,4 +20,23 @@ export function cloneContextWithResolvedTheme(ctx, theme) {
20
20
  export function cloneContextWithTheme(ctx, theme) {
21
21
  return cloneContextWithResolvedTheme(ctx, createResolved(theme, ctx.theme.noColor, ctx.theme.colorScheme));
22
22
  }
23
+ /**
24
+ * Observe theme/token updates for a context.
25
+ *
26
+ * This is the supported third-party authoring seam for reacting to in-place
27
+ * token-graph updates. Handlers should invalidate any cached theme-derived
28
+ * work and re-read tokens through the accessor layer on the provided context.
29
+ *
30
+ * When a caller replaces the entire context object, dispose the old
31
+ * observation and subscribe to the new context instead.
32
+ */
33
+ export function observeTheme(ctx, handler) {
34
+ return ctx.tokenGraph.on((path) => {
35
+ handler({
36
+ ctx,
37
+ path,
38
+ fullReload: path === '*',
39
+ });
40
+ });
41
+ }
23
42
  //# sourceMappingURL=context-theme.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"context-theme.js","sourceRoot":"","sources":["../src/context-theme.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,cAAc,EAAsB,MAAM,yBAAyB,CAAC;AAG7E;;;;;GAKG;AACH,MAAM,UAAU,6BAA6B,CAC3C,GAAiB,EACjB,KAAoB;IAEpB,OAAO;QACL,GAAG,GAAG;QACN,KAAK;QACL,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,GAAG,oBAAoB,CAAC,KAAK,CAAC;KAC/B,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CACnC,GAAiB,EACjB,KAAY;IAEZ,OAAO,6BAA6B,CAClC,GAAG,EACH,cAAc,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAChE,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"context-theme.js","sourceRoot":"","sources":["../src/context-theme.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,cAAc,EAAsB,MAAM,yBAAyB,CAAC;AAmB7E;;;;;GAKG;AACH,MAAM,UAAU,6BAA6B,CAC3C,GAAiB,EACjB,KAAoB;IAEpB,OAAO;QACL,GAAG,GAAG;QACN,KAAK;QACL,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,GAAG,oBAAoB,CAAC,KAAK,CAAC;KAC/B,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CACnC,GAAiB,EACjB,KAAY;IAEZ,OAAO,6BAA6B,CAClC,GAAG,EACH,cAAc,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAChE,CAAC;AACJ,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,YAAY,CAC1B,GAAiB,EACjB,OAAsC;IAEtC,OAAO,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE;QAChC,OAAO,CAAC;YACN,GAAG;YACH,IAAI;YACJ,UAAU,EAAE,IAAI,KAAK,GAAG;SACzB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
package/dist/context.d.ts CHANGED
@@ -18,7 +18,19 @@ export declare function getDefaultContext(): BijouContext;
18
18
  */
19
19
  export declare function setDefaultContext(ctx: BijouContext): void;
20
20
  /**
21
- * Reset the default context to `null`.
21
+ * Register a lazy initializer for the global default {@link BijouContext}.
22
+ *
23
+ * Host adapters can use this to provide ambient context bootstrapping without
24
+ * forcing higher-level runtime packages to depend on host-specific modules.
25
+ *
26
+ * The initializer is invoked only when {@link getDefaultContext} is called and
27
+ * no explicit default has been set yet.
28
+ *
29
+ * @param initializer - Lazy factory for the default context, or `null` to clear it.
30
+ */
31
+ export declare function setDefaultContextInitializer(initializer: (() => BijouContext) | null): void;
32
+ /**
33
+ * Reset the default context and lazy initializer.
22
34
  *
23
35
  * **Test-only** — ensures isolation between test cases.
24
36
  */
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAIvD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,IAAI,YAAY,CAShD;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,CAEzD;AAED;;;;GAIG;AACH,wBAAgB,8BAA8B,IAAI,IAAI,CAErD"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAKvD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,IAAI,YAAY,CAchD;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,CAEzD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,4BAA4B,CAC1C,WAAW,EAAE,CAAC,MAAM,YAAY,CAAC,GAAG,IAAI,GACvC,IAAI,CAEN;AAED;;;;GAIG;AACH,wBAAgB,8BAA8B,IAAI,IAAI,CAGrD"}
package/dist/context.js CHANGED
@@ -1,4 +1,5 @@
1
1
  let defaultContext = null;
2
+ let defaultContextInitializer = null;
2
3
  /**
3
4
  * Retrieve the global default {@link BijouContext}.
4
5
  *
@@ -8,9 +9,14 @@ let defaultContext = null;
8
9
  */
9
10
  export function getDefaultContext() {
10
11
  if (defaultContext === null) {
12
+ if (defaultContextInitializer != null) {
13
+ defaultContext = defaultContextInitializer();
14
+ return defaultContext;
15
+ }
11
16
  throw new Error('[bijou] No default context configured. ' +
12
- 'Import @flyingrobots/bijou-node to auto-configure, ' +
13
- 'or call setDefaultContext() explicitly.');
17
+ 'Import @flyingrobots/bijou-node to register Node auto-init, ' +
18
+ 'call startApp(app), or call setDefaultContext() explicitly. ' +
19
+ 'Guide: https://github.com/flyingrobots/bijou/tree/main/packages/bijou-node/GUIDE.md#basic-setup');
14
20
  }
15
21
  return defaultContext;
16
22
  }
@@ -27,11 +33,26 @@ export function setDefaultContext(ctx) {
27
33
  defaultContext = ctx;
28
34
  }
29
35
  /**
30
- * Reset the default context to `null`.
36
+ * Register a lazy initializer for the global default {@link BijouContext}.
37
+ *
38
+ * Host adapters can use this to provide ambient context bootstrapping without
39
+ * forcing higher-level runtime packages to depend on host-specific modules.
40
+ *
41
+ * The initializer is invoked only when {@link getDefaultContext} is called and
42
+ * no explicit default has been set yet.
43
+ *
44
+ * @param initializer - Lazy factory for the default context, or `null` to clear it.
45
+ */
46
+ export function setDefaultContextInitializer(initializer) {
47
+ defaultContextInitializer = initializer;
48
+ }
49
+ /**
50
+ * Reset the default context and lazy initializer.
31
51
  *
32
52
  * **Test-only** — ensures isolation between test cases.
33
53
  */
34
54
  export function _resetDefaultContextForTesting() {
35
55
  defaultContext = null;
56
+ defaultContextInitializer = null;
36
57
  }
37
58
  //# sourceMappingURL=context.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAEA,IAAI,cAAc,GAAwB,IAAI,CAAC;AAE/C;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB;IAC/B,IAAI,cAAc,KAAK,IAAI,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CACb,yCAAyC;YACzC,qDAAqD;YACrD,yCAAyC,CAC1C,CAAC;IACJ,CAAC;IACD,OAAO,cAAc,CAAC;AACxB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAiB;IACjD,cAAc,GAAG,GAAG,CAAC;AACvB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,8BAA8B;IAC5C,cAAc,GAAG,IAAI,CAAC;AACxB,CAAC"}
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAEA,IAAI,cAAc,GAAwB,IAAI,CAAC;AAC/C,IAAI,yBAAyB,GAAgC,IAAI,CAAC;AAElE;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB;IAC/B,IAAI,cAAc,KAAK,IAAI,EAAE,CAAC;QAC5B,IAAI,yBAAyB,IAAI,IAAI,EAAE,CAAC;YACtC,cAAc,GAAG,yBAAyB,EAAE,CAAC;YAC7C,OAAO,cAAc,CAAC;QACxB,CAAC;QACD,MAAM,IAAI,KAAK,CACb,yCAAyC;YACzC,8DAA8D;YAC9D,8DAA8D;YAC9D,iGAAiG,CAClG,CAAC;IACJ,CAAC;IACD,OAAO,cAAc,CAAC;AACxB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAiB;IACjD,cAAc,GAAG,GAAG,CAAC;AACvB,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,4BAA4B,CAC1C,WAAwC;IAExC,yBAAyB,GAAG,WAAW,CAAC;AAC1C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,8BAA8B;IAC5C,cAAc,GAAG,IAAI,CAAC;IACtB,yBAAyB,GAAG,IAAI,CAAC;AACnC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"alert-v3.d.ts","sourceRoot":"","sources":["../../../src/core/components/alert-v3.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAGtD,OAAO,EAAE,KAAK,YAAY,EAAqB,MAAM,YAAY,CAAC;AAkBlE;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAkB3F"}
1
+ {"version":3,"file":"alert-v3.d.ts","sourceRoot":"","sources":["../../../src/core/components/alert-v3.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAGtD,OAAO,EAAE,KAAK,YAAY,EAAqB,MAAM,YAAY,CAAC;AAmBlE;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAkB3F"}
@@ -2,11 +2,12 @@ import { createSurface } from '../../ports/surface.js';
2
2
  import { resolveSafeCtx as resolveCtx } from '../resolve-ctx.js';
3
3
  import { boxSurface } from './box-v3.js';
4
4
  import { createTextSurface, tokenToCellStyle } from './surface-text.js';
5
+ import { forceTextPresentation } from '../text/icon-presentation.js';
5
6
  const ICONS = {
6
- success: '\u2713', // ✓
7
- error: '\u2717', // ✗
8
- warning: '\u26A0', // ⚠
9
- info: '\u2139', // ℹ
7
+ success: forceTextPresentation('\u2713'), // ✓
8
+ error: forceTextPresentation('\u2717'), // ✗
9
+ warning: forceTextPresentation('\u26A0'), // ⚠
10
+ info: forceTextPresentation('\u2139'), // ℹ
10
11
  };
11
12
  const BORDER_TOKENS = {
12
13
  success: 'success',
@@ -1 +1 @@
1
- {"version":3,"file":"alert-v3.js","sourceRoot":"","sources":["../../../src/core/components/alert-v3.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,cAAc,IAAI,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEjE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAExE,MAAM,KAAK,GAAiC;IAC1C,OAAO,EAAE,QAAQ,EAAG,IAAI;IACxB,KAAK,EAAE,QAAQ,EAAK,IAAI;IACxB,OAAO,EAAE,QAAQ,EAAG,IAAI;IACxB,IAAI,EAAE,QAAQ,EAAM,IAAI;CACzB,CAAC;AAEF,MAAM,aAAa,GAAsE;IACvF,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,SAAS;IAClB,IAAI,EAAE,SAAS;CAChB,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,OAAyB,EAAE,UAAwB,EAAE;IAChF,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,MAAM,CAAC;IAC1C,MAAM,WAAW,GAAG,iBAAiB,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,gBAAgB,CAAC,GAAG,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAChG,MAAM,cAAc,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAC1F,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,GAAG,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC;IAC3D,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACtE,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAE1E,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAChC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/D,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE,WAAW,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAEvD,OAAO,UAAU,CAAC,OAAO,EAAE;QACzB,GAAG,OAAO;QACV,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,GAAG,EAAE,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QACvE,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,GAAG,EAAE,OAAO,CAAC,UAAU,CAAC;KACrD,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"alert-v3.js","sourceRoot":"","sources":["../../../src/core/components/alert-v3.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,cAAc,IAAI,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEjE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAErE,MAAM,KAAK,GAAiC;IAC1C,OAAO,EAAE,qBAAqB,CAAC,QAAQ,CAAC,EAAE,IAAI;IAC9C,KAAK,EAAE,qBAAqB,CAAC,QAAQ,CAAC,EAAI,IAAI;IAC9C,OAAO,EAAE,qBAAqB,CAAC,QAAQ,CAAC,EAAE,IAAI;IAC9C,IAAI,EAAE,qBAAqB,CAAC,QAAQ,CAAC,EAAK,IAAI;CAC/C,CAAC;AAEF,MAAM,aAAa,GAAsE;IACvF,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,SAAS;IAClB,IAAI,EAAE,SAAS;CAChB,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,OAAyB,EAAE,UAAwB,EAAE;IAChF,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,MAAM,CAAC;IAC1C,MAAM,WAAW,GAAG,iBAAiB,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,gBAAgB,CAAC,GAAG,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAChG,MAAM,cAAc,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAC1F,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,GAAG,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC;IAC3D,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACtE,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAE1E,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAChC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/D,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE,WAAW,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAEvD,OAAO,UAAU,CAAC,OAAO,EAAE;QACzB,GAAG,OAAO;QACV,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,GAAG,EAAE,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QACvE,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,GAAG,EAAE,OAAO,CAAC,UAAU,CAAC;KACrD,CAAC,CAAC;AACL,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"alert.d.ts","sourceRoot":"","sources":["../../../src/core/components/alert.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAS,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAI5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD,4BAA4B;AAC5B,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;AAEpE,gDAAgD;AAChD,MAAM,WAAW,YAAa,SAAQ,gBAAgB;IACpD,+CAA+C;IAC/C,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,yFAAyF;IACzF,WAAW,CAAC,EAAE,UAAU,CAAC;IACzB,wFAAwF;IACxF,OAAO,CAAC,EAAE,UAAU,CAAC;CACtB;AAyCD;;;;;;;;;;;GAWG;AACH,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,MAAM,CAsBzE"}
1
+ {"version":3,"file":"alert.d.ts","sourceRoot":"","sources":["../../../src/core/components/alert.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAS,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAI5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGnD,4BAA4B;AAC5B,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;AAEpE,gDAAgD;AAChD,MAAM,WAAW,YAAa,SAAQ,gBAAgB;IACpD,+CAA+C;IAC/C,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,yFAAyF;IACzF,WAAW,CAAC,EAAE,UAAU,CAAC;IACzB,wFAAwF;IACxF,OAAO,CAAC,EAAE,UAAU,CAAC;CACtB;AAuCD;;;;;;;;;;;GAWG;AACH,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,MAAM,CAsBzE"}
@@ -1,19 +1,18 @@
1
1
  import { resolveCtx } from '../resolve-ctx.js';
2
2
  import { box } from './box.js';
3
3
  import { renderByMode } from '../mode-render.js';
4
+ import { forceTextPresentation } from '../text/icon-presentation.js';
4
5
  /**
5
6
  * Unicode icon characters for each alert variant.
6
7
  *
7
- * (U+2713) and (U+2717) are Narrow per Unicode East Asian Width.
8
- * (U+26A0) and (U+2139) are Ambiguous 1-wide in terminals,
9
- * potentially 2-wide in some chat UIs. We treat them as 1-wide here
10
- * since graphemeWidth correctly classifies them as Narrow.
8
+ * The symbols are forced into text presentation with VS15 (U+FE0E) so
9
+ * chat UIs and web terminals do not widen them into emoji presentation.
11
10
  */
12
11
  const ICONS = {
13
- success: '\u2713', // ✓ CHECK MARK
14
- error: '\u2717', // ✗ BALLOT X
15
- warning: '\u26A0', // ⚠ WARNING SIGN
16
- info: '\u2139', // ℹ INFORMATION SOURCE
12
+ success: forceTextPresentation('\u2713'), // ✓ CHECK MARK
13
+ error: forceTextPresentation('\u2717'), // ✗ BALLOT X
14
+ warning: forceTextPresentation('\u26A0'), // ⚠ WARNING SIGN
15
+ info: forceTextPresentation('\u2139'), // ℹ INFORMATION SOURCE
17
16
  };
18
17
  /** Uppercase labels used in pipe mode output. */
19
18
  const PIPE_LABELS = {
@@ -1 +1 @@
1
- {"version":3,"file":"alert.js","sourceRoot":"","sources":["../../../src/core/components/alert.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAgBjD;;;;;;;GAOG;AACH,MAAM,KAAK,GAAiC;IAC1C,OAAO,EAAE,QAAQ,EAAG,eAAe;IACnC,KAAK,EAAE,QAAQ,EAAK,aAAa;IACjC,OAAO,EAAE,QAAQ,EAAG,iBAAiB;IACrC,IAAI,EAAE,QAAQ,EAAM,uBAAuB;CAC5C,CAAC;AAEF,iDAAiD;AACjD,MAAM,WAAW,GAAiC;IAChD,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,SAAS;IAClB,IAAI,EAAE,MAAM;CACb,CAAC;AAEF,yDAAyD;AACzD,MAAM,iBAAiB,GAAiC;IACtD,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,SAAS;IAClB,IAAI,EAAE,MAAM;CACb,CAAC;AAEF,8EAA8E;AAC9E,MAAM,aAAa,GAAgD;IACjE,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,SAAS;IAClB,IAAI,EAAE,SAAS;CAChB,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,KAAK,CAAC,OAAe,EAAE,UAAwB,EAAE;IAC/D,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,MAAM,CAAC;IAC1C,MAAM,WAAW,GAAG,OAAO,IAAI,EAAE,CAAC;IAElC,OAAO,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE;QAC5B,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,WAAW,CAAC,OAAO,CAAC,KAAK,WAAW,EAAE;QACtD,UAAU,EAAE,GAAG,EAAE,CAAC,GAAG,iBAAiB,CAAC,OAAO,CAAC,KAAK,WAAW,EAAE;QACjE,WAAW,EAAE,GAAG,EAAE;YAChB,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;YAC5B,MAAM,aAAa,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC5C,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;YAC9E,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;YAE1D,OAAO,GAAG,CAAC,WAAW,GAAG,GAAG,GAAG,WAAW,EAAE;gBAC1C,WAAW;gBACX,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC;gBACnD,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;gBAC9B,GAAG;aACJ,CAAC,CAAC;QACL,CAAC;KACF,EAAE,OAAO,CAAC,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"alert.js","sourceRoot":"","sources":["../../../src/core/components/alert.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAerE;;;;;GAKG;AACH,MAAM,KAAK,GAAiC;IAC1C,OAAO,EAAE,qBAAqB,CAAC,QAAQ,CAAC,EAAE,eAAe;IACzD,KAAK,EAAE,qBAAqB,CAAC,QAAQ,CAAC,EAAI,aAAa;IACvD,OAAO,EAAE,qBAAqB,CAAC,QAAQ,CAAC,EAAE,iBAAiB;IAC3D,IAAI,EAAE,qBAAqB,CAAC,QAAQ,CAAC,EAAK,uBAAuB;CAClE,CAAC;AAEF,iDAAiD;AACjD,MAAM,WAAW,GAAiC;IAChD,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,SAAS;IAClB,IAAI,EAAE,MAAM;CACb,CAAC;AAEF,yDAAyD;AACzD,MAAM,iBAAiB,GAAiC;IACtD,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,SAAS;IAClB,IAAI,EAAE,MAAM;CACb,CAAC;AAEF,8EAA8E;AAC9E,MAAM,aAAa,GAAgD;IACjE,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,SAAS;IAClB,IAAI,EAAE,SAAS;CAChB,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,KAAK,CAAC,OAAe,EAAE,UAAwB,EAAE;IAC/D,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,MAAM,CAAC;IAC1C,MAAM,WAAW,GAAG,OAAO,IAAI,EAAE,CAAC;IAElC,OAAO,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE;QAC5B,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,WAAW,CAAC,OAAO,CAAC,KAAK,WAAW,EAAE;QACtD,UAAU,EAAE,GAAG,EAAE,CAAC,GAAG,iBAAiB,CAAC,OAAO,CAAC,KAAK,WAAW,EAAE;QACjE,WAAW,EAAE,GAAG,EAAE;YAChB,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;YAC5B,MAAM,aAAa,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC5C,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;YAC9E,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;YAE1D,OAAO,GAAG,CAAC,WAAW,GAAG,GAAG,GAAG,WAAW,EAAE;gBAC1C,WAAW;gBACX,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC;gBACnD,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;gBAC9B,GAAG;aACJ,CAAC,CAAC;QACL,CAAC;KACF,EAAE,OAAO,CAAC,CAAC;AACd,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"badge.d.ts","sourceRoot":"","sources":["../../../src/core/components/badge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,OAAO,EAAiC,MAAM,wBAAwB,CAAC;AACpG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGxD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAInD,6EAA6E;AAC7E,MAAM,MAAM,YAAY,GAAG,aAAa,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEhE,2CAA2C;AAC3C,MAAM,WAAW,YAAa,SAAQ,gBAAgB;IACpD,4CAA4C;IAC5C,OAAO,CAAC,EAAE,YAAY,CAAC;CACxB;AAED;;;;;;;;GAQG;AACH,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CA6DvE"}
1
+ {"version":3,"file":"badge.d.ts","sourceRoot":"","sources":["../../../src/core/components/badge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkC,KAAK,OAAO,EAAa,MAAM,wBAAwB,CAAC;AACjG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAIxD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAKnD,6EAA6E;AAC7E,MAAM,MAAM,YAAY,GAAG,aAAa,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEhE,2CAA2C;AAC3C,MAAM,WAAW,YAAa,SAAQ,gBAAgB;IACpD,4CAA4C;IAC5C,OAAO,CAAC,EAAE,YAAY,CAAC;CACxB;AAED;;;;;;;;GAQG;AACH,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CA+DvE"}
@@ -1,8 +1,10 @@
1
- import { createSurface } from '../../ports/surface.js';
1
+ import { createSurface, isPackedSurface } from '../../ports/surface.js';
2
+ import { colorRgb } from '../theme/color.js';
2
3
  import { resolveSafeCtx as resolveCtx } from '../resolve-ctx.js';
3
- import { segmentGraphemes } from '../text/grapheme.js';
4
+ import { graphemeWidth, sanitizePlainTerminalText } from '../text/index.js';
4
5
  import { applyBCSSCellTextStyles } from './bcss-style.js';
5
- import { parseHex, encodeModifiers } from '../render/packed-cell.js';
6
+ import { encodeModifiers } from '../render/packed-cell.js';
7
+ import { segmentSurfaceText } from './surface-text.js';
6
8
  /**
7
9
  * Render an inline badge (pill-shaped label) for the given text.
8
10
  *
@@ -15,14 +17,15 @@ import { parseHex, encodeModifiers } from '../render/packed-cell.js';
15
17
  export function badge(text, options = {}) {
16
18
  const ctx = resolveCtx(options.ctx);
17
19
  const variant = options.variant ?? 'info';
18
- const paddedText = ` ${text} `;
19
- const graphemes = segmentGraphemes(paddedText);
20
+ const safeText = sanitizePlainTerminalText(text ?? '');
21
+ const paddedText = ` ${safeText} `;
22
+ const graphemes = segmentSurfaceText(paddedText, 'badge');
20
23
  const width = graphemes.length;
21
24
  const surface = createSurface(width, 1);
22
25
  if (!ctx || ctx.mode === 'pipe' || ctx.mode === 'accessible') {
23
26
  // Basic text output for non-rich modes
24
- const char = ctx?.mode === 'pipe' ? `[${text}]` : paddedText;
25
- return stringToSurface(char, char.length, 1);
27
+ const char = ctx?.mode === 'pipe' ? `[${safeText}]` : paddedText;
28
+ return stringToSurface(char, graphemeWidth(char), 1);
26
29
  }
27
30
  // Resolve global CSS styles
28
31
  const bcss = ctx.resolveBCSS({ type: 'Badge', id: options.id, classes: options.class?.split(' ') });
@@ -48,23 +51,21 @@ export function badge(text, options = {}) {
48
51
  if (bcss['background']) {
49
52
  cell.modifiers = cell.modifiers?.filter(m => m !== 'inverse');
50
53
  }
51
- const packed = 'buffer' in surface;
52
- if (packed && cell.fg) {
53
- const fg = parseHex(cell.fg);
54
+ const packedSurface = isPackedSurface(surface) ? surface : undefined;
55
+ if (packedSurface) {
56
+ const fg = cell.fgRGB ?? colorRgb(cell.fg);
54
57
  if (fg) {
55
58
  const [fR, fG, fB] = fg;
56
59
  let bR = -1, bG = 0, bB = 0;
57
- if (cell.bg) {
58
- const bg = parseHex(cell.bg);
59
- if (bg) {
60
- bR = bg[0];
61
- bG = bg[1];
62
- bB = bg[2];
63
- }
60
+ const bg = cell.bgRGB ?? colorRgb(cell.bg);
61
+ if (bg) {
62
+ bR = bg[0];
63
+ bG = bg[1];
64
+ bB = bg[2];
64
65
  }
65
66
  const flags = encodeModifiers(cell.modifiers);
66
67
  for (let i = 0; i < width; i++) {
67
- surface.setRGB(i, 0, graphemes[i], fR, fG, fB, bR, bG, bB, flags);
68
+ packedSurface.setRGB(i, 0, graphemes[i], fR, fG, fB, bR, bG, bB, flags);
68
69
  }
69
70
  }
70
71
  else {
@@ -1 +1 @@
1
- {"version":3,"file":"badge.js","sourceRoot":"","sources":["../../../src/core/components/badge.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"badge.js","sourceRoot":"","sources":["../../../src/core/components/badge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,eAAe,EAA2B,MAAM,wBAAwB,CAAC;AAEjG,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,cAAc,IAAI,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAE5E,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAWvD;;;;;;;;GAQG;AACH,MAAM,UAAU,KAAK,CAAC,IAAY,EAAE,UAAwB,EAAE;IAC5D,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,MAAM,CAAC;IAE1C,MAAM,QAAQ,GAAG,yBAAyB,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IACvD,MAAM,UAAU,GAAG,IAAI,QAAQ,GAAG,CAAC;IACnC,MAAM,SAAS,GAAG,kBAAkB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC1D,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC;IAC/B,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAExC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QAC7D,uCAAuC;QACvC,MAAM,IAAI,GAAG,GAAG,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,QAAQ,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC;QACjE,OAAO,eAAe,CAAC,IAAI,EAAE,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IACvD,CAAC;IAED,4BAA4B;IAC5B,MAAM,IAAI,GAAG,GAAG,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEpG,MAAM,SAAS,GAAG,CAAC,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,SAAS,CAAC;QAC/D,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC;QACvB,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAExB,+DAA+D;IAC/D,sDAAsD;IACtD,MAAM,SAAS,GAA8D;QAC3E,EAAE,EAAE,SAAS,CAAC,GAAG;QACjB,EAAE,EAAE,SAAS;QACb,SAAS,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,IAAI,EAAE,CAAC,EAAE,SAAS,CAAC;KACvD,CAAC;IACF,IAAI,SAAS,CAAC,KAAK;QAAE,SAAS,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;IACvD,MAAM,IAAI,GAAS;QACjB,IAAI,EAAE,GAAG;QACT,GAAG,uBAAuB,CAAC,SAAS,EAAE,IAAI,CAAC;QAC3C,KAAK,EAAE,KAAK;KACb,CAAC;IAEF,yEAAyE;IACzE,uDAAuD;IACvD,IAAI,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;QACvB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,aAAa,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IACrE,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC3C,IAAI,EAAE,EAAE,CAAC;YACP,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC;YACxB,IAAI,EAAE,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YAC5B,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC3C,IAAI,EAAE,EAAE,CAAC;gBAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;gBAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;gBAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;YAAC,CAAC;YAC/C,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC/B,aAAa,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC,CAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;YAC3E,CAAC;QACH,CAAC;aAAM,CAAC;YACN,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE;gBAAE,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAE,EAAE,CAAC,CAAC;QACtF,CAAC;IACH,CAAC;SAAM,CAAC;QACN,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE;YAAE,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAE,EAAE,CAAC,CAAC;IACtF,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,iCAAiC;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"box-v3.d.ts","sourceRoot":"","sources":["../../../src/core/components/box-v3.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,OAAO,EAAiC,MAAM,wBAAwB,CAAC;AAIpG,OAAO,EAAmB,KAAK,UAAU,EAAE,KAAK,gBAAgB,EAAE,MAAM,UAAU,CAAC;AA0EnF;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,EAAE,OAAO,GAAE,UAAe,GAAG,OAAO,CAmIvF;AACD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAmBvF"}
1
+ {"version":3,"file":"box-v3.d.ts","sourceRoot":"","sources":["../../../src/core/components/box-v3.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkC,KAAK,OAAO,EAAa,MAAM,wBAAwB,CAAC;AAMjG,OAAO,EAAmB,KAAK,UAAU,EAAE,KAAK,gBAAgB,EAAE,MAAM,UAAU,CAAC;AA4EnF;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,EAAE,OAAO,GAAE,UAAe,GAAG,OAAO,CAoIvF;AACD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAmBvF"}
@@ -1,34 +1,33 @@
1
- import { createSurface } from '../../ports/surface.js';
1
+ import { createSurface, isPackedSurface } from '../../ports/surface.js';
2
2
  import { resolveSafeCtx as resolveCtx } from '../resolve-ctx.js';
3
+ import { colorHex, colorRgb } from '../theme/color.js';
3
4
  import { clipToWidth } from '../text/clip.js';
5
+ import { sanitizePlainTerminalText } from '../text/index.js';
4
6
  import { wrapToWidth } from '../text/wrap.js';
5
7
  import { resolveFillChar } from './box.js';
6
8
  import { applyBCSSCellTextStyles } from './bcss-style.js';
7
9
  import { createSegmentSurface, createTextSurface, segmentSurfaceText, tokenToCellStyle, wrapSurfaceToWidth } from './surface-text.js';
8
10
  import { resolveOverflowBehavior } from './overflow.js';
9
- import { parseHex, encodeModifiers, CELL_STRIDE, OFF_FLAGS, OFF_ALPHA, FLAG_EMPTY, FLAG_BG_SET } from '../render/packed-cell.js';
10
- function isPackedSurface(s) {
11
- return 'buffer' in s && s.buffer instanceof Uint8Array;
12
- }
11
+ import { encodeModifiers, CELL_STRIDE, OFF_FLAGS, OFF_ALPHA, FLAG_EMPTY, FLAG_BG_SET } from '../render/packed-cell.js';
13
12
  /** Pre-parse a CellTextStyle into numeric RGB + flags for setRGB. Returns undefined if not parseable. */
14
13
  function parseStyleRGB(style) {
15
14
  let fgR = -1, fgG = 0, fgB = 0;
16
15
  let bgR = -1, bgG = 0, bgB = 0;
17
- if (style.fg) {
18
- const rgb = parseHex(style.fg);
19
- if (!rgb)
20
- return undefined;
21
- fgR = rgb[0];
22
- fgG = rgb[1];
23
- fgB = rgb[2];
16
+ const fgRgb = style.fgRGB ?? colorRgb(style.fg);
17
+ if (style.fg != null && fgRgb == null)
18
+ return undefined;
19
+ if (fgRgb) {
20
+ fgR = fgRgb[0];
21
+ fgG = fgRgb[1];
22
+ fgB = fgRgb[2];
24
23
  }
25
- if (style.bg) {
26
- const rgb = parseHex(style.bg);
27
- if (!rgb)
28
- return undefined;
29
- bgR = rgb[0];
30
- bgG = rgb[1];
31
- bgB = rgb[2];
24
+ const bgRgb = style.bgRGB ?? colorRgb(style.bg);
25
+ if (style.bg != null && bgRgb == null)
26
+ return undefined;
27
+ if (bgRgb) {
28
+ bgR = bgRgb[0];
29
+ bgG = bgRgb[1];
30
+ bgB = bgRgb[2];
32
31
  }
33
32
  return { fgR, fgG, fgB, bgR, bgG, bgB, flags: encodeModifiers(style.modifiers) };
34
33
  }
@@ -46,7 +45,7 @@ function withInheritedBackground(surface, background) {
46
45
  const next = surface.clone();
47
46
  if (isPackedSurface(next)) {
48
47
  // Fast path: write bg bytes directly into the buffer
49
- const bgRGB = parseHex(background);
48
+ const bgRGB = colorRgb(background);
50
49
  if (bgRGB) {
51
50
  const buf = next.buffer;
52
51
  const [bgR, bgG, bgB] = bgRGB;
@@ -71,7 +70,7 @@ function withInheritedBackground(surface, background) {
71
70
  const cell = next.get(x, y);
72
71
  if (cell.empty || cell.bg != null)
73
72
  continue;
74
- next.set(x, y, { ...cell, bg: background });
73
+ next.set(x, y, { ...cell, bg: colorHex(background) });
75
74
  }
76
75
  }
77
76
  return next;
@@ -84,6 +83,7 @@ function withInheritedBackground(surface, background) {
84
83
  export function boxSurface(content, options = {}) {
85
84
  const ctx = resolveCtx(options.ctx);
86
85
  const { title, width: fixedWidth, padding = {} } = options;
86
+ const safeTitle = title != null ? sanitizePlainTerminalText(title) : '';
87
87
  const bcss = ctx?.resolveBCSS({ type: 'Box', id: options.id, classes: options.class?.split(' ') }) ?? {};
88
88
  const overflow = resolveOverflowBehavior(options.overflow, bcss);
89
89
  const normalizedFixedWidth = normalizeFixedWidth(fixedWidth);
@@ -103,8 +103,8 @@ export function boxSurface(content, options = {}) {
103
103
  ? wrapSurfaceToWidth(content, Math.max(0, normalizedFixedWidth - 2 - pl - pr))
104
104
  : content;
105
105
  }
106
- const autoTitleWidth = normalizedFixedWidth === undefined && title
107
- ? segmentSurfaceText(` ${title} `, 'boxSurface title').length
106
+ const autoTitleWidth = normalizedFixedWidth === undefined && safeTitle.length > 0
107
+ ? segmentSurfaceText(` ${safeTitle} `, 'boxSurface title').length
108
108
  : 0;
109
109
  const innerW = normalizedFixedWidth === undefined
110
110
  ? Math.max(contentSurf.width + pl + pr, autoTitleWidth)
@@ -153,9 +153,9 @@ export function boxSurface(content, options = {}) {
153
153
  surface.setRGB(outerW - 1, 0, BORDER.tr, fgR, fgG, fgB, bgR, bgG, bgB, flags);
154
154
  surface.setRGB(0, outerH - 1, BORDER.bl, fgR, fgG, fgB, bgR, bgG, bgB, flags);
155
155
  surface.setRGB(outerW - 1, outerH - 1, BORDER.br, fgR, fgG, fgB, bgR, bgG, bgB, flags);
156
- if (title && outerW >= 4) {
156
+ if (safeTitle.length > 0 && outerW >= 4) {
157
157
  const available = Math.max(0, outerW - 4);
158
- const titleText = clipToWidth(` ${title} `, available);
158
+ const titleText = clipToWidth(` ${safeTitle} `, available);
159
159
  const titleGs = segmentSurfaceText(titleText, 'boxSurface title');
160
160
  const titleLen = Math.min(titleGs.length, available);
161
161
  for (let i = 0; i < titleLen; i++) {
@@ -182,9 +182,9 @@ export function boxSurface(content, options = {}) {
182
182
  surface.set(outerW - 1, 0, { ...borderCell, char: BORDER.tr });
183
183
  surface.set(0, outerH - 1, { ...borderCell, char: BORDER.bl });
184
184
  surface.set(outerW - 1, outerH - 1, { ...borderCell, char: BORDER.br });
185
- if (title && outerW >= 4) {
185
+ if (safeTitle.length > 0 && outerW >= 4) {
186
186
  const available = Math.max(0, outerW - 4);
187
- const titleText = clipToWidth(` ${title} `, available);
187
+ const titleText = clipToWidth(` ${safeTitle} `, available);
188
188
  const titleGs = segmentSurfaceText(titleText, 'boxSurface title');
189
189
  const titleLen = Math.min(titleGs.length, available);
190
190
  for (let i = 0; i < titleLen; i++) {
@@ -204,8 +204,8 @@ export function boxSurface(content, options = {}) {
204
204
  */
205
205
  export function headerBoxSurface(label, options = {}) {
206
206
  const ctx = resolveCtx(options.ctx);
207
- const safeLabel = label ?? '';
208
- const detail = options.detail ?? '';
207
+ const safeLabel = sanitizePlainTerminalText(label ?? '');
208
+ const detail = sanitizePlainTerminalText(options.detail ?? '');
209
209
  const labelToken = options.labelToken ?? ctx?.semantic('primary');
210
210
  const mutedToken = ctx?.semantic('muted');
211
211
  const segments = [];