@pie-players/pie-assessment-toolkit 0.3.2 → 0.3.4

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 (90) hide show
  1. package/README.md +5 -8
  2. package/dist/components/ItemToolBar.custom-element.js +539 -94
  3. package/dist/index.d.ts +1 -2
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +1 -1
  6. package/dist/index.js.map +1 -1
  7. package/dist/services/PNPToolResolver.d.ts.map +1 -1
  8. package/dist/services/PNPToolResolver.js +4 -1
  9. package/dist/services/PNPToolResolver.js.map +1 -1
  10. package/dist/services/ToolRegistry.d.ts +51 -0
  11. package/dist/services/ToolRegistry.d.ts.map +1 -1
  12. package/dist/services/ToolRegistry.js +60 -0
  13. package/dist/services/ToolRegistry.js.map +1 -1
  14. package/dist/services/ToolkitCoordinator.d.ts +12 -24
  15. package/dist/services/ToolkitCoordinator.d.ts.map +1 -1
  16. package/dist/services/ToolkitCoordinator.js +60 -99
  17. package/dist/services/ToolkitCoordinator.js.map +1 -1
  18. package/dist/services/defaultPersonalNeedsProfile.js +2 -2
  19. package/dist/services/defaultPersonalNeedsProfile.js.map +1 -1
  20. package/dist/services/interfaces.d.ts +8 -3
  21. package/dist/services/interfaces.d.ts.map +1 -1
  22. package/dist/services/interfaces.js.map +1 -1
  23. package/dist/services/pnp-standard-features.d.ts +1 -1
  24. package/dist/services/tool-providers/index.d.ts +0 -4
  25. package/dist/services/tool-providers/index.d.ts.map +1 -1
  26. package/dist/services/tool-providers/index.js +0 -2
  27. package/dist/services/tool-providers/index.js.map +1 -1
  28. package/dist/services/tools-config-normalizer.d.ts +40 -3
  29. package/dist/services/tools-config-normalizer.d.ts.map +1 -1
  30. package/dist/services/tools-config-normalizer.js +86 -11
  31. package/dist/services/tools-config-normalizer.js.map +1 -1
  32. package/dist/tools/client.d.ts +0 -2
  33. package/dist/tools/client.d.ts.map +1 -1
  34. package/dist/tools/client.js +0 -4
  35. package/dist/tools/client.js.map +1 -1
  36. package/dist/tools/default-tool-module-loaders.js +1 -1
  37. package/dist/tools/default-tool-module-loaders.js.map +1 -1
  38. package/dist/tools/library-loader.d.ts.map +1 -1
  39. package/dist/tools/library-loader.js +0 -35
  40. package/dist/tools/library-loader.js.map +1 -1
  41. package/dist/tools/registrations/accessibility-tools.d.ts.map +1 -1
  42. package/dist/tools/registrations/accessibility-tools.js +44 -41
  43. package/dist/tools/registrations/accessibility-tools.js.map +1 -1
  44. package/dist/tools/registrations/calculator.d.ts.map +1 -1
  45. package/dist/tools/registrations/calculator.js +50 -2
  46. package/dist/tools/registrations/calculator.js.map +1 -1
  47. package/dist/tools/registrations/interaction-tools.d.ts.map +1 -1
  48. package/dist/tools/registrations/interaction-tools.js +22 -28
  49. package/dist/tools/registrations/interaction-tools.js.map +1 -1
  50. package/dist/tools/registrations/measurement-tools.d.ts.map +1 -1
  51. package/dist/tools/registrations/measurement-tools.js +19 -27
  52. package/dist/tools/registrations/measurement-tools.js.map +1 -1
  53. package/dist/tools/registrations/subject-specific-tools.d.ts.map +1 -1
  54. package/dist/tools/registrations/subject-specific-tools.js +53 -37
  55. package/dist/tools/registrations/subject-specific-tools.js.map +1 -1
  56. package/dist/tools/registrations/toolbar-registration-helpers.d.ts +15 -0
  57. package/dist/tools/registrations/toolbar-registration-helpers.d.ts.map +1 -0
  58. package/dist/tools/registrations/toolbar-registration-helpers.js +22 -0
  59. package/dist/tools/registrations/toolbar-registration-helpers.js.map +1 -0
  60. package/dist/tools/registrations/tts.d.ts.map +1 -1
  61. package/dist/tools/registrations/tts.js +49 -0
  62. package/dist/tools/registrations/tts.js.map +1 -1
  63. package/dist/tools/types.d.ts +1 -1
  64. package/dist/tools/types.d.ts.map +1 -1
  65. package/dist/tools/types.js.map +1 -1
  66. package/package.json +8 -10
  67. package/dist/services/tool-providers/MathJsToolProvider.d.ts +0 -25
  68. package/dist/services/tool-providers/MathJsToolProvider.d.ts.map +0 -1
  69. package/dist/services/tool-providers/MathJsToolProvider.js +0 -53
  70. package/dist/services/tool-providers/MathJsToolProvider.js.map +0 -1
  71. package/dist/services/tool-providers/TIToolProvider.d.ts +0 -107
  72. package/dist/services/tool-providers/TIToolProvider.d.ts.map +0 -1
  73. package/dist/services/tool-providers/TIToolProvider.js +0 -123
  74. package/dist/services/tool-providers/TIToolProvider.js.map +0 -1
  75. package/dist/tools/calculators/mathjs-provider.d.ts +0 -50
  76. package/dist/tools/calculators/mathjs-provider.d.ts.map +0 -1
  77. package/dist/tools/calculators/mathjs-provider.js +0 -660
  78. package/dist/tools/calculators/mathjs-provider.js.map +0 -1
  79. package/dist/tools/calculators/ti-provider.d.ts +0 -122
  80. package/dist/tools/calculators/ti-provider.d.ts.map +0 -1
  81. package/dist/tools/calculators/ti-provider.js +0 -710
  82. package/dist/tools/calculators/ti-provider.js.map +0 -1
  83. package/src/README.md +0 -626
  84. package/src/components/ItemToolBar.svelte +0 -717
  85. package/src/components/PieAssessmentToolkit.svelte +0 -681
  86. package/src/components/SectionToolBar.svelte +0 -58
  87. package/src/components/ToolButton.svelte +0 -146
  88. package/src/components/ToolButtonGroup.svelte +0 -125
  89. package/src/tools/README.md +0 -617
  90. package/src/tools/calculators/README.md +0 -395
@@ -13,14 +13,16 @@ import { DEFAULT_TOOL_MODULE_LOADERS } from '../tools/default-tool-module-loader
13
13
  import { normalizeToolsConfig, parseToolList, resolveToolsForLevel } from '../services/tools-config-normalizer.js';
14
14
  import { createScopedToolId, parseScopedToolId } from '../services/tool-instance-id.js';
15
15
 
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>`);
16
+ var root_3 = $.from_html(`<span class="item-toolbar__element-host svelte-rnx3ie"></span>`);
17
+ var root_4 = $.from_html(`<span class="item-toolbar__element-host svelte-rnx3ie"></span>`);
18
+ var root_9 = $.from_html(`<img class="item-toolbar__icon-image svelte-rnx3ie" alt=""/>`);
19
+ var root_12 = $.from_html(`<i aria-hidden="true"></i>`);
20
+ var root_6 = $.from_html(`<a><!></a>`);
21
+ var root_16 = $.from_html(`<img class="item-toolbar__icon-image svelte-rnx3ie" alt=""/>`);
22
+ var root_19 = $.from_html(`<i aria-hidden="true"></i>`);
23
+ var root_13 = $.from_html(`<button type="button"><!></button>`);
24
+ var root_21 = $.from_html(`<span class="item-toolbar__element-host svelte-rnx3ie"></span>`);
25
+ var root_22 = $.from_html(`<span class="item-toolbar__element-host svelte-rnx3ie"></span>`);
24
26
  var root_1 = $.from_html(`<div><!> <!> <!></div>`);
25
27
 
26
28
  const $$css = {
@@ -130,7 +132,22 @@ export default function ItemToolBar($$anchor, $$props) {
130
132
  });
131
133
 
132
134
  const providerConfig = $.derived(() => $.get(effectiveToolsConfig)?.providers || {});
133
- const isProviderEnabled = (toolId) => $.get(providerConfig)[toolId]?.enabled !== false;
135
+
136
+ const normalizedProviderConfig = $.derived(() => {
137
+ const normalized = {};
138
+
139
+ for (const [toolId, config] of Object.entries($.get(providerConfig))) {
140
+ const canonicalToolId = $.get(effectiveToolRegistry).normalizeToolId(toolId);
141
+
142
+ if (!canonicalToolId) continue;
143
+
144
+ normalized[canonicalToolId] = config;
145
+ }
146
+
147
+ return normalized;
148
+ });
149
+
150
+ const isProviderEnabled = (toolId) => $.get(normalizedProviderConfig)[toolId]?.enabled !== false;
134
151
 
135
152
  // Pass 1: determine allowed tools
136
153
  const allowedToolIds = $.derived(() => {
@@ -139,16 +156,17 @@ export default function ItemToolBar($$anchor, $$props) {
139
156
  : $.get(placementAllowedToolIds);
140
157
 
141
158
  const providerEnabledConfiguredTools = configuredTools.filter((toolId) => isProviderEnabled(toolId));
159
+ const dedupe = (toolIds) => Array.from(new Set(toolIds));
142
160
 
143
161
  if (pnpResolver() && assessment() && itemRef()) {
144
- const allowedByPnp = pnpResolver().getAllowedToolIds(assessment(), itemRef());
162
+ const allowedByPnp = dedupe($.get(effectiveToolRegistry).normalizeToolIds(pnpResolver().getAllowedToolIds(assessment(), itemRef()))).filter(Boolean);
145
163
 
146
164
  if (providerEnabledConfiguredTools.length === 0) return allowedByPnp;
147
165
 
148
- return allowedByPnp.filter((toolId) => providerEnabledConfiguredTools.includes(toolId));
166
+ return dedupe(allowedByPnp.filter((toolId) => providerEnabledConfiguredTools.includes(toolId)));
149
167
  }
150
168
 
151
- return providerEnabledConfiguredTools;
169
+ return dedupe(providerEnabledConfiguredTools);
152
170
  });
153
171
 
154
172
  const contentReady = $.derived(() => {
@@ -396,8 +414,27 @@ export default function ItemToolBar($$anchor, $$props) {
396
414
  ...$.get(normalizedHostButtons)
397
415
  ]);
398
416
 
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))));
417
+ const renderedToolActiveById = $.derived(() => {
418
+ const result = {};
419
+
420
+ for (const renderedTool of $.get(renderedTools)) {
421
+ result[renderedTool.toolId] = $.get(activeToolState)[renderedTool.toolId] ?? renderedTool.button?.active ?? false;
422
+ }
423
+
424
+ return result;
425
+ });
426
+
427
+ const mountedElementsBeforeButtons = $.derived(() => $.get(renderedTools).flatMap((renderedTool) => (renderedTool.elements || []).filter((entry) => entry.mount === 'before-buttons').filter((entry) => Boolean(entry.element)).map((entry, index) => ({
428
+ key: `before-${renderedTool.toolId}-${index}`,
429
+ toolId: renderedTool.toolId,
430
+ entry
431
+ }))));
432
+
433
+ const mountedElementsAfterButtons = $.derived(() => $.get(renderedTools).flatMap((renderedTool) => (renderedTool.elements || []).filter((entry) => entry.mount === 'after-buttons').filter((entry) => Boolean(entry.element)).map((entry, index) => ({
434
+ key: `after-${renderedTool.toolId}-${index}`,
435
+ toolId: renderedTool.toolId,
436
+ entry
437
+ }))));
401
438
 
402
439
  function isToolbarItemActive(item) {
403
440
  if (item.id in $.get(activeToolState)) {
@@ -499,6 +536,366 @@ export default function ItemToolBar($$anchor, $$props) {
499
536
  };
500
537
  }
501
538
 
539
+ function mountElementWithShell(node, args) {
540
+ let currentArgs = args;
541
+ let shellEl = null;
542
+ let headerEl = null;
543
+ let contentEl = null;
544
+ let titleEl = null;
545
+ let closeButtonEl = null;
546
+ let resizeHandleEl = null;
547
+ let mountedContentElement = null;
548
+ let dragPointerId = null;
549
+ let resizePointerId = null;
550
+ let dragOffsetX = 0;
551
+ let dragOffsetY = 0;
552
+ let resizeStartWidth = 0;
553
+ let resizeStartHeight = 0;
554
+ let resizeStartX = 0;
555
+ let resizeStartY = 0;
556
+ let x = 0;
557
+ let y = 0;
558
+ let width = currentArgs.mounted.entry.shell?.initialWidth ?? 720;
559
+ let height = currentArgs.mounted.entry.shell?.initialHeight ?? 560;
560
+
561
+ const getHostedContext = () => {
562
+ const shellConfig = currentArgs.mounted.entry.shell;
563
+
564
+ if (!shellConfig) return null;
565
+
566
+ return {
567
+ toolId: currentArgs.mounted.toolId,
568
+ toolbarContext: $.get(toolbarContext),
569
+ shellConfig
570
+ };
571
+ };
572
+
573
+ const notifyHostedMount = (element) => {
574
+ const registration = $.get(effectiveToolRegistry).get(currentArgs.mounted.toolId);
575
+ const context = getHostedContext();
576
+
577
+ if (!registration?.onHostedMount || !context) return;
578
+
579
+ void registration.onHostedMount(element, context);
580
+ };
581
+
582
+ const notifyHostedResize = () => {
583
+ const registration = $.get(effectiveToolRegistry).get(currentArgs.mounted.toolId);
584
+ const context = getHostedContext();
585
+
586
+ if (!registration?.onHostedResize || !context) return;
587
+
588
+ void registration.onHostedResize({ width, height }, currentArgs.mounted.entry.element, context);
589
+ };
590
+
591
+ const notifyHostedUnmount = () => {
592
+ const registration = $.get(effectiveToolRegistry).get(currentArgs.mounted.toolId);
593
+ const context = getHostedContext();
594
+
595
+ if (!registration?.onHostedUnmount || !context) return;
596
+
597
+ void registration.onHostedUnmount(currentArgs.mounted.entry.element, context);
598
+ };
599
+
600
+ const clamp = (value, min, max) => Math.max(min, Math.min(value, max));
601
+
602
+ const applyShellStyle = () => {
603
+ if (!shellEl) return;
604
+
605
+ shellEl.style.left = `${x}px`;
606
+ shellEl.style.top = `${y}px`;
607
+ shellEl.style.width = `${width}px`;
608
+ shellEl.style.height = `${height}px`;
609
+ shellEl.style.display = currentArgs.active ? 'flex' : 'none';
610
+ };
611
+
612
+ const mountContent = () => {
613
+ if (!contentEl) return;
614
+
615
+ const element = currentArgs.mounted.entry.element;
616
+
617
+ element.style.display = 'block';
618
+ element.style.width = '100%';
619
+ element.style.height = '100%';
620
+ element.style.flex = '1 1 auto';
621
+ element.style.minHeight = '0';
622
+
623
+ if (mountedContentElement && mountedContentElement !== element) {
624
+ if (mountedContentElement.parentNode === contentEl) {
625
+ contentEl.removeChild(mountedContentElement);
626
+ }
627
+
628
+ mountedContentElement = null;
629
+ }
630
+
631
+ if (element.parentNode && element.parentNode !== contentEl) {
632
+ element.parentNode.removeChild(element);
633
+ }
634
+
635
+ if (element.parentNode !== contentEl) {
636
+ contentEl.appendChild(element);
637
+ }
638
+
639
+ mountedContentElement = element;
640
+ notifyHostedMount(element);
641
+ };
642
+
643
+ const bringToFront = () => {
644
+ if ($.get(effectiveToolCoordinator) && shellEl) {
645
+ $.get(effectiveToolCoordinator).bringToFront(shellEl);
646
+ }
647
+ };
648
+
649
+ const centerShell = () => {
650
+ const viewportW = window.innerWidth;
651
+ const viewportH = window.innerHeight;
652
+
653
+ x = Math.max(0, Math.round((viewportW - width) / 2));
654
+ y = Math.max(0, Math.round((viewportH - height) / 2));
655
+ };
656
+
657
+ const closeShell = () => {
658
+ $.get(toolbarContext).toggleTool(currentArgs.mounted.toolId);
659
+ syncRenderedToolsState();
660
+ };
661
+
662
+ const onHeaderPointerDown = (event) => {
663
+ if (!currentArgs.mounted.entry.shell?.draggable) return;
664
+
665
+ const target = event.target;
666
+
667
+ if (target.closest('button')) return;
668
+ if (!shellEl) return;
669
+
670
+ dragPointerId = event.pointerId;
671
+ dragOffsetX = event.clientX - x;
672
+ dragOffsetY = event.clientY - y;
673
+ shellEl.setPointerCapture(event.pointerId);
674
+ bringToFront();
675
+ };
676
+
677
+ const onResizePointerDown = (event) => {
678
+ if (!shellEl || !currentArgs.mounted.entry.shell?.resizable) return;
679
+
680
+ event.stopPropagation();
681
+ resizePointerId = event.pointerId;
682
+ resizeStartWidth = width;
683
+ resizeStartHeight = height;
684
+ resizeStartX = event.clientX;
685
+ resizeStartY = event.clientY;
686
+ shellEl.setPointerCapture(event.pointerId);
687
+ bringToFront();
688
+ };
689
+
690
+ const onShellPointerMove = (event) => {
691
+ if (!shellEl) return;
692
+
693
+ if (dragPointerId === event.pointerId) {
694
+ const maxX = Math.max(0, window.innerWidth - width);
695
+ const maxY = Math.max(0, window.innerHeight - height);
696
+
697
+ x = clamp(event.clientX - dragOffsetX, 0, maxX);
698
+ y = clamp(event.clientY - dragOffsetY, 0, maxY);
699
+ applyShellStyle();
700
+
701
+ return;
702
+ }
703
+
704
+ if (resizePointerId === event.pointerId) {
705
+ const shellConfig = currentArgs.mounted.entry.shell;
706
+ const minWidth = shellConfig?.minWidth ?? 320;
707
+ const minHeight = shellConfig?.minHeight ?? 240;
708
+ const maxWidth = shellConfig?.maxWidth ?? window.innerWidth;
709
+ const maxHeight = shellConfig?.maxHeight ?? window.innerHeight;
710
+
711
+ width = clamp(resizeStartWidth + (event.clientX - resizeStartX), minWidth, Math.max(minWidth, Math.min(maxWidth, window.innerWidth - x)));
712
+ height = clamp(resizeStartHeight + (event.clientY - resizeStartY), minHeight, Math.max(minHeight, Math.min(maxHeight, window.innerHeight - y)));
713
+ applyShellStyle();
714
+ notifyHostedResize();
715
+ }
716
+ };
717
+
718
+ const onShellPointerUp = (event) => {
719
+ if (!shellEl) return;
720
+
721
+ if (dragPointerId === event.pointerId) {
722
+ dragPointerId = null;
723
+ shellEl.releasePointerCapture(event.pointerId);
724
+ }
725
+
726
+ if (resizePointerId === event.pointerId) {
727
+ resizePointerId = null;
728
+ shellEl.releasePointerCapture(event.pointerId);
729
+ }
730
+ };
731
+
732
+ const onWindowResize = () => {
733
+ const maxX = Math.max(0, window.innerWidth - width);
734
+ const maxY = Math.max(0, window.innerHeight - height);
735
+
736
+ x = clamp(x, 0, maxX);
737
+ y = clamp(y, 0, maxY);
738
+ applyShellStyle();
739
+ };
740
+
741
+ if (isBrowser && currentArgs.mounted.entry.shell) {
742
+ shellEl = document.createElement('div');
743
+ shellEl.className = 'pie-tool-shell';
744
+ shellEl.setAttribute('data-pie-tool-shell', currentArgs.mounted.toolId);
745
+ shellEl.style.position = 'fixed';
746
+ shellEl.style.zIndex = '2000';
747
+ shellEl.style.background = 'var(--pie-background, #fff)';
748
+ shellEl.style.border = '1px solid var(--pie-border-light, #d1d5db)';
749
+ shellEl.style.borderRadius = '12px';
750
+ shellEl.style.boxShadow = '0 10px 40px rgb(0 0 0 / 0.25)';
751
+ shellEl.style.overflow = 'hidden';
752
+ shellEl.style.display = currentArgs.active ? 'flex' : 'none';
753
+ shellEl.style.flexDirection = 'column';
754
+ headerEl = document.createElement('div');
755
+ headerEl.className = 'pie-tool-shell__header';
756
+ headerEl.style.display = 'flex';
757
+ headerEl.style.alignItems = 'center';
758
+ headerEl.style.justifyContent = 'space-between';
759
+ headerEl.style.padding = '10px 12px';
760
+ headerEl.style.background = 'var(--pie-primary-dark, #2c3e50)';
761
+ headerEl.style.color = 'var(--pie-white, #fff)';
762
+ headerEl.style.cursor = currentArgs.mounted.entry.shell.draggable === false ? 'default' : 'move';
763
+ headerEl.style.flex = '0 0 auto';
764
+ titleEl = document.createElement('span');
765
+ titleEl.className = 'pie-tool-shell__title';
766
+ titleEl.textContent = currentArgs.mounted.entry.shell.title || currentArgs.mounted.toolId;
767
+ headerEl.appendChild(titleEl);
768
+ closeButtonEl = document.createElement('button');
769
+ closeButtonEl.type = 'button';
770
+ closeButtonEl.className = 'pie-tool-shell__close';
771
+ closeButtonEl.setAttribute('aria-label', 'Close tool');
772
+ 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>';
773
+
774
+ const closeIconEl = closeButtonEl.querySelector('svg');
775
+
776
+ if (closeIconEl) {
777
+ closeIconEl.style.width = '16px';
778
+ closeIconEl.style.height = '16px';
779
+ closeIconEl.style.display = 'block';
780
+ closeIconEl.style.flexShrink = '0';
781
+ closeIconEl.style.pointerEvents = 'none';
782
+ }
783
+
784
+ closeButtonEl.style.border = '1px solid transparent';
785
+ closeButtonEl.style.background = 'color-mix(in srgb, var(--pie-white, #fff) 8%, transparent)';
786
+ closeButtonEl.style.color = 'inherit';
787
+ closeButtonEl.style.cursor = 'pointer';
788
+ closeButtonEl.style.display = 'inline-flex';
789
+ closeButtonEl.style.alignItems = 'center';
790
+ closeButtonEl.style.justifyContent = 'center';
791
+ closeButtonEl.style.width = '28px';
792
+ closeButtonEl.style.height = '28px';
793
+ closeButtonEl.style.padding = '0';
794
+ closeButtonEl.style.borderRadius = '8px';
795
+ closeButtonEl.style.lineHeight = '0';
796
+ closeButtonEl.style.transition = 'background-color 0.15s ease, border-color 0.15s ease';
797
+ closeButtonEl.style.display = currentArgs.mounted.entry.shell.closeable === false ? 'none' : 'inline-flex';
798
+
799
+ closeButtonEl.onmouseenter = () => {
800
+ closeButtonEl && (closeButtonEl.style.background = 'color-mix(in srgb, var(--pie-white, #fff) 18%, transparent)');
801
+ };
802
+
803
+ closeButtonEl.onmouseleave = () => {
804
+ closeButtonEl && (closeButtonEl.style.background = 'color-mix(in srgb, var(--pie-white, #fff) 8%, transparent)');
805
+ };
806
+
807
+ closeButtonEl.onfocus = () => {
808
+ closeButtonEl && (closeButtonEl.style.outline = '2px solid var(--pie-button-focus-outline, var(--pie-primary, #4A90E2))');
809
+ closeButtonEl && (closeButtonEl.style.outlineOffset = '2px');
810
+ };
811
+
812
+ closeButtonEl.onblur = () => {
813
+ closeButtonEl && (closeButtonEl.style.outline = 'none');
814
+ closeButtonEl && (closeButtonEl.style.outlineOffset = '0');
815
+ };
816
+
817
+ closeButtonEl.onclick = closeShell;
818
+ headerEl.appendChild(closeButtonEl);
819
+ contentEl = document.createElement('div');
820
+ contentEl.className = 'pie-tool-shell__content';
821
+ contentEl.style.position = 'relative';
822
+ contentEl.style.width = '100%';
823
+ contentEl.style.flex = '1 1 auto';
824
+ contentEl.style.minHeight = '0';
825
+ shellEl.appendChild(headerEl);
826
+ shellEl.appendChild(contentEl);
827
+
828
+ if (currentArgs.mounted.entry.shell.resizable !== false) {
829
+ resizeHandleEl = document.createElement('div');
830
+ resizeHandleEl.className = 'pie-tool-shell__resize';
831
+ resizeHandleEl.style.position = 'absolute';
832
+ resizeHandleEl.style.right = '0';
833
+ resizeHandleEl.style.bottom = '0';
834
+ resizeHandleEl.style.width = '16px';
835
+ resizeHandleEl.style.height = '16px';
836
+ resizeHandleEl.style.cursor = 'nwse-resize';
837
+ resizeHandleEl.style.background = 'linear-gradient(135deg, transparent 0%, transparent 40%, rgba(0,0,0,0.35) 40%, rgba(0,0,0,0.35) 60%, transparent 60%, transparent 100%)';
838
+ shellEl.appendChild(resizeHandleEl);
839
+ resizeHandleEl.addEventListener('pointerdown', onResizePointerDown);
840
+ }
841
+
842
+ headerEl.addEventListener('pointerdown', onHeaderPointerDown);
843
+ shellEl.addEventListener('pointermove', onShellPointerMove);
844
+ shellEl.addEventListener('pointerup', onShellPointerUp);
845
+ shellEl.addEventListener('pointerdown', bringToFront);
846
+ window.addEventListener('resize', onWindowResize);
847
+ document.body.appendChild(shellEl);
848
+ centerShell();
849
+ applyShellStyle();
850
+ mountContent();
851
+ notifyHostedResize();
852
+ }
853
+
854
+ return {
855
+ update(nextArgs) {
856
+ currentArgs = nextArgs;
857
+
858
+ if (!shellEl || !contentEl || !titleEl || !closeButtonEl) return;
859
+
860
+ titleEl.textContent = currentArgs.mounted.entry.shell?.title || currentArgs.mounted.toolId;
861
+ closeButtonEl.style.display = currentArgs.mounted.entry.shell?.closeable === false ? 'none' : 'inline-flex';
862
+ mountContent();
863
+ applyShellStyle();
864
+ notifyHostedResize();
865
+ },
866
+
867
+ destroy() {
868
+ notifyHostedUnmount();
869
+
870
+ if (resizeHandleEl) {
871
+ resizeHandleEl.removeEventListener('pointerdown', onResizePointerDown);
872
+ }
873
+
874
+ if (headerEl) {
875
+ headerEl.removeEventListener('pointerdown', onHeaderPointerDown);
876
+ }
877
+
878
+ if (shellEl) {
879
+ shellEl.removeEventListener('pointermove', onShellPointerMove);
880
+ shellEl.removeEventListener('pointerup', onShellPointerUp);
881
+ shellEl.removeEventListener('pointerdown', bringToFront);
882
+ }
883
+
884
+ window.removeEventListener('resize', onWindowResize);
885
+
886
+ if (mountedContentElement && contentEl && mountedContentElement.parentNode === contentEl) {
887
+ contentEl.removeChild(mountedContentElement);
888
+ }
889
+
890
+ mountedContentElement = null;
891
+
892
+ if (shellEl && shellEl.parentElement) {
893
+ shellEl.remove();
894
+ }
895
+ }
896
+ };
897
+ }
898
+
502
899
  var $$exports = {
503
900
  get level() {
504
901
  return level();
@@ -667,48 +1064,72 @@ export default function ItemToolBar($$anchor, $$props) {
667
1064
  var node_1 = $.first_child(fragment);
668
1065
 
669
1066
  {
670
- var consequent_9 = ($$anchor) => {
1067
+ var consequent_11 = ($$anchor) => {
671
1068
  var div = root_1();
672
1069
  let classes;
673
1070
  var node_2 = $.child(div);
674
1071
 
675
- $.each(node_2, 17, () => $.get(mountedElementsBeforeButtons), (mountedElement) => `before-${mountedElement.tagName}-${mountedElement.getAttribute('tool-id') || ''}`, ($$anchor, mountedElement) => {
676
- var span = root_2();
1072
+ $.each(node_2, 17, () => $.get(mountedElementsBeforeButtons), (mounted) => mounted.key, ($$anchor, mounted) => {
1073
+ var fragment_1 = $.comment();
1074
+ var node_3 = $.first_child(fragment_1);
1075
+
1076
+ {
1077
+ var consequent = ($$anchor) => {
1078
+ var span = root_3();
1079
+
1080
+ $.action(span, ($$node, $$action_arg) => mountElementWithShell?.($$node, $$action_arg), () => ({
1081
+ mounted: $.get(mounted),
1082
+ active: $.get(renderedToolActiveById)[$.get(mounted).toolId] ?? false
1083
+ }));
1084
+
1085
+ $.append($$anchor, span);
1086
+ };
1087
+
1088
+ var alternate = ($$anchor) => {
1089
+ var span_1 = root_4();
1090
+
1091
+ $.action(span_1, ($$node, $$action_arg) => mountElement?.($$node, $$action_arg), () => $.get(mounted).entry.element);
1092
+ $.append($$anchor, span_1);
1093
+ };
1094
+
1095
+ $.if(node_3, ($$render) => {
1096
+ if ($.get(mounted).entry.shell) $$render(consequent); else $$render(alternate, -1);
1097
+ });
1098
+ }
677
1099
 
678
- $.action(span, ($$node, $$action_arg) => mountElement?.($$node, $$action_arg), () => $.get(mountedElement));
679
- $.append($$anchor, span);
1100
+ $.append($$anchor, fragment_1);
680
1101
  });
681
1102
 
682
- var node_3 = $.sibling(node_2, 2);
1103
+ var node_4 = $.sibling(node_2, 2);
683
1104
 
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);
1105
+ $.each(node_4, 17, () => $.get(toolbarItems), (item) => item.id, ($$anchor, item, $$index_1, $$array) => {
1106
+ var fragment_2 = $.comment();
1107
+ var node_5 = $.first_child(fragment_2);
687
1108
 
688
1109
  {
689
- var consequent_4 = ($$anchor) => {
690
- var a = root_4();
1110
+ var consequent_5 = ($$anchor) => {
1111
+ var a = root_6();
691
1112
  let classes_1;
692
- var node_5 = $.child(a);
1113
+ var node_6 = $.child(a);
693
1114
 
694
1115
  {
695
- var consequent_3 = ($$anchor) => {
696
- var fragment_2 = $.comment();
697
- var node_6 = $.first_child(fragment_2);
1116
+ var consequent_4 = ($$anchor) => {
1117
+ var fragment_3 = $.comment();
1118
+ var node_7 = $.first_child(fragment_3);
698
1119
 
699
1120
  {
700
- var consequent = ($$anchor) => {
701
- var fragment_3 = $.comment();
702
- var node_7 = $.first_child(fragment_3);
1121
+ var consequent_1 = ($$anchor) => {
1122
+ var fragment_4 = $.comment();
1123
+ var node_8 = $.first_child(fragment_4);
703
1124
 
704
- $.html(node_7, () => $.get(item).icon);
705
- $.append($$anchor, fragment_3);
1125
+ $.html(node_8, () => $.get(item).icon);
1126
+ $.append($$anchor, fragment_4);
706
1127
  };
707
1128
 
708
1129
  var d = $.derived(() => isInlineSvgIcon($.get(item).icon));
709
1130
 
710
- var consequent_1 = ($$anchor) => {
711
- var img = root_7();
1131
+ var consequent_2 = ($$anchor) => {
1132
+ var img = root_9();
712
1133
 
713
1134
  $.template_effect(() => $.set_attribute(img, 'src', $.get(item).icon));
714
1135
  $.append($$anchor, img);
@@ -716,45 +1137,45 @@ export default function ItemToolBar($$anchor, $$props) {
716
1137
 
717
1138
  var d_1 = $.derived(() => isExternalIconUrl($.get(item).icon));
718
1139
 
719
- var alternate_1 = ($$anchor) => {
1140
+ var alternate_2 = ($$anchor) => {
720
1141
  const fallbackIcon = $.derived(() => getFallbackIconSvg($.get(item).icon));
721
- var fragment_4 = $.comment();
722
- var node_8 = $.first_child(fragment_4);
1142
+ var fragment_5 = $.comment();
1143
+ var node_9 = $.first_child(fragment_5);
723
1144
 
724
1145
  {
725
- var consequent_2 = ($$anchor) => {
726
- var fragment_5 = $.comment();
727
- var node_9 = $.first_child(fragment_5);
1146
+ var consequent_3 = ($$anchor) => {
1147
+ var fragment_6 = $.comment();
1148
+ var node_10 = $.first_child(fragment_6);
728
1149
 
729
- $.html(node_9, () => $.get(fallbackIcon));
730
- $.append($$anchor, fragment_5);
1150
+ $.html(node_10, () => $.get(fallbackIcon));
1151
+ $.append($$anchor, fragment_6);
731
1152
  };
732
1153
 
733
- var alternate = ($$anchor) => {
734
- var i = root_10();
1154
+ var alternate_1 = ($$anchor) => {
1155
+ var i = root_12();
735
1156
 
736
1157
  $.template_effect(() => $.set_class(i, 1, `icon icon-${$.get(item).icon}`, 'svelte-rnx3ie'));
737
1158
  $.append($$anchor, i);
738
1159
  };
739
1160
 
740
- $.if(node_8, ($$render) => {
741
- if ($.get(fallbackIcon)) $$render(consequent_2); else $$render(alternate, false);
1161
+ $.if(node_9, ($$render) => {
1162
+ if ($.get(fallbackIcon)) $$render(consequent_3); else $$render(alternate_1, -1);
742
1163
  });
743
1164
  }
744
1165
 
745
- $.append($$anchor, fragment_4);
1166
+ $.append($$anchor, fragment_5);
746
1167
  };
747
1168
 
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);
1169
+ $.if(node_7, ($$render) => {
1170
+ if ($.get(d)) $$render(consequent_1); else if ($.get(d_1)) $$render(consequent_2, 1); else $$render(alternate_2, -1);
750
1171
  });
751
1172
  }
752
1173
 
753
- $.append($$anchor, fragment_2);
1174
+ $.append($$anchor, fragment_3);
754
1175
  };
755
1176
 
756
- $.if(node_5, ($$render) => {
757
- if ($.get(item).icon) $$render(consequent_3);
1177
+ $.if(node_6, ($$render) => {
1178
+ if ($.get(item).icon) $$render(consequent_4);
758
1179
  });
759
1180
  }
760
1181
 
@@ -788,29 +1209,29 @@ export default function ItemToolBar($$anchor, $$props) {
788
1209
 
789
1210
  var d_2 = $.derived(() => isToolbarLinkItem($.get(item)));
790
1211
 
791
- var alternate_4 = ($$anchor) => {
792
- var button_1 = root_11();
1212
+ var alternate_5 = ($$anchor) => {
1213
+ var button_1 = root_13();
793
1214
  let classes_2;
794
- var node_10 = $.child(button_1);
1215
+ var node_11 = $.child(button_1);
795
1216
 
796
1217
  {
797
- var consequent_8 = ($$anchor) => {
798
- var fragment_6 = $.comment();
799
- var node_11 = $.first_child(fragment_6);
1218
+ var consequent_9 = ($$anchor) => {
1219
+ var fragment_7 = $.comment();
1220
+ var node_12 = $.first_child(fragment_7);
800
1221
 
801
1222
  {
802
- var consequent_5 = ($$anchor) => {
803
- var fragment_7 = $.comment();
804
- var node_12 = $.first_child(fragment_7);
1223
+ var consequent_6 = ($$anchor) => {
1224
+ var fragment_8 = $.comment();
1225
+ var node_13 = $.first_child(fragment_8);
805
1226
 
806
- $.html(node_12, () => $.get(item).icon);
807
- $.append($$anchor, fragment_7);
1227
+ $.html(node_13, () => $.get(item).icon);
1228
+ $.append($$anchor, fragment_8);
808
1229
  };
809
1230
 
810
1231
  var d_3 = $.derived(() => isInlineSvgIcon($.get(item).icon));
811
1232
 
812
- var consequent_6 = ($$anchor) => {
813
- var img_1 = root_14();
1233
+ var consequent_7 = ($$anchor) => {
1234
+ var img_1 = root_16();
814
1235
 
815
1236
  $.template_effect(() => $.set_attribute(img_1, 'src', $.get(item).icon));
816
1237
  $.append($$anchor, img_1);
@@ -818,45 +1239,45 @@ export default function ItemToolBar($$anchor, $$props) {
818
1239
 
819
1240
  var d_4 = $.derived(() => isExternalIconUrl($.get(item).icon));
820
1241
 
821
- var alternate_3 = ($$anchor) => {
1242
+ var alternate_4 = ($$anchor) => {
822
1243
  const fallbackIcon = $.derived(() => getFallbackIconSvg($.get(item).icon));
823
- var fragment_8 = $.comment();
824
- var node_13 = $.first_child(fragment_8);
1244
+ var fragment_9 = $.comment();
1245
+ var node_14 = $.first_child(fragment_9);
825
1246
 
826
1247
  {
827
- var consequent_7 = ($$anchor) => {
828
- var fragment_9 = $.comment();
829
- var node_14 = $.first_child(fragment_9);
1248
+ var consequent_8 = ($$anchor) => {
1249
+ var fragment_10 = $.comment();
1250
+ var node_15 = $.first_child(fragment_10);
830
1251
 
831
- $.html(node_14, () => $.get(fallbackIcon));
832
- $.append($$anchor, fragment_9);
1252
+ $.html(node_15, () => $.get(fallbackIcon));
1253
+ $.append($$anchor, fragment_10);
833
1254
  };
834
1255
 
835
- var alternate_2 = ($$anchor) => {
836
- var i_1 = root_17();
1256
+ var alternate_3 = ($$anchor) => {
1257
+ var i_1 = root_19();
837
1258
 
838
1259
  $.template_effect(() => $.set_class(i_1, 1, `icon icon-${$.get(item).icon}`, 'svelte-rnx3ie'));
839
1260
  $.append($$anchor, i_1);
840
1261
  };
841
1262
 
842
- $.if(node_13, ($$render) => {
843
- if ($.get(fallbackIcon)) $$render(consequent_7); else $$render(alternate_2, false);
1263
+ $.if(node_14, ($$render) => {
1264
+ if ($.get(fallbackIcon)) $$render(consequent_8); else $$render(alternate_3, -1);
844
1265
  });
845
1266
  }
846
1267
 
847
- $.append($$anchor, fragment_8);
1268
+ $.append($$anchor, fragment_9);
848
1269
  };
849
1270
 
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);
1271
+ $.if(node_12, ($$render) => {
1272
+ if ($.get(d_3)) $$render(consequent_6); else if ($.get(d_4)) $$render(consequent_7, 1); else $$render(alternate_4, -1);
852
1273
  });
853
1274
  }
854
1275
 
855
- $.append($$anchor, fragment_6);
1276
+ $.append($$anchor, fragment_7);
856
1277
  };
857
1278
 
858
- $.if(node_10, ($$render) => {
859
- if ($.get(item).icon) $$render(consequent_8);
1279
+ $.if(node_11, ($$render) => {
1280
+ if ($.get(item).icon) $$render(consequent_9);
860
1281
  });
861
1282
  }
862
1283
 
@@ -885,21 +1306,45 @@ export default function ItemToolBar($$anchor, $$props) {
885
1306
  $.append($$anchor, button_1);
886
1307
  };
887
1308
 
888
- $.if(node_4, ($$render) => {
889
- if ($.get(d_2)) $$render(consequent_4); else $$render(alternate_4, false);
1309
+ $.if(node_5, ($$render) => {
1310
+ if ($.get(d_2)) $$render(consequent_5); else $$render(alternate_5, -1);
890
1311
  });
891
1312
  }
892
1313
 
893
- $.append($$anchor, fragment_1);
1314
+ $.append($$anchor, fragment_2);
894
1315
  });
895
1316
 
896
- var node_15 = $.sibling(node_3, 2);
1317
+ var node_16 = $.sibling(node_4, 2);
1318
+
1319
+ $.each(node_16, 17, () => $.get(mountedElementsAfterButtons), (mounted) => mounted.key, ($$anchor, mounted) => {
1320
+ var fragment_11 = $.comment();
1321
+ var node_17 = $.first_child(fragment_11);
897
1322
 
898
- $.each(node_15, 17, () => $.get(mountedElementsAfterButtons), (mountedElement) => `after-${mountedElement.tagName}-${mountedElement.getAttribute('tool-id') || ''}`, ($$anchor, mountedElement) => {
899
- var span_1 = root_18();
1323
+ {
1324
+ var consequent_10 = ($$anchor) => {
1325
+ var span_2 = root_21();
1326
+
1327
+ $.action(span_2, ($$node, $$action_arg) => mountElementWithShell?.($$node, $$action_arg), () => ({
1328
+ mounted: $.get(mounted),
1329
+ active: $.get(renderedToolActiveById)[$.get(mounted).toolId] ?? false
1330
+ }));
1331
+
1332
+ $.append($$anchor, span_2);
1333
+ };
1334
+
1335
+ var alternate_6 = ($$anchor) => {
1336
+ var span_3 = root_22();
1337
+
1338
+ $.action(span_3, ($$node, $$action_arg) => mountElement?.($$node, $$action_arg), () => $.get(mounted).entry.element);
1339
+ $.append($$anchor, span_3);
1340
+ };
1341
+
1342
+ $.if(node_17, ($$render) => {
1343
+ if ($.get(mounted).entry.shell) $$render(consequent_10); else $$render(alternate_6, -1);
1344
+ });
1345
+ }
900
1346
 
901
- $.action(span_1, ($$node, $$action_arg) => mountElement?.($$node, $$action_arg), () => $.get(mountedElement));
902
- $.append($$anchor, span_1);
1347
+ $.append($$anchor, fragment_11);
903
1348
  });
904
1349
 
905
1350
  $.reset(div);
@@ -921,7 +1366,7 @@ export default function ItemToolBar($$anchor, $$props) {
921
1366
  };
922
1367
 
923
1368
  $.if(node_1, ($$render) => {
924
- if (isBrowser) $$render(consequent_9);
1369
+ if (isBrowser) $$render(consequent_11);
925
1370
  });
926
1371
  }
927
1372