@pie-players/pie-tool-answer-eliminator 0.2.0

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 (38) hide show
  1. package/README.md +282 -0
  2. package/adapters/adapter-registry.ts +64 -0
  3. package/adapters/choice-adapter.ts +50 -0
  4. package/adapters/ebsr-adapter.ts +61 -0
  5. package/adapters/inline-dropdown-adapter.ts +46 -0
  6. package/adapters/multiple-choice-adapter.ts +96 -0
  7. package/answer-eliminator-core.ts +465 -0
  8. package/dist/adapters/adapter-registry.d.ts +26 -0
  9. package/dist/adapters/adapter-registry.d.ts.map +1 -0
  10. package/dist/adapters/choice-adapter.d.ts +43 -0
  11. package/dist/adapters/choice-adapter.d.ts.map +1 -0
  12. package/dist/adapters/ebsr-adapter.d.ts +20 -0
  13. package/dist/adapters/ebsr-adapter.d.ts.map +1 -0
  14. package/dist/adapters/inline-dropdown-adapter.d.ts +18 -0
  15. package/dist/adapters/inline-dropdown-adapter.d.ts.map +1 -0
  16. package/dist/adapters/multiple-choice-adapter.d.ts +20 -0
  17. package/dist/adapters/multiple-choice-adapter.d.ts.map +1 -0
  18. package/dist/answer-eliminator-core.d.ts +98 -0
  19. package/dist/answer-eliminator-core.d.ts.map +1 -0
  20. package/dist/index.d.ts +8 -0
  21. package/dist/index.d.ts.map +1 -0
  22. package/dist/strategies/elimination-strategy.d.ts +41 -0
  23. package/dist/strategies/elimination-strategy.d.ts.map +1 -0
  24. package/dist/strategies/mask-strategy.d.ts +28 -0
  25. package/dist/strategies/mask-strategy.d.ts.map +1 -0
  26. package/dist/strategies/strikethrough-strategy.d.ts +31 -0
  27. package/dist/strategies/strikethrough-strategy.d.ts.map +1 -0
  28. package/dist/tool-answer-eliminator.js +2838 -0
  29. package/dist/tool-answer-eliminator.js.map +1 -0
  30. package/dist/tool-answer-eliminator.svelte.d.ts +1 -0
  31. package/dist/vite.config.d.ts +3 -0
  32. package/dist/vite.config.d.ts.map +1 -0
  33. package/index.ts +11 -0
  34. package/package.json +69 -0
  35. package/strategies/elimination-strategy.ts +47 -0
  36. package/strategies/mask-strategy.ts +180 -0
  37. package/strategies/strikethrough-strategy.ts +239 -0
  38. package/tool-answer-eliminator.svelte +250 -0
@@ -0,0 +1,98 @@
1
+ import { ChoiceAdapter } from './adapters/choice-adapter';
2
+ /**
3
+ * Core engine for answer eliminator tool
4
+ * Coordinates adapters, strategies, and state management
5
+ */
6
+ export declare class AnswerEliminatorCore {
7
+ private registry;
8
+ private strategy;
9
+ private eliminatedChoices;
10
+ private choiceElements;
11
+ private choiceButtons;
12
+ private buttonAlignment;
13
+ private shouldRestoreState;
14
+ private storeIntegration;
15
+ constructor(strategyType?: "strikethrough" | "mask" | "gray", buttonAlignment?: "left" | "right" | "inline");
16
+ private createStrategy;
17
+ /**
18
+ * Initialize eliminator for a question
19
+ */
20
+ initializeForQuestion(questionRoot: HTMLElement): void;
21
+ /**
22
+ * Initialize a single choice
23
+ */
24
+ private initializeChoice;
25
+ /**
26
+ * Create elimination toggle button
27
+ */
28
+ private createToggleButton;
29
+ /**
30
+ * Toggle elimination for a choice
31
+ */
32
+ toggleElimination(choice: HTMLElement, adapter: ChoiceAdapter): void;
33
+ /**
34
+ * Eliminate a choice
35
+ */
36
+ private eliminateChoice;
37
+ /**
38
+ * Restore a choice
39
+ */
40
+ private restoreChoice;
41
+ /**
42
+ * Reset all eliminations for current element
43
+ */
44
+ resetAll(): void;
45
+ /**
46
+ * Get count of eliminated choices for current element
47
+ */
48
+ getEliminatedCount(): number;
49
+ /**
50
+ * Set store integration for element-level state
51
+ * @param store ElementToolStateStore instance
52
+ * @param globalElementId Composite key: "assessmentId:sectionId:itemId:elementId"
53
+ */
54
+ setStoreIntegration(store: any, globalElementId: string): void;
55
+ /**
56
+ * Save state to ElementToolStateStore
57
+ */
58
+ private saveState;
59
+ /**
60
+ * Restore state from ElementToolStateStore
61
+ */
62
+ private restoreState;
63
+ /**
64
+ * Find adapter for a choice element
65
+ */
66
+ private findAdapterForChoice;
67
+ /**
68
+ * Cleanup buttons from previous element
69
+ */
70
+ private cleanupButtons;
71
+ /**
72
+ * Apply button positioning based on alignment configuration
73
+ */
74
+ private applyButtonAlignment;
75
+ /**
76
+ * Enable state restoration from localStorage
77
+ */
78
+ enableStateRestoration(): void;
79
+ /**
80
+ * Disable state restoration from localStorage
81
+ */
82
+ disableStateRestoration(): void;
83
+ /**
84
+ * Cleanup when tool is turned off (but don't destroy strategy)
85
+ * Hides elimination buttons AND clears all visual eliminations
86
+ * Note: State is preserved in localStorage for when tool is turned back on
87
+ */
88
+ cleanup(): void;
89
+ /**
90
+ * Emit state change event for UI updates
91
+ */
92
+ private emitStateChange;
93
+ /**
94
+ * Destroy and cleanup
95
+ */
96
+ destroy(): void;
97
+ }
98
+ //# sourceMappingURL=answer-eliminator-core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"answer-eliminator-core.d.ts","sourceRoot":"","sources":["../answer-eliminator-core.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAK/D;;;GAGG;AACH,qBAAa,oBAAoB;IAChC,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,QAAQ,CAAsB;IACtC,OAAO,CAAC,iBAAiB,CAAqB;IAC9C,OAAO,CAAC,cAAc,CAAkC;IACxD,OAAO,CAAC,aAAa,CAAwC;IAC7D,OAAO,CAAC,eAAe,CAAwC;IAC/D,OAAO,CAAC,kBAAkB,CAAiB;IAG3C,OAAO,CAAC,gBAAgB,CAGR;gBAGf,YAAY,GAAE,eAAe,GAAG,MAAM,GAAG,MAAwB,EACjE,eAAe,GAAE,MAAM,GAAG,OAAO,GAAG,QAAkB;IAQvD,OAAO,CAAC,cAAc;IAUtB;;OAEG;IACH,qBAAqB,CAAC,YAAY,EAAE,WAAW,GAAG,IAAI;IAmBtD;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAqBxB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA4D1B;;OAEG;IACH,iBAAiB,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI;IA4BpE;;OAEG;IACH,OAAO,CAAC,eAAe;IA+BvB;;OAEG;IACH,OAAO,CAAC,aAAa;IAsBrB;;OAEG;IACH,QAAQ,IAAI,IAAI;IAchB;;OAEG;IACH,kBAAkB,IAAI,MAAM;IAI5B;;;;OAIG;IACH,mBAAmB,CAAC,KAAK,EAAE,GAAG,EAAE,eAAe,EAAE,MAAM,GAAG,IAAI;IAI9D;;OAEG;IACH,OAAO,CAAC,SAAS;IAcjB;;OAEG;IACH,OAAO,CAAC,YAAY;IAiDpB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAa5B;;OAEG;IACH,OAAO,CAAC,cAAc;IAStB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAmC5B;;OAEG;IACH,sBAAsB,IAAI,IAAI;IAI9B;;OAEG;IACH,uBAAuB,IAAI,IAAI;IAI/B;;;;OAIG;IACH,OAAO,IAAI,IAAI;IAYf;;OAEG;IACH,OAAO,CAAC,eAAe;IAWvB;;OAEG;IACH,OAAO,IAAI,IAAI;CAIf"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * pie-tool-answer-eliminator - PIE Assessment Tool
3
+ *
4
+ * This package exports a web component built from Svelte.
5
+ * Import the built version for CDN usage, or the .svelte source for Svelte projects.
6
+ */
7
+ export { AdapterRegistry } from './adapters/adapter-registry';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Strategy interface for visual elimination styles
3
+ * Uses CSS Custom Highlight API for zero DOM mutation
4
+ */
5
+ export interface EliminationStrategy {
6
+ /** Strategy name */
7
+ readonly name: string;
8
+ /**
9
+ * Apply elimination visual to a choice
10
+ * @param choiceId - Unique identifier for this choice
11
+ * @param range - DOM Range covering the choice content
12
+ */
13
+ apply(choiceId: string, range: Range): void;
14
+ /**
15
+ * Remove elimination visual from a choice
16
+ * @param choiceId - Unique identifier for this choice
17
+ */
18
+ remove(choiceId: string): void;
19
+ /**
20
+ * Check if a choice is currently eliminated
21
+ * @param choiceId - Unique identifier for this choice
22
+ */
23
+ isEliminated(choiceId: string): boolean;
24
+ /**
25
+ * Clear all eliminations
26
+ */
27
+ clearAll(): void;
28
+ /**
29
+ * Get all eliminated choice IDs
30
+ */
31
+ getEliminatedIds(): string[];
32
+ /**
33
+ * Initialize strategy (inject CSS, etc.)
34
+ */
35
+ initialize(): void;
36
+ /**
37
+ * Cleanup strategy (remove CSS, etc.)
38
+ */
39
+ destroy(): void;
40
+ }
41
+ //# sourceMappingURL=elimination-strategy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"elimination-strategy.d.ts","sourceRoot":"","sources":["../../strategies/elimination-strategy.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IACnC,oBAAoB;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB;;;;OAIG;IACH,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IAE5C;;;OAGG;IACH,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAE/B;;;OAGG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IAExC;;OAEG;IACH,QAAQ,IAAI,IAAI,CAAC;IAEjB;;OAEG;IACH,gBAAgB,IAAI,MAAM,EAAE,CAAC;IAE7B;;OAEG;IACH,UAAU,IAAI,IAAI,CAAC;IAEnB;;OAEG;IACH,OAAO,IAAI,IAAI,CAAC;CAChB"}
@@ -0,0 +1,28 @@
1
+ import { EliminationStrategy } from './elimination-strategy';
2
+ /**
3
+ * Mask strategy using CSS Custom Highlight API
4
+ * Partially hides/grays eliminated choices
5
+ */
6
+ export declare class MaskStrategy implements EliminationStrategy {
7
+ readonly name = "mask";
8
+ private highlights;
9
+ private ranges;
10
+ initialize(): void;
11
+ destroy(): void;
12
+ apply(choiceId: string, range: Range): void;
13
+ remove(choiceId: string): void;
14
+ isEliminated(choiceId: string): boolean;
15
+ clearAll(): void;
16
+ getEliminatedIds(): string[];
17
+ private isSupported;
18
+ private injectCSS;
19
+ private injectHighlightCSS;
20
+ private removeHighlightCSS;
21
+ private removeCSS;
22
+ private addAriaAttributes;
23
+ private removeAriaAttributes;
24
+ private findChoiceContainer;
25
+ private applyFallback;
26
+ private removeFallback;
27
+ }
28
+ //# sourceMappingURL=mask-strategy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mask-strategy.d.ts","sourceRoot":"","sources":["../../strategies/mask-strategy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAElE;;;GAGG;AACH,qBAAa,YAAa,YAAW,mBAAmB;IACvD,QAAQ,CAAC,IAAI,UAAU;IAEvB,OAAO,CAAC,UAAU,CAAgC;IAClD,OAAO,CAAC,MAAM,CAA4B;IAE1C,UAAU,IAAI,IAAI;IAIlB,OAAO,IAAI,IAAI;IAKf,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;IAkB3C,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAoB9B,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIvC,QAAQ,IAAI,IAAI;IAMhB,gBAAgB,IAAI,MAAM,EAAE;IAI5B,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,SAAS;IAmBjB,OAAO,CAAC,kBAAkB;IAe1B,OAAO,CAAC,kBAAkB;IAM1B,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,oBAAoB;IAQ5B,OAAO,CAAC,mBAAmB;IAkB3B,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,cAAc;CActB"}
@@ -0,0 +1,31 @@
1
+ import { EliminationStrategy } from './elimination-strategy';
2
+ /**
3
+ * Strikethrough strategy using CSS Custom Highlight API
4
+ *
5
+ * Modern approach: Zero DOM mutation, uses browser-native highlighting
6
+ * Accessibility: Best for screen readers (text remains in DOM unchanged)
7
+ * WCAG Compliance: Maintains info structure (1.3.1), no layout shift (2.4.3)
8
+ */
9
+ export declare class StrikethroughStrategy implements EliminationStrategy {
10
+ readonly name = "strikethrough";
11
+ private highlights;
12
+ private ranges;
13
+ initialize(): void;
14
+ destroy(): void;
15
+ apply(choiceId: string, range: Range): void;
16
+ remove(choiceId: string): void;
17
+ isEliminated(choiceId: string): boolean;
18
+ clearAll(): void;
19
+ getEliminatedIds(): string[];
20
+ private isSupported;
21
+ private injectCSS;
22
+ private injectHighlightCSS;
23
+ private removeHighlightCSS;
24
+ private removeCSS;
25
+ private addAriaAttributes;
26
+ private removeAriaAttributes;
27
+ private findChoiceContainer;
28
+ private applyFallback;
29
+ private removeFallback;
30
+ }
31
+ //# sourceMappingURL=strikethrough-strategy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strikethrough-strategy.d.ts","sourceRoot":"","sources":["../../strategies/strikethrough-strategy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAElE;;;;;;GAMG;AACH,qBAAa,qBAAsB,YAAW,mBAAmB;IAChE,QAAQ,CAAC,IAAI,mBAAmB;IAEhC,OAAO,CAAC,UAAU,CAAgC;IAClD,OAAO,CAAC,MAAM,CAA4B;IAE1C,UAAU,IAAI,IAAI;IAWlB,OAAO,IAAI,IAAI;IAKf,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;IAuB3C,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAsB9B,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIvC,QAAQ,IAAI,IAAI;IAOhB,gBAAgB,IAAI,MAAM,EAAE;IAI5B,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,SAAS;IAkCjB,OAAO,CAAC,kBAAkB;IAiB1B,OAAO,CAAC,kBAAkB;IAM1B,OAAO,CAAC,SAAS;IAOjB,OAAO,CAAC,iBAAiB;IAkBzB,OAAO,CAAC,oBAAoB;IAY5B,OAAO,CAAC,mBAAmB;IAwB3B,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,cAAc;CAetB"}