@sp-days-framework/docusaurus-plugin-interactive-tasks 1.0.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.
Files changed (173) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +339 -0
  3. package/lib/contexts/DocTaskCounterContext.d.ts +15 -0
  4. package/lib/contexts/DocTaskCounterContext.d.ts.map +1 -0
  5. package/lib/contexts/DocTaskCounterContext.js +7 -0
  6. package/lib/contexts/DocTaskCounterContext.js.map +1 -0
  7. package/lib/contexts/TaskContext.d.ts +72 -0
  8. package/lib/contexts/TaskContext.d.ts.map +1 -0
  9. package/lib/contexts/TaskContext.js +6 -0
  10. package/lib/contexts/TaskContext.js.map +1 -0
  11. package/lib/index.d.ts +14 -0
  12. package/lib/index.d.ts.map +1 -0
  13. package/lib/index.js +59 -0
  14. package/lib/index.js.map +1 -0
  15. package/lib/plugin/TaskRegistryPlugin.d.ts +27 -0
  16. package/lib/plugin/TaskRegistryPlugin.d.ts.map +1 -0
  17. package/lib/plugin/TaskRegistryPlugin.js +328 -0
  18. package/lib/plugin/TaskRegistryPlugin.js.map +1 -0
  19. package/lib/plugin/remarkTaskDirective.d.ts +29 -0
  20. package/lib/plugin/remarkTaskDirective.d.ts.map +1 -0
  21. package/lib/plugin/remarkTaskDirective.js +277 -0
  22. package/lib/plugin/remarkTaskDirective.js.map +1 -0
  23. package/lib/theme/DocRoot/Layout/index.d.ts +14 -0
  24. package/lib/theme/DocRoot/Layout/index.d.ts.map +1 -0
  25. package/lib/theme/DocRoot/Layout/index.js +27 -0
  26. package/lib/theme/DocRoot/Layout/index.js.map +1 -0
  27. package/lib/theme/DocRoot/index.d.ts +22 -0
  28. package/lib/theme/DocRoot/index.d.ts.map +1 -0
  29. package/lib/theme/DocRoot/index.js +33 -0
  30. package/lib/theme/DocRoot/index.js.map +1 -0
  31. package/lib/theme/DocSidebar/Desktop/CollapseButton/index.d.ts +4 -0
  32. package/lib/theme/DocSidebar/Desktop/CollapseButton/index.d.ts.map +1 -0
  33. package/lib/theme/DocSidebar/Desktop/CollapseButton/index.js +24 -0
  34. package/lib/theme/DocSidebar/Desktop/CollapseButton/index.js.map +1 -0
  35. package/lib/theme/DocSidebar/Desktop/CollapseButton/styles.module.css +40 -0
  36. package/lib/theme/DocSidebar/Desktop/Content/index.d.ts +4 -0
  37. package/lib/theme/DocSidebar/Desktop/Content/index.d.ts.map +1 -0
  38. package/lib/theme/DocSidebar/Desktop/Content/index.js +67 -0
  39. package/lib/theme/DocSidebar/Desktop/Content/index.js.map +1 -0
  40. package/lib/theme/DocSidebar/Desktop/Content/styles.module.css +16 -0
  41. package/lib/theme/DocSidebar/Desktop/index.d.ts +6 -0
  42. package/lib/theme/DocSidebar/Desktop/index.d.ts.map +1 -0
  43. package/lib/theme/DocSidebar/Desktop/index.js +21 -0
  44. package/lib/theme/DocSidebar/Desktop/index.js.map +1 -0
  45. package/lib/theme/DocSidebar/Desktop/styles.module.css +37 -0
  46. package/lib/theme/DocSidebar/Mobile/index.d.ts +6 -0
  47. package/lib/theme/DocSidebar/Mobile/index.d.ts.map +1 -0
  48. package/lib/theme/DocSidebar/Mobile/index.js +29 -0
  49. package/lib/theme/DocSidebar/Mobile/index.js.map +1 -0
  50. package/lib/theme/DocSidebar/index.d.ts +4 -0
  51. package/lib/theme/DocSidebar/index.d.ts.map +1 -0
  52. package/lib/theme/DocSidebar/index.js +21 -0
  53. package/lib/theme/DocSidebar/index.js.map +1 -0
  54. package/lib/theme/DocSidebarItem/Category/index.d.ts +4 -0
  55. package/lib/theme/DocSidebarItem/Category/index.d.ts.map +1 -0
  56. package/lib/theme/DocSidebarItem/Category/index.js +316 -0
  57. package/lib/theme/DocSidebarItem/Category/index.js.map +1 -0
  58. package/lib/theme/DocSidebarItem/Category/styles.module.css +187 -0
  59. package/lib/theme/DocSidebarItem/Html/index.d.ts +4 -0
  60. package/lib/theme/DocSidebarItem/Html/index.d.ts.map +1 -0
  61. package/lib/theme/DocSidebarItem/Html/index.js +17 -0
  62. package/lib/theme/DocSidebarItem/Html/index.js.map +1 -0
  63. package/lib/theme/DocSidebarItem/Html/styles.module.css +6 -0
  64. package/lib/theme/DocSidebarItem/Link/index.d.ts +6 -0
  65. package/lib/theme/DocSidebarItem/Link/index.d.ts.map +1 -0
  66. package/lib/theme/DocSidebarItem/Link/index.js +149 -0
  67. package/lib/theme/DocSidebarItem/Link/index.js.map +1 -0
  68. package/lib/theme/DocSidebarItem/Link/styles.module.css +197 -0
  69. package/lib/theme/DocSidebarItem/index.d.ts +4 -0
  70. package/lib/theme/DocSidebarItem/index.d.ts.map +1 -0
  71. package/lib/theme/DocSidebarItem/index.js +22 -0
  72. package/lib/theme/DocSidebarItem/index.js.map +1 -0
  73. package/lib/theme/DocSidebarItems/index.d.ts +6 -0
  74. package/lib/theme/DocSidebarItems/index.d.ts.map +1 -0
  75. package/lib/theme/DocSidebarItems/index.js +48 -0
  76. package/lib/theme/DocSidebarItems/index.js.map +1 -0
  77. package/lib/theme/DocTaskCounterProvider/index.d.ts +20 -0
  78. package/lib/theme/DocTaskCounterProvider/index.d.ts.map +1 -0
  79. package/lib/theme/DocTaskCounterProvider/index.js +105 -0
  80. package/lib/theme/DocTaskCounterProvider/index.js.map +1 -0
  81. package/lib/theme/MDXComponents.d.ts +19 -0
  82. package/lib/theme/MDXComponents.d.ts.map +1 -0
  83. package/lib/theme/MDXComponents.js +52 -0
  84. package/lib/theme/MDXComponents.js.map +1 -0
  85. package/lib/theme/Root.d.ts +9 -0
  86. package/lib/theme/Root.d.ts.map +1 -0
  87. package/lib/theme/Root.js +105 -0
  88. package/lib/theme/Root.js.map +1 -0
  89. package/lib/theme/Task/Hint/index.d.ts +14 -0
  90. package/lib/theme/Task/Hint/index.d.ts.map +1 -0
  91. package/lib/theme/Task/Hint/index.js +23 -0
  92. package/lib/theme/Task/Hint/index.js.map +1 -0
  93. package/lib/theme/Task/Hint/styles.module.css +72 -0
  94. package/lib/theme/Task/Solution/index.d.ts +14 -0
  95. package/lib/theme/Task/Solution/index.d.ts.map +1 -0
  96. package/lib/theme/Task/Solution/index.js +23 -0
  97. package/lib/theme/Task/Solution/index.js.map +1 -0
  98. package/lib/theme/Task/Solution/styles.module.css +71 -0
  99. package/lib/theme/Task/Text/index.d.ts +14 -0
  100. package/lib/theme/Task/Text/index.d.ts.map +1 -0
  101. package/lib/theme/Task/Text/index.js +18 -0
  102. package/lib/theme/Task/Text/index.js.map +1 -0
  103. package/lib/theme/Task/Text/styles.module.css +39 -0
  104. package/lib/theme/Task/index.d.ts +11 -0
  105. package/lib/theme/Task/index.d.ts.map +1 -0
  106. package/lib/theme/Task/index.js +286 -0
  107. package/lib/theme/Task/index.js.map +1 -0
  108. package/lib/theme/Task/styles.module.css +529 -0
  109. package/lib/theme/TaskAutoHideToggle/index.d.ts +10 -0
  110. package/lib/theme/TaskAutoHideToggle/index.d.ts.map +1 -0
  111. package/lib/theme/TaskAutoHideToggle/index.js +79 -0
  112. package/lib/theme/TaskAutoHideToggle/index.js.map +1 -0
  113. package/lib/theme/TaskAutoHideToggle/styles.module.css +41 -0
  114. package/lib/theme/TaskExample/index.d.ts +16 -0
  115. package/lib/theme/TaskExample/index.d.ts.map +1 -0
  116. package/lib/theme/TaskExample/index.js +249 -0
  117. package/lib/theme/TaskExample/index.js.map +1 -0
  118. package/lib/theme/TaskPlaceholder/README.md +119 -0
  119. package/lib/theme/TaskPlaceholder/index.d.ts +23 -0
  120. package/lib/theme/TaskPlaceholder/index.d.ts.map +1 -0
  121. package/lib/theme/TaskPlaceholder/index.js +293 -0
  122. package/lib/theme/TaskPlaceholder/index.js.map +1 -0
  123. package/lib/theme/TaskProgression/index.d.ts +11 -0
  124. package/lib/theme/TaskProgression/index.d.ts.map +1 -0
  125. package/lib/theme/TaskProgression/index.js +131 -0
  126. package/lib/theme/TaskProgression/index.js.map +1 -0
  127. package/lib/theme/TaskProgression/styles.module.css +162 -0
  128. package/lib/theme/TaskProgressionOverview/index.d.ts +10 -0
  129. package/lib/theme/TaskProgressionOverview/index.d.ts.map +1 -0
  130. package/lib/theme/TaskProgressionOverview/index.js +123 -0
  131. package/lib/theme/TaskProgressionOverview/index.js.map +1 -0
  132. package/lib/theme/TaskProgressionOverview/styles.module.css +159 -0
  133. package/lib/theme/TaskProvider/index.d.ts +15 -0
  134. package/lib/theme/TaskProvider/index.d.ts.map +1 -0
  135. package/lib/theme/TaskProvider/index.js +134 -0
  136. package/lib/theme/TaskProvider/index.js.map +1 -0
  137. package/lib/utils/badgeStyles.d.ts +29 -0
  138. package/lib/utils/badgeStyles.d.ts.map +1 -0
  139. package/lib/utils/badgeStyles.js +60 -0
  140. package/lib/utils/badgeStyles.js.map +1 -0
  141. package/lib/utils/icons.d.ts +38 -0
  142. package/lib/utils/icons.d.ts.map +1 -0
  143. package/lib/utils/icons.js +53 -0
  144. package/lib/utils/icons.js.map +1 -0
  145. package/lib/utils/logger.d.ts +38 -0
  146. package/lib/utils/logger.d.ts.map +1 -0
  147. package/lib/utils/logger.js +72 -0
  148. package/lib/utils/logger.js.map +1 -0
  149. package/lib/utils/storage.d.ts +33 -0
  150. package/lib/utils/storage.d.ts.map +1 -0
  151. package/lib/utils/storage.js +105 -0
  152. package/lib/utils/storage.js.map +1 -0
  153. package/lib/utils/useDocTaskStats.d.ts +58 -0
  154. package/lib/utils/useDocTaskStats.d.ts.map +1 -0
  155. package/lib/utils/useDocTaskStats.js +206 -0
  156. package/lib/utils/useDocTaskStats.js.map +1 -0
  157. package/lib/utils/usePluginId.d.ts +24 -0
  158. package/lib/utils/usePluginId.d.ts.map +1 -0
  159. package/lib/utils/usePluginId.js +61 -0
  160. package/lib/utils/usePluginId.js.map +1 -0
  161. package/lib/utils/useResolveDocPath.d.ts +33 -0
  162. package/lib/utils/useResolveDocPath.d.ts.map +1 -0
  163. package/lib/utils/useResolveDocPath.js +122 -0
  164. package/lib/utils/useResolveDocPath.js.map +1 -0
  165. package/lib/utils/useTaskBadgeAnimation.d.ts +16 -0
  166. package/lib/utils/useTaskBadgeAnimation.d.ts.map +1 -0
  167. package/lib/utils/useTaskBadgeAnimation.js +51 -0
  168. package/lib/utils/useTaskBadgeAnimation.js.map +1 -0
  169. package/lib/validateThemeConfig.d.ts +8 -0
  170. package/lib/validateThemeConfig.d.ts.map +1 -0
  171. package/lib/validateThemeConfig.js +15 -0
  172. package/lib/validateThemeConfig.js.map +1 -0
  173. package/package.json +82 -0
@@ -0,0 +1,529 @@
1
+ /* ===================== TASK COMPONENT ===================== */
2
+
3
+ .taskContainer {
4
+ margin-bottom: 1.5rem;
5
+ border: 2px solid var(--ifm-color-emphasis-300);
6
+ border-radius: 8px;
7
+ background-color: var(--ifm-background-surface-color);
8
+ transition: border-color 0.2s ease, box-shadow 0.2s ease,
9
+ max-height 0.3s ease-out;
10
+ overflow: hidden;
11
+ }
12
+
13
+ .taskContainer:hover {
14
+ border-color: var(--ifm-color-emphasis-500);
15
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
16
+ }
17
+
18
+ .taskCompleted {
19
+ border-color: var(--ifm-color-success);
20
+ /* background-color: var(--ifm-color-success-contrast-background); */
21
+ }
22
+
23
+ .taskCompletedAnimating {
24
+ animation: borderPulse 0.6s ease-out;
25
+ }
26
+
27
+ @keyframes borderPulse {
28
+ 0%,
29
+ 100% {
30
+ box-shadow: 0 0 0 0 var(--ifm-color-success-lightest);
31
+ }
32
+
33
+ 50% {
34
+ box-shadow: 0 0 0 8px var(--ifm-color-success-lightest);
35
+ }
36
+ }
37
+
38
+ .taskCompleted:hover {
39
+ border-color: var(--ifm-color-success-dark);
40
+ }
41
+
42
+ /* ===================== TASK HEADER ===================== */
43
+
44
+ .taskHeader {
45
+ display: flex;
46
+ align-items: center;
47
+ justify-content: space-between;
48
+ gap: 1rem;
49
+ padding: 1rem 1.25rem;
50
+ cursor: pointer;
51
+ user-select: none;
52
+ position: relative;
53
+ background: var(--ifm-background-surface-color);
54
+ transition: background 0.3s ease;
55
+ }
56
+
57
+ .taskHeader::before {
58
+ content: "";
59
+ position: absolute;
60
+ top: 0;
61
+ left: 0;
62
+ right: 0;
63
+ bottom: 0;
64
+ background: linear-gradient(
65
+ to bottom,
66
+ var(--ifm-color-emphasis-200) 0%,
67
+ transparent 80%
68
+ );
69
+ opacity: 0;
70
+ transition: opacity 0.3s ease;
71
+ pointer-events: none;
72
+ z-index: 0;
73
+ }
74
+
75
+ .taskHeader:hover::before {
76
+ opacity: 1;
77
+ }
78
+
79
+ .taskHeaderLeft {
80
+ display: flex;
81
+ align-items: center;
82
+ gap: 0.75rem;
83
+ flex: 1;
84
+ min-width: 0;
85
+ position: relative;
86
+ z-index: 1;
87
+ }
88
+
89
+ .taskBadge {
90
+ display: inline-flex;
91
+ align-items: center;
92
+ padding: 0.25rem 0.625rem;
93
+ font-size: 0.75rem;
94
+ font-weight: 500;
95
+ color: var(--ifm-color-primary);
96
+ background-color: var(--ifm-color-emphasis-200);
97
+ border-radius: 4px;
98
+ border: 1px solid var(--ifm-color-emphasis-300);
99
+ white-space: nowrap;
100
+ flex-shrink: 0;
101
+ }
102
+
103
+ .taskName {
104
+ margin: 0;
105
+ font-size: 1.1rem;
106
+ font-weight: 600;
107
+ color: var(--ifm-font-color-base);
108
+ display: flex;
109
+ align-items: center;
110
+ gap: 0.5rem;
111
+ flex: 1;
112
+ min-width: 0;
113
+ margin-bottom: 1px;
114
+ transition: color 0.6s ease-out;
115
+ }
116
+
117
+ .taskCompleted .taskName {
118
+ color: var(--ifm-color-success);
119
+ }
120
+
121
+ .checkmark {
122
+ display: inline-flex;
123
+ align-items: center;
124
+ color: var(--ifm-color-success);
125
+ flex-shrink: 0;
126
+ /* Always hidden by default */
127
+ opacity: 0;
128
+ transform: scale(0);
129
+ }
130
+
131
+ .checkmarkVisible {
132
+ /* Static visible state (when completed but not animating) */
133
+ opacity: 1;
134
+ transform: scale(1);
135
+ }
136
+
137
+ .checkmarkAnimating {
138
+ animation: checkmarkPop 0.6s ease-out forwards;
139
+ }
140
+
141
+ .checkmarkRemoving {
142
+ animation: checkmarkZoomOut 0.6s ease-out forwards;
143
+ }
144
+
145
+ @keyframes checkmarkPop {
146
+ 0% {
147
+ transform: scale(0);
148
+ opacity: 0;
149
+ }
150
+
151
+ 50% {
152
+ transform: scale(1.2);
153
+ opacity: 1;
154
+ }
155
+
156
+ 100% {
157
+ transform: scale(1);
158
+ opacity: 1;
159
+ }
160
+ }
161
+
162
+ @keyframes checkmarkZoomOut {
163
+ 0% {
164
+ transform: scale(1);
165
+ opacity: 1;
166
+ }
167
+
168
+ 100% {
169
+ transform: scale(0);
170
+ opacity: 0;
171
+ }
172
+ }
173
+
174
+ .expandButton {
175
+ background: none;
176
+ border: none;
177
+ padding: 0.25rem;
178
+ cursor: pointer;
179
+ display: flex;
180
+ align-items: center;
181
+ justify-content: center;
182
+ color: var(--ifm-color-emphasis-700);
183
+ transition: color 0.2s ease;
184
+ flex-shrink: 0;
185
+ position: relative;
186
+ z-index: 1;
187
+ }
188
+
189
+ .expandButton:hover {
190
+ color: var(--ifm-color-primary);
191
+ }
192
+
193
+ .chevron {
194
+ display: flex;
195
+ align-items: center;
196
+ justify-content: center;
197
+ transition: transform 0.2s ease;
198
+ color: currentColor;
199
+ }
200
+
201
+ .chevronCollapsed {
202
+ transform: rotate(-90deg);
203
+ }
204
+
205
+ /* ===================== TASK BODY ===================== */
206
+
207
+ .taskBody {
208
+ padding: 0 1.25rem 1rem 1.25rem;
209
+ animation: slideDown 0.3s ease-out;
210
+ overflow: hidden;
211
+ }
212
+
213
+ .taskBodyCollapsing {
214
+ animation: slideUp 0.3s ease-out;
215
+ }
216
+
217
+ @keyframes slideDown {
218
+ from {
219
+ opacity: 0;
220
+ max-height: 0;
221
+ transform: translateY(-8px);
222
+ }
223
+
224
+ to {
225
+ opacity: 1;
226
+ max-height: 2000px;
227
+ transform: translateY(0);
228
+ }
229
+ }
230
+
231
+ @keyframes slideUp {
232
+ from {
233
+ opacity: 1;
234
+ max-height: 2000px;
235
+ transform: translateY(0);
236
+ }
237
+
238
+ to {
239
+ opacity: 0;
240
+ max-height: 0;
241
+ transform: translateY(-8px);
242
+ }
243
+ }
244
+
245
+ /* ===================== TASK FOOTER ===================== */
246
+
247
+ .taskFooter {
248
+ padding: 1rem 1.25rem 1rem 1.25rem;
249
+ display: flex;
250
+ align-items: center;
251
+ justify-content: space-between;
252
+ gap: 0.75rem;
253
+ flex-wrap: wrap;
254
+ position: relative;
255
+ animation: slideDown 0.3s ease-out;
256
+ overflow: hidden;
257
+ }
258
+
259
+ .taskFooterCollapsing {
260
+ animation: slideUp 0.3s ease-out;
261
+ }
262
+
263
+ .taskFooter::before {
264
+ content: "";
265
+ position: absolute;
266
+ top: 0;
267
+ left: 1.25rem;
268
+ right: 1.25rem;
269
+ height: 1px;
270
+ background: linear-gradient(
271
+ to right,
272
+ transparent,
273
+ var(--ifm-color-emphasis-300) 20%,
274
+ var(--ifm-color-emphasis-300) 80%,
275
+ transparent
276
+ );
277
+ margin-bottom: 1rem;
278
+ }
279
+
280
+ .taskActions {
281
+ display: flex;
282
+ align-items: center;
283
+ gap: 0.5rem;
284
+ flex: 1;
285
+ }
286
+
287
+ .taskButton {
288
+ padding: 0.5rem 1rem;
289
+ font-size: 0.875rem;
290
+ font-weight: 600;
291
+ border-radius: 6px;
292
+ border: 1.5px solid;
293
+ cursor: pointer;
294
+ transition: all 0.2s ease;
295
+ background: var(--ifm-background-surface-color);
296
+ white-space: nowrap;
297
+ }
298
+
299
+ /* Hint Button (Warning) */
300
+ .hintButton {
301
+ border-color: var(--ifm-color-warning-darker);
302
+ color: var(--ifm-color-warning-darkest);
303
+ font-weight: 600;
304
+ }
305
+
306
+ .hintButton:hover {
307
+ background: var(--ifm-color-warning-contrast-background);
308
+ border-color: var(--ifm-color-warning-darkest);
309
+ }
310
+
311
+ .hintButton.active {
312
+ background: var(--ifm-color-warning-darker);
313
+ color: var(--ifm-color-secondary-contrast-background);
314
+ }
315
+
316
+ /* Solution Button (Info) */
317
+ .solutionButton {
318
+ border-color: var(--ifm-color-info-darker);
319
+ color: var(--ifm-color-info-darkest);
320
+ font-weight: 600;
321
+ }
322
+
323
+ .solutionButton:hover {
324
+ background: var(--ifm-color-info-contrast-background);
325
+ border-color: var(--ifm-color-info-darkest);
326
+ }
327
+
328
+ .solutionButton.active {
329
+ background: var(--ifm-color-info-darker);
330
+ color: var(--ifm-color-secondary-contrast-background);
331
+ }
332
+
333
+ /* Complete Button (Primary) */
334
+ .completeButton {
335
+ border-color: var(--ifm-color-primary);
336
+ color: var(--ifm-color-primary);
337
+ margin-left: auto;
338
+ }
339
+
340
+ .completeButton:hover {
341
+ background: var(--ifm-color-primary);
342
+ color: var(--ifm-color-white);
343
+ }
344
+
345
+ /* Completed Button (when task is done - shown as Undo) */
346
+ .completedButton {
347
+ border-color: var(--ifm-color-danger);
348
+ color: var(--ifm-color-danger);
349
+ }
350
+
351
+ .completedButton:hover {
352
+ background: var(--ifm-color-danger);
353
+ color: var(--ifm-color-white);
354
+ }
355
+
356
+ /* ===================== PANELS (Hint/Solution) ===================== */
357
+
358
+ .panelWrapper {
359
+ position: relative;
360
+ margin: 0 1.25rem 0rem 1.25rem;
361
+ }
362
+
363
+ .panelSpacer {
364
+ /* Invisible spacer that maintains layout space */
365
+ width: 100%;
366
+ overflow: hidden;
367
+ }
368
+
369
+ .panelContainer {
370
+ border-radius: 6px;
371
+ overflow: hidden;
372
+ transition: margin 0.3s ease-out;
373
+ }
374
+
375
+ .panelAbsolute {
376
+ position: absolute;
377
+ top: 0;
378
+ left: 0;
379
+ right: 0;
380
+ opacity: 0;
381
+ pointer-events: none;
382
+ visibility: hidden;
383
+ transform: translateX(0);
384
+ }
385
+
386
+ .panelVisible {
387
+ /* Don't set opacity here - let animations handle it */
388
+ pointer-events: auto;
389
+ visibility: visible;
390
+ }
391
+
392
+ .panelContainerExpanding {
393
+ animation: expandPanel 0.3s ease-out forwards;
394
+ }
395
+
396
+ .panelContainerCollapsing {
397
+ animation: collapsePanel 0.3s ease-out forwards;
398
+ }
399
+
400
+ .hintPanelContainerExpandingSwitching {
401
+ animation: expandLeftToRight 0.3s ease-out forwards;
402
+ }
403
+
404
+ .hintPanelContainerCollapsingSwitching {
405
+ animation: collapseRightToLeft 0.3s ease-out forwards;
406
+ }
407
+
408
+ .solutionPanelContainerExpandingSwitching {
409
+ animation: expandRightToLeft 0.3s ease-out forwards;
410
+ }
411
+
412
+ .solutionPanelContainerCollapsingSwitching {
413
+ animation: collapseLeftToRight 0.3s ease-out forwards;
414
+ }
415
+
416
+ @keyframes expandPanel {
417
+ from {
418
+ opacity: 0;
419
+ transform: translateY(-8px);
420
+ }
421
+
422
+ to {
423
+ opacity: 1;
424
+ transform: translateY(0);
425
+ }
426
+ }
427
+
428
+ @keyframes collapsePanel {
429
+ from {
430
+ opacity: 1;
431
+ transform: translateY(0);
432
+ }
433
+
434
+ to {
435
+ opacity: 0;
436
+ transform: translateY(-8px);
437
+ }
438
+ }
439
+
440
+ @keyframes expandRightToLeft {
441
+ /* Appears from the RIGHT, slides to center (used when showing hint from solution) */
442
+ from {
443
+ opacity: 0;
444
+ transform: translateX(30px);
445
+ }
446
+
447
+ to {
448
+ opacity: 1;
449
+ transform: translateX(0);
450
+ }
451
+ }
452
+
453
+ @keyframes collapseRightToLeft {
454
+ /* Disappears to the LEFT (used when hiding hint to show solution) */
455
+ from {
456
+ opacity: 1;
457
+ transform: translateX(0);
458
+ }
459
+
460
+ to {
461
+ opacity: 0;
462
+ transform: translateX(-30px);
463
+ }
464
+ }
465
+
466
+ @keyframes expandLeftToRight {
467
+ /* Appears from the LEFT, slides to center (used when showing solution from hint) */
468
+ from {
469
+ opacity: 0;
470
+ transform: translateX(-30px);
471
+ }
472
+
473
+ to {
474
+ opacity: 1;
475
+ transform: translateX(0);
476
+ }
477
+ }
478
+
479
+ @keyframes collapseLeftToRight {
480
+ /* Disappears to the RIGHT (used when hiding solution to show hint) */
481
+ from {
482
+ opacity: 1;
483
+ transform: translateX(0);
484
+ }
485
+
486
+ to {
487
+ opacity: 0;
488
+ transform: translateX(30px);
489
+ }
490
+ }
491
+
492
+ /* ===================== DARK MODE ===================== */
493
+
494
+ html[data-theme="dark"] .taskContainer {
495
+ border-color: var(--ifm-color-emphasis-200);
496
+ }
497
+
498
+ html[data-theme="dark"] .taskContainer:hover {
499
+ border-color: var(--ifm-color-emphasis-400);
500
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
501
+ }
502
+
503
+ html[data-theme="dark"] .taskCompleted {
504
+ border-color: var(--ifm-color-success-dark);
505
+ }
506
+
507
+ html[data-theme="dark"] .taskCompleted:hover {
508
+ border-color: var(--ifm-color-success);
509
+ }
510
+
511
+ html[data-theme="dark"] .hintButton {
512
+ border-color: var(--ifm-color-warning-light);
513
+ color: var(--ifm-color-warning-light);
514
+ }
515
+
516
+ html[data-theme="dark"] .hintButton.active {
517
+ background: var(--ifm-color-warning-darker);
518
+ color: var(--ifm-color-secondary-contrast-background);
519
+ }
520
+
521
+ html[data-theme="dark"] .solutionButton {
522
+ border-color: var(--ifm-color-info-light);
523
+ color: var(--ifm-color-info-light);
524
+ }
525
+
526
+ html[data-theme="dark"] .solutionButton.active {
527
+ background: var(--ifm-color-info-darker);
528
+ color: var(--ifm-color-secondary-contrast-background);
529
+ }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * TaskAutoHideToggle Component
3
+ * A navbar button that toggles the auto-collapse functionality for completed tasks.
4
+ *
5
+ * This component manages its own state using localStorage instead of TaskContext
6
+ * because navbar items render outside the TaskProvider scope.
7
+ */
8
+ import React from 'react';
9
+ export default function TaskAutoHideToggle(): React.ReactElement;
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/theme/TaskAutoHideToggle/index.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAA8B,MAAM,OAAO,CAAC;AAQnD,MAAM,CAAC,OAAO,UAAU,kBAAkB,IAAI,KAAK,CAAC,YAAY,CA+C/D"}
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ /**
3
+ * TaskAutoHideToggle Component
4
+ * A navbar button that toggles the auto-collapse functionality for completed tasks.
5
+ *
6
+ * This component manages its own state using localStorage instead of TaskContext
7
+ * because navbar items render outside the TaskProvider scope.
8
+ */
9
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ var desc = Object.getOwnPropertyDescriptor(m, k);
12
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
13
+ desc = { enumerable: true, get: function() { return m[k]; } };
14
+ }
15
+ Object.defineProperty(o, k2, desc);
16
+ }) : (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ o[k2] = m[k];
19
+ }));
20
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
21
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
22
+ }) : function(o, v) {
23
+ o["default"] = v;
24
+ });
25
+ var __importStar = (this && this.__importStar) || (function () {
26
+ var ownKeys = function(o) {
27
+ ownKeys = Object.getOwnPropertyNames || function (o) {
28
+ var ar = [];
29
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
30
+ return ar;
31
+ };
32
+ return ownKeys(o);
33
+ };
34
+ return function (mod) {
35
+ if (mod && mod.__esModule) return mod;
36
+ var result = {};
37
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
38
+ __setModuleDefault(result, mod);
39
+ return result;
40
+ };
41
+ })();
42
+ var __importDefault = (this && this.__importDefault) || function (mod) {
43
+ return (mod && mod.__esModule) ? mod : { "default": mod };
44
+ };
45
+ Object.defineProperty(exports, "__esModule", { value: true });
46
+ exports.default = TaskAutoHideToggle;
47
+ const react_1 = __importStar(require("react"));
48
+ const icons_1 = require("../../utils/icons");
49
+ const storage_1 = require("../../utils/storage");
50
+ const styles_module_css_1 = __importDefault(require("./styles.module.css"));
51
+ function TaskAutoHideToggle() {
52
+ const [autoCollapse, setAutoCollapse] = (0, react_1.useState)(() => (0, storage_1.loadAutoCollapseFromStorage)());
53
+ // Listen for changes from storage events (cross-tab) and custom events (same page)
54
+ (0, react_1.useEffect)(() => {
55
+ const handleStorageChange = () => {
56
+ setAutoCollapse((0, storage_1.loadAutoCollapseFromStorage)());
57
+ };
58
+ const handleCustomEvent = () => {
59
+ setAutoCollapse((0, storage_1.loadAutoCollapseFromStorage)());
60
+ };
61
+ // Listen to storage events (cross-tab sync)
62
+ window.addEventListener('storage', handleStorageChange);
63
+ // Listen to custom events (same-page sync from TaskProvider)
64
+ window.addEventListener('task-auto-collapse-changed', handleCustomEvent);
65
+ return () => {
66
+ window.removeEventListener('storage', handleStorageChange);
67
+ window.removeEventListener('task-auto-collapse-changed', handleCustomEvent);
68
+ };
69
+ }, []);
70
+ const handleToggle = () => {
71
+ const newValue = !autoCollapse;
72
+ setAutoCollapse(newValue);
73
+ (0, storage_1.saveAutoCollapseToStorage)(newValue);
74
+ // Dispatch custom event to notify TaskProvider and other components
75
+ window.dispatchEvent(new CustomEvent('task-auto-collapse-changed'));
76
+ };
77
+ return (react_1.default.createElement("button", { type: "button", className: styles_module_css_1.default.toggleButton, onClick: handleToggle, "aria-label": autoCollapse ? 'Disable auto-collapse' : 'Enable auto-collapse', title: autoCollapse ? 'Auto-collapse enabled' : 'Auto-collapse disabled' }, autoCollapse ? icons_1.ENABLED_ICON : icons_1.DISABLED_ICON));
78
+ }
79
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/theme/TaskAutoHideToggle/index.tsx"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAUH,qCA+CC;AAvDD,+CAAmD;AACnD,6CAAgE;AAChE,iDAG6B;AAC7B,4EAAyC;AAEzC,SAAwB,kBAAkB;IACxC,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,IAAA,gBAAQ,EAAU,GAAG,EAAE,CAC7D,IAAA,qCAA2B,GAAE,CAC9B,CAAC;IAEF,mFAAmF;IACnF,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,MAAM,mBAAmB,GAAG,GAAG,EAAE;YAC/B,eAAe,CAAC,IAAA,qCAA2B,GAAE,CAAC,CAAC;QACjD,CAAC,CAAC;QAEF,MAAM,iBAAiB,GAAG,GAAG,EAAE;YAC7B,eAAe,CAAC,IAAA,qCAA2B,GAAE,CAAC,CAAC;QACjD,CAAC,CAAC;QAEF,4CAA4C;QAC5C,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;QAExD,6DAA6D;QAC7D,MAAM,CAAC,gBAAgB,CAAC,4BAA4B,EAAE,iBAAiB,CAAC,CAAC;QAEzE,OAAO,GAAG,EAAE;YACV,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;YAC3D,MAAM,CAAC,mBAAmB,CAAC,4BAA4B,EAAE,iBAAiB,CAAC,CAAC;QAC9E,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,YAAY,GAAG,GAAG,EAAE;QACxB,MAAM,QAAQ,GAAG,CAAC,YAAY,CAAC;QAC/B,eAAe,CAAC,QAAQ,CAAC,CAAC;QAC1B,IAAA,mCAAyB,EAAC,QAAQ,CAAC,CAAC;QAEpC,oEAAoE;QACpE,MAAM,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,4BAA4B,CAAC,CAAC,CAAC;IACtE,CAAC,CAAC;IAEF,OAAO,CACL,0CACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,2BAAM,CAAC,YAAY,EAC9B,OAAO,EAAE,YAAY,gBACT,YAAY,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,sBAAsB,EAC3E,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,wBAAwB,IAEvE,YAAY,CAAC,CAAC,CAAC,oBAAY,CAAC,CAAC,CAAC,qBAAa,CACrC,CACV,CAAC;AACJ,CAAC"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * TaskAutoHideToggle Styles
3
+ */
4
+
5
+ .toggleButton {
6
+ background: none;
7
+ border: none;
8
+ cursor: pointer;
9
+ margin-right: 0.5rem;
10
+ display: flex;
11
+ align-items: center;
12
+ justify-content: center;
13
+ padding: 0.25rem;
14
+ height: 40px;
15
+ color: var(--ifm-navbar-link-color);
16
+ transition: opacity 0.2s ease, background-color 0.2s ease;
17
+ border-radius: 4px;
18
+ }
19
+
20
+ .toggleButton:hover {
21
+ opacity: 0.8;
22
+ background-color: var(--ifm-color-emphasis-200);
23
+ }
24
+
25
+ .toggleButton:active {
26
+ opacity: 0.6;
27
+ }
28
+
29
+ .toggleButton:focus-visible {
30
+ outline: 2px solid var(--ifm-color-primary);
31
+ outline-offset: 2px;
32
+ }
33
+
34
+ /* Dark mode adjustments */
35
+ html[data-theme='dark'] .toggleButton {
36
+ color: var(--ifm-navbar-link-color);
37
+ }
38
+
39
+ html[data-theme='dark'] .toggleButton:hover {
40
+ background-color: var(--ifm-color-emphasis-300);
41
+ }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * TaskExample Component
3
+ * Interactive collapsible task example with optional hint and solution sections
4
+ * Similar to Task component but:
5
+ * - Uses "Example N" numbering instead of "Task N"
6
+ * - Does NOT persist completion state to localStorage
7
+ * - Animations work but state is not saved
8
+ * - Not included in task registry (no progress tracking)
9
+ */
10
+ import { type ReactNode, type ReactElement } from 'react';
11
+ export interface TaskExampleProps {
12
+ name: string;
13
+ children?: ReactNode;
14
+ }
15
+ export default function TaskExample({ name, children }: TaskExampleProps): ReactElement;
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/theme/TaskExample/index.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAc,EAAE,KAAK,SAAS,EAAY,KAAK,YAAY,EAAqB,MAAM,OAAO,CAAC;AAM9F,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,gBAAgB,GAAG,YAAY,CAsTtF"}