4/7/2022 ∙ 8 minut czytania
Osobista strona internetowa — stylowanie za pomocą Tailwind CSS 🎨
To będzie seria postów poświęconych tworzeniu tej strony. Przedstawię w niej po kolei wszystkie kroki wykonane podczas jej tworzenia.
Nie będę tutaj w żadnym wypadku bardziej oryginalny od innych twórców stron podobnych do mojej i do jej ostylowania użyję Tailwind CSS. Metodyka, jaką przyjęli twórcy tego framework'a jest genialna w swojej prostocie. Stawia ona przede wszystkim na użyteczność. Tailwind działa na podstawie pre-definiowanych klas CSS, które twórca może komponować w celu zbudowania designu, który chce osiągnąć, bezpośrednio w języku znaczników, którego używa. Tailwind wykrywa te klasy i dodaje je do CSS. Dzięki czemu, na naszej stronie produkcyjnej nigdy nie będzie nieużywanych CSS-ów.
Zalety Tailwind CSS
- wbudowane klasy pomocnicze
- dostarczanie minimalnego kodu potrzebnego do ostylowania strony
- modyfikatory do stylowania responsywnego
- modyfikatory do stanów, w których znajduje się element takich jak:
focus,active,disabled,focus-within,focus-visible - działa we wszystkich bibliotekach i framework'ach do tworzenia dynamicznego UI (np. React, Vue, Angular)
- modyfikatory do dark mode
- możliwość zmiany szablonu za pomocą pliku
tailwind.config.js - twórcy są "na czasie" z najnowszymi funkcjonalnościami CSS-a i regularnie dodają je do framework'a
- integracja automatycznego podpowiadania klas za pomocą wtyczki z popularnymi IDE.
- dostępna kolekcja gotowych, sprawdzonych w boju komponentów dzięki kolekcji Tailwind UI
Instalacja Tailwind CSS w Remix
Dokumentacja Tailwind'a jest bardzo dobrze napisana, a proces instalacji jest dostosowany dla większości znanych framework'ów do tworzenia UI. W tej dokumentacji jest również wymieniony Remix. Przejdźmy więc do instrukcji instalacji.
Pierwszym krokiem będzie zainstalowanie Tailwind'a w katalogu projektu
npm install -D tailwindcss postcss autoprefixer concurrently
npx tailwindcss init -pZauważ, że wszystkie zależności instalujemy jako developerskie. Nie są to paczki, które będą dostarczane na wersje produkcyjna strony internetowej. Służą jedynie jako narzędzia pomocnicze, które zbudują CSS-y naszej strony.
- tailwindcss — tutaj sprawa jest raczej jasna
- postcss — narzędzie do transformowania CSS za pomocą języka JavaScript. Działa za pomocą wtyczek, które można znaleźć w postcss.parts.
- autoprefixer — jedna ze wtyczek do postcss'a. Pozwala nam pisać CSS-y bez konieczności pamiętania o prefiksach dla różnych przeglądarek. Wtyczka działa na podstawie standardu zdefiniowanego na caniuse.com i automatycznie modyfikuje wygenerowane CSS-y dodając odpowiednie prefiksy za nas
- concurrently — pozwala uruchomić wiele poleceń NPM równolegle.
Po wykonaniu polecenia
npx tailwindcss init -pw katalogu naszego projektu pojawią się dwa nowe pliki:
tailwind.config.js- plik zawierający wszystkie ustawienia Tailwind'apostcss.config.js- konfiguracja plug-inów dla narzędzia PostCSS
Kolejnym krokiem będzie konfiguracja ścieżek do plików zawierających szablony
stylowania w pliku tailwind.config.js
module.exports = {
content: ['./app/**/*.{js,ts,jsx,tsx}'],
theme: {
extend: {},
},
plugins: [],
}"./app/**/*.{js,ts,jsx,tsx}", - wskazuje na wszystkie pliki w katalogu app z
rozszerzeniem .{js,ts,jsx,tsx}.
Następnie musimy napisać skrypty, które zajmą się budowaniem CSS-ów dla naszej
strony. Zarówno w trybie deweloperskim jak i produkcyjnym. Wejdźmy do pliku
package.json:
{
"scripts": {
"build": "npm run build:css && remix build",
"build:css": "tailwindcss -m -i ./styles/app.css -o app/styles/app.css",
"dev": "concurrently \"npm run dev:css\" \"remix dev\"",
"dev:css": "tailwindcss -w -i ./styles/app.css -o app/styles/app.css"
}
}dzięki modyfikacji polecenia dev, mozemy uruchomić równolegle dwa polecenia,
które również są zdefiniowane w pliku, czyli dev:css i remix dev.
polecenie tailwindcss używa flag -i oraz -o. Flaga -i definiuje wejście,
a flaga -o wyjście (czyli gotowe CSS-y). Flaga -m to skrót od --minify, a
-w to skrót od --watch. Obserwowanie polega na wykrywaniu zmian w szablonach
i przebudowaniu CSS-ów wyjściowych. Minifikowanie usuwa niepotrzebne białe
znaki, które znajdują się w CSS-ach, żeby jak najmniejsza porcja danych została
przesłana do przeglądarki końcowego użytkownika.
W kolejnym kroku należy utworzyć plik wejściowy dla tailwinda, czyli plik pod
ścieżką styles/app.css:
@tailwind base;
@tailwind components;
@tailwind utilities;@tailwind to dyrektywa, dzięki której tailwind rozpoznaje każdą ze swoich
warstw. O funkcjach i dyrektywach można więcej przeczytać
tutaj.
W ostatnim kroku musimy zaimportować plik z kodem wynikowym tailwind'a. Plik nie
został jeszcze wygenerowany, ale tym zajmiemy się za chwile. Żeby klasy
tailwind'a były dostępne na każdej podstronie najlepiej zaimportować plik
wyjściowy w pliku root.tsx:
import styles from './styles/app.css'
export function links() {
return [{ rel: 'stylesheet', href: styles }]
}Żeby sprawdzić, czy wszystko działa prawidłowo, należy uruchomić polecenie
npm run dev które to wykona równolegle dwa polecenia:
- utworzy plik
app/styles/app.css - uruchomi serwer
Jeżeli wszystko będzie działać poprawnie, powinniśmy zauważyć nowe style na
stronie. Plik app/styles/app.css zawiera kod CSS, który został wygenerowany
przez narzędzie tailwindcss. Jest to kod oparty na paczce
modern-normalize, której
zadaniem jest normalizacja CSS-owych styli. Zauważ, że wygląd nagłówków, list,
linków został zresetowany. To oczekiwane zachowanie. Teraz zajmiemy się
poprawianiem wyglądu strony.
Wygląd strony głównej
Skupmy się na poprawie wyglądu strony głównej. W pliku app/routes/index.tsx
znajduje się kod, który wyświetla tę stronę. Zmodyfikujmy ją tak, żeby nabrała
nowego wyglądu.
import { Link } from '@remix-run/react'
export default function Index() {
return (
<main className="p-6">
<h1 className="text-4xl">Blog</h1>
<ul className="mt-4 leading-7">
<li>
<Link to={'/copywriter-tool-belt'}>Copywriter - my tool belt</Link>
</li>
<li>
<Link to={'/remix-basics'}>Personal website - remix basics 💿</Link>
</li>
<li>
<Link to={'/project-launch'}>Personal website - project launch</Link>
</li>
<li>
<Link to={'/hello-world'}>Hello World!</Link>
</li>
</ul>
</main>
)
}Na samym końcu pliku app/styles/app.css pojawiły się nowe klasy, które
definiują ich zachowanie:
.mt-4 {
margin-top: 1rem;
}
.list-item {
display: list-item;
}
.p-6 {
padding: 1.5rem;
}
.text-4xl {
font-size: 2.25rem;
line-height: 2.5rem;
}
.leading-7 {
line-height: 1.75rem;
}Wtyczka do tailwind'a
Skąd wiadomo jakiej klasy użyć i kiedy? Tutaj z pomocą przychodzi wtyczka do
VSCode -
Tailwind CSS IntelliSense.
Wtyczka ta wykrywa użycie props'a className w plikach reaktowych oraz class
w plikach HTML i kontekstowo podpowiada nam klasy, których możemy w danym
miejscu użyć.
Zalecam instalacje wtyczki, zanim rozpoczniemy eksperymentowanie. Zaoszczędzi to dużo czasu przy czytaniu dokumentacji tailwind'a.
Wygląd artykułu — zmiana struktury katalogów
Tutaj sprawa nieco się komplikuje, bo musimy przenieść swoje artykuły do osobnego katalogu, żeby wprowadzić nowy układ dla każdego posta.
W tym celu stworzę nowy katalog app/routes/blog i do niego przeniosę wszystkie
pliki Markdown. Dodatkowo utworzę nowy plik, który zdefiniuje układ dla każdego
posta. Nie przejmuj się, zaraz wyjaśnię, o co tutaj właściwie chodzi. Struktura
katalogów powinna wyglądać teraz tak:
.
├── blog
│ ├── copywriter-tool-belt.md
│ ├── hello-world.md
│ ├── project-launch.md
│ ├── remix-basics.md
│ └── tailwind-styling.md
├── blog.tsx
└── index.tsxblog- katalog ze wszystkimi artykułamiblog.tsx- plik z kodem odpowiadającym za układ bloga
Wygląd artykułu — wtyczki Tailwind'a
Tailwind CSS oferuje wiele ciekawych wtyczek, które rozwiązują za nas pewne problemy związane ze stylowaniem naszej aplikacji. Jednym z najbardziej popularnych dodatków jest oficjalna paczka @tailwindcss/typography, która sprawi, ze nasze artykuły staną się bardzo czytelne. Instalacja dodatków do tailwind'a jest bardzo prosta. W tym celu wykonujemy polecenie:
npm install -D @tailwindcss/typographya następnie dodajemy wtyczkę do pliku tailwind.config.js:
module.exports = {
theme: {
// ...
},
plugins: [
require('@tailwindcss/typography'),
// ...
],
}Każda wtyczka ma pewne opcje, które możemy konfigurować, ale tym zajmiemy się nieco później.
Żeby upewnić się, ze dodatek działa prawidłowo, zdefiniujemy szablon naszego
bloga. W pliku app/routes/blog.tsx dodamy następujący kod:
import { Outlet } from '@remix-run/react'
const Blog = () => {
return (
<article className="prose lg:prose-xl mx-auto my-16">
<Outlet />
</article>
)
}
export default Blog<Outlet /> - jest to komponent, który działa jak portal, w którym będzie
renderowana treść kolejnych zagnieżdżonych części danej ścieżki. Dla przykładu
jeżeli mamy ścieżkę: kacgrzes.io/blog/hello-world, to Outlet w pliku z
definicją szablonu blog.tsx, wyrenderuje to, co znajduje się w pliku
hello-world.
Ostatnim krokiem będzie poprawienie ścieżek w głównej nawigacji. W pliku
app/routes/index.tsx dodamy następujący kod:
import { Link } from '@remix-run/react'
export default function Index() {
return (
<main className="p-6">
<h1 className="text-4xl">Blog</h1>
<ul className="mt-4 leading-7">
<li>
<Link to={'/blog/tailwind-setup'}>
Personal website - Tailwind CSS setup
</Link>
</li>
<li>
<Link to={'/blog/copywriter-tool-belt'}>
Copywriter - my tool belt
</Link>
</li>
<li>
<Link to={'/blog/remix-basics'}>
Personal website - remix basics 💿
</Link>
</li>
<li>
<Link to={'/blog/project-launch'}>
Personal website - project launch
</Link>
</li>
<li>
<Link to={'/blog/hello-world'}>Hello World!</Link>
</li>
</ul>
</main>
)
}Do listy z artykułami dodałem link do artykułu, który właśnie pisze oraz
zadbałem o dodanie przedrostka /blog do każdego z nich.
Artykuły są teraz ostylowane tak jak powinny :)
Bonus — dark mode
Ciemny tryb w Tailwind jest niesamowicie prosty do zaimplementowania. Framework
posiada modyfikator :dark. Spróbujmy dodać tryb ciemny do strony:
plik app/root.tsx:
<body className="bg-white dark:bg-slate-800">
<Outlet />
<ScrollRestoration />
<Scripts />
<LiveReload />
</body>Normalnie, dla trybu jasnego, będziemy mieli kolor tła bg-white, a dla
ciemnego bg-slate-800.
Plik app/routes/index.tsx:
export default function Index() {
return <main className="p-6 dark:text-white">...</main>
}plik app/routes/blog.tsx:
const Blog = () => {
return (
<article className="prose lg:prose-xl dark:prose-invert mx-4 my-16 sm:mx-auto">
<Outlet />
</article>
)
}To tylko początek przygody z Tailwindem. Na pewno jeszcze do niego wrócę.
Drobna uwaga:
plik app/styles/app.css jest generowany automatycznie, więc nie trzeba go
commitować do repozytorium. W związku z tym, należy dodać ten plik do
.gitignore.
exitPoniżej znajdziesz więcej postów, które mogą Cię zainteresować.