@kerfjs/ui 5.0.0-beta.62 → 5.0.0-beta.63

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 (154) hide show
  1. package/README.md +4 -0
  2. package/ai/component-catalog-extension.schema.json +13 -0
  3. package/ai/component-catalog.json +8 -2
  4. package/ai/component-composition.json +9 -2
  5. package/ai/components/list-item.md +1 -1
  6. package/ai/components/workbench.md +3 -2
  7. package/ai/public-api-signatures-v1.md +136 -38
  8. package/ai/skill.md +9 -5
  9. package/ai/webawesome-jsx-signatures-v1.md +1 -1
  10. package/analyzer/index.mjs +3 -2
  11. package/catalog-projection-cli.mjs +96 -0
  12. package/catalog-projection.d.mts +55 -0
  13. package/catalog-projection.mjs +62 -0
  14. package/dist/browser/catalog.js +1 -1
  15. package/dist/browser/collapsible-panel.js +2 -0
  16. package/dist/browser/nav-stack.js +1 -0
  17. package/dist/browser/split-view.js +1 -0
  18. package/dist/browser/toolbar-control-group.js +1 -0
  19. package/dist/browser/workbench.js +1 -0
  20. package/dist/catalog-resources.d.ts +1 -1
  21. package/dist/catalog.d.ts +1 -1
  22. package/dist/catalog.js +11 -10
  23. package/dist/catalog.js.map +1 -1
  24. package/dist/chip.d.ts +9 -3
  25. package/dist/chip.js +1 -1
  26. package/dist/{chunk-OD2VXAPL.js → chunk-3BYFWTP3.js} +4 -3
  27. package/dist/chunk-3BYFWTP3.js.map +1 -0
  28. package/dist/{chunk-5Q3N6EV7.js → chunk-5IJ6UGNZ.js} +3 -3
  29. package/dist/{chunk-5Q3N6EV7.js.map → chunk-5IJ6UGNZ.js.map} +1 -1
  30. package/dist/chunk-7AKGPBCC.js +76 -0
  31. package/dist/chunk-7AKGPBCC.js.map +1 -0
  32. package/dist/{chunk-KROD7KZK.js → chunk-AUVG54KC.js} +2 -2
  33. package/dist/{chunk-KROD7KZK.js.map → chunk-AUVG54KC.js.map} +1 -1
  34. package/dist/{chunk-AUKT3KMG.js → chunk-CQHN45XR.js} +17 -2
  35. package/dist/chunk-CQHN45XR.js.map +1 -0
  36. package/dist/{chunk-SWVW56CV.js → chunk-EN4LDR5Y.js} +2 -2
  37. package/dist/{chunk-SWVW56CV.js.map → chunk-EN4LDR5Y.js.map} +1 -1
  38. package/dist/{chunk-4MG3KXJM.js → chunk-F7OCOBTG.js} +2 -2
  39. package/dist/{chunk-4MG3KXJM.js.map → chunk-F7OCOBTG.js.map} +1 -1
  40. package/dist/{chunk-KYDDCJXU.js → chunk-HXCMWANP.js} +4 -4
  41. package/dist/{chunk-KYDDCJXU.js.map → chunk-HXCMWANP.js.map} +1 -1
  42. package/dist/{chunk-ENGVYQPG.js → chunk-IA4D5XNT.js} +60 -10
  43. package/dist/chunk-IA4D5XNT.js.map +1 -0
  44. package/dist/{chunk-F4QMLOXJ.js → chunk-IAOAZUOO.js} +2 -2
  45. package/dist/{chunk-F4QMLOXJ.js.map → chunk-IAOAZUOO.js.map} +1 -1
  46. package/dist/{chunk-X6ADHJNI.js → chunk-KFYANKJI.js} +25 -6
  47. package/dist/chunk-KFYANKJI.js.map +1 -0
  48. package/dist/chunk-MOSIE4Z2.js +51 -0
  49. package/dist/chunk-MOSIE4Z2.js.map +1 -0
  50. package/dist/{chunk-7JUBXOIV.js → chunk-NXWE5S57.js} +25 -6
  51. package/dist/chunk-NXWE5S57.js.map +1 -0
  52. package/dist/{chunk-NNMLEDMD.js → chunk-OBAFAH5B.js} +36 -8
  53. package/dist/chunk-OBAFAH5B.js.map +1 -0
  54. package/dist/{chunk-A3CKOW2R.js → chunk-R75GGNWY.js} +123 -20
  55. package/dist/chunk-R75GGNWY.js.map +1 -0
  56. package/dist/chunk-RGS4WX2M.js +44 -0
  57. package/dist/chunk-RGS4WX2M.js.map +1 -0
  58. package/dist/{chunk-RRB26JRJ.js → chunk-RTJNJTG3.js} +2 -2
  59. package/dist/{chunk-RRB26JRJ.js.map → chunk-RTJNJTG3.js.map} +1 -1
  60. package/dist/{chunk-EAC4CDY7.js → chunk-SMZGAPCU.js} +15 -2
  61. package/dist/chunk-SMZGAPCU.js.map +1 -0
  62. package/dist/{chunk-6ZXOQEAN.js → chunk-WF75U3V4.js} +7 -1
  63. package/dist/chunk-WF75U3V4.js.map +1 -0
  64. package/dist/{chunk-VCBTX62E.js → chunk-ZRWXFDDS.js} +2 -2
  65. package/dist/chunk-ZRWXFDDS.js.map +1 -0
  66. package/dist/collapsible-panel.d.ts +18 -7
  67. package/dist/collapsible-panel.js +19 -3
  68. package/dist/collapsible-panel.js.map +1 -1
  69. package/dist/content-item.d.ts +36 -5
  70. package/dist/content-item.js +1 -1
  71. package/dist/disclosure-arrow.js +2 -1
  72. package/dist/index.d.ts +2 -2
  73. package/dist/index.js +19 -19
  74. package/dist/list-action-row.js +1 -1
  75. package/dist/list-header.js +1 -1
  76. package/dist/list-item.js +1 -1
  77. package/dist/lucide-icon.d.ts +5 -2
  78. package/dist/lucide-icon.js +2 -1
  79. package/dist/nav-stack.js +2 -1
  80. package/dist/pane.d.ts +2 -1
  81. package/dist/pane.js +1 -1
  82. package/dist/{panel-toolbar-DqwtBxQL.d.ts → panel-toolbar-DDKh4uKd.d.ts} +11 -2
  83. package/dist/popup-menu-register.js +38 -1
  84. package/dist/popup-menu-register.js.map +1 -1
  85. package/dist/popup-menu.d.ts +2 -2
  86. package/dist/popup-menu.js +1 -1
  87. package/dist/select.js +1 -1
  88. package/dist/split-view.js +2 -1
  89. package/dist/split-view.js.map +1 -1
  90. package/dist/styles/chip.css +14 -0
  91. package/dist/styles/content-item.css +36 -0
  92. package/dist/styles/list-action-row.css +4 -3
  93. package/dist/styles/list-header.css +4 -3
  94. package/dist/styles/list-item.css +21 -11
  95. package/dist/styles/lucide-icon.css +5 -0
  96. package/dist/styles/pane.css +3 -2
  97. package/dist/styles/popup-menu.css +15 -10
  98. package/dist/styles/select.css +11 -0
  99. package/dist/styles/sunken-panel.css +7 -0
  100. package/dist/styles/text.css +29 -0
  101. package/dist/styles/token-search-field.css +29 -6
  102. package/dist/styles/toolbar-control-group.css +35 -0
  103. package/dist/styles/workbench.css +148 -2
  104. package/dist/sunken-panel.d.ts +6 -1
  105. package/dist/sunken-panel.js +1 -1
  106. package/dist/text.d.ts +14 -3
  107. package/dist/text.js +1 -1
  108. package/dist/token-search-field.js +2 -1
  109. package/dist/toolbar-control-group.d.ts +5 -1
  110. package/dist/toolbar-control-group.js +2 -1
  111. package/dist/toolbar.d.ts +5 -2
  112. package/dist/toolbar.js +1 -1
  113. package/dist/wire-catalog.js +1 -1
  114. package/dist/wire-content-items.d.ts +9 -0
  115. package/dist/wire-content-items.js +62 -0
  116. package/dist/wire-content-items.js.map +1 -0
  117. package/dist/wire-token-search-fields.js +2 -1
  118. package/dist/wire-workbench.d.ts +7 -0
  119. package/dist/wire-workbench.js +1 -1
  120. package/dist/workbench.d.ts +24 -8
  121. package/dist/workbench.js +2 -1
  122. package/docs/accessibility.md +21 -5
  123. package/docs/catalog.md +36 -0
  124. package/docs/collapsible-panel.md +8 -1
  125. package/docs/component-contract.md +10 -4
  126. package/docs/component-selection.md +39 -8
  127. package/docs/design/templates/toolbar/title-and-actions-dark.svg +1 -1
  128. package/docs/design/templates/toolbar/title-and-actions.svg +1 -1
  129. package/docs/design/templates/toolbar-dark.svg +1 -1
  130. package/docs/design/templates/toolbar.svg +1 -1
  131. package/docs/examples/component-catalog-extension.json +6 -0
  132. package/docs/layout.md +30 -3
  133. package/docs/sunken-panel.md +22 -0
  134. package/docs/ui-analyzer.md +4 -0
  135. package/docs/workbench.md +38 -4
  136. package/llms.txt +9 -5
  137. package/package.json +16 -2
  138. package/scripts/component-catalog-extension-validation.mjs +28 -0
  139. package/dist/chunk-4R777DUZ.js +0 -34
  140. package/dist/chunk-4R777DUZ.js.map +0 -1
  141. package/dist/chunk-6ZXOQEAN.js.map +0 -1
  142. package/dist/chunk-7JUBXOIV.js.map +0 -1
  143. package/dist/chunk-A3CKOW2R.js.map +0 -1
  144. package/dist/chunk-AUKT3KMG.js.map +0 -1
  145. package/dist/chunk-EAC4CDY7.js.map +0 -1
  146. package/dist/chunk-ENGVYQPG.js.map +0 -1
  147. package/dist/chunk-MA73TA6D.js +0 -42
  148. package/dist/chunk-MA73TA6D.js.map +0 -1
  149. package/dist/chunk-N2DRU35S.js +0 -45
  150. package/dist/chunk-N2DRU35S.js.map +0 -1
  151. package/dist/chunk-NNMLEDMD.js.map +0 -1
  152. package/dist/chunk-OD2VXAPL.js.map +0 -1
  153. package/dist/chunk-VCBTX62E.js.map +0 -1
  154. package/dist/chunk-X6ADHJNI.js.map +0 -1
@@ -18,9 +18,9 @@ interface PopupMenuItem {
18
18
  value?: string;
19
19
  /** Leading icon, typically a `LucideIcon`; it is placed in the item's icon slot. */
20
20
  icon?: SafeHtml;
21
- /** A checked menu choice, including nested choices. */
21
+ /** A checkbox choice, including nested choices; omit for a plain command. */
22
22
  checked?: boolean;
23
- /** Trailing safe content, such as a selected-choice tick. */
23
+ /** Trailing safe content, such as secondary status. */
24
24
  details?: SafeHtml;
25
25
  /** Destructive command styling. */
26
26
  tone?: 'default' | 'danger';
@@ -1,3 +1,3 @@
1
- export { PopupMenu, closePopupMenu, openPopupMenuAt } from './chunk-VCBTX62E.js';
1
+ export { PopupMenu, closePopupMenu, openPopupMenuAt } from './chunk-ZRWXFDDS.js';
2
2
 
3
3
  //# sourceMappingURL=popup-menu.js.map
package/dist/select.js CHANGED
@@ -1,4 +1,4 @@
1
- export { Select } from './chunk-4MG3KXJM.js';
1
+ export { Select } from './chunk-F7OCOBTG.js';
2
2
 
3
3
 
4
4
 
@@ -1,4 +1,4 @@
1
- import { NavStack } from './chunk-KYDDCJXU.js';
1
+ import { NavStack } from './chunk-HXCMWANP.js';
2
2
  import { ResizableRegion } from './chunk-KLJKU6ZL.js';
3
3
 
4
4
 
@@ -6,6 +6,7 @@ import { ResizableRegion } from './chunk-KLJKU6ZL.js';
6
6
 
7
7
 
8
8
 
9
+
9
10
  import { jsx, jsxs } from 'kerfjs/jsx-runtime';
10
11
 
11
12
  function SplitView({
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/split-view.tsx"],"names":[],"mappings":"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","file":"split-view.js","sourcesContent":["import {\n NavStack,\n type NavStackProps,\n type NavStackView,\n} from './nav-stack.js';\nimport {\n ResizableRegion,\n type ResizableRegionProps,\n} from './resizable-region.js';\nimport type { KerfUiContent } from './semantic-content.js';\n\n/**\n * The roomy list pane's `ResizableRegion`: its committed `size` and `min` /\n * `max` limits, plus the region configuration that forwards unchanged\n * (`separator`, `handleIcon`, `contentOverflow`, and collapse:\n * `collapsed`, `transitioning`, `collapseMotion`, `restoreControl`,\n * `restorePosition`). Omitted options keep the region's defaults.\n */\nexport interface SplitViewResizable extends Pick<\n ResizableRegionProps,\n | 'separator'\n | 'handleIcon'\n | 'contentOverflow'\n | 'collapsed'\n | 'transitioning'\n | 'collapseMotion'\n | 'restoreControl'\n | 'restorePosition'\n> {\n size: number;\n min: number;\n max: number;\n}\n\n/** One compact view's top- and bottom-toolbar content (see `NavStackView`). */\nexport type SplitViewCompactViewToolbars = Pick<\n NavStackView,\n 'leading' | 'center' | 'toolbar' | 'bottomToolbar'\n>;\n\n/**\n * The compact `NavStack`'s configuration: its toolbar configuration, back\n * control, persistent bottom toolbar, and chrome dividers forward to the\n * stack, and `list` / `detail` give each view its own toolbar groups.\n */\nexport interface SplitViewCompactStack extends Pick<\n NavStackProps,\n | 'toolbarConfig'\n | 'backIcon'\n | 'backText'\n | 'hideToolbar'\n | 'bottomToolbar'\n | 'chromeDividers'\n> {\n /** Toolbar content for the list (root) view. */\n list?: SplitViewCompactViewToolbars;\n /** Toolbar content for the pushed detail view. */\n detail?: SplitViewCompactViewToolbars;\n}\n\nexport interface SplitViewProps {\n id: string;\n label: string;\n /** The list (primary) pane. */\n list: KerfUiContent;\n /** The detail (secondary) pane. */\n detail: KerfUiContent;\n /**\n * Compact (\"one pane at a time\") classes — a handset or portrait tablet.\n * Derive from `deviceClass().value.compact`. When true the split collapses to\n * a `NavStack`: the list is the root and the detail is pushed over it.\n */\n compact?: boolean;\n /** In compact mode, whether the detail is currently pushed over the list. */\n detailActive?: boolean;\n /** Title/label for the list (compact NavStack root + region label). */\n listTitle?: string;\n /** Title/label for the detail (compact NavStack pushed view + region label). */\n detailTitle?: string;\n /** Back label for the compact NavStack (default \"Back\"). */\n backLabel?: string;\n /** Compact NavStack configuration and per-view toolbars. */\n compactStack?: SplitViewCompactStack;\n /** A resizable separator on roomy classes (min/max px). Omit for a fixed split. */\n resizable?: SplitViewResizable;\n className?: string;\n /** Native named-slot assignment when composed inside a web component. */\n slot?: string;\n}\n\n/**\n * A list-detail split. On roomy classes it shows both panes side\n * by side with an optional resizable separator; on compact classes it collapses\n * to a `NavStack` (list → detail). See `docs/23-app-layouts.md` §3.2. Compose the\n * resizable wiring with `wireResizableRegions` and the compact back with\n * `wireNavStack`.\n */\nexport function SplitView({\n id,\n label,\n list,\n detail,\n compact = false,\n detailActive = false,\n listTitle = '',\n detailTitle = '',\n backLabel = 'Back',\n compactStack = {},\n resizable,\n className = '',\n slot,\n}: SplitViewProps) {\n if (compact) {\n const listView: NavStackView = {\n ...compactStack.list,\n key: 'list',\n title: listTitle,\n content: list,\n };\n const views: NavStackView[] = detailActive\n ? [\n listView,\n {\n ...compactStack.detail,\n key: 'detail',\n title: detailTitle,\n content: detail,\n },\n ]\n : [listView];\n return (\n <div\n class={`kui-split-view kui-split-view--compact ${className}`.trim()}\n id={id}\n data-component=\"split-view\"\n data-split-mode=\"compact\"\n slot={slot}\n >\n <NavStack\n id={`${id}-stack`}\n label={label}\n views={views}\n backLabel={backLabel}\n backIcon={compactStack.backIcon}\n backText={compactStack.backText}\n toolbarConfig={compactStack.toolbarConfig}\n hideToolbar={compactStack.hideToolbar}\n bottomToolbar={compactStack.bottomToolbar}\n chromeDividers={compactStack.chromeDividers}\n />\n </div>\n );\n }\n const listPane = resizable ? (\n <ResizableRegion\n id={`${id}-list`}\n label={listTitle || 'List'}\n size={resizable.size}\n min={resizable.min}\n max={resizable.max}\n separator={resizable.separator}\n handleIcon={resizable.handleIcon}\n contentOverflow={resizable.contentOverflow}\n collapsed={resizable.collapsed}\n transitioning={resizable.transitioning}\n collapseMotion={resizable.collapseMotion}\n restoreControl={resizable.restoreControl}\n restorePosition={resizable.restorePosition}\n >\n <div\n class=\"kui-split-view__list kui-pane\"\n data-split-list\n data-resizable=\"true\"\n >\n {list}\n </div>\n </ResizableRegion>\n ) : (\n <div\n class=\"kui-split-view__list kui-pane\"\n data-split-list\n data-resizable=\"false\"\n >\n {list}\n </div>\n );\n return (\n <div\n class={`kui-split-view ${className}`.trim()}\n id={id}\n data-component=\"split-view\"\n data-split-mode=\"split\"\n aria-label={label}\n slot={slot}\n >\n {listPane}\n <div\n class=\"kui-split-view__detail kui-pane\"\n data-split-detail\n aria-label={detailTitle || undefined}\n >\n {detail}\n </div>\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/split-view.tsx"],"names":[],"mappings":"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","file":"split-view.js","sourcesContent":["import {\n NavStack,\n type NavStackProps,\n type NavStackView,\n} from './nav-stack.js';\nimport {\n ResizableRegion,\n type ResizableRegionProps,\n} from './resizable-region.js';\nimport type { KerfUiContent } from './semantic-content.js';\n\n/**\n * The roomy list pane's `ResizableRegion`: its committed `size` and `min` /\n * `max` limits, plus the region configuration that forwards unchanged\n * (`separator`, `handleIcon`, `contentOverflow`, and collapse:\n * `collapsed`, `transitioning`, `collapseMotion`, `restoreControl`,\n * `restorePosition`). Omitted options keep the region's defaults.\n */\nexport interface SplitViewResizable extends Pick<\n ResizableRegionProps,\n | 'separator'\n | 'handleIcon'\n | 'contentOverflow'\n | 'collapsed'\n | 'transitioning'\n | 'collapseMotion'\n | 'restoreControl'\n | 'restorePosition'\n> {\n size: number;\n min: number;\n max: number;\n}\n\n/** One compact view's top- and bottom-toolbar content (see `NavStackView`). */\nexport type SplitViewCompactViewToolbars = Pick<\n NavStackView,\n 'leading' | 'center' | 'toolbar' | 'bottomToolbar'\n>;\n\n/**\n * The compact `NavStack`'s configuration: its toolbar configuration, back\n * control, persistent bottom toolbar, and chrome dividers forward to the\n * stack, and `list` / `detail` give each view its own toolbar groups.\n */\nexport interface SplitViewCompactStack extends Pick<\n NavStackProps,\n | 'toolbarConfig'\n | 'backIcon'\n | 'backText'\n | 'hideToolbar'\n | 'bottomToolbar'\n | 'chromeDividers'\n> {\n /** Toolbar content for the list (root) view. */\n list?: SplitViewCompactViewToolbars;\n /** Toolbar content for the pushed detail view. */\n detail?: SplitViewCompactViewToolbars;\n}\n\nexport interface SplitViewProps {\n id: string;\n label: string;\n /** The list (primary) pane. */\n list: KerfUiContent;\n /** The detail (secondary) pane. */\n detail: KerfUiContent;\n /**\n * Compact (\"one pane at a time\") classes — a handset or portrait tablet.\n * Derive from `deviceClass().value.compact`. When true the split collapses to\n * a `NavStack`: the list is the root and the detail is pushed over it.\n */\n compact?: boolean;\n /** In compact mode, whether the detail is currently pushed over the list. */\n detailActive?: boolean;\n /** Title/label for the list (compact NavStack root + region label). */\n listTitle?: string;\n /** Title/label for the detail (compact NavStack pushed view + region label). */\n detailTitle?: string;\n /** Back label for the compact NavStack (default \"Back\"). */\n backLabel?: string;\n /** Compact NavStack configuration and per-view toolbars. */\n compactStack?: SplitViewCompactStack;\n /** A resizable separator on roomy classes (min/max px). Omit for a fixed split. */\n resizable?: SplitViewResizable;\n className?: string;\n /** Native named-slot assignment when composed inside a web component. */\n slot?: string;\n}\n\n/**\n * A list-detail split. On roomy classes it shows both panes side\n * by side with an optional resizable separator; on compact classes it collapses\n * to a `NavStack` (list → detail). See `docs/23-app-layouts.md` §3.2. Compose the\n * resizable wiring with `wireResizableRegions` and the compact back with\n * `wireNavStack`.\n */\nexport function SplitView({\n id,\n label,\n list,\n detail,\n compact = false,\n detailActive = false,\n listTitle = '',\n detailTitle = '',\n backLabel = 'Back',\n compactStack = {},\n resizable,\n className = '',\n slot,\n}: SplitViewProps) {\n if (compact) {\n const listView: NavStackView = {\n ...compactStack.list,\n key: 'list',\n title: listTitle,\n content: list,\n };\n const views: NavStackView[] = detailActive\n ? [\n listView,\n {\n ...compactStack.detail,\n key: 'detail',\n title: detailTitle,\n content: detail,\n },\n ]\n : [listView];\n return (\n <div\n class={`kui-split-view kui-split-view--compact ${className}`.trim()}\n id={id}\n data-component=\"split-view\"\n data-split-mode=\"compact\"\n slot={slot}\n >\n <NavStack\n id={`${id}-stack`}\n label={label}\n views={views}\n backLabel={backLabel}\n backIcon={compactStack.backIcon}\n backText={compactStack.backText}\n toolbarConfig={compactStack.toolbarConfig}\n hideToolbar={compactStack.hideToolbar}\n bottomToolbar={compactStack.bottomToolbar}\n chromeDividers={compactStack.chromeDividers}\n />\n </div>\n );\n }\n const listPane = resizable ? (\n <ResizableRegion\n id={`${id}-list`}\n label={listTitle || 'List'}\n size={resizable.size}\n min={resizable.min}\n max={resizable.max}\n separator={resizable.separator}\n handleIcon={resizable.handleIcon}\n contentOverflow={resizable.contentOverflow}\n collapsed={resizable.collapsed}\n transitioning={resizable.transitioning}\n collapseMotion={resizable.collapseMotion}\n restoreControl={resizable.restoreControl}\n restorePosition={resizable.restorePosition}\n >\n <div\n class=\"kui-split-view__list kui-pane\"\n data-split-list\n data-resizable=\"true\"\n >\n {list}\n </div>\n </ResizableRegion>\n ) : (\n <div\n class=\"kui-split-view__list kui-pane\"\n data-split-list\n data-resizable=\"false\"\n >\n {list}\n </div>\n );\n return (\n <div\n class={`kui-split-view ${className}`.trim()}\n id={id}\n data-component=\"split-view\"\n data-split-mode=\"split\"\n aria-label={label}\n slot={slot}\n >\n {listPane}\n <div\n class=\"kui-split-view__detail kui-pane\"\n data-split-detail\n aria-label={detailTitle || undefined}\n >\n {detail}\n </div>\n </div>\n );\n}\n"]}
@@ -82,6 +82,20 @@
82
82
  pointer-events: none;
83
83
  }
84
84
 
85
+ .kui-chip[data-truncate] {
86
+ max-width: 100%;
87
+ overflow: hidden;
88
+ }
89
+
90
+ .kui-chip__icon {
91
+ display: inline-grid;
92
+ width: 1em;
93
+ height: 1em;
94
+ color: inherit;
95
+ place-items: center;
96
+ flex: none;
97
+ }
98
+
85
99
  .kui-chip__label {
86
100
  min-width: 0;
87
101
  overflow: hidden;
@@ -28,3 +28,39 @@
28
28
  .kui-content-item--framed {
29
29
  --kui-content-item-border: var(--kui-color-neutral-border-normal);
30
30
  }
31
+
32
+ .kui-content-item[data-interactive="true"] {
33
+ color: var(--kui-color-neutral-on-normal);
34
+ cursor: pointer;
35
+ }
36
+
37
+ .kui-content-item[data-interactive="true"]:hover:not(
38
+ [data-disabled="true"],
39
+ [data-selected="true"]
40
+ ),
41
+ .kui-content-item[data-interactive="true"][data-kui-pressed="true"]:not(
42
+ [data-selected="true"]
43
+ ) {
44
+ --kui-content-item-border: var(--kui-color-neutral-border-normal);
45
+ --kui-content-item-background: var(--kui-color-neutral-fill-quiet);
46
+ }
47
+
48
+ .kui-content-item[data-interactive="true"]:active:not([data-disabled="true"]) {
49
+ --kui-content-item-background: var(--kui-color-neutral-fill-normal);
50
+ }
51
+
52
+ .kui-content-item[data-interactive="true"][data-selected="true"] {
53
+ --kui-content-item-border: var(--kui-color-brand-border-quiet);
54
+ --kui-content-item-background: var(--kui-color-brand-fill-normal);
55
+ }
56
+
57
+ .kui-content-item[data-interactive="true"]:focus-visible {
58
+ outline: var(--kui-focus-ring);
59
+ outline-offset: 1px;
60
+ }
61
+
62
+ .kui-content-item[data-interactive="true"][data-disabled="true"] {
63
+ color: var(--kui-color-neutral-on-quiet);
64
+ opacity: 0.58;
65
+ cursor: not-allowed;
66
+ }
@@ -1,5 +1,4 @@
1
1
  .kui-list-action-row {
2
- --kui-list-group-divider-color: var(--kui-color-neutral-border-quiet);
3
2
  --kui-list-action-row-color: var(--kui-color-neutral-on-normal);
4
3
  --kui-list-action-row-border: transparent;
5
4
  --kui-list-action-row-background: transparent;
@@ -33,14 +32,16 @@
33
32
 
34
33
  .kui-list-action-row[data-divider="before"],
35
34
  .kui-list-action-row[data-divider="both"] {
36
- border-block-start: 1px solid var(--kui-list-group-divider-color);
35
+ border-block-start: 1px solid
36
+ var(--kui-list-group-divider-color, var(--kui-color-neutral-border-quiet));
37
37
  border-start-start-radius: 0;
38
38
  border-start-end-radius: 0;
39
39
  }
40
40
 
41
41
  .kui-list-action-row[data-divider="after"],
42
42
  .kui-list-action-row[data-divider="both"] {
43
- border-block-end: 1px solid var(--kui-list-group-divider-color);
43
+ border-block-end: 1px solid
44
+ var(--kui-list-group-divider-color, var(--kui-color-neutral-border-quiet));
44
45
  border-end-start-radius: 0;
45
46
  border-end-end-radius: 0;
46
47
  }
@@ -1,5 +1,4 @@
1
1
  .kui-list-header {
2
- --kui-list-group-divider-color: var(--kui-color-neutral-border-quiet);
3
2
  --kui-list-header-color: var(--kui-color-neutral-on-quiet);
4
3
  --kui-list-header-hover-background: var(--kui-color-neutral-border-quiet);
5
4
  --_kui-list-header-action-icon-size: var(
@@ -32,12 +31,14 @@
32
31
 
33
32
  .kui-list-header[data-divider="before"],
34
33
  .kui-list-header[data-divider="both"] {
35
- border-block-start: 1px solid var(--kui-list-group-divider-color);
34
+ border-block-start: 1px solid
35
+ var(--kui-list-group-divider-color, var(--kui-color-neutral-border-quiet));
36
36
  }
37
37
 
38
38
  .kui-list-header[data-divider="after"],
39
39
  .kui-list-header[data-divider="both"] {
40
- border-block-end: 1px solid var(--kui-list-group-divider-color);
40
+ border-block-end: 1px solid
41
+ var(--kui-list-group-divider-color, var(--kui-color-neutral-border-quiet));
41
42
  }
42
43
 
43
44
  .kui-list-header[data-inline="true"] {
@@ -1,9 +1,4 @@
1
1
  .kui-list-item {
2
- --kui-list-group-divider-color: var(--kui-color-neutral-border-quiet);
3
- --kui-list-item-color: var(--kui-color-neutral-on-normal);
4
- --kui-list-item-hover-background: var(--kui-color-neutral-fill-quiet);
5
- --kui-list-item-selected-color: var(--kui-color-neutral-on-normal);
6
- --kui-list-item-selected-background: var(--kui-color-brand-fill-normal);
7
2
  display: grid;
8
3
  width: calc(100% - (2 * var(--kui-layout-inline-margin, 0.5rem)));
9
4
  min-height: var(--kui-list-item-min-height, 2.75rem);
@@ -24,7 +19,7 @@
24
19
  --kui-list-item-radius,
25
20
  var(--kui-layout-rounded-radius, calc(1px + 0.6875rem))
26
21
  );
27
- color: var(--kui-list-item-color);
22
+ color: var(--kui-list-item-color, var(--kui-color-neutral-on-normal));
28
23
  background: var(--kui-list-item-background, transparent);
29
24
  cursor: pointer;
30
25
  grid-template-columns: var(--kui-list-item-columns, minmax(0, 1fr) auto);
@@ -55,14 +50,20 @@
55
50
 
56
51
  .kui-list-item[data-divider="before"],
57
52
  .kui-list-item[data-divider="both"] {
58
- border-block-start-color: var(--kui-list-group-divider-color);
53
+ border-block-start-color: var(
54
+ --kui-list-group-divider-color,
55
+ var(--kui-color-neutral-border-quiet)
56
+ );
59
57
  border-start-start-radius: 0;
60
58
  border-start-end-radius: 0;
61
59
  }
62
60
 
63
61
  .kui-list-item[data-divider="after"],
64
62
  .kui-list-item[data-divider="both"] {
65
- border-block-end-color: var(--kui-list-group-divider-color);
63
+ border-block-end-color: var(
64
+ --kui-list-group-divider-color,
65
+ var(--kui-color-neutral-border-quiet)
66
+ );
66
67
  border-end-start-radius: 0;
67
68
  border-end-end-radius: 0;
68
69
  }
@@ -99,7 +100,10 @@
99
100
  --kui-list-item-hover-border,
100
101
  var(--kui-color-neutral-border-normal)
101
102
  );
102
- background: var(--kui-list-item-hover-background);
103
+ background: var(
104
+ --kui-list-item-hover-background,
105
+ var(--kui-color-neutral-fill-quiet)
106
+ );
103
107
  }
104
108
 
105
109
  /* A placeholder is disabled to stay inert, but it is loading, not unavailable:
@@ -124,8 +128,14 @@
124
128
  --kui-list-item-selected-border,
125
129
  var(--kui-color-brand-border-quiet)
126
130
  );
127
- color: var(--kui-list-item-selected-color);
128
- background: var(--kui-list-item-selected-background);
131
+ color: var(
132
+ --kui-list-item-selected-color,
133
+ var(--kui-color-neutral-on-normal)
134
+ );
135
+ background: var(
136
+ --kui-list-item-selected-background,
137
+ var(--kui-color-brand-fill-normal)
138
+ );
129
139
  font-weight: 650;
130
140
  }
131
141
 
@@ -4,3 +4,8 @@
4
4
  height: 1em;
5
5
  flex: none;
6
6
  }
7
+
8
+ [data-lucide][data-size] {
9
+ width: var(--_kui-lucide-size);
10
+ height: var(--_kui-lucide-size);
11
+ }
@@ -176,9 +176,10 @@
176
176
 
177
177
  /* Chrome dividers: one line under the header and one over the footer, where
178
178
  the pinned chrome meets the scrolling content, whatever the chrome holds.
179
- `chromeDividers="scroll"` (the default, no attribute) draws each only while
179
+ `chromeDividers="scroll"` (the plain-pane default, no attribute) draws each only while
180
180
  `wireScrollDividers` reports content scrolled away beneath it through
181
- `data-scroll-divider` on the slot; `always` draws both; `none` neither. The
181
+ `data-scroll-divider` on the slot; a sunken pane defaults to `always`, which
182
+ draws both; `none` draws neither. The
182
183
  line is an inset shadow inside the slot, so showing or hiding it never
183
184
  moves the chrome or the content. */
184
185
  .kui-pane > :is(.kui-pane__header, .kui-pane__toolbar, .kui-pane__footer) {
@@ -11,10 +11,9 @@
11
11
  clip-path: inset(50%);
12
12
  }
13
13
 
14
- /* A PopupMenu draws exactly the Select's popup: the same caret motion, surface
15
- inset, row geometry, reserved check column, current-row fill, and group
16
- titles, all read from the private popup-choice contract in foundation.css
17
- (select.css reads the same values). */
14
+ /* PopupMenu shares the Select's caret motion, surface inset, row rhythm,
15
+ current-row fill, and group titles from the popup-choice contract in
16
+ foundation.css. Only checkbox items reserve a check column. */
18
17
 
19
18
  /* The trigger caret turns to face the open menu, like the Select's. */
20
19
  .kui-popup-menu > wa-button::part(caret) {
@@ -34,14 +33,20 @@
34
33
  }
35
34
 
36
35
  .kui-popup-menu wa-dropdown-item {
37
- /* Leading inset plus the Select's check column, so item icons and labels
38
- start where a Select option's do. */
36
+ /* A plain command starts at the checkbox glyph's leading edge. The glyph
37
+ sits half a smaller-font em beyond the row's base inset; its label starts
38
+ after the full check column below. */
39
39
  padding: var(--_kui-popup-row-padding-block)
40
40
  var(--_kui-popup-row-padding-inline-end) var(--_kui-popup-row-padding-block)
41
- calc(
42
- var(--_kui-popup-row-padding-inline-start) +
43
- var(--_kui-popup-row-check-width)
44
- );
41
+ calc(var(--_kui-popup-row-padding-inline-start) + 0.4375em);
42
+ }
43
+ .kui-popup-menu wa-dropdown-item[type="checkbox"] {
44
+ /* Web Awesome marks every sibling checkbox-adjacent; reserve this column
45
+ only on items whose checked state was explicitly supplied. */
46
+ padding-inline-start: calc(
47
+ var(--_kui-popup-row-padding-inline-start) +
48
+ var(--_kui-popup-row-check-width)
49
+ );
45
50
  }
46
51
  .kui-popup-menu wa-dropdown-item::part(label) {
47
52
  padding-block: var(--_kui-popup-row-label-padding-block);
@@ -222,6 +222,17 @@
222
222
  min-width: 0;
223
223
  flex: 1 1 auto;
224
224
  }
225
+ /* A label can use the free start-slot width to truncate, but a caret-free
226
+ icon must keep its intrinsic width so the combobox can center the glyph. */
227
+ .kui-select--custom-selected[data-selected-presentation="icon-only"][data-caret="false"]::part(
228
+ start
229
+ ) {
230
+ flex: 0 0 auto;
231
+ }
232
+ .kui-select--custom-selected[data-selected-presentation="icon-only"][data-caret="false"]
233
+ .kui-select__custom-selected {
234
+ margin-inline-end: 0 !important;
235
+ }
225
236
  .kui-select--custom-selected::part(display-input) {
226
237
  position: absolute;
227
238
  width: 1px;
@@ -1,9 +1,12 @@
1
1
  .kui-sunken-panel {
2
+ /* Reset the private value on each panel so nested panels do not inherit it. */
3
+ --_kui-sunken-panel-flex: 0 1 auto;
2
4
  display: flex;
3
5
  min-width: 0;
4
6
  min-height: 0;
5
7
  padding: var(--kui-sunken-panel-padding, 0.5rem);
6
8
  box-sizing: border-box;
9
+ flex: var(--_kui-sunken-panel-flex, initial);
7
10
  border-radius: var(
8
11
  --kui-sunken-panel-radius,
9
12
  var(--kui-layout-rounded-radius, calc(1px + 0.6875rem))
@@ -17,6 +20,10 @@
17
20
  gap: var(--kui-sunken-panel-gap, 0.5rem);
18
21
  }
19
22
 
23
+ .kui-sunken-panel[data-fill="true"] {
24
+ height: 100%;
25
+ }
26
+
20
27
  .kui-sunken-panel[data-shape="square"] {
21
28
  border-radius: 0;
22
29
  }
@@ -3,6 +3,35 @@
3
3
  box-sizing: border-box;
4
4
  border: 1px solid transparent;
5
5
  margin: 0;
6
+ white-space: normal;
7
+ overflow-wrap: normal;
8
+ }
9
+
10
+ .kui-text[data-wrap="anywhere"] {
11
+ overflow-wrap: anywhere;
12
+ }
13
+
14
+ .kui-text[data-wrap="nowrap"] {
15
+ white-space: nowrap;
16
+ }
17
+
18
+ .kui-text[data-wrap="truncate"] {
19
+ min-width: 0;
20
+ overflow: hidden;
21
+ text-overflow: ellipsis;
22
+ white-space: nowrap;
23
+ }
24
+
25
+ span.kui-text[data-wrap="truncate"] {
26
+ display: inline-block;
27
+ max-width: 100%;
28
+ }
29
+
30
+ .kui-text__clamp {
31
+ display: -webkit-box;
32
+ overflow: hidden;
33
+ -webkit-box-orient: vertical;
34
+ -webkit-line-clamp: var(--_kui-text-max-lines);
6
35
  }
7
36
 
8
37
  .kui-text[data-tone="quiet"] {
@@ -6,6 +6,7 @@
6
6
  --kui-token-search-line-size: 2.125rem;
7
7
 
8
8
  display: grid;
9
+ position: relative;
9
10
  width: 100%;
10
11
  min-width: 0;
11
12
  min-height: 2.75rem;
@@ -139,6 +140,7 @@
139
140
 
140
141
  .kui-token-search__clear {
141
142
  grid-column: 3;
143
+ border-radius: var(--kui-radius-pill);
142
144
  }
143
145
 
144
146
  .kui-token-search__trailing {
@@ -147,13 +149,24 @@
147
149
 
148
150
  .kui-token-search__suggestions {
149
151
  display: grid;
150
- grid-column: 2 / -1;
151
- min-width: 0;
152
- padding: 0.25rem;
153
- border: 1px solid var(--kui-token-search-border);
152
+ position: absolute;
153
+ z-index: 20;
154
+ inset-block-start: calc(100% + 0.25rem);
155
+ inset-inline-start: 0;
156
+ width: min(max(100%, 15rem), calc(100vw - 1rem));
157
+ max-height: 15rem;
158
+ padding: var(--_kui-popup-inset);
159
+ box-sizing: border-box;
160
+ border: 1px solid var(--kui-color-neutral-border-normal);
154
161
  border-radius: var(--kui-radius-pill);
155
- background: var(--kui-token-search-background);
156
- gap: 0.125rem;
162
+ background: var(--kui-color-surface-raised);
163
+ box-shadow: var(--kui-shadow-m);
164
+ gap: var(--_kui-popup-row-gap);
165
+ overflow-y: auto;
166
+ }
167
+
168
+ .kui-token-search__suggestions:has(> :nth-child(2)) {
169
+ border-radius: var(--kui-layout-rounded-radius, calc(1px + 0.6875rem));
157
170
  }
158
171
 
159
172
  .kui-token-search__suggestion {
@@ -200,6 +213,12 @@
200
213
  border-color 0.2s ease;
201
214
  }
202
215
 
216
+ .kui-token-search[data-collapsible="true"][data-expanded="true"]:has(
217
+ .kui-token-search__suggestions
218
+ ) {
219
+ overflow: visible;
220
+ }
221
+
203
222
  .kui-token-search[data-collapsible="true"][data-expanded="false"] {
204
223
  width: 2.75rem;
205
224
  min-width: 2.75rem;
@@ -256,6 +275,10 @@
256
275
  box-shadow: none;
257
276
  }
258
277
 
278
+ .kui-token-search[data-presentation="toolbar-group"] .kui-token-search__clear {
279
+ border-radius: var(--kui-control-highlight-radius);
280
+ }
281
+
259
282
  .kui-token-search[data-presentation="toolbar-group"][data-collapsible="true"]:focus-within {
260
283
  border-color: var(--kui-color-focus);
261
284
  background: var(--kui-token-search-background);
@@ -33,6 +33,7 @@
33
33
  --_kui-toolbar-control-group-slot-overlap: 0px;
34
34
  --_kui-toolbar-control-group-slot-radius: var(--kui-toolbar-item-radius);
35
35
  display: inline-flex;
36
+ position: relative;
36
37
  height: var(--kui-toolbar-group-size, calc(2px + 2.625rem));
37
38
  min-width: var(--kui-toolbar-group-size, calc(2px + 2.625rem));
38
39
  padding: 1px;
@@ -46,6 +47,34 @@
46
47
  gap: 0;
47
48
  }
48
49
 
50
+ .kui-toolbar-control-group[data-busy="true"] > svg,
51
+ .kui-toolbar-control-group[data-busy="true"]
52
+ > :not(.kui-toolbar-control-group__busy-spinner)
53
+ svg {
54
+ visibility: hidden;
55
+ }
56
+
57
+ .kui-toolbar-control-group__busy-spinner {
58
+ position: absolute;
59
+ inset-block-start: 50%;
60
+ inset-inline-start: 50%;
61
+ display: grid;
62
+ width: 1rem;
63
+ height: 1rem;
64
+ transform: translate(-50%, -50%);
65
+ place-items: center;
66
+ pointer-events: none;
67
+ }
68
+
69
+ .kui-toolbar-control-group__busy-status {
70
+ position: absolute;
71
+ width: 1px;
72
+ height: 1px;
73
+ overflow: hidden;
74
+ clip-path: inset(50%);
75
+ white-space: nowrap;
76
+ }
77
+
49
78
  /* In a Toolbar zone, a group shorter than the toolbar's control band (the
50
79
  `--_kui-toolbar-band` the Toolbar provides) takes half the difference as a
51
80
  top margin, so it centers in the band by its own size. */
@@ -126,6 +155,12 @@
126
155
  background-color 0.2s ease,
127
156
  border-color 0.2s ease;
128
157
  }
158
+
159
+ .kui-toolbar-control-group[data-content="search"]:has(
160
+ .kui-token-search__suggestions
161
+ ) {
162
+ overflow: visible;
163
+ }
129
164
  .kui-toolbar-control-group[data-content="search"][data-expanded="false"] {
130
165
  width: var(--kui-toolbar-group-size, calc(2px + 2.625rem));
131
166
  flex: 0 0 auto;