From e8814a7ace712ce1d2fecc9ccd41aa7a07ae8cbc Mon Sep 17 00:00:00 2001 From: Michael Brusegard <56915010+michaelbrusegard@users.noreply.github.com> Date: Mon, 16 Sep 2024 03:38:42 +0200 Subject: [PATCH 1/5] feat: use fluid for padding --- README.md | 3 ++ bun.lockb | Bin 224786 -> 226424 bytes package.json | 2 + src/app/[locale]/layout.tsx | 15 +++--- src/components/layout/Footer.tsx | 54 ++++++++++---------- src/components/layout/Header.tsx | 2 +- src/components/layout/LogoLink.tsx | 4 +- src/components/layout/Main.tsx | 4 +- src/components/news/ArticleItemSkeleton.tsx | 2 +- src/components/news/CardGridSkeleton.tsx | 2 +- src/lib/utils.ts | 5 +- tailwind.config.ts | 17 ++++-- 12 files changed, 63 insertions(+), 47 deletions(-) diff --git a/README.md b/README.md index 11fbb20..ff10aff 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,9 @@ Here is a list of documentation to help you get started: #### Styling - [Tailwind CSS](https://tailwindcss.com/docs) - Styling library + - [Fluid for Tailwind](https://fluid.tw/#basic-usage) - Fluid scale utility breakpoints + - [tailwindcss-animate](https://github.com/jamiebuilds/tailwindcss-animate) - Animation utility classes + - [tailwind-scrollbar](https://github.com/adoxography/tailwind-scrollbar) - Customize scrollbar with tailwind - [Class Variance Authority](https://beta.cva.style/) - Tool for creating style variants in our UI components - [shadcn/ui](https://ui.shadcn.com/docs) - Reusable UI components - [Radix UI Primitives](https://www.radix-ui.com/primitives/docs/overview/introduction) - Primitives library that shadcn/ui is built on, great documentation if you need to access the underlying components diff --git a/bun.lockb b/bun.lockb index ebf6923c44a4393c76b0f648ffb143ae6b546a67..bf237af4ff686de289547198d3b8790cd5005358 100755 GIT binary patch delta 35500 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 delta 34887 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 diff --git a/package.json b/package.json index 61d917a..1106f92 100644 --- a/package.json +++ b/package.json @@ -59,10 +59,12 @@ }, "devDependencies": { "@biomejs/biome": "1.8.3", + "@fluid-tailwind/tailwind-merge": "^0.0.2", "@types/node": "^20.14.8", "@types/react": "^18.3.3", "@types/react-dom": "^18.3.0", "drizzle-kit": "^0.24.1", + "fluid-tailwind": "^1.0.3", "lefthook": "^1.7.14", "postcss": "^8.4.38", "tailwind-scrollbar": "^3.1.0", diff --git a/src/app/[locale]/layout.tsx b/src/app/[locale]/layout.tsx index fdfa2c5..0d842cf 100644 --- a/src/app/[locale]/layout.tsx +++ b/src/app/[locale]/layout.tsx @@ -1,6 +1,7 @@ import { RootProviders } from '@/components/providers/RootProviders'; import { routing } from '@/lib/locale'; import { cx } from '@/lib/utils'; +import type { Viewport } from 'next'; import { getTranslations, unstable_setRequestLocale } from 'next-intl/server'; import { Inter, Montserrat } from 'next/font/google'; @@ -25,6 +26,10 @@ export function generateStaticParams() { return routing.locales.map((locale) => ({ locale })); } +export const viewport: Viewport = { + themeColor: '#0c0a09', +}; + export async function generateMetadata({ params: { locale }, }: Omit) { @@ -61,10 +66,6 @@ export async function generateMetadata({ }, { rel: 'manifest', url: '/favicon/site.webmanifest' }, ], - meta: [ - { name: 'msapplication-TileColor', content: '#0c0a09' }, - { name: 'theme-color', content: '#0c0a09' }, - ], }; } @@ -75,14 +76,14 @@ export default function LocaleLayout({ unstable_setRequestLocale(locale); return ( - + -
+
{children}
diff --git a/src/components/layout/Footer.tsx b/src/components/layout/Footer.tsx index 899d8b0..6822c9e 100644 --- a/src/components/layout/Footer.tsx +++ b/src/components/layout/Footer.tsx @@ -175,34 +175,32 @@ function Footer() {

- +
    +
  • + +
  • +
  • + +
  • +

{t('copyright')} © {year}, Hackerspace NTNU.{' '} {t('allRightsReserved')}. diff --git a/src/components/layout/Header.tsx b/src/components/layout/Header.tsx index c81eba8..202ca13 100644 --- a/src/components/layout/Header.tsx +++ b/src/components/layout/Header.tsx @@ -9,7 +9,7 @@ import { useTranslations } from 'next-intl'; function Header() { const t = useTranslations('layout'); return ( -

+
- - + + HACKERSPACE diff --git a/src/components/layout/Main.tsx b/src/components/layout/Main.tsx index 8d3211a..e8407f6 100644 --- a/src/components/layout/Main.tsx +++ b/src/components/layout/Main.tsx @@ -1,7 +1,7 @@ import { cx } from '@/lib/utils'; type MainProps = { - children?: React.ReactNode; + children: React.ReactNode; className?: string; }; @@ -9,7 +9,7 @@ function Main({ children, className }: MainProps) { return (
diff --git a/src/components/news/ArticleItemSkeleton.tsx b/src/components/news/ArticleItemSkeleton.tsx index d90e40b..5037918 100644 --- a/src/components/news/ArticleItemSkeleton.tsx +++ b/src/components/news/ArticleItemSkeleton.tsx @@ -4,7 +4,7 @@ function ArticleItemSkeleton() { return (
- +
diff --git a/src/components/news/CardGridSkeleton.tsx b/src/components/news/CardGridSkeleton.tsx index 09a1392..d88c6ab 100644 --- a/src/components/news/CardGridSkeleton.tsx +++ b/src/components/news/CardGridSkeleton.tsx @@ -8,7 +8,7 @@ function CardGridSkeleton() { {Array.from({ length: 4 }).map((_, index) => ( Date: Mon, 16 Sep 2024 04:06:33 +0200 Subject: [PATCH 2/5] feat: fix biome to format classes --- biome.json | 11 +++++++++-- package.json | 2 +- src/components/layout/Header.tsx | 2 +- src/components/layout/Main.tsx | 2 +- src/components/ui/Badge.tsx | 2 +- src/components/ui/Button.tsx | 2 +- src/components/ui/Sheet.tsx | 10 +++++----- 7 files changed, 19 insertions(+), 12 deletions(-) diff --git a/biome.json b/biome.json index c477d54..11d1c49 100644 --- a/biome.json +++ b/biome.json @@ -1,5 +1,5 @@ { - "$schema": "https://biomejs.dev/schemas/1.8.3/schema.json", + "$schema": "https://biomejs.dev/schemas/1.9.1/schema.json", "formatter": { "enabled": true, "indentStyle": "space" @@ -12,7 +12,14 @@ "rules": { "recommended": true, "nursery": { - "useSortedClasses": "warn" + "useSortedClasses": { + "level": "warn", + "fix": "safe", + "options": { + "attributes": ["className"], + "functions": ["cva", "cx"] + } + } } } }, diff --git a/package.json b/package.json index 1106f92..133853d 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "prebuild": "next telemetry disable", "build": "next build", "dev": "next dev --turbo", - "lint": "biome check --write --unsafe", + "lint": "biome check --write", "start": "next start", "db:start": "docker-compose up db", "db:generate": "drizzle-kit generate", diff --git a/src/components/layout/Header.tsx b/src/components/layout/Header.tsx index 202ca13..ebae02f 100644 --- a/src/components/layout/Header.tsx +++ b/src/components/layout/Header.tsx @@ -9,7 +9,7 @@ import { useTranslations } from 'next-intl'; function Header() { const t = useTranslations('layout'); return ( -
+
diff --git a/src/components/ui/Badge.tsx b/src/components/ui/Badge.tsx index c84e389..bdf26b6 100644 --- a/src/components/ui/Badge.tsx +++ b/src/components/ui/Badge.tsx @@ -2,7 +2,7 @@ import { type VariantProps, cva, cx } from '@/lib/utils'; import type * as React from 'react'; const badgeVariants = cva({ - base: 'inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2', + base: 'inline-flex items-center rounded-md border px-2.5 py-0.5 font-semibold text-xs transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2', variants: { variant: { default: diff --git a/src/components/ui/Button.tsx b/src/components/ui/Button.tsx index 0a34580..33b5d00 100644 --- a/src/components/ui/Button.tsx +++ b/src/components/ui/Button.tsx @@ -3,7 +3,7 @@ import { Slot } from '@radix-ui/react-slot'; import * as React from 'react'; const buttonVariants = cva({ - base: 'inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50', + base: 'inline-flex items-center justify-center whitespace-nowrap rounded-md font-medium text-sm ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50', variants: { variant: { default: 'bg-primary text-primary-foreground hover:bg-primary/90', diff --git a/src/components/ui/Sheet.tsx b/src/components/ui/Sheet.tsx index f4d198d..bbc10ff 100644 --- a/src/components/ui/Sheet.tsx +++ b/src/components/ui/Sheet.tsx @@ -29,15 +29,15 @@ const SheetOverlay = React.forwardRef< SheetOverlay.displayName = SheetPrimitive.Overlay.displayName; const sheetVariants = cva({ - base: 'fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500 data-[state=open]:animate-in data-[state=closed]:animate-out', + base: 'fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=closed]:animate-out data-[state=open]:animate-in data-[state=closed]:duration-300 data-[state=open]:duration-500', variants: { side: { - top: 'inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top', + top: 'data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top inset-x-0 top-0 border-b', bottom: - 'inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom', - left: 'inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm', + 'data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom inset-x-0 bottom-0 border-t', + left: 'data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left inset-y-0 left-0 h-full w-3/4 border-r sm:max-w-sm', right: - 'inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm', + 'data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right inset-y-0 right-0 h-full w-3/4 border-l sm:max-w-sm', }, }, defaultVariants: { From 7923f673f42f36536b9c14fc1d5a89a584dc1b79 Mon Sep 17 00:00:00 2001 From: Michael Brusegard <56915010+michaelbrusegard@users.noreply.github.com> Date: Mon, 16 Sep 2024 04:07:16 +0200 Subject: [PATCH 3/5] fix: formatting --- src/components/layout/Footer.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/layout/Footer.tsx b/src/components/layout/Footer.tsx index 6822c9e..0c83b28 100644 --- a/src/components/layout/Footer.tsx +++ b/src/components/layout/Footer.tsx @@ -175,7 +175,7 @@ function Footer() {

-
    +