@notis_ai/cli 0.2.14 → 0.2.15

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 (296) hide show
  1. package/README.md +82 -20
  2. package/dist/agent-hooks/notis-agent-hook.mjs +19750 -0
  3. package/{skills → dist/base-skills}/notis-apps/SKILL.md +84 -53
  4. package/{skills → dist/base-skills}/notis-cli/SKILL.md +9 -9
  5. package/dist/base-skills/notis-query/SKILL.md +705 -0
  6. package/dist/skill-sync/index.js +1528 -0
  7. package/dist/skill-sync/index.js.map +7 -0
  8. package/package.json +5 -2
  9. package/skills/notis-apps/cli.md +38 -17
  10. package/skills/notis-cli/AGENT_INSTRUCTIONS.md +39 -0
  11. package/skills/notis-onboarding/BRIEF.md +16 -0
  12. package/src/agent-hook-entry.js +5 -0
  13. package/src/cli.js +23 -14
  14. package/src/command-specs/agents.js +392 -0
  15. package/src/command-specs/apps.js +871 -387
  16. package/src/command-specs/auth.js +63 -10
  17. package/src/command-specs/index.js +6 -0
  18. package/src/command-specs/onboarding.js +69 -5
  19. package/src/command-specs/skills.js +56 -0
  20. package/src/runtime/agent-memory-state.js +126 -0
  21. package/src/runtime/agent-setup.js +383 -0
  22. package/src/runtime/app-dev-consumers.js +154 -0
  23. package/src/runtime/app-dev-host-lock.js +80 -0
  24. package/src/runtime/app-dev-roots.js +284 -0
  25. package/src/runtime/app-dev-server.js +212 -22
  26. package/src/runtime/app-dev-sessions.js +105 -145
  27. package/src/runtime/app-platform.js +1291 -165
  28. package/src/runtime/app-registry-scaffolds.js +367 -0
  29. package/src/runtime/base-skills.d.ts +20 -0
  30. package/src/runtime/base-skills.js +167 -0
  31. package/src/runtime/login-listener.js +15 -0
  32. package/src/runtime/oauth.js +1506 -141
  33. package/src/runtime/output.js +7 -0
  34. package/src/runtime/ports.js +16 -0
  35. package/src/runtime/profiles.js +0 -5
  36. package/src/runtime/skill-sync/cloud-client.ts +96 -0
  37. package/src/runtime/skill-sync/index.ts +644 -0
  38. package/src/runtime/skill-sync/local-scanner.ts +1046 -0
  39. package/src/runtime/skill-sync/symlink-manager.ts +383 -0
  40. package/src/runtime/skill-sync/sync-plan.ts +22 -0
  41. package/src/runtime/skill-sync/types.ts +103 -0
  42. package/src/runtime/skill-sync/write-cloud-skill.ts +50 -0
  43. package/src/runtime/store-screenshot.js +6 -1
  44. package/src/runtime/sync-skills.d.ts +37 -0
  45. package/src/runtime/sync-skills.js +215 -0
  46. package/template/app/layout.tsx +5 -1
  47. package/template/notis.config.ts +1 -0
  48. package/template/packages/sdk/package.json +2 -1
  49. package/template/packages/sdk/src/components/DocumentEditor.tsx +13 -3
  50. package/template/packages/sdk/src/components/MarkdownEditor.tsx +121 -0
  51. package/template/packages/sdk/src/components/MultiSelectActionBar.tsx +37 -119
  52. package/template/packages/sdk/src/components/MultiSelectCheckbox.tsx +5 -1
  53. package/template/packages/sdk/src/components/MultiSelectDragOverlay.tsx +1 -1
  54. package/template/packages/sdk/src/components/NotisSelectionBoundary.tsx +55 -0
  55. package/template/packages/sdk/src/components/ShortcutHints.tsx +56 -0
  56. package/template/packages/sdk/src/config.ts +19 -0
  57. package/template/packages/sdk/src/documents.ts +7 -1
  58. package/template/packages/sdk/src/hooks/useActiveResource.ts +19 -0
  59. package/template/packages/sdk/src/hooks/useCollectionInteractions.ts +709 -0
  60. package/template/packages/sdk/src/hooks/useHandover.ts +3 -0
  61. package/template/packages/sdk/src/hooks/useMultiSelect.ts +44 -482
  62. package/template/packages/sdk/src/hooks/useTool.ts +5 -4
  63. package/template/packages/sdk/src/index.ts +47 -2
  64. package/template/packages/sdk/src/interactions/actions.ts +46 -0
  65. package/template/packages/sdk/src/interactions/shortcuts.tsx +628 -0
  66. package/template/packages/sdk/src/interactions.ts +41 -0
  67. package/template/packages/sdk/src/provider.tsx +2 -1
  68. package/template/packages/sdk/src/runtime.ts +89 -4
  69. package/dist/scaffolds/notis-database/CHANGELOG.md +0 -5
  70. package/dist/scaffolds/notis-database/app/globals.css +0 -44
  71. package/dist/scaffolds/notis-database/app/layout.tsx +0 -6
  72. package/dist/scaffolds/notis-database/app/page.tsx +0 -1088
  73. package/dist/scaffolds/notis-database/components/ui/badge.tsx +0 -28
  74. package/dist/scaffolds/notis-database/components/ui/button.tsx +0 -53
  75. package/dist/scaffolds/notis-database/components/ui/card.tsx +0 -56
  76. package/dist/scaffolds/notis-database/components/ui/table.tsx +0 -120
  77. package/dist/scaffolds/notis-database/components.json +0 -20
  78. package/dist/scaffolds/notis-database/index.html +0 -12
  79. package/dist/scaffolds/notis-database/lib/types.ts +0 -132
  80. package/dist/scaffolds/notis-database/lib/utils.ts +0 -6
  81. package/dist/scaffolds/notis-database/metadata/screenshot-1.png +0 -0
  82. package/dist/scaffolds/notis-database/metadata/screenshot-2.png +0 -0
  83. package/dist/scaffolds/notis-database/metadata/screenshot-3.png +0 -0
  84. package/dist/scaffolds/notis-database/metadata/screenshot-4.png +0 -0
  85. package/dist/scaffolds/notis-database/metadata/screenshot-5.png +0 -0
  86. package/dist/scaffolds/notis-database/metadata/screenshot-fixtures.json +0 -1839
  87. package/dist/scaffolds/notis-database/notis.config.ts +0 -73
  88. package/dist/scaffolds/notis-database/package-lock.json +0 -3935
  89. package/dist/scaffolds/notis-database/package.json +0 -32
  90. package/dist/scaffolds/notis-database/packages/sdk/package.json +0 -36
  91. package/dist/scaffolds/notis-database/packages/sdk/src/components/DocumentEditor.tsx +0 -93
  92. package/dist/scaffolds/notis-database/packages/sdk/src/components/Markdown.tsx +0 -60
  93. package/dist/scaffolds/notis-database/packages/sdk/src/components/MultiSelectActionBar.tsx +0 -278
  94. package/dist/scaffolds/notis-database/packages/sdk/src/components/MultiSelectCheckbox.tsx +0 -91
  95. package/dist/scaffolds/notis-database/packages/sdk/src/components/MultiSelectDragOverlay.tsx +0 -39
  96. package/dist/scaffolds/notis-database/packages/sdk/src/config.ts +0 -234
  97. package/dist/scaffolds/notis-database/packages/sdk/src/documents.ts +0 -250
  98. package/dist/scaffolds/notis-database/packages/sdk/src/hooks/useBackend.ts +0 -41
  99. package/dist/scaffolds/notis-database/packages/sdk/src/hooks/useCloudComputer.ts +0 -97
  100. package/dist/scaffolds/notis-database/packages/sdk/src/hooks/useDatabaseSchema.ts +0 -85
  101. package/dist/scaffolds/notis-database/packages/sdk/src/hooks/useDatabaseSubscription.ts +0 -76
  102. package/dist/scaffolds/notis-database/packages/sdk/src/hooks/useDocument.ts +0 -78
  103. package/dist/scaffolds/notis-database/packages/sdk/src/hooks/useDocuments.ts +0 -121
  104. package/dist/scaffolds/notis-database/packages/sdk/src/hooks/useHandover.ts +0 -75
  105. package/dist/scaffolds/notis-database/packages/sdk/src/hooks/useMultiSelect.ts +0 -539
  106. package/dist/scaffolds/notis-database/packages/sdk/src/hooks/useNotis.ts +0 -34
  107. package/dist/scaffolds/notis-database/packages/sdk/src/hooks/useNotisNavigation.ts +0 -49
  108. package/dist/scaffolds/notis-database/packages/sdk/src/hooks/useTool.ts +0 -64
  109. package/dist/scaffolds/notis-database/packages/sdk/src/hooks/useTools.ts +0 -56
  110. package/dist/scaffolds/notis-database/packages/sdk/src/hooks/useTopBarSearch.ts +0 -73
  111. package/dist/scaffolds/notis-database/packages/sdk/src/hooks/useUpsertDocument.ts +0 -95
  112. package/dist/scaffolds/notis-database/packages/sdk/src/index.ts +0 -100
  113. package/dist/scaffolds/notis-database/packages/sdk/src/provider.tsx +0 -43
  114. package/dist/scaffolds/notis-database/packages/sdk/src/runtime.ts +0 -351
  115. package/dist/scaffolds/notis-database/packages/sdk/src/styles.css +0 -186
  116. package/dist/scaffolds/notis-database/packages/sdk/src/ui.ts +0 -15
  117. package/dist/scaffolds/notis-database/packages/sdk/src/vite.ts +0 -56
  118. package/dist/scaffolds/notis-database/packages/sdk/tsconfig.json +0 -15
  119. package/dist/scaffolds/notis-database/postcss.config.mjs +0 -8
  120. package/dist/scaffolds/notis-database/src/dev-main.tsx +0 -23
  121. package/dist/scaffolds/notis-database/src/mock-runtime.ts +0 -561
  122. package/dist/scaffolds/notis-database/tailwind.config.ts +0 -59
  123. package/dist/scaffolds/notis-database/tsconfig.json +0 -23
  124. package/dist/scaffolds/notis-database/vite.config.ts +0 -22
  125. package/dist/scaffolds/notis-journal/CHANGELOG.md +0 -29
  126. package/dist/scaffolds/notis-journal/app/globals.css +0 -37
  127. package/dist/scaffolds/notis-journal/app/insights/page.tsx +0 -513
  128. package/dist/scaffolds/notis-journal/app/journal-core.tsx +0 -362
  129. package/dist/scaffolds/notis-journal/app/journal-ui.tsx +0 -337
  130. package/dist/scaffolds/notis-journal/app/layout.tsx +0 -6
  131. package/dist/scaffolds/notis-journal/app/page.tsx +0 -486
  132. package/dist/scaffolds/notis-journal/components/ui/badge.tsx +0 -28
  133. package/dist/scaffolds/notis-journal/components/ui/button.tsx +0 -53
  134. package/dist/scaffolds/notis-journal/components/ui/card.tsx +0 -56
  135. package/dist/scaffolds/notis-journal/components.json +0 -20
  136. package/dist/scaffolds/notis-journal/index.html +0 -12
  137. package/dist/scaffolds/notis-journal/lib/utils.ts +0 -6
  138. package/dist/scaffolds/notis-journal/metadata/screenshot-1.png +0 -0
  139. package/dist/scaffolds/notis-journal/metadata/screenshot-2.png +0 -0
  140. package/dist/scaffolds/notis-journal/metadata/screenshot-3.png +0 -0
  141. package/dist/scaffolds/notis-journal/metadata/screenshot-4.png +0 -0
  142. package/dist/scaffolds/notis-journal/metadata/screenshot-5.png +0 -0
  143. package/dist/scaffolds/notis-journal/metadata/screenshot-6.png +0 -0
  144. package/dist/scaffolds/notis-journal/metadata/screenshot-fixtures.json +0 -132
  145. package/dist/scaffolds/notis-journal/notis.config.ts +0 -93
  146. package/dist/scaffolds/notis-journal/package-lock.json +0 -4615
  147. package/dist/scaffolds/notis-journal/package.json +0 -34
  148. package/dist/scaffolds/notis-journal/packages/sdk/package.json +0 -36
  149. package/dist/scaffolds/notis-journal/packages/sdk/src/components/DocumentEditor.tsx +0 -93
  150. package/dist/scaffolds/notis-journal/packages/sdk/src/components/Markdown.tsx +0 -60
  151. package/dist/scaffolds/notis-journal/packages/sdk/src/components/MultiSelectActionBar.tsx +0 -278
  152. package/dist/scaffolds/notis-journal/packages/sdk/src/components/MultiSelectCheckbox.tsx +0 -91
  153. package/dist/scaffolds/notis-journal/packages/sdk/src/components/MultiSelectDragOverlay.tsx +0 -39
  154. package/dist/scaffolds/notis-journal/packages/sdk/src/config.ts +0 -234
  155. package/dist/scaffolds/notis-journal/packages/sdk/src/documents.ts +0 -250
  156. package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useBackend.ts +0 -41
  157. package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useCloudComputer.ts +0 -97
  158. package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useDatabaseSchema.ts +0 -85
  159. package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useDatabaseSubscription.ts +0 -76
  160. package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useDocument.ts +0 -78
  161. package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useDocuments.ts +0 -121
  162. package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useHandover.ts +0 -75
  163. package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useMultiSelect.ts +0 -539
  164. package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useNotis.ts +0 -34
  165. package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useNotisNavigation.ts +0 -49
  166. package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useTool.ts +0 -64
  167. package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useTools.ts +0 -56
  168. package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useTopBarSearch.ts +0 -73
  169. package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useUpsertDocument.ts +0 -95
  170. package/dist/scaffolds/notis-journal/packages/sdk/src/index.ts +0 -100
  171. package/dist/scaffolds/notis-journal/packages/sdk/src/provider.tsx +0 -43
  172. package/dist/scaffolds/notis-journal/packages/sdk/src/runtime.ts +0 -351
  173. package/dist/scaffolds/notis-journal/packages/sdk/src/styles.css +0 -186
  174. package/dist/scaffolds/notis-journal/packages/sdk/src/ui.ts +0 -15
  175. package/dist/scaffolds/notis-journal/packages/sdk/src/vite.ts +0 -56
  176. package/dist/scaffolds/notis-journal/packages/sdk/tsconfig.json +0 -15
  177. package/dist/scaffolds/notis-journal/postcss.config.mjs +0 -8
  178. package/dist/scaffolds/notis-journal/skills/journal-onboarding/SKILL.md +0 -120
  179. package/dist/scaffolds/notis-journal/src/dev-main.tsx +0 -58
  180. package/dist/scaffolds/notis-journal/src/mock-runtime.ts +0 -199
  181. package/dist/scaffolds/notis-journal/tailwind.config.ts +0 -58
  182. package/dist/scaffolds/notis-journal/tsconfig.json +0 -23
  183. package/dist/scaffolds/notis-journal/vite.config.ts +0 -10
  184. package/dist/scaffolds/notis-notes/CHANGELOG.md +0 -5
  185. package/dist/scaffolds/notis-notes/app/globals.css +0 -3
  186. package/dist/scaffolds/notis-notes/app/layout.tsx +0 -6
  187. package/dist/scaffolds/notis-notes/app/page.tsx +0 -1943
  188. package/dist/scaffolds/notis-notes/app/phosphor-icons.ts +0 -596
  189. package/dist/scaffolds/notis-notes/components/ui/badge.tsx +0 -28
  190. package/dist/scaffolds/notis-notes/components/ui/button.tsx +0 -53
  191. package/dist/scaffolds/notis-notes/components/ui/card.tsx +0 -56
  192. package/dist/scaffolds/notis-notes/components.json +0 -20
  193. package/dist/scaffolds/notis-notes/lib/utils.ts +0 -6
  194. package/dist/scaffolds/notis-notes/lib/visible-properties.ts +0 -144
  195. package/dist/scaffolds/notis-notes/metadata/screenshot-1.png +0 -0
  196. package/dist/scaffolds/notis-notes/metadata/screenshot-2.png +0 -0
  197. package/dist/scaffolds/notis-notes/metadata/screenshot-3.png +0 -0
  198. package/dist/scaffolds/notis-notes/metadata/screenshot-4.png +0 -0
  199. package/dist/scaffolds/notis-notes/metadata/screenshot-5.png +0 -0
  200. package/dist/scaffolds/notis-notes/metadata/screenshot-fixtures.json +0 -752
  201. package/dist/scaffolds/notis-notes/notis.config.ts +0 -80
  202. package/dist/scaffolds/notis-notes/package-lock.json +0 -4636
  203. package/dist/scaffolds/notis-notes/package.json +0 -35
  204. package/dist/scaffolds/notis-notes/packages/sdk/package.json +0 -36
  205. package/dist/scaffolds/notis-notes/packages/sdk/src/components/DocumentEditor.tsx +0 -93
  206. package/dist/scaffolds/notis-notes/packages/sdk/src/components/Markdown.tsx +0 -60
  207. package/dist/scaffolds/notis-notes/packages/sdk/src/components/MultiSelectActionBar.tsx +0 -278
  208. package/dist/scaffolds/notis-notes/packages/sdk/src/components/MultiSelectCheckbox.tsx +0 -91
  209. package/dist/scaffolds/notis-notes/packages/sdk/src/components/MultiSelectDragOverlay.tsx +0 -39
  210. package/dist/scaffolds/notis-notes/packages/sdk/src/config.ts +0 -234
  211. package/dist/scaffolds/notis-notes/packages/sdk/src/documents.ts +0 -250
  212. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useBackend.ts +0 -41
  213. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useCloudComputer.ts +0 -97
  214. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useDatabaseSchema.ts +0 -85
  215. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useDatabaseSubscription.ts +0 -76
  216. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useDocument.ts +0 -78
  217. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useDocuments.ts +0 -121
  218. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useHandover.ts +0 -75
  219. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useMultiSelect.ts +0 -539
  220. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useNotis.ts +0 -34
  221. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useNotisNavigation.ts +0 -49
  222. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useTool.ts +0 -64
  223. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useTools.ts +0 -56
  224. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useTopBarSearch.ts +0 -73
  225. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useUpsertDocument.ts +0 -95
  226. package/dist/scaffolds/notis-notes/packages/sdk/src/index.ts +0 -100
  227. package/dist/scaffolds/notis-notes/packages/sdk/src/provider.tsx +0 -43
  228. package/dist/scaffolds/notis-notes/packages/sdk/src/runtime.ts +0 -351
  229. package/dist/scaffolds/notis-notes/packages/sdk/src/styles.css +0 -186
  230. package/dist/scaffolds/notis-notes/packages/sdk/src/ui.ts +0 -15
  231. package/dist/scaffolds/notis-notes/packages/sdk/src/vite.ts +0 -56
  232. package/dist/scaffolds/notis-notes/packages/sdk/tsconfig.json +0 -15
  233. package/dist/scaffolds/notis-notes/postcss.config.mjs +0 -8
  234. package/dist/scaffolds/notis-notes/tailwind.config.ts +0 -58
  235. package/dist/scaffolds/notis-notes/tsconfig.json +0 -23
  236. package/dist/scaffolds/notis-notes/vite.config.ts +0 -10
  237. package/dist/scaffolds/notis-random/CHANGELOG.md +0 -15
  238. package/dist/scaffolds/notis-random/README.md +0 -33
  239. package/dist/scaffolds/notis-random/app/globals.css +0 -11
  240. package/dist/scaffolds/notis-random/app/history/page.tsx +0 -67
  241. package/dist/scaffolds/notis-random/app/layout.tsx +0 -7
  242. package/dist/scaffolds/notis-random/app/page.tsx +0 -289
  243. package/dist/scaffolds/notis-random/components/ui/button.tsx +0 -50
  244. package/dist/scaffolds/notis-random/components/ui/card.tsx +0 -16
  245. package/dist/scaffolds/notis-random/components/ui/input.tsx +0 -23
  246. package/dist/scaffolds/notis-random/components.json +0 -20
  247. package/dist/scaffolds/notis-random/index.html +0 -12
  248. package/dist/scaffolds/notis-random/lib/notis-tools.ts +0 -128
  249. package/dist/scaffolds/notis-random/lib/rng.ts +0 -202
  250. package/dist/scaffolds/notis-random/lib/roll-record.ts +0 -189
  251. package/dist/scaffolds/notis-random/lib/utils.ts +0 -25
  252. package/dist/scaffolds/notis-random/metadata/screenshot-1.png +0 -0
  253. package/dist/scaffolds/notis-random/metadata/screenshot-2.png +0 -0
  254. package/dist/scaffolds/notis-random/metadata/screenshot-3.png +0 -0
  255. package/dist/scaffolds/notis-random/metadata/screenshot-4.png +0 -0
  256. package/dist/scaffolds/notis-random/metadata/screenshot-5.png +0 -0
  257. package/dist/scaffolds/notis-random/metadata/screenshot-fixtures.json +0 -753
  258. package/dist/scaffolds/notis-random/notis.config.ts +0 -86
  259. package/dist/scaffolds/notis-random/package-lock.json +0 -4513
  260. package/dist/scaffolds/notis-random/package.json +0 -36
  261. package/dist/scaffolds/notis-random/packages/sdk/package.json +0 -36
  262. package/dist/scaffolds/notis-random/packages/sdk/src/components/DocumentEditor.tsx +0 -93
  263. package/dist/scaffolds/notis-random/packages/sdk/src/components/Markdown.tsx +0 -60
  264. package/dist/scaffolds/notis-random/packages/sdk/src/components/MultiSelectActionBar.tsx +0 -278
  265. package/dist/scaffolds/notis-random/packages/sdk/src/components/MultiSelectCheckbox.tsx +0 -91
  266. package/dist/scaffolds/notis-random/packages/sdk/src/components/MultiSelectDragOverlay.tsx +0 -39
  267. package/dist/scaffolds/notis-random/packages/sdk/src/config.ts +0 -234
  268. package/dist/scaffolds/notis-random/packages/sdk/src/documents.ts +0 -250
  269. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useBackend.ts +0 -41
  270. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useCloudComputer.ts +0 -97
  271. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useDatabaseSchema.ts +0 -85
  272. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useDatabaseSubscription.ts +0 -76
  273. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useDocument.ts +0 -78
  274. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useDocuments.ts +0 -121
  275. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useHandover.ts +0 -75
  276. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useMultiSelect.ts +0 -539
  277. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useNotis.ts +0 -34
  278. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useNotisNavigation.ts +0 -49
  279. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useTool.ts +0 -64
  280. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useTools.ts +0 -56
  281. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useTopBarSearch.ts +0 -73
  282. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useUpsertDocument.ts +0 -95
  283. package/dist/scaffolds/notis-random/packages/sdk/src/index.ts +0 -100
  284. package/dist/scaffolds/notis-random/packages/sdk/src/provider.tsx +0 -43
  285. package/dist/scaffolds/notis-random/packages/sdk/src/runtime.ts +0 -351
  286. package/dist/scaffolds/notis-random/packages/sdk/src/styles.css +0 -186
  287. package/dist/scaffolds/notis-random/packages/sdk/src/ui.ts +0 -15
  288. package/dist/scaffolds/notis-random/packages/sdk/src/vite.ts +0 -56
  289. package/dist/scaffolds/notis-random/packages/sdk/tsconfig.json +0 -15
  290. package/dist/scaffolds/notis-random/postcss.config.mjs +0 -6
  291. package/dist/scaffolds/notis-random/src/dev-main.tsx +0 -70
  292. package/dist/scaffolds/notis-random/src/mock-runtime.ts +0 -129
  293. package/dist/scaffolds/notis-random/tailwind.config.ts +0 -50
  294. package/dist/scaffolds/notis-random/tsconfig.json +0 -23
  295. package/dist/scaffolds/notis-random/vite.config.ts +0 -11
  296. package/dist/scaffolds.json +0 -49
@@ -1,34 +0,0 @@
1
- {
2
- "name": "notis-journal",
3
- "version": "0.1.0",
4
- "notisAppVersion": "0.1.7",
5
- "private": true,
6
- "type": "module",
7
- "scripts": {
8
- "dev": "vite",
9
- "build": "vite build",
10
- "test": "tsx --test app/journal-core.test.ts"
11
- },
12
- "dependencies": {
13
- "@notis/sdk": "file:./packages/sdk",
14
- "@phosphor-icons/react": "^2.1.10",
15
- "@radix-ui/react-slot": "^1.1.0",
16
- "class-variance-authority": "^0.7.0",
17
- "clsx": "^2.1.1",
18
- "react": "^19.0.0",
19
- "react-dom": "^19.0.0",
20
- "tailwind-merge": "^2.6.0",
21
- "tailwindcss-animate": "^1.0.7"
22
- },
23
- "devDependencies": {
24
- "@types/node": "^22.0.0",
25
- "@types/react": "^19.0.0",
26
- "@types/react-dom": "^19.0.0",
27
- "@vitejs/plugin-react": "^4.0.0",
28
- "postcss": "^8.5.25",
29
- "tailwindcss": "^3.4.0",
30
- "tsx": "^4.21.0",
31
- "typescript": "^5.0.0",
32
- "vite": "^6.0.0"
33
- }
34
- }
@@ -1,36 +0,0 @@
1
- {
2
- "name": "@notis/sdk",
3
- "version": "0.1.0",
4
- "type": "module",
5
- "main": "./src/index.ts",
6
- "exports": {
7
- ".": "./src/index.ts",
8
- "./config": "./src/config.ts",
9
- "./vite": "./src/vite.ts",
10
- "./ui": "./src/ui.ts",
11
- "./styles.css": "./src/styles.css"
12
- },
13
- "files": [
14
- "src",
15
- "template"
16
- ],
17
- "scripts": {
18
- "type-check": "tsc --noEmit"
19
- },
20
- "dependencies": {
21
- "react-markdown": "^10.1.0",
22
- "remark-gfm": "^4.0.1"
23
- },
24
- "peerDependencies": {
25
- "react": ">=18.0.0",
26
- "react-dom": ">=18.0.0",
27
- "vite": ">=5.0.0",
28
- "@vitejs/plugin-react": ">=4.0.0"
29
- },
30
- "devDependencies": {
31
- "@types/node": "^20.0.0",
32
- "@types/react": "^19.0.0",
33
- "@types/react-dom": "^19.0.0",
34
- "typescript": "^5.0.0"
35
- }
36
- }
@@ -1,93 +0,0 @@
1
- 'use client';
2
-
3
- import type { CSSProperties, ReactElement } from 'react';
4
- import { useNotisRuntime } from '../provider';
5
- import { useDocument } from '../hooks/useDocument';
6
- import { Markdown } from './Markdown';
7
- import type { NotisDocumentEditorProps } from '../runtime';
8
-
9
- const fallbackNoticeStyle: CSSProperties = {
10
- marginTop: '0.75rem',
11
- fontSize: '12px',
12
- color: 'hsl(var(--muted-foreground))',
13
- };
14
-
15
- const fallbackFrameStyle: CSSProperties = {
16
- borderRadius: '0.5rem',
17
- border: '1px dashed hsl(var(--border))',
18
- padding: '1rem',
19
- fontSize: '13px',
20
- color: 'hsl(var(--muted-foreground))',
21
- };
22
-
23
- const fallbackTitleStyle: CSSProperties = {
24
- margin: '0 0 0.75rem',
25
- fontSize: '1.5rem',
26
- fontWeight: 700,
27
- letterSpacing: '-0.01em',
28
- color: 'hsl(var(--foreground))',
29
- };
30
-
31
- /**
32
- * Read-only stand-in used when no host editor is available (standalone dev
33
- * harness, snapshots). Markdown content renders via `Markdown`; other content
34
- * types get a typed placeholder.
35
- */
36
- function DocumentEditorFallback({ documentId, variant = 'full', className }: NotisDocumentEditorProps) {
37
- const runtime = useNotisRuntime();
38
- const { document, loading, error } = useDocument(documentId);
39
- // Listing screenshots should show the app as it looks in the portal, so the
40
- // harness-only editing notice stays out of scenario captures.
41
- const isScreenshot = Boolean(runtime?.context?.screenshotScenario);
42
-
43
- if (loading) {
44
- return <div className={className} style={fallbackFrameStyle}>Loading document…</div>;
45
- }
46
- if (error || !document) {
47
- return (
48
- <div className={className} style={fallbackFrameStyle}>
49
- {error?.message ?? 'Document not found.'}
50
- </div>
51
- );
52
- }
53
-
54
- const isMarkdown = document.contentType !== 'file';
55
- return (
56
- <div className={className}>
57
- {variant === 'full' ? <h1 style={fallbackTitleStyle}>{document.title}</h1> : null}
58
- {isMarkdown ? (
59
- <>
60
- <Markdown value={document.contentMarkdown ?? ''} />
61
- {isScreenshot ? null : (
62
- <p style={fallbackNoticeStyle}>Read-only preview — editing is available inside the Notis portal.</p>
63
- )}
64
- </>
65
- ) : (
66
- <div style={fallbackFrameStyle}>
67
- {document.fileType ? `${document.fileType.toUpperCase()} document` : 'File document'} — open it in
68
- the Notis portal to view.
69
- </div>
70
- )}
71
- </div>
72
- );
73
- }
74
-
75
- /**
76
- * Embeds the document editor for a document anywhere in an app view. The host
77
- * (portal) provides the implementation through `runtime.ui.DocumentEditor` and
78
- * dispatches on the document's content type (markdown -> rich text editor,
79
- * files -> matching viewer). Outside the portal this falls back to a read-only
80
- * preview.
81
- *
82
- * ```tsx
83
- * <DocumentEditor documentId={entry.id} variant="body" className="min-h-[320px]" />
84
- * ```
85
- */
86
- export function DocumentEditor(props: NotisDocumentEditorProps): ReactElement {
87
- const runtime = useNotisRuntime();
88
- const HostEditor = runtime?.ui?.DocumentEditor;
89
- if (HostEditor) {
90
- return <HostEditor {...props} />;
91
- }
92
- return <DocumentEditorFallback {...props} />;
93
- }
@@ -1,60 +0,0 @@
1
- 'use client';
2
-
3
- import type { AnchorHTMLAttributes, ReactElement } from 'react';
4
- import ReactMarkdown, { type Components } from 'react-markdown';
5
- import remarkGfm from 'remark-gfm';
6
-
7
- export interface MarkdownProps {
8
- /** Markdown source to render. */
9
- value: string;
10
- /** Typography scale. 'sm' suits dense surfaces (cards, list rows). */
11
- size?: 'sm' | 'base';
12
- className?: string;
13
- /** Per-element overrides, passed through to react-markdown. */
14
- components?: Components;
15
- }
16
-
17
- function MarkdownLink({
18
- href,
19
- children,
20
- node: _node,
21
- ...rest
22
- }: AnchorHTMLAttributes<HTMLAnchorElement> & { node?: unknown }) {
23
- const isExternal = typeof href === 'string' && /^https?:\/\//i.test(href);
24
- return (
25
- <a
26
- href={href}
27
- {...(isExternal ? { target: '_blank', rel: 'noreferrer noopener' } : {})}
28
- {...rest}
29
- >
30
- {children}
31
- </a>
32
- );
33
- }
34
-
35
- const defaultComponents: Components = {
36
- a: MarkdownLink,
37
- };
38
-
39
- /**
40
- * Renders a markdown value with Notis typography. Markdown is a value type:
41
- * use this anywhere markdown appears — document content, database fields,
42
- * generated text. Styling comes from `.notis-markdown` rules in the SDK
43
- * stylesheet and follows the portal theme variables.
44
- */
45
- export function Markdown({ value, size = 'base', className, components }: MarkdownProps): ReactElement {
46
- const classes = ['notis-markdown', size === 'sm' ? 'notis-markdown--sm' : null, className]
47
- .filter(Boolean)
48
- .join(' ');
49
-
50
- return (
51
- <div className={classes}>
52
- <ReactMarkdown
53
- remarkPlugins={[remarkGfm]}
54
- components={components ? { ...defaultComponents, ...components } : defaultComponents}
55
- >
56
- {value}
57
- </ReactMarkdown>
58
- </div>
59
- );
60
- }
@@ -1,278 +0,0 @@
1
- 'use client';
2
-
3
- import {
4
- useEffect,
5
- useMemo,
6
- useRef,
7
- useState,
8
- type CSSProperties,
9
- type ReactElement,
10
- type ReactNode,
11
- } from 'react';
12
-
13
- export interface MultiSelectAction {
14
- id: string;
15
- label: string;
16
- icon: ReactNode;
17
- /** Single-key (e.g. "E", "#") or "Mod+K" shortcut. Bound while the bar is mounted with count > 0. */
18
- shortcut?: string;
19
- onRun: () => void | Promise<void>;
20
- /** Hint for future destructive styling. Currently unused visually. */
21
- destructive?: boolean;
22
- }
23
-
24
- export interface MultiSelectActionBarProps {
25
- selectedCount: number;
26
- actions: MultiSelectAction[];
27
- /** Override the "{count} selected" label units. Default: "selected" with no item word. */
28
- itemLabel?: { singular: string; plural: string };
29
- /** Optional extra class on the outer container (composed alongside the inline styles). */
30
- className?: string;
31
- /** Optional override for the bar's positioning style. Defaults to bottom-center floating. */
32
- style?: CSSProperties;
33
- }
34
-
35
- interface ParsedShortcut {
36
- key: string;
37
- needsMod: boolean;
38
- needsShift: boolean;
39
- }
40
-
41
- function parseShortcut(raw: string): ParsedShortcut | null {
42
- const parts = raw.split('+').map((p) => p.trim()).filter(Boolean);
43
- if (parts.length === 0) return null;
44
- let needsMod = false;
45
- let needsShift = false;
46
- let key = '';
47
- for (const part of parts) {
48
- const lower = part.toLowerCase();
49
- if (lower === 'mod' || lower === 'cmd' || lower === 'ctrl' || lower === 'meta') {
50
- needsMod = true;
51
- } else if (lower === 'shift') {
52
- needsShift = true;
53
- } else {
54
- key = lower;
55
- }
56
- }
57
- if (!key) return null;
58
- return { key, needsMod, needsShift };
59
- }
60
-
61
- function shortcutMatches(shortcut: ParsedShortcut, event: KeyboardEvent): boolean {
62
- const eventKey = event.key.toLowerCase();
63
- // Special-case "#" so Shift+3 matches without the consumer specifying Shift.
64
- if (shortcut.key === '#') {
65
- if (eventKey === '#') return true;
66
- if (event.shiftKey && eventKey === '3') return true;
67
- return false;
68
- }
69
- if (eventKey !== shortcut.key) return false;
70
- if (shortcut.needsMod !== Boolean(event.metaKey || event.ctrlKey)) return false;
71
- if (shortcut.needsShift !== event.shiftKey) return false;
72
- if (event.altKey) return false;
73
- return true;
74
- }
75
-
76
- function isEditableEvent(event: Event): boolean {
77
- // Notis apps mount inside a Shadow DOM, so a document-level listener sees
78
- // `event.target` retargeted to the shadow host. `composedPath()[0]` pierces
79
- // the shadow boundary to the real focused element, so action-bar shortcuts
80
- // don't fire while the user is typing in an app input.
81
- const target = event.composedPath?.()[0] ?? event.target;
82
- if (!(target instanceof HTMLElement)) return false;
83
- if (target.isContentEditable) return true;
84
- const tag = target.tagName;
85
- return tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT';
86
- }
87
-
88
- function shortcutDisplay(raw: string): string {
89
- const parts = raw.split('+').map((p) => p.trim()).filter(Boolean);
90
- return parts
91
- .map((part) => {
92
- const lower = part.toLowerCase();
93
- if (lower === 'mod' || lower === 'cmd' || lower === 'meta') return '⌘';
94
- if (lower === 'ctrl') return '⌃';
95
- if (lower === 'shift') return '⇧';
96
- if (lower === 'alt' || lower === 'option') return '⌥';
97
- return part.length === 1 ? part.toUpperCase() : part;
98
- })
99
- .join('');
100
- }
101
-
102
- const containerBaseStyle: CSSProperties = {
103
- position: 'fixed',
104
- bottom: '1rem',
105
- left: '50%',
106
- transform: 'translateX(-50%)',
107
- zIndex: 60,
108
- display: 'flex',
109
- alignItems: 'center',
110
- gap: '0.25rem',
111
- padding: '0.375rem 0.5rem',
112
- borderRadius: '0.5rem',
113
- background: 'color-mix(in srgb, hsl(var(--foreground)) 95%, transparent)',
114
- color: 'hsl(var(--background))',
115
- boxShadow: '0 10px 25px -10px rgba(0,0,0,0.35), 0 0 0 1px rgba(0,0,0,0.08)',
116
- backdropFilter: 'blur(6px)',
117
- WebkitBackdropFilter: 'blur(6px)',
118
- pointerEvents: 'auto',
119
- fontSize: '13px',
120
- lineHeight: 1.2,
121
- };
122
-
123
- const countStyle: CSSProperties = {
124
- padding: '0 0.5rem',
125
- fontSize: '12px',
126
- fontWeight: 500,
127
- fontVariantNumeric: 'tabular-nums',
128
- color: 'color-mix(in srgb, hsl(var(--background)) 70%, transparent)',
129
- };
130
-
131
- const dividerStyle: CSSProperties = {
132
- width: '1px',
133
- height: '1rem',
134
- margin: '0 0.125rem',
135
- background: 'color-mix(in srgb, hsl(var(--background)) 20%, transparent)',
136
- };
137
-
138
- const baseButtonStyle: CSSProperties = {
139
- display: 'inline-flex',
140
- alignItems: 'center',
141
- gap: '0.375rem',
142
- padding: '0.25rem 0.5rem',
143
- border: 0,
144
- background: 'transparent',
145
- color: 'color-mix(in srgb, hsl(var(--background)) 90%, transparent)',
146
- borderRadius: '0.375rem',
147
- cursor: 'pointer',
148
- fontSize: '13px',
149
- fontFamily: 'inherit',
150
- transition: 'background-color 120ms ease, color 120ms ease',
151
- };
152
-
153
- const keycapStyle: CSSProperties = {
154
- display: 'inline-flex',
155
- alignItems: 'center',
156
- justifyContent: 'center',
157
- minWidth: '20px',
158
- height: '20px',
159
- padding: '0 4px',
160
- borderRadius: '4px',
161
- border: '1px solid color-mix(in srgb, hsl(var(--background)) 20%, transparent)',
162
- background: 'color-mix(in srgb, hsl(var(--background)) 15%, transparent)',
163
- color: 'inherit',
164
- fontSize: '11px',
165
- fontWeight: 500,
166
- lineHeight: 1,
167
- fontFamily: 'inherit',
168
- };
169
-
170
- const iconSlotStyle: CSSProperties = {
171
- display: 'inline-flex',
172
- alignItems: 'center',
173
- justifyContent: 'center',
174
- opacity: 0.8,
175
- };
176
-
177
- export function MultiSelectActionBar({
178
- selectedCount,
179
- actions,
180
- itemLabel,
181
- className,
182
- style,
183
- }: MultiSelectActionBarProps): ReactElement | null {
184
- const actionsRef = useRef(actions);
185
- actionsRef.current = actions;
186
-
187
- const parsedShortcuts = useMemo(() => {
188
- return actions
189
- .map((action) => {
190
- if (!action.shortcut) return null;
191
- const parsed = parseShortcut(action.shortcut);
192
- return parsed ? { action, parsed } : null;
193
- })
194
- .filter((entry): entry is { action: MultiSelectAction; parsed: ParsedShortcut } => entry !== null);
195
- }, [actions]);
196
-
197
- useEffect(() => {
198
- if (selectedCount === 0 || parsedShortcuts.length === 0) return;
199
-
200
- const handleKeyDown = (event: KeyboardEvent) => {
201
- if (isEditableEvent(event)) return;
202
- for (const { action, parsed } of parsedShortcuts) {
203
- if (shortcutMatches(parsed, event)) {
204
- event.preventDefault();
205
- event.stopPropagation();
206
- if (typeof event.stopImmediatePropagation === 'function') {
207
- event.stopImmediatePropagation();
208
- }
209
- void action.onRun();
210
- return;
211
- }
212
- }
213
- };
214
-
215
- document.addEventListener('keydown', handleKeyDown, true);
216
- return () => {
217
- document.removeEventListener('keydown', handleKeyDown, true);
218
- };
219
- }, [parsedShortcuts, selectedCount]);
220
-
221
- if (selectedCount === 0) return null;
222
-
223
- const countWord = itemLabel
224
- ? selectedCount === 1
225
- ? itemLabel.singular
226
- : itemLabel.plural
227
- : 'selected';
228
- const countLabel = itemLabel
229
- ? `${selectedCount} ${countWord} selected`
230
- : `${selectedCount} selected`;
231
-
232
- const composedStyle: CSSProperties = { ...containerBaseStyle, ...(style || {}) };
233
-
234
- return (
235
- <div
236
- role="toolbar"
237
- aria-label={`Bulk actions for ${selectedCount} selected ${countWord}`}
238
- className={className}
239
- style={composedStyle}
240
- >
241
- <span style={countStyle}>{countLabel}</span>
242
- {actions.length > 0 ? <span aria-hidden style={dividerStyle} /> : null}
243
- {actions.map((action) => (
244
- <ActionButton key={action.id} action={action} />
245
- ))}
246
- </div>
247
- );
248
- }
249
-
250
- function ActionButton({ action }: { action: MultiSelectAction }) {
251
- const [hover, setHover] = useState(false);
252
- const display = action.shortcut ? shortcutDisplay(action.shortcut) : null;
253
- const buttonStyle: CSSProperties = {
254
- ...baseButtonStyle,
255
- background: hover
256
- ? 'color-mix(in srgb, hsl(var(--background)) 12%, transparent)'
257
- : 'transparent',
258
- color: hover
259
- ? 'hsl(var(--background))'
260
- : baseButtonStyle.color,
261
- };
262
-
263
- return (
264
- <button
265
- type="button"
266
- onClick={() => void action.onRun()}
267
- onMouseEnter={() => setHover(true)}
268
- onMouseLeave={() => setHover(false)}
269
- onFocus={() => setHover(true)}
270
- onBlur={() => setHover(false)}
271
- style={buttonStyle}
272
- >
273
- <span aria-hidden style={iconSlotStyle}>{action.icon}</span>
274
- {display ? <kbd aria-hidden style={keycapStyle}>{display}</kbd> : null}
275
- <span>{action.label}</span>
276
- </button>
277
- );
278
- }
@@ -1,91 +0,0 @@
1
- 'use client';
2
-
3
- import { type CSSProperties, type MouseEvent as ReactMouseEvent, type ReactElement } from 'react';
4
-
5
- export interface MultiSelectCheckboxProps {
6
- isSelected: boolean;
7
- onClick: (event: ReactMouseEvent) => void;
8
- /** When true, the checkbox is always visible. Default false (hover/focus reveal via the parent's :hover state). */
9
- alwaysVisible?: boolean;
10
- /** Optional aria-label override. Defaults to "Select item" / "Deselect item". */
11
- ariaLabel?: string;
12
- className?: string;
13
- /** Optional inline-style override merged with the defaults. */
14
- style?: CSSProperties;
15
- }
16
-
17
- const baseStyle: CSSProperties = {
18
- flexShrink: 0,
19
- display: 'inline-flex',
20
- alignItems: 'center',
21
- justifyContent: 'center',
22
- width: '16px',
23
- height: '16px',
24
- borderRadius: '4px',
25
- border: '1px solid hsl(var(--border))',
26
- background: 'transparent',
27
- color: 'hsl(var(--primary-foreground))',
28
- cursor: 'pointer',
29
- padding: 0,
30
- transition: 'background-color 120ms ease, border-color 120ms ease, opacity 150ms ease',
31
- };
32
-
33
- const selectedStyle: CSSProperties = {
34
- background: 'hsl(var(--primary))',
35
- borderColor: 'hsl(var(--primary))',
36
- };
37
-
38
- const checkPath = 'M3.5 7.5l2.5 2.5 6.5-6.5';
39
-
40
- export function MultiSelectCheckbox({
41
- isSelected,
42
- onClick,
43
- alwaysVisible = false,
44
- ariaLabel,
45
- className,
46
- style,
47
- }: MultiSelectCheckboxProps): ReactElement {
48
- const merged: CSSProperties = {
49
- ...baseStyle,
50
- ...(isSelected ? selectedStyle : null),
51
- ...(alwaysVisible || isSelected ? { opacity: 1 } : null),
52
- ...(style || null),
53
- };
54
-
55
- // When alwaysVisible is false and the row isn't selected, defer the
56
- // hover-reveal to the parent — consumers wrap the checkbox in a `.group`
57
- // hover scope and pass `data-notis-hover-reveal` styles via className.
58
- // Out of the box, we render the checkbox at full opacity if selected,
59
- // otherwise inherit the parent's reveal state.
60
- return (
61
- <button
62
- type="button"
63
- role="checkbox"
64
- aria-checked={isSelected}
65
- aria-label={ariaLabel ?? (isSelected ? 'Deselect item' : 'Select item')}
66
- onClick={onClick}
67
- onMouseDown={(e) => e.stopPropagation()}
68
- data-notis-multiselect-checkbox=""
69
- data-selected={isSelected ? 'true' : 'false'}
70
- className={className}
71
- style={merged}
72
- >
73
- {isSelected ? (
74
- <svg
75
- width="10"
76
- height="10"
77
- viewBox="0 0 16 16"
78
- fill="none"
79
- stroke="currentColor"
80
- strokeWidth={3}
81
- strokeLinecap="round"
82
- strokeLinejoin="round"
83
- aria-hidden
84
- focusable="false"
85
- >
86
- <path d={checkPath} />
87
- </svg>
88
- ) : null}
89
- </button>
90
- );
91
- }
@@ -1,39 +0,0 @@
1
- 'use client';
2
-
3
- import { type CSSProperties, type ReactElement } from 'react';
4
- import type { DragRect } from '../hooks/useMultiSelect';
5
-
6
- export interface MultiSelectDragOverlayProps {
7
- rect: DragRect | null;
8
- className?: string;
9
- style?: CSSProperties;
10
- }
11
-
12
- const overlayBaseStyle: CSSProperties = {
13
- position: 'fixed',
14
- borderRadius: '3px',
15
- border: '1px solid rgba(35, 131, 226, 0.3)',
16
- background: 'rgba(35, 131, 226, 0.08)',
17
- pointerEvents: 'none',
18
- zIndex: 50,
19
- };
20
-
21
- export function MultiSelectDragOverlay({
22
- rect,
23
- className,
24
- style,
25
- }: MultiSelectDragOverlayProps): ReactElement | null {
26
- if (!rect) return null;
27
- if (rect.width === 0 && rect.height === 0) return null;
28
-
29
- const merged: CSSProperties = {
30
- ...overlayBaseStyle,
31
- left: rect.left,
32
- top: rect.top,
33
- width: rect.width,
34
- height: rect.height,
35
- ...(style || null),
36
- };
37
-
38
- return <div aria-hidden className={className} style={merged} />;
39
- }