@learnpack/learnpack 5.0.98 → 5.0.106
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 +13 -13
- package/lib/commands/serve.js +81 -7
- package/lib/creatorDist/assets/{index-ldEC0yWM.css → index-Cvdi97GX.css} +119 -6
- package/lib/creatorDist/assets/{index-DayC-cyC.js → index-Sn-039yT.js} +45271 -37550
- package/lib/creatorDist/index.html +2 -2
- package/oclif.manifest.json +1 -1
- package/package.json +6 -2
- package/src/commands/serve.ts +126 -29
- package/src/creator/package-lock.json +60 -0
- package/src/creator/package.json +2 -0
- package/src/creator/src/App.tsx +32 -45
- package/src/creator/src/assets/svgs.tsx +14 -0
- package/src/creator/src/components/LinkUploader.tsx +109 -0
- package/src/creator/src/components/PreviewGenerator.tsx +95 -0
- package/src/creator/src/components/Source.tsx +68 -0
- package/src/creator/src/components/syllabus/Sidebar.tsx +35 -10
- package/src/creator/src/components/syllabus/SyllabusEditor.tsx +17 -7
- package/src/creator/src/index.css +4 -0
- package/src/creator/src/main.tsx +2 -0
- package/src/creator/src/utils/creatorUtils.ts +1 -0
- package/src/creator/src/utils/store.ts +4 -1
- package/src/creatorDist/assets/{index-ldEC0yWM.css → index-Cvdi97GX.css} +119 -6
- package/src/creatorDist/assets/{index-DayC-cyC.js → index-Sn-039yT.js} +45271 -37550
- package/src/creatorDist/index.html +2 -2
- package/src/utils/convertCreds.js +4 -0
- package/src/utils/creds.json +0 -13
package/README.md
CHANGED
@@ -21,7 +21,7 @@ $ npm install -g @learnpack/learnpack
|
|
21
21
|
$ learnpack COMMAND
|
22
22
|
running command...
|
23
23
|
$ learnpack (-v|--version|version)
|
24
|
-
@learnpack/learnpack/5.0.
|
24
|
+
@learnpack/learnpack/5.0.106 win32-x64 node-v22.15.0
|
25
25
|
$ learnpack --help [COMMAND]
|
26
26
|
USAGE
|
27
27
|
$ learnpack COMMAND
|
@@ -80,7 +80,7 @@ DESCRIPTION
|
|
80
80
|
12. If there is a file within the exercises folder but not inside of any particular exercise's folder. (Warning)
|
81
81
|
```
|
82
82
|
|
83
|
-
_See code: [src\commands\audit.ts](https://github.com/learnpack/learnpack-cli/blob/v5.0.
|
83
|
+
_See code: [src\commands\audit.ts](https://github.com/learnpack/learnpack-cli/blob/v5.0.106/src\commands\audit.ts)_
|
84
84
|
|
85
85
|
## `learnpack breakToken`
|
86
86
|
|
@@ -95,7 +95,7 @@ OPTIONS
|
|
95
95
|
-y, --yes Skip all prompts and initialize an empty project
|
96
96
|
```
|
97
97
|
|
98
|
-
_See code: [src\commands\breakToken.ts](https://github.com/learnpack/learnpack-cli/blob/v5.0.
|
98
|
+
_See code: [src\commands\breakToken.ts](https://github.com/learnpack/learnpack-cli/blob/v5.0.106/src\commands\breakToken.ts)_
|
99
99
|
|
100
100
|
## `learnpack clean`
|
101
101
|
|
@@ -110,7 +110,7 @@ DESCRIPTION
|
|
110
110
|
Extra documentation goes here
|
111
111
|
```
|
112
112
|
|
113
|
-
_See code: [src\commands\clean.ts](https://github.com/learnpack/learnpack-cli/blob/v5.0.
|
113
|
+
_See code: [src\commands\clean.ts](https://github.com/learnpack/learnpack-cli/blob/v5.0.106/src\commands\clean.ts)_
|
114
114
|
|
115
115
|
## `learnpack download [PACKAGE]`
|
116
116
|
|
@@ -128,7 +128,7 @@ DESCRIPTION
|
|
128
128
|
Extra documentation goes here
|
129
129
|
```
|
130
130
|
|
131
|
-
_See code: [src\commands\download.ts](https://github.com/learnpack/learnpack-cli/blob/v5.0.
|
131
|
+
_See code: [src\commands\download.ts](https://github.com/learnpack/learnpack-cli/blob/v5.0.106/src\commands\download.ts)_
|
132
132
|
|
133
133
|
## `learnpack help [COMMAND]`
|
134
134
|
|
@@ -160,7 +160,7 @@ OPTIONS
|
|
160
160
|
-y, --yes Skip all prompts and initialize an empty project
|
161
161
|
```
|
162
162
|
|
163
|
-
_See code: [src\commands\init.ts](https://github.com/learnpack/learnpack-cli/blob/v5.0.
|
163
|
+
_See code: [src\commands\init.ts](https://github.com/learnpack/learnpack-cli/blob/v5.0.106/src\commands\init.ts)_
|
164
164
|
|
165
165
|
## `learnpack login [PACKAGE]`
|
166
166
|
|
@@ -178,7 +178,7 @@ DESCRIPTION
|
|
178
178
|
Extra documentation goes here
|
179
179
|
```
|
180
180
|
|
181
|
-
_See code: [src\commands\login.ts](https://github.com/learnpack/learnpack-cli/blob/v5.0.
|
181
|
+
_See code: [src\commands\login.ts](https://github.com/learnpack/learnpack-cli/blob/v5.0.106/src\commands\login.ts)_
|
182
182
|
|
183
183
|
## `learnpack logout [PACKAGE]`
|
184
184
|
|
@@ -196,7 +196,7 @@ DESCRIPTION
|
|
196
196
|
Extra documentation goes here
|
197
197
|
```
|
198
198
|
|
199
|
-
_See code: [src\commands\logout.ts](https://github.com/learnpack/learnpack-cli/blob/v5.0.
|
199
|
+
_See code: [src\commands\logout.ts](https://github.com/learnpack/learnpack-cli/blob/v5.0.106/src\commands\logout.ts)_
|
200
200
|
|
201
201
|
## `learnpack plugins`
|
202
202
|
|
@@ -328,7 +328,7 @@ OPTIONS
|
|
328
328
|
-s, --strict strict mode
|
329
329
|
```
|
330
330
|
|
331
|
-
_See code: [src\commands\publish.ts](https://github.com/learnpack/learnpack-cli/blob/v5.0.
|
331
|
+
_See code: [src\commands\publish.ts](https://github.com/learnpack/learnpack-cli/blob/v5.0.106/src\commands\publish.ts)_
|
332
332
|
|
333
333
|
## `learnpack serve`
|
334
334
|
|
@@ -345,7 +345,7 @@ OPTIONS
|
|
345
345
|
-y, --yes Skip all prompts and initialize an empty project
|
346
346
|
```
|
347
347
|
|
348
|
-
_See code: [src\commands\serve.ts](https://github.com/learnpack/learnpack-cli/blob/v5.0.
|
348
|
+
_See code: [src\commands\serve.ts](https://github.com/learnpack/learnpack-cli/blob/v5.0.106/src\commands\serve.ts)_
|
349
349
|
|
350
350
|
## `learnpack start`
|
351
351
|
|
@@ -367,7 +367,7 @@ OPTIONS
|
|
367
367
|
-y, --yes Skip all prompts and initialize an empty project
|
368
368
|
```
|
369
369
|
|
370
|
-
_See code: [src\commands\start.ts](https://github.com/learnpack/learnpack-cli/blob/v5.0.
|
370
|
+
_See code: [src\commands\start.ts](https://github.com/learnpack/learnpack-cli/blob/v5.0.106/src\commands\start.ts)_
|
371
371
|
|
372
372
|
## `learnpack test [EXERCISESLUG]`
|
373
373
|
|
@@ -384,7 +384,7 @@ OPTIONS
|
|
384
384
|
-y, --yes Skip all prompts and initialize an empty project
|
385
385
|
```
|
386
386
|
|
387
|
-
_See code: [src\commands\test.ts](https://github.com/learnpack/learnpack-cli/blob/v5.0.
|
387
|
+
_See code: [src\commands\test.ts](https://github.com/learnpack/learnpack-cli/blob/v5.0.106/src\commands\test.ts)_
|
388
388
|
|
389
389
|
## `learnpack translate`
|
390
390
|
|
@@ -398,7 +398,7 @@ OPTIONS
|
|
398
398
|
-y, --yes Skip all prompts and initialize an empty project
|
399
399
|
```
|
400
400
|
|
401
|
-
_See code: [src\commands\translate.ts](https://github.com/learnpack/learnpack-cli/blob/v5.0.
|
401
|
+
_See code: [src\commands\translate.ts](https://github.com/learnpack/learnpack-cli/blob/v5.0.106/src\commands\translate.ts)_
|
402
402
|
<!-- commandsstop -->
|
403
403
|
|
404
404
|
> > > > > > > 0cb3e56d84c197f9d008836bb573eade212b7e57
|
package/lib/commands/serve.js
CHANGED
@@ -1,12 +1,15 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
3
|
const command_1 = require("@oclif/command");
|
4
|
+
// import * as ytdl from "ytdl-core"
|
5
|
+
const youtube_transcript_1 = require("youtube-transcript");
|
4
6
|
const express = require("express");
|
5
7
|
const cors = require("cors");
|
6
8
|
const path = require("path");
|
7
9
|
const os = require("os");
|
8
10
|
const archiver = require("archiver");
|
9
11
|
const mkdirp = require("mkdirp");
|
12
|
+
const html_to_text_1 = require("html-to-text");
|
10
13
|
const rimraf = require("rimraf");
|
11
14
|
const SessionCommand_1 = require("../utils/SessionCommand");
|
12
15
|
const storage_1 = require("@google-cloud/storage");
|
@@ -22,6 +25,22 @@ const misc_1 = require("../utils/misc");
|
|
22
25
|
const configBuilder_1 = require("../utils/configBuilder");
|
23
26
|
dotenv.config();
|
24
27
|
const frontMatter = require("front-matter");
|
28
|
+
const fixPreviewUrl = (slug, previewUrl) => {
|
29
|
+
if (!previewUrl) {
|
30
|
+
return null;
|
31
|
+
}
|
32
|
+
if (previewUrl.startsWith("http")) {
|
33
|
+
return previewUrl;
|
34
|
+
}
|
35
|
+
const expectedUrl = `https://${slug}.learn-pack.com/preview.png`;
|
36
|
+
console.log("EXPECTED URL", expectedUrl);
|
37
|
+
return expectedUrl;
|
38
|
+
};
|
39
|
+
const getTitleFromHTML = (html) => {
|
40
|
+
const titleRegex = /<title>(.*?)<\/title>/;
|
41
|
+
const titleMatch = html.match(titleRegex);
|
42
|
+
return titleMatch ? titleMatch[1] : null;
|
43
|
+
};
|
25
44
|
class ServeCommand extends SessionCommand_1.default {
|
26
45
|
async init() {
|
27
46
|
const { flags } = this.parse(ServeCommand);
|
@@ -86,7 +105,7 @@ class ServeCommand extends SessionCommand_1.default {
|
|
86
105
|
});
|
87
106
|
stream.end(buffer);
|
88
107
|
});
|
89
|
-
app.post("/upload-image", express.json(), async (req, res) => {
|
108
|
+
app.post("/upload-image", express.json({ limit: "20mb" }), async (req, res) => {
|
90
109
|
const { image_url, destination } = req.body;
|
91
110
|
if (!image_url || !destination) {
|
92
111
|
return res
|
@@ -96,9 +115,9 @@ class ServeCommand extends SessionCommand_1.default {
|
|
96
115
|
try {
|
97
116
|
const response = await fetch(image_url);
|
98
117
|
if (!response.ok) {
|
99
|
-
return res
|
100
|
-
.
|
101
|
-
|
118
|
+
return res.status(400).json({
|
119
|
+
error: `Failed to download image: ${response.statusText}`,
|
120
|
+
});
|
102
121
|
}
|
103
122
|
const contentType = response.headers.get("content-type") || "application/octet-stream";
|
104
123
|
const buffer = await response.arrayBuffer();
|
@@ -309,7 +328,6 @@ class ServeCommand extends SessionCommand_1.default {
|
|
309
328
|
});
|
310
329
|
app.post("/actions/publish/:slug", async (req, res) => {
|
311
330
|
try {
|
312
|
-
// 1) Extraer token y body
|
313
331
|
const { slug } = req.params;
|
314
332
|
const rigoToken = req.header("x-rigo-token");
|
315
333
|
const bcToken = req.header("x-breathecode-token");
|
@@ -349,12 +367,11 @@ class ServeCommand extends SessionCommand_1.default {
|
|
349
367
|
.replace(/{{title}}/g, config.title.us)
|
350
368
|
.replace(/<title>.*<\/title>/, `<title>${config.title.us}</title>`)
|
351
369
|
.replace(/{{description}}/g, config.description.us)
|
352
|
-
.replace(/{{preview}}/g, config.preview ||
|
370
|
+
.replace(/{{preview}}/g, fixPreviewUrl(slug, config.preview) ||
|
353
371
|
"https://raw.githubusercontent.com/learnpack/ide/master/public/learnpack.svg")
|
354
372
|
.replace(/{{slug}}/g, slug)
|
355
373
|
.replace(/{{duration}}/g, (0, misc_1.minutesToISO8601Duration)(config.duration));
|
356
374
|
fs.writeFileSync(path.join(buildRoot, "index.html"), idxHtml);
|
357
|
-
// 6) Inyectar placeholders en manifest.webmanifest
|
358
375
|
const mfTpl = fs.readFileSync(path.join(uiSrc, "manifest.webmanifest"), "utf-8");
|
359
376
|
const mf = mfTpl
|
360
377
|
.replace(/{{course_title}}/g, config.title.us)
|
@@ -410,6 +427,45 @@ class ServeCommand extends SessionCommand_1.default {
|
|
410
427
|
return res.status(500).json({ error: error.message });
|
411
428
|
}
|
412
429
|
});
|
430
|
+
const YT_REGEX = /(?:youtube\.com\/watch\?v=|youtu\.be\/)([\w-]{11})/;
|
431
|
+
app.get("/actions/fetch/:link", async (req, res) => {
|
432
|
+
const { link } = req.params;
|
433
|
+
try {
|
434
|
+
// 1) Decode the URL
|
435
|
+
const decoded = Buffer.from(link, "base64url").toString("utf-8");
|
436
|
+
const ytMatch = decoded.match(YT_REGEX);
|
437
|
+
if (ytMatch) {
|
438
|
+
const videoId = ytMatch[1];
|
439
|
+
// fetch metadata
|
440
|
+
const items = await youtube_transcript_1.YoutubeTranscript.fetchTranscript(videoId);
|
441
|
+
const transcript = items.map(i => i.text).join(" ");
|
442
|
+
const { data: meta } = await axios_1.default.get("https://www.youtube.com/oembed", {
|
443
|
+
params: { url: decoded, format: "json" },
|
444
|
+
});
|
445
|
+
return res.json({
|
446
|
+
url: decoded,
|
447
|
+
title: meta.title,
|
448
|
+
author: meta.author_name,
|
449
|
+
thumbnail: meta.thumbnail_url,
|
450
|
+
transcript,
|
451
|
+
});
|
452
|
+
}
|
453
|
+
const response = await axios_1.default.get(decoded, { responseType: "text" });
|
454
|
+
const html = response.data;
|
455
|
+
const title = getTitleFromHTML(html);
|
456
|
+
console.log("TITLE", title);
|
457
|
+
const text = (0, html_to_text_1.convert)(html);
|
458
|
+
return res.json({
|
459
|
+
url: decoded,
|
460
|
+
text,
|
461
|
+
title,
|
462
|
+
});
|
463
|
+
}
|
464
|
+
catch (error) {
|
465
|
+
console.error("❌ /actions/fetch error:", error.message || error);
|
466
|
+
res.status(500).json({ error: error.message || "Failed to fetch link" });
|
467
|
+
}
|
468
|
+
});
|
413
469
|
app.delete("/packages/:slug", async (req, res) => {
|
414
470
|
console.log("DELETE /packages/:slug");
|
415
471
|
const { slug } = req.params;
|
@@ -438,6 +494,24 @@ class ServeCommand extends SessionCommand_1.default {
|
|
438
494
|
return res.status(500).json({ error: "Failed to delete the package" });
|
439
495
|
}
|
440
496
|
});
|
497
|
+
app.get("/proxy", async (req, res) => {
|
498
|
+
const { url } = req.query;
|
499
|
+
if (!url) {
|
500
|
+
return res.status(400).json({ error: "URL is required" });
|
501
|
+
}
|
502
|
+
try {
|
503
|
+
const decodedUrl = Buffer.from(url, "base64url").toString("utf-8");
|
504
|
+
const response = await axios_1.default.get(decodedUrl, {
|
505
|
+
responseType: "arraybuffer",
|
506
|
+
});
|
507
|
+
res.set(response.headers);
|
508
|
+
res.status(response.status).send(response.data);
|
509
|
+
}
|
510
|
+
catch (error) {
|
511
|
+
console.error("Error in /proxy:", error);
|
512
|
+
res.status(500).json({ error: "Failed to fetch the resource" });
|
513
|
+
}
|
514
|
+
});
|
441
515
|
app.listen(PORT, () => {
|
442
516
|
console.log(`🚀 Creator UI server running at http://localhost:${PORT}/creator`);
|
443
517
|
});
|
@@ -26,6 +26,7 @@
|
|
26
26
|
--tw-gradient-from-position: 0%;
|
27
27
|
--tw-gradient-via-position: 50%;
|
28
28
|
--tw-gradient-to-position: 100%;
|
29
|
+
--tw-leading: initial;
|
29
30
|
--tw-font-weight: initial;
|
30
31
|
--tw-shadow: 0 0 #0000;
|
31
32
|
--tw-shadow-color: initial;
|
@@ -53,7 +54,9 @@
|
|
53
54
|
"Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
|
54
55
|
--font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
|
55
56
|
"Liberation Mono", "Courier New", monospace;
|
57
|
+
--color-red-50: oklch(97.1% 0.013 17.38);
|
56
58
|
--color-red-500: oklch(63.7% 0.237 25.331);
|
59
|
+
--color-red-600: oklch(57.7% 0.245 27.325);
|
57
60
|
--color-red-700: oklch(50.5% 0.213 27.518);
|
58
61
|
--color-sky-500: oklch(68.5% 0.169 237.323);
|
59
62
|
--color-sky-600: oklch(58.8% 0.158 241.966);
|
@@ -67,6 +70,7 @@
|
|
67
70
|
--color-blue-800: oklch(42.4% 0.199 265.638);
|
68
71
|
--color-blue-900: oklch(37.9% 0.146 265.522);
|
69
72
|
--color-gray-50: oklch(98.5% 0.002 247.839);
|
73
|
+
--color-gray-100: oklch(96.7% 0.003 264.542);
|
70
74
|
--color-gray-200: oklch(92.8% 0.006 264.531);
|
71
75
|
--color-gray-300: oklch(87.2% 0.01 258.338);
|
72
76
|
--color-gray-400: oklch(70.7% 0.022 261.325);
|
@@ -78,7 +82,9 @@
|
|
78
82
|
--color-black: #000;
|
79
83
|
--color-white: #fff;
|
80
84
|
--spacing: 0.25rem;
|
85
|
+
--container-xs: 20rem;
|
81
86
|
--container-sm: 24rem;
|
87
|
+
--container-md: 28rem;
|
82
88
|
--container-xl: 36rem;
|
83
89
|
--text-xs: 0.75rem;
|
84
90
|
--text-xs--line-height: calc(1 / 0.75);
|
@@ -88,6 +94,8 @@
|
|
88
94
|
--text-base--line-height: 1.5;
|
89
95
|
--text-lg: 1.125rem;
|
90
96
|
--text-lg--line-height: calc(1.75 / 1.125);
|
97
|
+
--text-2xl: 1.5rem;
|
98
|
+
--text-2xl--line-height: calc(2 / 1.5);
|
91
99
|
--text-4xl: 2.25rem;
|
92
100
|
--text-4xl--line-height: calc(2.5 / 2.25);
|
93
101
|
--font-weight-medium: 500;
|
@@ -97,6 +105,7 @@
|
|
97
105
|
--radius-lg: 0.5rem;
|
98
106
|
--radius-xl: 0.75rem;
|
99
107
|
--ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
|
108
|
+
--animate-spin: spin 1s linear infinite;
|
100
109
|
--animate-ping: ping 1s cubic-bezier(0, 0, 0.2, 1) infinite;
|
101
110
|
--animate-pulse: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
|
102
111
|
--default-transition-duration: 0.15s;
|
@@ -460,15 +469,27 @@
|
|
460
469
|
.mx-2 {
|
461
470
|
margin-inline: calc(var(--spacing) * 2);
|
462
471
|
}
|
472
|
+
.mx-auto {
|
473
|
+
margin-inline: auto;
|
474
|
+
}
|
475
|
+
.-mt-5 {
|
476
|
+
margin-top: calc(var(--spacing) * -5);
|
477
|
+
}
|
463
478
|
.mt-1 {
|
464
479
|
margin-top: calc(var(--spacing) * 1);
|
465
480
|
}
|
466
481
|
.mt-2 {
|
467
482
|
margin-top: calc(var(--spacing) * 2);
|
468
483
|
}
|
484
|
+
.mt-3 {
|
485
|
+
margin-top: calc(var(--spacing) * 3);
|
486
|
+
}
|
469
487
|
.mt-4 {
|
470
488
|
margin-top: calc(var(--spacing) * 4);
|
471
489
|
}
|
490
|
+
.mt-5 {
|
491
|
+
margin-top: calc(var(--spacing) * 5);
|
492
|
+
}
|
472
493
|
.mt-6 {
|
473
494
|
margin-top: calc(var(--spacing) * 6);
|
474
495
|
}
|
@@ -487,6 +508,9 @@
|
|
487
508
|
.mb-6 {
|
488
509
|
margin-bottom: calc(var(--spacing) * 6);
|
489
510
|
}
|
511
|
+
.ml-auto {
|
512
|
+
margin-left: auto;
|
513
|
+
}
|
490
514
|
.block {
|
491
515
|
display: block;
|
492
516
|
}
|
@@ -505,9 +529,18 @@
|
|
505
529
|
.h-2 {
|
506
530
|
height: calc(var(--spacing) * 2);
|
507
531
|
}
|
532
|
+
.h-5 {
|
533
|
+
height: calc(var(--spacing) * 5);
|
534
|
+
}
|
508
535
|
.h-6 {
|
509
536
|
height: calc(var(--spacing) * 6);
|
510
537
|
}
|
538
|
+
.h-10 {
|
539
|
+
height: calc(var(--spacing) * 10);
|
540
|
+
}
|
541
|
+
.h-12 {
|
542
|
+
height: calc(var(--spacing) * 12);
|
543
|
+
}
|
511
544
|
.h-15 {
|
512
545
|
height: calc(var(--spacing) * 15);
|
513
546
|
}
|
@@ -550,9 +583,18 @@
|
|
550
583
|
.w-4\/5 {
|
551
584
|
width: 80%;
|
552
585
|
}
|
586
|
+
.w-5 {
|
587
|
+
width: calc(var(--spacing) * 5);
|
588
|
+
}
|
553
589
|
.w-6 {
|
554
590
|
width: calc(var(--spacing) * 6);
|
555
591
|
}
|
592
|
+
.w-10 {
|
593
|
+
width: calc(var(--spacing) * 10);
|
594
|
+
}
|
595
|
+
.w-12 {
|
596
|
+
width: calc(var(--spacing) * 12);
|
597
|
+
}
|
556
598
|
.w-15 {
|
557
599
|
width: calc(var(--spacing) * 15);
|
558
600
|
}
|
@@ -568,12 +610,18 @@
|
|
568
610
|
.max-w-\[700px\] {
|
569
611
|
max-width: 700px;
|
570
612
|
}
|
613
|
+
.max-w-md {
|
614
|
+
max-width: var(--container-md);
|
615
|
+
}
|
571
616
|
.max-w-sm {
|
572
617
|
max-width: var(--container-sm);
|
573
618
|
}
|
574
619
|
.max-w-xl {
|
575
620
|
max-width: var(--container-xl);
|
576
621
|
}
|
622
|
+
.max-w-xs {
|
623
|
+
max-width: var(--container-xs);
|
624
|
+
}
|
577
625
|
.flex-1 {
|
578
626
|
flex: 1;
|
579
627
|
}
|
@@ -602,6 +650,12 @@
|
|
602
650
|
.animate-pulse {
|
603
651
|
animation: var(--animate-pulse);
|
604
652
|
}
|
653
|
+
.animate-spin {
|
654
|
+
animation: var(--animate-spin);
|
655
|
+
}
|
656
|
+
.cursor-not-allowed {
|
657
|
+
cursor: not-allowed;
|
658
|
+
}
|
605
659
|
.cursor-pointer {
|
606
660
|
cursor: pointer;
|
607
661
|
}
|
@@ -611,9 +665,6 @@
|
|
611
665
|
.flex-col {
|
612
666
|
flex-direction: column;
|
613
667
|
}
|
614
|
-
.flex-row {
|
615
|
-
flex-direction: row;
|
616
|
-
}
|
617
668
|
.items-center {
|
618
669
|
align-items: center;
|
619
670
|
}
|
@@ -629,6 +680,9 @@
|
|
629
680
|
.justify-end {
|
630
681
|
justify-content: flex-end;
|
631
682
|
}
|
683
|
+
.justify-start {
|
684
|
+
justify-content: flex-start;
|
685
|
+
}
|
632
686
|
.gap-1 {
|
633
687
|
gap: calc(var(--spacing) * 1);
|
634
688
|
}
|
@@ -769,6 +823,12 @@
|
|
769
823
|
.bg-gray-300 {
|
770
824
|
background-color: var(--color-gray-300);
|
771
825
|
}
|
826
|
+
.bg-gray-400 {
|
827
|
+
background-color: var(--color-gray-400);
|
828
|
+
}
|
829
|
+
.bg-red-50 {
|
830
|
+
background-color: var(--color-red-50);
|
831
|
+
}
|
772
832
|
.bg-sky-500 {
|
773
833
|
background-color: var(--color-sky-500);
|
774
834
|
}
|
@@ -797,6 +857,9 @@
|
|
797
857
|
var(--tw-gradient-to) var(--tw-gradient-to-position)
|
798
858
|
);
|
799
859
|
}
|
860
|
+
.object-cover {
|
861
|
+
object-fit: cover;
|
862
|
+
}
|
800
863
|
.p-1 {
|
801
864
|
padding: calc(var(--spacing) * 1);
|
802
865
|
}
|
@@ -806,6 +869,9 @@
|
|
806
869
|
.p-3 {
|
807
870
|
padding: calc(var(--spacing) * 3);
|
808
871
|
}
|
872
|
+
.p-4 {
|
873
|
+
padding: calc(var(--spacing) * 4);
|
874
|
+
}
|
809
875
|
.p-6 {
|
810
876
|
padding: calc(var(--spacing) * 6);
|
811
877
|
}
|
@@ -848,6 +914,10 @@
|
|
848
914
|
.font-sans {
|
849
915
|
font-family: var(--font-sans);
|
850
916
|
}
|
917
|
+
.text-2xl {
|
918
|
+
font-size: var(--text-2xl);
|
919
|
+
line-height: var(--tw-leading, var(--text-2xl--line-height));
|
920
|
+
}
|
851
921
|
.text-4xl {
|
852
922
|
font-size: var(--text-4xl);
|
853
923
|
line-height: var(--tw-leading, var(--text-4xl--line-height));
|
@@ -864,6 +934,10 @@
|
|
864
934
|
font-size: var(--text-xs);
|
865
935
|
line-height: var(--tw-leading, var(--text-xs--line-height));
|
866
936
|
}
|
937
|
+
.leading-none {
|
938
|
+
--tw-leading: 1;
|
939
|
+
line-height: 1;
|
940
|
+
}
|
867
941
|
.font-bold {
|
868
942
|
--tw-font-weight: var(--font-weight-bold);
|
869
943
|
font-weight: var(--font-weight-bold);
|
@@ -912,6 +986,9 @@
|
|
912
986
|
.text-red-500 {
|
913
987
|
color: var(--color-red-500);
|
914
988
|
}
|
989
|
+
.text-red-600 {
|
990
|
+
color: var(--color-red-600);
|
991
|
+
}
|
915
992
|
.text-sky-600 {
|
916
993
|
color: var(--color-sky-600);
|
917
994
|
}
|
@@ -921,9 +998,21 @@
|
|
921
998
|
.uppercase {
|
922
999
|
text-transform: uppercase;
|
923
1000
|
}
|
1001
|
+
.opacity-25 {
|
1002
|
+
opacity: 0.25;
|
1003
|
+
}
|
924
1004
|
.opacity-30 {
|
925
1005
|
opacity: 0.3;
|
926
1006
|
}
|
1007
|
+
.opacity-75 {
|
1008
|
+
opacity: 0.75;
|
1009
|
+
}
|
1010
|
+
.shadow-lg {
|
1011
|
+
--tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, #0000001a),
|
1012
|
+
0 4px 6px -4px var(--tw-shadow-color, #0000001a);
|
1013
|
+
box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow),
|
1014
|
+
var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
|
1015
|
+
}
|
927
1016
|
.shadow-md {
|
928
1017
|
--tw-shadow: 0 4px 6px -1px var(--tw-shadow-color, #0000001a),
|
929
1018
|
0 2px 4px -2px var(--tw-shadow-color, #0000001a);
|
@@ -965,6 +1054,14 @@
|
|
965
1054
|
);
|
966
1055
|
transition-duration: var(--tw-duration, var(--default-transition-duration));
|
967
1056
|
}
|
1057
|
+
.transition-shadow {
|
1058
|
+
transition-property: box-shadow;
|
1059
|
+
transition-timing-function: var(
|
1060
|
+
--tw-ease,
|
1061
|
+
var(--default-transition-timing-function)
|
1062
|
+
);
|
1063
|
+
transition-duration: var(--tw-duration, var(--default-transition-duration));
|
1064
|
+
}
|
968
1065
|
.transition-transform {
|
969
1066
|
transition-property: transform, translate, scale, rotate;
|
970
1067
|
transition-timing-function: var(
|
@@ -1013,6 +1110,18 @@
|
|
1013
1110
|
var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
|
1014
1111
|
}
|
1015
1112
|
}
|
1113
|
+
.focus\:ring-2:focus {
|
1114
|
+
--tw-ring-shadow: var(--tw-ring-inset) 0 0 0
|
1115
|
+
calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
|
1116
|
+
box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow),
|
1117
|
+
var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
|
1118
|
+
}
|
1119
|
+
.focus\:ring-blue-200:focus {
|
1120
|
+
--tw-ring-color: var(--color-blue-200);
|
1121
|
+
}
|
1122
|
+
.disabled\:bg-gray-100:disabled {
|
1123
|
+
background-color: var(--color-gray-100);
|
1124
|
+
}
|
1016
1125
|
.disabled\:opacity-40:disabled {
|
1017
1126
|
opacity: 0.4;
|
1018
1127
|
}
|
@@ -1124,6 +1233,9 @@ h1 {
|
|
1124
1233
|
.bg-learnpack-blue {
|
1125
1234
|
background-color: var(--soft-blue);
|
1126
1235
|
}
|
1236
|
+
.bg-learnpack {
|
1237
|
+
background-color: var(--learnpack-blue);
|
1238
|
+
}
|
1127
1239
|
.bg-gray-blue {
|
1128
1240
|
background-color: #e7f1ff;
|
1129
1241
|
}
|
@@ -1153,9 +1265,6 @@ h1 {
|
|
1153
1265
|
display: flex;
|
1154
1266
|
}
|
1155
1267
|
@keyframes spin {
|
1156
|
-
0% {
|
1157
|
-
transform: rotate(0);
|
1158
|
-
}
|
1159
1268
|
to {
|
1160
1269
|
transform: rotate(360deg);
|
1161
1270
|
}
|
@@ -1326,6 +1435,10 @@ h1 {
|
|
1326
1435
|
inherits: false;
|
1327
1436
|
initial-value: 100%;
|
1328
1437
|
}
|
1438
|
+
@property --tw-leading {
|
1439
|
+
syntax: "*";
|
1440
|
+
inherits: false;
|
1441
|
+
}
|
1329
1442
|
@property --tw-font-weight {
|
1330
1443
|
syntax: "*";
|
1331
1444
|
inherits: false;
|