@flyingrobots/bijou 4.4.0 → 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 +52 -189
  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 +40 -0
  9. package/dist/context-theme.d.ts.map +1 -0
  10. package/dist/context-theme.js +42 -0
  11. package/dist/context-theme.js.map +1 -0
  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 -5
  164. package/dist/index.d.ts.map +1 -1
  165. package/dist/index.js +8 -5
  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
@@ -2,20 +2,16 @@
2
2
 
3
3
  The pure, zero-dependency core of Bijou.
4
4
 
5
- `@flyingrobots/bijou` is the degradation-first terminal toolkit in the Bijou stack. It contains components, prompts, themes, environment detection, test adapters, and the foundational `Surface` and `LayoutNode` primitives that the interactive runtime builds on.
5
+ `@flyingrobots/bijou` provides the foundational primitives for CLIs, prompts, and portable terminal output. It manages components, themes, environment detection, and the core `Surface` and `LayoutNode` types.
6
6
 
7
- ## Package Role
7
+ ## Role
8
8
 
9
- - **Core/runtime split stays explicit** — the core package remains the right place for CLIs, prompts, logs, and portable terminal output, while `@flyingrobots/bijou-tui` owns the fullscreen runtime.
10
- - **Surface primitives without abandoning strings** — the package is intentionally mixed-mode. String-oriented helpers remain first-class where they fit the toolkit identity, and runtime-friendly surface helpers exist where they actually help.
11
- - **Surface-first companions for common runtime chrome** — `boxSurface`, `headerBoxSurface`, `separatorSurface`, `alertSurface`, and `tableSurface` let runtime apps stay on the `Surface` path for common layout and status primitives.
12
- - **Explicit seam crossing** — when you move `Surface` output back into string-first APIs, you do it deliberately with `surfaceToString(surface, ctx.style)`.
13
- - **Same hexagonal core** — ports, themes, output-mode detection, and test adapters remain pure and dependency-free.
14
- - **Byte-packed surfaces** `Surface` is backed by a `Uint8Array` (10 bytes per cell). The `setRGB()` method writes character code + numeric RGB directly into the buffer with zero string parsing or object allocation. All built-in surface components use this fast path automatically.
15
-
16
- ## Documentation
17
-
18
- See the [Bijou repo](https://github.com/flyingrobots/bijou) for the full documentation map, architecture guide, design system, and DOGFOOD proving surface.
9
+ - **Degradation-First**: Automatic mode detection for `interactive`, `static`, `pipe`, and `accessible` output.
10
+ - **Mixed-Mode**: High-performance `Surface` primitives for rich TUI apps, with
11
+ string-first helpers for standalone CLI scripts.
12
+ - **Surface primitives without abandoning strings**: Runtime apps can stay on
13
+ the surface path while CLI-first flows still use the string-first helpers.
14
+ - **Hexagonal Core**: Pure TypeScript logic isolated from platform IO via `Runtime`, `IO`, and `Style` ports.
19
15
 
20
16
  ## Install
21
17
 
@@ -29,7 +25,6 @@ npm install @flyingrobots/bijou @flyingrobots/bijou-node
29
25
  import { initDefaultContext } from '@flyingrobots/bijou-node';
30
26
  import { badge, boxSurface, tableSurface } from '@flyingrobots/bijou';
31
27
 
32
- // Initialize Node.js adapters (auto-detects TTY, CI, NO_COLOR)
33
28
  const ctx = initDefaultContext();
34
29
 
35
30
  const panel = boxSurface(
@@ -38,186 +33,54 @@ const panel = boxSurface(
38
33
  rows: [['api', badge('LIVE', { variant: 'success', ctx })]],
39
34
  ctx,
40
35
  }),
41
- { title: 'Runtime', padding: { top: 1, bottom: 1, left: 2, right: 2 }, ctx },
36
+ {
37
+ title: 'Runtime',
38
+ padding: { top: 1, bottom: 1, left: 1, right: 1 },
39
+ ctx,
40
+ },
42
41
  );
43
-
44
- // Return `panel` from a runtime `view()` function or framed pane renderer.
45
42
  ```
46
43
 
47
- ## Features Breakdown
48
-
49
- - **Resilient rendering**: automatic mode switching for interactive, static, pipe, and accessible output.
50
- - **Core UI primitives**: `box`, `headerBox`, `table`, `tree`, `accordion`, `tabs`, `breadcrumb`, `stepper`, `timeline`, `paginator`.
51
- - **Graph tooling**: `dag`, `dagSlice`, and `dagStats` for visualizing and analyzing DAGs.
52
- - **Interactive forms**: `input`, `select`, `multiselect`, `confirm`, `group`, `wizard`, `textarea`, and `filter`.
53
- - **Theme system**: preset themes + DTCG-compatible custom token loading via `BIJOU_THEME`.
54
- - **Test adapters**: deterministic test context and assertion helpers for mock-free component testing.
55
-
56
- ## Design guidance
57
-
58
- For the system-level guidance behind the component catalog, see:
59
-
60
- - [`../../docs/design-system/README.md`](../../docs/design-system/README.md)
61
- - [`../../docs/design-system/foundations.md`](../../docs/design-system/foundations.md)
62
- - [`../../docs/design-system/patterns.md`](../../docs/design-system/patterns.md)
63
- - [`../../docs/design-system/component-families.md`](../../docs/design-system/component-families.md)
64
-
65
- Those docs answer the questions the API reference cannot:
66
-
67
- - when to use a family
68
- - when not to use it
69
- - which variation is semantic versus render-path versus interaction-layer
70
- - what belongs in core Bijou versus `@flyingrobots/bijou-tui`
71
-
72
- ## Choosing Component Families
73
-
74
- ### Status and feedback
75
-
76
- - Use `badge()` when status is compact and belongs inline with another object.
77
- - Use `note()` when the user needs explanation without urgency.
78
- - Use `alert()` when the message should persist inside the page or document flow.
79
- - Move to `@flyingrobots/bijou-tui` notifications when stacking, placement, actions, or history matter.
80
-
81
- ### Selection and prompts
82
-
83
- - Use `select()` when the user is choosing one stored value from a short, stable set.
84
- - Use `filter()` when the user is still choosing one stored value, but search and narrowing are the real job.
85
- - Use `multiselect()` when the user is building a lasting set, not firing one-off commands.
86
- - Use `confirm()` only when the decision is genuinely binary.
87
- - Move to `commandPaletteSurface()` in `@flyingrobots/bijou-tui` when the outcome is an action or navigation command instead of stored form state.
88
-
89
- ### Tables and inspection
90
-
91
- - Use `table()` when row/column comparison is the main job and string output is still the right endpoint.
92
- - Use `tableSurface()` when the job is still passive comparison, but your runtime app is already composing `Surface` output.
93
- - Use `navigableTable()` from `@flyingrobots/bijou-tui` when the user needs keyboard-owned row or cell inspection instead of passive reading.
94
-
95
- ### Hierarchy and chronology
96
-
97
- - Use `tree()` when parent/child nesting is the main thing the reader needs to understand.
98
- - Use `timeline()` when chronology is the actual reading path.
99
- - Move to `dag()` when dependency or causal flow matters more than simple order or nesting.
100
- - Use `dagSlice()` when a local neighborhood or ancestor/descendant chain is the honest scope.
101
- - Use `dagStats()` when graph health or structural summary matters more than visual shape.
102
-
103
- ### Wayfinding and progress
104
-
105
- - Use `breadcrumb()` when path context helps explain the current location.
106
- - Use `paginator()` when compact position-in-sequence feedback is enough.
107
- - Use `stepper()` when the user is progressing through ordered stages rather than switching among peers.
108
-
109
- ### Containment and formatted content
110
-
111
- - Use `box()` when a region needs visible containment or comparison against sibling panels.
112
- - Use `headerBox()` when that same region also needs a compact title and detail line.
113
- - Use `markdown()` for bounded help, reference, and release-note prose that should lower honestly across rich, pipe, and accessible output.
114
- - Avoid turning every subsection into a box or using markdown as a substitute layout engine for full application chrome.
115
-
116
- ### Loading, links, and expressive moments
117
-
118
- - Use `skeleton()` for short-lived placeholders when the final content shape is known.
119
- - Use `hyperlink()` when the destination itself should remain explicit and trustworthy in terminal output.
120
- - Use `kbd()` for local inline shortcut cues; use shell help in `@flyingrobots/bijou-tui` when the user needs a broader keybinding reference.
121
- - Use `gradientText()` and `loadRandomLogo()` sparingly for splash, docs, and celebratory moments rather than routine workspace chrome.
122
-
123
- ### Progress and custom primitives
124
-
125
- - Use `progressBar()` when completion can be estimated honestly.
126
- - Use `spinnerFrame()` or `createSpinner()` when the task is active but indeterminate.
127
- - Use `renderByMode()` when you are authoring an app-specific primitive that must stay truthful across rich, pipe, and accessible output.
128
-
129
- ## Components
44
+ ## Strategy: Choosing Component Families
45
+
46
+ Select the family based on the interaction semantic, not just the visual shape.
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
+
54
+ ### Status and Feedback
55
+ - **`badge()`**: Compact, inline status.
56
+ - **`note()`**: Non-urgent explanation.
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.
60
+ - *Use `@flyingrobots/bijou-tui` notifications for stacking, history, or active routing.*
61
+
62
+ ### Selection and Prompts
63
+ - **`select()`**: Single choice from a stable set.
64
+ - **`filter()`**: Search-led choice from a large or dynamic set.
65
+ - **`multiselect()`**: Choosing multiple values to build a set.
66
+ - **`confirm()`**: Strictly binary decisions.
67
+
68
+ ### Hierarchy and Chronology
69
+ - **`tree()`**: Parent/child nesting.
70
+ - **`timeline()`**: Sequential, time-ordered events.
71
+ - **`dag()`**: Causal or dependency-based graphs.
72
+
73
+ ### Progress and Wayfinding
74
+ - **`progressBar()`**: Determinate completion.
75
+ - **`spinner()`**: Indeterminate activity.
76
+ - **`breadcrumb()`**: Path context.
77
+ - **`stepper()`**: Ordered stages in a linear process.
130
78
 
131
- ### Layout
132
- `box()`, `headerBox()`, `separator()` plus `boxSurface()`, `headerBoxSurface()`, `separatorSurface()` — string-first helpers and surface-native companions for layout chrome.
133
-
134
- ### Elements
135
- `badge()`, `alert()`, `alertSurface()`, `kbd()`, `skeleton()`, `hyperlink()` — inline status, in-flow status blocks, loading placeholders, trusted links, and UI primitives.
136
-
137
- ### Data
138
- `table()`, `tableSurface()`, `tree()`, `accordion()`, `timeline()`, `dag()`, `dagSlice()`, `dagLayout()`, `dagStats()` — passive comparison and structured data display, DAG rendering with `DagSource` adapter, and graph statistics.
139
-
140
- ### Documents
141
- `markdown()` — structured terminal prose for help, readmes, and reference content with mode-aware lowering.
142
-
143
- ### Navigation
144
- `tabs()`, `breadcrumb()`, `stepper()`, `paginator()` — wayfinding components.
145
-
146
- ### Animation & Progress
147
- `spinnerFrame()`, `createSpinner()`, `progressBar()`, `createProgressBar()`, `createAnimatedProgressBar()`, `gradientText()`, `loadRandomLogo()` — determinate and indeterminate progress, live-updating output, expressive gradients, and branded ASCII moments.
148
-
149
- ### Authoring helpers
150
- `renderByMode()` — mode-aware helper for app-authored primitives that need honest rich/pipe/accessible lowering.
151
-
152
- ### Forms
153
- `input()`, `select()`, `multiselect()`, `confirm()`, `group()`, `wizard()`, `textarea()`, `filter()` — interactive prompts with validation that degrade to numbered-list selection in pipe/CI modes.
154
-
155
- ### Theme Engine
156
- DTCG (Design Tokens Community Group) interop. Built-in presets: `nord`, `catppuccin`, `cyan-magenta`, `teal-orange-pink`. Load custom themes via `BIJOU_THEME` env var or `extendTheme()`.
157
-
158
- ## Architecture
159
-
160
- bijou uses a Ports and Adapters (hexagonal) architecture. See [ARCHITECTURE.md](./ARCHITECTURE.md) for the package-level design and [`../../docs/ARCHITECTURE.md`](../../docs/ARCHITECTURE.md) for the monorepo-wide architecture.
161
-
162
- The core is pure TypeScript with zero runtime dependencies — all platform concerns flow through three ports:
163
-
164
- - **`RuntimePort`** — environment variables, TTY detection, terminal dimensions
165
- - **`IOPort`** — stdout writes, stdin reads, resize events, file I/O
166
- - **`StylePort`** — RGB/hex color application, bold/italic/etc.
167
-
168
- ### Output Modes
169
-
170
- bijou auto-detects the environment and adapts rendering:
171
-
172
- | Mode | Trigger | Behavior |
173
- | :--- | :--- | :--- |
174
- | **Interactive** | TTY | Full RGB, unicode, animations |
175
- | **Static** | `CI=true` | Single-frame, no animations |
176
- | **Pipe** | Piped stdout | Plain text, ASCII fallbacks |
177
- | **Accessible** | `BIJOU_ACCESSIBLE=1` | Screen-reader friendly |
178
-
179
- ## Testing
180
-
181
- Import test adapters for deterministic, mock-free component testing:
182
-
183
- ```typescript
184
- import { createTestContext } from '@flyingrobots/bijou/adapters/test';
185
- import { box } from '@flyingrobots/bijou';
186
-
187
- const ctx = createTestContext({ mode: 'interactive' });
188
- const result = box('hello', { ctx });
189
- // Assert on the string directly — no process mocking needed
190
- ```
191
-
192
- See [GUIDE.md](./GUIDE.md) for more on testing, theming, and component usage.
193
- For upgrading existing apps, see the monorepo migration guide at [`../../docs/MIGRATING_TO_V4.md`](../../docs/MIGRATING_TO_V4.md).
194
-
195
- ## Related Packages
196
-
197
- - [`@flyingrobots/bijou-node`](https://www.npmjs.com/package/@flyingrobots/bijou-node) — Node.js runtime adapter (chalk, readline, process)
198
- - [`@flyingrobots/bijou-tui`](https://www.npmjs.com/package/@flyingrobots/bijou-tui) — TEA runtime for interactive terminal apps
199
-
200
- ## License
79
+ ## Documentation
201
80
 
202
- Apache-2.0
81
+ - **[GUIDE.md](./GUIDE.md)**: Productive-fast path.
82
+ - **[ADVANCED_GUIDE.md](./ADVANCED_GUIDE.md)**: Rendering doctrine, themes, and testing.
83
+ - **[Design System](../../docs/design-system/README.md)**: Foundations, token vocabulary, and component families.
203
84
 
204
85
  ---
205
-
206
- <p align="center">
207
- Built with 💎 by <a href="https://github.com/flyingrobots">FLYING ROBOTS</a>
208
- </p>
209
-
210
- ```rust
211
- .-:::::'::: .-:. ::-.::::::. :::. .,-:::::/
212
- ;;;'''' ;;; ';;. ;;;;';;;`;;;;, `;;;,;;-'````'
213
- [[[,,== [[[ '[[,[[[' [[[ [[[[[. '[[[[[ [[[[[[/
214
- `$$$"`` $$' c$$" $$$ $$$ "Y$c$$"$$c. "$$
215
- 888 o88oo,.__ ,8P"` 888 888 Y88 `Y8bo,,,o88o
216
- "MM, """"YUMMMmM" MMM MMM YM `'YMUP"YMM
217
- :::::::.. ... :::::::. ... :::::::::::: .::::::.
218
- ;;;;``;;;; .;;;;;;;. ;;;'';;' .;;;;;;;.;;;;;;;;'''';;;` `
219
- [[[,/[[[' ,[[ \[[, [[[__[[\.,[[ \[[, [[ '[==/[[[[,
220
- $$$$$$c $$$, $$$ $$""""Y$$$$$, $$$ $$ ''' $
221
- 888b "88bo,"888,_ _,88P_88o,,od8P"888,_ _,88P 88, 88b dP
222
- MMMM "W" "YMMMMMP" ""YUMMMP" "YMMMMMP" MMM "YMmMY"
223
- ```
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"}
@@ -0,0 +1,40 @@
1
+ import type { BijouContext } from './ports/context.js';
2
+ import { type ResolvedTheme } from './core/theme/resolve.js';
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
+ }
18
+ /**
19
+ * Clone a Bijou context with a different already-resolved theme.
20
+ *
21
+ * The original context is left untouched; callers get a fresh object with
22
+ * the same runtime/style/IO ports and updated theme accessors.
23
+ */
24
+ export declare function cloneContextWithResolvedTheme(ctx: BijouContext, theme: ResolvedTheme): BijouContext;
25
+ /**
26
+ * Clone a Bijou context with a different theme definition.
27
+ */
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;
40
+ //# sourceMappingURL=context-theme.d.ts.map
@@ -0,0 +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,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"}
@@ -0,0 +1,42 @@
1
+ import { createThemeAccessors } from './core/theme/accessors.js';
2
+ import { createResolved } from './core/theme/resolve.js';
3
+ /**
4
+ * Clone a Bijou context with a different already-resolved theme.
5
+ *
6
+ * The original context is left untouched; callers get a fresh object with
7
+ * the same runtime/style/IO ports and updated theme accessors.
8
+ */
9
+ export function cloneContextWithResolvedTheme(ctx, theme) {
10
+ return {
11
+ ...ctx,
12
+ theme,
13
+ tokenGraph: theme.tokenGraph,
14
+ ...createThemeAccessors(theme),
15
+ };
16
+ }
17
+ /**
18
+ * Clone a Bijou context with a different theme definition.
19
+ */
20
+ export function cloneContextWithTheme(ctx, theme) {
21
+ return cloneContextWithResolvedTheme(ctx, createResolved(theme, ctx.theme.noColor, ctx.theme.colorScheme));
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
+ }
42
+ //# sourceMappingURL=context-theme.js.map
@@ -0,0 +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;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"}