@pie-players/pie-assessment-toolkit 0.2.7 → 0.2.9

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 (220) hide show
  1. package/README.md +200 -67
  2. package/dist/attempt/TestSession.d.ts +23 -21
  3. package/dist/attempt/TestSession.d.ts.map +1 -1
  4. package/dist/attempt/TestSession.js +17 -15
  5. package/dist/attempt/TestSession.js.map +1 -1
  6. package/dist/attempt/adapters/activity-to-test-attempt-session.d.ts +50 -0
  7. package/dist/attempt/adapters/activity-to-test-attempt-session.d.ts.map +1 -0
  8. package/dist/attempt/adapters/activity-to-test-attempt-session.js +135 -0
  9. package/dist/attempt/adapters/activity-to-test-attempt-session.js.map +1 -0
  10. package/dist/components/ItemToolBar.custom-element.js +628 -0
  11. package/dist/components/PieAssessmentToolkit.custom-element.js +670 -0
  12. package/dist/components/item-toolbar-element.d.ts +3 -0
  13. package/dist/components/item-toolbar-element.d.ts.map +1 -0
  14. package/dist/components/item-toolbar-element.js +2 -0
  15. package/dist/components/item-toolbar-element.js.map +1 -0
  16. package/dist/components/pie-assessment-toolkit-element.d.ts +3 -0
  17. package/dist/components/pie-assessment-toolkit-element.d.ts.map +1 -0
  18. package/dist/components/pie-assessment-toolkit-element.js +2 -0
  19. package/dist/components/pie-assessment-toolkit-element.js.map +1 -0
  20. package/dist/context/assessment-toolkit-context.d.ts +52 -0
  21. package/dist/context/assessment-toolkit-context.d.ts.map +1 -0
  22. package/dist/context/assessment-toolkit-context.js +6 -0
  23. package/dist/context/assessment-toolkit-context.js.map +1 -0
  24. package/dist/context/runtime-context-consumer.d.ts +14 -0
  25. package/dist/context/runtime-context-consumer.d.ts.map +1 -0
  26. package/dist/context/runtime-context-consumer.js +52 -0
  27. package/dist/context/runtime-context-consumer.js.map +1 -0
  28. package/dist/index.d.ts +16 -5
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +13 -11
  31. package/dist/index.js.map +1 -1
  32. package/dist/runtime/RuntimeRegistry.d.ts +13 -0
  33. package/dist/runtime/RuntimeRegistry.d.ts.map +1 -0
  34. package/dist/runtime/RuntimeRegistry.js +50 -0
  35. package/dist/runtime/RuntimeRegistry.js.map +1 -0
  36. package/dist/runtime/SectionRuntimeEngine.d.ts +45 -0
  37. package/dist/runtime/SectionRuntimeEngine.d.ts.map +1 -0
  38. package/dist/runtime/SectionRuntimeEngine.js +81 -0
  39. package/dist/runtime/SectionRuntimeEngine.js.map +1 -0
  40. package/dist/runtime/registration-events.d.ts +19 -0
  41. package/dist/runtime/registration-events.d.ts.map +1 -0
  42. package/dist/runtime/registration-events.js +4 -0
  43. package/dist/runtime/registration-events.js.map +1 -0
  44. package/dist/runtime/runtime-event-guards.d.ts +3 -0
  45. package/dist/runtime/runtime-event-guards.d.ts.map +1 -0
  46. package/dist/runtime/runtime-event-guards.js +9 -0
  47. package/dist/runtime/runtime-event-guards.js.map +1 -0
  48. package/dist/runtime/tool-host-contract.d.ts +30 -0
  49. package/dist/runtime/tool-host-contract.d.ts.map +1 -0
  50. package/dist/runtime/tool-host-contract.js +48 -0
  51. package/dist/runtime/tool-host-contract.js.map +1 -0
  52. package/dist/services/TTSService.d.ts +3 -1
  53. package/dist/services/TTSService.d.ts.map +1 -1
  54. package/dist/services/TTSService.js +13 -12
  55. package/dist/services/TTSService.js.map +1 -1
  56. package/dist/services/ThemeProvider.d.ts +1 -0
  57. package/dist/services/ThemeProvider.d.ts.map +1 -1
  58. package/dist/services/ThemeProvider.js +82 -46
  59. package/dist/services/ThemeProvider.js.map +1 -1
  60. package/dist/services/ToolConfigResolver.d.ts +1 -1
  61. package/dist/services/ToolConfigResolver.js +1 -1
  62. package/dist/services/ToolCoordinator.d.ts +1 -1
  63. package/dist/services/ToolCoordinator.d.ts.map +1 -1
  64. package/dist/services/ToolRegistry.d.ts +64 -67
  65. package/dist/services/ToolRegistry.d.ts.map +1 -1
  66. package/dist/services/ToolRegistry.js +72 -22
  67. package/dist/services/ToolRegistry.js.map +1 -1
  68. package/dist/services/ToolkitCoordinator.d.ts +106 -8
  69. package/dist/services/ToolkitCoordinator.d.ts.map +1 -1
  70. package/dist/services/ToolkitCoordinator.js +502 -71
  71. package/dist/services/ToolkitCoordinator.js.map +1 -1
  72. package/dist/services/createDefaultToolRegistry.d.ts +12 -7
  73. package/dist/services/createDefaultToolRegistry.d.ts.map +1 -1
  74. package/dist/services/createDefaultToolRegistry.js +6 -10
  75. package/dist/services/createDefaultToolRegistry.js.map +1 -1
  76. package/dist/services/defaultPersonalNeedsProfile.d.ts +4 -0
  77. package/dist/services/defaultPersonalNeedsProfile.d.ts.map +1 -0
  78. package/dist/services/defaultPersonalNeedsProfile.js +25 -0
  79. package/dist/services/defaultPersonalNeedsProfile.js.map +1 -0
  80. package/dist/services/interfaces.d.ts +61 -1
  81. package/dist/services/interfaces.d.ts.map +1 -1
  82. package/dist/services/interfaces.js.map +1 -1
  83. package/dist/services/pnp-standard-features.d.ts +3 -4
  84. package/dist/services/pnp-standard-features.d.ts.map +1 -1
  85. package/dist/services/pnp-standard-features.js +0 -3
  86. package/dist/services/pnp-standard-features.js.map +1 -1
  87. package/dist/services/section-controller-types.d.ts +32 -0
  88. package/dist/services/section-controller-types.d.ts.map +1 -0
  89. package/dist/services/section-controller-types.js +2 -0
  90. package/dist/services/section-controller-types.js.map +1 -0
  91. package/dist/services/tool-context.d.ts +4 -4
  92. package/dist/services/tool-context.d.ts.map +1 -1
  93. package/dist/services/tool-context.js +106 -17
  94. package/dist/services/tool-context.js.map +1 -1
  95. package/dist/services/tool-instance-id.d.ts +17 -0
  96. package/dist/services/tool-instance-id.d.ts.map +1 -0
  97. package/dist/services/tool-instance-id.js +61 -0
  98. package/dist/services/tool-instance-id.js.map +1 -0
  99. package/dist/services/tool-providers/IToolProvider.d.ts +2 -3
  100. package/dist/services/tool-providers/IToolProvider.d.ts.map +1 -1
  101. package/dist/services/tool-providers/IToolProvider.js +1 -2
  102. package/dist/services/tool-providers/IToolProvider.js.map +1 -1
  103. package/dist/services/tool-providers/MathJsToolProvider.d.ts +25 -0
  104. package/dist/services/tool-providers/MathJsToolProvider.d.ts.map +1 -0
  105. package/dist/services/tool-providers/MathJsToolProvider.js +53 -0
  106. package/dist/services/tool-providers/MathJsToolProvider.js.map +1 -0
  107. package/dist/services/tool-providers/index.d.ts +2 -0
  108. package/dist/services/tool-providers/index.d.ts.map +1 -1
  109. package/dist/services/tool-providers/index.js +1 -0
  110. package/dist/services/tool-providers/index.js.map +1 -1
  111. package/dist/services/tools-config-normalizer.d.ts +26 -0
  112. package/dist/services/tools-config-normalizer.d.ts.map +1 -0
  113. package/dist/services/tools-config-normalizer.js +63 -0
  114. package/dist/services/tools-config-normalizer.js.map +1 -0
  115. package/dist/tools/calculators/ti-provider.d.ts.map +1 -1
  116. package/dist/tools/calculators/ti-provider.js +127 -4
  117. package/dist/tools/calculators/ti-provider.js.map +1 -1
  118. package/dist/tools/client.d.ts +2 -1
  119. package/dist/tools/client.d.ts.map +1 -1
  120. package/dist/tools/client.js +2 -1
  121. package/dist/tools/client.js.map +1 -1
  122. package/dist/tools/default-tool-module-loaders.d.ts +9 -0
  123. package/dist/tools/default-tool-module-loaders.d.ts.map +1 -0
  124. package/dist/tools/default-tool-module-loaders.js +17 -0
  125. package/dist/tools/default-tool-module-loaders.js.map +1 -0
  126. package/dist/tools/index.d.ts +2 -1
  127. package/dist/tools/index.d.ts.map +1 -1
  128. package/dist/tools/index.js +2 -1
  129. package/dist/tools/index.js.map +1 -1
  130. package/dist/tools/library-loader.d.ts +1 -1
  131. package/dist/tools/library-loader.d.ts.map +1 -1
  132. package/dist/tools/library-loader.js +7 -2
  133. package/dist/tools/library-loader.js.map +1 -1
  134. package/dist/tools/registrations/accessibility-tools.d.ts +1 -9
  135. package/dist/tools/registrations/accessibility-tools.d.ts.map +1 -1
  136. package/dist/tools/registrations/accessibility-tools.js +95 -113
  137. package/dist/tools/registrations/accessibility-tools.js.map +1 -1
  138. package/dist/tools/registrations/calculator.d.ts +2 -2
  139. package/dist/tools/registrations/calculator.d.ts.map +1 -1
  140. package/dist/tools/registrations/calculator.js +34 -55
  141. package/dist/tools/registrations/calculator.js.map +1 -1
  142. package/dist/tools/registrations/interaction-tools.d.ts.map +1 -1
  143. package/dist/tools/registrations/interaction-tools.js +77 -52
  144. package/dist/tools/registrations/interaction-tools.js.map +1 -1
  145. package/dist/tools/registrations/measurement-tools.d.ts.map +1 -1
  146. package/dist/tools/registrations/measurement-tools.js +63 -38
  147. package/dist/tools/registrations/measurement-tools.js.map +1 -1
  148. package/dist/tools/registrations/subject-specific-tools.d.ts.map +1 -1
  149. package/dist/tools/registrations/subject-specific-tools.js +63 -38
  150. package/dist/tools/registrations/subject-specific-tools.js.map +1 -1
  151. package/dist/tools/registrations/tts.d.ts +1 -1
  152. package/dist/tools/registrations/tts.d.ts.map +1 -1
  153. package/dist/tools/registrations/tts.js +27 -41
  154. package/dist/tools/registrations/tts.js.map +1 -1
  155. package/dist/tools/response-discovery.d.ts +12 -14
  156. package/dist/tools/response-discovery.d.ts.map +1 -1
  157. package/dist/tools/response-discovery.js +23 -80
  158. package/dist/tools/response-discovery.js.map +1 -1
  159. package/dist/tools/tool-tag-map.d.ts +3 -3
  160. package/dist/tools/tool-tag-map.d.ts.map +1 -1
  161. package/dist/tools/tool-tag-map.js +2 -3
  162. package/dist/tools/tool-tag-map.js.map +1 -1
  163. package/dist/tools/types.d.ts +3 -1
  164. package/dist/tools/types.d.ts.map +1 -1
  165. package/package.json +25 -28
  166. package/src/README.md +16 -32
  167. package/src/components/ItemToolBar.svelte +489 -0
  168. package/src/components/PNPProvenanceViewer.svelte +14 -4
  169. package/src/components/PieAssessmentToolkit.svelte +517 -0
  170. package/src/components/ToolButton.svelte +11 -11
  171. package/src/components/ToolButtonGroup.svelte +27 -11
  172. package/src/tools/README.md +6 -5
  173. package/src/tools/calculators/README.md +4 -4
  174. package/dist/player/AssessmentPlayer.d.ts +0 -397
  175. package/dist/player/AssessmentPlayer.d.ts.map +0 -1
  176. package/dist/player/AssessmentPlayer.js +0 -974
  177. package/dist/player/AssessmentPlayer.js.map +0 -1
  178. package/dist/player/index.d.ts +0 -17
  179. package/dist/player/index.d.ts.map +0 -1
  180. package/dist/player/index.js +0 -15
  181. package/dist/player/index.js.map +0 -1
  182. package/dist/player/navigation-types.d.ts +0 -63
  183. package/dist/player/navigation-types.d.ts.map +0 -1
  184. package/dist/player/navigation-types.js +0 -7
  185. package/dist/player/navigation-types.js.map +0 -1
  186. package/dist/player/qti-navigation.d.ts +0 -29
  187. package/dist/player/qti-navigation.d.ts.map +0 -1
  188. package/dist/player/qti-navigation.js +0 -160
  189. package/dist/player/qti-navigation.js.map +0 -1
  190. package/dist/reference-layout/index.d.ts +0 -19
  191. package/dist/reference-layout/index.d.ts.map +0 -1
  192. package/dist/reference-layout/index.js +0 -20
  193. package/dist/reference-layout/index.js.map +0 -1
  194. package/dist/services/AnnotationToolbarConfig.d.ts +0 -134
  195. package/dist/services/AnnotationToolbarConfig.d.ts.map +0 -1
  196. package/dist/services/AnnotationToolbarConfig.js +0 -100
  197. package/dist/services/AnnotationToolbarConfig.js.map +0 -1
  198. package/dist/services/AssessmentAuthoringService.d.ts +0 -60
  199. package/dist/services/AssessmentAuthoringService.d.ts.map +0 -1
  200. package/dist/services/AssessmentAuthoringService.js +0 -183
  201. package/dist/services/AssessmentAuthoringService.js.map +0 -1
  202. package/dist/services/PNPMapper.d.ts +0 -81
  203. package/dist/services/PNPMapper.d.ts.map +0 -1
  204. package/dist/services/PNPMapper.js +0 -108
  205. package/dist/services/PNPMapper.js.map +0 -1
  206. package/src/components/PNPProfileTester.example.svelte +0 -188
  207. package/src/components/PNPProfileTester.svelte +0 -397
  208. package/src/components/QuestionToolBar.svelte +0 -483
  209. package/src/player/AssessmentLayout.svelte +0 -68
  210. package/src/player/README.md +0 -154
  211. package/src/reference-layout/README.md +0 -135
  212. package/src/reference-layout/ReferenceLayout.svelte +0 -201
  213. package/src/reference-layout/components/AssessmentContent.svelte +0 -259
  214. package/src/reference-layout/components/AssessmentFooter.svelte +0 -89
  215. package/src/reference-layout/components/AssessmentHeader.svelte +0 -250
  216. package/src/reference-layout/components/AssessmentNavigation.svelte +0 -134
  217. package/src/reference-layout/components/AssessmentToolsBar.svelte +0 -176
  218. package/src/reference-layout/components/ItemPanel.svelte +0 -200
  219. package/src/reference-layout/components/NotesPanel.svelte +0 -179
  220. package/src/reference-layout/components/PassagePanel.svelte +0 -76
@@ -0,0 +1,628 @@
1
+ // @ts-nocheck
2
+ import 'svelte/internal/disclose-version';
3
+ import * as $ from 'svelte/internal/client';
4
+
5
+ import {
6
+ connectAssessmentToolkitRuntimeContext,
7
+ connectAssessmentToolkitShellContext
8
+ } from '../context/runtime-context-consumer.js';
9
+
10
+ import { createDefaultToolRegistry } from '../services/createDefaultToolRegistry.js';
11
+ import { DEFAULT_TOOL_MODULE_LOADERS } from '../tools/default-tool-module-loaders.js';
12
+ import { normalizeToolsConfig, parseToolList, resolveToolsForLevel } from '../services/tools-config-normalizer.js';
13
+ import { createScopedToolId, parseScopedToolId } from '../services/tool-instance-id.js';
14
+
15
+ var root_3 = $.from_html(`<span class="item-toolbar__element-host svelte-rnx3ie"></span>`);
16
+ var root_6 = $.from_html(`<img class="item-toolbar__icon-image svelte-rnx3ie" alt=""/>`);
17
+ var root_7 = $.from_html(`<i aria-hidden="true"></i>`);
18
+ var root_4 = $.from_html(`<button type="button"><!></button>`);
19
+ var root_8 = $.from_html(`<span class="item-toolbar__element-host svelte-rnx3ie"></span>`);
20
+ var root_2 = $.from_html(`<!> <!> <!>`, 1);
21
+ var root_1 = $.from_html(`<div></div>`);
22
+
23
+ const $$css = {
24
+ hash: 'svelte-rnx3ie',
25
+ code: '.item-toolbar.svelte-rnx3ie {display:flex;align-items:center;gap:0.5rem;}.item-toolbar__button.svelte-rnx3ie {display:flex;align-items:center;justify-content:center;width:2rem;height:2rem;padding:0.25rem;border:1px solid var(--pie-border, #ccc);border-radius:0.25rem;background-color:var(--pie-background, white);color:var(--pie-text, #333);cursor:pointer;transition:all 0.15s ease;}.item-toolbar__element-host.svelte-rnx3ie {display:contents;}.item-toolbar--sm.svelte-rnx3ie .item-toolbar__button:where(.svelte-rnx3ie) {width:2.75rem;height:2.75rem;}.item-toolbar--lg.svelte-rnx3ie .item-toolbar__button:where(.svelte-rnx3ie) {width:2.5rem;height:2.5rem;}.item-toolbar__button.svelte-rnx3ie:hover:not(:disabled) {background-color:var(--pie-secondary-background, #f5f5f5);transform:translateY(-1px);box-shadow:0 2px 4px rgba(0, 0, 0, 0.1);}.item-toolbar__button.svelte-rnx3ie:active:not(:disabled) {transform:translateY(0);box-shadow:none;}.item-toolbar__button--active.svelte-rnx3ie {background-color:var(--pie-primary, #1976d2);color:white;border-color:var(--pie-primary, #1976d2);}.item-toolbar__button--active.svelte-rnx3ie:hover:not(:disabled) {background-color:var(--pie-primary-dark, #1565c0);}.item-toolbar__button.svelte-rnx3ie:focus-visible {outline:2px solid var(--pie-primary, #1976d2);outline-offset:2px;}.item-toolbar__button.svelte-rnx3ie:disabled {opacity:0.5;cursor:not-allowed;}.item-toolbar__button.svelte-rnx3ie svg {width:100%;height:100%;}.item-toolbar__icon-image.svelte-rnx3ie {width:100%;height:100%;object-fit:contain;}'
26
+ };
27
+
28
+ export default function ItemToolBar($$anchor, $$props) {
29
+ $.push($$props, true);
30
+ $.append_styles($$anchor, $$css);
31
+
32
+ const isBrowser = typeof window !== 'undefined';
33
+ const fallbackToolRegistry = createDefaultToolRegistry({ toolModuleLoaders: DEFAULT_TOOL_MODULE_LOADERS });
34
+ let activeToolState = $.state($.proxy({}));
35
+
36
+ // Props
37
+ let itemId = $.prop($$props, 'itemId', 7, ''),
38
+ catalogId = $.prop($$props, 'catalogId', 7, ''),
39
+ tools = $.prop($$props, 'tools', 7, 'calculator,textToSpeech,answerEliminator'),
40
+ contentKind = $.prop($$props, 'contentKind', 7, 'assessment-item'),
41
+ scopeElement = $.prop($$props, 'scopeElement', 7, null),
42
+ toolRegistry = $.prop($$props, 'toolRegistry', 7, null),
43
+ pnpResolver = $.prop($$props, 'pnpResolver', 7, null),
44
+ assessment = $.prop($$props, 'assessment', 7, null),
45
+ itemRef = $.prop($$props, 'itemRef', 7, null),
46
+ item = $.prop($$props, 'item', 7, null),
47
+ className = $.prop($$props, 'class', 7, ''),
48
+ size = $.prop($$props, 'size', 7, 'md'),
49
+ language = $.prop($$props, 'language', 7, 'en-US');
50
+
51
+ let toolbarRootElement = $.state(null);
52
+ let runtimeContext = $.state(null);
53
+ let shellContext = $.state(null);
54
+ let moduleLoadVersion = $.state(0);
55
+
56
+ $.user_effect(() => {
57
+ if (!$.get(toolbarRootElement)) return;
58
+
59
+ return connectAssessmentToolkitRuntimeContext($.get(toolbarRootElement), (value) => {
60
+ $.set(runtimeContext, value, true);
61
+ });
62
+ });
63
+
64
+ $.user_effect(() => {
65
+ if (!$.get(toolbarRootElement)) return;
66
+
67
+ return connectAssessmentToolkitShellContext($.get(toolbarRootElement), (value) => {
68
+ $.set(shellContext, value, true);
69
+ });
70
+ });
71
+
72
+ const effectiveToolCoordinator = $.derived(() => $.get(runtimeContext)?.toolCoordinator);
73
+ const effectiveTTSService = $.derived(() => $.get(runtimeContext)?.ttsService);
74
+ const effectiveElementToolStateStore = $.derived(() => $.get(runtimeContext)?.elementToolStateStore);
75
+ const effectiveAssessmentId = $.derived(() => $.get(runtimeContext)?.assessmentId ?? '');
76
+ const effectiveSectionId = $.derived(() => $.get(runtimeContext)?.sectionId ?? '');
77
+ const effectiveItemId = $.derived(() => itemId() || $.get(shellContext)?.itemId || '');
78
+ const effectiveCanonicalItemId = $.derived(() => $.get(shellContext)?.canonicalItemId || $.get(effectiveItemId));
79
+ const effectiveCatalogId = $.derived(() => catalogId() || $.get(effectiveItemId));
80
+ const effectiveContentKind = $.derived(() => contentKind() || $.get(shellContext)?.contentKind || 'assessment-item');
81
+ const effectiveItem = $.derived(() => item() || $.get(shellContext)?.item || null);
82
+
83
+ // Effective registry for visibility and metadata ownership.
84
+ const effectiveToolRegistry = $.derived(() => toolRegistry() || fallbackToolRegistry);
85
+
86
+ const explicitTools = $.derived(() => parseToolList(tools()));
87
+ const normalizedExplicitTools = $.derived(() => $.get(effectiveToolRegistry).normalizeToolIds($.get(explicitTools)).filter(Boolean));
88
+
89
+ const effectiveToolsConfig = $.derived(() => {
90
+ const coordinatorConfig = $.get(runtimeContext)?.toolkitCoordinator?.config?.tools;
91
+
92
+ return normalizeToolsConfig(coordinatorConfig || {});
93
+ });
94
+
95
+ const placementLevel = $.derived(() => $.get(effectiveContentKind) === 'rubric-block-stimulus' ? 'passage' : 'item');
96
+
97
+ const placementAllowedToolIds = $.derived(() => {
98
+ const resolved = resolveToolsForLevel($.get(effectiveToolsConfig), $.get(placementLevel));
99
+
100
+ return $.get(effectiveToolRegistry).normalizeToolIds(resolved).filter(Boolean);
101
+ });
102
+
103
+ // Pass 1: determine allowed tools
104
+ const allowedToolIds = $.derived(() => {
105
+ const configuredTools = $.get(normalizedExplicitTools).length > 0
106
+ ? $.get(normalizedExplicitTools)
107
+ : $.get(placementAllowedToolIds);
108
+
109
+ if (pnpResolver() && assessment() && itemRef()) {
110
+ const allowedByPnp = pnpResolver().getAllowedToolIds(assessment(), itemRef());
111
+
112
+ if (configuredTools.length === 0) return allowedByPnp;
113
+
114
+ return allowedByPnp.filter((toolId) => configuredTools.includes(toolId));
115
+ }
116
+
117
+ return configuredTools;
118
+ });
119
+
120
+ const contentReady = $.derived(() => {
121
+ const config = $.get(effectiveItem)?.config;
122
+
123
+ return !!($.get(effectiveItem) && config && typeof config === 'object');
124
+ });
125
+
126
+ const toolContext = $.derived(() => {
127
+ if (!$.get(contentReady) || !$.get(effectiveItem)) {
128
+ return null;
129
+ }
130
+
131
+ return {
132
+ level: 'item',
133
+ assessment: assessment() || {},
134
+ itemRef: itemRef() || { id: $.get(effectiveCanonicalItemId) },
135
+ item: $.get(effectiveItem)
136
+ };
137
+ });
138
+
139
+ const renderContext = $.derived(() => {
140
+ if ($.get(toolContext)) return $.get(toolContext);
141
+
142
+ return {
143
+ level: 'item',
144
+ assessment: assessment() || {},
145
+ itemRef: itemRef() || { id: $.get(effectiveCanonicalItemId) },
146
+ item: $.get(effectiveItem) || { id: $.get(effectiveCanonicalItemId), config: {} }
147
+ };
148
+ });
149
+
150
+ const elementContexts = $.derived(() => {
151
+ if (!$.get(contentReady) || !$.get(effectiveItem)) return [];
152
+
153
+ const modelsRaw = $.get(effectiveItem)?.config?.models;
154
+
155
+ const models = Array.isArray(modelsRaw)
156
+ ? modelsRaw
157
+ : modelsRaw && typeof modelsRaw === 'object' ? Object.values(modelsRaw) : [];
158
+
159
+ return models.filter((model) => model && typeof model === 'object' && typeof model.id === 'string').map((model) => ({
160
+ level: 'element',
161
+ assessment: assessment() || {},
162
+ itemRef: itemRef() || { id: $.get(effectiveCanonicalItemId) },
163
+ item: $.get(effectiveItem),
164
+ elementId: model.id
165
+ }));
166
+ });
167
+
168
+ // Pass 2: tool-owned context filtering (item + element aggregation)
169
+ const visibleToolIds = $.derived(() => {
170
+ if (!$.get(contentReady)) {
171
+ // Stage 1: orchestrator-level allow-list only.
172
+ return $.get(allowedToolIds);
173
+ }
174
+
175
+ if (!$.get(toolContext) && $.get(elementContexts).length === 0) {
176
+ return $.get(allowedToolIds);
177
+ }
178
+
179
+ const visible = new Set();
180
+
181
+ if ($.get(toolContext)) {
182
+ $.get(effectiveToolRegistry).filterVisibleInContext($.get(allowedToolIds), $.get(toolContext)).forEach((tool) => visible.add(tool.toolId));
183
+ }
184
+
185
+ for (const context of $.get(elementContexts)) {
186
+ $.get(effectiveToolRegistry).filterVisibleInContext($.get(allowedToolIds), context).forEach((tool) => visible.add(tool.toolId));
187
+ }
188
+
189
+ return Array.from(visible);
190
+ });
191
+
192
+ // Dynamically load whatever tools are currently visible.
193
+ // The registry owns module loader configuration by toolId.
194
+ $.user_effect(() => {
195
+ if (!isBrowser) return;
196
+
197
+ let cancelled = false;
198
+
199
+ void $.get(effectiveToolRegistry).ensureToolModulesLoaded($.get(visibleToolIds)).then(() => {
200
+ if (!cancelled) $.set(moduleLoadVersion, $.get(moduleLoadVersion) + 1);
201
+ }).catch((error) => {
202
+ console.error('[ItemToolBar] Failed to load one or more tool modules:', error);
203
+ });
204
+
205
+ return () => {
206
+ cancelled = true;
207
+ };
208
+ });
209
+
210
+ function resolveScopeElement() {
211
+ if (scopeElement()) return scopeElement();
212
+
213
+ return $.get(shellContext)?.scopeElement || null;
214
+ }
215
+
216
+ function resolveGlobalElementId() {
217
+ if (!$.get(effectiveElementToolStateStore) || !$.get(effectiveAssessmentId) || !$.get(effectiveSectionId) || !$.get(effectiveCanonicalItemId)) return null;
218
+
219
+ return $.get(effectiveElementToolStateStore).getGlobalElementId($.get(effectiveAssessmentId), $.get(effectiveSectionId), $.get(effectiveCanonicalItemId), $.get(effectiveCanonicalItemId));
220
+ }
221
+
222
+ const toolbarContext = $.derived(() => {
223
+ const toolkitCoordinator = $.get(runtimeContext)?.toolkitCoordinator || null;
224
+
225
+ const toInstanceToolId = (toolId) => {
226
+ // Accept either base tool IDs (e.g. "calculator") or already-scoped IDs.
227
+ // This keeps toolbar contracts stable across mixed registration implementations.
228
+ return parseScopedToolId(toolId)
229
+ ? toolId
230
+ : createScopedToolId(toolId, 'item', $.get(effectiveCanonicalItemId));
231
+ };
232
+
233
+ return {
234
+ itemId: $.get(effectiveCanonicalItemId),
235
+ catalogId: $.get(effectiveCatalogId),
236
+ language: language(),
237
+ ui: { size: size() },
238
+ getScopeElement: resolveScopeElement,
239
+ getGlobalElementId: resolveGlobalElementId,
240
+ toolCoordinator: $.get(effectiveToolCoordinator) || null,
241
+ toolkitCoordinator,
242
+ ttsService: $.get(effectiveTTSService) || null,
243
+ elementToolStateStore: $.get(effectiveElementToolStateStore) || null,
244
+ toggleTool: (toolId) => {
245
+ if (!$.get(effectiveToolCoordinator)) return;
246
+
247
+ $.get(effectiveToolCoordinator).toggleTool(toInstanceToolId(toolId));
248
+ },
249
+
250
+ isToolVisible: (toolId) => {
251
+ if (!$.get(effectiveToolCoordinator)) return false;
252
+
253
+ return $.get(effectiveToolCoordinator).isToolVisible(toInstanceToolId(toolId));
254
+ },
255
+
256
+ subscribeVisibility: $.get(effectiveToolCoordinator)
257
+ ? (listener) => $.get(effectiveToolCoordinator).subscribe(listener)
258
+ : null,
259
+ ensureTTSReady: toolkitCoordinator ? () => toolkitCoordinator.ensureTTSReady() : null
260
+ };
261
+ });
262
+
263
+ let renderedTools = $.derived(() => {
264
+ if (!isBrowser) return [];
265
+
266
+ $.get(moduleLoadVersion);
267
+
268
+ const rendered = [];
269
+
270
+ for (const toolId of $.get(visibleToolIds)) {
271
+ const result = $.get(effectiveToolRegistry).renderForToolbar(toolId, $.get(renderContext), $.get(toolbarContext));
272
+
273
+ if (result) {
274
+ rendered.push(result);
275
+ }
276
+ }
277
+
278
+ return rendered;
279
+ });
280
+
281
+ function syncRenderedToolsState() {
282
+ const nextActiveState = {};
283
+
284
+ for (const renderedTool of $.get(renderedTools)) {
285
+ renderedTool.sync?.();
286
+
287
+ if (renderedTool.button) {
288
+ nextActiveState[renderedTool.toolId] = renderedTool.button.active ?? false;
289
+ }
290
+ }
291
+
292
+ $.set(activeToolState, nextActiveState, true);
293
+ }
294
+
295
+ $.user_effect(() => {
296
+ const unsubs = [];
297
+
298
+ syncRenderedToolsState();
299
+
300
+ for (const renderedTool of $.get(renderedTools)) {
301
+ if (renderedTool.subscribeActive) {
302
+ const unsubscribe = renderedTool.subscribeActive((active) => {
303
+ $.set(activeToolState, { ...$.get(activeToolState), [renderedTool.toolId]: active }, true);
304
+ renderedTool.sync?.();
305
+ });
306
+
307
+ unsubs.push(unsubscribe);
308
+ }
309
+ }
310
+
311
+ return () => {
312
+ unsubs.forEach((unsub) => unsub());
313
+ };
314
+ });
315
+
316
+ $.user_effect(() => {
317
+ if (!$.get(toolbarContext).subscribeVisibility) return;
318
+
319
+ return $.get(toolbarContext).subscribeVisibility(() => {
320
+ syncRenderedToolsState();
321
+ });
322
+ });
323
+
324
+ function mountElement(node, element) {
325
+ let mountedElement = null;
326
+
327
+ const updateMountedElement = (nextElement) => {
328
+ if (mountedElement === nextElement) return;
329
+
330
+ if (mountedElement && mountedElement.parentNode === node) {
331
+ node.removeChild(mountedElement);
332
+ }
333
+
334
+ mountedElement = nextElement;
335
+
336
+ if (mountedElement) {
337
+ if (mountedElement.parentNode && mountedElement.parentNode !== node) {
338
+ mountedElement.parentNode.removeChild(mountedElement);
339
+ }
340
+
341
+ node.appendChild(mountedElement);
342
+ }
343
+ };
344
+
345
+ updateMountedElement(element);
346
+
347
+ return {
348
+ update(nextElement) {
349
+ updateMountedElement(nextElement);
350
+ },
351
+
352
+ destroy() {
353
+ updateMountedElement(null);
354
+ }
355
+ };
356
+ }
357
+
358
+ var $$exports = {
359
+ get itemId() {
360
+ return itemId();
361
+ },
362
+
363
+ set itemId($$value) {
364
+ itemId($$value);
365
+ $.flush();
366
+ },
367
+
368
+ get catalogId() {
369
+ return catalogId();
370
+ },
371
+
372
+ set catalogId($$value) {
373
+ catalogId($$value);
374
+ $.flush();
375
+ },
376
+
377
+ get tools() {
378
+ return tools();
379
+ },
380
+
381
+ set tools($$value) {
382
+ tools($$value);
383
+ $.flush();
384
+ },
385
+
386
+ get contentKind() {
387
+ return contentKind();
388
+ },
389
+
390
+ set contentKind($$value) {
391
+ contentKind($$value);
392
+ $.flush();
393
+ },
394
+
395
+ get scopeElement() {
396
+ return scopeElement();
397
+ },
398
+
399
+ set scopeElement($$value) {
400
+ scopeElement($$value);
401
+ $.flush();
402
+ },
403
+
404
+ get toolRegistry() {
405
+ return toolRegistry();
406
+ },
407
+
408
+ set toolRegistry($$value) {
409
+ toolRegistry($$value);
410
+ $.flush();
411
+ },
412
+
413
+ get pnpResolver() {
414
+ return pnpResolver();
415
+ },
416
+
417
+ set pnpResolver($$value) {
418
+ pnpResolver($$value);
419
+ $.flush();
420
+ },
421
+
422
+ get assessment() {
423
+ return assessment();
424
+ },
425
+
426
+ set assessment($$value) {
427
+ assessment($$value);
428
+ $.flush();
429
+ },
430
+
431
+ get itemRef() {
432
+ return itemRef();
433
+ },
434
+
435
+ set itemRef($$value) {
436
+ itemRef($$value);
437
+ $.flush();
438
+ },
439
+
440
+ get item() {
441
+ return item();
442
+ },
443
+
444
+ set item($$value) {
445
+ item($$value);
446
+ $.flush();
447
+ },
448
+
449
+ get class() {
450
+ return className();
451
+ },
452
+
453
+ set class($$value) {
454
+ className($$value);
455
+ $.flush();
456
+ },
457
+
458
+ get size() {
459
+ return size();
460
+ },
461
+
462
+ set size($$value) {
463
+ size($$value);
464
+ $.flush();
465
+ },
466
+
467
+ get language() {
468
+ return language();
469
+ },
470
+
471
+ set language($$value) {
472
+ language($$value);
473
+ $.flush();
474
+ }
475
+ };
476
+
477
+ var fragment = $.comment();
478
+ var node_1 = $.first_child(fragment);
479
+
480
+ {
481
+ var consequent_5 = ($$anchor) => {
482
+ var div = root_1();
483
+
484
+ $.each(div, 21, () => $.get(renderedTools), (renderedTool) => renderedTool.toolId, ($$anchor, renderedTool) => {
485
+ var fragment_1 = root_2();
486
+ var node_2 = $.first_child(fragment_1);
487
+
488
+ {
489
+ var consequent = ($$anchor) => {
490
+ var span = root_3();
491
+
492
+ $.action(span, ($$node, $$action_arg) => mountElement?.($$node, $$action_arg), () => $.get(renderedTool).inlineElement);
493
+ $.append($$anchor, span);
494
+ };
495
+
496
+ $.if(node_2, ($$render) => {
497
+ if ($.get(renderedTool).inlineElement) $$render(consequent);
498
+ });
499
+ }
500
+
501
+ var node_3 = $.sibling(node_2, 2);
502
+
503
+ {
504
+ var consequent_3 = ($$anchor) => {
505
+ var button = root_4();
506
+ let classes;
507
+ var node_4 = $.child(button);
508
+
509
+ {
510
+ var consequent_1 = ($$anchor) => {
511
+ var fragment_2 = $.comment();
512
+ var node_5 = $.first_child(fragment_2);
513
+
514
+ $.html(node_5, () => $.get(renderedTool).button.icon);
515
+ $.append($$anchor, fragment_2);
516
+ };
517
+
518
+ var d = $.derived(() => $.get(renderedTool).button.icon.startsWith('<svg'));
519
+
520
+ var consequent_2 = ($$anchor) => {
521
+ var img = root_6();
522
+
523
+ $.template_effect(() => $.set_attribute(img, 'src', $.get(renderedTool).button.icon));
524
+ $.append($$anchor, img);
525
+ };
526
+
527
+ var d_1 = $.derived(() => $.get(renderedTool).button.icon.startsWith('http'));
528
+
529
+ var alternate = ($$anchor) => {
530
+ var i = root_7();
531
+
532
+ $.template_effect(() => $.set_class(i, 1, `icon icon-${$.get(renderedTool).button.icon}`, 'svelte-rnx3ie'));
533
+ $.append($$anchor, i);
534
+ };
535
+
536
+ $.if(node_4, ($$render) => {
537
+ if ($.get(d)) $$render(consequent_1); else if ($.get(d_1)) $$render(consequent_2, 1); else $$render(alternate, false);
538
+ });
539
+ }
540
+
541
+ $.reset(button);
542
+
543
+ $.template_effect(() => {
544
+ classes = $.set_class(button, 1, `item-toolbar__button ${($.get(renderedTool).button.className || '') ?? ''}`, 'svelte-rnx3ie', classes, {
545
+ 'item-toolbar__button--active': $.get(activeToolState)[$.get(renderedTool).toolId] ?? $.get(renderedTool).button.active ?? false
546
+ });
547
+
548
+ $.set_attribute(button, 'aria-label', $.get(renderedTool).button.ariaLabel || $.get(renderedTool).button.label);
549
+ $.set_attribute(button, 'aria-pressed', $.get(activeToolState)[$.get(renderedTool).toolId] ?? $.get(renderedTool).button.active ?? false);
550
+ $.set_attribute(button, 'title', $.get(renderedTool).button.tooltip || $.get(renderedTool).button.label);
551
+ button.disabled = $.get(renderedTool).button.disabled;
552
+ });
553
+
554
+ $.delegated('click', button, () => {
555
+ $.get(renderedTool).button?.onClick();
556
+ syncRenderedToolsState();
557
+ });
558
+
559
+ $.append($$anchor, button);
560
+ };
561
+
562
+ $.if(node_3, ($$render) => {
563
+ if ($.get(renderedTool).button) $$render(consequent_3);
564
+ });
565
+ }
566
+
567
+ var node_6 = $.sibling(node_3, 2);
568
+
569
+ {
570
+ var consequent_4 = ($$anchor) => {
571
+ var span_1 = root_8();
572
+
573
+ $.action(span_1, ($$node, $$action_arg) => mountElement?.($$node, $$action_arg), () => $.get(renderedTool).overlayElement);
574
+ $.append($$anchor, span_1);
575
+ };
576
+
577
+ $.if(node_6, ($$render) => {
578
+ if ($.get(renderedTool).overlayElement) $$render(consequent_4);
579
+ });
580
+ }
581
+
582
+ $.append($$anchor, fragment_1);
583
+ });
584
+
585
+ $.reset(div);
586
+ $.bind_this(div, ($$value) => $.set(toolbarRootElement, $$value), () => $.get(toolbarRootElement));
587
+
588
+ $.template_effect(() => {
589
+ $.set_class(div, 1, `item-toolbar ${className() ?? ''} item-toolbar--${size() ?? ''}`, 'svelte-rnx3ie');
590
+ $.set_attribute(div, 'data-content-kind', $.get(effectiveContentKind));
591
+ });
592
+
593
+ $.append($$anchor, div);
594
+ };
595
+
596
+ $.if(node_1, ($$render) => {
597
+ if (isBrowser) $$render(consequent_5);
598
+ });
599
+ }
600
+
601
+ $.append($$anchor, fragment);
602
+
603
+ return $.pop($$exports);
604
+ }
605
+
606
+ $.delegate(['click']);
607
+
608
+ customElements.define('pie-item-toolbar', $.create_custom_element(
609
+ ItemToolBar,
610
+ {
611
+ itemId: { attribute: 'item-id', type: 'String' },
612
+ catalogId: { attribute: 'catalog-id', type: 'String' },
613
+ tools: { attribute: 'tools', type: 'String' },
614
+ contentKind: { attribute: 'content-kind', type: 'String' },
615
+ size: { attribute: 'size', type: 'String' },
616
+ language: { attribute: 'language', type: 'String' },
617
+ scopeElement: { type: 'Object' },
618
+ toolRegistry: { type: 'Object' },
619
+ pnpResolver: { type: 'Object' },
620
+ assessment: { type: 'Object' },
621
+ itemRef: { type: 'Object' },
622
+ item: { type: 'Object' },
623
+ class: {}
624
+ },
625
+ [],
626
+ [],
627
+ { mode: 'open' }
628
+ ));