@sp-days-framework/docusaurus-plugin-interactive-tasks 1.0.4-rc1 → 1.0.5-rc1
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 +63 -6
- package/lib/index.d.ts +2 -4
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/plugin/remarkTaskDirective.d.ts +3 -1
- package/lib/plugin/remarkTaskDirective.d.ts.map +1 -1
- package/lib/plugin/remarkTaskDirective.js +80 -21
- package/lib/plugin/remarkTaskDirective.js.map +1 -1
- package/lib/theme/MDXComponents.d.ts.map +1 -1
- package/lib/theme/MDXComponents.js +2 -0
- package/lib/theme/MDXComponents.js.map +1 -1
- package/lib/theme/Task/Output/index.d.ts +14 -0
- package/lib/theme/Task/Output/index.d.ts.map +1 -0
- package/lib/theme/Task/Output/index.js +23 -0
- package/lib/theme/Task/Output/index.js.map +1 -0
- package/lib/theme/Task/Output/styles.module.css +72 -0
- package/lib/theme/Task/Solution/styles.module.css +7 -5
- package/lib/theme/Task/index.d.ts +3 -2
- package/lib/theme/Task/index.d.ts.map +1 -1
- package/lib/theme/Task/index.js +147 -100
- package/lib/theme/Task/index.js.map +1 -1
- package/lib/theme/Task/styles.module.css +122 -167
- package/lib/theme/TaskExample/index.d.ts +2 -1
- package/lib/theme/TaskExample/index.d.ts.map +1 -1
- package/lib/theme/TaskExample/index.js +133 -90
- package/lib/theme/TaskExample/index.js.map +1 -1
- package/lib/theme/TaskPlaceholder/index.d.ts.map +1 -1
- package/lib/theme/TaskPlaceholder/index.js +133 -94
- package/lib/theme/TaskPlaceholder/index.js.map +1 -1
- package/lib/theme/TaskProgressionOverview/styles.module.css +2 -2
- package/lib/utils/icons.d.ts +5 -0
- package/lib/utils/icons.d.ts.map +1 -1
- package/lib/utils/icons.js +7 -1
- package/lib/utils/icons.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
# Docusaurus Interactive Tasks Plugin
|
|
2
2
|
|
|
3
|
-
A Docusaurus plugin that transforms documentation into interactive learning experiences with tasks, hints, solutions, and automatic progress tracking.
|
|
3
|
+
A Docusaurus plugin that transforms documentation into interactive learning experiences with tasks, hints, solutions, expected outputs, and automatic progress tracking.
|
|
4
4
|
|
|
5
5
|
## Features
|
|
6
6
|
|
|
7
7
|
- **Interactive Tasks** - Collapsible task components with completion tracking
|
|
8
|
-
- **Hints &
|
|
8
|
+
- **Hints, Solutions & Expected Outputs** - Optional toggleable hints, solutions, and expected outputs for each task
|
|
9
9
|
- **Auto-Numbering** - Automatic task numbering per page
|
|
10
10
|
- **Persistent Progress** - Completion status saved to localStorage
|
|
11
11
|
- **Progress Tracking** - Visual progress indicators in sidebar and task progression components
|
|
@@ -35,7 +35,7 @@ module.exports = {
|
|
|
35
35
|
"classic",
|
|
36
36
|
{
|
|
37
37
|
docs: {
|
|
38
|
-
|
|
38
|
+
beforeDefaultRemarkPlugins: [
|
|
39
39
|
require("@sp-days-framework/docusaurus-plugin-interactive-tasks")
|
|
40
40
|
.remarkTaskDirective,
|
|
41
41
|
],
|
|
@@ -72,9 +72,10 @@ Download from https://nodejs.org/. npm is included with Node.js.
|
|
|
72
72
|
**Syntax Rules:**
|
|
73
73
|
|
|
74
74
|
- Use **4 colons** (`::::`) for task containers
|
|
75
|
-
- Use **3 colons** (`:::`) for hint and
|
|
75
|
+
- Use **3 colons** (`:::`) for hint, solution, and output blocks
|
|
76
76
|
- Tasks are automatically numbered within each page
|
|
77
77
|
- Completion state persists across sessions
|
|
78
|
+
- **Expected Output** blocks use success color theme (`--ifm-color-success`)
|
|
78
79
|
|
|
79
80
|
## Usage
|
|
80
81
|
|
|
@@ -134,6 +135,62 @@ return Response.json({ success: true });
|
|
|
134
135
|
::::
|
|
135
136
|
```
|
|
136
137
|
|
|
138
|
+
### Task with Expected Output
|
|
139
|
+
|
|
140
|
+
Show users what output they should expect:
|
|
141
|
+
|
|
142
|
+
```mdx
|
|
143
|
+
::::task[Run Docker Container]
|
|
144
|
+
|
|
145
|
+
Start a new nginx container in detached mode on port 8080.
|
|
146
|
+
|
|
147
|
+
:::output
|
|
148
|
+
\`\`\`bash
|
|
149
|
+
$ docker run -d -p 8080:80 nginx
|
|
150
|
+
a3f5c8b9d2e1f4a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1
|
|
151
|
+
\`\`\`
|
|
152
|
+
|
|
153
|
+
Visit `http://localhost:8080` and you should see the nginx welcome page.
|
|
154
|
+
:::
|
|
155
|
+
|
|
156
|
+
::::
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### Task with All Features
|
|
160
|
+
|
|
161
|
+
Combine hint, solution, and expected output:
|
|
162
|
+
|
|
163
|
+
```mdx
|
|
164
|
+
::::task[Build Application]
|
|
165
|
+
|
|
166
|
+
Build the application and verify it works.
|
|
167
|
+
|
|
168
|
+
:::hint
|
|
169
|
+
Use the npm script defined in `package.json`.
|
|
170
|
+
:::
|
|
171
|
+
|
|
172
|
+
:::solution
|
|
173
|
+
\`\`\`bash
|
|
174
|
+
npm run build
|
|
175
|
+
npm run test
|
|
176
|
+
\`\`\`
|
|
177
|
+
:::
|
|
178
|
+
|
|
179
|
+
:::output
|
|
180
|
+
\`\`\`bash
|
|
181
|
+
$ npm run build
|
|
182
|
+
> Building application...
|
|
183
|
+
> ✓ Compiled successfully
|
|
184
|
+
|
|
185
|
+
$ npm run test
|
|
186
|
+
> Running tests...
|
|
187
|
+
> ✓ All tests passed (12/12)
|
|
188
|
+
\`\`\`
|
|
189
|
+
:::
|
|
190
|
+
|
|
191
|
+
::::
|
|
192
|
+
```
|
|
193
|
+
|
|
137
194
|
### Task Examples (Non-Persistent)
|
|
138
195
|
|
|
139
196
|
For demonstration purposes, use task examples that don't save completion state:
|
|
@@ -252,7 +309,7 @@ module.exports = {
|
|
|
252
309
|
{
|
|
253
310
|
docs: {
|
|
254
311
|
// Default docs instance
|
|
255
|
-
|
|
312
|
+
beforeDefaultRemarkPlugins: [
|
|
256
313
|
require('@sp-days-framework/docusaurus-plugin-interactive-tasks').remarkTaskDirective,
|
|
257
314
|
],
|
|
258
315
|
},
|
|
@@ -267,7 +324,7 @@ module.exports = {
|
|
|
267
324
|
id: 'community',
|
|
268
325
|
path: 'community',
|
|
269
326
|
// Community docs instance
|
|
270
|
-
|
|
327
|
+
beforeDefaultRemarkPlugins: [
|
|
271
328
|
require('@sp-days-framework/docusaurus-plugin-interactive-tasks').remarkTaskDirective,
|
|
272
329
|
],
|
|
273
330
|
},
|
package/lib/index.d.ts
CHANGED
|
@@ -3,12 +3,10 @@
|
|
|
3
3
|
* A plugin providing interactive task components with progress tracking
|
|
4
4
|
*/
|
|
5
5
|
import type { LoadContext, Plugin } from "@docusaurus/types";
|
|
6
|
-
export
|
|
7
|
-
}
|
|
8
|
-
export default function interactiveTasksPlugin(context: LoadContext, options: PluginOptions): Plugin;
|
|
6
|
+
export default function interactiveTasksPlugin(context: LoadContext): Plugin;
|
|
9
7
|
export declare function getSwizzleComponentList(): string[];
|
|
10
8
|
export { validateThemeConfig } from "./validateThemeConfig";
|
|
11
9
|
export { useDocTaskStats, useCategoryTaskStats } from "./utils/useDocTaskStats";
|
|
12
10
|
export type { DocTaskStats } from "./utils/useDocTaskStats";
|
|
13
|
-
export { remarkTaskDirective } from "./plugin/remarkTaskDirective";
|
|
11
|
+
export { remarkTaskDirective, type PluginOptions } from "./plugin/remarkTaskDirective";
|
|
14
12
|
//# sourceMappingURL=index.d.ts.map
|
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAK7D,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAK7D,MAAM,CAAC,OAAO,UAAU,sBAAsB,CAC5C,OAAO,EAAE,WAAW,GACnB,MAAM,CAoCR;AAGD,wBAAgB,uBAAuB,IAAI,MAAM,EAAE,CAElD;AAED,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAG5D,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAChF,YAAY,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAK5D,OAAO,EAAE,mBAAmB,EAAE,KAAK,aAAa,EAAE,MAAM,8BAA8B,CAAC"}
|
package/lib/index.js
CHANGED
|
@@ -12,7 +12,7 @@ exports.default = interactiveTasksPlugin;
|
|
|
12
12
|
exports.getSwizzleComponentList = getSwizzleComponentList;
|
|
13
13
|
const path_1 = __importDefault(require("path"));
|
|
14
14
|
const TaskRegistryPlugin_1 = require("./plugin/TaskRegistryPlugin");
|
|
15
|
-
function interactiveTasksPlugin(context
|
|
15
|
+
function interactiveTasksPlugin(context) {
|
|
16
16
|
const { siteDir } = context;
|
|
17
17
|
return {
|
|
18
18
|
name: "@sp-days-framework/docusaurus-plugin-interactive-tasks",
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;AAQH,yCAsCC;AAGD,0DAEC;AAjDD,gDAAwB;AAGxB,oEAAiE;AAGjE,SAAwB,sBAAsB,CAC5C,OAAoB;IAEpB,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAE5B,OAAO;QACL,IAAI,EAAE,wDAAwD;QAE9D,YAAY;YACV,OAAO,cAAI,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAC5C,CAAC;QAED,sBAAsB;YACpB,OAAO,cAAI,CAAC,OAAO,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;QACjD,CAAC;QAED,gBAAgB;YACd,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,gBAAgB,CAAC,MAAqB,EAAE,QAAiB;YACvD,MAAM,OAAO,GAAU,EAAE,CAAC;YAE1B,0DAA0D;YAC1D,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO,CAAC,IAAI,CAAC,IAAI,uCAAkB,CAAC,OAAO,CAAC,CAAC,CAAC;YAChD,CAAC;YAED,OAAO;gBACL,OAAO;aACR,CAAC;QACJ,CAAC;QAED,yDAAyD;QACzD,iCAAiC;YAC/B,OAAO,EAAE,CAAC;QACZ,CAAC;KACF,CAAC;AACJ,CAAC;AAED,2DAA2D;AAC3D,SAAgB,uBAAuB;IACrC,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,6DAA4D;AAAnD,0HAAA,mBAAmB,OAAA;AAE5B,6CAA6C;AAC7C,2DAAgF;AAAvE,kHAAA,eAAe,OAAA;AAAE,uHAAA,oBAAoB,OAAA;AAE9C,uFAAuF;AACvF,yFAAyF;AAEzF,6EAA6E;AAC7E,oEAAuF;AAA9E,0HAAA,mBAAmB,OAAA"}
|
|
@@ -18,8 +18,10 @@
|
|
|
18
18
|
*/
|
|
19
19
|
import type { Plugin } from "unified";
|
|
20
20
|
import type { Root } from "mdast";
|
|
21
|
-
interface PluginOptions {
|
|
21
|
+
export interface PluginOptions {
|
|
22
22
|
filePath?: string;
|
|
23
|
+
tocEnabled?: boolean;
|
|
24
|
+
tocHeadingLevel?: 2 | 3 | 4 | 5 | 6;
|
|
23
25
|
}
|
|
24
26
|
/**
|
|
25
27
|
* Remark plugin to transform task directives
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remarkTaskDirective.d.ts","sourceRoot":"","sources":["../../src/plugin/remarkTaskDirective.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,KAAK,EAAE,IAAI,EAAmB,MAAM,OAAO,CAAC;AAWnD,
|
|
1
|
+
{"version":3,"file":"remarkTaskDirective.d.ts","sourceRoot":"","sources":["../../src/plugin/remarkTaskDirective.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,KAAK,EAAE,IAAI,EAAmB,MAAM,OAAO,CAAC;AAWnD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,eAAe,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;CACrC;AAwUD;;GAEG;AACH,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,CAAC,aAAa,CAAC,CAAC,EAAE,IAAI,CAuG9D,CAAC;AAEF,eAAe,mBAAmB,CAAC"}
|
|
@@ -61,6 +61,13 @@ function isSolutionDirective(node) {
|
|
|
61
61
|
return (node.type === "containerDirective" &&
|
|
62
62
|
node.name === "solution");
|
|
63
63
|
}
|
|
64
|
+
/**
|
|
65
|
+
* Check if a node is an output directive
|
|
66
|
+
*/
|
|
67
|
+
function isOutputDirective(node) {
|
|
68
|
+
return (node.type === "containerDirective" &&
|
|
69
|
+
node.name === "output");
|
|
70
|
+
}
|
|
64
71
|
/**
|
|
65
72
|
* Check if a node is an allowed admonition (nested inside task)
|
|
66
73
|
* Allows standard Docusaurus admonitions to pass through
|
|
@@ -111,8 +118,9 @@ function warn(message, filePath, position) {
|
|
|
111
118
|
}
|
|
112
119
|
/**
|
|
113
120
|
* Transform a task or task-example directive into JSX components
|
|
121
|
+
* Returns an array containing [headingNode, taskJSX] for TOC integration
|
|
114
122
|
*/
|
|
115
|
-
function transformTaskDirective(node, filePath, isExample = false) {
|
|
123
|
+
function transformTaskDirective(node, filePath, isExample = false, taskNumber, tocEnabled = true, tocHeadingLevel = 2) {
|
|
116
124
|
// Extract task name from label
|
|
117
125
|
// In remark-directive, :::task[Name] stores "Name" as the first paragraph child with data.directiveLabel: true
|
|
118
126
|
let taskName = "";
|
|
@@ -138,15 +146,18 @@ function transformTaskDirective(node, filePath, isExample = false) {
|
|
|
138
146
|
if (!taskName) {
|
|
139
147
|
warn(`Task is missing a name. Usage: ::::task[Task Name] (note: 4 colons for tasks). This task will be hidden.`, filePath, node.position);
|
|
140
148
|
// Return empty paragraph to hide the task
|
|
141
|
-
return
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
149
|
+
return [
|
|
150
|
+
{
|
|
151
|
+
type: "paragraph",
|
|
152
|
+
children: [],
|
|
153
|
+
},
|
|
154
|
+
];
|
|
145
155
|
}
|
|
146
|
-
// Separate children into text content, hints, and
|
|
156
|
+
// Separate children into text content, hints, solutions, and outputs
|
|
147
157
|
const textContent = [];
|
|
148
158
|
const hints = [];
|
|
149
159
|
const solutions = [];
|
|
160
|
+
const outputs = [];
|
|
150
161
|
const unknownDirectives = [];
|
|
151
162
|
for (const child of taskContent) {
|
|
152
163
|
if (isHintDirective(child)) {
|
|
@@ -155,6 +166,9 @@ function transformTaskDirective(node, filePath, isExample = false) {
|
|
|
155
166
|
else if (isSolutionDirective(child)) {
|
|
156
167
|
solutions.push(child);
|
|
157
168
|
}
|
|
169
|
+
else if (isOutputDirective(child)) {
|
|
170
|
+
outputs.push(child);
|
|
171
|
+
}
|
|
158
172
|
else if (isNestedContainerDirective(child)) {
|
|
159
173
|
const directiveName = child.name;
|
|
160
174
|
// Allow standard admonitions and other nested tasks to pass through
|
|
@@ -177,7 +191,7 @@ function transformTaskDirective(node, filePath, isExample = false) {
|
|
|
177
191
|
if (unknownDirectives.length > 0) {
|
|
178
192
|
warn(`Unknown directive(s) ${unknownDirectives
|
|
179
193
|
.map((d) => `:::${d}`)
|
|
180
|
-
.join(", ")} inside task "${taskName}". Only :::hint and :::
|
|
194
|
+
.join(", ")} inside task "${taskName}". Only :::hint, :::solution, and :::output are supported inside ::::task.`, filePath, node.position);
|
|
181
195
|
}
|
|
182
196
|
// Validation: Warn about multiple hints
|
|
183
197
|
if (hints.length > 1) {
|
|
@@ -187,10 +201,15 @@ function transformTaskDirective(node, filePath, isExample = false) {
|
|
|
187
201
|
if (solutions.length > 1) {
|
|
188
202
|
warn(`Multiple :::solution sections found in task "${taskName}". Only the first will be used.`, filePath, node.position);
|
|
189
203
|
}
|
|
204
|
+
// Validation: Warn about multiple outputs
|
|
205
|
+
if (outputs.length > 1) {
|
|
206
|
+
warn(`Multiple :::output sections found in task "${taskName}". Only the first will be used.`, filePath, node.position);
|
|
207
|
+
}
|
|
190
208
|
// Validation: Warn if task is empty
|
|
191
209
|
if (textContent.length === 0 &&
|
|
192
210
|
hints.length === 0 &&
|
|
193
|
-
solutions.length === 0
|
|
211
|
+
solutions.length === 0 &&
|
|
212
|
+
outputs.length === 0) {
|
|
194
213
|
warn(`Task "${taskName}" has no content. Add task instructions.`, filePath, node.position);
|
|
195
214
|
}
|
|
196
215
|
// Build JSX structure
|
|
@@ -209,9 +228,35 @@ function transformTaskDirective(node, filePath, isExample = false) {
|
|
|
209
228
|
const solutionChildren = solutions[0].children || [];
|
|
210
229
|
taskChildren.push(createJSXElement("Solution", [], solutionChildren));
|
|
211
230
|
}
|
|
231
|
+
// Add <Output> (use only first one)
|
|
232
|
+
if (outputs.length > 0) {
|
|
233
|
+
const outputChildren = outputs[0].children || [];
|
|
234
|
+
taskChildren.push(createJSXElement("Output", [], outputChildren));
|
|
235
|
+
}
|
|
236
|
+
// Create a heading node for TOC integration (if enabled)
|
|
237
|
+
// The headings plugin will automatically assign an ID to this node
|
|
238
|
+
// Include task number prefix in heading text for TOC display
|
|
239
|
+
const nodes = [];
|
|
240
|
+
if (tocEnabled) {
|
|
241
|
+
const headingPrefix = isExample
|
|
242
|
+
? (taskNumber !== undefined ? `Example ${taskNumber}: ` : "Example: ")
|
|
243
|
+
: (taskNumber !== undefined ? `Task ${taskNumber}: ` : "Task: ");
|
|
244
|
+
const headingNode = {
|
|
245
|
+
type: "heading",
|
|
246
|
+
depth: tocHeadingLevel, // Configurable heading level for TOC
|
|
247
|
+
children: [{ type: "text", value: `${headingPrefix}${taskName}` }],
|
|
248
|
+
data: {
|
|
249
|
+
// The headings plugin will populate this with hProperties.id
|
|
250
|
+
},
|
|
251
|
+
};
|
|
252
|
+
nodes.push(headingNode);
|
|
253
|
+
}
|
|
212
254
|
// Create <Task name="..."> or <TaskExample name="..."> element
|
|
213
255
|
const componentName = isExample ? "TaskExample" : "Task";
|
|
214
|
-
|
|
256
|
+
const taskJSX = createJSXElement(componentName, [createJSXAttribute("name", taskName)], taskChildren);
|
|
257
|
+
// Return heading (if TOC enabled) and task component
|
|
258
|
+
nodes.push(taskJSX);
|
|
259
|
+
return nodes;
|
|
215
260
|
}
|
|
216
261
|
/**
|
|
217
262
|
* Remark plugin to transform task directives
|
|
@@ -219,6 +264,12 @@ function transformTaskDirective(node, filePath, isExample = false) {
|
|
|
219
264
|
const remarkTaskDirective = (options = {}) => {
|
|
220
265
|
return (tree, file) => {
|
|
221
266
|
const filePath = options.filePath || file.path || file.history?.[0] || "unknown";
|
|
267
|
+
// Get TOC configuration with defaults
|
|
268
|
+
const tocEnabled = options.tocEnabled ?? true;
|
|
269
|
+
const tocHeadingLevel = options.tocHeadingLevel ?? 2;
|
|
270
|
+
// Track task numbers within this file for TOC pre-link
|
|
271
|
+
let taskCounter = 0;
|
|
272
|
+
let exampleCounter = 0;
|
|
222
273
|
// First pass: Check for orphaned hints/solutions and task directives
|
|
223
274
|
(0, unist_util_visit_1.visit)(tree, (node, index, parent) => {
|
|
224
275
|
if (isTaskDirective(node)) {
|
|
@@ -227,11 +278,13 @@ const remarkTaskDirective = (options = {}) => {
|
|
|
227
278
|
node.data = {};
|
|
228
279
|
}
|
|
229
280
|
node.data.directiveHandled = true;
|
|
230
|
-
//
|
|
231
|
-
|
|
232
|
-
//
|
|
281
|
+
// Increment task counter
|
|
282
|
+
taskCounter++;
|
|
283
|
+
// Transform the task directive - returns array of nodes
|
|
284
|
+
const transformedNodes = transformTaskDirective(node, filePath, false, taskCounter, tocEnabled, tocHeadingLevel);
|
|
285
|
+
// Replace the single node with multiple nodes (heading + task, or just task)
|
|
233
286
|
if (parent && typeof index === "number") {
|
|
234
|
-
parent.children
|
|
287
|
+
parent.children.splice(index, 1, ...transformedNodes);
|
|
235
288
|
}
|
|
236
289
|
// Skip traversing into children - they're already processed by transformTaskDirective
|
|
237
290
|
return "skip";
|
|
@@ -242,25 +295,31 @@ const remarkTaskDirective = (options = {}) => {
|
|
|
242
295
|
node.data = {};
|
|
243
296
|
}
|
|
244
297
|
node.data.directiveHandled = true;
|
|
245
|
-
//
|
|
246
|
-
|
|
247
|
-
//
|
|
298
|
+
// Increment example counter
|
|
299
|
+
exampleCounter++;
|
|
300
|
+
// Transform the task-example directive (isExample = true) - returns array of nodes
|
|
301
|
+
const transformedNodes = transformTaskDirective(node, filePath, true, exampleCounter, tocEnabled, tocHeadingLevel);
|
|
302
|
+
// Replace the single node with multiple nodes (heading + task, or just task)
|
|
248
303
|
if (parent && typeof index === "number") {
|
|
249
|
-
parent.children
|
|
304
|
+
parent.children.splice(index, 1, ...transformedNodes);
|
|
250
305
|
}
|
|
251
306
|
// Skip traversing into children - they're already processed by transformTaskDirective
|
|
252
307
|
return "skip";
|
|
253
308
|
}
|
|
254
|
-
else if (isHintDirective(node) || isSolutionDirective(node)) {
|
|
309
|
+
else if (isHintDirective(node) || isSolutionDirective(node) || isOutputDirective(node)) {
|
|
255
310
|
// Mark as handled to suppress Docusaurus warning
|
|
256
311
|
if (!node.data) {
|
|
257
312
|
node.data = {};
|
|
258
313
|
}
|
|
259
314
|
node.data.directiveHandled = true;
|
|
260
|
-
// Check if this hint/solution is inside a task
|
|
261
|
-
// This is an orphaned hint/solution (we already processed tasks above)
|
|
315
|
+
// Check if this hint/solution/output is inside a task
|
|
316
|
+
// This is an orphaned hint/solution/output (we already processed tasks above)
|
|
262
317
|
const directiveName = node.name;
|
|
263
|
-
warn(`:::${directiveName} directive found outside of ::::task context. ${directiveName === "hint"
|
|
318
|
+
warn(`:::${directiveName} directive found outside of ::::task context. ${directiveName === "hint"
|
|
319
|
+
? "Hints"
|
|
320
|
+
: directiveName === "solution"
|
|
321
|
+
? "Solutions"
|
|
322
|
+
: "Output"} must be inside a task.`, filePath, node.position);
|
|
264
323
|
// Replace with empty paragraph to hide
|
|
265
324
|
if (parent && typeof index === "number") {
|
|
266
325
|
parent.children[index] = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remarkTaskDirective.js","sourceRoot":"","sources":["../../src/plugin/remarkTaskDirective.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;GAiBG;;;AAEH,uDAAyC;AAIzC,4CAAsD;
|
|
1
|
+
{"version":3,"file":"remarkTaskDirective.js","sourceRoot":"","sources":["../../src/plugin/remarkTaskDirective.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MDXComponents.d.ts","sourceRoot":"","sources":["../../src/theme/MDXComponents.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;;
|
|
1
|
+
{"version":3,"file":"MDXComponents.d.ts","sourceRoot":"","sources":["../../src/theme/MDXComponents.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;;AA4BH,wBA+BE"}
|
|
@@ -41,6 +41,7 @@ const TaskPlaceholder_1 = __importDefault(require("@theme/TaskPlaceholder"));
|
|
|
41
41
|
const Text_1 = __importDefault(require("@theme/Task/Text"));
|
|
42
42
|
const Hint_1 = __importDefault(require("@theme/Task/Hint"));
|
|
43
43
|
const Solution_1 = __importDefault(require("@theme/Task/Solution"));
|
|
44
|
+
const Output_1 = __importDefault(require("@theme/Task/Output"));
|
|
44
45
|
const TaskProgression_1 = __importDefault(require("@theme/TaskProgression"));
|
|
45
46
|
const TaskProgressionOverview_1 = __importDefault(require("@theme/TaskProgressionOverview"));
|
|
46
47
|
exports.default = {
|
|
@@ -71,6 +72,7 @@ exports.default = {
|
|
|
71
72
|
Text: Text_1.default,
|
|
72
73
|
Hint: Hint_1.default,
|
|
73
74
|
Solution: Solution_1.default,
|
|
75
|
+
Output: Output_1.default,
|
|
74
76
|
TaskProgression: TaskProgression_1.default,
|
|
75
77
|
TaskProgressionOverview: TaskProgressionOverview_1.default,
|
|
76
78
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MDXComponents.js","sourceRoot":"","sources":["../../src/theme/MDXComponents.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG;;;;;AAEH,kDAAsE;AACtE,kFAA0D;AAC1D,2FAA2F;AAC3F,4EAA4E;AAC5E,4DAAoC;AACpC,kGAA6E;AAC7E,4FAAuE;AACvE,gGAA2E;AAC3E,wGAAmF;AACnF,wGAAmF;AACnF,8FAAyE;AACzE,8FAAyE;AACzE,gGAA2E;AAC3E,gGAAwE;AACxE,0FAAkE;AAClE,kBAAkB;AAClB,uDAA+B;AAC/B,qEAA6C;AAC7C,6EAAqD;AACrD,4DAAoC;AACpC,4DAAoC;AACpC,oEAA4C;AAC5C,6EAAqD;AACrD,6FAAqE;AAErE,kBAAe;IACb,GAAG,uBAAa;IAChB,4DAA4D;IAC5D,IAAI,EAAJ,cAAI;IACJ,OAAO,EAAE,iBAAU;IACnB,OAAO,EAAE,iBAAU;IACnB,IAAI,EAAE,cAAO;IACb,CAAC,EAAE,WAAI;IACP,GAAG,EAAE,aAAM;IACX,EAAE,EAAE,YAAK;IACT,EAAE,EAAE,YAAK;IACT,GAAG,EAAE,aAAM;IACX,oDAAoD;IACpD,EAAE,EAAE,CAAC,KAA2B,EAAE,EAAE,CAAC,8BAAC,iBAAU,IAAC,EAAE,EAAC,IAAI,KAAK,KAAK,GAAI;IACtE,EAAE,EAAE,CAAC,KAA2B,EAAE,EAAE,CAAC,8BAAC,iBAAU,IAAC,EAAE,EAAC,IAAI,KAAK,KAAK,GAAI;IACtE,EAAE,EAAE,CAAC,KAA2B,EAAE,EAAE,CAAC,8BAAC,iBAAU,IAAC,EAAE,EAAC,IAAI,KAAK,KAAK,GAAI;IACtE,EAAE,EAAE,CAAC,KAA2B,EAAE,EAAE,CAAC,8BAAC,iBAAU,IAAC,EAAE,EAAC,IAAI,KAAK,KAAK,GAAI;IACtE,EAAE,EAAE,CAAC,KAA2B,EAAE,EAAE,CAAC,8BAAC,iBAAU,IAAC,EAAE,EAAC,IAAI,KAAK,KAAK,GAAI;IACtE,EAAE,EAAE,CAAC,KAA2B,EAAE,EAAE,CAAC,8BAAC,iBAAU,IAAC,EAAE,EAAC,IAAI,KAAK,KAAK,GAAI;IACtE,UAAU,EAAE,oBAAU;IACtB,OAAO,EAAE,iBAAO;IAChB,kBAAkB;IAClB,IAAI,EAAJ,cAAI;IACJ,WAAW,EAAX,qBAAW;IACX,eAAe,EAAf,yBAAe;IACf,IAAI,EAAJ,cAAI;IACJ,IAAI,EAAJ,cAAI;IACJ,QAAQ,EAAR,kBAAQ;IACR,eAAe,EAAf,yBAAe;IACf,uBAAuB,EAAvB,iCAAuB;CACxB,CAAC"}
|
|
1
|
+
{"version":3,"file":"MDXComponents.js","sourceRoot":"","sources":["../../src/theme/MDXComponents.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG;;;;;AAEH,kDAAsE;AACtE,kFAA0D;AAC1D,2FAA2F;AAC3F,4EAA4E;AAC5E,4DAAoC;AACpC,kGAA6E;AAC7E,4FAAuE;AACvE,gGAA2E;AAC3E,wGAAmF;AACnF,wGAAmF;AACnF,8FAAyE;AACzE,8FAAyE;AACzE,gGAA2E;AAC3E,gGAAwE;AACxE,0FAAkE;AAClE,kBAAkB;AAClB,uDAA+B;AAC/B,qEAA6C;AAC7C,6EAAqD;AACrD,4DAAoC;AACpC,4DAAoC;AACpC,oEAA4C;AAC5C,gEAAwC;AACxC,6EAAqD;AACrD,6FAAqE;AAErE,kBAAe;IACb,GAAG,uBAAa;IAChB,4DAA4D;IAC5D,IAAI,EAAJ,cAAI;IACJ,OAAO,EAAE,iBAAU;IACnB,OAAO,EAAE,iBAAU;IACnB,IAAI,EAAE,cAAO;IACb,CAAC,EAAE,WAAI;IACP,GAAG,EAAE,aAAM;IACX,EAAE,EAAE,YAAK;IACT,EAAE,EAAE,YAAK;IACT,GAAG,EAAE,aAAM;IACX,oDAAoD;IACpD,EAAE,EAAE,CAAC,KAA2B,EAAE,EAAE,CAAC,8BAAC,iBAAU,IAAC,EAAE,EAAC,IAAI,KAAK,KAAK,GAAI;IACtE,EAAE,EAAE,CAAC,KAA2B,EAAE,EAAE,CAAC,8BAAC,iBAAU,IAAC,EAAE,EAAC,IAAI,KAAK,KAAK,GAAI;IACtE,EAAE,EAAE,CAAC,KAA2B,EAAE,EAAE,CAAC,8BAAC,iBAAU,IAAC,EAAE,EAAC,IAAI,KAAK,KAAK,GAAI;IACtE,EAAE,EAAE,CAAC,KAA2B,EAAE,EAAE,CAAC,8BAAC,iBAAU,IAAC,EAAE,EAAC,IAAI,KAAK,KAAK,GAAI;IACtE,EAAE,EAAE,CAAC,KAA2B,EAAE,EAAE,CAAC,8BAAC,iBAAU,IAAC,EAAE,EAAC,IAAI,KAAK,KAAK,GAAI;IACtE,EAAE,EAAE,CAAC,KAA2B,EAAE,EAAE,CAAC,8BAAC,iBAAU,IAAC,EAAE,EAAC,IAAI,KAAK,KAAK,GAAI;IACtE,UAAU,EAAE,oBAAU;IACtB,OAAO,EAAE,iBAAO;IAChB,kBAAkB;IAClB,IAAI,EAAJ,cAAI;IACJ,WAAW,EAAX,qBAAW;IACX,eAAe,EAAf,yBAAe;IACf,IAAI,EAAJ,cAAI;IACJ,IAAI,EAAJ,cAAI;IACJ,QAAQ,EAAR,kBAAQ;IACR,MAAM,EAAN,gBAAM;IACN,eAAe,EAAf,yBAAe;IACf,uBAAuB,EAAvB,iCAAuB;CACxB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Output Component
|
|
3
|
+
* Content area for expected output - rendered as a panel by parent Task component
|
|
4
|
+
*/
|
|
5
|
+
import { type ReactNode, type ReactElement } from 'react';
|
|
6
|
+
export interface OutputProps {
|
|
7
|
+
children?: ReactNode;
|
|
8
|
+
}
|
|
9
|
+
declare function Output({ children }: OutputProps): ReactElement;
|
|
10
|
+
declare namespace Output {
|
|
11
|
+
var displayName: string;
|
|
12
|
+
}
|
|
13
|
+
export default Output;
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/theme/Task/Output/index.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAc,EAAE,KAAK,SAAS,EAAE,KAAK,YAAY,EAAE,MAAM,OAAO,CAAC;AAIjE,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAKD,iBAAwB,MAAM,CAAC,EAAE,QAAQ,EAAE,EAAE,WAAW,GAAG,YAAY,CAStE;kBATuB,MAAM;;;eAAN,MAAM"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Output Component
|
|
4
|
+
* Content area for expected output - rendered as a panel by parent Task component
|
|
5
|
+
*/
|
|
6
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
|
+
};
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.default = Output;
|
|
11
|
+
const react_1 = __importDefault(require("react"));
|
|
12
|
+
const icons_1 = require("../../../utils/icons");
|
|
13
|
+
const styles_module_css_1 = __importDefault(require("./styles.module.css"));
|
|
14
|
+
// Add displayName for parent component detection
|
|
15
|
+
Output.displayName = 'Output';
|
|
16
|
+
function Output({ children }) {
|
|
17
|
+
return (react_1.default.createElement("div", { className: styles_module_css_1.default.outputPanel },
|
|
18
|
+
react_1.default.createElement("div", { className: styles_module_css_1.default.outputLabel },
|
|
19
|
+
icons_1.OUTPUT_ICON,
|
|
20
|
+
"Expected Output"),
|
|
21
|
+
react_1.default.createElement("div", { className: styles_module_css_1.default.outputContent }, children)));
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/theme/Task/Output/index.tsx"],"names":[],"mappings":";AAAA;;;GAGG;;;;;AAaH,yBASC;AApBD,kDAAiE;AACjE,gDAAmD;AACnD,4EAAyC;AAMzC,iDAAiD;AACjD,MAAM,CAAC,WAAW,GAAG,QAAQ,CAAC;AAE9B,SAAwB,MAAM,CAAC,EAAE,QAAQ,EAAe;IACtD,OAAO,CACL,uCAAK,SAAS,EAAE,2BAAM,CAAC,WAAW;QAChC,uCAAK,SAAS,EAAE,2BAAM,CAAC,WAAW;YAAG,mBAAW;8BAAsB;QACtE,uCAAK,SAAS,EAAE,2BAAM,CAAC,aAAa,IACjC,QAAQ,CACL,CACF,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Output Panel Styles
|
|
3
|
+
* Uses info color scheme (--ifm-color-info) for expected output display
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
.outputPanel {
|
|
7
|
+
padding: 1rem 1.25rem;
|
|
8
|
+
background-color: var(--ifm-color-info-contrast-background);
|
|
9
|
+
border-left: 4px solid var(--ifm-color-info);
|
|
10
|
+
border-radius: 4px;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
.outputLabel {
|
|
14
|
+
font-weight: 600;
|
|
15
|
+
font-size: 0.95rem;
|
|
16
|
+
color: var(--ifm-color-info-darker);
|
|
17
|
+
margin-bottom: 0.75rem;
|
|
18
|
+
display: flex;
|
|
19
|
+
align-items: center;
|
|
20
|
+
gap: 0.5rem;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
.outputContent {
|
|
24
|
+
color: var(--ifm-font-color-base);
|
|
25
|
+
line-height: 1.6;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.outputContent > *:first-child {
|
|
29
|
+
margin-top: 0;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
.outputContent > *:last-child {
|
|
33
|
+
margin-bottom: 0;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
.outputContent p {
|
|
37
|
+
margin-bottom: 0.75rem;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.outputContent ul,
|
|
41
|
+
.outputContent ol {
|
|
42
|
+
margin-left: 1.5rem;
|
|
43
|
+
margin-bottom: 0.75rem;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.outputContent li {
|
|
47
|
+
margin-bottom: 0.25rem;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.outputContent code {
|
|
51
|
+
border-radius: 3px;
|
|
52
|
+
padding: 0.125rem 0.375rem;
|
|
53
|
+
font-size: 0.9em;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
.outputContent pre code {
|
|
57
|
+
padding: 16px;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
.outputContent pre {
|
|
61
|
+
margin-top: 20px;
|
|
62
|
+
margin-bottom: 20px;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/* Dark mode adjustments */
|
|
66
|
+
html[data-theme='dark'] .outputPanel {
|
|
67
|
+
border-left-color: var(--ifm-color-info-light);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
html[data-theme='dark'] .outputLabel {
|
|
71
|
+
color: var(--ifm-color-info-light);
|
|
72
|
+
}
|
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Solution Panel Styles
|
|
3
|
+
* Uses success color scheme (--ifm-color-success)
|
|
3
4
|
*/
|
|
4
5
|
|
|
5
6
|
.solutionPanel {
|
|
6
7
|
padding: 1rem 1.25rem;
|
|
7
|
-
background-color: var(--ifm-color-
|
|
8
|
-
border-left: 4px solid var(--ifm-color-
|
|
8
|
+
background-color: var(--ifm-color-success-contrast-background);
|
|
9
|
+
border-left: 4px solid var(--ifm-color-success);
|
|
9
10
|
border-radius: 4px;
|
|
10
11
|
}
|
|
11
12
|
|
|
12
13
|
.solutionLabel {
|
|
13
14
|
font-weight: 600;
|
|
14
15
|
font-size: 0.95rem;
|
|
15
|
-
color: var(--ifm-color-
|
|
16
|
+
color: var(--ifm-color-success-darker);
|
|
16
17
|
margin-bottom: 0.75rem;
|
|
17
18
|
display: flex;
|
|
18
19
|
align-items: center;
|
|
@@ -62,9 +63,10 @@
|
|
|
62
63
|
|
|
63
64
|
/* Dark mode adjustments */
|
|
64
65
|
html[data-theme='dark'] .solutionPanel {
|
|
65
|
-
|
|
66
|
+
background-color: rgba(0, 210, 91, 0.1);
|
|
67
|
+
border-left-color: var(--ifm-color-success-light);
|
|
66
68
|
}
|
|
67
69
|
|
|
68
70
|
html[data-theme='dark'] .solutionLabel {
|
|
69
|
-
color: var(--ifm-color-
|
|
71
|
+
color: var(--ifm-color-success-light);
|
|
70
72
|
}
|
|
@@ -2,10 +2,11 @@
|
|
|
2
2
|
* Task Component
|
|
3
3
|
* Interactive collapsible task with optional hint and solution sections
|
|
4
4
|
*/
|
|
5
|
-
import { type ReactNode, type ReactElement } from
|
|
5
|
+
import { type ReactNode, type ReactElement } from "react";
|
|
6
6
|
export interface TaskProps {
|
|
7
7
|
name: string;
|
|
8
8
|
children?: ReactNode;
|
|
9
|
+
id?: string;
|
|
9
10
|
}
|
|
10
|
-
export default function Task({ name, children }: TaskProps): ReactElement;
|
|
11
|
+
export default function Task({ name, children, id }: TaskProps): ReactElement;
|
|
11
12
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/theme/Task/index.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/theme/Task/index.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAc,EACZ,KAAK,SAAS,EAEd,KAAK,YAAY,EAGlB,MAAM,OAAO,CAAC;AAaf,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,CAAC,OAAO,UAAU,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,SAAS,GAAG,YAAY,CA2c5E"}
|