@pie-players/pie-assessment-toolkit 0.3.29 → 0.3.31

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 (199) hide show
  1. package/README.md +313 -5
  2. package/dist/components/ItemToolBar.custom-element.js +362 -176
  3. package/dist/components/PieAssessmentToolkit.custom-element.js +604 -107
  4. package/dist/components/SectionToolBar.custom-element.js +0 -36
  5. package/dist/index.d.ts +2 -1
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +1 -0
  8. package/dist/index.js.map +1 -1
  9. package/dist/policy/core/PolicySource.d.ts +64 -0
  10. package/dist/policy/core/PolicySource.d.ts.map +1 -0
  11. package/dist/policy/core/PolicySource.js +17 -0
  12. package/dist/policy/core/PolicySource.js.map +1 -0
  13. package/dist/policy/core/ToolPolicyEngine.d.ts +123 -0
  14. package/dist/policy/core/ToolPolicyEngine.d.ts.map +1 -0
  15. package/dist/policy/core/ToolPolicyEngine.js +217 -0
  16. package/dist/policy/core/ToolPolicyEngine.js.map +1 -0
  17. package/dist/policy/core/compose-decision.d.ts +37 -0
  18. package/dist/policy/core/compose-decision.d.ts.map +1 -0
  19. package/dist/policy/core/compose-decision.js +332 -0
  20. package/dist/policy/core/compose-decision.js.map +1 -0
  21. package/dist/policy/core/decision-types.d.ts +142 -0
  22. package/dist/policy/core/decision-types.d.ts.map +1 -0
  23. package/dist/policy/core/decision-types.js +13 -0
  24. package/dist/policy/core/decision-types.js.map +1 -0
  25. package/dist/policy/core/engine-context.d.ts +30 -0
  26. package/dist/policy/core/engine-context.d.ts.map +1 -0
  27. package/dist/policy/core/engine-context.js +28 -0
  28. package/dist/policy/core/engine-context.js.map +1 -0
  29. package/dist/policy/core/policy-source-tag.d.ts +32 -0
  30. package/dist/policy/core/policy-source-tag.d.ts.map +1 -0
  31. package/dist/policy/core/policy-source-tag.js +29 -0
  32. package/dist/policy/core/policy-source-tag.js.map +1 -0
  33. package/dist/policy/core/provenance.d.ts +163 -0
  34. package/dist/policy/core/provenance.d.ts.map +1 -0
  35. package/dist/policy/core/provenance.js +232 -0
  36. package/dist/policy/core/provenance.js.map +1 -0
  37. package/dist/policy/core/qti-inputs.d.ts +67 -0
  38. package/dist/policy/core/qti-inputs.d.ts.map +1 -0
  39. package/dist/policy/core/qti-inputs.js +139 -0
  40. package/dist/policy/core/qti-inputs.js.map +1 -0
  41. package/dist/policy/engine.d.ts +28 -0
  42. package/dist/policy/engine.d.ts.map +1 -0
  43. package/dist/policy/engine.js +24 -0
  44. package/dist/policy/engine.js.map +1 -0
  45. package/dist/policy/internal.d.ts +26 -0
  46. package/dist/policy/internal.d.ts.map +1 -0
  47. package/dist/policy/internal.js +26 -0
  48. package/dist/policy/internal.js.map +1 -0
  49. package/dist/policy/sources/QtiPolicySource.d.ts +146 -0
  50. package/dist/policy/sources/QtiPolicySource.d.ts.map +1 -0
  51. package/dist/policy/sources/QtiPolicySource.js +270 -0
  52. package/dist/policy/sources/QtiPolicySource.js.map +1 -0
  53. package/dist/runtime/SectionRuntimeEngine.d.ts +145 -0
  54. package/dist/runtime/SectionRuntimeEngine.d.ts.map +1 -1
  55. package/dist/runtime/SectionRuntimeEngine.js +164 -3
  56. package/dist/runtime/SectionRuntimeEngine.js.map +1 -1
  57. package/dist/runtime/adapter/SectionEngineAdapter.d.ts +144 -0
  58. package/dist/runtime/adapter/SectionEngineAdapter.d.ts.map +1 -0
  59. package/dist/runtime/adapter/SectionEngineAdapter.js +183 -0
  60. package/dist/runtime/adapter/SectionEngineAdapter.js.map +1 -0
  61. package/dist/runtime/adapter/coordinator-bridge.d.ts +93 -0
  62. package/dist/runtime/adapter/coordinator-bridge.d.ts.map +1 -0
  63. package/dist/runtime/adapter/coordinator-bridge.js +127 -0
  64. package/dist/runtime/adapter/coordinator-bridge.js.map +1 -0
  65. package/dist/runtime/adapter/dom-event-bridge.d.ts +63 -0
  66. package/dist/runtime/adapter/dom-event-bridge.d.ts.map +1 -0
  67. package/dist/runtime/adapter/dom-event-bridge.js +95 -0
  68. package/dist/runtime/adapter/dom-event-bridge.js.map +1 -0
  69. package/dist/runtime/adapter/framework-error-bridge.d.ts +37 -0
  70. package/dist/runtime/adapter/framework-error-bridge.d.ts.map +1 -0
  71. package/dist/runtime/adapter/framework-error-bridge.js +47 -0
  72. package/dist/runtime/adapter/framework-error-bridge.js.map +1 -0
  73. package/dist/runtime/adapter/instrumentation-bridge.d.ts +32 -0
  74. package/dist/runtime/adapter/instrumentation-bridge.d.ts.map +1 -0
  75. package/dist/runtime/adapter/instrumentation-bridge.js +39 -0
  76. package/dist/runtime/adapter/instrumentation-bridge.js.map +1 -0
  77. package/dist/runtime/adapter/subscriber-fanout.d.ts +35 -0
  78. package/dist/runtime/adapter/subscriber-fanout.d.ts.map +1 -0
  79. package/dist/runtime/adapter/subscriber-fanout.js +60 -0
  80. package/dist/runtime/adapter/subscriber-fanout.js.map +1 -0
  81. package/dist/runtime/core/SectionEngineCore.d.ts +52 -0
  82. package/dist/runtime/core/SectionEngineCore.d.ts.map +1 -0
  83. package/dist/runtime/core/SectionEngineCore.js +81 -0
  84. package/dist/runtime/core/SectionEngineCore.js.map +1 -0
  85. package/dist/runtime/core/cohort.d.ts +40 -0
  86. package/dist/runtime/core/cohort.d.ts.map +1 -0
  87. package/dist/runtime/core/cohort.js +49 -0
  88. package/dist/runtime/core/cohort.js.map +1 -0
  89. package/dist/runtime/core/engine-input.d.ts +114 -0
  90. package/dist/runtime/core/engine-input.d.ts.map +1 -0
  91. package/dist/runtime/core/engine-input.js +19 -0
  92. package/dist/runtime/core/engine-input.js.map +1 -0
  93. package/dist/runtime/core/engine-output.d.ts +62 -0
  94. package/dist/runtime/core/engine-output.d.ts.map +1 -0
  95. package/dist/runtime/core/engine-output.js +27 -0
  96. package/dist/runtime/core/engine-output.js.map +1 -0
  97. package/dist/runtime/core/engine-readiness.d.ts +49 -0
  98. package/dist/runtime/core/engine-readiness.d.ts.map +1 -0
  99. package/dist/runtime/core/engine-readiness.js +47 -0
  100. package/dist/runtime/core/engine-readiness.js.map +1 -0
  101. package/dist/runtime/core/engine-resolver.d.ts +172 -0
  102. package/dist/runtime/core/engine-resolver.d.ts.map +1 -0
  103. package/dist/runtime/core/engine-resolver.js +170 -0
  104. package/dist/runtime/core/engine-resolver.js.map +1 -0
  105. package/dist/runtime/core/engine-stage-derivation.d.ts +19 -0
  106. package/dist/runtime/core/engine-stage-derivation.d.ts.map +1 -0
  107. package/dist/runtime/core/engine-stage-derivation.js +30 -0
  108. package/dist/runtime/core/engine-stage-derivation.js.map +1 -0
  109. package/dist/runtime/core/engine-state.d.ts +83 -0
  110. package/dist/runtime/core/engine-state.d.ts.map +1 -0
  111. package/dist/runtime/core/engine-state.js +49 -0
  112. package/dist/runtime/core/engine-state.js.map +1 -0
  113. package/dist/runtime/core/engine-transition.d.ts +49 -0
  114. package/dist/runtime/core/engine-transition.d.ts.map +1 -0
  115. package/dist/runtime/core/engine-transition.js +261 -0
  116. package/dist/runtime/core/engine-transition.js.map +1 -0
  117. package/dist/runtime/engine-context.d.ts +40 -0
  118. package/dist/runtime/engine-context.d.ts.map +1 -0
  119. package/dist/runtime/engine-context.js +32 -0
  120. package/dist/runtime/engine-context.js.map +1 -0
  121. package/dist/runtime/engine.d.ts +24 -0
  122. package/dist/runtime/engine.d.ts.map +1 -0
  123. package/dist/runtime/engine.js +24 -0
  124. package/dist/runtime/engine.js.map +1 -0
  125. package/dist/runtime/internal.d.ts +44 -0
  126. package/dist/runtime/internal.d.ts.map +1 -0
  127. package/dist/runtime/internal.js +46 -0
  128. package/dist/runtime/internal.js.map +1 -0
  129. package/dist/runtime/runtime-id.d.ts +8 -0
  130. package/dist/runtime/runtime-id.d.ts.map +1 -0
  131. package/dist/runtime/runtime-id.js +10 -0
  132. package/dist/runtime/runtime-id.js.map +1 -0
  133. package/dist/runtime/section-runtime-engine-host-context.d.ts +74 -0
  134. package/dist/runtime/section-runtime-engine-host-context.d.ts.map +1 -0
  135. package/dist/runtime/section-runtime-engine-host-context.js +96 -0
  136. package/dist/runtime/section-runtime-engine-host-context.js.map +1 -0
  137. package/dist/runtime/stage-emit-gate.d.ts +93 -0
  138. package/dist/runtime/stage-emit-gate.d.ts.map +1 -0
  139. package/dist/runtime/stage-emit-gate.js +83 -0
  140. package/dist/runtime/stage-emit-gate.js.map +1 -0
  141. package/dist/services/SSMLExtractor.d.ts.map +1 -1
  142. package/dist/services/SSMLExtractor.js +189 -2
  143. package/dist/services/SSMLExtractor.js.map +1 -1
  144. package/dist/services/TTSService.d.ts +7 -0
  145. package/dist/services/TTSService.d.ts.map +1 -1
  146. package/dist/services/TTSService.js +15 -0
  147. package/dist/services/TTSService.js.map +1 -1
  148. package/dist/services/ToolRegistry.d.ts.map +1 -1
  149. package/dist/services/ToolRegistry.js +30 -0
  150. package/dist/services/ToolRegistry.js.map +1 -1
  151. package/dist/services/ToolkitCoordinator.d.ts +264 -6
  152. package/dist/services/ToolkitCoordinator.d.ts.map +1 -1
  153. package/dist/services/ToolkitCoordinator.js +350 -32
  154. package/dist/services/ToolkitCoordinator.js.map +1 -1
  155. package/dist/services/framework-error-bus.d.ts +73 -0
  156. package/dist/services/framework-error-bus.d.ts.map +1 -0
  157. package/dist/services/framework-error-bus.js +68 -0
  158. package/dist/services/framework-error-bus.js.map +1 -0
  159. package/dist/services/framework-error.d.ts +36 -1
  160. package/dist/services/framework-error.d.ts.map +1 -1
  161. package/dist/services/framework-error.js +37 -0
  162. package/dist/services/framework-error.js.map +1 -1
  163. package/dist/services/interfaces.d.ts +85 -0
  164. package/dist/services/interfaces.d.ts.map +1 -1
  165. package/dist/services/interfaces.js.map +1 -1
  166. package/dist/services/tool-config-validation.js +1 -1
  167. package/dist/services/tool-config-validation.js.map +1 -1
  168. package/dist/services/tools-config-normalizer.d.ts +24 -1
  169. package/dist/services/tools-config-normalizer.d.ts.map +1 -1
  170. package/dist/services/tools-config-normalizer.js +13 -1
  171. package/dist/services/tools-config-normalizer.js.map +1 -1
  172. package/dist/services/tts-control-events.d.ts +14 -0
  173. package/dist/services/tts-control-events.d.ts.map +1 -0
  174. package/dist/services/tts-control-events.js +8 -0
  175. package/dist/services/tts-control-events.js.map +1 -0
  176. package/dist/tools/calculators/desmos-provider.js +18 -0
  177. package/dist/tools/calculators/desmos-provider.js.map +1 -1
  178. package/dist/tools/client.d.ts +0 -1
  179. package/dist/tools/client.d.ts.map +1 -1
  180. package/dist/tools/client.js +0 -2
  181. package/dist/tools/client.js.map +1 -1
  182. package/dist/tools/default-tool-module-loaders.d.ts.map +1 -1
  183. package/dist/tools/default-tool-module-loaders.js +2 -0
  184. package/dist/tools/default-tool-module-loaders.js.map +1 -1
  185. package/dist/tools/types.d.ts +0 -26
  186. package/dist/tools/types.d.ts.map +1 -1
  187. package/package.json +25 -8
  188. package/dist/runtime/runtime-event-guards.d.ts +0 -2
  189. package/dist/runtime/runtime-event-guards.d.ts.map +0 -1
  190. package/dist/runtime/runtime-event-guards.js +0 -4
  191. package/dist/runtime/runtime-event-guards.js.map +0 -1
  192. package/dist/tools/tool-coordinator.d.ts +0 -72
  193. package/dist/tools/tool-coordinator.d.ts.map +0 -1
  194. package/dist/tools/tool-coordinator.js +0 -194
  195. package/dist/tools/tool-coordinator.js.map +0 -1
  196. package/dist/types/events.d.ts +0 -157
  197. package/dist/types/events.d.ts.map +0 -1
  198. package/dist/types/events.js +0 -11
  199. package/dist/types/events.js.map +0 -1
@@ -29,25 +29,31 @@ import {
29
29
  isValidToolbarItemShape
30
30
  } from '../services/toolbar-items.js';
31
31
 
32
+ import { sanitizeSvgIcon } from '@pie-players/pie-players-shared/security';
33
+ import { createFocusTrap } from '@pie-players/pie-players-shared';
32
34
  import { createPackagedToolRegistry } from '../services/createDefaultToolRegistry.js';
33
35
  import { DEFAULT_TOOL_MODULE_LOADERS } from '../tools/default-tool-module-loaders.js';
34
- import { normalizeToolsConfig, parseToolList, resolveToolsForLevel } from '../services/tools-config-normalizer.js';
36
+ import { parseToolList } from '../services/tools-config-normalizer.js';
35
37
  import { createScopedToolId, parseScopedToolId } from '../services/tool-instance-id.js';
36
38
 
37
- var root_3 = $.from_html(`<span class="item-toolbar__element-host svelte-rnx3ie"></span>`);
38
39
  var root_4 = $.from_html(`<span class="item-toolbar__element-host svelte-rnx3ie"></span>`);
39
- var root_9 = $.from_html(`<img class="item-toolbar__icon-image svelte-rnx3ie" alt=""/>`);
40
- var root_12 = $.from_html(`<i aria-hidden="true"></i>`);
41
- var root_6 = $.from_html(`<a><!></a>`);
42
- var root_16 = $.from_html(`<img class="item-toolbar__icon-image svelte-rnx3ie" alt=""/>`);
43
- var root_19 = $.from_html(`<i aria-hidden="true"></i>`);
44
- var root_13 = $.from_html(`<button type="button"><!></button>`);
45
- var root_21 = $.from_html(`<span class="item-toolbar__element-host svelte-rnx3ie"></span>`);
40
+ var root_5 = $.from_html(`<span class="item-toolbar__element-host svelte-rnx3ie"></span>`);
41
+ var root_9 = $.from_html(`<span aria-hidden="true"></span>`);
42
+ var root_10 = $.from_html(`<img class="item-toolbar__icon-image svelte-rnx3ie" alt=""/>`);
43
+ var root_12 = $.from_html(`<span aria-hidden="true"></span>`);
44
+ var root_13 = $.from_html(`<i aria-hidden="true"></i>`);
45
+ var root_7 = $.from_html(`<a><!></a>`);
46
+ var root_16 = $.from_html(`<span aria-hidden="true"></span>`);
47
+ var root_17 = $.from_html(`<img class="item-toolbar__icon-image svelte-rnx3ie" alt=""/>`);
48
+ var root_19 = $.from_html(`<span aria-hidden="true"></span>`);
49
+ var root_20 = $.from_html(`<i aria-hidden="true"></i>`);
50
+ var root_14 = $.from_html(`<button type="button"><!></button>`);
46
51
  var root_22 = $.from_html(`<span class="item-toolbar__element-host svelte-rnx3ie"></span>`);
47
- var root_25 = $.from_html(`<span class="item-toolbar__controls-host svelte-rnx3ie"></span>`);
52
+ var root_23 = $.from_html(`<span class="item-toolbar__element-host svelte-rnx3ie"></span>`);
48
53
  var root_26 = $.from_html(`<span class="item-toolbar__controls-host svelte-rnx3ie"></span>`);
49
- var root_23 = $.from_html(`<div></div>`);
50
- var root_1 = $.from_html(`<div><div class="item-toolbar__tools-row svelte-rnx3ie"><!> <!> <!></div> <!></div>`);
54
+ var root_27 = $.from_html(`<span class="item-toolbar__controls-host svelte-rnx3ie"></span>`);
55
+ var root_24 = $.from_html(`<div></div>`);
56
+ var root_2 = $.from_html(`<div><div class="item-toolbar__tools-row svelte-rnx3ie"><!> <!> <!></div> <!></div>`);
51
57
 
52
58
  const $$css = {
53
59
  hash: 'svelte-rnx3ie',
@@ -73,9 +79,6 @@ export default function ItemToolBar($$anchor, $$props) {
73
79
  position = $.prop($$props, 'position', 7, 'bottom'),
74
80
  scopeElement = $.prop($$props, 'scopeElement', 7, null),
75
81
  toolRegistry = $.prop($$props, 'toolRegistry', 7, null),
76
- pnpResolver = $.prop($$props, 'pnpResolver', 7, null),
77
- assessment = $.prop($$props, 'assessment', 7, null),
78
- itemRef = $.prop($$props, 'itemRef', 7, null),
79
82
  item = $.prop($$props, 'item', 7, null),
80
83
  hostButtons = $.prop($$props, 'hostButtons', 23, () => []),
81
84
  className = $.prop($$props, 'class', 7, ''),
@@ -87,6 +90,14 @@ export default function ItemToolBar($$anchor, $$props) {
87
90
  let shellContext = $.state(null);
88
91
  let moduleLoadVersion = $.state(0);
89
92
 
93
+ // Bumped from `coordinator.onPolicyChange(...)` so the engine-driven
94
+ // `policyDecision` / `policyInputs` derivations rerun on input
95
+ // changes (`updateAssessment`, `setQtiEnforcement`, custom source
96
+ // register / remove). The decision itself is computed by the
97
+ // coordinator's policy engine — this counter is just the reactive
98
+ // fanout that lets Svelte know the engine answer may have changed.
99
+ let policyChangeVersion = $.state(0);
100
+
90
101
  $.user_effect(() => {
91
102
  if (!$.get(toolbarRootElement)) return;
92
103
 
@@ -103,6 +114,25 @@ export default function ItemToolBar($$anchor, $$props) {
103
114
  });
104
115
  });
105
116
 
117
+ $.user_effect(() => {
118
+ const coord = $.get(runtimeContext)?.toolkitCoordinator;
119
+
120
+ if (!coord || typeof coord.onPolicyChange !== 'function') return;
121
+
122
+ const unsubscribe = coord.onPolicyChange(() => {
123
+ $.set(policyChangeVersion, $.get(policyChangeVersion) + 1);
124
+ });
125
+
126
+ return () => {
127
+ try {
128
+ unsubscribe?.();
129
+ } catch {
130
+ // detach errors are non-fatal: the coordinator may already
131
+ // be torn down, in which case the listener set is GC-eligible.
132
+ }
133
+ };
134
+ });
135
+
106
136
  const effectiveToolCoordinator = $.derived(() => $.get(runtimeContext)?.toolCoordinator);
107
137
  const effectiveTTSService = $.derived(() => $.get(runtimeContext)?.ttsService);
108
138
  const effectiveElementToolStateStore = $.derived(() => $.get(runtimeContext)?.elementToolStateStore);
@@ -136,12 +166,6 @@ export default function ItemToolBar($$anchor, $$props) {
136
166
  const explicitTools = $.derived(() => parseToolList(tools()));
137
167
  const normalizedExplicitTools = $.derived(() => $.get(effectiveToolRegistry).normalizeToolIds($.get(explicitTools)).filter(Boolean));
138
168
 
139
- const effectiveToolsConfig = $.derived(() => {
140
- const coordinatorConfig = $.get(runtimeContext)?.toolkitCoordinator?.config?.tools;
141
-
142
- return normalizeToolsConfig(coordinatorConfig || {});
143
- });
144
-
145
169
  const placementLevel = $.derived(() => {
146
170
  if ($.get(effectiveLevel) === 'section') return 'section';
147
171
  if ($.get(effectiveLevel) === 'passage' || $.get(effectiveContentKind) === 'rubric-block-stimulus') return 'passage';
@@ -149,48 +173,58 @@ export default function ItemToolBar($$anchor, $$props) {
149
173
  return 'item';
150
174
  });
151
175
 
152
- const placementAllowedToolIds = $.derived(() => {
153
- const resolved = resolveToolsForLevel($.get(effectiveToolsConfig), $.get(placementLevel));
154
-
155
- return $.get(effectiveToolRegistry).normalizeToolIds(resolved).filter(Boolean);
156
- });
157
-
158
- const providerConfig = $.derived(() => $.get(effectiveToolsConfig)?.providers || {});
159
-
160
- const normalizedProviderConfig = $.derived(() => {
161
- const normalized = {};
162
-
163
- for (const [toolId, config] of Object.entries($.get(providerConfig))) {
164
- const canonicalToolId = $.get(effectiveToolRegistry).normalizeToolId(toolId);
165
-
166
- if (!canonicalToolId) continue;
167
-
168
- normalized[canonicalToolId] = config;
176
+ // Pass 1 single source of truth via the ToolPolicyEngine
177
+ // (M8 PR 3). When the toolbar is mounted under
178
+ // `<pie-assessment-toolkit>` the coordinator owns the engine and
179
+ // applies `placement → policy.allowed → policy.blocked →
180
+ // providers → QTI` plus any custom `PolicySource`s the host has
181
+ // registered. The toolbar trusts that decision verbatim — the
182
+ // `tools=` prop is *not* applied as a downstream filter.
183
+ //
184
+ // The `tools=` attribute is only consulted in the standalone
185
+ // fallback path (no coordinator in scope, e.g. fixtures that
186
+ // mount `<pie-item-toolbar>` directly). Hosts that want to
187
+ // restrict the engine's visible set should configure
188
+ // `tools.policy` / `tools.providers` on the assessment-toolkit
189
+ // inputs, or register a custom `PolicySource`, rather than
190
+ // passing `tools=` here.
191
+ const policyDecision = $.derived(() => {
192
+ // Read `policyChangeVersion` so we re-derive whenever the
193
+ // coordinator emits a policy change (assessment binding,
194
+ // QTI enforcement override, custom source registration).
195
+ void $.get(policyChangeVersion);
196
+
197
+ const coord = $.get(runtimeContext)?.toolkitCoordinator;
198
+
199
+ if (!coord || typeof coord.decideToolPolicy !== 'function') {
200
+ return null;
169
201
  }
170
202
 
171
- return normalized;
203
+ return coord.decideToolPolicy({
204
+ level: $.get(placementLevel),
205
+ scope: {
206
+ level: $.get(effectiveLevel),
207
+ scopeId: $.get(effectiveScopeId),
208
+ assessmentId: $.get(runtimeContext)?.assessmentId,
209
+ sectionId: $.get(effectiveSectionId) || undefined,
210
+ itemId: $.get(effectiveItemId) || undefined,
211
+ canonicalItemId: $.get(effectiveCanonicalItemId) || undefined,
212
+ contentKind: $.get(effectiveContentKind)
213
+ }
214
+ });
172
215
  });
173
216
 
174
- const isProviderEnabled = (toolId) => $.get(normalizedProviderConfig)[toolId]?.enabled !== false;
175
-
176
- // Pass 1: determine allowed tools
177
217
  const allowedToolIds = $.derived(() => {
178
- const configuredTools = $.get(normalizedExplicitTools).length > 0
179
- ? $.get(normalizedExplicitTools)
180
- : $.get(placementAllowedToolIds);
181
-
182
- const providerEnabledConfiguredTools = configuredTools.filter((toolId) => isProviderEnabled(toolId));
183
218
  const dedupe = (toolIds) => Array.from(new Set(toolIds));
184
219
 
185
- if (pnpResolver() && assessment() && itemRef()) {
186
- const allowedByPnp = dedupe($.get(effectiveToolRegistry).normalizeToolIds(pnpResolver().getAllowedToolIds(assessment(), itemRef()))).filter(Boolean);
187
-
188
- if (providerEnabledConfiguredTools.length === 0) return allowedByPnp;
189
-
190
- return dedupe(allowedByPnp.filter((toolId) => providerEnabledConfiguredTools.includes(toolId)));
220
+ if ($.get(policyDecision)) {
221
+ return dedupe($.get(effectiveToolRegistry).normalizeToolIds($.get(policyDecision).visibleTools.map((entry) => entry.toolId)).filter(Boolean));
191
222
  }
192
223
 
193
- return dedupe(providerEnabledConfiguredTools);
224
+ // Standalone fallback: no coordinator in scope. Honour the
225
+ // explicit `tools=` prop verbatim so demo fixtures keep
226
+ // working without a `<pie-assessment-toolkit>` ancestor.
227
+ return dedupe($.get(normalizedExplicitTools));
194
228
  });
195
229
 
196
230
  const contentReady = $.derived(() => {
@@ -201,17 +235,41 @@ export default function ItemToolBar($$anchor, $$props) {
201
235
  return !!($.get(effectiveItem) && config && typeof config === 'object');
202
236
  });
203
237
 
238
+ // QTI inputs (`assessment`, `currentItemRef`) live on the
239
+ // coordinator after M8 PR 2; the toolbar reads them through
240
+ // `getPolicyInputs()` so it can build the correct Pass-2 context
241
+ // without re-binding props. Standalone (no-coordinator) usage
242
+ // falls back to the empty / canonical-id-derived contexts that
243
+ // satisfy the `ToolContext` shape for `isVisibleInContext` calls.
244
+ const policyInputs = $.derived(() => {
245
+ void $.get(policyChangeVersion);
246
+
247
+ const coord = $.get(runtimeContext)?.toolkitCoordinator;
248
+
249
+ if (!coord || typeof coord.getPolicyInputs !== 'function') {
250
+ return null;
251
+ }
252
+
253
+ return coord.getPolicyInputs();
254
+ });
255
+
256
+ const effectiveAssessment = $.derived(() => $.get(policyInputs)?.assessment ?? null);
257
+ const effectiveItemRef = $.derived(() => $.get(policyInputs)?.currentItemRef ?? null);
258
+
204
259
  const toolContext = $.derived(() => {
205
260
  if ($.get(effectiveLevel) === 'section') {
206
261
  return {
207
262
  level: 'section',
208
- assessment: assessment() || {},
263
+ assessment: $.get(effectiveAssessment) || {},
209
264
  section: {}
210
265
  };
211
266
  }
212
267
 
213
268
  if ($.get(effectiveLevel) === 'assessment') {
214
- return { level: 'assessment', assessment: assessment() || {} };
269
+ return {
270
+ level: 'assessment',
271
+ assessment: $.get(effectiveAssessment) || {}
272
+ };
215
273
  }
216
274
 
217
275
  if (!$.get(contentReady) || !$.get(effectiveItem)) {
@@ -221,16 +279,16 @@ export default function ItemToolBar($$anchor, $$props) {
221
279
  if ($.get(effectiveLevel) === 'passage') {
222
280
  return {
223
281
  level: 'passage',
224
- assessment: assessment() || {},
225
- itemRef: itemRef() || { id: $.get(effectiveCanonicalItemId) },
282
+ assessment: $.get(effectiveAssessment) || {},
283
+ itemRef: $.get(effectiveItemRef) || { id: $.get(effectiveCanonicalItemId) },
226
284
  passage: $.get(effectiveItem)
227
285
  };
228
286
  }
229
287
 
230
288
  return {
231
289
  level: 'item',
232
- assessment: assessment() || {},
233
- itemRef: itemRef() || { id: $.get(effectiveCanonicalItemId) },
290
+ assessment: $.get(effectiveAssessment) || {},
291
+ itemRef: $.get(effectiveItemRef) || { id: $.get(effectiveCanonicalItemId) },
234
292
  item: $.get(effectiveItem)
235
293
  };
236
294
  });
@@ -240,8 +298,8 @@ export default function ItemToolBar($$anchor, $$props) {
240
298
 
241
299
  return {
242
300
  level: 'item',
243
- assessment: assessment() || {},
244
- itemRef: itemRef() || { id: $.get(effectiveCanonicalItemId) },
301
+ assessment: $.get(effectiveAssessment) || {},
302
+ itemRef: $.get(effectiveItemRef) || { id: $.get(effectiveCanonicalItemId) },
245
303
  item: $.get(effectiveItem) || { id: $.get(effectiveCanonicalItemId), config: {} }
246
304
  };
247
305
  });
@@ -258,8 +316,8 @@ export default function ItemToolBar($$anchor, $$props) {
258
316
 
259
317
  return models.filter((model) => model && typeof model === 'object' && typeof model.id === 'string').map((model) => ({
260
318
  level: 'element',
261
- assessment: assessment() || {},
262
- itemRef: itemRef() || { id: $.get(effectiveCanonicalItemId) },
319
+ assessment: $.get(effectiveAssessment) || {},
320
+ itemRef: $.get(effectiveItemRef) || { id: $.get(effectiveCanonicalItemId) },
263
321
  item: $.get(effectiveItem),
264
322
  elementId: model.id
265
323
  }));
@@ -533,12 +591,32 @@ export default function ItemToolBar($$anchor, $$props) {
533
591
 
534
592
  for (const renderedTool of $.get(renderedTools)) {
535
593
  if (renderedTool.subscribeActive) {
594
+ let disposed = false;
595
+
536
596
  const unsubscribe = renderedTool.subscribeActive((active) => {
537
- $.set(activeToolState, { ...$.get(activeToolState), [renderedTool.toolId]: active }, true);
538
- renderedTool.sync?.();
597
+ // Tools may dispatch their active-change signal from inside
598
+ // a tracked Svelte $effect (e.g. tool-tts-inline does this
599
+ // on mount). When the toolbar synchronously creates / re-
600
+ // connects the tool element during its own template/
601
+ // derivation pass — for example when the section player
602
+ // collapses on resize — that dispatch lands back here while
603
+ // our parent derivation is still running, and Svelte
604
+ // rejects the `activeToolState` write with
605
+ // `state_unsafe_mutation`. Queue the update on a
606
+ // microtask so the mutation happens after the current
607
+ // reactive flush settles.
608
+ queueMicrotask(() => {
609
+ if (disposed) return;
610
+
611
+ $.set(activeToolState, { ...$.get(activeToolState), [renderedTool.toolId]: active }, true);
612
+ renderedTool.sync?.();
613
+ });
539
614
  });
540
615
 
541
- unsubs.push(unsubscribe);
616
+ unsubs.push(() => {
617
+ disposed = true;
618
+ unsubscribe();
619
+ });
542
620
  }
543
621
  }
544
622
 
@@ -550,9 +628,25 @@ export default function ItemToolBar($$anchor, $$props) {
550
628
  $.user_effect(() => {
551
629
  if (!$.get(toolbarContext).subscribeVisibility) return;
552
630
 
553
- return $.get(toolbarContext).subscribeVisibility(() => {
554
- syncRenderedToolsState();
631
+ let disposed = false;
632
+
633
+ const unsubscribe = $.get(toolbarContext).subscribeVisibility(() => {
634
+ // Defense-in-depth: defer the state write so a synchronous
635
+ // visibility broadcast from the coordinator never lands inside
636
+ // an active parent derivation/template flush. See the
637
+ // `subscribeActive` handler above for the failure mode this
638
+ // pattern prevents.
639
+ queueMicrotask(() => {
640
+ if (disposed) return;
641
+
642
+ syncRenderedToolsState();
643
+ });
555
644
  });
645
+
646
+ return () => {
647
+ disposed = true;
648
+ unsubscribe?.();
649
+ };
556
650
  });
557
651
 
558
652
  $.user_effect(() => {
@@ -560,13 +654,28 @@ export default function ItemToolBar($$anchor, $$props) {
560
654
 
561
655
  if (typeof toolkitCoordinator?.subscribeTelemetry !== 'function') return;
562
656
 
563
- return toolkitCoordinator.subscribeTelemetry(({ eventName, payload }) => {
564
- if (eventName !== 'tool-config-updated') return;
657
+ let disposed = false;
658
+
659
+ const unsubscribe = toolkitCoordinator.subscribeTelemetry(({ eventName, payload }) => {
660
+ if (eventName !== 'pie-toolkit-tool-config-updated') return;
565
661
  if (payload?.toolId && !$.get(toolbarVisibleToolIds).includes(payload.toolId)) return;
566
662
 
567
- $.set(moduleLoadVersion, $.get(moduleLoadVersion) + 1);
568
- syncRenderedToolsState();
663
+ // Defense-in-depth: telemetry can be emitted from anywhere in
664
+ // the toolkit lifecycle, including paths that flush
665
+ // synchronously while this component's deriveds are running.
666
+ // Defer the writes so the parent flush always settles first.
667
+ queueMicrotask(() => {
668
+ if (disposed) return;
669
+
670
+ $.set(moduleLoadVersion, $.get(moduleLoadVersion) + 1);
671
+ syncRenderedToolsState();
672
+ });
569
673
  });
674
+
675
+ return () => {
676
+ disposed = true;
677
+ unsubscribe?.();
678
+ };
570
679
  });
571
680
 
572
681
  function mountElement(node, element) {
@@ -639,6 +748,9 @@ export default function ItemToolBar($$anchor, $$props) {
639
748
  let y = 0;
640
749
  let width = currentArgs.mounted.entry.shell?.initialWidth ?? 720;
641
750
  let height = currentArgs.mounted.entry.shell?.initialHeight ?? 560;
751
+ let focusTrapCleanup = null;
752
+ let openerEl = null;
753
+ let previousActive = false;
642
754
 
643
755
  const invokeElementUnmount = (value) => {
644
756
  if (!value) return;
@@ -823,6 +935,75 @@ export default function ItemToolBar($$anchor, $$props) {
823
935
  applyPositionAndSize();
824
936
  };
825
937
 
938
+ const restoreOpenerFocus = () => {
939
+ const target = openerEl;
940
+
941
+ if (!target) return;
942
+
943
+ queueMicrotask(() => {
944
+ if (!target.isConnected) return;
945
+
946
+ try {
947
+ target.focus();
948
+ } catch {
949
+ // ignore
950
+ }
951
+ });
952
+ };
953
+
954
+ const getDeepActiveElement = () => {
955
+ if (typeof document === 'undefined') return null;
956
+
957
+ let active = document.activeElement;
958
+
959
+ while (active) {
960
+ const root = active.shadowRoot;
961
+
962
+ if (root && root.activeElement && root.activeElement !== active) {
963
+ active = root.activeElement;
964
+ } else {
965
+ break;
966
+ }
967
+ }
968
+
969
+ return active ?? null;
970
+ };
971
+
972
+ const installFocusTrap = () => {
973
+ if (!shellEl || focusTrapCleanup) return;
974
+
975
+ const active = getDeepActiveElement();
976
+
977
+ // Only update opener if we don't already have one (survives re-open within a
978
+ // single mount lifecycle) and the active element isn't inside the shell itself.
979
+ if (!openerEl && active && !shellEl.contains(active)) {
980
+ openerEl = active;
981
+ }
982
+
983
+ focusTrapCleanup = createFocusTrap(shellEl, {
984
+ initialFocus: closeButtonEl,
985
+ onEscape: () => {
986
+ closeShell();
987
+ }
988
+ });
989
+ };
990
+
991
+ const removeFocusTrap = () => {
992
+ if (!focusTrapCleanup) return;
993
+
994
+ const cleanup = focusTrapCleanup;
995
+
996
+ focusTrapCleanup = null;
997
+
998
+ try {
999
+ cleanup();
1000
+ } catch {
1001
+ // ignore
1002
+ }
1003
+
1004
+ restoreOpenerFocus();
1005
+ };
1006
+
826
1007
  const closeShell = () => {
827
1008
  $.get(toolbarContext).toggleTool(currentArgs.mounted.toolId);
828
1009
  syncRenderedToolsState();
@@ -953,17 +1134,31 @@ export default function ItemToolBar($$anchor, $$props) {
953
1134
  closeButtonEl.type = 'button';
954
1135
  closeButtonEl.className = 'pie-tool-shell__close';
955
1136
  closeButtonEl.setAttribute('aria-label', 'Close tool');
956
- closeButtonEl.innerHTML = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" aria-hidden="true"><path d="M3.5 3.5L12.5 12.5M12.5 3.5L3.5 12.5" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"/></svg>';
957
1137
 
958
- const closeIconEl = closeButtonEl.querySelector('svg');
1138
+ const svgNs = 'http://www.w3.org/2000/svg';
1139
+ const closeIconEl = document.createElementNS(svgNs, 'svg');
959
1140
 
960
- if (closeIconEl) {
961
- closeIconEl.style.width = '16px';
962
- closeIconEl.style.height = '16px';
963
- closeIconEl.style.display = 'block';
964
- closeIconEl.style.flexShrink = '0';
965
- closeIconEl.style.pointerEvents = 'none';
966
- }
1141
+ closeIconEl.setAttribute('xmlns', svgNs);
1142
+ closeIconEl.setAttribute('viewBox', '0 0 16 16');
1143
+ closeIconEl.setAttribute('aria-hidden', 'true');
1144
+
1145
+ const closeIconPath = document.createElementNS(svgNs, 'path');
1146
+
1147
+ closeIconPath.setAttribute('d', 'M3.5 3.5L12.5 12.5M12.5 3.5L3.5 12.5');
1148
+ closeIconPath.setAttribute('stroke', 'currentColor');
1149
+ closeIconPath.setAttribute('stroke-width', '1.8');
1150
+ closeIconPath.setAttribute('stroke-linecap', 'round');
1151
+ closeIconEl.appendChild(closeIconPath);
1152
+ closeButtonEl.appendChild(closeIconEl);
1153
+
1154
+ // SVGElement.style exists but is readonly in DOM types; cast once.
1155
+ const closeIconStyle = closeIconEl.style;
1156
+
1157
+ closeIconStyle.width = '16px';
1158
+ closeIconStyle.height = '16px';
1159
+ closeIconStyle.display = 'block';
1160
+ closeIconStyle.flexShrink = '0';
1161
+ closeIconStyle.pointerEvents = 'none';
967
1162
 
968
1163
  const closeButtonBaseBackground = 'color-mix(in srgb, var(--pie-white, #fff) 8%, transparent)';
969
1164
  const closeButtonHoverBackground = 'color-mix(in srgb, var(--pie-white, #fff) 18%, transparent)';
@@ -1081,6 +1276,12 @@ export default function ItemToolBar($$anchor, $$props) {
1081
1276
  applyShellStyle();
1082
1277
  mountContent();
1083
1278
  notifyHostedResize();
1279
+
1280
+ if (currentArgs.active) {
1281
+ installFocusTrap();
1282
+ }
1283
+
1284
+ previousActive = currentArgs.active;
1084
1285
  }
1085
1286
 
1086
1287
  return {
@@ -1094,11 +1295,26 @@ export default function ItemToolBar($$anchor, $$props) {
1094
1295
  mountContent();
1095
1296
  applyShellStyle();
1096
1297
  notifyHostedResize();
1298
+
1299
+ if (!previousActive && currentArgs.active) {
1300
+ installFocusTrap();
1301
+ } else if (previousActive && !currentArgs.active) {
1302
+ removeFocusTrap();
1303
+ openerEl = null;
1304
+ }
1305
+
1306
+ previousActive = currentArgs.active;
1097
1307
  },
1098
1308
 
1099
1309
  destroy() {
1100
1310
  notifyHostedUnmount();
1101
1311
 
1312
+ if (focusTrapCleanup) {
1313
+ removeFocusTrap();
1314
+ }
1315
+
1316
+ openerEl = null;
1317
+
1102
1318
  if (resizeHandleEl) {
1103
1319
  resizeHandleEl.removeEventListener('pointerdown', onResizePointerDown);
1104
1320
  }
@@ -1221,33 +1437,6 @@ export default function ItemToolBar($$anchor, $$props) {
1221
1437
  $.flush();
1222
1438
  },
1223
1439
 
1224
- get pnpResolver() {
1225
- return pnpResolver();
1226
- },
1227
-
1228
- set pnpResolver($$value) {
1229
- pnpResolver($$value);
1230
- $.flush();
1231
- },
1232
-
1233
- get assessment() {
1234
- return assessment();
1235
- },
1236
-
1237
- set assessment($$value) {
1238
- assessment($$value);
1239
- $.flush();
1240
- },
1241
-
1242
- get itemRef() {
1243
- return itemRef();
1244
- },
1245
-
1246
- set itemRef($$value) {
1247
- itemRef($$value);
1248
- $.flush();
1249
- },
1250
-
1251
1440
  get item() {
1252
1441
  return item();
1253
1442
  },
@@ -1299,7 +1488,7 @@ export default function ItemToolBar($$anchor, $$props) {
1299
1488
 
1300
1489
  {
1301
1490
  var consequent_13 = ($$anchor) => {
1302
- var div = root_1();
1491
+ var div = root_2();
1303
1492
  let classes;
1304
1493
  var div_1 = $.child(div);
1305
1494
  var node_2 = $.child(div_1);
@@ -1310,7 +1499,7 @@ export default function ItemToolBar($$anchor, $$props) {
1310
1499
 
1311
1500
  {
1312
1501
  var consequent = ($$anchor) => {
1313
- var span = root_3();
1502
+ var span = root_4();
1314
1503
 
1315
1504
  $.action(span, ($$node, $$action_arg) => mountElementWithShell?.($$node, $$action_arg), () => ({
1316
1505
  mounted: $.get(mounted),
@@ -1321,7 +1510,7 @@ export default function ItemToolBar($$anchor, $$props) {
1321
1510
  };
1322
1511
 
1323
1512
  var alternate = ($$anchor) => {
1324
- var span_1 = root_4();
1513
+ var span_1 = root_5();
1325
1514
 
1326
1515
  $.action(span_1, ($$node, $$action_arg) => mountElement?.($$node, $$action_arg), () => $.get(mounted).entry.element);
1327
1516
  $.append($$anchor, span_1);
@@ -1343,7 +1532,7 @@ export default function ItemToolBar($$anchor, $$props) {
1343
1532
 
1344
1533
  {
1345
1534
  var consequent_5 = ($$anchor) => {
1346
- var a = root_6();
1535
+ var a = root_7();
1347
1536
  let classes_1;
1348
1537
  var node_6 = $.child(a);
1349
1538
 
@@ -1354,17 +1543,17 @@ export default function ItemToolBar($$anchor, $$props) {
1354
1543
 
1355
1544
  {
1356
1545
  var consequent_1 = ($$anchor) => {
1357
- var fragment_4 = $.comment();
1358
- var node_8 = $.first_child(fragment_4);
1546
+ var span_2 = root_9();
1359
1547
 
1360
- $.html(node_8, () => $.get(item).icon);
1361
- $.append($$anchor, fragment_4);
1548
+ $.html(span_2, () => sanitizeSvgIcon($.get(item).icon), true);
1549
+ $.reset(span_2);
1550
+ $.append($$anchor, span_2);
1362
1551
  };
1363
1552
 
1364
1553
  var d = $.derived(() => isInlineSvgIcon($.get(item).icon));
1365
1554
 
1366
1555
  var consequent_2 = ($$anchor) => {
1367
- var img = root_9();
1556
+ var img = root_10();
1368
1557
 
1369
1558
  $.template_effect(() => $.set_attribute(img, 'src', $.get(item).icon));
1370
1559
  $.append($$anchor, img);
@@ -1374,31 +1563,31 @@ export default function ItemToolBar($$anchor, $$props) {
1374
1563
 
1375
1564
  var alternate_2 = ($$anchor) => {
1376
1565
  const fallbackIcon = $.derived(() => getFallbackIconSvg($.get(item).icon));
1377
- var fragment_5 = $.comment();
1378
- var node_9 = $.first_child(fragment_5);
1566
+ var fragment_4 = $.comment();
1567
+ var node_8 = $.first_child(fragment_4);
1379
1568
 
1380
1569
  {
1381
1570
  var consequent_3 = ($$anchor) => {
1382
- var fragment_6 = $.comment();
1383
- var node_10 = $.first_child(fragment_6);
1571
+ var span_3 = root_12();
1384
1572
 
1385
- $.html(node_10, () => $.get(fallbackIcon));
1386
- $.append($$anchor, fragment_6);
1573
+ $.html(span_3, () => sanitizeSvgIcon($.get(fallbackIcon)), true);
1574
+ $.reset(span_3);
1575
+ $.append($$anchor, span_3);
1387
1576
  };
1388
1577
 
1389
1578
  var alternate_1 = ($$anchor) => {
1390
- var i = root_12();
1579
+ var i = root_13();
1391
1580
 
1392
1581
  $.template_effect(() => $.set_class(i, 1, `icon icon-${$.get(item).icon}`, 'svelte-rnx3ie'));
1393
1582
  $.append($$anchor, i);
1394
1583
  };
1395
1584
 
1396
- $.if(node_9, ($$render) => {
1585
+ $.if(node_8, ($$render) => {
1397
1586
  if ($.get(fallbackIcon)) $$render(consequent_3); else $$render(alternate_1, -1);
1398
1587
  });
1399
1588
  }
1400
1589
 
1401
- $.append($$anchor, fragment_5);
1590
+ $.append($$anchor, fragment_4);
1402
1591
  };
1403
1592
 
1404
1593
  $.if(node_7, ($$render) => {
@@ -1445,28 +1634,28 @@ export default function ItemToolBar($$anchor, $$props) {
1445
1634
  var d_2 = $.derived(() => isToolbarLinkItem($.get(item)));
1446
1635
 
1447
1636
  var alternate_5 = ($$anchor) => {
1448
- var button_1 = root_13();
1637
+ var button_1 = root_14();
1449
1638
  let classes_2;
1450
- var node_11 = $.child(button_1);
1639
+ var node_9 = $.child(button_1);
1451
1640
 
1452
1641
  {
1453
1642
  var consequent_9 = ($$anchor) => {
1454
- var fragment_7 = $.comment();
1455
- var node_12 = $.first_child(fragment_7);
1643
+ var fragment_5 = $.comment();
1644
+ var node_10 = $.first_child(fragment_5);
1456
1645
 
1457
1646
  {
1458
1647
  var consequent_6 = ($$anchor) => {
1459
- var fragment_8 = $.comment();
1460
- var node_13 = $.first_child(fragment_8);
1648
+ var span_4 = root_16();
1461
1649
 
1462
- $.html(node_13, () => $.get(item).icon);
1463
- $.append($$anchor, fragment_8);
1650
+ $.html(span_4, () => sanitizeSvgIcon($.get(item).icon), true);
1651
+ $.reset(span_4);
1652
+ $.append($$anchor, span_4);
1464
1653
  };
1465
1654
 
1466
1655
  var d_3 = $.derived(() => isInlineSvgIcon($.get(item).icon));
1467
1656
 
1468
1657
  var consequent_7 = ($$anchor) => {
1469
- var img_1 = root_16();
1658
+ var img_1 = root_17();
1470
1659
 
1471
1660
  $.template_effect(() => $.set_attribute(img_1, 'src', $.get(item).icon));
1472
1661
  $.append($$anchor, img_1);
@@ -1476,42 +1665,42 @@ export default function ItemToolBar($$anchor, $$props) {
1476
1665
 
1477
1666
  var alternate_4 = ($$anchor) => {
1478
1667
  const fallbackIcon = $.derived(() => getFallbackIconSvg($.get(item).icon));
1479
- var fragment_9 = $.comment();
1480
- var node_14 = $.first_child(fragment_9);
1668
+ var fragment_6 = $.comment();
1669
+ var node_11 = $.first_child(fragment_6);
1481
1670
 
1482
1671
  {
1483
1672
  var consequent_8 = ($$anchor) => {
1484
- var fragment_10 = $.comment();
1485
- var node_15 = $.first_child(fragment_10);
1673
+ var span_5 = root_19();
1486
1674
 
1487
- $.html(node_15, () => $.get(fallbackIcon));
1488
- $.append($$anchor, fragment_10);
1675
+ $.html(span_5, () => sanitizeSvgIcon($.get(fallbackIcon)), true);
1676
+ $.reset(span_5);
1677
+ $.append($$anchor, span_5);
1489
1678
  };
1490
1679
 
1491
1680
  var alternate_3 = ($$anchor) => {
1492
- var i_1 = root_19();
1681
+ var i_1 = root_20();
1493
1682
 
1494
1683
  $.template_effect(() => $.set_class(i_1, 1, `icon icon-${$.get(item).icon}`, 'svelte-rnx3ie'));
1495
1684
  $.append($$anchor, i_1);
1496
1685
  };
1497
1686
 
1498
- $.if(node_14, ($$render) => {
1687
+ $.if(node_11, ($$render) => {
1499
1688
  if ($.get(fallbackIcon)) $$render(consequent_8); else $$render(alternate_3, -1);
1500
1689
  });
1501
1690
  }
1502
1691
 
1503
- $.append($$anchor, fragment_9);
1692
+ $.append($$anchor, fragment_6);
1504
1693
  };
1505
1694
 
1506
- $.if(node_12, ($$render) => {
1695
+ $.if(node_10, ($$render) => {
1507
1696
  if ($.get(d_3)) $$render(consequent_6); else if ($.get(d_4)) $$render(consequent_7, 1); else $$render(alternate_4, -1);
1508
1697
  });
1509
1698
  }
1510
1699
 
1511
- $.append($$anchor, fragment_7);
1700
+ $.append($$anchor, fragment_5);
1512
1701
  };
1513
1702
 
1514
- $.if(node_11, ($$render) => {
1703
+ $.if(node_9, ($$render) => {
1515
1704
  if ($.get(item).icon) $$render(consequent_9);
1516
1705
  });
1517
1706
  }
@@ -1549,77 +1738,77 @@ export default function ItemToolBar($$anchor, $$props) {
1549
1738
  $.append($$anchor, fragment_2);
1550
1739
  });
1551
1740
 
1552
- var node_16 = $.sibling(node_4, 2);
1741
+ var node_12 = $.sibling(node_4, 2);
1553
1742
 
1554
- $.each(node_16, 17, () => $.get(mountedElementsAfterButtons), (mounted) => mounted.key, ($$anchor, mounted) => {
1555
- var fragment_11 = $.comment();
1556
- var node_17 = $.first_child(fragment_11);
1743
+ $.each(node_12, 17, () => $.get(mountedElementsAfterButtons), (mounted) => mounted.key, ($$anchor, mounted) => {
1744
+ var fragment_7 = $.comment();
1745
+ var node_13 = $.first_child(fragment_7);
1557
1746
 
1558
1747
  {
1559
1748
  var consequent_10 = ($$anchor) => {
1560
- var span_2 = root_21();
1749
+ var span_6 = root_22();
1561
1750
 
1562
- $.action(span_2, ($$node, $$action_arg) => mountElementWithShell?.($$node, $$action_arg), () => ({
1751
+ $.action(span_6, ($$node, $$action_arg) => mountElementWithShell?.($$node, $$action_arg), () => ({
1563
1752
  mounted: $.get(mounted),
1564
1753
  active: $.get(renderedToolActiveById)[$.get(mounted).toolId] ?? false
1565
1754
  }));
1566
1755
 
1567
- $.append($$anchor, span_2);
1756
+ $.append($$anchor, span_6);
1568
1757
  };
1569
1758
 
1570
1759
  var alternate_6 = ($$anchor) => {
1571
- var span_3 = root_22();
1760
+ var span_7 = root_23();
1572
1761
 
1573
- $.action(span_3, ($$node, $$action_arg) => mountElement?.($$node, $$action_arg), () => $.get(mounted).entry.element);
1574
- $.append($$anchor, span_3);
1762
+ $.action(span_7, ($$node, $$action_arg) => mountElement?.($$node, $$action_arg), () => $.get(mounted).entry.element);
1763
+ $.append($$anchor, span_7);
1575
1764
  };
1576
1765
 
1577
- $.if(node_17, ($$render) => {
1766
+ $.if(node_13, ($$render) => {
1578
1767
  if ($.get(mounted).entry.shell) $$render(consequent_10); else $$render(alternate_6, -1);
1579
1768
  });
1580
1769
  }
1581
1770
 
1582
- $.append($$anchor, fragment_11);
1771
+ $.append($$anchor, fragment_7);
1583
1772
  });
1584
1773
 
1585
1774
  $.reset(div_1);
1586
1775
 
1587
- var node_18 = $.sibling(div_1, 2);
1776
+ var node_14 = $.sibling(div_1, 2);
1588
1777
 
1589
1778
  {
1590
1779
  var consequent_12 = ($$anchor) => {
1591
- var div_2 = root_23();
1780
+ var div_2 = root_24();
1592
1781
  let classes_3;
1593
1782
 
1594
1783
  $.each(div_2, 21, () => $.get(mountedElementsControlsRow), (mounted) => mounted.key, ($$anchor, mounted) => {
1595
- var fragment_12 = $.comment();
1596
- var node_19 = $.first_child(fragment_12);
1784
+ var fragment_8 = $.comment();
1785
+ var node_15 = $.first_child(fragment_8);
1597
1786
 
1598
1787
  {
1599
1788
  var consequent_11 = ($$anchor) => {
1600
- var span_4 = root_25();
1789
+ var span_8 = root_26();
1601
1790
 
1602
- $.action(span_4, ($$node, $$action_arg) => mountElementWithShell?.($$node, $$action_arg), () => ({
1791
+ $.action(span_8, ($$node, $$action_arg) => mountElementWithShell?.($$node, $$action_arg), () => ({
1603
1792
  mounted: $.get(mounted),
1604
1793
  active: $.get(renderedToolActiveById)[$.get(mounted).toolId] ?? false
1605
1794
  }));
1606
1795
 
1607
- $.append($$anchor, span_4);
1796
+ $.append($$anchor, span_8);
1608
1797
  };
1609
1798
 
1610
1799
  var alternate_7 = ($$anchor) => {
1611
- var span_5 = root_26();
1800
+ var span_9 = root_27();
1612
1801
 
1613
- $.action(span_5, ($$node, $$action_arg) => mountElement?.($$node, $$action_arg), () => $.get(mounted).entry.element);
1614
- $.append($$anchor, span_5);
1802
+ $.action(span_9, ($$node, $$action_arg) => mountElement?.($$node, $$action_arg), () => $.get(mounted).entry.element);
1803
+ $.append($$anchor, span_9);
1615
1804
  };
1616
1805
 
1617
- $.if(node_19, ($$render) => {
1806
+ $.if(node_15, ($$render) => {
1618
1807
  if ($.get(mounted).entry.shell) $$render(consequent_11); else $$render(alternate_7, -1);
1619
1808
  });
1620
1809
  }
1621
1810
 
1622
- $.append($$anchor, fragment_12);
1811
+ $.append($$anchor, fragment_8);
1623
1812
  });
1624
1813
 
1625
1814
  $.reset(div_2);
@@ -1633,7 +1822,7 @@ export default function ItemToolBar($$anchor, $$props) {
1633
1822
  $.append($$anchor, div_2);
1634
1823
  };
1635
1824
 
1636
- $.if(node_18, ($$render) => {
1825
+ $.if(node_14, ($$render) => {
1637
1826
  if ($.get(shouldRenderControlsRow)) $$render(consequent_12);
1638
1827
  });
1639
1828
  }
@@ -1683,9 +1872,6 @@ __pieDefineSafely('pie-item-toolbar', $.create_custom_element(
1683
1872
  language: { attribute: 'language', type: 'String' },
1684
1873
  scopeElement: { type: 'Object' },
1685
1874
  toolRegistry: { type: 'Object' },
1686
- pnpResolver: { type: 'Object' },
1687
- assessment: { type: 'Object' },
1688
- itemRef: { type: 'Object' },
1689
1875
  item: { type: 'Object' },
1690
1876
  hostButtons: { type: 'Object' },
1691
1877
  class: {}