@webwriter/quiz 1.0.5 → 1.0.7

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 (128) hide show
  1. package/LICENSE +6 -6
  2. package/custom.d.ts +175 -175
  3. package/dist/widgets/webwriter-choice-item.css +1 -1
  4. package/dist/widgets/webwriter-choice-item.js +1886 -802
  5. package/dist/widgets/webwriter-choice.css +1 -1
  6. package/dist/widgets/webwriter-choice.js +1943 -846
  7. package/dist/widgets/webwriter-cloze-gap.css +1 -1
  8. package/dist/widgets/webwriter-cloze-gap.js +1988 -902
  9. package/dist/widgets/webwriter-cloze.css +1 -1
  10. package/dist/widgets/webwriter-cloze.js +1833 -748
  11. package/dist/widgets/webwriter-mark.css +1 -1
  12. package/dist/widgets/webwriter-mark.js +1848 -762
  13. package/dist/widgets/webwriter-order-item.css +1 -1
  14. package/dist/widgets/webwriter-order-item.js +1884 -799
  15. package/dist/widgets/webwriter-order.css +1 -1
  16. package/dist/widgets/webwriter-order.js +1882 -790
  17. package/dist/widgets/webwriter-pairing-item.css +1 -1
  18. package/dist/widgets/webwriter-pairing-item.js +1718 -614
  19. package/dist/widgets/webwriter-pairing.css +1 -1
  20. package/dist/widgets/webwriter-pairing.js +1873 -781
  21. package/dist/widgets/webwriter-quiz.css +1 -1
  22. package/dist/widgets/webwriter-quiz.js +2241 -1026
  23. package/dist/widgets/webwriter-speech.css +1 -1
  24. package/dist/widgets/webwriter-speech.js +2179 -961
  25. package/dist/widgets/webwriter-task-explainer.css +1 -1
  26. package/dist/widgets/webwriter-task-explainer.js +1704 -600
  27. package/dist/widgets/webwriter-task-hint.css +1 -1
  28. package/dist/widgets/webwriter-task-hint.js +1695 -591
  29. package/dist/widgets/webwriter-task-prompt.css +1 -1
  30. package/dist/widgets/webwriter-task-prompt.js +1670 -566
  31. package/dist/widgets/webwriter-task.css +1 -1
  32. package/dist/widgets/webwriter-task.js +2361 -1143
  33. package/dist/widgets/webwriter-text.css +1 -1
  34. package/dist/widgets/webwriter-text.js +1876 -770
  35. package/icon.svg +1 -0
  36. package/lit-localize.json +15 -0
  37. package/localization/bg.xlf +54 -0
  38. package/localization/cs.xlf +54 -0
  39. package/localization/da.xlf +54 -0
  40. package/localization/de.xlf +54 -0
  41. package/localization/el.xlf +54 -0
  42. package/localization/es.xlf +54 -0
  43. package/localization/et.xlf +54 -0
  44. package/localization/fi.xlf +54 -0
  45. package/localization/fr.xlf +54 -0
  46. package/localization/generated/bg.ts +25 -0
  47. package/localization/generated/cs.ts +25 -0
  48. package/localization/generated/da.ts +25 -0
  49. package/localization/generated/de.ts +25 -0
  50. package/localization/generated/el.ts +25 -0
  51. package/localization/generated/es.ts +25 -0
  52. package/localization/generated/et.ts +25 -0
  53. package/localization/generated/fi.ts +25 -0
  54. package/localization/generated/fr.ts +25 -0
  55. package/localization/generated/hu.ts +25 -0
  56. package/localization/generated/id.ts +25 -0
  57. package/localization/generated/index.js +3 -0
  58. package/localization/generated/it.ts +25 -0
  59. package/localization/generated/ja.ts +25 -0
  60. package/localization/generated/ko.ts +25 -0
  61. package/localization/generated/locale-codes.js +79 -0
  62. package/localization/generated/lt.ts +25 -0
  63. package/localization/generated/lv.ts +25 -0
  64. package/localization/generated/nb.ts +25 -0
  65. package/localization/generated/nl.ts +25 -0
  66. package/localization/generated/pl.ts +25 -0
  67. package/localization/generated/pt-BR.ts +25 -0
  68. package/localization/generated/pt-PT.ts +25 -0
  69. package/localization/generated/ro.ts +25 -0
  70. package/localization/generated/ru.ts +25 -0
  71. package/localization/generated/sk.ts +25 -0
  72. package/localization/generated/sl.ts +25 -0
  73. package/localization/generated/sv.ts +25 -0
  74. package/localization/generated/tr.ts +25 -0
  75. package/localization/generated/uk.ts +25 -0
  76. package/localization/generated/zh-hans.ts +25 -0
  77. package/localization/hu.xlf +54 -0
  78. package/localization/id.xlf +54 -0
  79. package/localization/it.xlf +54 -0
  80. package/localization/ja.xlf +54 -0
  81. package/localization/ko.xlf +54 -0
  82. package/localization/lt.xlf +54 -0
  83. package/localization/lv.xlf +54 -0
  84. package/localization/nb.xlf +54 -0
  85. package/localization/nl.xlf +54 -0
  86. package/localization/pl.xlf +54 -0
  87. package/localization/pt-BR.xlf +54 -0
  88. package/localization/pt-PT.xlf +54 -0
  89. package/localization/ro.xlf +54 -0
  90. package/localization/ru.xlf +54 -0
  91. package/localization/sk.xlf +54 -0
  92. package/localization/sl.xlf +54 -0
  93. package/localization/sv.xlf +54 -0
  94. package/localization/tr.xlf +54 -0
  95. package/localization/uk.xlf +54 -0
  96. package/localization/zh-hans.xlf +54 -0
  97. package/package.json +281 -193
  98. package/src/lib/combobox.ts +455 -455
  99. package/src/lib/highlighter-fill.svg +5 -5
  100. package/src/snippets/Beispiel-Choice.html +57 -0
  101. package/src/snippets/Beispiel-Mark.html +14 -0
  102. package/src/snippets/Beispiel-Order.html +52 -0
  103. package/src/snippets/Beispiel-Text.html +20 -0
  104. package/src/snippets/choice.html +7 -7
  105. package/src/snippets/cloze.html +3 -3
  106. package/src/snippets/mark.html +3 -3
  107. package/src/snippets/order.html +7 -7
  108. package/src/snippets/pairing.html +9 -9
  109. package/src/snippets/speech.html +3 -3
  110. package/src/snippets/text.html +3 -3
  111. package/src/snippets/wordsearch.html +3 -3
  112. package/src/widgets/webwriter-choice-item.ts +250 -250
  113. package/src/widgets/webwriter-choice.ts +314 -309
  114. package/src/widgets/webwriter-cloze-gap.ts +215 -216
  115. package/src/widgets/webwriter-cloze.ts +135 -135
  116. package/src/widgets/webwriter-mark.ts +431 -434
  117. package/src/widgets/webwriter-order-item.ts +437 -436
  118. package/src/widgets/webwriter-order.ts +284 -279
  119. package/src/widgets/webwriter-pairing-item.ts +160 -155
  120. package/src/widgets/webwriter-pairing.ts +192 -187
  121. package/src/widgets/webwriter-quiz.ts +281 -280
  122. package/src/widgets/webwriter-speech.ts +272 -267
  123. package/src/widgets/webwriter-task-explainer.ts +42 -37
  124. package/src/widgets/webwriter-task-hint.ts +22 -16
  125. package/src/widgets/webwriter-task-prompt.ts +23 -17
  126. package/src/widgets/webwriter-task.ts +546 -543
  127. package/src/widgets/webwriter-text.ts +135 -130
  128. package/tsconfig.json +6 -6
@@ -1,136 +1,136 @@
1
- import {html, css, LitElement} from "lit"
2
- import {LitElementWw} from "@webwriter/lit"
3
- import {customElement, query} from "lit/decorators.js"
4
- import {styleMap} from "lit/directives/style-map.js"
5
-
6
- import SlIconButton from "@shoelace-style/shoelace/dist/components/icon-button/icon-button.component.js"
7
-
8
-
9
- import IconTextarea from "bootstrap-icons/icons/textarea.svg"
10
- import { WebwriterClozeGap } from "./webwriter-cloze-gap.js"
11
- import "@shoelace-style/shoelace/dist/themes/light.css"
12
-
13
- declare global {interface HTMLElementTagNameMap {
14
- "webwriter-cloze": WebwriterCloze;
15
- }}
16
-
17
- @customElement("webwriter-cloze")
18
- export class WebwriterCloze extends LitElementWw {
19
-
20
- static shadowRootOptions: ShadowRootInit = {...LitElementWw.shadowRootOptions, delegatesFocus: false}
21
-
22
- static localization = {}
23
-
24
- msg = (str: string) => this.lang in WebwriterCloze.localization? WebwriterCloze.localization[this.lang][str] ?? str: str
25
-
26
-
27
- static scopedElements = {
28
- "sl-icon-button": SlIconButton
29
- }
30
-
31
- static styles = css`
32
- :host {
33
- min-height: 1rem;
34
- position: relative;
35
- }
36
-
37
- slot {
38
- display: block;
39
- cursor: text;
40
- }
41
-
42
- slot[data-empty]:after {
43
- content: var(--placeholder);
44
- position: absolute;
45
- left: 0;
46
- top: 0;
47
- color: darkgray;
48
- pointer-events: none;
49
- user-select: none;
50
- }
51
-
52
- slot::after, slot::before {
53
- content: ' ';
54
- }
55
-
56
- #add-gap {
57
- position: absolute;
58
- right: 0;
59
- top: 0;
60
- background: rgba(255, 255, 255, 0.85);
61
-
62
- &[data-highlighting]::part(base) {
63
- background: var(--sl-color-primary-100);
64
- }
65
- }
66
-
67
- :host(:not([contenteditable=true]):not([contenteditable=""])) .author-only {
68
- display: none;
69
- }
70
- `
71
-
72
- @query("#add-gap")
73
- accessor addGapButton: SlIconButton
74
-
75
- observer: MutationObserver
76
-
77
- connectedCallback(): void {
78
- super.connectedCallback()
79
- document.addEventListener("selectionchange", e => {
80
- const sel = document.getSelection()
81
- const node = document.getSelection()?.anchorNode
82
- const el = node.nodeType === node.TEXT_NODE? node.parentElement: node as HTMLElement
83
- this.addGapButton.toggleAttribute("data-visible", el?.closest("webwriter-cloze")? true: false)
84
- if(el?.closest("webwriter-cloze") && !sel.isCollapsed) {
85
- this.addGapButton.toggleAttribute("data-highlighting", true)
86
- }
87
- else {
88
- this.addGapButton.toggleAttribute("data-highlighting", false)
89
- }
90
- })
91
- this.observer = new MutationObserver(() => this.requestUpdate())
92
- this.observer.observe(this, {characterData: true, childList: true, subtree: true})
93
- }
94
-
95
-
96
- disconnectedCallback(): void {
97
- super.disconnectedCallback()
98
- this.observer?.disconnect()
99
- }
100
-
101
- toggleGap = () => {
102
- const sel = document.getSelection()
103
- const selectedElement = sel.anchorNode.childNodes.item(sel.anchorOffset)
104
- if(selectedElement?.nodeName.toLowerCase() === "webwriter-cloze-gap") {
105
- const gap = selectedElement as WebwriterClozeGap
106
- selectedElement.replaceWith(document.createTextNode(gap.value))
107
- }
108
- else if(this.contains(sel.anchorNode)) {
109
- if(sel.anchorNode !== this) {
110
- const textContent = sel.toString()
111
- sel.deleteFromDocument()
112
- const textNode = sel.anchorNode as Text
113
- const at = sel.anchorOffset
114
- const clozeGap = document.createElement("webwriter-cloze-gap")
115
- clozeGap.classList.add("webwriter-new")
116
- clozeGap.setAttribute("value", textContent)
117
- const afterTextNode = textNode.splitText(at)
118
- afterTextNode.textContent = afterTextNode.textContent.trimStart()
119
- textNode.textContent = textNode.textContent.trimEnd()
120
- textNode.parentElement.insertBefore(clozeGap, afterTextNode)
121
- }
122
- else {
123
- const clozeGap = document.createElement("webwriter-cloze-gap")
124
- clozeGap.setAttribute("value", "")
125
- this.append(clozeGap)
126
- }
127
- }
128
- }
129
-
130
- render() {
131
- return html`
132
- <slot style=${styleMap({"--placeholder": `"${this.msg("Text to add gaps to")}"`})} ?data-empty=${!this.textContent.trim() && !this.querySelectorAll("& > p *:not(br)").length}></slot>
133
- <sl-icon-button class="author-only" id="add-gap" src=${IconTextarea} @click=${this.toggleGap}></sl-icon-button>
134
- `
135
- }
1
+ import {html, css, LitElement} from "lit"
2
+ import {LitElementWw} from "@webwriter/lit"
3
+ import {customElement, query} from "lit/decorators.js"
4
+ import {styleMap} from "lit/directives/style-map.js"
5
+
6
+ import SlIconButton from "@shoelace-style/shoelace/dist/components/icon-button/icon-button.component.js"
7
+
8
+
9
+ import IconTextarea from "bootstrap-icons/icons/textarea.svg"
10
+ import { WebwriterClozeGap } from "./webwriter-cloze-gap.js"
11
+ import "@shoelace-style/shoelace/dist/themes/light.css"
12
+
13
+ import LOCALIZE from "../../localization/generated"
14
+ import {msg} from "@lit/localize"
15
+
16
+ declare global {interface HTMLElementTagNameMap {
17
+ "webwriter-cloze": WebwriterCloze;
18
+ }}
19
+
20
+ @customElement("webwriter-cloze")
21
+ export class WebwriterCloze extends LitElementWw {
22
+
23
+ localize = LOCALIZE
24
+
25
+ static shadowRootOptions: ShadowRootInit = {...LitElementWw.shadowRootOptions, delegatesFocus: false}
26
+
27
+ static scopedElements = {
28
+ "sl-icon-button": SlIconButton
29
+ }
30
+
31
+ static styles = css`
32
+ :host {
33
+ min-height: 1rem;
34
+ position: relative;
35
+ }
36
+
37
+ slot {
38
+ display: block;
39
+ cursor: text;
40
+ }
41
+
42
+ slot[data-empty]:after {
43
+ content: var(--placeholder);
44
+ position: absolute;
45
+ left: 0;
46
+ top: 0;
47
+ color: darkgray;
48
+ pointer-events: none;
49
+ user-select: none;
50
+ }
51
+
52
+ slot::after, slot::before {
53
+ content: ' ';
54
+ }
55
+
56
+ #add-gap {
57
+ position: absolute;
58
+ right: 0;
59
+ top: 0;
60
+ background: rgba(255, 255, 255, 0.85);
61
+
62
+ &[data-highlighting]::part(base) {
63
+ background: var(--sl-color-primary-100);
64
+ }
65
+ }
66
+
67
+ :host(:not([contenteditable=true]):not([contenteditable=""])) .author-only {
68
+ display: none;
69
+ }
70
+ `
71
+
72
+ @query("#add-gap")
73
+ accessor addGapButton: SlIconButton
74
+
75
+ observer: MutationObserver
76
+
77
+ connectedCallback(): void {
78
+ super.connectedCallback()
79
+ document.addEventListener("selectionchange", e => {
80
+ const sel = document.getSelection()
81
+ const node = document.getSelection()?.anchorNode
82
+ const el = node.nodeType === node.TEXT_NODE? node.parentElement: node as HTMLElement
83
+ this.addGapButton.toggleAttribute("data-visible", el?.closest("webwriter-cloze")? true: false)
84
+ if(el?.closest("webwriter-cloze") && !sel.isCollapsed) {
85
+ this.addGapButton.toggleAttribute("data-highlighting", true)
86
+ }
87
+ else {
88
+ this.addGapButton.toggleAttribute("data-highlighting", false)
89
+ }
90
+ })
91
+ this.observer = new MutationObserver(() => this.requestUpdate())
92
+ this.observer.observe(this, {characterData: true, childList: true, subtree: true})
93
+ }
94
+
95
+
96
+ disconnectedCallback(): void {
97
+ super.disconnectedCallback()
98
+ this.observer?.disconnect()
99
+ }
100
+
101
+ toggleGap = () => {
102
+ const sel = document.getSelection()
103
+ const selectedElement = sel.anchorNode.childNodes.item(sel.anchorOffset)
104
+ if(selectedElement?.nodeName.toLowerCase() === "webwriter-cloze-gap") {
105
+ const gap = selectedElement as WebwriterClozeGap
106
+ selectedElement.replaceWith(document.createTextNode(gap.value))
107
+ }
108
+ else if(this.contains(sel.anchorNode)) {
109
+ if(sel.anchorNode !== this) {
110
+ const textContent = sel.toString()
111
+ sel.deleteFromDocument()
112
+ const textNode = sel.anchorNode as Text
113
+ const at = sel.anchorOffset
114
+ const clozeGap = document.createElement("webwriter-cloze-gap")
115
+ clozeGap.classList.add("webwriter-new")
116
+ clozeGap.setAttribute("value", textContent)
117
+ const afterTextNode = textNode.splitText(at)
118
+ afterTextNode.textContent = afterTextNode.textContent.trimStart()
119
+ textNode.textContent = textNode.textContent.trimEnd()
120
+ textNode.parentElement.insertBefore(clozeGap, afterTextNode)
121
+ }
122
+ else {
123
+ const clozeGap = document.createElement("webwriter-cloze-gap")
124
+ clozeGap.setAttribute("value", "")
125
+ this.append(clozeGap)
126
+ }
127
+ }
128
+ }
129
+
130
+ render() {
131
+ return html`
132
+ <slot style=${styleMap({"--placeholder": `"${msg("Text to add gaps to")}"`})} ?data-empty=${!this.textContent.trim() && !this.querySelectorAll("& > p *:not(br)").length}></slot>
133
+ <sl-icon-button class="author-only" id="add-gap" src=${IconTextarea} @click=${this.toggleGap}></sl-icon-button>
134
+ `
135
+ }
136
136
  }