@portosaur/theme 0.2.0 → 0.4.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.
- package/package.json +4 -2
- package/theme/DocCategoryGeneratedIndexPage/index.jsx +1 -1
- package/theme/MDXComponents.jsx +2 -1
- package/theme/components/Indent/index.jsx +10 -0
- package/theme/components/{NoteIndex → NoteCards}/index.jsx +10 -16
- package/theme/components/ScrollToTop/index.jsx +93 -0
- package/theme/components/ScrollToTop/styles.module.css +97 -0
- package/theme/components/Tooltip/index.jsx +59 -6
- package/theme/components/Tooltip/styles.module.css +13 -3
- package/theme/components/TopicList/index.jsx +31 -0
- package/theme/css/animations.css +61 -0
- package/theme/css/custom.css +16 -253
- package/theme/css/overrides/base.css +37 -0
- package/theme/css/overrides/footer.css +14 -0
- package/theme/css/overrides/markdown.css +62 -0
- package/theme/css/overrides/navbar.css +37 -0
- package/theme/css/overrides/pagination.css +64 -0
- package/theme/css/overrides/search.css +28 -0
- package/theme/css/{catppuccin.css → overrides/variables.css} +1 -1
- package/theme/pages/index.jsx +2 -0
- package/theme/pages/notes.jsx +3 -2
- package/theme/pages/tasks.jsx +135 -63
- package/theme/css/bootstrap.css +0 -5
- /package/theme/components/{NoteIndex → NoteCards}/styles.module.css +0 -0
- /package/theme/css/{tasks.css → tasks.module.css} +0 -0
package/theme/pages/tasks.jsx
CHANGED
|
@@ -2,7 +2,8 @@ import { useState } from "react";
|
|
|
2
2
|
import Layout from "@theme/Layout";
|
|
3
3
|
import Head from "@docusaurus/Head";
|
|
4
4
|
import useDocusaurusContext from "@docusaurus/useDocusaurusContext";
|
|
5
|
-
import "../css/tasks.css";
|
|
5
|
+
import styles from "../css/tasks.module.css";
|
|
6
|
+
import clsx from "clsx";
|
|
6
7
|
import {
|
|
7
8
|
FaClipboardList,
|
|
8
9
|
FaSyncAlt,
|
|
@@ -20,8 +21,8 @@ import {
|
|
|
20
21
|
function TaskList({ filterStatus, taskList }) {
|
|
21
22
|
if (!taskList || !Array.isArray(taskList)) {
|
|
22
23
|
return (
|
|
23
|
-
<div className="task-empty-state">
|
|
24
|
-
<FaTasks className="task-empty-icon" />
|
|
24
|
+
<div className={styles["task-empty-state"]}>
|
|
25
|
+
<FaTasks className={styles["task-empty-icon"]} />
|
|
25
26
|
<p>No tasks available</p>
|
|
26
27
|
</div>
|
|
27
28
|
);
|
|
@@ -33,8 +34,8 @@ function TaskList({ filterStatus, taskList }) {
|
|
|
33
34
|
|
|
34
35
|
if (filteredTasks.length === 0) {
|
|
35
36
|
return (
|
|
36
|
-
<div className="task-empty-state">
|
|
37
|
-
<FaTasks className="task-empty-icon" />
|
|
37
|
+
<div className={styles["task-empty-state"]}>
|
|
38
|
+
<FaTasks className={styles["task-empty-icon"]} />
|
|
38
39
|
<p>No tasks in this category</p>
|
|
39
40
|
</div>
|
|
40
41
|
);
|
|
@@ -49,67 +50,111 @@ function TaskList({ filterStatus, taskList }) {
|
|
|
49
50
|
});
|
|
50
51
|
|
|
51
52
|
return (
|
|
52
|
-
<div className="task-list-container">
|
|
53
|
-
<div className="task-list-table">
|
|
53
|
+
<div className={styles["task-list-container"]}>
|
|
54
|
+
<div className={styles["task-list-table"]}>
|
|
54
55
|
{/* Table header */}
|
|
55
|
-
<div className="task-list-header">
|
|
56
|
-
<div
|
|
57
|
-
|
|
58
|
-
|
|
56
|
+
<div className={styles["task-list-header"]}>
|
|
57
|
+
<div
|
|
58
|
+
className={clsx(styles["task-cell"], styles["task-cell-status"])}
|
|
59
|
+
>
|
|
60
|
+
Status
|
|
61
|
+
</div>
|
|
62
|
+
<div className={clsx(styles["task-cell"], styles["task-cell-title"])}>
|
|
63
|
+
Task Details
|
|
64
|
+
</div>
|
|
65
|
+
<div
|
|
66
|
+
className={clsx(styles["task-cell"], styles["task-cell-priority"])}
|
|
67
|
+
>
|
|
68
|
+
Priority
|
|
69
|
+
</div>
|
|
59
70
|
</div>
|
|
60
71
|
|
|
61
72
|
{/* Task rows */}
|
|
62
|
-
<div className="task-rows">
|
|
73
|
+
<div className={styles["task-rows"]}>
|
|
63
74
|
{sortedTasks.map((task, index) => (
|
|
64
75
|
<div
|
|
65
76
|
key={index}
|
|
66
|
-
className={
|
|
77
|
+
className={clsx(
|
|
78
|
+
styles["task-row"],
|
|
79
|
+
task.status === "completed"
|
|
80
|
+
? "task-row-completed"
|
|
81
|
+
: "" && styles["task-row-completed"],
|
|
82
|
+
index % 2 === 1
|
|
83
|
+
? "task-row-striped"
|
|
84
|
+
: "" && styles["task-row-striped"],
|
|
85
|
+
)}
|
|
67
86
|
>
|
|
68
87
|
{/* Status cell */}
|
|
69
|
-
<div
|
|
70
|
-
|
|
88
|
+
<div
|
|
89
|
+
className={clsx(
|
|
90
|
+
styles["task-cell"],
|
|
91
|
+
styles["task-cell-status"],
|
|
92
|
+
)}
|
|
93
|
+
>
|
|
94
|
+
<span
|
|
95
|
+
className={clsx(
|
|
96
|
+
styles["badge"],
|
|
97
|
+
styles[`badge-status-${task.status}`],
|
|
98
|
+
)}
|
|
99
|
+
>
|
|
71
100
|
{task.status === "completed" && (
|
|
72
101
|
<>
|
|
73
|
-
<FaCheckCircle className="badge-icon" /> Done
|
|
102
|
+
<FaCheckCircle className={styles["badge-icon"]} /> Done
|
|
74
103
|
</>
|
|
75
104
|
)}
|
|
76
105
|
{task.status === "active" && (
|
|
77
106
|
<>
|
|
78
|
-
<FaSyncAlt
|
|
107
|
+
<FaSyncAlt
|
|
108
|
+
className={clsx(styles["badge-icon"], styles["spin"])}
|
|
109
|
+
/>{" "}
|
|
110
|
+
In Progress
|
|
79
111
|
</>
|
|
80
112
|
)}
|
|
81
113
|
{task.status === "pending" && (
|
|
82
114
|
<>
|
|
83
|
-
<FaClock className="badge-icon" /> Planned
|
|
115
|
+
<FaClock className={styles["badge-icon"]} /> Planned
|
|
84
116
|
</>
|
|
85
117
|
)}
|
|
86
118
|
</span>
|
|
87
119
|
</div>
|
|
88
120
|
|
|
89
121
|
{/* Title cell */}
|
|
90
|
-
<div
|
|
91
|
-
|
|
122
|
+
<div
|
|
123
|
+
className={clsx(styles["task-cell"], styles["task-cell-title"])}
|
|
124
|
+
>
|
|
125
|
+
<div className={styles["task-title"]}>{task.title}</div>
|
|
92
126
|
{task.desc && (
|
|
93
|
-
<div className="task-description">{task.desc}</div>
|
|
127
|
+
<div className={styles["task-description"]}>{task.desc}</div>
|
|
94
128
|
)}
|
|
95
129
|
</div>
|
|
96
130
|
|
|
97
131
|
{/* Priority cell */}
|
|
98
|
-
<div
|
|
99
|
-
|
|
132
|
+
<div
|
|
133
|
+
className={clsx(
|
|
134
|
+
styles["task-cell"],
|
|
135
|
+
styles["task-cell-priority"],
|
|
136
|
+
)}
|
|
137
|
+
>
|
|
138
|
+
<span
|
|
139
|
+
className={clsx(
|
|
140
|
+
styles["badge"],
|
|
141
|
+
styles[`badge-priority-${task.priority}`],
|
|
142
|
+
)}
|
|
143
|
+
>
|
|
100
144
|
{task.priority === "high" && (
|
|
101
145
|
<>
|
|
102
|
-
<FaFire className="badge-icon" /> High
|
|
146
|
+
<FaFire className={styles["badge-icon"]} /> High
|
|
103
147
|
</>
|
|
104
148
|
)}
|
|
105
149
|
{task.priority === "medium" && (
|
|
106
150
|
<>
|
|
107
|
-
<FaThermometerHalf className="badge-icon" />
|
|
151
|
+
<FaThermometerHalf className={styles["badge-icon"]} />{" "}
|
|
152
|
+
Medium
|
|
108
153
|
</>
|
|
109
154
|
)}
|
|
110
155
|
{task.priority === "low" && (
|
|
111
156
|
<>
|
|
112
|
-
<FaSnowflake className="badge-icon" /> Low
|
|
157
|
+
<FaSnowflake className={styles["badge-icon"]} /> Low
|
|
113
158
|
</>
|
|
114
159
|
)}
|
|
115
160
|
</span>
|
|
@@ -138,29 +183,41 @@ function TaskStats({ taskList }) {
|
|
|
138
183
|
const percentComplete = total > 0 ? Math.round((completed / total) * 100) : 0;
|
|
139
184
|
|
|
140
185
|
return (
|
|
141
|
-
<div className="stats-container">
|
|
142
|
-
<div className="stat-box">
|
|
143
|
-
<div className="stat-label">Total Tasks</div>
|
|
144
|
-
<div className="stat-value">{total}</div>
|
|
186
|
+
<div className={styles["stats-container"]}>
|
|
187
|
+
<div className={styles["stat-box"]}>
|
|
188
|
+
<div className={styles["stat-label"]}>Total Tasks</div>
|
|
189
|
+
<div className={styles["stat-value"]}>{total}</div>
|
|
145
190
|
</div>
|
|
146
|
-
<div className="stat-box">
|
|
147
|
-
<div className="stat-label">Completed</div>
|
|
148
|
-
<div
|
|
191
|
+
<div className={styles["stat-box"]}>
|
|
192
|
+
<div className={styles["stat-label"]}>Completed</div>
|
|
193
|
+
<div
|
|
194
|
+
className={clsx(styles["stat-value"], styles["stat-value-completed"])}
|
|
195
|
+
>
|
|
196
|
+
{completed}
|
|
197
|
+
</div>
|
|
149
198
|
</div>
|
|
150
|
-
<div className="stat-box">
|
|
151
|
-
<div className="stat-label">In Progress</div>
|
|
152
|
-
<div
|
|
199
|
+
<div className={styles["stat-box"]}>
|
|
200
|
+
<div className={styles["stat-label"]}>In Progress</div>
|
|
201
|
+
<div
|
|
202
|
+
className={clsx(styles["stat-value"], styles["stat-value-active"])}
|
|
203
|
+
>
|
|
204
|
+
{active}
|
|
205
|
+
</div>
|
|
153
206
|
</div>
|
|
154
|
-
<div className="stat-box">
|
|
155
|
-
<div className="stat-label">Planned</div>
|
|
156
|
-
<div
|
|
207
|
+
<div className={styles["stat-box"]}>
|
|
208
|
+
<div className={styles["stat-label"]}>Planned</div>
|
|
209
|
+
<div
|
|
210
|
+
className={clsx(styles["stat-value"], styles["stat-value-pending"])}
|
|
211
|
+
>
|
|
212
|
+
{pending}
|
|
213
|
+
</div>
|
|
157
214
|
</div>
|
|
158
|
-
<div className="stat-box">
|
|
159
|
-
<div className="stat-label">Progress</div>
|
|
160
|
-
<div className="stat-value">{percentComplete}%</div>
|
|
161
|
-
<div className="progress-bar-container">
|
|
215
|
+
<div className={styles["stat-box"]}>
|
|
216
|
+
<div className={styles["stat-label"]}>Progress</div>
|
|
217
|
+
<div className={styles["stat-value"]}>{percentComplete}%</div>
|
|
218
|
+
<div className={styles["progress-bar-container"]}>
|
|
162
219
|
<div
|
|
163
|
-
className="progress-bar"
|
|
220
|
+
className={styles["progress-bar"]}
|
|
164
221
|
style={{ width: `${percentComplete}%` }}
|
|
165
222
|
/>
|
|
166
223
|
</div>
|
|
@@ -188,7 +245,7 @@ function TaskTabs({ taskList }) {
|
|
|
188
245
|
{
|
|
189
246
|
id: "active",
|
|
190
247
|
label: "In Progress",
|
|
191
|
-
icon: <FaSyncAlt className="spin" />,
|
|
248
|
+
icon: <FaSyncAlt className={styles["spin"]} />,
|
|
192
249
|
count: taskList.filter((t) => t.status === "active").length,
|
|
193
250
|
},
|
|
194
251
|
{
|
|
@@ -206,29 +263,40 @@ function TaskTabs({ taskList }) {
|
|
|
206
263
|
];
|
|
207
264
|
|
|
208
265
|
return (
|
|
209
|
-
<div className="task-tabs-container">
|
|
210
|
-
<div
|
|
266
|
+
<div className={styles["task-tabs-container"]}>
|
|
267
|
+
<div
|
|
268
|
+
className={styles["task-tabs"]}
|
|
269
|
+
role="tablist"
|
|
270
|
+
aria-label="Task categories"
|
|
271
|
+
>
|
|
211
272
|
{tabData.map((tab) => (
|
|
212
273
|
<button
|
|
213
274
|
key={tab.id}
|
|
214
|
-
className={
|
|
275
|
+
className={clsx(
|
|
276
|
+
styles["task-tab"],
|
|
277
|
+
activeTab === tab.id
|
|
278
|
+
? "task-tab-active"
|
|
279
|
+
: ""
|
|
280
|
+
? styles["task-tab-active"]
|
|
281
|
+
: "",
|
|
282
|
+
)}
|
|
215
283
|
onClick={() => setActiveTab(tab.id)}
|
|
216
284
|
role="tab"
|
|
217
285
|
aria-selected={activeTab === tab.id}
|
|
218
286
|
aria-controls={`tab-content-${tab.id}`}
|
|
219
287
|
id={`tab-${tab.id}`}
|
|
220
288
|
>
|
|
221
|
-
<span className="task-tab-icon" aria-hidden="true">
|
|
289
|
+
<span className={styles["task-tab-icon"]} aria-hidden="true">
|
|
222
290
|
{tab.icon}
|
|
223
291
|
</span>
|
|
224
|
-
<span className="task-tab-label">{tab.label}</span>
|
|
225
|
-
<span className="task-tab-count">{tab.count}</span>
|
|
292
|
+
<span className={styles["task-tab-label"]}>{tab.label}</span>
|
|
293
|
+
<span className={styles["task-tab-count"]}>{tab.count}</span>
|
|
226
294
|
</button>
|
|
227
295
|
))}
|
|
228
296
|
</div>
|
|
229
297
|
|
|
230
298
|
<div
|
|
231
|
-
className="task-tab-content"
|
|
299
|
+
className={styles["task-tab-content"]}
|
|
232
300
|
role="tabpanel"
|
|
233
301
|
id={`tab-content-${activeTab}`}
|
|
234
302
|
aria-labelledby={`tab-${activeTab}`}
|
|
@@ -261,14 +329,16 @@ export default function TasksPage() {
|
|
|
261
329
|
title="Tasks are Disabled"
|
|
262
330
|
description="Tasks are currently disabled"
|
|
263
331
|
>
|
|
264
|
-
<div className="tasks-container">
|
|
265
|
-
<div className="tasks-content">
|
|
266
|
-
<div className="tasks-disabled-notice">
|
|
267
|
-
<div className="disabled-icon">
|
|
332
|
+
<div className={styles["tasks-container"]}>
|
|
333
|
+
<div className={styles["tasks-content"]}>
|
|
334
|
+
<div className={styles["tasks-disabled-notice"]}>
|
|
335
|
+
<div className={styles["disabled-icon"]}>
|
|
268
336
|
<FaExclamationTriangle aria-hidden="true" />
|
|
269
337
|
</div>
|
|
270
|
-
<h2 className="disabled-title">
|
|
271
|
-
|
|
338
|
+
<h2 className={styles["disabled-title"]}>
|
|
339
|
+
Tasks are currently disabled
|
|
340
|
+
</h2>
|
|
341
|
+
<p className={styles["disabled-help"]}>
|
|
272
342
|
To enable tasks, set <code>tasks.enable</code> to{" "}
|
|
273
343
|
<code>true</code>
|
|
274
344
|
</p>
|
|
@@ -291,12 +361,14 @@ export default function TasksPage() {
|
|
|
291
361
|
<meta name="twitter:title" content={heading} />
|
|
292
362
|
<meta name="twitter:description" content={subheading} />
|
|
293
363
|
</Head>
|
|
294
|
-
<div className="tasks-container">
|
|
295
|
-
<div className="tasks-header">
|
|
296
|
-
<h1 className="tasks-heading">{heading}</h1>
|
|
297
|
-
{subheading &&
|
|
364
|
+
<div className={styles["tasks-container"]}>
|
|
365
|
+
<div className={styles["tasks-header"]}>
|
|
366
|
+
<h1 className={styles["tasks-heading"]}>{heading}</h1>
|
|
367
|
+
{subheading && (
|
|
368
|
+
<p className={styles["tasks-subheading"]}>{subheading}</p>
|
|
369
|
+
)}
|
|
298
370
|
</div>
|
|
299
|
-
<div className="tasks-content">
|
|
371
|
+
<div className={styles["tasks-content"]}>
|
|
300
372
|
<TaskStats taskList={taskList} />
|
|
301
373
|
<TaskTabs taskList={taskList} />
|
|
302
374
|
</div>
|
package/theme/css/bootstrap.css
DELETED
|
File without changes
|
|
File without changes
|