@webwriter/quiz 1.1.2 → 1.1.5

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 (112) hide show
  1. package/.github/workflows/publish.yml +8 -0
  2. package/LICENSE +6 -6
  3. package/custom.d.ts +175 -175
  4. package/dist/widgets/webwriter-choice-item.js +69 -205
  5. package/dist/widgets/webwriter-choice.js +99 -214
  6. package/dist/widgets/webwriter-cloze-gap.js +74 -213
  7. package/dist/widgets/webwriter-cloze.js +71 -204
  8. package/dist/widgets/webwriter-mark.js +72 -205
  9. package/dist/widgets/webwriter-order-item.js +68 -201
  10. package/dist/widgets/webwriter-order.js +99 -209
  11. package/dist/widgets/webwriter-pairing-item.js +57 -160
  12. package/dist/widgets/webwriter-pairing.js +69 -196
  13. package/dist/widgets/webwriter-quiz.js +72 -211
  14. package/dist/widgets/webwriter-speech.js +71 -204
  15. package/dist/widgets/webwriter-task-explainer.js +57 -160
  16. package/dist/widgets/webwriter-task-hint.js +55 -158
  17. package/dist/widgets/webwriter-task-prompt.js +61 -170
  18. package/dist/widgets/webwriter-task.js +80 -205
  19. package/dist/widgets/webwriter-text.js +94 -205
  20. package/lit-localize.json +14 -14
  21. package/localization/bg.xlf +72 -69
  22. package/localization/cs.xlf +72 -69
  23. package/localization/da.xlf +72 -69
  24. package/localization/de.xlf +77 -74
  25. package/localization/el.xlf +72 -69
  26. package/localization/es.xlf +72 -69
  27. package/localization/et.xlf +72 -69
  28. package/localization/fi.xlf +72 -69
  29. package/localization/fr.xlf +72 -69
  30. package/localization/generated/bg.ts +30 -29
  31. package/localization/generated/cs.ts +30 -29
  32. package/localization/generated/da.ts +30 -29
  33. package/localization/generated/de.ts +30 -29
  34. package/localization/generated/el.ts +30 -29
  35. package/localization/generated/es.ts +30 -29
  36. package/localization/generated/et.ts +30 -29
  37. package/localization/generated/fi.ts +30 -29
  38. package/localization/generated/fr.ts +30 -29
  39. package/localization/generated/hu.ts +30 -29
  40. package/localization/generated/id.ts +30 -29
  41. package/localization/generated/index.js +2 -2
  42. package/localization/generated/it.ts +30 -29
  43. package/localization/generated/ja.ts +30 -29
  44. package/localization/generated/ko.ts +30 -29
  45. package/localization/generated/locale-codes.js +79 -79
  46. package/localization/generated/lt.ts +30 -29
  47. package/localization/generated/lv.ts +30 -29
  48. package/localization/generated/nb.ts +30 -29
  49. package/localization/generated/nl.ts +30 -29
  50. package/localization/generated/pl.ts +30 -29
  51. package/localization/generated/pt-BR.ts +30 -29
  52. package/localization/generated/pt-PT.ts +30 -29
  53. package/localization/generated/ro.ts +30 -29
  54. package/localization/generated/ru.ts +30 -29
  55. package/localization/generated/sk.ts +30 -29
  56. package/localization/generated/sl.ts +30 -29
  57. package/localization/generated/sv.ts +30 -29
  58. package/localization/generated/tr.ts +30 -29
  59. package/localization/generated/uk.ts +30 -29
  60. package/localization/generated/zh-hans.ts +30 -29
  61. package/localization/hu.xlf +72 -69
  62. package/localization/id.xlf +72 -69
  63. package/localization/it.xlf +72 -69
  64. package/localization/ja.xlf +72 -69
  65. package/localization/ko.xlf +72 -69
  66. package/localization/lt.xlf +72 -69
  67. package/localization/lv.xlf +72 -69
  68. package/localization/nb.xlf +72 -69
  69. package/localization/nl.xlf +72 -69
  70. package/localization/pl.xlf +72 -69
  71. package/localization/pt-BR.xlf +72 -69
  72. package/localization/pt-PT.xlf +72 -69
  73. package/localization/ro.xlf +72 -69
  74. package/localization/ru.xlf +72 -69
  75. package/localization/sk.xlf +72 -69
  76. package/localization/sl.xlf +72 -69
  77. package/localization/sv.xlf +72 -69
  78. package/localization/tr.xlf +72 -69
  79. package/localization/uk.xlf +72 -69
  80. package/localization/zh-hans.xlf +72 -69
  81. package/package.json +4 -3
  82. package/src/lib/combobox.ts +455 -455
  83. package/src/lib/highlighter-fill.svg +5 -5
  84. package/src/snippets/Beispiel-Choice.html +57 -57
  85. package/src/snippets/Beispiel-Mark.html +13 -13
  86. package/src/snippets/Beispiel-Order.html +52 -52
  87. package/src/snippets/Beispiel-Text.html +20 -20
  88. package/src/snippets/choice.html +7 -7
  89. package/src/snippets/cloze.html +3 -3
  90. package/src/snippets/mark.html +3 -3
  91. package/src/snippets/order.html +7 -7
  92. package/src/snippets/pairing.html +9 -9
  93. package/src/snippets/speech.html +3 -3
  94. package/src/snippets/text.html +3 -3
  95. package/src/snippets/wordsearch.html +3 -3
  96. package/src/widgets/webwriter-choice-item.ts +256 -253
  97. package/src/widgets/webwriter-choice.ts +352 -336
  98. package/src/widgets/webwriter-cloze-gap.ts +215 -215
  99. package/src/widgets/webwriter-cloze.ts +135 -135
  100. package/src/widgets/webwriter-mark.ts +431 -431
  101. package/src/widgets/webwriter-order-item.ts +440 -440
  102. package/src/widgets/webwriter-order.ts +326 -309
  103. package/src/widgets/webwriter-pairing-item.ts +160 -160
  104. package/src/widgets/webwriter-pairing.ts +192 -192
  105. package/src/widgets/webwriter-quiz.ts +281 -281
  106. package/src/widgets/webwriter-speech.ts +272 -272
  107. package/src/widgets/webwriter-task-explainer.ts +42 -42
  108. package/src/widgets/webwriter-task-hint.ts +22 -22
  109. package/src/widgets/webwriter-task-prompt.ts +23 -23
  110. package/src/widgets/webwriter-task.ts +554 -546
  111. package/src/widgets/webwriter-text.ts +176 -155
  112. package/tsconfig.json +6 -6
@@ -1,193 +1,193 @@
1
- import {html, css, PropertyValues} from "lit"
2
- import {LitElementWw, option} from "@webwriter/lit"
3
- import {customElement, property, queryAll} from "lit/decorators.js"
4
- import "@shoelace-style/shoelace/dist/themes/light.css"
5
-
6
- import IconPlus from "bootstrap-icons/icons/plus.svg"
7
- import SlButton from "@shoelace-style/shoelace/dist/components/button/button.component.js"
8
- import SlIcon from "@shoelace-style/shoelace/dist/components/icon/icon.component.js"
9
- import type { WebwriterPairingItem } from "./webwriter-pairing-item"
10
-
11
- import LOCALIZE from "../../localization/generated"
12
- import {msg} from "@lit/localize"
13
-
14
- declare global {interface HTMLElementTagNameMap {
15
- "webwriter-pairing": WebwriterPairing;
16
- }}
17
-
18
- @customElement("webwriter-pairing")
19
- export class WebwriterPairing extends LitElementWw {
20
-
21
- localize = LOCALIZE
22
-
23
- static shadowRootOptions = {...LitElementWw.shadowRootOptions, slotAssignment: "manual" as const}
24
-
25
- static scopedElements = {
26
- "sl-button": SlButton,
27
- "sl-icon": SlIcon
28
- }
29
-
30
- static styles = css`
31
- :host {
32
- display: flex !important;
33
- flex-direction: row;
34
- flex-wrap: wrap;
35
- gap: 30px;
36
- padding-bottom: 30px;
37
- }
38
-
39
- sl-button {
40
-
41
- &::part(base) {
42
- width: 125px;
43
- height: 125px;
44
- border: 1px solid darkgray;
45
- border-radius: 2px;
46
- padding: 10px;
47
- overflow: hidden;
48
- }
49
-
50
- &::part(label) {
51
- padding: 0;
52
- display: flex;
53
- flex-direction: row;
54
- align-items: center;
55
- justify-content: center;
56
- }
57
- }
58
-
59
- .pair {
60
- position: relative;
61
-
62
- & .a-slot, & .b-slot {
63
- display: block;
64
-
65
- &:is(:focus-within, :has(::selection)) {
66
- background: green;
67
- }
68
- }
69
-
70
- & .b-slot {
71
- position: absolute;
72
- left: 20px;
73
- top: 20px;
74
- z-index: 1000;
75
- }
76
- }
77
-
78
- `
79
-
80
- @property({attribute: true, reflect: true})
81
- @option({type: "select", options: [
82
- {value: "drag"},
83
- {value: "memory"}
84
- ]})
85
- accessor mode: "drag" | "memory" = "drag"
86
-
87
- @property({type: Array, attribute: true, reflect: true})
88
- accessor solution: ([string, string] | string)[] = []
89
-
90
- addItem = () => {
91
- const item = document.createElement("webwriter-pairing-item")
92
- const picture = document.createElement("picture")
93
- item.appendChild(picture)
94
- this.appendChild(item)
95
- }
96
-
97
- Pair = (i: number) => {
98
- return html`<div class="pair">
99
- <slot class="a-slot" name=${`${i}a`}></slot>
100
- <slot class="b-slot" name=${`${i}b`}></slot>
101
- </div>`
102
- }
103
-
104
- getPairSlot() {}
105
-
106
-
107
- get pairs() {
108
- let allPairs = Array.from(this.children) as (WebwriterPairingItem | [WebwriterPairingItem, WebwriterPairingItem])[]
109
- for(const [a, b] of this.solution) {
110
- const elA = this.querySelector(`webwriter-pairing-item#${a}`) as WebwriterPairingItem
111
- const elB = this.querySelector(`webwriter-pairing-item#${b}`) as WebwriterPairingItem
112
- allPairs.splice(allPairs.indexOf(elA), 1, [elA, elB])
113
- allPairs.splice(allPairs.indexOf(elB), 1)
114
- }
115
- return allPairs
116
- }
117
-
118
- pair(a: string, b?: string) {
119
- let pairIds = this.pairs.map(entry => Array.isArray(entry)? [entry[0].id, entry[1].id]: entry.id)
120
- const pairIndexOfA = this.solution.findIndex(val => Array.isArray(val) && val.includes(a))
121
- const pairIndexOfB = this.solution.findIndex(val => Array.isArray(val) && val.includes(b))
122
- if(!b) {
123
- pairIds.splice(pairIndexOfA, 1, (pairIds[pairIndexOfA] as [string, string]).filter(id => id !== a)[0])
124
- pairIds.push(a)
125
- }
126
- else {
127
- if(pairIndexOfB !== -1) {
128
- pairIds.splice(pairIndexOfB, 1, (pairIds[pairIndexOfB] as [string, string]).filter(id => id !== b)[0])
129
- }
130
- const indexOfA = this.solution.indexOf(a)
131
- pairIds.splice(indexOfA, 1, [a, b])
132
- pairIds = pairIds.filter(id => id !== b)
133
- }
134
- this.solution = pairIds.filter(entry => Array.isArray(entry)) as any
135
- }
136
-
137
- handlePairWith(e: CustomEvent) {
138
- if(e.type === "ww-pairwith") {
139
- this.pair((e.target as HTMLElement).id, e.detail.with)
140
- }
141
- }
142
-
143
- observer: MutationObserver
144
-
145
- connectedCallback(): void {
146
- super.connectedCallback()
147
- this.observer = new MutationObserver(() => {
148
- let childIds = Array.from(this.children).map(child => child.id)
149
- let solution = [...this.solution]
150
- // solution = solution.filter(k => childIds.includes(k as any))
151
- // solution = [...solution, ...childIds]
152
- this.requestUpdate()
153
- })
154
- this.observer.observe(this, {childList: true})
155
- this.addEventListener("ww-pairwith", this.handlePairWith)
156
- }
157
-
158
- disconnectedCallback(): void {
159
- super.disconnectedCallback()
160
- this.observer.disconnect()
161
- }
162
-
163
- protected willUpdate(_changedProperties: PropertyValues): void {
164
- // this.solution = this.solution.filter(id => childIds.includes(id))
165
- }
166
-
167
- protected updated(_changedProperties: PropertyValues): void {
168
- const slots = Array.from(this.slots)
169
- for(const value of this.pairs) {
170
- if(Array.isArray(value)) {
171
- const [a, b] = value
172
- slots.shift().assign(a)
173
- slots.shift().assign(b)
174
- }
175
- else {
176
- slots.shift().assign(value)
177
- slots.shift()
178
- }
179
- }
180
- }
181
-
182
- @queryAll("slot")
183
- accessor slots: NodeListOf<HTMLSlotElement>
184
-
185
- render() {
186
- return html`
187
- ${this.pairs.map((el, i) => this.Pair(i))}
188
- <sl-button @click=${this.addItem}>
189
- <sl-icon src=${IconPlus}></sl-icon>
190
- </sl-button>
191
- `
192
- }
1
+ import {html, css, PropertyValues} from "lit"
2
+ import {LitElementWw, option} from "@webwriter/lit"
3
+ import {customElement, property, queryAll} from "lit/decorators.js"
4
+ import "@shoelace-style/shoelace/dist/themes/light.css"
5
+
6
+ import IconPlus from "bootstrap-icons/icons/plus.svg"
7
+ import SlButton from "@shoelace-style/shoelace/dist/components/button/button.component.js"
8
+ import SlIcon from "@shoelace-style/shoelace/dist/components/icon/icon.component.js"
9
+ import type { WebwriterPairingItem } from "./webwriter-pairing-item"
10
+
11
+ import LOCALIZE from "../../localization/generated"
12
+ import {msg} from "@lit/localize"
13
+
14
+ declare global {interface HTMLElementTagNameMap {
15
+ "webwriter-pairing": WebwriterPairing;
16
+ }}
17
+
18
+ @customElement("webwriter-pairing")
19
+ export class WebwriterPairing extends LitElementWw {
20
+
21
+ localize = LOCALIZE
22
+
23
+ static shadowRootOptions = {...LitElementWw.shadowRootOptions, slotAssignment: "manual" as const}
24
+
25
+ static scopedElements = {
26
+ "sl-button": SlButton,
27
+ "sl-icon": SlIcon
28
+ }
29
+
30
+ static styles = css`
31
+ :host {
32
+ display: flex !important;
33
+ flex-direction: row;
34
+ flex-wrap: wrap;
35
+ gap: 30px;
36
+ padding-bottom: 30px;
37
+ }
38
+
39
+ sl-button {
40
+
41
+ &::part(base) {
42
+ width: 125px;
43
+ height: 125px;
44
+ border: 1px solid darkgray;
45
+ border-radius: 2px;
46
+ padding: 10px;
47
+ overflow: hidden;
48
+ }
49
+
50
+ &::part(label) {
51
+ padding: 0;
52
+ display: flex;
53
+ flex-direction: row;
54
+ align-items: center;
55
+ justify-content: center;
56
+ }
57
+ }
58
+
59
+ .pair {
60
+ position: relative;
61
+
62
+ & .a-slot, & .b-slot {
63
+ display: block;
64
+
65
+ &:is(:focus-within, :has(::selection)) {
66
+ background: green;
67
+ }
68
+ }
69
+
70
+ & .b-slot {
71
+ position: absolute;
72
+ left: 20px;
73
+ top: 20px;
74
+ z-index: 1000;
75
+ }
76
+ }
77
+
78
+ `
79
+
80
+ @property({attribute: true, reflect: true})
81
+ @option({type: "select", options: [
82
+ {value: "drag"},
83
+ {value: "memory"}
84
+ ]})
85
+ accessor mode: "drag" | "memory" = "drag"
86
+
87
+ @property({type: Array, attribute: true, reflect: true})
88
+ accessor solution: ([string, string] | string)[] = []
89
+
90
+ addItem = () => {
91
+ const item = document.createElement("webwriter-pairing-item")
92
+ const picture = document.createElement("picture")
93
+ item.appendChild(picture)
94
+ this.appendChild(item)
95
+ }
96
+
97
+ Pair = (i: number) => {
98
+ return html`<div class="pair">
99
+ <slot class="a-slot" name=${`${i}a`}></slot>
100
+ <slot class="b-slot" name=${`${i}b`}></slot>
101
+ </div>`
102
+ }
103
+
104
+ getPairSlot() {}
105
+
106
+
107
+ get pairs() {
108
+ let allPairs = Array.from(this.children) as (WebwriterPairingItem | [WebwriterPairingItem, WebwriterPairingItem])[]
109
+ for(const [a, b] of this.solution) {
110
+ const elA = this.querySelector(`webwriter-pairing-item#${a}`) as WebwriterPairingItem
111
+ const elB = this.querySelector(`webwriter-pairing-item#${b}`) as WebwriterPairingItem
112
+ allPairs.splice(allPairs.indexOf(elA), 1, [elA, elB])
113
+ allPairs.splice(allPairs.indexOf(elB), 1)
114
+ }
115
+ return allPairs
116
+ }
117
+
118
+ pair(a: string, b?: string) {
119
+ let pairIds = this.pairs.map(entry => Array.isArray(entry)? [entry[0].id, entry[1].id]: entry.id)
120
+ const pairIndexOfA = this.solution.findIndex(val => Array.isArray(val) && val.includes(a))
121
+ const pairIndexOfB = this.solution.findIndex(val => Array.isArray(val) && val.includes(b))
122
+ if(!b) {
123
+ pairIds.splice(pairIndexOfA, 1, (pairIds[pairIndexOfA] as [string, string]).filter(id => id !== a)[0])
124
+ pairIds.push(a)
125
+ }
126
+ else {
127
+ if(pairIndexOfB !== -1) {
128
+ pairIds.splice(pairIndexOfB, 1, (pairIds[pairIndexOfB] as [string, string]).filter(id => id !== b)[0])
129
+ }
130
+ const indexOfA = this.solution.indexOf(a)
131
+ pairIds.splice(indexOfA, 1, [a, b])
132
+ pairIds = pairIds.filter(id => id !== b)
133
+ }
134
+ this.solution = pairIds.filter(entry => Array.isArray(entry)) as any
135
+ }
136
+
137
+ handlePairWith(e: CustomEvent) {
138
+ if(e.type === "ww-pairwith") {
139
+ this.pair((e.target as HTMLElement).id, e.detail.with)
140
+ }
141
+ }
142
+
143
+ observer: MutationObserver
144
+
145
+ connectedCallback(): void {
146
+ super.connectedCallback()
147
+ this.observer = new MutationObserver(() => {
148
+ let childIds = Array.from(this.children).map(child => child.id)
149
+ let solution = [...this.solution]
150
+ // solution = solution.filter(k => childIds.includes(k as any))
151
+ // solution = [...solution, ...childIds]
152
+ this.requestUpdate()
153
+ })
154
+ this.observer.observe(this, {childList: true})
155
+ this.addEventListener("ww-pairwith", this.handlePairWith)
156
+ }
157
+
158
+ disconnectedCallback(): void {
159
+ super.disconnectedCallback()
160
+ this.observer.disconnect()
161
+ }
162
+
163
+ protected willUpdate(_changedProperties: PropertyValues): void {
164
+ // this.solution = this.solution.filter(id => childIds.includes(id))
165
+ }
166
+
167
+ protected updated(_changedProperties: PropertyValues): void {
168
+ const slots = Array.from(this.slots)
169
+ for(const value of this.pairs) {
170
+ if(Array.isArray(value)) {
171
+ const [a, b] = value
172
+ slots.shift().assign(a)
173
+ slots.shift().assign(b)
174
+ }
175
+ else {
176
+ slots.shift().assign(value)
177
+ slots.shift()
178
+ }
179
+ }
180
+ }
181
+
182
+ @queryAll("slot")
183
+ accessor slots: NodeListOf<HTMLSlotElement>
184
+
185
+ render() {
186
+ return html`
187
+ ${this.pairs.map((el, i) => this.Pair(i))}
188
+ <sl-button @click=${this.addItem}>
189
+ <sl-icon src=${IconPlus}></sl-icon>
190
+ </sl-button>
191
+ `
192
+ }
193
193
  }