@memberjunction/ng-conversations 6.2.0-edge.0 → 6.2.0-edge.1

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 (343) hide show
  1. package/README.md +35 -2
  2. package/dist/lib/components/active-tasks/active-tasks-panel.component.d.ts +19 -3
  3. package/dist/lib/components/active-tasks/active-tasks-panel.component.d.ts.map +1 -1
  4. package/dist/lib/components/active-tasks/active-tasks-panel.component.js +39 -7
  5. package/dist/lib/components/active-tasks/active-tasks-panel.component.js.map +1 -1
  6. package/dist/lib/components/agent/active-agent-indicator.component.d.ts +74 -6
  7. package/dist/lib/components/agent/active-agent-indicator.component.d.ts.map +1 -1
  8. package/dist/lib/components/agent/active-agent-indicator.component.js +111 -21
  9. package/dist/lib/components/agent/active-agent-indicator.component.js.map +1 -1
  10. package/dist/lib/components/agent/agent-process-panel.component.d.ts +31 -5
  11. package/dist/lib/components/agent/agent-process-panel.component.d.ts.map +1 -1
  12. package/dist/lib/components/agent/agent-process-panel.component.js +71 -15
  13. package/dist/lib/components/agent/agent-process-panel.component.js.map +1 -1
  14. package/dist/lib/components/artifact/artifact-share-modal.component.d.ts +65 -9
  15. package/dist/lib/components/artifact/artifact-share-modal.component.d.ts.map +1 -1
  16. package/dist/lib/components/artifact/artifact-share-modal.component.js +169 -57
  17. package/dist/lib/components/artifact/artifact-share-modal.component.js.map +1 -1
  18. package/dist/lib/components/attachment/image-viewer.component.d.ts +77 -11
  19. package/dist/lib/components/attachment/image-viewer.component.d.ts.map +1 -1
  20. package/dist/lib/components/attachment/image-viewer.component.js +181 -47
  21. package/dist/lib/components/attachment/image-viewer.component.js.map +1 -1
  22. package/dist/lib/components/collection/artifact-collection-picker-modal.component.d.ts +129 -19
  23. package/dist/lib/components/collection/artifact-collection-picker-modal.component.d.ts.map +1 -1
  24. package/dist/lib/components/collection/artifact-collection-picker-modal.component.js +350 -116
  25. package/dist/lib/components/collection/artifact-collection-picker-modal.component.js.map +1 -1
  26. package/dist/lib/components/collection/artifact-create-modal.component.d.ts +60 -8
  27. package/dist/lib/components/collection/artifact-create-modal.component.d.ts.map +1 -1
  28. package/dist/lib/components/collection/artifact-create-modal.component.js +130 -46
  29. package/dist/lib/components/collection/artifact-create-modal.component.js.map +1 -1
  30. package/dist/lib/components/collection/collection-artifact-card.component.d.ts +63 -3
  31. package/dist/lib/components/collection/collection-artifact-card.component.d.ts.map +1 -1
  32. package/dist/lib/components/collection/collection-artifact-card.component.js +113 -19
  33. package/dist/lib/components/collection/collection-artifact-card.component.js.map +1 -1
  34. package/dist/lib/components/collection/collection-form-modal.component.d.ts +54 -8
  35. package/dist/lib/components/collection/collection-form-modal.component.d.ts.map +1 -1
  36. package/dist/lib/components/collection/collection-form-modal.component.js +130 -46
  37. package/dist/lib/components/collection/collection-form-modal.component.js.map +1 -1
  38. package/dist/lib/components/collection/collection-share-modal.component.d.ts +70 -10
  39. package/dist/lib/components/collection/collection-share-modal.component.d.ts.map +1 -1
  40. package/dist/lib/components/collection/collection-share-modal.component.js +175 -53
  41. package/dist/lib/components/collection/collection-share-modal.component.js.map +1 -1
  42. package/dist/lib/components/collection/collection-tree.component.d.ts +89 -9
  43. package/dist/lib/components/collection/collection-tree.component.d.ts.map +1 -1
  44. package/dist/lib/components/collection/collection-tree.component.js +220 -70
  45. package/dist/lib/components/collection/collection-tree.component.js.map +1 -1
  46. package/dist/lib/components/collection/collection-view.component.d.ts +89 -11
  47. package/dist/lib/components/collection/collection-view.component.d.ts.map +1 -1
  48. package/dist/lib/components/collection/collection-view.component.js +154 -40
  49. package/dist/lib/components/collection/collection-view.component.js.map +1 -1
  50. package/dist/lib/components/collection/collections-full-view.component.d.ts +390 -38
  51. package/dist/lib/components/collection/collections-full-view.component.d.ts.map +1 -1
  52. package/dist/lib/components/collection/collections-full-view.component.js +951 -367
  53. package/dist/lib/components/collection/collections-full-view.component.js.map +1 -1
  54. package/dist/lib/components/composer/ai-composer.component.d.ts +213 -18
  55. package/dist/lib/components/composer/ai-composer.component.d.ts.map +1 -1
  56. package/dist/lib/components/composer/ai-composer.component.js +388 -44
  57. package/dist/lib/components/composer/ai-composer.component.js.map +1 -1
  58. package/dist/lib/components/conversation/conversation-agent-picker.component.d.ts +12 -1
  59. package/dist/lib/components/conversation/conversation-agent-picker.component.d.ts.map +1 -1
  60. package/dist/lib/components/conversation/conversation-agent-picker.component.js +26 -4
  61. package/dist/lib/components/conversation/conversation-agent-picker.component.js.map +1 -1
  62. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +1090 -123
  63. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
  64. package/dist/lib/components/conversation/conversation-chat-area.component.js +2399 -706
  65. package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
  66. package/dist/lib/components/conversation/conversation-empty-state.component.d.ts +139 -19
  67. package/dist/lib/components/conversation/conversation-empty-state.component.d.ts.map +1 -1
  68. package/dist/lib/components/conversation/conversation-empty-state.component.js +296 -59
  69. package/dist/lib/components/conversation/conversation-empty-state.component.js.map +1 -1
  70. package/dist/lib/components/conversation/conversation-list.component.d.ts +579 -78
  71. package/dist/lib/components/conversation/conversation-list.component.d.ts.map +1 -1
  72. package/dist/lib/components/conversation/conversation-list.component.js +2322 -823
  73. package/dist/lib/components/conversation/conversation-list.component.js.map +1 -1
  74. package/dist/lib/components/conversation/pinned-messages-panel.component.d.ts +40 -4
  75. package/dist/lib/components/conversation/pinned-messages-panel.component.d.ts.map +1 -1
  76. package/dist/lib/components/conversation/pinned-messages-panel.component.js +72 -14
  77. package/dist/lib/components/conversation/pinned-messages-panel.component.js.map +1 -1
  78. package/dist/lib/components/dialogs/input-dialog.component.d.ts +57 -11
  79. package/dist/lib/components/dialogs/input-dialog.component.d.ts.map +1 -1
  80. package/dist/lib/components/dialogs/input-dialog.component.js +128 -16
  81. package/dist/lib/components/dialogs/input-dialog.component.js.map +1 -1
  82. package/dist/lib/components/dialogs/rating-dialog.component.d.ts +68 -10
  83. package/dist/lib/components/dialogs/rating-dialog.component.d.ts.map +1 -1
  84. package/dist/lib/components/dialogs/rating-dialog.component.js +151 -27
  85. package/dist/lib/components/dialogs/rating-dialog.component.js.map +1 -1
  86. package/dist/lib/components/export/export-modal.component.d.ts +84 -10
  87. package/dist/lib/components/export/export-modal.component.d.ts.map +1 -1
  88. package/dist/lib/components/export/export-modal.component.js +173 -49
  89. package/dist/lib/components/export/export-modal.component.js.map +1 -1
  90. package/dist/lib/components/global-tasks/global-tasks-panel.component.d.ts +29 -3
  91. package/dist/lib/components/global-tasks/global-tasks-panel.component.d.ts.map +1 -1
  92. package/dist/lib/components/global-tasks/global-tasks-panel.component.js +58 -12
  93. package/dist/lib/components/global-tasks/global-tasks-panel.component.js.map +1 -1
  94. package/dist/lib/components/library/library-full-view.component.d.ts +57 -8
  95. package/dist/lib/components/library/library-full-view.component.d.ts.map +1 -1
  96. package/dist/lib/components/library/library-full-view.component.js +119 -35
  97. package/dist/lib/components/library/library-full-view.component.js.map +1 -1
  98. package/dist/lib/components/members/members-modal.component.d.ts +76 -10
  99. package/dist/lib/components/members/members-modal.component.d.ts.map +1 -1
  100. package/dist/lib/components/members/members-modal.component.js +164 -50
  101. package/dist/lib/components/members/members-modal.component.js.map +1 -1
  102. package/dist/lib/components/message/actionable-commands.component.d.ts +37 -5
  103. package/dist/lib/components/message/actionable-commands.component.d.ts.map +1 -1
  104. package/dist/lib/components/message/actionable-commands.component.js +82 -16
  105. package/dist/lib/components/message/actionable-commands.component.js.map +1 -1
  106. package/dist/lib/components/message/conversation-message-rating.component.d.ts +46 -10
  107. package/dist/lib/components/message/conversation-message-rating.component.d.ts.map +1 -1
  108. package/dist/lib/components/message/conversation-message-rating.component.js +120 -36
  109. package/dist/lib/components/message/conversation-message-rating.component.js.map +1 -1
  110. package/dist/lib/components/message/message-input.component.d.ts +549 -74
  111. package/dist/lib/components/message/message-input.component.d.ts.map +1 -1
  112. package/dist/lib/components/message/message-input.component.js +1250 -421
  113. package/dist/lib/components/message/message-input.component.js.map +1 -1
  114. package/dist/lib/components/message/message-item.component.d.ts +411 -29
  115. package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
  116. package/dist/lib/components/message/message-item.component.js +896 -222
  117. package/dist/lib/components/message/message-item.component.js.map +1 -1
  118. package/dist/lib/components/message/message-list.component.d.ts +288 -29
  119. package/dist/lib/components/message/message-list.component.d.ts.map +1 -1
  120. package/dist/lib/components/message/message-list.component.js +561 -123
  121. package/dist/lib/components/message/message-list.component.js.map +1 -1
  122. package/dist/lib/components/navigation/conversation-navigation.component.d.ts +64 -5
  123. package/dist/lib/components/navigation/conversation-navigation.component.d.ts.map +1 -1
  124. package/dist/lib/components/navigation/conversation-navigation.component.js +101 -11
  125. package/dist/lib/components/navigation/conversation-navigation.component.js.map +1 -1
  126. package/dist/lib/components/notification/activity-indicator.component.d.ts +6 -2
  127. package/dist/lib/components/notification/activity-indicator.component.d.ts.map +1 -1
  128. package/dist/lib/components/notification/activity-indicator.component.js +13 -3
  129. package/dist/lib/components/notification/activity-indicator.component.js.map +1 -1
  130. package/dist/lib/components/notification/notification-badge.component.d.ts +15 -3
  131. package/dist/lib/components/notification/notification-badge.component.d.ts.map +1 -1
  132. package/dist/lib/components/notification/notification-badge.component.js +36 -8
  133. package/dist/lib/components/notification/notification-badge.component.js.map +1 -1
  134. package/dist/lib/components/overlay/chat-overlay.component.d.ts +1 -1
  135. package/dist/lib/components/overlay/chat-overlay.component.js +4 -4
  136. package/dist/lib/components/overlay/chat-overlay.component.js.map +1 -1
  137. package/dist/lib/components/project/project-form-modal.component.d.ts +93 -11
  138. package/dist/lib/components/project/project-form-modal.component.d.ts.map +1 -1
  139. package/dist/lib/components/project/project-form-modal.component.js +348 -87
  140. package/dist/lib/components/project/project-form-modal.component.js.map +1 -1
  141. package/dist/lib/components/project/project-selector.component.d.ts +78 -8
  142. package/dist/lib/components/project/project-selector.component.d.ts.map +1 -1
  143. package/dist/lib/components/project/project-selector.component.js +177 -46
  144. package/dist/lib/components/project/project-selector.component.js.map +1 -1
  145. package/dist/lib/components/realtime/realtime-activity-rail.component.d.ts +1 -1
  146. package/dist/lib/components/realtime/realtime-activity-rail.component.js +2 -2
  147. package/dist/lib/components/realtime/realtime-activity-rail.component.js.map +1 -1
  148. package/dist/lib/components/realtime/realtime-delegation-card.component.d.ts +1 -1
  149. package/dist/lib/components/realtime/realtime-delegation-card.component.js +2 -2
  150. package/dist/lib/components/realtime/realtime-delegation-card.component.js.map +1 -1
  151. package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts +2 -2
  152. package/dist/lib/components/realtime/realtime-session-overlay.component.js +18 -18
  153. package/dist/lib/components/realtime/realtime-session-overlay.component.js.map +1 -1
  154. package/dist/lib/components/realtime/realtime-session-timeline-card.component.d.ts +47 -23
  155. package/dist/lib/components/realtime/realtime-session-timeline-card.component.d.ts.map +1 -1
  156. package/dist/lib/components/realtime/realtime-session-timeline-card.component.js +136 -92
  157. package/dist/lib/components/realtime/realtime-session-timeline-card.component.js.map +1 -1
  158. package/dist/lib/components/realtime/realtime-surface-tabs.component.d.ts +2 -2
  159. package/dist/lib/components/realtime/realtime-surface-tabs.component.js +4 -4
  160. package/dist/lib/components/realtime/realtime-surface-tabs.component.js.map +1 -1
  161. package/dist/lib/components/realtime/realtime-surface-tabs.model.d.ts +1 -1
  162. package/dist/lib/components/realtime/realtime-surface-tabs.model.js +3 -3
  163. package/dist/lib/components/realtime/realtime-surface-tabs.model.js.map +1 -1
  164. package/dist/lib/components/realtime/realtime-ui-config.d.ts +13 -11
  165. package/dist/lib/components/realtime/realtime-ui-config.d.ts.map +1 -1
  166. package/dist/lib/components/realtime/realtime-ui-config.js +29 -25
  167. package/dist/lib/components/realtime/realtime-ui-config.js.map +1 -1
  168. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.d.ts +3 -1
  169. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.d.ts.map +1 -1
  170. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.js +6 -2
  171. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.js.map +1 -1
  172. package/dist/lib/components/search/search-panel.component.d.ts +133 -22
  173. package/dist/lib/components/search/search-panel.component.d.ts.map +1 -1
  174. package/dist/lib/components/search/search-panel.component.js +312 -83
  175. package/dist/lib/components/search/search-panel.component.js.map +1 -1
  176. package/dist/lib/components/share/share-modal.component.d.ts +69 -9
  177. package/dist/lib/components/share/share-modal.component.d.ts.map +1 -1
  178. package/dist/lib/components/share/share-modal.component.js +139 -31
  179. package/dist/lib/components/share/share-modal.component.js.map +1 -1
  180. package/dist/lib/components/shared/user-picker.component.d.ts +48 -8
  181. package/dist/lib/components/shared/user-picker.component.d.ts.map +1 -1
  182. package/dist/lib/components/shared/user-picker.component.js +110 -30
  183. package/dist/lib/components/shared/user-picker.component.js.map +1 -1
  184. package/dist/lib/components/sidebar/conversation-sidebar.component.d.ts +114 -11
  185. package/dist/lib/components/sidebar/conversation-sidebar.component.d.ts.map +1 -1
  186. package/dist/lib/components/sidebar/conversation-sidebar.component.js +199 -21
  187. package/dist/lib/components/sidebar/conversation-sidebar.component.js.map +1 -1
  188. package/dist/lib/components/sidebar/routines-section.component.d.ts +20 -1
  189. package/dist/lib/components/sidebar/routines-section.component.d.ts.map +1 -1
  190. package/dist/lib/components/sidebar/routines-section.component.js +25 -5
  191. package/dist/lib/components/sidebar/routines-section.component.js.map +1 -1
  192. package/dist/lib/components/slots/slot-interfaces.d.ts +19 -0
  193. package/dist/lib/components/slots/slot-interfaces.d.ts.map +1 -1
  194. package/dist/lib/components/slots/slot-interfaces.js.map +1 -1
  195. package/dist/lib/components/task/tasks-full-view.component.d.ts +95 -13
  196. package/dist/lib/components/task/tasks-full-view.component.d.ts.map +1 -1
  197. package/dist/lib/components/task/tasks-full-view.component.js +223 -75
  198. package/dist/lib/components/task/tasks-full-view.component.js.map +1 -1
  199. package/dist/lib/components/tasks/task-widget.component.d.ts +46 -6
  200. package/dist/lib/components/tasks/task-widget.component.d.ts.map +1 -1
  201. package/dist/lib/components/tasks/task-widget.component.js +100 -16
  202. package/dist/lib/components/tasks/task-widget.component.js.map +1 -1
  203. package/dist/lib/components/tasks/tasks-dropdown.component.d.ts +64 -7
  204. package/dist/lib/components/tasks/tasks-dropdown.component.d.ts.map +1 -1
  205. package/dist/lib/components/tasks/tasks-dropdown.component.js +127 -27
  206. package/dist/lib/components/tasks/tasks-dropdown.component.js.map +1 -1
  207. package/dist/lib/components/thread/thread-panel.component.d.ts +66 -8
  208. package/dist/lib/components/thread/thread-panel.component.d.ts.map +1 -1
  209. package/dist/lib/components/thread/thread-panel.component.js +146 -36
  210. package/dist/lib/components/thread/thread-panel.component.js.map +1 -1
  211. package/dist/lib/components/toast/toast.component.d.ts +11 -1
  212. package/dist/lib/components/toast/toast.component.d.ts.map +1 -1
  213. package/dist/lib/components/toast/toast.component.js +25 -5
  214. package/dist/lib/components/toast/toast.component.js.map +1 -1
  215. package/dist/lib/components/workspace/conversation-workspace.component.d.ts +385 -42
  216. package/dist/lib/components/workspace/conversation-workspace.component.d.ts.map +1 -1
  217. package/dist/lib/components/workspace/conversation-workspace.component.js +887 -291
  218. package/dist/lib/components/workspace/conversation-workspace.component.js.map +1 -1
  219. package/dist/lib/composer-plugins/base-conversation-mention.provider.d.ts +8 -0
  220. package/dist/lib/composer-plugins/base-conversation-mention.provider.d.ts.map +1 -1
  221. package/dist/lib/composer-plugins/base-conversation-mention.provider.js +8 -1
  222. package/dist/lib/composer-plugins/base-conversation-mention.provider.js.map +1 -1
  223. package/dist/lib/directives/chat-slot.directive.d.ts +5 -1
  224. package/dist/lib/directives/chat-slot.directive.d.ts.map +1 -1
  225. package/dist/lib/directives/chat-slot.directive.js.map +1 -1
  226. package/dist/lib/directives/search-shortcut.directive.d.ts +9 -1
  227. package/dist/lib/directives/search-shortcut.directive.d.ts.map +1 -1
  228. package/dist/lib/directives/search-shortcut.directive.js +14 -4
  229. package/dist/lib/directives/search-shortcut.directive.js.map +1 -1
  230. package/dist/lib/events/chat-events.d.ts +34 -7
  231. package/dist/lib/events/chat-events.d.ts.map +1 -1
  232. package/dist/lib/events/chat-events.js +37 -7
  233. package/dist/lib/events/chat-events.js.map +1 -1
  234. package/dist/lib/models/agent-turn.model.d.ts +103 -0
  235. package/dist/lib/models/agent-turn.model.d.ts.map +1 -0
  236. package/dist/lib/models/agent-turn.model.js +12 -0
  237. package/dist/lib/models/agent-turn.model.js.map +1 -0
  238. package/dist/lib/models/collection-view.model.js.map +1 -1
  239. package/dist/lib/models/conversation-state.model.d.ts +8 -0
  240. package/dist/lib/models/conversation-state.model.d.ts.map +1 -1
  241. package/dist/lib/models/conversation-state.model.js.map +1 -1
  242. package/dist/lib/models/lazy-artifact-info.d.ts +44 -12
  243. package/dist/lib/models/lazy-artifact-info.d.ts.map +1 -1
  244. package/dist/lib/models/lazy-artifact-info.js +98 -34
  245. package/dist/lib/models/lazy-artifact-info.js.map +1 -1
  246. package/dist/lib/services/active-tasks.service.d.ts +30 -4
  247. package/dist/lib/services/active-tasks.service.d.ts.map +1 -1
  248. package/dist/lib/services/active-tasks.service.js +71 -19
  249. package/dist/lib/services/active-tasks.service.js.map +1 -1
  250. package/dist/lib/services/agent-state.service.d.ts +17 -1
  251. package/dist/lib/services/agent-state.service.d.ts.map +1 -1
  252. package/dist/lib/services/agent-state.service.js +48 -16
  253. package/dist/lib/services/agent-state.service.js.map +1 -1
  254. package/dist/lib/services/artifact-permission.service.d.ts +39 -0
  255. package/dist/lib/services/artifact-permission.service.d.ts.map +1 -1
  256. package/dist/lib/services/artifact-permission.service.js +152 -17
  257. package/dist/lib/services/artifact-permission.service.js.map +1 -1
  258. package/dist/lib/services/artifact-state.service.d.ts +58 -5
  259. package/dist/lib/services/artifact-state.service.d.ts.map +1 -1
  260. package/dist/lib/services/artifact-state.service.js +135 -35
  261. package/dist/lib/services/artifact-state.service.js.map +1 -1
  262. package/dist/lib/services/collection-permission.service.d.ts +28 -0
  263. package/dist/lib/services/collection-permission.service.d.ts.map +1 -1
  264. package/dist/lib/services/collection-permission.service.js +88 -32
  265. package/dist/lib/services/collection-permission.service.js.map +1 -1
  266. package/dist/lib/services/collection-state.service.d.ts +11 -1
  267. package/dist/lib/services/collection-state.service.d.ts.map +1 -1
  268. package/dist/lib/services/collection-state.service.js +25 -5
  269. package/dist/lib/services/collection-state.service.js.map +1 -1
  270. package/dist/lib/services/conversation-agent.service.d.ts +26 -4
  271. package/dist/lib/services/conversation-agent.service.d.ts.map +1 -1
  272. package/dist/lib/services/conversation-agent.service.js +57 -18
  273. package/dist/lib/services/conversation-agent.service.js.map +1 -1
  274. package/dist/lib/services/conversation-attachment.service.d.ts +17 -0
  275. package/dist/lib/services/conversation-attachment.service.d.ts.map +1 -1
  276. package/dist/lib/services/conversation-attachment.service.js +38 -10
  277. package/dist/lib/services/conversation-attachment.service.js.map +1 -1
  278. package/dist/lib/services/conversation-streaming.service.d.ts +22 -0
  279. package/dist/lib/services/conversation-streaming.service.d.ts.map +1 -1
  280. package/dist/lib/services/conversation-streaming.service.js +50 -10
  281. package/dist/lib/services/conversation-streaming.service.js.map +1 -1
  282. package/dist/lib/services/data-cache.service.d.ts +31 -0
  283. package/dist/lib/services/data-cache.service.d.ts.map +1 -1
  284. package/dist/lib/services/data-cache.service.js +71 -15
  285. package/dist/lib/services/data-cache.service.js.map +1 -1
  286. package/dist/lib/services/dialog.service.d.ts +13 -0
  287. package/dist/lib/services/dialog.service.d.ts.map +1 -1
  288. package/dist/lib/services/dialog.service.js +25 -5
  289. package/dist/lib/services/dialog.service.js.map +1 -1
  290. package/dist/lib/services/export.service.d.ts +2 -0
  291. package/dist/lib/services/export.service.d.ts.map +1 -1
  292. package/dist/lib/services/export.service.js +5 -1
  293. package/dist/lib/services/export.service.js.map +1 -1
  294. package/dist/lib/services/mention-parser.service.d.ts +10 -0
  295. package/dist/lib/services/mention-parser.service.d.ts.map +1 -1
  296. package/dist/lib/services/mention-parser.service.js +25 -5
  297. package/dist/lib/services/mention-parser.service.js.map +1 -1
  298. package/dist/lib/services/notification.service.d.ts +54 -6
  299. package/dist/lib/services/notification.service.d.ts.map +1 -1
  300. package/dist/lib/services/notification.service.js +123 -27
  301. package/dist/lib/services/notification.service.js.map +1 -1
  302. package/dist/lib/services/realtime-audio-recorder.d.ts +4 -4
  303. package/dist/lib/services/realtime-audio-recorder.js +12 -12
  304. package/dist/lib/services/realtime-audio-recorder.js.map +1 -1
  305. package/dist/lib/services/realtime-pcm-wav.d.ts +4 -0
  306. package/dist/lib/services/realtime-pcm-wav.d.ts.map +1 -1
  307. package/dist/lib/services/realtime-pcm-wav.js +10 -2
  308. package/dist/lib/services/realtime-pcm-wav.js.map +1 -1
  309. package/dist/lib/services/search.service.d.ts +42 -9
  310. package/dist/lib/services/search.service.d.ts.map +1 -1
  311. package/dist/lib/services/search.service.js +103 -23
  312. package/dist/lib/services/search.service.js.map +1 -1
  313. package/dist/lib/services/toast.service.d.ts +19 -1
  314. package/dist/lib/services/toast.service.d.ts.map +1 -1
  315. package/dist/lib/services/toast.service.js +45 -9
  316. package/dist/lib/services/toast.service.js.map +1 -1
  317. package/dist/lib/services/ui-command-handler.service.d.ts +16 -2
  318. package/dist/lib/services/ui-command-handler.service.d.ts.map +1 -1
  319. package/dist/lib/services/ui-command-handler.service.js +36 -8
  320. package/dist/lib/services/ui-command-handler.service.js.map +1 -1
  321. package/dist/lib/utils/agent-artifact-summary.d.ts +2 -2
  322. package/dist/lib/utils/agent-artifact-summary.js +3 -3
  323. package/dist/lib/utils/agent-artifact-summary.js.map +1 -1
  324. package/dist/lib/utils/agent-turn-routing.d.ts +69 -0
  325. package/dist/lib/utils/agent-turn-routing.d.ts.map +1 -0
  326. package/dist/lib/utils/agent-turn-routing.js +96 -0
  327. package/dist/lib/utils/agent-turn-routing.js.map +1 -0
  328. package/dist/lib/utils/artifact-panel-action.d.ts +15 -4
  329. package/dist/lib/utils/artifact-panel-action.d.ts.map +1 -1
  330. package/dist/lib/utils/artifact-panel-action.js +10 -2
  331. package/dist/lib/utils/artifact-panel-action.js.map +1 -1
  332. package/dist/lib/utils/distinct-artifacts.d.ts +2 -0
  333. package/dist/lib/utils/distinct-artifacts.d.ts.map +1 -1
  334. package/dist/lib/utils/distinct-artifacts.js +5 -1
  335. package/dist/lib/utils/distinct-artifacts.js.map +1 -1
  336. package/dist/lib/utils/plan-mode-preference.d.ts +2 -2
  337. package/dist/lib/utils/plan-mode-preference.js +6 -6
  338. package/dist/lib/utils/plan-mode-preference.js.map +1 -1
  339. package/dist/public-api.d.ts +3 -0
  340. package/dist/public-api.d.ts.map +1 -1
  341. package/dist/public-api.js +3 -0
  342. package/dist/public-api.js.map +1 -1
  343. package/package.json +32 -32
@@ -8,32 +8,75 @@ function ProjectFormModalComponent_Conditional_11_Template(rf, ctx) { if (rf & 1
8
8
  i0.ɵɵtext(1, "Folder name is required");
9
9
  i0.ɵɵelementEnd();
10
10
  } }
11
- function ProjectFormModalComponent_For_22_Template(rf, ctx) { if (rf & 1) {
11
+ function ProjectFormModalComponent_Conditional_17_Template(rf, ctx) { if (rf & 1) {
12
+ i0.ɵɵelementStart(0, "fieldset", 11)(1, "legend");
13
+ i0.ɵɵtext(2, "Visibility");
14
+ i0.ɵɵelementEnd();
15
+ i0.ɵɵelementStart(3, "p", 23);
16
+ i0.ɵɵelement(4, "i", 24);
17
+ i0.ɵɵtext(5, " Shared with everyone ");
18
+ i0.ɵɵelementEnd();
19
+ i0.ɵɵelementStart(6, "p", 25);
20
+ i0.ɵɵtext(7, " A shared folder stays shared. To keep something to yourself, create a new private folder and move it there. ");
21
+ i0.ɵɵelementEnd()();
22
+ } }
23
+ function ProjectFormModalComponent_Conditional_18_Template(rf, ctx) { if (rf & 1) {
12
24
  const _r1 = i0.ɵɵgetCurrentView();
13
- i0.ɵɵelementStart(0, "button", 22);
14
- i0.ɵɵlistener("click", function ProjectFormModalComponent_For_22_Template_button_click_0_listener() { const color_r2 = i0.ɵɵrestoreView(_r1).$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.selectColor(color_r2)); });
25
+ i0.ɵɵelementStart(0, "fieldset", 11)(1, "legend");
26
+ i0.ɵɵtext(2, "Visibility");
27
+ i0.ɵɵelementEnd();
28
+ i0.ɵɵelementStart(3, "label", 26)(4, "input", 27);
29
+ i0.ɵɵtwoWayListener("ngModelChange", function ProjectFormModalComponent_Conditional_18_Template_input_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.FormData.isPersonal, $event) || (ctx_r1.FormData.isPersonal = $event); return i0.ɵɵresetView($event); });
15
30
  i0.ɵɵelementEnd();
31
+ i0.ɵɵelementStart(5, "span");
32
+ i0.ɵɵtext(6, "Only me");
33
+ i0.ɵɵelementEnd()();
34
+ i0.ɵɵelementStart(7, "label", 26)(8, "input", 27);
35
+ i0.ɵɵtwoWayListener("ngModelChange", function ProjectFormModalComponent_Conditional_18_Template_input_ngModelChange_8_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.FormData.isPersonal, $event) || (ctx_r1.FormData.isPersonal = $event); return i0.ɵɵresetView($event); });
36
+ i0.ɵɵelementEnd();
37
+ i0.ɵɵelementStart(9, "span");
38
+ i0.ɵɵtext(10, "Everyone");
39
+ i0.ɵɵelementEnd()();
40
+ i0.ɵɵelementStart(11, "p", 25);
41
+ i0.ɵɵtext(12);
42
+ i0.ɵɵelementEnd()();
16
43
  } if (rf & 2) {
17
- const color_r2 = ctx.$implicit;
18
- const ctx_r2 = i0.ɵɵnextContext();
19
- i0.ɵɵstyleProp("background-color", color_r2);
20
- i0.ɵɵclassProp("selected", ctx_r2.formData.color === color_r2);
21
- i0.ɵɵproperty("title", color_r2);
44
+ const ctx_r1 = i0.ɵɵnextContext();
45
+ i0.ɵɵadvance(4);
46
+ i0.ɵɵproperty("value", true);
47
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.FormData.isPersonal);
48
+ i0.ɵɵadvance(4);
49
+ i0.ɵɵproperty("value", false);
50
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.FormData.isPersonal);
51
+ i0.ɵɵadvance(4);
52
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.FormData.isPersonal ? "Only you can see this folder." : "Everyone can see this folder and its name. They will not see the conversations you keep in it.", " ");
22
53
  } }
23
- function ProjectFormModalComponent_For_34_Template(rf, ctx) { if (rf & 1) {
24
- const _r4 = i0.ɵɵgetCurrentView();
25
- i0.ɵɵelementStart(0, "button", 23);
26
- i0.ɵɵlistener("click", function ProjectFormModalComponent_For_34_Template_button_click_0_listener() { const icon_r5 = i0.ɵɵrestoreView(_r4).$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.selectIcon(icon_r5)); });
54
+ function ProjectFormModalComponent_For_25_Template(rf, ctx) { if (rf & 1) {
55
+ const _r3 = i0.ɵɵgetCurrentView();
56
+ i0.ɵɵelementStart(0, "button", 28);
57
+ i0.ɵɵlistener("click", function ProjectFormModalComponent_For_25_Template_button_click_0_listener() { const color_r4 = i0.ɵɵrestoreView(_r3).$implicit; const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.selectColor(color_r4)); });
58
+ i0.ɵɵelementEnd();
59
+ } if (rf & 2) {
60
+ const color_r4 = ctx.$implicit;
61
+ const ctx_r1 = i0.ɵɵnextContext();
62
+ i0.ɵɵstyleProp("background-color", color_r4);
63
+ i0.ɵɵclassProp("selected", ctx_r1.formData.color === color_r4);
64
+ i0.ɵɵproperty("title", color_r4);
65
+ } }
66
+ function ProjectFormModalComponent_For_37_Template(rf, ctx) { if (rf & 1) {
67
+ const _r5 = i0.ɵɵgetCurrentView();
68
+ i0.ɵɵelementStart(0, "button", 29);
69
+ i0.ɵɵlistener("click", function ProjectFormModalComponent_For_37_Template_button_click_0_listener() { const icon_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.selectIcon(icon_r6)); });
27
70
  i0.ɵɵelement(1, "i");
28
71
  i0.ɵɵelementEnd();
29
72
  } if (rf & 2) {
30
- const icon_r5 = ctx.$implicit;
31
- const ctx_r2 = i0.ɵɵnextContext();
32
- i0.ɵɵstyleProp("color", ctx_r2.formData.icon === icon_r5 ? ctx_r2.formData.color : null);
33
- i0.ɵɵclassProp("selected", ctx_r2.formData.icon === icon_r5);
34
- i0.ɵɵproperty("title", icon_r5);
73
+ const icon_r6 = ctx.$implicit;
74
+ const ctx_r1 = i0.ɵɵnextContext();
75
+ i0.ɵɵstyleProp("color", ctx_r1.formData.icon === icon_r6 ? ctx_r1.formData.color : null);
76
+ i0.ɵɵclassProp("selected", ctx_r1.formData.icon === icon_r6);
77
+ i0.ɵɵproperty("title", icon_r6);
35
78
  i0.ɵɵadvance();
36
- i0.ɵɵclassMap(i0.ɵɵinterpolate1("fa-solid ", icon_r5));
79
+ i0.ɵɵclassMap(i0.ɵɵinterpolate1("fa-solid ", icon_r6));
37
80
  } }
38
81
  const DEFAULT_PROJECT_COLORS = [
39
82
  '#0076B6', // MJ Blue
@@ -81,98 +124,253 @@ const DEFAULT_PROJECT_ICONS = [
81
124
  ];
82
125
  export class ProjectFormModalComponent extends BaseAngularComponent {
83
126
  cdr;
84
- dialogRef;
85
- project = null;
86
- environmentId;
87
- currentUser;
127
+ DialogRef;
128
+ /** @deprecated Use {@link DialogRef}. */
129
+ set dialogRef(value) {
130
+ this.DialogRef = value;
131
+ }
132
+ /** @deprecated Use {@link DialogRef}. */
133
+ get dialogRef() {
134
+ return this.DialogRef;
135
+ }
136
+ Project = null;
137
+ /** @deprecated Use {@link Project}. */
138
+ set project(value) {
139
+ this.Project = value;
140
+ }
141
+ /** @deprecated Use {@link Project}. */
142
+ get project() {
143
+ return this.Project;
144
+ }
145
+ EnvironmentId;
146
+ /** @deprecated Use {@link EnvironmentId}. */
147
+ set environmentId(value) {
148
+ this.EnvironmentId = value;
149
+ }
150
+ /** @deprecated Use {@link EnvironmentId}. */
151
+ get environmentId() {
152
+ return this.EnvironmentId;
153
+ }
154
+ CurrentUser;
155
+ /** @deprecated Use {@link CurrentUser}. */
156
+ set currentUser(value) {
157
+ this.CurrentUser = value;
158
+ }
159
+ /** @deprecated Use {@link CurrentUser}. */
160
+ get currentUser() {
161
+ return this.CurrentUser;
162
+ }
88
163
  /** When creating a new folder, the parent folder ID for nesting (null = top level). */
89
- parentId = null;
90
- projectSaved = new EventEmitter();
91
- formData = {
164
+ ParentId = null;
165
+ /** @deprecated Use {@link ParentId}. */
166
+ set parentId(value) {
167
+ this.ParentId = value;
168
+ }
169
+ /** @deprecated Use {@link ParentId}. */
170
+ get parentId() {
171
+ return this.ParentId;
172
+ }
173
+ ProjectSaved = new EventEmitter();
174
+ /**
175
+ * @deprecated Use {@link ProjectSaved}.
176
+ *
177
+ * The same emitter under the old binding name, so a template still binding
178
+ * (projectSaved) keeps working. Must stay AFTER ProjectSaved: class fields
179
+ * initialise in order, and the other way round this captures undefined.
180
+ */
181
+ projectSaved = this.ProjectSaved;
182
+ FormData = {
92
183
  name: '',
93
184
  description: '',
94
185
  color: '#0076B6',
95
- icon: 'fa-folder'
186
+ icon: 'fa-folder',
187
+ // A NEW folder is personal by default. The conversation sidebar is a personal
188
+ // surface — the conversations in it are already bound to their owner — so a
189
+ // folder everyone can see is the surprising option, not the private one. Folder
190
+ // NAMES are user-authored free text, and before OwnerUserID existed every one of
191
+ // them was readable by every user of the environment, which is what prompted
192
+ // this. Existing folders are untouched: they carry NULL, which still means shared.
193
+ isPersonal: true
96
194
  };
97
- showNameError = false;
98
- isEditMode = false;
99
- availableColors = DEFAULT_PROJECT_COLORS;
100
- availableIcons = DEFAULT_PROJECT_ICONS;
195
+ /** @deprecated Use {@link FormData}. */
196
+ get formData() {
197
+ return this.FormData;
198
+ }
199
+ /** @deprecated Use {@link FormData}. */
200
+ set formData(value) {
201
+ this.FormData = value;
202
+ }
203
+ ShowNameError = false;
204
+ /** @deprecated Use {@link ShowNameError}. */
205
+ get showNameError() {
206
+ return this.ShowNameError;
207
+ }
208
+ /** @deprecated Use {@link ShowNameError}. */
209
+ set showNameError(value) {
210
+ this.ShowNameError = value;
211
+ }
212
+ IsEditMode = false;
213
+ /** @deprecated Use {@link IsEditMode}. */
214
+ get isEditMode() {
215
+ return this.IsEditMode;
216
+ }
217
+ /** @deprecated Use {@link IsEditMode}. */
218
+ set isEditMode(value) {
219
+ this.IsEditMode = value;
220
+ }
221
+ AvailableColors = DEFAULT_PROJECT_COLORS;
222
+ /** @deprecated Use {@link AvailableColors}. */
223
+ get availableColors() {
224
+ return this.AvailableColors;
225
+ }
226
+ /** @deprecated Use {@link AvailableColors}. */
227
+ set availableColors(value) {
228
+ this.AvailableColors = value;
229
+ }
230
+ AvailableIcons = DEFAULT_PROJECT_ICONS;
231
+ /** @deprecated Use {@link AvailableIcons}. */
232
+ get availableIcons() {
233
+ return this.AvailableIcons;
234
+ }
235
+ /** @deprecated Use {@link AvailableIcons}. */
236
+ set availableIcons(value) {
237
+ this.AvailableIcons = value;
238
+ }
239
+ /**
240
+ * True when this dialog is editing a folder that is currently SHARED — in which case
241
+ * visibility is shown as a statement rather than a control.
242
+ *
243
+ * Sharing is one-way by design, and the reason is in the data model rather than the UI.
244
+ * NULL-means-shared conflates "shared" with "unowned": the moment a folder is shared its
245
+ * `OwnerUserID` goes to NULL and there is no column anywhere recording who created it
246
+ * (`Project` has `__mj_CreatedAt`, but no created-by). So `OwnerUserID = currentUser.ID`
247
+ * on a shared folder is indistinguishable from any other user claiming it — the system
248
+ * cannot tell reclaiming from appropriating, which makes "take it back" an affordance
249
+ * that was never really there.
250
+ *
251
+ * What that would cost on day one is the deciding argument. Every folder that exists
252
+ * today carries NULL, so without this the whole team's folder structure — subfolders
253
+ * included — is one radio button away from belonging to whichever person opens its
254
+ * settings first. A confirm does not fix that; it only narrates it.
255
+ *
256
+ * Personal -> shared stays available, because it only ever adds. Someone who wants a
257
+ * private copy makes a private folder. If personal folders later grow features that need
258
+ * a stable creator (sharing with named users, transfer, recovering a departed employee's
259
+ * folders), the fix is a separate IsShared flag so ownership stops being erased by
260
+ * sharing — a bigger change, and deliberately not this one.
261
+ */
262
+ get VisibilityIsLocked() {
263
+ return this.IsEditMode && !this.Project?.OwnerUserID;
264
+ }
101
265
  /** Translucent tint of the selected color, used behind the preview/icon glyph. */
102
- get chipBackground() {
103
- const hex = this.formData.color || '#0076B6';
266
+ get ChipBackground() {
267
+ const hex = this.FormData.color || '#0076B6';
104
268
  // 8-digit hex (#RRGGBBAA) — ~14% alpha tint of the chosen color
105
269
  return /^#[0-9a-fA-F]{6}$/.test(hex) ? `${hex}24` : hex;
106
270
  }
271
+ /** @deprecated Use {@link ChipBackground}. */
272
+ get chipBackground() {
273
+ return this.ChipBackground;
274
+ }
107
275
  constructor(cdr) {
108
276
  super();
109
277
  this.cdr = cdr;
110
278
  }
111
279
  ngOnInit() {
112
- this.isEditMode = this.project != null;
113
- if (this.project) {
280
+ this.IsEditMode = this.Project != null;
281
+ if (this.Project) {
114
282
  this.loadProjectData();
115
283
  }
116
284
  }
117
285
  loadProjectData() {
118
- if (!this.project)
286
+ if (!this.Project)
119
287
  return;
120
- this.formData = {
121
- name: this.project.Name || '',
122
- description: this.project.Description || '',
123
- color: this.project.Color || '#0076B6',
124
- icon: this.project.Icon || 'fa-folder'
288
+ this.FormData = {
289
+ name: this.Project.Name || '',
290
+ description: this.Project.Description || '',
291
+ color: this.Project.Color || '#0076B6',
292
+ icon: this.Project.Icon || 'fa-folder',
293
+ // Reflect what the folder IS, not the create-time default — otherwise opening
294
+ // a shared folder's settings and pressing Save would silently make it private.
295
+ isPersonal: !!this.Project.OwnerUserID
125
296
  };
126
297
  }
298
+ SelectColor(color) {
299
+ this.FormData.color = color;
300
+ this.cdr.detectChanges();
301
+ }
302
+ /** @deprecated Use {@link SelectColor}. */
127
303
  selectColor(color) {
128
- this.formData.color = color;
304
+ return this.SelectColor(color);
305
+ }
306
+ SelectIcon(icon) {
307
+ this.FormData.icon = icon;
129
308
  this.cdr.detectChanges();
130
309
  }
310
+ /** @deprecated Use {@link SelectIcon}. */
131
311
  selectIcon(icon) {
132
- this.formData.icon = icon;
133
- this.cdr.detectChanges();
312
+ return this.SelectIcon(icon);
134
313
  }
135
- async onSave() {
314
+ async OnSave() {
136
315
  // Validate
137
- if (!this.formData.name.trim()) {
138
- this.showNameError = true;
316
+ if (!this.FormData.name.trim()) {
317
+ this.ShowNameError = true;
139
318
  this.cdr.detectChanges();
140
319
  return;
141
320
  }
142
- this.showNameError = false;
321
+ this.ShowNameError = false;
143
322
  try {
144
323
  const md = this.ProviderToUse;
145
- const project = this.project || await md.GetEntityObject('MJ: Projects', this.currentUser);
146
- project.Name = this.formData.name.trim();
147
- project.Description = this.formData.description.trim() || null;
148
- project.Color = this.formData.color;
149
- project.Icon = this.formData.icon;
150
- if (!this.isEditMode) {
151
- project.EnvironmentID = this.environmentId;
324
+ // A shared folder cannot be taken private — the control is not rendered for one
325
+ // (see VisibilityIsLocked). This is the same rule expressed where the write happens,
326
+ // so a future template change, a stale `formData` from a reopened dialog, or anything
327
+ // else that sets the flag cannot quietly appropriate a folder the whole team uses.
328
+ // It resolves to the folder's CURRENT state, so it is a no-op in every other case.
329
+ const isPersonal = this.VisibilityIsLocked ? false : this.FormData.isPersonal;
330
+ const project = this.Project || await md.GetEntityObject('MJ: Projects', this.CurrentUser);
331
+ project.Name = this.FormData.name.trim();
332
+ project.Description = this.FormData.description.trim() || null;
333
+ project.Color = this.FormData.color;
334
+ project.Icon = this.FormData.icon;
335
+ // Settable on edit, in one direction: a personal folder can be shared with the team.
336
+ // Null means shared, which is what every folder created before this column existed
337
+ // carries — and, because sharing erases the owner, is also why the reverse is not on
338
+ // offer. See VisibilityIsLocked.
339
+ project.OwnerUserID = isPersonal ? this.CurrentUser.ID : null;
340
+ if (!this.IsEditMode) {
341
+ project.EnvironmentID = this.EnvironmentId;
152
342
  project.IsArchived = false;
153
- if (this.parentId) {
154
- project.ParentID = this.parentId;
343
+ if (this.ParentId) {
344
+ project.ParentID = this.ParentId;
155
345
  }
156
346
  }
157
347
  const saved = await project.Save();
158
348
  if (saved) {
159
- this.projectSaved.emit(project);
160
- this.dialogRef.Close();
349
+ this.ProjectSaved.emit(project);
350
+ this.DialogRef.Close();
161
351
  }
162
352
  else {
163
- throw new Error('Failed to save project');
353
+ // Save() records WHY it refused on LatestResult and returns false — a
354
+ // server refusal, a constraint violation, a failed validation. Reporting
355
+ // a generic message here would throw the only copy of that reason away.
356
+ throw new Error(project.LatestResult?.CompleteMessage || 'The save was refused with no reason given.');
164
357
  }
165
358
  }
166
359
  catch (error) {
167
360
  console.error('Error saving project:', error);
168
- alert('Failed to save project. Please try again.');
361
+ const reason = error instanceof Error ? error.message : String(error);
362
+ alert(`Failed to save folder.\n\n${reason}`);
169
363
  }
170
364
  }
365
+ /** @deprecated Use {@link OnSave}. */
366
+ async onSave() {
367
+ return this.OnSave();
368
+ }
171
369
  onCancel() {
172
- this.dialogRef.Close();
370
+ this.DialogRef.Close();
173
371
  }
174
372
  static ɵfac = function ProjectFormModalComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ProjectFormModalComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
175
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ProjectFormModalComponent, selectors: [["mj-project-form-modal"]], inputs: { dialogRef: "dialogRef", project: "project", environmentId: "environmentId", currentUser: "currentUser", parentId: "parentId" }, outputs: { projectSaved: "projectSaved" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 40, vars: 18, consts: [[3, "Close", "Title", "Width", "MinWidth", "Visible"], [1, "project-form"], [1, "folder-preview"], [1, "folder-preview-chip"], [1, "folder-preview-name"], [1, "form-field"], ["for", "projectName", 1, "required"], ["id", "projectName", "type", "text", "placeholder", "e.g. Client work, Research, Ideas", "autofocus", "", 1, "mj-input", "full-width", 3, "ngModelChange", "keydown.enter", "ngModel"], [1, "error-message"], ["for", "projectDescription"], ["id", "projectDescription", "placeholder", "What goes in this folder? (optional)", "rows", "2", 1, "mj-textarea", "full-width", 3, "ngModelChange", "ngModel"], [1, "color-picker-section"], [1, "color-palette"], ["type", "button", 1, "color-swatch", 3, "selected", "backgroundColor", "title"], [1, "custom-color-input"], ["for", "customColor"], ["id", "customColor", "type", "color", 1, "custom-color-picker", 3, "ngModelChange", "ngModel"], [1, "color-value"], [1, "icon-grid"], ["type", "button", 1, "icon-option", 3, "selected", "color", "title"], ["mjButton", "", "variant", "primary", 3, "click"], ["mjButton", "", 3, "click"], ["type", "button", 1, "color-swatch", 3, "click", "title"], ["type", "button", 1, "icon-option", 3, "click", "title"]], template: function ProjectFormModalComponent_Template(rf, ctx) { if (rf & 1) {
373
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ProjectFormModalComponent, selectors: [["mj-project-form-modal"]], inputs: { DialogRef: "DialogRef", dialogRef: "dialogRef", Project: "Project", project: "project", EnvironmentId: "EnvironmentId", environmentId: "environmentId", CurrentUser: "CurrentUser", currentUser: "currentUser", ParentId: "ParentId", parentId: "parentId" }, outputs: { ProjectSaved: "ProjectSaved", projectSaved: "projectSaved" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 43, vars: 19, consts: [[3, "Close", "Title", "Width", "MinWidth", "Visible"], [1, "project-form"], [1, "folder-preview"], [1, "folder-preview-chip"], [1, "folder-preview-name"], [1, "form-field"], ["for", "projectName", 1, "required"], ["id", "projectName", "type", "text", "placeholder", "e.g. Client work, Research, Ideas", "autofocus", "", 1, "mj-input", "full-width", 3, "ngModelChange", "keydown.enter", "ngModel"], [1, "error-message"], ["for", "projectDescription"], ["id", "projectDescription", "placeholder", "What goes in this folder? (optional)", "rows", "2", 1, "mj-textarea", "full-width", 3, "ngModelChange", "ngModel"], ["aria-describedby", "projectVisibilityHint", 1, "visibility-set"], [1, "color-picker-section"], [1, "color-palette"], ["type", "button", 1, "color-swatch", 3, "selected", "backgroundColor", "title"], [1, "custom-color-input"], ["for", "customColor"], ["id", "customColor", "type", "color", 1, "custom-color-picker", 3, "ngModelChange", "ngModel"], [1, "color-value"], [1, "icon-grid"], ["type", "button", 1, "icon-option", 3, "selected", "color", "title"], ["mjButton", "", "variant", "primary", 3, "click"], ["mjButton", "", 3, "click"], [1, "visibility-locked"], ["aria-hidden", "true", 1, "fa-solid", "fa-users"], ["id", "projectVisibilityHint", 1, "visibility-hint"], [1, "visibility-choice"], ["type", "radio", "name", "projectVisibility", 3, "ngModelChange", "value", "ngModel"], ["type", "button", 1, "color-swatch", 3, "click", "title"], ["type", "button", 1, "icon-option", 3, "click", "title"]], template: function ProjectFormModalComponent_Template(rf, ctx) { if (rf & 1) {
176
374
  i0.ɵɵelementStart(0, "mj-dialog", 0);
177
375
  i0.ɵɵlistener("Close", function ProjectFormModalComponent_Template_mj_dialog_Close_0_listener() { return ctx.onCancel(); });
178
376
  i0.ɵɵelementStart(1, "div", 1)(2, "div", 2)(3, "span", 3);
@@ -196,34 +394,37 @@ export class ProjectFormModalComponent extends BaseAngularComponent {
196
394
  i0.ɵɵelementStart(15, "textarea", 10);
197
395
  i0.ɵɵtwoWayListener("ngModelChange", function ProjectFormModalComponent_Template_textarea_ngModelChange_15_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.formData.description, $event) || (ctx.formData.description = $event); return $event; });
198
396
  i0.ɵɵelementEnd()();
199
- i0.ɵɵelementStart(16, "div", 5)(17, "label");
200
- i0.ɵɵtext(18, "Color");
397
+ i0.ɵɵelementStart(16, "div", 5);
398
+ i0.ɵɵconditionalCreate(17, ProjectFormModalComponent_Conditional_17_Template, 8, 0, "fieldset", 11)(18, ProjectFormModalComponent_Conditional_18_Template, 13, 5, "fieldset", 11);
201
399
  i0.ɵɵelementEnd();
202
- i0.ɵɵelementStart(19, "div", 11)(20, "div", 12);
203
- i0.ɵɵrepeaterCreate(21, ProjectFormModalComponent_For_22_Template, 1, 5, "button", 13, i0.ɵɵrepeaterTrackByIdentity);
400
+ i0.ɵɵelementStart(19, "div", 5)(20, "label");
401
+ i0.ɵɵtext(21, "Color");
204
402
  i0.ɵɵelementEnd();
205
- i0.ɵɵelementStart(23, "div", 14)(24, "label", 15);
206
- i0.ɵɵtext(25, "Custom:");
403
+ i0.ɵɵelementStart(22, "div", 12)(23, "div", 13);
404
+ i0.ɵɵrepeaterCreate(24, ProjectFormModalComponent_For_25_Template, 1, 5, "button", 14, i0.ɵɵrepeaterTrackByIdentity);
207
405
  i0.ɵɵelementEnd();
208
- i0.ɵɵelementStart(26, "input", 16);
209
- i0.ɵɵtwoWayListener("ngModelChange", function ProjectFormModalComponent_Template_input_ngModelChange_26_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.formData.color, $event) || (ctx.formData.color = $event); return $event; });
406
+ i0.ɵɵelementStart(26, "div", 15)(27, "label", 16);
407
+ i0.ɵɵtext(28, "Custom:");
210
408
  i0.ɵɵelementEnd();
211
- i0.ɵɵelementStart(27, "span", 17);
212
- i0.ɵɵtext(28);
409
+ i0.ɵɵelementStart(29, "input", 17);
410
+ i0.ɵɵtwoWayListener("ngModelChange", function ProjectFormModalComponent_Template_input_ngModelChange_29_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.formData.color, $event) || (ctx.formData.color = $event); return $event; });
411
+ i0.ɵɵelementEnd();
412
+ i0.ɵɵelementStart(30, "span", 18);
413
+ i0.ɵɵtext(31);
213
414
  i0.ɵɵelementEnd()()()();
214
- i0.ɵɵelementStart(29, "div", 5)(30, "label");
215
- i0.ɵɵtext(31, "Icon");
415
+ i0.ɵɵelementStart(32, "div", 5)(33, "label");
416
+ i0.ɵɵtext(34, "Icon");
216
417
  i0.ɵɵelementEnd();
217
- i0.ɵɵelementStart(32, "div", 18);
218
- i0.ɵɵrepeaterCreate(33, ProjectFormModalComponent_For_34_Template, 2, 8, "button", 19, i0.ɵɵrepeaterTrackByIdentity);
418
+ i0.ɵɵelementStart(35, "div", 19);
419
+ i0.ɵɵrepeaterCreate(36, ProjectFormModalComponent_For_37_Template, 2, 8, "button", 20, i0.ɵɵrepeaterTrackByIdentity);
219
420
  i0.ɵɵelementEnd()()();
220
- i0.ɵɵelementStart(35, "mj-dialog-actions")(36, "button", 20);
221
- i0.ɵɵlistener("click", function ProjectFormModalComponent_Template_button_click_36_listener() { return ctx.onSave(); });
222
- i0.ɵɵtext(37);
421
+ i0.ɵɵelementStart(38, "mj-dialog-actions")(39, "button", 21);
422
+ i0.ɵɵlistener("click", function ProjectFormModalComponent_Template_button_click_39_listener() { return ctx.onSave(); });
423
+ i0.ɵɵtext(40);
223
424
  i0.ɵɵelementEnd();
224
- i0.ɵɵelementStart(38, "button", 21);
225
- i0.ɵɵlistener("click", function ProjectFormModalComponent_Template_button_click_38_listener() { return ctx.onCancel(); });
226
- i0.ɵɵtext(39, "Cancel");
425
+ i0.ɵɵelementStart(41, "button", 22);
426
+ i0.ɵɵlistener("click", function ProjectFormModalComponent_Template_button_click_41_listener() { return ctx.onCancel(); });
427
+ i0.ɵɵtext(42, "Cancel");
227
428
  i0.ɵɵelementEnd()()();
228
429
  } if (rf & 2) {
229
430
  i0.ɵɵproperty("Title", ctx.isEditMode ? "Edit Folder" : "New Folder")("Width", 560)("MinWidth", 400)("Visible", true);
@@ -239,7 +440,9 @@ export class ProjectFormModalComponent extends BaseAngularComponent {
239
440
  i0.ɵɵconditional(ctx.showNameError ? 11 : -1);
240
441
  i0.ɵɵadvance(4);
241
442
  i0.ɵɵtwoWayProperty("ngModel", ctx.formData.description);
242
- i0.ɵɵadvance(6);
443
+ i0.ɵɵadvance(2);
444
+ i0.ɵɵconditional(ctx.VisibilityIsLocked ? 17 : 18);
445
+ i0.ɵɵadvance(7);
243
446
  i0.ɵɵrepeater(ctx.availableColors);
244
447
  i0.ɵɵadvance(5);
245
448
  i0.ɵɵtwoWayProperty("ngModel", ctx.formData.color);
@@ -249,7 +452,7 @@ export class ProjectFormModalComponent extends BaseAngularComponent {
249
452
  i0.ɵɵrepeater(ctx.availableIcons);
250
453
  i0.ɵɵadvance(4);
251
454
  i0.ɵɵtextInterpolate1(" ", ctx.isEditMode ? "Save Changes" : "Create Folder", " ");
252
- } }, dependencies: [i1.DefaultValueAccessor, i1.NgControlStatus, i1.NgModel, i2.MJButtonDirective, i2.MJDialogComponent, i2.MJDialogActionsComponent], styles: [".project-form[_ngcontent-%COMP%] {\n padding: 20px 24px 8px;\n display: flex;\n flex-direction: column;\n gap: 22px;\n }\n\n \n .folder-preview[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 14px 16px;\n border-radius: 12px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-subtle);\n }\n .folder-preview-chip[_ngcontent-%COMP%] {\n width: 40px;\n height: 40px;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 18px;\n flex-shrink: 0;\n transition: background-color 150ms ease, color 150ms ease;\n }\n .folder-preview-name[_ngcontent-%COMP%] {\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .form-field[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .form-field[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 13px;\n letter-spacing: 0.01em;\n color: var(--mj-text-secondary);\n }\n\n .form-field[_ngcontent-%COMP%] label.required[_ngcontent-%COMP%]::after {\n content: '*';\n color: var(--mj-status-error);\n margin-left: 4px;\n }\n\n .full-width[_ngcontent-%COMP%] { width: 100%; }\n\n .error-message[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n font-size: 12px;\n }\n\n \n .color-picker-section[_ngcontent-%COMP%] {\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 14px;\n background: var(--mj-bg-surface);\n }\n\n .color-palette[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(10, 1fr);\n gap: 8px;\n margin-bottom: 12px;\n }\n\n .color-swatch[_ngcontent-%COMP%] {\n width: 100%;\n aspect-ratio: 1;\n border: none;\n border-radius: 8px;\n cursor: pointer;\n padding: 0;\n transition: transform 120ms ease, box-shadow 120ms ease;\n box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--mj-text-primary) 8%, transparent);\n }\n\n .color-swatch[_ngcontent-%COMP%]:hover {\n transform: scale(1.12);\n }\n\n .color-swatch.selected[_ngcontent-%COMP%] {\n box-shadow: 0 0 0 2px var(--mj-bg-surface), 0 0 0 4px var(--mj-brand-primary);\n }\n\n .custom-color-input[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding-top: 14px;\n border-top: 1px solid var(--mj-border-subtle);\n }\n\n .custom-color-input[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n }\n\n .custom-color-picker[_ngcontent-%COMP%] {\n width: 44px;\n height: 30px;\n padding: 2px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n cursor: pointer;\n background: var(--mj-bg-surface);\n }\n\n .color-value[_ngcontent-%COMP%] {\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 13px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n }\n\n \n .icon-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(10, 1fr);\n gap: 8px;\n max-height: 184px;\n overflow-y: auto;\n padding: 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n background: var(--mj-bg-surface);\n }\n\n .icon-option[_ngcontent-%COMP%] {\n aspect-ratio: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 1px solid var(--mj-border-subtle);\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n cursor: pointer;\n color: var(--mj-text-secondary);\n transition: transform 120ms ease, border-color 120ms ease, background 120ms ease;\n }\n\n .icon-option[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n transform: translateY(-1px);\n }\n\n .icon-option.selected[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 1px var(--mj-brand-primary);\n }\n\n .icon-option[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { font-size: 17px; }\n\n \n .icon-grid[_ngcontent-%COMP%]::-webkit-scrollbar { width: 8px; }\n .icon-grid[_ngcontent-%COMP%]::-webkit-scrollbar-track {\n background: transparent;\n }\n .icon-grid[_ngcontent-%COMP%]::-webkit-scrollbar-thumb {\n background: var(--mj-border-strong);\n border-radius: 4px;\n }\n .icon-grid[_ngcontent-%COMP%]::-webkit-scrollbar-thumb:hover {\n background: var(--mj-text-disabled);\n }"] });
455
+ } }, dependencies: [i1.DefaultValueAccessor, i1.RadioControlValueAccessor, i1.NgControlStatus, i1.NgModel, i2.MJButtonDirective, i2.MJDialogComponent, i2.MJDialogActionsComponent], styles: [".project-form[_ngcontent-%COMP%] {\n padding: 20px 24px 8px;\n display: flex;\n flex-direction: column;\n gap: 22px;\n }\n\n \n .folder-preview[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 14px 16px;\n border-radius: 12px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-subtle);\n }\n .folder-preview-chip[_ngcontent-%COMP%] {\n width: 40px;\n height: 40px;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 18px;\n flex-shrink: 0;\n transition: background-color 150ms ease, color 150ms ease;\n }\n .folder-preview-name[_ngcontent-%COMP%] {\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .form-field[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .form-field[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 13px;\n letter-spacing: 0.01em;\n color: var(--mj-text-secondary);\n }\n\n .form-field[_ngcontent-%COMP%] label.required[_ngcontent-%COMP%]::after {\n content: '*';\n color: var(--mj-status-error);\n margin-left: 4px;\n }\n\n .full-width[_ngcontent-%COMP%] { width: 100%; }\n\n .error-message[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n font-size: 12px;\n }\n\n \n .visibility-set[_ngcontent-%COMP%] {\n border: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 0.35rem;\n }\n\n \n\n\n\n .visibility-set[_ngcontent-%COMP%] legend[_ngcontent-%COMP%] {\n padding: 0;\n margin-bottom: 0.15rem;\n font-weight: 600;\n font-size: 13px;\n letter-spacing: 0.01em;\n color: var(--mj-text-secondary);\n }\n\n \n\n\n\n .form-field[_ngcontent-%COMP%] .visibility-choice[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n cursor: pointer;\n font-weight: 400;\n font-size: 13px;\n margin: 0;\n \n\n padding: 0.25rem 0;\n }\n\n .visibility-choice[_ngcontent-%COMP%] input[_ngcontent-%COMP%] {\n flex: 0 0 auto;\n margin: 0;\n }\n\n \n\n\n\n .form-field[_ngcontent-%COMP%] .visibility-locked[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n margin: 0;\n padding: 0.25rem 0;\n font-weight: 400;\n font-size: 13px;\n color: var(--mj-text-primary);\n }\n\n .visibility-locked[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .visibility-hint[_ngcontent-%COMP%] {\n margin: 0.15rem 0 0;\n \n font-size: 12px;\n line-height: 1.4;\n color: var(--mj-text-muted);\n }\n\n .color-picker-section[_ngcontent-%COMP%] {\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 14px;\n background: var(--mj-bg-surface);\n }\n\n .color-palette[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(10, 1fr);\n gap: 8px;\n margin-bottom: 12px;\n }\n\n .color-swatch[_ngcontent-%COMP%] {\n width: 100%;\n aspect-ratio: 1;\n border: none;\n border-radius: 8px;\n cursor: pointer;\n padding: 0;\n transition: transform 120ms ease, box-shadow 120ms ease;\n box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--mj-text-primary) 8%, transparent);\n }\n\n .color-swatch[_ngcontent-%COMP%]:hover {\n transform: scale(1.12);\n }\n\n .color-swatch.selected[_ngcontent-%COMP%] {\n box-shadow: 0 0 0 2px var(--mj-bg-surface), 0 0 0 4px var(--mj-brand-primary);\n }\n\n .custom-color-input[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding-top: 14px;\n border-top: 1px solid var(--mj-border-subtle);\n }\n\n .custom-color-input[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n }\n\n .custom-color-picker[_ngcontent-%COMP%] {\n width: 44px;\n height: 30px;\n padding: 2px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n cursor: pointer;\n background: var(--mj-bg-surface);\n }\n\n .color-value[_ngcontent-%COMP%] {\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 13px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n }\n\n \n .icon-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(10, 1fr);\n gap: 8px;\n max-height: 184px;\n overflow-y: auto;\n padding: 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n background: var(--mj-bg-surface);\n }\n\n .icon-option[_ngcontent-%COMP%] {\n aspect-ratio: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 1px solid var(--mj-border-subtle);\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n cursor: pointer;\n color: var(--mj-text-secondary);\n transition: transform 120ms ease, border-color 120ms ease, background 120ms ease;\n }\n\n .icon-option[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n transform: translateY(-1px);\n }\n\n .icon-option.selected[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 1px var(--mj-brand-primary);\n }\n\n .icon-option[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { font-size: 17px; }\n\n \n .icon-grid[_ngcontent-%COMP%]::-webkit-scrollbar { width: 8px; }\n .icon-grid[_ngcontent-%COMP%]::-webkit-scrollbar-track {\n background: transparent;\n }\n .icon-grid[_ngcontent-%COMP%]::-webkit-scrollbar-thumb {\n background: var(--mj-border-strong);\n border-radius: 4px;\n }\n .icon-grid[_ngcontent-%COMP%]::-webkit-scrollbar-thumb:hover {\n background: var(--mj-text-disabled);\n }"] });
253
456
  }
254
457
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ProjectFormModalComponent, [{
255
458
  type: Component,
@@ -301,6 +504,52 @@ export class ProjectFormModalComponent extends BaseAngularComponent {
301
504
  rows="2"></textarea>
302
505
  </div>
303
506
 
507
+ <!-- Visibility. TWO NAMED OPTIONS, not a checkbox: with a checkbox the unchecked
508
+ meaning lives only in the helper text, so the shared state is never actually
509
+ named. A fieldset/legend also gives the group a real accessible name, which a
510
+ bare <label>Visibility</label> did not, and the hint is a sibling of the
511
+ options rather than inside one — inside, a screen reader read the whole hint
512
+ as part of the option's name.
513
+
514
+ A SHARED folder shows a statement instead of the control. Visibility is a
515
+ create-time choice in one direction only: personal -> shared stays available,
516
+ because it only ever adds. See VisibilityIsLocked for why the reverse is not
517
+ offered. -->
518
+ <div class="form-field">
519
+ @if (VisibilityIsLocked) {
520
+ <fieldset class="visibility-set" aria-describedby="projectVisibilityHint">
521
+ <legend>Visibility</legend>
522
+ <p class="visibility-locked">
523
+ <i class="fa-solid fa-users" aria-hidden="true"></i>
524
+ Shared with everyone
525
+ </p>
526
+ <p class="visibility-hint" id="projectVisibilityHint">
527
+ A shared folder stays shared. To keep something to yourself, create a new
528
+ private folder and move it there.
529
+ </p>
530
+ </fieldset>
531
+ } @else {
532
+ <fieldset class="visibility-set" aria-describedby="projectVisibilityHint">
533
+ <legend>Visibility</legend>
534
+ <label class="visibility-choice">
535
+ <input type="radio" name="projectVisibility" [value]="true"
536
+ [(ngModel)]="FormData.isPersonal" />
537
+ <span>Only me</span>
538
+ </label>
539
+ <label class="visibility-choice">
540
+ <input type="radio" name="projectVisibility" [value]="false"
541
+ [(ngModel)]="FormData.isPersonal" />
542
+ <span>Everyone</span>
543
+ </label>
544
+ <p class="visibility-hint" id="projectVisibilityHint">
545
+ {{ FormData.isPersonal
546
+ ? 'Only you can see this folder.'
547
+ : 'Everyone can see this folder and its name. They will not see the conversations you keep in it.' }}
548
+ </p>
549
+ </fieldset>
550
+ }
551
+ </div>
552
+
304
553
  <!-- Color Picker -->
305
554
  <div class="form-field">
306
555
  <label>Color</label>
@@ -355,19 +604,31 @@ export class ProjectFormModalComponent extends BaseAngularComponent {
355
604
  <button mjButton (click)="onCancel()">Cancel</button>
356
605
  </mj-dialog-actions>
357
606
  </mj-dialog>
358
- `, styles: ["\n .project-form {\n padding: 20px 24px 8px;\n display: flex;\n flex-direction: column;\n gap: 22px;\n }\n\n /* Live preview chip */\n .folder-preview {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 14px 16px;\n border-radius: 12px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-subtle);\n }\n .folder-preview-chip {\n width: 40px;\n height: 40px;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 18px;\n flex-shrink: 0;\n transition: background-color 150ms ease, color 150ms ease;\n }\n .folder-preview-name {\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .form-field {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .form-field label {\n font-weight: 600;\n font-size: 13px;\n letter-spacing: 0.01em;\n color: var(--mj-text-secondary);\n }\n\n .form-field label.required::after {\n content: '*';\n color: var(--mj-status-error);\n margin-left: 4px;\n }\n\n .full-width { width: 100%; }\n\n .error-message {\n color: var(--mj-status-error);\n font-size: 12px;\n }\n\n /* Color Picker */\n .color-picker-section {\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 14px;\n background: var(--mj-bg-surface);\n }\n\n .color-palette {\n display: grid;\n grid-template-columns: repeat(10, 1fr);\n gap: 8px;\n margin-bottom: 12px;\n }\n\n .color-swatch {\n width: 100%;\n aspect-ratio: 1;\n border: none;\n border-radius: 8px;\n cursor: pointer;\n padding: 0;\n transition: transform 120ms ease, box-shadow 120ms ease;\n box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--mj-text-primary) 8%, transparent);\n }\n\n .color-swatch:hover {\n transform: scale(1.12);\n }\n\n .color-swatch.selected {\n box-shadow: 0 0 0 2px var(--mj-bg-surface), 0 0 0 4px var(--mj-brand-primary);\n }\n\n .custom-color-input {\n display: flex;\n align-items: center;\n gap: 10px;\n padding-top: 14px;\n border-top: 1px solid var(--mj-border-subtle);\n }\n\n .custom-color-input label {\n margin: 0;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n }\n\n .custom-color-picker {\n width: 44px;\n height: 30px;\n padding: 2px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n cursor: pointer;\n background: var(--mj-bg-surface);\n }\n\n .color-value {\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 13px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n }\n\n /* Icon Selector */\n .icon-grid {\n display: grid;\n grid-template-columns: repeat(10, 1fr);\n gap: 8px;\n max-height: 184px;\n overflow-y: auto;\n padding: 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n background: var(--mj-bg-surface);\n }\n\n .icon-option {\n aspect-ratio: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 1px solid var(--mj-border-subtle);\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n cursor: pointer;\n color: var(--mj-text-secondary);\n transition: transform 120ms ease, border-color 120ms ease, background 120ms ease;\n }\n\n .icon-option:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n transform: translateY(-1px);\n }\n\n .icon-option.selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 1px var(--mj-brand-primary);\n }\n\n .icon-option i { font-size: 17px; }\n\n /* Scrollbar */\n .icon-grid::-webkit-scrollbar { width: 8px; }\n .icon-grid::-webkit-scrollbar-track {\n background: transparent;\n }\n .icon-grid::-webkit-scrollbar-thumb {\n background: var(--mj-border-strong);\n border-radius: 4px;\n }\n .icon-grid::-webkit-scrollbar-thumb:hover {\n background: var(--mj-text-disabled);\n }\n "] }]
359
- }], () => [{ type: i0.ChangeDetectorRef }], { dialogRef: [{
607
+ `, styles: ["\n .project-form {\n padding: 20px 24px 8px;\n display: flex;\n flex-direction: column;\n gap: 22px;\n }\n\n /* Live preview chip */\n .folder-preview {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 14px 16px;\n border-radius: 12px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-subtle);\n }\n .folder-preview-chip {\n width: 40px;\n height: 40px;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 18px;\n flex-shrink: 0;\n transition: background-color 150ms ease, color 150ms ease;\n }\n .folder-preview-name {\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .form-field {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .form-field label {\n font-weight: 600;\n font-size: 13px;\n letter-spacing: 0.01em;\n color: var(--mj-text-secondary);\n }\n\n .form-field label.required::after {\n content: '*';\n color: var(--mj-status-error);\n margin-left: 4px;\n }\n\n .full-width { width: 100%; }\n\n .error-message {\n color: var(--mj-status-error);\n font-size: 12px;\n }\n\n /* Color Picker */\n .visibility-set {\n border: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 0.35rem;\n }\n\n /* A <legend> is not matched by the .form-field label rule, so it inherited 16px/400\n and read larger and lighter than every other field label. Restated here rather than\n widening that selector, which would also catch the option labels below.\n (No backticks in this block: it is a template literal.) */\n .visibility-set legend {\n padding: 0;\n margin-bottom: 0.15rem;\n font-weight: 600;\n font-size: 13px;\n letter-spacing: 0.01em;\n color: var(--mj-text-secondary);\n }\n\n /* Scoped as .form-field .visibility-choice (0,2,1) so it deliberately outranks the\n .form-field label rule (0,1,1) this sits inside \u2014 at equal specificity that rule\n won on source order and rendered the option text bold.\n (No backticks in here: this block is a template literal.) */\n .form-field .visibility-choice {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n cursor: pointer;\n font-weight: 400;\n font-size: 13px;\n margin: 0;\n /* The rows were the height of the radio alone (~16px). The checkbox this replaced\n sat in a 31px row, so the tap target got smaller when the control got clearer. */\n padding: 0.25rem 0;\n }\n\n .visibility-choice input {\n flex: 0 0 auto;\n margin: 0;\n }\n\n /* The shared-folder statement that stands in for the radios. Matches the option rows\n it replaces \u2014 same size, same weight, same 0.25rem row padding \u2014 so the dialog does\n not visibly reflow between a folder that offers the choice and one that does not.\n (No backticks in here: this block is a template literal.) */\n .form-field .visibility-locked {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n margin: 0;\n padding: 0.25rem 0;\n font-weight: 400;\n font-size: 13px;\n color: var(--mj-text-primary);\n }\n\n .visibility-locked i {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .visibility-hint {\n margin: 0.15rem 0 0;\n /* Unsized it inherited 16px and read LARGER than the options it describes. */\n font-size: 12px;\n line-height: 1.4;\n color: var(--mj-text-muted);\n }\n\n .color-picker-section {\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 14px;\n background: var(--mj-bg-surface);\n }\n\n .color-palette {\n display: grid;\n grid-template-columns: repeat(10, 1fr);\n gap: 8px;\n margin-bottom: 12px;\n }\n\n .color-swatch {\n width: 100%;\n aspect-ratio: 1;\n border: none;\n border-radius: 8px;\n cursor: pointer;\n padding: 0;\n transition: transform 120ms ease, box-shadow 120ms ease;\n box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--mj-text-primary) 8%, transparent);\n }\n\n .color-swatch:hover {\n transform: scale(1.12);\n }\n\n .color-swatch.selected {\n box-shadow: 0 0 0 2px var(--mj-bg-surface), 0 0 0 4px var(--mj-brand-primary);\n }\n\n .custom-color-input {\n display: flex;\n align-items: center;\n gap: 10px;\n padding-top: 14px;\n border-top: 1px solid var(--mj-border-subtle);\n }\n\n .custom-color-input label {\n margin: 0;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n }\n\n .custom-color-picker {\n width: 44px;\n height: 30px;\n padding: 2px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n cursor: pointer;\n background: var(--mj-bg-surface);\n }\n\n .color-value {\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 13px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n }\n\n /* Icon Selector */\n .icon-grid {\n display: grid;\n grid-template-columns: repeat(10, 1fr);\n gap: 8px;\n max-height: 184px;\n overflow-y: auto;\n padding: 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n background: var(--mj-bg-surface);\n }\n\n .icon-option {\n aspect-ratio: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 1px solid var(--mj-border-subtle);\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n cursor: pointer;\n color: var(--mj-text-secondary);\n transition: transform 120ms ease, border-color 120ms ease, background 120ms ease;\n }\n\n .icon-option:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n transform: translateY(-1px);\n }\n\n .icon-option.selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 1px var(--mj-brand-primary);\n }\n\n .icon-option i { font-size: 17px; }\n\n /* Scrollbar */\n .icon-grid::-webkit-scrollbar { width: 8px; }\n .icon-grid::-webkit-scrollbar-track {\n background: transparent;\n }\n .icon-grid::-webkit-scrollbar-thumb {\n background: var(--mj-border-strong);\n border-radius: 4px;\n }\n .icon-grid::-webkit-scrollbar-thumb:hover {\n background: var(--mj-text-disabled);\n }\n "] }]
608
+ }], () => [{ type: i0.ChangeDetectorRef }], { DialogRef: [{
609
+ type: Input
610
+ }], dialogRef: [{
611
+ type: Input
612
+ }], Project: [{
360
613
  type: Input
361
614
  }], project: [{
362
615
  type: Input
616
+ }], EnvironmentId: [{
617
+ type: Input
363
618
  }], environmentId: [{
364
619
  type: Input
620
+ }], CurrentUser: [{
621
+ type: Input
365
622
  }], currentUser: [{
366
623
  type: Input
624
+ }], ParentId: [{
625
+ type: Input
367
626
  }], parentId: [{
368
627
  type: Input
628
+ }], ProjectSaved: [{
629
+ type: Output
369
630
  }], projectSaved: [{
370
631
  type: Output
371
632
  }] }); })();
372
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ProjectFormModalComponent, { className: "ProjectFormModalComponent", filePath: "src/lib/components/project/project-form-modal.component.ts", lineNumber: 350 }); })();
633
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ProjectFormModalComponent, { className: "ProjectFormModalComponent", filePath: "src/lib/components/project/project-form-modal.component.ts", lineNumber: 470 }); })();
373
634
  //# sourceMappingURL=project-form-modal.component.js.map