@kerfjs/ui 5.0.0-beta.110 → 5.0.0-beta.111

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 (158) hide show
  1. package/README.md +1 -0
  2. package/ai/component-catalog.json +9 -2
  3. package/ai/component-composition.json +8 -1
  4. package/ai/components/button.md +5 -2
  5. package/ai/components/surface-scaffold.md +3 -0
  6. package/ai/public-api-signatures-v1.md +86 -39
  7. package/ai/skill.md +4 -0
  8. package/ai/webawesome-jsx-signatures-v1.md +1 -1
  9. package/dist/backdrop-image.d.ts +8 -0
  10. package/dist/backdrop-image.js +1 -1
  11. package/dist/browser/content-item.js +1 -0
  12. package/dist/button.d.ts +4 -2
  13. package/dist/button.js +1 -1
  14. package/dist/catalog-resources.d.ts +2 -1
  15. package/dist/catalog.d.ts +2 -1
  16. package/dist/catalog.js +2 -1
  17. package/dist/catalog.js.map +1 -1
  18. package/dist/{chunk-P7EJ4CAD.js → chunk-ETFP7HAR.js} +2 -2
  19. package/dist/{chunk-P7EJ4CAD.js.map → chunk-ETFP7HAR.js.map} +1 -1
  20. package/dist/{chunk-SOFPUW3O.js → chunk-IIQ2XIMU.js} +4 -3
  21. package/dist/chunk-IIQ2XIMU.js.map +1 -0
  22. package/dist/chunk-IRC5N7FA.js +16 -0
  23. package/dist/chunk-IRC5N7FA.js.map +1 -0
  24. package/dist/{chunk-SQ5DH66U.js → chunk-ITENVZ6Q.js} +2 -15
  25. package/dist/chunk-ITENVZ6Q.js.map +1 -0
  26. package/dist/{chunk-WSEJ2FDE.js → chunk-OUCHU7JB.js} +2 -2
  27. package/dist/{chunk-WSEJ2FDE.js.map → chunk-OUCHU7JB.js.map} +1 -1
  28. package/dist/{chunk-KPINJHIC.js → chunk-PS24PVR6.js} +3 -1
  29. package/dist/chunk-PS24PVR6.js.map +1 -0
  30. package/dist/{chunk-SCDWURBO.js → chunk-SOBRGH7T.js} +18 -3
  31. package/dist/chunk-SOBRGH7T.js.map +1 -0
  32. package/dist/{chunk-6CDILXF4.js → chunk-VGECEXM6.js} +11 -2
  33. package/dist/chunk-VGECEXM6.js.map +1 -0
  34. package/dist/chunk-WD6KABEU.js +200 -0
  35. package/dist/chunk-WD6KABEU.js.map +1 -0
  36. package/dist/{chunk-HQZG3OFL.js → chunk-XRZSK2WC.js} +3 -2
  37. package/dist/chunk-XRZSK2WC.js.map +1 -0
  38. package/dist/{chunk-CPSGUGAY.js → chunk-YPAQFBMN.js} +4 -4
  39. package/dist/{chunk-CPSGUGAY.js.map → chunk-YPAQFBMN.js.map} +1 -1
  40. package/dist/collapsible-panel.d.ts +1 -0
  41. package/dist/collapsible-panel.js +3 -2
  42. package/dist/collapsible-panel.js.map +1 -1
  43. package/dist/content-item.d.ts +44 -2
  44. package/dist/content-item.js +4 -1
  45. package/dist/index.d.ts +3 -2
  46. package/dist/index.js +6 -5
  47. package/dist/list-detail-dialog.d.ts +2 -1
  48. package/dist/list-detail-dialog.js +4 -3
  49. package/dist/list-detail-dialog.js.map +1 -1
  50. package/dist/{nav-stack-CU_0dKtI.d.ts → nav-stack-CrZF95VO.d.ts} +2 -1
  51. package/dist/nav-stack.d.ts +2 -1
  52. package/dist/nav-stack.js +2 -1
  53. package/dist/pane.d.ts +3 -23
  54. package/dist/pane.js +2 -1
  55. package/dist/split-view.d.ts +2 -1
  56. package/dist/split-view.js +2 -1
  57. package/dist/styles/backdrop-image.css +18 -1
  58. package/dist/styles/components/surfaces/backdrop-image/backdrop-image.css +18 -1
  59. package/dist/styles/components/surfaces/content-item/content-item.css +52 -0
  60. package/dist/styles/components/surfaces/surface-scaffold/surface-scaffold.css +9 -1
  61. package/dist/styles/content-item.css +3 -168
  62. package/dist/styles/foundation.css +4 -4
  63. package/dist/styles/surface-scaffold.css +9 -1
  64. package/dist/styles/webawesome.css +2 -2
  65. package/dist/surface-scaffold.d.ts +6 -2
  66. package/dist/surface-scaffold.js +1 -1
  67. package/dist/surface-tint-DQgYCaP9.d.ts +25 -0
  68. package/dist/tab-navigator.d.ts +2 -1
  69. package/dist/tab-navigator.js +2 -1
  70. package/dist/tab-navigator.js.map +1 -1
  71. package/dist/toolbar.d.ts +1 -0
  72. package/dist/wire-catalog.d.ts +2 -1
  73. package/dist/wire-content-items.js +62 -0
  74. package/dist/wire-content-items.js.map +1 -1
  75. package/dist/workbench-dialog.d.ts +2 -1
  76. package/dist/workbench-dialog.js +3 -2
  77. package/dist/workbench-dialog.js.map +1 -1
  78. package/dist/workbench.d.ts +2 -1
  79. package/dist/workbench.js +2 -1
  80. package/docs/accessibility.md +6 -0
  81. package/docs/backdrop-image.md +4 -0
  82. package/docs/button.md +15 -0
  83. package/docs/component-contract.md +7 -0
  84. package/docs/component-selection.md +1 -1
  85. package/docs/design/templates/button/emphasis-dark.svg +1 -1
  86. package/docs/design/templates/button-dark.svg +1 -1
  87. package/docs/design/templates/checkbox/error-dark.svg +1 -1
  88. package/docs/design/templates/checkbox/states.svg +1 -1
  89. package/docs/design/templates/checkbox-dark.svg +1 -1
  90. package/docs/design/templates/checkbox-group/horizontal-dark.svg +1 -1
  91. package/docs/design/templates/checkbox-group/vertical.svg +1 -1
  92. package/docs/design/templates/checkbox-group-dark.svg +1 -1
  93. package/docs/design/templates/checkbox-group.svg +1 -1
  94. package/docs/design/templates/checkbox.svg +1 -1
  95. package/docs/design/templates/choice-chips/color-palette-dark.svg +1 -1
  96. package/docs/design/templates/choice-chips-dark.svg +1 -1
  97. package/docs/design/templates/color-field/error-dark.svg +1 -1
  98. package/docs/design/templates/color-field/hint.svg +1 -1
  99. package/docs/design/templates/color-field-dark.svg +1 -1
  100. package/docs/design/templates/color-field.svg +1 -1
  101. package/docs/design/templates/color-picker/gray.svg +1 -1
  102. package/docs/design/templates/color-picker/hsb.svg +1 -1
  103. package/docs/design/templates/color-picker/rgb.svg +1 -1
  104. package/docs/design/templates/color-picker.svg +1 -1
  105. package/docs/design/templates/color-swatches/palette-dark.svg +1 -1
  106. package/docs/design/templates/color-swatches-dark.svg +1 -1
  107. package/docs/design/templates/disclosure/embedded.svg +1 -1
  108. package/docs/design/templates/disclosure/framed-sunken.svg +1 -1
  109. package/docs/design/templates/disclosure/plain.svg +1 -1
  110. package/docs/design/templates/disclosure.svg +1 -1
  111. package/docs/design/templates/message-composer/chat.svg +1 -1
  112. package/docs/design/templates/message-composer.svg +1 -1
  113. package/docs/design/templates/progress-bar/determinate.svg +1 -1
  114. package/docs/design/templates/progress-bar/tones.svg +1 -1
  115. package/docs/design/templates/progress-bar.svg +1 -1
  116. package/docs/design/templates/radio-group/horizontal-dark.svg +1 -1
  117. package/docs/design/templates/radio-group/vertical.svg +1 -1
  118. package/docs/design/templates/radio-group-dark.svg +1 -1
  119. package/docs/design/templates/radio-group.svg +1 -1
  120. package/docs/design/templates/search-field/empty.svg +1 -1
  121. package/docs/design/templates/search-field/tokens.svg +1 -1
  122. package/docs/design/templates/search-field.svg +1 -1
  123. package/docs/design/templates/select/form.svg +1 -1
  124. package/docs/design/templates/select.svg +1 -1
  125. package/docs/design/templates/slider/compact.svg +1 -1
  126. package/docs/design/templates/slider/readout.svg +1 -1
  127. package/docs/design/templates/slider/ticks.svg +1 -1
  128. package/docs/design/templates/slider.svg +1 -1
  129. package/docs/design/templates/switch/states.svg +1 -1
  130. package/docs/design/templates/switch.svg +1 -1
  131. package/docs/design/templates/tag-field/error-dark.svg +1 -1
  132. package/docs/design/templates/tag-field/error.svg +1 -1
  133. package/docs/design/templates/tag-field/tags.svg +1 -1
  134. package/docs/design/templates/tag-field-dark.svg +1 -1
  135. package/docs/design/templates/tag-field.svg +1 -1
  136. package/docs/design/templates/text-field/error-dark.svg +1 -1
  137. package/docs/design/templates/text-field/labeled.svg +1 -1
  138. package/docs/design/templates/text-field/multiline.svg +1 -1
  139. package/docs/design/templates/text-field/search.svg +1 -1
  140. package/docs/design/templates/text-field-dark.svg +1 -1
  141. package/docs/design/templates/text-field.svg +1 -1
  142. package/docs/design/templates/toolbar-control-group/icon-tile-danger-dark.svg +1 -1
  143. package/docs/design/templates/toolbar-control-group-dark.svg +1 -1
  144. package/docs/design/templates.md +3 -1
  145. package/docs/layout.md +25 -0
  146. package/docs/manual-test-plan.md +27 -1
  147. package/docs/recipes.md +9 -0
  148. package/docs/surface-scaffold.md +4 -1
  149. package/llms.txt +3 -0
  150. package/package.json +1 -1
  151. package/dist/chunk-5USKCWGL.js +0 -113
  152. package/dist/chunk-5USKCWGL.js.map +0 -1
  153. package/dist/chunk-6CDILXF4.js.map +0 -1
  154. package/dist/chunk-HQZG3OFL.js.map +0 -1
  155. package/dist/chunk-KPINJHIC.js.map +0 -1
  156. package/dist/chunk-SCDWURBO.js.map +0 -1
  157. package/dist/chunk-SOFPUW3O.js.map +0 -1
  158. package/dist/chunk-SQ5DH66U.js.map +0 -1
package/dist/index.js CHANGED
@@ -30,7 +30,7 @@ export { Select } from './chunk-ZX2QQJXD.js';
30
30
  export { applySelection, isApplePlatform, selectionGesture } from './chunk-GXSX6Q6O.js';
31
31
  export { MessageComposer } from './chunk-4OV272LF.js';
32
32
  export { RadioGroup } from './chunk-OHPYT2BH.js';
33
- export { DialogSurface, PopoverDialogSurface, PopupSurface } from './chunk-6CDILXF4.js';
33
+ export { DialogSurface, PopoverDialogSurface, PopupSurface } from './chunk-VGECEXM6.js';
34
34
  export { closeDialog, openDialog } from './chunk-ATGAJVZ6.js';
35
35
 
36
36
  export { EmptyState } from './chunk-B53PS2LE.js';
@@ -39,7 +39,7 @@ export { FramedList, FramedListRow } from './chunk-S2XULQEK.js';
39
39
  export { Grid } from './chunk-KCS6NJ3O.js';
40
40
 
41
41
  export { ListActionRow } from './chunk-JCCN3U6X.js';
42
- export { ContentItem } from './chunk-5USKCWGL.js';
42
+ export { ContentItem } from './chunk-WD6KABEU.js';
43
43
  export { ContentSwap } from './chunk-EIET4QLK.js';
44
44
  export { CornerStatus } from './chunk-G3J7JDP6.js';
45
45
  export { EdgeActivityIndicator } from './chunk-QH5KOFNS.js';
@@ -48,8 +48,8 @@ export { ChoiceChips } from './chunk-ITUQC4FW.js';
48
48
  export { ColumnTrack } from './chunk-QYMJHS4K.js';
49
49
  export { Combobox } from './chunk-BKUMG2KB.js';
50
50
  export { openAnchoredSurface, openAnchoredSurfaceAt } from './chunk-3WYREXW4.js';
51
- export { BackdropImage } from './chunk-SCDWURBO.js';
52
- export { Button } from './chunk-KPINJHIC.js';
51
+ export { BackdropImage } from './chunk-SOBRGH7T.js';
52
+ export { Button } from './chunk-PS24PVR6.js';
53
53
  export { Switch } from './chunk-LTBVP6VN.js';
54
54
  export { Row } from './chunk-AMIHGFLP.js';
55
55
  export { SearchField, placeSearchFieldCaret, readSearchField } from './chunk-VEME3D7K.js';
@@ -69,12 +69,13 @@ export { Skeleton } from './chunk-CVD5IZGB.js';
69
69
  export { DisclosureArrow } from './chunk-TKNVL53O.js';
70
70
  export { ToolbarActionLink, ToolbarControlGroup } from './chunk-5J6Z4BWY.js';
71
71
  export { Toolbar } from './chunk-ZN7KUMPY.js';
72
- export { Pane } from './chunk-HQZG3OFL.js';
72
+ export { Pane } from './chunk-XRZSK2WC.js';
73
73
 
74
74
  export { ensureSunkenTexture } from './chunk-IKS72C6P.js';
75
75
  export { List } from './chunk-NB6POCFH.js';
76
76
 
77
77
 
78
+
78
79
  export { LoadingSpinner } from './chunk-WVS6CUCT.js';
79
80
  export { Badge } from './chunk-RMWNO6BA.js';
80
81
  export { CheckboxGroup } from './chunk-HU5IHXCI.js';
@@ -4,9 +4,10 @@ import { CssLength } from './css-values.js';
4
4
  import { SplitViewListWidth } from './split-view.js';
5
5
  import { DialogSurfaceSize, DialogSurfaceHeight, DialogSurfaceMaxHeight, DialogSurfaceRootAttributes } from './surface-scaffold.js';
6
6
  export { DialogCloseSource, DialogRequestCloseDetail, closeDialog, openDialog } from './surface-scaffold.js';
7
- import './nav-stack-CU_0dKtI.js';
7
+ import './nav-stack-CrZF95VO.js';
8
8
  import './pane.js';
9
9
  import './scroll-clearance-BikHljTc.js';
10
+ import './surface-tint-DQgYCaP9.js';
10
11
  import './list.js';
11
12
  import './extension-attributes-mu8MFUl0.js';
12
13
  import './flex-alignment-4ms8ZbV8.js';
@@ -1,5 +1,5 @@
1
- import { SplitView } from './chunk-P7EJ4CAD.js';
2
- import { DialogSurface } from './chunk-6CDILXF4.js';
1
+ import { SplitView } from './chunk-ETFP7HAR.js';
2
+ import { DialogSurface } from './chunk-VGECEXM6.js';
3
3
  export { closeDialog, openDialog } from './chunk-ATGAJVZ6.js';
4
4
 
5
5
 
@@ -9,7 +9,8 @@ import { ToolbarText } from './chunk-EKHDLBRP.js';
9
9
 
10
10
  import { ToolbarControlGroup } from './chunk-5J6Z4BWY.js';
11
11
  import { Toolbar } from './chunk-ZN7KUMPY.js';
12
- import { Pane } from './chunk-HQZG3OFL.js';
12
+ import { Pane } from './chunk-XRZSK2WC.js';
13
+
13
14
 
14
15
 
15
16
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/surfaces/list-detail-dialog/list-detail-dialog.tsx"],"names":[],"mappings":"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","file":"list-detail-dialog.js","sourcesContent":["import { X } from 'lucide';\n\nimport type { KerfUiContent } from '../../../shared/content/semantic-content.js';\nimport type { CssLength } from '../../../shared/styles/css-values.js';\nimport { remify } from '../../../shared/styles/css-values.js';\nimport { Toolbar } from '../../actions/toolbar/toolbar.js';\nimport { ToolbarControlGroup } from '../../actions/toolbar-control-group/toolbar-control-group.js';\nimport { ToolbarText } from '../../actions/toolbar-text/toolbar-text.js';\nimport { Pane } from '../../layout/pane/pane.js';\nimport {\n SplitView,\n type SplitViewListWidth,\n} from '../../layout/split-view/split-view.js';\nimport { LucideIcon } from '../../media/lucide-icon/lucide-icon.js';\nimport {\n DialogSurface,\n type DialogSurfaceHeight,\n type DialogSurfaceMaxHeight,\n type DialogSurfaceRootAttributes,\n type DialogSurfaceSize,\n} from '../surface-scaffold/surface-scaffold.js';\n\n// Open and close it like any DialogSurface, from the same import.\nexport {\n closeDialog,\n type DialogCloseSource,\n type DialogRequestCloseDetail,\n openDialog,\n} from '../surface-scaffold/surface-scaffold.js';\n\n/** The list column: a secondary title, its own controls, and the list. */\nexport interface ListDetailDialogList {\n /**\n * The column's title, at the default toolbar size so it reads as pane\n * identity beside the detail's primary title. On compact devices it titles\n * the root view.\n */\n title: string;\n /** Controls after the title in the column's header, such as a `ToolbarControlGroup`. */\n toolbar?: KerfUiContent;\n /** The list, usually a `List` of selectable `ListItem`s. */\n content: KerfUiContent;\n /** Content pinned below the list, such as an add control. */\n footer?: KerfUiContent;\n /**\n * The column's width on roomy devices (default 280px, at most 40% of the\n * dialog's width).\n */\n width?: SplitViewListWidth;\n}\n\n/** The detail column: the dialog's primary title, actions, and close control. */\nexport interface ListDetailDialogDetail {\n /**\n * The dialog's primary title: an xl heading at the top of the detail\n * column on roomy devices, and the pushed view's title on compact devices.\n */\n title: string;\n /** A short supporting line under the roomy title. */\n description?: string;\n /**\n * Header controls before the close control, such as a\n * `ToolbarControlGroup`. Primary record actions usually go in `footer`.\n */\n actions?: KerfUiContent;\n /** The selected item's detail. */\n content: KerfUiContent;\n /** Content pinned below the detail, usually its buttons. */\n footer?: KerfUiContent;\n}\n\n/**\n * Application `data-*` identity on the dialog root, such as `data-key`; the\n * dialog's own configuration attributes stay protected.\n */\nexport type ListDetailDialogRootAttributes = DialogSurfaceRootAttributes;\n\nexport interface ListDetailDialogProps {\n /**\n * The dialog's id, for `openDialog(document.getElementById(id))`. Also\n * prefixes the ids of the split and the detail title.\n */\n id: string;\n /** The dialog's accessible name. */\n label: string;\n /**\n * Id of the element whose text is the dialog's accessible description,\n * such as app-owned summary copy. The detail's `description` describes the\n * selection, not the dialog, so it is not wired automatically.\n */\n describedBy?: string;\n list: ListDetailDialogList;\n detail: ListDetailDialogDetail;\n /**\n * One pane at a time: derive from `deviceClass().value.compact`. The dialog\n * fills the screen and drills from the list into the detail as a\n * `NavStack`; every view keeps the close control.\n */\n compact?: boolean;\n /** On compact devices, whether the detail is pushed over the list. */\n detailActive?: boolean;\n /** The compact back control's accessible name (default `Back`). */\n backLabel?: string;\n /** The close control's accessible name (default `Close`). */\n closeLabel?: string;\n /** Close on a press on the backdrop; otherwise the panel pulses. */\n lightDismiss?: boolean;\n /** Roomy preferred width preset (default `large`). */\n size?: DialogSurfaceSize;\n /** Roomy preferred width; takes precedence over `size`. */\n preferredWidth?: CssLength;\n /** Roomy definite height (default 560px), bounded by the viewport. */\n height?: DialogSurfaceHeight;\n /** Roomy height cap in place of a definite height. */\n maxHeight?: DialogSurfaceMaxHeight;\n /** Roomy edge clearance from the viewport. */\n viewportGutter?: CssLength;\n rootAttributes?: ListDetailDialogRootAttributes;\n className?: string;\n /** Native named-slot assignment when composed inside a web component. */\n slot?: string;\n}\n\nconst DEFAULT_LIST_WIDTH: SplitViewListWidth = { size: 280, maxFraction: 0.4 };\n\nfunction closeGroup(closeLabel: string) {\n return (\n <ToolbarControlGroup appearance=\"borderless\" single>\n <button type=\"button\" aria-label={closeLabel} data-dialog-close=\"\">\n <LucideIcon icon={X} name=\"x\" />\n </button>\n </ToolbarControlGroup>\n );\n}\n\n/**\n * A list-detail dialog: a modal whose list column and detail column each run\n * its full height. The list column carries a secondary title and its own\n * controls; the detail column carries the dialog's primary title, its\n * actions, and the close control, so the divider between them runs from top\n * to bottom. On compact devices it fills the screen and becomes a `NavStack`\n * that drills from the list into the detail. Open it with `openDialog()`;\n * the app owns the selection and, on compact devices, `detailActive` (the\n * stack's back control dispatches `nav-back`). Built from `DialogSurface`,\n * `SplitView`, and `Pane`.\n */\nexport function ListDetailDialog({\n id,\n label,\n describedBy,\n list,\n detail,\n compact = false,\n detailActive = false,\n backLabel = 'Back',\n closeLabel = 'Close',\n lightDismiss = false,\n size = 'large',\n preferredWidth,\n height,\n maxHeight,\n viewportGutter,\n rootAttributes,\n className = '',\n slot,\n}: ListDetailDialogProps) {\n const close = closeGroup(closeLabel);\n const split = compact ? (\n <SplitView\n id={`${id}-split`}\n label={label}\n compact\n detailActive={detailActive}\n listTitle={list.title}\n detailTitle={detail.title}\n backLabel={backLabel}\n compactStack={{\n list: {\n toolbar: {\n trailing: (\n <>\n {list.toolbar}\n {close}\n </>\n ),\n },\n footer: list.footer,\n },\n detail: {\n toolbar: {\n trailing: (\n <>\n {detail.actions}\n {close}\n </>\n ),\n },\n footer: detail.footer,\n },\n }}\n list={list.content}\n detail={detail.content}\n />\n ) : (\n <SplitView\n id={`${id}-split`}\n label={label}\n listTitle={list.title}\n detailTitle={detail.title}\n listWidth={list.width ?? DEFAULT_LIST_WIDTH}\n list={\n <Pane\n label={list.title}\n header={\n <Toolbar\n label={list.title}\n leading={<ToolbarText text={list.title} />}\n trailing={list.toolbar}\n />\n }\n footer={list.footer}\n >\n {list.content}\n </Pane>\n }\n detail={\n <Pane\n label={detail.title}\n header={\n <Toolbar\n label={detail.title}\n leading={\n <ToolbarText\n text={detail.title}\n description={detail.description}\n size=\"xlarge\"\n id={`${id}-title`}\n headingLevel={2}\n />\n }\n trailing={\n <>\n {detail.actions}\n {close}\n </>\n }\n />\n }\n footer={detail.footer}\n >\n {detail.content}\n </Pane>\n }\n />\n );\n return (\n <DialogSurface\n id={id}\n label={label}\n describedBy={describedBy}\n withoutHeader\n lightDismiss={lightDismiss}\n closeLabel={closeLabel}\n size={size}\n presentation={compact ? 'fullscreen' : 'modal'}\n preferredWidth={preferredWidth}\n height={\n compact\n ? undefined\n : maxHeight === undefined\n ? (height ?? remify(560))\n : height\n }\n maxHeight={compact ? undefined : maxHeight}\n viewportGutter={compact ? undefined : viewportGutter}\n bodyInset=\"none\"\n bodyLayout=\"fill\"\n rootAttributes={{\n ...rootAttributes,\n 'data-dialog-layout': 'list-detail',\n }}\n className={className}\n slot={slot}\n >\n {split}\n </DialogSurface>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/components/surfaces/list-detail-dialog/list-detail-dialog.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AA2HA,IAAM,kBAAA,GAAyC,EAAE,IAAA,EAAM,GAAA,EAAK,aAAa,GAAA,EAAI;AAE7E,SAAS,WAAW,UAAA,EAAoB;AACtC,EAAA,uBACE,GAAA,CAAC,uBAAoB,UAAA,EAAW,YAAA,EAAa,QAAM,IAAA,EACjD,QAAA,kBAAA,GAAA,CAAC,YAAO,IAAA,EAAK,QAAA,EAAS,cAAY,UAAA,EAAY,mBAAA,EAAkB,IAC9D,QAAA,kBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,MAAM,CAAA,EAAG,IAAA,EAAK,GAAA,EAAI,CAAA,EAChC,CAAA,EACF,CAAA;AAEJ;AAaO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,EAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA,GAAU,KAAA;AAAA,EACV,YAAA,GAAe,KAAA;AAAA,EACf,SAAA,GAAY,MAAA;AAAA,EACZ,UAAA,GAAa,OAAA;AAAA,EACb,YAAA,GAAe,KAAA;AAAA,EACf,IAAA,GAAO,OAAA;AAAA,EACP,cAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ;AACF,CAAA,EAA0B;AACxB,EAAA,MAAM,KAAA,GAAQ,WAAW,UAAU,CAAA;AACnC,EAAA,MAAM,QAAQ,OAAA,mBACZ,GAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,EAAA,EAAI,GAAG,EAAE,CAAA,MAAA,CAAA;AAAA,MACT,KAAA;AAAA,MACA,OAAA,EAAO,IAAA;AAAA,MACP,YAAA;AAAA,MACA,WAAW,IAAA,CAAK,KAAA;AAAA,MAChB,aAAa,MAAA,CAAO,KAAA;AAAA,MACpB,SAAA;AAAA,MACA,YAAA,EAAc;AAAA,QACZ,IAAA,EAAM;AAAA,UACJ,OAAA,EAAS;AAAA,YACP,0BACE,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,cAAA,IAAA,CAAK,OAAA;AAAA,cACL;AAAA,aAAA,EACH;AAAA,WAEJ;AAAA,UACA,QAAQ,IAAA,CAAK;AAAA,SACf;AAAA,QACA,MAAA,EAAQ;AAAA,UACN,OAAA,EAAS;AAAA,YACP,0BACE,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,cAAA,MAAA,CAAO,OAAA;AAAA,cACP;AAAA,aAAA,EACH;AAAA,WAEJ;AAAA,UACA,QAAQ,MAAA,CAAO;AAAA;AACjB,OACF;AAAA,MACA,MAAM,IAAA,CAAK,OAAA;AAAA,MACX,QAAQ,MAAA,CAAO;AAAA;AAAA,GACjB,mBAEA,GAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,EAAA,EAAI,GAAG,EAAE,CAAA,MAAA,CAAA;AAAA,MACT,KAAA;AAAA,MACA,WAAW,IAAA,CAAK,KAAA;AAAA,MAChB,aAAa,MAAA,CAAO,KAAA;AAAA,MACpB,SAAA,EAAW,KAAK,KAAA,IAAS,kBAAA;AAAA,MACzB,IAAA,kBACE,GAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UACC,OAAO,IAAA,CAAK,KAAA;AAAA,UACZ,MAAA,kBACE,GAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,OAAO,IAAA,CAAK,KAAA;AAAA,cACZ,OAAA,kBAAS,GAAA,CAAC,WAAA,EAAA,EAAY,IAAA,EAAM,KAAK,KAAA,EAAO,CAAA;AAAA,cACxC,UAAU,IAAA,CAAK;AAAA;AAAA,WACjB;AAAA,UAEF,QAAQ,IAAA,CAAK,MAAA;AAAA,UAEZ,QAAA,EAAA,IAAA,CAAK;AAAA;AAAA,OACR;AAAA,MAEF,MAAA,kBACE,GAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UACC,OAAO,MAAA,CAAO,KAAA;AAAA,UACd,MAAA,kBACE,GAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,OAAO,MAAA,CAAO,KAAA;AAAA,cACd,OAAA,kBACE,GAAA;AAAA,gBAAC,WAAA;AAAA,gBAAA;AAAA,kBACC,MAAM,MAAA,CAAO,KAAA;AAAA,kBACb,aAAa,MAAA,CAAO,WAAA;AAAA,kBACpB,IAAA,EAAK,QAAA;AAAA,kBACL,EAAA,EAAI,GAAG,EAAE,CAAA,MAAA,CAAA;AAAA,kBACT,YAAA,EAAc;AAAA;AAAA,eAChB;AAAA,cAEF,0BACE,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,gBAAA,MAAA,CAAO,OAAA;AAAA,gBACP;AAAA,eAAA,EACH;AAAA;AAAA,WAEJ;AAAA,UAEF,QAAQ,MAAA,CAAO,MAAA;AAAA,UAEd,QAAA,EAAA,MAAA,CAAO;AAAA;AAAA;AACV;AAAA,GAEJ;AAEF,EAAA,uBACE,GAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACC,EAAA;AAAA,MACA,KAAA;AAAA,MACA,WAAA;AAAA,MACA,aAAA,EAAa,IAAA;AAAA,MACb,YAAA;AAAA,MACA,UAAA;AAAA,MACA,IAAA;AAAA,MACA,YAAA,EAAc,UAAU,YAAA,GAAe,OAAA;AAAA,MACvC,cAAA;AAAA,MACA,MAAA,EACE,UACI,MAAA,GACA,SAAA,KAAc,SACX,MAAA,IAAU,MAAA,CAAO,GAAG,CAAA,GACrB,MAAA;AAAA,MAER,SAAA,EAAW,UAAU,MAAA,GAAY,SAAA;AAAA,MACjC,cAAA,EAAgB,UAAU,MAAA,GAAY,cAAA;AAAA,MACtC,SAAA,EAAU,MAAA;AAAA,MACV,UAAA,EAAW,MAAA;AAAA,MACX,cAAA,EAAgB;AAAA,QACd,GAAG,cAAA;AAAA,QACH,oBAAA,EAAsB;AAAA,OACxB;AAAA,MACA,SAAA;AAAA,MACA,IAAA;AAAA,MAEC,QAAA,EAAA;AAAA;AAAA,GACH;AAEJ","file":"list-detail-dialog.js","sourcesContent":["import { X } from 'lucide';\n\nimport type { KerfUiContent } from '../../../shared/content/semantic-content.js';\nimport type { CssLength } from '../../../shared/styles/css-values.js';\nimport { remify } from '../../../shared/styles/css-values.js';\nimport { Toolbar } from '../../actions/toolbar/toolbar.js';\nimport { ToolbarControlGroup } from '../../actions/toolbar-control-group/toolbar-control-group.js';\nimport { ToolbarText } from '../../actions/toolbar-text/toolbar-text.js';\nimport { Pane } from '../../layout/pane/pane.js';\nimport {\n SplitView,\n type SplitViewListWidth,\n} from '../../layout/split-view/split-view.js';\nimport { LucideIcon } from '../../media/lucide-icon/lucide-icon.js';\nimport {\n DialogSurface,\n type DialogSurfaceHeight,\n type DialogSurfaceMaxHeight,\n type DialogSurfaceRootAttributes,\n type DialogSurfaceSize,\n} from '../surface-scaffold/surface-scaffold.js';\n\n// Open and close it like any DialogSurface, from the same import.\nexport {\n closeDialog,\n type DialogCloseSource,\n type DialogRequestCloseDetail,\n openDialog,\n} from '../surface-scaffold/surface-scaffold.js';\n\n/** The list column: a secondary title, its own controls, and the list. */\nexport interface ListDetailDialogList {\n /**\n * The column's title, at the default toolbar size so it reads as pane\n * identity beside the detail's primary title. On compact devices it titles\n * the root view.\n */\n title: string;\n /** Controls after the title in the column's header, such as a `ToolbarControlGroup`. */\n toolbar?: KerfUiContent;\n /** The list, usually a `List` of selectable `ListItem`s. */\n content: KerfUiContent;\n /** Content pinned below the list, such as an add control. */\n footer?: KerfUiContent;\n /**\n * The column's width on roomy devices (default 280px, at most 40% of the\n * dialog's width).\n */\n width?: SplitViewListWidth;\n}\n\n/** The detail column: the dialog's primary title, actions, and close control. */\nexport interface ListDetailDialogDetail {\n /**\n * The dialog's primary title: an xl heading at the top of the detail\n * column on roomy devices, and the pushed view's title on compact devices.\n */\n title: string;\n /** A short supporting line under the roomy title. */\n description?: string;\n /**\n * Header controls before the close control, such as a\n * `ToolbarControlGroup`. Primary record actions usually go in `footer`.\n */\n actions?: KerfUiContent;\n /** The selected item's detail. */\n content: KerfUiContent;\n /** Content pinned below the detail, usually its buttons. */\n footer?: KerfUiContent;\n}\n\n/**\n * Application `data-*` identity on the dialog root, such as `data-key`; the\n * dialog's own configuration attributes stay protected.\n */\nexport type ListDetailDialogRootAttributes = DialogSurfaceRootAttributes;\n\nexport interface ListDetailDialogProps {\n /**\n * The dialog's id, for `openDialog(document.getElementById(id))`. Also\n * prefixes the ids of the split and the detail title.\n */\n id: string;\n /** The dialog's accessible name. */\n label: string;\n /**\n * Id of the element whose text is the dialog's accessible description,\n * such as app-owned summary copy. The detail's `description` describes the\n * selection, not the dialog, so it is not wired automatically.\n */\n describedBy?: string;\n list: ListDetailDialogList;\n detail: ListDetailDialogDetail;\n /**\n * One pane at a time: derive from `deviceClass().value.compact`. The dialog\n * fills the screen and drills from the list into the detail as a\n * `NavStack`; every view keeps the close control.\n */\n compact?: boolean;\n /** On compact devices, whether the detail is pushed over the list. */\n detailActive?: boolean;\n /** The compact back control's accessible name (default `Back`). */\n backLabel?: string;\n /** The close control's accessible name (default `Close`). */\n closeLabel?: string;\n /** Close on a press on the backdrop; otherwise the panel pulses. */\n lightDismiss?: boolean;\n /** Roomy preferred width preset (default `large`). */\n size?: DialogSurfaceSize;\n /** Roomy preferred width; takes precedence over `size`. */\n preferredWidth?: CssLength;\n /** Roomy definite height (default 560px), bounded by the viewport. */\n height?: DialogSurfaceHeight;\n /** Roomy height cap in place of a definite height. */\n maxHeight?: DialogSurfaceMaxHeight;\n /** Roomy edge clearance from the viewport. */\n viewportGutter?: CssLength;\n rootAttributes?: ListDetailDialogRootAttributes;\n className?: string;\n /** Native named-slot assignment when composed inside a web component. */\n slot?: string;\n}\n\nconst DEFAULT_LIST_WIDTH: SplitViewListWidth = { size: 280, maxFraction: 0.4 };\n\nfunction closeGroup(closeLabel: string) {\n return (\n <ToolbarControlGroup appearance=\"borderless\" single>\n <button type=\"button\" aria-label={closeLabel} data-dialog-close=\"\">\n <LucideIcon icon={X} name=\"x\" />\n </button>\n </ToolbarControlGroup>\n );\n}\n\n/**\n * A list-detail dialog: a modal whose list column and detail column each run\n * its full height. The list column carries a secondary title and its own\n * controls; the detail column carries the dialog's primary title, its\n * actions, and the close control, so the divider between them runs from top\n * to bottom. On compact devices it fills the screen and becomes a `NavStack`\n * that drills from the list into the detail. Open it with `openDialog()`;\n * the app owns the selection and, on compact devices, `detailActive` (the\n * stack's back control dispatches `nav-back`). Built from `DialogSurface`,\n * `SplitView`, and `Pane`.\n */\nexport function ListDetailDialog({\n id,\n label,\n describedBy,\n list,\n detail,\n compact = false,\n detailActive = false,\n backLabel = 'Back',\n closeLabel = 'Close',\n lightDismiss = false,\n size = 'large',\n preferredWidth,\n height,\n maxHeight,\n viewportGutter,\n rootAttributes,\n className = '',\n slot,\n}: ListDetailDialogProps) {\n const close = closeGroup(closeLabel);\n const split = compact ? (\n <SplitView\n id={`${id}-split`}\n label={label}\n compact\n detailActive={detailActive}\n listTitle={list.title}\n detailTitle={detail.title}\n backLabel={backLabel}\n compactStack={{\n list: {\n toolbar: {\n trailing: (\n <>\n {list.toolbar}\n {close}\n </>\n ),\n },\n footer: list.footer,\n },\n detail: {\n toolbar: {\n trailing: (\n <>\n {detail.actions}\n {close}\n </>\n ),\n },\n footer: detail.footer,\n },\n }}\n list={list.content}\n detail={detail.content}\n />\n ) : (\n <SplitView\n id={`${id}-split`}\n label={label}\n listTitle={list.title}\n detailTitle={detail.title}\n listWidth={list.width ?? DEFAULT_LIST_WIDTH}\n list={\n <Pane\n label={list.title}\n header={\n <Toolbar\n label={list.title}\n leading={<ToolbarText text={list.title} />}\n trailing={list.toolbar}\n />\n }\n footer={list.footer}\n >\n {list.content}\n </Pane>\n }\n detail={\n <Pane\n label={detail.title}\n header={\n <Toolbar\n label={detail.title}\n leading={\n <ToolbarText\n text={detail.title}\n description={detail.description}\n size=\"xlarge\"\n id={`${id}-title`}\n headingLevel={2}\n />\n }\n trailing={\n <>\n {detail.actions}\n {close}\n </>\n }\n />\n }\n footer={detail.footer}\n >\n {detail.content}\n </Pane>\n }\n />\n );\n return (\n <DialogSurface\n id={id}\n label={label}\n describedBy={describedBy}\n withoutHeader\n lightDismiss={lightDismiss}\n closeLabel={closeLabel}\n size={size}\n presentation={compact ? 'fullscreen' : 'modal'}\n preferredWidth={preferredWidth}\n height={\n compact\n ? undefined\n : maxHeight === undefined\n ? (height ?? remify(560))\n : height\n }\n maxHeight={compact ? undefined : maxHeight}\n viewportGutter={compact ? undefined : viewportGutter}\n bodyInset=\"none\"\n bodyLayout=\"fill\"\n rootAttributes={{\n ...rootAttributes,\n 'data-dialog-layout': 'list-detail',\n }}\n className={className}\n slot={slot}\n >\n {split}\n </DialogSurface>\n );\n}\n"]}
@@ -1,9 +1,10 @@
1
1
  import * as kerfjs from 'kerfjs';
2
2
  import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
3
- import { PaneConfig, ScrollEdge, SurfaceTint } from './pane.js';
3
+ import { PaneConfig, ScrollEdge } from './pane.js';
4
4
  import { ListConfig } from './list.js';
5
5
  import { c as PanelBottomToolbar } from './panel-toolbar-vg6Ir5Dy.js';
6
6
  import { CssColor } from './css-values.js';
7
+ import { S as SurfaceTint } from './surface-tint-DQgYCaP9.js';
7
8
  import { ToolbarConfig } from './toolbar.js';
8
9
  import { ToolbarTextSize, HeadingLevel } from './toolbar-text.js';
9
10
 
@@ -1,9 +1,10 @@
1
- export { c as NavStack, d as NavStackBottomToolbarPresentation, e as NavStackChromePresentation, N as NavStackProps, f as NavStackToolbarConfig, a as NavStackView, g as NavStackViewBottomToolbar, h as NavStackViewToolbar } from './nav-stack-CU_0dKtI.js';
1
+ export { c as NavStack, d as NavStackBottomToolbarPresentation, e as NavStackChromePresentation, N as NavStackProps, f as NavStackToolbarConfig, a as NavStackView, g as NavStackViewBottomToolbar, h as NavStackViewToolbar } from './nav-stack-CrZF95VO.js';
2
2
  import 'kerfjs';
3
3
  import './semantic-content-BbzjvSu9.js';
4
4
  import './pane.js';
5
5
  import './scroll-clearance-BikHljTc.js';
6
6
  import './css-values.js';
7
+ import './surface-tint-DQgYCaP9.js';
7
8
  import './list.js';
8
9
  import './extension-attributes-mu8MFUl0.js';
9
10
  import './flex-alignment-4ms8ZbV8.js';
package/dist/nav-stack.js CHANGED
@@ -1,4 +1,5 @@
1
- export { NavStack } from './chunk-SOFPUW3O.js';
1
+ export { NavStack } from './chunk-IIQ2XIMU.js';
2
+
2
3
 
3
4
 
4
5
 
package/dist/pane.d.ts CHANGED
@@ -2,6 +2,8 @@ import * as kerfjs from 'kerfjs';
2
2
  import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
3
3
  import { S as ScrollClearance } from './scroll-clearance-BikHljTc.js';
4
4
  import { CssColor } from './css-values.js';
5
+ import { S as SurfaceTint } from './surface-tint-DQgYCaP9.js';
6
+ export { a as SurfaceTintScheme } from './surface-tint-DQgYCaP9.js';
5
7
 
6
8
  /**
7
9
  * What clear (fully transparent) chrome fades in as content scrolls beneath
@@ -12,28 +14,6 @@ import { CssColor } from './css-values.js';
12
14
  */
13
15
  type ScrollEdge = 'none' | 'material' | 'surface';
14
16
 
15
- /** The color scheme an app declares for a {@link SurfaceTint}'s color. */
16
- type SurfaceTintScheme = 'light' | 'dark';
17
- /**
18
- * A scoped tint for a layout surface: the app's color (usually sampled from
19
- * artwork it already knows) and the scheme that color belongs to. Kerf does no
20
- * color detection; `scheme` says whether the color reads as a light or a dark
21
- * surface. Inside the scope the surface, raised surface, text, quiet text, and
22
- * everything built on them (quiet fills, separators' backdrop, the chrome
23
- * material) re-derive from the color, with lightness clamped so text keeps
24
- * WCAG AA over any color.
25
- */
26
- interface SurfaceTint {
27
- color: CssColor;
28
- scheme: SurfaceTintScheme;
29
- /**
30
- * An optional accent (usually the artwork's most vivid color). The scope's
31
- * brand ramp re-derives from it: loud fills and their text, brand text and
32
- * links, text on brand fills, and the focus ring, each clamped to keep AA.
33
- */
34
- accent?: CssColor;
35
- }
36
-
37
17
  /**
38
18
  * Logical pane sides: where a {@link Pane} can show a separator and where it can
39
19
  * compensate for a device safe-area inset.
@@ -255,4 +235,4 @@ type PaneConfig = Pick<PaneProps, 'contentElement' | 'contentLabel' | 'separator
255
235
  */
256
236
  declare function Pane({ header, children, footer, chromePlacement, chromeDividers, compactChrome, compactChromeOpen, headerPresentation, scrollEdge, scrollEdgeDistance, appearance, background, tint, deepInset, scrollClearance, tabIndex, outlined, element, contentElement, separators, safeAreaEdges, id, label, contentLabel, className, headerClassName, contentClassName, footerClassName, rootAttributes, slot, }: PaneProps): kerfjs.SafeHtml;
257
237
 
258
- export { Pane, type PaneAppearance, type PaneChromeDividers, type PaneChromePlacement, type PaneCompactChrome, type PaneCompactChromePolicy, type PaneConfig, type PaneContentElement, type PaneElement, type PaneHeaderPresentation, type PaneProps, type PaneSeparatorSide, ScrollClearance, type ScrollEdge, type SurfaceTint, type SurfaceTintScheme };
238
+ export { Pane, type PaneAppearance, type PaneChromeDividers, type PaneChromePlacement, type PaneCompactChrome, type PaneCompactChromePolicy, type PaneConfig, type PaneContentElement, type PaneElement, type PaneHeaderPresentation, type PaneProps, type PaneSeparatorSide, ScrollClearance, type ScrollEdge, SurfaceTint };
package/dist/pane.js CHANGED
@@ -1,4 +1,5 @@
1
- export { Pane } from './chunk-HQZG3OFL.js';
1
+ export { Pane } from './chunk-XRZSK2WC.js';
2
+
2
3
 
3
4
 
4
5
 
@@ -1,10 +1,11 @@
1
1
  import * as kerfjs from 'kerfjs';
2
2
  import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
3
- import { N as NavStackProps, a as NavStackView } from './nav-stack-CU_0dKtI.js';
3
+ import { N as NavStackProps, a as NavStackView } from './nav-stack-CrZF95VO.js';
4
4
  import { ResizableRegionProps } from './resizable-region.js';
5
5
  import './pane.js';
6
6
  import './scroll-clearance-BikHljTc.js';
7
7
  import './css-values.js';
8
+ import './surface-tint-DQgYCaP9.js';
8
9
  import './list.js';
9
10
  import './extension-attributes-mu8MFUl0.js';
10
11
  import './flex-alignment-4ms8ZbV8.js';
@@ -1,4 +1,5 @@
1
- export { SplitView } from './chunk-P7EJ4CAD.js';
1
+ export { SplitView } from './chunk-ETFP7HAR.js';
2
+
2
3
 
3
4
 
4
5
 
@@ -27,6 +27,11 @@
27
27
  isolation: isolate;
28
28
  }
29
29
 
30
+ .kui-backdrop-image[data-inline-bleed="false"] {
31
+ --_kui-backdrop-image-inset-start: 0px;
32
+ --_kui-backdrop-image-inset-end: 0px;
33
+ }
34
+
30
35
  /* `underChrome`: the block runs up beneath the scroller's block-start inset
31
36
  (overlay or clear chrome clearance plus the top safe area, as the Pane
32
37
  publishes it) and the hero grows by the same amount, so the visible image
@@ -60,6 +65,11 @@
60
65
  view-timeline: --kui-backdrop-image block;
61
66
  }
62
67
 
68
+ .kui-backdrop-image[data-aspect-ratio="true"] .kui-backdrop-image__hero {
69
+ min-height: 0;
70
+ aspect-ratio: var(--_kui-backdrop-image-ratio);
71
+ }
72
+
63
73
  .kui-backdrop-image__backdrop {
64
74
  position: absolute;
65
75
  inset: 0;
@@ -89,6 +99,10 @@
89
99
  background-position: var(--_kui-backdrop-image-position);
90
100
  }
91
101
 
102
+ .kui-backdrop-image__blurred[data-image-error="true"] {
103
+ display: none;
104
+ }
105
+
92
106
  /* Progressive blur: a copy over the sharp image, blurred once and hidden
93
107
  until the scroll timeline fades it in. A filtered copy overhangs the block
94
108
  by its radius on every side, so the blur's transparent fringe falls outside
@@ -208,7 +222,10 @@
208
222
  animation: none;
209
223
  }
210
224
 
211
- @media (update: slow) {
225
+ @media (update: slow),
226
+ (prefers-reduced-transparency: reduce),
227
+ (prefers-contrast: more),
228
+ (forced-colors: active) {
212
229
  .kui-backdrop-image[data-parallax="scroll"] .kui-backdrop-image__layers,
213
230
  .kui-backdrop-image[data-blur]
214
231
  :is(.kui-backdrop-image__blurred, .kui-backdrop-image__dim) {
@@ -27,6 +27,11 @@
27
27
  isolation: isolate;
28
28
  }
29
29
 
30
+ .kui-backdrop-image[data-inline-bleed="false"] {
31
+ --_kui-backdrop-image-inset-start: 0px;
32
+ --_kui-backdrop-image-inset-end: 0px;
33
+ }
34
+
30
35
  /* `underChrome`: the block runs up beneath the scroller's block-start inset
31
36
  (overlay or clear chrome clearance plus the top safe area, as the Pane
32
37
  publishes it) and the hero grows by the same amount, so the visible image
@@ -60,6 +65,11 @@
60
65
  view-timeline: --kui-backdrop-image block;
61
66
  }
62
67
 
68
+ .kui-backdrop-image[data-aspect-ratio="true"] .kui-backdrop-image__hero {
69
+ min-height: 0;
70
+ aspect-ratio: var(--_kui-backdrop-image-ratio);
71
+ }
72
+
63
73
  .kui-backdrop-image__backdrop {
64
74
  position: absolute;
65
75
  inset: 0;
@@ -89,6 +99,10 @@
89
99
  background-position: var(--_kui-backdrop-image-position);
90
100
  }
91
101
 
102
+ .kui-backdrop-image__blurred[data-image-error="true"] {
103
+ display: none;
104
+ }
105
+
92
106
  /* Progressive blur: a copy over the sharp image, blurred once and hidden
93
107
  until the scroll timeline fades it in. A filtered copy overhangs the block
94
108
  by its radius on every side, so the blur's transparent fringe falls outside
@@ -208,7 +222,10 @@
208
222
  animation: none;
209
223
  }
210
224
 
211
- @media (update: slow) {
225
+ @media (update: slow),
226
+ (prefers-reduced-transparency: reduce),
227
+ (prefers-contrast: more),
228
+ (forced-colors: active) {
212
229
  .kui-backdrop-image[data-parallax="scroll"] .kui-backdrop-image__layers,
213
230
  .kui-backdrop-image[data-blur]
214
231
  :is(.kui-backdrop-image__blurred, .kui-backdrop-image__dim) {
@@ -17,6 +17,54 @@
17
17
  background: var(--kui-content-item-background, transparent);
18
18
  }
19
19
 
20
+ /* BackdropImage supplies the image, overlay, fade, and per-card view timeline.
21
+ ContentItem owns only how that media block meets the card's geometry. */
22
+ .kui-content-item__media {
23
+ overflow: clip;
24
+ border-radius: max(0px, calc(var(--kui-content-item-radius, 12px) - 9px));
25
+ }
26
+
27
+ .kui-content-item[data-media-edge="true"] .kui-content-item__media {
28
+ margin-inline: calc(-1 * var(--kui-layout-item-padding, 0.5rem));
29
+ margin-block-start: calc(-1 * var(--kui-layout-item-padding, 0.5rem));
30
+ border-start-start-radius: max(
31
+ 0px,
32
+ calc(var(--kui-content-item-radius, 12px) - 1px)
33
+ );
34
+ border-start-end-radius: max(
35
+ 0px,
36
+ calc(var(--kui-content-item-radius, 12px) - 1px)
37
+ );
38
+ border-end-start-radius: 0;
39
+ border-end-end-radius: 0;
40
+ }
41
+
42
+ .kui-content-item__body {
43
+ min-width: 0;
44
+ margin-block-start: var(--kui-space-xs);
45
+ }
46
+
47
+ .kui-content-item[data-media-state][data-kui-tint][data-appearance="transparent"] {
48
+ --kui-content-item-background: var(--kui-color-surface);
49
+ }
50
+
51
+ .kui-content-item[data-media-state="error"] .kui-content-item__media {
52
+ display: none;
53
+ }
54
+
55
+ .kui-content-item[data-media-state="error"] .kui-content-item__body {
56
+ margin-block-start: 0;
57
+ }
58
+
59
+ @media (forced-colors: active) {
60
+ .kui-content-item .kui-content-item__media {
61
+ display: none;
62
+ }
63
+ .kui-content-item__body {
64
+ margin-block-start: 0;
65
+ }
66
+ }
67
+
20
68
  .kui-content-item--pill {
21
69
  --kui-content-item-radius: var(
22
70
  --kui-layout-pill-radius,
@@ -95,6 +143,10 @@
95
143
  --kui-content-item-foreground: var(--kui-color-danger-on-fill);
96
144
  }
97
145
 
146
+ .kui-content-item[data-media-fade="true"]:not([data-media-state="error"]) {
147
+ --kui-content-item-background: var(--_kui-content-item-media-fade-to);
148
+ }
149
+
98
150
  .kui-content-item[data-interactive="true"] {
99
151
  color: var(--kui-content-item-foreground, var(--kui-color-neutral-on-normal));
100
152
  cursor: pointer;
@@ -173,15 +173,23 @@ h2.kui-dialog-surface__title {
173
173
  background: transparent;
174
174
  cursor: pointer;
175
175
  }
176
+ .kui-dialog-surface__close[data-emphasis="quiet"] {
177
+ color: var(--kui-color-text-quiet);
178
+ }
176
179
  .kui-dialog-surface__close:hover {
177
180
  background-color: var(--kui-color-neutral-fill-normal);
178
181
  }
182
+ .kui-dialog-surface__close[data-emphasis="quiet"]:is(:hover, :focus-visible) {
183
+ color: var(--kui-color-neutral-on-quiet);
184
+ }
179
185
  .kui-dialog-surface__close:focus-visible {
180
186
  outline: var(--kui-focus-ring);
181
187
  outline-offset: var(--kui-focus-ring-offset, 1px);
182
188
  }
183
189
  @media (forced-colors: active) {
184
- .kui-dialog-surface__close {
190
+ .kui-dialog-surface__close,
191
+ .kui-dialog-surface__close[data-emphasis="quiet"]:is(:hover, :focus-visible),
192
+ .kui-dialog-surface__close[data-emphasis="quiet"] {
185
193
  color: ButtonText;
186
194
  }
187
195
  }
@@ -1,168 +1,3 @@
1
- /* One self-contained content-item: 8px inline margin, a real 1px border
2
- (transparent unless framed), 8px padding, and a rounded or pill radius.
3
- Rendered by ContentItem; the classes stay public for other elements. */
4
-
5
- .kui-content-item {
6
- min-width: 0;
7
- margin-inline: var(--kui-layout-inline-margin, 0.5rem);
8
- padding: var(--kui-layout-item-padding, 0.5rem);
9
- box-sizing: border-box;
10
- border: var(--kui-layout-item-border-width, 1px) solid
11
- var(--kui-content-item-border, transparent);
12
- border-radius: var(
13
- --kui-content-item-radius,
14
- var(--kui-layout-rounded-radius, calc(1px + 0.6875rem))
15
- );
16
- color: var(--kui-content-item-foreground, inherit);
17
- background: var(--kui-content-item-background, transparent);
18
- }
19
-
20
- .kui-content-item--pill {
21
- --kui-content-item-radius: var(
22
- --kui-layout-pill-radius,
23
- calc(1px + 1.3125rem)
24
- );
25
- }
26
-
27
- .kui-content-item--flush {
28
- padding-block: 0;
29
- border-block-width: 0;
30
- }
31
-
32
- /* A visible frame for a content item that marks a real distinction: the
33
- standard neutral border, same geometry (the border is always reserved). */
34
- .kui-content-item--framed {
35
- --kui-content-item-border: var(--kui-color-neutral-border-normal);
36
- }
37
-
38
- .kui-content-item[data-appearance="surface"] {
39
- --kui-content-item-border: var(--kui-color-neutral-border-normal);
40
- --kui-content-item-background: var(--kui-color-surface);
41
- --kui-content-item-foreground: var(--kui-color-neutral-on-normal);
42
- }
43
-
44
- .kui-content-item[data-appearance="neutral"] {
45
- --kui-content-item-border: var(--kui-color-neutral-border-normal);
46
- --kui-content-item-background: var(--kui-color-neutral-fill-quiet);
47
- --kui-content-item-foreground: var(--kui-color-neutral-on-normal);
48
- }
49
-
50
- .kui-content-item[data-appearance="info"] {
51
- --kui-content-item-border: var(--kui-color-brand-border-quiet);
52
- --kui-content-item-background: var(--kui-color-brand-fill-quiet);
53
- --kui-content-item-foreground: var(--kui-color-brand-on-fill);
54
- }
55
-
56
- .kui-content-item[data-appearance="pop"] {
57
- --kui-content-item-border: var(--kui-color-pop-border-normal);
58
- --kui-content-item-background: var(--kui-color-pop-fill-quiet);
59
- --kui-content-item-foreground: var(--kui-color-pop-on-fill);
60
- }
61
-
62
- .kui-content-item[data-appearance="success"] {
63
- --kui-content-item-border: var(--kui-color-success-border-normal);
64
- --kui-content-item-background: var(--kui-color-success-fill-quiet);
65
- --kui-content-item-foreground: var(--kui-color-success-on-fill);
66
- }
67
-
68
- .kui-content-item[data-appearance="warning"] {
69
- --kui-content-item-border: var(--kui-color-warning-border-normal);
70
- --kui-content-item-background: var(--kui-color-warning-fill-quiet);
71
- --kui-content-item-foreground: var(--kui-color-warning-on-fill);
72
- }
73
-
74
- .kui-content-item[data-appearance="brand-loud"] {
75
- --kui-content-item-border: var(--kui-color-brand-border-loud);
76
- --kui-content-item-background: var(--kui-color-brand-fill-loud);
77
- --kui-content-item-foreground: var(--kui-color-brand-on-loud);
78
- }
79
-
80
- /* Chat bubble: the item shrinks to its content up to 80% of the row and sits
81
- at the start or end of the line; long unbroken text wraps inside it. */
82
- .kui-content-item[data-bubble] {
83
- width: fit-content;
84
- max-width: 80%;
85
- overflow-wrap: anywhere;
86
- }
87
-
88
- .kui-content-item[data-bubble="end"] {
89
- margin-inline-start: auto;
90
- }
91
-
92
- .kui-content-item[data-appearance="danger"] {
93
- --kui-content-item-border: var(--kui-color-danger-border-quiet);
94
- --kui-content-item-background: var(--kui-color-danger-fill-quiet);
95
- --kui-content-item-foreground: var(--kui-color-danger-on-fill);
96
- }
97
-
98
- .kui-content-item[data-interactive="true"] {
99
- color: var(--kui-content-item-foreground, var(--kui-color-neutral-on-normal));
100
- cursor: pointer;
101
- }
102
-
103
- .kui-content-item[data-interactive="true"]:hover:not(
104
- [data-disabled="true"],
105
- [data-selected="true"]
106
- ),
107
- .kui-content-item[data-interactive="true"][data-kui-pressed="true"]:not(
108
- [data-selected="true"]
109
- ) {
110
- --kui-content-item-border: var(--kui-color-neutral-border-normal);
111
- --kui-content-item-background: var(--kui-color-neutral-fill-normal);
112
- --kui-content-item-foreground: var(--kui-color-neutral-on-normal);
113
- }
114
-
115
- .kui-content-item[data-interactive="true"]:active:not([data-disabled="true"]) {
116
- --kui-content-item-background: color-mix(
117
- in srgb,
118
- var(--kui-color-neutral-fill-normal) 75%,
119
- var(--kui-color-neutral-fill-loud)
120
- );
121
- }
122
-
123
- .kui-content-item[data-interactive="true"][data-selected="true"] {
124
- --kui-content-item-border: var(--kui-color-brand-border-quiet);
125
- --kui-content-item-background: var(--kui-color-brand-fill-normal);
126
- --kui-content-item-foreground: var(--kui-color-brand-on-fill);
127
- }
128
-
129
- /* The surface context follows the fill an item paints: a quiet appearance,
130
- a hover, press, or selection. A transparent item keeps its parent's
131
- context; a brand-loud fill shares the focus ring's hue, so a control on it
132
- keeps the surface line. A surface appearance is opaque, so it resets. */
133
- .kui-content-item:is(
134
- [data-appearance]:not(
135
- [data-appearance="transparent"],
136
- [data-appearance="brand-loud"]
137
- ),
138
- [data-interactive="true"]:hover:not([data-disabled="true"]),
139
- [data-interactive="true"]:is(
140
- [data-kui-pressed="true"],
141
- [data-selected="true"]
142
- )
143
- ) {
144
- --kui-color-surface-current-tint: var(--kui-content-item-background);
145
- }
146
-
147
- .kui-content-item[data-appearance="surface"]:not(
148
- [data-interactive="true"]:is(
149
- :hover,
150
- [data-kui-pressed="true"],
151
- [data-selected="true"]
152
- )
153
- ) {
154
- --kui-color-surface-current: var(--kui-color-surface);
155
- --kui-color-surface-current-region: transparent;
156
- --kui-color-surface-current-tint: transparent;
157
- }
158
-
159
- .kui-content-item:is(:focus-visible, [data-outlined="true"]) {
160
- outline: var(--kui-focus-ring);
161
- outline-offset: 1px;
162
- }
163
-
164
- .kui-content-item[data-interactive="true"][data-disabled="true"] {
165
- color: var(--kui-color-neutral-on-quiet);
166
- opacity: 0.58;
167
- cursor: not-allowed;
168
- }
1
+ /* Public stylesheet entry; implementation is colocated with the component. */
2
+ @import "./backdrop-image.css";
3
+ @import "./components/surfaces/content-item/content-item.css";
@@ -223,7 +223,7 @@
223
223
  --kui-color-text: var(--wa-color-text-normal, light-dark(#1d1d1f, #f5f5f7));
224
224
  --kui-color-text-quiet: var(
225
225
  --wa-color-text-quiet,
226
- light-dark(#6e6e73, #aeaeb2)
226
+ light-dark(#646469, #aeaeb2)
227
227
  );
228
228
  --kui-color-text-link: var(
229
229
  --wa-color-text-link,
@@ -525,7 +525,7 @@
525
525
  );
526
526
  --kui-color-danger-on-quiet: var(
527
527
  --wa-color-danger-on-quiet,
528
- light-dark(#c20b20, #ff696c)
528
+ light-dark(#c20b20, #ff8588)
529
529
  );
530
530
  --kui-color-danger-on-normal: var(
531
531
  --wa-color-danger-on-normal,
@@ -538,8 +538,8 @@
538
538
  /* Danger text placed ON a danger fill (e.g. the danger StateBanner) and the
539
539
  danger Badge's solid fill. The light value matches danger-on-quiet, which
540
540
  already clears WCAG AA (5.7:1) over danger-fill-quiet. The dark value is
541
- lighter than danger-on-quiet (#ff696c), which reached only 5.7:1 over the
542
- dark fill-quiet (4.0:1 as dimmed banner detail) and left the solid badge's
541
+ lighter than danger-on-quiet (#ff8588); the former #ff696c reached only
542
+ 5.7:1 over the dark fill-quiet (4.0:1 as dimmed banner detail) and left the solid badge's
543
543
  dark text and placeholder skeleton the weakest of any tone on a mid-red
544
544
  fill; #ffa0a2 matches the other tones' pale dark on-fill values. */
545
545
  --kui-color-danger-on-fill: light-dark(#c20b20, #ffa0a2);
@@ -173,15 +173,23 @@ h2.kui-dialog-surface__title {
173
173
  background: transparent;
174
174
  cursor: pointer;
175
175
  }
176
+ .kui-dialog-surface__close[data-emphasis="quiet"] {
177
+ color: var(--kui-color-text-quiet);
178
+ }
176
179
  .kui-dialog-surface__close:hover {
177
180
  background-color: var(--kui-color-neutral-fill-normal);
178
181
  }
182
+ .kui-dialog-surface__close[data-emphasis="quiet"]:is(:hover, :focus-visible) {
183
+ color: var(--kui-color-neutral-on-quiet);
184
+ }
179
185
  .kui-dialog-surface__close:focus-visible {
180
186
  outline: var(--kui-focus-ring);
181
187
  outline-offset: var(--kui-focus-ring-offset, 1px);
182
188
  }
183
189
  @media (forced-colors: active) {
184
- .kui-dialog-surface__close {
190
+ .kui-dialog-surface__close,
191
+ .kui-dialog-surface__close[data-emphasis="quiet"]:is(:hover, :focus-visible),
192
+ .kui-dialog-surface__close[data-emphasis="quiet"] {
185
193
  color: ButtonText;
186
194
  }
187
195
  }