@textui/core 0.6.1 → 0.8.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 (46) hide show
  1. package/dist/app/app.d.ts.map +1 -1
  2. package/dist/app/app.js +8 -1
  3. package/dist/core/focus.d.ts.map +1 -1
  4. package/dist/core/focus.js +33 -3
  5. package/dist/core/i18n.d.ts +6 -3
  6. package/dist/core/i18n.d.ts.map +1 -1
  7. package/dist/core/i18n.js +10 -6
  8. package/dist/jsx/intrinsics.d.ts +23 -0
  9. package/dist/jsx/intrinsics.d.ts.map +1 -1
  10. package/dist/runtime/hooks.d.ts.map +1 -1
  11. package/dist/runtime/hooks.js +15 -0
  12. package/dist/runtime/paint.js +12 -2
  13. package/dist/runtime/style.d.ts +17 -7
  14. package/dist/runtime/style.d.ts.map +1 -1
  15. package/dist/runtime/style.js +66 -6
  16. package/dist/themes/builtin.d.ts +0 -9
  17. package/dist/themes/builtin.d.ts.map +1 -1
  18. package/dist/themes/builtin.js +101 -4
  19. package/dist/themes/registry.d.ts.map +1 -1
  20. package/dist/themes/registry.js +26 -0
  21. package/dist/types/focus.d.ts +11 -0
  22. package/dist/types/focus.d.ts.map +1 -1
  23. package/dist/types/i18n.d.ts +14 -3
  24. package/dist/types/i18n.d.ts.map +1 -1
  25. package/dist/types/style.d.ts +53 -14
  26. package/dist/types/style.d.ts.map +1 -1
  27. package/dist/types/theme.d.ts +37 -3
  28. package/dist/types/theme.d.ts.map +1 -1
  29. package/dist/util/text.d.ts +9 -0
  30. package/dist/util/text.d.ts.map +1 -1
  31. package/dist/util/text.js +16 -0
  32. package/package.json +1 -1
  33. package/src/app/app.ts +8 -1
  34. package/src/core/focus.ts +30 -3
  35. package/src/core/i18n.ts +10 -6
  36. package/src/jsx/intrinsics.ts +25 -0
  37. package/src/runtime/hooks.ts +15 -0
  38. package/src/runtime/paint.ts +11 -2
  39. package/src/runtime/style.ts +73 -9
  40. package/src/themes/builtin.ts +105 -4
  41. package/src/themes/registry.ts +23 -0
  42. package/src/types/focus.ts +8 -0
  43. package/src/types/i18n.ts +14 -3
  44. package/src/types/style.ts +85 -18
  45. package/src/types/theme.ts +37 -3
  46. package/src/util/text.ts +15 -0
@@ -7,6 +7,70 @@
7
7
  * airy report or a workbench without a component knowing which - so the
8
8
  * difference lives here, in border style and density, not in the catalog.
9
9
  */
10
+ /**
11
+ * A selection, in the two states it has.
12
+ *
13
+ * `selected` is "this is the current one" and `focus` is the same row while
14
+ * the component holds the keyboard, so a theme states the bright fill once and
15
+ * the dimmer one for everything the reader has walked away from. They were one
16
+ * name once - `active` meant both this and pressed - and a word that means two
17
+ * things gets filled with either.
18
+ *
19
+ * Both name tokens rather than colours, which is the point of the whole
20
+ * arrangement: retint the palette and every component that has not said
21
+ * otherwise moves with it, while a theme that states `components.List.focused`
22
+ * moves the list and leaves the table where it was.
23
+ */
24
+ const SELECTION_FOCUSED = { bg: 'selected', fg: 'onSelected', dim: true };
25
+ const SELECTION_UNFOCUSED = { bg: 'active', fg: 'onActive' };
26
+ const SELECTION_HOVER = { bg: 'hover', fg: 'onActive' };
27
+ // The other way to draw a selection: reverse video, which is legible whatever
28
+ // a theme's own two colours are. Left beside the three above while that is
29
+ // decided - nothing reads them yet.
30
+ // const SELECTION_DEFAULT: Style = { bg: 'default', fg: 'default', inverse: true };
31
+ // const SELECTION_DIMMED: Style = { bg: 'default', fg: 'default', inverse: true, dim: true };
32
+ /**
33
+ * The state colours every built-in theme starts from.
34
+ *
35
+ * Stated once and spread into `dark` and `light` because a theme that
36
+ * extends either inherits it whole: the entries name tokens, so `console`
37
+ * keeps its own `selected` and gets its own fills, without restating a single
38
+ * component. That is also what makes them the *defaults* - a theme states
39
+ * `components` to differ, and says nothing here about what it does not.
40
+ */
41
+ const STATE_STYLES = {
42
+ List: { selected: SELECTION_UNFOCUSED, focus: SELECTION_FOCUSED },
43
+ Tree: { selected: SELECTION_UNFOCUSED, focus: SELECTION_FOCUSED },
44
+ Table: { selected: SELECTION_UNFOCUSED, focus: SELECTION_FOCUSED },
45
+ // The field's own selection, over the text it covers. Same pair, same
46
+ // reason: a selection left visible in an unfocused field says what is on
47
+ // the clipboard, and saying it as loudly as the live one would put two
48
+ // selections on the screen.
49
+ TextArea: { selected: SELECTION_UNFOCUSED, focus: SELECTION_FOCUSED },
50
+ // A marked line is a selection. The caret line is that selection plus the
51
+ // keyboard, so it takes the next fill up rather than a colour of its own.
52
+ CodeViewer: { selected: SELECTION_UNFOCUSED, focus: SELECTION_HOVER },
53
+ Menu: { selected: SELECTION_UNFOCUSED, focus: SELECTION_FOCUSED },
54
+ // A tab is open, not selected. Dimming it when the strip does not have the
55
+ // keyboard would say no document is open, which is a different claim and a
56
+ // wrong one - so it has one state and no second.
57
+ //
58
+ // Whether a tab is *filled* is a property of the variant rather than of the
59
+ // state: a solid tab is, an underline one is not. So the pair is stated for
60
+ // the state and the fill only for the variant that has one.
61
+ Tabs: { selected: { fg: 'onSelected' }, 'solid.selected': SELECTION_FOCUSED },
62
+ // The chat rows take the same fills, and for the same reason. `ToolCallRow`
63
+ // and `ReasoningBlock` are selections in a transcript that the caller
64
+ // names, so they have `selected` and no `focus`; a `ComposerChip` lights up
65
+ // only while it holds the keyboard, so it has `focus` and no `selected`.
66
+ ToolCallRow: { selected: SELECTION_FOCUSED },
67
+ ReasoningBlock: { selected: SELECTION_FOCUSED },
68
+ ComposerChip: { focus: SELECTION_FOCUSED },
69
+ // A range in a document is a selection, and it keeps the colours the text
70
+ // under it was already drawn in - the syntax of a selection is the syntax of
71
+ // the code it covers.
72
+ Editor: { selected: { bg: 'active' } },
73
+ };
10
74
  export const DARK = {
11
75
  id: 'dark',
12
76
  name: 'Dark',
@@ -52,6 +116,7 @@ export const DARK = {
52
116
  shadow: '#010409',
53
117
  },
54
118
  spacing: { none: 0, xs: 0, sm: 1, md: 1, lg: 2, xl: 3 },
119
+ components: { ...STATE_STYLES },
55
120
  };
56
121
  export const LIGHT = {
57
122
  id: 'light',
@@ -89,7 +154,7 @@ export const LIGHT = {
89
154
  onWarning: '#ffffff',
90
155
  onDanger: '#ffffff',
91
156
  hover: '#eaeef2',
92
- active: '#dbeafe',
157
+ active: '#a5bdd8',
93
158
  selected: '#0969da',
94
159
  focus: '#0969da',
95
160
  disabled: '#8c959f',
@@ -98,6 +163,7 @@ export const LIGHT = {
98
163
  shadow: '#d0d7de',
99
164
  },
100
165
  spacing: { none: 0, xs: 0, sm: 1, md: 1, lg: 2, xl: 3 },
166
+ components: { ...STATE_STYLES },
101
167
  };
102
168
  /** Dense, bordered, high contrast. Every region is a labelled box. */
103
169
  export const CONSOLE = {
@@ -122,7 +188,9 @@ export const CONSOLE = {
122
188
  //
123
189
  // The two selection backgrounds are picked rather than derived: `selected`
124
190
  // carries `inverted` text so it has to be light, and `active` carries
125
- // `text` so it has to be dark. Same hue, opposite ends.
191
+ // `text` so it has to be dark. Same hue, opposite ends. `active` is what
192
+ // a selection looks like when the component does not have the keyboard -
193
+ // it is the dim end of the pair, not a pressed control.
126
194
  primary: '#88c0d0',
127
195
  info: '#88c0d0',
128
196
  selected: '#6ba3b2',
@@ -166,6 +234,7 @@ export const PAPER = {
166
234
  warning: '#d29922',
167
235
  danger: '#f85149',
168
236
  info: '#58a6ff',
237
+ /* ---- */
169
238
  onAccent: '#0d1117',
170
239
  onDefault: '#0d1117',
171
240
  onPrimary: '#0d1117',
@@ -175,17 +244,22 @@ export const PAPER = {
175
244
  onInfo: '#0d1117',
176
245
  onWarning: '#0d1117',
177
246
  onDanger: '#0d1117',
247
+ /* ---- */
178
248
  hover: '#1f2937',
179
- active: '#264466',
180
- selected: '#1f6feb',
249
+ active: 'default',
250
+ onActive: '#3191ff',
251
+ selected: 'default',
252
+ onSelected: '#58a6ff',
181
253
  focus: '#58a6ff',
182
254
  disabled: '#484f58',
255
+ /* ---- */
183
256
  scrim: '#010409',
184
257
  cursor: 'default',
185
258
  shadow: '#010409',
186
259
  },
187
260
  spacing: { none: 0, xs: 1, sm: 1, md: 2, lg: 3, xl: 4 },
188
261
  components: {
262
+ ...STATE_STYLES,
189
263
  Panel: { base: { border: 'none', padding: [1, 2] } },
190
264
  Button: { base: { padding: [0, 2] } },
191
265
  },
@@ -255,6 +329,9 @@ export const WORKBENCH = {
255
329
  hover: '#313244',
256
330
  active: '#45475a',
257
331
  selected: '#585b70',
332
+ // The selection is a mid grey, so the light text is what reads on it; the
333
+ // inherited `inverted` is darker than the fill and nearly disappears.
334
+ onSelected: '#cdd6f4',
258
335
  focus: '#89b4fa',
259
336
  scrim: '#11111b',
260
337
  },
@@ -267,7 +344,12 @@ export const MONO = {
267
344
  id: 'mono',
268
345
  name: 'Monochrome',
269
346
  appearance: 'dark',
347
+ // The theme's own colours are all `default`; this is what makes that true of
348
+ // the ones a component states for itself, which is the difference between a
349
+ // palette that happens to be grey and a theme with no colour in it.
350
+ monochrome: true,
270
351
  border: 'ascii',
352
+ // border: 'none',
271
353
  cursor: 'underline',
272
354
  // Chosen, not downgraded to: this theme is ascii on a terminal that could
273
355
  // draw anything, so the rule has to say so too.
@@ -308,6 +390,21 @@ export const MONO = {
308
390
  cursor: 'default',
309
391
  shadow: 'default',
310
392
  },
393
+ components: {
394
+ List: { selected: { bold: true }, focus: { bold: true } },
395
+ Tree: { selected: { bold: true }, focus: { bold: true } },
396
+ Table: { selected: { bold: true }, focus: { bold: true } },
397
+ TextArea: { selected: { bold: true }, focus: { bold: true } },
398
+ CodeViewer: { selected: { bold: true }, focus: { bold: true } },
399
+ Menu: { selected: { bold: true }, focus: { bold: true } },
400
+ Tabs: { selected: { bold: true }, 'solid.selected': { bold: true } },
401
+ ToolCallRow: { selected: { bold: true } },
402
+ ReasoningBlock: { selected: { bold: true } },
403
+ ComposerChip: { focus: { bold: true } },
404
+ Editor: { selected: { bold: true } },
405
+ Panel: { base: { border: 'ascii', padding: [0, 1] } },
406
+ Button: { base: { padding: [0, 1] } },
407
+ }
311
408
  };
312
409
  /**
313
410
  * Paper, after dark.
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/themes/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EAAE,eAAe,EAAe,aAAa,EAC3D,MAAM,mBAAmB,CAAC;AAK3B,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAqDzD,qBAAa,MAAO,YAAW,aAAa;IAC1C,OAAO,CAAC,IAAI,CAAsC;IAClD,OAAO,CAAC,KAAK,CAAoC;gBAErC,OAAO,GAAE,eAAe,EAAmB;IAIvD,QAAQ,CAAC,GAAG,EAAE,eAAe,GAAG,UAAU;IAS1C,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAK5B,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAI5C,IAAI,IAAI,eAAe,EAAE;IAIzB;;;;OAIG;IACH,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB,GAAG,aAAa;CAuJ/D;AAED,wBAAgB,YAAY,CAAC,OAAO,CAAC,EAAE,eAAe,EAAE,GAAG,MAAM,CAEhE"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/themes/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EAAE,eAAe,EAAe,aAAa,EAC3D,MAAM,mBAAmB,CAAC;AAK3B,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAsDzD,qBAAa,MAAO,YAAW,aAAa;IAC1C,OAAO,CAAC,IAAI,CAAsC;IAClD,OAAO,CAAC,KAAK,CAAoC;gBAErC,OAAO,GAAE,eAAe,EAAmB;IAIvD,QAAQ,CAAC,GAAG,EAAE,eAAe,GAAG,UAAU;IAS1C,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAK5B,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAI5C,IAAI,IAAI,eAAe,EAAE;IAIzB;;;;OAIG;IACH,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB,GAAG,aAAa;CA6K/D;AAED,wBAAgB,YAAY,CAAC,OAAO,CAAC,EAAE,eAAe,EAAE,GAAG,MAAM,CAEhE"}
@@ -13,6 +13,7 @@ const FALLBACK_COLORS = {
13
13
  onDefault: 'default', onMuted: 'default',
14
14
  onAccent: 'default', onPrimary: 'default', onSecondary: 'default',
15
15
  onSuccess: 'default', onWarning: 'default', onDanger: 'default', onInfo: 'default',
16
+ onSelected: 'default', onActive: 'default',
16
17
  hover: 'default', active: 'default', selected: 'default', focus: 'default',
17
18
  disabled: 'default', scrim: 'default', cursor: 'default', shadow: 'default',
18
19
  };
@@ -105,6 +106,7 @@ export class Themes {
105
106
  // opts in rather than out.
106
107
  let tableRules = 'header';
107
108
  let density = 'normal';
109
+ let monochrome = false;
108
110
  const components = {};
109
111
  let syntaxOverrides = {};
110
112
  for (const def of chain) {
@@ -143,10 +145,28 @@ export class Themes {
143
145
  tableRules = def.tableRules;
144
146
  if (def.density)
145
147
  density = def.density;
148
+ if (def.monochrome !== undefined)
149
+ monochrome = def.monochrome;
146
150
  for (const [name, variants] of Object.entries(def.components ?? {})) {
147
151
  components[name] = { ...components[name], ...variants };
148
152
  }
149
153
  }
154
+ // What is written on a filled row, derived rather than restated.
155
+ //
156
+ // A selection background is only half a pair: `selected` carries
157
+ // `inverted` and `active` carries `text`. Stated as two independent
158
+ // colours, a theme that restates one half - `paper-light` restates
159
+ // `inverted`, `paper` leaves `text` as the terminal's - would take the
160
+ // other half from the theme it extends, or from the terminal, and a row
161
+ // could come out unreadable with nothing in the theme saying so.
162
+ //
163
+ // So the pair follows the theme's own values unless it says otherwise. A
164
+ // theme that wants a different colour on a fill states it, which is what
165
+ // `paper` does for `active`.
166
+ if (colors.onSelected === 'default')
167
+ colors.onSelected = colors.inverted;
168
+ if (colors.onActive === 'default')
169
+ colors.onActive = colors.text;
150
170
  // A colourless terminal gets no colour, whatever the theme says.
151
171
  if (caps.colorDepth === 0) {
152
172
  for (const token of Object.keys(colors)) {
@@ -175,6 +195,7 @@ export class Themes {
175
195
  id: leaf.id,
176
196
  name: leaf.name,
177
197
  appearance: leaf.appearance,
198
+ monochrome,
178
199
  colors,
179
200
  spacing,
180
201
  glyphs,
@@ -186,6 +207,11 @@ export class Themes {
186
207
  components,
187
208
  syntax,
188
209
  color(token) {
210
+ // A monochrome theme has no colour to give, and that has to include the
211
+ // literal a component states for itself - otherwise the one theme whose
212
+ // whole point is no colour is the one that cannot promise it.
213
+ if (monochrome)
214
+ return 'default';
189
215
  if (token in colors)
190
216
  return colors[token];
191
217
  // Not a token: a literal colour passed straight through.
@@ -22,6 +22,17 @@ export interface FocusableOptions {
22
22
  id: string;
23
23
  /** Explicit order within the scope. Unset = document order. */
24
24
  order?: number;
25
+ /**
26
+ * Where the focusable sits in the tree, asked each time the tab order is.
27
+ *
28
+ * `root` is the tree it is in and `path` the child index at each level
29
+ * below it. Left off, or answering `undefined`, the focusable is placed by
30
+ * when it registered.
31
+ */
32
+ place?(): {
33
+ root: unknown;
34
+ path: number[];
35
+ } | undefined;
25
36
  disabled?: boolean;
26
37
  /** Skipped by tab, still reachable by directional navigation and click. */
27
38
  skipTab?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"focus.d.ts","sourceRoot":"","sources":["../../src/types/focus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,UAAU,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAEpF;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,wEAAwE;IACxE,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,mEAAmE;IACnE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kEAAkE;IAClE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,+DAA+D;IAC/D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,2EAA2E;IAC3E,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,wEAAwE;IACxE,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,IAAI,IAAI,CAAC;IACjB,MAAM,CAAC,IAAI,IAAI,CAAC;IAChB,8EAA8E;IAC9E,KAAK,CAAC,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,GAAG,IAAI,CAAC;CACzC;AAED,MAAM,WAAW,YAAY;IAC3B,aAAa,CAAC,OAAO,EAAE,iBAAiB,GAAG,UAAU,CAAC;IACtD,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,WAAW,IAAI,MAAM,GAAG,IAAI,CAAC;IAE7B,QAAQ,CAAC,OAAO,EAAE,gBAAgB,GAAG,UAAU,CAAC;IAChD,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC;IAE3D,wDAAwD;IACxD,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;IACzB,0CAA0C;IAC1C,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;IAC3B,IAAI,IAAI,IAAI,CAAC;IACb,OAAO,IAAI,MAAM,GAAG,IAAI,CAAC;IACzB,+CAA+C;IAC/C,IAAI,CAAC,SAAS,EAAE,cAAc,GAAG,MAAM,GAAG,IAAI,CAAC;IAC/C,gEAAgE;IAChE,KAAK,IAAI,MAAM,EAAE,CAAC;IAClB,6DAA6D;IAC7D,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAClC,gDAAgD;IAChD,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACxC;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC;CACpC"}
1
+ {"version":3,"file":"focus.d.ts","sourceRoot":"","sources":["../../src/types/focus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,UAAU,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAEpF;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,wEAAwE;IACxE,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,mEAAmE;IACnE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kEAAkE;IAClE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,+DAA+D;IAC/D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;;OAMG;IACH,KAAK,CAAC,IAAI;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,SAAS,CAAC;IACxD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,2EAA2E;IAC3E,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,wEAAwE;IACxE,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,IAAI,IAAI,CAAC;IACjB,MAAM,CAAC,IAAI,IAAI,CAAC;IAChB,8EAA8E;IAC9E,KAAK,CAAC,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,GAAG,IAAI,CAAC;CACzC;AAED,MAAM,WAAW,YAAY;IAC3B,aAAa,CAAC,OAAO,EAAE,iBAAiB,GAAG,UAAU,CAAC;IACtD,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,WAAW,IAAI,MAAM,GAAG,IAAI,CAAC;IAE7B,QAAQ,CAAC,OAAO,EAAE,gBAAgB,GAAG,UAAU,CAAC;IAChD,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC;IAE3D,wDAAwD;IACxD,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;IACzB,0CAA0C;IAC1C,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;IAC3B,IAAI,IAAI,IAAI,CAAC;IACb,OAAO,IAAI,MAAM,GAAG,IAAI,CAAC;IACzB,+CAA+C;IAC/C,IAAI,CAAC,SAAS,EAAE,cAAc,GAAG,MAAM,GAAG,IAAI,CAAC;IAC/C,gEAAgE;IAChE,KAAK,IAAI,MAAM,EAAE,CAAC;IAClB,6DAA6D;IAC7D,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAClC,gDAAgD;IAChD,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACxC;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC;CACpC"}
@@ -10,14 +10,25 @@ export interface I18n {
10
10
  setLocale(locale: LocaleId): void;
11
11
  register(bundle: TranslationBundle): Disposable;
12
12
  locales(): LocaleId[];
13
- /** Missing keys fall back to the fallback locale, then to the key itself. */
14
- t(key: string, values?: Record<string, unknown>): string;
13
+ /**
14
+ * Missing keys fall back to the fallback locale, then to `fallback` (the
15
+ * text a component draws when nobody translated it), then to the key itself.
16
+ */
17
+ t(key: string, values?: Record<string, unknown>, fallback?: string): string;
15
18
  /** Intl-backed; TextUI does not reimplement formatting. */
16
19
  number(value: number, options?: Intl.NumberFormatOptions): string;
17
20
  date(value: Date | number, options?: Intl.DateTimeFormatOptions): string;
18
21
  relative(value: number, unit: Intl.RelativeTimeFormatUnit): string;
19
22
  list(items: string[], options?: Intl.ListFormatOptions): string;
20
- plural(count: number, forms: Record<string, string>): string;
23
+ /**
24
+ * The form the locale's plural rules pick for `count`, with `{count}` and
25
+ * anything the sentence needs around it.
26
+ *
27
+ * `values` carries what else the form names - a limit, a glyph, the total a
28
+ * count is out of - because a sentence that inflects a noun is the whole
29
+ * sentence and not a noun with a number in front of it.
30
+ */
31
+ plural(count: number, forms: Record<string, string>, values?: Record<string, unknown>): string;
21
32
  onChange(fn: (locale: LocaleId) => void): Disposable;
22
33
  }
23
34
  //# sourceMappingURL=i18n.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../../src/types/i18n.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC;AAE9B,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,QAAQ,CAAC;IACjB,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,IAAI;IACnB,MAAM,EAAE,QAAQ,CAAC;IACjB,SAAS,CAAC,MAAM,EAAE,QAAQ,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,iBAAiB,GAAG,UAAU,CAAC;IAChD,OAAO,IAAI,QAAQ,EAAE,CAAC;IACtB,6EAA6E;IAC7E,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC;IACzD,2DAA2D;IAC3D,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,mBAAmB,GAAG,MAAM,CAAC;IAClE,IAAI,CAAC,KAAK,EAAE,IAAI,GAAG,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,qBAAqB,GAAG,MAAM,CAAC;IACzE,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,sBAAsB,GAAG,MAAM,CAAC;IACnE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC;IAChE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC;IAC7D,QAAQ,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,QAAQ,KAAK,IAAI,GAAG,UAAU,CAAC;CACtD"}
1
+ {"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../../src/types/i18n.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC;AAE9B,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,QAAQ,CAAC;IACjB,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,IAAI;IACnB,MAAM,EAAE,QAAQ,CAAC;IACjB,SAAS,CAAC,MAAM,EAAE,QAAQ,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,iBAAiB,GAAG,UAAU,CAAC;IAChD,OAAO,IAAI,QAAQ,EAAE,CAAC;IACtB;;;OAGG;IACH,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5E,2DAA2D;IAC3D,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,mBAAmB,GAAG,MAAM,CAAC;IAClE,IAAI,CAAC,KAAK,EAAE,IAAI,GAAG,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,qBAAqB,GAAG,MAAM,CAAC;IACzE,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,sBAAsB,GAAG,MAAM,CAAC;IACnE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC;IAChE;;;;;;;OAOG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC;IAC/F,QAAQ,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,QAAQ,KAAK,IAAI,GAAG,UAAU,CAAC;CACtD"}
@@ -1,12 +1,39 @@
1
1
  import type { Color } from './cells.js';
2
2
  import type { EdgeSpec } from './geometry.js';
3
3
  /**
4
- * Semantic theme tokens. A component names a role, never a colour - which is
5
- * what lets one catalog render the same under a light theme, a dark theme and
6
- * a 16-colour ssh session.
4
+ * Semantic theme tokens, split by the channel each one is written in.
5
+ *
6
+ * A component names a role, never a colour - which is what lets one catalog
7
+ * render the same under a light theme, a dark theme and a 16-colour ssh
8
+ * session. The role is not enough on its own, though: a token also has to be
9
+ * somewhere it can actually be drawn. `canvas` is a fill, `onAccent` is
10
+ * writing, `borderStrong` is a rule - and one union for all three is what let
11
+ * `fg: 'canvas'` and `border: 'onAccent'` compile, to be found by somebody
12
+ * looking at a frame.
13
+ *
14
+ * So each token is listed under the channels it may appear in, and `Style`
15
+ * takes the matching one. A token may appear in more than one - the tones are
16
+ * both a fill and a colour of their own - and a literal colour is the shared
17
+ * escape out of all three.
18
+ *
19
+ * A token missing from a list is a token that channel cannot use. Adding one
20
+ * is a decision about where it reads, not a convenience.
7
21
  */
8
- export type ColorToken = 'canvas' | 'surface' | 'surfaceAlt' | 'overlay' | 'border' | 'borderStrong' | 'borderSubtle' | 'text' | 'muted' | 'subtle' | 'inverted' | 'accent' | 'primary' | 'secondary' | 'success' | 'warning' | 'danger' | 'info' | 'onDefault' | 'onMuted' | 'onAccent' | 'onPrimary' | 'onSecondary' | 'onSuccess' | 'onWarning' | 'onDanger' | 'onInfo' | 'hover' | 'active' | 'selected' | 'focus' | 'disabled' | 'scrim' | 'cursor' | 'shadow' | 'divider';
9
- /** Anywhere a colour is accepted, a semantic token is accepted too. */
22
+ /** Colours a cell's foreground may be. */
23
+ export type FgColorToken = 'accent' | 'primary' | 'secondary' | 'success' | 'warning' | 'danger' | 'info' | 'hover' | 'active' | 'selected' | 'focus' | 'disabled' | 'text' | 'muted' | 'subtle' | 'inverted' | 'borderSubtle' | 'cursor' | 'onDefault' | 'onMuted' | 'onAccent' | 'onPrimary' | 'onSecondary' | 'onSuccess' | 'onWarning' | 'onDanger' | 'onInfo' | 'onSelected' | 'onActive';
24
+ /** Colours a cell's background may be. */
25
+ export type BgColorToken = 'canvas' | 'surface' | 'surfaceAlt' | 'overlay' | 'hover' | 'active' | 'selected' | 'focus' | 'disabled' | 'accent' | 'primary' | 'secondary' | 'success' | 'warning' | 'danger' | 'info' | 'scrim' | 'cursor' | 'shadow';
26
+ /** Colours a rule may be. */
27
+ export type BorderColorToken = 'border' | 'borderStrong' | 'borderSubtle' | 'divider' | 'accent' | 'primary' | 'secondary' | 'success' | 'warning' | 'danger' | 'info' | 'hover' | 'focus' | 'muted' | 'subtle';
28
+ /** Every token, for the places that take a colour without saying which. */
29
+ export type ColorToken = FgColorToken | BgColorToken | BorderColorToken;
30
+ /** A foreground: an `FgColorToken`, or a literal colour. */
31
+ export type FgColor = FgColorToken | Color;
32
+ /** A background: a `BgColorToken`, or a literal colour. */
33
+ export type BgColor = BgColorToken | Color;
34
+ /** A rule: a `BorderColorToken`, or a literal colour. */
35
+ export type BorderColor = BorderColorToken | Color;
36
+ /** Anywhere a colour is accepted, any token and any literal are accepted too. */
10
37
  export type StyleColor = ColorToken | Color;
11
38
  export type Dimension = number | `${number}%` | 'auto';
12
39
  export type BorderStyle = 'none' | 'single' | 'double' | 'round' | 'bold' | 'dashed' | 'ascii' | 'thick' | 'half';
@@ -62,14 +89,14 @@ export type BorderSides = {
62
89
  };
63
90
  /** A colour per edge. Unnamed edges fall back to the border's `color`. */
64
91
  export type BorderColors = {
65
- top?: StyleColor;
66
- right?: StyleColor;
67
- bottom?: StyleColor;
68
- left?: StyleColor;
92
+ top?: BorderColor;
93
+ right?: BorderColor;
94
+ bottom?: BorderColor;
95
+ left?: BorderColor;
69
96
  };
70
97
  export type BorderSpec = BorderStyle | {
71
98
  style?: BorderStyle;
72
- color?: StyleColor;
99
+ color?: BorderColor;
73
100
  /**
74
101
  * Per-edge colour, over `color`. A corner belongs to the edge that runs
75
102
  * through it - the top rule owns both top corners - because a cell holds
@@ -111,7 +138,7 @@ export interface Style {
111
138
  * but stays legible, rather than being replaced by a rectangle of nothing.
112
139
  * `true` uses the theme's `scrim` token; a number sets the strength.
113
140
  */
114
- scrim?: boolean | StyleColor;
141
+ scrim?: boolean | BgColor;
115
142
  scrimStrength?: number;
116
143
  display?: 'flex' | 'none';
117
144
  direction?: 'row' | 'column';
@@ -160,8 +187,8 @@ export interface Style {
160
187
  overflowX?: Overflow;
161
188
  /** Overrides `overflow` downwards. The usual scroll container. */
162
189
  overflowY?: Overflow;
163
- fg?: StyleColor;
164
- bg?: StyleColor;
190
+ fg?: FgColor;
191
+ bg?: BgColor;
165
192
  bold?: boolean;
166
193
  dim?: boolean;
167
194
  italic?: boolean;
@@ -175,15 +202,27 @@ export interface Style {
175
202
  /** Character painted into empty cells of this box. */
176
203
  fill?: string;
177
204
  }
178
- /** Styles selected by interaction state. Merged over the base in this order. */
205
+ /**
206
+ * Styles selected by interaction state. Merged over the base in this order.
207
+ *
208
+ * `selected` is "this is the current one"; `focus` is "and the keyboard is
209
+ * here", so a row that has both wears `focus` and a row that has only the
210
+ * first wears the dimmer `selected`. They are separate names because they
211
+ * were the same word once - `active` meant both the unfocused selection here
212
+ * and the pressed state in `InteractionState` - and a token that meant two
213
+ * things could be filled with either and looked wrong half the time.
214
+ */
179
215
  export interface StatefulStyle {
180
216
  base?: Style;
181
217
  focus?: Style;
182
218
  hover?: Style;
219
+ /** Pressed. Never a selection. */
183
220
  active?: Style;
184
221
  selected?: Style;
185
222
  disabled?: Style;
186
223
  }
224
+ /** The states, in the order the last one wins. The shared vocabulary. */
225
+ export type StateName = 'selected' | 'hover' | 'active' | 'focus' | 'disabled';
187
226
  export type StyleInput = Style | StatefulStyle | (Style | StatefulStyle | undefined | false)[];
188
227
  /** Global semantic variants, available to every component that opts in. */
189
228
  export type SemanticVariant = 'default' | 'primary' | 'secondary' | 'accent' | 'success' | 'warning' | 'danger' | 'info' | 'muted';
@@ -1 +1 @@
1
- {"version":3,"file":"style.d.ts","sourceRoot":"","sources":["../../src/types/style.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"style.d.ts","sourceRoot":"","sources":["../../src/types/style.ts"],"names":[],"mappings":"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"}
@@ -71,6 +71,16 @@ export interface ThemeDefinition {
71
71
  id: string;
72
72
  name: string;
73
73
  appearance: 'light' | 'dark';
74
+ /**
75
+ * Whether this theme has any colour to give.
76
+ *
77
+ * A theme's palette is its own business, but a component can state a literal
78
+ * colour - an ink, a chart, a hand-picked hex - and that used to come through
79
+ * untouched, so `mono` painted a rainbow the moment a banner asked for one.
80
+ * Stated, every colour resolves to the terminal's own: tokens and literals
81
+ * alike, which is what a theme that says it has no colour has to mean.
82
+ */
83
+ monochrome?: boolean;
74
84
  /** Extend another registered theme; only the differences need stating. */
75
85
  extends?: string;
76
86
  colors: Partial<Record<ColorToken, Color>>;
@@ -99,7 +109,16 @@ export interface ThemeDefinition {
99
109
  */
100
110
  tableRules?: TableRules;
101
111
  density?: Density;
102
- /** Per-component style overrides, keyed by component name then variant. */
112
+ /**
113
+ * Per-component style overrides, keyed by component name then variant or
114
+ * state.
115
+ *
116
+ * A composite component has to name which of its boxes this is - a list row
117
+ * is a `box` node, and `List` is what a theme author knows it by - so the
118
+ * name is stated at the node with `styleAs` and the map is keyed by it.
119
+ * `base` is the component at rest; the rest are the variants it supports and
120
+ * the five states in `StateName`.
121
+ */
103
122
  components?: Record<string, Record<string, Style>>;
104
123
  /**
105
124
  * Colours for syntax scopes. Every scope has a default drawn from the
@@ -113,6 +132,8 @@ export interface ResolvedTheme {
113
132
  id: string;
114
133
  name: string;
115
134
  appearance: 'light' | 'dark';
135
+ /** Whether every colour this theme gives back is the terminal's own. */
136
+ monochrome: boolean;
116
137
  colors: Record<ColorToken, Color>;
117
138
  spacing: ThemeSpacing;
118
139
  glyphs: ThemeGlyphs;
@@ -124,11 +145,24 @@ export interface ResolvedTheme {
124
145
  components: Record<string, Record<string, Style>>;
125
146
  /** Every syntax scope, resolved to a colour. */
126
147
  syntax: Record<SyntaxScope, Color>;
127
- /** Resolve a token (or pass a literal colour through). */
148
+ /** Resolve a token (or pass a literal colour through, unless monochrome). */
128
149
  color(token: string): Color;
129
150
  borderChars(style?: BorderStyle): BorderChars;
130
151
  dividerChars(style?: DividerStyle): DividerChars;
131
- /** Component style for a name + variant list, merged in order. */
152
+ /**
153
+ * Component style for a name and a list of names to merge over it, in the
154
+ * order given - later names win.
155
+ *
156
+ * The names are the component's `variant`, `tone` and `size` followed by the
157
+ * interaction states that are true: `selected`, `hover`, `active` (pressed),
158
+ * `focus` and `disabled`. So `components.List.selected` is the fill on the
159
+ * current row, and `components.List.focused` is the brighter one on the
160
+ * current row while the list has the keyboard.
161
+ *
162
+ * The order is the same one `flattenStyleInput` merges a `style` prop in, so
163
+ * a state stated at the node and the same state stated by the theme resolve
164
+ * to one answer rather than to whichever happened to be asked second.
165
+ */
132
166
  styleFor(component: string, variants?: string[]): Style;
133
167
  }
134
168
  export interface ThemeRegistry {
@@ -1 +1 @@
1
- {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/types/theme.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/types/theme.ts"],"names":[],"mappings":"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"}
@@ -45,6 +45,15 @@ export declare function sliceColumns(text: string, start: number, width: number)
45
45
  */
46
46
  export declare function expandTabs(text: string, tabWidth?: number): string;
47
47
  export type TruncateSide = 'end' | 'start' | 'middle';
48
+ /**
49
+ * Fit into `width` cells, marking the cut whether or not there was one.
50
+ *
51
+ * `truncate` marks only what it had to cut, which is right for a string that
52
+ * has to fit a cell. A paragraph stopped by the box rather than by its own
53
+ * length is the other case: its last visible row may fit exactly and still not
54
+ * be the end of the text, and it has to say so.
55
+ */
56
+ export declare function markCut(text: string, width: number, ellipsis?: string): string;
48
57
  /** Fit into `width` cells, marking the cut with `ellipsis`. */
49
58
  export declare function truncate(text: string, width: number, ellipsis?: string, side?: TruncateSide): string;
50
59
  /** Pad to exactly `width` cells. Over-long input is returned unchanged. */
@@ -1 +1 @@
1
- {"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../src/util/text.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAelD;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAM7C;AAED;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAShD;AA8ED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAsBrD;AAsBD,2CAA2C;AAC3C,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAgBhD;AAED,+EAA+E;AAC/E,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAYhE;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAgC/E;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,SAAI,GAAG,MAAM,CAuB7D;AAED,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEtD,+DAA+D;AAC/D,wBAAgB,QAAQ,CACtB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,QAAQ,SAAM,EACd,IAAI,GAAE,YAAoB,GACzB,MAAM,CAkCR;AAED,2EAA2E;AAC3E,wBAAgB,KAAK,CACnB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,KAAK,GAAE,MAAM,GAAG,QAAQ,GAAG,OAAgB,EAC3C,IAAI,SAAM,GACT,MAAM,CAQR;AAED,kEAAkE;AAClE,wBAAgB,KAAK,CACnB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,KAAK,GAAE,MAAM,GAAG,QAAQ,GAAG,OAAgB,EAC3C,QAAQ,SAAM,GACb,MAAM,CAER;AAED,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAEhD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,YAAY,GAAG,SAAS,CAOnF;AAED,iFAAiF;AACjF,wBAAgB,UAAU,CAAC,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAE/D;AAED,4EAA4E;AAC5E,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,QAAiB,GAAG,MAAM,EAAE,CAuDvF;AAOD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C;AAgBD;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG7C;AAED,0EAA0E;AAC1E,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAIjE"}
1
+ {"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../src/util/text.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAelD;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAM7C;AAED;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAShD;AA8ED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAsBrD;AAsBD,2CAA2C;AAC3C,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAgBhD;AAED,+EAA+E;AAC/E,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAYhE;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAgC/E;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,SAAI,GAAG,MAAM,CAuB7D;AAED,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEtD;;;;;;;GAOG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,SAAM,GAAG,MAAM,CAK3E;AAED,+DAA+D;AAC/D,wBAAgB,QAAQ,CACtB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,QAAQ,SAAM,EACd,IAAI,GAAE,YAAoB,GACzB,MAAM,CAkCR;AAED,2EAA2E;AAC3E,wBAAgB,KAAK,CACnB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,KAAK,GAAE,MAAM,GAAG,QAAQ,GAAG,OAAgB,EAC3C,IAAI,SAAM,GACT,MAAM,CAQR;AAED,kEAAkE;AAClE,wBAAgB,KAAK,CACnB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,KAAK,GAAE,MAAM,GAAG,QAAQ,GAAG,OAAgB,EAC3C,QAAQ,SAAM,GACb,MAAM,CAER;AAED,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAEhD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,YAAY,GAAG,SAAS,CAOnF;AAED,iFAAiF;AACjF,wBAAgB,UAAU,CAAC,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAE/D;AAED,4EAA4E;AAC5E,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,QAAiB,GAAG,MAAM,EAAE,CAuDvF;AAOD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C;AAgBD;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG7C;AAED,0EAA0E;AAC1E,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAIjE"}
package/dist/util/text.js CHANGED
@@ -280,6 +280,22 @@ export function expandTabs(text, tabWidth = 4) {
280
280
  })
281
281
  .join('\n');
282
282
  }
283
+ /**
284
+ * Fit into `width` cells, marking the cut whether or not there was one.
285
+ *
286
+ * `truncate` marks only what it had to cut, which is right for a string that
287
+ * has to fit a cell. A paragraph stopped by the box rather than by its own
288
+ * length is the other case: its last visible row may fit exactly and still not
289
+ * be the end of the text, and it has to say so.
290
+ */
291
+ export function markCut(text, width, ellipsis = '…') {
292
+ if (width <= 0)
293
+ return '';
294
+ const ew = stringWidth(ellipsis);
295
+ if (width <= ew)
296
+ return sliceByWidth(ellipsis, width);
297
+ return sliceByWidth(text, width - ew).trimEnd() + ellipsis;
298
+ }
283
299
  /** Fit into `width` cells, marking the cut with `ellipsis`. */
284
300
  export function truncate(text, width, ellipsis = '…', side = 'end') {
285
301
  const total = stringWidth(text);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@textui/core",
3
- "version": "0.6.1",
3
+ "version": "0.8.0",
4
4
  "description": "Graph-mounted terminal UI runtime - store, registries, renderer, host primitives",
5
5
  "keywords": [
6
6
  "terminal",
package/src/app/app.ts CHANGED
@@ -752,8 +752,15 @@ export class App implements TextUIApp {
752
752
  private stateOf(instance: Instance): InteractionState {
753
753
  const id = typeof instance.props.id === 'string' ? instance.props.id : instance.id;
754
754
  const focusedId = this.focus.focused();
755
+ // A node may state its own focus, and a row has to: the list holds the
756
+ // keyboard, the row is where it lands. Left to the id comparison every
757
+ // row in every list reads as unfocused, so "the current row" and "the
758
+ // current row you can type at" would be the same fill.
759
+ const stated = instance.props.focused;
755
760
  return {
756
- focused: focusedId === id || focusedId === `${instance.id}:focus`,
761
+ focused: typeof stated === 'boolean'
762
+ ? stated
763
+ : focusedId === id || focusedId === `${instance.id}:focus`,
757
764
  hovered: this.hovered === id || this.hoveredChain.has(instance),
758
765
  active: false,
759
766
  selected: instance.props.selected === true,