@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.
- package/README.md +282 -0
- package/adapters/adapter-registry.ts +64 -0
- package/adapters/choice-adapter.ts +50 -0
- package/adapters/ebsr-adapter.ts +61 -0
- package/adapters/inline-dropdown-adapter.ts +46 -0
- package/adapters/multiple-choice-adapter.ts +96 -0
- package/answer-eliminator-core.ts +465 -0
- package/dist/adapters/adapter-registry.d.ts +26 -0
- package/dist/adapters/adapter-registry.d.ts.map +1 -0
- package/dist/adapters/choice-adapter.d.ts +43 -0
- package/dist/adapters/choice-adapter.d.ts.map +1 -0
- package/dist/adapters/ebsr-adapter.d.ts +20 -0
- package/dist/adapters/ebsr-adapter.d.ts.map +1 -0
- package/dist/adapters/inline-dropdown-adapter.d.ts +18 -0
- package/dist/adapters/inline-dropdown-adapter.d.ts.map +1 -0
- package/dist/adapters/multiple-choice-adapter.d.ts +20 -0
- package/dist/adapters/multiple-choice-adapter.d.ts.map +1 -0
- package/dist/answer-eliminator-core.d.ts +98 -0
- package/dist/answer-eliminator-core.d.ts.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/strategies/elimination-strategy.d.ts +41 -0
- package/dist/strategies/elimination-strategy.d.ts.map +1 -0
- package/dist/strategies/mask-strategy.d.ts +28 -0
- package/dist/strategies/mask-strategy.d.ts.map +1 -0
- package/dist/strategies/strikethrough-strategy.d.ts +31 -0
- package/dist/strategies/strikethrough-strategy.d.ts.map +1 -0
- package/dist/tool-answer-eliminator.js +2838 -0
- package/dist/tool-answer-eliminator.js.map +1 -0
- package/dist/tool-answer-eliminator.svelte.d.ts +1 -0
- package/dist/vite.config.d.ts +3 -0
- package/dist/vite.config.d.ts.map +1 -0
- package/index.ts +11 -0
- package/package.json +69 -0
- package/strategies/elimination-strategy.ts +47 -0
- package/strategies/mask-strategy.ts +180 -0
- package/strategies/strikethrough-strategy.ts +239 -0
- 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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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"}
|