@kerfjs/ui 5.0.0-beta.59 → 5.0.0-beta.60

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 (117) hide show
  1. package/ai/component-catalog.json +99 -10
  2. package/ai/component-composition.json +78 -6
  3. package/ai/components/README.md +1 -1
  4. package/ai/components/floating-toolbar.md +3 -1
  5. package/ai/components/list-header.md +1 -1
  6. package/ai/components/list-item.md +4 -1
  7. package/ai/components/resize.md +6 -1
  8. package/ai/components/select.md +5 -3
  9. package/ai/components/state-banner.md +3 -1
  10. package/ai/components/tab-bar.md +1 -1
  11. package/ai/components/tabs.md +2 -1
  12. package/ai/components/text.md +2 -1
  13. package/ai/components/token-search-field.md +1 -1
  14. package/ai/components/toolbar-text.md +4 -2
  15. package/ai/components/toolbar.md +2 -1
  16. package/ai/components/value-table.md +2 -1
  17. package/ai/public-api-signatures-v1.md +55 -18
  18. package/ai/skill.md +18 -6
  19. package/ai/webawesome-jsx-signatures-v1.md +1 -1
  20. package/dist/app-tab.d.ts +4 -1
  21. package/dist/app-tab.js +1 -1
  22. package/dist/catalog.js +6 -6
  23. package/dist/{chunk-2CCMJTVY.js → chunk-2OXQHM7I.js} +5 -5
  24. package/dist/{chunk-2CCMJTVY.js.map → chunk-2OXQHM7I.js.map} +1 -1
  25. package/dist/{chunk-XDKAYSVD.js → chunk-3SXMEK3B.js} +1 -1
  26. package/dist/chunk-3SXMEK3B.js.map +1 -0
  27. package/dist/{chunk-QOWG4ZCL.js → chunk-5I7OHCIP.js} +5 -2
  28. package/dist/chunk-5I7OHCIP.js.map +1 -0
  29. package/dist/{chunk-W4XKTST6.js → chunk-5PESG2VP.js} +3 -3
  30. package/dist/{chunk-W4XKTST6.js.map → chunk-5PESG2VP.js.map} +1 -1
  31. package/dist/{chunk-UX2VVXZ3.js → chunk-5Q3N6EV7.js} +2 -2
  32. package/dist/{chunk-UX2VVXZ3.js.map → chunk-5Q3N6EV7.js.map} +1 -1
  33. package/dist/{chunk-UFYZHYWU.js → chunk-A3CKOW2R.js} +4 -3
  34. package/dist/chunk-A3CKOW2R.js.map +1 -0
  35. package/dist/{chunk-UXT7TE6B.js → chunk-AUKT3KMG.js} +5 -1
  36. package/dist/chunk-AUKT3KMG.js.map +1 -0
  37. package/dist/{chunk-EVYKTVBQ.js → chunk-GLDWRCAM.js} +5 -1
  38. package/dist/chunk-GLDWRCAM.js.map +1 -0
  39. package/dist/{chunk-M7QV3IHH.js → chunk-I3Q7KKYM.js} +5 -1
  40. package/dist/chunk-I3Q7KKYM.js.map +1 -0
  41. package/dist/{chunk-3CGQ7ZNO.js → chunk-IA7TMD4Y.js} +2 -2
  42. package/dist/{chunk-3CGQ7ZNO.js.map → chunk-IA7TMD4Y.js.map} +1 -1
  43. package/dist/{chunk-VHADGP3B.js → chunk-KLJKU6ZL.js} +5 -1
  44. package/dist/chunk-KLJKU6ZL.js.map +1 -0
  45. package/dist/{chunk-6YFHCLHG.js → chunk-MERWRTBG.js} +1 -1
  46. package/dist/chunk-MERWRTBG.js.map +1 -0
  47. package/dist/{chunk-KH6VUGHU.js → chunk-NNMLEDMD.js} +2 -2
  48. package/dist/{chunk-KH6VUGHU.js.map → chunk-NNMLEDMD.js.map} +1 -1
  49. package/dist/{chunk-6CINWX2E.js → chunk-P7D3EMXM.js} +3 -1
  50. package/dist/chunk-P7D3EMXM.js.map +1 -0
  51. package/dist/{chunk-QPUPLNNB.js → chunk-T57AXDFM.js} +2 -2
  52. package/dist/{chunk-QPUPLNNB.js.map → chunk-T57AXDFM.js.map} +1 -1
  53. package/dist/{chunk-WOUF7YXM.js → chunk-T66UNBXL.js} +5 -2
  54. package/dist/chunk-T66UNBXL.js.map +1 -0
  55. package/dist/{chunk-XQV2B4IL.js → chunk-UIDKY4UB.js} +2 -2
  56. package/dist/{chunk-XQV2B4IL.js.map → chunk-UIDKY4UB.js.map} +1 -1
  57. package/dist/{chunk-OUK6QRDR.js → chunk-WPLIO5WJ.js} +5 -2
  58. package/dist/chunk-WPLIO5WJ.js.map +1 -0
  59. package/dist/collapsible-panel.d.ts +1 -0
  60. package/dist/collapsible-panel.js +2 -2
  61. package/dist/floating-toolbar.d.ts +8 -2
  62. package/dist/floating-toolbar.js +1 -1
  63. package/dist/index.js +13 -13
  64. package/dist/list-header.js +1 -1
  65. package/dist/list-item.d.ts +5 -2
  66. package/dist/list-item.js +1 -1
  67. package/dist/nav-stack.js +1 -1
  68. package/dist/resizable-region.d.ts +8 -3
  69. package/dist/resizable-region.js +1 -1
  70. package/dist/select.d.ts +4 -1
  71. package/dist/select.js +1 -1
  72. package/dist/split-view.d.ts +1 -0
  73. package/dist/split-view.js +2 -2
  74. package/dist/state-banner.d.ts +8 -2
  75. package/dist/state-banner.js +1 -1
  76. package/dist/styles/app-tab.css +3 -0
  77. package/dist/styles/floating-toolbar.css +56 -4
  78. package/dist/styles/list-header.css +15 -7
  79. package/dist/styles/list-item.css +60 -18
  80. package/dist/styles/resizable-region.css +33 -1
  81. package/dist/styles/select.css +26 -0
  82. package/dist/styles/state-banner.css +37 -0
  83. package/dist/styles/tab-bar.css +25 -10
  84. package/dist/styles/text.css +9 -0
  85. package/dist/styles/token-search-field.css +1 -1
  86. package/dist/styles/toolbar-text.css +4 -0
  87. package/dist/styles/toolbar.css +83 -1
  88. package/dist/styles/value-table.css +16 -3
  89. package/dist/text.d.ts +7 -2
  90. package/dist/text.js +1 -1
  91. package/dist/toolbar-text.d.ts +1 -1
  92. package/dist/toolbar-text.js +1 -1
  93. package/dist/toolbar.d.ts +4 -2
  94. package/dist/toolbar.js +1 -1
  95. package/dist/value-table.d.ts +3 -1
  96. package/dist/value-table.js +1 -1
  97. package/dist/wire-catalog.js +1 -1
  98. package/dist/wire-resizable-regions.js +1 -1
  99. package/dist/wire-token-search-fields.js +1 -1
  100. package/dist/wire-workbench.js +1 -1
  101. package/dist/workbench.js +1 -1
  102. package/docs/collapsible-panel.md +7 -1
  103. package/docs/component-selection.md +61 -0
  104. package/docs/document-baseline.md +3 -0
  105. package/llms.txt +32 -0
  106. package/package.json +1 -1
  107. package/dist/chunk-6CINWX2E.js.map +0 -1
  108. package/dist/chunk-6YFHCLHG.js.map +0 -1
  109. package/dist/chunk-EVYKTVBQ.js.map +0 -1
  110. package/dist/chunk-M7QV3IHH.js.map +0 -1
  111. package/dist/chunk-OUK6QRDR.js.map +0 -1
  112. package/dist/chunk-QOWG4ZCL.js.map +0 -1
  113. package/dist/chunk-UFYZHYWU.js.map +0 -1
  114. package/dist/chunk-UXT7TE6B.js.map +0 -1
  115. package/dist/chunk-VHADGP3B.js.map +0 -1
  116. package/dist/chunk-WOUF7YXM.js.map +0 -1
  117. package/dist/chunk-XDKAYSVD.js.map +0 -1
package/dist/index.js CHANGED
@@ -1,41 +1,41 @@
1
- export { wireResizableRegions } from './chunk-XQV2B4IL.js';
1
+ export { wireResizableRegions } from './chunk-UIDKY4UB.js';
2
2
  export { reorderTabs, wireTabBars } from './chunk-46263QLK.js';
3
- export { wireTokenSearchFields } from './chunk-UFYZHYWU.js';
3
+ export { wireTokenSearchFields } from './chunk-A3CKOW2R.js';
4
4
  export { TokenSearchField, placeTokenSearchCaret, readTokenSearchField } from './chunk-RRB26JRJ.js';
5
5
  export { createTokenSearchModel } from './chunk-F7F7KRO2.js';
6
- export { ValueTable, ValueTableRow } from './chunk-6CINWX2E.js';
6
+ export { ValueTable, ValueTableRow } from './chunk-P7D3EMXM.js';
7
7
  export { wireScrollDividers } from './chunk-JCV4GXWB.js';
8
8
 
9
9
  export { Spacer } from './chunk-MEY33VWB.js';
10
- export { StateBanner } from './chunk-EVYKTVBQ.js';
10
+ export { StateBanner } from './chunk-GLDWRCAM.js';
11
11
  export { SunkenPanel } from './chunk-6ZXOQEAN.js';
12
12
  export { DialogSurface, PopupSurface } from './chunk-NN6GYOA2.js';
13
13
  export { TabBar } from './chunk-N3GKMPDW.js';
14
14
  export { SegmentedControl } from './chunk-X5QSICJ3.js';
15
- export { Select } from './chunk-OUK6QRDR.js';
15
+ export { Select } from './chunk-WPLIO5WJ.js';
16
16
  export { ListInsetControl } from './chunk-5I7QGQVT.js';
17
17
  export { EmptyState } from './chunk-E36EVCKG.js';
18
18
  export { Grid } from './chunk-AGXQQFKZ.js';
19
19
  export { ListActionRow } from './chunk-F4QMLOXJ.js';
20
- export { AppTab } from './chunk-WOUF7YXM.js';
20
+ export { AppTab } from './chunk-T66UNBXL.js';
21
21
  export { PopupMenu, closePopupMenu, openPopupMenuAt } from './chunk-UWONG4QE.js';
22
- export { ResizableRegion, clampRegionSize, resizeRegionFromPointer } from './chunk-VHADGP3B.js';
22
+ export { ResizableRegion, clampRegionSize, resizeRegionFromPointer } from './chunk-KLJKU6ZL.js';
23
23
  export { Row } from './chunk-VZOFZPSO.js';
24
24
  export { ListInsetText } from './chunk-DG6G5EPF.js';
25
- export { ListItem } from './chunk-QOWG4ZCL.js';
25
+ export { ListItem } from './chunk-5I7OHCIP.js';
26
26
  export { List } from './chunk-NAPE7WUS.js';
27
27
 
28
- export { ToolbarText } from './chunk-XDKAYSVD.js';
29
- export { FloatingToolbar } from './chunk-M7QV3IHH.js';
28
+ export { ToolbarText } from './chunk-3SXMEK3B.js';
29
+ export { FloatingToolbar } from './chunk-I3Q7KKYM.js';
30
30
 
31
31
  export { LoadingSpinner } from './chunk-ZLWQZUGF.js';
32
- export { ListHeader } from './chunk-UX2VVXZ3.js';
33
- export { Text } from './chunk-UXT7TE6B.js';
32
+ export { ListHeader } from './chunk-5Q3N6EV7.js';
33
+ export { Text } from './chunk-AUKT3KMG.js';
34
34
  export { DisclosureArrow } from './chunk-KROD7KZK.js';
35
35
  export { Skeleton } from './chunk-AHEG27M7.js';
36
36
  export { Badge } from './chunk-MP2GDBQZ.js';
37
37
  export { ToolbarActionLink, ToolbarControlGroup } from './chunk-7JUBXOIV.js';
38
- export { Toolbar } from './chunk-6YFHCLHG.js';
38
+ export { Toolbar } from './chunk-MERWRTBG.js';
39
39
  export { Pane } from './chunk-EZVNC4J6.js';
40
40
  export { LucideIcon } from './chunk-4R777DUZ.js';
41
41
  export { ContentItem } from './chunk-MA73TA6D.js';
@@ -1,4 +1,4 @@
1
- export { ListHeader } from './chunk-UX2VVXZ3.js';
1
+ export { ListHeader } from './chunk-5Q3N6EV7.js';
2
2
 
3
3
 
4
4
 
@@ -13,6 +13,7 @@ type ListItemRootAttributes = Readonly<Record<`data-${string}`, string | undefin
13
13
  'data-busy'?: never;
14
14
  'data-state'?: never;
15
15
  'data-kui-disabled'?: never;
16
+ 'data-icon-align'?: never;
16
17
  }>;
17
18
  interface ListItemProps {
18
19
  label: string | SafeHtml;
@@ -25,7 +26,7 @@ interface ListItemProps {
25
26
  status?: string | SafeHtml;
26
27
  /** Show a progress indicator and expose the row as busy without replacing its content; a placeholder keeps the indicator. */
27
28
  busy?: boolean;
28
- density?: 'standard' | 'compact';
29
+ density?: 'standard' | 'compact' | 'spacious';
29
30
  divider?: 'none' | 'before' | 'after' | 'both';
30
31
  selected?: boolean;
31
32
  action: string;
@@ -35,6 +36,8 @@ interface ListItemProps {
35
36
  accessibleLabel?: string;
36
37
  title?: string;
37
38
  multiline?: boolean;
39
+ /** Alignment of an icon beside a wrapped label. Defaults to its first line. */
40
+ multilineIconAlign?: 'first-line' | 'center';
38
41
  state?: string;
39
42
  disabled?: boolean;
40
43
  tabIndex?: number;
@@ -44,6 +47,6 @@ interface ListItemProps {
44
47
  /** Native named-slot assignment when composed inside a web component. */
45
48
  slot?: string;
46
49
  }
47
- declare function ListItem({ label, description, icon, trailing, status, busy, density, divider, selected, action, itemId, className, pressed, accessibleLabel, title, multiline, state, disabled, tabIndex, placeholder, rootAttributes, slot, }: ListItemProps): SafeHtml;
50
+ declare function ListItem({ label, description, icon, trailing, status, busy, density, divider, selected, action, itemId, className, pressed, accessibleLabel, title, multiline, multilineIconAlign, state, disabled, tabIndex, placeholder, rootAttributes, slot, }: ListItemProps): SafeHtml;
48
51
 
49
52
  export { ListItem, type ListItemProps };
package/dist/list-item.js CHANGED
@@ -1,4 +1,4 @@
1
- export { ListItem } from './chunk-QOWG4ZCL.js';
1
+ export { ListItem } from './chunk-5I7OHCIP.js';
2
2
 
3
3
 
4
4
 
package/dist/nav-stack.js CHANGED
@@ -1,4 +1,4 @@
1
- export { NavStack } from './chunk-W4XKTST6.js';
1
+ export { NavStack } from './chunk-5PESG2VP.js';
2
2
 
3
3
 
4
4
 
@@ -1,4 +1,5 @@
1
1
  import { SafeHtml } from 'kerfjs';
2
+ import { CssLength } from './css-values.js';
2
3
  import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
3
4
 
4
5
  type ResizableRegionAxis = 'horizontal' | 'vertical';
@@ -7,7 +8,7 @@ type ResizableRegionSeparator = 'auto' | 'hidden';
7
8
  type ResizableRegionCollapseMotion = 'none' | 'slide' | 'fade-slide';
8
9
  type ResizableRegionContentOverflow = 'clip' | 'auto' | 'visible';
9
10
  type ResizableRegionPresentation = 'inline' | 'overlay' | 'hidden';
10
- type ResizableRegionRestorePosition = 'bottom-start' | 'bottom-end';
11
+ type ResizableRegionRestorePosition = 'bottom-start' | 'bottom-end' | 'top-start' | 'top-end';
11
12
  type ResizableRegionResponsiveFillAt = 'compact' | 'narrow';
12
13
  interface ResizableRegionProps {
13
14
  id: string;
@@ -26,7 +27,7 @@ interface ResizableRegionProps {
26
27
  separator?: ResizableRegionSeparator;
27
28
  /** Keep the track change instant while optionally sliding the fixed-size content. */
28
29
  collapseMotion?: ResizableRegionCollapseMotion;
29
- /** Overflow policy for content such as an open popup inside a bottom drawer. */
30
+ /** Use `visible` while an anchored popup must escape the content box; it raises the region to the popup layer. */
30
31
  contentOverflow?: ResizableRegionContentOverflow;
31
32
  /** Inline layout, an edge overlay, or a responsive replacement that removes the region. */
32
33
  presentation?: ResizableRegionPresentation;
@@ -34,6 +35,10 @@ interface ResizableRegionProps {
34
35
  restoreControl?: SafeHtml;
35
36
  /** Safe-area-aware corner of the region's container (not the viewport) for `restoreControl`. */
36
37
  restorePosition?: ResizableRegionRestorePosition;
38
+ /** Position a restore control in its container corner or leave it in normal flow. */
39
+ restorePlacement?: 'corner' | 'inline';
40
+ /** Corner distance before the container's safe-area inset. */
41
+ restoreInset?: CssLength;
37
42
  /** Fill the available inline track and hide the separator below a container breakpoint. */
38
43
  responsiveFillAt?: ResizableRegionResponsiveFillAt;
39
44
  /** Decorative dormant content for the separator handle. Must not contain interactive descendants. */
@@ -42,6 +47,6 @@ interface ResizableRegionProps {
42
47
  }
43
48
  declare const clampRegionSize: (size: number, min: number, max: number) => number;
44
49
  declare const resizeRegionFromPointer: (startSize: number, delta: number, edge: ResizableRegionEdge) => number;
45
- declare function ResizableRegion({ id, label, size, min, max, axis, edge, collapsed, transitioning, separator, collapseMotion, contentOverflow, presentation, restoreControl, restorePosition, responsiveFillAt, handleIcon, children, }: ResizableRegionProps): SafeHtml;
50
+ declare function ResizableRegion({ id, label, size, min, max, axis, edge, collapsed, transitioning, separator, collapseMotion, contentOverflow, presentation, restoreControl, restorePosition, restorePlacement, restoreInset, responsiveFillAt, handleIcon, children, }: ResizableRegionProps): SafeHtml;
46
51
 
47
52
  export { ResizableRegion, type ResizableRegionAxis, type ResizableRegionCollapseMotion, type ResizableRegionContentOverflow, type ResizableRegionEdge, type ResizableRegionPresentation, type ResizableRegionProps, type ResizableRegionResponsiveFillAt, type ResizableRegionRestorePosition, type ResizableRegionSeparator, clampRegionSize, resizeRegionFromPointer };
@@ -1,3 +1,3 @@
1
- export { ResizableRegion, clampRegionSize, resizeRegionFromPointer } from './chunk-VHADGP3B.js';
1
+ export { ResizableRegion, clampRegionSize, resizeRegionFromPointer } from './chunk-KLJKU6ZL.js';
2
2
 
3
3
  //# sourceMappingURL=resizable-region.js.map
package/dist/select.d.ts CHANGED
@@ -36,6 +36,7 @@ type SelectPresentation = 'form' | 'toolbar-borderless' | 'navigation';
36
36
  type SelectSize = 'default' | 'compact';
37
37
  type SelectSelectedPresentation = 'label' | 'icon-only';
38
38
  type SelectFocusRingOwner = 'select' | 'group';
39
+ type SelectTriggerWidth = 'fit-content' | 'max-content' | 'fill';
39
40
  interface SelectBaseProps<Value extends string = string> {
40
41
  name: string;
41
42
  choices: readonly SelectChoice<Value>[];
@@ -51,6 +52,8 @@ interface SelectBaseProps<Value extends string = string> {
51
52
  /** Form (default), borderless toolbar, or intrinsic navigation chrome. */
52
53
  presentation?: SelectPresentation;
53
54
  size?: SelectSize;
55
+ /** Closed trigger width; omit to keep the presentation's default. */
56
+ triggerWidth?: SelectTriggerWidth;
54
57
  /** Let an enclosing ToolbarControlGroup paint the composed focus ring. */
55
58
  focusRingOwner?: SelectFocusRingOwner;
56
59
  /** Maximum closed-control label width in CSS pixels before ellipsis. */
@@ -101,4 +104,4 @@ type SelectMultipleValueProps<Value extends string = string> = SelectMultipleLab
101
104
  type SelectProps<Value extends string = string> = SelectBaseProps<Value> & SelectAccessibleName & (SelectSingleValueProps<Value> | SelectMultipleValueProps<Value>);
102
105
  declare function Select<Value extends string>(props: SelectProps<Value>): SafeHtml;
103
106
 
104
- export { Select, type SelectChoice, type SelectFocusRingOwner, type SelectMultipleIconProps, type SelectMultipleLabelProps, type SelectMultipleValueProps, type SelectPresentation, type SelectProps, type SelectSelectedPresentation, type SelectSingleValueProps, type SelectSize };
107
+ export { Select, type SelectChoice, type SelectFocusRingOwner, type SelectMultipleIconProps, type SelectMultipleLabelProps, type SelectMultipleValueProps, type SelectPresentation, type SelectProps, type SelectSelectedPresentation, type SelectSingleValueProps, type SelectSize, type SelectTriggerWidth };
package/dist/select.js CHANGED
@@ -1,4 +1,4 @@
1
- export { Select } from './chunk-OUK6QRDR.js';
1
+ export { Select } from './chunk-WPLIO5WJ.js';
2
2
 
3
3
 
4
4
 
@@ -6,6 +6,7 @@ import './toolbar.js';
6
6
  import './pane.js';
7
7
  import './sides-BPSWde0A.js';
8
8
  import './toolbar-text.js';
9
+ import './css-values.js';
9
10
 
10
11
  /**
11
12
  * The roomy list pane's `ResizableRegion`: its committed `size` and `min` /
@@ -1,5 +1,5 @@
1
- import { NavStack } from './chunk-W4XKTST6.js';
2
- import { ResizableRegion } from './chunk-VHADGP3B.js';
1
+ import { NavStack } from './chunk-5PESG2VP.js';
2
+ import { ResizableRegion } from './chunk-KLJKU6ZL.js';
3
3
 
4
4
 
5
5
 
@@ -3,6 +3,8 @@ import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
3
3
 
4
4
  type StateBannerTone = 'neutral' | 'info' | 'pop' | 'success' | 'warning' | 'danger';
5
5
  type StateBannerUrgency = 'status' | 'alert';
6
+ type StateBannerCopyLayout = 'inline' | 'stacked';
7
+ type StateBannerActionPlacement = 'trailing' | 'below';
6
8
  interface StateBannerProps {
7
9
  title: string;
8
10
  detail?: string;
@@ -12,12 +14,16 @@ interface StateBannerProps {
12
14
  action?: KerfUiContent;
13
15
  tone?: StateBannerTone;
14
16
  urgency?: StateBannerUrgency;
17
+ /** Keep the detail beside the title, or give it its own line. */
18
+ copyLayout?: StateBannerCopyLayout;
19
+ /** Place the action beside the copy or on a separate trailing row. */
20
+ actionPlacement?: StateBannerActionPlacement;
15
21
  className?: string;
16
22
  /** Render the title, badge, and detail as unanimated loading skeletons, keeping the icon and tone. The detail line appears only when `detail` is set, as in the live banner. */
17
23
  placeholder?: boolean;
18
24
  /** Native named-slot assignment when composed inside a web component. */
19
25
  slot?: string;
20
26
  }
21
- declare function StateBanner({ title, detail, badge, icon, action, tone, urgency, className, placeholder, slot, }: StateBannerProps): SafeHtml;
27
+ declare function StateBanner({ title, detail, badge, icon, action, tone, urgency, copyLayout, actionPlacement, className, placeholder, slot, }: StateBannerProps): SafeHtml;
22
28
 
23
- export { StateBanner, type StateBannerProps, type StateBannerTone, type StateBannerUrgency };
29
+ export { StateBanner, type StateBannerActionPlacement, type StateBannerCopyLayout, type StateBannerProps, type StateBannerTone, type StateBannerUrgency };
@@ -1,4 +1,4 @@
1
- export { StateBanner } from './chunk-EVYKTVBQ.js';
1
+ export { StateBanner } from './chunk-GLDWRCAM.js';
2
2
 
3
3
 
4
4
 
@@ -106,6 +106,9 @@
106
106
  text-overflow: ellipsis;
107
107
  white-space: nowrap;
108
108
  }
109
+ .kui-app-tab[data-attention="true"] .kui-app-tab__name {
110
+ color: var(--kui-app-tab-attention-color, var(--kui-color-warning-on-quiet));
111
+ }
109
112
  .kui-app-tab[data-presentation="icon-only"] .kui-app-tab__select {
110
113
  width: 100%;
111
114
  justify-content: center;
@@ -6,6 +6,10 @@
6
6
  --kui-floating-toolbar-inset,
7
7
  var(--kui-space-m, 1rem)
8
8
  );
9
+ --_kui-floating-toolbar-safe-block-start: 0px;
10
+ --_kui-floating-toolbar-safe-block-end: 0px;
11
+ --_kui-floating-toolbar-safe-inline-start: 0px;
12
+ --_kui-floating-toolbar-safe-inline-end: 0px;
9
13
 
10
14
  /* Floats above the main content of its nearest positioned ancestor. z-index
11
15
  stays low so it never covers dialogs/overlays (it is not top-layer). Forced
@@ -30,6 +34,25 @@
30
34
  gap: var(--kui-space-xs, 0.5rem);
31
35
  }
32
36
 
37
+ .kui-floating-toolbar[data-safe-area-insets="true"] {
38
+ --_kui-floating-toolbar-safe-block-start: var(
39
+ --kui-edge-inset-block-start,
40
+ var(--kui-safe-area-block-start, env(safe-area-inset-top, 0px))
41
+ );
42
+ --_kui-floating-toolbar-safe-block-end: var(
43
+ --kui-edge-inset-block-end,
44
+ var(--kui-safe-area-block-end, env(safe-area-inset-bottom, 0px))
45
+ );
46
+ --_kui-floating-toolbar-safe-inline-start: var(
47
+ --kui-edge-inset-inline-start,
48
+ var(--kui-safe-area-inline-start, env(safe-area-inset-left, 0px))
49
+ );
50
+ --_kui-floating-toolbar-safe-inline-end: var(
51
+ --kui-edge-inset-inline-end,
52
+ var(--kui-safe-area-inline-end, env(safe-area-inset-right, 0px))
53
+ );
54
+ }
55
+
33
56
  /* In a layout's restore corner the corner already owns the inset, so the
34
57
  toolbar floats from the corner itself. Zero specificity: the toolbar's own
35
58
  `inset` (or an app rule on the toolbar) still wins, while a token inherited
@@ -44,19 +67,43 @@
44
67
  }
45
68
 
46
69
  .kui-floating-toolbar[data-position^="bottom"] {
47
- inset-block-end: var(--_kui-floating-toolbar-inset);
70
+ inset-block-end: calc(
71
+ var(
72
+ --kui-floating-toolbar-inset-block-end,
73
+ var(--_kui-floating-toolbar-inset)
74
+ ) +
75
+ var(--_kui-floating-toolbar-safe-block-end)
76
+ );
48
77
  }
49
78
 
50
79
  .kui-floating-toolbar[data-position^="top"] {
51
- inset-block-start: var(--_kui-floating-toolbar-inset);
80
+ inset-block-start: calc(
81
+ var(
82
+ --kui-floating-toolbar-inset-block-start,
83
+ var(--_kui-floating-toolbar-inset)
84
+ ) +
85
+ var(--_kui-floating-toolbar-safe-block-start)
86
+ );
52
87
  }
53
88
 
54
89
  .kui-floating-toolbar[data-position$="-end"] {
55
- inset-inline-end: var(--_kui-floating-toolbar-inset);
90
+ inset-inline-end: calc(
91
+ var(
92
+ --kui-floating-toolbar-inset-inline-end,
93
+ var(--_kui-floating-toolbar-inset)
94
+ ) +
95
+ var(--_kui-floating-toolbar-safe-inline-end)
96
+ );
56
97
  }
57
98
 
58
99
  .kui-floating-toolbar[data-position$="-start"] {
59
- inset-inline-start: var(--_kui-floating-toolbar-inset);
100
+ inset-inline-start: calc(
101
+ var(
102
+ --kui-floating-toolbar-inset-inline-start,
103
+ var(--_kui-floating-toolbar-inset)
104
+ ) +
105
+ var(--_kui-floating-toolbar-safe-inline-start)
106
+ );
60
107
  }
61
108
 
62
109
  /* The centered edges span from the middle rather than an inline edge. */
@@ -65,3 +112,8 @@
65
112
  inset-inline-start: 50%;
66
113
  transform: translateX(-50%);
67
114
  }
115
+
116
+ .kui-floating-toolbar[data-placement="inline"] {
117
+ position: static;
118
+ transform: none;
119
+ }
@@ -9,7 +9,7 @@
9
9
  display: flex;
10
10
  width: calc(100% - (2 * var(--kui-layout-inline-margin, 0.5rem)));
11
11
  min-width: 0;
12
- min-height: 2.75rem;
12
+ min-height: var(--kui-list-header-min-height, 2.75rem);
13
13
  margin-inline: var(--kui-layout-inline-margin, 0.5rem);
14
14
  box-sizing: border-box;
15
15
  color: var(--kui-list-header-color);
@@ -18,13 +18,16 @@
18
18
  gap: var(--kui-layout-item-gap, 0.5rem);
19
19
  }
20
20
 
21
- .kui-list-header[data-density="compact"],
22
- .kui-list-header[data-density="compact"] .kui-list-header__title {
23
- min-height: 2.25rem;
21
+ .kui-list-header[data-density="compact"] {
22
+ min-height: var(--kui-list-header-min-height, 2.25rem);
24
23
  }
25
24
 
26
25
  .kui-list-header[data-density="compact"] .kui-list-header__title {
27
- padding-block: 0.25rem;
26
+ min-height: var(
27
+ --kui-list-header-title-min-height,
28
+ var(--kui-list-header-min-height, 2.25rem)
29
+ );
30
+ padding-block: var(--kui-list-header-title-padding-block, 0.25rem);
28
31
  }
29
32
 
30
33
  .kui-list-header[data-divider="before"],
@@ -71,7 +74,7 @@
71
74
  .kui-list-header__title,
72
75
  .kui-list-header__action {
73
76
  box-sizing: border-box;
74
- border: 1px solid transparent;
77
+ border: var(--kui-list-header-border-width, 1px) solid transparent;
75
78
  border-radius: var(--kui-layout-rounded-radius, calc(1px + 0.6875rem));
76
79
  color: inherit;
77
80
  background: transparent;
@@ -80,7 +83,12 @@
80
83
  .kui-list-header__title {
81
84
  display: flex;
82
85
  min-width: 0;
83
- min-height: 2.75rem;
86
+ min-height: var(
87
+ --kui-list-header-title-min-height,
88
+ var(--kui-list-header-min-height, 2.75rem)
89
+ );
90
+ padding-block: var(--kui-list-header-title-padding-block, 0px);
91
+ padding-inline: var(--kui-list-header-title-padding-inline, 0px);
84
92
  align-items: center;
85
93
  flex: 1 1 auto;
86
94
  gap: var(--kui-layout-item-gap, 0.5rem);
@@ -10,34 +10,50 @@
10
10
  --kui-list-item-selected-background: var(--kui-color-brand-fill-normal);
11
11
  display: grid;
12
12
  width: calc(100% - (2 * var(--kui-layout-inline-margin, 0.5rem)));
13
- min-height: 2.75rem;
13
+ min-height: var(--kui-list-item-min-height, 2.75rem);
14
14
  overflow: hidden;
15
15
  margin-inline: var(--kui-layout-inline-margin, 0.5rem);
16
- padding: var(--kui-layout-item-padding, 0.5rem);
16
+ padding-block: var(
17
+ --kui-list-item-padding-block,
18
+ var(--kui-layout-item-padding, 0.5rem)
19
+ );
20
+ padding-inline: var(
21
+ --kui-list-item-padding-inline,
22
+ var(--kui-layout-item-padding, 0.5rem)
23
+ );
17
24
  box-sizing: border-box;
18
- border: 1px solid var(--kui-list-item-border);
19
- border-radius: var(--kui-layout-rounded-radius, calc(1px + 0.6875rem));
25
+ border: var(--kui-list-item-border-width, 1px) solid
26
+ var(--kui-list-item-border);
27
+ border-radius: var(
28
+ --kui-list-item-radius,
29
+ var(--kui-layout-rounded-radius, calc(1px + 0.6875rem))
30
+ );
20
31
  color: var(--kui-list-item-color);
21
32
  background: var(--kui-list-item-background);
22
33
  cursor: pointer;
23
- grid-template-columns: minmax(0, 1fr) auto;
24
- align-items: center;
25
- column-gap: var(--kui-layout-item-gap, 0.5rem);
34
+ grid-template-columns: var(--kui-list-item-columns, minmax(0, 1fr) auto);
35
+ align-items: var(--kui-list-item-align-items, center);
36
+ column-gap: var(--kui-list-item-gap, var(--kui-layout-item-gap, 0.5rem));
26
37
  font: inherit;
27
38
  text-align: start;
28
39
  }
29
40
 
30
41
  .kui-list-item[data-density="compact"] {
31
- min-height: 2.25rem;
32
- padding-block: 0.25rem;
42
+ min-height: var(--kui-list-item-min-height, 2.25rem);
43
+ padding-block: var(--kui-list-item-padding-block, 0.25rem);
44
+ }
45
+
46
+ .kui-list-item[data-density="spacious"] {
47
+ min-height: var(--kui-list-item-min-height, 3.25rem);
48
+ padding-block: var(--kui-list-item-padding-block, 0.75rem);
33
49
  }
34
50
 
35
51
  .kui-list-item[data-has-description="true"] {
36
- min-height: 3.25rem;
52
+ min-height: var(--kui-list-item-min-height, 3.25rem);
37
53
  }
38
54
 
39
55
  .kui-list-item[data-density="compact"][data-has-description="true"] {
40
- min-height: 2.75rem;
56
+ min-height: var(--kui-list-item-min-height, 2.75rem);
41
57
  }
42
58
 
43
59
  .kui-list-item[data-divider="before"],
@@ -55,7 +71,10 @@
55
71
  }
56
72
 
57
73
  .kui-list-item[data-has-icon="true"] {
58
- grid-template-columns: 1.125rem minmax(0, 1fr) auto;
74
+ grid-template-columns: var(
75
+ --kui-list-item-columns,
76
+ var(--kui-list-item-icon-size, 1.125rem) minmax(0, 1fr) auto
77
+ );
59
78
  }
60
79
 
61
80
  .kui-list-item[data-has-icon="true"] .kui-list-item__icon {
@@ -112,22 +131,24 @@
112
131
 
113
132
  .kui-list-item__icon {
114
133
  display: grid;
115
- width: 1.125rem;
116
- height: 1.125rem;
117
- color: currentColor;
134
+ width: var(--kui-list-item-icon-size, 1.125rem);
135
+ height: var(--kui-list-item-icon-size, 1.125rem);
136
+ color: var(--kui-list-item-icon-color, currentColor);
118
137
  place-items: center;
119
138
  }
120
139
 
121
140
  .kui-list-item__icon svg {
122
141
  display: block;
123
- width: 1.125rem;
124
- height: 1.125rem;
142
+ width: var(--kui-list-item-icon-size, 1.125rem);
143
+ height: var(--kui-list-item-icon-size, 1.125rem);
125
144
  }
126
145
 
127
146
  .kui-list-item__label {
128
147
  display: grid;
129
148
  min-width: 0;
149
+ max-width: var(--kui-list-item-label-max-width, none);
130
150
  overflow: hidden;
151
+ font-weight: var(--kui-list-item-label-weight, inherit);
131
152
  white-space: nowrap;
132
153
  }
133
154
 
@@ -175,17 +196,38 @@
175
196
 
176
197
  .kui-list-item[data-multiline="true"] .kui-list-item__icon {
177
198
  align-self: start;
178
- margin-block-start: calc((1lh - 1.125rem) / 2);
199
+ margin-block-start: calc(
200
+ (1lh - var(--kui-list-item-icon-size, 1.125rem)) / 2
201
+ );
202
+ }
203
+
204
+ .kui-list-item[data-multiline="true"][data-icon-align="center"]
205
+ .kui-list-item__icon {
206
+ align-self: center;
207
+ margin-block-start: 0;
179
208
  }
180
209
 
181
210
  .kui-list-item__trailing {
182
211
  display: inline-flex;
183
212
  min-width: 0;
213
+ color: var(--kui-list-item-trailing-color, inherit);
184
214
  align-items: center;
185
215
  justify-content: flex-end;
186
216
  gap: var(--kui-layout-item-gap, 0.5rem);
187
217
  }
188
218
 
219
+ .kui-list-item[data-state="drag-target"] {
220
+ outline: var(
221
+ --kui-list-item-drag-target-outline,
222
+ 2px solid var(--kui-color-brand-border-normal)
223
+ );
224
+ outline-offset: var(--kui-list-item-drag-target-outline-offset, -2px);
225
+ background: var(
226
+ --kui-list-item-drag-target-background,
227
+ var(--kui-color-brand-fill-quiet)
228
+ );
229
+ }
230
+
189
231
  .kui-list-item__status {
190
232
  color: var(--kui-color-neutral-on-quiet);
191
233
  font-size: var(--kui-font-xs);
@@ -14,6 +14,7 @@
14
14
  display: flex;
15
15
  min-width: 0;
16
16
  min-height: 0;
17
+ background: var(--kui-resizable-region-background, transparent);
17
18
  }
18
19
  /* As a split SplitView's list, the region's track grows by the unsafe
19
20
  inline-start inset the SplitView provides, while its committed size stays
@@ -164,7 +165,7 @@
164
165
  .kui-resizable-region[data-presentation="overlay"] {
165
166
  position: absolute;
166
167
  z-index: var(--kui-resizable-region-overlay-z, 41);
167
- background: var(--kui-color-surface);
168
+ background: var(--kui-resizable-region-background, var(--kui-color-surface));
168
169
  box-shadow: var(--kui-shadow-l);
169
170
  }
170
171
  /* Each overlay maximum caps only the resizable axis: a side overlay spans its
@@ -353,6 +354,19 @@
353
354
  )
354
355
  );
355
356
  }
357
+ .kui-resizable-region__restore[data-placement="inline"] {
358
+ position: static;
359
+ }
360
+ .kui-resizable-region__restore[data-position^="top"][data-placement="corner"] {
361
+ inset-block-end: auto;
362
+ inset-block-start: calc(
363
+ var(--_kui-resizable-region-restore-inset) +
364
+ var(
365
+ --kui-edge-inset-block-start,
366
+ var(--kui-safe-area-block-start, env(safe-area-inset-top, 0px))
367
+ )
368
+ );
369
+ }
356
370
  .kui-resizable-region__restore[data-position="bottom-start"] {
357
371
  inset-inline-start: calc(
358
372
  var(--_kui-resizable-region-restore-inset) +
@@ -362,6 +376,24 @@
362
376
  )
363
377
  );
364
378
  }
379
+ .kui-resizable-region__restore[data-position="top-start"] {
380
+ inset-inline-start: calc(
381
+ var(--_kui-resizable-region-restore-inset) +
382
+ var(
383
+ --kui-edge-inset-inline-start,
384
+ var(--kui-safe-area-inline-start, env(safe-area-inset-left, 0px))
385
+ )
386
+ );
387
+ }
388
+ .kui-resizable-region__restore[data-position="top-end"] {
389
+ inset-inline-end: calc(
390
+ var(--_kui-resizable-region-restore-inset) +
391
+ var(
392
+ --kui-edge-inset-inline-end,
393
+ var(--kui-safe-area-inline-end, env(safe-area-inset-right, 0px))
394
+ )
395
+ );
396
+ }
365
397
  .kui-resizable-region__restore[data-position="bottom-end"] {
366
398
  inset-inline-end: calc(
367
399
  var(--_kui-resizable-region-restore-inset) +
@@ -191,6 +191,17 @@
191
191
  display: inline-flex;
192
192
  min-width: 0;
193
193
  align-items: center;
194
+ overflow: hidden;
195
+ color: var(--kui-select-selected-color, inherit);
196
+ font-size: var(--kui-select-selected-font-size, inherit);
197
+ font-weight: var(--kui-select-selected-font-weight, inherit);
198
+ }
199
+ .kui-select__custom-selected-content {
200
+ display: block;
201
+ min-width: 0;
202
+ overflow: hidden;
203
+ text-overflow: ellipsis;
204
+ white-space: nowrap;
194
205
  }
195
206
  .kui-select--custom-selected::part(start) {
196
207
  min-width: 0;
@@ -291,3 +302,18 @@
291
302
  height: 100%;
292
303
  fill: currentColor;
293
304
  }
305
+
306
+ /* Explicit width policy applies to both the live control and its loading
307
+ placeholder; the presentation keeps its existing width when omitted. */
308
+ .kui-select[data-trigger-width="fill"] {
309
+ width: 100%;
310
+ max-width: var(--kui-select-trigger-max-width, 100%);
311
+ }
312
+ .kui-select[data-trigger-width="fit-content"] {
313
+ width: fit-content;
314
+ max-width: var(--kui-select-trigger-max-width, 100%);
315
+ }
316
+ .kui-select[data-trigger-width="max-content"] {
317
+ width: max-content;
318
+ max-width: var(--kui-select-trigger-max-width, 100%);
319
+ }