@k2b/ui 0.29.0 → 0.31.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 (243) hide show
  1. package/README.md +2 -2
  2. package/dist/base.css +2 -2
  3. package/dist/browser/actions/Dropdown.js +6 -3
  4. package/dist/browser/actions/Dropdown.js.map +1 -1
  5. package/dist/browser/actions/FilterChip.js +137 -7
  6. package/dist/browser/actions/FilterChip.js.map +1 -1
  7. package/dist/browser/actions/SegmentedControl.js +5 -9
  8. package/dist/browser/actions/SegmentedControl.js.map +1 -1
  9. package/dist/browser/actions/SpotlightSearch.js +6 -3
  10. package/dist/browser/actions/SpotlightSearch.js.map +1 -1
  11. package/dist/browser/actions/Tabs.js +5 -2
  12. package/dist/browser/actions/Tabs.js.map +1 -1
  13. package/dist/browser/actions/Toolbar.js +2 -0
  14. package/dist/browser/actions/Toolbar.js.map +1 -1
  15. package/dist/browser/actions/ViewTabs.js +294 -0
  16. package/dist/browser/actions/ViewTabs.js.map +1 -0
  17. package/dist/browser/actions/filter-messages.js +6 -2
  18. package/dist/browser/actions/filter-messages.js.map +1 -1
  19. package/dist/browser/actions/index.js +2 -1
  20. package/dist/browser/actions/index.js.map +1 -1
  21. package/dist/browser/chat/ChatComposer.js +1108 -604
  22. package/dist/browser/chat/ChatComposer.js.map +1 -1
  23. package/dist/browser/chat/ChatDecision.js +146 -84
  24. package/dist/browser/chat/ChatDecision.js.map +1 -1
  25. package/dist/browser/chat/ChatPrimitives.js +292 -159
  26. package/dist/browser/chat/ChatPrimitives.js.map +1 -1
  27. package/dist/browser/chat/chat-messages.js +8 -0
  28. package/dist/browser/chat/chat-messages.js.map +1 -1
  29. package/dist/browser/chat/command-search.js +26 -15
  30. package/dist/browser/chat/command-search.js.map +1 -1
  31. package/dist/browser/chat/index.js +4 -2
  32. package/dist/browser/chat/index.js.map +1 -1
  33. package/dist/browser/content/Calendar.js +143 -116
  34. package/dist/browser/content/Calendar.js.map +1 -1
  35. package/dist/browser/content/CalendarWeekView.js +291 -266
  36. package/dist/browser/content/CalendarWeekView.js.map +1 -1
  37. package/dist/browser/content/DataTable.js +224 -155
  38. package/dist/browser/content/DataTable.js.map +1 -1
  39. package/dist/browser/content/MapAttribution.js +27 -0
  40. package/dist/browser/content/MapAttribution.js.map +1 -0
  41. package/dist/browser/content/MapView.js +553 -0
  42. package/dist/browser/content/MapView.js.map +1 -0
  43. package/dist/browser/content/MapViewFrame.js +395 -0
  44. package/dist/browser/content/MapViewFrame.js.map +1 -0
  45. package/dist/browser/content/data-table-messages.js +4 -2
  46. package/dist/browser/content/data-table-messages.js.map +1 -1
  47. package/dist/browser/content/index.js +5 -0
  48. package/dist/browser/content/index.js.map +1 -1
  49. package/dist/browser/content/map-palette.js +39 -0
  50. package/dist/browser/content/map-palette.js.map +1 -0
  51. package/dist/browser/content/map-style.js +276 -0
  52. package/dist/browser/content/map-style.js.map +1 -0
  53. package/dist/browser/content/map-view-geometry.js +269 -0
  54. package/dist/browser/content/map-view-geometry.js.map +1 -0
  55. package/dist/browser/content/map-view-live.js +28 -0
  56. package/dist/browser/content/map-view-live.js.map +1 -0
  57. package/dist/browser/content/map-view-messages.js +53 -0
  58. package/dist/browser/content/map-view-messages.js.map +1 -0
  59. package/dist/browser/content/map-view-types.js +2 -0
  60. package/dist/browser/content/map-view-types.js.map +1 -0
  61. package/dist/browser/content/map-view-worker.js +10 -0
  62. package/dist/browser/feedback/MovedHint.js +197 -0
  63. package/dist/browser/feedback/MovedHint.js.map +1 -0
  64. package/dist/browser/feedback/dialog-core.js +85 -9
  65. package/dist/browser/feedback/dialog-core.js.map +1 -1
  66. package/dist/browser/feedback/index.js +1 -0
  67. package/dist/browser/feedback/index.js.map +1 -1
  68. package/dist/browser/feedback/prompts.js +6 -1
  69. package/dist/browser/feedback/prompts.js.map +1 -1
  70. package/dist/browser/inputs/DatePicker.js +337 -212
  71. package/dist/browser/inputs/DatePicker.js.map +1 -1
  72. package/dist/browser/inputs/date-picker.js +59 -5
  73. package/dist/browser/inputs/date-picker.js.map +1 -1
  74. package/dist/browser/intl/messages.js +12 -0
  75. package/dist/browser/intl/messages.js.map +1 -1
  76. package/dist/browser/intl/weekend.js +39 -0
  77. package/dist/browser/intl/weekend.js.map +1 -0
  78. package/dist/browser/layout/AppOverview.js +0 -1
  79. package/dist/browser/layout/AppOverview.js.map +1 -1
  80. package/dist/browser/layout/AppWorkspace.js +701 -476
  81. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  82. package/dist/browser/layout/PageTitle.js +3 -2
  83. package/dist/browser/layout/PageTitle.js.map +1 -1
  84. package/dist/browser/layout/SettingsModal.js +2 -2
  85. package/dist/browser/layout/SettingsModal.js.map +1 -1
  86. package/dist/browser/layout/SidebarSwitcher.js +13 -12
  87. package/dist/browser/layout/SidebarSwitcher.js.map +1 -1
  88. package/dist/browser/layout/TabBar.js +1 -1
  89. package/dist/browser/layout/TabBar.js.map +1 -1
  90. package/dist/browser/layout/app-host-width.js +44 -0
  91. package/dist/browser/layout/app-host-width.js.map +1 -0
  92. package/dist/browser/layout/app-workspace-controller.js +331 -45
  93. package/dist/browser/layout/app-workspace-controller.js.map +1 -1
  94. package/dist/browser/layout/app-workspace-width.js +26 -0
  95. package/dist/browser/layout/app-workspace-width.js.map +1 -0
  96. package/dist/browser/layout/index.js +2 -1
  97. package/dist/browser/layout/index.js.map +1 -1
  98. package/dist/browser/surfaces/Placeholder.js +36 -13
  99. package/dist/browser/surfaces/Placeholder.js.map +1 -1
  100. package/dist/licenses/maplibre-gl.txt +116 -0
  101. package/dist/ssr/actions/Dropdown.js +5 -2
  102. package/dist/ssr/actions/Dropdown.js.map +1 -1
  103. package/dist/ssr/actions/FilterChip.js +59 -7
  104. package/dist/ssr/actions/FilterChip.js.map +1 -1
  105. package/dist/ssr/actions/SegmentedControl.js +1 -2
  106. package/dist/ssr/actions/SegmentedControl.js.map +1 -1
  107. package/dist/ssr/actions/SpotlightSearch.js +2 -2
  108. package/dist/ssr/actions/SpotlightSearch.js.map +1 -1
  109. package/dist/ssr/actions/Tabs.js +2 -2
  110. package/dist/ssr/actions/Tabs.js.map +1 -1
  111. package/dist/ssr/actions/Toolbar.js +2 -0
  112. package/dist/ssr/actions/Toolbar.js.map +1 -1
  113. package/dist/ssr/actions/ViewTabs.js +211 -0
  114. package/dist/ssr/actions/ViewTabs.js.map +1 -0
  115. package/dist/ssr/actions/filter-messages.js +6 -2
  116. package/dist/ssr/actions/filter-messages.js.map +1 -1
  117. package/dist/ssr/actions/index.js +2 -1
  118. package/dist/ssr/actions/index.js.map +1 -1
  119. package/dist/ssr/chat/ChatComposer.js +546 -131
  120. package/dist/ssr/chat/ChatComposer.js.map +1 -1
  121. package/dist/ssr/chat/ChatDecision.js +44 -19
  122. package/dist/ssr/chat/ChatDecision.js.map +1 -1
  123. package/dist/ssr/chat/ChatPrimitives.js +95 -24
  124. package/dist/ssr/chat/ChatPrimitives.js.map +1 -1
  125. package/dist/ssr/chat/chat-messages.js +8 -0
  126. package/dist/ssr/chat/chat-messages.js.map +1 -1
  127. package/dist/ssr/chat/command-search.js +26 -15
  128. package/dist/ssr/chat/command-search.js.map +1 -1
  129. package/dist/ssr/chat/index.js +4 -2
  130. package/dist/ssr/chat/index.js.map +1 -1
  131. package/dist/ssr/content/Calendar.js +109 -100
  132. package/dist/ssr/content/Calendar.js.map +1 -1
  133. package/dist/ssr/content/CalendarWeekView.js +42 -28
  134. package/dist/ssr/content/CalendarWeekView.js.map +1 -1
  135. package/dist/ssr/content/DataTable.js +78 -31
  136. package/dist/ssr/content/DataTable.js.map +1 -1
  137. package/dist/ssr/content/MapAttribution.js +19 -0
  138. package/dist/ssr/content/MapAttribution.js.map +1 -0
  139. package/dist/ssr/content/MapView.js +474 -0
  140. package/dist/ssr/content/MapView.js.map +1 -0
  141. package/dist/ssr/content/MapViewFrame.js +193 -0
  142. package/dist/ssr/content/MapViewFrame.js.map +1 -0
  143. package/dist/ssr/content/data-table-messages.js +4 -2
  144. package/dist/ssr/content/data-table-messages.js.map +1 -1
  145. package/dist/ssr/content/index.js +5 -0
  146. package/dist/ssr/content/index.js.map +1 -1
  147. package/dist/ssr/content/map-palette.js +39 -0
  148. package/dist/ssr/content/map-palette.js.map +1 -0
  149. package/dist/ssr/content/map-style.js +276 -0
  150. package/dist/ssr/content/map-style.js.map +1 -0
  151. package/dist/ssr/content/map-view-geometry.js +269 -0
  152. package/dist/ssr/content/map-view-geometry.js.map +1 -0
  153. package/dist/ssr/content/map-view-live.js +1 -0
  154. package/dist/ssr/content/map-view-messages.js +53 -0
  155. package/dist/ssr/content/map-view-messages.js.map +1 -0
  156. package/dist/ssr/content/map-view-types.js +2 -0
  157. package/dist/ssr/content/map-view-types.js.map +1 -0
  158. package/dist/ssr/feedback/MovedHint.js +166 -0
  159. package/dist/ssr/feedback/MovedHint.js.map +1 -0
  160. package/dist/ssr/feedback/dialog-core.js +85 -9
  161. package/dist/ssr/feedback/dialog-core.js.map +1 -1
  162. package/dist/ssr/feedback/index.js +1 -0
  163. package/dist/ssr/feedback/index.js.map +1 -1
  164. package/dist/ssr/feedback/prompts.js +6 -1
  165. package/dist/ssr/feedback/prompts.js.map +1 -1
  166. package/dist/ssr/inputs/DatePicker.js +138 -69
  167. package/dist/ssr/inputs/DatePicker.js.map +1 -1
  168. package/dist/ssr/inputs/date-picker.js +59 -5
  169. package/dist/ssr/inputs/date-picker.js.map +1 -1
  170. package/dist/ssr/intl/messages.js +12 -0
  171. package/dist/ssr/intl/messages.js.map +1 -1
  172. package/dist/ssr/intl/weekend.js +39 -0
  173. package/dist/ssr/intl/weekend.js.map +1 -0
  174. package/dist/ssr/layout/AppOverview.js +0 -1
  175. package/dist/ssr/layout/AppOverview.js.map +1 -1
  176. package/dist/ssr/layout/AppWorkspace.js +216 -44
  177. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  178. package/dist/ssr/layout/PageTitle.js +3 -2
  179. package/dist/ssr/layout/PageTitle.js.map +1 -1
  180. package/dist/ssr/layout/SettingsModal.js +2 -2
  181. package/dist/ssr/layout/SettingsModal.js.map +1 -1
  182. package/dist/ssr/layout/SidebarSwitcher.js +13 -12
  183. package/dist/ssr/layout/SidebarSwitcher.js.map +1 -1
  184. package/dist/ssr/layout/TabBar.js +1 -1
  185. package/dist/ssr/layout/TabBar.js.map +1 -1
  186. package/dist/ssr/layout/app-host-width.js +44 -0
  187. package/dist/ssr/layout/app-host-width.js.map +1 -0
  188. package/dist/ssr/layout/app-workspace-controller.js +331 -45
  189. package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
  190. package/dist/ssr/layout/app-workspace-width.js +26 -0
  191. package/dist/ssr/layout/app-workspace-width.js.map +1 -0
  192. package/dist/ssr/layout/index.js +2 -1
  193. package/dist/ssr/layout/index.js.map +1 -1
  194. package/dist/ssr/surfaces/Placeholder.js +24 -7
  195. package/dist/ssr/surfaces/Placeholder.js.map +1 -1
  196. package/dist/styles.css +1 -1
  197. package/dist/types/actions/Dropdown.d.ts +4 -0
  198. package/dist/types/actions/FilterChip.d.ts +22 -0
  199. package/dist/types/actions/ViewTabs.d.ts +30 -0
  200. package/dist/types/actions/filter-messages.d.ts +2 -0
  201. package/dist/types/actions/index.d.ts +4 -2
  202. package/dist/types/chat/ChatComposer.d.ts +52 -0
  203. package/dist/types/chat/ChatDecision.d.ts +18 -2
  204. package/dist/types/chat/ChatPrimitives.d.ts +10 -0
  205. package/dist/types/chat/chat-messages.d.ts +4 -0
  206. package/dist/types/chat/command-search.d.ts +2 -0
  207. package/dist/types/chat/index.d.ts +9 -8
  208. package/dist/types/content/DataTable.d.ts +3 -0
  209. package/dist/types/content/MapAttribution.d.ts +6 -0
  210. package/dist/types/content/MapView.d.ts +5 -0
  211. package/dist/types/content/MapViewFrame.d.ts +31 -0
  212. package/dist/types/content/data-table-messages.d.ts +1 -0
  213. package/dist/types/content/index.d.ts +6 -0
  214. package/dist/types/content/map-palette.d.ts +58 -0
  215. package/dist/types/content/map-style.d.ts +29 -0
  216. package/dist/types/content/map-view-geometry.d.ts +55 -0
  217. package/dist/types/content/map-view-live.d.ts +2 -0
  218. package/dist/types/content/map-view-messages.d.ts +21 -0
  219. package/dist/types/content/map-view-types.d.ts +61 -0
  220. package/dist/types/feedback/MovedHint.d.ts +25 -0
  221. package/dist/types/feedback/dialog-core.d.ts +6 -2
  222. package/dist/types/feedback/index.d.ts +2 -0
  223. package/dist/types/feedback/prompts.d.ts +2 -0
  224. package/dist/types/inputs/DatePicker.d.ts +7 -0
  225. package/dist/types/inputs/date-picker.d.ts +25 -1
  226. package/dist/types/intl/messages.d.ts +6 -0
  227. package/dist/types/intl/weekend.d.ts +12 -0
  228. package/dist/types/layout/AppWorkspace.d.ts +48 -8
  229. package/dist/types/layout/app-host-width.d.ts +6 -0
  230. package/dist/types/layout/app-workspace-width.d.ts +13 -0
  231. package/dist/types/layout/index.d.ts +3 -2
  232. package/dist/types/surfaces/Placeholder.d.ts +2 -1
  233. package/map-glyphs/IBM Plex Sans Medium/0-255.pbf +0 -0
  234. package/map-glyphs/IBM Plex Sans Medium/1024-1279.pbf +0 -0
  235. package/map-glyphs/IBM Plex Sans Medium/256-511.pbf +0 -0
  236. package/map-glyphs/IBM Plex Sans Medium/512-767.pbf +0 -0
  237. package/map-glyphs/IBM Plex Sans Medium/768-1023.pbf +0 -0
  238. package/map-glyphs/IBM Plex Sans Medium/7680-7935.pbf +0 -0
  239. package/map-glyphs/IBM Plex Sans Medium/8192-8447.pbf +0 -0
  240. package/map-glyphs/IBM Plex Sans Medium/8448-8703.pbf +0 -0
  241. package/map-glyphs/IBM Plex Sans Medium/8704-8959.pbf +0 -0
  242. package/map-glyphs/OFL.txt +93 -0
  243. package/package.json +11 -6
@@ -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,12 @@ 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.
18
+ * A traversal that `@k2b/ssr/nav` hides from popstate listeners reaches this core through `ssr:nav-popstate`.
16
19
  */
17
20
  history?: boolean;
18
21
  };
@@ -46,7 +49,8 @@ export declare const dialogCore: DialogCore;
46
49
  /**
47
50
  * Internal: transient UI shares dialogs' Back handling without exposing another public dialog capability.
48
51
  * Same-URL traversals are suppressed with the Navigation API; without it, only the synthetic Back on release is suppressed.
52
+ * Release during island disposal forgets the marker without traversing; the router may replace the remaining entry.
49
53
  */
50
54
  export declare const holdDialogHistory: (onBack: () => void) => (() => void);
51
- /** Internal: waits until entries released through `holdDialogHistory` have left the history. */
55
+ /** Internal: waits until released holders have left history or were forgotten during island disposal. */
52
56
  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;
@@ -1,8 +1,32 @@
1
1
  import { type LinkNavigateEvent, type NavigationScrollMode } from "@k2b/ssr/nav";
2
2
  import { type JSX } from "solid-js";
3
3
  import { type AppWorkspaceLayoutState } from "./app-workspace-state";
4
+ import { type AppWorkspaceWidthShare } from "./app-workspace-width";
4
5
  import type { ScrollAreaProps } from "./ScrollArea";
5
6
  import { type AppWorkspaceSidebarSwitcherProps } from "./SidebarSwitcher";
7
+ export type { AppWorkspaceWidthShare } from "./app-workspace-width";
8
+ export type AppWorkspaceHeadProps = {
9
+ /** View tabs, usually a ViewTabs. */
10
+ views?: JSX.Element;
11
+ /** Filter chips, usually FilterChip elements. */
12
+ filters?: JSX.Element;
13
+ /** Any filter is active: shows Reset and the quiet result count. */
14
+ filtered?: boolean;
15
+ /** Reset target while filtered: a URL (works without JavaScript) and/or a callback. */
16
+ resetHref?: string;
17
+ onReset?: () => void;
18
+ /** Quiet result count shown only while filtered; CSS drops it first when space is short. */
19
+ count?: JSX.Element;
20
+ /** Secondary actions at the end of the row. Never a filled button. */
21
+ actions?: JSX.Element;
22
+ /** The one filled primary action. Below 48rem it becomes a round icon button beside the host's bottom bar. */
23
+ primary?: {
24
+ label: string;
25
+ icon: string;
26
+ href?: string;
27
+ onClick?: (event: MouseEvent) => void;
28
+ };
29
+ };
6
30
  export type AppWorkspaceProps = {
7
31
  children: JSX.Element;
8
32
  class?: string;
@@ -40,6 +64,14 @@ export type AppWorkspaceMainProps = {
40
64
  class?: string;
41
65
  /** `"content"` centers the children as one reading column with the shared page width on large screens. */
42
66
  width?: "full" | "content";
67
+ /**
68
+ * The width in px or a workspace width share that Main keeps beside the sidebar and an open Detail,
69
+ * from 48rem (768 px); at least the default 320. A Detail that does not fit
70
+ * beside it waits behind the head's Details button, and from 64rem of host
71
+ * width a sidebar that does not fit becomes the overlay. CSS decides, so
72
+ * the server renders the first frame.
73
+ */
74
+ minWidth?: number | AppWorkspaceWidthShare;
43
75
  mobilePane?: string;
44
76
  /** Levels in DOM order, shallowest first. The URL selects the deepest level by id. */
45
77
  level?: string;
@@ -63,7 +95,7 @@ export type AppWorkspaceMainPaneProps = {
63
95
  open?: boolean;
64
96
  resizable?: boolean;
65
97
  resizeShadow?: boolean;
66
- defaultSize?: number;
98
+ defaultSize?: number | AppWorkspaceWidthShare;
67
99
  minSize?: number;
68
100
  maxSize?: number;
69
101
  class?: string;
@@ -75,6 +107,12 @@ export type AppWorkspaceDetailWidth = "sm" | "md" | "lg" | "xl";
75
107
  export type AppWorkspaceDetailProps = {
76
108
  children: JSX.Element;
77
109
  open: boolean;
110
+ /**
111
+ * Whether choosing an item in Main opens this Detail as the drawer while it waits.
112
+ * Set false when Main itself shows the chosen item, such as a reader beside a list:
113
+ * the drawer then opens only from Details or from a toggle in Main.
114
+ */
115
+ openOnChoice?: boolean;
78
116
  id: string;
79
117
  class?: string;
80
118
  width?: AppWorkspaceDetailWidth;
@@ -85,12 +123,11 @@ export type AppWorkspaceDetailProps = {
85
123
  minWidth?: number;
86
124
  maxWidth?: number;
87
125
  /**
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.
126
+ * Closes the column with Escape, or the phone sheet with a downward drag.
127
+ * Server-rendered panels mark their close control with
128
+ * `data-workspace-detail-close` instead; those gestures click it.
129
+ * Escape and a rightward touch swipe park an open waiting drawer without
130
+ * calling onClose, so its Details button can open it again.
94
131
  */
95
132
  onClose?: () => void;
96
133
  /**
@@ -249,7 +286,7 @@ export type AppWorkspaceSidebarItemIconProps = {
249
286
  };
250
287
  export type AppWorkspaceSidebarItemLabelProps = {
251
288
  children: JSX.Element;
252
- /** False keeps one line with an ellipsis; rows wrap long labels onto a second line by default. */
289
+ /** False keeps one line that fades out; rows wrap long labels onto a second line by default. */
253
290
  marquee?: boolean;
254
291
  };
255
292
  export type AppWorkspaceSidebarItemMetaProps = {
@@ -360,8 +397,11 @@ export type AppWorkspaceNavTreeItemProps = {
360
397
  type AppWorkspaceNavTreeComponent = ((props: AppWorkspaceNavTreeProps) => JSX.Element) & {
361
398
  Item: (props: AppWorkspaceNavTreeItemProps) => JSX.Element;
362
399
  };
400
+ /** The Detail region's DOM id, for application controls that target it with aria-controls. */
401
+ export declare const appWorkspaceDetailElementId: (id: string) => string;
363
402
  type AppWorkspaceComponent = ((props: AppWorkspaceProps) => JSX.Element) & {
364
403
  LayoutStateProvider: (props: AppWorkspaceLayoutStateProviderProps) => JSX.Element;
404
+ Head: (props: AppWorkspaceHeadProps) => JSX.Element;
365
405
  Content: (props: AppWorkspaceContentProps) => JSX.Element;
366
406
  Main: (props: AppWorkspaceMainProps) => JSX.Element;
367
407
  MainPane: (props: AppWorkspaceMainPaneProps) => JSX.Element;
@@ -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;
@@ -0,0 +1,13 @@
1
+ /** A width that follows the workspace's own border-box width: clamp(min, share × workspace width + offset, max), in px. */
2
+ export type AppWorkspaceWidthShare = {
3
+ share: number;
4
+ offset?: number;
5
+ min: number;
6
+ max: number;
7
+ };
8
+ export declare const isAppWorkspaceWidthShare: (value: unknown) => value is AppWorkspaceWidthShare;
9
+ export declare const appWorkspaceWidthToken: (value: number | AppWorkspaceWidthShare) => string;
10
+ export declare const readAppWorkspaceWidth: (token: string | undefined) => number | AppWorkspaceWidthShare | undefined;
11
+ export declare const resolveAppWorkspaceWidth: (value: number | AppWorkspaceWidthShare, workspaceWidth: number) => number;
12
+ export declare const appWorkspaceWidthCss: (value: number | AppWorkspaceWidthShare, width: string) => string;
13
+ export declare const appWorkspaceInverseWidthCss: (value: AppWorkspaceWidthShare, width: string) => string;
@@ -1,7 +1,8 @@
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";
4
- export { default as AppWorkspace } 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, AppWorkspaceWidthShare, } from "./AppWorkspace";
4
+ export { appWorkspaceDetailElementId, default as AppWorkspace } from "./AppWorkspace";
5
+ export { watchAppHostWidth } from "./app-host-width";
5
6
  export type { AppWorkspaceControllerOptions } from "./app-workspace-controller";
6
7
  export { installAppWorkspaceController, parkWorkspaceDetailDrawers } from "./app-workspace-controller";
7
8
  export type { AppWorkspaceLayoutState, AppWorkspaceResizeKind, } from "./app-workspace-state";
@@ -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;
@@ -0,0 +1,93 @@
1
+ Copyright 2019 IBM Corp. All rights reserved. IBMPlexSans-Italic[wdth,wght].ttf: Copyright 2019 IBM Corp. All rights reserved.
2
+
3
+ This Font Software is licensed under the SIL Open Font License, Version 1.1.
4
+ This license is copied below, and is also available with a FAQ at:
5
+ http://scripts.sil.org/OFL
6
+
7
+
8
+ -----------------------------------------------------------
9
+ SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
10
+ -----------------------------------------------------------
11
+
12
+ PREAMBLE
13
+ The goals of the Open Font License (OFL) are to stimulate worldwide
14
+ development of collaborative font projects, to support the font creation
15
+ efforts of academic and linguistic communities, and to provide a free and
16
+ open framework in which fonts may be shared and improved in partnership
17
+ with others.
18
+
19
+ The OFL allows the licensed fonts to be used, studied, modified and
20
+ redistributed freely as long as they are not sold by themselves. The
21
+ fonts, including any derivative works, can be bundled, embedded,
22
+ redistributed and/or sold with any software provided that any reserved
23
+ names are not used by derivative works. The fonts and derivatives,
24
+ however, cannot be released under any other type of license. The
25
+ requirement for fonts to remain under this license does not apply
26
+ to any document created using the fonts or their derivatives.
27
+
28
+ DEFINITIONS
29
+ "Font Software" refers to the set of files released by the Copyright
30
+ Holder(s) under this license and clearly marked as such. This may
31
+ include source files, build scripts and documentation.
32
+
33
+ "Reserved Font Name" refers to any names specified as such after the
34
+ copyright statement(s).
35
+
36
+ "Original Version" refers to the collection of Font Software components as
37
+ distributed by the Copyright Holder(s).
38
+
39
+ "Modified Version" refers to any derivative made by adding to, deleting,
40
+ or substituting -- in part or in whole -- any of the components of the
41
+ Original Version, by changing formats or by porting the Font Software to a
42
+ new environment.
43
+
44
+ "Author" refers to any designer, engineer, programmer, technical
45
+ writer or other person who contributed to the Font Software.
46
+
47
+ PERMISSION & CONDITIONS
48
+ Permission is hereby granted, free of charge, to any person obtaining
49
+ a copy of the Font Software, to use, study, copy, merge, embed, modify,
50
+ redistribute, and sell modified and unmodified copies of the Font
51
+ Software, subject to the following conditions:
52
+
53
+ 1) Neither the Font Software nor any of its individual components,
54
+ in Original or Modified Versions, may be sold by itself.
55
+
56
+ 2) Original or Modified Versions of the Font Software may be bundled,
57
+ redistributed and/or sold with any software, provided that each copy
58
+ contains the above copyright notice and this license. These can be
59
+ included either as stand-alone text files, human-readable headers or
60
+ in the appropriate machine-readable metadata fields within text or
61
+ binary files as long as those fields can be easily viewed by the user.
62
+
63
+ 3) No Modified Version of the Font Software may use the Reserved Font
64
+ Name(s) unless explicit written permission is granted by the corresponding
65
+ Copyright Holder. This restriction only applies to the primary font name as
66
+ presented to the users.
67
+
68
+ 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
69
+ Software shall not be used to promote, endorse or advertise any
70
+ Modified Version, except to acknowledge the contribution(s) of the
71
+ Copyright Holder(s) and the Author(s) or with their explicit written
72
+ permission.
73
+
74
+ 5) The Font Software, modified or unmodified, in part or in whole,
75
+ must be distributed entirely under this license, and must not be
76
+ distributed under any other license. The requirement for fonts to
77
+ remain under this license does not apply to any document created
78
+ using the Font Software.
79
+
80
+ TERMINATION
81
+ This license becomes null and void if any of the above conditions are
82
+ not met.
83
+
84
+ DISCLAIMER
85
+ THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
86
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
87
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
88
+ OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
89
+ COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
90
+ INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
91
+ DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
92
+ FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
93
+ OTHER DEALINGS IN THE FONT SOFTWARE.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@k2b/ui",
3
- "version": "0.29.0",
3
+ "version": "0.31.0",
4
4
  "description": "Production-ready components for SolidJS applications.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -31,10 +31,12 @@
31
31
  "browser": "./dist/browser/chart-inspection.js",
32
32
  "default": "./dist/browser/chart-inspection.js"
33
33
  },
34
- "./package.json": "./package.json"
34
+ "./package.json": "./package.json",
35
+ "./map-glyphs/*": "./map-glyphs/*"
35
36
  },
36
37
  "files": [
37
38
  "dist",
39
+ "map-glyphs",
38
40
  "README.md"
39
41
  ],
40
42
  "scripts": {
@@ -50,19 +52,20 @@
50
52
  "dependencies": {
51
53
  "@fontsource/ibm-plex-mono": "5.3.0",
52
54
  "@fontsource/ibm-plex-sans": "5.3.0",
53
- "@k2b/stdlib": "0.29.0",
55
+ "@k2b/stdlib": "0.30.0",
54
56
  "@tabler/icons-webfont": "3.48.0",
57
+ "maplibre-gl": "6.14.0",
55
58
  "marked": "18.0.14",
56
59
  "qr-scanner": "1.4.2"
57
60
  },
58
61
  "peerDependencies": {
59
- "@k2b/ssr": "^0.12.0 || ^0.13.0 || ^0.14.0 || ^0.15.0 || ^0.16.0 || ^0.17.0",
62
+ "@k2b/ssr": "^0.12.0 || ^0.13.0 || ^0.14.0 || ^0.15.0 || ^0.16.0 || ^0.17.0 || ^0.18.0 || ^0.19.0",
60
63
  "solid-js": "^1.9.10"
61
64
  },
62
65
  "devDependencies": {
63
66
  "@babel/core": "8.0.6",
64
67
  "@babel/preset-typescript": "8.0.1",
65
- "@k2b/ssr": "0.17.0",
68
+ "@k2b/ssr": "0.19.0",
66
69
  "@types/babel__core": "7.20.5",
67
70
  "@types/bun": "1.4.2",
68
71
  "axe-core": "4.11.0",
@@ -76,7 +79,9 @@
76
79
  "solid-js": "1.9.15",
77
80
  "tailwindcss": "4.3.3",
78
81
  "typescript": "7.0.2",
79
- "@typescript/typescript6": "6.0.2"
82
+ "@typescript/typescript6": "6.0.2",
83
+ "@maplibre/maplibre-gl-style-spec": "26.4.4",
84
+ "fontnik": "0.7.7"
80
85
  },
81
86
  "publishConfig": {
82
87
  "access": "public"