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 -p
Zauważ, ż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 -p
w 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.tsx
blog
- 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/typography
a 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
.
exit
Poniżej znajdziesz więcej postów, które mogą Cię zainteresować.