@k2b/ui 0.26.0 → 0.28.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 (231) hide show
  1. package/README.md +1 -1
  2. package/dist/base.css +147 -2
  3. package/dist/browser/actions/ContextMenu.js +30 -4
  4. package/dist/browser/actions/ContextMenu.js.map +1 -1
  5. package/dist/browser/actions/Dropdown.js +184 -158
  6. package/dist/browser/actions/Dropdown.js.map +1 -1
  7. package/dist/browser/actions/GestureMenu.js +71 -138
  8. package/dist/browser/actions/GestureMenu.js.map +1 -1
  9. package/dist/browser/actions/Toolbar.js +379 -48
  10. package/dist/browser/actions/Toolbar.js.map +1 -1
  11. package/dist/browser/actions/index.js.map +1 -1
  12. package/dist/browser/actions/menu-rows.js +15 -0
  13. package/dist/browser/actions/menu-rows.js.map +1 -0
  14. package/dist/browser/actions/menu-sheet.js +154 -0
  15. package/dist/browser/actions/menu-sheet.js.map +1 -0
  16. package/dist/browser/actions/toolbar-messages.js +20 -0
  17. package/dist/browser/actions/toolbar-messages.js.map +1 -0
  18. package/dist/browser/chart-inspection.js +3 -0
  19. package/dist/browser/chart-inspection.js.map +1 -0
  20. package/dist/browser/chat/ChatComposer.js +1020 -431
  21. package/dist/browser/chat/ChatComposer.js.map +1 -1
  22. package/dist/browser/chat/chat-behavior.js +4 -0
  23. package/dist/browser/chat/chat-behavior.js.map +1 -1
  24. package/dist/browser/chat/chat-messages.js +33 -1
  25. package/dist/browser/chat/chat-messages.js.map +1 -1
  26. package/dist/browser/chat/command-search.js +173 -0
  27. package/dist/browser/chat/command-search.js.map +1 -0
  28. package/dist/browser/chat/composer-document.js +1 -1
  29. package/dist/browser/chat/composer-document.js.map +1 -1
  30. package/dist/browser/chat/index.js +2 -0
  31. package/dist/browser/chat/index.js.map +1 -1
  32. package/dist/browser/chat/reaction-people.js +15 -0
  33. package/dist/browser/chat/reaction-people.js.map +1 -0
  34. package/dist/browser/content/CalendarDayView.js +28 -3
  35. package/dist/browser/content/CalendarDayView.js.map +1 -1
  36. package/dist/browser/content/Chart.js +6 -15
  37. package/dist/browser/content/Chart.js.map +1 -1
  38. package/dist/browser/content/ChartSnapshotView.js +7 -10
  39. package/dist/browser/content/ChartSnapshotView.js.map +1 -1
  40. package/dist/browser/content/MessageRow.js +330 -448
  41. package/dist/browser/content/MessageRow.js.map +1 -1
  42. package/dist/browser/content/ReactionBar.js +419 -0
  43. package/dist/browser/content/ReactionBar.js.map +1 -0
  44. package/dist/browser/content/chart-inspection-core.js +557 -0
  45. package/dist/browser/content/chart-inspection-core.js.map +1 -0
  46. package/dist/browser/content/chart-inspection.js +10 -445
  47. package/dist/browser/content/chart-inspection.js.map +1 -1
  48. package/dist/browser/content/chart-line-gaps.js +1 -1
  49. package/dist/browser/content/chart-line-gaps.js.map +1 -1
  50. package/dist/browser/content/chart-snapshot.js +1 -1
  51. package/dist/browser/content/chart-snapshot.js.map +1 -1
  52. package/dist/browser/content/index.js +1 -0
  53. package/dist/browser/content/index.js.map +1 -1
  54. package/dist/browser/feedback/dialog-core.js +135 -23
  55. package/dist/browser/feedback/dialog-core.js.map +1 -1
  56. package/dist/browser/index.js +1 -0
  57. package/dist/browser/index.js.map +1 -1
  58. package/dist/browser/input-mode.js +40 -0
  59. package/dist/browser/input-mode.js.map +1 -0
  60. package/dist/browser/inputs/Combobox.js +4 -2
  61. package/dist/browser/inputs/Combobox.js.map +1 -1
  62. package/dist/browser/inputs/FileDropTarget.js +24 -9
  63. package/dist/browser/inputs/FileDropTarget.js.map +1 -1
  64. package/dist/browser/inputs/FileInputs.js +2 -2
  65. package/dist/browser/inputs/FileInputs.js.map +1 -1
  66. package/dist/browser/inputs/SelectChip.js +52 -12
  67. package/dist/browser/inputs/SelectChip.js.map +1 -1
  68. package/dist/browser/inputs/emoji/EmojiPicker.js +13 -0
  69. package/dist/browser/inputs/emoji/EmojiPicker.js.map +1 -1
  70. package/dist/browser/inputs/file-drop.js.map +1 -1
  71. package/dist/browser/layout/AppWorkspace.js +708 -515
  72. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  73. package/dist/browser/layout/BottomSheet.js +8 -0
  74. package/dist/browser/layout/BottomSheet.js.map +1 -1
  75. package/dist/browser/layout/DetailPanel.js +283 -197
  76. package/dist/browser/layout/DetailPanel.js.map +1 -1
  77. package/dist/browser/layout/Discussion.js +233 -185
  78. package/dist/browser/layout/Discussion.js.map +1 -1
  79. package/dist/browser/layout/TableOfContents.js +10 -2
  80. package/dist/browser/layout/TableOfContents.js.map +1 -1
  81. package/dist/browser/layout/app-workspace-controller.js +155 -23
  82. package/dist/browser/layout/app-workspace-controller.js.map +1 -1
  83. package/dist/browser/layout/app-workspace-state.js +5 -1
  84. package/dist/browser/layout/app-workspace-state.js.map +1 -1
  85. package/dist/browser/layout/detail-panel-messages.js +35 -0
  86. package/dist/browser/layout/detail-panel-messages.js.map +1 -0
  87. package/dist/browser/layout/index.js +1 -1
  88. package/dist/browser/layout/index.js.map +1 -1
  89. package/dist/browser/surfaces/Avatar.js +50 -20
  90. package/dist/browser/surfaces/Avatar.js.map +1 -1
  91. package/dist/browser/surfaces/AvatarStack.js +406 -0
  92. package/dist/browser/surfaces/AvatarStack.js.map +1 -0
  93. package/dist/browser/surfaces/avatar-messages.js +8 -2
  94. package/dist/browser/surfaces/avatar-messages.js.map +1 -1
  95. package/dist/browser/surfaces/index.js +1 -0
  96. package/dist/browser/surfaces/index.js.map +1 -1
  97. package/dist/ssr/actions/ContextMenu.js +21 -3
  98. package/dist/ssr/actions/ContextMenu.js.map +1 -1
  99. package/dist/ssr/actions/Dropdown.js +140 -72
  100. package/dist/ssr/actions/Dropdown.js.map +1 -1
  101. package/dist/ssr/actions/GestureMenu.js +52 -106
  102. package/dist/ssr/actions/GestureMenu.js.map +1 -1
  103. package/dist/ssr/actions/Toolbar.js +294 -14
  104. package/dist/ssr/actions/Toolbar.js.map +1 -1
  105. package/dist/ssr/actions/index.js.map +1 -1
  106. package/dist/ssr/actions/menu-rows.js +15 -0
  107. package/dist/ssr/actions/menu-rows.js.map +1 -0
  108. package/dist/ssr/actions/menu-sheet.js +138 -0
  109. package/dist/ssr/actions/menu-sheet.js.map +1 -0
  110. package/dist/ssr/actions/toolbar-messages.js +20 -0
  111. package/dist/ssr/actions/toolbar-messages.js.map +1 -0
  112. package/dist/ssr/chart-inspection.js +3 -0
  113. package/dist/ssr/chart-inspection.js.map +1 -0
  114. package/dist/ssr/chat/ChatComposer.js +604 -113
  115. package/dist/ssr/chat/ChatComposer.js.map +1 -1
  116. package/dist/ssr/chat/chat-behavior.js +4 -0
  117. package/dist/ssr/chat/chat-behavior.js.map +1 -1
  118. package/dist/ssr/chat/chat-messages.js +33 -1
  119. package/dist/ssr/chat/chat-messages.js.map +1 -1
  120. package/dist/ssr/chat/command-search.js +173 -0
  121. package/dist/ssr/chat/command-search.js.map +1 -0
  122. package/dist/ssr/chat/composer-document.js +1 -1
  123. package/dist/ssr/chat/composer-document.js.map +1 -1
  124. package/dist/ssr/chat/index.js +2 -0
  125. package/dist/ssr/chat/index.js.map +1 -1
  126. package/dist/ssr/chat/reaction-people.js +15 -0
  127. package/dist/ssr/chat/reaction-people.js.map +1 -0
  128. package/dist/ssr/content/CalendarDayView.js +28 -3
  129. package/dist/ssr/content/CalendarDayView.js.map +1 -1
  130. package/dist/ssr/content/Chart.js +6 -15
  131. package/dist/ssr/content/Chart.js.map +1 -1
  132. package/dist/ssr/content/ChartSnapshotView.js +7 -10
  133. package/dist/ssr/content/ChartSnapshotView.js.map +1 -1
  134. package/dist/ssr/content/MessageRow.js +98 -152
  135. package/dist/ssr/content/MessageRow.js.map +1 -1
  136. package/dist/ssr/content/ReactionBar.js +304 -0
  137. package/dist/ssr/content/ReactionBar.js.map +1 -0
  138. package/dist/ssr/content/chart-inspection-core.js +557 -0
  139. package/dist/ssr/content/chart-inspection-core.js.map +1 -0
  140. package/dist/ssr/content/chart-inspection.js +10 -445
  141. package/dist/ssr/content/chart-inspection.js.map +1 -1
  142. package/dist/ssr/content/chart-line-gaps.js +1 -1
  143. package/dist/ssr/content/chart-line-gaps.js.map +1 -1
  144. package/dist/ssr/content/chart-snapshot.js +1 -1
  145. package/dist/ssr/content/chart-snapshot.js.map +1 -1
  146. package/dist/ssr/content/index.js +1 -0
  147. package/dist/ssr/content/index.js.map +1 -1
  148. package/dist/ssr/feedback/dialog-core.js +135 -23
  149. package/dist/ssr/feedback/dialog-core.js.map +1 -1
  150. package/dist/ssr/index.js +1 -0
  151. package/dist/ssr/index.js.map +1 -1
  152. package/dist/ssr/input-mode.js +40 -0
  153. package/dist/ssr/input-mode.js.map +1 -0
  154. package/dist/ssr/inputs/Combobox.js +4 -2
  155. package/dist/ssr/inputs/Combobox.js.map +1 -1
  156. package/dist/ssr/inputs/FileDropTarget.js +17 -5
  157. package/dist/ssr/inputs/FileDropTarget.js.map +1 -1
  158. package/dist/ssr/inputs/FileInputs.js +2 -2
  159. package/dist/ssr/inputs/FileInputs.js.map +1 -1
  160. package/dist/ssr/inputs/SelectChip.js +44 -11
  161. package/dist/ssr/inputs/SelectChip.js.map +1 -1
  162. package/dist/ssr/inputs/emoji/EmojiPicker.js +12 -0
  163. package/dist/ssr/inputs/emoji/EmojiPicker.js.map +1 -1
  164. package/dist/ssr/inputs/file-drop.js.map +1 -1
  165. package/dist/ssr/layout/AppWorkspace.js +242 -105
  166. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  167. package/dist/ssr/layout/BottomSheet.js +8 -0
  168. package/dist/ssr/layout/BottomSheet.js.map +1 -1
  169. package/dist/ssr/layout/DetailPanel.js +112 -58
  170. package/dist/ssr/layout/DetailPanel.js.map +1 -1
  171. package/dist/ssr/layout/Discussion.js +63 -36
  172. package/dist/ssr/layout/Discussion.js.map +1 -1
  173. package/dist/ssr/layout/TableOfContents.js +10 -2
  174. package/dist/ssr/layout/TableOfContents.js.map +1 -1
  175. package/dist/ssr/layout/app-workspace-controller.js +155 -23
  176. package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
  177. package/dist/ssr/layout/app-workspace-state.js +5 -1
  178. package/dist/ssr/layout/app-workspace-state.js.map +1 -1
  179. package/dist/ssr/layout/detail-panel-messages.js +35 -0
  180. package/dist/ssr/layout/detail-panel-messages.js.map +1 -0
  181. package/dist/ssr/layout/index.js +1 -1
  182. package/dist/ssr/layout/index.js.map +1 -1
  183. package/dist/ssr/surfaces/Avatar.js +20 -2
  184. package/dist/ssr/surfaces/Avatar.js.map +1 -1
  185. package/dist/ssr/surfaces/AvatarStack.js +286 -0
  186. package/dist/ssr/surfaces/AvatarStack.js.map +1 -0
  187. package/dist/ssr/surfaces/avatar-messages.js +8 -2
  188. package/dist/ssr/surfaces/avatar-messages.js.map +1 -1
  189. package/dist/ssr/surfaces/index.js +1 -0
  190. package/dist/ssr/surfaces/index.js.map +1 -1
  191. package/dist/styles.css +1 -1
  192. package/dist/types/actions/ContextMenu.d.ts +8 -0
  193. package/dist/types/actions/Dropdown.d.ts +12 -5
  194. package/dist/types/actions/GestureMenu.d.ts +6 -4
  195. package/dist/types/actions/Toolbar.d.ts +20 -0
  196. package/dist/types/actions/index.d.ts +1 -1
  197. package/dist/types/actions/menu-rows.d.ts +5 -0
  198. package/dist/types/actions/menu-sheet.d.ts +22 -0
  199. package/dist/types/actions/toolbar-messages.d.ts +8 -0
  200. package/dist/types/chart-inspection.d.ts +2 -0
  201. package/dist/types/chat/ChatComposer.d.ts +51 -2
  202. package/dist/types/chat/chat-behavior.d.ts +4 -0
  203. package/dist/types/chat/chat-messages.d.ts +17 -2
  204. package/dist/types/chat/command-search.d.ts +41 -0
  205. package/dist/types/chat/index.d.ts +3 -1
  206. package/dist/types/chat/reaction-people.d.ts +9 -0
  207. package/dist/types/content/Chart.d.ts +2 -2
  208. package/dist/types/content/MessageRow.d.ts +3 -10
  209. package/dist/types/content/ReactionBar.d.ts +32 -0
  210. package/dist/types/content/chart-inspection-core.d.ts +61 -0
  211. package/dist/types/content/chart-inspection.d.ts +4 -20
  212. package/dist/types/content/chart-snapshot.d.ts +1 -1
  213. package/dist/types/content/index.d.ts +2 -1
  214. package/dist/types/feedback/dialog-core.d.ts +16 -1
  215. package/dist/types/index.d.ts +1 -0
  216. package/dist/types/input-mode.d.ts +7 -0
  217. package/dist/types/inputs/FileDropTarget.d.ts +6 -3
  218. package/dist/types/inputs/SelectChip.d.ts +6 -0
  219. package/dist/types/inputs/file-drop.d.ts +2 -0
  220. package/dist/types/layout/AppWorkspace.d.ts +13 -1
  221. package/dist/types/layout/BottomSheet.d.ts +8 -0
  222. package/dist/types/layout/DetailPanel.d.ts +11 -0
  223. package/dist/types/layout/Discussion.d.ts +8 -0
  224. package/dist/types/layout/TableOfContents.d.ts +2 -0
  225. package/dist/types/layout/detail-panel-messages.d.ts +15 -0
  226. package/dist/types/layout/index.d.ts +1 -1
  227. package/dist/types/surfaces/Avatar.d.ts +12 -0
  228. package/dist/types/surfaces/AvatarStack.d.ts +41 -0
  229. package/dist/types/surfaces/avatar-messages.d.ts +3 -0
  230. package/dist/types/surfaces/index.d.ts +3 -1
  231. package/package.json +9 -4
@@ -18,6 +18,10 @@ export const APP_WORKSPACE_MAIN_MIN_HEIGHT = 240;
18
18
  export const APP_WORKSPACE_PANE_DEFAULT = 320;
19
19
  export const APP_WORKSPACE_PANE_MIN = 240;
20
20
  export const APP_WORKSPACE_PANE_MAX = 640;
21
+
22
+ /** Persistence envelope; each pane still applies its own runtime limits. */
23
+ const APP_WORKSPACE_PANE_STATE_MIN = 160;
24
+ const APP_WORKSPACE_PANE_STATE_MAX = 960;
21
25
  export const appWorkspaceResizeLimits = options => {
22
26
  const min = options.min ?? (options.kind === "sidebar" ? options.sidebarCollapsible ? APP_WORKSPACE_SIDEBAR_COLLAPSED : APP_WORKSPACE_SIDEBAR_MIN : options.kind === "detail" ? APP_WORKSPACE_DETAIL_MIN : options.kind === "pane" ? APP_WORKSPACE_PANE_MIN : APP_WORKSPACE_DRAWER_MIN);
23
27
  const configuredMax = options.max ?? (options.kind === "sidebar" ? APP_WORKSPACE_SIDEBAR_MAX : options.kind === "detail" ? APP_WORKSPACE_DETAIL_MAX : options.kind === "pane" ? APP_WORKSPACE_PANE_MAX : APP_WORKSPACE_DRAWER_MAX);
@@ -89,7 +93,7 @@ export const normalizeAppWorkspaceLayoutState = value => {
89
93
  // Keyed panel maps only exist from version 2 on; a version-1 payload that
90
94
  // carries them was not written by this component and is not trusted.
91
95
  const legacy = candidate.version === 1;
92
- const paneWidths = legacy ? undefined : normalizeSizes(candidate.paneWidths, APP_WORKSPACE_PANE_MIN, APP_WORKSPACE_PANE_MAX);
96
+ const paneWidths = legacy ? undefined : normalizeSizes(candidate.paneWidths, APP_WORKSPACE_PANE_STATE_MIN, APP_WORKSPACE_PANE_STATE_MAX);
93
97
  const detailWidths = legacy ? (() => {
94
98
  const width = finiteSize(candidate.detailWidth, APP_WORKSPACE_DETAIL_MIN, APP_WORKSPACE_DETAIL_MAX);
95
99
  return width === undefined ? undefined : {
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["layout/app-workspace-state.ts"],"sourcesContent":["export type AppWorkspaceLayoutState = {\n version: 2;\n sidebarWidth?: number;\n sidebarCollapsed?: boolean;\n paneWidths?: Record<string, number>;\n detailWidths?: Record<string, number>;\n drawerHeights?: Record<string, number>;\n};\n\nexport const APP_WORKSPACE_SIDEBAR_DEFAULT = 208;\nexport const APP_WORKSPACE_SIDEBAR_COLLAPSED = 64;\nexport const APP_WORKSPACE_SIDEBAR_COLLAPSE_THRESHOLD = 128;\nexport const APP_WORKSPACE_SIDEBAR_MIN = 176;\nexport const APP_WORKSPACE_SIDEBAR_MAX = 360;\n/** Absolute persistence envelope for sidebars with an app-defined wider max. */\nconst APP_WORKSPACE_SIDEBAR_STATE_MAX = 960;\n/** The floating detail panel starts at 26 rem and keeps between 20 and 40 rem. */\nexport const APP_WORKSPACE_DETAIL_DEFAULT = 416;\nexport const APP_WORKSPACE_DETAIL_MIN = 320;\nexport const APP_WORKSPACE_DETAIL_MAX = 640;\nexport const APP_WORKSPACE_DRAWER_DEFAULT = 240;\nexport const APP_WORKSPACE_DRAWER_MIN = 160;\nexport const APP_WORKSPACE_DRAWER_MAX = 560;\n/** Space `appWorkspaceResizeLimits` always reserves for the main region. */\nexport const APP_WORKSPACE_MAIN_MIN = 320;\nexport const APP_WORKSPACE_MAIN_MIN_HEIGHT = 240;\nexport const APP_WORKSPACE_PANE_DEFAULT = 320;\nexport const APP_WORKSPACE_PANE_MIN = 240;\nexport const APP_WORKSPACE_PANE_MAX = 640;\n\nexport type AppWorkspaceResizeKind = \"sidebar\" | \"pane\" | \"detail\" | \"drawer\";\n\nexport const appWorkspaceResizeLimits = (options: {\n kind: AppWorkspaceResizeKind;\n workspaceSize: number;\n reservedSize: number;\n min?: number;\n max?: number;\n sidebarCollapsible?: boolean;\n}): { min: number; max: number } => {\n const min =\n options.min ??\n (options.kind === \"sidebar\"\n ? options.sidebarCollapsible\n ? APP_WORKSPACE_SIDEBAR_COLLAPSED\n : APP_WORKSPACE_SIDEBAR_MIN\n : options.kind === \"detail\"\n ? APP_WORKSPACE_DETAIL_MIN\n : options.kind === \"pane\"\n ? APP_WORKSPACE_PANE_MIN\n : APP_WORKSPACE_DRAWER_MIN);\n const configuredMax =\n options.max ??\n (options.kind === \"sidebar\"\n ? APP_WORKSPACE_SIDEBAR_MAX\n : options.kind === \"detail\"\n ? APP_WORKSPACE_DETAIL_MAX\n : options.kind === \"pane\"\n ? APP_WORKSPACE_PANE_MAX\n : APP_WORKSPACE_DRAWER_MAX);\n const mainMinimum = options.kind === \"drawer\" ? APP_WORKSPACE_MAIN_MIN_HEIGHT : APP_WORKSPACE_MAIN_MIN;\n return { min, max: Math.max(min, Math.min(configuredMax, options.workspaceSize - options.reservedSize - mainMinimum)) };\n};\n\n/**\n * Fits preferred auxiliary pane widths into a shared budget without giving\n * DOM order priority. Minimums are reserved first; remaining space is shared\n * in proportion to how much each pane still needs to reach its preference.\n */\nexport const fitAppWorkspacePaneSizes = (panes: ReadonlyArray<{ desired: number; min: number }>, availableSize: number): number[] => {\n const sizes = panes.map((pane) => pane.min);\n const minimumTotal = sizes.reduce((total, size) => total + size, 0);\n const desiredTotal = panes.reduce((total, pane) => total + pane.desired, 0);\n const budget = Math.max(0, Math.floor(availableSize));\n if (desiredTotal <= budget) return panes.map((pane) => pane.desired);\n if (budget <= minimumTotal) return sizes;\n\n const extraBudget = budget - minimumTotal;\n const desiredExtra = desiredTotal - minimumTotal;\n const fractions = panes.map((pane, index) => {\n const raw = ((pane.desired - pane.min) * extraBudget) / desiredExtra;\n const extra = Math.floor(raw);\n sizes[index]! += extra;\n return { fraction: raw - extra, index };\n });\n let remainder = extraBudget - sizes.reduce((total, size, index) => total + size - panes[index]!.min, 0);\n fractions.sort((a, b) => b.fraction - a.fraction || a.index - b.index);\n for (const { index } of fractions) {\n if (remainder-- <= 0) break;\n sizes[index]! += 1;\n }\n return sizes;\n};\n\nexport const shouldCollapseAppWorkspaceSidebar = (width: number, collapsible: boolean): boolean =>\n collapsible && width < APP_WORKSPACE_SIDEBAR_COLLAPSE_THRESHOLD;\n\nexport const resolveAppWorkspaceSidebarWidth = (\n width: number,\n maxWidth: number,\n collapsible: boolean,\n): { width: number; collapsed: boolean } =>\n shouldCollapseAppWorkspaceSidebar(width, collapsible)\n ? { width: APP_WORKSPACE_SIDEBAR_COLLAPSED, collapsed: true }\n : { width: Math.round(Math.min(maxWidth, Math.max(APP_WORKSPACE_SIDEBAR_MIN, width))), collapsed: false };\n\nconst finiteSize = (value: unknown, min: number, max: number) =>\n typeof value === \"number\" && Number.isFinite(value) ? Math.round(Math.min(max, Math.max(min, value))) : undefined;\n\nexport const safeAppWorkspacePanelId = (panelId: string): string => (isStableUiId(panelId) ? panelId : \"\");\n\nconst normalizeSizes = (value: unknown, min: number, max: number) => {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n const entries = Object.entries(value)\n .slice(0, 16)\n .flatMap(([key, size]) => {\n const normalized = finiteSize(size, min, max);\n return isStableUiId(key) && normalized !== undefined ? [[key, normalized] as const] : [];\n });\n return entries.length ? Object.fromEntries(entries) : undefined;\n};\n\nexport const appWorkspacePanelVariable = (kind: \"pane\" | \"detail\" | \"drawer\", panelId: string): string =>\n `--k2b-workspace-${kind}-${assertStableUiId(panelId, \"AppWorkspace panel id\")}-${kind === \"drawer\" ? \"height\" : \"width\"}`;\n\nexport const normalizeAppWorkspaceLayoutState = (value: unknown): AppWorkspaceLayoutState | null => {\n if (!value || typeof value !== \"object\") return null;\n const candidate = value as Record<string, unknown>;\n if (candidate.version !== 1 && candidate.version !== 2) return null;\n const sidebarWidth = finiteSize(candidate.sidebarWidth, APP_WORKSPACE_SIDEBAR_MIN, APP_WORKSPACE_SIDEBAR_STATE_MAX);\n const sidebarCollapsed = typeof candidate.sidebarCollapsed === \"boolean\" ? candidate.sidebarCollapsed : undefined;\n // Keyed panel maps only exist from version 2 on; a version-1 payload that\n // carries them was not written by this component and is not trusted.\n const legacy = candidate.version === 1;\n const paneWidths = legacy ? undefined : normalizeSizes(candidate.paneWidths, APP_WORKSPACE_PANE_MIN, APP_WORKSPACE_PANE_MAX);\n const detailWidths = legacy\n ? (() => {\n const width = finiteSize(candidate.detailWidth, APP_WORKSPACE_DETAIL_MIN, APP_WORKSPACE_DETAIL_MAX);\n return width === undefined ? undefined : { primary: width };\n })()\n : normalizeSizes(candidate.detailWidths, APP_WORKSPACE_DETAIL_MIN, APP_WORKSPACE_DETAIL_MAX);\n const drawerHeights = legacy ? undefined : normalizeSizes(candidate.drawerHeights, APP_WORKSPACE_DRAWER_MIN, APP_WORKSPACE_DRAWER_MAX);\n return sidebarWidth === undefined && sidebarCollapsed === undefined && !paneWidths && !detailWidths && !drawerHeights\n ? null\n : { version: 2, sidebarWidth, sidebarCollapsed, paneWidths, detailWidths, drawerHeights };\n};\n\nexport const parseAppWorkspaceLayoutState = (value: string | null | undefined): AppWorkspaceLayoutState | null => {\n if (!value) return null;\n try {\n return normalizeAppWorkspaceLayoutState(JSON.parse(decodeURIComponent(value)));\n } catch {\n return null;\n }\n};\n\nexport const serializeAppWorkspaceLayoutState = (state: AppWorkspaceLayoutState): string =>\n encodeURIComponent(JSON.stringify(normalizeAppWorkspaceLayoutState(state) ?? { version: 2 }));\n\nexport const appWorkspaceLayoutStyle = (state: AppWorkspaceLayoutState | null | undefined): string | undefined => {\n if (!state) return undefined;\n const declarations = [\n state.sidebarCollapsed\n ? `--k2b-workspace-sidebar-width:${APP_WORKSPACE_SIDEBAR_COLLAPSED}px`\n : state.sidebarWidth === undefined\n ? null\n : `--k2b-workspace-sidebar-width:${state.sidebarWidth}px`,\n ...Object.entries(state.paneWidths ?? {}).map(([id, width]) => `${appWorkspacePanelVariable(\"pane\", id)}:${width}px`),\n ...Object.entries(state.detailWidths ?? {}).map(([id, width]) => `${appWorkspacePanelVariable(\"detail\", id)}:${width}px`),\n ...Object.entries(state.drawerHeights ?? {}).map(([id, height]) => `${appWorkspacePanelVariable(\"drawer\", id)}:${height}px`),\n ].filter(Boolean);\n return declarations.length ? declarations.join(\";\") : undefined;\n};\n\nimport { assertStableUiId, isStableUiId } from \"./stable-id\";\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["layout/app-workspace-state.ts"],"sourcesContent":["export type AppWorkspaceLayoutState = {\n version: 2;\n sidebarWidth?: number;\n sidebarCollapsed?: boolean;\n paneWidths?: Record<string, number>;\n detailWidths?: Record<string, number>;\n drawerHeights?: Record<string, number>;\n};\n\nexport const APP_WORKSPACE_SIDEBAR_DEFAULT = 208;\nexport const APP_WORKSPACE_SIDEBAR_COLLAPSED = 64;\nexport const APP_WORKSPACE_SIDEBAR_COLLAPSE_THRESHOLD = 128;\nexport const APP_WORKSPACE_SIDEBAR_MIN = 176;\nexport const APP_WORKSPACE_SIDEBAR_MAX = 360;\n/** Absolute persistence envelope for sidebars with an app-defined wider max. */\nconst APP_WORKSPACE_SIDEBAR_STATE_MAX = 960;\n/** The floating detail panel starts at 26 rem and keeps between 20 and 40 rem. */\nexport const APP_WORKSPACE_DETAIL_DEFAULT = 416;\nexport const APP_WORKSPACE_DETAIL_MIN = 320;\nexport const APP_WORKSPACE_DETAIL_MAX = 640;\nexport const APP_WORKSPACE_DRAWER_DEFAULT = 240;\nexport const APP_WORKSPACE_DRAWER_MIN = 160;\nexport const APP_WORKSPACE_DRAWER_MAX = 560;\n/** Space `appWorkspaceResizeLimits` always reserves for the main region. */\nexport const APP_WORKSPACE_MAIN_MIN = 320;\nexport const APP_WORKSPACE_MAIN_MIN_HEIGHT = 240;\nexport const APP_WORKSPACE_PANE_DEFAULT = 320;\nexport const APP_WORKSPACE_PANE_MIN = 240;\nexport const APP_WORKSPACE_PANE_MAX = 640;\n\n/** Persistence envelope; each pane still applies its own runtime limits. */\nconst APP_WORKSPACE_PANE_STATE_MIN = 160;\nconst APP_WORKSPACE_PANE_STATE_MAX = 960;\n\nexport type AppWorkspaceResizeKind = \"sidebar\" | \"pane\" | \"detail\" | \"drawer\";\n\nexport const appWorkspaceResizeLimits = (options: {\n kind: AppWorkspaceResizeKind;\n workspaceSize: number;\n reservedSize: number;\n min?: number;\n max?: number;\n sidebarCollapsible?: boolean;\n}): { min: number; max: number } => {\n const min =\n options.min ??\n (options.kind === \"sidebar\"\n ? options.sidebarCollapsible\n ? APP_WORKSPACE_SIDEBAR_COLLAPSED\n : APP_WORKSPACE_SIDEBAR_MIN\n : options.kind === \"detail\"\n ? APP_WORKSPACE_DETAIL_MIN\n : options.kind === \"pane\"\n ? APP_WORKSPACE_PANE_MIN\n : APP_WORKSPACE_DRAWER_MIN);\n const configuredMax =\n options.max ??\n (options.kind === \"sidebar\"\n ? APP_WORKSPACE_SIDEBAR_MAX\n : options.kind === \"detail\"\n ? APP_WORKSPACE_DETAIL_MAX\n : options.kind === \"pane\"\n ? APP_WORKSPACE_PANE_MAX\n : APP_WORKSPACE_DRAWER_MAX);\n const mainMinimum = options.kind === \"drawer\" ? APP_WORKSPACE_MAIN_MIN_HEIGHT : APP_WORKSPACE_MAIN_MIN;\n return { min, max: Math.max(min, Math.min(configuredMax, options.workspaceSize - options.reservedSize - mainMinimum)) };\n};\n\n/**\n * Fits preferred auxiliary pane widths into a shared budget without giving\n * DOM order priority. Minimums are reserved first; remaining space is shared\n * in proportion to how much each pane still needs to reach its preference.\n */\nexport const fitAppWorkspacePaneSizes = (panes: ReadonlyArray<{ desired: number; min: number }>, availableSize: number): number[] => {\n const sizes = panes.map((pane) => pane.min);\n const minimumTotal = sizes.reduce((total, size) => total + size, 0);\n const desiredTotal = panes.reduce((total, pane) => total + pane.desired, 0);\n const budget = Math.max(0, Math.floor(availableSize));\n if (desiredTotal <= budget) return panes.map((pane) => pane.desired);\n if (budget <= minimumTotal) return sizes;\n\n const extraBudget = budget - minimumTotal;\n const desiredExtra = desiredTotal - minimumTotal;\n const fractions = panes.map((pane, index) => {\n const raw = ((pane.desired - pane.min) * extraBudget) / desiredExtra;\n const extra = Math.floor(raw);\n sizes[index]! += extra;\n return { fraction: raw - extra, index };\n });\n let remainder = extraBudget - sizes.reduce((total, size, index) => total + size - panes[index]!.min, 0);\n fractions.sort((a, b) => b.fraction - a.fraction || a.index - b.index);\n for (const { index } of fractions) {\n if (remainder-- <= 0) break;\n sizes[index]! += 1;\n }\n return sizes;\n};\n\nexport const shouldCollapseAppWorkspaceSidebar = (width: number, collapsible: boolean): boolean =>\n collapsible && width < APP_WORKSPACE_SIDEBAR_COLLAPSE_THRESHOLD;\n\nexport const resolveAppWorkspaceSidebarWidth = (\n width: number,\n maxWidth: number,\n collapsible: boolean,\n): { width: number; collapsed: boolean } =>\n shouldCollapseAppWorkspaceSidebar(width, collapsible)\n ? { width: APP_WORKSPACE_SIDEBAR_COLLAPSED, collapsed: true }\n : { width: Math.round(Math.min(maxWidth, Math.max(APP_WORKSPACE_SIDEBAR_MIN, width))), collapsed: false };\n\nconst finiteSize = (value: unknown, min: number, max: number) =>\n typeof value === \"number\" && Number.isFinite(value) ? Math.round(Math.min(max, Math.max(min, value))) : undefined;\n\nexport const safeAppWorkspacePanelId = (panelId: string): string => (isStableUiId(panelId) ? panelId : \"\");\n\nconst normalizeSizes = (value: unknown, min: number, max: number) => {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n const entries = Object.entries(value)\n .slice(0, 16)\n .flatMap(([key, size]) => {\n const normalized = finiteSize(size, min, max);\n return isStableUiId(key) && normalized !== undefined ? [[key, normalized] as const] : [];\n });\n return entries.length ? Object.fromEntries(entries) : undefined;\n};\n\nexport const appWorkspacePanelVariable = (kind: \"pane\" | \"detail\" | \"drawer\", panelId: string): string =>\n `--k2b-workspace-${kind}-${assertStableUiId(panelId, \"AppWorkspace panel id\")}-${kind === \"drawer\" ? \"height\" : \"width\"}`;\n\nexport const normalizeAppWorkspaceLayoutState = (value: unknown): AppWorkspaceLayoutState | null => {\n if (!value || typeof value !== \"object\") return null;\n const candidate = value as Record<string, unknown>;\n if (candidate.version !== 1 && candidate.version !== 2) return null;\n const sidebarWidth = finiteSize(candidate.sidebarWidth, APP_WORKSPACE_SIDEBAR_MIN, APP_WORKSPACE_SIDEBAR_STATE_MAX);\n const sidebarCollapsed = typeof candidate.sidebarCollapsed === \"boolean\" ? candidate.sidebarCollapsed : undefined;\n // Keyed panel maps only exist from version 2 on; a version-1 payload that\n // carries them was not written by this component and is not trusted.\n const legacy = candidate.version === 1;\n const paneWidths = legacy ? undefined : normalizeSizes(candidate.paneWidths, APP_WORKSPACE_PANE_STATE_MIN, APP_WORKSPACE_PANE_STATE_MAX);\n const detailWidths = legacy\n ? (() => {\n const width = finiteSize(candidate.detailWidth, APP_WORKSPACE_DETAIL_MIN, APP_WORKSPACE_DETAIL_MAX);\n return width === undefined ? undefined : { primary: width };\n })()\n : normalizeSizes(candidate.detailWidths, APP_WORKSPACE_DETAIL_MIN, APP_WORKSPACE_DETAIL_MAX);\n const drawerHeights = legacy ? undefined : normalizeSizes(candidate.drawerHeights, APP_WORKSPACE_DRAWER_MIN, APP_WORKSPACE_DRAWER_MAX);\n return sidebarWidth === undefined && sidebarCollapsed === undefined && !paneWidths && !detailWidths && !drawerHeights\n ? null\n : { version: 2, sidebarWidth, sidebarCollapsed, paneWidths, detailWidths, drawerHeights };\n};\n\nexport const parseAppWorkspaceLayoutState = (value: string | null | undefined): AppWorkspaceLayoutState | null => {\n if (!value) return null;\n try {\n return normalizeAppWorkspaceLayoutState(JSON.parse(decodeURIComponent(value)));\n } catch {\n return null;\n }\n};\n\nexport const serializeAppWorkspaceLayoutState = (state: AppWorkspaceLayoutState): string =>\n encodeURIComponent(JSON.stringify(normalizeAppWorkspaceLayoutState(state) ?? { version: 2 }));\n\nexport const appWorkspaceLayoutStyle = (state: AppWorkspaceLayoutState | null | undefined): string | undefined => {\n if (!state) return undefined;\n const declarations = [\n state.sidebarCollapsed\n ? `--k2b-workspace-sidebar-width:${APP_WORKSPACE_SIDEBAR_COLLAPSED}px`\n : state.sidebarWidth === undefined\n ? null\n : `--k2b-workspace-sidebar-width:${state.sidebarWidth}px`,\n ...Object.entries(state.paneWidths ?? {}).map(([id, width]) => `${appWorkspacePanelVariable(\"pane\", id)}:${width}px`),\n ...Object.entries(state.detailWidths ?? {}).map(([id, width]) => `${appWorkspacePanelVariable(\"detail\", id)}:${width}px`),\n ...Object.entries(state.drawerHeights ?? {}).map(([id, height]) => `${appWorkspacePanelVariable(\"drawer\", id)}:${height}px`),\n ].filter(Boolean);\n return declarations.length ? declarations.join(\";\") : undefined;\n};\n\nimport { assertStableUiId, isStableUiId } from \"./stable-id\";\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,35 @@
1
+ import { i18n } from "@k2b/stdlib";
2
+ import { useLocale } from "../intl/locale";
3
+
4
+ /** Counts and list folding shared by detail panel sections and discussions. */
5
+ const detailPanelMessages = i18n.define({
6
+ baseLocale: "en",
7
+ messages: {
8
+ en: {
9
+ noneYet: "None yet",
10
+ showOlder: ({
11
+ count
12
+ }) => `Show ${count} older`,
13
+ showMore: ({
14
+ count
15
+ }) => `Show ${count} more`,
16
+ showLess: "Show less"
17
+ },
18
+ de: {
19
+ noneYet: "Noch keine",
20
+ showOlder: ({
21
+ count
22
+ }) => `${count} ältere anzeigen`,
23
+ showMore: ({
24
+ count
25
+ }) => `${count} weitere anzeigen`,
26
+ showLess: "Weniger anzeigen"
27
+ }
28
+ }
29
+ });
30
+ export const useDetailPanelMessages = () => {
31
+ const locale = useLocale();
32
+ return () => detailPanelMessages.resolve([locale()]).t;
33
+ };
34
+ export const checkDetailPanelMessages = () => detailPanelMessages.check();
35
+ //# sourceMappingURL=detail-panel-messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["layout/detail-panel-messages.ts"],"sourcesContent":["import { i18n } from \"@k2b/stdlib\";\nimport { useLocale } from \"../intl/locale\";\n\n/** Counts and list folding shared by detail panel sections and discussions. */\nconst detailPanelMessages = i18n.define({\n baseLocale: \"en\",\n messages: {\n en: {\n noneYet: \"None yet\",\n showOlder: ({ count }: { count: number }) => `Show ${count} older`,\n showMore: ({ count }: { count: number }) => `Show ${count} more`,\n showLess: \"Show less\",\n },\n de: {\n noneYet: \"Noch keine\",\n showOlder: ({ count }) => `${count} ältere anzeigen`,\n showMore: ({ count }) => `${count} weitere anzeigen`,\n showLess: \"Weniger anzeigen\",\n },\n },\n});\n\nexport type DetailPanelMessages = ReturnType<(typeof detailPanelMessages)[\"resolve\"]>[\"t\"];\n\nexport const useDetailPanelMessages = (): (() => DetailPanelMessages) => {\n const locale = useLocale();\n return () => detailPanelMessages.resolve([locale()]).t;\n};\n\nexport const checkDetailPanelMessages = () => detailPanelMessages.check();\n"],"mappings":"AAAA,SAAS,IAAI,QAAQ,aAAa;AAClC,SAAS,SAAS,QAAQ,gBAAgB;;AAE1C;AACA,MAAM,mBAAmB,GAAG,IAAI,CAAC,MAAM,CAAC;EACtC,UAAU,EAAE,IAAI;EAChB,QAAQ,EAAE;IACR,EAAE,EAAE;MACF,OAAO,EAAE,UAAU;MACnB,SAAS,EAAE,CAAC;QAAE;MAAyB,CAAC,KAAK,QAAQ,KAAK,QAAQ;MAClE,QAAQ,EAAE,CAAC;QAAE;MAAyB,CAAC,KAAK,QAAQ,KAAK,OAAO;MAChE,QAAQ,EAAE;IACZ,CAAC;IACD,EAAE,EAAE;MACF,OAAO,EAAE,YAAY;MACrB,SAAS,EAAE,CAAC;QAAE;MAAM,CAAC,KAAK,GAAG,KAAK,kBAAkB;MACpD,QAAQ,EAAE,CAAC;QAAE;MAAM,CAAC,KAAK,GAAG,KAAK,mBAAmB;MACpD,QAAQ,EAAE;IACZ;EACF;AACF,CAAC,CAAC;AAIF,OAAO,MAAM,sBAAsB,GAAG,MAAmC;EACvE,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC;EAC1B,OAAO,MAAM,mBAAmB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACxD,CAAC;AAED,OAAO,MAAM,wBAAwB,GAAG,MAAM,mBAAmB,CAAC,KAAK,CAAC,CAAC","ignoreList":[]}
@@ -2,7 +2,7 @@ export { default as AppOverview } from "./AppOverview";
2
2
  export { default as AppWorkspace } from "./AppWorkspace";
3
3
  export { installAppWorkspaceController } from "./app-workspace-controller";
4
4
  export { APP_WORKSPACE_DETAIL_DEFAULT, APP_WORKSPACE_DETAIL_MAX, APP_WORKSPACE_DETAIL_MIN, APP_WORKSPACE_DRAWER_DEFAULT, APP_WORKSPACE_DRAWER_MAX, APP_WORKSPACE_DRAWER_MIN, APP_WORKSPACE_MAIN_MIN, APP_WORKSPACE_MAIN_MIN_HEIGHT, APP_WORKSPACE_PANE_DEFAULT, APP_WORKSPACE_PANE_MAX, APP_WORKSPACE_PANE_MIN, APP_WORKSPACE_SIDEBAR_COLLAPSE_THRESHOLD, APP_WORKSPACE_SIDEBAR_COLLAPSED, APP_WORKSPACE_SIDEBAR_DEFAULT, APP_WORKSPACE_SIDEBAR_MAX, APP_WORKSPACE_SIDEBAR_MIN, appWorkspaceLayoutStyle, appWorkspacePanelVariable, appWorkspaceResizeLimits, normalizeAppWorkspaceLayoutState, parseAppWorkspaceLayoutState, resolveAppWorkspaceSidebarWidth, safeAppWorkspacePanelId, serializeAppWorkspaceLayoutState, shouldCollapseAppWorkspaceSidebar } from "./app-workspace-state";
5
- export { bottomSheetOptions, default as BottomSheet } from "./BottomSheet";
5
+ export { bottomSheetAdaptiveOptions, bottomSheetOptions, default as BottomSheet } from "./BottomSheet";
6
6
  export { DataPanel } from "./DataPanel";
7
7
  export { default as DetailPanel } from "./DetailPanel";
8
8
  export { default as Discussion } from "./Discussion";
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["layout/index.ts"],"sourcesContent":["export type {\n AppOverviewCardsProps,\n AppOverviewEmptyStateProps,\n AppOverviewPanelProps,\n AppOverviewProps,\n} from \"./AppOverview\";\nexport { default as AppOverview } from \"./AppOverview\";\nexport type {\n AppWorkspaceBottomDrawerHeight,\n AppWorkspaceBottomDrawerProps,\n AppWorkspaceContentProps,\n AppWorkspaceDetailProps,\n AppWorkspaceDetailWidth,\n AppWorkspaceMainPaneProps,\n AppWorkspaceMainProps,\n AppWorkspaceNavTreeItemProps,\n AppWorkspaceNavTreeMove,\n AppWorkspaceNavTreeProps,\n AppWorkspaceProps,\n AppWorkspaceSidebarAccessoryVisibility,\n AppWorkspaceSidebarBodyProps,\n AppWorkspaceSidebarIconActionProps,\n AppWorkspaceSidebarIconActionTone,\n AppWorkspaceSidebarIconGridProps,\n AppWorkspaceSidebarItemActionProps,\n AppWorkspaceSidebarItemActionsProps,\n AppWorkspaceSidebarItemIconProps,\n AppWorkspaceSidebarItemLabelProps,\n AppWorkspaceSidebarItemMetaProps,\n AppWorkspaceSidebarItemProps,\n AppWorkspaceSidebarItemStatusProps,\n AppWorkspaceSidebarItemTone,\n AppWorkspaceSidebarProps,\n AppWorkspaceSidebarSectionProps,\n AppWorkspaceSidebarVisibility,\n} from \"./AppWorkspace\";\nexport { default as AppWorkspace } from \"./AppWorkspace\";\nexport type { AppWorkspaceControllerOptions } from \"./app-workspace-controller\";\nexport { installAppWorkspaceController } from \"./app-workspace-controller\";\nexport type {\n AppWorkspaceLayoutState,\n AppWorkspaceResizeKind,\n} from \"./app-workspace-state\";\nexport {\n APP_WORKSPACE_DETAIL_DEFAULT,\n APP_WORKSPACE_DETAIL_MAX,\n APP_WORKSPACE_DETAIL_MIN,\n APP_WORKSPACE_DRAWER_DEFAULT,\n APP_WORKSPACE_DRAWER_MAX,\n APP_WORKSPACE_DRAWER_MIN,\n APP_WORKSPACE_MAIN_MIN,\n APP_WORKSPACE_MAIN_MIN_HEIGHT,\n APP_WORKSPACE_PANE_DEFAULT,\n APP_WORKSPACE_PANE_MAX,\n APP_WORKSPACE_PANE_MIN,\n APP_WORKSPACE_SIDEBAR_COLLAPSE_THRESHOLD,\n APP_WORKSPACE_SIDEBAR_COLLAPSED,\n APP_WORKSPACE_SIDEBAR_DEFAULT,\n APP_WORKSPACE_SIDEBAR_MAX,\n APP_WORKSPACE_SIDEBAR_MIN,\n appWorkspaceLayoutStyle,\n appWorkspacePanelVariable,\n appWorkspaceResizeLimits,\n normalizeAppWorkspaceLayoutState,\n parseAppWorkspaceLayoutState,\n resolveAppWorkspaceSidebarWidth,\n safeAppWorkspacePanelId,\n serializeAppWorkspaceLayoutState,\n shouldCollapseAppWorkspaceSidebar,\n} from \"./app-workspace-state\";\nexport { type BottomSheetProps, bottomSheetOptions, default as BottomSheet } from \"./BottomSheet\";\nexport type { DataPanelProps } from \"./DataPanel\";\nexport { DataPanel } from \"./DataPanel\";\nexport type {\n DetailPanelActionButtonProps,\n DetailPanelActionLinkProps,\n DetailPanelActionProps,\n DetailPanelActionSecondary,\n DetailPanelBodyProps,\n DetailPanelGroupProps,\n DetailPanelHeaderProps,\n DetailPanelProps,\n DetailPanelSectionProps,\n DetailPanelSummaryProps,\n DetailPanelTone,\n} from \"./DetailPanel\";\nexport { default as DetailPanel } from \"./DetailPanel\";\nexport type { DiscussionComposerProps, DiscussionItemProps, DiscussionListProps, DiscussionProps } from \"./Discussion\";\nexport { default as Discussion } from \"./Discussion\";\nexport type {\n FloatingWindowClose,\n FloatingWindowProps,\n OpenFloatingWindowOptions,\n} from \"./FloatingWindow\";\nexport {\n default as FloatingWindow,\n type FloatingWindowRect,\n fitFloatingWindowRect,\n openFloatingWindow,\n} from \"./FloatingWindow\";\nexport type { MobileShellHeaderProps, MobileShellProps } from \"./MobileShell\";\nexport { default as MobileShell, observeMobileShell } from \"./MobileShell\";\nexport { default as Navigation, type NavigationProps } from \"./Navigation\";\nexport {\n createNavigation,\n findNavigationItem,\n type NavigationController,\n type NavigationItem,\n type NavigationOptions,\n type NavigationStatus,\n} from \"./navigation-model\";\nexport type { PageTitleProps, PageTrailLink, PageTrailState } from \"./PageTitle\";\nexport { followPageTrail, PAGE_TRAIL_EVENT, PageTitle, PageTrailProvider, readPageTrail, setPageTrail, usePageTrail } from \"./PageTitle\";\nexport type {\n PanelDialogBodyProps,\n PanelDialogFooterProps,\n PanelDialogHeaderProps,\n PanelDialogProps,\n PanelDialogSectionProps,\n PanelDialogSurface,\n PanelDialogTabOption,\n PanelDialogTabsProps,\n} from \"./PanelDialog\";\nexport {\n confirmDiscardIfDirty,\n default as PanelDialog,\n panelDialogFixedOptions,\n panelDialogFixedPanelClass,\n panelDialogOptions,\n panelDialogPanelClass,\n panelDialogWideOptions,\n panelDialogWidePanelClass,\n panelDialogWorkspaceOptions,\n panelDialogWorkspacePanelClass,\n} from \"./PanelDialog\";\nexport type { PanelHeaderProps } from \"./PanelHeader\";\nexport { PanelHeader } from \"./PanelHeader\";\nexport type { PanesItem, PanesProps } from \"./Panes\";\nexport { default as Panes } from \"./Panes\";\nexport type { PullToRefreshProps, PullToRefreshState } from \"./PullToRefresh\";\nexport { default as PullToRefresh } from \"./PullToRefresh\";\nexport { installPageTitleController } from \"./page-title-controller\";\nexport type {\n AddPanesItemOptions,\n PanesDirection,\n PanesGroup,\n PanesIntent,\n PanesLayout,\n PanesNode,\n PanesPath,\n PanesPathSegment,\n PanesSide,\n PanesSplit,\n} from \"./panes-layout\";\nexport {\n activatePanesItem,\n addPanesItem,\n applyPanesIntent,\n createPanesLayout,\n isPanesItemVisible,\n PANES_LAYOUT_VERSION,\n parsePanesLayout,\n reconcilePanesLayout,\n removePanesItem,\n resizePanesSplit,\n} from \"./panes-layout\";\nexport type { ScrollAreaProps } from \"./ScrollArea\";\nexport { default as ScrollArea } from \"./ScrollArea\";\nexport type {\n SettingsFieldControlProps,\n SettingsFieldProps,\n SettingsGroupActionProps,\n SettingsGroupProps,\n SettingsPageProps,\n SettingsPanelFooterProps,\n SettingsSaveBarProps,\n SettingsSectionProps,\n} from \"./Settings\";\nexport {\n readSettingsError,\n SettingsField,\n SettingsGroup,\n SettingsPage,\n SettingsPanelFooter,\n SettingsSaveBar,\n SettingsSection,\n sameSettingValue,\n} from \"./Settings\";\nexport type {\n SettingsCollectionActionProps,\n SettingsCollectionItemActionsProps,\n SettingsCollectionItemProps,\n SettingsCollectionItemReorderProps,\n SettingsCollectionItemStatusProps,\n SettingsCollectionProps,\n} from \"./SettingsCollection\";\nexport { default as SettingsCollection } from \"./SettingsCollection\";\nexport type {\n SettingsModalFooterProps,\n SettingsModalGroupProps,\n SettingsModalProps,\n SettingsModalTabProps,\n SettingsModalTabTone,\n} from \"./SettingsModal\";\nexport { default as SettingsModal } from \"./SettingsModal\";\nexport {\n APP_WORKSPACE_SWITCHER_SEARCH_FROM,\n type AppWorkspaceSidebarSwitcherProps,\n type AppWorkspaceSwitcherAction,\n type AppWorkspaceSwitcherOption,\n} from \"./SidebarSwitcher\";\nexport type { TabBarItem, TabBarProps } from \"./TabBar\";\nexport { default as TabBar } from \"./TabBar\";\n\nexport type { TableOfContentsItem, TableOfContentsProps } from \"./TableOfContents\";\nexport { TableOfContents } from \"./TableOfContents\";\n"],"mappings":"AAMA,SAAS,OAAO,IAAI,WAAW,QAAQ,eAAe;AA8BtD,SAAS,OAAO,IAAI,YAAY,QAAQ,gBAAgB;AAExD,SAAS,6BAA6B,QAAQ,4BAA4B;AAK1E,SACE,4BAA4B,EAC5B,wBAAwB,EACxB,wBAAwB,EACxB,4BAA4B,EAC5B,wBAAwB,EACxB,wBAAwB,EACxB,sBAAsB,EACtB,6BAA6B,EAC7B,0BAA0B,EAC1B,sBAAsB,EACtB,sBAAsB,EACtB,wCAAwC,EACxC,+BAA+B,EAC/B,6BAA6B,EAC7B,yBAAyB,EACzB,yBAAyB,EACzB,uBAAuB,EACvB,yBAAyB,EACzB,wBAAwB,EACxB,gCAAgC,EAChC,4BAA4B,EAC5B,+BAA+B,EAC/B,uBAAuB,EACvB,gCAAgC,EAChC,iCAAiC,QAC5B,uBAAuB;AAC9B,SAAgC,kBAAkB,EAAE,OAAO,IAAI,WAAW,QAAQ,eAAe;AAEjG,SAAS,SAAS,QAAQ,aAAa;AAcvC,SAAS,OAAO,IAAI,WAAW,QAAQ,eAAe;AAEtD,SAAS,OAAO,IAAI,UAAU,QAAQ,cAAc;AAMpD,SACE,OAAO,IAAI,cAAc,EAEzB,qBAAqB,EACrB,kBAAkB,QACb,kBAAkB;AAEzB,SAAS,OAAO,IAAI,WAAW,EAAE,kBAAkB,QAAQ,eAAe;AAC1E,SAAS,OAAO,IAAI,UAAU,QAA8B,cAAc;AAC1E,SACE,gBAAgB,EAChB,kBAAkB,QAKb,oBAAoB;AAE3B,SAAS,eAAe,EAAE,gBAAgB,EAAE,SAAS,EAAE,iBAAiB,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,QAAQ,aAAa;AAWxI,SACE,qBAAqB,EACrB,OAAO,IAAI,WAAW,EACtB,uBAAuB,EACvB,0BAA0B,EAC1B,kBAAkB,EAClB,qBAAqB,EACrB,sBAAsB,EACtB,yBAAyB,EACzB,2BAA2B,EAC3B,8BAA8B,QACzB,eAAe;AAEtB,SAAS,WAAW,QAAQ,eAAe;AAE3C,SAAS,OAAO,IAAI,KAAK,QAAQ,SAAS;AAE1C,SAAS,OAAO,IAAI,aAAa,QAAQ,iBAAiB;AAC1D,SAAS,0BAA0B,QAAQ,yBAAyB;AAapE,SACE,iBAAiB,EACjB,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,gBAAgB,EAChB,oBAAoB,EACpB,eAAe,EACf,gBAAgB,QACX,gBAAgB;AAEvB,SAAS,OAAO,IAAI,UAAU,QAAQ,cAAc;AAWpD,SACE,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,YAAY,EACZ,mBAAmB,EACnB,eAAe,EACf,eAAe,EACf,gBAAgB,QACX,YAAY;AASnB,SAAS,OAAO,IAAI,kBAAkB,QAAQ,sBAAsB;AAQpE,SAAS,OAAO,IAAI,aAAa,QAAQ,iBAAiB;AAC1D,SACE,kCAAkC,QAI7B,mBAAmB;AAE1B,SAAS,OAAO,IAAI,MAAM,QAAQ,UAAU;AAG5C,SAAS,eAAe,QAAQ,mBAAmB","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["layout/index.ts"],"sourcesContent":["export type {\n AppOverviewCardsProps,\n AppOverviewEmptyStateProps,\n AppOverviewPanelProps,\n AppOverviewProps,\n} from \"./AppOverview\";\nexport { default as AppOverview } from \"./AppOverview\";\nexport type {\n AppWorkspaceBottomDrawerHeight,\n AppWorkspaceBottomDrawerProps,\n AppWorkspaceContentProps,\n AppWorkspaceDetailProps,\n AppWorkspaceDetailWidth,\n AppWorkspaceMainPaneProps,\n AppWorkspaceMainProps,\n AppWorkspaceNavTreeItemProps,\n AppWorkspaceNavTreeMove,\n AppWorkspaceNavTreeProps,\n AppWorkspaceProps,\n AppWorkspaceSidebarAccessoryVisibility,\n AppWorkspaceSidebarBodyProps,\n AppWorkspaceSidebarIconActionProps,\n AppWorkspaceSidebarIconActionTone,\n AppWorkspaceSidebarIconGridProps,\n AppWorkspaceSidebarItemActionProps,\n AppWorkspaceSidebarItemActionsProps,\n AppWorkspaceSidebarItemIconProps,\n AppWorkspaceSidebarItemLabelProps,\n AppWorkspaceSidebarItemMetaProps,\n AppWorkspaceSidebarItemProps,\n AppWorkspaceSidebarItemStatusProps,\n AppWorkspaceSidebarItemTone,\n AppWorkspaceSidebarProps,\n AppWorkspaceSidebarSectionProps,\n AppWorkspaceSidebarVisibility,\n} from \"./AppWorkspace\";\nexport { default as AppWorkspace } from \"./AppWorkspace\";\nexport type { AppWorkspaceControllerOptions } from \"./app-workspace-controller\";\nexport { installAppWorkspaceController } from \"./app-workspace-controller\";\nexport type {\n AppWorkspaceLayoutState,\n AppWorkspaceResizeKind,\n} from \"./app-workspace-state\";\nexport {\n APP_WORKSPACE_DETAIL_DEFAULT,\n APP_WORKSPACE_DETAIL_MAX,\n APP_WORKSPACE_DETAIL_MIN,\n APP_WORKSPACE_DRAWER_DEFAULT,\n APP_WORKSPACE_DRAWER_MAX,\n APP_WORKSPACE_DRAWER_MIN,\n APP_WORKSPACE_MAIN_MIN,\n APP_WORKSPACE_MAIN_MIN_HEIGHT,\n APP_WORKSPACE_PANE_DEFAULT,\n APP_WORKSPACE_PANE_MAX,\n APP_WORKSPACE_PANE_MIN,\n APP_WORKSPACE_SIDEBAR_COLLAPSE_THRESHOLD,\n APP_WORKSPACE_SIDEBAR_COLLAPSED,\n APP_WORKSPACE_SIDEBAR_DEFAULT,\n APP_WORKSPACE_SIDEBAR_MAX,\n APP_WORKSPACE_SIDEBAR_MIN,\n appWorkspaceLayoutStyle,\n appWorkspacePanelVariable,\n appWorkspaceResizeLimits,\n normalizeAppWorkspaceLayoutState,\n parseAppWorkspaceLayoutState,\n resolveAppWorkspaceSidebarWidth,\n safeAppWorkspacePanelId,\n serializeAppWorkspaceLayoutState,\n shouldCollapseAppWorkspaceSidebar,\n} from \"./app-workspace-state\";\nexport { type BottomSheetProps, bottomSheetAdaptiveOptions, bottomSheetOptions, default as BottomSheet } from \"./BottomSheet\";\nexport type { DataPanelProps } from \"./DataPanel\";\nexport { DataPanel } from \"./DataPanel\";\nexport type {\n DetailPanelActionButtonProps,\n DetailPanelActionLinkProps,\n DetailPanelActionProps,\n DetailPanelActionSecondary,\n DetailPanelBodyProps,\n DetailPanelGroupProps,\n DetailPanelHeaderProps,\n DetailPanelProps,\n DetailPanelSectionProps,\n DetailPanelSummaryProps,\n DetailPanelTone,\n} from \"./DetailPanel\";\nexport { default as DetailPanel } from \"./DetailPanel\";\nexport type { DiscussionComposerProps, DiscussionItemProps, DiscussionListProps, DiscussionProps } from \"./Discussion\";\nexport { default as Discussion } from \"./Discussion\";\nexport type {\n FloatingWindowClose,\n FloatingWindowProps,\n OpenFloatingWindowOptions,\n} from \"./FloatingWindow\";\nexport {\n default as FloatingWindow,\n type FloatingWindowRect,\n fitFloatingWindowRect,\n openFloatingWindow,\n} from \"./FloatingWindow\";\nexport type { MobileShellHeaderProps, MobileShellProps } from \"./MobileShell\";\nexport { default as MobileShell, observeMobileShell } from \"./MobileShell\";\nexport { default as Navigation, type NavigationProps } from \"./Navigation\";\nexport {\n createNavigation,\n findNavigationItem,\n type NavigationController,\n type NavigationItem,\n type NavigationOptions,\n type NavigationStatus,\n} from \"./navigation-model\";\nexport type { PageTitleProps, PageTrailLink, PageTrailState } from \"./PageTitle\";\nexport { followPageTrail, PAGE_TRAIL_EVENT, PageTitle, PageTrailProvider, readPageTrail, setPageTrail, usePageTrail } from \"./PageTitle\";\nexport type {\n PanelDialogBodyProps,\n PanelDialogFooterProps,\n PanelDialogHeaderProps,\n PanelDialogProps,\n PanelDialogSectionProps,\n PanelDialogSurface,\n PanelDialogTabOption,\n PanelDialogTabsProps,\n} from \"./PanelDialog\";\nexport {\n confirmDiscardIfDirty,\n default as PanelDialog,\n panelDialogFixedOptions,\n panelDialogFixedPanelClass,\n panelDialogOptions,\n panelDialogPanelClass,\n panelDialogWideOptions,\n panelDialogWidePanelClass,\n panelDialogWorkspaceOptions,\n panelDialogWorkspacePanelClass,\n} from \"./PanelDialog\";\nexport type { PanelHeaderProps } from \"./PanelHeader\";\nexport { PanelHeader } from \"./PanelHeader\";\nexport type { PanesItem, PanesProps } from \"./Panes\";\nexport { default as Panes } from \"./Panes\";\nexport type { PullToRefreshProps, PullToRefreshState } from \"./PullToRefresh\";\nexport { default as PullToRefresh } from \"./PullToRefresh\";\nexport { installPageTitleController } from \"./page-title-controller\";\nexport type {\n AddPanesItemOptions,\n PanesDirection,\n PanesGroup,\n PanesIntent,\n PanesLayout,\n PanesNode,\n PanesPath,\n PanesPathSegment,\n PanesSide,\n PanesSplit,\n} from \"./panes-layout\";\nexport {\n activatePanesItem,\n addPanesItem,\n applyPanesIntent,\n createPanesLayout,\n isPanesItemVisible,\n PANES_LAYOUT_VERSION,\n parsePanesLayout,\n reconcilePanesLayout,\n removePanesItem,\n resizePanesSplit,\n} from \"./panes-layout\";\nexport type { ScrollAreaProps } from \"./ScrollArea\";\nexport { default as ScrollArea } from \"./ScrollArea\";\nexport type {\n SettingsFieldControlProps,\n SettingsFieldProps,\n SettingsGroupActionProps,\n SettingsGroupProps,\n SettingsPageProps,\n SettingsPanelFooterProps,\n SettingsSaveBarProps,\n SettingsSectionProps,\n} from \"./Settings\";\nexport {\n readSettingsError,\n SettingsField,\n SettingsGroup,\n SettingsPage,\n SettingsPanelFooter,\n SettingsSaveBar,\n SettingsSection,\n sameSettingValue,\n} from \"./Settings\";\nexport type {\n SettingsCollectionActionProps,\n SettingsCollectionItemActionsProps,\n SettingsCollectionItemProps,\n SettingsCollectionItemReorderProps,\n SettingsCollectionItemStatusProps,\n SettingsCollectionProps,\n} from \"./SettingsCollection\";\nexport { default as SettingsCollection } from \"./SettingsCollection\";\nexport type {\n SettingsModalFooterProps,\n SettingsModalGroupProps,\n SettingsModalProps,\n SettingsModalTabProps,\n SettingsModalTabTone,\n} from \"./SettingsModal\";\nexport { default as SettingsModal } from \"./SettingsModal\";\nexport {\n APP_WORKSPACE_SWITCHER_SEARCH_FROM,\n type AppWorkspaceSidebarSwitcherProps,\n type AppWorkspaceSwitcherAction,\n type AppWorkspaceSwitcherOption,\n} from \"./SidebarSwitcher\";\nexport type { TabBarItem, TabBarProps } from \"./TabBar\";\nexport { default as TabBar } from \"./TabBar\";\n\nexport type { TableOfContentsItem, TableOfContentsProps } from \"./TableOfContents\";\nexport { TableOfContents } from \"./TableOfContents\";\n"],"mappings":"AAMA,SAAS,OAAO,IAAI,WAAW,QAAQ,eAAe;AA8BtD,SAAS,OAAO,IAAI,YAAY,QAAQ,gBAAgB;AAExD,SAAS,6BAA6B,QAAQ,4BAA4B;AAK1E,SACE,4BAA4B,EAC5B,wBAAwB,EACxB,wBAAwB,EACxB,4BAA4B,EAC5B,wBAAwB,EACxB,wBAAwB,EACxB,sBAAsB,EACtB,6BAA6B,EAC7B,0BAA0B,EAC1B,sBAAsB,EACtB,sBAAsB,EACtB,wCAAwC,EACxC,+BAA+B,EAC/B,6BAA6B,EAC7B,yBAAyB,EACzB,yBAAyB,EACzB,uBAAuB,EACvB,yBAAyB,EACzB,wBAAwB,EACxB,gCAAgC,EAChC,4BAA4B,EAC5B,+BAA+B,EAC/B,uBAAuB,EACvB,gCAAgC,EAChC,iCAAiC,QAC5B,uBAAuB;AAC9B,SAAgC,0BAA0B,EAAE,kBAAkB,EAAE,OAAO,IAAI,WAAW,QAAQ,eAAe;AAE7H,SAAS,SAAS,QAAQ,aAAa;AAcvC,SAAS,OAAO,IAAI,WAAW,QAAQ,eAAe;AAEtD,SAAS,OAAO,IAAI,UAAU,QAAQ,cAAc;AAMpD,SACE,OAAO,IAAI,cAAc,EAEzB,qBAAqB,EACrB,kBAAkB,QACb,kBAAkB;AAEzB,SAAS,OAAO,IAAI,WAAW,EAAE,kBAAkB,QAAQ,eAAe;AAC1E,SAAS,OAAO,IAAI,UAAU,QAA8B,cAAc;AAC1E,SACE,gBAAgB,EAChB,kBAAkB,QAKb,oBAAoB;AAE3B,SAAS,eAAe,EAAE,gBAAgB,EAAE,SAAS,EAAE,iBAAiB,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,QAAQ,aAAa;AAWxI,SACE,qBAAqB,EACrB,OAAO,IAAI,WAAW,EACtB,uBAAuB,EACvB,0BAA0B,EAC1B,kBAAkB,EAClB,qBAAqB,EACrB,sBAAsB,EACtB,yBAAyB,EACzB,2BAA2B,EAC3B,8BAA8B,QACzB,eAAe;AAEtB,SAAS,WAAW,QAAQ,eAAe;AAE3C,SAAS,OAAO,IAAI,KAAK,QAAQ,SAAS;AAE1C,SAAS,OAAO,IAAI,aAAa,QAAQ,iBAAiB;AAC1D,SAAS,0BAA0B,QAAQ,yBAAyB;AAapE,SACE,iBAAiB,EACjB,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,gBAAgB,EAChB,oBAAoB,EACpB,eAAe,EACf,gBAAgB,QACX,gBAAgB;AAEvB,SAAS,OAAO,IAAI,UAAU,QAAQ,cAAc;AAWpD,SACE,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,YAAY,EACZ,mBAAmB,EACnB,eAAe,EACf,eAAe,EACf,gBAAgB,QACX,YAAY;AASnB,SAAS,OAAO,IAAI,kBAAkB,QAAQ,sBAAsB;AAQpE,SAAS,OAAO,IAAI,aAAa,QAAQ,iBAAiB;AAC1D,SACE,kCAAkC,QAI7B,mBAAmB;AAE1B,SAAS,OAAO,IAAI,MAAM,QAAQ,UAAU;AAG5C,SAAS,eAAe,QAAQ,mBAAmB","ignoreList":[]}
@@ -12,6 +12,14 @@ var _tmpl$ = /*#__PURE__*/_$template(`<i aria-hidden=true>`),
12
12
  _tmpl$3 = /*#__PURE__*/_$template(`<img decoding=async>`, true, false, false);
13
13
  import { createEffect, createSignal, on, Show } from "solid-js";
14
14
  import { useAvatarMessages } from "./avatar-messages";
15
+
16
+ /**
17
+ * A status ring around the avatar: `"success"` for an active state such as someone working on a task, or an explicit
18
+ * color, for example a collaborator's cursor color.
19
+ */
20
+
21
+ /** `square` marks an agent or service account; people stay round. */
22
+
15
23
  const initialsFor = name => {
16
24
  const parts = name.trim().split(/\s+/).filter(Boolean);
17
25
  if (parts.length === 0) return "?";
@@ -44,6 +52,16 @@ export function Avatar(props) {
44
52
  return _el$;
45
53
  })() : fallback();
46
54
  const className = () => `k2b-avatar ${props.class ?? ""}`;
55
+ const ring = () => props.ring === undefined ? undefined : typeof props.ring === "string" ? props.ring : "color";
56
+ const style = () => {
57
+ const color = typeof props.ring === "object" ? props.ring.color : undefined;
58
+ if (color === undefined) return props.style;
59
+ if (typeof props.style === "string") return `${props.style ? `${props.style};` : ""}--k2b-avatar-ring:${color}`;
60
+ return {
61
+ ...props.style,
62
+ "--k2b-avatar-ring": color
63
+ };
64
+ };
47
65
  createEffect(on(() => props.src, () => setFailed(false), {
48
66
  defer: true
49
67
  }));
@@ -58,23 +76,29 @@ export function Avatar(props) {
58
76
  _$effect(_p$ => {
59
77
  var _v$ = className(),
60
78
  _v$2 = props.size ?? "md",
61
- _v$3 = tintFor(props.name.trim()),
62
- _v$4 = props.style,
63
- _v$5 = props.alt ?? avatarMessages().avatarLabel({
79
+ _v$3 = props.shape === "square" ? "square" : undefined,
80
+ _v$4 = tintFor(props.name.trim()),
81
+ _v$5 = ring(),
82
+ _v$6 = style(),
83
+ _v$7 = props.alt ?? avatarMessages().avatarLabel({
64
84
  name: label()
65
85
  });
66
86
  _v$ !== _p$.e && _$className(_el$2, _p$.e = _v$);
67
87
  _v$2 !== _p$.t && _$setAttribute(_el$2, "data-size", _p$.t = _v$2);
68
- _v$3 !== _p$.a && _$setAttribute(_el$2, "data-tint", _p$.a = _v$3);
69
- _p$.o = _$style(_el$2, _v$4, _p$.o);
70
- _v$5 !== _p$.i && _$setAttribute(_el$2, "aria-label", _p$.i = _v$5);
88
+ _v$3 !== _p$.a && _$setAttribute(_el$2, "data-shape", _p$.a = _v$3);
89
+ _v$4 !== _p$.o && _$setAttribute(_el$2, "data-tint", _p$.o = _v$4);
90
+ _v$5 !== _p$.i && _$setAttribute(_el$2, "data-ring", _p$.i = _v$5);
91
+ _p$.n = _$style(_el$2, _v$6, _p$.n);
92
+ _v$7 !== _p$.s && _$setAttribute(_el$2, "aria-label", _p$.s = _v$7);
71
93
  return _p$;
72
94
  }, {
73
95
  e: undefined,
74
96
  t: undefined,
75
97
  a: undefined,
76
98
  o: undefined,
77
- i: undefined
99
+ i: undefined,
100
+ n: undefined,
101
+ s: undefined
78
102
  });
79
103
  return _el$2;
80
104
  })();
@@ -83,20 +107,24 @@ export function Avatar(props) {
83
107
  var _el$3 = _$getNextElement(_tmpl$3);
84
108
  _el$3.addEventListener("error", () => setFailed(true));
85
109
  _$effect(_p$ => {
86
- var _v$6 = src(),
87
- _v$7 = props.alt ?? avatarMessages().avatarLabel({
110
+ var _v$8 = src(),
111
+ _v$9 = props.alt ?? avatarMessages().avatarLabel({
88
112
  name: label()
89
113
  }),
90
- _v$8 = className(),
91
- _v$9 = props.size ?? "md",
92
- _v$0 = props.style,
93
- _v$1 = props.loading ?? "lazy";
94
- _v$6 !== _p$.e && _$setAttribute(_el$3, "src", _p$.e = _v$6);
95
- _v$7 !== _p$.t && _$setAttribute(_el$3, "alt", _p$.t = _v$7);
96
- _v$8 !== _p$.a && _$className(_el$3, _p$.a = _v$8);
97
- _v$9 !== _p$.o && _$setAttribute(_el$3, "data-size", _p$.o = _v$9);
98
- _p$.i = _$style(_el$3, _v$0, _p$.i);
99
- _v$1 !== _p$.n && _$setAttribute(_el$3, "loading", _p$.n = _v$1);
114
+ _v$0 = className(),
115
+ _v$1 = props.size ?? "md",
116
+ _v$10 = props.shape === "square" ? "square" : undefined,
117
+ _v$11 = ring(),
118
+ _v$12 = style(),
119
+ _v$13 = props.loading ?? "lazy";
120
+ _v$8 !== _p$.e && _$setAttribute(_el$3, "src", _p$.e = _v$8);
121
+ _v$9 !== _p$.t && _$setAttribute(_el$3, "alt", _p$.t = _v$9);
122
+ _v$0 !== _p$.a && _$className(_el$3, _p$.a = _v$0);
123
+ _v$1 !== _p$.o && _$setAttribute(_el$3, "data-size", _p$.o = _v$1);
124
+ _v$10 !== _p$.i && _$setAttribute(_el$3, "data-shape", _p$.i = _v$10);
125
+ _v$11 !== _p$.n && _$setAttribute(_el$3, "data-ring", _p$.n = _v$11);
126
+ _p$.s = _$style(_el$3, _v$12, _p$.s);
127
+ _v$13 !== _p$.h && _$setAttribute(_el$3, "loading", _p$.h = _v$13);
100
128
  return _p$;
101
129
  }, {
102
130
  e: undefined,
@@ -104,7 +132,9 @@ export function Avatar(props) {
104
132
  a: undefined,
105
133
  o: undefined,
106
134
  i: undefined,
107
- n: undefined
135
+ n: undefined,
136
+ s: undefined,
137
+ h: undefined
108
138
  });
109
139
  return _el$3;
110
140
  })()
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["surfaces/Avatar.tsx"],"sourcesContent":["import { createEffect, createSignal, type JSX, on, Show } from \"solid-js\";\nimport { useAvatarMessages } from \"./avatar-messages\";\n\nexport type AvatarSize = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\nexport type AvatarProps = {\n name: string;\n src?: string | null;\n icon?: string;\n alt?: string;\n fallback?: string;\n size?: AvatarSize;\n loading?: \"eager\" | \"lazy\";\n class?: string;\n style?: JSX.CSSProperties | string;\n};\n\nconst initialsFor = (name: string): string => {\n const parts = name.trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return \"?\";\n if (parts.length === 1) return parts[0]?.slice(0, 2).toUpperCase() ?? \"?\";\n return `${parts[0]?.[0] ?? \"\"}${parts.at(-1)?.[0] ?? \"\"}`.toUpperCase();\n};\n\n/** Tints behind initials, as many as `.k2b-avatar[data-tint]` rules in the stylesheet. */\nconst TINTS = 10;\n\n/**\n * The tint behind initials and icons, from the name, so the same name has one color wherever an avatar shows it. The\n * hash is the one of `@k2b/stdlib`'s generated avatar.\n */\nconst tintFor = (name: string): number => {\n let hash = 0;\n for (let index = 0; index < name.length; index++) hash = (hash * 31 + name.charCodeAt(index)) >>> 0;\n return hash % TINTS;\n};\n\nexport function Avatar(props: AvatarProps): JSX.Element {\n const avatarMessages = useAvatarMessages();\n const [failed, setFailed] = createSignal(false);\n const label = () => props.name.trim() || avatarMessages().unknownUser;\n // Derive initials from the given name, not from the accessible-name fallback:\n // an empty `name` must render \"?\" the way Cloud's avatar does, not \"UU\".\n const fallback = () => props.fallback ?? initialsFor(props.name);\n const fallbackContent = () => (props.icon ? <i class={props.icon} aria-hidden=\"true\" /> : fallback());\n const className = () => `k2b-avatar ${props.class ?? \"\"}`;\n\n createEffect(\n on(\n () => props.src,\n () => setFailed(false),\n { defer: true },\n ),\n );\n\n return (\n <Show\n when={!failed() ? props.src || undefined : undefined}\n fallback={\n <span\n class={className()}\n data-size={props.size ?? \"md\"}\n data-tint={tintFor(props.name.trim())}\n style={props.style}\n role=\"img\"\n aria-label={props.alt ?? avatarMessages().avatarLabel({ name: label() })}\n >\n {fallbackContent()}\n </span>\n }\n >\n {(src) => (\n <img\n src={src()}\n alt={props.alt ?? avatarMessages().avatarLabel({ name: label() })}\n class={className()}\n data-size={props.size ?? \"md\"}\n style={props.style}\n loading={props.loading ?? \"lazy\"}\n decoding=\"async\"\n onError={() => setFailed(true)}\n />\n )}\n </Show>\n );\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["surfaces/Avatar.tsx"],"sourcesContent":["import { createEffect, createSignal, type JSX, on, Show } from \"solid-js\";\nimport { useAvatarMessages } from \"./avatar-messages\";\n\nexport type AvatarSize = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\n/**\n * A status ring around the avatar: `\"success\"` for an active state such as someone working on a task, or an explicit\n * color, for example a collaborator's cursor color.\n */\nexport type AvatarRing = \"success\" | { color: string };\n\n/** `square` marks an agent or service account; people stay round. */\nexport type AvatarShape = \"circle\" | \"square\";\n\nexport type AvatarProps = {\n name: string;\n src?: string | null;\n icon?: string;\n alt?: string;\n fallback?: string;\n size?: AvatarSize;\n /** Draws a ring with a small transparent gap inside the avatar's own box, so the avatar keeps its size and no container clips the ring. */\n ring?: AvatarRing;\n shape?: AvatarShape;\n loading?: \"eager\" | \"lazy\";\n class?: string;\n style?: JSX.CSSProperties | string;\n};\n\nconst initialsFor = (name: string): string => {\n const parts = name.trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return \"?\";\n if (parts.length === 1) return parts[0]?.slice(0, 2).toUpperCase() ?? \"?\";\n return `${parts[0]?.[0] ?? \"\"}${parts.at(-1)?.[0] ?? \"\"}`.toUpperCase();\n};\n\n/** Tints behind initials, as many as `.k2b-avatar[data-tint]` rules in the stylesheet. */\nconst TINTS = 10;\n\n/**\n * The tint behind initials and icons, from the name, so the same name has one color wherever an avatar shows it. The\n * hash is the one of `@k2b/stdlib`'s generated avatar.\n */\nconst tintFor = (name: string): number => {\n let hash = 0;\n for (let index = 0; index < name.length; index++) hash = (hash * 31 + name.charCodeAt(index)) >>> 0;\n return hash % TINTS;\n};\n\nexport function Avatar(props: AvatarProps): JSX.Element {\n const avatarMessages = useAvatarMessages();\n const [failed, setFailed] = createSignal(false);\n const label = () => props.name.trim() || avatarMessages().unknownUser;\n // Derive initials from the given name, not from the accessible-name fallback:\n // an empty `name` must render \"?\" the way Cloud's avatar does, not \"UU\".\n const fallback = () => props.fallback ?? initialsFor(props.name);\n const fallbackContent = () => (props.icon ? <i class={props.icon} aria-hidden=\"true\" /> : fallback());\n const className = () => `k2b-avatar ${props.class ?? \"\"}`;\n const ring = () => (props.ring === undefined ? undefined : typeof props.ring === \"string\" ? props.ring : \"color\");\n const style = (): JSX.CSSProperties | string | undefined => {\n const color = typeof props.ring === \"object\" ? props.ring.color : undefined;\n if (color === undefined) return props.style;\n if (typeof props.style === \"string\") return `${props.style ? `${props.style};` : \"\"}--k2b-avatar-ring:${color}`;\n return { ...props.style, \"--k2b-avatar-ring\": color };\n };\n\n createEffect(\n on(\n () => props.src,\n () => setFailed(false),\n { defer: true },\n ),\n );\n\n return (\n <Show\n when={!failed() ? props.src || undefined : undefined}\n fallback={\n <span\n class={className()}\n data-size={props.size ?? \"md\"}\n data-shape={props.shape === \"square\" ? \"square\" : undefined}\n data-tint={tintFor(props.name.trim())}\n data-ring={ring()}\n style={style()}\n role=\"img\"\n aria-label={props.alt ?? avatarMessages().avatarLabel({ name: label() })}\n >\n {fallbackContent()}\n </span>\n }\n >\n {(src) => (\n <img\n src={src()}\n alt={props.alt ?? avatarMessages().avatarLabel({ name: label() })}\n class={className()}\n data-size={props.size ?? \"md\"}\n data-shape={props.shape === \"square\" ? \"square\" : undefined}\n data-ring={ring()}\n style={style()}\n loading={props.loading ?? \"lazy\"}\n decoding=\"async\"\n onError={() => setFailed(true)}\n />\n )}\n </Show>\n );\n}\n"],"mappings":"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","ignoreList":[]}