Snilld

stylus-expert

stylus-expert

World-class, super-optimized Stylus (.styl) authoring for any project. Covers Stylus language (optional syntax, mixins, functions, iteration, parent &), DRY patterns, design-token usage when present, file structure, and compile-safe output. Use when creating or editing .styl files, refactoring CSS to Stylus, or optimizing stylesheets in any codebase.

# Stylus Expert (Verdensklasse .styl)

Dette skill sikrer **super-optimerede**, vedligeholdelige `.styl`-filer der kompilerer til minimal, konsistent CSS. Det er projekt-uafhængigt og bygger på Stylus-sproget; design tokens og filstruktur tilpasses det konkrete projekt.

---

## 1. Når skal skillen bruges?

- Oprette eller redigere filer med endelse `.styl` i **ethvert** projekt
- Refaktorere gentagen CSS til mixins/funktioner
- Tilføje komponenter, sider eller states i Stylus
- Beslutninger om import-rækkefølge, variabler eller iteration

---

## 2. Stylus-sproget – kort reference

**Kilde:** [stylus-lang.com](https://stylus-lang.com/docs/) (Node.js-preprocessor, ekspressiv og dynamisk CSS).

### 2.1 Valgfri syntaks

- **Kolonner, semikoloner, kommaer og krøllede parenteser** kan udelades.
- **Indentation** definerer blokke.
- Standard-CSS er også tilladt.

### 2.2 Sprogfunktioner

| Feature | Beskrivelse |
|--------|-------------|
| **Variabler** | `name = value`; genbrug i hele filen. |
| **Mixins** | Defineres som funktioner; kaldes som *statement* i en selector → egenskaber kopieres ind. Parenteser kan udelades: `border-radius 5px`. |
| **Funktioner** | Samme syntaks som mixins; returnerer værdi, bruges i udtryk: `padding add(10px, 5)`. |
| **arguments** | Lokal variabel med alle overførte argumenter; nyttig til `border-radius()` med vilkårlige værdier. |
| **Interpolation** | `{variabel}` i selectors og værdier: `border-{side} args`. |
| **Parent reference** | `&` refererer parent-selector (fx i mixins: `&.even`, `&:hover`). |
| **Iteration** | `for [key, index] in expression` (arrays, ranges `(1..5)`, strings). Postfix: `sum += n for n in nums`. |
| **Conditionals** | `if` / `else`; postfix: `padding 0 if !nested`. |
| **@import** | Indlæs andre `.styl`-filer. |
| **Over 60 built-ins** | fx `unit()`, `round()`, `unquote()`, `length()`, `split()`, `join()`, `selector()`. |

### 2.3 Mixin vs. funktion

- **Mixin:** Kaldes som statement i selector; udvider til egenskaber (og evt. nested selectors med `&`).
- **Funktion:** Kaldes i udtryk; returnerer værdi (fx i `padding fn(1,2)`).

---

## 3. Filstruktur (tilpas til projektet)

- **Entry-fil:** Typisk én `main.styl` eller `index.styl` der importerer resten; rækkefølge ofte: tokens/globals først, derefter base, layout, komponenter, sider, responsive.
- **Tokens:** Hvis projektet har design tokens, ofte i `tokens.styl` eller tilsvarende med `:root { --name value }`; i .styl bruges `var(--name)`. Verificer i den aktuelle kodebase.
- **Opdeling:** Base (reset, body), komponenter, side-specifikke filer, evt. `mobile.styl` eller media i samme fil – følg det projektet allerede gør.
- **Build:** Tjek `package.json` eller build-config for `stylus` / `stylus --compress`; brug den eksisterende pipeline.

**Regel:** Opfind ikke filstier, mixin-navne eller token-navne. Verificer i det aktuelle repo (søg i .styl og evt. .css).

---

## 4. Super-optimering – regler

### 4.1 DRY med mixins

- Gentagne **blokke af egenskaber** (fx knap-base, kort-base, radius+skygge) udtrækkes til mixins.
- Mixins med **default-argumenter** og `arguments` reducerer duplikat (fx én `radius()` der understøtter 1–4 værdier).

### 4.2 Design tokens (når projektet bruger dem)

- Hvis projektet har tokens (fx `:root` i tokens.styl eller design-tokens.css), brug **altid** `var(--token)` til farver, spacing, radius, skygger, typografi.
- Hvis der ikke er tokens, brug variabler øverst i .styl-filen i stedet for magiske værdier; undgå hardcodede `#hex`, `12px` spredt overalt.

### 4.3 Konsistent syntaks

- **Indentation-baseret** uden kolonner/semikoloner, i tråd med de øvrige .styl-filer i projektet.
- **Én egenskab per linje**; gruppér relaterede (fx transition + box-shadow).
- **Kommentarer:** blokkommentar `/** ... */` til fil/sektion; `//` til korte noter.

### 4.4 Parent reference (`&`)

- Brug `&` til **pseudo-klasser og modifier-klasser** (`.btn:hover`, `.dropdown.open`) i stedet for at gentage selector.
- I mixins: `&` refererer den selector mixin kaldes fra – brug til striping, hover-states, etc.

### 4.5 Iteration – når det giver mening

- **for/in** over ranges eller lister: fx hjælpeklasser (margin/padding) eller keyframes med numre.
- Brug kun iteration hvor det fjerner **reel** duplikat og holder læsbarheden.

### 4.6 Output og komprimering

- Optimér .styl for læsbarhed og DRY; lad compiler håndtere minifikation (fx `stylus --compress`).

---

## 5. Eksempler (optimerede mønstre)

### 5.1 Mixin med arguments (radius)

```stylus
radius()
-webkit-border-radius arguments
-moz-border-radius arguments
border-radius arguments

.some-card
radius 12px
// eller radius var(--radius-lg) hvis projektet har tokens
```

### 5.2 Knap-variant med &

```stylus
btn-base()
padding 12px 24px
border none
border-radius 12px
font-weight 600
cursor pointer
transition transform 0.2s ease, box-shadow 0.2s ease
display inline-flex
align-items center
gap 8px

.btn-primary
btn-base()
background #7c3aed
color #fff
&:hover:not(:disabled)
transform translateY(-2px)
```

(Erstat med `var(--...)` hvor projektet har design tokens.)

### 5.3 Iteration (spacing-klasser – kun ved behov)

```stylus
for i in 1..6
.mt-{i}
margin-top var(--space-{i})
```

Kun hvis projektet har `--space-1` … `--space-6` og faktisk bruger sådanne klasser.

### 5.4 @keyframes

```stylus
@keyframes spin
to
transform rotate(360deg)
```

---

## 6. Do's og don'ts

**Gør:**

- Bruge design tokens (`var(--token)`) når projektet har dem; ellers Stylus-variabler øverst.
- Udtrække gentagne blokke til mixins; bruge `&` for hover/state.
- Følge den **eksisterende** fil- og import-struktur i det aktuelle projekt.
- Skrive indentation-baseret, konsistent med øvrige .styl-filer.
- Dokumentere fil-purpose med kort blokkommentar øverst.
- Verificere filstier og token-/klassenavne i kodebasen.

**Undgå:**

- Magiske tal eller farver uden variabel/token.
- At opfinde filstier eller token-navne der ikke findes i repoet.
- Unødvendig iteration eller for komplekse mixins.
- At bryde eksisterende selector- eller HTML-klassenavne (tjek .html/.js).

---

## 7. Integration i projektet

- Hvis projektet har et design-system eller UI-skill: .styl implementerer det visuelle; følg projektets tokens og komponentnavne.
- Hvis projektet har UX-/flow-dokumentation: .styl ændrer ikke flows, kun udtryk og struktur.

---

## 8. Referencer

- Stylus docs: https://stylus-lang.com/docs/
- Mixins: https://stylus-lang.com/docs/mixins.html
- Iteration: https://stylus-lang.com/docs/iteration.html
- Functions: https://stylus-lang.com/docs/functions.html

    Gør brugeroplevelsen bedre.
    Hvilket firma arbejder du for?