@learnpack/learnpack 5.0.79 → 5.0.83

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.
@@ -401,6 +401,9 @@
401
401
  .bottom-3 {
402
402
  bottom: calc(var(--spacing) * 3);
403
403
  }
404
+ .bottom-5 {
405
+ bottom: calc(var(--spacing) * 5);
406
+ }
404
407
  .left-0 {
405
408
  left: calc(var(--spacing) * 0);
406
409
  }
@@ -474,12 +477,18 @@
474
477
  .mr-1 {
475
478
  margin-right: calc(var(--spacing) * 1);
476
479
  }
480
+ .mr-4 {
481
+ margin-right: calc(var(--spacing) * 4);
482
+ }
477
483
  .mb-2 {
478
484
  margin-bottom: calc(var(--spacing) * 2);
479
485
  }
480
486
  .mb-4 {
481
487
  margin-bottom: calc(var(--spacing) * 4);
482
488
  }
489
+ .mb-5 {
490
+ margin-bottom: calc(var(--spacing) * 5);
491
+ }
483
492
  .mb-6 {
484
493
  margin-bottom: calc(var(--spacing) * 6);
485
494
  }
@@ -510,6 +519,9 @@
510
519
  .h-6 {
511
520
  height: calc(var(--spacing) * 6);
512
521
  }
522
+ .h-15 {
523
+ height: calc(var(--spacing) * 15);
524
+ }
513
525
  .h-20 {
514
526
  height: calc(var(--spacing) * 20);
515
527
  }
@@ -531,8 +543,8 @@
531
543
  .h-screen {
532
544
  height: 100vh;
533
545
  }
534
- .max-h-\[80vh\] {
535
- max-height: 80vh;
546
+ .max-h-\[75vh\] {
547
+ max-height: 75vh;
536
548
  }
537
549
  .max-h-\[300px\] {
538
550
  max-height: 300px;
@@ -555,6 +567,9 @@
555
567
  .w-6 {
556
568
  width: calc(var(--spacing) * 6);
557
569
  }
570
+ .w-15 {
571
+ width: calc(var(--spacing) * 15);
572
+ }
558
573
  .w-20 {
559
574
  width: calc(var(--spacing) * 20);
560
575
  }
@@ -679,6 +694,9 @@
679
694
  .rounded {
680
695
  border-radius: 0.25rem;
681
696
  }
697
+ .rounded-\[50\%\] {
698
+ border-radius: 50%;
699
+ }
682
700
  .rounded-full {
683
701
  border-radius: 3.40282e38px;
684
702
  }
@@ -751,6 +769,9 @@
751
769
  .bg-gray-50 {
752
770
  background-color: var(--color-gray-50);
753
771
  }
772
+ .bg-gray-200 {
773
+ background-color: var(--color-gray-200);
774
+ }
754
775
  .bg-gray-300 {
755
776
  background-color: var(--color-gray-300);
756
777
  }
@@ -963,6 +984,9 @@
963
984
  .hover\:bg-blue-700:hover {
964
985
  background-color: var(--color-blue-700);
965
986
  }
987
+ .hover\:bg-gray-300:hover {
988
+ background-color: var(--color-gray-300);
989
+ }
966
990
  .hover\:bg-red-300:hover {
967
991
  background-color: var(--color-red-300);
968
992
  }
@@ -1118,6 +1142,10 @@ h1 {
1118
1142
  top: -10px;
1119
1143
  left: 10px;
1120
1144
  }
1145
+ .fluid-svg > svg {
1146
+ width: 100%;
1147
+ height: 100%;
1148
+ }
1121
1149
  @property --tw-translate-x {
1122
1150
  syntax: "*";
1123
1151
  inherits: false;
@@ -10,8 +10,8 @@
10
10
  />
11
11
 
12
12
  <title>Learnpack Creator: Craft tutorials in seconds!</title>
13
- <script type="module" crossorigin src="/creator/assets/index-WzdhAujs.js"></script>
14
- <link rel="stylesheet" crossorigin href="/creator/assets/index-BJ2JJzVC.css">
13
+ <script type="module" crossorigin src="/creator/assets/index-CwPh6b6M.js"></script>
14
+ <link rel="stylesheet" crossorigin href="/creator/assets/index-DSLkFVbA.css">
15
15
  </head>
16
16
  <body>
17
17
  <div id="root"></div>
@@ -1 +1 @@
1
- {"version":"5.0.79","commands":{"audit":{"id":"audit","description":"learnpack audit is the command in charge of creating an auditory of the repository\n...\nlearnpack audit checks for the following information in a repository:\n 1. The configuration object has slug, repository and description. (Error)\n 2. The command learnpack clean has been run. (Error)\n 3. If a markdown or test file doesn't have any content. (Error)\n 4. The links are accessing to valid servers. (Error)\n 5. The relative images are working (If they have the shortest path to the image or if the images exists in the assets). (Error)\n 6. The external images are working (If they are pointing to a valid server). (Error)\n 7. The exercises directory names are valid. (Error)\n 8. If an exercise doesn't have a README file. (Error)\n 9. The exercises array (Of the config file) has content. (Error)\n 10. The exercses have the same translations. (Warning)\n 11. The .gitignore file exists. (Warning)\n 12. If there is a file within the exercises folder but not inside of any particular exercise's folder. (Warning)\n","pluginName":"@learnpack/learnpack","pluginType":"core","aliases":[],"flags":{"strict":{"name":"strict","type":"boolean","char":"s","description":"strict mode","allowNo":false}},"args":[]},"breakToken":{"id":"breakToken","description":"Break the token","pluginName":"@learnpack/learnpack","pluginType":"core","aliases":[],"flags":{"yes":{"name":"yes","type":"boolean","char":"y","description":"Skip all prompts and initialize an empty project","allowNo":false},"grading":{"name":"grading","type":"boolean","char":"h","description":"show CLI help","allowNo":false}},"args":[]},"clean":{"id":"clean","description":"Clean the configuration object\n ...\n Extra documentation goes here\n ","pluginName":"@learnpack/learnpack","pluginType":"core","aliases":[],"flags":{},"args":[]},"download":{"id":"download","description":"Describe the command here\n...\nExtra documentation goes here\n","pluginName":"@learnpack/learnpack","pluginType":"core","aliases":[],"flags":{},"args":[{"name":"package","description":"The unique string that identifies this package on learnpack","required":false,"hidden":false}]},"init":{"id":"init","description":"Create a new learning package: Book, Tutorial or Exercise","pluginName":"@learnpack/learnpack","pluginType":"core","aliases":[],"flags":{"yes":{"name":"yes","type":"boolean","char":"y","description":"Skip all prompts and initialize an empty project","allowNo":false},"grading":{"name":"grading","type":"boolean","char":"h","description":"show CLI help","allowNo":false}},"args":[]},"login":{"id":"login","description":"Describe the command here\n ...\n Extra documentation goes here\n ","pluginName":"@learnpack/learnpack","pluginType":"core","aliases":[],"flags":{},"args":[{"name":"package","description":"The unique string that identifies this package on learnpack","required":false,"hidden":false}]},"logout":{"id":"logout","description":"Describe the command here\n ...\n Extra documentation goes here\n ","pluginName":"@learnpack/learnpack","pluginType":"core","aliases":[],"flags":{},"args":[{"name":"package","description":"The unique string that identifies this package on learnpack","required":false,"hidden":false}]},"publish":{"id":"publish","description":"Builds the project by copying necessary files and directories into a zip file","pluginName":"@learnpack/learnpack","pluginType":"core","aliases":[],"flags":{"strict":{"name":"strict","type":"boolean","char":"s","description":"strict mode","allowNo":false},"help":{"name":"help","type":"boolean","char":"h","description":"show CLI help","allowNo":false}},"args":[]},"serve":{"id":"serve","description":"Runs a small server to build tutorials","pluginName":"@learnpack/learnpack","pluginType":"core","aliases":[],"flags":{"yes":{"name":"yes","type":"boolean","char":"y","description":"Skip all prompts and initialize an empty project","allowNo":false},"port":{"name":"port","type":"option","char":"p","description":"server port"},"host":{"name":"host","type":"option","char":"h","description":"server host"},"debug":{"name":"debug","type":"boolean","char":"d","description":"debugger mode for more verbage","allowNo":false}},"args":[]},"start":{"id":"start","description":"Runs a small server with all the exercise instructions","pluginName":"@learnpack/learnpack","pluginType":"core","aliases":[],"flags":{"yes":{"name":"yes","type":"boolean","char":"y","description":"Skip all prompts and initialize an empty project","allowNo":false},"port":{"name":"port","type":"option","char":"p","description":"server port"},"host":{"name":"host","type":"option","char":"h","description":"server host"},"disableGrading":{"name":"disableGrading","type":"boolean","char":"D","description":"disble grading functionality","allowNo":false},"watch":{"name":"watch","type":"boolean","char":"w","description":"Watch for file changes","allowNo":false},"editor":{"name":"editor","type":"option","char":"e","description":"[preview, extension]","options":["extension","preview"]},"version":{"name":"version","type":"option","char":"v","description":"E.g: 1.0.1"},"grading":{"name":"grading","type":"option","char":"g","description":"[isolated, incremental]","options":["isolated","incremental"]},"debug":{"name":"debug","type":"boolean","char":"d","description":"debugger mode for more verbage","allowNo":false}},"args":[]},"test":{"id":"test","description":"Test exercises","pluginName":"@learnpack/learnpack","pluginType":"core","aliases":[],"flags":{"yes":{"name":"yes","type":"boolean","char":"y","description":"Skip all prompts and initialize an empty project","allowNo":false}},"args":[{"name":"exerciseSlug","description":"The name of the exercise to test","required":false,"hidden":false}]},"translate":{"id":"translate","description":"List all the lessons, the user is able of select many of them to translate to the given languages","pluginName":"@learnpack/learnpack","pluginType":"core","aliases":[],"flags":{"yes":{"name":"yes","type":"boolean","char":"y","description":"Skip all prompts and initialize an empty project","allowNo":false}},"args":[]}}}
1
+ {"version":"5.0.83","commands":{"audit":{"id":"audit","description":"learnpack audit is the command in charge of creating an auditory of the repository\n...\nlearnpack audit checks for the following information in a repository:\n 1. The configuration object has slug, repository and description. (Error)\n 2. The command learnpack clean has been run. (Error)\n 3. If a markdown or test file doesn't have any content. (Error)\n 4. The links are accessing to valid servers. (Error)\n 5. The relative images are working (If they have the shortest path to the image or if the images exists in the assets). (Error)\n 6. The external images are working (If they are pointing to a valid server). (Error)\n 7. The exercises directory names are valid. (Error)\n 8. If an exercise doesn't have a README file. (Error)\n 9. The exercises array (Of the config file) has content. (Error)\n 10. The exercses have the same translations. (Warning)\n 11. The .gitignore file exists. (Warning)\n 12. If there is a file within the exercises folder but not inside of any particular exercise's folder. (Warning)\n","pluginName":"@learnpack/learnpack","pluginType":"core","aliases":[],"flags":{"strict":{"name":"strict","type":"boolean","char":"s","description":"strict mode","allowNo":false}},"args":[]},"breakToken":{"id":"breakToken","description":"Break the token","pluginName":"@learnpack/learnpack","pluginType":"core","aliases":[],"flags":{"yes":{"name":"yes","type":"boolean","char":"y","description":"Skip all prompts and initialize an empty project","allowNo":false},"grading":{"name":"grading","type":"boolean","char":"h","description":"show CLI help","allowNo":false}},"args":[]},"clean":{"id":"clean","description":"Clean the configuration object\n ...\n Extra documentation goes here\n ","pluginName":"@learnpack/learnpack","pluginType":"core","aliases":[],"flags":{},"args":[]},"download":{"id":"download","description":"Describe the command here\n...\nExtra documentation goes here\n","pluginName":"@learnpack/learnpack","pluginType":"core","aliases":[],"flags":{},"args":[{"name":"package","description":"The unique string that identifies this package on learnpack","required":false,"hidden":false}]},"init":{"id":"init","description":"Create a new learning package: Book, Tutorial or Exercise","pluginName":"@learnpack/learnpack","pluginType":"core","aliases":[],"flags":{"yes":{"name":"yes","type":"boolean","char":"y","description":"Skip all prompts and initialize an empty project","allowNo":false},"grading":{"name":"grading","type":"boolean","char":"h","description":"show CLI help","allowNo":false}},"args":[]},"login":{"id":"login","description":"Describe the command here\n ...\n Extra documentation goes here\n ","pluginName":"@learnpack/learnpack","pluginType":"core","aliases":[],"flags":{},"args":[{"name":"package","description":"The unique string that identifies this package on learnpack","required":false,"hidden":false}]},"logout":{"id":"logout","description":"Describe the command here\n ...\n Extra documentation goes here\n ","pluginName":"@learnpack/learnpack","pluginType":"core","aliases":[],"flags":{},"args":[{"name":"package","description":"The unique string that identifies this package on learnpack","required":false,"hidden":false}]},"publish":{"id":"publish","description":"Builds the project by copying necessary files and directories into a zip file","pluginName":"@learnpack/learnpack","pluginType":"core","aliases":[],"flags":{"strict":{"name":"strict","type":"boolean","char":"s","description":"strict mode","allowNo":false},"help":{"name":"help","type":"boolean","char":"h","description":"show CLI help","allowNo":false}},"args":[]},"serve":{"id":"serve","description":"Runs a small server to build tutorials","pluginName":"@learnpack/learnpack","pluginType":"core","aliases":[],"flags":{"yes":{"name":"yes","type":"boolean","char":"y","description":"Skip all prompts and initialize an empty project","allowNo":false},"port":{"name":"port","type":"option","char":"p","description":"server port"},"host":{"name":"host","type":"option","char":"h","description":"server host"},"debug":{"name":"debug","type":"boolean","char":"d","description":"debugger mode for more verbage","allowNo":false}},"args":[]},"start":{"id":"start","description":"Runs a small server with all the exercise instructions","pluginName":"@learnpack/learnpack","pluginType":"core","aliases":[],"flags":{"yes":{"name":"yes","type":"boolean","char":"y","description":"Skip all prompts and initialize an empty project","allowNo":false},"port":{"name":"port","type":"option","char":"p","description":"server port"},"host":{"name":"host","type":"option","char":"h","description":"server host"},"disableGrading":{"name":"disableGrading","type":"boolean","char":"D","description":"disble grading functionality","allowNo":false},"watch":{"name":"watch","type":"boolean","char":"w","description":"Watch for file changes","allowNo":false},"editor":{"name":"editor","type":"option","char":"e","description":"[preview, extension]","options":["extension","preview"]},"version":{"name":"version","type":"option","char":"v","description":"E.g: 1.0.1"},"grading":{"name":"grading","type":"option","char":"g","description":"[isolated, incremental]","options":["isolated","incremental"]},"debug":{"name":"debug","type":"boolean","char":"d","description":"debugger mode for more verbage","allowNo":false}},"args":[]},"test":{"id":"test","description":"Test exercises","pluginName":"@learnpack/learnpack","pluginType":"core","aliases":[],"flags":{"yes":{"name":"yes","type":"boolean","char":"y","description":"Skip all prompts and initialize an empty project","allowNo":false}},"args":[{"name":"exerciseSlug","description":"The name of the exercise to test","required":false,"hidden":false}]},"translate":{"id":"translate","description":"List all the lessons, the user is able of select many of them to translate to the given languages","pluginName":"@learnpack/learnpack","pluginType":"core","aliases":[],"flags":{"yes":{"name":"yes","type":"boolean","char":"y","description":"Skip all prompts and initialize an empty project","allowNo":false}},"args":[]}}}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@learnpack/learnpack",
3
3
  "description": "Seamlessly build, sell and/or take interactive & auto-graded tutorials, start learning now or build a new tutorial to your audience.",
4
- "version": "5.0.79",
4
+ "version": "5.0.83",
5
5
  "author": "Alejandro Sanchez @alesanchezr",
6
6
  "contributors": [
7
7
  {
@@ -266,13 +266,7 @@ function App() {
266
266
  {formState.isCompleted ? (
267
267
  <Loader
268
268
  text="Learnpack is setting up your tutorial. It may take a moment..."
269
- icon={
270
- <img
271
- src={"/rigo-float.gif"}
272
- alt="rigo"
273
- className="w-20 h-20"
274
- />
275
- }
269
+ icon={<img src={"creator/rigo-float.gif"} alt="rigo" className="w-20 h-20" />}
276
270
  />
277
271
  ) : (
278
272
  <StepWizard
@@ -263,4 +263,22 @@ export const SVGS = {
263
263
  />
264
264
  </svg>
265
265
  ),
266
+ undo: (
267
+ <svg
268
+ width="20px"
269
+ height="20px"
270
+ viewBox="0 0 24 24"
271
+ fill="none"
272
+ xmlns="http://www.w3.org/2000/svg"
273
+ >
274
+ <path
275
+ d="M12 20.75C10.078 20.7474 8.23546 19.9827 6.8764 18.6236C5.51733 17.2645 4.75265 15.422 4.75 13.5C4.75 13.3011 4.82902 13.1103 4.96967 12.9697C5.11032 12.829 5.30109 12.75 5.5 12.75C5.69891 12.75 5.88968 12.829 6.03033 12.9697C6.17098 13.1103 6.25 13.3011 6.25 13.5C6.25 14.6372 6.58723 15.7489 7.21905 16.6945C7.85087 17.6401 8.74889 18.3771 9.79957 18.8123C10.8502 19.2475 12.0064 19.3614 13.1218 19.1395C14.2372 18.9177 15.2617 18.37 16.0659 17.5659C16.87 16.7617 17.4177 15.7372 17.6395 14.6218C17.8614 13.5064 17.7475 12.3502 17.3123 11.2996C16.8771 10.2489 16.1401 9.35087 15.1945 8.71905C14.2489 8.08723 13.1372 7.75 12 7.75H9.5C9.30109 7.75 9.11032 7.67098 8.96967 7.53033C8.82902 7.38968 8.75 7.19891 8.75 7C8.75 6.80109 8.82902 6.61032 8.96967 6.46967C9.11032 6.32902 9.30109 6.25 9.5 6.25H12C13.9228 6.25 15.7669 7.01384 17.1265 8.37348C18.4862 9.73311 19.25 11.5772 19.25 13.5C19.25 15.4228 18.4862 17.2669 17.1265 18.6265C15.7669 19.9862 13.9228 20.75 12 20.75Z"
276
+ fill="#000000"
277
+ />
278
+ <path
279
+ d="M12 10.75C11.9015 10.7505 11.8038 10.7313 11.7128 10.6935C11.6218 10.6557 11.5393 10.6001 11.47 10.53L8.47001 7.53003C8.32956 7.38941 8.25067 7.19878 8.25067 7.00003C8.25067 6.80128 8.32956 6.61066 8.47001 6.47003L11.47 3.47003C11.5387 3.39634 11.6215 3.33724 11.7135 3.29625C11.8055 3.25526 11.9048 3.23322 12.0055 3.23144C12.1062 3.22966 12.2062 3.24819 12.2996 3.28591C12.393 3.32363 12.4778 3.37977 12.549 3.45099C12.6203 3.52221 12.6764 3.60705 12.7141 3.70043C12.7519 3.79382 12.7704 3.89385 12.7686 3.99455C12.7668 4.09526 12.7448 4.19457 12.7038 4.28657C12.6628 4.37857 12.6037 4.46137 12.53 4.53003L10.06 7.00003L12.53 9.47003C12.6705 9.61066 12.7494 9.80128 12.7494 10C12.7494 10.1988 12.6705 10.3894 12.53 10.53C12.4608 10.6001 12.3782 10.6557 12.2872 10.6935C12.1962 10.7313 12.0986 10.7505 12 10.75Z"
280
+ fill="#000000"
281
+ />
282
+ </svg>
283
+ ),
266
284
  }
@@ -85,6 +85,10 @@ export default function Login({ onFinish }: { onFinish: () => void }) {
85
85
  className="bg-white p-8 rounded-xl shadow-md max-w-sm w-full"
86
86
  onClick={(e) => e.stopPropagation()}
87
87
  >
88
+ <p className="mb-4 text-center text-gray-700">
89
+ You need to have a 4Geeks account with a creator plan to create a
90
+ tutorial.
91
+ </p>
88
92
  <button
89
93
  onClick={redirectGithub}
90
94
  className="w-full border border-gray-300 py-2 rounded-md font-semibold flex items-center justify-center gap-2 mb-4"
@@ -16,7 +16,7 @@ export const Message: React.FC<TMessage> = ({ type, content }) => {
16
16
 
17
17
  console.log("user", user)
18
18
  return isLoading ? (
19
- <RigoLoader text="Thinking..." svg={<img src="/rigo-float.gif" />} />
19
+ <RigoLoader text="Thinking..." svg={<img src="rigo-float.gif" />} />
20
20
  ) : (
21
21
  <div
22
22
  className={`flex items-start space-x-2 p-3 rounded-md border ${
@@ -18,7 +18,7 @@ const ContentIndexHeader = ({
18
18
  .length === 2
19
19
 
20
20
  const headerText = isFirst
21
- ? "I've created a detailed structure for your course."
21
+ ? `I've created a detailed structure for your course: ${syllabus.courseInfo.title}`
22
22
  : "I've updated the structure based on your feedback."
23
23
 
24
24
  const subText = isFirst
@@ -36,7 +36,7 @@ const ContentIndexHeader = ({
36
36
  animate={{ opacity: 1, y: 0 }}
37
37
  exit={{ opacity: 0, y: 10 }}
38
38
  transition={{ duration: 0.2 }}
39
- className="text-lg font-semibold"
39
+ className="text-lg font-semibold "
40
40
  >
41
41
  {headerText}
42
42
  </motion.h2>
@@ -49,15 +49,11 @@ const ContentIndexHeader = ({
49
49
  animate={{ opacity: 1 }}
50
50
  exit={{ opacity: 0 }}
51
51
  transition={{ duration: 0.2, delay: 0.1 }}
52
- className="text-sm text-gray-600 mt-1"
52
+ className="text-sm text-gray-600 mt-1 mb-5"
53
53
  >
54
54
  {subText}
55
55
  </motion.p>
56
56
  </AnimatePresence>
57
-
58
- <h3 className="text-sm text-gray-600 mt-2 font-bold">
59
- {syllabus.courseInfo.title}
60
- </h3>
61
57
  </div>
62
58
  )
63
59
  }
@@ -66,11 +62,24 @@ export default ContentIndexHeader
66
62
 
67
63
  export const GenerateButton = ({
68
64
  handleSubmit,
65
+ handleUndo,
66
+ hasChanges,
69
67
  }: {
70
68
  handleSubmit: () => void
69
+ handleUndo: () => void
70
+ hasChanges: boolean
71
71
  }) => {
72
72
  return (
73
73
  <div className="flex justify-end mt-6">
74
+ {hasChanges && (
75
+ <button
76
+ className="text-gray-500 mr-4 cursor-pointer bg-gray-200 rounded px-4 py-2 hover:bg-gray-300 flex items-center gap-2"
77
+ onClick={() => handleUndo()}
78
+ >
79
+ {SVGS.undo}
80
+ Revert changes
81
+ </button>
82
+ )}
74
83
  <button
75
84
  onClick={async () => {
76
85
  handleSubmit()
@@ -83,16 +92,33 @@ export const GenerateButton = ({
83
92
  </div>
84
93
  )
85
94
  }
95
+
96
+ function hasChanges(current: Lesson[], previous: Lesson[]): boolean {
97
+ return current.some(
98
+ (c) =>
99
+ !previous.some(
100
+ (p) =>
101
+ p.id === c.id &&
102
+ p.title === c.title &&
103
+ p.type === c.type &&
104
+ p.duration === c.duration &&
105
+ p.description === c.description
106
+ )
107
+ )
108
+ }
109
+
86
110
  export const ContentIndex = ({
87
111
  prevLessons,
88
112
  handleSubmit,
89
113
  messages,
90
114
  isThinking,
115
+ handleUndo,
91
116
  }: {
92
117
  prevLessons?: Lesson[]
93
118
  handleSubmit: () => void
94
119
  messages: TMessage[]
95
120
  isThinking: boolean
121
+ handleUndo: () => void
96
122
  }) => {
97
123
  const syllabus = useStore((state) => state.syllabus)
98
124
  const setSyllabus = useStore((state) => state.setSyllabus)
@@ -171,7 +197,7 @@ export const ContentIndex = ({
171
197
  <ContentIndexHeader messages={messages} syllabus={syllabus} />
172
198
  <div
173
199
  ref={containerRef}
174
- className=" space-y-3 overflow-y-auto max-h-[80vh] pr-2 scrollbar-hide relative pb-5"
200
+ className=" space-y-3 overflow-y-auto max-h-[75vh] pr-2 scrollbar-hide relative pb-5"
175
201
  >
176
202
  {isThinking ? (
177
203
  <Loader text="Thinking..." minheight="min-h-[70vh]" />
@@ -207,7 +233,11 @@ export const ContentIndex = ({
207
233
  </div>
208
234
  </div>
209
235
  ))}
210
- <GenerateButton handleSubmit={handleSubmit} />
236
+ <GenerateButton
237
+ handleSubmit={handleSubmit}
238
+ handleUndo={handleUndo}
239
+ hasChanges={hasChanges(syllabus.lessons, prevLessons || [])}
240
+ />
211
241
  </>
212
242
  )}
213
243
  </div>
@@ -24,7 +24,7 @@ export const Sidebar = ({
24
24
  <>
25
25
  {!isOpen && (
26
26
  <button
27
- className="fixed top-2 left-2 z-50 lg:hidden bg-white p-1 rounded shadow-md cursor-pointer p-2"
27
+ className="fixed bottom-5 left-2 z-50 lg:hidden p-1 shadow-md cursor-pointer p-2 w-15 h-15 flex items-center justify-center bg-blue-600 rounded-[50%] fluid-svg"
28
28
  onClick={() => setIsOpen(true)}
29
29
  >
30
30
  {SVGS.rigoSoftBlue}
@@ -162,9 +162,7 @@ const SyllabusEditor: React.FC = () => {
162
162
  return isGenerating ? (
163
163
  <Loader
164
164
  listeningTo="course-generation"
165
- icon={
166
- <img src={"creator/rigo-float.gif"} alt="rigo" className="w-20 h-20" />
167
- }
165
+ icon={<img src={"rigo-float.gif"} alt="rigo" className="w-20 h-20" />}
168
166
  initialBuffer="🚀 Starting course generation..."
169
167
  text="Learnpack is setting up your tutorial.
170
168
  It may take a moment..."
@@ -192,6 +190,12 @@ It may take a moment..."
192
190
  prevLessons={prevLessons.current}
193
191
  handleSubmit={handleSubmit}
194
192
  messages={messages}
193
+ handleUndo={() => {
194
+ setSyllabus({
195
+ ...syllabus,
196
+ lessons: prevLessons.current,
197
+ })
198
+ }}
195
199
  isThinking={isThinking}
196
200
  />
197
201
  </div>
@@ -141,3 +141,10 @@ h1 {
141
141
  top: -10px;
142
142
  left: 10px;
143
143
  }
144
+
145
+ .fluid-svg {
146
+ > svg {
147
+ width: 100%;
148
+ height: 100%;
149
+ }
150
+ }