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:
@@ -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}`));
|
||||
}
|
||||
}
|
||||
@@ -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 });
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
Reference in New Issue
Block a user