@kerfjs/ui 5.0.0-beta.49 → 5.0.0-beta.50

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 (257) hide show
  1. package/README.md +41 -11
  2. package/ai/catalog-authoring.json +12 -1
  3. package/ai/catalog-authoring.schema.json +49 -1
  4. package/ai/compile-time-contracts-v1.json +14 -0
  5. package/ai/compile-time-contracts-v1.schema.json +1 -0
  6. package/ai/component-catalog-v2-overrides.json +7 -0
  7. package/ai/component-catalog-v2.json +79 -23
  8. package/ai/component-catalog.json +86 -27
  9. package/ai/public-api-signatures-v1.md +217 -169
  10. package/ai/skill.md +23 -9
  11. package/ai/webawesome-jsx-signatures-v1.md +1 -1
  12. package/dist/app-tab.d.ts +3 -1
  13. package/dist/app-tab.js +1 -1
  14. package/dist/badge.d.ts +24 -0
  15. package/dist/badge.js +3 -0
  16. package/dist/badge.js.map +1 -0
  17. package/dist/browser/badge.js +3 -0
  18. package/dist/browser/list-header.js +1 -0
  19. package/dist/browser/state-banner.js +1 -0
  20. package/dist/catalog-resources.d.ts +2 -2
  21. package/dist/catalog.d.ts +24 -125
  22. package/dist/catalog.js +387 -261
  23. package/dist/catalog.js.map +1 -1
  24. package/dist/{chunk-OGTJNHRG.js → chunk-2WMSE4MK.js} +5 -3
  25. package/dist/chunk-2WMSE4MK.js.map +1 -0
  26. package/dist/{chunk-GYGM363P.js → chunk-2YOUUEWR.js} +16 -6
  27. package/dist/chunk-2YOUUEWR.js.map +1 -0
  28. package/dist/{chunk-UDHHKZWO.js → chunk-3V75EQIP.js} +8 -4
  29. package/dist/chunk-3V75EQIP.js.map +1 -0
  30. package/dist/{chunk-W2FK7ZNY.js → chunk-4R777DUZ.js} +10 -2
  31. package/dist/chunk-4R777DUZ.js.map +1 -0
  32. package/dist/{chunk-T7DOWS6T.js → chunk-54HM36IQ.js} +6 -3
  33. package/dist/chunk-54HM36IQ.js.map +1 -0
  34. package/dist/{chunk-DAO2VFTT.js → chunk-5CE64WGC.js} +6 -4
  35. package/dist/chunk-5CE64WGC.js.map +1 -0
  36. package/dist/{chunk-SOK5EUF7.js → chunk-6ZXOQEAN.js} +4 -2
  37. package/dist/chunk-6ZXOQEAN.js.map +1 -0
  38. package/dist/{chunk-OGNE3OFT.js → chunk-AQSKJ6U6.js} +4 -2
  39. package/dist/chunk-AQSKJ6U6.js.map +1 -0
  40. package/dist/{chunk-VDUJZF5G.js → chunk-CMUIXJZM.js} +2 -2
  41. package/dist/{chunk-VDUJZF5G.js.map → chunk-CMUIXJZM.js.map} +1 -1
  42. package/dist/{chunk-OMSRSL3B.js → chunk-COUPLRZG.js} +5 -3
  43. package/dist/chunk-COUPLRZG.js.map +1 -0
  44. package/dist/{chunk-2TYUFZUC.js → chunk-D7GWXIAS.js} +4 -2
  45. package/dist/chunk-D7GWXIAS.js.map +1 -0
  46. package/dist/{chunk-AQFWBG23.js → chunk-DARTMI5Z.js} +5 -3
  47. package/dist/chunk-DARTMI5Z.js.map +1 -0
  48. package/dist/{chunk-V6GQKOX2.js → chunk-DJKWFYAA.js} +5 -3
  49. package/dist/chunk-DJKWFYAA.js.map +1 -0
  50. package/dist/{chunk-6NDBE2OK.js → chunk-E36EVCKG.js} +5 -3
  51. package/dist/chunk-E36EVCKG.js.map +1 -0
  52. package/dist/{chunk-IU4QUY5I.js → chunk-ELRMBQEC.js} +4 -2
  53. package/dist/chunk-ELRMBQEC.js.map +1 -0
  54. package/dist/{chunk-TIGSG6BX.js → chunk-HJKRCKDR.js} +7 -3
  55. package/dist/chunk-HJKRCKDR.js.map +1 -0
  56. package/dist/{chunk-Y6LYKFXY.js → chunk-HMQ2ZDGG.js} +5 -3
  57. package/dist/chunk-HMQ2ZDGG.js.map +1 -0
  58. package/dist/{chunk-WN52USHV.js → chunk-J3EE6XWD.js} +2 -2
  59. package/dist/{chunk-WN52USHV.js.map → chunk-J3EE6XWD.js.map} +1 -1
  60. package/dist/{chunk-CK6P5AUK.js → chunk-KKNK3JUT.js} +7 -4
  61. package/dist/chunk-KKNK3JUT.js.map +1 -0
  62. package/dist/{chunk-ZPWZIVI6.js → chunk-N3GKMPDW.js} +7 -3
  63. package/dist/chunk-N3GKMPDW.js.map +1 -0
  64. package/dist/{chunk-DYBPI5O2.js → chunk-NDUGJ4TU.js} +4 -2
  65. package/dist/chunk-NDUGJ4TU.js.map +1 -0
  66. package/dist/{chunk-WSXUPSID.js → chunk-NN6GYOA2.js} +7 -3
  67. package/dist/chunk-NN6GYOA2.js.map +1 -0
  68. package/dist/{chunk-VXFGMDA7.js → chunk-OQI7RCRP.js} +10 -2
  69. package/dist/chunk-OQI7RCRP.js.map +1 -0
  70. package/dist/{chunk-E34TE2ZI.js → chunk-S6ZTTTV7.js} +5 -3
  71. package/dist/chunk-S6ZTTTV7.js.map +1 -0
  72. package/dist/{chunk-V6HCTCVD.js → chunk-SIU2AC5W.js} +8 -4
  73. package/dist/chunk-SIU2AC5W.js.map +1 -0
  74. package/dist/{chunk-WVLMZ5SG.js → chunk-UMGY5JSP.js} +4 -2
  75. package/dist/chunk-UMGY5JSP.js.map +1 -0
  76. package/dist/{chunk-I4V3UDSA.js → chunk-V6RZWDII.js} +7 -5
  77. package/dist/chunk-V6RZWDII.js.map +1 -0
  78. package/dist/{chunk-CAB6NQ2T.js → chunk-VOCPXGQN.js} +3 -1
  79. package/dist/chunk-VOCPXGQN.js.map +1 -0
  80. package/dist/chunk-XD7DWYXG.js +34 -0
  81. package/dist/chunk-XD7DWYXG.js.map +1 -0
  82. package/dist/{chunk-B6JYRX3P.js → chunk-ZIYOJFZD.js} +43 -4
  83. package/dist/chunk-ZIYOJFZD.js.map +1 -0
  84. package/dist/{chunk-EYALJQQD.js → chunk-ZK5EGVFP.js} +4 -2
  85. package/dist/chunk-ZK5EGVFP.js.map +1 -0
  86. package/dist/{chunk-6WTETUZ6.js → chunk-ZLWQZUGF.js} +8 -2
  87. package/dist/chunk-ZLWQZUGF.js.map +1 -0
  88. package/dist/{chunk-XKFRMGMW.js → chunk-ZNZ2JDBW.js} +3 -1
  89. package/dist/chunk-ZNZ2JDBW.js.map +1 -0
  90. package/dist/{chunk-I45QO2IZ.js → chunk-ZSYLBVWG.js} +6 -4
  91. package/dist/chunk-ZSYLBVWG.js.map +1 -0
  92. package/dist/collapsible-panel.d.ts +3 -1
  93. package/dist/collapsible-panel.js +4 -2
  94. package/dist/collapsible-panel.js.map +1 -1
  95. package/dist/disclosure-arrow.d.ts +3 -1
  96. package/dist/disclosure-arrow.js +1 -1
  97. package/dist/empty-state.d.ts +3 -1
  98. package/dist/empty-state.js +1 -1
  99. package/dist/floating-toolbar.d.ts +3 -1
  100. package/dist/floating-toolbar.js +1 -1
  101. package/dist/grid.d.ts +3 -1
  102. package/dist/grid.js +1 -1
  103. package/dist/index.d.ts +3 -2
  104. package/dist/index.js +33 -32
  105. package/dist/list-action-row.d.ts +3 -1
  106. package/dist/list-action-row.js +1 -1
  107. package/dist/list-header.d.ts +6 -1
  108. package/dist/list-header.js +2 -1
  109. package/dist/list-inset-control.d.ts +3 -1
  110. package/dist/list-inset-control.js +1 -1
  111. package/dist/list-inset-text.d.ts +3 -1
  112. package/dist/list-inset-text.js +1 -1
  113. package/dist/list-item.d.ts +3 -1
  114. package/dist/list-item.js +1 -1
  115. package/dist/list.d.ts +3 -1
  116. package/dist/list.js +1 -1
  117. package/dist/loading-spinner.d.ts +3 -1
  118. package/dist/loading-spinner.js +1 -1
  119. package/dist/lucide-icon.d.ts +3 -1
  120. package/dist/lucide-icon.js +1 -1
  121. package/dist/nav-stack.d.ts +3 -1
  122. package/dist/nav-stack.js +1 -1
  123. package/dist/pane.d.ts +3 -1
  124. package/dist/pane.js +1 -1
  125. package/dist/resizable-region.d.ts +5 -2
  126. package/dist/resizable-region.js +1 -1
  127. package/dist/row.d.ts +3 -1
  128. package/dist/row.js +1 -1
  129. package/dist/segmented-control.d.ts +3 -1
  130. package/dist/segmented-control.js +1 -1
  131. package/dist/select.d.ts +3 -1
  132. package/dist/select.js +1 -1
  133. package/dist/skeleton.d.ts +3 -1
  134. package/dist/skeleton.js +1 -1
  135. package/dist/spacer.d.ts +3 -1
  136. package/dist/spacer.js +1 -1
  137. package/dist/split-view.d.ts +3 -1
  138. package/dist/split-view.js +24 -5
  139. package/dist/split-view.js.map +1 -1
  140. package/dist/state-banner.d.ts +3 -1
  141. package/dist/state-banner.js +2 -1
  142. package/dist/styles/badge.css +86 -0
  143. package/dist/styles/catalog/components/catalog-detail.css +35 -0
  144. package/dist/styles/catalog/components/catalog-example-stack.css +6 -0
  145. package/dist/styles/catalog/components/catalog-example.css +35 -0
  146. package/dist/styles/catalog/components/catalog-resource-footer.css +37 -0
  147. package/dist/styles/catalog/components/catalog-secondary-sections.css +38 -0
  148. package/dist/styles/catalog/components/catalog-section-list.css +22 -0
  149. package/dist/styles/catalog/components/catalog-sidebar.css +82 -0
  150. package/dist/styles/catalog/components/catalog-stage.css +60 -0
  151. package/dist/styles/catalog/components/catalog.css +22 -0
  152. package/dist/styles/catalog.css +10 -587
  153. package/dist/styles/list-header.css +4 -60
  154. package/dist/styles/resizable-region.css +24 -0
  155. package/dist/styles/select.css +0 -3
  156. package/dist/styles/split-view.css +1 -1
  157. package/dist/styles/state-banner.css +0 -27
  158. package/dist/styles/styles.css +1 -0
  159. package/dist/styles/tab-bar.css +6 -1
  160. package/dist/styles/text.css +4 -0
  161. package/dist/styles/token-search-field.css +5 -40
  162. package/dist/styles/toolbar-control-group.css +110 -16
  163. package/dist/styles/toolbar-text.css +4 -0
  164. package/dist/styles/toolbar.css +72 -0
  165. package/dist/styles/webawesome.css +22 -7
  166. package/dist/sunken-panel.d.ts +3 -1
  167. package/dist/sunken-panel.js +1 -1
  168. package/dist/surface-scaffold.d.ts +6 -2
  169. package/dist/surface-scaffold.js +1 -1
  170. package/dist/tab-bar.d.ts +8 -1
  171. package/dist/tab-bar.js +1 -1
  172. package/dist/tab-scaffold.d.ts +3 -1
  173. package/dist/tab-scaffold.js +3 -1
  174. package/dist/tab-scaffold.js.map +1 -1
  175. package/dist/text.d.ts +5 -2
  176. package/dist/text.js +1 -1
  177. package/dist/token-search-field.d.ts +5 -1
  178. package/dist/token-search-field.js +1 -1
  179. package/dist/toolbar-control-group.d.ts +33 -3
  180. package/dist/toolbar-control-group.js +1 -1
  181. package/dist/toolbar-text.d.ts +3 -1
  182. package/dist/toolbar-text.js +1 -1
  183. package/dist/toolbar.d.ts +9 -1
  184. package/dist/toolbar.js +1 -1
  185. package/dist/types-CzgSrFXP.d.ts +64 -0
  186. package/dist/value-table.d.ts +6 -2
  187. package/dist/value-table.js +1 -1
  188. package/dist/wire-resizable-regions.js +1 -1
  189. package/dist/wire-token-search-fields.js +1 -1
  190. package/dist/workbench.d.ts +3 -1
  191. package/dist/workbench.js +3 -1
  192. package/dist/workbench.js.map +1 -1
  193. package/docs/accessibility.md +11 -1
  194. package/docs/catalog.md +25 -7
  195. package/docs/component-contract.md +71 -22
  196. package/docs/component-selection.md +11 -9
  197. package/docs/design-philosophy.md +6 -5
  198. package/docs/recipes.md +5 -5
  199. package/docs/type-contracts.md +1 -0
  200. package/docs/ux-demo.md +4 -4
  201. package/docs/webawesome-theme.md +5 -4
  202. package/llms.txt +30 -10
  203. package/package.json +9 -2
  204. package/ux-demo/recipes/app-shell.css +87 -0
  205. package/ux-demo/recipes/app-shell.tsx +207 -178
  206. package/ux-demo/recipes/collapsible-sidebar.css +83 -0
  207. package/ux-demo/recipes/collapsible-sidebar.tsx +152 -122
  208. package/ux-demo/recipes/compact-toolbar.css +35 -0
  209. package/ux-demo/recipes/compact-toolbar.tsx +104 -100
  210. package/ux-demo/recipes/composer-form.css +19 -0
  211. package/ux-demo/recipes/composer-form.tsx +19 -15
  212. package/ux-demo/recipes/list-detail-dialog.css +42 -0
  213. package/ux-demo/recipes/list-detail-dialog.tsx +127 -125
  214. package/ux-demo/recipes/list-workspace-states.css +30 -0
  215. package/ux-demo/recipes/list-workspace-states.tsx +66 -60
  216. package/ux-demo/recipes/loading-inspector.css +7 -0
  217. package/ux-demo/recipes/loading-inspector.tsx +151 -131
  218. package/ux-demo/recipes/navigation-sidebar.css +12 -0
  219. package/ux-demo/recipes/navigation-sidebar.tsx +116 -105
  220. package/ux-demo/recipes/navigation-stack.css +12 -0
  221. package/ux-demo/recipes/navigation-stack.tsx +47 -37
  222. package/ux-demo/recipes/recipe-root.css +67 -0
  223. package/ux-demo/recipes/recipe-root.tsx +87 -0
  224. package/ux-demo/recipes/workspace-header.css +7 -0
  225. package/ux-demo/recipes/workspace-header.tsx +60 -61
  226. package/dist/chunk-2TYUFZUC.js.map +0 -1
  227. package/dist/chunk-6NDBE2OK.js.map +0 -1
  228. package/dist/chunk-6WTETUZ6.js.map +0 -1
  229. package/dist/chunk-AQFWBG23.js.map +0 -1
  230. package/dist/chunk-B6JYRX3P.js.map +0 -1
  231. package/dist/chunk-CAB6NQ2T.js.map +0 -1
  232. package/dist/chunk-CK6P5AUK.js.map +0 -1
  233. package/dist/chunk-DAO2VFTT.js.map +0 -1
  234. package/dist/chunk-DYBPI5O2.js.map +0 -1
  235. package/dist/chunk-E34TE2ZI.js.map +0 -1
  236. package/dist/chunk-EYALJQQD.js.map +0 -1
  237. package/dist/chunk-GYGM363P.js.map +0 -1
  238. package/dist/chunk-I45QO2IZ.js.map +0 -1
  239. package/dist/chunk-I4V3UDSA.js.map +0 -1
  240. package/dist/chunk-IU4QUY5I.js.map +0 -1
  241. package/dist/chunk-OGNE3OFT.js.map +0 -1
  242. package/dist/chunk-OGTJNHRG.js.map +0 -1
  243. package/dist/chunk-OMSRSL3B.js.map +0 -1
  244. package/dist/chunk-SOK5EUF7.js.map +0 -1
  245. package/dist/chunk-T7DOWS6T.js.map +0 -1
  246. package/dist/chunk-TIGSG6BX.js.map +0 -1
  247. package/dist/chunk-UDHHKZWO.js.map +0 -1
  248. package/dist/chunk-V6GQKOX2.js.map +0 -1
  249. package/dist/chunk-V6HCTCVD.js.map +0 -1
  250. package/dist/chunk-VXFGMDA7.js.map +0 -1
  251. package/dist/chunk-W2FK7ZNY.js.map +0 -1
  252. package/dist/chunk-WSXUPSID.js.map +0 -1
  253. package/dist/chunk-WVLMZ5SG.js.map +0 -1
  254. package/dist/chunk-XKFRMGMW.js.map +0 -1
  255. package/dist/chunk-Y6LYKFXY.js.map +0 -1
  256. package/dist/chunk-ZPWZIVI6.js.map +0 -1
  257. package/ux-demo/recipes/recipes.css +0 -453
@@ -1,11 +1,11 @@
1
1
  import '@kerfjs/ui/layout.css';
2
- import './recipes.css';
2
+ import './app-shell.css';
3
3
 
4
4
  import { ListHeader } from '@kerfjs/ui/list-header';
5
5
  import { ListItem } from '@kerfjs/ui/list-item';
6
6
  import { LucideIcon } from '@kerfjs/ui/lucide-icon';
7
+ import { Pane } from '@kerfjs/ui/pane';
7
8
  import { ResizableRegion } from '@kerfjs/ui/resizable-region';
8
- import { Text } from '@kerfjs/ui/text';
9
9
  import { Toolbar } from '@kerfjs/ui/toolbar';
10
10
  import { ToolbarControlGroup } from '@kerfjs/ui/toolbar-control-group';
11
11
  import { ToolbarText } from '@kerfjs/ui/toolbar-text';
@@ -13,6 +13,11 @@ import { ValueTable, ValueTableRow } from '@kerfjs/ui/value-table';
13
13
  import { signal } from 'kerfjs';
14
14
  import { Bell, Folder, Inbox, Settings } from 'lucide';
15
15
 
16
+ import {
17
+ RecipeMutedText,
18
+ RecipeOwnershipNote,
19
+ RecipeRoot,
20
+ } from './recipe-root.js';
16
21
  import type { RecipeFactory } from './types.js';
17
22
 
18
23
  export const createRecipe: RecipeFactory = (announce) => {
@@ -23,196 +28,220 @@ export const createRecipe: RecipeFactory = (announce) => {
23
28
  'content',
24
29
  );
25
30
  const render = () => (
26
- <section
27
- class="kui-recipe recipe-shell kui-recipe__surface kui-layout"
28
- data-recipe="recipe-app-shell"
29
- data-responsive-pane={responsivePane.value}
31
+ <RecipeRoot
32
+ recipe="recipe-app-shell"
33
+ dataAttributes={{ 'data-responsive-pane': responsivePane.value }}
30
34
  >
31
- <Toolbar
32
- label="Atlas workspace"
33
- leading={<ToolbarText text="Atlas" />}
34
- trailing={
35
- <div class="recipe-shell__toolbar-actions">
36
- <ToolbarControlGroup
37
- className="recipe-shell__responsive-controls"
38
- appearance="borderless"
39
- label="Workspace panes"
40
- >
41
- <button
42
- type="button"
43
- aria-label="Show navigation"
44
- aria-controls="recipe-shell-navigation"
45
- aria-pressed={String(responsivePane.value === 'navigation')}
46
- data-action="recipe-action"
47
- data-recipe-command="show-navigation"
48
- >
49
- <LucideIcon icon={Folder} name="folder" />
50
- </button>
51
- <button
52
- type="button"
53
- aria-label="Show content"
54
- aria-controls="recipe-shell-content"
55
- aria-pressed={String(responsivePane.value === 'content')}
56
- data-action="recipe-action"
57
- data-recipe-command="show-content"
58
- >
59
- <LucideIcon icon={Inbox} name="inbox" />
60
- </button>
61
- <button
62
- type="button"
63
- aria-label="Show inspector"
64
- aria-controls="recipe-shell-inspector"
65
- aria-pressed={String(responsivePane.value === 'inspector')}
66
- data-action="recipe-action"
67
- data-recipe-command="show-inspector"
68
- >
69
- <LucideIcon icon={Settings} name="settings" />
70
- </button>
71
- </ToolbarControlGroup>
72
- <ToolbarControlGroup
73
- appearance="borderless"
74
- label="Workspace controls"
75
- >
76
- <button
77
- type="button"
78
- aria-label="Notifications"
79
- data-action="recipe-action"
80
- data-recipe-command="notify"
35
+ <div
36
+ class="recipe-shell kui-layout"
37
+ data-responsive-pane={responsivePane.value}
38
+ >
39
+ <Toolbar
40
+ label="Atlas workspace"
41
+ leading={<ToolbarText text="Atlas" />}
42
+ trailing={
43
+ <>
44
+ <ToolbarControlGroup
45
+ appearance="borderless"
46
+ label="Workspace panes"
47
+ visibility="compact-only"
81
48
  >
82
- <LucideIcon icon={Bell} name="bell" />
83
- </button>
84
- <button
85
- type="button"
86
- aria-label="Settings"
87
- data-action="recipe-action"
88
- data-recipe-command="settings"
89
- >
90
- <LucideIcon icon={Settings} name="settings" />
91
- </button>
92
- </ToolbarControlGroup>
93
- </div>
94
- }
95
- />
96
- <div class="recipe-shell__body">
97
- <div id="recipe-shell-navigation" class="recipe-shell__nav-region">
98
- <ResizableRegion
99
- id="recipe-navigation"
100
- label="Navigation"
101
- size={navigationSize.value}
102
- min={180}
103
- max={320}
104
- >
105
- <aside class="recipe-shell__nav kui-pane">
106
- <ListHeader label="Workspace" />
107
- <nav
108
- class="recipe-shell__nav-list kui-pane__content kui-content"
109
- aria-label="Workspace"
49
+ <button
50
+ type="button"
51
+ aria-label="Show navigation"
52
+ aria-controls="recipe-shell-navigation"
53
+ aria-pressed={String(responsivePane.value === 'navigation')}
54
+ data-action="recipe-action"
55
+ data-recipe-command="show-navigation"
56
+ >
57
+ <LucideIcon icon={Folder} name="folder" />
58
+ </button>
59
+ <button
60
+ type="button"
61
+ aria-label="Show content"
62
+ aria-controls="recipe-shell-content"
63
+ aria-pressed={String(responsivePane.value === 'content')}
64
+ data-action="recipe-action"
65
+ data-recipe-command="show-content"
66
+ >
67
+ <LucideIcon icon={Inbox} name="inbox" />
68
+ </button>
69
+ <button
70
+ type="button"
71
+ aria-label="Show inspector"
72
+ aria-controls="recipe-shell-inspector"
73
+ aria-pressed={String(responsivePane.value === 'inspector')}
74
+ data-action="recipe-action"
75
+ data-recipe-command="show-inspector"
76
+ >
77
+ <LucideIcon icon={Settings} name="settings" />
78
+ </button>
79
+ </ToolbarControlGroup>
80
+ <ToolbarControlGroup
81
+ appearance="borderless"
82
+ label="Workspace controls"
110
83
  >
111
- <section>
112
- <ListItem
113
- action="recipe-action"
114
- itemId="inbox"
115
- label="Inbox"
116
- icon={<LucideIcon icon={Inbox} name="inbox" />}
117
- selected={selected.value === 'inbox'}
118
- />
119
- <ListItem
120
- action="recipe-action"
121
- itemId="projects"
122
- label="Projects with a deliberately wrapping title"
123
- icon={<LucideIcon icon={Folder} name="folder" />}
124
- selected={selected.value === 'projects'}
125
- multiline
126
- />
127
- </section>
128
- </nav>
129
- </aside>
130
- </ResizableRegion>
131
- </div>
132
- <main id="recipe-shell-content" class="recipe-shell__main kui-pane">
133
- <Toolbar
134
- label="Current workspace view"
135
- dividerSides=""
136
- leading={
137
- <ToolbarText
138
- text={
139
- selected.value === 'inbox'
140
- ? 'Inbox triage'
141
- : 'Active projects'
142
- }
143
- size="xlarge"
144
- id="recipe-shell-main-title"
145
- />
146
- }
147
- trailing={
148
- <ToolbarControlGroup appearance="borderless" single>
149
84
  <button
150
- class="kui-recipe__button"
151
- data-primary="true"
152
85
  type="button"
86
+ aria-label="Notifications"
87
+ data-action="recipe-action"
88
+ data-recipe-command="notify"
89
+ >
90
+ <LucideIcon icon={Bell} name="bell" />
91
+ </button>
92
+ <button
93
+ type="button"
94
+ aria-label="Settings"
153
95
  data-action="recipe-action"
154
- data-recipe-command="new"
96
+ data-recipe-command="settings"
155
97
  >
156
- New task
98
+ <LucideIcon icon={Settings} name="settings" />
157
99
  </button>
158
100
  </ToolbarControlGroup>
159
- }
160
- />
161
- <div class="recipe-shell__main-body kui-pane__content kui-content">
162
- <Text class="kui-recipe__ownership kui-content-item">
163
- Recipe owns pane geometry and one scroll owner per pane. The app
164
- owns routing, data, pane visibility, sizes, and persistence.
165
- </Text>
166
- <div class="recipe-shell__cards">
167
- {[
168
- 'Release accessibility audit',
169
- 'Prepare tablet navigation',
170
- 'Review stale-data states',
171
- 'Confirm package boundaries',
172
- ].map((title) => (
173
- <article class="recipe-shell__card kui-content-item">
174
- <strong>{title}</strong>
175
- <Text class="kui-recipe__muted">
176
- Assigned to the interface systems team · due this week
177
- </Text>
178
- </article>
179
- ))}
180
- </div>
101
+ </>
102
+ }
103
+ />
104
+ <div class="recipe-shell__body">
105
+ <div id="recipe-shell-navigation" class="recipe-shell__nav-region">
106
+ <ResizableRegion
107
+ id="recipe-navigation"
108
+ label="Navigation"
109
+ size={navigationSize.value}
110
+ min={180}
111
+ max={320}
112
+ responsiveFillAt="compact"
113
+ >
114
+ <div class="recipe-shell__nav">
115
+ <Pane
116
+ element="aside"
117
+ contentElement="nav"
118
+ contentClassName="recipe-shell__nav-list"
119
+ contentLabel="Workspace"
120
+ >
121
+ <ListHeader label="Workspace" />
122
+ <section>
123
+ <ListItem
124
+ action="recipe-action"
125
+ itemId="inbox"
126
+ label="Inbox"
127
+ icon={<LucideIcon icon={Inbox} name="inbox" />}
128
+ selected={selected.value === 'inbox'}
129
+ />
130
+ <ListItem
131
+ action="recipe-action"
132
+ itemId="projects"
133
+ label="Projects with a deliberately wrapping title"
134
+ icon={<LucideIcon icon={Folder} name="folder" />}
135
+ selected={selected.value === 'projects'}
136
+ multiline
137
+ />
138
+ </section>
139
+ </Pane>
140
+ </div>
141
+ </ResizableRegion>
181
142
  </div>
182
- </main>
183
- <div id="recipe-shell-inspector" class="recipe-shell__inspector-region">
184
- <ResizableRegion
185
- id="recipe-inspector"
186
- label="Inspector"
187
- size={inspectorSize.value}
188
- min={200}
189
- max={360}
190
- edge="start"
143
+ <div class="recipe-shell__main">
144
+ <Pane
145
+ element="main"
146
+ id="recipe-shell-content"
147
+ contentClassName="recipe-shell__main-body"
148
+ header={
149
+ <Toolbar
150
+ label="Current workspace view"
151
+ dividerSides=""
152
+ leading={
153
+ <ToolbarText
154
+ text={
155
+ selected.value === 'inbox'
156
+ ? 'Inbox triage'
157
+ : 'Active projects'
158
+ }
159
+ size="xlarge"
160
+ id="recipe-shell-main-title"
161
+ />
162
+ }
163
+ trailing={
164
+ <ToolbarControlGroup
165
+ appearance="borderless"
166
+ content="text"
167
+ single
168
+ >
169
+ <button
170
+ type="button"
171
+ data-action="recipe-action"
172
+ data-recipe-command="new"
173
+ >
174
+ New task
175
+ </button>
176
+ </ToolbarControlGroup>
177
+ }
178
+ />
179
+ }
180
+ >
181
+ <RecipeOwnershipNote>
182
+ Recipe owns pane geometry and one scroll owner per pane. The app
183
+ owns routing, data, pane visibility, sizes, and persistence.
184
+ </RecipeOwnershipNote>
185
+ <div class="recipe-shell__cards">
186
+ {[
187
+ 'Release accessibility audit',
188
+ 'Prepare tablet navigation',
189
+ 'Review stale-data states',
190
+ 'Confirm package boundaries',
191
+ ].map((title) => (
192
+ <article class="recipe-shell__card kui-content-item">
193
+ <strong>{title}</strong>
194
+ <RecipeMutedText>
195
+ Assigned to the interface systems team · due this week
196
+ </RecipeMutedText>
197
+ </article>
198
+ ))}
199
+ </div>
200
+ </Pane>
201
+ </div>
202
+ <div
203
+ id="recipe-shell-inspector"
204
+ class="recipe-shell__inspector-region"
191
205
  >
192
- <aside class="recipe-shell__inspector kui-pane">
193
- <Toolbar
194
- label="Inspector"
195
- dividerSides=""
196
- leading={
197
- <ToolbarText
198
- text="Inspector"
199
- size="xlarge"
200
- id="recipe-shell-inspector-title"
201
- />
202
- }
203
- />
204
- <div class="recipe-shell__inspector-body kui-pane__content kui-content">
205
- <ValueTable label="Selected task">
206
- <ValueTableRow label="Status" value="In review" />
207
- <ValueTableRow label="Owner" value="Mara Chen" />
208
- <ValueTableRow label="Priority" value="High" />
209
- </ValueTable>
206
+ <ResizableRegion
207
+ id="recipe-inspector"
208
+ label="Inspector"
209
+ size={inspectorSize.value}
210
+ min={200}
211
+ max={360}
212
+ edge="start"
213
+ responsiveFillAt="narrow"
214
+ >
215
+ <div class="recipe-shell__inspector">
216
+ <Pane
217
+ element="aside"
218
+ contentClassName="recipe-shell__inspector-body"
219
+ header={
220
+ <Toolbar
221
+ label="Inspector"
222
+ dividerSides=""
223
+ leading={
224
+ <ToolbarText
225
+ text="Inspector"
226
+ size="xlarge"
227
+ id="recipe-shell-inspector-title"
228
+ />
229
+ }
230
+ />
231
+ }
232
+ >
233
+ <ValueTable label="Selected task">
234
+ <ValueTableRow label="Status" value="In review" />
235
+ <ValueTableRow label="Owner" value="Mara Chen" />
236
+ <ValueTableRow label="Priority" value="High" />
237
+ </ValueTable>
238
+ </Pane>
210
239
  </div>
211
- </aside>
212
- </ResizableRegion>
240
+ </ResizableRegion>
241
+ </div>
213
242
  </div>
214
243
  </div>
215
- </section>
244
+ </RecipeRoot>
216
245
  );
217
246
  return {
218
247
  render,
@@ -0,0 +1,83 @@
1
+ .recipe-collapsible-sidebar {
2
+ display: grid;
3
+ height: min(34rem, 70vh);
4
+ contain: paint;
5
+ grid-template-areas:
6
+ "rail main"
7
+ "rail drawer";
8
+ grid-template-columns: auto minmax(0, 1fr);
9
+ grid-template-rows: minmax(0, 1fr) auto;
10
+ }
11
+
12
+ .recipe-collapsible-sidebar__rail {
13
+ grid-area: rail;
14
+ display: flex;
15
+ min-height: 0;
16
+ flex-direction: column;
17
+ }
18
+
19
+ .recipe-collapsible-sidebar__rail-head {
20
+ display: flex;
21
+ align-items: center;
22
+ justify-content: space-between;
23
+ padding: var(--kui-space-2xs) var(--kui-layout-inline-margin, remify(8px));
24
+ border-block-end: 1px solid var(--kui-color-border);
25
+ }
26
+
27
+ .recipe-collapsible-sidebar__nav {
28
+ min-height: 0;
29
+ }
30
+
31
+ .recipe-collapsible-sidebar__main {
32
+ display: grid;
33
+ grid-area: main;
34
+ min-width: 0;
35
+ min-height: 0;
36
+ background: var(--kui-color-surface-lowered);
37
+ }
38
+
39
+ .recipe-collapsible-sidebar__body {
40
+ min-height: 0;
41
+ }
42
+
43
+ .recipe-collapsible-sidebar__card strong {
44
+ display: block;
45
+ }
46
+
47
+ .recipe-collapsible-sidebar__drawer {
48
+ grid-area: drawer;
49
+ display: flex;
50
+ min-height: 0;
51
+ flex-direction: column;
52
+ }
53
+
54
+ .recipe-collapsible-sidebar__drawer-body {
55
+ min-height: 0;
56
+ }
57
+
58
+ .recipe-collapsible-sidebar__log {
59
+ display: flex;
60
+ min-width: 0;
61
+ flex-direction: column;
62
+ margin: 0;
63
+ margin-inline: var(--kui-layout-inline-margin, remify(8px));
64
+ padding: 0;
65
+ list-style: none;
66
+ gap: var(--kui-space-xs);
67
+ }
68
+
69
+ .recipe-collapsible-sidebar__log li {
70
+ display: flex;
71
+ align-items: center;
72
+ color: var(--kui-color-text-quiet);
73
+ font-size: var(--kui-font-s);
74
+ gap: var(--kui-space-xs);
75
+ }
76
+
77
+ .recipe-collapsible-sidebar__log-icon {
78
+ display: inline-flex;
79
+ width: remify(16px);
80
+ height: remify(16px);
81
+ flex: none;
82
+ font-size: remify(16px);
83
+ }