From 26700dccd0dcf772d89ad2a941f74ad9ef71d2ce Mon Sep 17 00:00:00 2001 From: Rotimi Best Date: Sat, 14 Dec 2024 03:40:47 +0100 Subject: [PATCH] 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 --- .github/workflows/publish-course-app.yml | 26 + .nvmrc | 2 +- .prettierrc | 5 +- apps/classroomio-com/package.json | 3 + apps/classroomio-com/static/hero-bg.svg | 45 - apps/classroomio-com/static/tools-hero-bg.svg | 28 - apps/course-app/.gitignore | 23 + apps/course-app/.npmrc | 1 + apps/course-app/.prettierignore | 4 + apps/course-app/.prettierrc | 15 + apps/course-app/README.md | 17 + apps/course-app/components.json | 14 + apps/course-app/package.json | 46 + apps/course-app/postcss.config.js | 6 + apps/course-app/src/app.css | 78 + apps/course-app/src/app.d.ts | 13 + apps/course-app/src/app.html | 45 + apps/course-app/src/demo.spec.ts | 7 + .../animation/blurfade/blurfade.svelte | 48 + .../components/animation/blurfade/index.ts | 1 + .../components/animation/blurin/blurin.svelte | 36 + .../lib/components/animation/blurin/index.ts | 1 + .../lib/components/animation/card/body.svelte | 21 + .../animation/card/container.svelte | 30 + .../components/animation/card/ellipses.svelte | 13 + .../lib/components/animation/card/index.ts | 2 + .../gradual-spacing/gradual-spacing.svelte | 42 + .../animation/gradual-spacing/index.ts | 1 + .../components/animation/magic-card/index.ts | 1 + .../animation/magic-card/magic-card.svelte | 72 + .../lib/components/animation/meteors/index.ts | 1 + .../animation/meteors/meteors.svelte | 36 + .../animation/shimmerbutton/index.ts | 1 + .../shimmerbutton/shimmerbutton.svelte | 62 + .../components/animation/shinny-text/index.ts | 1 + .../animation/shinny-text/shinny-text.svelte | 24 + .../animation/square-card/body.svelte | 9 + .../animation/square-card/icon.svelte | 21 + .../components/animation/square-card/index.ts | 2 + .../src/lib/components/navigation/index.ts | 1 + .../components/navigation/navigation.svelte | 106 + .../src/lib/components/template-card/index.ts | 1 + .../template-card/template-card.svelte | 38 + .../lib/components/ui/button/button.svelte | 25 + .../src/lib/components/ui/button/index.ts | 50 + .../src/lib/components/ui/separator/index.ts | 7 + .../components/ui/separator/separator.svelte | 22 + .../src/lib/components/ui/sonner/index.ts | 1 + .../lib/components/ui/sonner/sonner.svelte | 20 + apps/course-app/src/lib/index.ts | 1 + apps/course-app/src/lib/utils.ts | 62 + apps/course-app/src/routes/+layout.svelte | 14 + apps/course-app/src/routes/+page.svelte | 185 + apps/course-app/static/apple-touch-icon.png | Bin 0 -> 44013 bytes apps/course-app/static/favicon.ico | Bin 0 -> 15406 bytes apps/course-app/static/favicon.png | Bin 0 -> 1571 bytes apps/course-app/static/logo-16.png | Bin 0 -> 891 bytes apps/course-app/static/logo-192.png | Bin 0 -> 48943 bytes apps/course-app/static/logo-32.png | Bin 0 -> 2553 bytes apps/course-app/static/logo-512.png | Bin 0 -> 236064 bytes apps/course-app/static/site.webmanifest | 1 + apps/course-app/svelte.config.js | 23 + apps/course-app/tailwind.config.ts | 111 + apps/course-app/tsconfig.json | 19 + apps/course-app/vite.config.ts | 17 + apps/dashboard/.nvmrc | 2 +- apps/dashboard/Dockerfile.prod | 55 + apps/dashboard/package.json | 2 +- package.json | 3 + packages/course-app/.gitignore | 22 + packages/course-app/README.md | 27 + packages/course-app/bin/create-template.ts | 84 + packages/course-app/lib/scaffoldTemplate.ts | 91 + packages/course-app/package.json | 46 + packages/course-app/scripts/postbuild.js | 15 + packages/course-app/src/template/.gitignore | 25 + packages/course-app/src/template/README.md | 48 + .../course-app/src/template/components.json | 17 + packages/course-app/src/template/package.json | 47 + .../src/template/playwright.config.ts | 108 + .../course-app/src/template/postcss.config.js | 6 + packages/course-app/src/template/src/app.css | 144 + packages/course-app/src/template/src/app.d.ts | 13 + packages/course-app/src/template/src/app.html | 15 + .../1-fundamentals/1-introduction.md | 44 + .../2-time-management-basics.md | 38 + .../1-fundamentals/metadata.json | 4 + .../2-priorities/1-prioritization-methods.md | 29 + .../2-priorities/metadata.json | 4 + .../3-tools/1-scheduling-tools.md | 39 + .../time-management-101/3-tools/metadata.json | 4 + .../4-calcom/1-cal-com-mastery.md | 37 + .../4-calcom/2-maintaining-balance.md | 36 + .../4-calcom/metadata.json | 4 + .../courses/time-management-101/metadata.json | 9 + .../1-fundamentals/1-introduction.md | 26 + .../2-time-management-basics.md | 38 + .../1-fundamentals/metadata.json | 4 + .../2-priorities/1-prioritization-methods.md | 29 + .../2-priorities/metadata.json | 4 + .../3-tools/1-scheduling-tools.md | 39 + .../time-management-102/3-tools/metadata.json | 4 + .../4-calcom/1-cal-com-mastery.md | 37 + .../4-calcom/2-maintaining-balance.md | 36 + .../4-calcom/metadata.json | 4 + .../courses/time-management-102/metadata.json | 9 + .../src/lib/components/cal/About.svelte | 35 + .../src/lib/components/cal/Accordion.svelte | 70 + .../src/lib/components/cal/CourseCard.svelte | 47 + .../src/lib/components/cal/EmptyState.svelte | 38 + .../src/lib/components/cal/FAQ.svelte | 27 + .../src/lib/components/cal/Footer.svelte | 47 + .../src/lib/components/cal/Hero.svelte | 70 + .../src/lib/components/cal/Navigation.svelte | 97 + .../lib/components/cal/PrimaryButton.svelte | 15 + .../template/src/lib/components/cal/index.ts | 15 + .../lib/components/cal/pages/Courses.svelte | 158 + .../src/lib/components/cal/pages/Home.svelte | 306 ++ .../lib/components/classic/Accordion.svelte | 53 + .../lib/components/classic/BlogCard.svelte | 18 + .../lib/components/classic/CourseCard.svelte | 131 + .../lib/components/classic/EmptyState.svelte | 25 + .../src/lib/components/classic/Footer.svelte | 69 + .../components/classic/InstructorsCard.svelte | 31 + .../lib/components/classic/Navigation.svelte | 99 + .../components/classic/PrimaryButton.svelte | 28 + .../components/classic/RatingComponent.svelte | 32 + .../components/classic/TestimonialCard.svelte | 30 + .../classroomio-course-img-template.jpg | Bin 0 -> 62873 bytes .../lib/components/classic/assets/favicon.png | Bin 0 -> 1571 bytes .../components/classic/assets/org-banner.png | Bin 0 -> 506458 bytes .../classic/assets/organization-empty.svg | 14 + .../lib/components/classic/assets/quote.svg | 3 + .../src/lib/components/classic/index.ts | 15 + .../components/classic/pages/Courses.svelte | 144 + .../lib/components/classic/pages/Home.svelte | 242 ++ .../src/template/src/lib/components/index.ts | 21 + .../lib/components/minimal/Accordion.svelte | 53 + .../lib/components/minimal/CourseCard.svelte | 56 + .../lib/components/minimal/EmptyState.svelte | 26 + .../src/lib/components/minimal/Footer.svelte | 43 + .../lib/components/minimal/Navigation.svelte | 95 + .../components/minimal/PrimaryButton.svelte | 28 + .../components/minimal/TestimonialCard.svelte | 28 + .../classroomio-course-img-template.jpg | Bin 0 -> 62873 bytes .../minimal/assets/expert-empty.svg | 81 + .../components/minimal/assets/logo-192.png | Bin 0 -> 2838 bytes .../components/minimal/assets/testimonial.svg | 13 + .../src/lib/components/minimal/index.ts | 15 + .../components/minimal/pages/Courses.svelte | 161 + .../lib/components/minimal/pages/Home.svelte | 195 ++ .../lib/components/posthog/CourseCard.svelte | 43 + .../lib/components/posthog/EmptyState.svelte | 38 + .../src/lib/components/posthog/FaqCard.svelte | 92 + .../src/lib/components/posthog/Footer.svelte | 52 + .../lib/components/posthog/Navigation.svelte | 110 + .../components/posthog/PrimaryButton.svelte | 33 + .../src/lib/components/posthog/index.ts | 15 + .../components/posthog/pages/Courses.svelte | 151 + .../lib/components/posthog/pages/Home.svelte | 179 + .../components/posthog/static/analytics.png | Bin 0 -> 95184 bytes .../lib/components/posthog/static/favicon.png | Bin 0 -> 1571 bytes .../static/fonts/Matter-TRIAL-Medium.ttf | Bin 0 -> 308788 bytes .../static/fonts/Matter-TRIAL-Regular.ttf | Bin 0 -> 308780 bytes .../static/fonts/Matter-TRIAL-SemiBold.ttf | Bin 0 -> 309536 bytes .../components/posthog/static/hogempty.svg | 14 + .../posthog/static/icons/FaqMark.svelte | 99 + .../components/posthog/static/logo-192.png | Bin 0 -> 2838 bytes .../lib/components/posthog/static/posthog.svg | 941 +++++ .../ui/_custom/SideBarExpandable.svelte | 33 + .../components/ui/_custom/Transition.svelte | 26 + .../lib/components/ui/button/button.svelte | 68 + .../src/lib/components/ui/button/index.ts | 17 + .../components/ui/checkbox/checkbox.svelte | 42 + .../src/lib/components/ui/checkbox/index.ts | 6 + .../src/lib/components/ui/folder/file.svelte | 31 + .../lib/components/ui/folder/folder.svelte | 76 + .../src/lib/components/ui/label/index.ts | 7 + .../src/lib/components/ui/label/label.svelte | 27 + .../src/lib/components/ui/skeleton/index.ts | 7 + .../components/ui/skeleton/skeleton.svelte | 16 + .../src/template/src/lib/data/pages.json | 444 +++ .../template/src/lib/data/posthog-pages.json | 418 +++ .../course-app/src/template/src/lib/index.ts | 1 + .../course-app/src/template/src/lib/utils.ts | 6 + .../src/lib/utils/constants/course.ts | 6 + .../template/src/lib/utils/constants/page.ts | 5 + .../template/src/lib/utils/helpers/course.ts | 106 + .../template/src/lib/utils/helpers/page.ts | 22 + .../src/lib/utils/page.server.test.ts | 47 + .../src/template/src/lib/utils/page.test.ts | 65 + .../template/src/lib/utils/stores/course.ts | 6 + .../template/src/lib/utils/stores/global.ts | 5 + .../template/src/lib/utils/stores/pages.ts | 13 + .../template/src/lib/utils/toggleMode.test.ts | 42 + .../src/template/src/lib/utils/toggleMode.ts | 9 + .../template/src/lib/utils/types/course.ts | 32 + .../src/template/src/lib/utils/types/page.ts | 13 + .../template/src/lib/utils/types/template.ts | 9 + .../src/template/src/routes/+layout.server.ts | 23 + .../src/template/src/routes/+layout.svelte | 53 + .../src/template/src/routes/+layout.ts | 1 + .../src/template/src/routes/+page.svelte | 5 + .../src/routes/api/course/[slug]/+server.ts | 15 + .../src/routes/api/courses/+server.ts | 14 + .../routes/course/[slug]/+layout.server.ts | 26 + .../src/routes/course/[slug]/+layout.svelte | 94 + .../src/routes/course/[slug]/+page.svelte | 1 + .../[slug]/[section]/[filename]/+page.svelte | 42 + .../[slug]/[section]/[filename]/+page.ts | 21 + .../src/routes/courses/+page.server.ts | 23 + .../template/src/routes/courses/+page.svelte | 7 + .../src/template/static/calcom-background.svg | 114 + .../template/static/calcom-banner-img.jpeg | Bin 0 -> 3593242 bytes .../classroomio-course-img-template.jpg | Bin 0 -> 62873 bytes .../src/template/static/expert-empty.svg | 81 + .../src/template/static/favicon.ico | Bin 0 -> 33310 bytes .../static/fonts/Matter-TRIAL-Medium.ttf | Bin 0 -> 308788 bytes .../static/fonts/Matter-TRIAL-Regular.ttf | Bin 0 -> 308780 bytes .../static/fonts/Matter-TRIAL-SemiBold.ttf | Bin 0 -> 309536 bytes .../course-app/src/template/static/logo.svg | 9 + .../src/template/static/org-banner.png | Bin 0 -> 506458 bytes .../src/template/static/posthog-logo.svg | 1 + .../course-app/src/template/static/quote.svg | 3 + .../course-app/src/template/svelte.config.js | 47 + .../src/template/tailwind.config.ts | 113 + .../src/template/tests/course.spec.ts | 109 + .../course-app/src/template/tsconfig.json | 20 + .../course-app/src/template/vite.config.ts | 32 + .../course-app/src/template/vitest.setup.ts | 54 + packages/course-app/src/webflow/.gitignore | 21 + packages/course-app/src/webflow/.npmrc | 1 + packages/course-app/src/webflow/README.md | 38 + .../course-app/src/webflow/components.json | 14 + .../course-app/src/webflow/package-lock.json | 3066 +++++++++++++++++ packages/course-app/src/webflow/package.json | 32 + .../course-app/src/webflow/postcss.config.js | 6 + packages/course-app/src/webflow/src/app.css | 78 + packages/course-app/src/webflow/src/app.d.ts | 13 + packages/course-app/src/webflow/src/app.html | 12 + .../src/lib/component/Accordion.svelte | 56 + .../src/lib/component/CardLoader.svelte | 28 + .../src/lib/component/CourseCard.svelte | 57 + .../webflow/src/lib/component/Courses.svelte | 60 + .../src/lib/component/EmptyState.svelte | 38 + .../src/webflow/src/lib/component/FAQ.svelte | 16 + .../webflow/src/lib/component/Footer.svelte | 44 + .../src/webflow/src/lib/component/Hero.svelte | 73 + .../src/lib/component/Icons/FaqMark.svelte | 104 + .../src/lib/component/Navigation.svelte | 135 + .../src/lib/component/PageLoader.svelte | 28 + .../lib/component/SideBarExpandable.svelte | 76 + .../src/lib/component/Testimonial.svelte | 16 + .../src/lib/component/TestimonialCard.svelte | 40 + .../src/webflow/src/lib/component/store.js | 10 + .../cardborder/CardAnimatedBorder.svelte | 28 + .../lib/components/magiccard/MagicCard.svelte | 77 + .../components/shinyborder/ShineBorder.svelte | 48 + .../lib/components/ui/button/button.svelte | 38 + .../src/lib/components/ui/button/index.ts | 49 + .../src/lib/components/ui/skeleton/index.ts | 7 + .../components/ui/skeleton/skeleton.svelte | 16 + .../Introduction-to-programming/metadata.json | 9 + .../sectionA/algorithms.md | 6 + .../sectionA/fundamentals-of-programming.md | 6 + .../sectionA/introduction.md | 23 + .../sectionA/metadata.json | 5 + .../sectionB/fundamentals-of-system-design.md | 6 + .../sectionB/introduction.md | 23 + .../sectionB/metadata.json | 5 + .../sectionB/system-architecture.md | 6 + .../sectionC/ai-convention.md | 6 + .../sectionC/ai-in-programming.md | 6 + .../sectionC/machine-learning.md | 23 + .../sectionC/metadata.json | 5 + .../Introduction-to-testing/metadata.json | 9 + .../section-One/intro-to-testing.md | 6 + .../section-One/metadata.json | 5 + .../section-One/testing-in-svelte.md | 6 + .../section-Two/intro-to-testing.md | 6 + .../section-Two/metadata.json | 5 + .../section-Two/testing-in-svelte.md | 6 + .../src/lib/courses/patterns/metadata.json | 9 + .../patterns/sectionA/design-for begginers.md | 6 + .../courses/patterns/sectionA/introduction.md | 23 + .../courses/patterns/sectionA/metadata.json | 5 + .../courses/patterns/sectionA/using-figma.md | 6 + .../courses/patterns/sectionB/introduction.md | 23 + .../courses/patterns/sectionB/metadata.json | 5 + .../patterns/sectionB/pattern designs.md | 6 + .../patterns/sectionB/patterns-and-systems.md | 6 + .../courses/patterns/sectionC/Introduction.md | 23 + .../patterns/sectionC/creating-trends.md | 6 + .../patterns/sectionC/design-that-trends.md | 6 + .../courses/patterns/sectionC/metadata.json | 5 + .../courses/uiux-fundamentals/metadata.json | 9 + .../sectionA/Introduction.md | 23 + .../uiux-fundamentals/sectionA/conclusion.md | 6 + .../sectionA/fundamentals-of-programming.md | 6 + .../uiux-fundamentals/sectionA/metadata.json | 5 + .../sectionB/Introduction.md | 23 + .../uiux-fundamentals/sectionB/conclusion.md | 6 + .../sectionB/fundamentals-of-programming.md | 6 + .../uiux-fundamentals/sectionB/metadata.json | 5 + .../sectionC/Introduction.md | 23 + .../uiux-fundamentals/sectionC/conclusion.md | 6 + .../sectionC/fundamentals-of-programming.md | 6 + .../uiux-fundamentals/sectionC/metadata.json | 5 + .../src/webflow/src/lib/data/home.json | 147 + .../src/webflow/src/lib/index.svelte | 28 + .../course-app/src/webflow/src/lib/index.ts | 1 + .../course-app/src/webflow/src/lib/utils.ts | 62 + .../src/webflow/src/lib/utils/toggleMode.ts | 9 + .../src/webflow/src/lib/utils/types.ts | 116 + .../src/webflow/src/routes/+layout.svelte | 16 + .../src/webflow/src/routes/+page.server.ts | 18 + .../src/webflow/src/routes/+page.svelte | 8 + .../webflow/src/routes/api/courses/+server.ts | 66 + .../[slug]/[section]/[filename]/+server.ts | 29 + .../src/routes/course/[slug]/+page.server.ts | 97 + .../src/routes/course/[slug]/+page.svelte | 170 + .../src/routes/courses/+page.server.ts | 19 + .../webflow/src/routes/courses/+page.svelte | 158 + .../classroomio-course-img-template.jpg | Bin 0 -> 62873 bytes .../src/webflow/static/expert-empty.svg | 81 + .../course-app/src/webflow/static/favicon.png | Bin 0 -> 1571 bytes .../src/webflow/static/logo-192.png | Bin 0 -> 2838 bytes .../src/webflow/static/org-banner.png | Bin 0 -> 506458 bytes .../course-app/src/webflow/static/quote.svg | 3 + .../course-app/src/webflow/svelte.config.js | 18 + .../course-app/src/webflow/tailwind.config.ts | 101 + packages/course-app/src/webflow/tsconfig.json | 19 + .../course-app/src/webflow/vite.config.ts | 6 + packages/course-app/templates.json | 18 + packages/course-app/tsconfig.json | 25 + .../course-app/utils/copyCoursesFolder.ts | 26 + packages/course-app/utils/copyFolder.ts | 32 + packages/course-app/utils/types.ts | 21 + packages/course-app/vite.config.ts | 18 + packages/svelte-ui/.eslintrc.js | 6 - packages/svelte-ui/components/button.svelte | 10 +- packages/svelte-ui/package.json | 30 +- pnpm-lock.yaml | 2521 ++++++++++++-- 343 files changed, 17993 insertions(+), 350 deletions(-) create mode 100644 .github/workflows/publish-course-app.yml delete mode 100644 apps/classroomio-com/static/hero-bg.svg delete mode 100644 apps/classroomio-com/static/tools-hero-bg.svg create mode 100644 apps/course-app/.gitignore create mode 100644 apps/course-app/.npmrc create mode 100644 apps/course-app/.prettierignore create mode 100644 apps/course-app/.prettierrc create mode 100644 apps/course-app/README.md create mode 100644 apps/course-app/components.json create mode 100644 apps/course-app/package.json create mode 100644 apps/course-app/postcss.config.js create mode 100644 apps/course-app/src/app.css create mode 100644 apps/course-app/src/app.d.ts create mode 100644 apps/course-app/src/app.html create mode 100644 apps/course-app/src/demo.spec.ts create mode 100644 apps/course-app/src/lib/components/animation/blurfade/blurfade.svelte create mode 100644 apps/course-app/src/lib/components/animation/blurfade/index.ts create mode 100644 apps/course-app/src/lib/components/animation/blurin/blurin.svelte create mode 100644 apps/course-app/src/lib/components/animation/blurin/index.ts create mode 100644 apps/course-app/src/lib/components/animation/card/body.svelte create mode 100644 apps/course-app/src/lib/components/animation/card/container.svelte create mode 100644 apps/course-app/src/lib/components/animation/card/ellipses.svelte create mode 100644 apps/course-app/src/lib/components/animation/card/index.ts create mode 100644 apps/course-app/src/lib/components/animation/gradual-spacing/gradual-spacing.svelte create mode 100644 apps/course-app/src/lib/components/animation/gradual-spacing/index.ts create mode 100644 apps/course-app/src/lib/components/animation/magic-card/index.ts create mode 100644 apps/course-app/src/lib/components/animation/magic-card/magic-card.svelte create mode 100644 apps/course-app/src/lib/components/animation/meteors/index.ts create mode 100644 apps/course-app/src/lib/components/animation/meteors/meteors.svelte create mode 100644 apps/course-app/src/lib/components/animation/shimmerbutton/index.ts create mode 100644 apps/course-app/src/lib/components/animation/shimmerbutton/shimmerbutton.svelte create mode 100644 apps/course-app/src/lib/components/animation/shinny-text/index.ts create mode 100644 apps/course-app/src/lib/components/animation/shinny-text/shinny-text.svelte create mode 100644 apps/course-app/src/lib/components/animation/square-card/body.svelte create mode 100644 apps/course-app/src/lib/components/animation/square-card/icon.svelte create mode 100644 apps/course-app/src/lib/components/animation/square-card/index.ts create mode 100644 apps/course-app/src/lib/components/navigation/index.ts create mode 100644 apps/course-app/src/lib/components/navigation/navigation.svelte create mode 100644 apps/course-app/src/lib/components/template-card/index.ts create mode 100644 apps/course-app/src/lib/components/template-card/template-card.svelte create mode 100644 apps/course-app/src/lib/components/ui/button/button.svelte create mode 100644 apps/course-app/src/lib/components/ui/button/index.ts create mode 100644 apps/course-app/src/lib/components/ui/separator/index.ts create mode 100644 apps/course-app/src/lib/components/ui/separator/separator.svelte create mode 100644 apps/course-app/src/lib/components/ui/sonner/index.ts create mode 100644 apps/course-app/src/lib/components/ui/sonner/sonner.svelte create mode 100644 apps/course-app/src/lib/index.ts create mode 100644 apps/course-app/src/lib/utils.ts create mode 100644 apps/course-app/src/routes/+layout.svelte create mode 100644 apps/course-app/src/routes/+page.svelte create mode 100644 apps/course-app/static/apple-touch-icon.png create mode 100644 apps/course-app/static/favicon.ico create mode 100644 apps/course-app/static/favicon.png create mode 100644 apps/course-app/static/logo-16.png create mode 100644 apps/course-app/static/logo-192.png create mode 100644 apps/course-app/static/logo-32.png create mode 100644 apps/course-app/static/logo-512.png create mode 100644 apps/course-app/static/site.webmanifest create mode 100644 apps/course-app/svelte.config.js create mode 100644 apps/course-app/tailwind.config.ts create mode 100644 apps/course-app/tsconfig.json create mode 100644 apps/course-app/vite.config.ts create mode 100644 apps/dashboard/Dockerfile.prod create mode 100644 packages/course-app/.gitignore create mode 100644 packages/course-app/README.md create mode 100644 packages/course-app/bin/create-template.ts create mode 100644 packages/course-app/lib/scaffoldTemplate.ts create mode 100644 packages/course-app/package.json create mode 100644 packages/course-app/scripts/postbuild.js create mode 100644 packages/course-app/src/template/.gitignore create mode 100644 packages/course-app/src/template/README.md create mode 100644 packages/course-app/src/template/components.json create mode 100644 packages/course-app/src/template/package.json create mode 100644 packages/course-app/src/template/playwright.config.ts create mode 100644 packages/course-app/src/template/postcss.config.js create mode 100644 packages/course-app/src/template/src/app.css create mode 100644 packages/course-app/src/template/src/app.d.ts create mode 100644 packages/course-app/src/template/src/app.html create mode 100644 packages/course-app/src/template/src/courses/time-management-101/1-fundamentals/1-introduction.md create mode 100644 packages/course-app/src/template/src/courses/time-management-101/1-fundamentals/2-time-management-basics.md create mode 100644 packages/course-app/src/template/src/courses/time-management-101/1-fundamentals/metadata.json create mode 100644 packages/course-app/src/template/src/courses/time-management-101/2-priorities/1-prioritization-methods.md create mode 100644 packages/course-app/src/template/src/courses/time-management-101/2-priorities/metadata.json create mode 100644 packages/course-app/src/template/src/courses/time-management-101/3-tools/1-scheduling-tools.md create mode 100644 packages/course-app/src/template/src/courses/time-management-101/3-tools/metadata.json create mode 100644 packages/course-app/src/template/src/courses/time-management-101/4-calcom/1-cal-com-mastery.md create mode 100644 packages/course-app/src/template/src/courses/time-management-101/4-calcom/2-maintaining-balance.md create mode 100644 packages/course-app/src/template/src/courses/time-management-101/4-calcom/metadata.json create mode 100644 packages/course-app/src/template/src/courses/time-management-101/metadata.json create mode 100644 packages/course-app/src/template/src/courses/time-management-102/1-fundamentals/1-introduction.md create mode 100644 packages/course-app/src/template/src/courses/time-management-102/1-fundamentals/2-time-management-basics.md create mode 100644 packages/course-app/src/template/src/courses/time-management-102/1-fundamentals/metadata.json create mode 100644 packages/course-app/src/template/src/courses/time-management-102/2-priorities/1-prioritization-methods.md create mode 100644 packages/course-app/src/template/src/courses/time-management-102/2-priorities/metadata.json create mode 100644 packages/course-app/src/template/src/courses/time-management-102/3-tools/1-scheduling-tools.md create mode 100644 packages/course-app/src/template/src/courses/time-management-102/3-tools/metadata.json create mode 100644 packages/course-app/src/template/src/courses/time-management-102/4-calcom/1-cal-com-mastery.md create mode 100644 packages/course-app/src/template/src/courses/time-management-102/4-calcom/2-maintaining-balance.md create mode 100644 packages/course-app/src/template/src/courses/time-management-102/4-calcom/metadata.json create mode 100644 packages/course-app/src/template/src/courses/time-management-102/metadata.json create mode 100644 packages/course-app/src/template/src/lib/components/cal/About.svelte create mode 100644 packages/course-app/src/template/src/lib/components/cal/Accordion.svelte create mode 100644 packages/course-app/src/template/src/lib/components/cal/CourseCard.svelte create mode 100644 packages/course-app/src/template/src/lib/components/cal/EmptyState.svelte create mode 100644 packages/course-app/src/template/src/lib/components/cal/FAQ.svelte create mode 100644 packages/course-app/src/template/src/lib/components/cal/Footer.svelte create mode 100644 packages/course-app/src/template/src/lib/components/cal/Hero.svelte create mode 100644 packages/course-app/src/template/src/lib/components/cal/Navigation.svelte create mode 100644 packages/course-app/src/template/src/lib/components/cal/PrimaryButton.svelte create mode 100644 packages/course-app/src/template/src/lib/components/cal/index.ts create mode 100644 packages/course-app/src/template/src/lib/components/cal/pages/Courses.svelte create mode 100644 packages/course-app/src/template/src/lib/components/cal/pages/Home.svelte create mode 100644 packages/course-app/src/template/src/lib/components/classic/Accordion.svelte create mode 100644 packages/course-app/src/template/src/lib/components/classic/BlogCard.svelte create mode 100644 packages/course-app/src/template/src/lib/components/classic/CourseCard.svelte create mode 100644 packages/course-app/src/template/src/lib/components/classic/EmptyState.svelte create mode 100644 packages/course-app/src/template/src/lib/components/classic/Footer.svelte create mode 100644 packages/course-app/src/template/src/lib/components/classic/InstructorsCard.svelte create mode 100644 packages/course-app/src/template/src/lib/components/classic/Navigation.svelte create mode 100644 packages/course-app/src/template/src/lib/components/classic/PrimaryButton.svelte create mode 100644 packages/course-app/src/template/src/lib/components/classic/RatingComponent.svelte create mode 100644 packages/course-app/src/template/src/lib/components/classic/TestimonialCard.svelte create mode 100644 packages/course-app/src/template/src/lib/components/classic/assets/classroomio-course-img-template.jpg create mode 100644 packages/course-app/src/template/src/lib/components/classic/assets/favicon.png create mode 100644 packages/course-app/src/template/src/lib/components/classic/assets/org-banner.png create mode 100644 packages/course-app/src/template/src/lib/components/classic/assets/organization-empty.svg create mode 100644 packages/course-app/src/template/src/lib/components/classic/assets/quote.svg create mode 100644 packages/course-app/src/template/src/lib/components/classic/index.ts create mode 100644 packages/course-app/src/template/src/lib/components/classic/pages/Courses.svelte create mode 100644 packages/course-app/src/template/src/lib/components/classic/pages/Home.svelte create mode 100644 packages/course-app/src/template/src/lib/components/index.ts create mode 100644 packages/course-app/src/template/src/lib/components/minimal/Accordion.svelte create mode 100644 packages/course-app/src/template/src/lib/components/minimal/CourseCard.svelte create mode 100644 packages/course-app/src/template/src/lib/components/minimal/EmptyState.svelte create mode 100644 packages/course-app/src/template/src/lib/components/minimal/Footer.svelte create mode 100644 packages/course-app/src/template/src/lib/components/minimal/Navigation.svelte create mode 100644 packages/course-app/src/template/src/lib/components/minimal/PrimaryButton.svelte create mode 100644 packages/course-app/src/template/src/lib/components/minimal/TestimonialCard.svelte create mode 100644 packages/course-app/src/template/src/lib/components/minimal/assets/classroomio-course-img-template.jpg create mode 100644 packages/course-app/src/template/src/lib/components/minimal/assets/expert-empty.svg create mode 100644 packages/course-app/src/template/src/lib/components/minimal/assets/logo-192.png create mode 100644 packages/course-app/src/template/src/lib/components/minimal/assets/testimonial.svg create mode 100644 packages/course-app/src/template/src/lib/components/minimal/index.ts create mode 100644 packages/course-app/src/template/src/lib/components/minimal/pages/Courses.svelte create mode 100644 packages/course-app/src/template/src/lib/components/minimal/pages/Home.svelte create mode 100644 packages/course-app/src/template/src/lib/components/posthog/CourseCard.svelte create mode 100644 packages/course-app/src/template/src/lib/components/posthog/EmptyState.svelte create mode 100644 packages/course-app/src/template/src/lib/components/posthog/FaqCard.svelte create mode 100644 packages/course-app/src/template/src/lib/components/posthog/Footer.svelte create mode 100644 packages/course-app/src/template/src/lib/components/posthog/Navigation.svelte create mode 100644 packages/course-app/src/template/src/lib/components/posthog/PrimaryButton.svelte create mode 100644 packages/course-app/src/template/src/lib/components/posthog/index.ts create mode 100644 packages/course-app/src/template/src/lib/components/posthog/pages/Courses.svelte create mode 100644 packages/course-app/src/template/src/lib/components/posthog/pages/Home.svelte create mode 100644 packages/course-app/src/template/src/lib/components/posthog/static/analytics.png create mode 100644 packages/course-app/src/template/src/lib/components/posthog/static/favicon.png create mode 100644 packages/course-app/src/template/src/lib/components/posthog/static/fonts/Matter-TRIAL-Medium.ttf create mode 100644 packages/course-app/src/template/src/lib/components/posthog/static/fonts/Matter-TRIAL-Regular.ttf create mode 100644 packages/course-app/src/template/src/lib/components/posthog/static/fonts/Matter-TRIAL-SemiBold.ttf create mode 100644 packages/course-app/src/template/src/lib/components/posthog/static/hogempty.svg create mode 100644 packages/course-app/src/template/src/lib/components/posthog/static/icons/FaqMark.svelte create mode 100644 packages/course-app/src/template/src/lib/components/posthog/static/logo-192.png create mode 100644 packages/course-app/src/template/src/lib/components/posthog/static/posthog.svg create mode 100644 packages/course-app/src/template/src/lib/components/ui/_custom/SideBarExpandable.svelte create mode 100644 packages/course-app/src/template/src/lib/components/ui/_custom/Transition.svelte create mode 100644 packages/course-app/src/template/src/lib/components/ui/button/button.svelte create mode 100644 packages/course-app/src/template/src/lib/components/ui/button/index.ts create mode 100644 packages/course-app/src/template/src/lib/components/ui/checkbox/checkbox.svelte create mode 100644 packages/course-app/src/template/src/lib/components/ui/checkbox/index.ts create mode 100644 packages/course-app/src/template/src/lib/components/ui/folder/file.svelte create mode 100644 packages/course-app/src/template/src/lib/components/ui/folder/folder.svelte create mode 100644 packages/course-app/src/template/src/lib/components/ui/label/index.ts create mode 100644 packages/course-app/src/template/src/lib/components/ui/label/label.svelte create mode 100644 packages/course-app/src/template/src/lib/components/ui/skeleton/index.ts create mode 100644 packages/course-app/src/template/src/lib/components/ui/skeleton/skeleton.svelte create mode 100644 packages/course-app/src/template/src/lib/data/pages.json create mode 100644 packages/course-app/src/template/src/lib/data/posthog-pages.json create mode 100644 packages/course-app/src/template/src/lib/index.ts create mode 100644 packages/course-app/src/template/src/lib/utils.ts create mode 100644 packages/course-app/src/template/src/lib/utils/constants/course.ts create mode 100644 packages/course-app/src/template/src/lib/utils/constants/page.ts create mode 100644 packages/course-app/src/template/src/lib/utils/helpers/course.ts create mode 100644 packages/course-app/src/template/src/lib/utils/helpers/page.ts create mode 100644 packages/course-app/src/template/src/lib/utils/page.server.test.ts create mode 100644 packages/course-app/src/template/src/lib/utils/page.test.ts create mode 100644 packages/course-app/src/template/src/lib/utils/stores/course.ts create mode 100644 packages/course-app/src/template/src/lib/utils/stores/global.ts create mode 100644 packages/course-app/src/template/src/lib/utils/stores/pages.ts create mode 100644 packages/course-app/src/template/src/lib/utils/toggleMode.test.ts create mode 100644 packages/course-app/src/template/src/lib/utils/toggleMode.ts create mode 100644 packages/course-app/src/template/src/lib/utils/types/course.ts create mode 100644 packages/course-app/src/template/src/lib/utils/types/page.ts create mode 100644 packages/course-app/src/template/src/lib/utils/types/template.ts create mode 100644 packages/course-app/src/template/src/routes/+layout.server.ts create mode 100644 packages/course-app/src/template/src/routes/+layout.svelte create mode 100644 packages/course-app/src/template/src/routes/+layout.ts create mode 100644 packages/course-app/src/template/src/routes/+page.svelte create mode 100644 packages/course-app/src/template/src/routes/api/course/[slug]/+server.ts create mode 100644 packages/course-app/src/template/src/routes/api/courses/+server.ts create mode 100644 packages/course-app/src/template/src/routes/course/[slug]/+layout.server.ts create mode 100644 packages/course-app/src/template/src/routes/course/[slug]/+layout.svelte create mode 100644 packages/course-app/src/template/src/routes/course/[slug]/+page.svelte create mode 100644 packages/course-app/src/template/src/routes/course/[slug]/[section]/[filename]/+page.svelte create mode 100644 packages/course-app/src/template/src/routes/course/[slug]/[section]/[filename]/+page.ts create mode 100644 packages/course-app/src/template/src/routes/courses/+page.server.ts create mode 100644 packages/course-app/src/template/src/routes/courses/+page.svelte create mode 100644 packages/course-app/src/template/static/calcom-background.svg create mode 100644 packages/course-app/src/template/static/calcom-banner-img.jpeg create mode 100644 packages/course-app/src/template/static/classroomio-course-img-template.jpg create mode 100644 packages/course-app/src/template/static/expert-empty.svg create mode 100644 packages/course-app/src/template/static/favicon.ico create mode 100644 packages/course-app/src/template/static/fonts/Matter-TRIAL-Medium.ttf create mode 100644 packages/course-app/src/template/static/fonts/Matter-TRIAL-Regular.ttf create mode 100644 packages/course-app/src/template/static/fonts/Matter-TRIAL-SemiBold.ttf create mode 100644 packages/course-app/src/template/static/logo.svg create mode 100644 packages/course-app/src/template/static/org-banner.png create mode 100644 packages/course-app/src/template/static/posthog-logo.svg create mode 100644 packages/course-app/src/template/static/quote.svg create mode 100644 packages/course-app/src/template/svelte.config.js create mode 100644 packages/course-app/src/template/tailwind.config.ts create mode 100644 packages/course-app/src/template/tests/course.spec.ts create mode 100644 packages/course-app/src/template/tsconfig.json create mode 100644 packages/course-app/src/template/vite.config.ts create mode 100644 packages/course-app/src/template/vitest.setup.ts create mode 100644 packages/course-app/src/webflow/.gitignore create mode 100644 packages/course-app/src/webflow/.npmrc create mode 100644 packages/course-app/src/webflow/README.md create mode 100644 packages/course-app/src/webflow/components.json create mode 100644 packages/course-app/src/webflow/package-lock.json create mode 100644 packages/course-app/src/webflow/package.json create mode 100644 packages/course-app/src/webflow/postcss.config.js create mode 100644 packages/course-app/src/webflow/src/app.css create mode 100644 packages/course-app/src/webflow/src/app.d.ts create mode 100644 packages/course-app/src/webflow/src/app.html create mode 100644 packages/course-app/src/webflow/src/lib/component/Accordion.svelte create mode 100644 packages/course-app/src/webflow/src/lib/component/CardLoader.svelte create mode 100644 packages/course-app/src/webflow/src/lib/component/CourseCard.svelte create mode 100644 packages/course-app/src/webflow/src/lib/component/Courses.svelte create mode 100644 packages/course-app/src/webflow/src/lib/component/EmptyState.svelte create mode 100644 packages/course-app/src/webflow/src/lib/component/FAQ.svelte create mode 100644 packages/course-app/src/webflow/src/lib/component/Footer.svelte create mode 100644 packages/course-app/src/webflow/src/lib/component/Hero.svelte create mode 100644 packages/course-app/src/webflow/src/lib/component/Icons/FaqMark.svelte create mode 100644 packages/course-app/src/webflow/src/lib/component/Navigation.svelte create mode 100644 packages/course-app/src/webflow/src/lib/component/PageLoader.svelte create mode 100644 packages/course-app/src/webflow/src/lib/component/SideBarExpandable.svelte create mode 100644 packages/course-app/src/webflow/src/lib/component/Testimonial.svelte create mode 100644 packages/course-app/src/webflow/src/lib/component/TestimonialCard.svelte create mode 100644 packages/course-app/src/webflow/src/lib/component/store.js create mode 100644 packages/course-app/src/webflow/src/lib/components/cardborder/CardAnimatedBorder.svelte create mode 100644 packages/course-app/src/webflow/src/lib/components/magiccard/MagicCard.svelte create mode 100644 packages/course-app/src/webflow/src/lib/components/shinyborder/ShineBorder.svelte create mode 100644 packages/course-app/src/webflow/src/lib/components/ui/button/button.svelte create mode 100644 packages/course-app/src/webflow/src/lib/components/ui/button/index.ts create mode 100644 packages/course-app/src/webflow/src/lib/components/ui/skeleton/index.ts create mode 100644 packages/course-app/src/webflow/src/lib/components/ui/skeleton/skeleton.svelte create mode 100644 packages/course-app/src/webflow/src/lib/courses/Introduction-to-programming/metadata.json create mode 100644 packages/course-app/src/webflow/src/lib/courses/Introduction-to-programming/sectionA/algorithms.md create mode 100644 packages/course-app/src/webflow/src/lib/courses/Introduction-to-programming/sectionA/fundamentals-of-programming.md create mode 100644 packages/course-app/src/webflow/src/lib/courses/Introduction-to-programming/sectionA/introduction.md create mode 100644 packages/course-app/src/webflow/src/lib/courses/Introduction-to-programming/sectionA/metadata.json create mode 100644 packages/course-app/src/webflow/src/lib/courses/Introduction-to-programming/sectionB/fundamentals-of-system-design.md create mode 100644 packages/course-app/src/webflow/src/lib/courses/Introduction-to-programming/sectionB/introduction.md create mode 100644 packages/course-app/src/webflow/src/lib/courses/Introduction-to-programming/sectionB/metadata.json create mode 100644 packages/course-app/src/webflow/src/lib/courses/Introduction-to-programming/sectionB/system-architecture.md create mode 100644 packages/course-app/src/webflow/src/lib/courses/Introduction-to-programming/sectionC/ai-convention.md create mode 100644 packages/course-app/src/webflow/src/lib/courses/Introduction-to-programming/sectionC/ai-in-programming.md create mode 100644 packages/course-app/src/webflow/src/lib/courses/Introduction-to-programming/sectionC/machine-learning.md create mode 100644 packages/course-app/src/webflow/src/lib/courses/Introduction-to-programming/sectionC/metadata.json create mode 100644 packages/course-app/src/webflow/src/lib/courses/Introduction-to-testing/metadata.json create mode 100644 packages/course-app/src/webflow/src/lib/courses/Introduction-to-testing/section-One/intro-to-testing.md create mode 100644 packages/course-app/src/webflow/src/lib/courses/Introduction-to-testing/section-One/metadata.json create mode 100644 packages/course-app/src/webflow/src/lib/courses/Introduction-to-testing/section-One/testing-in-svelte.md create mode 100644 packages/course-app/src/webflow/src/lib/courses/Introduction-to-testing/section-Two/intro-to-testing.md create mode 100644 packages/course-app/src/webflow/src/lib/courses/Introduction-to-testing/section-Two/metadata.json create mode 100644 packages/course-app/src/webflow/src/lib/courses/Introduction-to-testing/section-Two/testing-in-svelte.md create mode 100644 packages/course-app/src/webflow/src/lib/courses/patterns/metadata.json create mode 100644 packages/course-app/src/webflow/src/lib/courses/patterns/sectionA/design-for begginers.md create mode 100644 packages/course-app/src/webflow/src/lib/courses/patterns/sectionA/introduction.md create mode 100644 packages/course-app/src/webflow/src/lib/courses/patterns/sectionA/metadata.json create mode 100644 packages/course-app/src/webflow/src/lib/courses/patterns/sectionA/using-figma.md create mode 100644 packages/course-app/src/webflow/src/lib/courses/patterns/sectionB/introduction.md create mode 100644 packages/course-app/src/webflow/src/lib/courses/patterns/sectionB/metadata.json create mode 100644 packages/course-app/src/webflow/src/lib/courses/patterns/sectionB/pattern designs.md create mode 100644 packages/course-app/src/webflow/src/lib/courses/patterns/sectionB/patterns-and-systems.md create mode 100644 packages/course-app/src/webflow/src/lib/courses/patterns/sectionC/Introduction.md create mode 100644 packages/course-app/src/webflow/src/lib/courses/patterns/sectionC/creating-trends.md create mode 100644 packages/course-app/src/webflow/src/lib/courses/patterns/sectionC/design-that-trends.md create mode 100644 packages/course-app/src/webflow/src/lib/courses/patterns/sectionC/metadata.json create mode 100644 packages/course-app/src/webflow/src/lib/courses/uiux-fundamentals/metadata.json create mode 100644 packages/course-app/src/webflow/src/lib/courses/uiux-fundamentals/sectionA/Introduction.md create mode 100644 packages/course-app/src/webflow/src/lib/courses/uiux-fundamentals/sectionA/conclusion.md create mode 100644 packages/course-app/src/webflow/src/lib/courses/uiux-fundamentals/sectionA/fundamentals-of-programming.md create mode 100644 packages/course-app/src/webflow/src/lib/courses/uiux-fundamentals/sectionA/metadata.json create mode 100644 packages/course-app/src/webflow/src/lib/courses/uiux-fundamentals/sectionB/Introduction.md create mode 100644 packages/course-app/src/webflow/src/lib/courses/uiux-fundamentals/sectionB/conclusion.md create mode 100644 packages/course-app/src/webflow/src/lib/courses/uiux-fundamentals/sectionB/fundamentals-of-programming.md create mode 100644 packages/course-app/src/webflow/src/lib/courses/uiux-fundamentals/sectionB/metadata.json create mode 100644 packages/course-app/src/webflow/src/lib/courses/uiux-fundamentals/sectionC/Introduction.md create mode 100644 packages/course-app/src/webflow/src/lib/courses/uiux-fundamentals/sectionC/conclusion.md create mode 100644 packages/course-app/src/webflow/src/lib/courses/uiux-fundamentals/sectionC/fundamentals-of-programming.md create mode 100644 packages/course-app/src/webflow/src/lib/courses/uiux-fundamentals/sectionC/metadata.json create mode 100644 packages/course-app/src/webflow/src/lib/data/home.json create mode 100644 packages/course-app/src/webflow/src/lib/index.svelte create mode 100644 packages/course-app/src/webflow/src/lib/index.ts create mode 100644 packages/course-app/src/webflow/src/lib/utils.ts create mode 100644 packages/course-app/src/webflow/src/lib/utils/toggleMode.ts create mode 100644 packages/course-app/src/webflow/src/lib/utils/types.ts create mode 100644 packages/course-app/src/webflow/src/routes/+layout.svelte create mode 100644 packages/course-app/src/webflow/src/routes/+page.server.ts create mode 100644 packages/course-app/src/webflow/src/routes/+page.svelte create mode 100644 packages/course-app/src/webflow/src/routes/api/courses/+server.ts create mode 100644 packages/course-app/src/webflow/src/routes/api/lesson/[slug]/[section]/[filename]/+server.ts create mode 100644 packages/course-app/src/webflow/src/routes/course/[slug]/+page.server.ts create mode 100644 packages/course-app/src/webflow/src/routes/course/[slug]/+page.svelte create mode 100644 packages/course-app/src/webflow/src/routes/courses/+page.server.ts create mode 100644 packages/course-app/src/webflow/src/routes/courses/+page.svelte create mode 100644 packages/course-app/src/webflow/static/classroomio-course-img-template.jpg create mode 100644 packages/course-app/src/webflow/static/expert-empty.svg create mode 100644 packages/course-app/src/webflow/static/favicon.png create mode 100644 packages/course-app/src/webflow/static/logo-192.png create mode 100644 packages/course-app/src/webflow/static/org-banner.png create mode 100644 packages/course-app/src/webflow/static/quote.svg create mode 100644 packages/course-app/src/webflow/svelte.config.js create mode 100644 packages/course-app/src/webflow/tailwind.config.ts create mode 100644 packages/course-app/src/webflow/tsconfig.json create mode 100644 packages/course-app/src/webflow/vite.config.ts create mode 100644 packages/course-app/templates.json create mode 100644 packages/course-app/tsconfig.json create mode 100644 packages/course-app/utils/copyCoursesFolder.ts create mode 100644 packages/course-app/utils/copyFolder.ts create mode 100644 packages/course-app/utils/types.ts create mode 100644 packages/course-app/vite.config.ts delete mode 100644 packages/svelte-ui/.eslintrc.js diff --git a/.github/workflows/publish-course-app.yml b/.github/workflows/publish-course-app.yml new file mode 100644 index 00000000..bbacc767 --- /dev/null +++ b/.github/workflows/publish-course-app.yml @@ -0,0 +1,26 @@ +name: Publish to NPM +on: + release: + types: [created] +jobs: + build: + runs-on: ubuntu-latest + permissions: + packages: write + contents: read + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 20 + registry-url: 'https://registry.npmjs.org' + + - uses: pnpm/action-setup@v4 + + - name: Install dependencies & publish + working-directory: packages/course-app + run: | + pnpm i + pnpm publish --no-git-checks + env: + NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} diff --git a/.nvmrc b/.nvmrc index 8ddbc0c6..7950a445 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -v18.16.0 +v18.17.0 diff --git a/.prettierrc b/.prettierrc index 73195ab7..16b3fd86 100644 --- a/.prettierrc +++ b/.prettierrc @@ -3,11 +3,12 @@ "singleQuote": true, "trailingComma": "none", "printWidth": 100, + "plugins": ["prettier-plugin-svelte", "prettier-plugin-tailwindcss"], "overrides": [ { - "files": ["*.svelte"], + "files": "*.svelte", "options": { - "svelteBracketNewLine": true + "parser": "svelte" } } ] diff --git a/apps/classroomio-com/package.json b/apps/classroomio-com/package.json index 1e34f058..6a23eabd 100644 --- a/apps/classroomio-com/package.json +++ b/apps/classroomio-com/package.json @@ -26,6 +26,9 @@ "vite": "^5.0.0" }, "type": "module", + "engines": { + "node": "^18.17.0" + }, "dependencies": { "html-to-image": "^1.11.11", "just-extend": "^6.2.0", diff --git a/apps/classroomio-com/static/hero-bg.svg b/apps/classroomio-com/static/hero-bg.svg deleted file mode 100644 index 4fa4c617..00000000 --- a/apps/classroomio-com/static/hero-bg.svg +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/apps/classroomio-com/static/tools-hero-bg.svg b/apps/classroomio-com/static/tools-hero-bg.svg deleted file mode 100644 index 6d9cd38e..00000000 --- a/apps/classroomio-com/static/tools-hero-bg.svg +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/apps/course-app/.gitignore b/apps/course-app/.gitignore new file mode 100644 index 00000000..3b462cb0 --- /dev/null +++ b/apps/course-app/.gitignore @@ -0,0 +1,23 @@ +node_modules + +# Output +.output +.vercel +.netlify +.wrangler +/.svelte-kit +/build + +# OS +.DS_Store +Thumbs.db + +# Env +.env +.env.* +!.env.example +!.env.test + +# Vite +vite.config.js.timestamp-* +vite.config.ts.timestamp-* diff --git a/apps/course-app/.npmrc b/apps/course-app/.npmrc new file mode 100644 index 00000000..b6f27f13 --- /dev/null +++ b/apps/course-app/.npmrc @@ -0,0 +1 @@ +engine-strict=true diff --git a/apps/course-app/.prettierignore b/apps/course-app/.prettierignore new file mode 100644 index 00000000..ab78a95d --- /dev/null +++ b/apps/course-app/.prettierignore @@ -0,0 +1,4 @@ +# Package Managers +package-lock.json +pnpm-lock.yaml +yarn.lock diff --git a/apps/course-app/.prettierrc b/apps/course-app/.prettierrc new file mode 100644 index 00000000..abaa84f9 --- /dev/null +++ b/apps/course-app/.prettierrc @@ -0,0 +1,15 @@ +{ + "useTabs": false, + "singleQuote": true, + "trailingComma": "none", + "printWidth": 100, + "plugins": ["prettier-plugin-svelte", "prettier-plugin-tailwindcss"], + "overrides": [ + { + "files": "*.svelte", + "options": { + "parser": "svelte" + } + } + ] +} diff --git a/apps/course-app/README.md b/apps/course-app/README.md new file mode 100644 index 00000000..d97d5fa1 --- /dev/null +++ b/apps/course-app/README.md @@ -0,0 +1,17 @@ +# Course App + +Create a course site for your Product. With our prebuilt templates, you can create a fully functional course site in minutes. + +## Tech Stack + +- SvelteKit +- TailwindCSS +- Mdx - Courses are written in markdown + +## How to use the package + +```bash +pnpm dlx @cio/course-app mysaas-university +``` + +This will create a folder called `mysaas-university` with a fully functional course site. diff --git a/apps/course-app/components.json b/apps/course-app/components.json new file mode 100644 index 00000000..b2c229a7 --- /dev/null +++ b/apps/course-app/components.json @@ -0,0 +1,14 @@ +{ + "$schema": "https://shadcn-svelte.com/schema.json", + "style": "new-york", + "tailwind": { + "config": "tailwind.config.ts", + "css": "src/app.css", + "baseColor": "zinc" + }, + "aliases": { + "components": "$lib/components", + "utils": "$lib/utils" + }, + "typescript": true +} \ No newline at end of file diff --git a/apps/course-app/package.json b/apps/course-app/package.json new file mode 100644 index 00000000..bc39628e --- /dev/null +++ b/apps/course-app/package.json @@ -0,0 +1,46 @@ +{ + "name": "course-app", + "private": true, + "version": "0.0.1", + "type": "module", + "scripts": { + "dev": "vite dev", + "build": "vite build", + "preview": "vite preview", + "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", + "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", + "format": "prettier --write .", + "lint": "prettier --check .", + "test:unit": "vitest", + "test": "npm run test:unit -- --run" + }, + "devDependencies": { + "@sveltejs/adapter-auto": "^3.0.0", + "@sveltejs/kit": "^2.9.0", + "@sveltejs/vite-plugin-svelte": "^5.0.0", + "autoprefixer": "^10.4.20", + "bits-ui": "^0.21.16", + "clsx": "^2.1.1", + "mode-watcher": "^0.5.0", + "prettier": "^3.3.2", + "prettier-plugin-svelte": "^3.2.6", + "prettier-plugin-tailwindcss": "^0.6.5", + "svelte": "^5.0.0", + "svelte-check": "^4.0.0", + "svelte-sonner": "^0.3.28", + "tailwind-merge": "^2.5.5", + "tailwind-variants": "^0.3.0", + "tailwindcss": "^3.4.9", + "typescript": "^5.0.0", + "vite": "^6.0.0", + "vitest": "^2.0.4" + }, + "dependencies": { + "@tailwindcss/container-queries": "^0.1.1", + "@tailwindcss/forms": "^0.5.9", + "@tailwindcss/typography": "^0.5.15", + "lucide-svelte": "^0.468.0", + "svelte-inview": "^4.0.4", + "svelte-motion": "^0.12.2" + } +} diff --git a/apps/course-app/postcss.config.js b/apps/course-app/postcss.config.js new file mode 100644 index 00000000..0f772168 --- /dev/null +++ b/apps/course-app/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {} + } +}; diff --git a/apps/course-app/src/app.css b/apps/course-app/src/app.css new file mode 100644 index 00000000..6662813b --- /dev/null +++ b/apps/course-app/src/app.css @@ -0,0 +1,78 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer base { + :root { + --background: 0 0% 100%; + --foreground: 240 10% 3.9%; + + --muted: 240 4.8% 95.9%; + --muted-foreground: 240 3.8% 46.1%; + + --popover: 0 0% 100%; + --popover-foreground: 240 10% 3.9%; + + --card: 0 0% 100%; + --card-foreground: 240 10% 3.9%; + + --border: 240 5.9% 90%; + --input: 240 5.9% 90%; + + --primary: 240 5.9% 10%; + --primary-foreground: 0 0% 98%; + + --secondary: 240 4.8% 95.9%; + --secondary-foreground: 240 5.9% 10%; + + --accent: 240 4.8% 95.9%; + --accent-foreground: 240 5.9% 10%; + + --destructive: 0 72.2% 50.6%; + --destructive-foreground: 0 0% 98%; + + --ring: 240 10% 3.9%; + + --radius: 0.5rem; + } + + .dark { + --background: 240 10% 3.9%; + --foreground: 0 0% 98%; + + --muted: 240 3.7% 15.9%; + --muted-foreground: 240 5% 64.9%; + + --popover: 240 10% 3.9%; + --popover-foreground: 0 0% 98%; + + --card: 240 10% 3.9%; + --card-foreground: 0 0% 98%; + + --border: 240 3.7% 15.9%; + --input: 240 3.7% 15.9%; + + --primary: 0 0% 98%; + --primary-foreground: 240 5.9% 10%; + + --secondary: 240 3.7% 15.9%; + --secondary-foreground: 0 0% 98%; + + --accent: 240 3.7% 15.9%; + --accent-foreground: 0 0% 98%; + + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 0 0% 98%; + + --ring: 240 4.9% 83.9%; + } +} + +@layer base { + * { + @apply border-border; + } + body { + @apply bg-background text-foreground; + } +} \ No newline at end of file diff --git a/apps/course-app/src/app.d.ts b/apps/course-app/src/app.d.ts new file mode 100644 index 00000000..da08e6da --- /dev/null +++ b/apps/course-app/src/app.d.ts @@ -0,0 +1,13 @@ +// See https://svelte.dev/docs/kit/types#app.d.ts +// for information about these interfaces +declare global { + namespace App { + // interface Error {} + // interface Locals {} + // interface PageData {} + // interface PageState {} + // interface Platform {} + } +} + +export {}; diff --git a/apps/course-app/src/app.html b/apps/course-app/src/app.html new file mode 100644 index 00000000..d91e6d06 --- /dev/null +++ b/apps/course-app/src/app.html @@ -0,0 +1,45 @@ + + + + + + + + + Courseapp by ClassroomIO – Create your SAAS Academy in Minutes + + + + + + + + + + + + + + + + + + + + + + + + + + %sveltekit.head% + + + +
%sveltekit.body%
+ + + \ No newline at end of file diff --git a/apps/course-app/src/demo.spec.ts b/apps/course-app/src/demo.spec.ts new file mode 100644 index 00000000..e07cbbd7 --- /dev/null +++ b/apps/course-app/src/demo.spec.ts @@ -0,0 +1,7 @@ +import { describe, it, expect } from 'vitest'; + +describe('sum test', () => { + it('adds 1 + 2 to equal 3', () => { + expect(1 + 2).toBe(3); + }); +}); diff --git a/apps/course-app/src/lib/components/animation/blurfade/blurfade.svelte b/apps/course-app/src/lib/components/animation/blurfade/blurfade.svelte new file mode 100644 index 00000000..1c87e4b8 --- /dev/null +++ b/apps/course-app/src/lib/components/animation/blurfade/blurfade.svelte @@ -0,0 +1,48 @@ + + + + +
{ + isInView = detail.inView ? 'visible' : 'hidden'; + }} + class={cn(className)} + > + Default +
+
+
diff --git a/apps/course-app/src/lib/components/animation/blurfade/index.ts b/apps/course-app/src/lib/components/animation/blurfade/index.ts new file mode 100644 index 00000000..3b094189 --- /dev/null +++ b/apps/course-app/src/lib/components/animation/blurfade/index.ts @@ -0,0 +1 @@ +export { default as BlurFade } from './blurfade.svelte'; diff --git a/apps/course-app/src/lib/components/animation/blurin/blurin.svelte b/apps/course-app/src/lib/components/animation/blurin/blurin.svelte new file mode 100644 index 00000000..8deec74d --- /dev/null +++ b/apps/course-app/src/lib/components/animation/blurin/blurin.svelte @@ -0,0 +1,36 @@ + + + +

+ +

+
diff --git a/apps/course-app/src/lib/components/animation/blurin/index.ts b/apps/course-app/src/lib/components/animation/blurin/index.ts new file mode 100644 index 00000000..cbe173d9 --- /dev/null +++ b/apps/course-app/src/lib/components/animation/blurin/index.ts @@ -0,0 +1 @@ +export { default as BlurIn } from './blurin.svelte'; diff --git a/apps/course-app/src/lib/components/animation/card/body.svelte b/apps/course-app/src/lib/components/animation/card/body.svelte new file mode 100644 index 00000000..2b29d82d --- /dev/null +++ b/apps/course-app/src/lib/components/animation/card/body.svelte @@ -0,0 +1,21 @@ + + +
+ + + {@render children()} +
diff --git a/apps/course-app/src/lib/components/animation/card/container.svelte b/apps/course-app/src/lib/components/animation/card/container.svelte new file mode 100644 index 00000000..48b492ba --- /dev/null +++ b/apps/course-app/src/lib/components/animation/card/container.svelte @@ -0,0 +1,30 @@ + + +
+
+
+
+ +
+ Default +
+
+
diff --git a/apps/course-app/src/lib/components/animation/card/ellipses.svelte b/apps/course-app/src/lib/components/animation/card/ellipses.svelte new file mode 100644 index 00000000..ce0bc9d2 --- /dev/null +++ b/apps/course-app/src/lib/components/animation/card/ellipses.svelte @@ -0,0 +1,13 @@ + + +
+
+
+
+
+
+
+
diff --git a/apps/course-app/src/lib/components/animation/card/index.ts b/apps/course-app/src/lib/components/animation/card/index.ts new file mode 100644 index 00000000..9295f8dd --- /dev/null +++ b/apps/course-app/src/lib/components/animation/card/index.ts @@ -0,0 +1,2 @@ +export { default as CardContainer } from './container.svelte'; +export { default as CardBody } from './body.svelte'; diff --git a/apps/course-app/src/lib/components/animation/gradual-spacing/gradual-spacing.svelte b/apps/course-app/src/lib/components/animation/gradual-spacing/gradual-spacing.svelte new file mode 100644 index 00000000..47666628 --- /dev/null +++ b/apps/course-app/src/lib/components/animation/gradual-spacing/gradual-spacing.svelte @@ -0,0 +1,42 @@ + + +
+ + {#each wordsspilit as char, i} + + + {#if char === ' '} +   + {:else} + {char} + {/if} + + + {/each} + +
diff --git a/apps/course-app/src/lib/components/animation/gradual-spacing/index.ts b/apps/course-app/src/lib/components/animation/gradual-spacing/index.ts new file mode 100644 index 00000000..8f068a0e --- /dev/null +++ b/apps/course-app/src/lib/components/animation/gradual-spacing/index.ts @@ -0,0 +1 @@ +export { default as GradualSpacing } from './gradual-spacing.svelte'; diff --git a/apps/course-app/src/lib/components/animation/magic-card/index.ts b/apps/course-app/src/lib/components/animation/magic-card/index.ts new file mode 100644 index 00000000..949fc79c --- /dev/null +++ b/apps/course-app/src/lib/components/animation/magic-card/index.ts @@ -0,0 +1 @@ +export { default as MagicCard } from './magic-card.svelte'; diff --git a/apps/course-app/src/lib/components/animation/magic-card/magic-card.svelte b/apps/course-app/src/lib/components/animation/magic-card/magic-card.svelte new file mode 100644 index 00000000..57ab3456 --- /dev/null +++ b/apps/course-app/src/lib/components/animation/magic-card/magic-card.svelte @@ -0,0 +1,72 @@ + + + + +
+
+ + +
+

Magic Card

+
+
+
+ +
+ +
+ + diff --git a/apps/course-app/src/lib/components/animation/meteors/index.ts b/apps/course-app/src/lib/components/animation/meteors/index.ts new file mode 100644 index 00000000..dfe2fd78 --- /dev/null +++ b/apps/course-app/src/lib/components/animation/meteors/index.ts @@ -0,0 +1 @@ +export { default as Meteors } from './meteors.svelte'; diff --git a/apps/course-app/src/lib/components/animation/meteors/meteors.svelte b/apps/course-app/src/lib/components/animation/meteors/meteors.svelte new file mode 100644 index 00000000..8257629d --- /dev/null +++ b/apps/course-app/src/lib/components/animation/meteors/meteors.svelte @@ -0,0 +1,36 @@ + + +{#each meteorStyles as style, idx} + + +
+ +{/each} diff --git a/apps/course-app/src/lib/components/animation/shimmerbutton/index.ts b/apps/course-app/src/lib/components/animation/shimmerbutton/index.ts new file mode 100644 index 00000000..cefa8f5f --- /dev/null +++ b/apps/course-app/src/lib/components/animation/shimmerbutton/index.ts @@ -0,0 +1 @@ +export { default as ShimmerButton } from './shimmerbutton.svelte'; diff --git a/apps/course-app/src/lib/components/animation/shimmerbutton/shimmerbutton.svelte b/apps/course-app/src/lib/components/animation/shimmerbutton/shimmerbutton.svelte new file mode 100644 index 00000000..67fe6ba4 --- /dev/null +++ b/apps/course-app/src/lib/components/animation/shimmerbutton/shimmerbutton.svelte @@ -0,0 +1,62 @@ + + + diff --git a/apps/course-app/src/lib/components/animation/shinny-text/index.ts b/apps/course-app/src/lib/components/animation/shinny-text/index.ts new file mode 100644 index 00000000..a969c4fb --- /dev/null +++ b/apps/course-app/src/lib/components/animation/shinny-text/index.ts @@ -0,0 +1 @@ +export { default as ShinnyText } from './shinny-text.svelte'; diff --git a/apps/course-app/src/lib/components/animation/shinny-text/shinny-text.svelte b/apps/course-app/src/lib/components/animation/shinny-text/shinny-text.svelte new file mode 100644 index 00000000..55cd431f --- /dev/null +++ b/apps/course-app/src/lib/components/animation/shinny-text/shinny-text.svelte @@ -0,0 +1,24 @@ + + +

+ Shimmer Animation +

diff --git a/apps/course-app/src/lib/components/animation/square-card/body.svelte b/apps/course-app/src/lib/components/animation/square-card/body.svelte new file mode 100644 index 00000000..2e4fa892 --- /dev/null +++ b/apps/course-app/src/lib/components/animation/square-card/body.svelte @@ -0,0 +1,9 @@ + + +
+ {@render children()} +
diff --git a/apps/course-app/src/lib/components/animation/square-card/icon.svelte b/apps/course-app/src/lib/components/animation/square-card/icon.svelte new file mode 100644 index 00000000..c26a3cc5 --- /dev/null +++ b/apps/course-app/src/lib/components/animation/square-card/icon.svelte @@ -0,0 +1,21 @@ + + + + + diff --git a/apps/course-app/src/lib/components/animation/square-card/index.ts b/apps/course-app/src/lib/components/animation/square-card/index.ts new file mode 100644 index 00000000..e1b6b6db --- /dev/null +++ b/apps/course-app/src/lib/components/animation/square-card/index.ts @@ -0,0 +1,2 @@ +export { default as SquareCardBody } from './body.svelte'; +export { default as SquareCardIcon } from './icon.svelte'; diff --git a/apps/course-app/src/lib/components/navigation/index.ts b/apps/course-app/src/lib/components/navigation/index.ts new file mode 100644 index 00000000..3c5d3d38 --- /dev/null +++ b/apps/course-app/src/lib/components/navigation/index.ts @@ -0,0 +1 @@ +export { default as Navigation } from './navigation.svelte'; diff --git a/apps/course-app/src/lib/components/navigation/navigation.svelte b/apps/course-app/src/lib/components/navigation/navigation.svelte new file mode 100644 index 00000000..4206d9f9 --- /dev/null +++ b/apps/course-app/src/lib/components/navigation/navigation.svelte @@ -0,0 +1,106 @@ + + +
+

+ brought to you by + classroomio.com + + + +

+ +
diff --git a/apps/course-app/src/lib/components/template-card/index.ts b/apps/course-app/src/lib/components/template-card/index.ts new file mode 100644 index 00000000..93ba23f5 --- /dev/null +++ b/apps/course-app/src/lib/components/template-card/index.ts @@ -0,0 +1 @@ +export { default as TemplateCard } from './template-card.svelte'; diff --git a/apps/course-app/src/lib/components/template-card/template-card.svelte b/apps/course-app/src/lib/components/template-card/template-card.svelte new file mode 100644 index 00000000..3ac950f3 --- /dev/null +++ b/apps/course-app/src/lib/components/template-card/template-card.svelte @@ -0,0 +1,38 @@ + + +
+ +
+

{template.name}

+
+
diff --git a/apps/course-app/src/lib/components/ui/button/button.svelte b/apps/course-app/src/lib/components/ui/button/button.svelte new file mode 100644 index 00000000..86827f32 --- /dev/null +++ b/apps/course-app/src/lib/components/ui/button/button.svelte @@ -0,0 +1,25 @@ + + + + + diff --git a/apps/course-app/src/lib/components/ui/button/index.ts b/apps/course-app/src/lib/components/ui/button/index.ts new file mode 100644 index 00000000..f0f46124 --- /dev/null +++ b/apps/course-app/src/lib/components/ui/button/index.ts @@ -0,0 +1,50 @@ +import type { Button as ButtonPrimitive } from "bits-ui"; +import { type VariantProps, tv } from "tailwind-variants"; +import Root from "./button.svelte"; + +const buttonVariants = tv({ + base: "focus-visible:ring-ring inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 disabled:pointer-events-none disabled:opacity-50", + variants: { + variant: { + default: "bg-primary text-primary-foreground hover:bg-primary/90 shadow", + destructive: + "bg-destructive text-destructive-foreground hover:bg-destructive/90 shadow-sm", + outline: + "border-input bg-background hover:bg-accent hover:text-accent-foreground border shadow-sm", + secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80 shadow-sm", + ghost: "hover:bg-accent hover:text-accent-foreground", + link: "text-primary underline-offset-4 hover:underline", + }, + size: { + default: "h-9 px-4 py-2", + sm: "h-8 rounded-md px-3 text-xs", + lg: "h-10 rounded-md px-8", + icon: "h-9 w-9", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, +}); + +type Variant = VariantProps["variant"]; +type Size = VariantProps["size"]; + +type Props = ButtonPrimitive.Props & { + variant?: Variant; + size?: Size; +}; + +type Events = ButtonPrimitive.Events; + +export { + Root, + type Props, + type Events, + // + Root as Button, + type Props as ButtonProps, + type Events as ButtonEvents, + buttonVariants, +}; diff --git a/apps/course-app/src/lib/components/ui/separator/index.ts b/apps/course-app/src/lib/components/ui/separator/index.ts new file mode 100644 index 00000000..82442d2c --- /dev/null +++ b/apps/course-app/src/lib/components/ui/separator/index.ts @@ -0,0 +1,7 @@ +import Root from "./separator.svelte"; + +export { + Root, + // + Root as Separator, +}; diff --git a/apps/course-app/src/lib/components/ui/separator/separator.svelte b/apps/course-app/src/lib/components/ui/separator/separator.svelte new file mode 100644 index 00000000..aa61f693 --- /dev/null +++ b/apps/course-app/src/lib/components/ui/separator/separator.svelte @@ -0,0 +1,22 @@ + + + diff --git a/apps/course-app/src/lib/components/ui/sonner/index.ts b/apps/course-app/src/lib/components/ui/sonner/index.ts new file mode 100644 index 00000000..1ad9f4a2 --- /dev/null +++ b/apps/course-app/src/lib/components/ui/sonner/index.ts @@ -0,0 +1 @@ +export { default as Toaster } from "./sonner.svelte"; diff --git a/apps/course-app/src/lib/components/ui/sonner/sonner.svelte b/apps/course-app/src/lib/components/ui/sonner/sonner.svelte new file mode 100644 index 00000000..7d5b2f14 --- /dev/null +++ b/apps/course-app/src/lib/components/ui/sonner/sonner.svelte @@ -0,0 +1,20 @@ + + + diff --git a/apps/course-app/src/lib/index.ts b/apps/course-app/src/lib/index.ts new file mode 100644 index 00000000..856f2b6c --- /dev/null +++ b/apps/course-app/src/lib/index.ts @@ -0,0 +1 @@ +// place files you want to import through the `$lib` alias in this folder. diff --git a/apps/course-app/src/lib/utils.ts b/apps/course-app/src/lib/utils.ts new file mode 100644 index 00000000..88712453 --- /dev/null +++ b/apps/course-app/src/lib/utils.ts @@ -0,0 +1,62 @@ +import { type ClassValue, clsx } from "clsx"; +import { twMerge } from "tailwind-merge"; +import { cubicOut } from "svelte/easing"; +import type { TransitionConfig } from "svelte/transition"; + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)); +} + +type FlyAndScaleParams = { + y?: number; + x?: number; + start?: number; + duration?: number; +}; + +export const flyAndScale = ( + node: Element, + params: FlyAndScaleParams = { y: -8, x: 0, start: 0.95, duration: 150 } +): TransitionConfig => { + const style = getComputedStyle(node); + const transform = style.transform === "none" ? "" : style.transform; + + const scaleConversion = ( + valueA: number, + scaleA: [number, number], + scaleB: [number, number] + ) => { + const [minA, maxA] = scaleA; + const [minB, maxB] = scaleB; + + const percentage = (valueA - minA) / (maxA - minA); + const valueB = percentage * (maxB - minB) + minB; + + return valueB; + }; + + const styleToString = ( + style: Record + ): string => { + return Object.keys(style).reduce((str, key) => { + if (style[key] === undefined) return str; + return str + `${key}:${style[key]};`; + }, ""); + }; + + return { + duration: params.duration ?? 200, + delay: 0, + css: (t) => { + const y = scaleConversion(t, [0, 1], [params.y ?? 5, 0]); + const x = scaleConversion(t, [0, 1], [params.x ?? 0, 0]); + const scale = scaleConversion(t, [0, 1], [params.start ?? 0.95, 1]); + + return styleToString({ + transform: `${transform} translate3d(${x}px, ${y}px, 0) scale(${scale})`, + opacity: t + }); + }, + easing: cubicOut + }; +}; \ No newline at end of file diff --git a/apps/course-app/src/routes/+layout.svelte b/apps/course-app/src/routes/+layout.svelte new file mode 100644 index 00000000..1b0be2c8 --- /dev/null +++ b/apps/course-app/src/routes/+layout.svelte @@ -0,0 +1,14 @@ + + + + + + +{@render children()} diff --git a/apps/course-app/src/routes/+page.svelte b/apps/course-app/src/routes/+page.svelte new file mode 100644 index 00000000..62f6b8c1 --- /dev/null +++ b/apps/course-app/src/routes/+page.svelte @@ -0,0 +1,185 @@ + + + +
+
+ + + + Create a UNIVERSITY + Site for your SAAS in + MINUTES + + + +

+ With our prebuilt templates, you can setup a fully functional customer educational site + for your product in minutes.
+ + Similar to the likes of + + + + + + +

+ + +
+
+
+
+
+ + + +
+
+

+ Browser Templates +

+ +
+ {#each templates as template, index} + + + + {/each} +
+
+
+ + + + + + +
+ +
+ + +
+ + +

+ Start Customising Your University Site +

+ +
+ { + window.location.href = + 'https://github.com/classroomio/classroomio/blob/a6af412b2401a8dc3f871773b96a24b2fa764f52/packages/course-app/README.md'; + }} + class="shadow-2xl" + > + + Go to Docs + + +
+
+
+
+
+ + + + + + +
+
+

+ Made with ❤️ by classroomio +

+
+
+ diff --git a/apps/course-app/static/apple-touch-icon.png b/apps/course-app/static/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..bcb8778b2903f4aa6fb25baea28a4ec847176759 GIT binary patch literal 44013 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