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

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 (169) hide show
  1. package/README.md +4 -0
  2. package/ai/component-catalog-extension.schema.json +13 -0
  3. package/ai/component-catalog.json +13 -2
  4. package/ai/component-composition.json +15 -2
  5. package/ai/components/list-item.md +1 -1
  6. package/ai/components/workbench.md +4 -2
  7. package/ai/public-api-signatures-v1.md +151 -44
  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 +2 -2
  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-UCKKT6KO.js → chunk-2EKHENQK.js} +7 -1
  27. package/dist/chunk-2EKHENQK.js.map +1 -0
  28. package/dist/{chunk-OD2VXAPL.js → chunk-3BYFWTP3.js} +4 -3
  29. package/dist/chunk-3BYFWTP3.js.map +1 -0
  30. package/dist/{chunk-5Q3N6EV7.js → chunk-5IJ6UGNZ.js} +3 -3
  31. package/dist/{chunk-5Q3N6EV7.js.map → chunk-5IJ6UGNZ.js.map} +1 -1
  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-VCBTX62E.js → chunk-J3KGJ6P6.js} +2 -2
  47. package/dist/chunk-J3KGJ6P6.js.map +1 -0
  48. package/dist/{chunk-X6ADHJNI.js → chunk-KFYANKJI.js} +25 -6
  49. package/dist/chunk-KFYANKJI.js.map +1 -0
  50. package/dist/{chunk-A3CKOW2R.js → chunk-M5H2RMCH.js} +165 -26
  51. package/dist/chunk-M5H2RMCH.js.map +1 -0
  52. package/dist/chunk-MOSIE4Z2.js +51 -0
  53. package/dist/chunk-MOSIE4Z2.js.map +1 -0
  54. package/dist/{chunk-RRB26JRJ.js → chunk-NSVLUDUW.js} +19 -4
  55. package/dist/chunk-NSVLUDUW.js.map +1 -0
  56. package/dist/{chunk-7JUBXOIV.js → chunk-NXWE5S57.js} +25 -6
  57. package/dist/chunk-NXWE5S57.js.map +1 -0
  58. package/dist/chunk-RGS4WX2M.js +44 -0
  59. package/dist/chunk-RGS4WX2M.js.map +1 -0
  60. package/dist/chunk-SH6F3CCG.js +80 -0
  61. package/dist/chunk-SH6F3CCG.js.map +1 -0
  62. package/dist/{chunk-EAC4CDY7.js → chunk-SMZGAPCU.js} +15 -2
  63. package/dist/chunk-SMZGAPCU.js.map +1 -0
  64. package/dist/{chunk-NNMLEDMD.js → chunk-TJK44RQC.js} +64 -11
  65. package/dist/chunk-TJK44RQC.js.map +1 -0
  66. package/dist/{chunk-6ZXOQEAN.js → chunk-WF75U3V4.js} +7 -1
  67. package/dist/chunk-WF75U3V4.js.map +1 -0
  68. package/dist/collapsible-panel.d.ts +18 -7
  69. package/dist/collapsible-panel.js +19 -3
  70. package/dist/collapsible-panel.js.map +1 -1
  71. package/dist/content-item.d.ts +40 -5
  72. package/dist/content-item.js +1 -1
  73. package/dist/disclosure-arrow.js +2 -1
  74. package/dist/grid.d.ts +5 -1
  75. package/dist/grid.js +1 -1
  76. package/dist/index.d.ts +3 -3
  77. package/dist/index.js +20 -20
  78. package/dist/list-action-row.js +1 -1
  79. package/dist/list-header.js +1 -1
  80. package/dist/list-item.js +1 -1
  81. package/dist/lucide-icon.d.ts +5 -2
  82. package/dist/lucide-icon.js +2 -1
  83. package/dist/nav-stack.js +2 -1
  84. package/dist/pane.d.ts +2 -1
  85. package/dist/pane.js +1 -1
  86. package/dist/{panel-toolbar-DqwtBxQL.d.ts → panel-toolbar-DDKh4uKd.d.ts} +11 -2
  87. package/dist/popup-menu-register.js +216 -3
  88. package/dist/popup-menu-register.js.map +1 -1
  89. package/dist/popup-menu.d.ts +4 -3
  90. package/dist/popup-menu.js +1 -1
  91. package/dist/select.js +1 -1
  92. package/dist/split-view.js +2 -1
  93. package/dist/split-view.js.map +1 -1
  94. package/dist/styles/catalog/components/catalog-example.css +4 -0
  95. package/dist/styles/chip.css +14 -0
  96. package/dist/styles/content-item.css +45 -0
  97. package/dist/styles/grid.css +7 -0
  98. package/dist/styles/list-action-row.css +4 -3
  99. package/dist/styles/list-header.css +4 -3
  100. package/dist/styles/list-item.css +21 -11
  101. package/dist/styles/lucide-icon.css +5 -0
  102. package/dist/styles/pane.css +3 -2
  103. package/dist/styles/popup-menu.css +24 -10
  104. package/dist/styles/segmented-control.css +3 -0
  105. package/dist/styles/select.css +11 -0
  106. package/dist/styles/sunken-panel.css +7 -0
  107. package/dist/styles/text.css +29 -0
  108. package/dist/styles/token-search-field.css +51 -11
  109. package/dist/styles/toolbar-control-group.css +49 -0
  110. package/dist/styles/workbench.css +130 -2
  111. package/dist/sunken-panel.d.ts +6 -1
  112. package/dist/sunken-panel.js +1 -1
  113. package/dist/text.d.ts +14 -3
  114. package/dist/text.js +1 -1
  115. package/dist/{token-search-field-DvgFLhLL.d.ts → token-search-field-Xk8jiw8Y.d.ts} +18 -4
  116. package/dist/token-search-field.d.ts +1 -1
  117. package/dist/token-search-field.js +2 -1
  118. package/dist/token-search-model.d.ts +1 -1
  119. package/dist/toolbar-control-group.d.ts +5 -1
  120. package/dist/toolbar-control-group.js +2 -1
  121. package/dist/toolbar.d.ts +5 -2
  122. package/dist/toolbar.js +1 -1
  123. package/dist/wire-catalog.js +1 -1
  124. package/dist/wire-content-items.d.ts +9 -0
  125. package/dist/wire-content-items.js +66 -0
  126. package/dist/wire-content-items.js.map +1 -0
  127. package/dist/wire-token-search-fields.d.ts +1 -1
  128. package/dist/wire-token-search-fields.js +2 -1
  129. package/dist/wire-workbench.d.ts +7 -0
  130. package/dist/wire-workbench.js +1 -1
  131. package/dist/workbench.d.ts +24 -8
  132. package/dist/workbench.js +2 -1
  133. package/docs/accessibility.md +30 -6
  134. package/docs/catalog.md +42 -2
  135. package/docs/collapsible-panel.md +8 -1
  136. package/docs/component-contract.md +43 -5
  137. package/docs/component-selection.md +46 -8
  138. package/docs/design/templates/toolbar/title-and-actions-dark.svg +1 -1
  139. package/docs/design/templates/toolbar/title-and-actions.svg +1 -1
  140. package/docs/design/templates/toolbar-dark.svg +1 -1
  141. package/docs/design/templates/toolbar.svg +1 -1
  142. package/docs/examples/component-catalog-extension.json +6 -0
  143. package/docs/layout.md +56 -9
  144. package/docs/sunken-panel.md +22 -0
  145. package/docs/surface-scaffold.md +6 -3
  146. package/docs/ui-analyzer.md +4 -0
  147. package/docs/ux-demo.md +1 -0
  148. package/docs/workbench.md +42 -4
  149. package/llms.txt +9 -5
  150. package/package.json +16 -2
  151. package/scripts/component-catalog-extension-validation.mjs +28 -0
  152. package/dist/chunk-4R777DUZ.js +0 -34
  153. package/dist/chunk-4R777DUZ.js.map +0 -1
  154. package/dist/chunk-6ZXOQEAN.js.map +0 -1
  155. package/dist/chunk-7JUBXOIV.js.map +0 -1
  156. package/dist/chunk-A3CKOW2R.js.map +0 -1
  157. package/dist/chunk-AUKT3KMG.js.map +0 -1
  158. package/dist/chunk-EAC4CDY7.js.map +0 -1
  159. package/dist/chunk-ENGVYQPG.js.map +0 -1
  160. package/dist/chunk-MA73TA6D.js +0 -42
  161. package/dist/chunk-MA73TA6D.js.map +0 -1
  162. package/dist/chunk-N2DRU35S.js +0 -45
  163. package/dist/chunk-N2DRU35S.js.map +0 -1
  164. package/dist/chunk-NNMLEDMD.js.map +0 -1
  165. package/dist/chunk-OD2VXAPL.js.map +0 -1
  166. package/dist/chunk-RRB26JRJ.js.map +0 -1
  167. package/dist/chunk-UCKKT6KO.js.map +0 -1
  168. package/dist/chunk-VCBTX62E.js.map +0 -1
  169. package/dist/chunk-X6ADHJNI.js.map +0 -1
@@ -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,29 @@
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
+ );
50
+ }
51
+ /* Web Awesome's nested submenu owns its item host padding. Move its exposed
52
+ checkmark inside the panel and leave room for the label beside it. */
53
+ .kui-popup-menu
54
+ wa-dropdown-item[slot="submenu"][type="checkbox"]::part(checkmark) {
55
+ margin-inline-start: 0;
56
+ }
57
+ .kui-popup-menu wa-dropdown-item[slot="submenu"][type="checkbox"]::part(label) {
58
+ padding-inline-start: 1em;
45
59
  }
46
60
  .kui-popup-menu wa-dropdown-item::part(label) {
47
61
  padding-block: var(--_kui-popup-row-label-padding-block);
@@ -119,6 +119,9 @@
119
119
  line-height: 1;
120
120
  white-space: nowrap;
121
121
  cursor: pointer;
122
+ /* Web Awesome's native button transition includes color. During a theme
123
+ switch that briefly puts the old text tone on the new filled track. */
124
+ transition-property: background, border, box-shadow;
122
125
  }
123
126
 
124
127
  .kui-segmented-control[data-size="small"] .kui-segmented-control__item {
@@ -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;
@@ -84,7 +85,8 @@
84
85
  }
85
86
 
86
87
  .kui-token-search__token button,
87
- .kui-token-search__clear {
88
+ .kui-token-search__clear,
89
+ .kui-token-search__trailing-action {
88
90
  appearance: none;
89
91
  display: inline-grid;
90
92
  padding: 0;
@@ -109,12 +111,15 @@
109
111
  .kui-token-search__token-remove:hover,
110
112
  .kui-token-search__token-remove:focus-visible,
111
113
  .kui-token-search__clear:hover,
112
- .kui-token-search__clear:focus-visible {
114
+ .kui-token-search__clear:focus-visible,
115
+ .kui-token-search__trailing-action:hover,
116
+ .kui-token-search__trailing-action:focus-visible {
113
117
  background: color-mix(in srgb, currentColor 12%, transparent);
114
118
  }
115
119
 
116
120
  .kui-token-search__token button:focus-visible,
117
- .kui-token-search__clear:focus-visible {
121
+ .kui-token-search__clear:focus-visible,
122
+ .kui-token-search__trailing-action:focus-visible {
118
123
  outline: var(--kui-focus-ring);
119
124
  outline-offset: 1px;
120
125
  }
@@ -129,7 +134,8 @@
129
134
  }
130
135
 
131
136
  .kui-token-search__clear,
132
- .kui-token-search__trailing {
137
+ .kui-token-search__trailing,
138
+ .kui-token-search__trailing-action {
133
139
  display: inline-grid;
134
140
  width: 1.5rem;
135
141
  height: var(--kui-token-search-line-size);
@@ -139,21 +145,38 @@
139
145
 
140
146
  .kui-token-search__clear {
141
147
  grid-column: 3;
148
+ border-radius: var(--kui-radius-pill);
142
149
  }
143
150
 
144
151
  .kui-token-search__trailing {
145
152
  grid-column: 4;
146
153
  }
147
154
 
155
+ .kui-token-search__trailing-action {
156
+ grid-column: 4;
157
+ border-radius: var(--kui-radius-pill);
158
+ }
159
+
148
160
  .kui-token-search__suggestions {
149
161
  display: grid;
150
- grid-column: 2 / -1;
151
- min-width: 0;
152
- padding: 0.25rem;
153
- border: 1px solid var(--kui-token-search-border);
162
+ position: absolute;
163
+ z-index: 20;
164
+ inset-block-start: calc(100% + 0.25rem);
165
+ inset-inline-start: 0;
166
+ width: min(max(100%, 15rem), calc(100vw - 1rem));
167
+ max-height: 15rem;
168
+ padding: var(--_kui-popup-inset);
169
+ box-sizing: border-box;
170
+ border: 1px solid var(--kui-color-neutral-border-normal);
154
171
  border-radius: var(--kui-radius-pill);
155
- background: var(--kui-token-search-background);
156
- gap: 0.125rem;
172
+ background: var(--kui-color-surface-raised);
173
+ box-shadow: var(--kui-shadow-m);
174
+ gap: var(--_kui-popup-row-gap);
175
+ overflow-y: auto;
176
+ }
177
+
178
+ .kui-token-search__suggestions:has(> :nth-child(2)) {
179
+ border-radius: var(--kui-layout-rounded-radius, calc(1px + 0.6875rem));
157
180
  }
158
181
 
159
182
  .kui-token-search__suggestion {
@@ -165,6 +188,7 @@
165
188
  background: transparent;
166
189
  font: inherit;
167
190
  text-align: start;
191
+ justify-content: flex-start;
168
192
  cursor: pointer;
169
193
  }
170
194
 
@@ -179,7 +203,8 @@
179
203
  }
180
204
 
181
205
  .kui-token-search__clear svg,
182
- .kui-token-search__trailing svg {
206
+ .kui-token-search__trailing svg,
207
+ .kui-token-search__trailing-action svg {
183
208
  width: 0.85rem;
184
209
  height: 0.85rem;
185
210
  }
@@ -200,6 +225,17 @@
200
225
  border-color 0.2s ease;
201
226
  }
202
227
 
228
+ .kui-token-search[data-collapsible="true"][data-expanded="true"][data-fill="true"] {
229
+ width: 100%;
230
+ flex: 1 1 auto;
231
+ }
232
+
233
+ .kui-token-search[data-collapsible="true"][data-expanded="true"]:has(
234
+ .kui-token-search__suggestions
235
+ ) {
236
+ overflow: visible;
237
+ }
238
+
203
239
  .kui-token-search[data-collapsible="true"][data-expanded="false"] {
204
240
  width: 2.75rem;
205
241
  min-width: 2.75rem;
@@ -256,6 +292,10 @@
256
292
  box-shadow: none;
257
293
  }
258
294
 
295
+ .kui-token-search[data-presentation="toolbar-group"] .kui-token-search__clear {
296
+ border-radius: var(--kui-control-highlight-radius);
297
+ }
298
+
259
299
  .kui-token-search[data-presentation="toolbar-group"][data-collapsible="true"]:focus-within {
260
300
  border-color: var(--kui-color-focus);
261
301
  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,10 +155,30 @@
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[data-expanded="true"][data-fill="true"]
161
+ ) {
162
+ width: 100%;
163
+ flex: 1 1 auto;
164
+ }
165
+
166
+ .kui-toolbar-control-group[data-content="search"]:has(
167
+ .kui-token-search__suggestions
168
+ ) {
169
+ overflow: visible;
170
+ }
129
171
  .kui-toolbar-control-group[data-content="search"][data-expanded="false"] {
130
172
  width: var(--kui-toolbar-group-size, calc(2px + 2.625rem));
131
173
  flex: 0 0 auto;
132
174
  }
175
+
176
+ .kui-toolbar-control-group[data-content="search"]:has(
177
+ > .kui-token-search[data-expanded="false"][data-fill="true"]
178
+ ) {
179
+ width: var(--kui-toolbar-group-size, calc(2px + 2.625rem));
180
+ flex: 0 0 auto;
181
+ }
133
182
  .kui-toolbar-control-group[data-content="text"]
134
183
  > :is(button, wa-button, .kui-toolbar-action-link),
135
184
  .kui-toolbar-control-group[data-content="mixed"]
@@ -568,6 +568,25 @@
568
568
  inset-block-end: 0;
569
569
  }
570
570
 
571
+ /* Optional shared backdrop sits over work-area controls and restores, below
572
+ the overlay drawer and rails. It is last in document order so an equal-z
573
+ restore control cannot receive the outside press. */
574
+ .kui-workbench__backdrop {
575
+ position: absolute;
576
+ z-index: calc(var(--kui-workbench-overlay-z, 41) - 2);
577
+ display: none;
578
+ inset: 0;
579
+ background: var(--kui-color-scrim, rgb(0 0 0 / 32%));
580
+ }
581
+
582
+ .kui-workbench[data-overlay-backdrop="true"]:is(
583
+ [data-rail-overlay-expanded="true"],
584
+ [data-drawer-overlay-expanded="true"]
585
+ )
586
+ > .kui-workbench__backdrop {
587
+ display: block;
588
+ }
589
+
571
590
  /* A collapsed overlay keeps its box for the slide-out, so it drops its surface
572
591
  and shadow; the sliding content carries the surface instead. */
573
592
  .kui-workbench__rail[data-presentation="overlay"][data-collapsed="true"],
@@ -609,7 +628,94 @@
609
628
  container: kui-workbench / inline-size;
610
629
  }
611
630
 
631
+ /* A numeric pixel threshold is measured by wireWorkbench and marked on the
632
+ panel. Keep its overlay geometry and covered work area in step with that
633
+ single mark, including when the app changes the threshold at render time. */
634
+ .kui-workbench__rail[data-responsive-overlay-active="true"] {
635
+ position: absolute;
636
+ z-index: var(--kui-workbench-overlay-z, 41);
637
+ width: var(--_kui-workbench-rail-extent);
638
+ max-width: var(--kui-workbench-overlay-max-width, 85vw);
639
+ inset-block: 0;
640
+ box-shadow: var(--kui-shadow-l);
641
+ clip-path: none;
642
+ }
643
+
644
+ .kui-workbench__rail--left[data-responsive-overlay-active="true"] {
645
+ inset-inline-start: 0;
646
+ }
647
+
648
+ .kui-workbench__rail--right[data-responsive-overlay-active="true"] {
649
+ inset-inline-end: 0;
650
+ }
651
+
652
+ .kui-workbench__rail[data-responsive-overlay-active="true"][data-collapsed="true"],
653
+ .kui-workbench__drawer[data-responsive-overlay-active="true"][data-collapsed="true"] {
654
+ background: transparent;
655
+ box-shadow: none;
656
+ pointer-events: none;
657
+ }
658
+
659
+ .kui-workbench__rail[data-responsive-overlay-active="true"]
660
+ > .kui-workbench__panel-content {
661
+ width: 100%;
662
+ background: var(--kui-color-surface);
663
+ }
664
+
665
+ .kui-workbench__rail[data-responsive-overlay-active="true"]
666
+ > .kui-workbench__handle,
667
+ .kui-workbench__drawer[data-responsive-overlay-active="true"]
668
+ > .kui-workbench__handle {
669
+ display: none;
670
+ }
671
+
672
+ .kui-workbench[data-numeric-overlays~="left"] > .kui-workbench__center {
673
+ --kui-edge-inset-inline-start: var(--_kui-workbench-safe-inline-start);
674
+ }
675
+
676
+ .kui-workbench[data-numeric-overlays~="right"] > .kui-workbench__center {
677
+ --kui-edge-inset-inline-end: var(--_kui-workbench-safe-inline-end);
678
+ }
679
+
680
+ .kui-workbench__drawer[data-responsive-overlay-active="true"] {
681
+ position: absolute;
682
+ anchor-name: none;
683
+ z-index: calc(var(--kui-workbench-overlay-z, 41) - 1);
684
+ height: var(--_kui-workbench-drawer-extent);
685
+ max-height: var(--kui-workbench-overlay-max-height, 85vh);
686
+ inset-inline: 0;
687
+ inset-block-end: 0;
688
+ box-shadow: var(--kui-shadow-l);
689
+ clip-path: none;
690
+ }
691
+
692
+ .kui-workbench__drawer[data-responsive-overlay-active="true"]
693
+ > .kui-workbench__panel-content {
694
+ height: 100%;
695
+ background: var(--kui-color-surface);
696
+ }
697
+
698
+ .kui-workbench[data-numeric-overlays~="drawer"]
699
+ > .kui-workbench__center
700
+ > .kui-workbench__main {
701
+ --_kui-workbench-content-edge-block-end: var(--_kui-workbench-safe-block-end);
702
+ }
703
+
704
+ .kui-workbench[data-overlay-backdrop="true"][data-numeric-overlays~="open"]
705
+ > .kui-workbench__backdrop {
706
+ display: block;
707
+ }
708
+
612
709
  @container kui-workbench (max-width: 44rem) {
710
+ .kui-workbench[data-overlay-backdrop="true"]:is(
711
+ [data-left-responsive-expanded="narrow"],
712
+ [data-right-responsive-expanded="narrow"],
713
+ [data-drawer-responsive-expanded="narrow"]
714
+ )
715
+ > .kui-workbench__backdrop {
716
+ display: block;
717
+ }
718
+
613
719
  .kui-workbench__rail[data-responsive-overlay-at="narrow"] {
614
720
  position: absolute;
615
721
  z-index: var(--kui-workbench-overlay-z, 41);
@@ -692,6 +798,15 @@
692
798
  }
693
799
 
694
800
  @container kui-workbench (max-width: 28rem) {
801
+ .kui-workbench[data-overlay-backdrop="true"]:is(
802
+ [data-left-responsive-expanded="compact"],
803
+ [data-right-responsive-expanded="compact"],
804
+ [data-drawer-responsive-expanded="compact"]
805
+ )
806
+ > .kui-workbench__backdrop {
807
+ display: block;
808
+ }
809
+
695
810
  .kui-workbench__rail[data-responsive-overlay-at="compact"] {
696
811
  position: absolute;
697
812
  z-index: var(--kui-workbench-overlay-z, 41);
@@ -895,6 +1010,11 @@
895
1010
  --_kui-workbench-covered: hidden;
896
1011
  }
897
1012
 
1013
+ .kui-workbench[data-numeric-overlays~="rail-open"]
1014
+ > :is(.kui-workbench__center, .kui-workbench__restore) {
1015
+ --_kui-workbench-covered: hidden;
1016
+ }
1017
+
898
1018
  @container kui-workbench (max-width: 44rem) {
899
1019
  .kui-workbench:is(
900
1020
  [data-left-responsive-expanded="narrow"],
@@ -926,14 +1046,22 @@
926
1046
  closes it (the wiring's outside press); `compactOverlay: "full"` fills the
927
1047
  Workbench. The rail's resize and configured size stop applying there. */
928
1048
  @container kui-workbench (max-width: 28rem) {
929
- .kui-workbench__rail[data-responsive-overlay-at] {
1049
+ .kui-workbench__rail:is(
1050
+ [data-responsive-overlay-at="narrow"],
1051
+ [data-responsive-overlay-at="compact"],
1052
+ [data-responsive-overlay-active="true"]
1053
+ ) {
930
1054
  width: calc(
931
1055
  100% - var(--kui-workbench-overlay-dismiss-margin, 2.75rem)
932
1056
  );
933
1057
  max-width: none;
934
1058
  }
935
1059
 
936
- .kui-workbench__rail[data-responsive-overlay-at][data-compact-overlay="full"] {
1060
+ .kui-workbench__rail:is(
1061
+ [data-responsive-overlay-at="narrow"],
1062
+ [data-responsive-overlay-at="compact"],
1063
+ [data-responsive-overlay-active="true"]
1064
+ )[data-compact-overlay="full"] {
937
1065
  width: 100%;
938
1066
  }
939
1067
  }
@@ -1,4 +1,5 @@
1
1
  import * as kerfjs from 'kerfjs';
2
+ import { CssFlexKeyword, CssFlex } from './css-values.js';
2
3
  import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
3
4
 
4
5
  type SunkenPanelShape = 'rounded' | 'square';
@@ -8,6 +9,10 @@ interface SunkenPanelProps {
8
9
  ariaLabel?: string;
9
10
  /** Corner shape: a rounded rectangle (default) or square corners. */
10
11
  shape?: SunkenPanelShape;
12
+ /** Grow or shrink within a flex parent, using Grid's typed flex contract. */
13
+ flex?: boolean | CssFlexKeyword | CssFlex;
14
+ /** Fill a parent with a definite height; use flex inside a flex layout. */
15
+ fill?: boolean;
11
16
  className?: string;
12
17
  /** Native named-slot assignment when composed inside a web component. */
13
18
  slot?: string;
@@ -17,6 +22,6 @@ interface SunkenPanelProps {
17
22
  * stack. The panel owns its background and padding; children own their own
18
23
  * borders and internal geometry.
19
24
  */
20
- declare function SunkenPanel({ children, ariaLabel, shape, className, slot, }: SunkenPanelProps): kerfjs.SafeHtml;
25
+ declare function SunkenPanel({ children, ariaLabel, shape, flex, fill, className, slot, }: SunkenPanelProps): kerfjs.SafeHtml;
21
26
 
22
27
  export { SunkenPanel, type SunkenPanelProps, type SunkenPanelShape };
@@ -1,3 +1,3 @@
1
- export { SunkenPanel } from './chunk-6ZXOQEAN.js';
1
+ export { SunkenPanel } from './chunk-WF75U3V4.js';
2
2
 
3
3
  //# sourceMappingURL=sunken-panel.js.map
package/dist/text.d.ts CHANGED
@@ -8,8 +8,9 @@ type TextSize = 'compact' | 'default' | 'large' | 'xlarge';
8
8
  type TextFont = 'default' | 'monospace';
9
9
  type TextBorder = 'transparent' | 'none';
10
10
  type TextLineHeight = 'default' | 'tight';
11
+ type TextWrap = 'normal' | 'anywhere' | 'nowrap' | 'truncate';
11
12
  type TextContent = KerfUiContent | string | number | readonly TextContent[];
12
- type TextProps = Omit<KerfBaseAttrs, 'children' | 'class' | 'className'> & {
13
+ type TextCommonProps = Omit<KerfBaseAttrs, 'children' | 'class' | 'className'> & {
13
14
  /** Native heading, paragraph, or inline span element to render. Defaults to `p`. */
14
15
  variant?: TextVariant;
15
16
  /** Semantic foreground treatment. Defaults to the inherited foreground. */
@@ -28,11 +29,21 @@ type TextProps = Omit<KerfBaseAttrs, 'children' | 'class' | 'className'> & {
28
29
  class?: string;
29
30
  className?: string;
30
31
  };
32
+ type TextProps = TextCommonProps & ({
33
+ /** Wrap normally or break long unbroken strings. Defaults to normal. */
34
+ wrap?: 'normal' | 'anywhere';
35
+ /** Cap wrapped text to this positive number of lines. */
36
+ maxLines?: number;
37
+ } | {
38
+ /** Keep one line, with or without an ellipsis. */
39
+ wrap: 'nowrap' | 'truncate';
40
+ maxLines?: never;
41
+ });
31
42
  /**
32
43
  * Semantic heading, paragraph, or inline text. Block variants use the standard
33
44
  * content-item padding; `span` adds no box geometry.
34
45
  * All ordinary native heading/paragraph attributes pass through to the element.
35
46
  */
36
- declare function Text({ variant: Variant, tone, size, font, border, flush, lineHeight, children, class: classValue, className, ...attributes }: TextProps): kerfjs.SafeHtml;
47
+ declare function Text({ variant: Variant, tone, size, font, border, flush, lineHeight, wrap, maxLines, children, class: classValue, className, ...attributes }: TextProps): kerfjs.SafeHtml;
37
48
 
38
- export { Text, type TextBorder, type TextContent, type TextFont, type TextLineHeight, type TextProps, type TextSize, type TextTone, type TextVariant };
49
+ export { Text, type TextBorder, type TextContent, type TextFont, type TextLineHeight, type TextProps, type TextSize, type TextTone, type TextVariant, type TextWrap };