@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.
- package/README.md +9 -1
- package/dist/adapters/test/index.d.ts.map +1 -1
- package/dist/adapters/test/index.js +1 -3
- package/dist/adapters/test/index.js.map +1 -1
- package/dist/adapters/test/runtime.d.ts.map +1 -1
- package/dist/adapters/test/runtime.js +4 -3
- package/dist/adapters/test/runtime.js.map +1 -1
- package/dist/context-theme.d.ts +25 -0
- package/dist/context-theme.d.ts.map +1 -1
- package/dist/context-theme.js +19 -0
- package/dist/context-theme.js.map +1 -1
- package/dist/context.d.ts +13 -1
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +24 -3
- package/dist/context.js.map +1 -1
- package/dist/core/components/alert-v3.d.ts.map +1 -1
- package/dist/core/components/alert-v3.js +5 -4
- package/dist/core/components/alert-v3.js.map +1 -1
- package/dist/core/components/alert.d.ts.map +1 -1
- package/dist/core/components/alert.js +7 -8
- package/dist/core/components/alert.js.map +1 -1
- package/dist/core/components/badge.d.ts.map +1 -1
- package/dist/core/components/badge.js +19 -18
- package/dist/core/components/badge.js.map +1 -1
- package/dist/core/components/box-v3.d.ts.map +1 -1
- package/dist/core/components/box-v3.js +29 -29
- package/dist/core/components/box-v3.js.map +1 -1
- package/dist/core/components/dag-edges.d.ts +21 -4
- package/dist/core/components/dag-edges.d.ts.map +1 -1
- package/dist/core/components/dag-edges.js +79 -16
- package/dist/core/components/dag-edges.js.map +1 -1
- package/dist/core/components/dag-layout.d.ts +3 -4
- package/dist/core/components/dag-layout.d.ts.map +1 -1
- package/dist/core/components/dag-layout.js +42 -9
- package/dist/core/components/dag-layout.js.map +1 -1
- package/dist/core/components/dag-render.d.ts +3 -2
- package/dist/core/components/dag-render.d.ts.map +1 -1
- package/dist/core/components/dag-render.js +20 -37
- package/dist/core/components/dag-render.js.map +1 -1
- package/dist/core/components/dag.d.ts +7 -4
- package/dist/core/components/dag.d.ts.map +1 -1
- package/dist/core/components/dag.js.map +1 -1
- package/dist/core/components/explainability.d.ts.map +1 -1
- package/dist/core/components/explainability.js +30 -87
- package/dist/core/components/explainability.js.map +1 -1
- package/dist/core/components/guided-flow.d.ts +32 -0
- package/dist/core/components/guided-flow.d.ts.map +1 -0
- package/dist/core/components/guided-flow.js +131 -0
- package/dist/core/components/guided-flow.js.map +1 -0
- package/dist/core/components/hyperlink.d.ts.map +1 -1
- package/dist/core/components/hyperlink.js +7 -4
- package/dist/core/components/hyperlink.js.map +1 -1
- package/dist/core/components/index.d.ts +4 -2
- package/dist/core/components/index.d.ts.map +1 -1
- package/dist/core/components/index.js +1 -0
- package/dist/core/components/index.js.map +1 -1
- package/dist/core/components/markdown-parse.d.ts +4 -0
- package/dist/core/components/markdown-parse.d.ts.map +1 -1
- package/dist/core/components/markdown-parse.js +66 -2
- package/dist/core/components/markdown-parse.js.map +1 -1
- package/dist/core/components/markdown-render.d.ts.map +1 -1
- package/dist/core/components/markdown-render.js +220 -14
- package/dist/core/components/markdown-render.js.map +1 -1
- package/dist/core/components/markdown.d.ts +4 -3
- package/dist/core/components/markdown.d.ts.map +1 -1
- package/dist/core/components/markdown.js +6 -5
- package/dist/core/components/markdown.js.map +1 -1
- package/dist/core/components/paginator.d.ts.map +1 -1
- package/dist/core/components/paginator.js +5 -3
- package/dist/core/components/paginator.js.map +1 -1
- package/dist/core/components/perf-overlay.d.ts.map +1 -1
- package/dist/core/components/perf-overlay.js +3 -2
- package/dist/core/components/perf-overlay.js.map +1 -1
- package/dist/core/components/preference-list.d.ts.map +1 -1
- package/dist/core/components/preference-list.js +75 -37
- package/dist/core/components/preference-list.js.map +1 -1
- package/dist/core/components/progress.d.ts.map +1 -1
- package/dist/core/components/progress.js +4 -3
- package/dist/core/components/progress.js.map +1 -1
- package/dist/core/components/separator-v3.d.ts.map +1 -1
- package/dist/core/components/separator-v3.js +11 -11
- package/dist/core/components/separator-v3.js.map +1 -1
- package/dist/core/components/separator.d.ts.map +1 -1
- package/dist/core/components/separator.js +4 -1
- package/dist/core/components/separator.js.map +1 -1
- package/dist/core/components/skeleton.d.ts.map +1 -1
- package/dist/core/components/skeleton.js +3 -2
- package/dist/core/components/skeleton.js.map +1 -1
- package/dist/core/components/surface-text.d.ts +7 -0
- package/dist/core/components/surface-text.d.ts.map +1 -1
- package/dist/core/components/surface-text.js +33 -25
- package/dist/core/components/surface-text.js.map +1 -1
- package/dist/core/components/table-v3.d.ts +5 -2
- package/dist/core/components/table-v3.d.ts.map +1 -1
- package/dist/core/components/table-v3.js +26 -16
- package/dist/core/components/table-v3.js.map +1 -1
- package/dist/core/components/table.d.ts +16 -2
- package/dist/core/components/table.d.ts.map +1 -1
- package/dist/core/components/table.js +136 -18
- package/dist/core/components/table.js.map +1 -1
- package/dist/core/forms/filter-interactive.d.ts.map +1 -1
- package/dist/core/forms/filter-interactive.js +2 -4
- package/dist/core/forms/filter-interactive.js.map +1 -1
- package/dist/core/forms/multiselect.d.ts.map +1 -1
- package/dist/core/forms/multiselect.js +2 -4
- package/dist/core/forms/multiselect.js.map +1 -1
- package/dist/core/forms/note.d.ts.map +1 -1
- package/dist/core/forms/note.js +2 -1
- package/dist/core/forms/note.js.map +1 -1
- package/dist/core/forms/select.d.ts.map +1 -1
- package/dist/core/forms/select.js +2 -4
- package/dist/core/forms/select.js.map +1 -1
- package/dist/core/forms/textarea-editor.d.ts.map +1 -1
- package/dist/core/forms/textarea-editor.js +7 -5
- package/dist/core/forms/textarea-editor.js.map +1 -1
- package/dist/core/layout/geometry.d.ts +39 -0
- package/dist/core/layout/geometry.d.ts.map +1 -0
- package/dist/core/layout/geometry.js +201 -0
- package/dist/core/layout/geometry.js.map +1 -0
- package/dist/core/numeric.d.ts +16 -0
- package/dist/core/numeric.d.ts.map +1 -0
- package/dist/core/numeric.js +37 -0
- package/dist/core/numeric.js.map +1 -0
- package/dist/core/render/differ.d.ts.map +1 -1
- package/dist/core/render/differ.js +15 -13
- package/dist/core/render/differ.js.map +1 -1
- package/dist/core/runtime-viewport.d.ts.map +1 -1
- package/dist/core/runtime-viewport.js +2 -3
- package/dist/core/runtime-viewport.js.map +1 -1
- package/dist/core/text/grapheme.d.ts +51 -0
- package/dist/core/text/grapheme.d.ts.map +1 -1
- package/dist/core/text/grapheme.js +68 -0
- package/dist/core/text/grapheme.js.map +1 -1
- package/dist/core/text/icon-presentation.d.ts +10 -0
- package/dist/core/text/icon-presentation.d.ts.map +1 -0
- package/dist/core/text/icon-presentation.js +12 -0
- package/dist/core/text/icon-presentation.js.map +1 -0
- package/dist/core/text/index.d.ts +2 -1
- package/dist/core/text/index.d.ts.map +1 -1
- package/dist/core/text/index.js +2 -1
- package/dist/core/text/index.js.map +1 -1
- package/dist/core/theme/color.d.ts +32 -0
- package/dist/core/theme/color.d.ts.map +1 -1
- package/dist/core/theme/color.js +68 -0
- package/dist/core/theme/color.js.map +1 -1
- package/dist/core/theme/graph-types.d.ts +5 -0
- package/dist/core/theme/graph-types.d.ts.map +1 -1
- package/dist/core/theme/graph.d.ts.map +1 -1
- package/dist/core/theme/graph.js +52 -5
- package/dist/core/theme/graph.js.map +1 -1
- package/dist/core/theme/index.d.ts +2 -1
- package/dist/core/theme/index.d.ts.map +1 -1
- package/dist/core/theme/index.js +1 -1
- package/dist/core/theme/index.js.map +1 -1
- package/dist/core/theme/presets.d.ts +3 -2
- package/dist/core/theme/presets.d.ts.map +1 -1
- package/dist/core/theme/presets.js +18 -29
- package/dist/core/theme/presets.js.map +1 -1
- package/dist/factory.d.ts +3 -0
- package/dist/factory.d.ts.map +1 -1
- package/dist/factory.js +4 -6
- package/dist/factory.js.map +1 -1
- package/dist/index.d.ts +8 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -6
- package/dist/index.js.map +1 -1
- package/dist/ports/context.d.ts +6 -1
- package/dist/ports/context.d.ts.map +1 -1
- package/dist/ports/surface.d.ts +6 -4
- package/dist/ports/surface.d.ts.map +1 -1
- package/dist/ports/surface.js +40 -23
- package/dist/ports/surface.js.map +1 -1
- 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)**:
|
|
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;
|
|
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;
|
|
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;
|
|
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
|
|
24
|
-
rows: options.rows
|
|
25
|
-
refreshRate: options.refreshRate
|
|
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":"
|
|
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"}
|
package/dist/context-theme.d.ts
CHANGED
|
@@ -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"}
|
package/dist/context-theme.js
CHANGED
|
@@ -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;
|
|
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
|
-
*
|
|
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
|
*/
|
package/dist/context.d.ts.map
CHANGED
|
@@ -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;
|
|
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-
|
|
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
|
-
*
|
|
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
|
package/dist/context.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAEA,IAAI,cAAc,GAAwB,IAAI,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;
|
|
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;
|
|
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;
|
|
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
|
-
*
|
|
8
|
-
*
|
|
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;
|
|
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,
|
|
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 {
|
|
4
|
+
import { graphemeWidth, sanitizePlainTerminalText } from '../text/index.js';
|
|
4
5
|
import { applyBCSSCellTextStyles } from './bcss-style.js';
|
|
5
|
-
import {
|
|
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
|
|
19
|
-
const
|
|
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' ? `[${
|
|
25
|
-
return stringToSurface(char, char
|
|
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
|
|
52
|
-
if (
|
|
53
|
-
const 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
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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
|
-
|
|
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":"AAAA,OAAO,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"badge.js","sourceRoot":"","sources":["../../../src/core/components/badge.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"box-v3.d.ts","sourceRoot":"","sources":["../../../src/core/components/box-v3.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
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 {
|
|
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
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
fgR =
|
|
22
|
-
fgG =
|
|
23
|
-
fgB =
|
|
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
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
bgR =
|
|
30
|
-
bgG =
|
|
31
|
-
bgB =
|
|
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 =
|
|
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 &&
|
|
107
|
-
? segmentSurfaceText(` ${
|
|
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 (
|
|
156
|
+
if (safeTitle.length > 0 && outerW >= 4) {
|
|
157
157
|
const available = Math.max(0, outerW - 4);
|
|
158
|
-
const titleText = clipToWidth(` ${
|
|
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 (
|
|
185
|
+
if (safeTitle.length > 0 && outerW >= 4) {
|
|
186
186
|
const available = Math.max(0, outerW - 4);
|
|
187
|
-
const titleText = clipToWidth(` ${
|
|
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 = [];
|