@softov/scena 0.1.2

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 (496) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +42 -0
  3. package/dist/controls/command.d.ts +18 -0
  4. package/dist/controls/command.js +150 -0
  5. package/dist/controls/events.d.ts +3 -0
  6. package/dist/controls/events.js +43 -0
  7. package/dist/controls/index.d.ts +10 -0
  8. package/dist/controls/index.js +10 -0
  9. package/dist/controls/keybinding.d.ts +9 -0
  10. package/dist/controls/keybinding.js +94 -0
  11. package/dist/controls/layout.d.ts +16 -0
  12. package/dist/controls/layout.js +201 -0
  13. package/dist/controls/manifest.d.ts +21 -0
  14. package/dist/controls/manifest.js +219 -0
  15. package/dist/controls/session.d.ts +16 -0
  16. package/dist/controls/session.js +95 -0
  17. package/dist/controls/shell.d.ts +8 -0
  18. package/dist/controls/shell.js +48 -0
  19. package/dist/controls/storage/layout-local.d.ts +6 -0
  20. package/dist/controls/storage/layout-local.js +47 -0
  21. package/dist/controls/storage/session-local.d.ts +5 -0
  22. package/dist/controls/storage/session-local.js +38 -0
  23. package/dist/controls/when.d.ts +7 -0
  24. package/dist/controls/when.js +226 -0
  25. package/dist/converters/a2ui-v0.10.d.ts +23 -0
  26. package/dist/converters/a2ui-v0.10.js +136 -0
  27. package/dist/converters/index.d.ts +1 -0
  28. package/dist/converters/index.js +1 -0
  29. package/dist/core/backends/modus-backend.d.ts +13 -0
  30. package/dist/core/backends/modus-backend.js +115 -0
  31. package/dist/core/backends/storage-backend.d.ts +7 -0
  32. package/dist/core/backends/storage-backend.js +73 -0
  33. package/dist/core/backends/yjs-backend.d.ts +3 -0
  34. package/dist/core/backends/yjs-backend.js +44 -0
  35. package/dist/core/binding-resolver.d.ts +7 -0
  36. package/dist/core/binding-resolver.js +106 -0
  37. package/dist/core/component-graph.d.ts +6 -0
  38. package/dist/core/component-graph.js +77 -0
  39. package/dist/core/component-registry.d.ts +7 -0
  40. package/dist/core/component-registry.js +87 -0
  41. package/dist/core/computed-dsl.d.ts +2 -0
  42. package/dist/core/computed-dsl.js +267 -0
  43. package/dist/core/converter-registry.d.ts +2 -0
  44. package/dist/core/converter-registry.js +37 -0
  45. package/dist/core/disposable.d.ts +3 -0
  46. package/dist/core/disposable.js +19 -0
  47. package/dist/core/dynamic-resolver.d.ts +12 -0
  48. package/dist/core/dynamic-resolver.js +134 -0
  49. package/dist/core/index.d.ts +44 -0
  50. package/dist/core/index.js +48 -0
  51. package/dist/core/label.d.ts +2 -0
  52. package/dist/core/label.js +14 -0
  53. package/dist/core/mount-menu.d.ts +2 -0
  54. package/dist/core/mount-menu.js +23 -0
  55. package/dist/core/mount-surface.d.ts +15 -0
  56. package/dist/core/mount-surface.js +214 -0
  57. package/dist/core/path-resolver.d.ts +14 -0
  58. package/dist/core/path-resolver.js +169 -0
  59. package/dist/core/permissions.d.ts +2 -0
  60. package/dist/core/permissions.js +50 -0
  61. package/dist/core/reactive-store.d.ts +17 -0
  62. package/dist/core/reactive-store.js +496 -0
  63. package/dist/core/scena.d.ts +2 -0
  64. package/dist/core/scena.js +115 -0
  65. package/dist/core/surface-presentation.d.ts +6 -0
  66. package/dist/core/surface-presentation.js +12 -0
  67. package/dist/i18n/i18n-backend.d.ts +2 -0
  68. package/dist/i18n/i18n-backend.js +35 -0
  69. package/dist/i18n/registry.d.ts +32 -0
  70. package/dist/i18n/registry.js +200 -0
  71. package/dist/porta/Limen.css +50 -0
  72. package/dist/porta/Limen.d.ts +16 -0
  73. package/dist/porta/Limen.js +14 -0
  74. package/dist/porta/PortaContext.d.ts +10 -0
  75. package/dist/porta/PortaContext.js +20 -0
  76. package/dist/porta/PortaLock.css +14 -0
  77. package/dist/porta/PortaLock.d.ts +10 -0
  78. package/dist/porta/PortaLock.js +13 -0
  79. package/dist/porta/SigillumGate.d.ts +8 -0
  80. package/dist/porta/SigillumGate.js +7 -0
  81. package/dist/porta/commands.d.ts +3 -0
  82. package/dist/porta/commands.js +125 -0
  83. package/dist/porta/index.d.ts +18 -0
  84. package/dist/porta/index.js +22 -0
  85. package/dist/porta/login-form.block.d.ts +2 -0
  86. package/dist/porta/login-form.block.js +7 -0
  87. package/dist/porta/match.d.ts +2 -0
  88. package/dist/porta/match.js +20 -0
  89. package/dist/porta/provider.d.ts +59 -0
  90. package/dist/porta/provider.js +1 -0
  91. package/dist/porta/providers/examples/google-oauth.d.ts +6 -0
  92. package/dist/porta/providers/examples/google-oauth.js +21 -0
  93. package/dist/porta/providers/examples/index.d.ts +6 -0
  94. package/dist/porta/providers/examples/index.js +3 -0
  95. package/dist/porta/providers/examples/magic-link.d.ts +8 -0
  96. package/dist/porta/providers/examples/magic-link.js +31 -0
  97. package/dist/porta/providers/examples/sms-otp.d.ts +9 -0
  98. package/dist/porta/providers/examples/sms-otp.js +31 -0
  99. package/dist/porta/providers/password.d.ts +12 -0
  100. package/dist/porta/providers/password.js +46 -0
  101. package/dist/porta/register-blocks.d.ts +3 -0
  102. package/dist/porta/register-blocks.js +31 -0
  103. package/dist/porta/register.d.ts +15 -0
  104. package/dist/porta/register.js +31 -0
  105. package/dist/porta/sigillum.d.ts +19 -0
  106. package/dist/porta/sigillum.js +41 -0
  107. package/dist/react/DefaultShell.d.ts +1 -0
  108. package/dist/react/DefaultShell.js +37 -0
  109. package/dist/react/Scena.d.ts +9 -0
  110. package/dist/react/Scena.js +20 -0
  111. package/dist/react/ScenaProvider.d.ts +8 -0
  112. package/dist/react/ScenaProvider.js +13 -0
  113. package/dist/react/ShellSplitter.d.ts +13 -0
  114. package/dist/react/ShellSplitter.js +88 -0
  115. package/dist/react/SurfaceArea.d.ts +13 -0
  116. package/dist/react/SurfaceArea.js +75 -0
  117. package/dist/react/Translate.d.ts +8 -0
  118. package/dist/react/Translate.js +10 -0
  119. package/dist/react/ViewMount.d.ts +12 -0
  120. package/dist/react/ViewMount.js +268 -0
  121. package/dist/react/core.d.ts +6 -0
  122. package/dist/react/core.js +10 -0
  123. package/dist/react/hooks/useCommand.d.ts +1 -0
  124. package/dist/react/hooks/useCommand.js +6 -0
  125. package/dist/react/hooks/useI18n.d.ts +9 -0
  126. package/dist/react/hooks/useI18n.js +16 -0
  127. package/dist/react/hooks/useLabel.d.ts +2 -0
  128. package/dist/react/hooks/useLabel.js +19 -0
  129. package/dist/react/hooks/useLayout.d.ts +2 -0
  130. package/dist/react/hooks/useLayout.js +10 -0
  131. package/dist/react/hooks/useMounts.d.ts +2 -0
  132. package/dist/react/hooks/useMounts.js +17 -0
  133. package/dist/react/hooks/useStore.d.ts +3 -0
  134. package/dist/react/hooks/useStore.js +40 -0
  135. package/dist/react/hooks/useStoreLabel.d.ts +3 -0
  136. package/dist/react/hooks/useStoreLabel.js +25 -0
  137. package/dist/react/hooks/useSurfacePresentation.d.ts +4 -0
  138. package/dist/react/hooks/useSurfacePresentation.js +16 -0
  139. package/dist/react/index.d.ts +20 -0
  140. package/dist/react/index.js +20 -0
  141. package/dist/react/mount-context.d.ts +8 -0
  142. package/dist/react/mount-context.js +20 -0
  143. package/dist/react/useSurfaceResize.d.ts +39 -0
  144. package/dist/react/useSurfaceResize.js +135 -0
  145. package/dist/runtime/args-schema.d.ts +11 -0
  146. package/dist/runtime/args-schema.js +45 -0
  147. package/dist/runtime/builtins.d.ts +3 -0
  148. package/dist/runtime/builtins.js +193 -0
  149. package/dist/runtime/client-handlers.d.ts +3 -0
  150. package/dist/runtime/client-handlers.js +19 -0
  151. package/dist/runtime/in-memory-socket.d.ts +7 -0
  152. package/dist/runtime/in-memory-socket.js +53 -0
  153. package/dist/runtime/index.d.ts +10 -0
  154. package/dist/runtime/index.js +7 -0
  155. package/dist/runtime/layout-commands.d.ts +5 -0
  156. package/dist/runtime/layout-commands.js +548 -0
  157. package/dist/runtime/opener-commands.d.ts +17 -0
  158. package/dist/runtime/opener-commands.js +96 -0
  159. package/dist/runtime/surface-bridge.d.ts +15 -0
  160. package/dist/runtime/surface-bridge.js +116 -0
  161. package/dist/styles/bar.css +155 -0
  162. package/dist/styles/base.css +285 -0
  163. package/dist/styles/geometry.css +32 -0
  164. package/dist/styles/index.d.ts +29 -0
  165. package/dist/styles/index.js +109 -0
  166. package/dist/styles/scrollbar.css +45 -0
  167. package/dist/styles/surface.css +179 -0
  168. package/dist/styles/theme.css +3 -0
  169. package/dist/styles/themes/dark.css +30 -0
  170. package/dist/styles/themes/light.css +1 -0
  171. package/dist/styles/themes/tokens.css +222 -0
  172. package/dist/types/binding-resolver.d.ts +30 -0
  173. package/dist/types/binding-resolver.js +1 -0
  174. package/dist/types/colors.d.ts +7 -0
  175. package/dist/types/colors.js +59 -0
  176. package/dist/types/command.d.ts +62 -0
  177. package/dist/types/command.js +1 -0
  178. package/dist/types/component-graph.d.ts +72 -0
  179. package/dist/types/component-graph.js +40 -0
  180. package/dist/types/component-registry.d.ts +70 -0
  181. package/dist/types/component-registry.js +1 -0
  182. package/dist/types/converter-registry.d.ts +17 -0
  183. package/dist/types/converter-registry.js +1 -0
  184. package/dist/types/disposable.d.ts +3 -0
  185. package/dist/types/disposable.js +1 -0
  186. package/dist/types/events.d.ts +75 -0
  187. package/dist/types/events.js +1 -0
  188. package/dist/types/host.d.ts +50 -0
  189. package/dist/types/host.js +1 -0
  190. package/dist/types/index.d.ts +23 -0
  191. package/dist/types/index.js +23 -0
  192. package/dist/types/keybinding.d.ts +36 -0
  193. package/dist/types/keybinding.js +1 -0
  194. package/dist/types/label.d.ts +9 -0
  195. package/dist/types/label.js +1 -0
  196. package/dist/types/layout.d.ts +117 -0
  197. package/dist/types/layout.js +1 -0
  198. package/dist/types/manifest.d.ts +152 -0
  199. package/dist/types/manifest.js +1 -0
  200. package/dist/types/mount-menu.d.ts +8 -0
  201. package/dist/types/mount-menu.js +1 -0
  202. package/dist/types/mount-surface.d.ts +87 -0
  203. package/dist/types/mount-surface.js +1 -0
  204. package/dist/types/permissions.d.ts +18 -0
  205. package/dist/types/permissions.js +1 -0
  206. package/dist/types/query.d.ts +34 -0
  207. package/dist/types/query.js +7 -0
  208. package/dist/types/reactive-store.d.ts +39 -0
  209. package/dist/types/reactive-store.js +1 -0
  210. package/dist/types/scena.d.ts +53 -0
  211. package/dist/types/scena.js +1 -0
  212. package/dist/types/scope-backend.d.ts +16 -0
  213. package/dist/types/scope-backend.js +1 -0
  214. package/dist/types/session.d.ts +39 -0
  215. package/dist/types/session.js +1 -0
  216. package/dist/types/shell.d.ts +21 -0
  217. package/dist/types/shell.js +1 -0
  218. package/dist/types/when.d.ts +10 -0
  219. package/dist/types/when.js +1 -0
  220. package/dist/ui/_utils.d.ts +8 -0
  221. package/dist/ui/_utils.js +53 -0
  222. package/dist/ui/campus/CampusMappa.d.ts +18 -0
  223. package/dist/ui/campus/CampusMappa.js +106 -0
  224. package/dist/ui/campus/CampusNodus.d.ts +25 -0
  225. package/dist/ui/campus/CampusNodus.js +211 -0
  226. package/dist/ui/campus/CampusStratum.d.ts +13 -0
  227. package/dist/ui/campus/CampusStratum.js +20 -0
  228. package/dist/ui/campus/CampusVelum.d.ts +7 -0
  229. package/dist/ui/campus/CampusVelum.js +12 -0
  230. package/dist/ui/campus/CampusView.d.ts +27 -0
  231. package/dist/ui/campus/CampusView.js +420 -0
  232. package/dist/ui/campus/context.d.ts +13 -0
  233. package/dist/ui/campus/context.js +12 -0
  234. package/dist/ui/campus/index.d.ts +14 -0
  235. package/dist/ui/campus/index.js +11 -0
  236. package/dist/ui/campus/stratum-context.d.ts +2 -0
  237. package/dist/ui/campus/stratum-context.js +10 -0
  238. package/dist/ui/campus/types.d.ts +47 -0
  239. package/dist/ui/campus/types.js +4 -0
  240. package/dist/ui/chart/BarChart.css +53 -0
  241. package/dist/ui/chart/BarChart.d.ts +24 -0
  242. package/dist/ui/chart/BarChart.js +32 -0
  243. package/dist/ui/chart/Donut.css +15 -0
  244. package/dist/ui/chart/Donut.d.ts +15 -0
  245. package/dist/ui/chart/Donut.js +18 -0
  246. package/dist/ui/chart/LineChart.css +8 -0
  247. package/dist/ui/chart/LineChart.d.ts +24 -0
  248. package/dist/ui/chart/LineChart.js +29 -0
  249. package/dist/ui/chart/catalog.d.ts +2 -0
  250. package/dist/ui/chart/catalog.js +7 -0
  251. package/dist/ui/chart/index.d.ts +6 -0
  252. package/dist/ui/chart/index.js +4 -0
  253. package/dist/ui/control/Button.css +7 -0
  254. package/dist/ui/control/Button.d.ts +17 -0
  255. package/dist/ui/control/Button.js +17 -0
  256. package/dist/ui/control/CheckBox.css +16 -0
  257. package/dist/ui/control/CheckBox.d.ts +15 -0
  258. package/dist/ui/control/CheckBox.js +23 -0
  259. package/dist/ui/control/Checks.css +6 -0
  260. package/dist/ui/control/Checks.d.ts +9 -0
  261. package/dist/ui/control/Checks.js +10 -0
  262. package/dist/ui/control/ChoicePicker.css +16 -0
  263. package/dist/ui/control/ChoicePicker.d.ts +25 -0
  264. package/dist/ui/control/ChoicePicker.js +38 -0
  265. package/dist/ui/control/DateTimeInput.css +1 -0
  266. package/dist/ui/control/DateTimeInput.d.ts +22 -0
  267. package/dist/ui/control/DateTimeInput.js +41 -0
  268. package/dist/ui/control/LocaleToggle.css +38 -0
  269. package/dist/ui/control/LocaleToggle.d.ts +11 -0
  270. package/dist/ui/control/LocaleToggle.js +23 -0
  271. package/dist/ui/control/ReloadButton.d.ts +6 -0
  272. package/dist/ui/control/ReloadButton.js +9 -0
  273. package/dist/ui/control/Slider.css +2 -0
  274. package/dist/ui/control/Slider.d.ts +21 -0
  275. package/dist/ui/control/Slider.js +37 -0
  276. package/dist/ui/control/TextField.css +0 -0
  277. package/dist/ui/control/TextField.d.ts +25 -0
  278. package/dist/ui/control/TextField.js +36 -0
  279. package/dist/ui/control/_field-parts.css +102 -0
  280. package/dist/ui/control/_field-parts.d.ts +15 -0
  281. package/dist/ui/control/_field-parts.js +17 -0
  282. package/dist/ui/control/catalog.d.ts +2 -0
  283. package/dist/ui/control/catalog.js +10 -0
  284. package/dist/ui/control/index.d.ts +13 -0
  285. package/dist/ui/control/index.js +11 -0
  286. package/dist/ui/data/DataTable.d.ts +19 -0
  287. package/dist/ui/data/DataTable.js +20 -0
  288. package/dist/ui/data/Filter.d.ts +13 -0
  289. package/dist/ui/data/Filter.js +56 -0
  290. package/dist/ui/data/List.css +16 -0
  291. package/dist/ui/data/List.d.ts +15 -0
  292. package/dist/ui/data/List.js +18 -0
  293. package/dist/ui/data/Listable.css +245 -0
  294. package/dist/ui/data/Listable.d.ts +60 -0
  295. package/dist/ui/data/Listable.js +209 -0
  296. package/dist/ui/data/Pagination.d.ts +5 -0
  297. package/dist/ui/data/Pagination.js +43 -0
  298. package/dist/ui/data/Tree.css +118 -0
  299. package/dist/ui/data/Tree.d.ts +45 -0
  300. package/dist/ui/data/Tree.js +170 -0
  301. package/dist/ui/data/catalog.d.ts +2 -0
  302. package/dist/ui/data/catalog.js +7 -0
  303. package/dist/ui/data/index.d.ts +11 -0
  304. package/dist/ui/data/index.js +7 -0
  305. package/dist/ui/display/AddPlaceholder.d.ts +6 -0
  306. package/dist/ui/display/AddPlaceholder.js +24 -0
  307. package/dist/ui/display/Alert.css +42 -0
  308. package/dist/ui/display/Alert.d.ts +14 -0
  309. package/dist/ui/display/Alert.js +13 -0
  310. package/dist/ui/display/Avatar.css +19 -0
  311. package/dist/ui/display/Avatar.d.ts +16 -0
  312. package/dist/ui/display/Avatar.js +52 -0
  313. package/dist/ui/display/Badge.css +26 -0
  314. package/dist/ui/display/Badge.d.ts +16 -0
  315. package/dist/ui/display/Badge.js +9 -0
  316. package/dist/ui/display/Card.css +15 -0
  317. package/dist/ui/display/Card.d.ts +11 -0
  318. package/dist/ui/display/Card.js +8 -0
  319. package/dist/ui/display/DetailContainer.d.ts +6 -0
  320. package/dist/ui/display/DetailContainer.js +7 -0
  321. package/dist/ui/display/DetailHeader.css +53 -0
  322. package/dist/ui/display/DetailHeader.d.ts +22 -0
  323. package/dist/ui/display/DetailHeader.js +8 -0
  324. package/dist/ui/display/DetailList.css +26 -0
  325. package/dist/ui/display/DetailList.d.ts +13 -0
  326. package/dist/ui/display/DetailList.js +5 -0
  327. package/dist/ui/display/DetailNotFound.d.ts +17 -0
  328. package/dist/ui/display/DetailNotFound.js +39 -0
  329. package/dist/ui/display/Divider.css +6 -0
  330. package/dist/ui/display/Divider.d.ts +8 -0
  331. package/dist/ui/display/Divider.js +16 -0
  332. package/dist/ui/display/Divisor.css +30 -0
  333. package/dist/ui/display/Divisor.d.ts +11 -0
  334. package/dist/ui/display/Divisor.js +43 -0
  335. package/dist/ui/display/Icon.css +10 -0
  336. package/dist/ui/display/Icon.d.ts +14 -0
  337. package/dist/ui/display/Icon.js +144 -0
  338. package/dist/ui/display/Image.css +1 -0
  339. package/dist/ui/display/Image.d.ts +16 -0
  340. package/dist/ui/display/Image.js +19 -0
  341. package/dist/ui/display/Markdown.css +38 -0
  342. package/dist/ui/display/Markdown.d.ts +8 -0
  343. package/dist/ui/display/Markdown.js +140 -0
  344. package/dist/ui/display/Progress.css +39 -0
  345. package/dist/ui/display/Progress.d.ts +15 -0
  346. package/dist/ui/display/Progress.js +17 -0
  347. package/dist/ui/display/SectionTitle.d.ts +6 -0
  348. package/dist/ui/display/SectionTitle.js +6 -0
  349. package/dist/ui/display/Skeleton.css +20 -0
  350. package/dist/ui/display/Skeleton.d.ts +11 -0
  351. package/dist/ui/display/Skeleton.js +11 -0
  352. package/dist/ui/display/Spinner.css +20 -0
  353. package/dist/ui/display/Spinner.d.ts +12 -0
  354. package/dist/ui/display/Spinner.js +12 -0
  355. package/dist/ui/display/Svg.d.ts +13 -0
  356. package/dist/ui/display/Svg.js +17 -0
  357. package/dist/ui/display/Text.css +20 -0
  358. package/dist/ui/display/Text.d.ts +13 -0
  359. package/dist/ui/display/Text.js +15 -0
  360. package/dist/ui/display/catalog.d.ts +2 -0
  361. package/dist/ui/display/catalog.js +12 -0
  362. package/dist/ui/display/index.d.ts +22 -0
  363. package/dist/ui/display/index.js +14 -0
  364. package/dist/ui/embed/HtmlEmbed.d.ts +12 -0
  365. package/dist/ui/embed/HtmlEmbed.js +16 -0
  366. package/dist/ui/embed/index.d.ts +2 -0
  367. package/dist/ui/embed/index.js +1 -0
  368. package/dist/ui/forms/DangerZone.d.ts +8 -0
  369. package/dist/ui/forms/DangerZone.js +31 -0
  370. package/dist/ui/forms/Field.css +15 -0
  371. package/dist/ui/forms/Field.d.ts +28 -0
  372. package/dist/ui/forms/Field.js +25 -0
  373. package/dist/ui/forms/FieldGroup.css +15 -0
  374. package/dist/ui/forms/FieldGroup.d.ts +7 -0
  375. package/dist/ui/forms/FieldGroup.js +7 -0
  376. package/dist/ui/forms/Form.css +14 -0
  377. package/dist/ui/forms/Form.d.ts +18 -0
  378. package/dist/ui/forms/Form.js +17 -0
  379. package/dist/ui/forms/FormActions.css +11 -0
  380. package/dist/ui/forms/FormActions.d.ts +18 -0
  381. package/dist/ui/forms/FormActions.js +10 -0
  382. package/dist/ui/forms/FormSection.css +19 -0
  383. package/dist/ui/forms/FormSection.d.ts +7 -0
  384. package/dist/ui/forms/FormSection.js +7 -0
  385. package/dist/ui/forms/LoginForm.css +105 -0
  386. package/dist/ui/forms/LoginForm.d.ts +12 -0
  387. package/dist/ui/forms/LoginForm.js +137 -0
  388. package/dist/ui/forms/SchemaForm.css +81 -0
  389. package/dist/ui/forms/SchemaForm.d.ts +26 -0
  390. package/dist/ui/forms/SchemaForm.js +186 -0
  391. package/dist/ui/forms/SettingsContainer.d.ts +8 -0
  392. package/dist/ui/forms/SettingsContainer.js +8 -0
  393. package/dist/ui/forms/catalog.d.ts +2 -0
  394. package/dist/ui/forms/catalog.js +11 -0
  395. package/dist/ui/forms/index.d.ts +19 -0
  396. package/dist/ui/forms/index.js +12 -0
  397. package/dist/ui/forms/schema-walk.d.ts +50 -0
  398. package/dist/ui/forms/schema-walk.js +116 -0
  399. package/dist/ui/index.d.ts +58 -0
  400. package/dist/ui/index.js +63 -0
  401. package/dist/ui/layout/BarLayout.d.ts +2 -0
  402. package/dist/ui/layout/BarLayout.js +18 -0
  403. package/dist/ui/layout/Column.css +6 -0
  404. package/dist/ui/layout/Column.d.ts +12 -0
  405. package/dist/ui/layout/Column.js +13 -0
  406. package/dist/ui/layout/FloatingLayout.d.ts +2 -0
  407. package/dist/ui/layout/FloatingLayout.js +12 -0
  408. package/dist/ui/layout/Grid.css +5 -0
  409. package/dist/ui/layout/Grid.d.ts +13 -0
  410. package/dist/ui/layout/Grid.js +19 -0
  411. package/dist/ui/layout/InlineLayout.d.ts +2 -0
  412. package/dist/ui/layout/InlineLayout.js +13 -0
  413. package/dist/ui/layout/MountTitle.d.ts +12 -0
  414. package/dist/ui/layout/MountTitle.js +42 -0
  415. package/dist/ui/layout/RailLayout.d.ts +2 -0
  416. package/dist/ui/layout/RailLayout.js +38 -0
  417. package/dist/ui/layout/Row.css +16 -0
  418. package/dist/ui/layout/Row.d.ts +13 -0
  419. package/dist/ui/layout/Row.js +21 -0
  420. package/dist/ui/layout/SectionHeader.d.ts +10 -0
  421. package/dist/ui/layout/SectionHeader.js +65 -0
  422. package/dist/ui/layout/SingleLayout.d.ts +2 -0
  423. package/dist/ui/layout/SingleLayout.js +25 -0
  424. package/dist/ui/layout/SpatialCard.d.ts +9 -0
  425. package/dist/ui/layout/SpatialCard.js +30 -0
  426. package/dist/ui/layout/SpatialLayout.d.ts +2 -0
  427. package/dist/ui/layout/SpatialLayout.js +446 -0
  428. package/dist/ui/layout/SplitLayout.d.ts +2 -0
  429. package/dist/ui/layout/SplitLayout.js +159 -0
  430. package/dist/ui/layout/Splitter.d.ts +12 -0
  431. package/dist/ui/layout/Splitter.js +64 -0
  432. package/dist/ui/layout/StackHeader.d.ts +9 -0
  433. package/dist/ui/layout/StackHeader.js +87 -0
  434. package/dist/ui/layout/StackLayout.d.ts +2 -0
  435. package/dist/ui/layout/StackLayout.js +137 -0
  436. package/dist/ui/layout/TabLayout.d.ts +2 -0
  437. package/dist/ui/layout/TabLayout.js +145 -0
  438. package/dist/ui/layout/TabPanelLayout.d.ts +20 -0
  439. package/dist/ui/layout/TabPanelLayout.js +615 -0
  440. package/dist/ui/layout/catalog.d.ts +2 -0
  441. package/dist/ui/layout/catalog.js +10 -0
  442. package/dist/ui/layout/index.d.ts +17 -0
  443. package/dist/ui/layout/index.js +17 -0
  444. package/dist/ui/layout/register.d.ts +3 -0
  445. package/dist/ui/layout/register.js +25 -0
  446. package/dist/ui/media/Audio.css +1 -0
  447. package/dist/ui/media/Audio.d.ts +12 -0
  448. package/dist/ui/media/Audio.js +8 -0
  449. package/dist/ui/media/Video.css +1 -0
  450. package/dist/ui/media/Video.d.ts +16 -0
  451. package/dist/ui/media/Video.js +9 -0
  452. package/dist/ui/media/catalog.d.ts +2 -0
  453. package/dist/ui/media/catalog.js +5 -0
  454. package/dist/ui/media/index.d.ts +2 -0
  455. package/dist/ui/media/index.js +3 -0
  456. package/dist/ui/menu/ActionList.css +262 -0
  457. package/dist/ui/menu/ActionList.d.ts +19 -0
  458. package/dist/ui/menu/ActionList.js +369 -0
  459. package/dist/ui/menu/ContainerMenu.d.ts +13 -0
  460. package/dist/ui/menu/ContainerMenu.js +57 -0
  461. package/dist/ui/menu/ContextMenu.d.ts +27 -0
  462. package/dist/ui/menu/ContextMenu.js +93 -0
  463. package/dist/ui/menu/index.d.ts +10 -0
  464. package/dist/ui/menu/index.js +7 -0
  465. package/dist/ui/menu/token.d.ts +22 -0
  466. package/dist/ui/menu/token.js +145 -0
  467. package/dist/ui/menu/useChatPicker.d.ts +24 -0
  468. package/dist/ui/menu/useChatPicker.js +210 -0
  469. package/dist/ui/navigation/Breadcrumb.css +30 -0
  470. package/dist/ui/navigation/Breadcrumb.d.ts +14 -0
  471. package/dist/ui/navigation/Breadcrumb.js +12 -0
  472. package/dist/ui/navigation/Link.css +13 -0
  473. package/dist/ui/navigation/Link.d.ts +18 -0
  474. package/dist/ui/navigation/Link.js +43 -0
  475. package/dist/ui/navigation/Tabs.css +39 -0
  476. package/dist/ui/navigation/Tabs.d.ts +18 -0
  477. package/dist/ui/navigation/Tabs.js +55 -0
  478. package/dist/ui/navigation/Toolbar.css +25 -0
  479. package/dist/ui/navigation/Toolbar.d.ts +12 -0
  480. package/dist/ui/navigation/Toolbar.js +21 -0
  481. package/dist/ui/navigation/catalog.d.ts +2 -0
  482. package/dist/ui/navigation/catalog.js +5 -0
  483. package/dist/ui/navigation/index.d.ts +8 -0
  484. package/dist/ui/navigation/index.js +5 -0
  485. package/dist/ui/overlay/Modal.css +35 -0
  486. package/dist/ui/overlay/Modal.d.ts +12 -0
  487. package/dist/ui/overlay/Modal.js +57 -0
  488. package/dist/ui/overlay/Popup.d.ts +12 -0
  489. package/dist/ui/overlay/Popup.js +74 -0
  490. package/dist/ui/overlay/catalog.d.ts +2 -0
  491. package/dist/ui/overlay/catalog.js +4 -0
  492. package/dist/ui/overlay/index.d.ts +1 -0
  493. package/dist/ui/overlay/index.js +2 -0
  494. package/dist/ui/register.d.ts +6 -0
  495. package/dist/ui/register.js +26 -0
  496. package/package.json +115 -0
@@ -0,0 +1,32 @@
1
+ export type MessageTree = {
2
+ [segment: string]: string | MessageTree;
3
+ };
4
+ export interface LocaleInfo {
5
+ locale: string;
6
+ language?: string;
7
+ country?: string;
8
+ emoji?: string;
9
+ name?: string;
10
+ dir?: 'ltr' | 'rtl';
11
+ }
12
+ export interface RegisterMessagesExtra extends Omit<LocaleInfo, 'locale'> {
13
+ namespace?: string;
14
+ }
15
+ export declare function registerLocale(info: LocaleInfo): void;
16
+ export declare function registerMessages(locale: string, messages: Record<string, unknown>, extra?: RegisterMessagesExtra): void;
17
+ export declare function unregisterMessages(locale: string, namespace?: string): void;
18
+ export declare function setLocale(locale: string): void;
19
+ export declare function getLocale(): string;
20
+ export declare function setFallbackLocale(locale: string): void;
21
+ export declare function listLocales(): string[];
22
+ export declare function listLocaleInfo(): LocaleInfo[];
23
+ export declare function getLocaleInfo(locale?: string): LocaleInfo | undefined;
24
+ export declare function resolveMessage(key: string, locale?: string): string | MessageTree | undefined;
25
+ export declare function lookup(key: string, locale?: string): string | undefined;
26
+ export type TranslateOptions = {
27
+ fallback?: string;
28
+ } & Record<string, unknown>;
29
+ export declare function translate(key: string, fallbackOrOptions?: string | TranslateOptions): string;
30
+ export declare function allKeys(): string[];
31
+ export declare function subscribeI18n(listener: () => void): () => void;
32
+ export declare function clearMessages(): void;
@@ -0,0 +1,200 @@
1
+ // i18n message registry — the source of truth for translations + the active
2
+ // locale. A module singleton so synchronous `translate()` works ANYWHERE
3
+ // (React, plain TS error throws, provider field labels) without a store ref.
4
+ //
5
+ // Messages are stored as a TREE per locale (nested objects — exactly the shape
6
+ // of an `en.json`), NOT a flat map: `registerMessages` deep-merges subtrees,
7
+ // keys address into the tree, and a whole namespace/subtree can be dropped.
8
+ // Keys accept `/` or `.` separators (`setup/title` == `setup.title`).
9
+ //
10
+ // The `$/t` ScopeBackend (i18n-backend.ts) projects this into the reactive
11
+ // store so declarative ComponentNodes can bind `{ path: '$/t/setup/title' }`;
12
+ // the useT hook reads it reactively for hand-written React.
13
+ const locales = new Map();
14
+ const localeInfo = new Map();
15
+ const listeners = new Set();
16
+ let currentLocale = 'en';
17
+ let fallbackLocale = 'en';
18
+ function notify() {
19
+ for (const l of [...listeners])
20
+ l();
21
+ }
22
+ function splitKey(key) {
23
+ return key.split(/[./]/).filter(Boolean);
24
+ }
25
+ function setAt(tree, segs, value) {
26
+ let node = tree;
27
+ for (let i = 0; i < segs.length - 1; i++) {
28
+ const s = segs[i];
29
+ const next = node[s];
30
+ if (typeof next !== 'object' || next === null)
31
+ node[s] = {};
32
+ node = node[s];
33
+ }
34
+ node[segs[segs.length - 1]] = value;
35
+ }
36
+ function resolveAt(tree, segs) {
37
+ let node = tree;
38
+ for (const s of segs) {
39
+ if (typeof node !== 'object' || node === null)
40
+ return undefined;
41
+ node = node[s];
42
+ }
43
+ return node;
44
+ }
45
+ // Deep-merge a (possibly nested, possibly dotted-key) message object into the
46
+ // locale tree, under an optional namespace prefix.
47
+ function merge(tree, src, prefix) {
48
+ for (const [k, v] of Object.entries(src)) {
49
+ const segs = [...prefix, ...splitKey(k)];
50
+ if (v && typeof v === 'object' && !Array.isArray(v)) {
51
+ merge(tree, v, segs);
52
+ }
53
+ else {
54
+ setAt(tree, segs, String(v));
55
+ }
56
+ }
57
+ }
58
+ // `\{` / `\}` render literal braces; `{token}` interpolates from params (left
59
+ // untouched when no params are supplied, so a template can survive round-trips).
60
+ function interpolate(tpl, params) {
61
+ return tpl.replace(/\\([{}])|\{(\w+)\}/g, (match, esc, token) => {
62
+ if (esc)
63
+ return esc;
64
+ if (!params)
65
+ return match;
66
+ const v = params[token];
67
+ return v == null ? '' : String(v);
68
+ });
69
+ }
70
+ function collectLeaves(node, prefix, out) {
71
+ for (const [seg, v] of Object.entries(node)) {
72
+ if (typeof v === 'object' && v !== null)
73
+ collectLeaves(v, [...prefix, seg], out);
74
+ else
75
+ out.add([...prefix, seg].join('/'));
76
+ }
77
+ }
78
+ function deriveLocaleParts(locale) {
79
+ const [language, country] = locale.split('-');
80
+ return country ? { language, country } : { language };
81
+ }
82
+ // Register a locale's metadata (emoji/name/dir) for pickers — independent of
83
+ // messages, so an inline-fallback locale (e.g. 'en') still appears in a toggle.
84
+ export function registerLocale(info) {
85
+ const prev = localeInfo.get(info.locale);
86
+ localeInfo.set(info.locale, { ...deriveLocaleParts(info.locale), ...prev, ...info });
87
+ notify();
88
+ }
89
+ // Merge a dictionary into a locale's tree. `messages` may be nested or use
90
+ // dotted/slashed keys. `extra.namespace` prefixes every key; the remaining
91
+ // `extra` fields (emoji/name/country/language/dir) are merged into the locale's
92
+ // metadata. Plugins call this on load; the $/t backend + useI18n refresh.
93
+ export function registerMessages(locale, messages, extra) {
94
+ const tree = locales.get(locale) ?? {};
95
+ merge(tree, messages, extra?.namespace ? splitKey(extra.namespace) : []);
96
+ locales.set(locale, tree);
97
+ if (extra) {
98
+ const meta = { ...extra };
99
+ delete meta.namespace;
100
+ if (Object.keys(meta).length) {
101
+ const prev = localeInfo.get(locale);
102
+ localeInfo.set(locale, {
103
+ ...deriveLocaleParts(locale),
104
+ ...prev,
105
+ ...meta,
106
+ locale,
107
+ });
108
+ }
109
+ }
110
+ notify();
111
+ }
112
+ // Drop a subtree (namespace) from a locale, or the whole locale when no
113
+ // namespace is given. The tree shape makes this O(subtree).
114
+ export function unregisterMessages(locale, namespace) {
115
+ if (!namespace) {
116
+ locales.delete(locale);
117
+ notify();
118
+ return;
119
+ }
120
+ const segs = splitKey(namespace);
121
+ const parent = resolveAt(locales.get(locale), segs.slice(0, -1));
122
+ if (parent && typeof parent === 'object')
123
+ delete parent[segs[segs.length - 1]];
124
+ notify();
125
+ }
126
+ export function setLocale(locale) {
127
+ if (locale === currentLocale)
128
+ return;
129
+ currentLocale = locale;
130
+ notify();
131
+ }
132
+ export function getLocale() {
133
+ return currentLocale;
134
+ }
135
+ export function setFallbackLocale(locale) {
136
+ fallbackLocale = locale;
137
+ }
138
+ export function listLocales() {
139
+ return [...locales.keys()];
140
+ }
141
+ // All known locales (those with registered messages and/or metadata), for
142
+ // language pickers. Locales known only by messages get a derived default.
143
+ export function listLocaleInfo() {
144
+ const out = new Map();
145
+ for (const loc of locales.keys())
146
+ out.set(loc, { locale: loc, ...deriveLocaleParts(loc) });
147
+ for (const [loc, info] of localeInfo)
148
+ out.set(loc, info);
149
+ return [...out.values()];
150
+ }
151
+ // Metadata for one locale (defaults to the active locale). undefined when the
152
+ // locale is entirely unknown.
153
+ export function getLocaleInfo(locale = currentLocale) {
154
+ return (localeInfo.get(locale) ??
155
+ (locales.has(locale) ? { locale, ...deriveLocaleParts(locale) } : undefined));
156
+ }
157
+ // Resolve a key to its tree node (leaf string OR subtree object) for the active
158
+ // locale, falling back to fallbackLocale. Used by the $/t backend so a binding
159
+ // can target a leaf or a whole subtree.
160
+ export function resolveMessage(key, locale = currentLocale) {
161
+ const segs = splitKey(key);
162
+ return resolveAt(locales.get(locale), segs) ?? resolveAt(locales.get(fallbackLocale), segs);
163
+ }
164
+ // Leaf string for a key (undefined when missing or pointing at a subtree).
165
+ export function lookup(key, locale = currentLocale) {
166
+ const v = resolveMessage(key, locale);
167
+ return typeof v === 'string' ? v : undefined;
168
+ }
169
+ // Translate + interpolate. The key is ALWAYS a lookup key (never a template).
170
+ // 2nd arg: a string (shorthand for `{ fallback }`) OR the flat options object:
171
+ // translate('setup.title', 'Set up doop') // shorthand
172
+ // translate('signedInAs', { name, fallback: 'Signed in as {name}' })
173
+ // translate('wall.title') // no opts
174
+ // Active locale → fallbackLocale → fallback. A missing key with no fallback
175
+ // yields the `{key}` marker so gaps stay visible.
176
+ export function translate(key, fallbackOrOptions) {
177
+ const opts = typeof fallbackOrOptions === 'string' ? { fallback: fallbackOrOptions } : fallbackOrOptions;
178
+ const tpl = lookup(key) ?? opts?.fallback;
179
+ if (tpl === undefined)
180
+ return `{${splitKey(key).join('/')}}`;
181
+ return interpolate(tpl, opts);
182
+ }
183
+ export function allKeys() {
184
+ const set = new Set();
185
+ for (const tree of locales.values())
186
+ collectLeaves(tree, [], set);
187
+ return [...set];
188
+ }
189
+ export function subscribeI18n(listener) {
190
+ listeners.add(listener);
191
+ return () => void listeners.delete(listener);
192
+ }
193
+ // Test helper — clears all messages + resets locale.
194
+ export function clearMessages() {
195
+ locales.clear();
196
+ localeInfo.clear();
197
+ currentLocale = 'en';
198
+ fallbackLocale = 'en';
199
+ notify();
200
+ }
@@ -0,0 +1,50 @@
1
+ .porta-limen {
2
+ display: grid;
3
+ grid-template-rows: auto 1fr auto;
4
+ grid-template-columns: auto 1fr auto;
5
+ grid-template-areas:
6
+ 'top top top'
7
+ 'left center right'
8
+ 'bottom bottom bottom';
9
+ height: 100%;
10
+ min-height: 0;
11
+ width: 100%;
12
+ background: var(--oo-color-canvas);
13
+ color: var(--oo-color-fg);
14
+ }
15
+ .porta-limen__top { grid-area: top; }
16
+ .porta-limen__bottom { grid-area: bottom; }
17
+ .porta-limen__left { grid-area: left; }
18
+ .porta-limen__right { grid-area: right; }
19
+
20
+ .porta-limen__center {
21
+ grid-area: center;
22
+ display: flex;
23
+ align-items: center;
24
+ justify-content: center;
25
+ padding: var(--oo-spacing-lg);
26
+ min-height: 0;
27
+ overflow: auto;
28
+ }
29
+
30
+ .porta-limen__panel {
31
+ width: 100%;
32
+ max-width: 380px;
33
+ display: flex;
34
+ flex-direction: column;
35
+ gap: var(--oo-spacing-md);
36
+ padding: var(--oo-spacing-lg);
37
+ border: 1px solid var(--oo-color-border);
38
+ border-radius: var(--oo-radius-md);
39
+ background: var(--oo-color-surface);
40
+ box-shadow: var(--oo-shadow-md);
41
+ }
42
+
43
+ .porta-limen__title {
44
+ font-size: var(--oo-font-size-lg);
45
+ font-weight: 600;
46
+ }
47
+ .porta-limen__subtitle {
48
+ color: var(--oo-color-muted);
49
+ font-size: var(--oo-font-size-sm);
50
+ }
@@ -0,0 +1,16 @@
1
+ import { type ReactNode } from 'react';
2
+ import './Limen.css';
3
+ export interface LimenProps {
4
+ permission?: string;
5
+ /** Replaces the default <LoginForm /> in the center. */
6
+ fallback?: ReactNode;
7
+ title?: ReactNode;
8
+ subtitle?: ReactNode;
9
+ top?: ReactNode;
10
+ bottom?: ReactNode;
11
+ left?: ReactNode;
12
+ right?: ReactNode;
13
+ child?: ReactNode;
14
+ children?: ReactNode;
15
+ }
16
+ export declare function Limen({ permission, fallback, title, subtitle, top, bottom, left, right, child, children, }: LimenProps): ReactNode;
@@ -0,0 +1,14 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { lazy, Suspense } from 'react';
3
+ import { useStore } from '../react/hooks/useStore.js';
4
+ import { SIGILLUM_PATHS } from './sigillum.js';
5
+ // import { LoginForm } from './LoginForm.js';
6
+ const LoginForm = lazy(() => import('../ui/forms/LoginForm.js').then(module => ({ default: module.LoginForm })));
7
+ import { hasScope } from './match.js';
8
+ import './Limen.css';
9
+ export function Limen({ permission, fallback, title = 'Welcome', subtitle, top, bottom, left, right, child, children, }) {
10
+ const session = useStore(SIGILLUM_PATHS.session) ?? null;
11
+ if (hasScope(session, permission))
12
+ return child ?? children;
13
+ return (_jsxs("div", { className: "porta-limen", children: [top ? _jsx("div", { className: "porta-limen__top", children: top }) : null, left ? _jsx("div", { className: "porta-limen__left", children: left }) : null, _jsx("div", { className: "porta-limen__center", children: _jsxs("div", { className: "porta-limen__panel", children: [_jsx("div", { className: "porta-limen__title", children: title }), subtitle ? _jsx("div", { className: "porta-limen__subtitle", children: subtitle }) : null, fallback ?? _jsx(Suspense, { fallback: _jsx("div", { children: "Loading..." }), children: _jsx(LoginForm, {}) })] }) }), right ? _jsx("div", { className: "porta-limen__right", children: right }) : null, bottom ? _jsx("div", { className: "porta-limen__bottom", children: bottom }) : null] }));
14
+ }
@@ -0,0 +1,10 @@
1
+ import { type ReactNode } from 'react';
2
+ import type { Porta } from './register.js';
3
+ import type { Session } from './provider.js';
4
+ export interface PortaProviderProps {
5
+ porta: Porta;
6
+ children: ReactNode;
7
+ }
8
+ export declare function PortaProvider({ porta, children }: PortaProviderProps): ReactNode;
9
+ export declare function usePorta(): Porta;
10
+ export declare function useSession(): Session | null;
@@ -0,0 +1,20 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { createContext, useContext } from 'react';
3
+ import { useStore } from '../react/hooks/useStore.js';
4
+ import { SIGILLUM_PATHS } from './sigillum.js';
5
+ const PortaContext = createContext(null);
6
+ // Wrap the app once (inside <ScenaProvider>). `LoginForm` and other porta
7
+ // blocks read the registered providers + their UI metadata from here.
8
+ export function PortaProvider({ porta, children }) {
9
+ return _jsx(PortaContext.Provider, { value: porta, children: children });
10
+ }
11
+ export function usePorta() {
12
+ const ctx = useContext(PortaContext);
13
+ if (!ctx) {
14
+ throw new Error('usePorta(): no <PortaProvider> in scope. Wrap your app with <PortaProvider porta={createPorta(scena, …)}>.');
15
+ }
16
+ return ctx;
17
+ }
18
+ export function useSession() {
19
+ return useStore(SIGILLUM_PATHS.session) ?? null;
20
+ }
@@ -0,0 +1,14 @@
1
+ .porta-locked {
2
+ display: flex;
3
+ flex-direction: column;
4
+ gap: var(--oo-spacing-md);
5
+ padding: var(--oo-spacing-md);
6
+ border: 1px dashed var(--oo-color-border);
7
+ border-radius: var(--oo-radius-sm);
8
+ background: var(--oo-color-surface);
9
+ }
10
+ .porta-locked__title {
11
+ font-weight: 600;
12
+ color: var(--oo-color-muted);
13
+ font-size: var(--oo-font-size-sm);
14
+ }
@@ -0,0 +1,10 @@
1
+ import type { ReactNode } from 'react';
2
+ import './PortaLock.css';
3
+ export interface PortaLockProps {
4
+ permission?: string;
5
+ fallback?: ReactNode;
6
+ title?: string;
7
+ child?: ReactNode;
8
+ children?: ReactNode;
9
+ }
10
+ export declare function PortaLock({ permission, fallback, title, child, children, }: PortaLockProps): ReactNode;
@@ -0,0 +1,13 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useStore } from '../react/hooks/useStore.js';
3
+ import { SIGILLUM_PATHS } from './sigillum.js';
4
+ import { LoginForm } from '../ui/forms/LoginForm.js';
5
+ import { hasScope } from './match.js';
6
+ import './PortaLock.css';
7
+ export function PortaLock({ permission, fallback, title, child, children, }) {
8
+ const session = useStore(SIGILLUM_PATHS.session) ?? null;
9
+ const ok = hasScope(session, permission);
10
+ if (ok)
11
+ return child ?? children;
12
+ return (_jsxs("div", { className: "porta-locked", children: [_jsx("span", { className: "porta-locked__title", children: title ?? (permission ? `Sign in required (${permission})` : 'Sign in required') }), fallback ?? _jsx(LoginForm, {})] }));
13
+ }
@@ -0,0 +1,8 @@
1
+ import type { ReactNode } from 'react';
2
+ export interface SigillumProps {
3
+ permission?: string;
4
+ fallback?: ReactNode;
5
+ child?: ReactNode;
6
+ children?: ReactNode;
7
+ }
8
+ export declare function Sigillum({ permission, fallback, child, children, }: SigillumProps): ReactNode;
@@ -0,0 +1,7 @@
1
+ import { useStore } from '../react/hooks/useStore.js';
2
+ import { SIGILLUM_PATHS } from './sigillum.js';
3
+ import { hasScope } from './match.js';
4
+ export function Sigillum({ permission, fallback = null, child, children, }) {
5
+ const session = useStore(SIGILLUM_PATHS.session) ?? null;
6
+ return hasScope(session, permission) ? (child ?? children) : fallback;
7
+ }
@@ -0,0 +1,3 @@
1
+ import type { Scena } from '../types/scena.js';
2
+ import type { PortaProvider } from './provider.js';
3
+ export declare function registerSigillumCommands(scena: Scena, providers: Map<string, PortaProvider>): void;
@@ -0,0 +1,125 @@
1
+ import { SIGILLUM_PATHS } from './sigillum.js';
2
+ // Registers the four sigillum.* commands. The composer (`LoginForm`) and the
3
+ // app dispatch these — providers don't talk to commands directly, they're
4
+ // invoked here by id lookup.
5
+ export function registerSigillumCommands(scena, providers) {
6
+ scena.commands.register({
7
+ id: 'sigillum.signin',
8
+ title: 'Sign in',
9
+ dispatch: 'client',
10
+ run: async (ctx, args) => {
11
+ const a = (args ?? {});
12
+ const provider = providers.get(a.providerId);
13
+ if (!provider)
14
+ throw new Error(`Unknown provider "${a.providerId}"`);
15
+ if (!provider.signin)
16
+ throw new Error(`Provider "${a.providerId}" has no signin()`);
17
+ ctx.store.patchMany({
18
+ [SIGILLUM_PATHS.pending]: true,
19
+ [SIGILLUM_PATHS.error]: null,
20
+ });
21
+ try {
22
+ const session = await provider.signin(a.credentials);
23
+ ctx.store.patchMany({
24
+ [SIGILLUM_PATHS.session]: { ...session, _providerId: a.providerId },
25
+ [SIGILLUM_PATHS.pending]: false,
26
+ [SIGILLUM_PATHS.challenge]: null,
27
+ });
28
+ }
29
+ catch (err) {
30
+ ctx.store.patchMany({
31
+ [SIGILLUM_PATHS.pending]: false,
32
+ [SIGILLUM_PATHS.error]: err instanceof Error ? err.message : 'Sign-in failed',
33
+ });
34
+ }
35
+ },
36
+ });
37
+ scena.commands.register({
38
+ id: 'sigillum.signout',
39
+ title: 'Sign out',
40
+ dispatch: 'client',
41
+ run: async (ctx) => {
42
+ const session = ctx.store.get(SIGILLUM_PATHS.session);
43
+ if (session?._providerId) {
44
+ const provider = providers.get(session._providerId);
45
+ try {
46
+ await provider?.signout?.(session);
47
+ }
48
+ catch {
49
+ // Best-effort cleanup; never block sign-out on provider failure.
50
+ }
51
+ }
52
+ ctx.store.patchMany({
53
+ [SIGILLUM_PATHS.session]: null,
54
+ [SIGILLUM_PATHS.challenge]: null,
55
+ [SIGILLUM_PATHS.error]: null,
56
+ });
57
+ },
58
+ });
59
+ scena.commands.register({
60
+ id: 'sigillum.requestOtp',
61
+ title: 'Request code',
62
+ dispatch: 'client',
63
+ run: async (ctx, args) => {
64
+ const a = (args ?? {});
65
+ const provider = providers.get(a.providerId);
66
+ if (!provider)
67
+ throw new Error(`Unknown provider "${a.providerId}"`);
68
+ if (!provider.request)
69
+ throw new Error(`Provider "${a.providerId}" has no request()`);
70
+ ctx.store.patchMany({
71
+ [SIGILLUM_PATHS.pending]: true,
72
+ [SIGILLUM_PATHS.error]: null,
73
+ });
74
+ try {
75
+ const { challengeId } = await provider.request(a.value);
76
+ ctx.store.patchMany({
77
+ [SIGILLUM_PATHS.challenge]: { providerId: a.providerId, id: challengeId },
78
+ [SIGILLUM_PATHS.pending]: false,
79
+ });
80
+ }
81
+ catch (err) {
82
+ ctx.store.patchMany({
83
+ [SIGILLUM_PATHS.pending]: false,
84
+ [SIGILLUM_PATHS.error]: err instanceof Error ? err.message : 'Request failed',
85
+ });
86
+ }
87
+ },
88
+ });
89
+ scena.commands.register({
90
+ id: 'sigillum.verifyOtp',
91
+ title: 'Verify code',
92
+ dispatch: 'client',
93
+ run: async (ctx, args) => {
94
+ const a = (args ?? {});
95
+ const provider = providers.get(a.providerId);
96
+ if (!provider)
97
+ throw new Error(`Unknown provider "${a.providerId}"`);
98
+ if (!provider.verify)
99
+ throw new Error(`Provider "${a.providerId}" has no verify()`);
100
+ const challenge = ctx.store.get(SIGILLUM_PATHS.challenge);
101
+ if (!challenge || challenge.providerId !== a.providerId) {
102
+ ctx.store.set(SIGILLUM_PATHS.error, 'No active challenge for this provider');
103
+ return;
104
+ }
105
+ ctx.store.patchMany({
106
+ [SIGILLUM_PATHS.pending]: true,
107
+ [SIGILLUM_PATHS.error]: null,
108
+ });
109
+ try {
110
+ const session = await provider.verify(challenge.id, a.code);
111
+ ctx.store.patchMany({
112
+ [SIGILLUM_PATHS.session]: { ...session, _providerId: a.providerId },
113
+ [SIGILLUM_PATHS.pending]: false,
114
+ [SIGILLUM_PATHS.challenge]: null,
115
+ });
116
+ }
117
+ catch (err) {
118
+ ctx.store.patchMany({
119
+ [SIGILLUM_PATHS.pending]: false,
120
+ [SIGILLUM_PATHS.error]: err instanceof Error ? err.message : 'Verify failed',
121
+ });
122
+ }
123
+ },
124
+ });
125
+ }
@@ -0,0 +1,18 @@
1
+ export { createPorta } from './register.js';
2
+ export type { Porta, CreatePortaOpts } from './register.js';
3
+ export { createSigillum, SIGILLUM_PATHS } from './sigillum.js';
4
+ export type { Sigillum as SigillumRuntime } from './sigillum.js';
5
+ export { registerSigillumCommands } from './commands.js';
6
+ export type { PortaProvider, PortaProviderKind, AuthField, Session, ProviderRenderContext, } from './provider.js';
7
+ export { passwordProvider } from './providers/password.js';
8
+ export type { PasswordProviderOpts, PasswordUser } from './providers/password.js';
9
+ export { PortaProvider as PortaContextProvider, usePorta, useSession } from './PortaContext.js';
10
+ export { Sigillum } from './SigillumGate.js';
11
+ export type { SigillumProps } from './SigillumGate.js';
12
+ export { PortaLock } from './PortaLock.js';
13
+ export type { PortaLockProps } from './PortaLock.js';
14
+ export { Limen } from './Limen.js';
15
+ export type { LimenProps } from './Limen.js';
16
+ export { hasScope } from './match.js';
17
+ export { loginFormBlock } from './login-form.block.js';
18
+ export { registerPortaBlocks } from './register-blocks.js';
@@ -0,0 +1,22 @@
1
+ // Public surface for `@softov/scena/porta`.
2
+ export { createPorta } from './register.js';
3
+ // Runtime sigillum facade — `session()`, `has(scope)`, `isPending()`, …
4
+ // Type is re-exported as `SigillumRuntime` to avoid colliding with the
5
+ // React component `<Sigillum>` below.
6
+ export { createSigillum, SIGILLUM_PATHS } from './sigillum.js';
7
+ export { registerSigillumCommands } from './commands.js';
8
+ export { passwordProvider } from './providers/password.js';
9
+ export { PortaProvider as PortaContextProvider, usePorta, useSession } from './PortaContext.js';
10
+ // Three React gates, distinct intents:
11
+ // <Sigillum> — silent gate. Renders children or nothing (or `fallback`).
12
+ // <PortaLock> — inline gate. Renders a bordered fallback (LoginForm by default).
13
+ // <Limen> — full-page wall. Centered Porta + top/bottom/left/right slots.
14
+ // Sigillum.tsx was renamed to SigillumGate.tsx to avoid a case-collision
15
+ // with sigillum.ts on case-insensitive filesystems (Windows). The component
16
+ // is still exported as `Sigillum`.
17
+ export { Sigillum } from './SigillumGate.js';
18
+ export { PortaLock } from './PortaLock.js';
19
+ export { Limen } from './Limen.js';
20
+ export { hasScope } from './match.js';
21
+ export { loginFormBlock } from './login-form.block.js';
22
+ export { registerPortaBlocks } from './register-blocks.js';
@@ -0,0 +1,2 @@
1
+ import type { ComponentNode } from '../types/component-graph.js';
2
+ export declare const loginFormBlock: ComponentNode;
@@ -0,0 +1,7 @@
1
+ // Declarative equivalent of <LoginForm />. Reference 'Porta.LoginForm' from
2
+ // agent-sent payloads or any ComponentNode tree.
3
+ export const loginFormBlock = {
4
+ component: 'Porta.LoginForm',
5
+ allowSignup: false,
6
+ allowForgotPassword: false,
7
+ };
@@ -0,0 +1,2 @@
1
+ import type { Session } from './provider.js';
2
+ export declare function hasScope(session: Session | null, scope: string | undefined): boolean;
@@ -0,0 +1,20 @@
1
+ // Permission matcher used by Sigillum (runtime) + the three React gates.
2
+ // v0 rule: equality + trailing `.*` wildcard. See plan doc PENDING note for
3
+ // the broader rule set (RBAC, namespace separator alternatives).
4
+ //
5
+ // hasScope(session, undefined) → "any session exists"
6
+ // hasScope(session, 'agents.write') matches a granted 'agents.write'
7
+ // hasScope(session, 'agents.write') matches a granted 'agents.*'
8
+ export function hasScope(session, scope) {
9
+ if (!scope)
10
+ return Boolean(session);
11
+ if (!session?.permissions)
12
+ return false;
13
+ return session.permissions.some((p) => {
14
+ if (p === scope)
15
+ return true;
16
+ if (p.endsWith('.*'))
17
+ return scope.startsWith(p.slice(0, -1));
18
+ return false;
19
+ });
20
+ }