feat: introducing @classroomio/course-app (#490)

* feat: v1 templates

* update nvm

* working on the displaying the course content

* working on the displaying the course content

* displayed the content

* finished with the logic for rendering the content for all the courses and lessons

* post hog template UI is good to go

* classic and minimalistic template UI is good to go

* some refactoring

* some refactoring

* layout adjustments

* update tsconfig

* trying to get the filter to work well

* this is working now

* cleanup

* cleanup

* UI updates

* course page UI for posthog

* navbar and sidebar for course page in all templates complete

* all templates course page showing lesson content from md file with mdsvex
configured

* wokring on sections

* posthog lesson content done

* all templates fetches the lesson content from the section

* all templates properly typed

* scaffolding the new template

* finished the webflow-saas

* done with the webflow saas UI

* new calcom template

* new calcom template

* masonry layout for testitomonail section layout done

* calcom UI done

* UI all done

* cleanup

* trying to fix dark mode for the course page and home page

* done with this

* done with this

* working on tests

* migrated minimalistic template to svelte 5

* updated the syntax to svelte 5 for webflow

* migrated classic to svelte 5

* migrated posthog to svelte 5

* used svelte 5 syntax in calcom

* cli tool woks locally

* rename to course-sites

* use pnpm in root

* calcom refactoring

* remove unused files

* chore: biggest refactoring in my life

* add basic readme

* refactoring on course page

* restructure how courses are ordered

* proper state propagation

* add cf adapter

* fix pnpm i issue

* fix folder icon size

* use 18.17 version

* update npmrc

* add engine to packagejson

* pnpm install

* add engine to cio-com

* make it 18.x

* remove sequence

* move mdsvex to dependencies

* update lock

* mdsvex please work

* replace fs with import from vite

* add lock

* styling improvements

* fix styling

* sidebar style improvements

* fix: mobile concerns

* fix spacing of course header on desktop

* update header

* top nav fix

* feat: make cal template

* setup another template

* classic basic UI

* fixed the /courses fetching wrong page content

* fix breaking template cause of logo

* adding some updates

* improve styles theming

* finished updates from reviews

* updated the custom styling css

* clean up posthog template

* cli tool done, needs some cleaning though

* moved components to home

* improved the UI of the minimal template

* Add CLI tool and course app site

* prettier lint

* improve CLI

* ignore sveltekit folder

* publish course app

* fix tailwing theme + improve README

* finish up course-app site

* update README.md

---------

Co-authored-by: emmanuel <[email protected]>
This commit is contained in:
Rotimi Best
2024-12-14 03:40:47 +01:00
committed by GitHub
co-authored by emmanuel
parent 7e239da7d2
commit 26700dccd0
343 changed files with 17993 additions and 350 deletions
@@ -0,0 +1,26 @@
import chalk from 'chalk';
import fs from 'fs';
import path from 'path';
import { copyFolderSync } from './copyFolder';
import { CopyCourseFolderParams } from './types';
export async function copyCoursesFolder({
templatePath,
projectPath,
courses
}: CopyCourseFolderParams): Promise<void> {
console.log('include contents', courses);
const from = path.join(templatePath, 'src/courses');
const to = path.join(projectPath, 'src/courses');
// Create the 'courses' folder if it doesn't exist
fs.mkdirSync(to, { recursive: true });
if (courses && fs.existsSync(from)) {
// Copy all contents of the courses folder if courses is true
await copyFolderSync({ from, to });
} else {
// Just create an empty 'courses' folder, without copying any content
console.log(chalk.yellow(`Created empty courses folder at: ${to}`));
}
}
+32
View File
@@ -0,0 +1,32 @@
import chalk from 'chalk';
import fs from 'fs';
import path from 'path';
import { CopyFolderParams } from './types';
export async function copyFolderSync({
from,
to,
excludeNames = [],
excludePath = null
}: CopyFolderParams): Promise<void> {
fs.mkdirSync(to, { recursive: true });
for (const element of fs.readdirSync(from)) {
const fromPath = path.join(from, element);
const toPath = path.join(to, element);
if (excludeNames.includes(element)) {
continue;
}
// Check for path-based exclusion (specific courses folder)
if (excludePath && fromPath === excludePath) {
continue;
}
if (fs.lstatSync(fromPath).isFile()) {
fs.copyFileSync(fromPath, toPath);
} else {
await copyFolderSync({ from: fromPath, to: toPath, excludeNames, excludePath });
}
}
}
+21
View File
@@ -0,0 +1,21 @@
export type TemplateType =
| 'calcom'
| 'webflow-saas'
| 'posthog-saas'
| 'classic'
| 'minimalist'
| 'calcom'
| 'default';
export interface CopyFolderParams {
from: string;
to: string;
excludeNames?: string[];
excludePath?: string | null;
}
export interface CopyCourseFolderParams {
templatePath: string;
projectPath: string;
courses: boolean;
}