From d8cc24453af47cd8f06c722b975863fe0e053142 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Andr=C3=A9=20Casal?=
Date: Wed, 17 Apr 2024 11:28:54 +0100
Subject: [PATCH] redirect /ui to verveui.pro
---
app/components/ArticlePreview.tsx | 4 +-
app/components/CoursePresentation.tsx | 6 +-
app/components/error-boundary.tsx | 4 +-
app/components/footer.tsx | 10 +-
app/components/header.tsx | 4 +-
app/components/newsletter.tsx | 6 +-
app/components/ui/toast.tsx | 2 +-
app/routes/_auth+/forgot-password/index.tsx | 6 +-
app/routes/_auth+/forgot-password_.verify.tsx | 6 +-
app/routes/_auth+/login.tsx | 4 +-
app/routes/_auth+/onboarding.tsx | 6 +-
app/routes/_auth+/reset-password.tsx | 6 +-
app/routes/_auth+/signup/index.tsx | 6 +-
app/routes/_auth+/signup_.verify.tsx | 6 +-
app/routes/_marketing+/about.tsx | 6 +-
app/routes/_marketing+/articles/_index.tsx | 7 +-
.../articles/fluid-space-sizing/index.tsx | 8 +-
.../index.tsx | 6 +-
app/routes/_marketing+/articles/index.tsx | 2 +-
.../_marketing+/articles/layout/index.tsx | 12 +-
.../_marketing+/articles/quotes/index.tsx | 6 +-
.../articles/remix-data-flow/index.tsx | 4 +-
.../the-dark-side-of-the-grid/index.tsx | 8 +-
app/routes/_marketing+/components/brands.tsx | 6 +-
.../_marketing+/components/hero-andre.tsx | 13 +-
app/routes/_marketing+/courses+/index.tsx | 6 +-
.../courses+/mastery-for-vs-code.tsx | 14 +-
.../explicacoes-de-programacao.tsx | 14 +-
app/routes/_marketing+/index.tsx | 6 +-
app/routes/_marketing+/mentorship.tsx | 14 +-
app/routes/_marketing+/newsletter.tsx | 2 +-
app/routes/_marketing+/privacy.tsx | 4 +-
app/routes/_marketing+/ship-fast/index.tsx | 14 +-
app/routes/_marketing+/shorts.tsx | 4 +-
app/routes/_marketing+/talks.tsx | 4 +-
app/routes/_marketing+/terms.tsx | 4 +-
app/routes/_marketing+/tips.tsx | 6 +-
app/routes/_marketing+/transparency.tsx | 4 +-
app/routes/_marketing+/tutoring.tsx | 14 +-
app/routes/_marketing+/ui+/_layout.tsx | 270 ----------------
app/routes/_marketing+/ui+/architecture.tsx | 73 -----
.../ui+/data-display+/command-line.tsx | 154 ---------
.../_marketing+/ui+/design-principles.tsx | 28 --
.../ui+/development-principles.tsx | 50 ---
.../_marketing+/ui+/disclosure+/tabs.tsx | 166 ----------
.../_marketing+/ui+/images/architecture.jpg | Bin 1405149 -> 0 bytes
.../_marketing+/ui+/images/design-system.webp | Bin 37100 -> 0 bytes
.../images/sarah-lee-ydpczVKWl4w-unsplash.jpg | Bin 99350 -> 0 bytes
app/routes/_marketing+/ui+/index.tsx | 126 --------
.../_marketing+/ui+/layout+/aspect-ratio.tsx | 45 ---
.../_marketing+/ui+/layout+/container.tsx | 61 ----
.../_marketing+/ui+/layout+/divider.tsx | 83 -----
app/routes/_marketing+/ui+/layout+/flex.tsx | 200 ------------
app/routes/_marketing+/ui+/layout+/grid.tsx | 305 ------------------
.../_marketing+/ui+/layout+/scroll-area.tsx | 161 ---------
app/routes/_marketing+/ui+/layout+/sticky.tsx | 67 ----
.../ui+/layout+/visually-hidden.tsx | 47 ---
.../_marketing+/ui+/modals+/alert-dialog.tsx | 185 -----------
app/routes/_marketing+/ui+/modals+/dialog.tsx | 193 -----------
app/routes/_marketing+/ui+/modals+/drawer.tsx | 183 -----------
.../ui+/navigation+/navigation-menu.tsx | 167 ----------
app/routes/_marketing+/ui+/nomenclature.tsx | 37 ---
.../_marketing+/ui+/overlays+/tooltip.tsx | 225 -------------
.../_marketing+/ui+/sections/sections.tsx | 236 --------------
app/routes/_marketing+/ui+/taxonomy.tsx | 164 ----------
.../_marketing+/ui+/theme+/dark-mode.tsx | 97 ------
.../_marketing+/ui+/theme+/overview.tsx | 53 ---
app/routes/_marketing+/ui+/typography+/b.tsx | 103 ------
.../_marketing+/ui+/typography+/code.tsx | 113 -------
app/routes/_marketing+/ui+/typography+/em.tsx | 98 ------
app/routes/_marketing+/ui+/typography+/h1.tsx | 206 ------------
app/routes/_marketing+/ui+/typography+/h2.tsx | 201 ------------
app/routes/_marketing+/ui+/typography+/h3.tsx | 201 ------------
app/routes/_marketing+/ui+/typography+/h4.tsx | 201 ------------
app/routes/_marketing+/ui+/typography+/h5.tsx | 201 ------------
app/routes/_marketing+/ui+/typography+/h6.tsx | 201 ------------
app/routes/_marketing+/ui+/typography+/i.tsx | 98 ------
.../_marketing+/ui+/typography+/kbd.tsx | 68 ----
app/routes/_marketing+/ui+/typography+/li.tsx | 65 ----
app/routes/_marketing+/ui+/typography+/ol.tsx | 67 ----
app/routes/_marketing+/ui+/typography+/p.tsx | 200 ------------
app/routes/_marketing+/ui+/typography+/q.tsx | 58 ----
.../_marketing+/ui+/typography+/span.tsx | 210 ------------
.../_marketing+/ui+/typography+/strong.tsx | 107 ------
app/routes/_marketing+/ui+/typography+/ul.tsx | 65 ----
app/routes/_marketing+/ui+/why.tsx | 104 ------
app/routes/_marketing+/ui.$.tsx | 5 +
app/routes/_marketing+/uses.tsx | 4 +-
app/routes/admin+/cache.tsx | 2 +-
app/routes/resources+/login.tsx | 2 +-
app/routes/settings+/profile.tsx | 4 +-
.../settings+/profile.two-factor.index.tsx | 2 +-
.../settings+/profile.two-factor.verify.tsx | 2 +-
app/routes/users+/$username.tsx | 6 +-
.../layout/aspect-ratio.tsx | 0
.../layout/container.tsx | 0
.../layout/divider.tsx | 0
.../layout/flex.tsx | 0
.../layout/grid.tsx | 0
.../layout/scroll-area.tsx | 0
.../layout/sticky.tsx | 0
.../layout/visually-hidden.tsx | 0
.../modals/alert-dialog.tsx | 0
.../modals/dialog.tsx | 0
.../modals/drawer.tsx | 0
.../navigation/navigation-menu.tsx | 0
.../typography/b.tsx | 0
.../typography/code.tsx | 2 +-
.../typography/command-line.tsx | 0
.../typography/em.tsx | 0
.../typography/h1.tsx | 0
.../typography/h2.tsx | 0
.../typography/h3.tsx | 0
.../typography/h4.tsx | 0
.../typography/h5.tsx | 0
.../typography/h6.tsx | 0
.../typography/i.tsx | 0
.../typography/kbd.tsx | 0
.../typography/li.tsx | 0
.../typography/ol.tsx | 0
.../typography/p.tsx | 0
.../typography/q.tsx | 0
.../typography/span.tsx | 0
.../typography/strong.tsx | 0
.../typography/ul.tsx | 0
.../ui/slide-in-dialog.tsx | 0
.../components => ui_components}/ui/tabs.tsx | 0
.../ui/tooltip.tsx | 0
128 files changed, 151 insertions(+), 6085 deletions(-)
delete mode 100644 app/routes/_marketing+/ui+/_layout.tsx
delete mode 100644 app/routes/_marketing+/ui+/architecture.tsx
delete mode 100644 app/routes/_marketing+/ui+/data-display+/command-line.tsx
delete mode 100644 app/routes/_marketing+/ui+/design-principles.tsx
delete mode 100644 app/routes/_marketing+/ui+/development-principles.tsx
delete mode 100644 app/routes/_marketing+/ui+/disclosure+/tabs.tsx
delete mode 100644 app/routes/_marketing+/ui+/images/architecture.jpg
delete mode 100644 app/routes/_marketing+/ui+/images/design-system.webp
delete mode 100644 app/routes/_marketing+/ui+/images/sarah-lee-ydpczVKWl4w-unsplash.jpg
delete mode 100644 app/routes/_marketing+/ui+/index.tsx
delete mode 100644 app/routes/_marketing+/ui+/layout+/aspect-ratio.tsx
delete mode 100644 app/routes/_marketing+/ui+/layout+/container.tsx
delete mode 100644 app/routes/_marketing+/ui+/layout+/divider.tsx
delete mode 100644 app/routes/_marketing+/ui+/layout+/flex.tsx
delete mode 100644 app/routes/_marketing+/ui+/layout+/grid.tsx
delete mode 100644 app/routes/_marketing+/ui+/layout+/scroll-area.tsx
delete mode 100644 app/routes/_marketing+/ui+/layout+/sticky.tsx
delete mode 100644 app/routes/_marketing+/ui+/layout+/visually-hidden.tsx
delete mode 100644 app/routes/_marketing+/ui+/modals+/alert-dialog.tsx
delete mode 100644 app/routes/_marketing+/ui+/modals+/dialog.tsx
delete mode 100644 app/routes/_marketing+/ui+/modals+/drawer.tsx
delete mode 100644 app/routes/_marketing+/ui+/navigation+/navigation-menu.tsx
delete mode 100644 app/routes/_marketing+/ui+/nomenclature.tsx
delete mode 100644 app/routes/_marketing+/ui+/overlays+/tooltip.tsx
delete mode 100644 app/routes/_marketing+/ui+/sections/sections.tsx
delete mode 100644 app/routes/_marketing+/ui+/taxonomy.tsx
delete mode 100644 app/routes/_marketing+/ui+/theme+/dark-mode.tsx
delete mode 100644 app/routes/_marketing+/ui+/theme+/overview.tsx
delete mode 100644 app/routes/_marketing+/ui+/typography+/b.tsx
delete mode 100644 app/routes/_marketing+/ui+/typography+/code.tsx
delete mode 100644 app/routes/_marketing+/ui+/typography+/em.tsx
delete mode 100644 app/routes/_marketing+/ui+/typography+/h1.tsx
delete mode 100644 app/routes/_marketing+/ui+/typography+/h2.tsx
delete mode 100644 app/routes/_marketing+/ui+/typography+/h3.tsx
delete mode 100644 app/routes/_marketing+/ui+/typography+/h4.tsx
delete mode 100644 app/routes/_marketing+/ui+/typography+/h5.tsx
delete mode 100644 app/routes/_marketing+/ui+/typography+/h6.tsx
delete mode 100644 app/routes/_marketing+/ui+/typography+/i.tsx
delete mode 100644 app/routes/_marketing+/ui+/typography+/kbd.tsx
delete mode 100644 app/routes/_marketing+/ui+/typography+/li.tsx
delete mode 100644 app/routes/_marketing+/ui+/typography+/ol.tsx
delete mode 100644 app/routes/_marketing+/ui+/typography+/p.tsx
delete mode 100644 app/routes/_marketing+/ui+/typography+/q.tsx
delete mode 100644 app/routes/_marketing+/ui+/typography+/span.tsx
delete mode 100644 app/routes/_marketing+/ui+/typography+/strong.tsx
delete mode 100644 app/routes/_marketing+/ui+/typography+/ul.tsx
delete mode 100644 app/routes/_marketing+/ui+/why.tsx
create mode 100644 app/routes/_marketing+/ui.$.tsx
rename app/{routes/_marketing+/ui+/components => ui_components}/layout/aspect-ratio.tsx (100%)
rename app/{routes/_marketing+/ui+/components => ui_components}/layout/container.tsx (100%)
rename app/{routes/_marketing+/ui+/components => ui_components}/layout/divider.tsx (100%)
rename app/{routes/_marketing+/ui+/components => ui_components}/layout/flex.tsx (100%)
rename app/{routes/_marketing+/ui+/components => ui_components}/layout/grid.tsx (100%)
rename app/{routes/_marketing+/ui+/components => ui_components}/layout/scroll-area.tsx (100%)
rename app/{routes/_marketing+/ui+/components => ui_components}/layout/sticky.tsx (100%)
rename app/{routes/_marketing+/ui+/components => ui_components}/layout/visually-hidden.tsx (100%)
rename app/{routes/_marketing+/ui+/components => ui_components}/modals/alert-dialog.tsx (100%)
rename app/{routes/_marketing+/ui+/components => ui_components}/modals/dialog.tsx (100%)
rename app/{routes/_marketing+/ui+/components => ui_components}/modals/drawer.tsx (100%)
rename app/{routes/_marketing+/ui+/components => ui_components}/navigation/navigation-menu.tsx (100%)
rename app/{routes/_marketing+/ui+/components => ui_components}/typography/b.tsx (100%)
rename app/{routes/_marketing+/ui+/components => ui_components}/typography/code.tsx (95%)
rename app/{routes/_marketing+/ui+/components => ui_components}/typography/command-line.tsx (100%)
rename app/{routes/_marketing+/ui+/components => ui_components}/typography/em.tsx (100%)
rename app/{routes/_marketing+/ui+/components => ui_components}/typography/h1.tsx (100%)
rename app/{routes/_marketing+/ui+/components => ui_components}/typography/h2.tsx (100%)
rename app/{routes/_marketing+/ui+/components => ui_components}/typography/h3.tsx (100%)
rename app/{routes/_marketing+/ui+/components => ui_components}/typography/h4.tsx (100%)
rename app/{routes/_marketing+/ui+/components => ui_components}/typography/h5.tsx (100%)
rename app/{routes/_marketing+/ui+/components => ui_components}/typography/h6.tsx (100%)
rename app/{routes/_marketing+/ui+/components => ui_components}/typography/i.tsx (100%)
rename app/{routes/_marketing+/ui+/components => ui_components}/typography/kbd.tsx (100%)
rename app/{routes/_marketing+/ui+/components => ui_components}/typography/li.tsx (100%)
rename app/{routes/_marketing+/ui+/components => ui_components}/typography/ol.tsx (100%)
rename app/{routes/_marketing+/ui+/components => ui_components}/typography/p.tsx (100%)
rename app/{routes/_marketing+/ui+/components => ui_components}/typography/q.tsx (100%)
rename app/{routes/_marketing+/ui+/components => ui_components}/typography/span.tsx (100%)
rename app/{routes/_marketing+/ui+/components => ui_components}/typography/strong.tsx (100%)
rename app/{routes/_marketing+/ui+/components => ui_components}/typography/ul.tsx (100%)
rename app/{routes/_marketing+/ui+/components => ui_components}/ui/slide-in-dialog.tsx (100%)
rename app/{routes/_marketing+/ui+/components => ui_components}/ui/tabs.tsx (100%)
rename app/{routes/_marketing+/ui+/components => ui_components}/ui/tooltip.tsx (100%)
diff --git a/app/components/ArticlePreview.tsx b/app/components/ArticlePreview.tsx
index 6b7fcab..215c344 100644
--- a/app/components/ArticlePreview.tsx
+++ b/app/components/ArticlePreview.tsx
@@ -1,7 +1,7 @@
import { type Post } from '~/routes/_marketing+/articles/_index.tsx'
import { Badge } from './ui/badge.tsx'
-import { H3 } from '~/routes/_marketing+/ui+/components/typography/h3.tsx'
-import { P } from '~/routes/_marketing+/ui+/components/typography/p.tsx'
+import { H3 } from '~/ui_components/typography/h3.tsx'
+import { P } from '~/ui_components/typography/p.tsx'
export const ArticlePreview = ({ post }: { post: Post }) => {
return (
diff --git a/app/components/CoursePresentation.tsx b/app/components/CoursePresentation.tsx
index eaaa960..9137597 100644
--- a/app/components/CoursePresentation.tsx
+++ b/app/components/CoursePresentation.tsx
@@ -1,9 +1,9 @@
import { Button } from './ui/button.tsx'
import { Link } from '@remix-run/react'
import { Icon } from './ui/icon.tsx'
-import { H2 } from '~/routes/_marketing+/ui+/components/typography/h2.tsx'
-import { P } from '~/routes/_marketing+/ui+/components/typography/p.tsx'
-import { Span } from '~/routes/_marketing+/ui+/components/typography/span.tsx'
+import { H2 } from '~/ui_components/typography/h2.tsx'
+import { P } from '~/ui_components/typography/p.tsx'
+import { Span } from '~/ui_components/typography/span.tsx'
export const CoursePresentation = ({
course: {
diff --git a/app/components/error-boundary.tsx b/app/components/error-boundary.tsx
index 598a379..e95d325 100644
--- a/app/components/error-boundary.tsx
+++ b/app/components/error-boundary.tsx
@@ -1,8 +1,8 @@
import { isRouteErrorResponse, useParams, useRouteError } from '@remix-run/react'
import { type ErrorResponse } from '@remix-run/router'
-import { Container } from '~/routes/_marketing+/ui+/components/layout/container.tsx'
-import { P } from '~/routes/_marketing+/ui+/components/typography/p.tsx'
import { getErrorMessage } from '~/utils/misc.ts'
+import { Container } from '~/ui_components/layout/container.tsx'
+import { P } from '~/ui_components/typography/p.tsx'
type StatusHandler = (info: { error: ErrorResponse; params: Record }) => JSX.Element | null
diff --git a/app/components/footer.tsx b/app/components/footer.tsx
index 44dfa76..ba6d64a 100644
--- a/app/components/footer.tsx
+++ b/app/components/footer.tsx
@@ -1,8 +1,8 @@
-import { Container } from '~/routes/_marketing+/ui+/components/layout/container.tsx'
-import { H2 } from '~/routes/_marketing+/ui+/components/typography/h2.tsx'
-import { H3 } from '~/routes/_marketing+/ui+/components/typography/h3.tsx'
-import { P } from '~/routes/_marketing+/ui+/components/typography/p.tsx'
-import { Span } from '~/routes/_marketing+/ui+/components/typography/span.tsx'
+import { Container } from '~/ui_components/layout/container.tsx'
+import { H2 } from '~/ui_components/typography/h2.tsx'
+import { H3 } from '~/ui_components/typography/h3.tsx'
+import { P } from '~/ui_components/typography/p.tsx'
+import { Span } from '~/ui_components/typography/span.tsx'
const navigation = {
social: [
diff --git a/app/components/header.tsx b/app/components/header.tsx
index 011f21a..9826c51 100644
--- a/app/components/header.tsx
+++ b/app/components/header.tsx
@@ -1,5 +1,5 @@
import { Fragment, useRef, useState } from 'react'
-import { Container } from '~/routes/_marketing+/ui+/components/layout/container.tsx'
+import { Container } from '~/ui_components/layout/container.tsx'
import { Dialog, DialogTrigger, DialogContent, DialogClose } from '~/components/ui/dialog.tsx'
import { NavigationMenu, NavigationMenuList, NavigationMenuItem, NavigationMenuLink, NavigationMenuTrigger, NavigationMenuContent } from '~/components/ui/navigation-menu.tsx'
import { Separator } from '~/components/ui/separator.tsx'
@@ -65,7 +65,7 @@ export default function Header() {
to={href}
className="relative block after:absolute after:bottom-0 after:left-0 after:right-0 after:block after:h-0.5 after:max-w-0 after:bg-foreground after:transition-max-width after:duration-500 aria-[current]:after:max-w-full"
>
- {name} {external ? : null}
+ {name} {external ? : null}
diff --git a/app/components/newsletter.tsx b/app/components/newsletter.tsx
index b7b87e7..93dbba2 100644
--- a/app/components/newsletter.tsx
+++ b/app/components/newsletter.tsx
@@ -7,15 +7,15 @@ import { type action, newsletterSchema } from '~/routes/_marketing+/newsletter.t
import { parse } from '@conform-to/zod'
import { cn } from '~/utils/tailwind-merge.ts'
import guide from '~/routes/_marketing+/images/guide-to-modern-full-stack-web-dev.png'
-import { H2 } from '~/routes/_marketing+/ui+/components/typography/h2.tsx'
-import { P } from '~/routes/_marketing+/ui+/components/typography/p.tsx'
import { VisuallyHidden } from '@radix-ui/react-visually-hidden'
import { Player } from '@lottiefiles/react-lottie-player'
import * as newsletterAnimation from '~/components/newsletter-animation.json'
import { useEffect, useRef, useState } from 'react'
import { AuthenticityTokenInput } from 'remix-utils/csrf/react'
import { HoneypotInputs } from 'remix-utils/honeypot/react'
-import { Flex } from '~/routes/_marketing+/ui+/components/layout/flex.tsx'
+import { H2 } from '~/ui_components/typography/h2.tsx'
+import { P } from '~/ui_components/typography/p.tsx'
+import { Flex } from '~/ui_components/layout/flex.tsx'
type NewsletterProps = {
className?: string
diff --git a/app/components/ui/toast.tsx b/app/components/ui/toast.tsx
index 64b49ee..9e11098 100644
--- a/app/components/ui/toast.tsx
+++ b/app/components/ui/toast.tsx
@@ -5,7 +5,7 @@ import cg from 'classgroup'
import { cn } from '~/utils/tailwind-merge.ts'
import { Icon } from './icon.tsx'
import { Button } from './button.tsx'
-import { P } from '~/routes/_marketing+/ui+/components/typography/p.tsx'
+import { P } from '~/ui_components/typography/p.tsx'
const ToastProvider = ToastPrimitives.Provider
diff --git a/app/routes/_auth+/forgot-password/index.tsx b/app/routes/_auth+/forgot-password/index.tsx
index 95b864f..84908c0 100644
--- a/app/routes/_auth+/forgot-password/index.tsx
+++ b/app/routes/_auth+/forgot-password/index.tsx
@@ -12,9 +12,9 @@ import { getDomainUrl } from '~/utils/misc.ts'
import { generateTOTP } from '~/utils/totp.server.ts'
import { emailSchema, usernameSchema } from '~/utils/user-validation.ts'
import { ForgotPasswordEmail } from './email.server.tsx'
-import { Container } from '~/routes/_marketing+/ui+/components/layout/container.tsx'
-import { H1 } from '~/routes/_marketing+/ui+/components/typography/h1.tsx'
-import { P } from '~/routes/_marketing+/ui+/components/typography/p.tsx'
+import { Container } from '~/ui_components/layout/container.tsx'
+import { H1 } from '~/ui_components/typography/h1.tsx'
+import { P } from '~/ui_components/typography/p.tsx'
export const forgotPasswordOTPQueryParam = 'code'
export const forgotPasswordTargetQueryParam = 'usernameOrEmail'
diff --git a/app/routes/_auth+/forgot-password_.verify.tsx b/app/routes/_auth+/forgot-password_.verify.tsx
index 500f657..f927eb1 100644
--- a/app/routes/_auth+/forgot-password_.verify.tsx
+++ b/app/routes/_auth+/forgot-password_.verify.tsx
@@ -13,9 +13,9 @@ import { resetPasswordUsernameSessionKey } from './reset-password.tsx'
import { verifyTOTP } from '~/utils/totp.server.ts'
import invariant from 'tiny-invariant'
import { StatusButton } from '~/components/ui/status-button.tsx'
-import { Container } from '../_marketing+/ui+/components/layout/container.tsx'
-import { H1 } from '../_marketing+/ui+/components/typography/h1.tsx'
-import { P } from '../_marketing+/ui+/components/typography/p.tsx'
+import { Container } from '~/ui_components/layout/container.tsx'
+import { H1 } from '~/ui_components/typography/h1.tsx'
+import { P } from '~/ui_components/typography/p.tsx'
const verifySchema = z.object({
[forgotPasswordTargetQueryParam]: z.union([emailSchema, usernameSchema]),
diff --git a/app/routes/_auth+/login.tsx b/app/routes/_auth+/login.tsx
index d05d51a..bb9bdb2 100644
--- a/app/routes/_auth+/login.tsx
+++ b/app/routes/_auth+/login.tsx
@@ -6,8 +6,8 @@ import { authenticator, requireAnonymous } from '~/utils/auth.server.ts'
import { commitSession, getSession } from '~/utils/session.server.ts'
import { InlineLogin } from '../resources+/login.tsx'
import { Verifier, unverifiedSessionKey } from '../resources+/verify.tsx'
-import { H1 } from '../_marketing+/ui+/components/typography/h1.tsx'
-import { P } from '../_marketing+/ui+/components/typography/p.tsx'
+import { H1 } from '~/ui_components/typography/h1.tsx'
+import { P } from '~/ui_components/typography/p.tsx'
export async function loader({ request }: DataFunctionArgs) {
await requireAnonymous(request)
diff --git a/app/routes/_auth+/onboarding.tsx b/app/routes/_auth+/onboarding.tsx
index 4f2a6b0..942c0ca 100644
--- a/app/routes/_auth+/onboarding.tsx
+++ b/app/routes/_auth+/onboarding.tsx
@@ -12,9 +12,9 @@ import { commitSession, getSession } from '~/utils/session.server.ts'
import { nameSchema, passwordSchema, usernameSchema } from '~/utils/user-validation.ts'
import { checkboxSchema } from '~/utils/zod-extensions.ts'
import { redirectWithConfetti } from '~/utils/flash-session.server.ts'
-import { Container } from '../_marketing+/ui+/components/layout/container.tsx'
-import { H1 } from '../_marketing+/ui+/components/typography/h1.tsx'
-import { P } from '../_marketing+/ui+/components/typography/p.tsx'
+import { Container } from '~/ui_components/layout/container.tsx'
+import { H1 } from '~/ui_components/typography/h1.tsx'
+import { P } from '~/ui_components/typography/p.tsx'
export const onboardingEmailSessionKey = 'onboardingEmail'
diff --git a/app/routes/_auth+/reset-password.tsx b/app/routes/_auth+/reset-password.tsx
index 5f48a7f..bb3c3e6 100644
--- a/app/routes/_auth+/reset-password.tsx
+++ b/app/routes/_auth+/reset-password.tsx
@@ -9,9 +9,9 @@ import { StatusButton } from '~/components/ui/status-button.tsx'
import { authenticator, requireAnonymous, resetUserPassword } from '~/utils/auth.server.ts'
import { commitSession, getSession } from '~/utils/session.server.ts'
import { passwordSchema } from '~/utils/user-validation.ts'
-import { Container } from '../_marketing+/ui+/components/layout/container.tsx'
-import { H1 } from '../_marketing+/ui+/components/typography/h1.tsx'
-import { P } from '../_marketing+/ui+/components/typography/p.tsx'
+import { Container } from '~/ui_components/layout/container.tsx'
+import { H1 } from '~/ui_components/typography/h1.tsx'
+import { P } from '~/ui_components/typography/p.tsx'
export const resetPasswordUsernameSessionKey = 'resetPasswordUsername'
diff --git a/app/routes/_auth+/signup/index.tsx b/app/routes/_auth+/signup/index.tsx
index 8dd107d..d7a4721 100644
--- a/app/routes/_auth+/signup/index.tsx
+++ b/app/routes/_auth+/signup/index.tsx
@@ -12,9 +12,9 @@ import { getDomainUrl } from '~/utils/misc.ts'
import { generateTOTP } from '~/utils/totp.server.ts'
import { emailSchema } from '~/utils/user-validation.ts'
import { SignupEmail } from './email.server.tsx'
-import { Container } from '~/routes/_marketing+/ui+/components/layout/container.tsx'
-import { H1 } from '~/routes/_marketing+/ui+/components/typography/h1.tsx'
-import { P } from '~/routes/_marketing+/ui+/components/typography/p.tsx'
+import { Container } from '~/ui_components/layout/container.tsx'
+import { H1 } from '~/ui_components/typography/h1.tsx'
+import { P } from '~/ui_components/typography/p.tsx'
export const onboardingOTPQueryParam = 'code'
export const onboardingEmailQueryParam = 'email'
diff --git a/app/routes/_auth+/signup_.verify.tsx b/app/routes/_auth+/signup_.verify.tsx
index 5223fed..0ac85b4 100644
--- a/app/routes/_auth+/signup_.verify.tsx
+++ b/app/routes/_auth+/signup_.verify.tsx
@@ -10,9 +10,9 @@ import { commitSession, getSession } from '~/utils/session.server.ts'
import { verifyTOTP } from '~/utils/totp.server.ts'
import { onboardingEmailSessionKey } from './onboarding.tsx'
import { onboardingEmailQueryParam, onboardingOTPQueryParam, verificationType } from './signup/index.tsx'
-import { Container } from '../_marketing+/ui+/components/layout/container.tsx'
-import { H1 } from '../_marketing+/ui+/components/typography/h1.tsx'
-import { P } from '../_marketing+/ui+/components/typography/p.tsx'
+import { Container } from '~/ui_components/layout/container.tsx'
+import { H1 } from '~/ui_components/typography/h1.tsx'
+import { P } from '~/ui_components/typography/p.tsx'
const verifySchema = z.object({
[onboardingEmailQueryParam]: z.string().email(),
diff --git a/app/routes/_marketing+/about.tsx b/app/routes/_marketing+/about.tsx
index 6d13605..4da359c 100644
--- a/app/routes/_marketing+/about.tsx
+++ b/app/routes/_marketing+/about.tsx
@@ -1,8 +1,8 @@
-import { Container } from '~/routes/_marketing+/ui+/components/layout/container.tsx'
import HeroAndre from './components/hero-andre.tsx'
-import { H2 } from './ui+/components/typography/h2.tsx'
-import { P } from './ui+/components/typography/p.tsx'
import { type LinksFunction } from '@remix-run/node'
+import { Container } from '~/ui_components/layout/container.tsx'
+import { H2 } from '~/ui_components/typography/h2.tsx'
+import { P } from '~/ui_components/typography/p.tsx'
export const links: LinksFunction = () => {
return [{ rel: 'canonical', href: 'https://andrecasal.com/about' }]
diff --git a/app/routes/_marketing+/articles/_index.tsx b/app/routes/_marketing+/articles/_index.tsx
index c1e9dd5..f4f1c6f 100644
--- a/app/routes/_marketing+/articles/_index.tsx
+++ b/app/routes/_marketing+/articles/_index.tsx
@@ -1,19 +1,18 @@
import { useLoaderData } from '@remix-run/react'
-import { Container } from '~/routes/_marketing+/ui+/components/layout/container.tsx'
import { Newsletter } from '~/components/newsletter.tsx'
import BackgroundBlur from '../components/bg-blur.tsx'
import { ArticlePreview } from '~/components/ArticlePreview.tsx'
import { Button } from '~/components/ui/button.tsx'
import { useState } from 'react'
import { type LinksFunction, json } from '@remix-run/node'
-import { H1 } from '../ui+/components/typography/h1.tsx'
-
/* import { post as layout } from './layout/index.tsx' */
import { post as theDarkSideOfTheGridPost } from './the-dark-side-of-the-grid/index.tsx'
import { post as fluidSpacePost } from './fluid-space-sizing/index.tsx'
import { post as fluidTypographyPost } from './fluid-typography-sizing-with-modular-scales/index.tsx'
import { post as remixDataFlowPost } from './remix-data-flow/index.tsx'
-import { P } from '../ui+/components/typography/p.tsx'
+import { Container } from '~/ui_components/layout/container.tsx'
+import { H1 } from '~/ui_components/typography/h1.tsx'
+import { P } from '~/ui_components/typography/p.tsx'
export const links: LinksFunction = () => {
return [{ rel: 'canonical', href: 'https://andrecasal.com/articles' }]
diff --git a/app/routes/_marketing+/articles/fluid-space-sizing/index.tsx b/app/routes/_marketing+/articles/fluid-space-sizing/index.tsx
index 1201ad2..7fefcf7 100644
--- a/app/routes/_marketing+/articles/fluid-space-sizing/index.tsx
+++ b/app/routes/_marketing+/articles/fluid-space-sizing/index.tsx
@@ -1,11 +1,11 @@
import fluidSpaceSizingImage from './fluid-space-sizing.png'
import { Link } from '@remix-run/react'
-import { Kbd } from '../../ui+/components/typography/kbd.tsx'
import { type Post } from '../_index.tsx'
-import { H1 } from '../../ui+/components/typography/h1.tsx'
-import { H2 } from '../../ui+/components/typography/h2.tsx'
-import { P } from '../../ui+/components/typography/p.tsx'
import { type LinksFunction } from '@remix-run/node'
+import { H1 } from '~/ui_components/typography/h1.tsx'
+import { H2 } from '~/ui_components/typography/h2.tsx'
+import { P } from '~/ui_components/typography/p.tsx'
+import { Kbd } from '~/ui_components/typography/kbd.tsx'
export const post: Post = {
title: 'Fluid Space Sizing',
diff --git a/app/routes/_marketing+/articles/fluid-typography-sizing-with-modular-scales/index.tsx b/app/routes/_marketing+/articles/fluid-typography-sizing-with-modular-scales/index.tsx
index bc58c49..b9fee13 100644
--- a/app/routes/_marketing+/articles/fluid-typography-sizing-with-modular-scales/index.tsx
+++ b/app/routes/_marketing+/articles/fluid-typography-sizing-with-modular-scales/index.tsx
@@ -2,10 +2,10 @@ import { CodeBlock } from '~/components/ui/code-block.tsx'
import fluidTypographySizingWithModularScales from './fluid-typography.png'
import { type CSSProperties } from 'react'
import { type Post } from '../_index.tsx'
-import { H1 } from '../../ui+/components/typography/h1.tsx'
-import { H2 } from '../../ui+/components/typography/h2.tsx'
-import { P } from '../../ui+/components/typography/p.tsx'
import { type LinksFunction } from '@remix-run/node'
+import { H1 } from '~/ui_components/typography/h1.tsx'
+import { P } from '~/ui_components/typography/p.tsx'
+import { H2 } from '~/ui_components/typography/h2.tsx'
export const post: Post = {
title: 'Fluid Typography Sizing and Scales',
diff --git a/app/routes/_marketing+/articles/index.tsx b/app/routes/_marketing+/articles/index.tsx
index b2f33fc..c394907 100644
--- a/app/routes/_marketing+/articles/index.tsx
+++ b/app/routes/_marketing+/articles/index.tsx
@@ -1,6 +1,6 @@
import { Outlet } from '@remix-run/react'
import { Newsletter } from '~/components/newsletter.tsx'
-import { Container } from '~/routes/_marketing+/ui+/components/layout/container.tsx'
+import { Container } from '~/ui_components/layout/container.tsx'
const ArticlesLayoutRoute = () => {
return (
diff --git a/app/routes/_marketing+/articles/layout/index.tsx b/app/routes/_marketing+/articles/layout/index.tsx
index e358326..6b6e471 100644
--- a/app/routes/_marketing+/articles/layout/index.tsx
+++ b/app/routes/_marketing+/articles/layout/index.tsx
@@ -1,13 +1,13 @@
import layout from './layout.png'
import { type Post } from '../_index.tsx'
-import { H1 } from '../../ui+/components/typography/h1.tsx'
-import { H2 } from '../../ui+/components/typography/h2.tsx'
-import { P } from '../../ui+/components/typography/p.tsx'
-import { H3 } from '../../ui+/components/typography/h3.tsx'
-import { Code } from '../../ui+/components/typography/code.tsx'
-import { H4 } from '../../ui+/components/typography/h4.tsx'
import { CodeBlock } from '~/components/ui/code-block.tsx'
import { type LinksFunction } from '@remix-run/node'
+import { H1 } from '~/ui_components/typography/h1.tsx'
+import { P } from '~/ui_components/typography/p.tsx'
+import { H2 } from '~/ui_components/typography/h2.tsx'
+import { H3 } from '~/ui_components/typography/h3.tsx'
+import { H4 } from '~/ui_components/typography/h4.tsx'
+import { Code } from '~/ui_components/typography/code.tsx'
export const post: Post = {
title: 'CSS Layout Algorithms',
diff --git a/app/routes/_marketing+/articles/quotes/index.tsx b/app/routes/_marketing+/articles/quotes/index.tsx
index 1c67077..5a10d5f 100644
--- a/app/routes/_marketing+/articles/quotes/index.tsx
+++ b/app/routes/_marketing+/articles/quotes/index.tsx
@@ -1,7 +1,7 @@
import theDarkSideOfTheGrid from './the-dark-side-of-the-grid.png'
-import { H1 } from '../../ui+/components/typography/h1.tsx'
-import { H2 } from '../../ui+/components/typography/h2.tsx'
-import { P } from '../../ui+/components/typography/p.tsx'
+import { H1 } from '~/ui_components/typography/h1.tsx'
+import { P } from '~/ui_components/typography/p.tsx'
+import { H2 } from '~/ui_components/typography/h2.tsx'
export const title = 'Quotes'
export const description =
diff --git a/app/routes/_marketing+/articles/remix-data-flow/index.tsx b/app/routes/_marketing+/articles/remix-data-flow/index.tsx
index 9f679e8..476dde6 100644
--- a/app/routes/_marketing+/articles/remix-data-flow/index.tsx
+++ b/app/routes/_marketing+/articles/remix-data-flow/index.tsx
@@ -2,8 +2,8 @@ import remixDataFlow from './remix-data-flow.png'
import remixDataFlowDiagram from './remix-data-flow-diagram.png'
import { type LinksFunction, type V2_MetaFunction } from '@remix-run/node'
import { type Post } from '../_index.tsx'
-import { H1 } from '../../ui+/components/typography/h1.tsx'
-import { P } from '../../ui+/components/typography/p.tsx'
+import { H1 } from '~/ui_components/typography/h1.tsx'
+import { P } from '~/ui_components/typography/p.tsx'
export const post: Post = {
title: 'Remix Data Flow',
diff --git a/app/routes/_marketing+/articles/the-dark-side-of-the-grid/index.tsx b/app/routes/_marketing+/articles/the-dark-side-of-the-grid/index.tsx
index 622e86d..d661254 100644
--- a/app/routes/_marketing+/articles/the-dark-side-of-the-grid/index.tsx
+++ b/app/routes/_marketing+/articles/the-dark-side-of-the-grid/index.tsx
@@ -1,12 +1,12 @@
import theDarkSideOfTheGrid from './the-dark-side-of-the-grid.png'
import { Link } from '@remix-run/react'
-import { Kbd } from '../../ui+/components/typography/kbd.tsx'
import { CodeBlock } from '~/components/ui/code-block.tsx'
import { type Post } from '../_index.tsx'
-import { H1 } from '../../ui+/components/typography/h1.tsx'
-import { H2 } from '../../ui+/components/typography/h2.tsx'
-import { P } from '../../ui+/components/typography/p.tsx'
import { type LinksFunction } from '@remix-run/node'
+import { H1 } from '~/ui_components/typography/h1.tsx'
+import { P } from '~/ui_components/typography/p.tsx'
+import { H2 } from '~/ui_components/typography/h2.tsx'
+import { Kbd } from '~/ui_components/typography/kbd.tsx'
export const post: Post = {
title: 'The Dark Side Of The Grid (and Flexbox)',
diff --git a/app/routes/_marketing+/components/brands.tsx b/app/routes/_marketing+/components/brands.tsx
index d36c89a..d1fc7a9 100644
--- a/app/routes/_marketing+/components/brands.tsx
+++ b/app/routes/_marketing+/components/brands.tsx
@@ -1,8 +1,8 @@
import DiamondBackground from './bg-diamonds.tsx'
-import { Container } from '~/routes/_marketing+/ui+/components/layout/container.tsx'
import { trusted } from '../logos/logos.ts'
-import { H2 } from '../ui+/components/typography/h2.tsx'
-import { P } from '../ui+/components/typography/p.tsx'
+import { Container } from '~/ui_components/layout/container.tsx'
+import { P } from '~/ui_components/typography/p.tsx'
+import { H2 } from '~/ui_components/typography/h2.tsx'
const Brands = () => {
return (
diff --git a/app/routes/_marketing+/components/hero-andre.tsx b/app/routes/_marketing+/components/hero-andre.tsx
index f7bb5d6..4239b1b 100644
--- a/app/routes/_marketing+/components/hero-andre.tsx
+++ b/app/routes/_marketing+/components/hero-andre.tsx
@@ -1,10 +1,10 @@
import { Link } from '@remix-run/react'
import BackgroundDiagonal from './bg-diagonal.tsx'
-import { Container } from '~/routes/_marketing+/ui+/components/layout/container.tsx'
import { Button } from '~/components/ui/button.tsx'
import { Badge } from '~/components/ui/badge.tsx'
-import { H1 } from '../ui+/components/typography/h1.tsx'
-import { P } from '../ui+/components/typography/p.tsx'
+import { Container } from '~/ui_components/layout/container.tsx'
+import { H1 } from '~/ui_components/typography/h1.tsx'
+import { P } from '~/ui_components/typography/p.tsx'
const HeroAndre = () => {
return (
@@ -27,7 +27,12 @@ const HeroAndre = () => {
I'm a tech entrepreneur that loves to build stuff.
-
What have you built?
+
+ What have you built?
+
Let's build together
diff --git a/app/routes/_marketing+/courses+/index.tsx b/app/routes/_marketing+/courses+/index.tsx
index ab0f5c9..5772c62 100644
--- a/app/routes/_marketing+/courses+/index.tsx
+++ b/app/routes/_marketing+/courses+/index.tsx
@@ -1,9 +1,9 @@
-import { Container } from '~/routes/_marketing+/ui+/components/layout/container.tsx'
import { CoursePresentation } from '~/components/CoursePresentation.tsx'
import { Newsletter } from '~/components/newsletter.tsx'
-import { H1 } from '../ui+/components/typography/h1.tsx'
-import { P } from '../ui+/components/typography/p.tsx'
import { type LinksFunction } from '@remix-run/node'
+import { Container } from '~/ui_components/layout/container.tsx'
+import { H1 } from '~/ui_components/typography/h1.tsx'
+import { P } from '~/ui_components/typography/p.tsx'
export const links: LinksFunction = () => {
return [{ rel: 'canonical', href: 'https://andrecasal.com/courses' }]
diff --git a/app/routes/_marketing+/courses+/mastery-for-vs-code.tsx b/app/routes/_marketing+/courses+/mastery-for-vs-code.tsx
index 0574ad2..c834dd2 100644
--- a/app/routes/_marketing+/courses+/mastery-for-vs-code.tsx
+++ b/app/routes/_marketing+/courses+/mastery-for-vs-code.tsx
@@ -1,6 +1,5 @@
import { Link } from '@remix-run/react'
import BackgroundSquareLines from '../components/bg-square-lines.tsx'
-import { Container } from '~/routes/_marketing+/ui+/components/layout/container.tsx'
import { Icon } from '~/components/ui/icon.tsx'
import BackgroundBlur from '../components/bg-blur.tsx'
import { Button } from '~/components/ui/button.tsx'
@@ -11,13 +10,14 @@ import zacharyCassette from '../images/zachary-cassette.jpg'
import signatureBlack from '../images/signature-black.png'
import signatureWhite from '../images/signature-white.png'
import { Newsletter } from '~/components/newsletter.tsx'
-import { H1 } from '../ui+/components/typography/h1.tsx'
-import { H2 } from '../ui+/components/typography/h2.tsx'
-import { H3 } from '../ui+/components/typography/h3.tsx'
-import { H4 } from '../ui+/components/typography/h4.tsx'
-import { P } from '../ui+/components/typography/p.tsx'
-import { Span } from '../ui+/components/typography/span.tsx'
import { type LinksFunction } from '@remix-run/node'
+import { Container } from '~/ui_components/layout/container.tsx'
+import { H1 } from '~/ui_components/typography/h1.tsx'
+import { P } from '~/ui_components/typography/p.tsx'
+import { H2 } from '~/ui_components/typography/h2.tsx'
+import { H3 } from '~/ui_components/typography/h3.tsx'
+import { Span } from '~/ui_components/typography/span.tsx'
+import { H4 } from '~/ui_components/typography/h4.tsx'
export const links: LinksFunction = () => {
return [{ rel: 'canonical', href: 'https://andrecasal.com/courses/mastery-for-vs-code' }]
diff --git a/app/routes/_marketing+/explicacoes-de-programacao.tsx b/app/routes/_marketing+/explicacoes-de-programacao.tsx
index f570966..b9ebcab 100644
--- a/app/routes/_marketing+/explicacoes-de-programacao.tsx
+++ b/app/routes/_marketing+/explicacoes-de-programacao.tsx
@@ -1,4 +1,3 @@
-import { Container } from '~/routes/_marketing+/ui+/components/layout/container.tsx'
import { Button } from '~/components/ui/button.tsx'
import { Icon } from '~/components/ui/icon.tsx'
import BackgroundDiagonal from './components/bg-diagonal.tsx'
@@ -12,14 +11,15 @@ import miguelFerreira from './images/miguel-ferreira.png'
import satisfactionGuarantee from './images/satisfaction-guarantee.png'
import signatureBlack from './images/signature-black.png'
import signatureWhite from './images/signature-white.png'
-import { H1 } from './ui+/components/typography/h1.tsx'
-import { H2 } from './ui+/components/typography/h2.tsx'
-import { H3 } from './ui+/components/typography/h3.tsx'
-import { H4 } from './ui+/components/typography/h4.tsx'
-import { P } from './ui+/components/typography/p.tsx'
-import { Span } from './ui+/components/typography/span.tsx'
import { Link } from '@remix-run/react'
import { type LinksFunction, type V2_MetaFunction } from '@remix-run/node'
+import { Container } from '~/ui_components/layout/container.tsx'
+import { H1 } from '~/ui_components/typography/h1.tsx'
+import { P } from '~/ui_components/typography/p.tsx'
+import { H2 } from '~/ui_components/typography/h2.tsx'
+import { H3 } from '~/ui_components/typography/h3.tsx'
+import { Span } from '~/ui_components/typography/span.tsx'
+import { H4 } from '~/ui_components/typography/h4.tsx'
export const meta: V2_MetaFunction = () => {
return [
diff --git a/app/routes/_marketing+/index.tsx b/app/routes/_marketing+/index.tsx
index ea3a680..7c0aa7d 100644
--- a/app/routes/_marketing+/index.tsx
+++ b/app/routes/_marketing+/index.tsx
@@ -2,11 +2,11 @@ import type { LinksFunction, V2_MetaFunction } from '@remix-run/node'
import HeroAndre from './components/hero-andre.tsx'
import Brands from './components/brands.tsx'
import { Newsletter } from '~/components/newsletter.tsx'
-import { Container } from '~/routes/_marketing+/ui+/components/layout/container.tsx'
import { Icon } from '~/components/ui/icon.tsx'
import { Link } from '@remix-run/react'
-import { H2 } from './ui+/components/typography/h2.tsx'
-import { Span } from './ui+/components/typography/span.tsx'
+import { Container } from '~/ui_components/layout/container.tsx'
+import { H2 } from '~/ui_components/typography/h2.tsx'
+import { Span } from '~/ui_components/typography/span.tsx'
export const meta: V2_MetaFunction = () => [{ title: 'André Casal' }]
diff --git a/app/routes/_marketing+/mentorship.tsx b/app/routes/_marketing+/mentorship.tsx
index 2dec2cb..ce3798c 100644
--- a/app/routes/_marketing+/mentorship.tsx
+++ b/app/routes/_marketing+/mentorship.tsx
@@ -1,20 +1,20 @@
/* import { useState } from 'react'
import { Collapsible, CollapsibleContent, CollapsibleTrigger } from '~/components/ui/collapsible.tsx' */
import BackgroundSquareLines from './components/bg-square-lines.tsx'
-import { Container } from '~/routes/_marketing+/ui+/components/layout/container.tsx'
import BackgroundBlur from './components/bg-blur.tsx'
import { Icon } from '~/components/ui/icon.tsx'
import { Button } from '~/components/ui/button.tsx'
import { Link } from '@remix-run/react'
import zacharyCassette from './images/zachary-cassette.jpg'
-import { H1 } from './ui+/components/typography/h1.tsx'
-import { H2 } from './ui+/components/typography/h2.tsx'
-import { H3 } from './ui+/components/typography/h3.tsx'
-import { H4 } from './ui+/components/typography/h4.tsx'
-import { P } from './ui+/components/typography/p.tsx'
-import { Span } from './ui+/components/typography/span.tsx'
import { cn } from '~/utils/tailwind-merge.ts'
import { type LinksFunction } from '@remix-run/node'
+import { Container } from '~/ui_components/layout/container.tsx'
+import { H1 } from '~/ui_components/typography/h1.tsx'
+import { P } from '~/ui_components/typography/p.tsx'
+import { H2 } from '~/ui_components/typography/h2.tsx'
+import { H3 } from '~/ui_components/typography/h3.tsx'
+import { Span } from '~/ui_components/typography/span.tsx'
+import { H4 } from '~/ui_components/typography/h4.tsx'
export const links: LinksFunction = () => {
return [{ rel: 'canonical', href: 'https://andrecasal.com/mentorship' }]
diff --git a/app/routes/_marketing+/newsletter.tsx b/app/routes/_marketing+/newsletter.tsx
index 4ed2ce1..fb25e9f 100644
--- a/app/routes/_marketing+/newsletter.tsx
+++ b/app/routes/_marketing+/newsletter.tsx
@@ -1,4 +1,3 @@
-import { Container } from '~/routes/_marketing+/ui+/components/layout/container.tsx'
import { Resend } from 'resend'
import { type LinksFunction, json, type ActionArgs } from '@remix-run/node'
import { parse } from '@conform-to/zod'
@@ -7,6 +6,7 @@ import { emailSchema } from '~/utils/user-validation.ts'
import { Newsletter as NewsletterComponent } from '~/components/newsletter.tsx'
import { validateCSRF } from '~/utils/csrf.server.ts'
import { checkHoneypot } from '~/utils/honeypot.server.ts'
+import { Container } from '~/ui_components/layout/container.tsx'
export const links: LinksFunction = () => {
return [{ rel: 'canonical', href: 'https://andrecasal.com/newsletter' }]
diff --git a/app/routes/_marketing+/privacy.tsx b/app/routes/_marketing+/privacy.tsx
index 035a399..d06ea89 100644
--- a/app/routes/_marketing+/privacy.tsx
+++ b/app/routes/_marketing+/privacy.tsx
@@ -1,6 +1,6 @@
-import { Container } from '~/routes/_marketing+/ui+/components/layout/container.tsx'
-import { P } from './ui+/components/typography/p.tsx'
import { type LinksFunction } from '@remix-run/node'
+import { Container } from '~/ui_components/layout/container.tsx'
+import { P } from '~/ui_components/typography/p.tsx'
export const links: LinksFunction = () => {
return [{ rel: 'canonical', href: 'https://andrecasal.com/privacy' }]
diff --git a/app/routes/_marketing+/ship-fast/index.tsx b/app/routes/_marketing+/ship-fast/index.tsx
index a769b16..dbbf4ef 100644
--- a/app/routes/_marketing+/ship-fast/index.tsx
+++ b/app/routes/_marketing+/ship-fast/index.tsx
@@ -1,19 +1,19 @@
import { Icon } from '~/components/ui/icon.tsx'
-import { Container } from '../ui+/components/layout/container.tsx'
-import { Tabs } from '../ui+/components/ui/tabs.tsx'
import { Link } from '@remix-run/react'
import BackgroundBlur from '../components/bg-blur.tsx'
-import { Grid } from '../ui+/components/layout/grid.tsx'
import { cn } from '~/utils/tailwind-merge.ts'
-import { Flex } from '../ui+/components/layout/flex.tsx'
import { Button } from '~/components/ui/button.tsx'
import shipFastImage from './shipfast.png'
import arrow from './arrow.png'
import { Newsletter } from '~/components/newsletter.tsx'
-import { H1 } from '../ui+/components/typography/h1.tsx'
-import { H2 } from '../ui+/components/typography/h2.tsx'
-import { P } from '../ui+/components/typography/p.tsx'
import { type LinksFunction } from '@remix-run/node'
+import { Container } from '~/ui_components/layout/container.tsx'
+import { H1 } from '~/ui_components/typography/h1.tsx'
+import { P } from '~/ui_components/typography/p.tsx'
+import { Flex } from '~/ui_components/layout/flex.tsx'
+import { H2 } from '~/ui_components/typography/h2.tsx'
+import { Tabs } from '~/ui_components/ui/tabs.tsx'
+import { Grid } from '~/ui_components/layout/grid.tsx'
export const links: LinksFunction = () => {
return [{ rel: 'canonical', href: 'https://andrecasal.com/ship-fast' }]
diff --git a/app/routes/_marketing+/shorts.tsx b/app/routes/_marketing+/shorts.tsx
index 82361a3..9d751bd 100644
--- a/app/routes/_marketing+/shorts.tsx
+++ b/app/routes/_marketing+/shorts.tsx
@@ -1,7 +1,7 @@
import { Newsletter } from '~/components/newsletter.tsx'
-import { Container } from '~/routes/_marketing+/ui+/components/layout/container.tsx'
-import { P } from './ui+/components/typography/p.tsx'
import { type LinksFunction } from '@remix-run/node'
+import { Container } from '~/ui_components/layout/container.tsx'
+import { P } from '~/ui_components/typography/p.tsx'
export const links: LinksFunction = () => {
return [{ rel: 'canonical', href: 'https://andrecasal.com/shorts' }]
diff --git a/app/routes/_marketing+/talks.tsx b/app/routes/_marketing+/talks.tsx
index 400012b..1105b88 100644
--- a/app/routes/_marketing+/talks.tsx
+++ b/app/routes/_marketing+/talks.tsx
@@ -1,9 +1,9 @@
import { Link } from '@remix-run/react'
import { Newsletter } from '~/components/newsletter.tsx'
import { Button } from '~/components/ui/button.tsx'
-import { Container } from '~/routes/_marketing+/ui+/components/layout/container.tsx'
-import { P } from './ui+/components/typography/p.tsx'
import { type LinksFunction } from '@remix-run/node'
+import { Container } from '~/ui_components/layout/container.tsx'
+import { P } from '~/ui_components/typography/p.tsx'
export const links: LinksFunction = () => {
return [{ rel: 'canonical', href: 'https://andrecasal.com/talks' }]
diff --git a/app/routes/_marketing+/terms.tsx b/app/routes/_marketing+/terms.tsx
index 697d116..ed6b47f 100644
--- a/app/routes/_marketing+/terms.tsx
+++ b/app/routes/_marketing+/terms.tsx
@@ -1,6 +1,6 @@
-import { Container } from '~/routes/_marketing+/ui+/components/layout/container.tsx'
-import { P } from './ui+/components/typography/p.tsx'
import { type LinksFunction } from '@remix-run/node'
+import { Container } from '~/ui_components/layout/container.tsx'
+import { P } from '~/ui_components/typography/p.tsx'
export const links: LinksFunction = () => {
return [{ rel: 'canonical', href: 'https://andrecasal.com/terms' }]
diff --git a/app/routes/_marketing+/tips.tsx b/app/routes/_marketing+/tips.tsx
index a951583..0ddf4e1 100644
--- a/app/routes/_marketing+/tips.tsx
+++ b/app/routes/_marketing+/tips.tsx
@@ -1,9 +1,9 @@
import { Newsletter } from '~/components/newsletter.tsx'
import { CodeBlock, type Language } from '~/components/ui/code-block.tsx'
-import { Container } from '~/routes/_marketing+/ui+/components/layout/container.tsx'
-import { H2 } from './ui+/components/typography/h2.tsx'
-import { P } from './ui+/components/typography/p.tsx'
import { type LinksFunction } from '@remix-run/node'
+import { Container } from '~/ui_components/layout/container.tsx'
+import { H2 } from '~/ui_components/typography/h2.tsx'
+import { P } from '~/ui_components/typography/p.tsx'
export const links: LinksFunction = () => {
return [{ rel: 'canonical', href: 'https://andrecasal.com/tips' }]
diff --git a/app/routes/_marketing+/transparency.tsx b/app/routes/_marketing+/transparency.tsx
index 8c1f58c..841eb72 100644
--- a/app/routes/_marketing+/transparency.tsx
+++ b/app/routes/_marketing+/transparency.tsx
@@ -1,6 +1,6 @@
-import { Container } from '~/routes/_marketing+/ui+/components/layout/container.tsx'
-import { P } from './ui+/components/typography/p.tsx'
import { type LinksFunction } from '@remix-run/node'
+import { Container } from '~/ui_components/layout/container.tsx'
+import { P } from '~/ui_components/typography/p.tsx'
export const links: LinksFunction = () => {
return [{ rel: 'canonical', href: 'https://andrecasal.com/transparency' }]
diff --git a/app/routes/_marketing+/tutoring.tsx b/app/routes/_marketing+/tutoring.tsx
index 02639bd..bdb65c9 100644
--- a/app/routes/_marketing+/tutoring.tsx
+++ b/app/routes/_marketing+/tutoring.tsx
@@ -1,4 +1,3 @@
-import { Container } from '~/routes/_marketing+/ui+/components/layout/container.tsx'
import { Button } from '~/components/ui/button.tsx'
import { Icon } from '~/components/ui/icon.tsx'
import BackgroundDiagonal from './components/bg-diagonal.tsx'
@@ -12,14 +11,15 @@ import miguelFerreira from './images/miguel-ferreira.png'
import satisfactionGuarantee from './images/satisfaction-guarantee.png'
import signatureBlack from './images/signature-black.png'
import signatureWhite from './images/signature-white.png'
-import { H1 } from './ui+/components/typography/h1.tsx'
-import { H2 } from './ui+/components/typography/h2.tsx'
-import { H3 } from './ui+/components/typography/h3.tsx'
-import { H4 } from './ui+/components/typography/h4.tsx'
-import { P } from './ui+/components/typography/p.tsx'
-import { Span } from './ui+/components/typography/span.tsx'
import { Link } from '@remix-run/react'
import { type LinksFunction } from '@remix-run/node'
+import { Container } from '~/ui_components/layout/container.tsx'
+import { H1 } from '~/ui_components/typography/h1.tsx'
+import { P } from '~/ui_components/typography/p.tsx'
+import { H2 } from '~/ui_components/typography/h2.tsx'
+import { H3 } from '~/ui_components/typography/h3.tsx'
+import { Span } from '~/ui_components/typography/span.tsx'
+import { H4 } from '~/ui_components/typography/h4.tsx'
export const links: LinksFunction = () => {
return [{ rel: 'canonical', href: 'https://andrecasal.com/tutoring' }]
diff --git a/app/routes/_marketing+/ui+/_layout.tsx b/app/routes/_marketing+/ui+/_layout.tsx
deleted file mode 100644
index deb6bda..0000000
--- a/app/routes/_marketing+/ui+/_layout.tsx
+++ /dev/null
@@ -1,270 +0,0 @@
-import { SlideInDialog, SlideInDialogTrigger, SlideInDialogContent } from './components/ui/slide-in-dialog.tsx'
-import { Container } from '~/routes/_marketing+/ui+/components/layout/container.tsx'
-import { Icon } from '~/components/ui/icon.tsx'
-import { NavLink, Outlet } from '@remix-run/react'
-import { useState } from 'react'
-import { Flex } from './components/layout/flex.tsx'
-import { ScrollArea } from './components/layout/scroll-area.tsx'
-import { H2 } from './components/typography/h2.tsx'
-import { Span } from './components/typography/span.tsx'
-
-const SideMenu = ({ setIsOpen }: { setIsOpen?: (a: boolean) => void }) => {
- const navigation = [
- {
- name: 'Getting Started',
- items: [
- { name: 'Why', href: '/ui/why', done: true },
- { name: 'Architecture', href: '/ui/architecture', done: true },
- { name: 'Design Principles', href: '/ui/design-principles', done: true },
- { name: 'Development Principles', href: '/ui/development-principles', done: true },
- { name: 'Taxonomy', href: '/ui/taxonomy', done: true },
- /* { name: 'Nomenclature', href: '/ui/nomenclature', done: true }, */
- ],
- },
- {
- name: 'Theme',
- items: [
- { name: 'Overview', href: '/ui/theme/overview', done: true },
- { name: 'Dark Mode', href: '/ui/theme/dark-mode', done: true },
- ],
- },
- {
- name: 'Layout',
- items: [
- { name: 'Flex', href: '/ui/layout/flex', done: true },
- { name: 'Grid', href: '/ui/layout/grid', done: true },
- { name: 'Container', href: '/ui/layout/container', done: true },
- { name: 'Sticky', href: '/ui/layout/sticky', done: true },
- { name: 'Scroll Area', href: '/ui/layout/scroll-area', done: true },
- { name: 'Divider', href: '/ui/layout/divider', done: true },
- { name: 'Aspect Ratio', href: '/ui/layout/aspect-ratio', done: true },
- { name: 'Visually Hidden', href: '/ui/layout/visually-hidden', done: true },
- ],
- },
- {
- name: 'Modals',
- items: [
- { name: 'Dialog', href: '/ui/modals/dialog', done: true },
- { name: 'Alert Dialog', href: '/ui/modals/alert-dialog', done: true },
- { name: 'Drawer', href: '/ui/modals/drawer', done: true },
- { name: 'Dropdown Menu', href: '/ui/modals/dropdown-menu', done: false },
- { name: 'Upload Dialog', href: '/ui/modals/upload-dialog', done: false },
- { name: 'Search Dialog', href: '/ui/modals/search-dialog', done: false },
- ],
- },
- {
- name: 'Overlays',
- items: [
- { name: 'Tooltip', href: '/ui/overlays/tooltip', done: false },
- { name: 'Hover Card', href: '/ui/overlays/hover-card', done: false },
- { name: 'Context Menu', href: '/ui/overlays/context-menu', done: false },
- { name: 'Popover', href: '/ui/overlays/popover', done: false },
- ],
- },
- {
- name: 'Navigation',
- items: [
- { name: 'A', href: '/ui/navigation/a', done: false },
- { name: 'Navigation Menu', href: '/ui/navigation/navigation-menu', done: true },
- { name: 'Breadcrumbs', href: '/ui/navigation/breadcrumbs', done: false },
- { name: 'Pagination', href: '/ui/navigation/pagination', done: false },
- { name: 'Stepper', href: '/ui/navigation/stepper', done: false },
- ],
- },
- {
- name: 'Disclosure',
- items: [
- { name: 'Collapsible', href: '/ui/disclosure/collapsible', done: false },
- { name: 'Accordion', href: '/ui/disclosure/accordion', done: false },
- { name: 'Tabs', href: '/ui/disclosure/tabs', done: true },
- ],
- },
- {
- name: 'Typography',
- items: [
- { name: 'H1', href: '/ui/typography/h1', done: true },
- { name: 'H2', href: '/ui/typography/h2', done: true },
- { name: 'H3', href: '/ui/typography/h3', done: true },
- { name: 'H4', href: '/ui/typography/h4', done: true },
- { name: 'H5', href: '/ui/typography/h5', done: true },
- { name: 'H6', href: '/ui/typography/h6', done: true },
- { name: 'P', href: '/ui/typography/p', done: true },
- { name: 'Span', href: '/ui/typography/span', done: true },
- { name: 'Em', href: '/ui/typography/em', done: true },
- { name: 'I', href: '/ui/typography/i', done: true },
- { name: 'Strong', href: '/ui/typography/strong', done: true },
- { name: 'B', href: '/ui/typography/b', done: true },
- { name: 'Q', href: '/ui/typography/q', done: true },
- { name: 'Blockquote', href: '/ui/typography/blockquote', done: false },
- { name: 'Ul', href: '/ui/typography/ul', done: true },
- { name: 'Ol', href: '/ui/typography/ol', done: true },
- { name: 'Li', href: '/ui/typography/li', done: true },
- { name: 'Kbd', href: '/ui/typography/kbd', done: true },
- { name: 'Code', href: '/ui/typography/code', done: true },
- { name: 'Table of Contents', href: '/ui/typography/table-of-contents', done: false },
- ],
- },
- {
- name: 'Media',
- items: [
- { name: 'Icon', href: '/ui/media/icon', done: false },
- { name: 'Avatar', href: '/ui/media/avatar', done: false },
- { name: 'Avatar Group', href: '/ui/media/avatar-group', done: false },
- { name: 'Image', href: '/ui/media/image', done: false },
- { name: 'Video', href: '/ui/media/video', done: false },
- ],
- },
- {
- name: 'Notifications',
- items: [
- { name: 'Notification', href: '/ui/notifications/notification', done: false },
- { name: 'Notification Panel', href: '/ui/notifications/notification-panel', done: false },
- { name: 'Toast', href: '/ui/notifications/toast', done: false },
- { name: 'Alert', href: '/ui/notifications/alert', done: false },
- ],
- },
- {
- name: 'Status',
- items: [
- { name: 'Spinner', href: '/ui/status/spinner', done: false },
- { name: 'Progress Bar', href: '/ui/status/progress-bar', done: false },
- ],
- },
- {
- name: 'Actions',
- items: [
- { name: 'Button', href: '/ui/actions/button', done: false },
- { name: 'Burger Button', href: '/ui/actions/burger-button', done: false },
- { name: 'Button Group', href: '/ui/actions/button-group', done: false },
- ],
- },
- {
- name: 'Data Display',
- items: [
- { name: 'Article Preview', href: '/ui/data-display/article-preview', done: false },
- { name: 'Badge', href: '/ui/data-display/badge', done: false },
- { name: 'Card', href: '/ui/data-display/card', done: false },
- { name: 'Command Line', href: '/ui/data-display/command-line', done: true },
- { name: 'Table', href: '/ui/data-display/table', done: false },
- { name: 'Tag', href: '/ui/data-display/tag', done: false },
- { name: 'Tag Group', href: '/ui/data-display/tag-group', done: false },
- { name: 'Tag Picker', href: '/ui/data-display/tag-picker', done: false },
- { name: 'Testimonial', href: '/ui/data-display/testimonial', done: false },
- { name: 'Product Tile', href: '/ui/data-display/product-tile', done: false },
- { name: 'Skeleton', href: '/ui/data-display/skeleton', done: false },
- { name: 'Statistic', href: '/ui/data-display/statistic', done: false },
- ],
- },
- {
- name: 'Form elements',
- items: [
- { name: 'Address Input', href: '/ui/form-elements/address-input', done: false },
- { name: 'Checkbox', href: '/ui/form-elements/checkbox', done: false },
- { name: 'Calendar Input', href: '/ui/form-elements/calendar-input', done: false },
- { name: 'Calendar Range Input', href: '/ui/form-elements/calendar-range-input', done: false },
- { name: 'Color Picker', href: '/ui/form-elements/color-picker', done: false },
- { name: 'Currency Input', href: '/ui/form-elements/currency-input', done: false },
- { name: 'Credit Card Input', href: '/ui/form-elements/credit-card-input', done: false },
- { name: 'Date Input', href: '/ui/form-elements/date-input', done: false },
- { name: 'Date Picker', href: '/ui/form-elements/date-picker', done: false },
- { name: 'Date Range Input', href: '/ui/form-elements/date-range-input', done: false },
- { name: 'Date Range Picker', href: '/ui/form-elements/date-range-picker', done: false },
- { name: 'Fieldset', href: '/ui/form-elements/fieldset', done: false },
- { name: 'File Input', href: '/ui/form-elements/file-input', done: false },
- { name: 'File Dropzone', href: '/ui/form-elements/file-dropzone', done: false },
- { name: 'File Picker', href: '/ui/form-elements/file-picker', done: false },
- { name: 'Label', href: '/ui/form-elements/label', done: false },
- { name: 'Pin Input', href: '/ui/form-elements/pin-input', done: false },
- { name: 'Phone Number Input', href: '/ui/form-elements/phone-number-input', done: false },
- { name: 'Radio Button', href: '/ui/form-elements/radio-button', done: false },
- { name: 'Radio Group', href: '/ui/form-elements/radio-group', done: false },
- { name: 'Range Slider', href: '/ui/form-elements/range-slider', done: false },
- { name: 'Rating', href: '/ui/form-elements/rating', done: false },
- { name: 'Search Input', href: '/ui/form-elements/search-input', done: false },
- { name: 'Switch', href: '/ui/form-elements/switch', done: false },
- { name: 'Segmented Control', href: '/ui/form-elements/segmented-control', done: false },
- { name: 'Select', href: '/ui/form-elements/select', done: false },
- { name: 'Slider', href: '/ui/form-elements/slider', done: false },
- { name: 'Text Input', href: '/ui/form-elements/text-input', done: false },
- { name: 'Textarea', href: '/ui/form-elements/textarea', done: false },
- { name: 'Toggle', href: '/ui/form-elements/toggle', done: false },
- { name: 'Toggle Group', href: '/ui/form-elements/toggle-group', done: false },
- { name: 'URL Input', href: '/ui/form-elements/url-input', done: false },
- ],
- },
- ]
-
- const completed = navigation.reduce((acc, { items }) => acc + items.filter(({ done }) => done).length, 0)
- const total = navigation.reduce((acc, { items }) => acc + items.length, 0)
- const percentage = Math.round((completed / total) * 100)
-
- return (
-
-
-
{`${percentage}% complete`}
- {navigation.map(({ name, items }) => (
-
-
- {name}
-
-
- {items.map(link => (
- (setIsOpen ? setIsOpen(false) : undefined)} />
- ))}
-
-
- ))}
-
-
- )
-}
-
-type BoldNavLinkProps = {
- name: string
- href: string
- done: boolean
- onClick: () => void
-}
-
-const BoldNavLink = ({ name, href, done, onClick, ...props }: BoldNavLinkProps) => {
- return done ? (
-
onClick()} {...props}>
- {name}
-
- ) : (
-
- {name} (soon)
-
- )
-}
-
-const UI = () => {
- const [isOpen, setIsOpen] = useState(false)
-
- return (
- <>
-
-
-
-
- Open side menu
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- >
- )
-}
-export default UI
diff --git a/app/routes/_marketing+/ui+/architecture.tsx b/app/routes/_marketing+/ui+/architecture.tsx
deleted file mode 100644
index 1219547..0000000
--- a/app/routes/_marketing+/ui+/architecture.tsx
+++ /dev/null
@@ -1,73 +0,0 @@
-import { Container } from '~/routes/_marketing+/ui+/components/layout/container.tsx'
-import architecture from './images/architecture.jpg'
-import designSystem from './images/design-system.webp'
-import { H1 } from './components/typography/h1.tsx'
-import { H2 } from './components/typography/h2.tsx'
-import { P } from './components/typography/p.tsx'
-
-const Architecture = () => {
- return (
-
- Architecture
-
- Here's an image to help you understand how andrecasal/ui works.
-
-
- The library only encompasses design tokens and components for now, but I will add patterns later.
-
-
-
-
- Image taken from https://uxdesign.cc/atomic-design-2022-what-we-can-learn-from-eames-and-other-design-giants-4d8e2f579daa
-
-
-
- And here's a drawing to help you understand how to set design tokens and how they propagate through the system.
-
-
- Right click and choose "Open image in new tab" to see it in full size.
-
-
-
- andrecasal/ui architecture
-
-
- Theme Panel
-
-
- The Theme Panel is a drop in component that allows you to preview the theme configuration in real time. This is probably the last component I'll build.
-
-
- Full theme control with CSS variables
-
-
- The theme is completely controlled by CSS variables. These CSS variables are colocated in a single CSS file.
-
-
- Custom utility-based TailwindCSS classes
-
-
- These CSS variables drive custom, prefixed, utility-based TailwindCSS classes. This has a few benefits:
-
-
-
- It becomes obvious which classes are original to TailwindCSS and which are controlled by CSS variables.
-
-
- The usual utility-based benefits (small codebase, no classes you don't know whether or not you can delete, etc)
-
-
- Theme transitions without a Flash Of Incorrect Theme
-
-
-
- Components use the custom classes
-
-
- Because the components use these custom classes, they become theme controlled. Additionally, you still have the full power of the usual TailwindCSS classes at your disposal
- to use inside the components and other parts of your app.
-
-
- )
-}
-export default Architecture
diff --git a/app/routes/_marketing+/ui+/data-display+/command-line.tsx b/app/routes/_marketing+/ui+/data-display+/command-line.tsx
deleted file mode 100644
index c9ea0d2..0000000
--- a/app/routes/_marketing+/ui+/data-display+/command-line.tsx
+++ /dev/null
@@ -1,154 +0,0 @@
-import { json } from '@remix-run/node'
-import { CodeBlock } from '~/components/ui/code-block.tsx'
-import { fileURLToPath } from 'url'
-import path, { dirname } from 'path'
-import { promises as fs } from 'fs'
-import { useLoaderData } from '@remix-run/react'
-import { type CommandAndLogArray, CommandLine } from '~/routes/_marketing+/ui+/components/typography/command-line.tsx'
-import { Icon } from '~/components/ui/icon.tsx'
-import { H1 } from '../components/typography/h1.tsx'
-import { H2 } from '../components/typography/h2.tsx'
-import { P } from '../components/typography/p.tsx'
-
-export const loader = async () => {
- const basePath = '../app/routes/'
- const __filename = fileURLToPath(import.meta.url)
- const __dirname = dirname(__filename)
- const filePath = path.join(__dirname, basePath, '/_marketing+/ui+/components/typography/command-line.tsx')
- const source = await fs.readFile(filePath, 'utf-8')
- return json({ source })
-}
-
-const CommandLineRoute = () => {
- const { source } = useLoaderData
()
- const singleCommandLineUsageExample: CommandAndLogArray = [{ type: 'command', text: `npm i -D tailwindcss` }]
- const multipleCommandLineUsageExample = `
-Here's the inline component with an array in action:{' '}
-
- --------------
- \\ ^__^
- \\ (oo)\\_______
- (__)\\ )\\/\\
- ||----w |
- || ||\`,
- },
- { type: 'command', text: 'npx prisma db seed' },
- {
- type: 'log',
- text: \`Need to install the following packages:
- prisma@5.3.0
-Ok to proceed? (y) y\`,
- },
- { type: 'command', text: 'npm run dev' },
- ]}
-/>`
-
- return (
- <>
- Command Line
- A semantic command line element that supports copy to clipboard.
-
-
- Features
-
-
-
-
-
-
- Accepts commands and outputs as an array of objects.
-
-
-
-
-
- Copy to clipboard.
-
-
-
-
- Usage
-
-
- Here's the {' '} component in action:
-
-
- --------------
- \\ ^__^
- \\ (oo)\\_______
- (__)\\ )\\/\\
- ||----w |
- || ||`,
- },
- { type: 'command', text: 'npx prisma db seed' },
- {
- type: 'log',
- text: `Need to install the following packages:
- prisma@5.3.0
-Ok to proceed? (y) y`,
- },
- { type: 'command', text: `npm run dev` },
- ]}
- />
-
-
- Props
-
-
-
-
-
-
- Prop
-
-
- Type
-
-
- Default
-
-
-
-
-
- command
- {"{ type: 'command' | 'log'; text: string }[]"}
- undefined
-
-
-
-
-
-
- Source
-
-
-
-
- Styling
-
-
- This component is made for developers, so the styling is not based on CSS variables a designer can control, but it's built-in into the component and you can change it however
- you like. I made it look like the{' '}
-
- Cobalt2 powerline
-
- , which is what I use in my VS Code.
-
- >
- )
-}
-export default CommandLineRoute
diff --git a/app/routes/_marketing+/ui+/design-principles.tsx b/app/routes/_marketing+/ui+/design-principles.tsx
deleted file mode 100644
index 6918228..0000000
--- a/app/routes/_marketing+/ui+/design-principles.tsx
+++ /dev/null
@@ -1,28 +0,0 @@
-import { Link } from '@remix-run/react'
-import { H1 } from './components/typography/h1.tsx'
-import { H2 } from './components/typography/h2.tsx'
-import { P } from './components/typography/p.tsx'
-
-const DesignPrinciples = () => {
- return (
-
-
- Design Principles
-
-
- I've written a few articles about design principles that I've used to build this library.
-
-
-
- Fluid Typography Sizing and Scales
-
-
-
-
- Fluid Space Sizing
-
-
-
- )
-}
-export default DesignPrinciples
diff --git a/app/routes/_marketing+/ui+/development-principles.tsx b/app/routes/_marketing+/ui+/development-principles.tsx
deleted file mode 100644
index 705edd7..0000000
--- a/app/routes/_marketing+/ui+/development-principles.tsx
+++ /dev/null
@@ -1,50 +0,0 @@
-import { Code } from './components/typography/code.tsx'
-import { H1 } from './components/typography/h1.tsx'
-import { H2 } from './components/typography/h2.tsx'
-import { P } from './components/typography/p.tsx'
-
-const DevelopmentPrinciples = () => {
- return (
- <>
-
- Development Principles
-
-
- HTML syntax
-
-
- Except the fact that you're using uppercased tag names, using this library should feel just like writing HTML. Children will always go inside the tags and props control other
- behavior: {'Click me '}
instead of {'Click me '}
.
-
-
- Ideally, all atomic components (components that have a direct HTML counterpart) should be able to go from lowercase to uppercase without any other changes.
-
-
-
- The least self-referential as possible
-
-
- Some components benefit from the styles and functionality of other, usually lower-level, components. A common use-case is the {''} component, which is used in a few
- higher-level components. However, I try to keep this at a minimum so that a change in a component is as much self-contained as possible.
-
-
-
- Decoupled design and development
-
-
- This library is made with a clear separation of concerns between design and development. When you're building you don't have to focus on design, just use whatever defaults
- you have. When you decide to focus on design (or when the designer comes in), the entire interface design is completely controled by CSS variables in the tailwind.css file.
-
-
-
- Excellent defaults
-
-
- Even though you have complete control over the components, and the code is yours, I'll do my best so that you rarelly have to change any code. The aim is to make the
- components so good that you'd prefer to give up control and install from an NPM package than to have them explicitly in your codebase. At that point, I'll create an NPM
- package for that, but you'll always have both options.
-
- >
- )
-}
-export default DevelopmentPrinciples
diff --git a/app/routes/_marketing+/ui+/disclosure+/tabs.tsx b/app/routes/_marketing+/ui+/disclosure+/tabs.tsx
deleted file mode 100644
index 7721808..0000000
--- a/app/routes/_marketing+/ui+/disclosure+/tabs.tsx
+++ /dev/null
@@ -1,166 +0,0 @@
-import { json } from '@remix-run/node'
-import { CodeBlock } from '~/components/ui/code-block.tsx'
-import { fileURLToPath } from 'url'
-import path, { dirname } from 'path'
-import { promises as fs } from 'fs'
-import { useLoaderData } from '@remix-run/react'
-import { Icon } from '~/components/ui/icon.tsx'
-import { Tabs } from '../components/ui/tabs.tsx'
-import { Flex } from '../components/layout/flex.tsx'
-import { H1 } from '../components/typography/h1.tsx'
-import { H2 } from '../components/typography/h2.tsx'
-import { P } from '../components/typography/p.tsx'
-
-export const loader = async () => {
- const basePath = '../app/routes/'
- const __filename = fileURLToPath(import.meta.url)
- const __dirname = dirname(__filename)
- const filePath = path.join(__dirname, basePath, '/_marketing+/ui+/components/ui/tabs.tsx')
- const source = await fs.readFile(filePath, 'utf-8')
- return json({ source })
-}
-
-const HeadingRoute = () => {
- const { source } = useLoaderData()
- const usageExample = `
-
- Login
- Register
-
-
-
-
- Login
-
-
-
-
-
- Register
-
-
-
-
- `
-
- return (
- <>
- Tabs
- Set of content sections to be displayed one at a time.
-
-
- Features
-
-
-
-
-
-
- Can be controlled or uncontrolled.
-
-
-
-
-
- Supports horizontal/vertical orientation.
-
-
-
-
-
- Supports automatic/manual activation.
-
-
-
-
-
- Full keyboard navigation.
-
-
-
-
- Usage
-
-
- Here are the tabs in action.
-
-
- Login
- Register
-
-
-
- Login
-
-
-
- Register
-
-
-
-
-
-
- Source
-
-
- >
- )
-}
-export default HeadingRoute
diff --git a/app/routes/_marketing+/ui+/images/architecture.jpg b/app/routes/_marketing+/ui+/images/architecture.jpg
deleted file mode 100644
index 1a79c951869f210ff718d6365dea453dcf7f5640..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 1405149
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