@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.
- package/README.md +5 -8
- package/dist/components/ItemToolBar.custom-element.js +539 -94
- package/dist/index.d.ts +1 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/services/PNPToolResolver.d.ts.map +1 -1
- package/dist/services/PNPToolResolver.js +4 -1
- package/dist/services/PNPToolResolver.js.map +1 -1
- package/dist/services/ToolRegistry.d.ts +51 -0
- package/dist/services/ToolRegistry.d.ts.map +1 -1
- package/dist/services/ToolRegistry.js +60 -0
- package/dist/services/ToolRegistry.js.map +1 -1
- package/dist/services/ToolkitCoordinator.d.ts +12 -24
- package/dist/services/ToolkitCoordinator.d.ts.map +1 -1
- package/dist/services/ToolkitCoordinator.js +60 -99
- package/dist/services/ToolkitCoordinator.js.map +1 -1
- package/dist/services/defaultPersonalNeedsProfile.js +2 -2
- package/dist/services/defaultPersonalNeedsProfile.js.map +1 -1
- package/dist/services/interfaces.d.ts +8 -3
- package/dist/services/interfaces.d.ts.map +1 -1
- package/dist/services/interfaces.js.map +1 -1
- package/dist/services/pnp-standard-features.d.ts +1 -1
- package/dist/services/tool-providers/index.d.ts +0 -4
- package/dist/services/tool-providers/index.d.ts.map +1 -1
- package/dist/services/tool-providers/index.js +0 -2
- package/dist/services/tool-providers/index.js.map +1 -1
- package/dist/services/tools-config-normalizer.d.ts +40 -3
- package/dist/services/tools-config-normalizer.d.ts.map +1 -1
- package/dist/services/tools-config-normalizer.js +86 -11
- package/dist/services/tools-config-normalizer.js.map +1 -1
- package/dist/tools/client.d.ts +0 -2
- package/dist/tools/client.d.ts.map +1 -1
- package/dist/tools/client.js +0 -4
- package/dist/tools/client.js.map +1 -1
- package/dist/tools/default-tool-module-loaders.js +1 -1
- package/dist/tools/default-tool-module-loaders.js.map +1 -1
- package/dist/tools/library-loader.d.ts.map +1 -1
- package/dist/tools/library-loader.js +0 -35
- package/dist/tools/library-loader.js.map +1 -1
- package/dist/tools/registrations/accessibility-tools.d.ts.map +1 -1
- package/dist/tools/registrations/accessibility-tools.js +44 -41
- package/dist/tools/registrations/accessibility-tools.js.map +1 -1
- package/dist/tools/registrations/calculator.d.ts.map +1 -1
- package/dist/tools/registrations/calculator.js +50 -2
- package/dist/tools/registrations/calculator.js.map +1 -1
- package/dist/tools/registrations/interaction-tools.d.ts.map +1 -1
- package/dist/tools/registrations/interaction-tools.js +22 -28
- package/dist/tools/registrations/interaction-tools.js.map +1 -1
- package/dist/tools/registrations/measurement-tools.d.ts.map +1 -1
- package/dist/tools/registrations/measurement-tools.js +19 -27
- package/dist/tools/registrations/measurement-tools.js.map +1 -1
- package/dist/tools/registrations/subject-specific-tools.d.ts.map +1 -1
- package/dist/tools/registrations/subject-specific-tools.js +53 -37
- package/dist/tools/registrations/subject-specific-tools.js.map +1 -1
- package/dist/tools/registrations/toolbar-registration-helpers.d.ts +15 -0
- package/dist/tools/registrations/toolbar-registration-helpers.d.ts.map +1 -0
- package/dist/tools/registrations/toolbar-registration-helpers.js +22 -0
- package/dist/tools/registrations/toolbar-registration-helpers.js.map +1 -0
- package/dist/tools/registrations/tts.d.ts.map +1 -1
- package/dist/tools/registrations/tts.js +49 -0
- package/dist/tools/registrations/tts.js.map +1 -1
- package/dist/tools/types.d.ts +1 -1
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/types.js.map +1 -1
- package/package.json +8 -10
- package/dist/services/tool-providers/MathJsToolProvider.d.ts +0 -25
- package/dist/services/tool-providers/MathJsToolProvider.d.ts.map +0 -1
- package/dist/services/tool-providers/MathJsToolProvider.js +0 -53
- package/dist/services/tool-providers/MathJsToolProvider.js.map +0 -1
- package/dist/services/tool-providers/TIToolProvider.d.ts +0 -107
- package/dist/services/tool-providers/TIToolProvider.d.ts.map +0 -1
- package/dist/services/tool-providers/TIToolProvider.js +0 -123
- package/dist/services/tool-providers/TIToolProvider.js.map +0 -1
- package/dist/tools/calculators/mathjs-provider.d.ts +0 -50
- package/dist/tools/calculators/mathjs-provider.d.ts.map +0 -1
- package/dist/tools/calculators/mathjs-provider.js +0 -660
- package/dist/tools/calculators/mathjs-provider.js.map +0 -1
- package/dist/tools/calculators/ti-provider.d.ts +0 -122
- package/dist/tools/calculators/ti-provider.d.ts.map +0 -1
- package/dist/tools/calculators/ti-provider.js +0 -710
- package/dist/tools/calculators/ti-provider.js.map +0 -1
- package/src/README.md +0 -626
- package/src/components/ItemToolBar.svelte +0 -717
- package/src/components/PieAssessmentToolkit.svelte +0 -681
- package/src/components/SectionToolBar.svelte +0 -58
- package/src/components/ToolButton.svelte +0 -146
- package/src/components/ToolButtonGroup.svelte +0 -125
- package/src/tools/README.md +0 -617
- package/src/tools/calculators/README.md +0 -395
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
<svelte:options
|
|
2
|
-
customElement={{
|
|
3
|
-
tag: "pie-section-toolbar",
|
|
4
|
-
shadow: "none",
|
|
5
|
-
props: {
|
|
6
|
-
enabledTools: { type: "String", attribute: "enabled-tools" },
|
|
7
|
-
position: { type: "String", attribute: "position" },
|
|
8
|
-
sectionId: { type: "String", attribute: "section-id" },
|
|
9
|
-
size: { type: "String", attribute: "size" },
|
|
10
|
-
language: { type: "String", attribute: "language" },
|
|
11
|
-
toolRegistry: { type: "Object", reflect: false },
|
|
12
|
-
pnpResolver: { type: "Object", reflect: false },
|
|
13
|
-
assessment: { type: "Object", reflect: false },
|
|
14
|
-
itemRef: { type: "Object", reflect: false },
|
|
15
|
-
item: { type: "Object", reflect: false },
|
|
16
|
-
hostButtons: { type: "Object", reflect: false },
|
|
17
|
-
},
|
|
18
|
-
}}
|
|
19
|
-
/>
|
|
20
|
-
|
|
21
|
-
<script lang="ts">
|
|
22
|
-
import "./item-toolbar-element.js";
|
|
23
|
-
import type { ToolRegistry } from "../services/ToolRegistry.js";
|
|
24
|
-
import type { PNPToolResolver } from "../services/PNPToolResolver.js";
|
|
25
|
-
import type { AssessmentEntity, AssessmentItemRef, ItemEntity } from "@pie-players/pie-players-shared/types";
|
|
26
|
-
import type { ToolbarItem } from "../services/toolbar-items.js";
|
|
27
|
-
|
|
28
|
-
let {
|
|
29
|
-
enabledTools = "",
|
|
30
|
-
position = "bottom",
|
|
31
|
-
sectionId = "",
|
|
32
|
-
size = "md" as "sm" | "md" | "lg",
|
|
33
|
-
language = "en-US",
|
|
34
|
-
toolRegistry = null as ToolRegistry | null,
|
|
35
|
-
pnpResolver = null as PNPToolResolver | null,
|
|
36
|
-
assessment = null as AssessmentEntity | null,
|
|
37
|
-
itemRef = null as AssessmentItemRef | null,
|
|
38
|
-
item = null as ItemEntity | null,
|
|
39
|
-
hostButtons = [] as ToolbarItem[],
|
|
40
|
-
} = $props();
|
|
41
|
-
</script>
|
|
42
|
-
|
|
43
|
-
<pie-item-toolbar
|
|
44
|
-
level="section"
|
|
45
|
-
scope-id={sectionId}
|
|
46
|
-
section-id={sectionId}
|
|
47
|
-
tools={enabledTools}
|
|
48
|
-
content-kind="section"
|
|
49
|
-
position={position}
|
|
50
|
-
{size}
|
|
51
|
-
{language}
|
|
52
|
-
{toolRegistry}
|
|
53
|
-
{pnpResolver}
|
|
54
|
-
{assessment}
|
|
55
|
-
{itemRef}
|
|
56
|
-
{item}
|
|
57
|
-
{hostButtons}
|
|
58
|
-
></pie-item-toolbar>
|
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
/**
|
|
3
|
-
* ToolButton
|
|
4
|
-
*
|
|
5
|
-
* Generic button component for rendering tool buttons in toolbars.
|
|
6
|
-
* Uses ToolToolbarButtonDefinition from ToolRegistry for consistent rendering.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import type { ToolToolbarButtonDefinition } from "../services/ToolRegistry.js";
|
|
10
|
-
|
|
11
|
-
// Props
|
|
12
|
-
let {
|
|
13
|
-
button,
|
|
14
|
-
class: className = "",
|
|
15
|
-
}: {
|
|
16
|
-
button: ToolToolbarButtonDefinition;
|
|
17
|
-
class?: string;
|
|
18
|
-
} = $props();
|
|
19
|
-
|
|
20
|
-
// Handle button click
|
|
21
|
-
function handleClick() {
|
|
22
|
-
if (!button.disabled && button.onClick) {
|
|
23
|
-
button.onClick();
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
// Derive button classes
|
|
28
|
-
const buttonClasses = $derived(
|
|
29
|
-
[
|
|
30
|
-
"tool-button",
|
|
31
|
-
button.className,
|
|
32
|
-
className,
|
|
33
|
-
button.disabled ? "tool-button--disabled" : "",
|
|
34
|
-
]
|
|
35
|
-
.filter(Boolean)
|
|
36
|
-
.join(" "),
|
|
37
|
-
);
|
|
38
|
-
</script>
|
|
39
|
-
|
|
40
|
-
<button
|
|
41
|
-
type="button"
|
|
42
|
-
class={buttonClasses}
|
|
43
|
-
disabled={button.disabled}
|
|
44
|
-
aria-label={button.ariaLabel}
|
|
45
|
-
title={button.tooltip || button.label}
|
|
46
|
-
onclick={handleClick}
|
|
47
|
-
data-tool-id={button.toolId}
|
|
48
|
-
>
|
|
49
|
-
{#if button.icon}
|
|
50
|
-
<span class="tool-button__icon" aria-hidden="true">
|
|
51
|
-
{#if button.icon.startsWith("<svg")}
|
|
52
|
-
<!-- Inline SVG -->
|
|
53
|
-
{@html button.icon}
|
|
54
|
-
{:else if button.icon.startsWith("http")}
|
|
55
|
-
<!-- External image URL -->
|
|
56
|
-
<img src={button.icon} alt="" />
|
|
57
|
-
{:else}
|
|
58
|
-
<!-- Icon name/class -->
|
|
59
|
-
<i class={`icon icon-${button.icon}`}></i>
|
|
60
|
-
{/if}
|
|
61
|
-
</span>
|
|
62
|
-
{/if}
|
|
63
|
-
<span class="tool-button__label">{button.label}</span>
|
|
64
|
-
</button>
|
|
65
|
-
|
|
66
|
-
<style>
|
|
67
|
-
.tool-button {
|
|
68
|
-
display: inline-flex;
|
|
69
|
-
align-items: center;
|
|
70
|
-
gap: 0.5rem;
|
|
71
|
-
padding: 0.5rem 1rem;
|
|
72
|
-
background: var(--pie-button-bg, #ffffff);
|
|
73
|
-
border: 1px solid var(--pie-button-border, #d1d5db);
|
|
74
|
-
border-radius: 0.375rem;
|
|
75
|
-
color: var(--pie-button-color, #374151);
|
|
76
|
-
font-size: 0.875rem;
|
|
77
|
-
font-weight: 500;
|
|
78
|
-
cursor: pointer;
|
|
79
|
-
transition: all 0.15s ease-in-out;
|
|
80
|
-
white-space: nowrap;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
.tool-button:hover:not(:disabled) {
|
|
84
|
-
background: var(--pie-button-hover-bg, #f9fafb);
|
|
85
|
-
border-color: var(--pie-button-hover-border, #9ca3af);
|
|
86
|
-
color: var(--pie-button-hover-color, #111827);
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
.tool-button:active:not(:disabled) {
|
|
90
|
-
background: var(--pie-button-active-bg, #f3f4f6);
|
|
91
|
-
transform: translateY(1px);
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
.tool-button:focus-visible {
|
|
95
|
-
outline: 2px solid var(--pie-button-focus-outline, #3b82f6);
|
|
96
|
-
outline-offset: 2px;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
.tool-button:disabled,
|
|
100
|
-
.tool-button--disabled {
|
|
101
|
-
opacity: 0.5;
|
|
102
|
-
cursor: not-allowed;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
.tool-button__icon {
|
|
106
|
-
display: inline-flex;
|
|
107
|
-
align-items: center;
|
|
108
|
-
justify-content: center;
|
|
109
|
-
width: 1.25rem;
|
|
110
|
-
height: 1.25rem;
|
|
111
|
-
flex-shrink: 0;
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
.tool-button__icon :global(svg) {
|
|
115
|
-
width: 100%;
|
|
116
|
-
height: 100%;
|
|
117
|
-
fill: currentColor;
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
.tool-button__icon img {
|
|
121
|
-
width: 100%;
|
|
122
|
-
height: 100%;
|
|
123
|
-
object-fit: contain;
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
.tool-button__label {
|
|
127
|
-
line-height: 1.25;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
/* Compact variant - icon only */
|
|
131
|
-
.tool-button--compact .tool-button__label {
|
|
132
|
-
position: absolute;
|
|
133
|
-
width: 1px;
|
|
134
|
-
height: 1px;
|
|
135
|
-
padding: 0;
|
|
136
|
-
margin: -1px;
|
|
137
|
-
overflow: hidden;
|
|
138
|
-
clip: rect(0, 0, 0, 0);
|
|
139
|
-
white-space: nowrap;
|
|
140
|
-
border-width: 0;
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
.tool-button--compact {
|
|
144
|
-
padding: 0.5rem;
|
|
145
|
-
}
|
|
146
|
-
</style>
|
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
/**
|
|
3
|
-
* ToolButtonGroup
|
|
4
|
-
*
|
|
5
|
-
* Generic toolbar component that renders a group of tool buttons.
|
|
6
|
-
* Implements the two-pass visibility model:
|
|
7
|
-
* - Pass 1: Receives allowedToolIds from orchestrator (PNP/policies)
|
|
8
|
-
* - Pass 2: Filters by tool relevance using ToolRegistry
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import type {
|
|
12
|
-
ToolRegistry,
|
|
13
|
-
ToolToolbarButtonDefinition,
|
|
14
|
-
ToolbarContext,
|
|
15
|
-
} from "../services/ToolRegistry.js";
|
|
16
|
-
import type { ToolContext } from "../services/tool-context.js";
|
|
17
|
-
import ToolButton from "./ToolButton.svelte";
|
|
18
|
-
|
|
19
|
-
// Props
|
|
20
|
-
let {
|
|
21
|
-
toolRegistry,
|
|
22
|
-
allowedToolIds,
|
|
23
|
-
context,
|
|
24
|
-
toolbarContext,
|
|
25
|
-
onToolClick,
|
|
26
|
-
orientation = "horizontal",
|
|
27
|
-
compact = false,
|
|
28
|
-
class: className = "",
|
|
29
|
-
}: {
|
|
30
|
-
/** Tool registry for filtering and button creation */
|
|
31
|
-
toolRegistry: ToolRegistry;
|
|
32
|
-
/** Tool IDs allowed by orchestrator (Pass 1) */
|
|
33
|
-
allowedToolIds: string[];
|
|
34
|
-
/** Context for visibility evaluation (Pass 2) */
|
|
35
|
-
context: ToolContext;
|
|
36
|
-
/** Context used for toolbar rendering contract */
|
|
37
|
-
toolbarContext: ToolbarContext;
|
|
38
|
-
/** Callback when tool button is clicked */
|
|
39
|
-
onToolClick?: (toolId: string) => void;
|
|
40
|
-
/** Layout orientation */
|
|
41
|
-
orientation?: "horizontal" | "vertical";
|
|
42
|
-
/** Compact mode (icon only) */
|
|
43
|
-
compact?: boolean;
|
|
44
|
-
/** Additional CSS classes */
|
|
45
|
-
class?: string;
|
|
46
|
-
} = $props();
|
|
47
|
-
|
|
48
|
-
// Two-pass visibility model
|
|
49
|
-
// Pass 2: Filter by tool relevance
|
|
50
|
-
const visibleTools = $derived(
|
|
51
|
-
toolRegistry.filterVisibleInContext(allowedToolIds, context),
|
|
52
|
-
);
|
|
53
|
-
|
|
54
|
-
// Create button definitions for visible tools using the toolbar contract
|
|
55
|
-
const buttons = $derived.by((): ToolToolbarButtonDefinition[] => {
|
|
56
|
-
const rendered = visibleTools
|
|
57
|
-
.map((tool) => toolRegistry.renderForToolbar(tool.toolId, context, toolbarContext))
|
|
58
|
-
.filter((tool): tool is NonNullable<typeof tool> => Boolean(tool));
|
|
59
|
-
|
|
60
|
-
return rendered
|
|
61
|
-
.map((tool) => tool.button)
|
|
62
|
-
.filter((button): button is ToolToolbarButtonDefinition => Boolean(button))
|
|
63
|
-
.map((button) => ({
|
|
64
|
-
...button,
|
|
65
|
-
onClick: () => {
|
|
66
|
-
button.onClick();
|
|
67
|
-
onToolClick?.(button.toolId);
|
|
68
|
-
},
|
|
69
|
-
className: compact
|
|
70
|
-
? `${button.className ? `${button.className} ` : ""}tool-button--compact`
|
|
71
|
-
: button.className,
|
|
72
|
-
}));
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
// Derive container classes
|
|
76
|
-
const containerClasses = $derived(
|
|
77
|
-
[
|
|
78
|
-
"tool-button-group",
|
|
79
|
-
`tool-button-group--${orientation}`,
|
|
80
|
-
compact ? "tool-button-group--compact" : "",
|
|
81
|
-
className,
|
|
82
|
-
]
|
|
83
|
-
.filter(Boolean)
|
|
84
|
-
.join(" "),
|
|
85
|
-
);
|
|
86
|
-
</script>
|
|
87
|
-
|
|
88
|
-
{#if buttons.length > 0}
|
|
89
|
-
<div class={containerClasses} role="toolbar" aria-label="Assessment tools">
|
|
90
|
-
{#each buttons as button (button.toolId)}
|
|
91
|
-
<ToolButton {button} />
|
|
92
|
-
{/each}
|
|
93
|
-
</div>
|
|
94
|
-
{/if}
|
|
95
|
-
|
|
96
|
-
<style>
|
|
97
|
-
.tool-button-group {
|
|
98
|
-
display: flex;
|
|
99
|
-
gap: 0.5rem;
|
|
100
|
-
padding: 0.5rem;
|
|
101
|
-
background: var(--tool-button-group-bg, transparent);
|
|
102
|
-
border-radius: 0.5rem;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
.tool-button-group--horizontal {
|
|
106
|
-
flex-direction: row;
|
|
107
|
-
flex-wrap: wrap;
|
|
108
|
-
align-items: center;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
.tool-button-group--vertical {
|
|
112
|
-
flex-direction: column;
|
|
113
|
-
align-items: stretch;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
.tool-button-group--compact {
|
|
117
|
-
gap: 0.25rem;
|
|
118
|
-
padding: 0.25rem;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
/* Empty state - hide when no buttons */
|
|
122
|
-
.tool-button-group:empty {
|
|
123
|
-
display: none;
|
|
124
|
-
}
|
|
125
|
-
</style>
|