@k2b/ui 0.29.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 (173) hide show
  1. package/README.md +1 -1
  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/ViewTabs.js +294 -0
  14. package/dist/browser/actions/ViewTabs.js.map +1 -0
  15. package/dist/browser/actions/filter-messages.js +6 -2
  16. package/dist/browser/actions/filter-messages.js.map +1 -1
  17. package/dist/browser/actions/index.js +2 -1
  18. package/dist/browser/actions/index.js.map +1 -1
  19. package/dist/browser/chat/ChatComposer.js +1108 -604
  20. package/dist/browser/chat/ChatComposer.js.map +1 -1
  21. package/dist/browser/chat/ChatDecision.js +120 -84
  22. package/dist/browser/chat/ChatDecision.js.map +1 -1
  23. package/dist/browser/chat/ChatPrimitives.js +292 -159
  24. package/dist/browser/chat/ChatPrimitives.js.map +1 -1
  25. package/dist/browser/chat/chat-messages.js +8 -0
  26. package/dist/browser/chat/chat-messages.js.map +1 -1
  27. package/dist/browser/chat/command-search.js +26 -15
  28. package/dist/browser/chat/command-search.js.map +1 -1
  29. package/dist/browser/chat/index.js +4 -2
  30. package/dist/browser/chat/index.js.map +1 -1
  31. package/dist/browser/content/Calendar.js +143 -116
  32. package/dist/browser/content/Calendar.js.map +1 -1
  33. package/dist/browser/content/CalendarWeekView.js +291 -266
  34. package/dist/browser/content/CalendarWeekView.js.map +1 -1
  35. package/dist/browser/content/DataTable.js +224 -155
  36. package/dist/browser/content/DataTable.js.map +1 -1
  37. package/dist/browser/content/data-table-messages.js +4 -2
  38. package/dist/browser/content/data-table-messages.js.map +1 -1
  39. package/dist/browser/feedback/MovedHint.js +197 -0
  40. package/dist/browser/feedback/MovedHint.js.map +1 -0
  41. package/dist/browser/feedback/dialog-core.js +66 -9
  42. package/dist/browser/feedback/dialog-core.js.map +1 -1
  43. package/dist/browser/feedback/index.js +1 -0
  44. package/dist/browser/feedback/index.js.map +1 -1
  45. package/dist/browser/feedback/prompts.js +6 -1
  46. package/dist/browser/feedback/prompts.js.map +1 -1
  47. package/dist/browser/inputs/DatePicker.js +337 -212
  48. package/dist/browser/inputs/DatePicker.js.map +1 -1
  49. package/dist/browser/inputs/date-picker.js +59 -5
  50. package/dist/browser/inputs/date-picker.js.map +1 -1
  51. package/dist/browser/intl/messages.js +12 -0
  52. package/dist/browser/intl/messages.js.map +1 -1
  53. package/dist/browser/intl/weekend.js +39 -0
  54. package/dist/browser/intl/weekend.js.map +1 -0
  55. package/dist/browser/layout/AppOverview.js +0 -1
  56. package/dist/browser/layout/AppOverview.js.map +1 -1
  57. package/dist/browser/layout/AppWorkspace.js +688 -471
  58. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  59. package/dist/browser/layout/PageTitle.js +3 -2
  60. package/dist/browser/layout/PageTitle.js.map +1 -1
  61. package/dist/browser/layout/SettingsModal.js +2 -2
  62. package/dist/browser/layout/SettingsModal.js.map +1 -1
  63. package/dist/browser/layout/SidebarSwitcher.js +13 -12
  64. package/dist/browser/layout/SidebarSwitcher.js.map +1 -1
  65. package/dist/browser/layout/TabBar.js +1 -1
  66. package/dist/browser/layout/TabBar.js.map +1 -1
  67. package/dist/browser/layout/app-host-width.js +44 -0
  68. package/dist/browser/layout/app-host-width.js.map +1 -0
  69. package/dist/browser/layout/app-workspace-controller.js +219 -39
  70. package/dist/browser/layout/app-workspace-controller.js.map +1 -1
  71. package/dist/browser/layout/index.js +1 -0
  72. package/dist/browser/layout/index.js.map +1 -1
  73. package/dist/browser/surfaces/Placeholder.js +36 -13
  74. package/dist/browser/surfaces/Placeholder.js.map +1 -1
  75. package/dist/ssr/actions/Dropdown.js +5 -2
  76. package/dist/ssr/actions/Dropdown.js.map +1 -1
  77. package/dist/ssr/actions/FilterChip.js +59 -7
  78. package/dist/ssr/actions/FilterChip.js.map +1 -1
  79. package/dist/ssr/actions/SegmentedControl.js +1 -2
  80. package/dist/ssr/actions/SegmentedControl.js.map +1 -1
  81. package/dist/ssr/actions/SpotlightSearch.js +2 -2
  82. package/dist/ssr/actions/SpotlightSearch.js.map +1 -1
  83. package/dist/ssr/actions/Tabs.js +2 -2
  84. package/dist/ssr/actions/Tabs.js.map +1 -1
  85. package/dist/ssr/actions/ViewTabs.js +211 -0
  86. package/dist/ssr/actions/ViewTabs.js.map +1 -0
  87. package/dist/ssr/actions/filter-messages.js +6 -2
  88. package/dist/ssr/actions/filter-messages.js.map +1 -1
  89. package/dist/ssr/actions/index.js +2 -1
  90. package/dist/ssr/actions/index.js.map +1 -1
  91. package/dist/ssr/chat/ChatComposer.js +546 -131
  92. package/dist/ssr/chat/ChatComposer.js.map +1 -1
  93. package/dist/ssr/chat/ChatDecision.js +33 -19
  94. package/dist/ssr/chat/ChatDecision.js.map +1 -1
  95. package/dist/ssr/chat/ChatPrimitives.js +95 -24
  96. package/dist/ssr/chat/ChatPrimitives.js.map +1 -1
  97. package/dist/ssr/chat/chat-messages.js +8 -0
  98. package/dist/ssr/chat/chat-messages.js.map +1 -1
  99. package/dist/ssr/chat/command-search.js +26 -15
  100. package/dist/ssr/chat/command-search.js.map +1 -1
  101. package/dist/ssr/chat/index.js +4 -2
  102. package/dist/ssr/chat/index.js.map +1 -1
  103. package/dist/ssr/content/Calendar.js +109 -100
  104. package/dist/ssr/content/Calendar.js.map +1 -1
  105. package/dist/ssr/content/CalendarWeekView.js +42 -28
  106. package/dist/ssr/content/CalendarWeekView.js.map +1 -1
  107. package/dist/ssr/content/DataTable.js +78 -31
  108. package/dist/ssr/content/DataTable.js.map +1 -1
  109. package/dist/ssr/content/data-table-messages.js +4 -2
  110. package/dist/ssr/content/data-table-messages.js.map +1 -1
  111. package/dist/ssr/feedback/MovedHint.js +166 -0
  112. package/dist/ssr/feedback/MovedHint.js.map +1 -0
  113. package/dist/ssr/feedback/dialog-core.js +66 -9
  114. package/dist/ssr/feedback/dialog-core.js.map +1 -1
  115. package/dist/ssr/feedback/index.js +1 -0
  116. package/dist/ssr/feedback/index.js.map +1 -1
  117. package/dist/ssr/feedback/prompts.js +6 -1
  118. package/dist/ssr/feedback/prompts.js.map +1 -1
  119. package/dist/ssr/inputs/DatePicker.js +138 -69
  120. package/dist/ssr/inputs/DatePicker.js.map +1 -1
  121. package/dist/ssr/inputs/date-picker.js +59 -5
  122. package/dist/ssr/inputs/date-picker.js.map +1 -1
  123. package/dist/ssr/intl/messages.js +12 -0
  124. package/dist/ssr/intl/messages.js.map +1 -1
  125. package/dist/ssr/intl/weekend.js +39 -0
  126. package/dist/ssr/intl/weekend.js.map +1 -0
  127. package/dist/ssr/layout/AppOverview.js +0 -1
  128. package/dist/ssr/layout/AppOverview.js.map +1 -1
  129. package/dist/ssr/layout/AppWorkspace.js +203 -39
  130. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  131. package/dist/ssr/layout/PageTitle.js +3 -2
  132. package/dist/ssr/layout/PageTitle.js.map +1 -1
  133. package/dist/ssr/layout/SettingsModal.js +2 -2
  134. package/dist/ssr/layout/SettingsModal.js.map +1 -1
  135. package/dist/ssr/layout/SidebarSwitcher.js +13 -12
  136. package/dist/ssr/layout/SidebarSwitcher.js.map +1 -1
  137. package/dist/ssr/layout/TabBar.js +1 -1
  138. package/dist/ssr/layout/TabBar.js.map +1 -1
  139. package/dist/ssr/layout/app-host-width.js +44 -0
  140. package/dist/ssr/layout/app-host-width.js.map +1 -0
  141. package/dist/ssr/layout/app-workspace-controller.js +219 -39
  142. package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
  143. package/dist/ssr/layout/index.js +1 -0
  144. package/dist/ssr/layout/index.js.map +1 -1
  145. package/dist/ssr/surfaces/Placeholder.js +24 -7
  146. package/dist/ssr/surfaces/Placeholder.js.map +1 -1
  147. package/dist/styles.css +1 -1
  148. package/dist/types/actions/Dropdown.d.ts +4 -0
  149. package/dist/types/actions/FilterChip.d.ts +22 -0
  150. package/dist/types/actions/ViewTabs.d.ts +30 -0
  151. package/dist/types/actions/filter-messages.d.ts +2 -0
  152. package/dist/types/actions/index.d.ts +4 -2
  153. package/dist/types/chat/ChatComposer.d.ts +52 -0
  154. package/dist/types/chat/ChatDecision.d.ts +18 -2
  155. package/dist/types/chat/ChatPrimitives.d.ts +10 -0
  156. package/dist/types/chat/chat-messages.d.ts +4 -0
  157. package/dist/types/chat/command-search.d.ts +2 -0
  158. package/dist/types/chat/index.d.ts +9 -8
  159. package/dist/types/content/DataTable.d.ts +3 -0
  160. package/dist/types/content/data-table-messages.d.ts +1 -0
  161. package/dist/types/feedback/MovedHint.d.ts +25 -0
  162. package/dist/types/feedback/dialog-core.d.ts +5 -2
  163. package/dist/types/feedback/index.d.ts +2 -0
  164. package/dist/types/feedback/prompts.d.ts +2 -0
  165. package/dist/types/inputs/DatePicker.d.ts +7 -0
  166. package/dist/types/inputs/date-picker.d.ts +25 -1
  167. package/dist/types/intl/messages.d.ts +6 -0
  168. package/dist/types/intl/weekend.d.ts +12 -0
  169. package/dist/types/layout/AppWorkspace.d.ts +43 -7
  170. package/dist/types/layout/app-host-width.d.ts +6 -0
  171. package/dist/types/layout/index.d.ts +2 -1
  172. package/dist/types/surfaces/Placeholder.d.ts +2 -1
  173. package/package.json +4 -4
@@ -14,6 +14,8 @@ export type DropdownActionBase = {
14
14
  */
15
15
  ariaLabel?: string;
16
16
  description?: string;
17
+ /** Quiet trailing information, such as a count. */
18
+ trailing?: JSX.Element;
17
19
  variant?: "danger";
18
20
  };
19
21
  export type DropdownAction = (DropdownActionBase & {
@@ -107,6 +109,8 @@ export type DropdownItemProps = {
107
109
  icon?: string;
108
110
  image?: string;
109
111
  description?: string;
112
+ /** Quiet trailing information, such as a count. */
113
+ trailing?: JSX.Element;
110
114
  disabled?: boolean;
111
115
  danger?: boolean;
112
116
  variant?: "danger";
@@ -28,9 +28,31 @@ export type FilterChipProps = {
28
28
  iconOnly?: boolean;
29
29
  /** Use a standard button appearance instead of the default filter field. */
30
30
  variant?: ButtonVariant;
31
+ /**
32
+ * An active chip names its first value instead of a count: "Tags: Customer", "Tags: Customer +2". Use it for the
33
+ * chips of `AppWorkspace.Head`; pass only the filter's name as `label`. The chip then grows with its value.
34
+ */
35
+ showValue?: boolean;
31
36
  disabled?: boolean;
32
37
  class?: string;
33
38
  };
34
39
  /** Section-aware controlled filter with immediate single- and multi-select commits. */
35
40
  export declare function FilterChip(props: FilterChipProps): JSX.Element;
36
41
  export default FilterChip;
42
+ export type FilterToggleProps = {
43
+ label: JSX.Element;
44
+ icon: string;
45
+ /** Whether the filter is on. An active toggle carries the same tint as an active `FilterChip`. */
46
+ active: boolean;
47
+ /** Link to the URL with the filter switched. The link keeps working without JavaScript. */
48
+ href?: string;
49
+ onClick?: (event: MouseEvent) => void;
50
+ title?: string;
51
+ disabled?: boolean;
52
+ class?: string;
53
+ };
54
+ /**
55
+ * One on/off filter in the chip look: a link marked `aria-current="true"` while active, or a button with
56
+ * `aria-pressed`. Selection changes only colour and background, so neighbouring chips never move.
57
+ */
58
+ export declare function FilterToggle(props: FilterToggleProps): JSX.Element;
@@ -0,0 +1,30 @@
1
+ import { type JSX } from "solid-js";
2
+ export type ViewTab = {
3
+ id: string;
4
+ label: string;
5
+ href: string;
6
+ icon?: string;
7
+ count?: number | string;
8
+ };
9
+ export type ViewTabsProps = {
10
+ /** Accessible name of the navigation landmark, e.g. "Views". */
11
+ label: string;
12
+ items: readonly ViewTab[];
13
+ /** Id of the open view; the server reads it from `?view=`. Unknown ids select nothing. */
14
+ current: string | undefined;
15
+ /** Tabs shown before More (default 5). */
16
+ max?: number;
17
+ class?: string;
18
+ };
19
+ /** Two deterministic strip levels; only opening the menu reads CSS visibility. */
20
+ export declare function viewTabsLayout(items: readonly ViewTab[], current: string | undefined, max?: number): {
21
+ wide: number[];
22
+ compact: number[];
23
+ wideHidden: number;
24
+ compactHidden: number;
25
+ };
26
+ /**
27
+ * URL-backed object views. Every view is an ordinary document link, in the strip and under More, so reload, back,
28
+ * and forward keep the view the URL names.
29
+ */
30
+ export declare function ViewTabs(props: ViewTabsProps): JSX.Element;
@@ -1,5 +1,7 @@
1
1
  declare const filterMessages: import("@k2b/stdlib").Catalog<{
2
2
  filterActions: string;
3
+ filters: string;
4
+ reset: string;
3
5
  }>;
4
6
  export type FilterMessages = ReturnType<(typeof filterMessages)["resolve"]>["t"];
5
7
  /** Resolved from the inherited render locale. */
@@ -10,8 +10,8 @@ export type { DragPayload, DragSourceProps, DropTargetProps } from "./DragAndDro
10
10
  export { activeDrag, DragSource, DropTarget, useKeyboardDrag } from "./DragAndDrop";
11
11
  export type { DropdownAction, DropdownActionBase, DropdownChoice, DropdownItemProps, DropdownPosition, DropdownProps, DropdownSection, DropdownTriggerProps, } from "./Dropdown";
12
12
  export { Dropdown, DropdownItem, dropdownPosition } from "./Dropdown";
13
- export type { FilterChipOption, FilterChipProps, FilterChipSection } from "./FilterChip";
14
- export { FilterChip } from "./FilterChip";
13
+ export type { FilterChipOption, FilterChipProps, FilterChipSection, FilterToggleProps } from "./FilterChip";
14
+ export { FilterChip, FilterToggle } from "./FilterChip";
15
15
  export type { GestureKind, GestureMenuAction, GestureMenuItem, GestureMenuProps, GestureMenuSection } from "./GestureMenu";
16
16
  export { GestureMenu } from "./GestureMenu";
17
17
  export type { RemoveButtonProps } from "./RemoveButton";
@@ -26,3 +26,5 @@ export type { TabOption, TabsItemProps, TabsProps } from "./Tabs";
26
26
  export { Tabs } from "./Tabs";
27
27
  export type { ToolbarActionProps, ToolbarGroupProps, ToolbarLabelProps, ToolbarProps, ToolbarSeparatorProps } from "./Toolbar";
28
28
  export { Toolbar } from "./Toolbar";
29
+ export type { ViewTab, ViewTabsProps } from "./ViewTabs";
30
+ export { ViewTabs } from "./ViewTabs";
@@ -15,6 +15,18 @@ export type ChatCommandResult = void | "cancelled" | {
15
15
  } | {
16
16
  mention: ChatAttachment;
17
17
  };
18
+ /** The draft as a successful `open` leaves it: without the `/…` token, with its references moved along. Save this one. */
19
+ export type ChatCommandDraft = {
20
+ value: string;
21
+ mentions: readonly ChatMention[];
22
+ };
23
+ /**
24
+ * How an `open` row ends: on success (`void`) the token leaves as for an action; `"cancelled"` changes nothing; `failed`
25
+ * keeps the list open and the draft unchanged, and its text replaces the row's description until the row runs again.
26
+ */
27
+ export type ChatCommandOpenResult = void | "cancelled" | {
28
+ failed: string;
29
+ };
18
30
  /** A fixed place in the slash list. Sections keep the given order, also while searching. */
19
31
  export type ChatCommandSection = {
20
32
  id: string;
@@ -23,6 +35,20 @@ export type ChatCommandSection = {
23
35
  searched?: boolean;
24
36
  /** Only while searching or narrowed: absent from the overview (empty query), including its loading placeholder. */
25
37
  searchOnly?: boolean;
38
+ /** Only in the overview (empty query, no scope): absent while searching or narrowed, such as recently used rows. */
39
+ overviewOnly?: boolean;
40
+ /**
41
+ * Its local rows are fixed when the list opens: a row that arrives while the list is open waits for the next opening,
42
+ * so a section above others whose rows load in the background never pushes a visible row down. Rows that go away
43
+ * still leave at once.
44
+ */
45
+ fixedWhileOpen?: boolean;
46
+ /**
47
+ * Local rows still on their way, such as Commands from a catalog: the section ends with placeholder rows, three in
48
+ * the overview and one while searching, and its heading shows a spinner. Make it the last section, so rows that
49
+ * arrive only fill the end of the list and no visible row moves.
50
+ */
51
+ pending?: boolean;
26
52
  };
27
53
  /** First-word narrowing; Tab writes `words[0]` followed by a space. */
28
54
  export type ChatCommandScope = {
@@ -47,8 +73,15 @@ export type ChatCommand = {
47
73
  selected?: boolean;
48
74
  /** Retry discovery in a new opening, retaining the token and currently displayed rows. */
49
75
  searchAgain?: boolean;
76
+ /** Stays in every search of its section, after the matches, such as a row that retries loading the section. */
77
+ persistent?: boolean;
50
78
  /** Application name, searchable but not displayed. */
51
79
  app?: string;
80
+ /**
81
+ * Used recently by this person. While searching, a matching row moves one step up the ranking ladder of its section
82
+ * and comes before rows of equal rank. The overview keeps consumer order.
83
+ */
84
+ recent?: boolean;
52
85
  /** Stable row key for option ids, marking and de-duplication. Defaults to `name`. */
53
86
  id?: string;
54
87
  name: string;
@@ -62,6 +95,16 @@ export type ChatCommand = {
62
95
  busyLabel?: string;
63
96
  /** Failures restore an unchanged draft and appear once in the status line, without calling `onError`. */
64
97
  action?: (context: ChatCommandContext) => ChatCommandResult | Promise<ChatCommandResult>;
98
+ /**
99
+ * Leaves the composer, such as opening another app. Runs with the token and the list in place: the row shows
100
+ * `busyLabel` (default "Opening …") with a spinner instead of its description, and editing waits. A rejection ends like
101
+ * an action's: the token stays, the list closes and the status line names the reason. Closing the list, such as with
102
+ * Escape, cancels: `signal` aborts and the row ends at once. `signal` also aborts when the opening ends any other way
103
+ * than by success, so the opener can save the draft with its token again. A new `draftKey` cancels too, unless the
104
+ * opener calls `follow()` right before changing it itself: that next change keeps the opening, moves its busy line
105
+ * to the status line, and Escape still cancels. See `ChatCommandOpenResult`.
106
+ */
107
+ open?: (draft: ChatCommandDraft, signal: AbortSignal, follow: () => void) => Promise<ChatCommandOpenResult>;
65
108
  /** Selecting a reference inserts its display name and retains its opaque payload. */
66
109
  mention?: ChatAttachment;
67
110
  /**
@@ -104,7 +147,16 @@ export type ChatComposerProps = {
104
147
  fileSelection?: ChatFileSelection;
105
148
  /** Handle non-file clipboard content. Pasted files already use `fileSelection`. */
106
149
  onPaste?: ChatPasteHandler;
150
+ /** The add menu's entries after "Attach files". Not shown with `addOpensCommands`. */
107
151
  menuActions?: readonly ChatAction[];
152
+ /**
153
+ * "+" opens the slash list with a search field on top instead of the add menu, for keyboards where "/" is hard to
154
+ * reach, such as a phone's. The search field filters, narrows and chooses as typing after "/" does, and a reference
155
+ * lands where the field's caret was when "+" was pressed. Escape, "+" again, Back on a phone or a press outside
156
+ * closes the list without acting on what lies below, and the field gets its focus and selection back. `menuActions`
157
+ * do not show then: offer them as `commands`, and file selection as a row with `attachFiles`.
158
+ */
159
+ addOpensCommands?: boolean;
108
160
  models?: readonly ChatModelOption[];
109
161
  selectedModelId?: string | null;
110
162
  onModelChange?: (modelId: string) => void;
@@ -72,10 +72,25 @@ declare function ChatPreviewTitle(props: ChatPreviewTitleProps): JSX.Element;
72
72
  declare function ChatPreviewSentence(props: {
73
73
  children: JSX.Element;
74
74
  }): JSX.Element;
75
+ export type ChatPreviewExcerptProps = {
76
+ children: JSX.Element;
77
+ /** Shows the whole text in place instead of the first lines, such as after `Chat.Preview.ShowAll`. */
78
+ expanded?: boolean;
79
+ id?: string;
80
+ };
75
81
  /** The first lines of a longer text. It keeps its line breaks, shows about three lines, and fades out. */
76
- declare function ChatPreviewExcerpt(props: {
82
+ declare function ChatPreviewExcerpt(props: ChatPreviewExcerptProps): JSX.Element;
83
+ export type ChatPreviewShowAllProps = {
84
+ /** The id of the `Chat.Preview.Excerpt` this button opens. */
85
+ controls: string;
86
+ onShow: () => void;
77
87
  children: JSX.Element;
78
- }): JSX.Element;
88
+ };
89
+ /**
90
+ * Shows the rest of an excerpt in place, for a text with no page of its own to open. It looks like `ReadMore`; the
91
+ * caller removes it once the text is shown, and the focus moves to the text, so reading goes on where it was.
92
+ */
93
+ declare function ChatPreviewShowAll(props: ChatPreviewShowAllProps): JSX.Element;
79
94
  export type ChatPreviewReadMoreProps = {
80
95
  href: string;
81
96
  children: JSX.Element;
@@ -120,6 +135,7 @@ export declare const ChatPreview: typeof ChatPreviewRoot & {
120
135
  Sentence: typeof ChatPreviewSentence;
121
136
  Excerpt: typeof ChatPreviewExcerpt;
122
137
  ReadMore: typeof ChatPreviewReadMore;
138
+ ShowAll: typeof ChatPreviewShowAll;
123
139
  Lines: typeof ChatPreviewLines;
124
140
  Line: typeof ChatPreviewLine;
125
141
  People: typeof ChatPreviewPeople;
@@ -53,5 +53,15 @@ export type ChatContextUsageProps = ChatContextUsageData & {
53
53
  };
54
54
  export declare const formatChatTokens: (tokens: number) => string;
55
55
  export declare function ChatMessage(props: ChatMessageProps): JSX.Element;
56
+ export type ChatActivityToggleProps = {
57
+ /** The words that open the body, usually the count, such as "3 of 4 tasks". */
58
+ children: JSX.Element;
59
+ };
60
+ /**
61
+ * The words of an activity label that open its body, with the chevron right after them. With a toggle in its label,
62
+ * only these words are the disclosure, and the rest of the row, chips with links included, stays ordinary content.
63
+ * Outside an activity with a body it renders its words as plain text.
64
+ */
65
+ export declare function ChatActivityToggle(props: ChatActivityToggleProps): JSX.Element;
56
66
  export declare function ChatActivity(props: ChatActivityProps): JSX.Element;
57
67
  export declare function ChatContextUsage(props: ChatContextUsageProps): JSX.Element;
@@ -3,10 +3,14 @@ export declare const chatMessages: import("@k2b/stdlib").Catalog<{
3
3
  commandDraftChanged: string;
4
4
  markAdded: string;
5
5
  markRemoved: string;
6
+ commandOpening: string;
6
7
  commandSelected: string;
7
8
  attachments: string;
8
9
  assistant: string;
9
10
  addToChat: string;
11
+ addMenu: string;
12
+ commandSearch: string;
13
+ commandSearchLabel: string;
10
14
  attachFiles: string;
11
15
  addGuidance: string;
12
16
  chat: string;
@@ -20,6 +20,8 @@ type Group = {
20
20
  rows: ChatCommandRow[];
21
21
  loading: boolean;
22
22
  placeholder: boolean;
23
+ /** Placeholder rows of a `pending` section, after its rows: three in the overview, one while searching. */
24
+ pendingRows: number;
23
25
  };
24
26
  export declare function chatCommandListModel(input: {
25
27
  query: string;
@@ -4,12 +4,12 @@ import { ChatTasks } from "./ChatTasks";
4
4
  export type { ChatTask, ChatTasksProps } from "./ChatTasks";
5
5
  import { ChatComposer } from "./ChatComposer";
6
6
  import { ChatDecision, ChatMark, ChatOutcome } from "./ChatDecision";
7
- import { ChatActivity, ChatContextUsage, ChatMessage } from "./ChatPrimitives";
7
+ import { ChatActivity, ChatActivityToggle, ChatContextUsage, ChatMessage } from "./ChatPrimitives";
8
8
  import { ChatRoot } from "./ChatRoot";
9
9
  import { ChatTimeline } from "./ChatTimeline";
10
- export type { ChatCommand, ChatCommandContext, ChatCommandResult, ChatCommandScope, ChatCommandSearch, ChatCommandSection, ChatComposerProps, ChatFileSelection, ChatPasteHandler, } from "./ChatComposer";
11
- export type { ChatDecisionProps, ChatMarkProps, ChatOutcomeProps, ChatPreviewHeaderProps, ChatPreviewLineProps, ChatPreviewPeopleProps, ChatPreviewProps, ChatPreviewReadMoreProps, ChatPreviewTitleProps, } from "./ChatDecision";
12
- export type { ChatActivityProps, ChatContextUsageProps, ChatMessageProps } from "./ChatPrimitives";
10
+ export type { ChatCommand, ChatCommandContext, ChatCommandDraft, ChatCommandOpenResult, ChatCommandResult, ChatCommandScope, ChatCommandSearch, ChatCommandSection, ChatComposerProps, ChatFileSelection, ChatPasteHandler, } from "./ChatComposer";
11
+ export type { ChatDecisionProps, ChatMarkProps, ChatOutcomeProps, ChatPreviewExcerptProps, ChatPreviewHeaderProps, ChatPreviewLineProps, ChatPreviewPeopleProps, ChatPreviewProps, ChatPreviewReadMoreProps, ChatPreviewShowAllProps, ChatPreviewTitleProps, } from "./ChatDecision";
12
+ export type { ChatActivityProps, ChatActivityToggleProps, ChatContextUsageProps, ChatMessageProps } from "./ChatPrimitives";
13
13
  export { formatChatTokens } from "./ChatPrimitives";
14
14
  export type { ChatRootProps } from "./ChatRoot";
15
15
  export type { ChatActivityItem, ChatMessageItem, ChatTimelineItem, ChatTimelineProps } from "./ChatTimeline";
@@ -22,7 +22,9 @@ export declare const Chat: typeof ChatRoot & {
22
22
  Tasks: typeof ChatTasks;
23
23
  Timeline: typeof ChatTimeline;
24
24
  Message: typeof ChatMessage;
25
- Activity: typeof ChatActivity;
25
+ Activity: typeof ChatActivity & {
26
+ Toggle: typeof ChatActivityToggle;
27
+ };
26
28
  Composer: typeof ChatComposer;
27
29
  ContextUsage: typeof ChatContextUsage;
28
30
  ContextPopup: typeof ChatContextPopup;
@@ -35,10 +37,9 @@ export declare const Chat: typeof ChatRoot & {
35
37
  Sentence: (props: {
36
38
  children: import("solid-js").JSX.Element;
37
39
  }) => import("solid-js").JSX.Element;
38
- Excerpt: (props: {
39
- children: import("solid-js").JSX.Element;
40
- }) => import("solid-js").JSX.Element;
40
+ Excerpt: (props: import("./ChatDecision").ChatPreviewExcerptProps) => import("solid-js").JSX.Element;
41
41
  ReadMore: (props: import("./ChatDecision").ChatPreviewReadMoreProps) => import("solid-js").JSX.Element;
42
+ ShowAll: (props: import("./ChatDecision").ChatPreviewShowAllProps) => import("solid-js").JSX.Element;
42
43
  Lines: (props: {
43
44
  label?: string;
44
45
  children: import("solid-js").JSX.Element;
@@ -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";
@@ -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. */
@@ -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
  /**
@@ -249,7 +284,7 @@ export type AppWorkspaceSidebarItemIconProps = {
249
284
  };
250
285
  export type AppWorkspaceSidebarItemLabelProps = {
251
286
  children: JSX.Element;
252
- /** 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. */
253
288
  marquee?: boolean;
254
289
  };
255
290
  export type AppWorkspaceSidebarItemMetaProps = {
@@ -362,6 +397,7 @@ type AppWorkspaceNavTreeComponent = ((props: AppWorkspaceNavTreeProps) => JSX.El
362
397
  };
363
398
  type AppWorkspaceComponent = ((props: AppWorkspaceProps) => JSX.Element) & {
364
399
  LayoutStateProvider: (props: AppWorkspaceLayoutStateProviderProps) => JSX.Element;
400
+ Head: (props: AppWorkspaceHeadProps) => JSX.Element;
365
401
  Content: (props: AppWorkspaceContentProps) => JSX.Element;
366
402
  Main: (props: AppWorkspaceMainProps) => JSX.Element;
367
403
  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;
@@ -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";
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
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;