@cratis/scene.react 4.12.0 → 4.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/dist/cjs/core/coreComponents.js +2 -1
  2. package/dist/cjs/core/coreComponents.js.map +1 -1
  3. package/dist/cjs/core/coreDescriptors.js +1 -0
  4. package/dist/cjs/core/coreDescriptors.js.map +1 -1
  5. package/dist/cjs/index.js +27 -0
  6. package/dist/cjs/index.js.map +1 -1
  7. package/dist/cjs/navigation/SceneNavigationContext.js.map +1 -1
  8. package/dist/cjs/navigation/SceneNavigationHost.js +19 -44
  9. package/dist/cjs/navigation/SceneNavigationHost.js.map +1 -1
  10. package/dist/cjs/navigation/createBrowserSceneHistory.js +39 -0
  11. package/dist/cjs/navigation/createBrowserSceneHistory.js.map +1 -0
  12. package/dist/cjs/navigation/createMemorySceneHistory.js +53 -0
  13. package/dist/cjs/navigation/createMemorySceneHistory.js.map +1 -0
  14. package/dist/cjs/navigation/diagnoseRenderedNavigation.js +17 -0
  15. package/dist/cjs/navigation/diagnoseRenderedNavigation.js.map +1 -0
  16. package/dist/cjs/navigation/identityRoute.js +19 -0
  17. package/dist/cjs/navigation/identityRoute.js.map +1 -0
  18. package/dist/cjs/navigation/matchSceneRoute.js +43 -0
  19. package/dist/cjs/navigation/matchSceneRoute.js.map +1 -0
  20. package/dist/cjs/navigation/navigationRouteKey.js +19 -0
  21. package/dist/cjs/navigation/navigationRouteKey.js.map +1 -0
  22. package/dist/cjs/navigation/resolveDestination.js +3 -10
  23. package/dist/cjs/navigation/resolveDestination.js.map +1 -1
  24. package/dist/cjs/navigation/sceneRoutesFrom.js +37 -0
  25. package/dist/cjs/navigation/sceneRoutesFrom.js.map +1 -0
  26. package/dist/cjs/navigation/useSceneHistoryNavigation.js +112 -0
  27. package/dist/cjs/navigation/useSceneHistoryNavigation.js.map +1 -0
  28. package/dist/cjs/packages/DesignTimeContractVersion.js +15 -0
  29. package/dist/cjs/packages/DesignTimeContractVersion.js.map +1 -0
  30. package/dist/cjs/packages/DesignTimeExtensionPoint.js +26 -0
  31. package/dist/cjs/packages/DesignTimeExtensionPoint.js.map +1 -0
  32. package/dist/cjs/packages/PackageHostConfiguration.js +1 -0
  33. package/dist/cjs/packages/PackageHostConfiguration.js.map +1 -1
  34. package/dist/cjs/packages/loadDesignTimeContributions.js +80 -0
  35. package/dist/cjs/packages/loadDesignTimeContributions.js.map +1 -0
  36. package/dist/cjs/packages/resolveDesignTimeHost.js +114 -0
  37. package/dist/cjs/packages/resolveDesignTimeHost.js.map +1 -0
  38. package/dist/cjs/packages/runDesignTimeAction.js +50 -0
  39. package/dist/cjs/packages/runDesignTimeAction.js.map +1 -0
  40. package/dist/esm/core/coreComponents.js +2 -1
  41. package/dist/esm/core/coreComponents.js.map +1 -1
  42. package/dist/esm/core/coreDescriptors.js +1 -0
  43. package/dist/esm/core/coreDescriptors.js.map +1 -1
  44. package/dist/esm/index.js +13 -0
  45. package/dist/esm/index.js.map +1 -1
  46. package/dist/esm/navigation/DestinationResolution.d.ts +1 -0
  47. package/dist/esm/navigation/DestinationResolution.d.ts.map +1 -1
  48. package/dist/esm/navigation/DialogResult.d.ts +5 -0
  49. package/dist/esm/navigation/DialogResult.d.ts.map +1 -0
  50. package/dist/esm/navigation/DialogResult.js +2 -0
  51. package/dist/esm/navigation/DialogResult.js.map +1 -0
  52. package/dist/esm/navigation/SceneHistory.d.ts +10 -0
  53. package/dist/esm/navigation/SceneHistory.d.ts.map +1 -0
  54. package/dist/esm/navigation/SceneHistory.js +2 -0
  55. package/dist/esm/navigation/SceneHistory.js.map +1 -0
  56. package/dist/esm/navigation/SceneNavigationContext.d.ts +6 -1
  57. package/dist/esm/navigation/SceneNavigationContext.d.ts.map +1 -1
  58. package/dist/esm/navigation/SceneNavigationContext.js.map +1 -1
  59. package/dist/esm/navigation/SceneNavigationHost.d.ts +7 -2
  60. package/dist/esm/navigation/SceneNavigationHost.d.ts.map +1 -1
  61. package/dist/esm/navigation/SceneNavigationHost.js +20 -45
  62. package/dist/esm/navigation/SceneNavigationHost.js.map +1 -1
  63. package/dist/esm/navigation/SceneNavigationState.d.ts +8 -0
  64. package/dist/esm/navigation/SceneNavigationState.d.ts.map +1 -0
  65. package/dist/esm/navigation/SceneNavigationState.js +2 -0
  66. package/dist/esm/navigation/SceneNavigationState.js.map +1 -0
  67. package/dist/esm/navigation/SceneRoute.d.ts +6 -0
  68. package/dist/esm/navigation/SceneRoute.d.ts.map +1 -0
  69. package/dist/esm/navigation/SceneRoute.js +2 -0
  70. package/dist/esm/navigation/SceneRoute.js.map +1 -0
  71. package/dist/esm/navigation/createBrowserSceneHistory.d.ts +4 -0
  72. package/dist/esm/navigation/createBrowserSceneHistory.d.ts.map +1 -0
  73. package/dist/esm/navigation/createBrowserSceneHistory.js +37 -0
  74. package/dist/esm/navigation/createBrowserSceneHistory.js.map +1 -0
  75. package/dist/esm/navigation/createMemorySceneHistory.d.ts +7 -0
  76. package/dist/esm/navigation/createMemorySceneHistory.d.ts.map +1 -0
  77. package/dist/esm/navigation/createMemorySceneHistory.js +51 -0
  78. package/dist/esm/navigation/createMemorySceneHistory.js.map +1 -0
  79. package/dist/esm/navigation/diagnoseRenderedNavigation.d.ts +3 -0
  80. package/dist/esm/navigation/diagnoseRenderedNavigation.d.ts.map +1 -0
  81. package/dist/esm/navigation/diagnoseRenderedNavigation.js +15 -0
  82. package/dist/esm/navigation/diagnoseRenderedNavigation.js.map +1 -0
  83. package/dist/esm/navigation/identityRoute.d.ts +3 -0
  84. package/dist/esm/navigation/identityRoute.d.ts.map +1 -0
  85. package/dist/esm/navigation/identityRoute.js +17 -0
  86. package/dist/esm/navigation/identityRoute.js.map +1 -0
  87. package/dist/esm/navigation/index.d.ts +12 -0
  88. package/dist/esm/navigation/index.d.ts.map +1 -1
  89. package/dist/esm/navigation/index.js +12 -0
  90. package/dist/esm/navigation/index.js.map +1 -1
  91. package/dist/esm/navigation/matchSceneRoute.d.ts +7 -0
  92. package/dist/esm/navigation/matchSceneRoute.d.ts.map +1 -0
  93. package/dist/esm/navigation/matchSceneRoute.js +41 -0
  94. package/dist/esm/navigation/matchSceneRoute.js.map +1 -0
  95. package/dist/esm/navigation/navigationRouteKey.d.ts +3 -0
  96. package/dist/esm/navigation/navigationRouteKey.d.ts.map +1 -0
  97. package/dist/esm/navigation/navigationRouteKey.js +17 -0
  98. package/dist/esm/navigation/navigationRouteKey.js.map +1 -0
  99. package/dist/esm/navigation/resolveDestination.d.ts.map +1 -1
  100. package/dist/esm/navigation/resolveDestination.js +2 -9
  101. package/dist/esm/navigation/resolveDestination.js.map +1 -1
  102. package/dist/esm/navigation/sceneRoutesFrom.d.ts +4 -0
  103. package/dist/esm/navigation/sceneRoutesFrom.d.ts.map +1 -0
  104. package/dist/esm/navigation/sceneRoutesFrom.js +35 -0
  105. package/dist/esm/navigation/sceneRoutesFrom.js.map +1 -0
  106. package/dist/esm/navigation/useSceneHistoryNavigation.d.ts +6 -0
  107. package/dist/esm/navigation/useSceneHistoryNavigation.d.ts.map +1 -0
  108. package/dist/esm/navigation/useSceneHistoryNavigation.js +110 -0
  109. package/dist/esm/navigation/useSceneHistoryNavigation.js.map +1 -0
  110. package/dist/esm/packages/DesignTimeActionOutcome.d.ts +7 -0
  111. package/dist/esm/packages/DesignTimeActionOutcome.d.ts.map +1 -0
  112. package/dist/esm/packages/DesignTimeActionOutcome.js +2 -0
  113. package/dist/esm/packages/DesignTimeActionOutcome.js.map +1 -0
  114. package/dist/esm/packages/DesignTimeActionState.d.ts +9 -0
  115. package/dist/esm/packages/DesignTimeActionState.d.ts.map +1 -0
  116. package/dist/esm/packages/DesignTimeActionState.js +2 -0
  117. package/dist/esm/packages/DesignTimeActionState.js.map +1 -0
  118. package/dist/esm/packages/DesignTimeContractVersion.d.ts +2 -0
  119. package/dist/esm/packages/DesignTimeContractVersion.d.ts.map +1 -0
  120. package/dist/esm/packages/DesignTimeContractVersion.js +13 -0
  121. package/dist/esm/packages/DesignTimeContractVersion.js.map +1 -0
  122. package/dist/esm/packages/DesignTimeExtensionPoint.d.ts +9 -0
  123. package/dist/esm/packages/DesignTimeExtensionPoint.d.ts.map +1 -0
  124. package/dist/esm/packages/DesignTimeExtensionPoint.js +23 -0
  125. package/dist/esm/packages/DesignTimeExtensionPoint.js.map +1 -0
  126. package/dist/esm/packages/DesignTimeResolution.d.ts +7 -0
  127. package/dist/esm/packages/DesignTimeResolution.d.ts.map +1 -0
  128. package/dist/esm/packages/DesignTimeResolution.js +2 -0
  129. package/dist/esm/packages/DesignTimeResolution.js.map +1 -0
  130. package/dist/esm/packages/PackageHostConfiguration.d.ts +3 -0
  131. package/dist/esm/packages/PackageHostConfiguration.d.ts.map +1 -1
  132. package/dist/esm/packages/PackageHostConfiguration.js +2 -1
  133. package/dist/esm/packages/PackageHostConfiguration.js.map +1 -1
  134. package/dist/esm/packages/index.d.ts +8 -0
  135. package/dist/esm/packages/index.d.ts.map +1 -1
  136. package/dist/esm/packages/index.js +8 -0
  137. package/dist/esm/packages/index.js.map +1 -1
  138. package/dist/esm/packages/loadDesignTimeContributions.d.ts +11 -0
  139. package/dist/esm/packages/loadDesignTimeContributions.d.ts.map +1 -0
  140. package/dist/esm/packages/loadDesignTimeContributions.js +78 -0
  141. package/dist/esm/packages/loadDesignTimeContributions.js.map +1 -0
  142. package/dist/esm/packages/resolveDesignTimeHost.d.ts +26 -0
  143. package/dist/esm/packages/resolveDesignTimeHost.d.ts.map +1 -0
  144. package/dist/esm/packages/resolveDesignTimeHost.js +112 -0
  145. package/dist/esm/packages/resolveDesignTimeHost.js.map +1 -0
  146. package/dist/esm/packages/runDesignTimeAction.d.ts +4 -0
  147. package/dist/esm/packages/runDesignTimeAction.d.ts.map +1 -0
  148. package/dist/esm/packages/runDesignTimeAction.js +48 -0
  149. package/dist/esm/packages/runDesignTimeAction.js.map +1 -0
  150. package/dist/esm/tsconfig.tsbuildinfo +1 -1
  151. package/navigation/DestinationResolution.ts +3 -0
  152. package/navigation/DialogResult.ts +8 -0
  153. package/navigation/SceneHistory.ts +24 -0
  154. package/navigation/SceneNavigationContext.tsx +16 -1
  155. package/navigation/SceneNavigationHost.tsx +30 -40
  156. package/navigation/SceneNavigationState.ts +19 -0
  157. package/navigation/SceneRoute.ts +12 -0
  158. package/navigation/createBrowserSceneHistory.ts +40 -0
  159. package/navigation/createMemorySceneHistory.ts +44 -0
  160. package/navigation/diagnoseRenderedNavigation.ts +14 -0
  161. package/navigation/identityRoute.ts +14 -0
  162. package/navigation/index.ts +12 -0
  163. package/navigation/matchSceneRoute.ts +45 -0
  164. package/navigation/navigationRouteKey.ts +22 -0
  165. package/navigation/resolveDestination.ts +2 -6
  166. package/navigation/sceneRoutesFrom.ts +24 -0
  167. package/navigation/useSceneHistoryNavigation.ts +80 -0
  168. package/package.json +5 -5
  169. package/packages/DesignTimeActionOutcome.ts +18 -0
  170. package/packages/DesignTimeActionState.ts +21 -0
  171. package/packages/DesignTimeContractVersion.ts +12 -0
  172. package/packages/DesignTimeExtensionPoint.ts +23 -0
  173. package/packages/DesignTimeResolution.ts +23 -0
  174. package/packages/PackageHostConfiguration.ts +11 -1
  175. package/packages/index.ts +8 -0
  176. package/packages/loadDesignTimeContributions.ts +98 -0
  177. package/packages/resolveDesignTimeHost.ts +133 -0
  178. package/packages/runDesignTimeAction.ts +36 -0
@@ -0,0 +1,50 @@
1
+ 'use strict';
2
+
3
+ var scene_model = require('@cratis/scene.model');
4
+
5
+ // Copyright (c) Cratis. All rights reserved.
6
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
7
+ const editKinds = new Set(Object.values(scene_model.SceneEditKind));
8
+ /**
9
+ * Runs one design-time action and hands its edit batch to the host as a single canonical batch, so the host's
10
+ * own validation and undo/redo stay authoritative. A batch containing anything that is not a canonical Scene
11
+ * edit is rejected whole - a partially applied action is never reported as success.
12
+ */ function runDesignTimeAction(action, context) {
13
+ let result;
14
+ try {
15
+ result = action.execute(context);
16
+ } catch (error) {
17
+ return {
18
+ submitted: false,
19
+ edits: [],
20
+ diagnostics: [
21
+ `Action '${action.descriptor.id}' failed: ${String(error)}`
22
+ ]
23
+ };
24
+ }
25
+ const invalid = result.edits.filter((edit)=>!editKinds.has(edit.kind ?? ''));
26
+ if (invalid.length > 0) {
27
+ return {
28
+ submitted: false,
29
+ edits: result.edits,
30
+ diagnostics: [
31
+ ...result.diagnostics,
32
+ `Action '${action.descriptor.id}' produced ${invalid.length} edit(s) that are not canonical Scene edits; nothing was submitted`
33
+ ]
34
+ };
35
+ }
36
+ if (result.edits.length === 0) return {
37
+ submitted: false,
38
+ edits: [],
39
+ diagnostics: result.diagnostics
40
+ };
41
+ context.submitAction(action.descriptor.id, result.edits);
42
+ return {
43
+ submitted: true,
44
+ edits: result.edits,
45
+ diagnostics: result.diagnostics
46
+ };
47
+ }
48
+
49
+ exports.runDesignTimeAction = runDesignTimeAction;
50
+ //# sourceMappingURL=runDesignTimeAction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runDesignTimeAction.js","sources":["../../../packages/runDesignTimeAction.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { SceneEdit, SceneEditKind } from '@cratis/scene.model';\nimport { DesignTimeAction, DesignTimeActionContext } from './DesignTimeAction';\nimport { DesignTimeActionOutcome } from './DesignTimeActionOutcome';\n\nconst editKinds = new Set<string>(Object.values(SceneEditKind));\n\n/**\n * Runs one design-time action and hands its edit batch to the host as a single canonical batch, so the host's\n * own validation and undo/redo stay authoritative. A batch containing anything that is not a canonical Scene\n * edit is rejected whole - a partially applied action is never reported as success.\n */\nexport function runDesignTimeAction(action: DesignTimeAction, context: DesignTimeActionContext): DesignTimeActionOutcome {\n let result: { edits: SceneEdit[]; diagnostics: string[] };\n try {\n result = action.execute(context);\n } catch (error) {\n return { submitted: false, edits: [], diagnostics: [`Action '${action.descriptor.id}' failed: ${String(error)}`] };\n }\n\n const invalid = result.edits.filter(edit => !editKinds.has((edit as { kind?: string }).kind ?? ''));\n if (invalid.length > 0) {\n return {\n submitted: false,\n edits: result.edits,\n diagnostics: [...result.diagnostics, `Action '${action.descriptor.id}' produced ${invalid.length} edit(s) that are not canonical Scene edits; nothing was submitted`],\n };\n }\n\n if (result.edits.length === 0) return { submitted: false, edits: [], diagnostics: result.diagnostics };\n\n context.submitAction(action.descriptor.id, result.edits);\n return { submitted: true, edits: result.edits, diagnostics: result.diagnostics };\n}\n"],"names":["editKinds","Set","Object","values","SceneEditKind","runDesignTimeAction","action","context","result","execute","error","submitted","edits","diagnostics","descriptor","id","String","invalid","filter","edit","has","kind","length","submitAction"],"mappings":";;;;AAAA;AACA;AAMA,MAAMA,SAAAA,GAAY,IAAIC,GAAAA,CAAYC,MAAAA,CAAOC,MAAM,CAACC,yBAAAA,CAAAA,CAAAA;AAEhD;;;;AAIC,IACM,SAASC,mBAAAA,CAAoBC,MAAwB,EAAEC,OAAgC,EAAA;IAC1F,IAAIC,MAAAA;IACJ,IAAI;QACAA,MAAAA,GAASF,MAAAA,CAAOG,OAAO,CAACF,OAAAA,CAAAA;AAC5B,IAAA,CAAA,CAAE,OAAOG,KAAAA,EAAO;QACZ,OAAO;YAAEC,SAAAA,EAAW,KAAA;AAAOC,YAAAA,KAAAA,EAAO,EAAE;YAAEC,WAAAA,EAAa;gBAAC,CAAC,QAAQ,EAAEP,MAAAA,CAAOQ,UAAU,CAACC,EAAE,CAAC,UAAU,EAAEC,MAAAA,CAAON,KAAAA,CAAAA,CAAAA;AAAS;AAAC,SAAA;AACrH,IAAA;AAEA,IAAA,MAAMO,OAAAA,GAAUT,MAAAA,CAAOI,KAAK,CAACM,MAAM,CAACC,CAAAA,IAAAA,GAAQ,CAACnB,UAAUoB,GAAG,CAAC,IAACD,CAA2BE,IAAI,IAAI,EAAA,CAAA,CAAA;IAC/F,IAAIJ,OAAAA,CAAQK,MAAM,GAAG,CAAA,EAAG;QACpB,OAAO;YACHX,SAAAA,EAAW,KAAA;AACXC,YAAAA,KAAAA,EAAOJ,OAAOI,KAAK;YACnBC,WAAAA,EAAa;AAAIL,gBAAAA,GAAAA,MAAAA,CAAOK,WAAW;AAAE,gBAAA,CAAC,QAAQ,EAAEP,MAAAA,CAAOQ,UAAU,CAACC,EAAE,CAAC,WAAW,EAAEE,OAAAA,CAAQK,MAAM,CAAC,kEAAkE;AAAE;AACzK,SAAA;AACJ,IAAA;AAEA,IAAA,IAAId,OAAOI,KAAK,CAACU,MAAM,KAAK,GAAG,OAAO;QAAEX,SAAAA,EAAW,KAAA;AAAOC,QAAAA,KAAAA,EAAO,EAAE;AAAEC,QAAAA,WAAAA,EAAaL,OAAOK;AAAY,KAAA;IAErGN,OAAAA,CAAQgB,YAAY,CAACjB,MAAAA,CAAOQ,UAAU,CAACC,EAAE,EAAEP,OAAOI,KAAK,CAAA;IACvD,OAAO;QAAED,SAAAA,EAAW,IAAA;AAAMC,QAAAA,KAAAA,EAAOJ,OAAOI,KAAK;AAAEC,QAAAA,WAAAA,EAAaL,OAAOK;AAAY,KAAA;AACnF;;"}
@@ -1,10 +1,11 @@
1
1
  import 'react/jsx-runtime';
2
2
  import 'react';
3
- import '@cratis/scene.model';
4
3
  import '@cratis/scene.engine';
4
+ import '@cratis/scene.model';
5
5
  import '../interactions/useInteractions.js';
6
6
  import '../interactions/NotificationHost.js';
7
7
  import { componentRegistryKey } from '../packages/ScenePackageBundle.js';
8
+ import '../packages/runDesignTimeAction.js';
8
9
  import { CoreText } from './CoreText.js';
9
10
  import { CoreButton } from './CoreButton.js';
10
11
  import { CoreCard } from './CoreCard.js';
@@ -1 +1 @@
1
- {"version":3,"file":"coreComponents.js","sources":["../../../core/coreComponents.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { ComponentRegistry } from '../renderer';\nimport { componentRegistryKey } from '../packages';\nimport { CoreText } from './CoreText';\nimport { CoreButton } from './CoreButton';\nimport { CoreCard } from './CoreCard';\nimport { CoreNavigationBar } from './CoreNavigationBar';\nimport {\n CoreAction,\n CoreCode,\n CoreColumn,\n CoreData,\n CoreField,\n CoreFile,\n CoreNavigate,\n CoreSection,\n CoreSummary,\n CoreTable,\n CoreTitle,\n} from './ScreenplayCoreComponents';\n\n/**\n * The `core` package's component registry - the final fallback every `ui profile` resolves against\n * regardless of which other packages it lists (Scene#3).\n */\nexport const coreComponents: ComponentRegistry = {\n [componentRegistryKey('core', 'text')]: CoreText,\n [componentRegistryKey('core', 'button')]: CoreButton,\n [componentRegistryKey('core', 'card')]: CoreCard,\n [componentRegistryKey('core', 'data')]: CoreData,\n [componentRegistryKey('core', 'action')]: CoreAction,\n [componentRegistryKey('core', 'section')]: CoreSection,\n [componentRegistryKey('core', 'navigate')]: CoreNavigate,\n [componentRegistryKey('core', 'title')]: CoreTitle,\n [componentRegistryKey('core', 'table')]: CoreTable,\n [componentRegistryKey('core', 'column')]: CoreColumn,\n [componentRegistryKey('core', 'summary')]: CoreSummary,\n [componentRegistryKey('core', 'field')]: CoreField,\n [componentRegistryKey('core', 'code')]: CoreCode,\n [componentRegistryKey('core', 'file')]: CoreFile,\n [componentRegistryKey('core', 'navigationBar')]: CoreNavigationBar,\n};\n"],"names":["coreComponents","componentRegistryKey","CoreText","CoreButton","CoreCard","CoreData","CoreAction","CoreSection","CoreNavigate","CoreTitle","CoreTable","CoreColumn","CoreSummary","CoreField","CoreCode","CoreFile","CoreNavigationBar"],"mappings":";;;;;;;;;;;;;AAAA;AACA;AAsBA;;;UAIaA,cAAAA,GAAoC;IAC7C,CAACC,oBAAAA,CAAqB,MAAA,EAAQ,MAAA,CAAA,GAAUC,QAAAA;IACxC,CAACD,oBAAAA,CAAqB,MAAA,EAAQ,QAAA,CAAA,GAAYE,UAAAA;IAC1C,CAACF,oBAAAA,CAAqB,MAAA,EAAQ,MAAA,CAAA,GAAUG,QAAAA;IACxC,CAACH,oBAAAA,CAAqB,MAAA,EAAQ,MAAA,CAAA,GAAUI,QAAAA;IACxC,CAACJ,oBAAAA,CAAqB,MAAA,EAAQ,QAAA,CAAA,GAAYK,UAAAA;IAC1C,CAACL,oBAAAA,CAAqB,MAAA,EAAQ,SAAA,CAAA,GAAaM,WAAAA;IAC3C,CAACN,oBAAAA,CAAqB,MAAA,EAAQ,UAAA,CAAA,GAAcO,YAAAA;IAC5C,CAACP,oBAAAA,CAAqB,MAAA,EAAQ,OAAA,CAAA,GAAWQ,SAAAA;IACzC,CAACR,oBAAAA,CAAqB,MAAA,EAAQ,OAAA,CAAA,GAAWS,SAAAA;IACzC,CAACT,oBAAAA,CAAqB,MAAA,EAAQ,QAAA,CAAA,GAAYU,UAAAA;IAC1C,CAACV,oBAAAA,CAAqB,MAAA,EAAQ,SAAA,CAAA,GAAaW,WAAAA;IAC3C,CAACX,oBAAAA,CAAqB,MAAA,EAAQ,OAAA,CAAA,GAAWY,SAAAA;IACzC,CAACZ,oBAAAA,CAAqB,MAAA,EAAQ,MAAA,CAAA,GAAUa,QAAAA;IACxC,CAACb,oBAAAA,CAAqB,MAAA,EAAQ,MAAA,CAAA,GAAUc,QAAAA;IACxC,CAACd,oBAAAA,CAAqB,MAAA,EAAQ,eAAA,CAAA,GAAmBe;AACrD;;"}
1
+ {"version":3,"file":"coreComponents.js","sources":["../../../core/coreComponents.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { ComponentRegistry } from '../renderer';\nimport { componentRegistryKey } from '../packages';\nimport { CoreText } from './CoreText';\nimport { CoreButton } from './CoreButton';\nimport { CoreCard } from './CoreCard';\nimport { CoreNavigationBar } from './CoreNavigationBar';\nimport {\n CoreAction,\n CoreCode,\n CoreColumn,\n CoreData,\n CoreField,\n CoreFile,\n CoreNavigate,\n CoreSection,\n CoreSummary,\n CoreTable,\n CoreTitle,\n} from './ScreenplayCoreComponents';\n\n/**\n * The `core` package's component registry - the final fallback every `ui profile` resolves against\n * regardless of which other packages it lists (Scene#3).\n */\nexport const coreComponents: ComponentRegistry = {\n [componentRegistryKey('core', 'text')]: CoreText,\n [componentRegistryKey('core', 'button')]: CoreButton,\n [componentRegistryKey('core', 'card')]: CoreCard,\n [componentRegistryKey('core', 'data')]: CoreData,\n [componentRegistryKey('core', 'action')]: CoreAction,\n [componentRegistryKey('core', 'section')]: CoreSection,\n [componentRegistryKey('core', 'navigate')]: CoreNavigate,\n [componentRegistryKey('core', 'title')]: CoreTitle,\n [componentRegistryKey('core', 'table')]: CoreTable,\n [componentRegistryKey('core', 'column')]: CoreColumn,\n [componentRegistryKey('core', 'summary')]: CoreSummary,\n [componentRegistryKey('core', 'field')]: CoreField,\n [componentRegistryKey('core', 'code')]: CoreCode,\n [componentRegistryKey('core', 'file')]: CoreFile,\n [componentRegistryKey('core', 'navigationBar')]: CoreNavigationBar,\n};\n"],"names":["coreComponents","componentRegistryKey","CoreText","CoreButton","CoreCard","CoreData","CoreAction","CoreSection","CoreNavigate","CoreTitle","CoreTable","CoreColumn","CoreSummary","CoreField","CoreCode","CoreFile","CoreNavigationBar"],"mappings":";;;;;;;;;;;;;;AAAA;AACA;AAsBA;;;UAIaA,cAAAA,GAAoC;IAC7C,CAACC,oBAAAA,CAAqB,MAAA,EAAQ,MAAA,CAAA,GAAUC,QAAAA;IACxC,CAACD,oBAAAA,CAAqB,MAAA,EAAQ,QAAA,CAAA,GAAYE,UAAAA;IAC1C,CAACF,oBAAAA,CAAqB,MAAA,EAAQ,MAAA,CAAA,GAAUG,QAAAA;IACxC,CAACH,oBAAAA,CAAqB,MAAA,EAAQ,MAAA,CAAA,GAAUI,QAAAA;IACxC,CAACJ,oBAAAA,CAAqB,MAAA,EAAQ,QAAA,CAAA,GAAYK,UAAAA;IAC1C,CAACL,oBAAAA,CAAqB,MAAA,EAAQ,SAAA,CAAA,GAAaM,WAAAA;IAC3C,CAACN,oBAAAA,CAAqB,MAAA,EAAQ,UAAA,CAAA,GAAcO,YAAAA;IAC5C,CAACP,oBAAAA,CAAqB,MAAA,EAAQ,OAAA,CAAA,GAAWQ,SAAAA;IACzC,CAACR,oBAAAA,CAAqB,MAAA,EAAQ,OAAA,CAAA,GAAWS,SAAAA;IACzC,CAACT,oBAAAA,CAAqB,MAAA,EAAQ,QAAA,CAAA,GAAYU,UAAAA;IAC1C,CAACV,oBAAAA,CAAqB,MAAA,EAAQ,SAAA,CAAA,GAAaW,WAAAA;IAC3C,CAACX,oBAAAA,CAAqB,MAAA,EAAQ,OAAA,CAAA,GAAWY,SAAAA;IACzC,CAACZ,oBAAAA,CAAqB,MAAA,EAAQ,MAAA,CAAA,GAAUa,QAAAA;IACxC,CAACb,oBAAAA,CAAqB,MAAA,EAAQ,MAAA,CAAA,GAAUc,QAAAA;IACxC,CAACd,oBAAAA,CAAqB,MAAA,EAAQ,eAAA,CAAA,GAAmBe;AACrD;;"}
@@ -5,6 +5,7 @@ import '@cratis/scene.engine';
5
5
  import '../interactions/useInteractions.js';
6
6
  import '../interactions/NotificationHost.js';
7
7
  import { componentRegistryKey } from '../packages/ScenePackageBundle.js';
8
+ import '../packages/runDesignTimeAction.js';
8
9
 
9
10
  // Copyright (c) Cratis. All rights reserved.
10
11
  // Licensed under the MIT license. See LICENSE file in the project root for full license information.
@@ -1 +1 @@
1
- {"version":3,"file":"coreDescriptors.js","sources":["../../../core/coreDescriptors.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { ComponentDescriptor, PropertyValueType } from '@cratis/scene.model';\nimport { componentRegistryKey } from '../packages';\n\nconst key = (name: string) => componentRegistryKey('core', name);\n\n/**\n * What can be edited on the `core` package's components.\n *\n * Only the components an author configures by hand are described: a button's label, an action's command and its\n * argument mapping, a column's heading, and the navigation bar. The Screenplay structural components - `data`,\n * `section`, `summary` - have nothing to edit that is not already a node in the tree.\n */\nexport const coreDescriptors: ComponentDescriptor[] = [\n {\n component: key('button'),\n displayName: 'Button',\n properties: [\n { path: 'label', label: 'Label', group: 'Content', valueType: PropertyValueType.String, default: '' },\n ],\n },\n {\n component: key('action'),\n displayName: 'Command action',\n description: 'Invokes a modeled command. The command and its argument mapping are stored on the element; the host that handles the command event reads them.',\n properties: [\n { path: 'label', label: 'Label', group: 'Content', valueType: PropertyValueType.String },\n {\n path: 'command', label: 'Command', group: 'Behavior', valueType: PropertyValueType.String,\n editorKind: 'stateChangeReference', constraints: { required: true },\n description: 'The state change this action submits.',\n },\n {\n path: 'arguments', label: 'Argument mapping', group: 'Behavior', valueType: PropertyValueType.Collection,\n description: 'Where each command argument comes from.',\n item: {\n label: 'Argument',\n properties: [\n { path: 'name', label: 'Argument', group: 'Behavior', valueType: PropertyValueType.String, constraints: { required: true } },\n { path: 'source', label: 'Source', group: 'Behavior', valueType: PropertyValueType.String, editorKind: 'bindingPath', constraints: { required: true } },\n ],\n },\n },\n ],\n },\n {\n component: key('column'),\n displayName: 'Table column',\n properties: [\n { path: 'property', label: 'Result field', group: 'Data', valueType: PropertyValueType.String, editorKind: 'resultField', constraints: { required: true } },\n { path: 'label', label: 'Heading', group: 'Content', valueType: PropertyValueType.String },\n ],\n },\n {\n component: key('navigationBar'),\n displayName: 'Navigation bar',\n description: 'A list of navigation items. A template author fixes the first item (Home) and can expose the list so that screens add their own.',\n properties: [\n { path: 'title', label: 'Title', group: 'Content', valueType: PropertyValueType.String, default: 'Navigation' },\n {\n path: 'items', label: 'Items', group: 'Content', valueType: PropertyValueType.Collection, default: [],\n item: {\n label: 'Navigation item',\n properties: [\n { path: 'label', label: 'Label', group: 'Content', valueType: PropertyValueType.String, constraints: { required: true, minimumLength: 1 } },\n { path: 'icon', label: 'Icon', group: 'Content', valueType: PropertyValueType.Icon, editorKind: 'iconPicker' },\n { path: 'destination', label: 'Destination', group: 'Content', valueType: PropertyValueType.Destination, editorKind: 'screenPicker', constraints: { required: true } },\n ],\n },\n },\n ],\n },\n];\n"],"names":["key","name","componentRegistryKey","coreDescriptors","component","displayName","properties","path","label","group","valueType","PropertyValueType","String","default","description","editorKind","constraints","required","Collection","item","minimumLength","Icon","Destination"],"mappings":"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"}
1
+ {"version":3,"file":"coreDescriptors.js","sources":["../../../core/coreDescriptors.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { ComponentDescriptor, PropertyValueType } from '@cratis/scene.model';\nimport { componentRegistryKey } from '../packages';\n\nconst key = (name: string) => componentRegistryKey('core', name);\n\n/**\n * What can be edited on the `core` package's components.\n *\n * Only the components an author configures by hand are described: a button's label, an action's command and its\n * argument mapping, a column's heading, and the navigation bar. The Screenplay structural components - `data`,\n * `section`, `summary` - have nothing to edit that is not already a node in the tree.\n */\nexport const coreDescriptors: ComponentDescriptor[] = [\n {\n component: key('button'),\n displayName: 'Button',\n properties: [\n { path: 'label', label: 'Label', group: 'Content', valueType: PropertyValueType.String, default: '' },\n ],\n },\n {\n component: key('action'),\n displayName: 'Command action',\n description: 'Invokes a modeled command. The command and its argument mapping are stored on the element; the host that handles the command event reads them.',\n properties: [\n { path: 'label', label: 'Label', group: 'Content', valueType: PropertyValueType.String },\n {\n path: 'command', label: 'Command', group: 'Behavior', valueType: PropertyValueType.String,\n editorKind: 'stateChangeReference', constraints: { required: true },\n description: 'The state change this action submits.',\n },\n {\n path: 'arguments', label: 'Argument mapping', group: 'Behavior', valueType: PropertyValueType.Collection,\n description: 'Where each command argument comes from.',\n item: {\n label: 'Argument',\n properties: [\n { path: 'name', label: 'Argument', group: 'Behavior', valueType: PropertyValueType.String, constraints: { required: true } },\n { path: 'source', label: 'Source', group: 'Behavior', valueType: PropertyValueType.String, editorKind: 'bindingPath', constraints: { required: true } },\n ],\n },\n },\n ],\n },\n {\n component: key('column'),\n displayName: 'Table column',\n properties: [\n { path: 'property', label: 'Result field', group: 'Data', valueType: PropertyValueType.String, editorKind: 'resultField', constraints: { required: true } },\n { path: 'label', label: 'Heading', group: 'Content', valueType: PropertyValueType.String },\n ],\n },\n {\n component: key('navigationBar'),\n displayName: 'Navigation bar',\n description: 'A list of navigation items. A template author fixes the first item (Home) and can expose the list so that screens add their own.',\n properties: [\n { path: 'title', label: 'Title', group: 'Content', valueType: PropertyValueType.String, default: 'Navigation' },\n {\n path: 'items', label: 'Items', group: 'Content', valueType: PropertyValueType.Collection, default: [],\n item: {\n label: 'Navigation item',\n properties: [\n { path: 'label', label: 'Label', group: 'Content', valueType: PropertyValueType.String, constraints: { required: true, minimumLength: 1 } },\n { path: 'icon', label: 'Icon', group: 'Content', valueType: PropertyValueType.Icon, editorKind: 'iconPicker' },\n { path: 'destination', label: 'Destination', group: 'Content', valueType: PropertyValueType.Destination, editorKind: 'screenPicker', constraints: { required: true } },\n ],\n },\n },\n ],\n },\n];\n"],"names":["key","name","componentRegistryKey","coreDescriptors","component","displayName","properties","path","label","group","valueType","PropertyValueType","String","default","description","editorKind","constraints","required","Collection","item","minimumLength","Icon","Destination"],"mappings":";;;;;;;;;AAAA;AACA;AAKA,MAAMA,GAAAA,GAAM,CAACC,IAAAA,GAAiBC,oBAAAA,CAAqB,MAAA,EAAQD,IAAAA,CAAAA;AAE3D;;;;;;UAOaE,eAAAA,GAAyC;AAClD,IAAA;AACIC,QAAAA,SAAAA,EAAWJ,GAAAA,CAAI,QAAA,CAAA;QACfK,WAAAA,EAAa,QAAA;QACbC,UAAAA,EAAY;AACR,YAAA;gBAAEC,IAAAA,EAAM,OAAA;gBAASC,KAAAA,EAAO,OAAA;gBAASC,KAAAA,EAAO,SAAA;AAAWC,gBAAAA,SAAAA,EAAWC,kBAAkBC,MAAM;gBAAEC,OAAAA,EAAS;AAAG;AACvG;AACL,KAAA;AACA,IAAA;AACIT,QAAAA,SAAAA,EAAWJ,GAAAA,CAAI,QAAA,CAAA;QACfK,WAAAA,EAAa,gBAAA;QACbS,WAAAA,EAAa,gJAAA;QACbR,UAAAA,EAAY;AACR,YAAA;gBAAEC,IAAAA,EAAM,OAAA;gBAASC,KAAAA,EAAO,OAAA;gBAASC,KAAAA,EAAO,SAAA;AAAWC,gBAAAA,SAAAA,EAAWC,kBAAkBC;AAAO,aAAA;AACvF,YAAA;gBACIL,IAAAA,EAAM,SAAA;gBAAWC,KAAAA,EAAO,SAAA;gBAAWC,KAAAA,EAAO,UAAA;AAAYC,gBAAAA,SAAAA,EAAWC,kBAAkBC,MAAM;gBACzFG,UAAAA,EAAY,sBAAA;gBAAwBC,WAAAA,EAAa;oBAAEC,QAAAA,EAAU;AAAK,iBAAA;gBAClEH,WAAAA,EAAa;AACjB,aAAA;AACA,YAAA;gBACIP,IAAAA,EAAM,WAAA;gBAAaC,KAAAA,EAAO,kBAAA;gBAAoBC,KAAAA,EAAO,UAAA;AAAYC,gBAAAA,SAAAA,EAAWC,kBAAkBO,UAAU;gBACxGJ,WAAAA,EAAa,yCAAA;gBACbK,IAAAA,EAAM;oBACFX,KAAAA,EAAO,UAAA;oBACPF,UAAAA,EAAY;AACR,wBAAA;4BAAEC,IAAAA,EAAM,MAAA;4BAAQC,KAAAA,EAAO,UAAA;4BAAYC,KAAAA,EAAO,UAAA;AAAYC,4BAAAA,SAAAA,EAAWC,kBAAkBC,MAAM;4BAAEI,WAAAA,EAAa;gCAAEC,QAAAA,EAAU;AAAK;AAAE,yBAAA;AAC3H,wBAAA;4BAAEV,IAAAA,EAAM,QAAA;4BAAUC,KAAAA,EAAO,QAAA;4BAAUC,KAAAA,EAAO,UAAA;AAAYC,4BAAAA,SAAAA,EAAWC,kBAAkBC,MAAM;4BAAEG,UAAAA,EAAY,aAAA;4BAAeC,WAAAA,EAAa;gCAAEC,QAAAA,EAAU;AAAK;AAAE;AACzJ;AACL;AACJ;AACH;AACL,KAAA;AACA,IAAA;AACIb,QAAAA,SAAAA,EAAWJ,GAAAA,CAAI,QAAA,CAAA;QACfK,WAAAA,EAAa,cAAA;QACbC,UAAAA,EAAY;AACR,YAAA;gBAAEC,IAAAA,EAAM,UAAA;gBAAYC,KAAAA,EAAO,cAAA;gBAAgBC,KAAAA,EAAO,MAAA;AAAQC,gBAAAA,SAAAA,EAAWC,kBAAkBC,MAAM;gBAAEG,UAAAA,EAAY,aAAA;gBAAeC,WAAAA,EAAa;oBAAEC,QAAAA,EAAU;AAAK;AAAE,aAAA;AAC1J,YAAA;gBAAEV,IAAAA,EAAM,OAAA;gBAASC,KAAAA,EAAO,SAAA;gBAAWC,KAAAA,EAAO,SAAA;AAAWC,gBAAAA,SAAAA,EAAWC,kBAAkBC;AAAO;AAC5F;AACL,KAAA;AACA,IAAA;AACIR,QAAAA,SAAAA,EAAWJ,GAAAA,CAAI,eAAA,CAAA;QACfK,WAAAA,EAAa,gBAAA;QACbS,WAAAA,EAAa,kIAAA;QACbR,UAAAA,EAAY;AACR,YAAA;gBAAEC,IAAAA,EAAM,OAAA;gBAASC,KAAAA,EAAO,OAAA;gBAASC,KAAAA,EAAO,SAAA;AAAWC,gBAAAA,SAAAA,EAAWC,kBAAkBC,MAAM;gBAAEC,OAAAA,EAAS;AAAa,aAAA;AAC9G,YAAA;gBACIN,IAAAA,EAAM,OAAA;gBAASC,KAAAA,EAAO,OAAA;gBAASC,KAAAA,EAAO,SAAA;AAAWC,gBAAAA,SAAAA,EAAWC,kBAAkBO,UAAU;AAAEL,gBAAAA,OAAAA,EAAS,EAAE;gBACrGM,IAAAA,EAAM;oBACFX,KAAAA,EAAO,iBAAA;oBACPF,UAAAA,EAAY;AACR,wBAAA;4BAAEC,IAAAA,EAAM,OAAA;4BAASC,KAAAA,EAAO,OAAA;4BAASC,KAAAA,EAAO,SAAA;AAAWC,4BAAAA,SAAAA,EAAWC,kBAAkBC,MAAM;4BAAEI,WAAAA,EAAa;gCAAEC,QAAAA,EAAU,IAAA;gCAAMG,aAAAA,EAAe;AAAE;AAAE,yBAAA;AAC1I,wBAAA;4BAAEb,IAAAA,EAAM,MAAA;4BAAQC,KAAAA,EAAO,MAAA;4BAAQC,KAAAA,EAAO,SAAA;AAAWC,4BAAAA,SAAAA,EAAWC,kBAAkBU,IAAI;4BAAEN,UAAAA,EAAY;AAAa,yBAAA;AAC7G,wBAAA;4BAAER,IAAAA,EAAM,aAAA;4BAAeC,KAAAA,EAAO,aAAA;4BAAeC,KAAAA,EAAO,SAAA;AAAWC,4BAAAA,SAAAA,EAAWC,kBAAkBW,WAAW;4BAAEP,UAAAA,EAAY,cAAA;4BAAgBC,WAAAA,EAAa;gCAAEC,QAAAA,EAAU;AAAK;AAAE;AACxK;AACL;AACJ;AACH;AACL;;;"}
package/dist/esm/index.js CHANGED
@@ -17,18 +17,31 @@ export { NavBar } from './NavBar/NavBar.js';
17
17
  export { extractNavigationItem } from './NavBar/extractNavigationItem.js';
18
18
  export { SceneNavigationProvider, useSceneNavigation } from './navigation/SceneNavigationContext.js';
19
19
  export { SceneNavigationHost } from './navigation/SceneNavigationHost.js';
20
+ export { createBrowserSceneHistory } from './navigation/createBrowserSceneHistory.js';
21
+ export { createMemorySceneHistory } from './navigation/createMemorySceneHistory.js';
22
+ export { diagnoseRenderedNavigation } from './navigation/diagnoseRenderedNavigation.js';
23
+ export { identityRoute } from './navigation/identityRoute.js';
24
+ export { matchSceneRoute } from './navigation/matchSceneRoute.js';
25
+ export { navigationRouteKey } from './navigation/navigationRouteKey.js';
20
26
  export { resolveDestination } from './navigation/resolveDestination.js';
27
+ export { sceneRoutesFrom } from './navigation/sceneRoutesFrom.js';
28
+ export { useSceneHistoryNavigation } from './navigation/useSceneHistoryNavigation.js';
21
29
  export { IconAdapterRegistry, createIconAdapterRegistry } from './icons/IconAdapterRegistry.js';
22
30
  export { IconAdapterProvider, useIconAdapters } from './icons/IconAdapterContext.js';
23
31
  export { useIconGlyph } from './icons/useIconGlyph.js';
24
32
  export { SceneIcon } from './icons/SceneIcon.js';
25
33
  export { validateDesignTimeBundle } from './packages/DesignTimeBundle.js';
34
+ export { DesignTimeContractVersion } from './packages/DesignTimeContractVersion.js';
35
+ export { DesignTimeExtensionPoint, designTimeExtensionPointLabels } from './packages/DesignTimeExtensionPoint.js';
26
36
  export { DesignTimeProvider, useDesignTimeContext } from './packages/DesignTimeProvider.js';
27
37
  export { EmbeddedPackageHost } from './packages/EmbeddedPackageHost.js';
38
+ export { loadDesignTimeContributions } from './packages/loadDesignTimeContributions.js';
28
39
  export { PackageHostAssets } from './packages/PackageHostAssets.js';
29
40
  export { resolvePackageHost } from './packages/PackageHostConfiguration.js';
30
41
  export { PackageHostRenderMode } from './packages/PackageHostRenderMode.js';
31
42
  export { PackageHostView } from './packages/PackageHostView.js';
43
+ export { resolveDesignTimeHost } from './packages/resolveDesignTimeHost.js';
44
+ export { runDesignTimeAction } from './packages/runDesignTimeAction.js';
32
45
  export { componentRegistryKey, mergeIconAdapters, mergePackageRegistries, validatePackageBundle } from './packages/ScenePackageBundle.js';
33
46
  export { StandalonePackageHost } from './packages/StandalonePackageHost.js';
34
47
  export { WebViewPackageHost } from './packages/WebViewPackageHost.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -4,6 +4,7 @@ export interface DestinationResolution {
4
4
  url?: string;
5
5
  outlet?: string;
6
6
  dialog?: string;
7
+ parameters: Record<string, string>;
7
8
  action: 'navigate' | 'openDialog' | 'openExternal';
8
9
  diagnostics: string[];
9
10
  }
@@ -1 +1 @@
1
- {"version":3,"file":"DestinationResolution.d.ts","sourceRoot":"","sources":["../../../navigation/DestinationResolution.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,MAAM,WAAW,qBAAqB;IAClC,IAAI,EAAE,eAAe,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,UAAU,GAAG,YAAY,GAAG,cAAc,CAAC;IACnD,WAAW,EAAE,MAAM,EAAE,CAAC;CACzB"}
1
+ {"version":3,"file":"DestinationResolution.d.ts","sourceRoot":"","sources":["../../../navigation/DestinationResolution.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,MAAM,WAAW,qBAAqB;IAClC,IAAI,EAAE,eAAe,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAGhB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,MAAM,EAAE,UAAU,GAAG,YAAY,GAAG,cAAc,CAAC;IACnD,WAAW,EAAE,MAAM,EAAE,CAAC;CACzB"}
@@ -0,0 +1,5 @@
1
+ export interface DialogResult {
2
+ dialog: string;
3
+ result?: unknown;
4
+ }
5
+ //# sourceMappingURL=DialogResult.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DialogResult.d.ts","sourceRoot":"","sources":["../../../navigation/DialogResult.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CACpB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=DialogResult.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DialogResult.js","sourceRoot":"","sources":["../../../navigation/DialogResult.ts"],"names":[],"mappings":""}
@@ -0,0 +1,10 @@
1
+ import { SceneNavigationState } from './SceneNavigationState';
2
+ export interface SceneHistory {
3
+ location(): string | undefined;
4
+ state(): SceneNavigationState | undefined;
5
+ push(state: SceneNavigationState): void;
6
+ replace(state: SceneNavigationState): void;
7
+ back(): void;
8
+ listen(listener: (url: string | undefined, state: SceneNavigationState | undefined) => void): () => void;
9
+ }
10
+ //# sourceMappingURL=SceneHistory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SceneHistory.d.ts","sourceRoot":"","sources":["../../../navigation/SceneHistory.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAO9D,MAAM,WAAW,YAAY;IAEzB,QAAQ,IAAI,MAAM,GAAG,SAAS,CAAC;IAG/B,KAAK,IAAI,oBAAoB,GAAG,SAAS,CAAC;IAE1C,IAAI,CAAC,KAAK,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACxC,OAAO,CAAC,KAAK,EAAE,oBAAoB,GAAG,IAAI,CAAC;IAC3C,IAAI,IAAI,IAAI,CAAC;IAGb,MAAM,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,oBAAoB,GAAG,SAAS,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;CAC5G"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=SceneHistory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SceneHistory.js","sourceRoot":"","sources":["../../../navigation/SceneHistory.ts"],"names":[],"mappings":""}
@@ -2,14 +2,19 @@ import { ReactNode } from 'react';
2
2
  import { BindingScope } from '@cratis/scene.engine';
3
3
  import { DestinationReference } from '@cratis/scene.model';
4
4
  import { DestinationResolution } from './DestinationResolution';
5
+ import { DialogResult } from './DialogResult';
5
6
  export interface SceneNavigationContextValue {
6
7
  currentScreen: string;
7
8
  currentUrl?: string;
8
9
  currentOutlet?: string;
9
10
  currentDialog?: string;
11
+ currentParameters: Record<string, string>;
12
+ dialogResult?: DialogResult;
13
+ unresolvedUrl?: string;
10
14
  bindingScope: BindingScope;
11
15
  navigate(destination: DestinationReference): DestinationResolution;
12
- closeDialog(): void;
16
+ closeDialog(result?: unknown): void;
17
+ back(): void;
13
18
  }
14
19
  export interface SceneNavigationProviderProps {
15
20
  value: SceneNavigationContextValue;
@@ -1 +1 @@
1
- {"version":3,"file":"SceneNavigationContext.d.ts","sourceRoot":"","sources":["../../../navigation/SceneNavigationContext.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAA6B,MAAM,OAAO,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,MAAM,WAAW,2BAA2B;IACxC,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,YAAY,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,oBAAoB,GAAG,qBAAqB,CAAC;IACnE,WAAW,IAAI,IAAI,CAAC;CACvB;AAID,MAAM,WAAW,4BAA4B;IACzC,KAAK,EAAE,2BAA2B,CAAC;IACnC,QAAQ,EAAE,SAAS,CAAC;CACvB;AAED,wBAAgB,uBAAuB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,4BAA4B,+BAExF;AAED,wBAAgB,kBAAkB,IAAI,2BAA2B,CAIhE"}
1
+ {"version":3,"file":"SceneNavigationContext.d.ts","sourceRoot":"","sources":["../../../navigation/SceneNavigationContext.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAA6B,MAAM,OAAO,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,MAAM,WAAW,2BAA2B;IACxC,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IAGvB,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAG1C,YAAY,CAAC,EAAE,YAAY,CAAC;IAG5B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,YAAY,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,oBAAoB,GAAG,qBAAqB,CAAC;IAGnE,WAAW,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAGpC,IAAI,IAAI,IAAI,CAAC;CAChB;AAID,MAAM,WAAW,4BAA4B;IACzC,KAAK,EAAE,2BAA2B,CAAC;IACnC,QAAQ,EAAE,SAAS,CAAC;CACvB;AAED,wBAAgB,uBAAuB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,4BAA4B,+BAExF;AAED,wBAAgB,kBAAkB,IAAI,2BAA2B,CAIhE"}
@@ -1 +1 @@
1
- {"version":3,"file":"SceneNavigationContext.js","sources":["../../../navigation/SceneNavigationContext.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { ReactNode, createContext, useContext } from 'react';\nimport { BindingScope } from '@cratis/scene.engine';\nimport { DestinationReference } from '@cratis/scene.model';\nimport { DestinationResolution } from './DestinationResolution';\n\nexport interface SceneNavigationContextValue {\n currentScreen: string;\n currentUrl?: string;\n currentOutlet?: string;\n currentDialog?: string;\n bindingScope: BindingScope;\n navigate(destination: DestinationReference): DestinationResolution;\n closeDialog(): void;\n}\n\nconst Context = createContext<SceneNavigationContextValue | undefined>(undefined);\n\nexport interface SceneNavigationProviderProps {\n value: SceneNavigationContextValue;\n children: ReactNode;\n}\n\nexport function SceneNavigationProvider({ value, children }: SceneNavigationProviderProps) {\n return <Context.Provider value={value}>{children}</Context.Provider>;\n}\n\nexport function useSceneNavigation(): SceneNavigationContextValue {\n const context = useContext(Context);\n if (!context) throw new Error('No Scene navigation context is available.');\n return context;\n}\n"],"names":["Context","createContext","undefined","SceneNavigationProvider","value","children","_jsx","Provider","useSceneNavigation","context","useContext","Error"],"mappings":";;;AAkBA,MAAMA,wBAAUC,aAAAA,CAAuDC,SAAAA,CAAAA;AAOhE,SAASC,uBAAAA,CAAwB,EAAEC,KAAK,EAAEC,QAAQ,EAAgC,EAAA;IACrF,qBAAOC,GAAA,CAACN,QAAQO,QAAQ,EAAA;QAACH,KAAAA,EAAOA,KAAAA;AAAQC,QAAAA,QAAAA,EAAAA;;AAC5C;AAEO,SAASG,kBAAAA,GAAAA;AACZ,IAAA,MAAMC,UAAUC,UAAAA,CAAWV,OAAAA,CAAAA;AAC3B,IAAA,IAAI,CAACS,OAAAA,EAAS,MAAM,IAAIE,KAAAA,CAAM,2CAAA,CAAA;IAC9B,OAAOF,OAAAA;AACX;;"}
1
+ {"version":3,"file":"SceneNavigationContext.js","sources":["../../../navigation/SceneNavigationContext.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { ReactNode, createContext, useContext } from 'react';\nimport { BindingScope } from '@cratis/scene.engine';\nimport { DestinationReference } from '@cratis/scene.model';\nimport { DestinationResolution } from './DestinationResolution';\nimport { DialogResult } from './DialogResult';\n\nexport interface SceneNavigationContextValue {\n currentScreen: string;\n currentUrl?: string;\n currentOutlet?: string;\n currentDialog?: string;\n\n /** The route parameters of the current entry - from the destination that opened it, or the deep link. */\n currentParameters: Record<string, string>;\n\n /** What the last dialog returned when it closed. */\n dialogResult?: DialogResult;\n\n /** A deep link that matched no route; the host fell back to its initial screen. */\n unresolvedUrl?: string;\n bindingScope: BindingScope;\n navigate(destination: DestinationReference): DestinationResolution;\n\n /** Closes the open dialog, returning to the entry that opened it, and records its result. */\n closeDialog(result?: unknown): void;\n\n /** Goes back one history entry. */\n back(): void;\n}\n\nconst Context = createContext<SceneNavigationContextValue | undefined>(undefined);\n\nexport interface SceneNavigationProviderProps {\n value: SceneNavigationContextValue;\n children: ReactNode;\n}\n\nexport function SceneNavigationProvider({ value, children }: SceneNavigationProviderProps) {\n return <Context.Provider value={value}>{children}</Context.Provider>;\n}\n\nexport function useSceneNavigation(): SceneNavigationContextValue {\n const context = useContext(Context);\n if (!context) throw new Error('No Scene navigation context is available.');\n return context;\n}\n"],"names":["Context","createContext","undefined","SceneNavigationProvider","value","children","_jsx","Provider","useSceneNavigation","context","useContext","Error"],"mappings":";;;AAiCA,MAAMA,wBAAUC,aAAAA,CAAuDC,SAAAA,CAAAA;AAOhE,SAASC,uBAAAA,CAAwB,EAAEC,KAAK,EAAEC,QAAQ,EAAgC,EAAA;IACrF,qBAAOC,GAAA,CAACN,QAAQO,QAAQ,EAAA;QAACH,KAAAA,EAAOA,KAAAA;AAAQC,QAAAA,QAAAA,EAAAA;;AAC5C;AAEO,SAASG,kBAAAA,GAAAA;AACZ,IAAA,MAAMC,UAAUC,UAAAA,CAAWV,OAAAA,CAAAA;AAC3B,IAAA,IAAI,CAACS,OAAAA,EAAS,MAAM,IAAIE,KAAAA,CAAM,2CAAA,CAAA;IAC9B,OAAOF,OAAAA;AACX;;"}
@@ -1,12 +1,17 @@
1
1
  import { BindingScope } from '@cratis/scene.engine';
2
- import { SceneElement } from '@cratis/scene.model';
2
+ import { DestinationReference, SceneElement } from '@cratis/scene.model';
3
3
  import { ComponentRegistry } from '../renderer';
4
+ import { SceneHistory } from './SceneHistory';
5
+ import { SceneRoute } from './SceneRoute';
4
6
  export interface SceneNavigationHostProps {
5
7
  screens: Record<string, SceneElement>;
6
8
  dialogs?: Record<string, SceneElement>;
7
9
  initialScreen: string;
8
10
  registry: ComponentRegistry;
9
11
  bindingScope?: BindingScope;
12
+ history?: SceneHistory;
13
+ destinations?: DestinationReference[];
14
+ routes?: SceneRoute[];
10
15
  }
11
- export declare function SceneNavigationHost({ screens, dialogs, initialScreen, registry, bindingScope }: SceneNavigationHostProps): import("react").JSX.Element;
16
+ export declare function SceneNavigationHost({ screens, dialogs, initialScreen, registry, bindingScope, history, destinations, routes }: SceneNavigationHostProps): import("react").JSX.Element;
12
17
  //# sourceMappingURL=SceneNavigationHost.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SceneNavigationHost.d.ts","sourceRoot":"","sources":["../../../navigation/SceneNavigationHost.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAyC,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAE1F,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAIhD,MAAM,WAAW,wBAAwB;IACrC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACvC,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,YAAY,CAAC,EAAE,YAAY,CAAC;CAC/B;AAMD,wBAAgB,mBAAmB,CAAC,EAAE,OAAO,EAAE,OAAY,EAAE,aAAa,EAAE,QAAQ,EAAE,YAAiB,EAAE,EAAE,wBAAwB,+BA2ClI"}
1
+ {"version":3,"file":"SceneNavigationHost.d.ts","sourceRoot":"","sources":["../../../navigation/SceneNavigationHost.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAI1C,MAAM,WAAW,wBAAwB;IACrC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACvC,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,YAAY,CAAC,EAAE,YAAY,CAAC;IAM5B,OAAO,CAAC,EAAE,YAAY,CAAC;IAGvB,YAAY,CAAC,EAAE,oBAAoB,EAAE,CAAC;IAGtC,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC;CACzB;AAOD,wBAAgB,mBAAmB,CAAC,EAAE,OAAO,EAAE,OAAY,EAAE,aAAa,EAAE,QAAQ,EAAE,YAAiB,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,wBAAwB,+BAgBjK"}
@@ -1,58 +1,31 @@
1
1
  import { jsxs, jsx } from 'react/jsx-runtime';
2
- import { useState, useCallback, useMemo } from 'react';
3
- import { DestinationKind } from '@cratis/scene.model';
2
+ import { useState, useMemo } from 'react';
4
3
  import { SceneElementView } from '../SceneElementView.js';
4
+ import { createMemorySceneHistory } from './createMemorySceneHistory.js';
5
5
  import { SceneNavigationProvider } from './SceneNavigationContext.js';
6
- import { resolveDestination } from './resolveDestination.js';
6
+ import { sceneRoutesFrom } from './sceneRoutesFrom.js';
7
+ import { useSceneHistoryNavigation } from './useSceneHistoryNavigation.js';
7
8
 
8
9
  /**
9
10
  * Executes Scene destinations against an in-memory rendered hierarchy: screen routes replace outlets,
10
- * dialog destinations render dialog content, and external destinations only report their resolved action.
11
- */ function SceneNavigationHost({ screens, dialogs = {}, initialScreen, registry, bindingScope = {} }) {
12
- const [currentScreen, setCurrentScreen] = useState(initialScreen);
13
- const [currentUrl, setCurrentUrl] = useState(initialScreen);
14
- const [currentOutlet, setCurrentOutlet] = useState();
15
- const [currentDialog, setCurrentDialog] = useState();
16
- const navigate = useCallback((destination)=>{
17
- const resolution = resolveDestination(destination, bindingScope);
18
- if (resolution.kind === DestinationKind.Dialog) {
19
- setCurrentDialog(resolution.dialog);
20
- return resolution;
21
- }
22
- if (resolution.kind !== DestinationKind.External) {
23
- setCurrentScreen(destination.screen ?? destination.slice ?? currentScreen);
24
- setCurrentOutlet(resolution.outlet);
25
- }
26
- setCurrentUrl(resolution.url);
27
- return resolution;
28
- }, [
29
- bindingScope,
30
- currentScreen
11
+ * dialog destinations render dialog content over the screen that opened them, and external destinations
12
+ * only report their resolved action. Every navigation is a history entry.
13
+ */ function SceneNavigationHost({ screens, dialogs = {}, initialScreen, registry, bindingScope = {}, history, destinations, routes }) {
14
+ const [memoryHistory] = useState(()=>createMemorySceneHistory());
15
+ const routeTable = useMemo(()=>routes ?? sceneRoutesFrom(Object.keys(screens), destinations), [
16
+ destinations,
17
+ routes,
18
+ screens
31
19
  ]);
32
- const value = useMemo(()=>({
33
- currentScreen,
34
- currentUrl,
35
- currentOutlet,
36
- currentDialog,
37
- bindingScope,
38
- navigate,
39
- closeDialog: ()=>setCurrentDialog(undefined)
40
- }), [
41
- bindingScope,
42
- currentDialog,
43
- currentOutlet,
44
- currentScreen,
45
- currentUrl,
46
- navigate
47
- ]);
48
- const screen = screens[currentScreen];
49
- const dialog = currentDialog ? dialogs[currentDialog] : undefined;
20
+ const value = useSceneHistoryNavigation(history ?? memoryHistory, routeTable, initialScreen, bindingScope);
21
+ const screen = screens[value.currentScreen];
22
+ const dialog = value.currentDialog ? dialogs[value.currentDialog] : undefined;
50
23
  return /*#__PURE__*/ jsxs(SceneNavigationProvider, {
51
24
  value: value,
52
25
  children: [
53
26
  /*#__PURE__*/ jsx("div", {
54
- "data-scene-outlet": currentOutlet ?? 'primary',
55
- "data-scene-url": currentUrl,
27
+ "data-scene-outlet": value.currentOutlet ?? 'primary',
28
+ "data-scene-url": value.currentUrl,
56
29
  children: screen && /*#__PURE__*/ jsx(SceneElementView, {
57
30
  element: screen,
58
31
  registry: registry,
@@ -63,7 +36,9 @@ import { resolveDestination } from './resolveDestination.js';
63
36
  }),
64
37
  dialog && /*#__PURE__*/ jsx("div", {
65
38
  role: "dialog",
66
- "data-scene-dialog": currentDialog,
39
+ "aria-modal": "true",
40
+ "aria-label": value.currentDialog,
41
+ "data-scene-dialog": value.currentDialog,
67
42
  children: /*#__PURE__*/ jsx(SceneElementView, {
68
43
  element: dialog,
69
44
  registry: registry,
@@ -1 +1 @@
1
- {"version":3,"file":"SceneNavigationHost.js","sources":["../../../navigation/SceneNavigationHost.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { useCallback, useMemo, useState } from 'react';\nimport { BindingScope } from '@cratis/scene.engine';\nimport { DestinationKind, DestinationReference, SceneElement } from '@cratis/scene.model';\nimport { SceneElementView } from '../SceneElementView';\nimport { ComponentRegistry } from '../renderer';\nimport { SceneNavigationContextValue, SceneNavigationProvider } from './SceneNavigationContext';\nimport { resolveDestination } from './resolveDestination';\n\nexport interface SceneNavigationHostProps {\n screens: Record<string, SceneElement>;\n dialogs?: Record<string, SceneElement>;\n initialScreen: string;\n registry: ComponentRegistry;\n bindingScope?: BindingScope;\n}\n\n/**\n * Executes Scene destinations against an in-memory rendered hierarchy: screen routes replace outlets,\n * dialog destinations render dialog content, and external destinations only report their resolved action.\n */\nexport function SceneNavigationHost({ screens, dialogs = {}, initialScreen, registry, bindingScope = {} }: SceneNavigationHostProps) {\n const [currentScreen, setCurrentScreen] = useState(initialScreen);\n const [currentUrl, setCurrentUrl] = useState<string | undefined>(initialScreen);\n const [currentOutlet, setCurrentOutlet] = useState<string | undefined>();\n const [currentDialog, setCurrentDialog] = useState<string | undefined>();\n\n const navigate = useCallback((destination: DestinationReference) => {\n const resolution = resolveDestination(destination, bindingScope);\n if (resolution.kind === DestinationKind.Dialog) {\n setCurrentDialog(resolution.dialog);\n return resolution;\n }\n\n if (resolution.kind !== DestinationKind.External) {\n setCurrentScreen(destination.screen ?? destination.slice ?? currentScreen);\n setCurrentOutlet(resolution.outlet);\n }\n\n setCurrentUrl(resolution.url);\n return resolution;\n }, [bindingScope, currentScreen]);\n\n const value = useMemo<SceneNavigationContextValue>(() => ({\n currentScreen,\n currentUrl,\n currentOutlet,\n currentDialog,\n bindingScope,\n navigate,\n closeDialog: () => setCurrentDialog(undefined),\n }), [bindingScope, currentDialog, currentOutlet, currentScreen, currentUrl, navigate]);\n\n const screen = screens[currentScreen];\n const dialog = currentDialog ? dialogs[currentDialog] : undefined;\n\n return <SceneNavigationProvider value={value}>\n <div data-scene-outlet={currentOutlet ?? 'primary'} data-scene-url={currentUrl}>\n {screen && <SceneElementView element={screen} registry={registry} dataContext={bindingScope.dataContext} queryResults={bindingScope.queryResults} componentOutputs={bindingScope.componentOutputs} />}\n </div>\n {dialog && <div role='dialog' data-scene-dialog={currentDialog}>\n <SceneElementView element={dialog} registry={registry} dataContext={bindingScope.dataContext} queryResults={bindingScope.queryResults} componentOutputs={bindingScope.componentOutputs} />\n </div>}\n </SceneNavigationProvider>;\n}\n"],"names":["SceneNavigationHost","screens","dialogs","initialScreen","registry","bindingScope","currentScreen","setCurrentScreen","useState","currentUrl","setCurrentUrl","currentOutlet","setCurrentOutlet","currentDialog","setCurrentDialog","navigate","useCallback","destination","resolution","resolveDestination","kind","DestinationKind","Dialog","dialog","External","screen","slice","outlet","url","value","useMemo","closeDialog","undefined","_jsxs","SceneNavigationProvider","_jsx","div","data-scene-outlet","data-scene-url","SceneElementView","element","dataContext","queryResults","componentOutputs","role","data-scene-dialog"],"mappings":"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"}
1
+ {"version":3,"file":"SceneNavigationHost.js","sources":["../../../navigation/SceneNavigationHost.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { useMemo, useState } from 'react';\nimport { BindingScope } from '@cratis/scene.engine';\nimport { DestinationReference, SceneElement } from '@cratis/scene.model';\nimport { SceneElementView } from '../SceneElementView';\nimport { ComponentRegistry } from '../renderer';\nimport { createMemorySceneHistory } from './createMemorySceneHistory';\nimport { SceneHistory } from './SceneHistory';\nimport { SceneNavigationProvider } from './SceneNavigationContext';\nimport { SceneRoute } from './SceneRoute';\nimport { sceneRoutesFrom } from './sceneRoutesFrom';\nimport { useSceneHistoryNavigation } from './useSceneHistoryNavigation';\n\nexport interface SceneNavigationHostProps {\n screens: Record<string, SceneElement>;\n dialogs?: Record<string, SceneElement>;\n initialScreen: string;\n registry: ComponentRegistry;\n bindingScope?: BindingScope;\n\n /**\n * Where entries are recorded. `createBrowserSceneHistory()` drives the address bar, so deep links,\n * refresh and back/forward work; the default is an in-memory history for embedded hosts.\n */\n history?: SceneHistory;\n\n /** The destinations the application navigates to, so their route overrides can be deep linked. */\n destinations?: DestinationReference[];\n\n /** An explicit route table, used instead of the one derived from `screens` and `destinations`. */\n routes?: SceneRoute[];\n}\n\n/**\n * Executes Scene destinations against an in-memory rendered hierarchy: screen routes replace outlets,\n * dialog destinations render dialog content over the screen that opened them, and external destinations\n * only report their resolved action. Every navigation is a history entry.\n */\nexport function SceneNavigationHost({ screens, dialogs = {}, initialScreen, registry, bindingScope = {}, history, destinations, routes }: SceneNavigationHostProps) {\n const [memoryHistory] = useState(() => createMemorySceneHistory());\n const routeTable = useMemo(() => routes ?? sceneRoutesFrom(Object.keys(screens), destinations), [destinations, routes, screens]);\n const value = useSceneHistoryNavigation(history ?? memoryHistory, routeTable, initialScreen, bindingScope);\n\n const screen = screens[value.currentScreen];\n const dialog = value.currentDialog ? dialogs[value.currentDialog] : undefined;\n\n return <SceneNavigationProvider value={value}>\n <div data-scene-outlet={value.currentOutlet ?? 'primary'} data-scene-url={value.currentUrl}>\n {screen && <SceneElementView element={screen} registry={registry} dataContext={bindingScope.dataContext} queryResults={bindingScope.queryResults} componentOutputs={bindingScope.componentOutputs} />}\n </div>\n {dialog && <div role='dialog' aria-modal='true' aria-label={value.currentDialog} data-scene-dialog={value.currentDialog}>\n <SceneElementView element={dialog} registry={registry} dataContext={bindingScope.dataContext} queryResults={bindingScope.queryResults} componentOutputs={bindingScope.componentOutputs} />\n </div>}\n </SceneNavigationProvider>;\n}\n"],"names":["SceneNavigationHost","screens","dialogs","initialScreen","registry","bindingScope","history","destinations","routes","memoryHistory","useState","createMemorySceneHistory","routeTable","useMemo","sceneRoutesFrom","Object","keys","value","useSceneHistoryNavigation","screen","currentScreen","dialog","currentDialog","undefined","_jsxs","SceneNavigationProvider","_jsx","div","data-scene-outlet","currentOutlet","data-scene-url","currentUrl","SceneElementView","element","dataContext","queryResults","componentOutputs","role","aria-modal","aria-label","data-scene-dialog"],"mappings":";;;;;;;;AAmCA;;;;IAKO,SAASA,mBAAAA,CAAoB,EAAEC,OAAO,EAAEC,OAAAA,GAAU,EAAE,EAAEC,aAAa,EAAEC,QAAQ,EAAEC,YAAAA,GAAe,EAAE,EAAEC,OAAO,EAAEC,YAAY,EAAEC,MAAM,EAA4B,EAAA;AAC9J,IAAA,MAAM,CAACC,aAAAA,CAAc,GAAGC,QAAAA,CAAS,IAAMC,wBAAAA,EAAAA,CAAAA;IACvC,MAAMC,UAAAA,GAAaC,QAAQ,IAAML,MAAAA,IAAUM,gBAAgBC,MAAAA,CAAOC,IAAI,CAACf,OAAAA,CAAAA,EAAUM,YAAAA,CAAAA,EAAe;AAACA,QAAAA,YAAAA;AAAcC,QAAAA,MAAAA;AAAQP,QAAAA;AAAQ,KAAA,CAAA;AAC/H,IAAA,MAAMgB,KAAAA,GAAQC,yBAAAA,CAA0BZ,OAAAA,IAAWG,aAAAA,EAAeG,YAAYT,aAAAA,EAAeE,YAAAA,CAAAA;AAE7F,IAAA,MAAMc,MAAAA,GAASlB,OAAO,CAACgB,KAAAA,CAAMG,aAAa,CAAC;IAC3C,MAAMC,MAAAA,GAASJ,MAAMK,aAAa,GAAGpB,OAAO,CAACe,KAAAA,CAAMK,aAAa,CAAC,GAAGC,SAAAA;AAEpE,IAAA,qBAAOC,IAAA,CAACC,uBAAAA,EAAAA;QAAwBR,KAAAA,EAAOA,KAAAA;;0BACnCS,GAAA,CAACC,KAAAA,EAAAA;gBAAIC,mBAAAA,EAAmBX,KAAAA,CAAMY,aAAa,IAAI,SAAA;AAAWC,gBAAAA,gBAAAA,EAAgBb,MAAMc,UAAU;AACrFZ,gBAAAA,QAAAA,EAAAA,MAAAA,kBAAUO,GAAA,CAACM,gBAAAA,EAAAA;oBAAiBC,OAAAA,EAASd,MAAAA;oBAAQf,QAAAA,EAAUA,QAAAA;AAAU8B,oBAAAA,WAAAA,EAAa7B,aAAa6B,WAAW;AAAEC,oBAAAA,YAAAA,EAAc9B,aAAa8B,YAAY;AAAEC,oBAAAA,gBAAAA,EAAkB/B,aAAa+B;;;AAEpLf,YAAAA,MAAAA,kBAAUK,GAAA,CAACC,KAAAA,EAAAA;gBAAIU,IAAAA,EAAK,QAAA;gBAASC,YAAAA,EAAW,MAAA;AAAOC,gBAAAA,YAAAA,EAAYtB,MAAMK,aAAa;AAAEkB,gBAAAA,mBAAAA,EAAmBvB,MAAMK,aAAa;AACnH,gBAAA,QAAA,gBAAAI,GAAA,CAACM,gBAAAA,EAAAA;oBAAiBC,OAAAA,EAASZ,MAAAA;oBAAQjB,QAAAA,EAAUA,QAAAA;AAAU8B,oBAAAA,WAAAA,EAAa7B,aAAa6B,WAAW;AAAEC,oBAAAA,YAAAA,EAAc9B,aAAa8B,YAAY;AAAEC,oBAAAA,gBAAAA,EAAkB/B,aAAa+B;;;;;AAGlL;;"}
@@ -0,0 +1,8 @@
1
+ export interface SceneNavigationState {
2
+ screen: string;
3
+ url?: string;
4
+ outlet?: string;
5
+ dialog?: string;
6
+ parameters: Record<string, string>;
7
+ }
8
+ //# sourceMappingURL=SceneNavigationState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SceneNavigationState.d.ts","sourceRoot":"","sources":["../../../navigation/SceneNavigationState.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,oBAAoB;IACjC,MAAM,EAAE,MAAM,CAAC;IAGf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAGhB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=SceneNavigationState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SceneNavigationState.js","sourceRoot":"","sources":["../../../navigation/SceneNavigationState.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ export interface SceneRoute {
2
+ route: string;
3
+ screen: string;
4
+ outlet?: string;
5
+ }
6
+ //# sourceMappingURL=SceneRoute.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SceneRoute.d.ts","sourceRoot":"","sources":["../../../navigation/SceneRoute.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,UAAU;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=SceneRoute.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SceneRoute.js","sourceRoot":"","sources":["../../../navigation/SceneRoute.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ import { SceneHistory } from './SceneHistory';
2
+ export type SceneBrowserWindow = Pick<Window, 'history' | 'location' | 'addEventListener' | 'removeEventListener'>;
3
+ export declare function createBrowserSceneHistory(browser?: SceneBrowserWindow, basePath?: string): SceneHistory;
4
+ //# sourceMappingURL=createBrowserSceneHistory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createBrowserSceneHistory.d.ts","sourceRoot":"","sources":["../../../navigation/createBrowserSceneHistory.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAI9C,MAAM,MAAM,kBAAkB,GAAG,IAAI,CAAC,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,kBAAkB,GAAG,qBAAqB,CAAC,CAAC;AASnH,wBAAgB,yBAAyB,CAAC,OAAO,GAAE,kBAA2B,EAAE,QAAQ,SAAM,GAAG,YAAY,CAuB5G"}
@@ -0,0 +1,37 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+ const stateKey = 'sceneNavigation';
4
+ /**
5
+ * A history backed by the browser's `history` API under a base path such as `/app/`. Entries carry their
6
+ * navigation state, so back and forward restore the screen, outlet, parameters and dialog without
7
+ * re-resolving; an entry without state - a typed or bookmarked URL - is reported by URL alone.
8
+ */ function createBrowserSceneHistory(browser = window, basePath = '/') {
9
+ const base = basePath.endsWith('/') ? basePath : `${basePath}/`;
10
+ const href = (url)=>`${base}${url ?? ''}`;
11
+ const location = ()=>{
12
+ const current = `${browser.location.pathname}${browser.location.search}`;
13
+ if (!current.startsWith(base)) return undefined;
14
+ const relative = current.substring(base.length);
15
+ return relative.length ? relative : undefined;
16
+ };
17
+ const stored = (value)=>value?.[stateKey];
18
+ return {
19
+ location,
20
+ state: ()=>stored(browser.history.state),
21
+ push: (state)=>browser.history.pushState({
22
+ [stateKey]: state
23
+ }, '', href(state.url)),
24
+ replace: (state)=>browser.history.replaceState({
25
+ [stateKey]: state
26
+ }, '', href(state.url)),
27
+ back: ()=>browser.history.back(),
28
+ listen: (listener)=>{
29
+ const onPopState = (event)=>listener(location(), stored(event.state));
30
+ browser.addEventListener('popstate', onPopState);
31
+ return ()=>browser.removeEventListener('popstate', onPopState);
32
+ }
33
+ };
34
+ }
35
+
36
+ export { createBrowserSceneHistory };
37
+ //# sourceMappingURL=createBrowserSceneHistory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createBrowserSceneHistory.js","sources":["../../../navigation/createBrowserSceneHistory.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { SceneHistory } from './SceneHistory';\nimport { SceneNavigationState } from './SceneNavigationState';\n\n/** The part of `window` the browser history needs, so a host can pass its own frame's window. */\nexport type SceneBrowserWindow = Pick<Window, 'history' | 'location' | 'addEventListener' | 'removeEventListener'>;\n\nconst stateKey = 'sceneNavigation';\n\n/**\n * A history backed by the browser's `history` API under a base path such as `/app/`. Entries carry their\n * navigation state, so back and forward restore the screen, outlet, parameters and dialog without\n * re-resolving; an entry without state - a typed or bookmarked URL - is reported by URL alone.\n */\nexport function createBrowserSceneHistory(browser: SceneBrowserWindow = window, basePath = '/'): SceneHistory {\n const base = basePath.endsWith('/') ? basePath : `${basePath}/`;\n const href = (url: string | undefined) => `${base}${url ?? ''}`;\n const location = () => {\n const current = `${browser.location.pathname}${browser.location.search}`;\n if (!current.startsWith(base)) return undefined;\n const relative = current.substring(base.length);\n return relative.length ? relative : undefined;\n };\n const stored = (value: unknown) => (value as Record<string, SceneNavigationState> | null)?.[stateKey];\n\n return {\n location,\n state: () => stored(browser.history.state),\n push: state => browser.history.pushState({ [stateKey]: state }, '', href(state.url)),\n replace: state => browser.history.replaceState({ [stateKey]: state }, '', href(state.url)),\n back: () => browser.history.back(),\n listen: listener => {\n const onPopState = (event: PopStateEvent) => listener(location(), stored(event.state));\n browser.addEventListener('popstate', onPopState);\n return () => browser.removeEventListener('popstate', onPopState);\n },\n };\n}\n"],"names":["stateKey","createBrowserSceneHistory","browser","window","basePath","base","endsWith","href","url","location","current","pathname","search","startsWith","undefined","relative","substring","length","stored","value","state","history","push","pushState","replace","replaceState","back","listen","listener","onPopState","event","addEventListener","removeEventListener"],"mappings":"AAAA;AACA;AAQA,MAAMA,QAAAA,GAAW,iBAAA;AAEjB;;;;AAIC,IACM,SAASC,yBAAAA,CAA0BC,UAA8BC,MAAM,EAAEC,WAAW,GAAG,EAAA;IAC1F,MAAMC,IAAAA,GAAOD,SAASE,QAAQ,CAAC,OAAOF,QAAAA,GAAW,CAAA,EAAGA,QAAAA,CAAS,CAAC,CAAC;AAC/D,IAAA,MAAMG,OAAO,CAACC,GAAAA,GAA4B,CAAA,EAAGH,IAAAA,CAAAA,EAAOG,OAAO,EAAA,CAAA,CAAI;AAC/D,IAAA,MAAMC,QAAAA,GAAW,IAAA;QACb,MAAMC,OAAAA,GAAU,CAAA,EAAGR,OAAAA,CAAQO,QAAQ,CAACE,QAAQ,CAAA,EAAGT,OAAAA,CAAQO,QAAQ,CAACG,MAAM,CAAA,CAAE;AACxE,QAAA,IAAI,CAACF,OAAAA,CAAQG,UAAU,CAACR,OAAO,OAAOS,SAAAA;AACtC,QAAA,MAAMC,QAAAA,GAAWL,OAAAA,CAAQM,SAAS,CAACX,KAAKY,MAAM,CAAA;QAC9C,OAAOF,QAAAA,CAASE,MAAM,GAAGF,QAAAA,GAAWD,SAAAA;AACxC,IAAA,CAAA;AACA,IAAA,MAAMI,MAAAA,GAAS,CAACC,KAAAA,GAAoBA,KAAAA,GAAwDnB,QAAAA,CAAS;IAErG,OAAO;AACHS,QAAAA,QAAAA;AACAW,QAAAA,KAAAA,EAAO,IAAMF,MAAAA,CAAOhB,OAAAA,CAAQmB,OAAO,CAACD,KAAK,CAAA;AACzCE,QAAAA,IAAAA,EAAMF,CAAAA,KAAAA,GAASlB,OAAAA,CAAQmB,OAAO,CAACE,SAAS,CAAC;AAAE,gBAAA,CAACvB,WAAWoB;aAAM,EAAG,EAAA,EAAIb,IAAAA,CAAKa,KAAAA,CAAMZ,GAAG,CAAA,CAAA;AAClFgB,QAAAA,OAAAA,EAASJ,CAAAA,KAAAA,GAASlB,OAAAA,CAAQmB,OAAO,CAACI,YAAY,CAAC;AAAE,gBAAA,CAACzB,WAAWoB;aAAM,EAAG,EAAA,EAAIb,IAAAA,CAAKa,KAAAA,CAAMZ,GAAG,CAAA,CAAA;AACxFkB,QAAAA,IAAAA,EAAM,IAAMxB,OAAAA,CAAQmB,OAAO,CAACK,IAAI,EAAA;AAChCC,QAAAA,MAAAA,EAAQC,CAAAA,QAAAA,GAAAA;AACJ,YAAA,MAAMC,aAAa,CAACC,KAAAA,GAAyBF,SAASnB,QAAAA,EAAAA,EAAYS,MAAAA,CAAOY,MAAMV,KAAK,CAAA,CAAA;YACpFlB,OAAAA,CAAQ6B,gBAAgB,CAAC,UAAA,EAAYF,UAAAA,CAAAA;AACrC,YAAA,OAAO,IAAM3B,OAAAA,CAAQ8B,mBAAmB,CAAC,UAAA,EAAYH,UAAAA,CAAAA;AACzD,QAAA;AACJ,KAAA;AACJ;;"}
@@ -0,0 +1,7 @@
1
+ import { SceneHistory } from './SceneHistory';
2
+ import { SceneNavigationState } from './SceneNavigationState';
3
+ export declare function createMemorySceneHistory(initialUrl?: string): SceneHistory & {
4
+ forward(): void;
5
+ entries(): SceneNavigationState[];
6
+ };
7
+ //# sourceMappingURL=createMemorySceneHistory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createMemorySceneHistory.d.ts","sourceRoot":"","sources":["../../../navigation/createMemorySceneHistory.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAO9D,wBAAgB,wBAAwB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,YAAY,GAAG;IAAE,OAAO,IAAI,IAAI,CAAC;IAAC,OAAO,IAAI,oBAAoB,EAAE,CAAA;CAAE,CAgCnI"}