@kerfjs/ui 5.0.0-beta.24 → 5.0.0-beta.26

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 (149) hide show
  1. package/README.md +44 -23
  2. package/ai/application-ui-diagnostic-ids-v1.json +3 -0
  3. package/ai/application-ui-profile.defaults.json +1 -1
  4. package/ai/compile-time-contracts-v1.json +3 -11
  5. package/ai/component-catalog-v2-overrides.json +7 -37
  6. package/ai/component-catalog-v2.d.ts +1 -0
  7. package/ai/component-catalog-v2.json +415 -91
  8. package/ai/component-catalog-v2.schema.json +2 -1
  9. package/ai/component-catalog.json +602 -158
  10. package/ai/public-api-signatures-v1.md +132 -65
  11. package/ai/skill.md +20 -20
  12. package/ai/webawesome-jsx-signatures-v1.md +2 -1
  13. package/analyzer/cli.mjs +5 -2
  14. package/analyzer/index.d.mts +1 -0
  15. package/analyzer/index.mjs +117 -10
  16. package/dist/app-tab.d.ts +10 -2
  17. package/dist/app-tab.js +1 -1
  18. package/dist/browser/list-action-row.js +1 -0
  19. package/dist/browser/list-item.js +1 -0
  20. package/dist/browser/surface-scaffold.js +3 -0
  21. package/dist/catalog.js +5 -4
  22. package/dist/catalog.js.map +1 -1
  23. package/dist/{chunk-FEAMR7S4.js → chunk-4EF2CMYS.js} +24 -5
  24. package/dist/chunk-4EF2CMYS.js.map +1 -0
  25. package/dist/{chunk-NWSEP5RT.js → chunk-FRVS5RFM.js} +23 -5
  26. package/dist/chunk-FRVS5RFM.js.map +1 -0
  27. package/dist/{chunk-PSKN344N.js → chunk-GWEAPEZI.js} +15 -2
  28. package/dist/chunk-GWEAPEZI.js.map +1 -0
  29. package/dist/chunk-HP2B2L26.js +102 -0
  30. package/dist/chunk-HP2B2L26.js.map +1 -0
  31. package/dist/{chunk-OJWWHFH3.js → chunk-JFGXQBIP.js} +49 -23
  32. package/dist/chunk-JFGXQBIP.js.map +1 -0
  33. package/dist/chunk-OBLTAKSX.js +43 -0
  34. package/dist/chunk-OBLTAKSX.js.map +1 -0
  35. package/dist/{chunk-Y45PPBDV.js → chunk-OT6RPYAP.js} +16 -2
  36. package/dist/chunk-OT6RPYAP.js.map +1 -0
  37. package/dist/{chunk-UFZKLBCF.js → chunk-VCE4MPVE.js} +25 -3
  38. package/dist/chunk-VCE4MPVE.js.map +1 -0
  39. package/dist/{chunk-5VTB2BKP.js → chunk-WNWD54GR.js} +16 -2
  40. package/dist/chunk-WNWD54GR.js.map +1 -0
  41. package/dist/{chunk-M7JBER5U.js → chunk-X2U3QJCJ.js} +8 -2
  42. package/dist/chunk-X2U3QJCJ.js.map +1 -0
  43. package/dist/{chunk-DPDBVKNA.js → chunk-YMKH5XTF.js} +5 -3
  44. package/dist/chunk-YMKH5XTF.js.map +1 -0
  45. package/dist/collapsible-panel.d.ts +9 -1
  46. package/dist/collapsible-panel.js +36 -15
  47. package/dist/collapsible-panel.js.map +1 -1
  48. package/dist/index.d.ts +2 -2
  49. package/dist/index.js +12 -12
  50. package/dist/list-action-row.d.ts +11 -1
  51. package/dist/list-action-row.js +2 -1
  52. package/dist/list-header.d.ts +15 -2
  53. package/dist/list-header.js +1 -1
  54. package/dist/list-item.d.ts +12 -1
  55. package/dist/list-item.js +2 -1
  56. package/dist/resizable-region.d.ts +19 -2
  57. package/dist/resizable-region.js +1 -1
  58. package/dist/select.d.ts +12 -1
  59. package/dist/select.js +1 -1
  60. package/dist/split-view.js +1 -1
  61. package/dist/styles/app-tab.css +26 -0
  62. package/dist/styles/collapsible-panel.css +66 -4
  63. package/dist/styles/list-action-row.css +64 -0
  64. package/dist/styles/list-header.css +32 -0
  65. package/dist/styles/list-item.css +39 -0
  66. package/dist/styles/resizable-region.css +132 -0
  67. package/dist/styles/select.css +68 -0
  68. package/dist/styles/styles.css +1 -1
  69. package/dist/styles/surface-scaffold.css +51 -0
  70. package/dist/styles/tab-bar.css +24 -0
  71. package/dist/styles/toolbar-control-group.css +73 -1
  72. package/dist/styles/toolbar-text.css +1 -1
  73. package/dist/styles/webawesome.css +12 -0
  74. package/dist/styles/workbench.css +89 -0
  75. package/dist/surface-scaffold.d.ts +25 -0
  76. package/dist/surface-scaffold.js +3 -0
  77. package/dist/surface-scaffold.js.map +1 -0
  78. package/dist/tab-bar.d.ts +11 -2
  79. package/dist/tab-bar.js +1 -1
  80. package/dist/toolbar-control-group.d.ts +16 -2
  81. package/dist/toolbar-control-group.js +1 -1
  82. package/dist/webawesome.d.ts +1 -0
  83. package/dist/wire-resizable-regions.js +1 -1
  84. package/dist/wire-sidebar.d.ts +6 -1
  85. package/dist/wire-sidebar.js +27 -8
  86. package/dist/wire-sidebar.js.map +1 -1
  87. package/dist/wire-token-search-fields.js +1 -1
  88. package/dist/workbench.d.ts +8 -0
  89. package/dist/workbench.js +42 -0
  90. package/dist/workbench.js.map +1 -1
  91. package/docs/accessibility.md +55 -12
  92. package/docs/collapsible-panel.md +7 -0
  93. package/docs/component-contract.md +5 -8
  94. package/docs/component-selection.md +63 -33
  95. package/docs/design/templates.md +5 -7
  96. package/docs/examples/component-catalog-extension-v2.json +3 -6
  97. package/docs/examples/component-catalog-extension.json +1 -1
  98. package/docs/layout.md +7 -9
  99. package/docs/recipes.md +8 -7
  100. package/docs/surface-scaffold.md +17 -0
  101. package/docs/type-contracts.md +6 -8
  102. package/docs/ui-analyzer.md +19 -1
  103. package/docs/ui-doctor.md +1 -1
  104. package/docs/ux-demo.md +6 -3
  105. package/docs/webawesome-theme.md +4 -1
  106. package/docs/workbench.md +49 -2
  107. package/doctor/eslint-diagnostics.d.mts +16 -0
  108. package/doctor/eslint-diagnostics.mjs +17 -0
  109. package/doctor/index.mjs +16 -1
  110. package/llms.txt +19 -9
  111. package/package.json +7 -7
  112. package/ux-demo/recipes/app-shell.tsx +36 -23
  113. package/ux-demo/recipes/collapsible-sidebar.tsx +22 -16
  114. package/ux-demo/recipes/composer-form.tsx +15 -6
  115. package/ux-demo/recipes/list-detail-dialog.tsx +31 -15
  116. package/ux-demo/recipes/list-workspace-states.tsx +16 -7
  117. package/ux-demo/recipes/loading-inspector.tsx +39 -18
  118. package/ux-demo/recipes/recipes.css +7 -2
  119. package/ux-demo/recipes/workspace-header.tsx +17 -7
  120. package/dist/browser/panel-header.js +0 -7
  121. package/dist/chunk-5VTB2BKP.js.map +0 -1
  122. package/dist/chunk-7XRDUG4Y.js +0 -58
  123. package/dist/chunk-7XRDUG4Y.js.map +0 -1
  124. package/dist/chunk-DPDBVKNA.js.map +0 -1
  125. package/dist/chunk-FEAMR7S4.js.map +0 -1
  126. package/dist/chunk-M7JBER5U.js.map +0 -1
  127. package/dist/chunk-NENBUYX5.js +0 -79
  128. package/dist/chunk-NENBUYX5.js.map +0 -1
  129. package/dist/chunk-NWSEP5RT.js.map +0 -1
  130. package/dist/chunk-OJWWHFH3.js.map +0 -1
  131. package/dist/chunk-PSKN344N.js.map +0 -1
  132. package/dist/chunk-UFZKLBCF.js.map +0 -1
  133. package/dist/chunk-Y45PPBDV.js.map +0 -1
  134. package/dist/panel-header.d.ts +0 -42
  135. package/dist/panel-header.js +0 -7
  136. package/dist/panel-header.js.map +0 -1
  137. package/dist/styles/panel-header.css +0 -64
  138. package/docs/design/templates/panel-header/icon-actions-dark.svg +0 -1
  139. package/docs/design/templates/panel-header/icon-actions.svg +0 -1
  140. package/docs/design/templates/panel-header/icon-summary-actions-dark.svg +0 -1
  141. package/docs/design/templates/panel-header/icon-summary-actions.svg +0 -1
  142. package/docs/design/templates/panel-header/no-icon-dark.svg +0 -1
  143. package/docs/design/templates/panel-header/no-icon.svg +0 -1
  144. package/docs/design/templates/panel-header/page-heading-dark.svg +0 -1
  145. package/docs/design/templates/panel-header/page-heading.svg +0 -1
  146. package/docs/design/templates/panel-header/title-only-dark.svg +0 -1
  147. package/docs/design/templates/panel-header/title-only.svg +0 -1
  148. package/docs/design/templates/panel-header-dark.svg +0 -1
  149. package/docs/design/templates/panel-header.svg +0 -1
package/dist/select.d.ts CHANGED
@@ -25,13 +25,24 @@ interface SelectBaseProps<Value extends string = string> {
25
25
  className?: string;
26
26
  /** Empty-value hint text shown in the closed control (the native select placeholder). */
27
27
  placeholderText?: string;
28
+ /** Supporting text shown below the control and associated with its combobox. */
29
+ hint?: string;
28
30
  disabled?: boolean;
29
31
  fitMenu?: boolean;
30
32
  renderSelected?: (choice: SelectChoice<Value>) => SafeHtml;
31
33
  /** Render as an unanimated loading skeleton: the label above a static, empty control box. */
32
34
  placeholder?: boolean;
35
+ /** Form (default), borderless toolbar, or intrinsic navigation chrome. */
36
+ presentation?: 'form' | 'toolbar-borderless' | 'navigation';
37
+ size?: 'default' | 'compact';
38
+ /** Show only the selected choice icon while retaining the Select's accessible name. */
39
+ selectedPresentation?: 'label' | 'icon-only';
40
+ /** Let an enclosing ToolbarControlGroup paint the composed focus ring. */
41
+ focusRingOwner?: 'select' | 'group';
42
+ /** Maximum closed-control label width in CSS pixels before ellipsis. */
43
+ labelMaxWidth?: number;
33
44
  }
34
45
  type SelectProps<Value extends string = string> = SelectBaseProps<Value> & SelectAccessibleName;
35
- declare function Select<Value extends string>({ name, value, label, ariaLabel, choices, className, placeholderText, disabled, fitMenu, renderSelected, placeholder, }: SelectProps<Value>): SafeHtml;
46
+ declare function Select<Value extends string>({ name, value, label, ariaLabel, choices, className, placeholderText, hint, disabled, fitMenu, renderSelected, placeholder, presentation, size, selectedPresentation, focusRingOwner, labelMaxWidth, }: SelectProps<Value>): SafeHtml;
36
47
 
37
48
  export { Select, type SelectChoice, type SelectProps };
package/dist/select.js CHANGED
@@ -1,4 +1,4 @@
1
- export { Select } from './chunk-NWSEP5RT.js';
1
+ export { Select } from './chunk-FRVS5RFM.js';
2
2
 
3
3
 
4
4
 
@@ -1,6 +1,6 @@
1
1
  import { NavStack } from './chunk-B3A3IVO5.js';
2
2
 
3
- import { ResizableRegion } from './chunk-NENBUYX5.js';
3
+ import { ResizableRegion } from './chunk-HP2B2L26.js';
4
4
 
5
5
  import { jsx, jsxs } from 'kerfjs/jsx-runtime';
6
6
 
@@ -26,6 +26,13 @@
26
26
  align-items: center;
27
27
  flex: none;
28
28
  }
29
+ .kui-app-tab[data-size="compact"] {
30
+ height: 2rem;
31
+ }
32
+ .kui-app-tab[data-presentation="segmented"] {
33
+ border-radius: var(--kui-radius-s);
34
+ box-shadow: none;
35
+ }
29
36
  .kui-app-tab:hover {
30
37
  border-color: var(--kui-color-neutral-border-normal);
31
38
  background: var(--kui-app-tab-hover-background);
@@ -92,12 +99,31 @@
92
99
  flex: none;
93
100
  }
94
101
  .kui-app-tab__name {
102
+ max-width: var(--kui-app-tab-label-max-width, none);
95
103
  overflow: hidden;
96
104
  font-size: var(--kui-font-xs);
97
105
  font-weight: 650;
98
106
  text-overflow: ellipsis;
99
107
  white-space: nowrap;
100
108
  }
109
+ .kui-app-tab[data-presentation="icon-only"] .kui-app-tab__select {
110
+ width: 100%;
111
+ justify-content: center;
112
+ }
113
+ .kui-app-tab[data-presentation="icon-only"] .kui-app-tab__name {
114
+ position: absolute;
115
+ width: 1px;
116
+ height: 1px;
117
+ padding: 0;
118
+ overflow: hidden;
119
+ clip: rect(0, 0, 0, 0);
120
+ white-space: nowrap;
121
+ clip-path: inset(50%);
122
+ }
123
+ .kui-app-tab[data-presentation="icon-only"] {
124
+ width: 2rem;
125
+ min-width: 2rem;
126
+ }
101
127
  .kui-app-tab__trailing {
102
128
  display: grid;
103
129
  min-width: 1.275rem;
@@ -33,6 +33,19 @@
33
33
  border: 0;
34
34
  }
35
35
 
36
+ .kui-collapsible-panel[data-separator="hidden"] {
37
+ border-color: transparent;
38
+ }
39
+
40
+ .kui-collapsible-panel[data-content-overflow="auto"] {
41
+ overflow: auto;
42
+ }
43
+
44
+ .kui-collapsible-panel[data-content-overflow="visible"] {
45
+ z-index: var(--kui-collapsible-panel-popup-z, 5);
46
+ overflow: visible;
47
+ }
48
+
36
49
  .kui-collapsible-panel--left[data-collapsed="true"],
37
50
  .kui-collapsible-panel--right[data-collapsed="true"] {
38
51
  width: 0;
@@ -59,6 +72,16 @@
59
72
  height: var(--kui-collapsible-panel-height, 13.75rem);
60
73
  }
61
74
 
75
+ .kui-collapsible-panel[data-collapse-motion="none"]
76
+ .kui-collapsible-panel__content {
77
+ transition: none;
78
+ }
79
+
80
+ .kui-collapsible-panel[data-collapse-motion="fade-slide"][data-collapsed="true"]
81
+ .kui-collapsible-panel__content {
82
+ opacity: 0;
83
+ }
84
+
62
85
  .kui-collapsible-panel--left[data-collapsed="true"]
63
86
  .kui-collapsible-panel__content {
64
87
  transform: translateX(-100%);
@@ -77,27 +100,66 @@
77
100
  /* Compact presentation: wireSidebar marks the host so the panel floats over the
78
101
  content as an overlay with a dismissable backdrop instead of taking layout
79
102
  space. The panel is fixed to its edge and slides in from off-screen. */
80
- [data-collapsible-overlay="true"] .kui-collapsible-panel {
103
+ [data-collapsible-overlay="true"] .kui-collapsible-panel,
104
+ .kui-collapsible-panel[data-presentation="overlay"] {
81
105
  position: fixed;
82
106
  z-index: var(--kui-collapsible-panel-overlay-z, 40);
83
107
  box-shadow: var(--kui-shadow-l, 0 8px 32px rgb(0 0 0 / 24%));
84
108
  }
85
109
 
86
- [data-collapsible-overlay="true"] .kui-collapsible-panel--left {
110
+ [data-collapsible-overlay="true"] .kui-collapsible-panel--left,
111
+ .kui-collapsible-panel--left[data-presentation="overlay"] {
87
112
  inset-block: 0;
88
113
  inset-inline-start: 0;
89
114
  }
90
115
 
91
- [data-collapsible-overlay="true"] .kui-collapsible-panel--right {
116
+ [data-collapsible-overlay="true"] .kui-collapsible-panel--right,
117
+ .kui-collapsible-panel--right[data-presentation="overlay"] {
92
118
  inset-block: 0;
93
119
  inset-inline-end: 0;
94
120
  }
95
121
 
96
- [data-collapsible-overlay="true"] .kui-collapsible-panel--bottom {
122
+ [data-collapsible-overlay="true"] .kui-collapsible-panel--bottom,
123
+ .kui-collapsible-panel--bottom[data-presentation="overlay"] {
97
124
  inset-inline: 0;
98
125
  inset-block-end: 0;
99
126
  }
100
127
 
128
+ .kui-collapsible-panel[data-presentation="overlay"][data-collapsed="true"] {
129
+ pointer-events: none;
130
+ }
131
+
132
+ .kui-collapsible-panel[data-presentation="hidden"] {
133
+ display: none;
134
+ }
135
+
136
+ [data-collapsible-responsive="hidden"] .kui-collapsible-panel {
137
+ display: none;
138
+ }
139
+
140
+ .kui-collapsible-panel__restore {
141
+ position: fixed;
142
+ z-index: var(--kui-collapsible-panel-restore-z, 42);
143
+ inset-block-end: calc(
144
+ var(--kui-collapsible-panel-restore-inset, 1rem) +
145
+ var(--kui-safe-area-block-end, env(safe-area-inset-bottom, 0px))
146
+ );
147
+ }
148
+
149
+ .kui-collapsible-panel__restore[data-position="bottom-start"] {
150
+ inset-inline-start: calc(
151
+ var(--kui-collapsible-panel-restore-inset, 1rem) +
152
+ var(--kui-safe-area-inline-start, env(safe-area-inset-left, 0px))
153
+ );
154
+ }
155
+
156
+ .kui-collapsible-panel__restore[data-position="bottom-end"] {
157
+ inset-inline-end: calc(
158
+ var(--kui-collapsible-panel-restore-inset, 1rem) +
159
+ var(--kui-safe-area-inline-end, env(safe-area-inset-right, 0px))
160
+ );
161
+ }
162
+
101
163
  .kui-collapsible-panel__backdrop {
102
164
  position: fixed;
103
165
  inset: 0;
@@ -1,4 +1,5 @@
1
1
  .kui-list-action-row {
2
+ --kui-list-group-divider-color: var(--kui-color-neutral-border-quiet);
2
3
  --kui-list-action-row-color: var(--kui-color-neutral-on-normal);
3
4
  --kui-list-action-row-border: transparent;
4
5
  --kui-list-action-row-background: transparent;
@@ -21,6 +22,29 @@
21
22
  align-items: stretch;
22
23
  }
23
24
 
25
+ .kui-list-action-row[data-density="compact"] {
26
+ min-height: 2.25rem;
27
+ }
28
+
29
+ .kui-list-action-row[data-density="compact"]
30
+ :is(.kui-list-action-row__primary, .kui-list-action-row__trailing-action) {
31
+ min-height: 2.25rem;
32
+ }
33
+
34
+ .kui-list-action-row[data-divider="before"],
35
+ .kui-list-action-row[data-divider="both"] {
36
+ border-block-start: 1px solid var(--kui-list-group-divider-color);
37
+ border-start-start-radius: 0;
38
+ border-start-end-radius: 0;
39
+ }
40
+
41
+ .kui-list-action-row[data-divider="after"],
42
+ .kui-list-action-row[data-divider="both"] {
43
+ border-block-end: 1px solid var(--kui-list-group-divider-color);
44
+ border-end-start-radius: 0;
45
+ border-end-end-radius: 0;
46
+ }
47
+
24
48
  .kui-list-action-row:has(.kui-list-action-row__primary:hover) {
25
49
  --kui-list-action-row-border: var(--kui-list-action-row-hover-border);
26
50
  --kui-list-action-row-background: var(--kui-list-action-row-hover-background);
@@ -104,6 +128,26 @@
104
128
  align-items: center;
105
129
  }
106
130
 
131
+ .kui-list-action-row__primary-label,
132
+ .kui-list-action-row__description,
133
+ .kui-list-action-row__status {
134
+ min-width: 0;
135
+ }
136
+
137
+ .kui-list-action-row__description,
138
+ .kui-list-action-row__status {
139
+ color: var(--kui-color-neutral-on-quiet);
140
+ font-size: var(--kui-font-xs);
141
+ font-weight: 400;
142
+ line-height: 1.3;
143
+ }
144
+
145
+ .kui-list-action-row__status {
146
+ display: inline-flex;
147
+ align-items: center;
148
+ gap: 0.25rem;
149
+ }
150
+
107
151
  .kui-list-action-row[data-has-icon="true"] .kui-list-action-row__label {
108
152
  margin-inline-start: calc(
109
153
  1.5rem + var(--kui-layout-item-gap, 0.5rem)
@@ -131,6 +175,26 @@
131
175
  place-items: center;
132
176
  }
133
177
 
178
+ .kui-list-action-row[data-trailing-visibility="interaction"]
179
+ .kui-list-action-row__trailing-action {
180
+ opacity: 0;
181
+ }
182
+
183
+ .kui-list-action-row[data-trailing-visibility="interaction"]:is(
184
+ :hover,
185
+ :focus-within
186
+ )
187
+ .kui-list-action-row__trailing-action {
188
+ opacity: 1;
189
+ }
190
+
191
+ @media (hover: none) {
192
+ .kui-list-action-row[data-trailing-visibility="interaction"]
193
+ .kui-list-action-row__trailing-action {
194
+ opacity: 1;
195
+ }
196
+ }
197
+
134
198
  .kui-list-action-row__trailing-action:hover:not(:disabled) {
135
199
  background: var(--kui-list-action-row-trailing-hover-background);
136
200
  }
@@ -1,4 +1,5 @@
1
1
  .kui-list-header {
2
+ --kui-list-group-divider-color: var(--kui-color-neutral-border-quiet);
2
3
  --kui-list-header-color: var(--kui-color-neutral-on-quiet);
3
4
  --kui-list-header-hover-background: var(--kui-color-neutral-border-quiet);
4
5
  --_kui-list-header-action-icon-size: var(
@@ -18,6 +19,25 @@
18
19
  gap: var(--kui-layout-item-gap, 0.5rem);
19
20
  }
20
21
 
22
+ .kui-list-header[data-density="compact"],
23
+ .kui-list-header[data-density="compact"] .kui-list-header__title {
24
+ min-height: 2.25rem;
25
+ }
26
+
27
+ .kui-list-header[data-density="compact"] .kui-list-header__title {
28
+ padding-block: 0.25rem;
29
+ }
30
+
31
+ .kui-list-header[data-divider="before"],
32
+ .kui-list-header[data-divider="both"] {
33
+ border-block-start: 1px solid var(--kui-list-group-divider-color);
34
+ }
35
+
36
+ .kui-list-header[data-divider="after"],
37
+ .kui-list-header[data-divider="both"] {
38
+ border-block-end: 1px solid var(--kui-list-group-divider-color);
39
+ }
40
+
21
41
  .kui-list-header__title,
22
42
  .kui-list-header__action {
23
43
  box-sizing: border-box;
@@ -86,6 +106,18 @@
86
106
  line-height: 1;
87
107
  }
88
108
 
109
+ .kui-list-header[data-indicator-tone="accent"]
110
+ :is(.kui-list-header__count, .kui-list-header__badge) {
111
+ color: var(--kui-color-brand-on-normal);
112
+ background: var(--kui-color-brand-fill-normal);
113
+ }
114
+
115
+ .kui-list-header[data-indicator-tone="danger"]
116
+ :is(.kui-list-header__count, .kui-list-header__badge) {
117
+ color: var(--kui-color-danger-on-normal);
118
+ background: var(--kui-color-danger-fill-normal);
119
+ }
120
+
89
121
  .kui-list-header__action,
90
122
  .kui-list-header__action-layer {
91
123
  display: grid;
@@ -1,4 +1,5 @@
1
1
  .kui-list-item {
2
+ --kui-list-group-divider-color: var(--kui-color-neutral-border-quiet);
2
3
  --kui-list-item-color: var(--kui-color-neutral-on-normal);
3
4
  --kui-list-item-border: transparent;
4
5
  --kui-list-item-background: transparent;
@@ -25,6 +26,25 @@
25
26
  text-align: start;
26
27
  }
27
28
 
29
+ .kui-list-item[data-density="compact"] {
30
+ min-height: 2.25rem;
31
+ padding-block: 0.25rem;
32
+ }
33
+
34
+ .kui-list-item[data-divider="before"],
35
+ .kui-list-item[data-divider="both"] {
36
+ border-block-start-color: var(--kui-list-group-divider-color);
37
+ border-start-start-radius: 0;
38
+ border-start-end-radius: 0;
39
+ }
40
+
41
+ .kui-list-item[data-divider="after"],
42
+ .kui-list-item[data-divider="both"] {
43
+ border-block-end-color: var(--kui-list-group-divider-color);
44
+ border-end-start-radius: 0;
45
+ border-end-end-radius: 0;
46
+ }
47
+
28
48
  .kui-list-item[data-has-icon="true"] {
29
49
  grid-template-columns: 1.125rem minmax(0, 1fr) auto;
30
50
  }
@@ -88,12 +108,25 @@
88
108
  }
89
109
 
90
110
  .kui-list-item__label {
111
+ display: grid;
91
112
  min-width: 0;
92
113
  overflow: hidden;
93
114
  text-overflow: ellipsis;
94
115
  white-space: nowrap;
95
116
  }
96
117
 
118
+ .kui-list-item__primary-label,
119
+ .kui-list-item__description {
120
+ min-width: 0;
121
+ }
122
+
123
+ .kui-list-item__description {
124
+ color: var(--kui-color-neutral-on-quiet);
125
+ font-size: var(--kui-font-xs);
126
+ font-weight: 400;
127
+ line-height: 1.3;
128
+ }
129
+
97
130
  .kui-list-item[data-multiline="true"] {
98
131
  height: fit-content;
99
132
  white-space: normal;
@@ -117,6 +150,12 @@
117
150
  gap: var(--kui-layout-item-gap, 0.5rem);
118
151
  }
119
152
 
153
+ .kui-list-item__status {
154
+ color: var(--kui-color-neutral-on-quiet);
155
+ font-size: var(--kui-font-xs);
156
+ font-weight: 500;
157
+ }
158
+
120
159
  .kui-list-item__trailing > svg {
121
160
  width: 1rem;
122
161
  height: 1rem;
@@ -27,6 +27,132 @@
27
27
  min-height: 0;
28
28
  overflow: hidden;
29
29
  }
30
+ .kui-resizable-region[data-content-overflow="auto"]
31
+ > .kui-resizable-region__content {
32
+ overflow: auto;
33
+ }
34
+ .kui-resizable-region[data-content-overflow="visible"] {
35
+ z-index: var(--kui-resizable-region-popup-z, 5);
36
+ overflow: visible;
37
+ }
38
+ .kui-resizable-region[data-content-overflow="visible"]
39
+ > .kui-resizable-region__content {
40
+ overflow: visible;
41
+ }
42
+ .kui-resizable-region[data-separator="hidden"] {
43
+ --kui-resizable-region-separator-color: transparent;
44
+ }
45
+ .kui-resizable-region[data-collapsed="true"] > .kui-resizable-region__handle,
46
+ .kui-resizable-region:not([data-presentation="inline"])
47
+ > .kui-resizable-region__handle {
48
+ display: none;
49
+ }
50
+
51
+ /* The track always snaps to its new size. Motion is isolated to the fixed-size
52
+ content so a large sibling workspace incurs one reflow, not one per frame. */
53
+ .kui-resizable-region[data-collapse-motion="slide"]
54
+ > .kui-resizable-region__content,
55
+ .kui-resizable-region[data-collapse-motion="fade-slide"]
56
+ > .kui-resizable-region__content {
57
+ transition:
58
+ opacity 160ms ease,
59
+ transform 200ms ease;
60
+ }
61
+ .kui-resizable-region[data-axis="horizontal"][data-collapse-motion]:not(
62
+ [data-collapse-motion="none"]
63
+ )
64
+ > .kui-resizable-region__content {
65
+ width: var(--kui-resizable-region-expanded-size);
66
+ min-width: var(--kui-resizable-region-expanded-size);
67
+ }
68
+ .kui-resizable-region[data-axis="vertical"][data-collapse-motion]:not(
69
+ [data-collapse-motion="none"]
70
+ )
71
+ > .kui-resizable-region__content {
72
+ height: var(--kui-resizable-region-expanded-size);
73
+ min-height: var(--kui-resizable-region-expanded-size);
74
+ }
75
+ .kui-resizable-region[data-axis="horizontal"][data-edge="end"][data-collapsed="true"]
76
+ > .kui-resizable-region__content {
77
+ transform: translateX(-100%);
78
+ }
79
+ .kui-resizable-region[data-axis="horizontal"][data-edge="start"][data-collapsed="true"]
80
+ > .kui-resizable-region__content {
81
+ transform: translateX(100%);
82
+ }
83
+ .kui-resizable-region[data-axis="vertical"][data-edge="end"][data-collapsed="true"]
84
+ > .kui-resizable-region__content {
85
+ transform: translateY(-100%);
86
+ }
87
+ .kui-resizable-region[data-axis="vertical"][data-edge="start"][data-collapsed="true"]
88
+ > .kui-resizable-region__content {
89
+ transform: translateY(100%);
90
+ }
91
+ .kui-resizable-region[data-collapse-motion="fade-slide"][data-collapsed="true"]
92
+ > .kui-resizable-region__content {
93
+ opacity: 0;
94
+ }
95
+ .kui-resizable-region[data-resizing="true"] > .kui-resizable-region__content {
96
+ transition: none;
97
+ }
98
+
99
+ /* Responsive replacement policies. Overlay regions stay on their logical edge
100
+ and stop participating in the parent's flex tracks; hidden regions are fully
101
+ replaced by application-owned compact UI. */
102
+ .kui-resizable-region[data-presentation="overlay"] {
103
+ position: absolute;
104
+ z-index: var(--kui-resizable-region-overlay-z, 41);
105
+ max-width: var(--kui-resizable-region-overlay-max-width, 85vw);
106
+ max-height: var(--kui-resizable-region-overlay-max-height, 85vh);
107
+ box-shadow: var(--kui-shadow-l, 0 8px 32px rgb(0 0 0 / 24%));
108
+ }
109
+ .kui-resizable-region[data-presentation="overlay"][data-axis="horizontal"] {
110
+ inset-block: 0;
111
+ }
112
+ .kui-resizable-region[data-presentation="overlay"][data-axis="horizontal"][data-edge="end"] {
113
+ inset-inline-start: 0;
114
+ }
115
+ .kui-resizable-region[data-presentation="overlay"][data-axis="horizontal"][data-edge="start"] {
116
+ inset-inline-end: 0;
117
+ }
118
+ .kui-resizable-region[data-presentation="overlay"][data-axis="vertical"] {
119
+ inset-inline: 0;
120
+ }
121
+ .kui-resizable-region[data-presentation="overlay"][data-axis="vertical"][data-edge="end"] {
122
+ inset-block-start: 0;
123
+ }
124
+ .kui-resizable-region[data-presentation="overlay"][data-axis="vertical"][data-edge="start"] {
125
+ inset-block-end: 0;
126
+ }
127
+ .kui-resizable-region[data-presentation="overlay"][data-collapsed="true"] {
128
+ pointer-events: none;
129
+ }
130
+ .kui-resizable-region[data-presentation="hidden"] {
131
+ display: none;
132
+ }
133
+
134
+ /* A collapsed panel can supply its own affordance while Kerf owns consistent,
135
+ safe-area-aware viewport placement. */
136
+ .kui-resizable-region__restore {
137
+ position: fixed;
138
+ z-index: var(--kui-resizable-region-restore-z, 42);
139
+ inset-block-end: calc(
140
+ var(--kui-resizable-region-restore-inset, 1rem) +
141
+ var(--kui-safe-area-block-end, env(safe-area-inset-bottom, 0px))
142
+ );
143
+ }
144
+ .kui-resizable-region__restore[data-position="bottom-start"] {
145
+ inset-inline-start: calc(
146
+ var(--kui-resizable-region-restore-inset, 1rem) +
147
+ var(--kui-safe-area-inline-start, env(safe-area-inset-left, 0px))
148
+ );
149
+ }
150
+ .kui-resizable-region__restore[data-position="bottom-end"] {
151
+ inset-inline-end: calc(
152
+ var(--kui-resizable-region-restore-inset, 1rem) +
153
+ var(--kui-safe-area-inline-end, env(safe-area-inset-right, 0px))
154
+ );
155
+ }
30
156
  .kui-resizable-region__handle {
31
157
  position: absolute;
32
158
  z-index: 3;
@@ -109,3 +235,9 @@
109
235
  .kui-resizable-region__handle:focus-visible .kui-resizable-region__handle-icon {
110
236
  opacity: 1;
111
237
  }
238
+
239
+ @media (prefers-reduced-motion: reduce) {
240
+ .kui-resizable-region > .kui-resizable-region__content {
241
+ transition: none;
242
+ }
243
+ }
@@ -4,13 +4,61 @@
4
4
  border-radius: var(--kui-layout-rounded-radius, calc(1px + 0.6875rem));
5
5
  gap: 0;
6
6
  }
7
+ .kui-select--label-hidden::part(form-control-label) {
8
+ position: absolute;
9
+ width: 1px;
10
+ height: 1px;
11
+ padding: 0;
12
+ margin: -1px;
13
+ overflow: hidden;
14
+ clip-path: inset(50%);
15
+ white-space: nowrap;
16
+ border: 0;
17
+ }
7
18
  .kui-select::part(display-input) {
8
19
  min-width: 0;
20
+ max-width: var(--kui-select-label-max-width, none);
9
21
  overflow: hidden;
10
22
  padding: 0;
11
23
  text-overflow: ellipsis;
12
24
  white-space: nowrap;
13
25
  }
26
+ .kui-select[data-size="compact"]::part(combobox) {
27
+ min-height: 2rem;
28
+ }
29
+ .kui-select[data-presentation="toolbar-borderless"]::part(combobox) {
30
+ border-color: transparent;
31
+ background: transparent;
32
+ box-shadow: none;
33
+ }
34
+ .kui-select[data-presentation="navigation"] {
35
+ width: max-content;
36
+ max-width: 100%;
37
+ }
38
+ .kui-select[data-focus-ring-owner="group"]:focus-within::part(combobox) {
39
+ outline: none;
40
+ box-shadow: none;
41
+ }
42
+ .kui-select[data-selected-presentation="icon-only"] {
43
+ width: 2rem;
44
+ }
45
+ .kui-select[data-selected-presentation="icon-only"]::part(combobox) {
46
+ width: 2rem;
47
+ min-width: 2rem;
48
+ padding-inline: 0.4375rem;
49
+ }
50
+ .kui-select[data-selected-presentation="icon-only"]::part(display-input) {
51
+ position: absolute;
52
+ width: 1px;
53
+ height: 1px;
54
+ padding: 0;
55
+ overflow: hidden;
56
+ clip-path: inset(50%);
57
+ }
58
+ .kui-select[data-selected-presentation="icon-only"]
59
+ .kui-select__icon[slot="start"] {
60
+ margin-inline-end: 0 !important;
61
+ }
14
62
  .kui-select::part(start),
15
63
  .kui-select::part(end),
16
64
  .kui-select::part(expand-icon) {
@@ -122,9 +170,29 @@
122
170
  border-radius: var(--kui-layout-rounded-radius, calc(1px + 0.6875rem));
123
171
  background: var(--kui-color-surface);
124
172
  }
173
+ .kui-select--placeholder[data-size="compact"] .kui-select__placeholder-box {
174
+ min-height: 2rem;
175
+ }
176
+ .kui-select--placeholder[data-presentation="toolbar-borderless"]
177
+ .kui-select__placeholder-box {
178
+ border-color: transparent;
179
+ background: transparent;
180
+ }
181
+ .kui-select--placeholder[data-presentation="navigation"] {
182
+ width: max-content;
183
+ max-width: 100%;
184
+ }
125
185
  .kui-select__placeholder-box .kui-skeleton {
126
186
  max-width: 10rem;
127
187
  }
188
+ .kui-select__placeholder-hint {
189
+ display: block;
190
+ margin-block-start: 0.25rem;
191
+ padding-inline: calc(1px + var(--kui-layout-item-padding, 0.5rem));
192
+ color: var(--kui-color-text-quiet);
193
+ font-size: var(--kui-font-xs);
194
+ line-height: 1.4;
195
+ }
128
196
  .kui-select__placeholder-chevron {
129
197
  display: inline-flex;
130
198
  width: 1rem;
@@ -4,6 +4,7 @@
4
4
  @import "./disclosure-arrow.css";
5
5
  @import "./toolbar.css";
6
6
  @import "./toolbar-control-group.css";
7
+ @import "./surface-scaffold.css";
7
8
  @import "./toolbar-text.css";
8
9
  @import "./list.css";
9
10
  @import "./list-action-row.css";
@@ -20,5 +21,4 @@
20
21
  @import "./token-search-field.css";
21
22
  @import "./state-banner.css";
22
23
  @import "./empty-state.css";
23
- @import "./panel-header.css";
24
24
  @import "./value-table.css";