@riebeckite/plugin-flashcards 0.0.5 → 0.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.
- package/dist/client.js +9 -3
- package/dist/index.d.ts +1 -1
- package/dist/index.js +33 -26
- package/package.json +2 -2
- package/style.css +116 -116
package/dist/client.js
CHANGED
|
@@ -118,7 +118,8 @@ function createDeckUi(doc, prefix) {
|
|
|
118
118
|
const answer = doc.createElement("p");
|
|
119
119
|
answer.className = `${prefix}__answer`;
|
|
120
120
|
answer.hidden = true;
|
|
121
|
-
card.
|
|
121
|
+
card.appendChild(question);
|
|
122
|
+
card.appendChild(answer);
|
|
122
123
|
const controls = doc.createElement("div");
|
|
123
124
|
controls.className = `${prefix}__controls`;
|
|
124
125
|
const prev = createButton(doc, prefix, "prev", "Previous card");
|
|
@@ -126,8 +127,13 @@ function createDeckUi(doc, prefix) {
|
|
|
126
127
|
const next = createButton(doc, prefix, "next", "Next card");
|
|
127
128
|
const shuffle = createButton(doc, prefix, "shuffle", "Shuffle cards");
|
|
128
129
|
reveal.setAttribute("aria-pressed", "false");
|
|
129
|
-
controls.
|
|
130
|
-
|
|
130
|
+
controls.appendChild(prev);
|
|
131
|
+
controls.appendChild(reveal);
|
|
132
|
+
controls.appendChild(next);
|
|
133
|
+
controls.appendChild(shuffle);
|
|
134
|
+
root.appendChild(counter);
|
|
135
|
+
root.appendChild(card);
|
|
136
|
+
root.appendChild(controls);
|
|
131
137
|
return { root, counter, question, answer, reveal, prev, next, shuffle };
|
|
132
138
|
}
|
|
133
139
|
function createButton(doc, prefix, action, label) {
|
package/dist/index.d.ts
CHANGED
|
@@ -5,8 +5,8 @@ export { parseFlashcards, splitFlashcardGroups } from "./src/parse.js";
|
|
|
5
5
|
export { createFlashcardsPlaceholder, createFlashcardsPlaceholderPattern, decodeFlashcardsSource, encodeFlashcardsSource, FLASHCARDS_ATTRIBUTE, } from "./src/placeholder.js";
|
|
6
6
|
export { remarkFlashcards } from "./src/remark.js";
|
|
7
7
|
export { renderFlashcards, renderFlashcardsFallback, renderFlashcardsPayload, } from "./src/render.js";
|
|
8
|
-
export { createFlashcardsRuntime } from "./src/runtime.js";
|
|
9
8
|
export type { FlashcardsRuntime } from "./src/runtime.js";
|
|
9
|
+
export { createFlashcardsRuntime } from "./src/runtime.js";
|
|
10
10
|
export type { FlashcardsCard, FlashcardsOptions, FlashcardsParseFailure, FlashcardsParseResult, FlashcardsParseSuccess, FlashcardsPayload, ResolvedFlashcardsOptions, } from "./src/types.js";
|
|
11
11
|
export declare function flashcards(options?: FlashcardsOptions): import("@riebeckite/core").RiebeckitePlugin<FlashcardsOptions>;
|
|
12
12
|
export declare const flashcardsPlugin: typeof flashcards;
|
package/dist/index.js
CHANGED
|
@@ -20,24 +20,6 @@ function resolveFlashcardsOptions(options = {}) {
|
|
|
20
20
|
// src/remark.ts
|
|
21
21
|
import { visit } from "unist-util-visit";
|
|
22
22
|
|
|
23
|
-
// src/placeholder.ts
|
|
24
|
-
var FLASHCARDS_ATTRIBUTE = "data-rr-flashcards-spec";
|
|
25
|
-
function encodeFlashcardsSource(source) {
|
|
26
|
-
return encodeURIComponent(source);
|
|
27
|
-
}
|
|
28
|
-
function decodeFlashcardsSource(encoded) {
|
|
29
|
-
return decodeURIComponent(encoded);
|
|
30
|
-
}
|
|
31
|
-
function createFlashcardsPlaceholder(source) {
|
|
32
|
-
return `<div ${FLASHCARDS_ATTRIBUTE}="${encodeFlashcardsSource(source)}"></div>`;
|
|
33
|
-
}
|
|
34
|
-
function createFlashcardsPlaceholderPattern() {
|
|
35
|
-
return new RegExp(
|
|
36
|
-
`<div\\b[^>]*\\b${FLASHCARDS_ATTRIBUTE}="([^"]*)"[^>]*>\\s*</div>`,
|
|
37
|
-
"g"
|
|
38
|
-
);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
23
|
// src/parse.ts
|
|
42
24
|
var SEPARATOR_LINE = /^[ \t]*-{3,}[ \t]*$/gm;
|
|
43
25
|
var GROUP_BREAK = /\n[ \t]*\n/;
|
|
@@ -73,6 +55,24 @@ function parseCard(group) {
|
|
|
73
55
|
return { front, back };
|
|
74
56
|
}
|
|
75
57
|
|
|
58
|
+
// src/placeholder.ts
|
|
59
|
+
var FLASHCARDS_ATTRIBUTE = "data-rr-flashcards-spec";
|
|
60
|
+
function encodeFlashcardsSource(source) {
|
|
61
|
+
return encodeURIComponent(source);
|
|
62
|
+
}
|
|
63
|
+
function decodeFlashcardsSource(encoded) {
|
|
64
|
+
return decodeURIComponent(encoded);
|
|
65
|
+
}
|
|
66
|
+
function createFlashcardsPlaceholder(source) {
|
|
67
|
+
return `<div ${FLASHCARDS_ATTRIBUTE}="${encodeFlashcardsSource(source)}"></div>`;
|
|
68
|
+
}
|
|
69
|
+
function createFlashcardsPlaceholderPattern() {
|
|
70
|
+
return new RegExp(
|
|
71
|
+
`<div\\b[^>]*\\b${FLASHCARDS_ATTRIBUTE}="([^"]*)"[^>]*>\\s*</div>`,
|
|
72
|
+
"g"
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
76
|
// src/remark.ts
|
|
77
77
|
var FLASHCARDS_DIAGNOSTIC_SOURCE = "@riebeckite/plugin-flashcards";
|
|
78
78
|
function remarkFlashcards(options = {}) {
|
|
@@ -115,7 +115,11 @@ import {
|
|
|
115
115
|
} from "@riebeckite/core";
|
|
116
116
|
|
|
117
117
|
// src/render.ts
|
|
118
|
-
import {
|
|
118
|
+
import {
|
|
119
|
+
escapeHtml,
|
|
120
|
+
escapeHtmlAttribute,
|
|
121
|
+
escapeScriptJson
|
|
122
|
+
} from "@riebeckite/core";
|
|
119
123
|
function renderFlashcards(cards, options) {
|
|
120
124
|
const { className } = options;
|
|
121
125
|
const attributes = [
|
|
@@ -134,7 +138,7 @@ function renderFlashcards(cards, options) {
|
|
|
134
138
|
}
|
|
135
139
|
function renderFlashcardsPayload(cards) {
|
|
136
140
|
const payload = { cards: [...cards] };
|
|
137
|
-
return `<script type="application/json" data-flashcards-payload>${
|
|
141
|
+
return `<script type="application/json" data-flashcards-payload>${escapeScriptJson(JSON.stringify(payload))}</script>`;
|
|
138
142
|
}
|
|
139
143
|
function renderFlashcardsFallback(cards, className = "rb-flashcards") {
|
|
140
144
|
const items = cards.map((card) => renderFallbackItem(card, className)).join("");
|
|
@@ -150,9 +154,6 @@ function renderFallbackItem(card, className) {
|
|
|
150
154
|
"</li>"
|
|
151
155
|
].join("");
|
|
152
156
|
}
|
|
153
|
-
function escapeJsonForScript(json) {
|
|
154
|
-
return json.replace(/</g, "\\u003c").replace(/>/g, "\\u003e").replace(/&/g, "\\u0026").replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029");
|
|
155
|
-
}
|
|
156
157
|
|
|
157
158
|
// src/runtime.ts
|
|
158
159
|
function createFlashcardsRuntime(options) {
|
|
@@ -332,7 +333,8 @@ function createDeckUi(doc, prefix) {
|
|
|
332
333
|
const answer = doc.createElement("p");
|
|
333
334
|
answer.className = `${prefix}__answer`;
|
|
334
335
|
answer.hidden = true;
|
|
335
|
-
card.
|
|
336
|
+
card.appendChild(question);
|
|
337
|
+
card.appendChild(answer);
|
|
336
338
|
const controls = doc.createElement("div");
|
|
337
339
|
controls.className = `${prefix}__controls`;
|
|
338
340
|
const prev = createButton(doc, prefix, "prev", "Previous card");
|
|
@@ -340,8 +342,13 @@ function createDeckUi(doc, prefix) {
|
|
|
340
342
|
const next = createButton(doc, prefix, "next", "Next card");
|
|
341
343
|
const shuffle = createButton(doc, prefix, "shuffle", "Shuffle cards");
|
|
342
344
|
reveal.setAttribute("aria-pressed", "false");
|
|
343
|
-
controls.
|
|
344
|
-
|
|
345
|
+
controls.appendChild(prev);
|
|
346
|
+
controls.appendChild(reveal);
|
|
347
|
+
controls.appendChild(next);
|
|
348
|
+
controls.appendChild(shuffle);
|
|
349
|
+
root.appendChild(counter);
|
|
350
|
+
root.appendChild(card);
|
|
351
|
+
root.appendChild(controls);
|
|
345
352
|
return { root, counter, question, answer, reveal, prev, next, shuffle };
|
|
346
353
|
}
|
|
347
354
|
function createButton(doc, prefix, action, label) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@riebeckite/plugin-flashcards",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.7",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
"dependencies": {
|
|
24
24
|
"@types/mdast": "^4.0.4",
|
|
25
25
|
"unist-util-visit": "^5.1.0",
|
|
26
|
-
"@riebeckite/core": "0.0.
|
|
26
|
+
"@riebeckite/core": "0.0.7"
|
|
27
27
|
},
|
|
28
28
|
"publishConfig": {
|
|
29
29
|
"access": "public"
|
package/style.css
CHANGED
|
@@ -1,116 +1,116 @@
|
|
|
1
|
-
.rb-flashcards {
|
|
2
|
-
--rb-flashcards-ink: var(--rb-color-ink, #000000);
|
|
3
|
-
--rb-flashcards-paper: var(--rb-color-paper, #ffffff);
|
|
4
|
-
--rb-flashcards-muted: var(--rb-color-muted, #69645c);
|
|
5
|
-
--rb-flashcards-accent: var(--rb-color-accent, #686868);
|
|
6
|
-
--rb-flashcards-rule: var(
|
|
7
|
-
--rb-color-border,
|
|
8
|
-
color-mix(in srgb, var(--rb-flashcards-ink) 18%, transparent)
|
|
9
|
-
);
|
|
10
|
-
|
|
11
|
-
margin: 1.5rem 0;
|
|
12
|
-
color: var(--rb-flashcards-ink);
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
.rb-flashcards__list {
|
|
16
|
-
display: grid;
|
|
17
|
-
gap: 0.75rem;
|
|
18
|
-
margin: 0;
|
|
19
|
-
padding: 0;
|
|
20
|
-
list-style: none;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
.rb-flashcards__item {
|
|
24
|
-
display: grid;
|
|
25
|
-
gap: 0.25rem;
|
|
26
|
-
padding: 0.75rem 1rem;
|
|
27
|
-
border: 1px solid var(--rb-flashcards-rule);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
.rb-flashcards__front {
|
|
31
|
-
font-weight: 600;
|
|
32
|
-
white-space: pre-line;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
.rb-flashcards__back {
|
|
36
|
-
color: var(--rb-flashcards-muted);
|
|
37
|
-
white-space: pre-line;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
.rb-flashcards__deck {
|
|
41
|
-
display: grid;
|
|
42
|
-
gap: 1rem;
|
|
43
|
-
outline-offset: 4px;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
.rb-flashcards__deck:focus-visible {
|
|
47
|
-
outline: 2px solid var(--rb-flashcards-accent);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
.rb-flashcards__counter {
|
|
51
|
-
margin: 0;
|
|
52
|
-
color: var(--rb-flashcards-muted);
|
|
53
|
-
font-size: 0.8125rem;
|
|
54
|
-
font-variant-numeric: tabular-nums;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
.rb-flashcards__card {
|
|
58
|
-
padding: 1.25rem 1.5rem;
|
|
59
|
-
border: 1px solid var(--rb-flashcards-rule);
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
.rb-flashcards__question {
|
|
63
|
-
margin: 0;
|
|
64
|
-
font-size: 1.0625rem;
|
|
65
|
-
font-weight: 600;
|
|
66
|
-
line-height: 1.6;
|
|
67
|
-
white-space: pre-line;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
.rb-flashcards__answer {
|
|
71
|
-
margin: 0.75rem 0 0;
|
|
72
|
-
padding-top: 0.75rem;
|
|
73
|
-
border-top: 1px solid var(--rb-flashcards-rule);
|
|
74
|
-
line-height: 1.7;
|
|
75
|
-
white-space: pre-line;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
.rb-flashcards__answer[hidden] {
|
|
79
|
-
display: none;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
.rb-flashcards__controls {
|
|
83
|
-
display: flex;
|
|
84
|
-
flex-wrap: wrap;
|
|
85
|
-
gap: 0.5rem;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
.rb-flashcards__button {
|
|
89
|
-
padding: 0.375rem 0.75rem;
|
|
90
|
-
border: 1px solid var(--rb-flashcards-ink);
|
|
91
|
-
border-radius: 0;
|
|
92
|
-
background: transparent;
|
|
93
|
-
color: inherit;
|
|
94
|
-
font: inherit;
|
|
95
|
-
font-size: 0.875rem;
|
|
96
|
-
cursor: pointer;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
.rb-flashcards__button:hover,
|
|
100
|
-
.rb-flashcards__button:focus-visible {
|
|
101
|
-
border-color: var(--rb-flashcards-accent);
|
|
102
|
-
color: var(--rb-flashcards-accent);
|
|
103
|
-
outline: none;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
.rb-flashcards--invalid {
|
|
107
|
-
padding: 0.75rem 1rem;
|
|
108
|
-
border: 1px solid var(--rb-flashcards-ink);
|
|
109
|
-
font-size: 0.875rem;
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
html[data-theme="dark"] .rb-flashcards,
|
|
113
|
-
html.dark .rb-flashcards {
|
|
114
|
-
--rb-flashcards-ink: var(--rb-color-paper, #ffffff);
|
|
115
|
-
--rb-flashcards-paper: var(--rb-color-ink, #000000);
|
|
116
|
-
}
|
|
1
|
+
.rb-flashcards {
|
|
2
|
+
--rb-flashcards-ink: var(--rb-color-ink, #000000);
|
|
3
|
+
--rb-flashcards-paper: var(--rb-color-paper, #ffffff);
|
|
4
|
+
--rb-flashcards-muted: var(--rb-color-muted, #69645c);
|
|
5
|
+
--rb-flashcards-accent: var(--rb-color-accent, #686868);
|
|
6
|
+
--rb-flashcards-rule: var(
|
|
7
|
+
--rb-color-border,
|
|
8
|
+
color-mix(in srgb, var(--rb-flashcards-ink) 18%, transparent)
|
|
9
|
+
);
|
|
10
|
+
|
|
11
|
+
margin: 1.5rem 0;
|
|
12
|
+
color: var(--rb-flashcards-ink);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.rb-flashcards__list {
|
|
16
|
+
display: grid;
|
|
17
|
+
gap: 0.75rem;
|
|
18
|
+
margin: 0;
|
|
19
|
+
padding: 0;
|
|
20
|
+
list-style: none;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
.rb-flashcards__item {
|
|
24
|
+
display: grid;
|
|
25
|
+
gap: 0.25rem;
|
|
26
|
+
padding: 0.75rem 1rem;
|
|
27
|
+
border: 1px solid var(--rb-flashcards-rule);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
.rb-flashcards__front {
|
|
31
|
+
font-weight: 600;
|
|
32
|
+
white-space: pre-line;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
.rb-flashcards__back {
|
|
36
|
+
color: var(--rb-flashcards-muted);
|
|
37
|
+
white-space: pre-line;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.rb-flashcards__deck {
|
|
41
|
+
display: grid;
|
|
42
|
+
gap: 1rem;
|
|
43
|
+
outline-offset: 4px;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.rb-flashcards__deck:focus-visible {
|
|
47
|
+
outline: 2px solid var(--rb-flashcards-accent);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.rb-flashcards__counter {
|
|
51
|
+
margin: 0;
|
|
52
|
+
color: var(--rb-flashcards-muted);
|
|
53
|
+
font-size: 0.8125rem;
|
|
54
|
+
font-variant-numeric: tabular-nums;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.rb-flashcards__card {
|
|
58
|
+
padding: 1.25rem 1.5rem;
|
|
59
|
+
border: 1px solid var(--rb-flashcards-rule);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
.rb-flashcards__question {
|
|
63
|
+
margin: 0;
|
|
64
|
+
font-size: 1.0625rem;
|
|
65
|
+
font-weight: 600;
|
|
66
|
+
line-height: 1.6;
|
|
67
|
+
white-space: pre-line;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.rb-flashcards__answer {
|
|
71
|
+
margin: 0.75rem 0 0;
|
|
72
|
+
padding-top: 0.75rem;
|
|
73
|
+
border-top: 1px solid var(--rb-flashcards-rule);
|
|
74
|
+
line-height: 1.7;
|
|
75
|
+
white-space: pre-line;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
.rb-flashcards__answer[hidden] {
|
|
79
|
+
display: none;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
.rb-flashcards__controls {
|
|
83
|
+
display: flex;
|
|
84
|
+
flex-wrap: wrap;
|
|
85
|
+
gap: 0.5rem;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
.rb-flashcards__button {
|
|
89
|
+
padding: 0.375rem 0.75rem;
|
|
90
|
+
border: 1px solid var(--rb-flashcards-ink);
|
|
91
|
+
border-radius: 0;
|
|
92
|
+
background: transparent;
|
|
93
|
+
color: inherit;
|
|
94
|
+
font: inherit;
|
|
95
|
+
font-size: 0.875rem;
|
|
96
|
+
cursor: pointer;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
.rb-flashcards__button:hover,
|
|
100
|
+
.rb-flashcards__button:focus-visible {
|
|
101
|
+
border-color: var(--rb-flashcards-accent);
|
|
102
|
+
color: var(--rb-flashcards-accent);
|
|
103
|
+
outline: none;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
.rb-flashcards--invalid {
|
|
107
|
+
padding: 0.75rem 1rem;
|
|
108
|
+
border: 1px solid var(--rb-flashcards-ink);
|
|
109
|
+
font-size: 0.875rem;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
html[data-theme="dark"] .rb-flashcards,
|
|
113
|
+
html.dark .rb-flashcards {
|
|
114
|
+
--rb-flashcards-ink: var(--rb-color-paper, #ffffff);
|
|
115
|
+
--rb-flashcards-paper: var(--rb-color-ink, #000000);
|
|
116
|
+
}
|