@k2b/ui 0.28.0 → 0.30.0

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 (278) hide show
  1. package/README.md +1 -1
  2. package/dist/base.css +2 -2
  3. package/dist/browser/actions/ContextMenu.js +5 -0
  4. package/dist/browser/actions/ContextMenu.js.map +1 -1
  5. package/dist/browser/actions/DragAndDrop.js +89 -0
  6. package/dist/browser/actions/DragAndDrop.js.map +1 -0
  7. package/dist/browser/actions/Dropdown.js +6 -3
  8. package/dist/browser/actions/Dropdown.js.map +1 -1
  9. package/dist/browser/actions/FilterChip.js +137 -7
  10. package/dist/browser/actions/FilterChip.js.map +1 -1
  11. package/dist/browser/actions/GestureMenu.js +26 -3
  12. package/dist/browser/actions/GestureMenu.js.map +1 -1
  13. package/dist/browser/actions/SegmentedControl.js +5 -9
  14. package/dist/browser/actions/SegmentedControl.js.map +1 -1
  15. package/dist/browser/actions/SpotlightSearch.js +6 -3
  16. package/dist/browser/actions/SpotlightSearch.js.map +1 -1
  17. package/dist/browser/actions/Tabs.js +5 -2
  18. package/dist/browser/actions/Tabs.js.map +1 -1
  19. package/dist/browser/actions/ViewTabs.js +294 -0
  20. package/dist/browser/actions/ViewTabs.js.map +1 -0
  21. package/dist/browser/actions/drag-and-drop-messages.js +75 -0
  22. package/dist/browser/actions/drag-and-drop-messages.js.map +1 -0
  23. package/dist/browser/actions/drag-and-drop.js +692 -0
  24. package/dist/browser/actions/drag-and-drop.js.map +1 -0
  25. package/dist/browser/actions/filter-messages.js +6 -2
  26. package/dist/browser/actions/filter-messages.js.map +1 -1
  27. package/dist/browser/actions/index.js +3 -1
  28. package/dist/browser/actions/index.js.map +1 -1
  29. package/dist/browser/chat/ChatComposer.js +1229 -605
  30. package/dist/browser/chat/ChatComposer.js.map +1 -1
  31. package/dist/browser/chat/ChatDecision.js +814 -0
  32. package/dist/browser/chat/ChatDecision.js.map +1 -0
  33. package/dist/browser/chat/ChatPrimitives.js +292 -153
  34. package/dist/browser/chat/ChatPrimitives.js.map +1 -1
  35. package/dist/browser/chat/ChatTimeline.js.map +1 -1
  36. package/dist/browser/chat/chat-messages.js +14 -0
  37. package/dist/browser/chat/chat-messages.js.map +1 -1
  38. package/dist/browser/chat/command-search.js +35 -17
  39. package/dist/browser/chat/command-search.js.map +1 -1
  40. package/dist/browser/chat/index.js +10 -3
  41. package/dist/browser/chat/index.js.map +1 -1
  42. package/dist/browser/chat/types.js.map +1 -1
  43. package/dist/browser/content/Calendar.js +146 -119
  44. package/dist/browser/content/Calendar.js.map +1 -1
  45. package/dist/browser/content/CalendarWeekView.js +291 -266
  46. package/dist/browser/content/CalendarWeekView.js.map +1 -1
  47. package/dist/browser/content/Chart.js +54 -71
  48. package/dist/browser/content/Chart.js.map +1 -1
  49. package/dist/browser/content/DataTable.js +224 -155
  50. package/dist/browser/content/DataTable.js.map +1 -1
  51. package/dist/browser/content/FileBrowser.js +2 -2
  52. package/dist/browser/content/FileBrowser.js.map +1 -1
  53. package/dist/browser/content/FileTree.js +42 -36
  54. package/dist/browser/content/FileTree.js.map +1 -1
  55. package/dist/browser/content/FileTypeIcon.js +72 -0
  56. package/dist/browser/content/FileTypeIcon.js.map +1 -0
  57. package/dist/browser/content/FileView.js +2 -2
  58. package/dist/browser/content/FileView.js.map +1 -1
  59. package/dist/browser/content/ReferenceChip.js +162 -0
  60. package/dist/browser/content/ReferenceChip.js.map +1 -0
  61. package/dist/browser/content/calendar-pointer.js +9 -0
  62. package/dist/browser/content/calendar-pointer.js.map +1 -1
  63. package/dist/browser/content/calendar-time-view.js +6 -3
  64. package/dist/browser/content/calendar-time-view.js.map +1 -1
  65. package/dist/browser/content/data-table-messages.js +4 -2
  66. package/dist/browser/content/data-table-messages.js.map +1 -1
  67. package/dist/browser/content/index.js +2 -0
  68. package/dist/browser/content/index.js.map +1 -1
  69. package/dist/browser/feedback/MovedHint.js +197 -0
  70. package/dist/browser/feedback/MovedHint.js.map +1 -0
  71. package/dist/browser/feedback/dialog-core.js +66 -9
  72. package/dist/browser/feedback/dialog-core.js.map +1 -1
  73. package/dist/browser/feedback/index.js +1 -0
  74. package/dist/browser/feedback/index.js.map +1 -1
  75. package/dist/browser/feedback/prompts.js +6 -1
  76. package/dist/browser/feedback/prompts.js.map +1 -1
  77. package/dist/browser/inputs/DatePicker.js +337 -212
  78. package/dist/browser/inputs/DatePicker.js.map +1 -1
  79. package/dist/browser/inputs/date-picker.js +59 -5
  80. package/dist/browser/inputs/date-picker.js.map +1 -1
  81. package/dist/browser/intl/messages.js +12 -0
  82. package/dist/browser/intl/messages.js.map +1 -1
  83. package/dist/browser/intl/weekend.js +39 -0
  84. package/dist/browser/intl/weekend.js.map +1 -0
  85. package/dist/browser/layout/AppOverview.js +1 -2
  86. package/dist/browser/layout/AppOverview.js.map +1 -1
  87. package/dist/browser/layout/AppWorkspace.js +947 -531
  88. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  89. package/dist/browser/layout/PageTitle.js +3 -2
  90. package/dist/browser/layout/PageTitle.js.map +1 -1
  91. package/dist/browser/layout/PanelDialog.js +88 -86
  92. package/dist/browser/layout/PanelDialog.js.map +1 -1
  93. package/dist/browser/layout/ResizeSeparator.js +81 -0
  94. package/dist/browser/layout/ResizeSeparator.js.map +1 -0
  95. package/dist/browser/layout/SettingsModal.js +2 -2
  96. package/dist/browser/layout/SettingsModal.js.map +1 -1
  97. package/dist/browser/layout/SidebarSwitcher.js +19 -11
  98. package/dist/browser/layout/SidebarSwitcher.js.map +1 -1
  99. package/dist/browser/layout/TabBar.js +16 -13
  100. package/dist/browser/layout/TabBar.js.map +1 -1
  101. package/dist/browser/layout/app-host-width.js +44 -0
  102. package/dist/browser/layout/app-host-width.js.map +1 -0
  103. package/dist/browser/layout/app-workspace-controller.js +337 -44
  104. package/dist/browser/layout/app-workspace-controller.js.map +1 -1
  105. package/dist/browser/layout/index.js +4 -1
  106. package/dist/browser/layout/index.js.map +1 -1
  107. package/dist/browser/layout/resize-separator.js +90 -0
  108. package/dist/browser/layout/resize-separator.js.map +1 -0
  109. package/dist/browser/layout/workspace-messages.js +12 -2
  110. package/dist/browser/layout/workspace-messages.js.map +1 -1
  111. package/dist/browser/surfaces/LinkCard.js +1 -1
  112. package/dist/browser/surfaces/LinkCard.js.map +1 -1
  113. package/dist/browser/surfaces/Placeholder.js +45 -11
  114. package/dist/browser/surfaces/Placeholder.js.map +1 -1
  115. package/dist/browser/surfaces/StatCell.js +23 -0
  116. package/dist/browser/surfaces/StatCell.js.map +1 -1
  117. package/dist/browser/widgets/Widget.js +1 -1
  118. package/dist/browser/widgets/Widget.js.map +1 -1
  119. package/dist/ssr/actions/ContextMenu.js +5 -0
  120. package/dist/ssr/actions/ContextMenu.js.map +1 -1
  121. package/dist/ssr/actions/DragAndDrop.js +63 -0
  122. package/dist/ssr/actions/DragAndDrop.js.map +1 -0
  123. package/dist/ssr/actions/Dropdown.js +5 -2
  124. package/dist/ssr/actions/Dropdown.js.map +1 -1
  125. package/dist/ssr/actions/FilterChip.js +59 -7
  126. package/dist/ssr/actions/FilterChip.js.map +1 -1
  127. package/dist/ssr/actions/GestureMenu.js +26 -3
  128. package/dist/ssr/actions/GestureMenu.js.map +1 -1
  129. package/dist/ssr/actions/SegmentedControl.js +1 -2
  130. package/dist/ssr/actions/SegmentedControl.js.map +1 -1
  131. package/dist/ssr/actions/SpotlightSearch.js +2 -2
  132. package/dist/ssr/actions/SpotlightSearch.js.map +1 -1
  133. package/dist/ssr/actions/Tabs.js +2 -2
  134. package/dist/ssr/actions/Tabs.js.map +1 -1
  135. package/dist/ssr/actions/ViewTabs.js +211 -0
  136. package/dist/ssr/actions/ViewTabs.js.map +1 -0
  137. package/dist/ssr/actions/drag-and-drop-messages.js +75 -0
  138. package/dist/ssr/actions/drag-and-drop-messages.js.map +1 -0
  139. package/dist/ssr/actions/drag-and-drop.js +692 -0
  140. package/dist/ssr/actions/drag-and-drop.js.map +1 -0
  141. package/dist/ssr/actions/filter-messages.js +6 -2
  142. package/dist/ssr/actions/filter-messages.js.map +1 -1
  143. package/dist/ssr/actions/index.js +3 -1
  144. package/dist/ssr/actions/index.js.map +1 -1
  145. package/dist/ssr/chat/ChatComposer.js +668 -136
  146. package/dist/ssr/chat/ChatComposer.js.map +1 -1
  147. package/dist/ssr/chat/ChatDecision.js +479 -0
  148. package/dist/ssr/chat/ChatDecision.js.map +1 -0
  149. package/dist/ssr/chat/ChatPrimitives.js +95 -24
  150. package/dist/ssr/chat/ChatPrimitives.js.map +1 -1
  151. package/dist/ssr/chat/ChatTimeline.js.map +1 -1
  152. package/dist/ssr/chat/chat-messages.js +14 -0
  153. package/dist/ssr/chat/chat-messages.js.map +1 -1
  154. package/dist/ssr/chat/command-search.js +35 -17
  155. package/dist/ssr/chat/command-search.js.map +1 -1
  156. package/dist/ssr/chat/index.js +10 -3
  157. package/dist/ssr/chat/index.js.map +1 -1
  158. package/dist/ssr/chat/types.js.map +1 -1
  159. package/dist/ssr/content/Calendar.js +112 -103
  160. package/dist/ssr/content/Calendar.js.map +1 -1
  161. package/dist/ssr/content/CalendarWeekView.js +42 -28
  162. package/dist/ssr/content/CalendarWeekView.js.map +1 -1
  163. package/dist/ssr/content/Chart.js +19 -23
  164. package/dist/ssr/content/Chart.js.map +1 -1
  165. package/dist/ssr/content/DataTable.js +78 -31
  166. package/dist/ssr/content/DataTable.js.map +1 -1
  167. package/dist/ssr/content/FileBrowser.js +2 -2
  168. package/dist/ssr/content/FileBrowser.js.map +1 -1
  169. package/dist/ssr/content/FileTree.js +21 -14
  170. package/dist/ssr/content/FileTree.js.map +1 -1
  171. package/dist/ssr/content/FileTypeIcon.js +50 -0
  172. package/dist/ssr/content/FileTypeIcon.js.map +1 -0
  173. package/dist/ssr/content/FileView.js +2 -2
  174. package/dist/ssr/content/FileView.js.map +1 -1
  175. package/dist/ssr/content/ReferenceChip.js +121 -0
  176. package/dist/ssr/content/ReferenceChip.js.map +1 -0
  177. package/dist/ssr/content/calendar-pointer.js +9 -0
  178. package/dist/ssr/content/calendar-pointer.js.map +1 -1
  179. package/dist/ssr/content/calendar-time-view.js +6 -3
  180. package/dist/ssr/content/calendar-time-view.js.map +1 -1
  181. package/dist/ssr/content/data-table-messages.js +4 -2
  182. package/dist/ssr/content/data-table-messages.js.map +1 -1
  183. package/dist/ssr/content/index.js +2 -0
  184. package/dist/ssr/content/index.js.map +1 -1
  185. package/dist/ssr/feedback/MovedHint.js +166 -0
  186. package/dist/ssr/feedback/MovedHint.js.map +1 -0
  187. package/dist/ssr/feedback/dialog-core.js +66 -9
  188. package/dist/ssr/feedback/dialog-core.js.map +1 -1
  189. package/dist/ssr/feedback/index.js +1 -0
  190. package/dist/ssr/feedback/index.js.map +1 -1
  191. package/dist/ssr/feedback/prompts.js +6 -1
  192. package/dist/ssr/feedback/prompts.js.map +1 -1
  193. package/dist/ssr/inputs/DatePicker.js +138 -69
  194. package/dist/ssr/inputs/DatePicker.js.map +1 -1
  195. package/dist/ssr/inputs/date-picker.js +59 -5
  196. package/dist/ssr/inputs/date-picker.js.map +1 -1
  197. package/dist/ssr/intl/messages.js +12 -0
  198. package/dist/ssr/intl/messages.js.map +1 -1
  199. package/dist/ssr/intl/weekend.js +39 -0
  200. package/dist/ssr/intl/weekend.js.map +1 -0
  201. package/dist/ssr/layout/AppOverview.js +1 -2
  202. package/dist/ssr/layout/AppOverview.js.map +1 -1
  203. package/dist/ssr/layout/AppWorkspace.js +457 -116
  204. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  205. package/dist/ssr/layout/PageTitle.js +3 -2
  206. package/dist/ssr/layout/PageTitle.js.map +1 -1
  207. package/dist/ssr/layout/PanelDialog.js +7 -6
  208. package/dist/ssr/layout/PanelDialog.js.map +1 -1
  209. package/dist/ssr/layout/ResizeSeparator.js +45 -0
  210. package/dist/ssr/layout/ResizeSeparator.js.map +1 -0
  211. package/dist/ssr/layout/SettingsModal.js +2 -2
  212. package/dist/ssr/layout/SettingsModal.js.map +1 -1
  213. package/dist/ssr/layout/SidebarSwitcher.js +19 -11
  214. package/dist/ssr/layout/SidebarSwitcher.js.map +1 -1
  215. package/dist/ssr/layout/TabBar.js +2 -2
  216. package/dist/ssr/layout/TabBar.js.map +1 -1
  217. package/dist/ssr/layout/app-host-width.js +44 -0
  218. package/dist/ssr/layout/app-host-width.js.map +1 -0
  219. package/dist/ssr/layout/app-workspace-controller.js +337 -44
  220. package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
  221. package/dist/ssr/layout/index.js +4 -1
  222. package/dist/ssr/layout/index.js.map +1 -1
  223. package/dist/ssr/layout/resize-separator.js +90 -0
  224. package/dist/ssr/layout/resize-separator.js.map +1 -0
  225. package/dist/ssr/layout/workspace-messages.js +12 -2
  226. package/dist/ssr/layout/workspace-messages.js.map +1 -1
  227. package/dist/ssr/surfaces/LinkCard.js +1 -1
  228. package/dist/ssr/surfaces/LinkCard.js.map +1 -1
  229. package/dist/ssr/surfaces/Placeholder.js +25 -6
  230. package/dist/ssr/surfaces/Placeholder.js.map +1 -1
  231. package/dist/ssr/surfaces/StatCell.js +23 -0
  232. package/dist/ssr/surfaces/StatCell.js.map +1 -1
  233. package/dist/ssr/widgets/Widget.js +1 -1
  234. package/dist/ssr/widgets/Widget.js.map +1 -1
  235. package/dist/styles.css +1 -1
  236. package/dist/types/actions/ContextMenu.d.ts +1 -0
  237. package/dist/types/actions/DragAndDrop.d.ts +29 -0
  238. package/dist/types/actions/Dropdown.d.ts +4 -0
  239. package/dist/types/actions/FilterChip.d.ts +22 -0
  240. package/dist/types/actions/ViewTabs.d.ts +30 -0
  241. package/dist/types/actions/drag-and-drop-messages.d.ts +35 -0
  242. package/dist/types/actions/drag-and-drop.d.ts +36 -0
  243. package/dist/types/actions/filter-messages.d.ts +2 -0
  244. package/dist/types/actions/index.d.ts +6 -2
  245. package/dist/types/chat/ChatComposer.d.ts +71 -1
  246. package/dist/types/chat/ChatDecision.d.ts +149 -0
  247. package/dist/types/chat/ChatPrimitives.d.ts +14 -1
  248. package/dist/types/chat/ChatTimeline.d.ts +2 -1
  249. package/dist/types/chat/chat-messages.d.ts +7 -0
  250. package/dist/types/chat/command-search.d.ts +5 -0
  251. package/dist/types/chat/index.d.ts +28 -5
  252. package/dist/types/chat/types.d.ts +54 -1
  253. package/dist/types/content/Chart.d.ts +9 -3
  254. package/dist/types/content/DataTable.d.ts +3 -0
  255. package/dist/types/content/FileTypeIcon.d.ts +27 -0
  256. package/dist/types/content/ReferenceChip.d.ts +49 -0
  257. package/dist/types/content/calendar-pointer.d.ts +6 -0
  258. package/dist/types/content/data-table-messages.d.ts +1 -0
  259. package/dist/types/content/index.d.ts +3 -0
  260. package/dist/types/feedback/MovedHint.d.ts +25 -0
  261. package/dist/types/feedback/dialog-core.d.ts +5 -2
  262. package/dist/types/feedback/index.d.ts +2 -0
  263. package/dist/types/feedback/prompts.d.ts +2 -0
  264. package/dist/types/inputs/DatePicker.d.ts +7 -0
  265. package/dist/types/inputs/date-picker.d.ts +25 -1
  266. package/dist/types/intl/messages.d.ts +6 -0
  267. package/dist/types/intl/weekend.d.ts +12 -0
  268. package/dist/types/layout/AppWorkspace.d.ts +48 -10
  269. package/dist/types/layout/ResizeSeparator.d.ts +9 -0
  270. package/dist/types/layout/TabBar.d.ts +7 -0
  271. package/dist/types/layout/app-host-width.d.ts +6 -0
  272. package/dist/types/layout/app-workspace-controller.d.ts +2 -0
  273. package/dist/types/layout/index.d.ts +5 -2
  274. package/dist/types/layout/resize-separator.d.ts +18 -0
  275. package/dist/types/layout/workspace-messages.d.ts +5 -0
  276. package/dist/types/surfaces/Placeholder.d.ts +2 -1
  277. package/dist/types/surfaces/StatCell.d.ts +6 -0
  278. package/package.json +5 -5
@@ -1,7 +1,60 @@
1
+ import type { JSX } from "solid-js";
1
2
  import type { EmojiSkinTone } from "../inputs/emoji/emoji-index";
2
3
  export type ChatRole = "user" | "assistant" | "system" | "tool";
3
4
  export type ChatMessageStatus = "pending" | "streaming" | "complete" | "error";
4
- export type ChatActivityTone = "neutral" | "ai" | "success" | "danger";
5
+ /** `warning` marks a partial result or an outcome that is not yet known. */
6
+ export type ChatActivityTone = "neutral" | "ai" | "success" | "warning" | "danger";
7
+ /** `open` asks; `sending` while the answer is on its way; `decided` once answered; `expired` when it ran out. */
8
+ export type ChatDecisionState = "open" | "sending" | "decided" | "expired";
9
+ /** One answer of a question. Set the question's state in `onSelect` before awaiting anything, so it collapses at once. */
10
+ export type ChatDecisionAnswer = {
11
+ label: string;
12
+ /** Icon class, for example `ti ti-send`. */
13
+ icon?: string;
14
+ onSelect: () => void | Promise<void>;
15
+ };
16
+ /** Why a question is asked, or why its main answer is off. */
17
+ export type ChatDecisionReason = {
18
+ text: JSX.Element;
19
+ /** Icon class; the text after it starts 1.5rem from the edge. */
20
+ icon?: string;
21
+ /** `danger` for deletions, `warning` for outside content and limits. */
22
+ tone?: "neutral" | "danger" | "warning";
23
+ };
24
+ export type ChatOutcomeTone = "running" | "done" | "off" | "waiting" | "warning" | "error";
25
+ /** One text of an outcome flow. */
26
+ export type ChatOutcomeLine = {
27
+ tone: ChatOutcomeTone;
28
+ /** What happened, as one sentence, usually with `ReferenceChip`s. */
29
+ text: JSX.Element;
30
+ /** A quiet second sentence, such as "You declined." */
31
+ detail?: JSX.Element;
32
+ /** A formatted time after the text. */
33
+ time?: string;
34
+ /** Replaces the tone's icon, for example `ti ti-clock-x` for an expired question. */
35
+ icon?: string;
36
+ /** One text link after the line, such as "Ask again". */
37
+ action?: {
38
+ label: string;
39
+ onSelect: () => void | Promise<void>;
40
+ };
41
+ /** Small buttons under the line. Shown while this line is current; otherwise hidden but still reserving their row. */
42
+ actions?: JSX.Element;
43
+ };
44
+ /** A person in a preview header: the name in the text colour, then the address the message really uses. */
45
+ export type ChatPreviewPerson = {
46
+ name?: string;
47
+ address?: string;
48
+ };
49
+ /** One header row, such as "To Lea Berg lea.berg@example.com". */
50
+ export type ChatPreviewHeaderRow = {
51
+ label: string;
52
+ people?: readonly ChatPreviewPerson[];
53
+ /** Further content after the people, such as "and 2 more". */
54
+ value?: JSX.Element;
55
+ /** Draws the label stronger, for recipients others cannot see. */
56
+ emphasis?: boolean;
57
+ };
5
58
  type ChatActionBase = {
6
59
  id: string;
7
60
  label: string;
@@ -25,9 +25,9 @@ import { type StateTimelineChartOptions, type StateTimelineDomain } from "./char
25
25
  * **Why so thin.** The props are a discriminated union over each
26
26
  * stdlib chart function — `kind: "line"` brings in exactly the params
27
27
  * `charts.line` expects, `kind: "bar"` brings in `charts.bar`'s, etc.
28
- * Options stay aligned with stdlib without renaming. Shared interactive
29
- * layers add bounded pan / zoom controls to maps and state timelines, plus
30
- * renderer-owned inspection, tooltips and optional selection for all chart kinds.
28
+ * Options stay aligned with stdlib without renaming. Every chart provides
29
+ * renderer-owned inspection, tooltips and optional selection by default.
30
+ * `interactive` adds bounded pan / zoom and reset controls to maps and state timelines.
31
31
  * If stdlib gains a new option, it's automatically available at every
32
32
  * callsite.
33
33
  *
@@ -75,10 +75,16 @@ export type ChartProps = {
75
75
  class?: string;
76
76
  style?: JSX.CSSProperties | string;
77
77
  labels?: ChartLabels;
78
+ /**
79
+ * Navigation for maps and state timelines: pan, zoom and reset controls.
80
+ * Arrows pan; Alt+arrows inspect. Every chart shows tooltips and keyboard
81
+ * inspection without this prop.
82
+ */
78
83
  interactive?: boolean;
79
84
  onSelect?: (selection: ChartSelection) => void;
80
85
  /** Controlled highlight; indices belong to this exact input snapshot. */
81
86
  selected?: ChartDatumRef | null;
87
+ /** Customize the always-on tooltip with a title and labeled text rows. */
82
88
  tooltip?: ChartTooltipFormatter;
83
89
  /** Optional shared X cursor for line charts. */
84
90
  cursor?: ChartCursor;
@@ -85,6 +85,9 @@ export type DataTableProps<T> = {
85
85
  footer?: DataTableFooter<T>;
86
86
  hasMore?: boolean;
87
87
  loadingMore?: boolean;
88
+ loading?: boolean;
89
+ /** Initial placeholder count, clamped to an integer from 1 to 50. Defaults to 5. */
90
+ loadingRows?: number;
88
91
  onLoadMore?: () => void;
89
92
  empty?: JSX.Element;
90
93
  density?: "compact" | "normal";
@@ -0,0 +1,27 @@
1
+ import type { JSX } from "solid-js";
2
+ /** The colour family a file's icon tile uses. `other` covers code, text, and unknown files. */
3
+ export type FileType = "folder" | "pdf" | "image" | "sheet" | "document" | "slides" | "video" | "audio" | "archive" | "other";
4
+ export type FileTypeIconProps = {
5
+ /** The file or folder name; its extension picks the glyph and the type colour. */
6
+ name: string;
7
+ mediaType?: string;
8
+ folder?: boolean;
9
+ /** Shows an open folder, for example the folder a list is showing. */
10
+ open?: boolean;
11
+ /** A Tabler icon class that replaces the glyph the name picks; the type colour still follows the name. */
12
+ icon?: string;
13
+ /** `sm` for tree rows, `md` for list rows, `lg` for grid previews. Defaults to `md`. */
14
+ size?: "sm" | "md" | "lg";
15
+ class?: string;
16
+ };
17
+ /** Resolve the colour family for a file or folder from its name and media type. */
18
+ export declare const fileTypeOf: (file: {
19
+ name: string;
20
+ mediaType?: string;
21
+ folder?: boolean;
22
+ }) => FileType;
23
+ /**
24
+ * A file or folder glyph in a soft chip of its type colour. Folders take the app accent hook
25
+ * `--k2b-app-workspace-active`; code, text, and unknown files a neutral ink. The box size is fixed per `size`.
26
+ */
27
+ export declare function FileTypeIcon(props: FileTypeIconProps): JSX.Element;
@@ -0,0 +1,49 @@
1
+ import { type JSX } from "solid-js";
2
+ /** The visible length of a chip; longer titles are cut in the middle. */
3
+ export declare const REFERENCE_CHIP_MAX_CHARACTERS = 40;
4
+ /**
5
+ * Shortens `text` to at most `max` visible characters by cutting its middle, so the start and an ending such as
6
+ * ".pdf" stay readable. Counts user-perceived characters, so an emoji is never split.
7
+ * @example truncateMiddle("Quarterly report for the operations team 2026.pdf", 24) // "Quarterly re…m 2026.pdf"
8
+ */
9
+ export declare const truncateMiddle: (text: string, max?: number) => string;
10
+ type ReferenceChipCommon = {
11
+ class?: string;
12
+ };
13
+ /** A thing or a place: an icon in its application colour and its title, a link while it exists. */
14
+ export type ReferenceChipObjectProps = ReferenceChipCommon & {
15
+ kind: "object" | "place";
16
+ title: string;
17
+ /** Destination of the chip. Omit it, or set `gone`, when there is nothing to open. */
18
+ href?: string;
19
+ /** Icon class, for example `ti ti-mail`. */
20
+ icon?: string;
21
+ /** Icon colour, usually the owning application's accent. Sets `--k2b-reference-icon`. */
22
+ accent?: string;
23
+ /** The thing no longer exists: struck through and never a link. */
24
+ gone?: boolean;
25
+ };
26
+ /** A person: avatar and display name. The address belongs in the preview, never in the chip. */
27
+ export type ReferenceChipPersonProps = ReferenceChipCommon & {
28
+ kind: "person";
29
+ name: string;
30
+ /** Avatar image; initials on a tint from the name otherwise. */
31
+ src?: string | null;
32
+ href?: string;
33
+ };
34
+ /** A date or time the host already formatted for the reader. */
35
+ export type ReferenceChipTimeProps = ReferenceChipCommon & {
36
+ kind: "time";
37
+ label: string;
38
+ /** Machine-readable value for `<time datetime>`. */
39
+ dateTime?: string;
40
+ };
41
+ export type ReferenceChipProps = ReferenceChipObjectProps | ReferenceChipPersonProps | ReferenceChipTimeProps;
42
+ /**
43
+ * A typed reference inside a sentence: a thing, a place, a person, or a time, in the calm `.k2b-reference` pill.
44
+ * A chip shows at most 40 characters and cuts longer titles in the middle; the full title stays its accessible name
45
+ * and tooltip.
46
+ * @example <ReferenceChip kind="object" title="Maintenance window" icon="ti ti-mail" accent="var(--app-mail)" href="/mail/…" />
47
+ */
48
+ export declare function ReferenceChip(props: ReferenceChipProps): JSX.Element;
49
+ export default ReferenceChip;
@@ -22,6 +22,12 @@ type CalendarPointerSessionOptions<T> = {
22
22
  /** Called on every move once the gesture is active, such as to move a token with the pointer. */
23
23
  onMove?: (clientX: number, clientY: number) => void;
24
24
  };
25
+ /**
26
+ * Runs `open` once the browser has handled the pointer release that ends a drag. The browser light-dismisses an
27
+ * `auto` popover that opens while it dispatches that `pointerup`, as the HTML popover rules ask and Chromium 156
28
+ * does, so a popover that a drag opens must open after the release.
29
+ */
30
+ export declare const afterPointerRelease: (open: () => void) => void;
25
31
  /**
26
32
  * Owns one pointer gesture from threshold crossing through commit or cancel.
27
33
  * Views provide geometry through `resolve`; this helper owns global cleanup,
@@ -2,6 +2,7 @@ declare const dataTableMessages: import("@k2b/stdlib").Catalog<{
2
2
  dataTable: string;
3
3
  noColumns: string;
4
4
  noRecords: string;
5
+ loadingRows: string;
5
6
  }>;
6
7
  export type DataTableMessages = ReturnType<(typeof dataTableMessages)["resolve"]>["t"];
7
8
  /** Resolved from the inherited render locale. */
@@ -25,6 +25,7 @@ export { DocCode, DocConceptGrid, DocInlineCode, DocLead, DocNote, DocPage, DocR
25
25
  export { FileBrowserPanel, type FileBrowserPanelProps, type FileSource, openFileBrowser } from "./FileBrowser";
26
26
  export { FileGrid, type FileGridProps } from "./FileGrid";
27
27
  export { default as FileTree, type FileTreeActions, type FileTreeEntry, type FileTreeProps } from "./FileTree";
28
+ export { type FileType, FileTypeIcon, type FileTypeIconProps, fileTypeOf } from "./FileTypeIcon";
28
29
  export { canPreviewFile, default as FileView, type FileViewContent, type FileViewFile, type FileViewPreviewKind, type FileViewProps, type FileViewRenderer, type FileViewRendererProps, formatFileViewSize, getFileViewPreviewKind, } from "./FileView";
29
30
  export type { KbdProps } from "./Kbd";
30
31
  export { Kbd } from "./Kbd";
@@ -45,6 +46,8 @@ export { default as PdfPreview } from "./PdfPreview";
45
46
  export type { RangeOption, RangePickerProps } from "./RangePicker";
46
47
  export { default as RangePicker } from "./RangePicker";
47
48
  export { ReactionBar, type ReactionBarItem, type ReactionBarProps } from "./ReactionBar";
49
+ export type { ReferenceChipObjectProps, ReferenceChipPersonProps, ReferenceChipProps, ReferenceChipTimeProps, } from "./ReferenceChip";
50
+ export { REFERENCE_CHIP_MAX_CHARACTERS, ReferenceChip, truncateMiddle } from "./ReferenceChip";
48
51
  export type { StepsProps } from "./Steps";
49
52
  export { Steps } from "./Steps";
50
53
  export type { StructuredDataPreviewMode, StructuredDataPreviewProps, StructuredDataValue } from "./StructuredDataPreview";
@@ -0,0 +1,25 @@
1
+ import { type JSX } from "solid-js";
2
+ import { type TooltipPlacement } from "./tooltip-position";
3
+ export type MovedHintAction = {
4
+ label: string;
5
+ href: string;
6
+ onClick?: never;
7
+ } | {
8
+ label: string;
9
+ onClick: () => void;
10
+ href?: never;
11
+ };
12
+ export type MovedHintProps = {
13
+ /** The owner decides this on the server, so a dismissed hint never renders again. */
14
+ open: boolean;
15
+ /** Called once per open period when the person closes the hint or uses its action. */
16
+ onDismiss: () => void;
17
+ /** Render the hint directly after this element to preserve keyboard order. */
18
+ target: () => HTMLElement | undefined;
19
+ /** Short text naming the new place. */
20
+ children: JSX.Element;
21
+ action: MovedHintAction;
22
+ placement?: TooltipPlacement;
23
+ class?: string;
24
+ };
25
+ export declare function MovedHint(props: MovedHintProps): JSX.Element;
@@ -10,9 +10,11 @@ export type OpenDialogOptions = {
10
10
  ariaLabel?: string;
11
11
  /**
12
12
  * Add a same-URL history entry while the dialog is open, so the browser's or the phone's Back closes the dialog
13
- * instead of leaving the page. Closing the dialog removes the entry again; the returned promise settles after that.
13
+ * instead of leaving the page. Normally closing the dialog removes the entry again; the returned promise settles after that.
14
14
  * With the Navigation API, same-URL traversals between this core's entries and the page do not reach application popstate listeners.
15
15
  * Without it, only the synthetic Back on close is suppressed.
16
+ * Island disposal closes every open dialog immediately and forgets its marker without traversing history.
17
+ * The same-URL entry remains for the router to replace and counts as a page entry for later dialogs.
16
18
  */
17
19
  history?: boolean;
18
20
  };
@@ -46,7 +48,8 @@ export declare const dialogCore: DialogCore;
46
48
  /**
47
49
  * Internal: transient UI shares dialogs' Back handling without exposing another public dialog capability.
48
50
  * Same-URL traversals are suppressed with the Navigation API; without it, only the synthetic Back on release is suppressed.
51
+ * Release during island disposal forgets the marker without traversing; the router may replace the remaining entry.
49
52
  */
50
53
  export declare const holdDialogHistory: (onBack: () => void) => (() => void);
51
- /** Internal: waits until entries released through `holdDialogHistory` have left the history. */
54
+ /** Internal: waits until released holders have left history or were forgotten during island disposal. */
52
55
  export declare const dialogHistorySettled: () => Promise<void>;
@@ -10,6 +10,8 @@ export type { InstallGuideProps } from "./InstallGuide";
10
10
  export { default as InstallGuide } from "./InstallGuide";
11
11
  export type { InstallationPlatform, InstallPrompt } from "./install";
12
12
  export { createInstallPrompt, installationPlatform } from "./install";
13
+ export type { MovedHintAction, MovedHintProps } from "./MovedHint";
14
+ export { MovedHint } from "./MovedHint";
13
15
  export type { ConfirmOptions, DialogOptions, FieldSchema, PromptFieldBase, PromptSearchInput, PromptSearchItem, PromptSearchOptions, } from "./prompts";
14
16
  export { createFormState, DialogHeader, prompts } from "./prompts";
15
17
  export type { TooltipAnchorProps, TooltipPlacement, TooltipProps, TooltipTriggerProps } from "./Tooltip";
@@ -94,6 +94,8 @@ export type FieldSchema = (PromptFieldBase<string> & {
94
94
  }) | (PromptFieldBase<string> & {
95
95
  type: "datetime";
96
96
  dateOnly?: boolean;
97
+ /** A date whose time is optional, as `DateTimePicker`'s `optionalTime`. */
98
+ optionalTime?: boolean;
97
99
  }) | {
98
100
  type: "info";
99
101
  content: string | JSX.Element | (() => JSX.Element);
@@ -28,6 +28,13 @@ export type DatePickerProps = DatePickerBaseProps<string | null> & {
28
28
  export type DateTimePickerProps = DatePickerBaseProps<string | null> & {
29
29
  /** Trigger content for a set value, for example the date and time with a relative hint. */
30
30
  renderValue?: (value: string) => JSX.Element;
31
+ /**
32
+ * The time is optional: the value is a date key such as `2026-10-24` until **Add time** adds one, then a date-time
33
+ * like without this option. Removing the time returns to the date key.
34
+ */
35
+ optionalTime?: boolean;
36
+ /** The time a new value starts with, `09:00` by default. */
37
+ defaultTime?: string;
31
38
  };
32
39
  export type DateRangePickerProps = DatePickerBaseProps<DateRangeValue> & {
33
40
  withTime?: boolean;
@@ -30,7 +30,10 @@ export declare const monthDate: (year: number, month: number, context?: DateCont
30
30
  * or repeats midnight, the day starts at its first existing instant.
31
31
  */
32
32
  export declare const msUntilNextDay: (now: Date, context?: DateContext) => number;
33
+ /** Whether `value` is a date key such as `2026-10-24`, a date without a time. */
34
+ export declare const isDateKey: (value: string) => boolean;
33
35
  export declare const parseDateValue: (value: string | null | undefined, context?: DateContext) => Date;
36
+ /** A date key names a calendar day, so it is formatted at noon UTC in UTC: no runtime or picker zone can move it. */
34
37
  export declare const displayDate: (value: string | null | undefined, context?: DateContext) => string;
35
38
  export declare const dateTimeInput: (value: string | null | undefined, context?: DateContext) => string;
36
39
  export declare const splitDateTime: (value: string | null | undefined, context?: DateContext) => {
@@ -43,7 +46,28 @@ export declare const formatDateTimeValue: (value: string | null | undefined, con
43
46
  export declare const normalizeTimeInput: (value: string) => string;
44
47
  export declare const filterTimeInput: (value: string) => string;
45
48
  export declare const orderedRange: (start: string, end: string) => DateRangeValue;
46
- export declare const previewRange: (range: DateRangeValue, preview: string | null) => DateRangeValue;
49
+ /**
50
+ * The range a click picks. A click starts a complete one-day range on its day, and it becomes the anchor; the next
51
+ * click on another day extends the range from the anchor, whichever side it lies on. A click on the anchor keeps the
52
+ * one-day range. After an extension, the next click starts a new one-day range.
53
+ */
54
+ export declare const pickRangeDay: (range: DateRangeValue, anchor: string | null, day: string) => {
55
+ range: DateRangeValue;
56
+ anchor: string | null;
57
+ };
58
+ /** The anchor that the next click extends from: only while the range is still the one-day range of its click. */
59
+ export declare const rangeAnchor: (range: DateRangeValue, anchor: string | null) => string | null;
60
+ /** The range shown while the pointer or focus rests on `preview`: the extension that a click there would pick. */
61
+ export declare const previewRange: (range: DateRangeValue, anchor: string | null, preview: string | null) => DateRangeValue;
47
62
  export declare const inRange: (day: string, range: DateRangeValue) => boolean;
48
63
  export declare const isRangeEdge: (day: string, range: DateRangeValue) => boolean;
49
64
  export declare const formatDateOnlyRangeDuration: (range: DateRangeValue, context?: DateContext) => string;
65
+ /**
66
+ * The weekend bands of a week row: one band per run of adjacent weekend columns, as a zero-based start column and a
67
+ * number of columns. Saturday and Sunday in a week from Monday are one band of two; in a week from Sunday they are
68
+ * two bands at both ends.
69
+ */
70
+ export declare const weekendBands: (weekend: readonly boolean[]) => {
71
+ start: number;
72
+ span: number;
73
+ }[];
@@ -25,12 +25,16 @@ declare const uiMessages: import("@k2b/stdlib").Catalog<{
25
25
  nothingToShow: string;
26
26
  no: string;
27
27
  options: string;
28
+ more: string;
29
+ moreViews: string;
28
30
  pickDate: string;
29
31
  previousMonth: string;
30
32
  previousYear: string;
31
33
  nextMonth: string;
32
34
  nextYear: string;
33
35
  retry: string;
36
+ tryAgain: string;
37
+ movedHintDismiss: string;
34
38
  reset: string;
35
39
  required: string;
36
40
  delete: string;
@@ -56,6 +60,8 @@ declare const uiMessages: import("@k2b/stdlib").Catalog<{
56
60
  month: string;
57
61
  year: string;
58
62
  allDay: string;
63
+ addTime: string;
64
+ removeTime: string;
59
65
  previous: string;
60
66
  next: string;
61
67
  cancel: string;
@@ -0,0 +1,12 @@
1
+ /**
2
+ * The weekend days of `locale` as JavaScript day numbers (0 for Sunday): Saturday and Sunday in Germany, Friday and
3
+ * Saturday in Israel. The days come from the engine's Intl week data where it has them, otherwise Saturday and Sunday.
4
+ * Without a locale the answer is Saturday and Sunday too, so a server render and the browser agree.
5
+ */
6
+ export declare const weekendDays: (locale: string | undefined) => ReadonlySet<number>;
7
+ /** The day of the week of a date key such as `2026-10-24`, as a JavaScript day number (0 for Sunday). */
8
+ export declare const dayOfWeekOfKey: (key: string) => number;
9
+ /** Whether the day of `key` is a weekend day of `locale`. */
10
+ export declare const isWeekendKey: (key: string, locale: string | undefined) => boolean;
11
+ /** Whether column `index` of a week that starts on `firstDayOfWeek` (0 for Sunday, 1 for Monday) is a weekend day. */
12
+ export declare const isWeekendColumn: (index: number, firstDayOfWeek: number, locale: string | undefined) => boolean;
@@ -3,6 +3,28 @@ import { type JSX } from "solid-js";
3
3
  import { type AppWorkspaceLayoutState } from "./app-workspace-state";
4
4
  import type { ScrollAreaProps } from "./ScrollArea";
5
5
  import { type AppWorkspaceSidebarSwitcherProps } from "./SidebarSwitcher";
6
+ export type AppWorkspaceHeadProps = {
7
+ /** View tabs, usually a ViewTabs. */
8
+ views?: JSX.Element;
9
+ /** Filter chips, usually FilterChip elements. */
10
+ filters?: JSX.Element;
11
+ /** Any filter is active: shows Reset and the quiet result count. */
12
+ filtered?: boolean;
13
+ /** Reset target while filtered: a URL (works without JavaScript) and/or a callback. */
14
+ resetHref?: string;
15
+ onReset?: () => void;
16
+ /** Quiet result count shown only while filtered; CSS drops it first when space is short. */
17
+ count?: JSX.Element;
18
+ /** Secondary actions at the end of the row. Never a filled button. */
19
+ actions?: JSX.Element;
20
+ /** The one filled primary action. Below 48rem it becomes a round icon button beside the host's bottom bar. */
21
+ primary?: {
22
+ label: string;
23
+ icon: string;
24
+ href?: string;
25
+ onClick?: (event: MouseEvent) => void;
26
+ };
27
+ };
6
28
  export type AppWorkspaceProps = {
7
29
  children: JSX.Element;
8
30
  class?: string;
@@ -40,6 +62,14 @@ export type AppWorkspaceMainProps = {
40
62
  class?: string;
41
63
  /** `"content"` centers the children as one reading column with the shared page width on large screens. */
42
64
  width?: "full" | "content";
65
+ /**
66
+ * The width in px that Main keeps beside the sidebar and an open Detail,
67
+ * from 48rem (768 px); at least the default 320. A Detail that does not fit
68
+ * beside it waits behind the head's Details button, and from 64rem of host
69
+ * width a sidebar that does not fit becomes the overlay. CSS decides, so
70
+ * the server renders the first frame.
71
+ */
72
+ minWidth?: number;
43
73
  mobilePane?: string;
44
74
  /** Levels in DOM order, shallowest first. The URL selects the deepest level by id. */
45
75
  level?: string;
@@ -75,6 +105,12 @@ export type AppWorkspaceDetailWidth = "sm" | "md" | "lg" | "xl";
75
105
  export type AppWorkspaceDetailProps = {
76
106
  children: JSX.Element;
77
107
  open: boolean;
108
+ /**
109
+ * Whether choosing an item in Main opens this Detail as the drawer while it waits.
110
+ * Set false when Main itself shows the chosen item, such as a reader beside a list:
111
+ * the drawer then opens only from Details or from a toggle in Main.
112
+ */
113
+ openOnChoice?: boolean;
78
114
  id: string;
79
115
  class?: string;
80
116
  width?: AppWorkspaceDetailWidth;
@@ -85,12 +121,11 @@ export type AppWorkspaceDetailProps = {
85
121
  minWidth?: number;
86
122
  maxWidth?: number;
87
123
  /**
88
- * Closes the panel: Escape, a swipe on a touch screen, and dragging the
89
- * phone sheet down call it. A panel rendered on the server only marks its
90
- * own close button or link with `data-workspace-detail-close` instead, and
91
- * those gestures click it. Without either, they leave the panel open, and on
92
- * a touch tablet in portrait the panel makes room beside `Main` instead of
93
- * overlaying it as a drawer.
124
+ * Closes the column with Escape, or the phone sheet with a downward drag.
125
+ * Server-rendered panels mark their close control with
126
+ * `data-workspace-detail-close` instead; those gestures click it.
127
+ * Escape and a rightward touch swipe park an open waiting drawer without
128
+ * calling onClose, so its Details button can open it again.
94
129
  */
95
130
  onClose?: () => void;
96
131
  /**
@@ -123,9 +158,11 @@ export type AppWorkspaceSidebarProps = {
123
158
  /**
124
159
  * Below 48rem (768 px) the sidebar is hidden and the host's mobile
125
160
  * navigation takes over; from 48 to 64rem it is an overlay that a button in
126
- * the workspace's head opens. `"stacked"` keeps it as a block above the
127
- * content below 64rem instead, for overviews whose sidebar is the primary
128
- * object list.
161
+ * the workspace's head opens. `"stacked"` is for overviews whose sidebar is
162
+ * the primary object list: below 64rem its items become one row of chips
163
+ * above the content, and "All" at the end of the row opens the complete
164
+ * sidebar in a sheet (a centered dialog from 48rem). From 64rem it is the
165
+ * regular sidebar column; the element is a `nav` landmark either way.
129
166
  */
130
167
  mobile?: "hidden" | "stacked";
131
168
  resizable?: boolean;
@@ -247,7 +284,7 @@ export type AppWorkspaceSidebarItemIconProps = {
247
284
  };
248
285
  export type AppWorkspaceSidebarItemLabelProps = {
249
286
  children: JSX.Element;
250
- /** False keeps one line with an ellipsis; rows wrap long labels onto a second line by default. */
287
+ /** False keeps one line that fades out; rows wrap long labels onto a second line by default. */
251
288
  marquee?: boolean;
252
289
  };
253
290
  export type AppWorkspaceSidebarItemMetaProps = {
@@ -360,6 +397,7 @@ type AppWorkspaceNavTreeComponent = ((props: AppWorkspaceNavTreeProps) => JSX.El
360
397
  };
361
398
  type AppWorkspaceComponent = ((props: AppWorkspaceProps) => JSX.Element) & {
362
399
  LayoutStateProvider: (props: AppWorkspaceLayoutStateProviderProps) => JSX.Element;
400
+ Head: (props: AppWorkspaceHeadProps) => JSX.Element;
363
401
  Content: (props: AppWorkspaceContentProps) => JSX.Element;
364
402
  Main: (props: AppWorkspaceMainProps) => JSX.Element;
365
403
  MainPane: (props: AppWorkspaceMainPaneProps) => JSX.Element;
@@ -0,0 +1,9 @@
1
+ import { type ResizeSeparatorOptions } from "./resize-separator";
2
+ export type ResizeSeparatorProps = Omit<ResizeSeparatorOptions, "value"> & {
3
+ label: string;
4
+ orientation: "vertical" | "horizontal";
5
+ value: number;
6
+ controls?: string;
7
+ class?: string;
8
+ };
9
+ export default function ResizeSeparator(props: ResizeSeparatorProps): import("solid-js").JSX.Element;
@@ -15,6 +15,13 @@ export type TabBarProps = {
15
15
  label: string;
16
16
  /** Up to five destinations; further items are not rendered. Put the rest behind a "More" destination. */
17
17
  items: readonly TabBarItem[];
18
+ /**
19
+ * `bar` (the default) is flat on the page canvas and pads the bottom safe area. `floating` is a rounded bar that the
20
+ * host places above the content, away from the safe areas; its open item is a raised chip. The host may paint it
21
+ * with `--k2b-tab-bar-background`, color its items with `--k2b-tab-bar-color`, and color the open item with
22
+ * `--k2b-tab-bar-selected-background` and `--k2b-tab-bar-selected-color`.
23
+ */
24
+ variant?: "bar" | "floating";
18
25
  class?: string;
19
26
  };
20
27
  /**
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Watches whether workspace chrome has at least `minRem` of app host width.
3
+ * CSS for the same chrome uses `@container k2b-app-area (min-width: …)`.
4
+ * Call with a mounted element; the returned function stops all observation.
5
+ */
6
+ export declare function watchAppHostWidth(element: Element, minRem: number, update: (matches: boolean) => void): () => void;
@@ -4,6 +4,8 @@ export type AppWorkspaceControllerOptions = {
4
4
  readState?: () => AppWorkspaceLayoutState | null | undefined;
5
5
  writeState?: (state: AppWorkspaceLayoutState) => void;
6
6
  };
7
+ /** Parks open waiting-detail drawers; focus follows only when it was inside one. */
8
+ export declare const parkWorkspaceDetailDrawers: (root?: ParentNode) => void;
7
9
  /**
8
10
  * Asks the owning `AppWorkspace.Sidebar` to hide. The sidebar's `hidden` prop
9
11
  * stays application state, so the controller only requests the change.
@@ -1,9 +1,10 @@
1
1
  export type { AppOverviewCardsProps, AppOverviewEmptyStateProps, AppOverviewPanelProps, AppOverviewProps, } from "./AppOverview";
2
2
  export { default as AppOverview } from "./AppOverview";
3
- export type { AppWorkspaceBottomDrawerHeight, AppWorkspaceBottomDrawerProps, AppWorkspaceContentProps, AppWorkspaceDetailProps, AppWorkspaceDetailWidth, AppWorkspaceMainPaneProps, AppWorkspaceMainProps, AppWorkspaceNavTreeItemProps, AppWorkspaceNavTreeMove, AppWorkspaceNavTreeProps, AppWorkspaceProps, AppWorkspaceSidebarAccessoryVisibility, AppWorkspaceSidebarBodyProps, AppWorkspaceSidebarIconActionProps, AppWorkspaceSidebarIconActionTone, AppWorkspaceSidebarIconGridProps, AppWorkspaceSidebarItemActionProps, AppWorkspaceSidebarItemActionsProps, AppWorkspaceSidebarItemIconProps, AppWorkspaceSidebarItemLabelProps, AppWorkspaceSidebarItemMetaProps, AppWorkspaceSidebarItemProps, AppWorkspaceSidebarItemStatusProps, AppWorkspaceSidebarItemTone, AppWorkspaceSidebarProps, AppWorkspaceSidebarSectionProps, AppWorkspaceSidebarVisibility, } from "./AppWorkspace";
3
+ export type { AppWorkspaceBottomDrawerHeight, AppWorkspaceBottomDrawerProps, AppWorkspaceContentProps, AppWorkspaceDetailProps, AppWorkspaceDetailWidth, AppWorkspaceHeadProps, AppWorkspaceMainPaneProps, AppWorkspaceMainProps, AppWorkspaceNavTreeItemProps, AppWorkspaceNavTreeMove, AppWorkspaceNavTreeProps, AppWorkspaceProps, AppWorkspaceSidebarAccessoryVisibility, AppWorkspaceSidebarBodyProps, AppWorkspaceSidebarIconActionProps, AppWorkspaceSidebarIconActionTone, AppWorkspaceSidebarIconGridProps, AppWorkspaceSidebarItemActionProps, AppWorkspaceSidebarItemActionsProps, AppWorkspaceSidebarItemIconProps, AppWorkspaceSidebarItemLabelProps, AppWorkspaceSidebarItemMetaProps, AppWorkspaceSidebarItemProps, AppWorkspaceSidebarItemStatusProps, AppWorkspaceSidebarItemTone, AppWorkspaceSidebarProps, AppWorkspaceSidebarSectionProps, AppWorkspaceSidebarVisibility, } from "./AppWorkspace";
4
4
  export { default as AppWorkspace } from "./AppWorkspace";
5
+ export { watchAppHostWidth } from "./app-host-width";
5
6
  export type { AppWorkspaceControllerOptions } from "./app-workspace-controller";
6
- export { installAppWorkspaceController } from "./app-workspace-controller";
7
+ export { installAppWorkspaceController, parkWorkspaceDetailDrawers } from "./app-workspace-controller";
7
8
  export type { AppWorkspaceLayoutState, AppWorkspaceResizeKind, } from "./app-workspace-state";
8
9
  export { APP_WORKSPACE_DETAIL_DEFAULT, APP_WORKSPACE_DETAIL_MAX, APP_WORKSPACE_DETAIL_MIN, APP_WORKSPACE_DRAWER_DEFAULT, APP_WORKSPACE_DRAWER_MAX, APP_WORKSPACE_DRAWER_MIN, APP_WORKSPACE_MAIN_MIN, APP_WORKSPACE_MAIN_MIN_HEIGHT, APP_WORKSPACE_PANE_DEFAULT, APP_WORKSPACE_PANE_MAX, APP_WORKSPACE_PANE_MIN, APP_WORKSPACE_SIDEBAR_COLLAPSE_THRESHOLD, APP_WORKSPACE_SIDEBAR_COLLAPSED, APP_WORKSPACE_SIDEBAR_DEFAULT, APP_WORKSPACE_SIDEBAR_MAX, APP_WORKSPACE_SIDEBAR_MIN, appWorkspaceLayoutStyle, appWorkspacePanelVariable, appWorkspaceResizeLimits, normalizeAppWorkspaceLayoutState, parseAppWorkspaceLayoutState, resolveAppWorkspaceSidebarWidth, safeAppWorkspacePanelId, serializeAppWorkspaceLayoutState, shouldCollapseAppWorkspaceSidebar, } from "./app-workspace-state";
9
10
  export { type BottomSheetProps, bottomSheetAdaptiveOptions, bottomSheetOptions, default as BottomSheet } from "./BottomSheet";
@@ -32,6 +33,8 @@ export { default as PullToRefresh } from "./PullToRefresh";
32
33
  export { installPageTitleController } from "./page-title-controller";
33
34
  export type { AddPanesItemOptions, PanesDirection, PanesGroup, PanesIntent, PanesLayout, PanesNode, PanesPath, PanesPathSegment, PanesSide, PanesSplit, } from "./panes-layout";
34
35
  export { activatePanesItem, addPanesItem, applyPanesIntent, createPanesLayout, isPanesItemVisible, PANES_LAYOUT_VERSION, parsePanesLayout, reconcilePanesLayout, removePanesItem, resizePanesSplit, } from "./panes-layout";
36
+ export { default as ResizeSeparator, type ResizeSeparatorProps } from "./ResizeSeparator";
37
+ export { attachResizeSeparator, type ResizeSeparatorOptions } from "./resize-separator";
35
38
  export type { ScrollAreaProps } from "./ScrollArea";
36
39
  export { default as ScrollArea } from "./ScrollArea";
37
40
  export type { SettingsFieldControlProps, SettingsFieldProps, SettingsGroupActionProps, SettingsGroupProps, SettingsPageProps, SettingsPanelFooterProps, SettingsSaveBarProps, SettingsSectionProps, } from "./Settings";
@@ -0,0 +1,18 @@
1
+ export type ResizeSeparatorOptions = {
2
+ min: number;
3
+ max: number;
4
+ value: () => number;
5
+ /** Pixels per value unit. Defaults to 1. */
6
+ unit?: number;
7
+ step?: number;
8
+ largeStep?: number;
9
+ grow: "start" | "end";
10
+ collapseBelow?: number;
11
+ onResize: (value: number) => void;
12
+ onResizeEnd?: (value: number) => void;
13
+ onCollapseIntent?: (armed: boolean) => void;
14
+ onCollapse?: () => void;
15
+ onDragChange?: (dragging: boolean) => void;
16
+ };
17
+ /** Adds resizing to a server-rendered separator; orientation comes from aria-orientation. */
18
+ export declare function attachResizeSeparator(element: HTMLElement, options: ResizeSeparatorOptions): () => void;
@@ -10,6 +10,7 @@ declare const workspaceMessages: import("@k2b/stdlib").Catalog<{
10
10
  resizeNavigation: string;
11
11
  resizeWorkspacePane: string;
12
12
  resizeDetailPanel: string;
13
+ details: string;
13
14
  detailFullHeight: string;
14
15
  resizeBottomDrawer: string;
15
16
  showNavigation: string;
@@ -18,6 +19,10 @@ declare const workspaceMessages: import("@k2b/stdlib").Catalog<{
18
19
  }) => string;
19
20
  path: string;
20
21
  moreLevels: string;
22
+ sidebarAll: string;
23
+ sidebarAllLabel: ({ label }: {
24
+ label: string;
25
+ }) => string;
21
26
  }>;
22
27
  export type WorkspaceMessages = ReturnType<(typeof workspaceMessages)["resolve"]>["t"];
23
28
  /** Resolved from the inherited render locale. */
@@ -1,7 +1,7 @@
1
1
  import { type JSX } from "solid-js";
2
2
  export type PlaceholderAlign = "center" | "left";
3
3
  export type PlaceholderSurface = "none" | "paper";
4
- export type PlaceholderState = "empty" | "loading" | "error";
4
+ export type PlaceholderState = "empty" | "no-results" | "no-access" | "loading" | "error";
5
5
  /** `compact` stacks inside a section, `inline` is one row in a list or sidebar, `panel` fills a work area. */
6
6
  export type PlaceholderVariant = "compact" | "inline" | "panel";
7
7
  export type PlaceholderProps = {
@@ -9,6 +9,7 @@ export type PlaceholderProps = {
9
9
  description?: JSX.Element;
10
10
  icon?: string;
11
11
  action?: JSX.Element;
12
+ onRetry?: () => void;
12
13
  align?: PlaceholderAlign;
13
14
  surface?: PlaceholderSurface;
14
15
  state?: PlaceholderState;