@pie-players/pie-section-player 0.2.12 → 0.2.13

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 (62) hide show
  1. package/README.md +28 -568
  2. package/dist/component-definitions.d.ts +0 -3
  3. package/dist/component-definitions.d.ts.map +1 -1
  4. package/dist/components/section-player-vertical-element.d.ts +2 -0
  5. package/dist/components/section-player-vertical-element.d.ts.map +1 -0
  6. package/dist/components/shared/composition.d.ts +9 -0
  7. package/dist/components/shared/composition.d.ts.map +1 -0
  8. package/dist/components/shared/player-action.d.ts +18 -0
  9. package/dist/components/shared/player-action.d.ts.map +1 -0
  10. package/dist/components/shared/player-preload.d.ts +37 -0
  11. package/dist/components/shared/player-preload.d.ts.map +1 -0
  12. package/dist/components/shared/section-player-runtime.d.ts +104 -0
  13. package/dist/components/shared/section-player-runtime.d.ts.map +1 -0
  14. package/dist/components/shared/section-player-view-state.d.ts +24 -0
  15. package/dist/components/shared/section-player-view-state.d.ts.map +1 -0
  16. package/dist/controllers/SectionContentService.d.ts.map +1 -1
  17. package/dist/controllers/SectionController.d.ts +5 -1
  18. package/dist/controllers/SectionController.d.ts.map +1 -1
  19. package/dist/controllers/SectionSessionService.d.ts +0 -1
  20. package/dist/controllers/SectionSessionService.d.ts.map +1 -1
  21. package/dist/controllers/toolkit-section-contracts.d.ts +2 -28
  22. package/dist/controllers/toolkit-section-contracts.d.ts.map +1 -1
  23. package/dist/controllers/types.d.ts +28 -1
  24. package/dist/controllers/types.d.ts.map +1 -1
  25. package/dist/pie-item-player-B1iGN63e.js +6189 -0
  26. package/dist/pie-section-player.d.ts +0 -8
  27. package/dist/pie-section-player.d.ts.map +1 -1
  28. package/dist/pie-section-player.js +56558 -11
  29. package/dist/player-preload-CQVG0Bih.js +705 -0
  30. package/dist/utils/player-preload.d.ts +2 -0
  31. package/dist/utils/player-preload.d.ts.map +1 -0
  32. package/dist/utils/player-preload.js +8 -0
  33. package/package.json +23 -32
  34. package/src/components/ItemShellElement.svelte +10 -1
  35. package/src/components/PieSectionPlayerBaseElement.svelte +21 -78
  36. package/src/components/PieSectionPlayerSplitPaneElement.svelte +236 -295
  37. package/src/components/PieSectionPlayerVerticalElement.svelte +424 -0
  38. package/src/components/shared/SectionItemCard.svelte +92 -0
  39. package/src/components/shared/SectionPassageCard.svelte +88 -0
  40. package/dist/ItemRenderer-MsjF_Beu.js +0 -467
  41. package/dist/PieItemModeLayoutElement-D7oTzA9T.js +0 -316
  42. package/dist/PieSplitPanelLayoutElement-GUtJ_NlF.js +0 -246
  43. package/dist/PieVerticalLayoutElement-BoA3FO5g.js +0 -194
  44. package/dist/controllers/SectionToolkitService.d.ts +0 -24
  45. package/dist/controllers/SectionToolkitService.d.ts.map +0 -1
  46. package/dist/controllers/SessionPersistenceStrategy.d.ts +0 -15
  47. package/dist/controllers/SessionPersistenceStrategy.d.ts.map +0 -1
  48. package/dist/index.d.ts +0 -2
  49. package/dist/pie-section-player-DJ5NcwdT.js +0 -17078
  50. package/dist/runtime/runtime-event-guards.d.ts +0 -4
  51. package/dist/runtime/runtime-event-guards.d.ts.map +0 -1
  52. package/src/PieSectionPlayer.svelte +0 -826
  53. package/src/components/ItemModeLayout.svelte +0 -172
  54. package/src/components/ItemNavigation.svelte +0 -96
  55. package/src/components/ItemPlayerBridge.svelte +0 -110
  56. package/src/components/ItemRenderer.svelte +0 -248
  57. package/src/components/ItemShell.svelte +0 -86
  58. package/src/components/layout-elements/PieItemModeLayoutElement.svelte +0 -47
  59. package/src/components/layout-elements/PieSplitPanelLayoutElement.svelte +0 -62
  60. package/src/components/layout-elements/PieVerticalLayoutElement.svelte +0 -41
  61. package/src/components/layouts/SplitPanelLayout.svelte +0 -385
  62. package/src/components/layouts/VerticalLayout.svelte +0 -193
@@ -0,0 +1 @@
1
+ {"version":3,"file":"player-preload.d.ts","sourceRoot":"","sources":["../../src/utils/player-preload.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,qBAAqB,EACrB,aAAa,EACb,uBAAuB,EACvB,+BAA+B,EAC/B,qBAAqB,EACrB,KAAK,kBAAkB,GACvB,MAAM,wCAAwC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { b as r, a as l, g as t, o, p as s } from "../player-preload-CQVG0Bih.js";
2
+ export {
3
+ r as buildPreloadSignature,
4
+ l as getLoaderView,
5
+ t as getRenderablesSignature,
6
+ o as orchestratePlayerElementPreload,
7
+ s as preloadPlayerElements
8
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pie-players/pie-section-player",
3
- "version": "0.2.12",
3
+ "version": "0.2.13",
4
4
  "type": "module",
5
5
  "description": "Web component for rendering QTI 3.0 assessment sections with passages and items",
6
6
  "license": "MIT",
@@ -15,35 +15,23 @@
15
15
  "unpkg": "./dist/pie-section-player.js",
16
16
  "jsdelivr": "./dist/pie-section-player.js",
17
17
  "main": "./dist/pie-section-player.js",
18
- "types": "./dist/index.d.ts",
18
+ "types": "./dist/pie-section-player.d.ts",
19
19
  "exports": {
20
20
  ".": {
21
- "types": "./dist/index.d.ts",
22
- "import": "./dist/pie-section-player.js"
23
- },
24
- "./components/ItemShellElement.svelte": {
25
- "types": "./dist/pie-section-player.d.ts",
26
- "import": "./dist/pie-section-player.js"
27
- },
28
- "./components/PassageShellElement.svelte": {
29
- "types": "./dist/pie-section-player.d.ts",
30
- "import": "./dist/pie-section-player.js"
31
- },
32
- "./components/section-player-base-element": {
33
21
  "types": "./dist/pie-section-player.d.ts",
34
22
  "import": "./dist/pie-section-player.js"
35
23
  },
36
- "./components/item-shell-element": {
24
+ "./components/section-player-splitpane-element": {
37
25
  "types": "./dist/pie-section-player.d.ts",
38
26
  "import": "./dist/pie-section-player.js"
39
27
  },
40
- "./components/passage-shell-element": {
28
+ "./components/section-player-vertical-element": {
41
29
  "types": "./dist/pie-section-player.d.ts",
42
30
  "import": "./dist/pie-section-player.js"
43
31
  },
44
- "./components/section-player-splitpane-element": {
45
- "types": "./dist/pie-section-player.d.ts",
46
- "import": "./dist/pie-section-player.js"
32
+ "./utils/player-preload": {
33
+ "types": "./dist/utils/player-preload.d.ts",
34
+ "import": "./dist/utils/player-preload.js"
47
35
  }
48
36
  },
49
37
  "files": [
@@ -61,22 +49,25 @@
61
49
  "svelte": "^5.51.0"
62
50
  },
63
51
  "dependencies": {
64
- "@pie-players/pie-assessment-toolkit": "0.2.9",
65
- "@pie-players/pie-esm-player": "0.2.6",
66
- "@pie-players/pie-fixed-player": "0.2.5",
67
- "@pie-players/pie-iife-player": "0.2.6",
68
- "@pie-players/pie-inline-player": "0.2.5",
69
- "@pie-players/pie-context": "0.1.1",
70
- "@pie-players/pie-players-shared": "0.2.5",
71
- "@pie-players/pie-section-tools-toolbar": "0.2.10",
72
- "@pie-players/pie-tool-answer-eliminator": "0.2.9",
73
- "@pie-players/pie-tool-calculator": "0.1.9",
74
- "@pie-players/pie-tool-calculator-inline": "0.1.6",
75
- "@pie-players/pie-tool-tts-inline": "0.1.6",
76
- "@pie-players/tts-client-server": "0.2.4",
52
+ "@pie-players/pie-assessment-toolkit": "0.2.10",
53
+ "@pie-players/pie-item-player": "0.1.1",
54
+ "@pie-players/pie-context": "0.1.2",
55
+ "@pie-players/pie-players-shared": "0.2.6",
56
+ "@pie-players/pie-toolbars": "0.1.1",
57
+ "@pie-players/pie-tool-answer-eliminator": "0.2.10",
58
+ "@pie-players/pie-tool-calculator": "0.1.10",
59
+ "@pie-players/pie-tool-theme": "0.1.10",
60
+ "@pie-players/pie-tool-graph": "0.1.10",
61
+ "@pie-players/pie-tool-line-reader": "0.1.10",
62
+ "@pie-players/pie-tool-periodic-table": "0.1.10",
63
+ "@pie-players/pie-tool-protractor": "0.1.10",
64
+ "@pie-players/pie-tool-ruler": "0.1.10",
65
+ "@pie-players/pie-tool-text-to-speech": "0.1.10",
66
+ "@pie-players/tts-client-server": "0.2.5",
77
67
  "daisyui": "^5.5.18"
78
68
  },
79
69
  "devDependencies": {
70
+ "@axe-core/playwright": "^4.11.1",
80
71
  "@biomejs/biome": "^2.3.13",
81
72
  "@playwright/test": "^1.58.2",
82
73
  "@sveltejs/vite-plugin-svelte": "^6.2.4",
@@ -113,11 +113,20 @@
113
113
  if (!host) return;
114
114
  dispatchRegistration(PIE_REGISTER_EVENT);
115
115
 
116
- const onSessionChanged = (event: Event) => normalizeAndDispatchSession(event);
116
+ const seenSessionEvents = new WeakSet<Event>();
117
+ const onSessionChanged = (event: Event) => {
118
+ // Some players emit `session-changed`, others emit `sessionchanged`.
119
+ // Guard against duplicate forwarding when both fire for the same original event.
120
+ if (seenSessionEvents.has(event)) return;
121
+ seenSessionEvents.add(event);
122
+ normalizeAndDispatchSession(event);
123
+ };
117
124
  host.addEventListener("sessionchanged", onSessionChanged);
125
+ host.addEventListener("session-changed", onSessionChanged);
118
126
 
119
127
  return () => {
120
128
  host?.removeEventListener("sessionchanged", onSessionChanged);
129
+ host?.removeEventListener("session-changed", onSessionChanged);
121
130
  dispatchRegistration(PIE_UNREGISTER_EVENT);
122
131
  };
123
132
  });
@@ -8,7 +8,6 @@
8
8
  section: { type: "Object", reflect: false },
9
9
  sectionId: { attribute: "section-id", type: "String" },
10
10
  attemptId: { attribute: "attempt-id", type: "String" },
11
- view: { type: "String" },
12
11
  playerType: { attribute: "player-type", type: "String" },
13
12
  player: { type: "Object", reflect: false },
14
13
  lazyInit: { attribute: "lazy-init", type: "Boolean" },
@@ -31,45 +30,21 @@
31
30
  import { SectionController } from "../controllers/SectionController.js";
32
31
  import type { SectionCompositionModel } from "../controllers/types.js";
33
32
  import type { AssessmentSection } from "@pie-players/pie-players-shared/types";
34
-
35
- const EMPTY_COMPOSITION: SectionCompositionModel = {
36
- section: null,
37
- assessmentItemRefs: [],
38
- passages: [],
39
- items: [],
40
- rubricBlocks: [],
41
- instructions: [],
42
- currentItemIndex: 0,
43
- currentItem: null,
44
- isPageMode: false,
45
- itemSessionsByItemId: {},
46
- testAttemptSession: null,
47
- };
48
- const DEFAULT_ASSESSMENT_ID = "section-demo-direct";
49
- const DEFAULT_PLAYER_TYPE = "iife";
50
- const DEFAULT_LAZY_INIT = true;
51
- const DEFAULT_ISOLATION = "inherit";
52
- const LEGACY_RUNTIME_WARNING_KEY = "pie-section-player-base:legacy-runtime-props";
53
- const warnedKeys = new Set<string>();
54
- type RuntimeConfig = {
55
- assessmentId?: string;
56
- playerType?: string;
57
- player?: Record<string, unknown> | null;
58
- lazyInit?: boolean;
59
- tools?: Record<string, unknown> | null;
60
- accessibility?: Record<string, unknown> | null;
61
- coordinator?: unknown;
62
- createSectionController?: unknown;
63
- isolation?: string;
64
- env?: Record<string, unknown>;
65
- };
33
+ import { EMPTY_COMPOSITION } from "./shared/composition.js";
34
+ import {
35
+ DEFAULT_ASSESSMENT_ID,
36
+ DEFAULT_ENV,
37
+ DEFAULT_ISOLATION,
38
+ DEFAULT_LAZY_INIT,
39
+ DEFAULT_PLAYER_TYPE,
40
+ type RuntimeConfig,
41
+ } from "./shared/section-player-runtime.js";
66
42
  let {
67
43
  assessmentId = DEFAULT_ASSESSMENT_ID,
68
44
  runtime = null as RuntimeConfig | null,
69
45
  section = null as AssessmentSection | null,
70
46
  sectionId = "",
71
47
  attemptId = "",
72
- view = "candidate",
73
48
  playerType = DEFAULT_PLAYER_TYPE,
74
49
  player = null as Record<string, unknown> | null,
75
50
  lazyInit = DEFAULT_LAZY_INIT,
@@ -82,7 +57,7 @@
82
57
  } = $props();
83
58
 
84
59
  let toolkitElement = $state<any>(null);
85
- let lastCompositionSignature = $state("");
60
+ let lastCompositionVersion = $state(-1);
86
61
  type BaseSectionPlayerEvents = {
87
62
  "composition-changed": { composition: SectionCompositionModel };
88
63
  "toolkit-ready": Record<string, unknown>;
@@ -106,7 +81,7 @@
106
81
  () => runtime?.createSectionController ?? createSectionController,
107
82
  );
108
83
  const effectiveIsolation = $derived.by(() => runtime?.isolation ?? isolation);
109
- const effectiveEnv = $derived.by(() => runtime?.env ?? env ?? {});
84
+ const effectiveEnv = $derived.by(() => runtime?.env ?? env ?? DEFAULT_ENV);
110
85
  let resolvedSection = $derived.by(() => {
111
86
  if (!section) return null;
112
87
  const sectionAny = section as any;
@@ -127,27 +102,18 @@
127
102
  dispatch(name, detail);
128
103
  }
129
104
 
130
- function getCompositionSignature(
131
- model: SectionCompositionModel | null | undefined,
132
- ): string {
133
- if (!model) return "";
134
- return JSON.stringify({
135
- sectionId: model.section?.identifier || "",
136
- currentItemIndex: model.currentItemIndex ?? -1,
137
- itemIds: (model.items || []).map((item) => item?.id || ""),
138
- passageIds: (model.passages || []).map((passage) => passage?.id || ""),
139
- sessionByItem: Object.entries(model.itemSessionsByItemId || {})
140
- .sort(([left], [right]) => left.localeCompare(right))
141
- .map(([itemId, session]) => [itemId, JSON.stringify(session ?? null)]),
142
- });
143
- }
144
-
145
105
  function handleCompositionChanged(event: Event): void {
146
- const detail = (event as CustomEvent<{ composition?: SectionCompositionModel }>).detail;
106
+ const detail = (event as CustomEvent<{
107
+ composition?: SectionCompositionModel;
108
+ version?: number;
109
+ }>).detail;
147
110
  const nextComposition = detail?.composition || EMPTY_COMPOSITION;
148
- const nextSignature = getCompositionSignature(nextComposition);
149
- if (nextSignature === lastCompositionSignature) return;
150
- lastCompositionSignature = nextSignature;
111
+ const nextVersion =
112
+ typeof detail?.version === "number"
113
+ ? detail.version
114
+ : lastCompositionVersion + 1;
115
+ if (nextVersion === lastCompositionVersion) return;
116
+ lastCompositionVersion = nextVersion;
151
117
  emit("composition-changed", {
152
118
  composition: nextComposition,
153
119
  });
@@ -167,28 +133,6 @@
167
133
  effectiveCreateSectionController || (() => new SectionController());
168
134
  });
169
135
 
170
- $effect(() => {
171
- if (typeof window === "undefined" || runtime) return;
172
- const usedLegacyProps: string[] = [];
173
- if (assessmentId !== DEFAULT_ASSESSMENT_ID) usedLegacyProps.push("assessmentId");
174
- if (playerType !== DEFAULT_PLAYER_TYPE) usedLegacyProps.push("playerType");
175
- if (player !== null) usedLegacyProps.push("player");
176
- if (lazyInit !== DEFAULT_LAZY_INIT) usedLegacyProps.push("lazyInit");
177
- if (tools !== null) usedLegacyProps.push("tools");
178
- if (accessibility !== null) usedLegacyProps.push("accessibility");
179
- if (coordinator !== null) usedLegacyProps.push("coordinator");
180
- if (createSectionController !== null) usedLegacyProps.push("createSectionController");
181
- if (isolation !== DEFAULT_ISOLATION) usedLegacyProps.push("isolation");
182
- if (env !== null) usedLegacyProps.push("env");
183
- if (usedLegacyProps.length === 0) return;
184
- const key = `${LEGACY_RUNTIME_WARNING_KEY}:${usedLegacyProps.sort().join(",")}`;
185
- if (warnedKeys.has(key)) return;
186
- warnedKeys.add(key);
187
- console.warn(
188
- `[pie-section-player-base] Runtime props (${usedLegacyProps.join(", ")}) are deprecated. Prefer the \`runtime\` object prop.`,
189
- );
190
- });
191
-
192
136
  </script>
193
137
 
194
138
  <pie-assessment-toolkit
@@ -199,7 +143,6 @@
199
143
  attempt-id={attemptId}
200
144
  player-type={effectivePlayerType}
201
145
  player={effectivePlayer}
202
- {view}
203
146
  env={effectiveEnv}
204
147
  lazy-init={effectiveLazyInit}
205
148
  tools={effectiveTools}