@cueplusplus/ui 0.22.0 → 0.24.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 (41) hide show
  1. package/CHANGELOG.md +72 -0
  2. package/README.md +1 -1
  3. package/dist/elements/markdown.d.ts +29 -9
  4. package/dist/elements/markdown.js +102 -13
  5. package/dist/forms/_chassis.d.ts +19 -6
  6. package/dist/forms/_chassis.js +19 -6
  7. package/dist/primitives/chip.d.ts +1 -1
  8. package/dist/styles.css +20 -1
  9. package/dist/system/_focus-ring-field.js +14 -2
  10. package/dist/theming/contrast.d.ts +2 -2
  11. package/dist/theming/contrast.js +2 -2
  12. package/dist/theming/create-theme.js +15 -6
  13. package/dist/theming/index.d.ts +2 -2
  14. package/dist/theming/index.js +2 -2
  15. package/dist/theming/serialize.js +2 -1
  16. package/manifest/components/autocomplete.json +1 -0
  17. package/manifest/components/color-field.json +1 -0
  18. package/manifest/components/color-picker.json +1 -0
  19. package/manifest/components/combobox.json +1 -0
  20. package/manifest/components/composer.json +1 -0
  21. package/manifest/components/date-field.json +1 -0
  22. package/manifest/components/date-picker.json +1 -0
  23. package/manifest/components/date-range-picker.json +1 -0
  24. package/manifest/components/env-var-input.json +1 -0
  25. package/manifest/components/input-group.json +1 -0
  26. package/manifest/components/input.json +1 -0
  27. package/manifest/components/markdown-text.json +16 -2
  28. package/manifest/components/multi-select.json +1 -0
  29. package/manifest/components/musical-time-input.json +1 -0
  30. package/manifest/components/number-field.json +1 -0
  31. package/manifest/components/otp-field.json +1 -0
  32. package/manifest/components/password-input.json +1 -0
  33. package/manifest/components/scrub-input.json +1 -0
  34. package/manifest/components/search-input.json +1 -0
  35. package/manifest/components/select.json +1 -0
  36. package/manifest/components/tags-input.json +1 -0
  37. package/manifest/components/textarea.json +1 -0
  38. package/manifest/components/time-field.json +1 -0
  39. package/manifest/manifest.json +25 -25
  40. package/manifest/tokens.json +3 -1
  41. package/package.json +14 -4
@@ -1,4 +1,4 @@
1
- import { CONTRAST_REQUIREMENTS, ContrastCheck, ContrastInput, ContrastReport, ContrastRequirement, WCAG_AAA_TEXT, WCAG_AA_NON_TEXT, WCAG_AA_TEXT, contrastRatio, contrastReport, relativeLuminance } from "./contrast.js";
1
+ import { CONTRAST_REQUIREMENTS, ContrastCheck, ContrastInput, ContrastReport, ContrastRequirement, WCAG_AAA_TEXT, WCAG_AA_NON_TEXT, WCAG_AA_TEXT, contrastRatio, contrastReport, edgeToContrast, relativeLuminance } from "./contrast.js";
2
2
  import { ACCENT_FG_MINIMUM, ACCENT_HOVER_LIGHTNESS_STEP, BORDER_LIGHTNESS_STEPS, CreatedTheme, FG_MUTED_LIGHTNESS_STEP, FG_SUBTLE_LIGHTNESS_STEP, INK_RAMP_CHROMA_SCALE, LIGHT_GROUND_COMPRESSION, SELECTION_ACCENT_PERCENT, SUNKEN_LIGHTNESS_STEP, SURFACE_LIGHTNESS_STEPS, THEME_COLOR_TOKENS, ThemeAnchors, ThemeColorToken, createTheme } from "./create-theme.js";
3
3
  import { CUE_TOKEN_PREFIX, DERIVED_TOKEN_TEMPLATES, RESOLVED_MONO, SerializeThemeCssOptions, THEME_NAME_PATTERN, ThemeBlock, ThemeBlockSection, ThemeSelectorOptions, assertCssValue, assertThemeName, derivedTokens, serializeThemeBlock, serializeThemeCss, themeSelector, tokenProperty } from "./serialize.js";
4
- export { ACCENT_FG_MINIMUM, ACCENT_HOVER_LIGHTNESS_STEP, BORDER_LIGHTNESS_STEPS, CONTRAST_REQUIREMENTS, CUE_TOKEN_PREFIX, type ContrastCheck, type ContrastInput, type ContrastReport, type ContrastRequirement, type CreatedTheme, DERIVED_TOKEN_TEMPLATES, FG_MUTED_LIGHTNESS_STEP, FG_SUBTLE_LIGHTNESS_STEP, INK_RAMP_CHROMA_SCALE, LIGHT_GROUND_COMPRESSION, RESOLVED_MONO, SELECTION_ACCENT_PERCENT, SUNKEN_LIGHTNESS_STEP, SURFACE_LIGHTNESS_STEPS, type SerializeThemeCssOptions, THEME_COLOR_TOKENS, THEME_NAME_PATTERN, type ThemeAnchors, type ThemeBlock, type ThemeBlockSection, type ThemeColorToken, type ThemeSelectorOptions, WCAG_AAA_TEXT, WCAG_AA_NON_TEXT, WCAG_AA_TEXT, assertCssValue, assertThemeName, contrastRatio, contrastReport, createTheme, derivedTokens, relativeLuminance, serializeThemeBlock, serializeThemeCss, themeSelector, tokenProperty };
4
+ export { ACCENT_FG_MINIMUM, ACCENT_HOVER_LIGHTNESS_STEP, BORDER_LIGHTNESS_STEPS, CONTRAST_REQUIREMENTS, CUE_TOKEN_PREFIX, type ContrastCheck, type ContrastInput, type ContrastReport, type ContrastRequirement, type CreatedTheme, DERIVED_TOKEN_TEMPLATES, FG_MUTED_LIGHTNESS_STEP, FG_SUBTLE_LIGHTNESS_STEP, INK_RAMP_CHROMA_SCALE, LIGHT_GROUND_COMPRESSION, RESOLVED_MONO, SELECTION_ACCENT_PERCENT, SUNKEN_LIGHTNESS_STEP, SURFACE_LIGHTNESS_STEPS, type SerializeThemeCssOptions, THEME_COLOR_TOKENS, THEME_NAME_PATTERN, type ThemeAnchors, type ThemeBlock, type ThemeBlockSection, type ThemeColorToken, type ThemeSelectorOptions, WCAG_AAA_TEXT, WCAG_AA_NON_TEXT, WCAG_AA_TEXT, assertCssValue, assertThemeName, contrastRatio, contrastReport, createTheme, derivedTokens, edgeToContrast, relativeLuminance, serializeThemeBlock, serializeThemeCss, themeSelector, tokenProperty };
@@ -1,4 +1,4 @@
1
- import { CONTRAST_REQUIREMENTS, WCAG_AAA_TEXT, WCAG_AA_NON_TEXT, WCAG_AA_TEXT, contrastRatio, contrastReport, relativeLuminance } from "./contrast.js";
1
+ import { CONTRAST_REQUIREMENTS, WCAG_AAA_TEXT, WCAG_AA_NON_TEXT, WCAG_AA_TEXT, contrastRatio, contrastReport, edgeToContrast, relativeLuminance } from "./contrast.js";
2
2
  import { CUE_TOKEN_PREFIX, DERIVED_TOKEN_TEMPLATES, RESOLVED_MONO, THEME_NAME_PATTERN, assertCssValue, assertThemeName, derivedTokens, serializeThemeBlock, serializeThemeCss, themeSelector, tokenProperty } from "./serialize.js";
3
3
  import { ACCENT_FG_MINIMUM, ACCENT_HOVER_LIGHTNESS_STEP, BORDER_LIGHTNESS_STEPS, FG_MUTED_LIGHTNESS_STEP, FG_SUBTLE_LIGHTNESS_STEP, INK_RAMP_CHROMA_SCALE, LIGHT_GROUND_COMPRESSION, SELECTION_ACCENT_PERCENT, SUNKEN_LIGHTNESS_STEP, SURFACE_LIGHTNESS_STEPS, THEME_COLOR_TOKENS, createTheme } from "./create-theme.js";
4
- export { ACCENT_FG_MINIMUM, ACCENT_HOVER_LIGHTNESS_STEP, BORDER_LIGHTNESS_STEPS, CONTRAST_REQUIREMENTS, CUE_TOKEN_PREFIX, DERIVED_TOKEN_TEMPLATES, FG_MUTED_LIGHTNESS_STEP, FG_SUBTLE_LIGHTNESS_STEP, INK_RAMP_CHROMA_SCALE, LIGHT_GROUND_COMPRESSION, RESOLVED_MONO, SELECTION_ACCENT_PERCENT, SUNKEN_LIGHTNESS_STEP, SURFACE_LIGHTNESS_STEPS, THEME_COLOR_TOKENS, THEME_NAME_PATTERN, WCAG_AAA_TEXT, WCAG_AA_NON_TEXT, WCAG_AA_TEXT, assertCssValue, assertThemeName, contrastRatio, contrastReport, createTheme, derivedTokens, relativeLuminance, serializeThemeBlock, serializeThemeCss, themeSelector, tokenProperty };
4
+ export { ACCENT_FG_MINIMUM, ACCENT_HOVER_LIGHTNESS_STEP, BORDER_LIGHTNESS_STEPS, CONTRAST_REQUIREMENTS, CUE_TOKEN_PREFIX, DERIVED_TOKEN_TEMPLATES, FG_MUTED_LIGHTNESS_STEP, FG_SUBTLE_LIGHTNESS_STEP, INK_RAMP_CHROMA_SCALE, LIGHT_GROUND_COMPRESSION, RESOLVED_MONO, SELECTION_ACCENT_PERCENT, SUNKEN_LIGHTNESS_STEP, SURFACE_LIGHTNESS_STEPS, THEME_COLOR_TOKENS, THEME_NAME_PATTERN, WCAG_AAA_TEXT, WCAG_AA_NON_TEXT, WCAG_AA_TEXT, assertCssValue, assertThemeName, contrastRatio, contrastReport, createTheme, derivedTokens, edgeToContrast, relativeLuminance, serializeThemeBlock, serializeThemeCss, themeSelector, tokenProperty };
@@ -242,7 +242,8 @@ const DERIVED_TOKEN_TEMPLATES = [
242
242
  ["accent-fill", "var(--cue-accent)"],
243
243
  ["accent-fill-fg", "var(--cue-accent-fg)"],
244
244
  ["accent-fill-hover", "var(--cue-accent-hover)"],
245
- ["shade", "var(--cue-fg)"]
245
+ ["shade", "var(--cue-fg)"],
246
+ ["field-edge", "var(--cue-border)"]
246
247
  ];
247
248
  /**
248
249
  * {@link DERIVED_TOKEN_TEMPLATES} as a property → value map.
@@ -277,6 +277,7 @@
277
277
  "--cue-style-disabled-opacity",
278
278
  "--cue-style-display-variation",
279
279
  "--cue-style-field-fill",
280
+ "--cue-style-field-focus-mix",
280
281
  "--cue-style-field-focus-offset",
281
282
  "--cue-style-field-hover-edge",
282
283
  "--cue-style-field-pad",
@@ -90,6 +90,7 @@
90
90
  "--cue-style-disabled-ink",
91
91
  "--cue-style-disabled-opacity",
92
92
  "--cue-style-field-fill",
93
+ "--cue-style-field-focus-mix",
93
94
  "--cue-style-field-focus-offset",
94
95
  "--cue-style-field-hover-edge",
95
96
  "--cue-style-field-pad",
@@ -224,6 +224,7 @@
224
224
  "--cue-style-disabled-ink",
225
225
  "--cue-style-disabled-opacity",
226
226
  "--cue-style-field-fill",
227
+ "--cue-style-field-focus-mix",
227
228
  "--cue-style-field-focus-offset",
228
229
  "--cue-style-field-hover-edge",
229
230
  "--cue-style-field-pad",
@@ -280,6 +280,7 @@
280
280
  "--cue-style-disabled-opacity",
281
281
  "--cue-style-display-variation",
282
282
  "--cue-style-field-fill",
283
+ "--cue-style-field-focus-mix",
283
284
  "--cue-style-field-focus-offset",
284
285
  "--cue-style-field-hover-edge",
285
286
  "--cue-style-field-pad",
@@ -226,6 +226,7 @@
226
226
  "--cue-style-disabled-ink",
227
227
  "--cue-style-disabled-opacity",
228
228
  "--cue-style-field-fill",
229
+ "--cue-style-field-focus-mix",
229
230
  "--cue-style-field-focus-offset",
230
231
  "--cue-style-field-hover-edge",
231
232
  "--cue-style-field-pad",
@@ -81,6 +81,7 @@
81
81
  "--cue-style-disabled-ink",
82
82
  "--cue-style-disabled-opacity",
83
83
  "--cue-style-field-fill",
84
+ "--cue-style-field-focus-mix",
84
85
  "--cue-style-field-focus-offset",
85
86
  "--cue-style-field-hover-edge",
86
87
  "--cue-style-field-pad",
@@ -244,6 +244,7 @@
244
244
  "--cue-style-disabled-ink",
245
245
  "--cue-style-disabled-opacity",
246
246
  "--cue-style-field-fill",
247
+ "--cue-style-field-focus-mix",
247
248
  "--cue-style-field-focus-offset",
248
249
  "--cue-style-field-hover-edge",
249
250
  "--cue-style-field-pad",
@@ -244,6 +244,7 @@
244
244
  "--cue-style-disabled-ink",
245
245
  "--cue-style-disabled-opacity",
246
246
  "--cue-style-field-fill",
247
+ "--cue-style-field-focus-mix",
247
248
  "--cue-style-field-focus-offset",
248
249
  "--cue-style-field-hover-edge",
249
250
  "--cue-style-field-pad",
@@ -181,6 +181,7 @@
181
181
  "--cue-style-disabled-ink",
182
182
  "--cue-style-disabled-opacity",
183
183
  "--cue-style-field-fill",
184
+ "--cue-style-field-focus-mix",
184
185
  "--cue-style-field-focus-offset",
185
186
  "--cue-style-field-hover-edge",
186
187
  "--cue-style-field-pad",
@@ -101,6 +101,7 @@
101
101
  "--cue-style-disabled-ink",
102
102
  "--cue-style-disabled-opacity",
103
103
  "--cue-style-field-fill",
104
+ "--cue-style-field-focus-mix",
104
105
  "--cue-style-field-focus-offset",
105
106
  "--cue-style-field-hover-edge",
106
107
  "--cue-style-field-pad",
@@ -97,6 +97,7 @@
97
97
  "--cue-style-disabled-ink",
98
98
  "--cue-style-disabled-opacity",
99
99
  "--cue-style-field-fill",
100
+ "--cue-style-field-focus-mix",
100
101
  "--cue-style-field-focus-offset",
101
102
  "--cue-style-field-hover-edge",
102
103
  "--cue-style-field-pad",
@@ -4,11 +4,13 @@
4
4
  "group": "elements",
5
5
  "importPath": "@cueplusplus/ui/elements/markdown",
6
6
  "peerDependencies": [
7
+ "mdast-util-gfm-table",
8
+ "micromark-extension-gfm-table",
7
9
  "react-markdown",
8
10
  "rehype-sanitize"
9
11
  ],
10
12
  "clientOnly": true,
11
- "description": "Model output, rendered.\n\nThe one component in this library that turns a string into markup, and the\nonly one that has to be argued for rather than described. Everywhere else —\n`Message`, `AskBox`, every element in this group — text is text: a string\narrives from a model and is placed in the DOM as characters, because a\ncomponent that quietly parsed it would put every consumer of this library one\nprompt away from an injection. This one parses, so it states in full what it\nwill and will not do with what it is given.\n\n**Threat model.** The input is hostile. Assume the string was written by a\nmodel that was told to write it by a web page it fetched, a file it read, or\na tool result it did not verify — the practical shape of prompt injection is\nnot \"the model turned evil\", it is \"the model faithfully relayed an\nattacker's bytes\". Three things follow.\n\n- **No raw HTML, ever, and not by filtering it.** Markup in the source has no\n path to the DOM, and the first reason is an absence rather than a setting.\n `react-markdown` hands `remark-rehype` its own `allowDangerousHtml: true`\n and spreads it *over* whatever `remarkRehypeOptions` says, so the option\n cannot be turned off from here and `<img onerror=…>` does become a `raw`\n node. A `raw` node is a span of source text rather than an element, and the\n one thing that turns it into markup is `rehype-raw`. Nothing in this package\n depends on that plugin, and a test asserts it never will — so the string has\n no parser to reach. `rehype-sanitize` then drops the `raw` type outright,\n and react-markdown's own `skipHtml` removes whatever is left. Three gates,\n none of which is a deny-list of dangerous tags. A `<script>`, an\n `<iframe>`, an `<svg>` and an `onclick=` are all the same non-event: there\n is nothing in the tree for them to be.\n- **Attributes are enumerated, not filtered.** An element that is not in the\n schema renders nothing; an element that is renders only the attributes\n named beside it — `href`/`title` on a link, `src`/`alt`/`title` on an\n image, `language-…` on a `code`. No element in the subset accepts `id`,\n `style`, `srcset`, `formaction` or any `on*` handler, so none of them has\n an attribute to arrive on.\n- **URLs are allow-listed twice.** `http`, `https` and `mailto` on both\n `href` and `src`; a relative URL stays relative; everything else — a\n `javascript:` link, a `data:text/html` image, `vbscript:`, `blob:`,\n `file:`, `//host` — loses the attribute and leaves an inert element\n behind. Every link also carries `rel=\"noopener noreferrer nofollow\"`,\n which is not a prop: reverse tabnabbing, referrer leakage of a private\n console URL, and SEO laundering through a transcript are all things a\n caller should not be able to turn off by accident.\n\n**The subset.** Paragraphs, ATX and setext headings, bullet and ordered\nlists, block quotes, thematic breaks, fenced and indented code, inline code,\nemphasis, strong, strikethrough, links, images, and hard breaks. No GFM\nplugin is enabled, so no tables, task lists, footnotes or autolink literals —\nan explicit `<https://…>` autolink still works. Fenced blocks are plain text\nunless {@link MarkdownTextProps.renderCodeBlock} is given.\n\n**Streaming.** Pass `streaming` while the turn is arriving and the token the\nmodel is halfway through typing is hidden rather than rendered as\npunctuation: no asterisks flickering through every bold run, no half-written\nURL, no fence that opens a code block one frame and closes it the next. The\nwords appear as they arrive; only their formatting waits for the closing\ntoken.\n\n`react-markdown` and `rehype-sanitize` are optional peers of this subpath\nalone, which is why this component is not re-exported from\n`@cueplusplus/ui/elements`: a console that renders a transcript without\nmarkdown should install neither.",
13
+ "description": "Model output, rendered.\n\nThe one component in this library that turns a string into markup, and the\nonly one that has to be argued for rather than described. Everywhere else —\n`Message`, `AskBox`, every element in this group — text is text: a string\narrives from a model and is placed in the DOM as characters, because a\ncomponent that quietly parsed it would put every consumer of this library one\nprompt away from an injection. This one parses, so it states in full what it\nwill and will not do with what it is given.\n\n**Threat model.** The input is hostile. Assume the string was written by a\nmodel that was told to write it by a web page it fetched, a file it read, or\na tool result it did not verify — the practical shape of prompt injection is\nnot \"the model turned evil\", it is \"the model faithfully relayed an\nattacker's bytes\". Three things follow.\n\n- **No raw HTML, ever, and not by filtering it.** Markup in the source has no\n path to the DOM, and the first reason is an absence rather than a setting.\n `react-markdown` hands `remark-rehype` its own `allowDangerousHtml: true`\n and spreads it *over* whatever `remarkRehypeOptions` says, so the option\n cannot be turned off from here and `<img onerror=…>` does become a `raw`\n node. A `raw` node is a span of source text rather than an element, and the\n one thing that turns it into markup is `rehype-raw`. Nothing in this package\n depends on that plugin, and a test asserts it never will — so the string has\n no parser to reach. `rehype-sanitize` then drops the `raw` type outright,\n and react-markdown's own `skipHtml` removes whatever is left. Three gates,\n none of which is a deny-list of dangerous tags. A `<script>`, an\n `<iframe>`, an `<svg>` and an `onclick=` are all the same non-event: there\n is nothing in the tree for them to be.\n- **Attributes are enumerated, not filtered.** An element that is not in the\n schema renders nothing; an element that is renders only the attributes\n named beside it — `href`/`title` on a link, `src`/`alt`/`title` on an\n image, `language-…` on a `code`, and `align` on a table cell, held to\n `left`, `center` or `right`. No element in the subset accepts `id`,\n `style`, `srcset`, `formaction` or any `on*` handler, so none of them has\n an attribute to arrive on; the one inline style anything carries is a\n cell's `text-align`, which the renderer writes from that `align`.\n- **URLs are allow-listed twice.** `http`, `https` and `mailto` on both\n `href` and `src`; a relative URL stays relative; everything else — a\n `javascript:` link, a `data:text/html` image, `vbscript:`, `blob:`,\n `file:`, `//host` — loses the attribute and leaves an inert element\n behind. Every link also carries `rel=\"noopener noreferrer nofollow\"`,\n which is not a prop: reverse tabnabbing, referrer leakage of a private\n console URL, and SEO laundering through a transcript are all things a\n caller should not be able to turn off by accident.\n\n**The subset.** Paragraphs, ATX and setext headings, bullet and ordered\nlists, block quotes, thematic breaks, fenced and indented code, inline code,\nemphasis, strong, strikethrough, links, images, hard breaks, and GitHub\ntables. Tables are the one part of GFM the parser reads, each column aligned\nas its delimiter row says and wrapped in a named region that scrolls\nsideways; task lists, footnotes and autolink literals stay out — an explicit\n`<https://…>` autolink still works. Fenced blocks are plain text unless\n{@link MarkdownTextProps.renderCodeBlock} is given, and\n{@link MarkdownTextProps.remarkPlugins} adds parser plugins without widening\nthe subset.\n\n**Streaming.** Pass `streaming` while the turn is arriving and the token the\nmodel is halfway through typing is hidden rather than rendered as\npunctuation: no asterisks flickering through every bold run, no half-written\nURL, no fence that opens a code block one frame and closes it the next. The\nwords appear as they arrive; only their formatting waits for the closing\ntoken.\n\n`react-markdown`, `rehype-sanitize` and GFM's table pair\n(`micromark-extension-gfm-table`, `mdast-util-gfm-table`) are optional peers\nof this subpath alone, which is why this component is not re-exported from\n`@cueplusplus/ui/elements`: a console that renders a transcript without\nmarkdown should install none of them.",
12
14
  "props": [
13
15
  {
14
16
  "name": "children",
@@ -71,6 +73,17 @@
71
73
  "kind": "callback",
72
74
  "fixture": "callback.log"
73
75
  }
76
+ },
77
+ {
78
+ "name": "remarkPlugins",
79
+ "type": "PluggableList | null",
80
+ "required": false,
81
+ "defaultValue": null,
82
+ "description": "More remark plugins, run after the component's own table syntax.\n\nA seam for the parser, not for the page: whatever a plugin adds to the\ntree still passes the same sanitizer, so a plugin can change what the\nmarkdown *means* — a mention syntax, a glossary link — but cannot widen\nwhat renders. An element outside the subset is dropped, and an attribute\nthe schema does not name never arrives.",
83
+ "control": {
84
+ "kind": "opaque",
85
+ "nullable": true
86
+ }
74
87
  }
75
88
  ],
76
89
  "typeReferences": [
@@ -95,6 +108,7 @@
95
108
  "--cue-space-3",
96
109
  "--cue-space-5",
97
110
  "--cue-style-focus-width",
111
+ "--cue-surface-2",
98
112
  "--cue-text-body",
99
113
  "--cue-text-emphasis",
100
114
  "--cue-text-label",
@@ -105,7 +119,7 @@
105
119
  "examples": [
106
120
  {
107
121
  "title": "Usage",
108
- "code": "<Message agent=\"researcher\">\n <MarkdownText>{turn.text}</MarkdownText>\n</Message>\n<MarkdownText streaming={turn.status === \"running\"}>{turn.text}</MarkdownText>\n<MarkdownText renderCodeBlock={({ language, code }) => <Highlight lang={language} code={code} />}>\n {answer}\n</MarkdownText>",
122
+ "code": "<Message agent=\"researcher\">\n <MarkdownText>{turn.text}</MarkdownText>\n</Message>\n<MarkdownText streaming={turn.status === \"running\"}>{turn.text}</MarkdownText>\n<MarkdownText renderCodeBlock={({ language, code }) => <Highlight lang={language} code={code} />}>\n {answer}\n</MarkdownText>\n<MarkdownText remarkPlugins={[remarkMentions]}>{turn.text}</MarkdownText>",
109
123
  "language": "tsx"
110
124
  }
111
125
  ],
@@ -270,6 +270,7 @@
270
270
  "--cue-style-disabled-opacity",
271
271
  "--cue-style-display-variation",
272
272
  "--cue-style-field-fill",
273
+ "--cue-style-field-focus-mix",
273
274
  "--cue-style-field-focus-offset",
274
275
  "--cue-style-field-hover-edge",
275
276
  "--cue-style-field-pad",
@@ -129,6 +129,7 @@
129
129
  "--cue-style-disabled-ink",
130
130
  "--cue-style-disabled-opacity",
131
131
  "--cue-style-field-fill",
132
+ "--cue-style-field-focus-mix",
132
133
  "--cue-style-field-focus-offset",
133
134
  "--cue-style-field-hover-edge",
134
135
  "--cue-style-field-pad",
@@ -118,6 +118,7 @@
118
118
  "--cue-style-disabled-ink",
119
119
  "--cue-style-disabled-opacity",
120
120
  "--cue-style-field-fill",
121
+ "--cue-style-field-focus-mix",
121
122
  "--cue-style-field-focus-offset",
122
123
  "--cue-style-field-hover-edge",
123
124
  "--cue-style-field-pad",
@@ -151,6 +151,7 @@
151
151
  "--cue-style-disabled-ink",
152
152
  "--cue-style-disabled-opacity",
153
153
  "--cue-style-field-fill",
154
+ "--cue-style-field-focus-mix",
154
155
  "--cue-style-field-focus-offset",
155
156
  "--cue-style-field-hover-edge",
156
157
  "--cue-style-field-pad",
@@ -159,6 +159,7 @@
159
159
  "--cue-style-disabled-ink",
160
160
  "--cue-style-disabled-opacity",
161
161
  "--cue-style-field-fill",
162
+ "--cue-style-field-focus-mix",
162
163
  "--cue-style-field-focus-offset",
163
164
  "--cue-style-field-hover-edge",
164
165
  "--cue-style-field-pad",
@@ -245,6 +245,7 @@
245
245
  "--cue-style-disabled-ink",
246
246
  "--cue-style-disabled-opacity",
247
247
  "--cue-style-field-fill",
248
+ "--cue-style-field-focus-mix",
248
249
  "--cue-style-field-focus-offset",
249
250
  "--cue-style-field-hover-edge",
250
251
  "--cue-style-field-pad",
@@ -183,6 +183,7 @@
183
183
  "--cue-style-disabled-ink",
184
184
  "--cue-style-disabled-opacity",
185
185
  "--cue-style-field-fill",
186
+ "--cue-style-field-focus-mix",
186
187
  "--cue-style-field-focus-offset",
187
188
  "--cue-style-field-hover-edge",
188
189
  "--cue-style-field-pad",
@@ -237,6 +237,7 @@
237
237
  "--cue-style-disabled-ink",
238
238
  "--cue-style-disabled-opacity",
239
239
  "--cue-style-field-fill",
240
+ "--cue-style-field-focus-mix",
240
241
  "--cue-style-field-focus-offset",
241
242
  "--cue-style-field-hover-edge",
242
243
  "--cue-style-field-pad",
@@ -270,6 +270,7 @@
270
270
  "--cue-style-disabled-opacity",
271
271
  "--cue-style-display-variation",
272
272
  "--cue-style-field-fill",
273
+ "--cue-style-field-focus-mix",
273
274
  "--cue-style-field-focus-offset",
274
275
  "--cue-style-field-hover-edge",
275
276
  "--cue-style-field-pad",
@@ -93,6 +93,7 @@
93
93
  "--cue-style-disabled-ink",
94
94
  "--cue-style-disabled-opacity",
95
95
  "--cue-style-field-fill",
96
+ "--cue-style-field-focus-mix",
96
97
  "--cue-style-field-focus-offset",
97
98
  "--cue-style-field-hover-edge",
98
99
  "--cue-style-field-pad",
@@ -81,6 +81,7 @@
81
81
  "--cue-style-disabled-ink",
82
82
  "--cue-style-disabled-opacity",
83
83
  "--cue-style-field-fill",
84
+ "--cue-style-field-focus-mix",
84
85
  "--cue-style-field-focus-offset",
85
86
  "--cue-style-field-hover-edge",
86
87
  "--cue-style-field-pad",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": 2,
3
3
  "library": "@cueplusplus/ui",
4
- "version": "0.22.0",
4
+ "version": "0.24.0",
5
5
  "generatedAt": "1970-01-01T00:00:00.000Z",
6
6
  "themes": [
7
7
  "command",
@@ -38,7 +38,7 @@
38
38
  ],
39
39
  "tokens": {
40
40
  "path": "./tokens.json",
41
- "sha256": "38d9502fd7813d7d3d0c9eaa02ae5850b4f9855c6954c8671569cf08e97ea73d"
41
+ "sha256": "fcc11015750652ab6e7332b9d8c39aa3f540f27c01b482ae21980314dc46f03b"
42
42
  },
43
43
  "systemApis": [
44
44
  {
@@ -513,7 +513,7 @@
513
513
  "mdUrl": "/docs/components/composer.md",
514
514
  "jsonUrl": "/r/components/composer.json",
515
515
  "path": "./components/composer.json",
516
- "sha256": "1a3ba8b3a3fed698a6e1f5b2cb40f7a2d5f26005e112d13c359741ca5c1e6a48"
516
+ "sha256": "0a38f9056c6e8f86155523c0eef9d2b13fda464408d2d8c31f256d0da2ace286"
517
517
  },
518
518
  {
519
519
  "name": "DelegationCard",
@@ -942,7 +942,7 @@
942
942
  "mdUrl": "/docs/components/color-field.md",
943
943
  "jsonUrl": "/r/components/color-field.json",
944
944
  "path": "./components/color-field.json",
945
- "sha256": "8f0197d4e6beda16194a055c1bc3762a133182c78d9fe676945163935ccdf649"
945
+ "sha256": "332c18b35ecd26dd61750c836d77720171f21b5b07d2cd482f86decee09ed904"
946
946
  },
947
947
  {
948
948
  "name": "ColorPicker",
@@ -955,7 +955,7 @@
955
955
  "mdUrl": "/docs/components/color-picker.md",
956
956
  "jsonUrl": "/r/components/color-picker.json",
957
957
  "path": "./components/color-picker.json",
958
- "sha256": "689bc048df5076650787539798e2cc9e14242943e167f2bbfe162c7fad5e4ce0"
958
+ "sha256": "463bb50929967eb20af06eeb62be4be2159aafe7a9b56d65a8294e94acb78488"
959
959
  },
960
960
  {
961
961
  "name": "ColorSlider",
@@ -1085,7 +1085,7 @@
1085
1085
  "mdUrl": "/docs/components/date-field.md",
1086
1086
  "jsonUrl": "/r/components/date-field.json",
1087
1087
  "path": "./components/date-field.json",
1088
- "sha256": "7dbd02a73256b5fa17f8297d2fa812cce04a68f7534d281d56c6d9d956e1d846"
1088
+ "sha256": "ef8a3561b6b52874549af7f0c8764d8cd5fed032bc6003015f815dc8cf5eb875"
1089
1089
  },
1090
1090
  {
1091
1091
  "name": "DatePicker",
@@ -1098,7 +1098,7 @@
1098
1098
  "mdUrl": "/docs/components/date-picker.md",
1099
1099
  "jsonUrl": "/r/components/date-picker.json",
1100
1100
  "path": "./components/date-picker.json",
1101
- "sha256": "3e1b03e3f9297c2e2e9464f3e104b4f0dd54f8f9ebbcde85a8f62f3bada647cb"
1101
+ "sha256": "ca298c4fc5727fc056c6bd141c38180a62eef89f187bc66ac352a551fd939185"
1102
1102
  },
1103
1103
  {
1104
1104
  "name": "DateRangePicker",
@@ -1111,7 +1111,7 @@
1111
1111
  "mdUrl": "/docs/components/date-range-picker.md",
1112
1112
  "jsonUrl": "/r/components/date-range-picker.json",
1113
1113
  "path": "./components/date-range-picker.json",
1114
- "sha256": "2f56557fd70d5b4ebca6a93831e038c7d67b64f58c140902549b0a3e242bc031"
1114
+ "sha256": "f2f28b405e414f21c4ebfec5b63faad8312928d4cd4283c34ccc1cd2794da0b6"
1115
1115
  },
1116
1116
  {
1117
1117
  "name": "TimeField",
@@ -1124,7 +1124,7 @@
1124
1124
  "mdUrl": "/docs/components/time-field.md",
1125
1125
  "jsonUrl": "/r/components/time-field.json",
1126
1126
  "path": "./components/time-field.json",
1127
- "sha256": "be505c5b95bf73bf252534ed7f19adc9f36471c55c7497f84b5e87c0f0689ac0"
1127
+ "sha256": "8c8d3a4401f5fd67527f31e3879af7c160e76f9e5b31ef97fa1d8477ed811ae1"
1128
1128
  },
1129
1129
  {
1130
1130
  "name": "ChannelMatrix",
@@ -2320,7 +2320,7 @@
2320
2320
  "mdUrl": "/docs/components/markdown-text.md",
2321
2321
  "jsonUrl": "/r/components/markdown-text.json",
2322
2322
  "path": "./components/markdown-text.json",
2323
- "sha256": "0ab4a2b9ca29f5c4faf89b705e23233cc8d472fa1d8779949c3236b0ebb4eddb"
2323
+ "sha256": "09114d7367b8b47786418e5362e657ac5ae8ec3b5f831da985332f6a96d2be42"
2324
2324
  },
2325
2325
  {
2326
2326
  "name": "MathBlock",
@@ -3282,7 +3282,7 @@
3282
3282
  "mdUrl": "/docs/components/autocomplete.md",
3283
3283
  "jsonUrl": "/r/components/autocomplete.json",
3284
3284
  "path": "./components/autocomplete.json",
3285
- "sha256": "49bbdf5a1c223ca65b2458ac6b87d9a2d0c8054653eb668eb707dc4be0500278"
3285
+ "sha256": "63b82d5524485aed7078bce24063780c5ec2e1c44ef9cb4b2a0a5108f603dcad"
3286
3286
  },
3287
3287
  {
3288
3288
  "name": "ButtonGroup",
@@ -3334,7 +3334,7 @@
3334
3334
  "mdUrl": "/docs/components/combobox.md",
3335
3335
  "jsonUrl": "/r/components/combobox.json",
3336
3336
  "path": "./components/combobox.json",
3337
- "sha256": "0f66194a077d0dd5db155596a88c76760a858ff95d485e43b75415f626ef53b6"
3337
+ "sha256": "6dc53875746a523c995608a40ee60f2cbdf64ee4cfdbaa07fe6e2697541a2994"
3338
3338
  },
3339
3339
  {
3340
3340
  "name": "EnvVarInput",
@@ -3347,7 +3347,7 @@
3347
3347
  "mdUrl": "/docs/components/env-var-input.md",
3348
3348
  "jsonUrl": "/r/components/env-var-input.json",
3349
3349
  "path": "./components/env-var-input.json",
3350
- "sha256": "6840d523ae8695033a80b61fa3d1cd94e277061a880cf1b70dfee836f81b2cb8"
3350
+ "sha256": "8edb3111172ec68ee6d00266283324388e7ee1593b4350da279731da5294bb3d"
3351
3351
  },
3352
3352
  {
3353
3353
  "name": "Field",
@@ -3425,7 +3425,7 @@
3425
3425
  "mdUrl": "/docs/components/input.md",
3426
3426
  "jsonUrl": "/r/components/input.json",
3427
3427
  "path": "./components/input.json",
3428
- "sha256": "b24851abe536d705b8affcbfb51c105603afa0b893f0f2a76f96f0376f38f02d"
3428
+ "sha256": "f4cf68a0db39a9f27fc91b97bac4cc980f0bfc952356ec2d092d72c2fb3a1850"
3429
3429
  },
3430
3430
  {
3431
3431
  "name": "InputGroup",
@@ -3438,7 +3438,7 @@
3438
3438
  "mdUrl": "/docs/components/input-group.md",
3439
3439
  "jsonUrl": "/r/components/input-group.json",
3440
3440
  "path": "./components/input-group.json",
3441
- "sha256": "563eff7f480d07795d1e1cd72c8dfd657740398b984a7882685a2eed5ca62f54"
3441
+ "sha256": "91692a5e17deb76468fb4b55f15073338aebf398b6fadf4824a3f9c19f54aa07"
3442
3442
  },
3443
3443
  {
3444
3444
  "name": "MultiSelect",
@@ -3451,7 +3451,7 @@
3451
3451
  "mdUrl": "/docs/components/multi-select.md",
3452
3452
  "jsonUrl": "/r/components/multi-select.json",
3453
3453
  "path": "./components/multi-select.json",
3454
- "sha256": "e7efabaa74b06f848cae209f842598ce949bf44a1ecc3be029f5649fc6584da3"
3454
+ "sha256": "fa820d7bdc9e0fb6ece919483678b695210ccda4f7aae1465ab70bb1933e08f9"
3455
3455
  },
3456
3456
  {
3457
3457
  "name": "NumberField",
@@ -3464,7 +3464,7 @@
3464
3464
  "mdUrl": "/docs/components/number-field.md",
3465
3465
  "jsonUrl": "/r/components/number-field.json",
3466
3466
  "path": "./components/number-field.json",
3467
- "sha256": "5793c625ef9a4847d662bac1bb8fd43dff8f1f3d95132ee65282778cd0b682f7"
3467
+ "sha256": "3843121dd89ba6e2c45856b21ed8b7f5dd8b50f604f27a69929fb696f0addd04"
3468
3468
  },
3469
3469
  {
3470
3470
  "name": "OTPField",
@@ -3477,7 +3477,7 @@
3477
3477
  "mdUrl": "/docs/components/otp-field.md",
3478
3478
  "jsonUrl": "/r/components/otp-field.json",
3479
3479
  "path": "./components/otp-field.json",
3480
- "sha256": "6d24f09139d73a6af651664ff7958f5f727c3908235102b4172ae85b4ddb8e7c"
3480
+ "sha256": "bf75cbad335d0a98a6ac1067c0f1c6167dc4d53652fdfd97e7956ec78436d033"
3481
3481
  },
3482
3482
  {
3483
3483
  "name": "PasswordInput",
@@ -3490,7 +3490,7 @@
3490
3490
  "mdUrl": "/docs/components/password-input.md",
3491
3491
  "jsonUrl": "/r/components/password-input.json",
3492
3492
  "path": "./components/password-input.json",
3493
- "sha256": "addb0ef6ac0bbf8472c401b9f99da078e8195d3faef43b92ed8843baec6d4867"
3493
+ "sha256": "bbac6a2d08045cb67a044affa7fee2967cad98811c2b87c27b299ba365c6fd99"
3494
3494
  },
3495
3495
  {
3496
3496
  "name": "Radio",
@@ -3542,7 +3542,7 @@
3542
3542
  "mdUrl": "/docs/components/scrub-input.md",
3543
3543
  "jsonUrl": "/r/components/scrub-input.json",
3544
3544
  "path": "./components/scrub-input.json",
3545
- "sha256": "07a25f241dc890c1fbd34641cf5bb90921317b6298d5f578aabb0f64eac6f83a"
3545
+ "sha256": "affa46b6a0c56eddcc82429b74afd12d53a9daf0d3354bf9e9f9c849ed9e3ce9"
3546
3546
  },
3547
3547
  {
3548
3548
  "name": "SearchInput",
@@ -3555,7 +3555,7 @@
3555
3555
  "mdUrl": "/docs/components/search-input.md",
3556
3556
  "jsonUrl": "/r/components/search-input.json",
3557
3557
  "path": "./components/search-input.json",
3558
- "sha256": "c3f572e9b0e3e960a1975998a8e6681a59c71d58f9bb98922902ac26085fea06"
3558
+ "sha256": "163dbb2109f0ac8899cdc48502a872b8bc61d44ec20da8e9389f2de24087ab68"
3559
3559
  },
3560
3560
  {
3561
3561
  "name": "Select",
@@ -3568,7 +3568,7 @@
3568
3568
  "mdUrl": "/docs/components/select.md",
3569
3569
  "jsonUrl": "/r/components/select.json",
3570
3570
  "path": "./components/select.json",
3571
- "sha256": "d5e09c0c7fc5285b2d2d1ef92a93f6f6042ffc49f5495e730a70fc4d6448782a"
3571
+ "sha256": "70586217a040a98ffe8368a4353bbca655d3247317aa6750940b4ead6438115a"
3572
3572
  },
3573
3573
  {
3574
3574
  "name": "Slider",
@@ -3607,7 +3607,7 @@
3607
3607
  "mdUrl": "/docs/components/tags-input.md",
3608
3608
  "jsonUrl": "/r/components/tags-input.json",
3609
3609
  "path": "./components/tags-input.json",
3610
- "sha256": "f174dcc58a3c3b7b3675998f5958ec0da824580055e327d0a0fffbc61d4c2830"
3610
+ "sha256": "76e4486f2413f6547777dc660f641a531cf77e2ea16f01de58632f54d2d02cf7"
3611
3611
  },
3612
3612
  {
3613
3613
  "name": "Textarea",
@@ -3620,7 +3620,7 @@
3620
3620
  "mdUrl": "/docs/components/textarea.md",
3621
3621
  "jsonUrl": "/r/components/textarea.json",
3622
3622
  "path": "./components/textarea.json",
3623
- "sha256": "69874c062a176945b901989f1f970554432c37223b221fcf4406fed7984c57bd"
3623
+ "sha256": "0612d1b26adf377909e7cfe66bbf85c3af117737d8c4908907174556afbe9b1c"
3624
3624
  },
3625
3625
  {
3626
3626
  "name": "Toggle",
@@ -4361,7 +4361,7 @@
4361
4361
  "mdUrl": "/docs/components/musical-time-input.md",
4362
4362
  "jsonUrl": "/r/components/musical-time-input.json",
4363
4363
  "path": "./components/musical-time-input.json",
4364
- "sha256": "9e9b582026b92fcbf069c481c9a3fbbc8f5dd7f70d6ac2f61614a3d290ea8b6e"
4364
+ "sha256": "2fb56643ffb77614b8b2e08257ea9f1f8b6f29cf4288509f34ac15d1a79c3941"
4365
4365
  },
4366
4366
  {
4367
4367
  "name": "PianoKeyboard",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": 2,
3
3
  "library": "@cueplusplus/tokens",
4
- "version": "0.22.0",
4
+ "version": "0.24.0",
5
5
  "themes": [
6
6
  {
7
7
  "name": "command",
@@ -283,6 +283,7 @@
283
283
  "--cue-fg",
284
284
  "--cue-fg-muted",
285
285
  "--cue-fg-subtle",
286
+ "--cue-field-edge",
286
287
  "--cue-focus",
287
288
  "--cue-font-mono",
288
289
  "--cue-font-theme-mono",
@@ -462,6 +463,7 @@
462
463
  "--cue-style-eyebrow-size",
463
464
  "--cue-style-eyebrow-weight",
464
465
  "--cue-style-field-fill",
466
+ "--cue-style-field-focus-mix",
465
467
  "--cue-style-field-focus-offset",
466
468
  "--cue-style-field-gap",
467
469
  "--cue-style-field-hover-edge",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cueplusplus/ui",
3
- "version": "0.22.0",
3
+ "version": "0.24.0",
4
4
  "description": "CUE++ design system components: Tailwind v4 styled wrappers over Base UI, driven by @cueplusplus/tokens.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -145,8 +145,8 @@
145
145
  "clsx": "^2.1.1",
146
146
  "culori": "^4.0.2",
147
147
  "tailwind-merge": "^3.6.0",
148
- "@cueplusplus/theme-base": "^1.3.0",
149
- "@cueplusplus/tokens": "0.22.0"
148
+ "@cueplusplus/theme-base": "^1.4.0",
149
+ "@cueplusplus/tokens": "0.24.0"
150
150
  },
151
151
  "peerDependencies": {
152
152
  "@assistant-ui/react": "^0.15.16",
@@ -160,6 +160,8 @@
160
160
  "embla-carousel-react": "^8.6.0",
161
161
  "heat-graph": "^0.0.15",
162
162
  "lucide-react": "^1.31.0",
163
+ "mdast-util-gfm-table": "^2.0.0",
164
+ "micromark-extension-gfm-table": "^2.1.1",
163
165
  "react": "^19.0.0",
164
166
  "react-aria-components": "^1.20.0",
165
167
  "react-day-picker": "^10.0.1",
@@ -201,6 +203,12 @@
201
203
  "lucide-react": {
202
204
  "optional": true
203
205
  },
206
+ "mdast-util-gfm-table": {
207
+ "optional": true
208
+ },
209
+ "micromark-extension-gfm-table": {
210
+ "optional": true
211
+ },
204
212
  "react-aria-components": {
205
213
  "optional": true
206
214
  },
@@ -249,6 +257,8 @@
249
257
  "heat-graph": "^0.0.15",
250
258
  "jsdom": "^30.0.1",
251
259
  "lucide-react": "^1.31.0",
260
+ "mdast-util-gfm-table": "^2.0.0",
261
+ "micromark-extension-gfm-table": "^2.1.1",
252
262
  "publint": "^0.3.23",
253
263
  "react": "^19.2.0",
254
264
  "react-aria-components": "^1.20.0",
@@ -262,7 +272,7 @@
262
272
  "tsdown": "0.22.14",
263
273
  "typescript": "^5.7.0",
264
274
  "vitest": "^4.1.10",
265
- "@cueplusplus/theme-tools": "1.2.0",
275
+ "@cueplusplus/theme-tools": "1.3.0",
266
276
  "@repo/docgen": "0.0.0",
267
277
  "@repo/eslint-config": "0.0.0",
268
278
  "@repo/typescript-config": "0.0.0"