@textui/core 0.8.0 → 0.9.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.
@@ -7,10 +7,6 @@ export declare const CONSOLE: ThemeDefinition;
7
7
  export declare const PAPER: ThemeDefinition;
8
8
  /** Borderless. Whitespace and alignment do the separating. */
9
9
  export declare const PAPER_LIGHT: ThemeDefinition;
10
- /** Rounded chrome around a persistent frame. */
11
- export declare const WORKBENCH: ThemeDefinition;
12
- /** No colour at all. What a `colorDepth: 0` terminal or a pipe gets. */
13
- export declare const MONO: ThemeDefinition;
14
10
  /**
15
11
  * Paper, after dark.
16
12
  *
@@ -20,5 +16,9 @@ export declare const MONO: ThemeDefinition;
20
16
  * reader moving between them is not moving between two different products.
21
17
  */
22
18
  export declare const PAPER_DARK: ThemeDefinition;
19
+ /** Rounded chrome around a persistent frame. */
20
+ export declare const WORKBENCH: ThemeDefinition;
21
+ /** No colour at all. What a `colorDepth: 0` terminal or a pipe gets. */
22
+ export declare const MONO: ThemeDefinition;
23
23
  export declare const BUILTIN_THEMES: ThemeDefinition[];
24
24
  //# sourceMappingURL=builtin.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"builtin.d.ts","sourceRoot":"","sources":["../../src/themes/builtin.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AA8EzD,eAAO,MAAM,IAAI,EAAE,eA8ClB,CAAC;AAEF,eAAO,MAAM,KAAK,EAAE,eA8CnB,CAAC;AAEF,sEAAsE;AACtE,eAAO,MAAM,OAAO,EAAE,eAuCrB,CAAC;AAEF,8DAA8D;AAC9D,eAAO,MAAM,KAAK,EAAE,eAyDnB,CAAC;AAEF,8DAA8D;AAC9D,eAAO,MAAM,WAAW,EAAE,eAkCzB,CAAC;AAEF,gDAAgD;AAChD,eAAO,MAAM,SAAS,EAAE,eAqCvB,CAAC;AAEF,wEAAwE;AACxE,eAAO,MAAM,IAAI,EAAE,eAiElB,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,UAAU,EAAE,eA+BxB,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,eAAe,EAE3C,CAAC"}
1
+ {"version":3,"file":"builtin.d.ts","sourceRoot":"","sources":["../../src/themes/builtin.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAgFzD,eAAO,MAAM,IAAI,EAAE,eAgDlB,CAAC;AAEF,eAAO,MAAM,KAAK,EAAE,eAgDnB,CAAC;AAEF,sEAAsE;AACtE,eAAO,MAAM,OAAO,EAAE,eA0CrB,CAAC;AAEF,8DAA8D;AAC9D,eAAO,MAAM,KAAK,EAAE,eAyDnB,CAAC;AAEF,8DAA8D;AAC9D,eAAO,MAAM,WAAW,EAAE,eAqCzB,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,UAAU,EAAE,eAiCxB,CAAC;AAEF,gDAAgD;AAChD,eAAO,MAAM,SAAS,EAAE,eAsCvB,CAAC;AAEF,wEAAwE;AACxE,eAAO,MAAM,IAAI,EAAE,eAiElB,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,eAAe,EAE3C,CAAC"}
@@ -21,7 +21,7 @@
21
21
  * otherwise moves with it, while a theme that states `components.List.focused`
22
22
  * moves the list and leaves the table where it was.
23
23
  */
24
- const SELECTION_FOCUSED = { bg: 'selected', fg: 'onSelected', dim: true };
24
+ const SELECTION_FOCUSED = { bg: 'selected', fg: 'onSelected', bold: true };
25
25
  const SELECTION_UNFOCUSED = { bg: 'active', fg: 'onActive' };
26
26
  const SELECTION_HOVER = { bg: 'hover', fg: 'onActive' };
27
27
  // The other way to draw a selection: reverse video, which is legible whatever
@@ -50,7 +50,8 @@ const STATE_STYLES = {
50
50
  // A marked line is a selection. The caret line is that selection plus the
51
51
  // keyboard, so it takes the next fill up rather than a colour of its own.
52
52
  CodeViewer: { selected: SELECTION_UNFOCUSED, focus: SELECTION_HOVER },
53
- Menu: { selected: SELECTION_UNFOCUSED, focus: SELECTION_FOCUSED },
53
+ Menu: { base: { fg: 'text' }, selected: SELECTION_UNFOCUSED, focus: SELECTION_FOCUSED },
54
+ TextInput: { base: { fg: 'text' } },
54
55
  // A tab is open, not selected. Dimming it when the strip does not have the
55
56
  // keyboard would say no document is open, which is a different claim and a
56
57
  // wrong one - so it has one state and no second.
@@ -66,10 +67,11 @@ const STATE_STYLES = {
66
67
  ToolCallRow: { selected: SELECTION_FOCUSED },
67
68
  ReasoningBlock: { selected: SELECTION_FOCUSED },
68
69
  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' } },
70
+ // A range in a document is a selection, drawn in reverse video so it keeps
71
+ // the colours the text under it was already drawn in - the syntax of a
72
+ // selection is the syntax of the code it covers - and shows whether or not
73
+ // the theme's `active` is a fill.
74
+ Editor: { selected: { inverse: true } },
73
75
  };
74
76
  export const DARK = {
75
77
  id: 'dark',
@@ -86,9 +88,9 @@ export const DARK = {
86
88
  borderStrong: '#484f58',
87
89
  borderSubtle: '#21262d',
88
90
  divider: '#484f58',
89
- text: '#e6edf3',
91
+ text: '#f3e6f1',
90
92
  muted: '#8b949e',
91
- subtle: '#6e7681',
93
+ subtle: '#546f94',
92
94
  inverted: '#0d1117',
93
95
  accent: '#58a6ff',
94
96
  primary: '#388bfd',
@@ -107,8 +109,10 @@ export const DARK = {
107
109
  onWarning: '#0d1117',
108
110
  onDanger: '#0d1117',
109
111
  hover: '#1f2937',
110
- active: '#264466',
111
- selected: '#1f6feb',
112
+ active: 'default',
113
+ onActive: '#3191ff',
114
+ selected: 'default',
115
+ onSelected: '#3191ff',
112
116
  focus: '#58a6ff',
113
117
  disabled: '#484f58',
114
118
  scrim: '#010409',
@@ -154,8 +158,10 @@ export const LIGHT = {
154
158
  onWarning: '#ffffff',
155
159
  onDanger: '#ffffff',
156
160
  hover: '#eaeef2',
157
- active: '#a5bdd8',
158
- selected: '#0969da',
161
+ active: 'default',
162
+ onActive: '#0969da',
163
+ selected: 'default',
164
+ onSelected: '#0969da',
159
165
  focus: '#0969da',
160
166
  disabled: '#8c959f',
161
167
  scrim: '#8c959f',
@@ -195,6 +201,9 @@ export const CONSOLE = {
195
201
  info: '#88c0d0',
196
202
  selected: '#6ba3b2',
197
203
  active: '#1e3d47',
204
+ // Stated, because `dark` states its own for a selection with no fill.
205
+ onSelected: '#0a0e14',
206
+ onActive: '#d8dee9',
198
207
  onAccent: '#0a0e14',
199
208
  onPrimary: '#0a0e14',
200
209
  onInfo: '#0a0e14',
@@ -291,6 +300,9 @@ export const PAPER_LIGHT = {
291
300
  hover: '#f7f1e7',
292
301
  active: '#efe4d2',
293
302
  selected: '#eadcc6',
303
+ // Stated, because `light` states its own for a selection with no fill.
304
+ onActive: '#2b2a27',
305
+ onSelected: '#2b2a27',
294
306
  inverted: '#2b2a27',
295
307
  focus: '#b4531f',
296
308
  },
@@ -300,6 +312,48 @@ export const PAPER_LIGHT = {
300
312
  Button: { base: { padding: [0, 2] } },
301
313
  },
302
314
  };
315
+ /**
316
+ * Paper, after dark.
317
+ *
318
+ * The same airy, borderless, warm-accented character as `paper` - the point of
319
+ * it is the restraint, not the brightness - with the ink and the page swapped.
320
+ * A warm dark rather than a blue one, so the two read as one family and a
321
+ * reader moving between them is not moving between two different products.
322
+ */
323
+ export const PAPER_DARK = {
324
+ id: 'paper-dark',
325
+ name: 'Paper Dark',
326
+ appearance: 'dark',
327
+ extends: 'dark',
328
+ border: 'none',
329
+ density: 'airy',
330
+ colors: {
331
+ canvas: '#1c1a17',
332
+ surface: '#1c1a17',
333
+ surfaceAlt: '#26231f',
334
+ border: '#3a352e',
335
+ borderSubtle: '#2a2621',
336
+ divider: 'default',
337
+ subtle: '#db8c4c',
338
+ text: '#e8e3d9',
339
+ muted: '#9a9287',
340
+ accent: '#e0873f',
341
+ primary: '#e0873f',
342
+ // The same restraint, the other way up.
343
+ hover: '#26231f',
344
+ active: 'default',
345
+ onActive: '#e0873f',
346
+ selected: 'default',
347
+ onSelected: '#e0873f',
348
+ inverted: '#f4efe6',
349
+ focus: '#e0873f',
350
+ },
351
+ spacing: { none: 0, xs: 1, sm: 1, md: 2, lg: 3, xl: 4 },
352
+ components: {
353
+ Panel: { base: { border: 'none', padding: [1, 2] } },
354
+ Button: { base: { padding: [0, 2] } },
355
+ },
356
+ };
303
357
  /** Rounded chrome around a persistent frame. */
304
358
  export const WORKBENCH = {
305
359
  id: 'workbench',
@@ -332,6 +386,7 @@ export const WORKBENCH = {
332
386
  // The selection is a mid grey, so the light text is what reads on it; the
333
387
  // inherited `inverted` is darker than the fill and nearly disappears.
334
388
  onSelected: '#cdd6f4',
389
+ onActive: '#cdd6f4',
335
390
  focus: '#89b4fa',
336
391
  scrim: '#11111b',
337
392
  },
@@ -406,46 +461,6 @@ export const MONO = {
406
461
  Button: { base: { padding: [0, 1] } },
407
462
  }
408
463
  };
409
- /**
410
- * Paper, after dark.
411
- *
412
- * The same airy, borderless, warm-accented character as `paper` - the point of
413
- * it is the restraint, not the brightness - with the ink and the page swapped.
414
- * A warm dark rather than a blue one, so the two read as one family and a
415
- * reader moving between them is not moving between two different products.
416
- */
417
- export const PAPER_DARK = {
418
- id: 'paper-dark',
419
- name: 'Paper Dark',
420
- appearance: 'dark',
421
- extends: 'dark',
422
- border: 'none',
423
- density: 'airy',
424
- colors: {
425
- canvas: '#1c1a17',
426
- surface: '#1c1a17',
427
- surfaceAlt: '#26231f',
428
- border: '#3a352e',
429
- borderSubtle: '#2a2621',
430
- divider: 'default',
431
- subtle: '#db8c4c',
432
- text: '#e8e3d9',
433
- muted: '#9a9287',
434
- accent: '#e0873f',
435
- primary: '#e0873f',
436
- // The same restraint, the other way up.
437
- hover: '#26231f',
438
- active: '#332e27',
439
- selected: '#3d362c',
440
- inverted: '#f4efe6',
441
- focus: '#e0873f',
442
- },
443
- spacing: { none: 0, xs: 1, sm: 1, md: 2, lg: 3, xl: 4 },
444
- components: {
445
- Panel: { base: { border: 'none', padding: [1, 2] } },
446
- Button: { base: { padding: [0, 2] } },
447
- },
448
- };
449
464
  export const BUILTIN_THEMES = [
450
465
  DARK, LIGHT, CONSOLE, PAPER, PAPER_LIGHT, PAPER_DARK, WORKBENCH, MONO,
451
466
  ];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@textui/core",
3
- "version": "0.8.0",
3
+ "version": "0.9.0",
4
4
  "description": "Graph-mounted terminal UI runtime - store, registries, renderer, host primitives",
5
5
  "keywords": [
6
6
  "terminal",
@@ -25,7 +25,7 @@ import type { ThemeDefinition } from '../types/theme.js';
25
25
  * otherwise moves with it, while a theme that states `components.List.focused`
26
26
  * moves the list and leaves the table where it was.
27
27
  */
28
- const SELECTION_FOCUSED: Style = { bg: 'selected', fg: 'onSelected', dim: true };
28
+ const SELECTION_FOCUSED: Style = { bg: 'selected', fg: 'onSelected', bold: true };
29
29
  const SELECTION_UNFOCUSED: Style = { bg: 'active', fg: 'onActive' };
30
30
  const SELECTION_HOVER: Style = { bg: 'hover', fg: 'onActive' };
31
31
  // The other way to draw a selection: reverse video, which is legible whatever
@@ -55,7 +55,8 @@ const STATE_STYLES: ThemeDefinition['components'] = {
55
55
  // A marked line is a selection. The caret line is that selection plus the
56
56
  // keyboard, so it takes the next fill up rather than a colour of its own.
57
57
  CodeViewer: { selected: SELECTION_UNFOCUSED, focus: SELECTION_HOVER },
58
- Menu: { selected: SELECTION_UNFOCUSED, focus: SELECTION_FOCUSED },
58
+ Menu: { base: { fg: 'text' }, selected: SELECTION_UNFOCUSED, focus: SELECTION_FOCUSED },
59
+ TextInput: { base: { fg: 'text' } },
59
60
  // A tab is open, not selected. Dimming it when the strip does not have the
60
61
  // keyboard would say no document is open, which is a different claim and a
61
62
  // wrong one - so it has one state and no second.
@@ -71,10 +72,11 @@ const STATE_STYLES: ThemeDefinition['components'] = {
71
72
  ToolCallRow: { selected: SELECTION_FOCUSED },
72
73
  ReasoningBlock: { selected: SELECTION_FOCUSED },
73
74
  ComposerChip: { focus: SELECTION_FOCUSED },
74
- // A range in a document is a selection, and it keeps the colours the text
75
- // under it was already drawn in - the syntax of a selection is the syntax of
76
- // the code it covers.
77
- Editor: { selected: { bg: 'active' } },
75
+ // A range in a document is a selection, drawn in reverse video so it keeps
76
+ // the colours the text under it was already drawn in - the syntax of a
77
+ // selection is the syntax of the code it covers - and shows whether or not
78
+ // the theme's `active` is a fill.
79
+ Editor: { selected: { inverse: true } },
78
80
  };
79
81
 
80
82
  export const DARK: ThemeDefinition = {
@@ -92,9 +94,9 @@ export const DARK: ThemeDefinition = {
92
94
  borderStrong: '#484f58',
93
95
  borderSubtle: '#21262d',
94
96
  divider: '#484f58',
95
- text: '#e6edf3',
97
+ text: '#f3e6f1',
96
98
  muted: '#8b949e',
97
- subtle: '#6e7681',
99
+ subtle: '#546f94',
98
100
  inverted: '#0d1117',
99
101
  accent: '#58a6ff',
100
102
  primary: '#388bfd',
@@ -113,8 +115,10 @@ export const DARK: ThemeDefinition = {
113
115
  onWarning: '#0d1117',
114
116
  onDanger: '#0d1117',
115
117
  hover: '#1f2937',
116
- active: '#264466',
117
- selected: '#1f6feb',
118
+ active: 'default',
119
+ onActive: '#3191ff',
120
+ selected: 'default',
121
+ onSelected: '#3191ff',
118
122
  focus: '#58a6ff',
119
123
  disabled: '#484f58',
120
124
  scrim: '#010409',
@@ -161,8 +165,10 @@ export const LIGHT: ThemeDefinition = {
161
165
  onWarning: '#ffffff',
162
166
  onDanger: '#ffffff',
163
167
  hover: '#eaeef2',
164
- active: '#a5bdd8',
165
- selected: '#0969da',
168
+ active: 'default',
169
+ onActive: '#0969da',
170
+ selected: 'default',
171
+ onSelected: '#0969da',
166
172
  focus: '#0969da',
167
173
  disabled: '#8c959f',
168
174
  scrim: '#8c959f',
@@ -203,6 +209,9 @@ export const CONSOLE: ThemeDefinition = {
203
209
  info: '#88c0d0',
204
210
  selected: '#6ba3b2',
205
211
  active: '#1e3d47',
212
+ // Stated, because `dark` states its own for a selection with no fill.
213
+ onSelected: '#0a0e14',
214
+ onActive: '#d8dee9',
206
215
  onAccent: '#0a0e14',
207
216
  onPrimary: '#0a0e14',
208
217
  onInfo: '#0a0e14',
@@ -302,6 +311,9 @@ export const PAPER_LIGHT: ThemeDefinition = {
302
311
  hover: '#f7f1e7',
303
312
  active: '#efe4d2',
304
313
  selected: '#eadcc6',
314
+ // Stated, because `light` states its own for a selection with no fill.
315
+ onActive: '#2b2a27',
316
+ onSelected: '#2b2a27',
305
317
  inverted: '#2b2a27',
306
318
  focus: '#b4531f',
307
319
  },
@@ -312,6 +324,49 @@ export const PAPER_LIGHT: ThemeDefinition = {
312
324
  },
313
325
  };
314
326
 
327
+ /**
328
+ * Paper, after dark.
329
+ *
330
+ * The same airy, borderless, warm-accented character as `paper` - the point of
331
+ * it is the restraint, not the brightness - with the ink and the page swapped.
332
+ * A warm dark rather than a blue one, so the two read as one family and a
333
+ * reader moving between them is not moving between two different products.
334
+ */
335
+ export const PAPER_DARK: ThemeDefinition = {
336
+ id: 'paper-dark',
337
+ name: 'Paper Dark',
338
+ appearance: 'dark',
339
+ extends: 'dark',
340
+ border: 'none',
341
+ density: 'airy',
342
+ colors: {
343
+ canvas: '#1c1a17',
344
+ surface: '#1c1a17',
345
+ surfaceAlt: '#26231f',
346
+ border: '#3a352e',
347
+ borderSubtle: '#2a2621',
348
+ divider: 'default',
349
+ subtle: '#db8c4c',
350
+ text: '#e8e3d9',
351
+ muted: '#9a9287',
352
+ accent: '#e0873f',
353
+ primary: '#e0873f',
354
+ // The same restraint, the other way up.
355
+ hover: '#26231f',
356
+ active: 'default',
357
+ onActive: '#e0873f',
358
+ selected: 'default',
359
+ onSelected: '#e0873f',
360
+ inverted: '#f4efe6',
361
+ focus: '#e0873f',
362
+ },
363
+ spacing: { none: 0, xs: 1, sm: 1, md: 2, lg: 3, xl: 4 },
364
+ components: {
365
+ Panel: { base: { border: 'none', padding: [1, 2] } },
366
+ Button: { base: { padding: [0, 2] } },
367
+ },
368
+ };
369
+
315
370
  /** Rounded chrome around a persistent frame. */
316
371
  export const WORKBENCH: ThemeDefinition = {
317
372
  id: 'workbench',
@@ -344,6 +399,7 @@ export const WORKBENCH: ThemeDefinition = {
344
399
  // The selection is a mid grey, so the light text is what reads on it; the
345
400
  // inherited `inverted` is darker than the fill and nearly disappears.
346
401
  onSelected: '#cdd6f4',
402
+ onActive: '#cdd6f4',
347
403
  focus: '#89b4fa',
348
404
  scrim: '#11111b',
349
405
  },
@@ -420,47 +476,6 @@ export const MONO: ThemeDefinition = {
420
476
  }
421
477
  };
422
478
 
423
- /**
424
- * Paper, after dark.
425
- *
426
- * The same airy, borderless, warm-accented character as `paper` - the point of
427
- * it is the restraint, not the brightness - with the ink and the page swapped.
428
- * A warm dark rather than a blue one, so the two read as one family and a
429
- * reader moving between them is not moving between two different products.
430
- */
431
- export const PAPER_DARK: ThemeDefinition = {
432
- id: 'paper-dark',
433
- name: 'Paper Dark',
434
- appearance: 'dark',
435
- extends: 'dark',
436
- border: 'none',
437
- density: 'airy',
438
- colors: {
439
- canvas: '#1c1a17',
440
- surface: '#1c1a17',
441
- surfaceAlt: '#26231f',
442
- border: '#3a352e',
443
- borderSubtle: '#2a2621',
444
- divider: 'default',
445
- subtle: '#db8c4c',
446
- text: '#e8e3d9',
447
- muted: '#9a9287',
448
- accent: '#e0873f',
449
- primary: '#e0873f',
450
- // The same restraint, the other way up.
451
- hover: '#26231f',
452
- active: '#332e27',
453
- selected: '#3d362c',
454
- inverted: '#f4efe6',
455
- focus: '#e0873f',
456
- },
457
- spacing: { none: 0, xs: 1, sm: 1, md: 2, lg: 3, xl: 4 },
458
- components: {
459
- Panel: { base: { border: 'none', padding: [1, 2] } },
460
- Button: { base: { padding: [0, 2] } },
461
- },
462
- };
463
-
464
479
  export const BUILTIN_THEMES: ThemeDefinition[] = [
465
480
  DARK, LIGHT, CONSOLE, PAPER, PAPER_LIGHT, PAPER_DARK, WORKBENCH, MONO,
466
481
  ];