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

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 (112) hide show
  1. package/dist/components/ItemToolBar.custom-element.js +425 -93
  2. package/dist/components/PieAssessmentToolkit.custom-element.js +200 -46
  3. package/dist/components/SectionToolBar.custom-element.js +162 -0
  4. package/dist/components/section-toolbar-element.d.ts +3 -0
  5. package/dist/components/section-toolbar-element.d.ts.map +1 -0
  6. package/dist/components/section-toolbar-element.js +2 -0
  7. package/dist/components/section-toolbar-element.js.map +1 -0
  8. package/dist/context/assessment-toolkit-context.d.ts +1 -1
  9. package/dist/context/assessment-toolkit-context.d.ts.map +1 -1
  10. package/dist/index.d.ts +5 -3
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +2 -1
  13. package/dist/index.js.map +1 -1
  14. package/dist/runtime/SectionRuntimeEngine.d.ts +57 -1
  15. package/dist/runtime/SectionRuntimeEngine.d.ts.map +1 -1
  16. package/dist/runtime/SectionRuntimeEngine.js +23 -0
  17. package/dist/runtime/SectionRuntimeEngine.js.map +1 -1
  18. package/dist/runtime/registration-events.d.ts +19 -0
  19. package/dist/runtime/registration-events.d.ts.map +1 -1
  20. package/dist/runtime/registration-events.js +3 -0
  21. package/dist/runtime/registration-events.js.map +1 -1
  22. package/dist/runtime/runtime-event-guards.d.ts +0 -1
  23. package/dist/runtime/runtime-event-guards.d.ts.map +1 -1
  24. package/dist/runtime/runtime-event-guards.js +0 -5
  25. package/dist/runtime/runtime-event-guards.js.map +1 -1
  26. package/dist/runtime/session-event-emitter-policy.d.ts +12 -0
  27. package/dist/runtime/session-event-emitter-policy.d.ts.map +1 -0
  28. package/dist/runtime/session-event-emitter-policy.js +57 -0
  29. package/dist/runtime/session-event-emitter-policy.js.map +1 -0
  30. package/dist/services/HighlightCoordinator.d.ts +9 -0
  31. package/dist/services/HighlightCoordinator.d.ts.map +1 -1
  32. package/dist/services/HighlightCoordinator.js +196 -55
  33. package/dist/services/HighlightCoordinator.js.map +1 -1
  34. package/dist/services/TTSService.d.ts +18 -0
  35. package/dist/services/TTSService.d.ts.map +1 -1
  36. package/dist/services/TTSService.js +343 -105
  37. package/dist/services/TTSService.js.map +1 -1
  38. package/dist/services/ToolRegistry.d.ts +40 -2
  39. package/dist/services/ToolRegistry.d.ts.map +1 -1
  40. package/dist/services/ToolRegistry.js +22 -1
  41. package/dist/services/ToolRegistry.js.map +1 -1
  42. package/dist/services/ToolkitCoordinator.d.ts +34 -1
  43. package/dist/services/ToolkitCoordinator.d.ts.map +1 -1
  44. package/dist/services/ToolkitCoordinator.js +203 -2
  45. package/dist/services/ToolkitCoordinator.js.map +1 -1
  46. package/dist/services/createDefaultToolRegistry.d.ts +5 -11
  47. package/dist/services/createDefaultToolRegistry.d.ts.map +1 -1
  48. package/dist/services/createDefaultToolRegistry.js +5 -48
  49. package/dist/services/createDefaultToolRegistry.js.map +1 -1
  50. package/dist/services/interfaces.d.ts +7 -2
  51. package/dist/services/interfaces.d.ts.map +1 -1
  52. package/dist/services/interfaces.js.map +1 -1
  53. package/dist/services/pnp-standard-features.d.ts +1 -1
  54. package/dist/services/section-controller-types.d.ts +5 -0
  55. package/dist/services/section-controller-types.d.ts.map +1 -1
  56. package/dist/services/tool-config-defaults.d.ts +14 -0
  57. package/dist/services/tool-config-defaults.d.ts.map +1 -0
  58. package/dist/services/tool-config-defaults.js +23 -0
  59. package/dist/services/tool-config-defaults.js.map +1 -0
  60. package/dist/services/tool-context.d.ts.map +1 -1
  61. package/dist/services/tool-context.js +50 -3
  62. package/dist/services/tool-context.js.map +1 -1
  63. package/dist/services/tool-instance-id.d.ts +1 -3
  64. package/dist/services/tool-instance-id.d.ts.map +1 -1
  65. package/dist/services/tool-instance-id.js +4 -10
  66. package/dist/services/tool-instance-id.js.map +1 -1
  67. package/dist/services/toolbar-items.d.ts +26 -0
  68. package/dist/services/toolbar-items.d.ts.map +1 -0
  69. package/dist/services/toolbar-items.js +10 -0
  70. package/dist/services/toolbar-items.js.map +1 -0
  71. package/dist/services/tools-config-normalizer.d.ts.map +1 -1
  72. package/dist/services/tools-config-normalizer.js +5 -6
  73. package/dist/services/tools-config-normalizer.js.map +1 -1
  74. package/dist/services/tts/browser-provider.d.ts.map +1 -1
  75. package/dist/services/tts/browser-provider.js +201 -34
  76. package/dist/services/tts/browser-provider.js.map +1 -1
  77. package/dist/services/tts/text-processing.d.ts +17 -0
  78. package/dist/services/tts/text-processing.d.ts.map +1 -0
  79. package/dist/services/tts/text-processing.js +144 -0
  80. package/dist/services/tts/text-processing.js.map +1 -0
  81. package/dist/tools/default-tool-module-loaders.d.ts.map +1 -1
  82. package/dist/tools/default-tool-module-loaders.js +1 -7
  83. package/dist/tools/default-tool-module-loaders.js.map +1 -1
  84. package/dist/tools/registrations/accessibility-tools.d.ts +7 -2
  85. package/dist/tools/registrations/accessibility-tools.d.ts.map +1 -1
  86. package/dist/tools/registrations/accessibility-tools.js +23 -15
  87. package/dist/tools/registrations/accessibility-tools.js.map +1 -1
  88. package/dist/tools/registrations/calculator.d.ts.map +1 -1
  89. package/dist/tools/registrations/calculator.js +18 -10
  90. package/dist/tools/registrations/calculator.js.map +1 -1
  91. package/dist/tools/registrations/interaction-tools.d.ts.map +1 -1
  92. package/dist/tools/registrations/interaction-tools.js +5 -4
  93. package/dist/tools/registrations/interaction-tools.js.map +1 -1
  94. package/dist/tools/registrations/measurement-tools.js +4 -4
  95. package/dist/tools/registrations/measurement-tools.js.map +1 -1
  96. package/dist/tools/registrations/subject-specific-tools.js +4 -4
  97. package/dist/tools/registrations/subject-specific-tools.js.map +1 -1
  98. package/dist/tools/registrations/tts.d.ts.map +1 -1
  99. package/dist/tools/registrations/tts.js +161 -17
  100. package/dist/tools/registrations/tts.js.map +1 -1
  101. package/dist/tools/tool-tag-map.d.ts.map +1 -1
  102. package/dist/tools/tool-tag-map.js +2 -1
  103. package/dist/tools/tool-tag-map.js.map +1 -1
  104. package/package.json +12 -8
  105. package/src/components/ItemToolBar.svelte +275 -47
  106. package/src/components/PieAssessmentToolkit.svelte +217 -53
  107. package/src/components/SectionToolBar.svelte +58 -0
  108. package/dist/services/tts/provider-interface.d.ts +0 -131
  109. package/dist/services/tts/provider-interface.d.ts.map +0 -1
  110. package/dist/services/tts/provider-interface.js +0 -10
  111. package/dist/services/tts/provider-interface.js.map +0 -1
  112. package/src/components/PNPProvenanceViewer.svelte +0 -270
@@ -7,22 +7,25 @@ import {
7
7
  connectAssessmentToolkitShellContext
8
8
  } from '../context/runtime-context-consumer.js';
9
9
 
10
+ import { isExternalIconUrl, isInlineSvgIcon, isToolbarLinkItem } from '../services/toolbar-items.js';
10
11
  import { createDefaultToolRegistry } from '../services/createDefaultToolRegistry.js';
11
12
  import { DEFAULT_TOOL_MODULE_LOADERS } from '../tools/default-tool-module-loaders.js';
12
13
  import { normalizeToolsConfig, parseToolList, resolveToolsForLevel } from '../services/tools-config-normalizer.js';
13
14
  import { createScopedToolId, parseScopedToolId } from '../services/tool-instance-id.js';
14
15
 
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>`);
16
+ var root_2 = $.from_html(`<span class="item-toolbar__element-host svelte-rnx3ie"></span>`);
17
+ var root_7 = $.from_html(`<img class="item-toolbar__icon-image svelte-rnx3ie" alt=""/>`);
18
+ var root_10 = $.from_html(`<i aria-hidden="true"></i>`);
19
+ var root_4 = $.from_html(`<a><!></a>`);
20
+ var root_14 = $.from_html(`<img class="item-toolbar__icon-image svelte-rnx3ie" alt=""/>`);
21
+ var root_17 = $.from_html(`<i aria-hidden="true"></i>`);
22
+ var root_11 = $.from_html(`<button type="button"><!></button>`);
23
+ var root_18 = $.from_html(`<span class="item-toolbar__element-host svelte-rnx3ie"></span>`);
24
+ var root_1 = $.from_html(`<div><!> <!> <!></div>`);
22
25
 
23
26
  const $$css = {
24
27
  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;}'
28
+ code: '.item-toolbar.svelte-rnx3ie {display:flex;align-items:center;gap:0.5rem;}.item-toolbar--top.svelte-rnx3ie,\n .item-toolbar--bottom.svelte-rnx3ie {flex-direction:row;flex-wrap:wrap;}.item-toolbar--left.svelte-rnx3ie,\n .item-toolbar--right.svelte-rnx3ie {flex-direction:column;align-items:stretch;}.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;text-decoration:none;}.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
29
  };
27
30
 
28
31
  export default function ItemToolBar($$anchor, $$props) {
@@ -34,16 +37,21 @@ export default function ItemToolBar($$anchor, $$props) {
34
37
  let activeToolState = $.state($.proxy({}));
35
38
 
36
39
  // Props
37
- let itemId = $.prop($$props, 'itemId', 7, ''),
40
+ let level = $.prop($$props, 'level', 7, 'item'),
41
+ scopeId = $.prop($$props, 'scopeId', 7, ''),
42
+ itemId = $.prop($$props, 'itemId', 7, ''),
43
+ sectionId = $.prop($$props, 'sectionId', 7, ''),
38
44
  catalogId = $.prop($$props, 'catalogId', 7, ''),
39
45
  tools = $.prop($$props, 'tools', 7, 'calculator,textToSpeech,answerEliminator'),
40
46
  contentKind = $.prop($$props, 'contentKind', 7, 'assessment-item'),
47
+ position = $.prop($$props, 'position', 7, 'bottom'),
41
48
  scopeElement = $.prop($$props, 'scopeElement', 7, null),
42
49
  toolRegistry = $.prop($$props, 'toolRegistry', 7, null),
43
50
  pnpResolver = $.prop($$props, 'pnpResolver', 7, null),
44
51
  assessment = $.prop($$props, 'assessment', 7, null),
45
52
  itemRef = $.prop($$props, 'itemRef', 7, null),
46
53
  item = $.prop($$props, 'item', 7, null),
54
+ hostButtons = $.prop($$props, 'hostButtons', 23, () => []),
47
55
  className = $.prop($$props, 'class', 7, ''),
48
56
  size = $.prop($$props, 'size', 7, 'md'),
49
57
  language = $.prop($$props, 'language', 7, 'en-US');
@@ -73,11 +81,27 @@ export default function ItemToolBar($$anchor, $$props) {
73
81
  const effectiveTTSService = $.derived(() => $.get(runtimeContext)?.ttsService);
74
82
  const effectiveElementToolStateStore = $.derived(() => $.get(runtimeContext)?.elementToolStateStore);
75
83
  const effectiveAssessmentId = $.derived(() => $.get(runtimeContext)?.assessmentId ?? '');
76
- const effectiveSectionId = $.derived(() => $.get(runtimeContext)?.sectionId ?? '');
77
84
  const effectiveItemId = $.derived(() => itemId() || $.get(shellContext)?.itemId || '');
78
85
  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');
86
+ const effectiveSectionId = $.derived(() => sectionId() || $.get(runtimeContext)?.sectionId || '');
87
+ const effectiveContentKind = $.derived(() => contentKind() || $.get(shellContext)?.contentKind || (level() === 'section' ? 'section' : 'assessment-item'));
88
+
89
+ const effectiveLevel = $.derived(() => {
90
+ if (level() && level() !== 'item') return level();
91
+ if ($.get(effectiveContentKind) === 'rubric-block-stimulus') return 'passage';
92
+
93
+ return 'item';
94
+ });
95
+
96
+ const effectiveScopeId = $.derived(() => {
97
+ if (scopeId()) return scopeId();
98
+ if ($.get(effectiveLevel) === 'section') return $.get(effectiveSectionId) || $.get(runtimeContext)?.sectionId || 'default-section';
99
+ if ($.get(effectiveLevel) === 'assessment') return $.get(runtimeContext)?.assessmentId || 'default-assessment';
100
+
101
+ return $.get(effectiveCanonicalItemId) || $.get(effectiveItemId) || 'default-item';
102
+ });
103
+
104
+ const effectiveCatalogId = $.derived(() => catalogId() || $.get(effectiveScopeId));
81
105
  const effectiveItem = $.derived(() => item() || $.get(shellContext)?.item || null);
82
106
 
83
107
  // Effective registry for visibility and metadata ownership.
@@ -92,7 +116,12 @@ export default function ItemToolBar($$anchor, $$props) {
92
116
  return normalizeToolsConfig(coordinatorConfig || {});
93
117
  });
94
118
 
95
- const placementLevel = $.derived(() => $.get(effectiveContentKind) === 'rubric-block-stimulus' ? 'passage' : 'item');
119
+ const placementLevel = $.derived(() => {
120
+ if ($.get(effectiveLevel) === 'section') return 'section';
121
+ if ($.get(effectiveLevel) === 'passage' || $.get(effectiveContentKind) === 'rubric-block-stimulus') return 'passage';
122
+
123
+ return 'item';
124
+ });
96
125
 
97
126
  const placementAllowedToolIds = $.derived(() => {
98
127
  const resolved = resolveToolsForLevel($.get(effectiveToolsConfig), $.get(placementLevel));
@@ -100,34 +129,62 @@ export default function ItemToolBar($$anchor, $$props) {
100
129
  return $.get(effectiveToolRegistry).normalizeToolIds(resolved).filter(Boolean);
101
130
  });
102
131
 
132
+ const providerConfig = $.derived(() => $.get(effectiveToolsConfig)?.providers || {});
133
+ const isProviderEnabled = (toolId) => $.get(providerConfig)[toolId]?.enabled !== false;
134
+
103
135
  // Pass 1: determine allowed tools
104
136
  const allowedToolIds = $.derived(() => {
105
137
  const configuredTools = $.get(normalizedExplicitTools).length > 0
106
138
  ? $.get(normalizedExplicitTools)
107
139
  : $.get(placementAllowedToolIds);
108
140
 
141
+ const providerEnabledConfiguredTools = configuredTools.filter((toolId) => isProviderEnabled(toolId));
142
+
109
143
  if (pnpResolver() && assessment() && itemRef()) {
110
144
  const allowedByPnp = pnpResolver().getAllowedToolIds(assessment(), itemRef());
111
145
 
112
- if (configuredTools.length === 0) return allowedByPnp;
146
+ if (providerEnabledConfiguredTools.length === 0) return allowedByPnp;
113
147
 
114
- return allowedByPnp.filter((toolId) => configuredTools.includes(toolId));
148
+ return allowedByPnp.filter((toolId) => providerEnabledConfiguredTools.includes(toolId));
115
149
  }
116
150
 
117
- return configuredTools;
151
+ return providerEnabledConfiguredTools;
118
152
  });
119
153
 
120
154
  const contentReady = $.derived(() => {
155
+ if ($.get(effectiveLevel) === 'section' || $.get(effectiveLevel) === 'assessment') return true;
156
+
121
157
  const config = $.get(effectiveItem)?.config;
122
158
 
123
159
  return !!($.get(effectiveItem) && config && typeof config === 'object');
124
160
  });
125
161
 
126
162
  const toolContext = $.derived(() => {
163
+ if ($.get(effectiveLevel) === 'section') {
164
+ return {
165
+ level: 'section',
166
+ assessment: assessment() || {},
167
+ section: {}
168
+ };
169
+ }
170
+
171
+ if ($.get(effectiveLevel) === 'assessment') {
172
+ return { level: 'assessment', assessment: assessment() || {} };
173
+ }
174
+
127
175
  if (!$.get(contentReady) || !$.get(effectiveItem)) {
128
176
  return null;
129
177
  }
130
178
 
179
+ if ($.get(effectiveLevel) === 'passage') {
180
+ return {
181
+ level: 'passage',
182
+ assessment: assessment() || {},
183
+ itemRef: itemRef() || { id: $.get(effectiveCanonicalItemId) },
184
+ passage: $.get(effectiveItem)
185
+ };
186
+ }
187
+
131
188
  return {
132
189
  level: 'item',
133
190
  assessment: assessment() || {},
@@ -148,6 +205,7 @@ export default function ItemToolBar($$anchor, $$props) {
148
205
  });
149
206
 
150
207
  const elementContexts = $.derived(() => {
208
+ if ($.get(effectiveLevel) !== 'item' && $.get(effectiveLevel) !== 'passage') return [];
151
209
  if (!$.get(contentReady) || !$.get(effectiveItem)) return [];
152
210
 
153
211
  const modelsRaw = $.get(effectiveItem)?.config?.models;
@@ -167,28 +225,44 @@ export default function ItemToolBar($$anchor, $$props) {
167
225
 
168
226
  // Pass 2: tool-owned context filtering (item + element aggregation)
169
227
  const visibleToolIds = $.derived(() => {
228
+ const levelCompatibleToolIds = $.get(allowedToolIds).filter((toolId) => {
229
+ const registration = $.get(effectiveToolRegistry).get(toolId);
230
+
231
+ return registration
232
+ ? registration.supportedLevels.includes($.get(effectiveLevel))
233
+ : false;
234
+ });
235
+
236
+ if ($.get(effectiveLevel) === 'section') {
237
+ // Section toolbars are orchestrator-driven. Tool-level relevance is often
238
+ // item-content dependent. Keep pass-1 as the source of truth here.
239
+ return $.get(allowedToolIds);
240
+ }
241
+
170
242
  if (!$.get(contentReady)) {
171
243
  // Stage 1: orchestrator-level allow-list only.
172
- return $.get(allowedToolIds);
244
+ return levelCompatibleToolIds;
173
245
  }
174
246
 
175
247
  if (!$.get(toolContext) && $.get(elementContexts).length === 0) {
176
- return $.get(allowedToolIds);
248
+ return levelCompatibleToolIds;
177
249
  }
178
250
 
179
251
  const visible = new Set();
180
252
 
181
253
  if ($.get(toolContext)) {
182
- $.get(effectiveToolRegistry).filterVisibleInContext($.get(allowedToolIds), $.get(toolContext)).forEach((tool) => visible.add(tool.toolId));
254
+ $.get(effectiveToolRegistry).filterVisibleInContext(levelCompatibleToolIds, $.get(toolContext)).forEach((tool) => visible.add(tool.toolId));
183
255
  }
184
256
 
185
257
  for (const context of $.get(elementContexts)) {
186
- $.get(effectiveToolRegistry).filterVisibleInContext($.get(allowedToolIds), context).forEach((tool) => visible.add(tool.toolId));
258
+ $.get(effectiveToolRegistry).filterVisibleInContext(levelCompatibleToolIds, context).forEach((tool) => visible.add(tool.toolId));
187
259
  }
188
260
 
189
261
  return Array.from(visible);
190
262
  });
191
263
 
264
+ const toolbarVisibleToolIds = $.derived(() => $.get(effectiveToolRegistry).filterToolIdsByActivation($.get(visibleToolIds), 'toolbar-toggle'));
265
+
192
266
  // Dynamically load whatever tools are currently visible.
193
267
  // The registry owns module loader configuration by toolId.
194
268
  $.user_effect(() => {
@@ -196,7 +270,7 @@ export default function ItemToolBar($$anchor, $$props) {
196
270
 
197
271
  let cancelled = false;
198
272
 
199
- void $.get(effectiveToolRegistry).ensureToolModulesLoaded($.get(visibleToolIds)).then(() => {
273
+ void $.get(effectiveToolRegistry).ensureToolModulesLoaded($.get(toolbarVisibleToolIds)).then(() => {
200
274
  if (!cancelled) $.set(moduleLoadVersion, $.get(moduleLoadVersion) + 1);
201
275
  }).catch((error) => {
202
276
  console.error('[ItemToolBar] Failed to load one or more tool modules:', error);
@@ -227,11 +301,20 @@ export default function ItemToolBar($$anchor, $$props) {
227
301
  // This keeps toolbar contracts stable across mixed registration implementations.
228
302
  return parseScopedToolId(toolId)
229
303
  ? toolId
230
- : createScopedToolId(toolId, 'item', $.get(effectiveCanonicalItemId));
304
+ : createScopedToolId(toolId, $.get(effectiveLevel), $.get(effectiveScopeId));
231
305
  };
232
306
 
233
307
  return {
234
- itemId: $.get(effectiveCanonicalItemId),
308
+ scope: {
309
+ level: $.get(effectiveLevel),
310
+ scopeId: $.get(effectiveScopeId),
311
+ assessmentId: $.get(runtimeContext)?.assessmentId,
312
+ sectionId: $.get(effectiveSectionId),
313
+ itemId: $.get(effectiveItemId),
314
+ canonicalItemId: $.get(effectiveCanonicalItemId),
315
+ contentKind: $.get(effectiveContentKind)
316
+ },
317
+ itemId: $.get(effectiveScopeId),
235
318
  catalogId: $.get(effectiveCatalogId),
236
319
  language: language(),
237
320
  ui: { size: size() },
@@ -244,7 +327,15 @@ export default function ItemToolBar($$anchor, $$props) {
244
327
  toggleTool: (toolId) => {
245
328
  if (!$.get(effectiveToolCoordinator)) return;
246
329
 
247
- $.get(effectiveToolCoordinator).toggleTool(toInstanceToolId(toolId));
330
+ const instanceToolId = toInstanceToolId(toolId);
331
+
332
+ // Some tools only self-register after first visibility sync.
333
+ // Seed a placeholder registration so first toggle always works.
334
+ if (!$.get(effectiveToolCoordinator).getToolState(instanceToolId)) {
335
+ $.get(effectiveToolCoordinator).registerTool(instanceToolId, toolId);
336
+ }
337
+
338
+ $.get(effectiveToolCoordinator).toggleTool(instanceToolId);
248
339
  },
249
340
 
250
341
  isToolVisible: (toolId) => {
@@ -267,7 +358,7 @@ export default function ItemToolBar($$anchor, $$props) {
267
358
 
268
359
  const rendered = [];
269
360
 
270
- for (const toolId of $.get(visibleToolIds)) {
361
+ for (const toolId of $.get(toolbarVisibleToolIds)) {
271
362
  const result = $.get(effectiveToolRegistry).renderForToolbar(toolId, $.get(renderContext), $.get(toolbarContext));
272
363
 
273
364
  if (result) {
@@ -278,6 +369,59 @@ export default function ItemToolBar($$anchor, $$props) {
278
369
  return rendered;
279
370
  });
280
371
 
372
+ const normalizedHostButtons = $.derived(() => Array.isArray(hostButtons())
373
+ ? hostButtons().filter((item) => !!item && typeof item.id === 'string')
374
+ : []);
375
+
376
+ const nativeToolbarItems = $.derived(() => $.get(renderedTools).filter((renderedTool) => !!renderedTool.button).map((renderedTool) => {
377
+ const button = renderedTool.button;
378
+
379
+ return {
380
+ id: renderedTool.toolId,
381
+ label: button.label,
382
+ ariaLabel: button.ariaLabel || button.label,
383
+ icon: button.icon,
384
+ tooltip: button.tooltip || button.label,
385
+ disabled: button.disabled,
386
+ active: $.get(activeToolState)[renderedTool.toolId] ?? button.active ?? false,
387
+ onClick: () => {
388
+ button.onClick();
389
+ syncRenderedToolsState();
390
+ }
391
+ };
392
+ }));
393
+
394
+ const toolbarItems = $.derived(() => [
395
+ ...$.get(nativeToolbarItems),
396
+ ...$.get(normalizedHostButtons)
397
+ ]);
398
+
399
+ const mountedElementsBeforeButtons = $.derived(() => $.get(renderedTools).flatMap((renderedTool) => (renderedTool.elements || []).filter((entry) => entry.mount === 'before-buttons').map((entry) => entry.element).filter((entry) => Boolean(entry))));
400
+ const mountedElementsAfterButtons = $.derived(() => $.get(renderedTools).flatMap((renderedTool) => (renderedTool.elements || []).filter((entry) => entry.mount === 'after-buttons').map((entry) => entry.element).filter((entry) => Boolean(entry))));
401
+
402
+ function isToolbarItemActive(item) {
403
+ if (item.id in $.get(activeToolState)) {
404
+ return $.get(activeToolState)[item.id] === true;
405
+ }
406
+
407
+ return item.active === true;
408
+ }
409
+
410
+ function getFallbackIconSvg(iconName) {
411
+ const iconMap = {
412
+ calculator: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M7 2h10a2 2 0 0 1 2 2v16a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2Zm0 2v4h10V4H7Zm0 6v2h2v-2H7Zm4 0v2h2v-2h-2Zm4 0v2h2v-2h-2Zm-8 4v2h2v-2H7Zm4 0v2h2v-2h-2Zm4 0v2h2v-2h-2Zm-8 4v2h2v-2H7Zm4 0v2h2v-2h-2Zm4 0v2h2v-2h-2Z" fill="currentColor"/></svg>',
413
+ 'volume-up': '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14 3.23v2.06A7.002 7.002 0 0 1 19 12a7 7 0 0 1-5 6.71v2.06c4.01-.91 7-4.49 7-8.77s-2.99-7.86-7-8.77Zm-2 17.75V3L7 8H3v8h4l5 5Zm4.5-9a4.5 4.5 0 0 0-2.5-4.03v8.05A4.5 4.5 0 0 0 16.5 12Z" fill="currentColor"/></svg>',
414
+ swatch: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 3a9 9 0 1 0 9 9c0-.55-.45-1-1-1h-2.5a1.5 1.5 0 0 1 0-3H20a1 1 0 0 0 1-1 8.99 8.99 0 0 0-9-4Zm-5.5 9A1.5 1.5 0 1 1 8 13.5 1.5 1.5 0 0 1 6.5 12Zm3-4A1.5 1.5 0 1 1 11 9.5 1.5 1.5 0 0 1 9.5 8Zm5 0A1.5 1.5 0 1 1 16 9.5 1.5 1.5 0 0 1 14.5 8Z" fill="currentColor"/></svg>',
415
+ 'chart-bar': '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4.75 5a.76.76 0 0 1 .75.75v11c0 .438.313.75.75.75h13a.76.76 0 0 1 .696 1.039.74.74 0 0 1-.696.461h-13C5 19 4 18 4 16.75v-11A.74.74 0 0 1 4.75 5ZM8 8.25a.74.74 0 0 1 .75-.75h6.5a.76.76 0 0 1 .696 1.039.74.74 0 0 1-.696.461h-6.5A.722.722 0 0 1 8 8.25Zm.75 2.25h4.5a.76.76 0 0 1 .696 1.039.74.74 0 0 1-.696.461h-4.5a.723.723 0 0 1-.75-.75.74.74 0 0 1 .75-.75Zm0 3h8.5a.76.76 0 0 1 .696 1.039.74.74 0 0 1-.696.461h-8.5a.723.723 0 0 1-.75-.75.74.74 0 0 1 .75-.75Z" fill="currentColor"/></svg>',
416
+ beaker: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M5 21c-.85 0-1.454-.38-1.813-1.137-.358-.759-.27-1.463.263-2.113L9 11V5H8a.968.968 0 0 1-.713-.287A.968.968 0 0 1 7 4c0-.283.096-.52.287-.712A.968.968 0 0 1 8 3h8c.283 0 .52.096.712.288.192.191.288.429.288.712s-.096.52-.288.713A.968.968 0 0 1 16 5h-1v6l5.55 6.75c.533.65.62 1.354.262 2.113C20.454 20.62 19.85 21 19 21H5Zm2-3h10l-3.4-4h-3.2L7 18Zm-2 1h14l-6-7.3V5h-2v6.7L5 19Z" fill="currentColor"/></svg>',
417
+ protractor: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m6.75 21-.25-2.2 2.85-7.85a3.95 3.95 0 0 0 1.75.95l-2.75 7.55L6.75 21Zm10.5 0-1.6-1.55-2.75-7.55a3.948 3.948 0 0 0 1.75-.95l2.85 7.85-.25 2.2ZM12 11a2.893 2.893 0 0 1-2.125-.875A2.893 2.893 0 0 1 9 8c0-.65.188-1.23.563-1.737A2.935 2.935 0 0 1 11 5.2V3h2v2.2c.583.2 1.063.554 1.438 1.063C14.812 6.77 15 7.35 15 8c0 .833-.292 1.542-.875 2.125A2.893 2.893 0 0 1 12 11Zm0-2c.283 0 .52-.096.713-.287A.967.967 0 0 0 13 8a.967.967 0 0 0-.287-.713A.968.968 0 0 0 12 7a.968.968 0 0 0-.713.287A.967.967 0 0 0 11 8c0 .283.096.52.287.713.192.191.43.287.713.287Z" fill="currentColor"/></svg>',
418
+ 'bars-3': '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M6.85 15c.517 0 .98-.15 1.388-.45.408-.3.695-.692.862-1.175l.375-1.15c.267-.8.2-1.537-.2-2.213C8.875 9.337 8.3 9 7.55 9H4.025l.475 3.925c.083.583.346 1.075.787 1.475.442.4.963.6 1.563.6Zm10.3 0c.6 0 1.12-.2 1.563-.6.441-.4.704-.892.787-1.475L19.975 9h-3.5c-.75 0-1.325.342-1.725 1.025-.4.683-.467 1.425-.2 2.225l.35 1.125c.167.483.454.875.862 1.175.409.3.871.45 1.388.45Zm-10.3 2c-1.1 0-2.063-.363-2.887-1.088a4.198 4.198 0 0 1-1.438-2.737L2 9H1V7h6.55c.733 0 1.404.18 2.013.537A3.906 3.906 0 0 1 11 9h2.025c.35-.617.83-1.104 1.438-1.463A3.892 3.892 0 0 1 16.474 7H23v2h-1l-.525 4.175a4.198 4.198 0 0 1-1.438 2.737A4.238 4.238 0 0 1 17.15 17c-.95 0-1.804-.27-2.562-.813A4.234 4.234 0 0 1 13 14.026l-.375-1.125a21.35 21.35 0 0 1-.1-.363 4.926 4.926 0 0 1-.1-.537h-.85c-.033.2-.067.363-.1.488a21.35 21.35 0 0 1-.1.362L11 14a4.3 4.3 0 0 1-1.588 2.175A4.258 4.258 0 0 1 6.85 17Z" fill="currentColor"/></svg>',
419
+ ruler: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m8.8 10.95 2.15-2.175-1.4-1.425-1.1 1.1-1.4-1.4 1.075-1.1L7 4.825 4.825 7 8.8 10.95Zm8.2 8.225L19.175 17l-1.125-1.125-1.1 1.075-1.4-1.4 1.075-1.1-1.425-1.4-2.15 2.15L17 19.175ZM7.25 21H3v-4.25l4.375-4.375L2 7l5-5 5.4 5.4 3.775-3.8c.2-.2.425-.35.675-.45a2.068 2.068 0 0 1 1.55 0c.25.1.475.25.675.45L20.4 4.95c.2.2.35.425.45.675.1.25.15.508.15.775a1.975 1.975 0 0 1-.6 1.425l-3.775 3.8L22 17l-5 5-5.375-5.375L7.25 21ZM5 19h1.4l9.8-9.775L14.775 7.8 5 17.6V19Z" fill="currentColor"/></svg>'
420
+ };
421
+
422
+ return iconMap[iconName] || null;
423
+ }
424
+
281
425
  function syncRenderedToolsState() {
282
426
  const nextActiveState = {};
283
427
 
@@ -356,6 +500,24 @@ export default function ItemToolBar($$anchor, $$props) {
356
500
  }
357
501
 
358
502
  var $$exports = {
503
+ get level() {
504
+ return level();
505
+ },
506
+
507
+ set level($$value) {
508
+ level($$value);
509
+ $.flush();
510
+ },
511
+
512
+ get scopeId() {
513
+ return scopeId();
514
+ },
515
+
516
+ set scopeId($$value) {
517
+ scopeId($$value);
518
+ $.flush();
519
+ },
520
+
359
521
  get itemId() {
360
522
  return itemId();
361
523
  },
@@ -365,6 +527,15 @@ export default function ItemToolBar($$anchor, $$props) {
365
527
  $.flush();
366
528
  },
367
529
 
530
+ get sectionId() {
531
+ return sectionId();
532
+ },
533
+
534
+ set sectionId($$value) {
535
+ sectionId($$value);
536
+ $.flush();
537
+ },
538
+
368
539
  get catalogId() {
369
540
  return catalogId();
370
541
  },
@@ -392,6 +563,15 @@ export default function ItemToolBar($$anchor, $$props) {
392
563
  $.flush();
393
564
  },
394
565
 
566
+ get position() {
567
+ return position();
568
+ },
569
+
570
+ set position($$value) {
571
+ position($$value);
572
+ $.flush();
573
+ },
574
+
395
575
  get scopeElement() {
396
576
  return scopeElement();
397
577
  },
@@ -446,6 +626,15 @@ export default function ItemToolBar($$anchor, $$props) {
446
626
  $.flush();
447
627
  },
448
628
 
629
+ get hostButtons() {
630
+ return hostButtons();
631
+ },
632
+
633
+ set hostButtons($$value) {
634
+ hostButtons($$value);
635
+ $.flush();
636
+ },
637
+
449
638
  get class() {
450
639
  return className();
451
640
  },
@@ -478,123 +667,261 @@ export default function ItemToolBar($$anchor, $$props) {
478
667
  var node_1 = $.first_child(fragment);
479
668
 
480
669
  {
481
- var consequent_5 = ($$anchor) => {
670
+ var consequent_9 = ($$anchor) => {
482
671
  var div = root_1();
672
+ let classes;
673
+ var node_2 = $.child(div);
483
674
 
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();
675
+ $.each(node_2, 17, () => $.get(mountedElementsBeforeButtons), (mountedElement) => `before-${mountedElement.tagName}-${mountedElement.getAttribute('tool-id') || ''}`, ($$anchor, mountedElement) => {
676
+ var span = root_2();
491
677
 
492
- $.action(span, ($$node, $$action_arg) => mountElement?.($$node, $$action_arg), () => $.get(renderedTool).inlineElement);
493
- $.append($$anchor, span);
494
- };
678
+ $.action(span, ($$node, $$action_arg) => mountElement?.($$node, $$action_arg), () => $.get(mountedElement));
679
+ $.append($$anchor, span);
680
+ });
495
681
 
496
- $.if(node_2, ($$render) => {
497
- if ($.get(renderedTool).inlineElement) $$render(consequent);
498
- });
499
- }
682
+ var node_3 = $.sibling(node_2, 2);
500
683
 
501
- var node_3 = $.sibling(node_2, 2);
684
+ $.each(node_3, 17, () => $.get(toolbarItems), (item) => item.id, ($$anchor, item, $$index_1, $$array) => {
685
+ var fragment_1 = $.comment();
686
+ var node_4 = $.first_child(fragment_1);
502
687
 
503
688
  {
504
- var consequent_3 = ($$anchor) => {
505
- var button = root_4();
506
- let classes;
507
- var node_4 = $.child(button);
689
+ var consequent_4 = ($$anchor) => {
690
+ var a = root_4();
691
+ let classes_1;
692
+ var node_5 = $.child(a);
508
693
 
509
694
  {
510
- var consequent_1 = ($$anchor) => {
695
+ var consequent_3 = ($$anchor) => {
511
696
  var fragment_2 = $.comment();
512
- var node_5 = $.first_child(fragment_2);
697
+ var node_6 = $.first_child(fragment_2);
513
698
 
514
- $.html(node_5, () => $.get(renderedTool).button.icon);
515
- $.append($$anchor, fragment_2);
516
- };
699
+ {
700
+ var consequent = ($$anchor) => {
701
+ var fragment_3 = $.comment();
702
+ var node_7 = $.first_child(fragment_3);
517
703
 
518
- var d = $.derived(() => $.get(renderedTool).button.icon.startsWith('<svg'));
704
+ $.html(node_7, () => $.get(item).icon);
705
+ $.append($$anchor, fragment_3);
706
+ };
519
707
 
520
- var consequent_2 = ($$anchor) => {
521
- var img = root_6();
708
+ var d = $.derived(() => isInlineSvgIcon($.get(item).icon));
522
709
 
523
- $.template_effect(() => $.set_attribute(img, 'src', $.get(renderedTool).button.icon));
524
- $.append($$anchor, img);
525
- };
710
+ var consequent_1 = ($$anchor) => {
711
+ var img = root_7();
712
+
713
+ $.template_effect(() => $.set_attribute(img, 'src', $.get(item).icon));
714
+ $.append($$anchor, img);
715
+ };
716
+
717
+ var d_1 = $.derived(() => isExternalIconUrl($.get(item).icon));
718
+
719
+ var alternate_1 = ($$anchor) => {
720
+ const fallbackIcon = $.derived(() => getFallbackIconSvg($.get(item).icon));
721
+ var fragment_4 = $.comment();
722
+ var node_8 = $.first_child(fragment_4);
723
+
724
+ {
725
+ var consequent_2 = ($$anchor) => {
726
+ var fragment_5 = $.comment();
727
+ var node_9 = $.first_child(fragment_5);
728
+
729
+ $.html(node_9, () => $.get(fallbackIcon));
730
+ $.append($$anchor, fragment_5);
731
+ };
526
732
 
527
- var d_1 = $.derived(() => $.get(renderedTool).button.icon.startsWith('http'));
733
+ var alternate = ($$anchor) => {
734
+ var i = root_10();
528
735
 
529
- var alternate = ($$anchor) => {
530
- var i = root_7();
736
+ $.template_effect(() => $.set_class(i, 1, `icon icon-${$.get(item).icon}`, 'svelte-rnx3ie'));
737
+ $.append($$anchor, i);
738
+ };
531
739
 
532
- $.template_effect(() => $.set_class(i, 1, `icon icon-${$.get(renderedTool).button.icon}`, 'svelte-rnx3ie'));
533
- $.append($$anchor, i);
740
+ $.if(node_8, ($$render) => {
741
+ if ($.get(fallbackIcon)) $$render(consequent_2); else $$render(alternate, false);
742
+ });
743
+ }
744
+
745
+ $.append($$anchor, fragment_4);
746
+ };
747
+
748
+ $.if(node_6, ($$render) => {
749
+ if ($.get(d)) $$render(consequent); else if ($.get(d_1)) $$render(consequent_1, 1); else $$render(alternate_1, false);
750
+ });
751
+ }
752
+
753
+ $.append($$anchor, fragment_2);
534
754
  };
535
755
 
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);
756
+ $.if(node_5, ($$render) => {
757
+ if ($.get(item).icon) $$render(consequent_3);
538
758
  });
539
759
  }
540
760
 
541
- $.reset(button);
761
+ $.reset(a);
762
+
763
+ $.template_effect(
764
+ ($0) => {
765
+ classes_1 = $.set_class(a, 1, 'item-toolbar__button svelte-rnx3ie', null, classes_1, $0);
766
+ $.set_attribute(a, 'href', $.get(item).disabled ? undefined : $.get(item).href);
767
+ $.set_attribute(a, 'target', $.get(item).target);
768
+ $.set_attribute(a, 'rel', $.get(item).rel);
769
+ $.set_attribute(a, 'aria-label', $.get(item).ariaLabel || $.get(item).label);
770
+ $.set_attribute(a, 'title', $.get(item).tooltip || $.get(item).label);
771
+ $.set_attribute(a, 'aria-disabled', $.get(item).disabled ? 'true' : undefined);
772
+ },
773
+ [
774
+ () => ({
775
+ 'item-toolbar__button--active': isToolbarItemActive($.get(item))
776
+ })
777
+ ]
778
+ );
779
+
780
+ $.delegated('click', a, (event) => {
781
+ if ($.get(item).disabled) {
782
+ event.preventDefault();
783
+ }
784
+ });
542
785
 
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
- });
786
+ $.append($$anchor, a);
787
+ };
547
788
 
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
- });
789
+ var d_2 = $.derived(() => isToolbarLinkItem($.get(item)));
553
790
 
554
- $.delegated('click', button, () => {
555
- $.get(renderedTool).button?.onClick();
556
- syncRenderedToolsState();
557
- });
791
+ var alternate_4 = ($$anchor) => {
792
+ var button_1 = root_11();
793
+ let classes_2;
794
+ var node_10 = $.child(button_1);
558
795
 
559
- $.append($$anchor, button);
560
- };
796
+ {
797
+ var consequent_8 = ($$anchor) => {
798
+ var fragment_6 = $.comment();
799
+ var node_11 = $.first_child(fragment_6);
561
800
 
562
- $.if(node_3, ($$render) => {
563
- if ($.get(renderedTool).button) $$render(consequent_3);
564
- });
565
- }
801
+ {
802
+ var consequent_5 = ($$anchor) => {
803
+ var fragment_7 = $.comment();
804
+ var node_12 = $.first_child(fragment_7);
566
805
 
567
- var node_6 = $.sibling(node_3, 2);
806
+ $.html(node_12, () => $.get(item).icon);
807
+ $.append($$anchor, fragment_7);
808
+ };
568
809
 
569
- {
570
- var consequent_4 = ($$anchor) => {
571
- var span_1 = root_8();
810
+ var d_3 = $.derived(() => isInlineSvgIcon($.get(item).icon));
811
+
812
+ var consequent_6 = ($$anchor) => {
813
+ var img_1 = root_14();
814
+
815
+ $.template_effect(() => $.set_attribute(img_1, 'src', $.get(item).icon));
816
+ $.append($$anchor, img_1);
817
+ };
818
+
819
+ var d_4 = $.derived(() => isExternalIconUrl($.get(item).icon));
820
+
821
+ var alternate_3 = ($$anchor) => {
822
+ const fallbackIcon = $.derived(() => getFallbackIconSvg($.get(item).icon));
823
+ var fragment_8 = $.comment();
824
+ var node_13 = $.first_child(fragment_8);
825
+
826
+ {
827
+ var consequent_7 = ($$anchor) => {
828
+ var fragment_9 = $.comment();
829
+ var node_14 = $.first_child(fragment_9);
830
+
831
+ $.html(node_14, () => $.get(fallbackIcon));
832
+ $.append($$anchor, fragment_9);
833
+ };
834
+
835
+ var alternate_2 = ($$anchor) => {
836
+ var i_1 = root_17();
837
+
838
+ $.template_effect(() => $.set_class(i_1, 1, `icon icon-${$.get(item).icon}`, 'svelte-rnx3ie'));
839
+ $.append($$anchor, i_1);
840
+ };
841
+
842
+ $.if(node_13, ($$render) => {
843
+ if ($.get(fallbackIcon)) $$render(consequent_7); else $$render(alternate_2, false);
844
+ });
845
+ }
572
846
 
573
- $.action(span_1, ($$node, $$action_arg) => mountElement?.($$node, $$action_arg), () => $.get(renderedTool).overlayElement);
574
- $.append($$anchor, span_1);
847
+ $.append($$anchor, fragment_8);
848
+ };
849
+
850
+ $.if(node_11, ($$render) => {
851
+ if ($.get(d_3)) $$render(consequent_5); else if ($.get(d_4)) $$render(consequent_6, 1); else $$render(alternate_3, false);
852
+ });
853
+ }
854
+
855
+ $.append($$anchor, fragment_6);
856
+ };
857
+
858
+ $.if(node_10, ($$render) => {
859
+ if ($.get(item).icon) $$render(consequent_8);
860
+ });
861
+ }
862
+
863
+ $.reset(button_1);
864
+
865
+ $.template_effect(
866
+ ($0, $1) => {
867
+ classes_2 = $.set_class(button_1, 1, 'item-toolbar__button svelte-rnx3ie', null, classes_2, $0);
868
+ $.set_attribute(button_1, 'aria-label', $.get(item).ariaLabel || $.get(item).label);
869
+ $.set_attribute(button_1, 'aria-pressed', $1);
870
+ $.set_attribute(button_1, 'title', $.get(item).tooltip || $.get(item).label);
871
+ button_1.disabled = $.get(item).disabled;
872
+ },
873
+ [
874
+ () => ({
875
+ 'item-toolbar__button--active': isToolbarItemActive($.get(item))
876
+ }),
877
+ () => isToolbarItemActive($.get(item))
878
+ ]
879
+ );
880
+
881
+ $.delegated('click', button_1, function (...$$args) {
882
+ $.get(item).onClick?.apply(this, $$args);
883
+ });
884
+
885
+ $.append($$anchor, button_1);
575
886
  };
576
887
 
577
- $.if(node_6, ($$render) => {
578
- if ($.get(renderedTool).overlayElement) $$render(consequent_4);
888
+ $.if(node_4, ($$render) => {
889
+ if ($.get(d_2)) $$render(consequent_4); else $$render(alternate_4, false);
579
890
  });
580
891
  }
581
892
 
582
893
  $.append($$anchor, fragment_1);
583
894
  });
584
895
 
896
+ var node_15 = $.sibling(node_3, 2);
897
+
898
+ $.each(node_15, 17, () => $.get(mountedElementsAfterButtons), (mountedElement) => `after-${mountedElement.tagName}-${mountedElement.getAttribute('tool-id') || ''}`, ($$anchor, mountedElement) => {
899
+ var span_1 = root_18();
900
+
901
+ $.action(span_1, ($$node, $$action_arg) => mountElement?.($$node, $$action_arg), () => $.get(mountedElement));
902
+ $.append($$anchor, span_1);
903
+ });
904
+
585
905
  $.reset(div);
586
906
  $.bind_this(div, ($$value) => $.set(toolbarRootElement, $$value), () => $.get(toolbarRootElement));
587
907
 
588
908
  $.template_effect(() => {
589
- $.set_class(div, 1, `item-toolbar ${className() ?? ''} item-toolbar--${size() ?? ''}`, 'svelte-rnx3ie');
909
+ classes = $.set_class(div, 1, `item-toolbar ${className() ?? ''} item-toolbar--${size() ?? ''}`, 'svelte-rnx3ie', classes, {
910
+ 'item-toolbar--top': position() === 'top',
911
+ 'item-toolbar--right': position() === 'right',
912
+ 'item-toolbar--bottom': position() === 'bottom',
913
+ 'item-toolbar--left': position() === 'left'
914
+ });
915
+
590
916
  $.set_attribute(div, 'data-content-kind', $.get(effectiveContentKind));
917
+ $.set_attribute(div, 'data-level', $.get(effectiveLevel));
591
918
  });
592
919
 
593
920
  $.append($$anchor, div);
594
921
  };
595
922
 
596
923
  $.if(node_1, ($$render) => {
597
- if (isBrowser) $$render(consequent_5);
924
+ if (isBrowser) $$render(consequent_9);
598
925
  });
599
926
  }
600
927
 
@@ -608,10 +935,14 @@ $.delegate(['click']);
608
935
  customElements.define('pie-item-toolbar', $.create_custom_element(
609
936
  ItemToolBar,
610
937
  {
938
+ level: { attribute: 'level', type: 'String' },
939
+ scopeId: { attribute: 'scope-id', type: 'String' },
611
940
  itemId: { attribute: 'item-id', type: 'String' },
941
+ sectionId: { attribute: 'section-id', type: 'String' },
612
942
  catalogId: { attribute: 'catalog-id', type: 'String' },
613
943
  tools: { attribute: 'tools', type: 'String' },
614
944
  contentKind: { attribute: 'content-kind', type: 'String' },
945
+ position: { attribute: 'position', type: 'String' },
615
946
  size: { attribute: 'size', type: 'String' },
616
947
  language: { attribute: 'language', type: 'String' },
617
948
  scopeElement: { type: 'Object' },
@@ -620,6 +951,7 @@ customElements.define('pie-item-toolbar', $.create_custom_element(
620
951
  assessment: { type: 'Object' },
621
952
  itemRef: { type: 'Object' },
622
953
  item: { type: 'Object' },
954
+ hostButtons: { type: 'Object' },
623
955
  class: {}
624
956
  },
625
957
  [],