@k2b/ui 0.33.0 → 0.34.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 (240) hide show
  1. package/dist/base.css +14 -1
  2. package/dist/browser/actions/ContextMenu.js +13 -0
  3. package/dist/browser/actions/ContextMenu.js.map +1 -1
  4. package/dist/browser/actions/Dropdown.js +15 -4
  5. package/dist/browser/actions/Dropdown.js.map +1 -1
  6. package/dist/browser/actions/SelectionToolbar.js +129 -0
  7. package/dist/browser/actions/SelectionToolbar.js.map +1 -0
  8. package/dist/browser/actions/index.js +1 -0
  9. package/dist/browser/actions/index.js.map +1 -1
  10. package/dist/browser/charts.js +6 -0
  11. package/dist/browser/charts.js.map +1 -0
  12. package/dist/browser/chat/ChatComposer.js +525 -407
  13. package/dist/browser/chat/ChatComposer.js.map +1 -1
  14. package/dist/browser/chat/chat-messages.js +4 -0
  15. package/dist/browser/chat/chat-messages.js.map +1 -1
  16. package/dist/browser/chat/composer-document.js +19 -0
  17. package/dist/browser/chat/composer-document.js.map +1 -1
  18. package/dist/browser/chat/index.js.map +1 -1
  19. package/dist/browser/content/Chart.js +8 -0
  20. package/dist/browser/content/Chart.js.map +1 -1
  21. package/dist/browser/content/FileGrid.js +231 -9
  22. package/dist/browser/content/FileGrid.js.map +1 -1
  23. package/dist/browser/content/FileTypeIcon.js +15 -0
  24. package/dist/browser/content/FileTypeIcon.js.map +1 -1
  25. package/dist/browser/content/FileView.js +11 -4
  26. package/dist/browser/content/FileView.js.map +1 -1
  27. package/dist/browser/content/MessageRow.js +73 -53
  28. package/dist/browser/content/MessageRow.js.map +1 -1
  29. package/dist/browser/content/ReactionBar.js +3 -1
  30. package/dist/browser/content/ReactionBar.js.map +1 -1
  31. package/dist/browser/content/calendar-day-scroll.js +4 -3
  32. package/dist/browser/content/calendar-day-scroll.js.map +1 -1
  33. package/dist/browser/content/chart-bar.js +476 -0
  34. package/dist/browser/content/chart-bar.js.map +1 -0
  35. package/dist/browser/content/file-list-messages.js +52 -0
  36. package/dist/browser/content/file-list-messages.js.map +1 -0
  37. package/dist/browser/content/index.js +1 -1
  38. package/dist/browser/content/index.js.map +1 -1
  39. package/dist/browser/feedback/Tooltip.js +31 -14
  40. package/dist/browser/feedback/Tooltip.js.map +1 -1
  41. package/dist/browser/inputs/ChoiceList.js +178 -0
  42. package/dist/browser/inputs/ChoiceList.js.map +1 -0
  43. package/dist/browser/inputs/ChoiceSlider.js +314 -0
  44. package/dist/browser/inputs/ChoiceSlider.js.map +1 -0
  45. package/dist/browser/inputs/ChoiceTiles.js +135 -0
  46. package/dist/browser/inputs/ChoiceTiles.js.map +1 -0
  47. package/dist/browser/inputs/ColorChoices.js +120 -0
  48. package/dist/browser/inputs/ColorChoices.js.map +1 -0
  49. package/dist/browser/inputs/QrScanner.js +95 -13
  50. package/dist/browser/inputs/QrScanner.js.map +1 -1
  51. package/dist/browser/inputs/TextInput.js +15 -13
  52. package/dist/browser/inputs/TextInput.js.map +1 -1
  53. package/dist/browser/inputs/index.js +4 -0
  54. package/dist/browser/inputs/index.js.map +1 -1
  55. package/dist/browser/inputs/qr-messages.js +2 -0
  56. package/dist/browser/inputs/qr-messages.js.map +1 -1
  57. package/dist/browser/internal/radio-keys.js +13 -0
  58. package/dist/browser/internal/radio-keys.js.map +1 -0
  59. package/dist/browser/layout/AnchoredPopover.js +180 -0
  60. package/dist/browser/layout/AnchoredPopover.js.map +1 -0
  61. package/dist/browser/layout/AppWorkspace.js +155 -20
  62. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  63. package/dist/browser/layout/DetailPanel.js +443 -333
  64. package/dist/browser/layout/DetailPanel.js.map +1 -1
  65. package/dist/browser/layout/MobileShell.js +21 -7
  66. package/dist/browser/layout/MobileShell.js.map +1 -1
  67. package/dist/browser/layout/Settings.js +283 -175
  68. package/dist/browser/layout/Settings.js.map +1 -1
  69. package/dist/browser/layout/SidebarRailHint.js +79 -0
  70. package/dist/browser/layout/SidebarRailHint.js.map +1 -0
  71. package/dist/browser/layout/SidebarSwitcher.js +79 -66
  72. package/dist/browser/layout/SidebarSwitcher.js.map +1 -1
  73. package/dist/browser/layout/TabBar.js +18 -4
  74. package/dist/browser/layout/TabBar.js.map +1 -1
  75. package/dist/browser/layout/app-workspace-controller.js +11 -4
  76. package/dist/browser/layout/app-workspace-controller.js.map +1 -1
  77. package/dist/browser/layout/detail-panel-messages.js +4 -2
  78. package/dist/browser/layout/detail-panel-messages.js.map +1 -1
  79. package/dist/browser/layout/index.js +2 -1
  80. package/dist/browser/layout/index.js.map +1 -1
  81. package/dist/browser/layout/settings-messages.js +26 -2
  82. package/dist/browser/layout/settings-messages.js.map +1 -1
  83. package/dist/browser/surfaces/Avatar.js +2 -14
  84. package/dist/browser/surfaces/Avatar.js.map +1 -1
  85. package/dist/browser/surfaces/DotStrip.js +70 -0
  86. package/dist/browser/surfaces/DotStrip.js.map +1 -0
  87. package/dist/browser/surfaces/ProgressRing.js +3 -0
  88. package/dist/browser/surfaces/ProgressRing.js.map +1 -1
  89. package/dist/browser/surfaces/ResourceCard.js +125 -68
  90. package/dist/browser/surfaces/ResourceCard.js.map +1 -1
  91. package/dist/browser/surfaces/index.js +2 -0
  92. package/dist/browser/surfaces/index.js.map +1 -1
  93. package/dist/browser/surfaces/person-color.js +18 -0
  94. package/dist/browser/surfaces/person-color.js.map +1 -0
  95. package/dist/browser/surfaces/resource-messages.js +6 -2
  96. package/dist/browser/surfaces/resource-messages.js.map +1 -1
  97. package/dist/browser/widgets/Widget.js +3 -2
  98. package/dist/browser/widgets/Widget.js.map +1 -1
  99. package/dist/ssr/actions/ContextMenu.js +9 -0
  100. package/dist/ssr/actions/ContextMenu.js.map +1 -1
  101. package/dist/ssr/actions/Dropdown.js +14 -4
  102. package/dist/ssr/actions/Dropdown.js.map +1 -1
  103. package/dist/ssr/actions/SelectionToolbar.js +104 -0
  104. package/dist/ssr/actions/SelectionToolbar.js.map +1 -0
  105. package/dist/ssr/actions/index.js +1 -0
  106. package/dist/ssr/actions/index.js.map +1 -1
  107. package/dist/ssr/charts.js +6 -0
  108. package/dist/ssr/charts.js.map +1 -0
  109. package/dist/ssr/chat/ChatComposer.js +132 -53
  110. package/dist/ssr/chat/ChatComposer.js.map +1 -1
  111. package/dist/ssr/chat/chat-messages.js +4 -0
  112. package/dist/ssr/chat/chat-messages.js.map +1 -1
  113. package/dist/ssr/chat/composer-document.js +19 -0
  114. package/dist/ssr/chat/composer-document.js.map +1 -1
  115. package/dist/ssr/chat/index.js.map +1 -1
  116. package/dist/ssr/content/Chart.js +8 -0
  117. package/dist/ssr/content/Chart.js.map +1 -1
  118. package/dist/ssr/content/FileGrid.js +132 -5
  119. package/dist/ssr/content/FileGrid.js.map +1 -1
  120. package/dist/ssr/content/FileTypeIcon.js +15 -0
  121. package/dist/ssr/content/FileTypeIcon.js.map +1 -1
  122. package/dist/ssr/content/FileView.js +11 -4
  123. package/dist/ssr/content/FileView.js.map +1 -1
  124. package/dist/ssr/content/MessageRow.js +16 -6
  125. package/dist/ssr/content/MessageRow.js.map +1 -1
  126. package/dist/ssr/content/ReactionBar.js +3 -1
  127. package/dist/ssr/content/ReactionBar.js.map +1 -1
  128. package/dist/ssr/content/calendar-day-scroll.js +4 -3
  129. package/dist/ssr/content/calendar-day-scroll.js.map +1 -1
  130. package/dist/ssr/content/chart-bar.js +476 -0
  131. package/dist/ssr/content/chart-bar.js.map +1 -0
  132. package/dist/ssr/content/file-list-messages.js +52 -0
  133. package/dist/ssr/content/file-list-messages.js.map +1 -0
  134. package/dist/ssr/content/index.js +1 -1
  135. package/dist/ssr/content/index.js.map +1 -1
  136. package/dist/ssr/feedback/Tooltip.js +31 -14
  137. package/dist/ssr/feedback/Tooltip.js.map +1 -1
  138. package/dist/ssr/inputs/ChoiceList.js +95 -0
  139. package/dist/ssr/inputs/ChoiceList.js.map +1 -0
  140. package/dist/ssr/inputs/ChoiceSlider.js +191 -0
  141. package/dist/ssr/inputs/ChoiceSlider.js.map +1 -0
  142. package/dist/ssr/inputs/ChoiceTiles.js +61 -0
  143. package/dist/ssr/inputs/ChoiceTiles.js.map +1 -0
  144. package/dist/ssr/inputs/ColorChoices.js +60 -0
  145. package/dist/ssr/inputs/ColorChoices.js.map +1 -0
  146. package/dist/ssr/inputs/QrScanner.js +89 -10
  147. package/dist/ssr/inputs/QrScanner.js.map +1 -1
  148. package/dist/ssr/inputs/TextInput.js +13 -1
  149. package/dist/ssr/inputs/TextInput.js.map +1 -1
  150. package/dist/ssr/inputs/index.js +4 -0
  151. package/dist/ssr/inputs/index.js.map +1 -1
  152. package/dist/ssr/inputs/qr-messages.js +2 -0
  153. package/dist/ssr/inputs/qr-messages.js.map +1 -1
  154. package/dist/ssr/internal/radio-keys.js +13 -0
  155. package/dist/ssr/internal/radio-keys.js.map +1 -0
  156. package/dist/ssr/layout/AnchoredPopover.js +142 -0
  157. package/dist/ssr/layout/AnchoredPopover.js.map +1 -0
  158. package/dist/ssr/layout/AppWorkspace.js +154 -20
  159. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  160. package/dist/ssr/layout/DetailPanel.js +181 -108
  161. package/dist/ssr/layout/DetailPanel.js.map +1 -1
  162. package/dist/ssr/layout/MobileShell.js +20 -6
  163. package/dist/ssr/layout/MobileShell.js.map +1 -1
  164. package/dist/ssr/layout/Settings.js +122 -45
  165. package/dist/ssr/layout/Settings.js.map +1 -1
  166. package/dist/ssr/layout/SidebarRailHint.js +79 -0
  167. package/dist/ssr/layout/SidebarRailHint.js.map +1 -0
  168. package/dist/ssr/layout/SidebarSwitcher.js +13 -3
  169. package/dist/ssr/layout/SidebarSwitcher.js.map +1 -1
  170. package/dist/ssr/layout/TabBar.js +11 -3
  171. package/dist/ssr/layout/TabBar.js.map +1 -1
  172. package/dist/ssr/layout/app-workspace-controller.js +11 -4
  173. package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
  174. package/dist/ssr/layout/detail-panel-messages.js +4 -2
  175. package/dist/ssr/layout/detail-panel-messages.js.map +1 -1
  176. package/dist/ssr/layout/index.js +2 -1
  177. package/dist/ssr/layout/index.js.map +1 -1
  178. package/dist/ssr/layout/settings-messages.js +26 -2
  179. package/dist/ssr/layout/settings-messages.js.map +1 -1
  180. package/dist/ssr/surfaces/Avatar.js +2 -14
  181. package/dist/ssr/surfaces/Avatar.js.map +1 -1
  182. package/dist/ssr/surfaces/DotStrip.js +31 -0
  183. package/dist/ssr/surfaces/DotStrip.js.map +1 -0
  184. package/dist/ssr/surfaces/ProgressRing.js +3 -0
  185. package/dist/ssr/surfaces/ProgressRing.js.map +1 -1
  186. package/dist/ssr/surfaces/ResourceCard.js +40 -15
  187. package/dist/ssr/surfaces/ResourceCard.js.map +1 -1
  188. package/dist/ssr/surfaces/index.js +2 -0
  189. package/dist/ssr/surfaces/index.js.map +1 -1
  190. package/dist/ssr/surfaces/person-color.js +18 -0
  191. package/dist/ssr/surfaces/person-color.js.map +1 -0
  192. package/dist/ssr/surfaces/resource-messages.js +6 -2
  193. package/dist/ssr/surfaces/resource-messages.js.map +1 -1
  194. package/dist/ssr/widgets/Widget.js +3 -2
  195. package/dist/ssr/widgets/Widget.js.map +1 -1
  196. package/dist/styles.css +1 -1
  197. package/dist/types/actions/ContextMenu.d.ts +5 -0
  198. package/dist/types/actions/Dropdown.d.ts +5 -0
  199. package/dist/types/actions/SelectionToolbar.d.ts +38 -0
  200. package/dist/types/actions/index.d.ts +2 -0
  201. package/dist/types/charts.d.ts +5 -0
  202. package/dist/types/chat/ChatComposer.d.ts +15 -0
  203. package/dist/types/chat/chat-messages.d.ts +2 -0
  204. package/dist/types/chat/composer-document.d.ts +5 -0
  205. package/dist/types/chat/index.d.ts +1 -1
  206. package/dist/types/content/Chart.d.ts +2 -1
  207. package/dist/types/content/FileGrid.d.ts +43 -3
  208. package/dist/types/content/FileTypeIcon.d.ts +10 -0
  209. package/dist/types/content/FileView.d.ts +5 -1
  210. package/dist/types/content/MessageRow.d.ts +2 -0
  211. package/dist/types/content/calendar-day-scroll.d.ts +2 -1
  212. package/dist/types/content/chart-bar.d.ts +60 -0
  213. package/dist/types/content/file-list-messages.d.ts +24 -0
  214. package/dist/types/content/index.d.ts +2 -2
  215. package/dist/types/feedback/Tooltip.d.ts +8 -2
  216. package/dist/types/inputs/ChoiceList.d.ts +28 -0
  217. package/dist/types/inputs/ChoiceSlider.d.ts +36 -0
  218. package/dist/types/inputs/ChoiceTiles.d.ts +25 -0
  219. package/dist/types/inputs/ColorChoices.d.ts +19 -0
  220. package/dist/types/inputs/index.d.ts +8 -0
  221. package/dist/types/inputs/qr-messages.d.ts +1 -0
  222. package/dist/types/internal/radio-keys.d.ts +5 -0
  223. package/dist/types/layout/AnchoredPopover.d.ts +31 -0
  224. package/dist/types/layout/AppWorkspace.d.ts +10 -0
  225. package/dist/types/layout/DetailPanel.d.ts +17 -0
  226. package/dist/types/layout/MobileShell.d.ts +5 -2
  227. package/dist/types/layout/Settings.d.ts +22 -0
  228. package/dist/types/layout/SidebarRailHint.d.ts +26 -0
  229. package/dist/types/layout/TabBar.d.ts +5 -0
  230. package/dist/types/layout/detail-panel-messages.d.ts +1 -0
  231. package/dist/types/layout/index.d.ts +3 -2
  232. package/dist/types/layout/settings-messages.d.ts +12 -0
  233. package/dist/types/surfaces/DotStrip.d.ts +22 -0
  234. package/dist/types/surfaces/ProgressRing.d.ts +2 -1
  235. package/dist/types/surfaces/ResourceCard.d.ts +9 -0
  236. package/dist/types/surfaces/index.d.ts +4 -1
  237. package/dist/types/surfaces/person-color.d.ts +10 -0
  238. package/dist/types/surfaces/resource-messages.d.ts +2 -0
  239. package/dist/types/widgets/Widget.d.ts +3 -2
  240. package/package.json +6 -1
@@ -8,9 +8,18 @@ export type DetailPanelProps = {
8
8
  class?: string;
9
9
  };
10
10
  type DetailPanelHeaderBaseProps = {
11
+ /** A short line above the title that names what is shown, such as "Conversation", followed by its state. */
12
+ kind?: JSX.Element;
11
13
  title: JSX.Element;
12
14
  subtitle?: JSX.Element;
13
15
  meta?: JSX.Element;
16
+ /**
17
+ * The resource's "…" menu, shown before `actions`. Pass every less frequent command on the shown resource here,
18
+ * so each panel opens its menu from the same place; an empty list shows no button.
19
+ */
20
+ menu?: readonly DropdownItem[];
21
+ /** Accessible name of the "…" button. Defaults to "More actions". */
22
+ menuLabel?: string;
14
23
  actions?: JSX.Element;
15
24
  primaryActions?: JSX.Element;
16
25
  class?: string;
@@ -37,6 +46,11 @@ export type DetailPanelSummaryProps = {
37
46
  export type DetailPanelGroupProps = {
38
47
  children: JSX.Element;
39
48
  label?: string;
49
+ /**
50
+ * A visible quiet title, such as "More about this conversation". Its sections then stand flush as rows below
51
+ * it, which suits collapsed secondary sections with a `summary`.
52
+ */
53
+ title?: JSX.Element;
40
54
  class?: string;
41
55
  };
42
56
  export type DetailPanelTone = "accent" | "neutral" | "success" | "warning" | "danger";
@@ -90,6 +104,7 @@ export type DetailPanelSectionProps = DetailPanelSectionBaseProps & ({
90
104
  children?: JSX.Element;
91
105
  actions?: JSX.Element;
92
106
  collapsible?: false;
107
+ summary?: never;
93
108
  defaultOpen?: never;
94
109
  open?: never;
95
110
  onOpenChange?: never;
@@ -98,6 +113,8 @@ export type DetailPanelSectionProps = DetailPanelSectionBaseProps & ({
98
113
  children: JSX.Element;
99
114
  actions?: never;
100
115
  collapsible: true;
116
+ /** One line that says what the closed section holds, such as its newest entry; hidden while open. */
117
+ summary?: JSX.Element;
101
118
  defaultOpen?: boolean;
102
119
  open?: boolean;
103
120
  onOpenChange?: (open: boolean) => void;
@@ -48,8 +48,11 @@ export declare function observeMobileShell(root: HTMLElement): () => void;
48
48
  declare function MobileShellRoot(props: MobileShellProps): JSX.Element;
49
49
  declare function MobileShellHeader(props: MobileShellHeaderProps): JSX.Element;
50
50
  export type MobileShellSidebarItem = TabBarItem & {
51
- /** A count after the label, such as unread messages; 0 shows nothing. */
52
- count?: number;
51
+ /**
52
+ * A quiet count after the label, such as open tasks: a number (0 shows nothing) or an element that renders one. The
53
+ * item's `badge`, which calls for attention, takes its place.
54
+ */
55
+ count?: number | JSX.Element;
53
56
  };
54
57
  export type MobileShellSidebarProps = {
55
58
  /** Accessible name of the navigation landmark; usually the tab bar's. */
@@ -3,6 +3,8 @@ import { type ButtonVariant } from "../actions/Button";
3
3
  import type { MaybeAccessor } from "../inputs/field-contract";
4
4
  export type SettingsPageProps = {
5
5
  title: JSX.Element;
6
+ /** False when a surrounding head already shows the title, such as a workspace level; the actions move to the footer. */
7
+ header?: boolean;
6
8
  subtitle?: JSX.Element;
7
9
  icon?: string;
8
10
  actions?: JSX.Element;
@@ -69,4 +71,24 @@ export type SettingsSaveBarProps = {
69
71
  export declare function SettingsSaveBar(props: SettingsSaveBarProps): JSX.Element;
70
72
  export type SettingsPanelFooterProps = SettingsSaveBarProps;
71
73
  export declare function SettingsPanelFooter(props: SettingsPanelFooterProps): JSX.Element;
74
+ export type SaveStatusState = "saved" | "draft" | "saving" | "failed" | "invalid" | "unknown" | "readonly";
75
+ export type SaveStatusProps = {
76
+ /** What the person's values are now: saved, a draft with changes, being saved, or a problem that kept them unsaved. */
77
+ state: MaybeAccessor<SaveStatusState>;
78
+ /** Formatted time of the last save, shown with `saved`. */
79
+ savedAt?: MaybeAccessor<string | undefined>;
80
+ /** Fields to check, shown with `invalid`. Default 1. */
81
+ invalidCount?: MaybeAccessor<number>;
82
+ /** With both handlers, Discard and Save follow the status while there is something to save. */
83
+ onDiscard?: () => void;
84
+ onSave?: () => void;
85
+ saveLabel?: string;
86
+ saveDisabled?: MaybeAccessor<boolean>;
87
+ class?: string;
88
+ };
89
+ /**
90
+ * The save status of a settings form at one fixed place, usually the head of its column. It reserves its width, so
91
+ * a change of state never moves the title or the buttons beside it. Problems with one field stay at that field.
92
+ */
93
+ export declare function SaveStatus(props: SaveStatusProps): JSX.Element;
72
94
  export {};
@@ -0,0 +1,26 @@
1
+ import { type JSX } from "solid-js";
2
+ /**
3
+ * True while `element` sits in the collapsed sidebar rail, which shows icons
4
+ * without labels. The stylesheet sets `--k2b-sidebar-rail` exactly where it
5
+ * collapses the sidebar, so this follows the same container width and state.
6
+ */
7
+ export declare const inSidebarRail: (element: Element | undefined) => boolean;
8
+ /**
9
+ * A sidebar entry's name, or its `title`, in the hint the Cloud app rail uses.
10
+ * In the collapsed rail it names the icon beside it at once. Elsewhere it
11
+ * shows above the entry with the usual delay, and only when it says more than
12
+ * the visible label: a label cut off, or a title with details. A native
13
+ * `title` on `target` gives way to it, so no hint shows twice.
14
+ */
15
+ export declare function SidebarRailHint(props: {
16
+ target: () => HTMLElement | undefined;
17
+ label: string | undefined;
18
+ /** The element that holds keyboard focus for the entry, when that is not `target`. */
19
+ focusTarget?: () => HTMLElement | undefined;
20
+ /** The visible label text inside `target`. */
21
+ labelSelector: string;
22
+ /** The entry renders a native `title`, which the hint replaces from the first hover or focus. */
23
+ titled?: boolean;
24
+ /** Called once the hint takes over; the entry stops rendering its native `title`. */
25
+ onArm?: () => void;
26
+ }): JSX.Element;
@@ -9,6 +9,11 @@ export type TabBarItem = {
9
9
  title?: string;
10
10
  /** The page this item leads to is open. */
11
11
  current?: boolean;
12
+ /**
13
+ * A mark at the icon's corner that calls for attention, such as an unread count. Its element names the count for
14
+ * screen readers; an empty one takes no space.
15
+ */
16
+ badge?: JSX.Element;
12
17
  };
13
18
  export type TabBarProps = {
14
19
  /** Accessible name of the navigation landmark. */
@@ -8,6 +8,7 @@ declare const detailPanelMessages: import("@k2b/stdlib").Catalog<{
8
8
  count: number;
9
9
  }) => string;
10
10
  showLess: string;
11
+ moreActions: string;
11
12
  }>;
12
13
  export type DetailPanelMessages = ReturnType<(typeof detailPanelMessages)["resolve"]>["t"];
13
14
  export declare const useDetailPanelMessages: () => (() => DetailPanelMessages);
@@ -1,3 +1,4 @@
1
+ export { AnchoredPopover, type AnchoredPopoverProps } from "./AnchoredPopover";
1
2
  export type { AppOverviewCardsProps, AppOverviewEmptyStateProps, AppOverviewPanelProps, AppOverviewProps, } from "./AppOverview";
2
3
  export { default as AppOverview } from "./AppOverview";
3
4
  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";
@@ -37,8 +38,8 @@ export { default as ResizeSeparator, type ResizeSeparatorProps } from "./ResizeS
37
38
  export { attachResizeSeparator, type ResizeSeparatorOptions } from "./resize-separator";
38
39
  export type { ScrollAreaProps } from "./ScrollArea";
39
40
  export { default as ScrollArea } from "./ScrollArea";
40
- export type { SettingsFieldControlProps, SettingsFieldProps, SettingsGroupActionProps, SettingsGroupProps, SettingsPageProps, SettingsPanelFooterProps, SettingsSaveBarProps, SettingsSectionProps, } from "./Settings";
41
- export { readSettingsError, SettingsField, SettingsGroup, SettingsPage, SettingsPanelFooter, SettingsSaveBar, SettingsSection, sameSettingValue, } from "./Settings";
41
+ export type { SaveStatusProps, SaveStatusState, SettingsFieldControlProps, SettingsFieldProps, SettingsGroupActionProps, SettingsGroupProps, SettingsPageProps, SettingsPanelFooterProps, SettingsSaveBarProps, SettingsSectionProps, } from "./Settings";
42
+ export { readSettingsError, SaveStatus, SettingsField, SettingsGroup, SettingsPage, SettingsPanelFooter, SettingsSaveBar, SettingsSection, sameSettingValue, } from "./Settings";
42
43
  export type { SettingsCollectionActionProps, SettingsCollectionItemActionsProps, SettingsCollectionItemProps, SettingsCollectionItemReorderProps, SettingsCollectionItemStatusProps, SettingsCollectionProps, } from "./SettingsCollection";
43
44
  export { default as SettingsCollection } from "./SettingsCollection";
44
45
  export type { SettingsModalFooterProps, SettingsModalGroupProps, SettingsModalProps, SettingsModalTabProps, SettingsModalTabTone, } from "./SettingsModal";
@@ -11,12 +11,24 @@ declare const settingsMessages: import("@k2b/stdlib").Catalog<{
11
11
  label: string;
12
12
  }) => string;
13
13
  saveChanges: string;
14
+ save: string;
14
15
  saving: string;
15
16
  unsaved: string;
16
17
  unsavedChangeLabel: ({ count }: {
17
18
  count: number;
18
19
  }) => string;
19
20
  noUnsavedChanges: string;
21
+ statusSaved: string;
22
+ statusSavedAt: ({ time }: {
23
+ time: string;
24
+ }) => string;
25
+ statusDraft: string;
26
+ statusFailed: string;
27
+ statusInvalid: ({ count }: {
28
+ count: number;
29
+ }) => string;
30
+ statusUnknown: string;
31
+ statusReadOnly: string;
20
32
  }>;
21
33
  export type SettingsMessages = ReturnType<(typeof settingsMessages)["resolve"]>["t"];
22
34
  /** Resolved from the inherited render locale. */
@@ -0,0 +1,22 @@
1
+ import { type JSX } from "solid-js";
2
+ /** `accent` = the app colour (it worked), `ai` = came from AI, `muted` = nothing happened. */
3
+ export type DotStripTone = "accent" | "warning" | "danger" | "ai" | "muted";
4
+ export type DotStripProps = {
5
+ /** Outcomes in order, left to right. */
6
+ dots: readonly DotStripTone[];
7
+ /** Total slots. Slots after `dots` show as empty rings, so a growing strip keeps its size. Defaults to `dots.length`. */
8
+ length?: number;
9
+ /** Shows every slot as a quiet placeholder, for "nothing checked yet". */
10
+ waiting?: boolean;
11
+ /** Index of the dot that belongs to the item shown next to the strip. */
12
+ selected?: number | null;
13
+ size?: "md" | "lg";
14
+ /** Dots per row; more wrap into further rows of the same width. Defaults to one row. */
15
+ columns?: number;
16
+ /** Names the strip and its counts, for example "Last 50 mails: 17 matched, 6 skipped, 27 not". */
17
+ label: string;
18
+ class?: string;
19
+ };
20
+ /** A fixed-size row of outcome dots: the last runs, checks or mails at a glance. */
21
+ export declare function DotStrip(props: DotStripProps): JSX.Element;
22
+ export default DotStrip;
@@ -1,6 +1,7 @@
1
1
  import { type JSX } from "solid-js";
2
2
  import type { IntentTone } from "../semantics";
3
- export type ProgressRingTone = Extract<IntentTone, "info" | "warning" | "danger">;
3
+ /** `accent` draws the ring in the app's own colour, for progress that belongs to the app rather than to a state. */
4
+ export type ProgressRingTone = Extract<IntentTone, "info" | "warning" | "danger"> | "accent";
4
5
  export type ProgressRingProps = {
5
6
  value: number;
6
7
  tone?: ProgressRingTone;
@@ -1,9 +1,12 @@
1
1
  import { type JSX } from "solid-js";
2
+ import type { LinkCardColor } from "./LinkCard";
2
3
  /**
3
4
  * What a card can show of the element it stands for: the element itself, a placeholder while it is being looked up, or
4
5
  * why it cannot be shown.
5
6
  */
6
7
  export type ResourceCardState = "ok" | "loading" | "no_access" | "deleted" | "unavailable";
8
+ /** The icon chip's colour, from the same palette as `LinkCard`. */
9
+ export type ResourceCardColor = LinkCardColor;
7
10
  export type ResourceCardProps = {
8
11
  /** Defaults to `"ok"`. Every state has the same size, so a card that changes state moves nothing around it. */
9
12
  state?: ResourceCardState;
@@ -11,6 +14,12 @@ export type ResourceCardProps = {
11
14
  title?: string;
12
15
  /** Icon class of the element's kind, for example `ti ti-notebook`. Shown only in state `"ok"`. */
13
16
  icon?: string;
17
+ /** Colour of the icon chip, usually one per kind of element. Without it the chip stays neutral. Only in state `"ok"`. */
18
+ color?: ResourceCardColor;
19
+ /** One line above the title: what and where the element is, for example "Task in IT planning · due 30 Oct". Only in state `"ok"`. */
20
+ context?: string;
21
+ /** The element's current state as a short label, for example "Open", shown at the end. Only in state `"ok"`. */
22
+ status?: string;
14
23
  /** What the element belongs to, for example the application or service. Shown only in state `"ok"`. */
15
24
  source?: string;
16
25
  /** Where the element lives within its source, for example a folder or a project. Shown only in state `"ok"`. */
@@ -4,6 +4,8 @@ export type { AvatarStackPerson, AvatarStackProps } from "./AvatarStack";
4
4
  export { AvatarStack } from "./AvatarStack";
5
5
  export type { DescriptionListItem, DescriptionListProps } from "./DescriptionList";
6
6
  export { DescriptionList } from "./DescriptionList";
7
+ export type { DotStripProps, DotStripTone } from "./DotStrip";
8
+ export { DotStrip } from "./DotStrip";
7
9
  export type { LinkCardColor, LinkCardProps } from "./LinkCard";
8
10
  export { LinkCard } from "./LinkCard";
9
11
  export type { NotFoundStateAction, NotFoundStateProps } from "./NotFoundState";
@@ -18,7 +20,8 @@ export type { ProgressBarProps, ProgressBarTone } from "./ProgressBar";
18
20
  export { ProgressBar } from "./ProgressBar";
19
21
  export type { ProgressRingProps, ProgressRingTone } from "./ProgressRing";
20
22
  export { ProgressRing } from "./ProgressRing";
21
- export type { ResourceCardProps, ResourceCardState } from "./ResourceCard";
23
+ export { PERSON_COLORS, personColor } from "./person-color";
24
+ export type { ResourceCardColor, ResourceCardProps, ResourceCardState } from "./ResourceCard";
22
25
  export { ResourceCard } from "./ResourceCard";
23
26
  export { Skeleton, type SkeletonProps } from "./Skeleton";
24
27
  export type { StatCellAccent, StatCellProps, StatCellTone } from "./StatCell";
@@ -0,0 +1,10 @@
1
+ /**
2
+ * The colors that stand for a person: the tint behind avatar initials, a collaborator's cursor, and the marks and
3
+ * comments a person leaves. The palette leaves out cyan, which means AI, and yellow, which reads as a text highlight.
4
+ * Several people can share a color, so a person's name always appears next to it.
5
+ */
6
+ export declare const PERSON_COLORS: readonly ["#3b82f6", "#6366f1", "#8b5cf6", "#c026d3", "#ec4899", "#e11d48", "#f97316", "#16a34a"];
7
+ /** The palette index for a name, the order of the `.k2b-avatar[data-tint]` rules. Surrounding spaces do not count. */
8
+ export declare const personTint: (name: string) => number;
9
+ /** A person's color from their display name, the same wherever Cloud shows that person. */
10
+ export declare const personColor: (name: string) => string;
@@ -3,6 +3,8 @@ declare const resourceMessages: import("@k2b/stdlib").Catalog<{
3
3
  resourceNoAccess: string;
4
4
  resourceDeleted: string;
5
5
  resourceUnavailable: string;
6
+ resourceKind: string;
7
+ resourceNoAccessHint: string;
6
8
  }>;
7
9
  export type ResourceMessages = ReturnType<(typeof resourceMessages)["resolve"]>["t"];
8
10
  /** Resolved from the inherited render locale. */
@@ -1,7 +1,8 @@
1
1
  import { type JSX } from "solid-js";
2
2
  /**
3
- * `standard` is 25rem high and `compact` 14rem; `fill` takes the height its container gives it, such as a grid cell,
4
- * and `content` has no fixed height. Every size except `content` scrolls body content taller than itself.
3
+ * `standard` is 25rem high and `compact` 14rem; `fill` takes the height and the width its container gives it, such as
4
+ * a grid cell, and does not size itself from its content; `content` has no fixed height. Every size except `content`
5
+ * scrolls body content taller than itself.
5
6
  */
6
7
  export type WidgetSize = "content" | "compact" | "standard" | "fill";
7
8
  export type WidgetProps = {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@k2b/ui",
3
- "version": "0.33.0",
3
+ "version": "0.34.0",
4
4
  "description": "Production-ready components for SolidJS applications.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -31,6 +31,11 @@
31
31
  "browser": "./dist/browser/chart-inspection.js",
32
32
  "default": "./dist/browser/chart-inspection.js"
33
33
  },
34
+ "./charts": {
35
+ "types": "./dist/types/charts.d.ts",
36
+ "browser": "./dist/browser/charts.js",
37
+ "default": "./dist/ssr/charts.js"
38
+ },
34
39
  "./package.json": "./package.json",
35
40
  "./map-glyphs/*": "./map-glyphs/*"
36
41
  },