feat: 🚀 😃 convert repo into a monorepo 🚀 😃 (#51)

* Merge main into turbo-monrepo

* feat: rename apps

* feat: remove supbase videos and serve all from project

* feat: move supabase to root

* feat: update README

* docs: update link
This commit is contained in:
Rotimi Best
2023-11-25 21:56:02 +00:00
committed by GitHub
parent 03ca379094
commit 41e29014ef
806 changed files with 85853 additions and 5746 deletions
@@ -0,0 +1,93 @@
<script>
// import ImageCompare from './ImageCompare.svelte';
import { PUBLIC_ENABLE_USERS_COMPANIES } from '$env/static/public';
</script>
<div class="text-center mt-[30%] md:mt-36 border-b-2 relative">
<div class="mb-10 flex items-center justify-center w-full">
<!-- <a
target="_blank"
rel="noopener noreferrer nofollow"
href="https://github.com/rotimi-best/quizify"
style="color: rgb(75, 85, 99);"
class="border border-gray-300 rounded-full px-4 py-1 text-sm font-medium hover:underline"
>Give us a <span class="text-[#1D4EE2]">star</span> on github</a
> -->
<a
href="https://www.producthunt.com/posts/classroomio?utm_source=badge-featured&utm_medium=badge&utm_souce=badge-classroomio"
target="_blank"
><img
src="https://api.producthunt.com/widgets/embed-image/v1/featured.svg?post_id=425236&theme=light"
alt="ClassroomIO - The&#0032;Open&#0032;Source&#0032;Platform&#0032;for&#0032;Tech&#0032;Bootcamps | Product Hunt"
style="width: 250px; height: 54px;"
width="250"
height="54"
/></a
>
</div>
<h1
class="mx-auto text-3xl md:text-4xl lg:text-6xl font-normal leading-[1.5] text-slate-900 flex flex-col items-center gap-4"
>
<span>The Open Source Platform</span>
<span class="text-[#1D4EE2] relative"
>for Tech Bootcamps<svg
aria-hidden="true"
viewBox="0 0 418 42"
class="absolute left-[10%] top-3/4 h-[0.58em] fill-indigo-300/70"
preserveAspectRatio="none"
><path
d="M203.371.916c-26.013-2.078-76.686 1.963-124.73 9.946L67.3 12.749C35.421 18.062 18.2 21.766 6.004 25.934 1.244 27.561.828 27.778.874 28.61c.07 1.214.828 1.121 9.595-1.176 9.072-2.377 17.15-3.92 39.246-7.496C123.565 7.986 157.869 4.492 195.942 5.046c7.461.108 19.25 1.696 19.17 2.582-.107 1.183-7.874 4.31-25.75 10.366-21.992 7.45-35.43 12.534-36.701 13.884-2.173 2.308-.202 4.407 4.442 4.734 2.654.187 3.263.157 15.593-.78 35.401-2.686 57.944-3.488 88.365-3.143 46.327.526 75.721 2.23 130.788 7.584 19.787 1.924 20.814 1.98 24.557 1.332l.066-.011c1.201-.203 1.53-1.825.399-2.335-2.911-1.31-4.893-1.604-22.048-3.261-57.509-5.556-87.871-7.36-132.059-7.842-23.239-.254-33.617-.116-50.627.674-11.629.54-42.371 2.494-46.696 2.967-2.359.259 8.133-3.625 26.504-9.81 23.239-7.825 27.934-10.149 28.304-14.005.417-4.348-3.529-6-16.878-7.066Z"
/></svg
></span
>
</h1>
<p
class="mx-auto mt-10 lg:mt-6 px-4 lg:p-0 text-md md:text-xl tracking-wide leading-6 lg:leading-10 text-slate-700 lg:w-2/4"
>
Spend less time doing the boring stuffs, instead focus on impacting the
lives of your students.
</p>
<button
class="font-medium lg:font-semibold text-sm md:text-md text-white px-6 py-3 lg:px-10 lg:py-5 bg-[#1D4EE2] rounded-md lg:rounded-xl mt-10"
data-cal-config={"{'layout':'month_view'}"}
data-cal-link="classroomio/demo"
>
Let's show you 😍️️️️️️
</button>
<div class="relative my-5 md:my-10">
<video
class="floating w-[85%] lg:w-[70%] mx-auto rounded-lg shadow-lg"
autoplay
loop
muted
defaultMuted
playsinline
preload="auto"
>
<source
src="./dark-light-mode.mp4"
type="video/mp4"
/>
<track kind="captions" />
</video>
</div>
{#if PUBLIC_ENABLE_USERS_COMPANIES}
<div class="px-[15%] mb-[10%]">
<h2 class="inter text-base lg:text-xl font-semibold text-gray-900">
Used at
</h2>
<div
class="w-full flex flex-wrap flex-row gap-5 justify-between items-center py-[5%]"
>
<img src="/hero-1.svg" alt="" class="w-[30%] lg:w-[13%]" />
<img src="/hero-2.svg" alt="" class="w-[30%] lg:w-[13%]" />
<img src="/hero-3.svg" alt="" class="w-[30%] lg:w-[13%]" />
<img src="/hero-4.svg" alt="" class="w-[30%] lg:w-[13%]" />
<img src="/hero-5.svg" alt="" class="w-[30%] lg:w-[13%]" />
</div>
</div>
{/if}
</div>
@@ -0,0 +1,193 @@
<script>
import { onMount } from 'svelte';
export { before, after, offset, overlay, contain, hideOnSlide };
let hideOnSlide = true,
imgOffset = null,
sliding = false,
contain = false,
overlay = true,
offset = 0.5,
before = '',
after = '',
img;
function resize(e) {
imgOffset = (e.type === 'load' ? e.target : img).getBoundingClientRect();
w = imgOffset && imgOffset.width;
h = imgOffset && imgOffset.height;
style = contain ? `width:100%;height:100%;` : `width:${w}px;height:${h}px;`;
}
function move(e) {
if (sliding && imgOffset) {
let x = (e.touches ? e.touches[0].pageX : e.pageX) - imgOffset.left;
x = x < 0 ? 0 : x > w ? w : x;
offset = x / w;
}
}
function start(e) {
sliding = true;
move(e);
}
function end() {
sliding = false;
}
onMount(() => {
resize({});
});
$: w = imgOffset && imgOffset.width;
$: h = imgOffset && imgOffset.height;
$: x = w * offset;
$: opacity = hideOnSlide && sliding ? 0 : 1;
$: style = contain
? `width:100%;height:100%;`
: `width:${w}px;height:${h}px;`;
</script>
<svelte:window on:resize={resize} />
<button
class="container floating w-[85%] lg:w-[70%] h-full mx-auto rounded-xl"
{style}
on:touchstart={start}
on:mousedown={start}
on:touchmove={move}
on:touchend={end}
on:mousemove={move}
on:mouseup={end}
>
<img
bind:this={img}
src={after}
alt="after"
on:mousedown|preventDefault
on:load={resize}
{style}
/>
<img
src={before}
alt="before"
on:mousedown|preventDefault
style="{style}clip:rect(0, {x}px, {h}px, 0);"
/>
{#if overlay}
<div class="overlay" style="opacity:{opacity}" />
{/if}
<div class="before-label" style="opacity:{opacity}">
<slot name="before" />
</div>
<div class="after-label" style="opacity:{opacity}">
<slot name="after" />
</div>
<div class="handle" style="left: calc({offset * 100}% - 20px)">
<div class="arrow-left" />
<div class="arrow-right" />
</div>
</button>
<style>
.container {
overflow: hidden;
position: relative;
box-sizing: content-box;
border-radius: 0.75rem;
}
.container img {
top: 0;
left: 0;
z-index: 20;
display: block;
max-width: 100%;
user-select: none;
object-fit: cover;
position: absolute;
width: fit-content;
height: fit-content;
}
.overlay {
top: 0;
opacity: 0;
z-index: 25;
width: 100%;
height: 100%;
position: absolute;
transition: opacity 0.5s;
background: rgba(0, 0, 0, 0.2);
}
.before-label,
.after-label {
top: 0;
bottom: 0;
z-index: 25;
user-select: none;
position: absolute;
}
.before-label {
left: 0;
}
.after-label {
right: 0;
}
.container:hover > .overlay {
opacity: 1;
}
.handle {
z-index: 30;
width: 40px;
height: 40px;
cursor: move;
background: none;
margin-top: -4px;
margin-left: -4px;
user-select: none;
position: absolute;
border-radius: 50px;
top: calc(50% - 20px);
border: 4px solid white;
}
.handle:before,
.handle:after {
content: '';
height: 9999px;
position: absolute;
left: calc(50% - 2px);
border: 2px solid white;
}
.handle:before {
top: 40px;
}
.handle:after {
bottom: 40px;
}
.arrow-right,
.arrow-left {
width: 0;
height: 0;
user-select: none;
position: relative;
border-top: 10px solid transparent;
border-bottom: 10px solid transparent;
}
.arrow-right {
left: 17px;
bottom: 13px;
border-left: 10px solid white;
}
.arrow-left {
left: 5px;
top: 7px;
border-right: 10px solid white;
}
img,
.overlay,
.container {
max-height: 500px;
}
</style>