impact-nova 2.5.16 → 2.6.0-alpha.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 (254) hide show
  1. package/README.md +27 -25
  2. package/dist/components/data/ag-grid-react/ag-grid.types.d.ts +28 -1
  3. package/dist/components/data/ag-grid-react/cell-renderers/date-display-renderer.d.ts +0 -3
  4. package/dist/components/data/ag-grid-react/cell-renderers/date-display-renderer.js +31 -38
  5. package/dist/components/data/ag-grid-react/cell-renderers/input-display-renderer.d.ts +1 -1
  6. package/dist/components/data/ag-grid-react/chat/chat-capabilities.d.ts +9 -0
  7. package/dist/components/data/ag-grid-react/chat/chat-capabilities.js +22 -0
  8. package/dist/components/data/ag-grid-react/chat/chat-column.d.ts +20 -0
  9. package/dist/components/data/ag-grid-react/chat/chat-column.js +81 -0
  10. package/dist/components/data/ag-grid-react/chat/chat-composer.d.ts +10 -0
  11. package/dist/components/data/ag-grid-react/chat/chat-composer.js +352 -0
  12. package/dist/components/data/ag-grid-react/chat/chat-constants.d.ts +17 -0
  13. package/dist/components/data/ag-grid-react/chat/chat-constants.js +22 -0
  14. package/dist/components/data/ag-grid-react/chat/chat-format.d.ts +41 -0
  15. package/dist/components/data/ag-grid-react/chat/chat-format.js +94 -0
  16. package/dist/components/data/ag-grid-react/chat/chat-host.d.ts +10 -0
  17. package/dist/components/data/ag-grid-react/chat/chat-host.js +651 -0
  18. package/dist/components/data/ag-grid-react/chat/chat-host.types.d.ts +13 -0
  19. package/dist/components/data/ag-grid-react/chat/chat-html.d.ts +2 -0
  20. package/dist/components/data/ag-grid-react/chat/chat-html.js +40 -0
  21. package/dist/components/data/ag-grid-react/chat/chat-identity.d.ts +13 -0
  22. package/dist/components/data/ag-grid-react/chat/chat-identity.js +24 -0
  23. package/dist/components/data/ag-grid-react/chat/chat-menu.d.ts +13 -0
  24. package/dist/components/data/ag-grid-react/chat/chat-menu.js +15 -0
  25. package/dist/components/data/ag-grid-react/chat/chat-notify.d.ts +17 -0
  26. package/dist/components/data/ag-grid-react/chat/chat-notify.js +124 -0
  27. package/dist/components/data/ag-grid-react/chat/chat-persist.d.ts +13 -0
  28. package/dist/components/data/ag-grid-react/chat/chat-persist.js +34 -0
  29. package/dist/components/data/ag-grid-react/chat/chat-priority.d.ts +13 -0
  30. package/dist/components/data/ag-grid-react/chat/chat-priority.js +79 -0
  31. package/dist/components/data/ag-grid-react/chat/chat-summaries.d.ts +2 -0
  32. package/dist/components/data/ag-grid-react/chat/chat-summaries.js +24 -0
  33. package/dist/components/data/ag-grid-react/chat/chat-thread-ui.d.ts +72 -0
  34. package/dist/components/data/ag-grid-react/chat/chat-thread-ui.js +713 -0
  35. package/dist/components/data/ag-grid-react/chat/chat-toggle.d.ts +6 -0
  36. package/dist/components/data/ag-grid-react/chat/chat-toggle.js +25 -0
  37. package/dist/components/data/ag-grid-react/chat/chat-ui-actions.d.ts +13 -0
  38. package/dist/components/data/ag-grid-react/chat/chat-ui-actions.js +26 -0
  39. package/dist/components/data/ag-grid-react/chat/chat-window.d.ts +14 -0
  40. package/dist/components/data/ag-grid-react/chat/chat-window.js +82 -0
  41. package/dist/components/data/ag-grid-react/chat/chat-workspace.d.ts +91 -0
  42. package/dist/components/data/ag-grid-react/chat/chat-workspace.js +555 -0
  43. package/dist/components/data/ag-grid-react/chat/chat.types.d.ts +319 -0
  44. package/dist/components/data/ag-grid-react/chat/index.d.ts +6 -0
  45. package/dist/components/data/ag-grid-react/chat/index.js +24 -0
  46. package/dist/components/data/ag-grid-react/chat.story-data.d.ts +34 -0
  47. package/dist/components/data/ag-grid-react/chat.story-sources.d.ts +4 -0
  48. package/dist/components/data/ag-grid-react/comments/assets/comments-no-results.png.js +4 -0
  49. package/dist/components/data/ag-grid-react/comments/comment-mode-toggle.d.ts +6 -0
  50. package/dist/components/data/ag-grid-react/comments/comment-mode-toggle.js +29 -0
  51. package/dist/components/data/ag-grid-react/comments/comments-actions-menu.d.ts +8 -0
  52. package/dist/components/data/ag-grid-react/comments/comments-actions-menu.js +18 -0
  53. package/dist/components/data/ag-grid-react/comments/comments-ag-grid-presence.d.ts +18 -0
  54. package/dist/components/data/ag-grid-react/comments/comments-ag-grid-presence.js +16 -0
  55. package/dist/components/data/ag-grid-react/comments/comments-capabilities.d.ts +11 -0
  56. package/dist/components/data/ag-grid-react/comments/comments-capabilities.js +26 -0
  57. package/dist/components/data/ag-grid-react/comments/comments-constants.d.ts +12 -0
  58. package/dist/components/data/ag-grid-react/comments/comments-constants.js +21 -0
  59. package/dist/components/data/ag-grid-react/comments/comments-format.d.ts +20 -0
  60. package/dist/components/data/ag-grid-react/comments/comments-format.js +49 -0
  61. package/dist/components/data/ag-grid-react/comments/comments-generation.d.ts +14 -0
  62. package/dist/components/data/ag-grid-react/comments/comments-generation.js +18 -0
  63. package/dist/components/data/ag-grid-react/comments/comments-host.d.ts +10 -0
  64. package/dist/components/data/ag-grid-react/comments/comments-host.js +343 -0
  65. package/dist/components/data/ag-grid-react/comments/comments-host.types.d.ts +18 -0
  66. package/dist/components/data/ag-grid-react/comments/comments-identity.d.ts +7 -0
  67. package/dist/components/data/ag-grid-react/comments/comments-identity.js +20 -0
  68. package/dist/components/data/ag-grid-react/comments/comments-menu.d.ts +29 -0
  69. package/dist/components/data/ag-grid-react/comments/comments-menu.js +35 -0
  70. package/dist/components/data/ag-grid-react/comments/comments-overlay-anchor.d.ts +22 -0
  71. package/dist/components/data/ag-grid-react/comments/comments-overlay-anchor.js +98 -0
  72. package/dist/components/data/ag-grid-react/comments/comments-overlay.d.ts +21 -0
  73. package/dist/components/data/ag-grid-react/comments/comments-overlay.js +406 -0
  74. package/dist/components/data/ag-grid-react/comments/comments-panel.d.ts +9 -0
  75. package/dist/components/data/ag-grid-react/comments/comments-panel.js +272 -0
  76. package/dist/components/data/ag-grid-react/comments/comments-persist.d.ts +11 -0
  77. package/dist/components/data/ag-grid-react/comments/comments-persist.js +19 -0
  78. package/dist/components/data/ag-grid-react/comments/comments-reveal.d.ts +11 -0
  79. package/dist/components/data/ag-grid-react/comments/comments-reveal.js +31 -0
  80. package/dist/components/data/ag-grid-react/comments/comments-ui-actions.d.ts +18 -0
  81. package/dist/components/data/ag-grid-react/comments/comments-ui-actions.js +22 -0
  82. package/dist/components/data/ag-grid-react/comments/comments-window.d.ts +10 -0
  83. package/dist/components/data/ag-grid-react/comments/comments-window.js +62 -0
  84. package/dist/components/data/ag-grid-react/comments/comments.types.d.ts +178 -0
  85. package/dist/components/data/ag-grid-react/comments/index.d.ts +5 -0
  86. package/dist/components/data/ag-grid-react/comments/index.js +15 -0
  87. package/dist/components/data/ag-grid-react/comments-cell-renderers-showcase.d.ts +25 -0
  88. package/dist/components/data/ag-grid-react/comments.story-data.d.ts +37 -0
  89. package/dist/components/data/ag-grid-react/comments.story-sources.d.ts +11 -0
  90. package/dist/components/data/ag-grid-react/grid-cell-address.d.ts +21 -0
  91. package/dist/components/data/ag-grid-react/grid-cell-address.js +21 -0
  92. package/dist/components/data/ag-grid-react/grid-row-reveal.d.ts +34 -0
  93. package/dist/components/data/ag-grid-react/grid-row-reveal.js +33 -0
  94. package/dist/components/data/ag-grid-react/headers/advanced-filter/advanced-filter-dialog.js +75 -65
  95. package/dist/components/data/ag-grid-react/headers/advanced-filter/column-filter-section.d.ts +1 -1
  96. package/dist/components/data/ag-grid-react/headers/advanced-filter/column-filter-section.js +54 -54
  97. package/dist/components/data/ag-grid-react/headers/components/date-filter-picker.d.ts +1 -1
  98. package/dist/components/data/ag-grid-react/headers/header-search-input.js +122 -119
  99. package/dist/components/data/ag-grid-react/headers/utils/date-utils.d.ts +2 -1
  100. package/dist/components/data/ag-grid-react/headers/utils/date-utils.js +25 -20
  101. package/dist/components/data/ag-grid-react/headers/utils/filter-utils.d.ts +1 -1
  102. package/dist/components/data/ag-grid-react/index.d.ts +1 -1
  103. package/dist/components/data/ag-grid-react/index.js +481 -254
  104. package/dist/components/data/ag-grid-react/notes/index.d.ts +2 -0
  105. package/dist/components/data/ag-grid-react/notes/index.js +1 -0
  106. package/dist/components/data/ag-grid-react/notes/notes-ag-grid-adapter.d.ts +25 -0
  107. package/dist/components/data/ag-grid-react/notes/notes-ag-grid-adapter.js +32 -0
  108. package/dist/components/data/ag-grid-react/notes/notes-constants.d.ts +2 -0
  109. package/dist/components/data/ag-grid-react/notes/notes-constants.js +4 -0
  110. package/dist/components/data/ag-grid-react/notes/notes.types.d.ts +12 -0
  111. package/dist/components/data/ag-grid-react/notes.story-sources.d.ts +7 -0
  112. package/dist/components/data/ag-grid-react/nova-system-column.d.ts +7 -0
  113. package/dist/components/data/ag-grid-react/nova-system-column.js +18 -0
  114. package/dist/components/data/ag-grid-react/theme.js +6 -2
  115. package/dist/components/data/ag-grid-react/value-formatter.types.d.ts +4 -0
  116. package/dist/components/data/ag-grid-react/value-formatters.d.ts +0 -19
  117. package/dist/components/data/ag-grid-react/value-formatters.js +88 -90
  118. package/dist/components/data/data-table/build-column-tree-from-grid.d.ts +0 -1
  119. package/dist/components/data/data-table/build-column-tree-from-grid.js +49 -53
  120. package/dist/components/data/data-table/data-table-column-apply.d.ts +0 -2
  121. package/dist/components/data/data-table/data-table-column-apply.js +73 -84
  122. package/dist/components/data/data-table/data-table-column-def-pin.js +34 -31
  123. package/dist/components/data/data-table/data-table-column-list.js +64 -94
  124. package/dist/components/data/data-table/data-table-column-tree-cache.d.ts +6 -12
  125. package/dist/components/data/data-table/data-table-column-tree-cache.js +131 -250
  126. package/dist/components/data/data-table/data-table-context.js +5 -5
  127. package/dist/components/data/data-table/data-table-sheet-context.js +1 -1
  128. package/dist/components/data/data-table/data-table-sheet.js +2 -1
  129. package/dist/components/data/data-table/patch-column-tree-indicators-from-grid.d.ts +0 -5
  130. package/dist/components/data/data-table/patch-column-tree-indicators-from-grid.js +11 -28
  131. package/dist/components/data/data-table/use-data-table-column-list-sync.d.ts +0 -10
  132. package/dist/components/data/data-table/use-data-table-column-list-sync.js +196 -250
  133. package/dist/components/data/nested-list/components/NestedListContent.d.ts +2 -10
  134. package/dist/components/data/nested-list/components/NestedListContent.js +138 -253
  135. package/dist/components/data/nested-list/components/SortableItem.d.ts +1 -2
  136. package/dist/components/data/nested-list/components/SortableItem.js +60 -62
  137. package/dist/components/data/nested-list/hooks/useNestedListDragDrop.d.ts +20 -10
  138. package/dist/components/data/nested-list/hooks/useNestedListDragDrop.js +233 -44
  139. package/dist/components/data/nested-list/nested-list-constants.d.ts +1 -4
  140. package/dist/components/data/nested-list/nested-list-constants.js +4 -10
  141. package/dist/components/data/nested-list/nested-list.js +336 -322
  142. package/dist/components/data/nested-list/nested-list.types.d.ts +0 -17
  143. package/dist/components/data-display/calendar/calendar-config.js +22 -21
  144. package/dist/components/data-display/calendar/calendar-day-button.js +21 -21
  145. package/dist/components/data-display/calendar/calendar-day-picker-view.js +36 -35
  146. package/dist/components/data-display/calendar/calendar-fiscal-labels.d.ts +3 -3
  147. package/dist/components/data-display/calendar/calendar-fiscal-labels.js +50 -62
  148. package/dist/components/data-display/calendar/calendar.js +138 -137
  149. package/dist/components/data-display/calendar/fiscal-period-caption-select.js +23 -22
  150. package/dist/components/data-display/calendar/use-calendar-i18n.d.ts +1 -0
  151. package/dist/components/data-display/calendar/use-calendar-i18n.js +10 -9
  152. package/dist/components/data-display/chart/chart.js +72 -72
  153. package/dist/components/data-display/chart/chart.utils.d.ts +1 -1
  154. package/dist/components/data-display/chart/chart.utils.js +40 -31
  155. package/dist/components/feedback/sheet/sheet.js +1 -1
  156. package/dist/components/feedback/toast/toast.d.ts +1 -1
  157. package/dist/components/feedback/toast/toast.variants.d.ts +1 -1
  158. package/dist/components/flows/filter-panel/filter-panel.d.ts +1 -1
  159. package/dist/components/flows/filter-panel/filter-panel.js +65 -64
  160. package/dist/components/flows/filter-panel/filter-panel.types.d.ts +1 -0
  161. package/dist/components/forms/date-picker/date-picker.js +125 -126
  162. package/dist/components/forms/date-picker/date-range-picker.js +191 -192
  163. package/dist/components/forms/date-picker/multi-date-picker.js +66 -67
  164. package/dist/components/forms/date-picker/multi-week-picker.js +82 -83
  165. package/dist/components/forms/date-picker/use-picker-i18n.d.ts +6 -0
  166. package/dist/components/forms/date-picker/use-picker-i18n.js +11 -0
  167. package/dist/components/forms/date-picker/week-picker.js +146 -147
  168. package/dist/components/forms/date-picker/week-range-picker.js +158 -159
  169. package/dist/components/ui/local-raster-icons/message3d.webp.js +4 -0
  170. package/dist/components/ui/local-raster-icons/rasterIcons.d.ts +1 -0
  171. package/dist/components/ui/local-raster-icons/rasterIcons.js +27 -25
  172. package/dist/form-react/Fields/WeekRangePicker.js +16 -16
  173. package/dist/i18n/defaultMessages.d.ts +144 -0
  174. package/dist/i18n/defaultMessages.js +161 -19
  175. package/dist/i18n/format/collator.d.ts +1 -0
  176. package/dist/i18n/format/collator.js +7 -0
  177. package/dist/i18n/format/date-pattern.d.ts +5 -0
  178. package/dist/i18n/format/date-pattern.js +20 -0
  179. package/dist/i18n/format/format-date.d.ts +9 -0
  180. package/dist/i18n/format/format-date.js +56 -0
  181. package/dist/i18n/format/format-number.d.ts +20 -0
  182. package/dist/i18n/format/format-number.js +68 -0
  183. package/dist/i18n/format/formatter-cache.d.ts +9 -0
  184. package/dist/i18n/format/formatter-cache.js +66 -0
  185. package/dist/i18n/format/index.d.ts +6 -0
  186. package/dist/i18n/format/parse-number.d.ts +6 -0
  187. package/dist/i18n/format/parse-number.js +53 -0
  188. package/dist/i18n/getDateFnsLocale.d.ts +5 -4
  189. package/dist/i18n/getDateFnsLocale.js +46 -16
  190. package/dist/i18n/i18n.types.d.ts +13 -0
  191. package/dist/i18n/impact-nova-i18n-context.d.ts +1 -1
  192. package/dist/i18n/impact-nova-i18n-context.js +33 -25
  193. package/dist/i18n/impact-nova-i18n-defaults.js +8 -6
  194. package/dist/i18n/index.d.ts +4 -1
  195. package/dist/i18n/index.js +41 -16
  196. package/dist/i18n/locale-config.d.ts +28 -0
  197. package/dist/i18n/locale-config.js +32 -0
  198. package/dist/i18n/locales/de.js +142 -0
  199. package/dist/i18n/locales/es.js +142 -0
  200. package/dist/i18n/locales/hi.js +142 -0
  201. package/dist/i18n/locales/kn.js +142 -0
  202. package/dist/i18n/week-start.d.ts +6 -0
  203. package/dist/i18n/week-start.js +30 -0
  204. package/dist/impact-nova-components.css +249 -0
  205. package/dist/impact-nova-tokens.scss +6 -0
  206. package/dist/impact-nova.css +1 -1
  207. package/dist/index.d.ts +1 -1
  208. package/dist/index.js +624 -601
  209. package/dist/llms/index.js +26 -2
  210. package/dist/llms/rules/ag-grid.js +1 -1
  211. package/dist/llms/rules/best-practices.js +1 -1
  212. package/dist/llms/rules/data-table-chat.js +1 -0
  213. package/dist/llms/rules/data-table-comments.js +1 -0
  214. package/dist/llms/rules/data-table-notes.js +1 -0
  215. package/dist/llms/rules/installation.js +1 -1
  216. package/dist/llms/rules/migration.js +1 -1
  217. package/dist/llms/rules/real-world-patterns.js +1 -1
  218. package/dist/llms/rules/requirements.js +1 -1
  219. package/dist/llms/rules/troubleshooting.js +1 -1
  220. package/dist/providers/app-providers.d.ts +3 -1
  221. package/dist/providers/app-providers.js +22 -11
  222. package/package.json +13 -1
  223. package/dist/components/data/data-table/column-picker-authority.d.ts +0 -34
  224. package/dist/components/data/data-table/column-picker-authority.js +0 -116
  225. package/dist/components/data/data-table/column-picker-drop-validation.d.ts +0 -7
  226. package/dist/components/data/data-table/column-picker-drop-validation.js +0 -37
  227. package/dist/components/data/data-table/data-table-column-list-tree-apply.d.ts +0 -10
  228. package/dist/components/data/data-table/data-table-column-list-tree-apply.js +0 -79
  229. package/dist/components/data/data-table/data-table-flat-column-virtual-rows.d.ts +0 -26
  230. package/dist/components/data/data-table/data-table-flat-column-virtual-rows.js +0 -195
  231. package/dist/components/data/data-table/data-table-picker-column-eligibility.d.ts +0 -1
  232. package/dist/components/data/data-table/data-table-picker-column-eligibility.js +0 -7
  233. package/dist/components/data/data-table/reconcile-column-tree-from-grid.d.ts +0 -12
  234. package/dist/components/data/data-table/reconcile-column-tree-from-grid.js +0 -12
  235. package/dist/components/data/nested-list/hooks/useVirtualNestedListDrag.d.ts +0 -24
  236. package/dist/components/data/nested-list/hooks/useVirtualNestedListDrag.js +0 -128
  237. package/dist/components/data/nested-list/nested-list-display-utils.d.ts +0 -11
  238. package/dist/components/data/nested-list/nested-list-display-utils.js +0 -74
  239. package/dist/components/data/nested-list/nested-list-drop-engine.d.ts +0 -31
  240. package/dist/components/data/nested-list/nested-list-drop-engine.js +0 -209
  241. package/dist/components/data/nested-list/nested-list-flat-virtual-handlers.d.ts +0 -26
  242. package/dist/components/data/nested-list/nested-list-flat-virtual-handlers.js +0 -67
  243. package/dist/components/data/nested-list/nested-list-item-tree-mutations.d.ts +0 -4
  244. package/dist/components/data/nested-list/nested-list-item-tree-mutations.js +0 -43
  245. package/dist/components/data/nested-list/nested-list-lazy-flat-rows.d.ts +0 -3
  246. package/dist/components/data/nested-list/nested-list-lazy-flat-rows.js +0 -34
  247. package/dist/components/data/nested-list/nested-list-row-estimates.d.ts +0 -9
  248. package/dist/components/data/nested-list/nested-list-row-estimates.js +0 -14
  249. package/dist/components/data/nested-list/nested-list-scroll-anchor.d.ts +0 -36
  250. package/dist/components/data/nested-list/nested-list-scroll-anchor.js +0 -47
  251. package/dist/components/data/nested-list/nested-list-virtual-drop.d.ts +0 -59
  252. package/dist/components/data/nested-list/nested-list-virtual-drop.js +0 -341
  253. package/dist/lib/hash/fnv1a128.d.ts +0 -16
  254. package/dist/lib/hash/fnv1a128.js +0 -21
@@ -0,0 +1,319 @@
1
+ import { ReactNode } from 'react';
2
+ export type ChatConversationId = string;
3
+ export type ChatTarget = {
4
+ rowId: string;
5
+ conversationId: ChatConversationId;
6
+ };
7
+ export type ChatAttachment = {
8
+ id: string;
9
+ name: string;
10
+ kind: "file" | "image";
11
+ url: string;
12
+ mimeType?: string;
13
+ size?: number;
14
+ };
15
+ export type ChatMessageReplyTo = {
16
+ id: string;
17
+ author: string;
18
+ text: string;
19
+ };
20
+ export type ChatPriority = "high" | "medium" | "low";
21
+ export type ChatNotifyPref = "all" | "mentions" | "nothing";
22
+ export type ChatMember = {
23
+ id: string;
24
+ name: string;
25
+ avatarUrl?: string;
26
+ };
27
+ /** Consumer-owned authorization. Nova never infers this from `member.role`. */
28
+ export type ChatAction = "view" | "create" | "edit" | "delete" | "invite" | "remove-member";
29
+ export type ChatActionContext = {
30
+ rowId: string;
31
+ conversationId?: ChatConversationId;
32
+ message?: ChatMessage;
33
+ member?: ChatMember;
34
+ };
35
+ export type ChatMembersRenderProps = {
36
+ members: readonly ChatMember[];
37
+ canInvite: boolean;
38
+ canRemoveMember: (member: ChatMember) => boolean;
39
+ onInvite: () => void;
40
+ onRemove: (member: ChatMember) => void;
41
+ };
42
+ export type ChatPeoplePickerRenderProps = {
43
+ members: readonly ChatMember[];
44
+ listPeople: (request?: ChatPeopleRequest) => Promise<readonly ChatMember[]> | readonly ChatMember[];
45
+ onAdd: (members: readonly ChatMember[]) => void;
46
+ onCancel: () => void;
47
+ };
48
+ export type ChatPeopleRequest = {
49
+ query?: string;
50
+ limit?: number;
51
+ };
52
+ export type ChatMessage = {
53
+ id: string;
54
+ text: string;
55
+ author: string;
56
+ createdAt: string;
57
+ updatedAt?: string;
58
+ parentId?: string;
59
+ replyTo?: ChatMessageReplyTo;
60
+ replyCount?: number;
61
+ pinned?: boolean;
62
+ deleted?: boolean;
63
+ priority?: ChatPriority;
64
+ attachments?: readonly ChatAttachment[];
65
+ /** Centered WhatsApp-style event line. Not a user bubble. */
66
+ system?: boolean;
67
+ };
68
+ export type ChatConversation = {
69
+ conversationId: ChatConversationId;
70
+ rowId: string;
71
+ title?: string;
72
+ createdBy?: string;
73
+ createdAt?: string;
74
+ messages: ChatMessage[];
75
+ hasMoreOlder?: boolean;
76
+ hiddenCount?: number;
77
+ messageCount?: number;
78
+ priority?: ChatPriority;
79
+ muted?: boolean;
80
+ notify?: ChatNotifyPref;
81
+ includeBroadcast?: boolean;
82
+ members?: readonly ChatMember[];
83
+ };
84
+ export type ChatSummary = {
85
+ conversationId: ChatConversationId;
86
+ rowId: string;
87
+ title: string;
88
+ preview: string;
89
+ author?: string;
90
+ updatedAt?: string;
91
+ unreadCount?: number;
92
+ messageCount: number;
93
+ priority?: ChatPriority;
94
+ muted?: boolean;
95
+ };
96
+ export type ChatLocateResult = {
97
+ status: "ready";
98
+ rowIndex?: number;
99
+ } | {
100
+ status: "missing";
101
+ };
102
+ export type ChatRowStatus = "ready" | "locating" | "filtered" | "unloaded" | "missing";
103
+ export type ChatCapabilities = {
104
+ canView: boolean;
105
+ canCreate: boolean;
106
+ canEdit: boolean;
107
+ canDelete: boolean;
108
+ };
109
+ export type ChatPersistEvent = {
110
+ type: "create-conversation";
111
+ rowId: string;
112
+ conversationId: ChatConversationId;
113
+ title: string;
114
+ members?: readonly ChatMember[];
115
+ } | {
116
+ type: "add-message";
117
+ rowId: string;
118
+ conversationId: ChatConversationId;
119
+ message: ChatMessage;
120
+ } | {
121
+ type: "edit-message";
122
+ rowId: string;
123
+ conversationId: ChatConversationId;
124
+ message: ChatMessage;
125
+ } | {
126
+ type: "delete-message";
127
+ rowId: string;
128
+ conversationId: ChatConversationId;
129
+ messageId: string;
130
+ } | {
131
+ type: "pin-message";
132
+ rowId: string;
133
+ conversationId: ChatConversationId;
134
+ messageId: string;
135
+ pinned: boolean;
136
+ } | {
137
+ type: "set-priority";
138
+ rowId: string;
139
+ conversationId: ChatConversationId;
140
+ priority: ChatPriority | null;
141
+ messageId?: string;
142
+ } | {
143
+ type: "mute-conversation";
144
+ rowId: string;
145
+ conversationId: ChatConversationId;
146
+ muted: boolean;
147
+ } | {
148
+ type: "set-notify";
149
+ rowId: string;
150
+ conversationId: ChatConversationId;
151
+ notify: ChatNotifyPref;
152
+ includeBroadcast: boolean;
153
+ } | {
154
+ type: "set-members";
155
+ rowId: string;
156
+ conversationId: ChatConversationId;
157
+ members: readonly ChatMember[];
158
+ };
159
+ export type ChatSummaryPageRequest = {
160
+ cursor?: string;
161
+ limit: number;
162
+ query?: {
163
+ text?: string;
164
+ rowId?: string;
165
+ };
166
+ };
167
+ export type ChatSummaryPage = {
168
+ items: readonly ChatSummary[];
169
+ nextCursor?: string;
170
+ };
171
+ export type ChatThreadPageRequest = {
172
+ purpose: "page" | "thread" | "pinned";
173
+ limit: number;
174
+ before?: string;
175
+ parentId?: string;
176
+ };
177
+ export type ChatDrawer = {
178
+ kind: "pinned";
179
+ } | {
180
+ kind: "thread";
181
+ parent: ChatMessage;
182
+ };
183
+ export type ChatColumnConfig = {
184
+ pinned?: "left" | "right" | null;
185
+ width?: number;
186
+ };
187
+ export type ChatMenuItem = {
188
+ id: string;
189
+ label: string;
190
+ disabled?: boolean;
191
+ icon?: ReactNode;
192
+ onSelect: () => void;
193
+ };
194
+ export type ChatUiAction<TContext> = {
195
+ id: string;
196
+ label: string;
197
+ disabled?: boolean;
198
+ icon?: ReactNode;
199
+ onSelect: (context: TContext) => void;
200
+ };
201
+ /**
202
+ * Shared by every Chat extension point. `close()` dismisses the Chat sheet.
203
+ * Product verbs (Finalize offer, Resolve ticket, Complete request) stay in the
204
+ * consumer: persist your row, then call `close()`.
205
+ */
206
+ export type ChatSessionHandle = {
207
+ close: () => void;
208
+ };
209
+ export type ChatMessageActionContext = ChatSessionHandle & {
210
+ rowId: string;
211
+ conversationId: ChatConversationId;
212
+ message: ChatMessage;
213
+ };
214
+ export type ChatThreadActionContext = ChatSessionHandle & {
215
+ rowId: string;
216
+ conversationId: ChatConversationId;
217
+ };
218
+ export type ChatListActionContext = ChatSessionHandle & {
219
+ rowId: string;
220
+ conversationIds: readonly string[];
221
+ activeConversationId: string | null;
222
+ };
223
+ export type ChatComposerRenderProps = {
224
+ value: string;
225
+ onChange: (value: string) => void;
226
+ onSave: () => void;
227
+ disabled: boolean;
228
+ saving: boolean;
229
+ author: string;
230
+ placeholder?: string;
231
+ priority?: ChatPriority;
232
+ onPriorityChange?: (priority: ChatPriority | null) => void;
233
+ attachments?: readonly ChatAttachment[];
234
+ onAttachmentsChange?: (attachments: readonly ChatAttachment[]) => void;
235
+ };
236
+ export type ChatComposerToolContext = ChatThreadActionContext & {
237
+ insertText: (text: string) => void;
238
+ };
239
+ export type DataTableChatConfig = {
240
+ hasConversation: (rowId: string) => boolean;
241
+ unreadCount?: (rowId: string) => number;
242
+ getRowTitle?: (rowId: string) => string;
243
+ loadConversation: (target: ChatTarget, request?: ChatThreadPageRequest) => Promise<ChatConversation | undefined>;
244
+ persist: (event: ChatPersistEvent) => Promise<void>;
245
+ getAuthor: () => string;
246
+ getCapabilities?: (rowId: string) => ChatCapabilities;
247
+ /**
248
+ * Per-action authorization. Return `true` / `false` to override the default,
249
+ * or `undefined` to fall through to `getCapabilities` + `listPeople`.
250
+ * Nova does not own roles, tenants, or backend ACL.
251
+ */
252
+ can?: (action: ChatAction, context: ChatActionContext) => boolean | undefined;
253
+ getSummaries?: (request: ChatSummaryPageRequest) => Promise<ChatSummaryPage>;
254
+ locateRow?: (rowId: string) => Promise<ChatLocateResult>;
255
+ /**
256
+ * Inject the `iv-chat` system column. `false` = toolbar + context menu only.
257
+ * `{ pinned: null }` injects unpinned (not recommended at 50k columns).
258
+ */
259
+ column?: false | ChatColumnConfig;
260
+ /** Bind to an existing consumer column instead of injecting `iv-chat`. */
261
+ colId?: string;
262
+ messageActions?: readonly ChatUiAction<ChatMessageActionContext>[];
263
+ threadActions?: readonly ChatUiAction<ChatThreadActionContext>[];
264
+ /**
265
+ * Extra list-toolbar menu items after built-in Mute. Receives checked conversation ids.
266
+ * Do not hardcode product verbs here — Archive / Delete belong to the consumer.
267
+ */
268
+ listActions?: readonly ChatUiAction<ChatListActionContext>[];
269
+ /**
270
+ * Outline buttons under a message (Figma “Finalize”-style). Omitted = nothing extra.
271
+ * Never hardcode product verbs here — the consumer supplies labels.
272
+ */
273
+ quickActions?: readonly ChatUiAction<ChatMessageActionContext>[];
274
+ /**
275
+ * Extra composer toolbar tools shown in the Figma “Quick action” menu.
276
+ * Attach / image / emoji / bold / italic / link are built-in.
277
+ * File picks stay local until the consumer persist writes them.
278
+ * Completing a row (finalize / resolve / close-out) is `onSelect` + `context.close()`.
279
+ */
280
+ composerTools?: readonly ChatUiAction<ChatComposerToolContext>[];
281
+ /**
282
+ * Directory used by Add member in the info drawer.
283
+ * Nova requests `{ query, limit }` (default 10). Omit = members are read-only.
284
+ */
285
+ listPeople?: (request?: ChatPeopleRequest) => Promise<readonly ChatMember[]> | readonly ChatMember[];
286
+ /**
287
+ * Cheap row presence for the vanilla Chat cell. Not a React render per row.
288
+ * Sets `data-iv-chat-priority` on the cell. Omit / undefined = no attribute.
289
+ */
290
+ priority?: (rowId: string) => ChatPriority | undefined;
291
+ renderIndicator?: (props: {
292
+ rowId: string;
293
+ unreadCount: number;
294
+ hasConversation: boolean;
295
+ }) => ReactNode;
296
+ renderAvatar?: (props: {
297
+ author: string;
298
+ member?: ChatMember;
299
+ }) => ReactNode;
300
+ renderMessageBody?: (props: {
301
+ message: ChatMessage;
302
+ }) => ReactNode;
303
+ renderComposer?: (props: ChatComposerRenderProps) => ReactNode;
304
+ /** Replace the Info-drawer member list. Header + people picker stay Nova unless `renderPeoplePicker` is set. */
305
+ renderMembers?: (props: ChatMembersRenderProps) => ReactNode;
306
+ /** Replace the Add-member directory. Host still persists `set-members`. */
307
+ renderPeoplePicker?: (props: ChatPeoplePickerRenderProps) => ReactNode;
308
+ renderMessageActions?: (props: {
309
+ items: ChatMenuItem[];
310
+ context: ChatMessageActionContext;
311
+ }) => ReactNode;
312
+ renderThreadActions?: (props: {
313
+ items: ChatMenuItem[];
314
+ context: ChatThreadActionContext;
315
+ }) => ReactNode;
316
+ renderPanel?: (props: {
317
+ children: ReactNode;
318
+ }) => ReactNode;
319
+ };
@@ -0,0 +1,6 @@
1
+ export type { ChatAction, ChatActionContext, ChatAttachment, ChatComposerToolContext, ChatMember, ChatMembersRenderProps, ChatPeoplePickerRenderProps, ChatPeopleRequest, ChatNotifyPref, ChatPriority, ChatCapabilities, ChatColumnConfig, ChatComposerRenderProps, ChatConversation, ChatConversationId, ChatLocateResult, ChatMenuItem, ChatDrawer, ChatMessage, ChatMessageActionContext, ChatMessageReplyTo, ChatPersistEvent, ChatRowStatus, ChatSummary, ChatSummaryPage, ChatSummaryPageRequest, ChatTarget, ChatSessionHandle, ChatThreadActionContext, ChatListActionContext, ChatThreadPageRequest, ChatUiAction, DataTableChatConfig, } from './chat.types';
2
+ export { defaultChatConversationId, CHAT_THREAD_PAGE_SIZE, CHAT_PANEL_PAGE_SIZE, CHAT_MEMBERS_VISIBLE, IV_CHAT_COL_ID } from './chat-constants';
3
+ export { mintConversationId, mintChatMessageId } from './chat-identity';
4
+ export { chatAllows, resolveChatCapabilities, DEFAULT_CHAT_CAPABILITIES } from './chat-capabilities';
5
+ export { boundLoadedConversation, chatPinnedPageRequest, chatReplyThreadRequest, chatThreadPageRequest, scopeChatMessages, selectChatThreadWindow, } from './chat-window';
6
+ export { ChatToggle, type ChatToggleProps } from './chat-toggle';
@@ -0,0 +1,24 @@
1
+ import { CHAT_MEMBERS_VISIBLE as a, CHAT_PANEL_PAGE_SIZE as o, CHAT_THREAD_PAGE_SIZE as r, IV_CHAT_COL_ID as C, defaultChatConversationId as s } from "./chat-constants.js";
2
+ import { mintChatMessageId as A, mintConversationId as _ } from "./chat-identity.js";
3
+ import { DEFAULT_CHAT_CAPABILITIES as n, chatAllows as I, resolveChatCapabilities as T } from "./chat-capabilities.js";
4
+ import { boundLoadedConversation as i, chatPinnedPageRequest as l, chatReplyThreadRequest as p, chatThreadPageRequest as m, scopeChatMessages as P, selectChatThreadWindow as c } from "./chat-window.js";
5
+ import { ChatToggle as g } from "./chat-toggle.js";
6
+ export {
7
+ a as CHAT_MEMBERS_VISIBLE,
8
+ o as CHAT_PANEL_PAGE_SIZE,
9
+ r as CHAT_THREAD_PAGE_SIZE,
10
+ g as ChatToggle,
11
+ n as DEFAULT_CHAT_CAPABILITIES,
12
+ C as IV_CHAT_COL_ID,
13
+ i as boundLoadedConversation,
14
+ I as chatAllows,
15
+ l as chatPinnedPageRequest,
16
+ p as chatReplyThreadRequest,
17
+ m as chatThreadPageRequest,
18
+ s as defaultChatConversationId,
19
+ A as mintChatMessageId,
20
+ _ as mintConversationId,
21
+ T as resolveChatCapabilities,
22
+ P as scopeChatMessages,
23
+ c as selectChatThreadWindow
24
+ };
@@ -0,0 +1,34 @@
1
+ import { ChatConversation, ChatMember, ChatMessage, ChatPeopleRequest, ChatPersistEvent, ChatPriority, ChatSummary, ChatTarget, ChatThreadPageRequest } from './chat/chat.types';
2
+ import { PlanRow } from './comments.story-data';
3
+ export { PLAN_COLUMNS, PLAN_ROWS, PLAN_PAGE_SIZE, PLAN_LOCATE_MS, type PlanRow } from './comments.story-data';
4
+ export declare const CHAT_SERVER_ROWS: PlanRow[];
5
+ export declare const CHAT_DIRECTORY: readonly ChatMember[];
6
+ export declare function listChatDirectory(request?: ChatPeopleRequest): readonly ChatMember[];
7
+ export declare function seedConversation(rowId: string, messages: ChatMessage[], title: string, conversationId?: string): ChatConversation;
8
+ export declare const QUICK_START_CHATS: ChatConversation[];
9
+ /** QuickStart list only — ~30 chats on the oak dining table row so mute + scroll are visible. */
10
+ export declare const QUICK_START_LIST_CHATS: ChatConversation[];
11
+ export declare function createChatMemoryStore(seed?: ChatConversation[]): {
12
+ hasConversation: (rowId: string) => boolean;
13
+ priority: (rowId: string) => ChatPriority | undefined;
14
+ unreadCount: (rowId: string) => number;
15
+ getRowTitle: (rowId: string) => string;
16
+ getCapabilities: () => {
17
+ canView: boolean;
18
+ canCreate: boolean;
19
+ canEdit: boolean;
20
+ canDelete: boolean;
21
+ };
22
+ loadConversation: (target: ChatTarget, request?: ChatThreadPageRequest) => Promise<ChatConversation>;
23
+ persist: (event: ChatPersistEvent) => Promise<void>;
24
+ getAuthor: () => string;
25
+ getSummaries: ({ query, }: {
26
+ query?: {
27
+ text?: string;
28
+ rowId?: string;
29
+ };
30
+ }) => Promise<{
31
+ items: ChatSummary[];
32
+ }>;
33
+ };
34
+ export declare function longConversation(rowId: string, count: number): ChatConversation;
@@ -0,0 +1,4 @@
1
+ /** Copy-paste blocks for Data Display / DataTable / Chat Docs tab. Consumer imports only. */
2
+ export declare const CHAT_QUICK_START_SOURCE = "import { DataTable, DataTableContent, DataTableToolbar } from \"impact-nova/data-table\";\nimport { ChatToggle, type DataTableChatConfig } from \"impact-nova/ag-grid-react/chat\";\n\n<DataTable className=\"h-[640px]\">\n <DataTableToolbar>\n <ChatToggle pressed={chatOpen} onPressedChange={setChatOpen} />\n </DataTableToolbar>\n <DataTableContent\n getRowId={(params) => params.data.id}\n columnDefs={columnDefs}\n rowData={rowData}\n chat={chat}\n />\n</DataTable>\n\nconst chat: DataTableChatConfig = {\n hasConversation: (rowId) => store.has(rowId),\n unreadCount: (rowId) => unread.get(rowId) ?? 0,\n loadConversation: async (target, request) => fetchPage(target, request),\n persist: async (event) => { /* write one message, not the whole history */ },\n getAuthor: () => currentUserName,\n getSummaries: async ({ cursor, limit, query }) => fetchSummaries({ cursor, limit, query }),\n locateRow: async (rowId) => loadServerPageForRow(rowId), // required for app-paged / SSRM\n composerTools: [\n {\n id: \"complete\",\n label: \"Finalize offer\", // consumer copy \u2014 Resolve ticket, Complete request, \u2026\n onSelect: async (ctx) => {\n await completeRow(ctx.rowId); // your API\n ctx.close();\n },\n },\n ],\n};\n";
3
+ export declare const CHAT_SERVER_PAGE_SOURCE = "locateRow: async (rowId) => {\n const index = allRows.findIndex((row) => row.id === rowId);\n if (index < 0) return { status: \"missing\" };\n flushSync(() => setRowPage(Math.floor(index / pageSize)));\n return { status: \"ready\" };\n}";
4
+ export declare const CHAT_MEMBER_MAPPING_SOURCE = "type PeopleDto = {\n user_id: string\n display_name: string\n avatar_url?: string\n}\n\nasync function listPeople({ query, limit }: { query?: string; limit?: number } = {}) {\n const page = await fetch(`/conversations/people?q=${query ?? \"\"}&limit=${limit ?? 10}`)\n const json: { users: PeopleDto[] } = await page.json()\n return json.users.map((row) => ({\n id: row.user_id,\n name: row.display_name,\n avatarUrl: row.avatar_url,\n }))\n}\n\nchat.listPeople = listPeople\nchat.can = (action, context) => {\n if (action === \"invite\" || action === \"remove-member\") return isConversationAdmin(context.rowId)\n return undefined\n}\n";