# Blog index

> A blog landing page: featured post, search, category and tag filters, post cards with cover, date and reading time, and pagination.

Source: https://docs.nasaqui.com/components/blog-index

## Install

```bash
npx shadcn@latest add https://docs.nasaqui.com/r/blog-index.json
```

The landing page of a blog. A featured post on top, a search box, category and tag chips, a grid of post cards (cover, category, title, excerpt, date and reading time) and pagination. It is controlled or uncontrolled for both filters and the page, so you can keep them in the URL.

## When to use

- The list page of a blog, a changelog of articles or a news section.
- A "latest writing" row: use `PostCard` on its own, or `ProfileWriting`.

## When not to use

- A table of records with sortable columns: use [`Table`](https://docs.nasaqui.com/components/table).
- One article: use [`BlogPost`](https://docs.nasaqui.com/components/blog-post).

## Import

```tsx
import { BlogIndex, PostCard } from "@fadymondy/nasaq/web";
```

## Quick start

```tsx
<BlogIndex
  title="Blog"
  description="Notes on design and engineering."
  posts={posts}
  postHref={(p) => `/blog/${p.slug}`}
/>
```

## Anatomy

```
BlogIndex                 data-slot="blog-index"
├─ SectionHeader          title, description, actions
├─ featured PostCard      variant="featured" (newest post marked featured, else newest)
├─ toolbar                search InputGroup with clear button, category ChipGroup, tag ChipGroup
├─ post grid              PostCard x pageSize, container-query columns
├─ EmptyState             when nothing matches
└─ Pagination
```

## API

### `BlogIndex`

| Prop | Type | Default | Description |
| --- | --- | --- | --- |
| `posts` | `BlogPostSummary[]` | required | All posts. Filtering and paging are done here. |
| `title?` / `description?` / `actions?` | `ReactNode` | none | Header content. |
| `pageSize?` | `number` | `6` | Cards per page. |
| `showFeatured?` | `boolean` | `true` | Show the featured post above the grid. |
| `postHref?` | `(post) => string` | `#slug` | Link of each card. |
| `onOpenPost?` | `(post) => void` | none | Called when a card is opened. |
| `filters?` / `defaultFilters?` / `onFiltersChange?` | `BlogFilters` | empty | `{ query, category, tag }`. |
| `page?` / `defaultPage?` / `onPageChange?` | `number` | `1` | Current page, 1-based. |
| `maxTags?` | `number` | `8` | Tag chips shown, most used first. |
| `labels?` | `Partial<BlogIndexLabels>` | locale | Override any string. |

### `PostCard` and `PostCover`

`PostCard` takes `post`, `href`, `onOpen`, `variant` (`default`, `featured`, `compact`) and `labels`. The title is a stretched link, so the whole card is one target with one tab stop. `PostCover` shows `post.cover` or, without one, art generated from the slug using the `--nq-tag-*` tokens.

### Model helpers

Pure functions, importable in Node: `filterPosts`, `sortByDate`, `paginate`, `pickFeatured`, `postCategoryCounts`, `tagCounts`, `relatedPosts`, `adjacentPosts`, `readingTime`, `extractToc`, `slugifyHeading`, `activeHeadingId`, `readingProgress`, `remarkCallouts`.

## Accessibility

- The search is a labelled field; the result count is announced in a polite live region.
- Filter chips are toggle buttons with `aria-pressed`.
- Each card is an `<article>` with one link; the cover is decorative.
- Pagination is a `nav` with `aria-current="page"`.

## RTL & i18n

Strings come from the provider locale (English, Arabic) and can be overridden with `labels`. Dates and numbers use Latin digits. Layout uses logical classes only.

## Styling

Container queries choose the columns (1, 2 or 3), so the block adapts to its parent and not the window. Covers use tokens, no hex.

## Do / Don't

- Do give every post a `readingMinutes`, or compute it from the body with `readingTime`.
- Do keep `filters` in the URL for shareable views.
- Don't pass a partial list and expect server paging: `BlogIndex` pages what it is given.

## Related

[`BlogPost`](https://docs.nasaqui.com/components/blog-post), [`Pagination`](https://docs.nasaqui.com/components/pagination), [`SectionHeader`](https://docs.nasaqui.com/components/section-header).

## Lab

Story `Components/Layout/Blog Index` and page story `Pages/Public/Blog`.

## Code

### React

```tsx
<BlogIndex
  title="Blog"
  description="Notes on design and engineering."
  posts={posts}
  postHref={(p) => `/blog/${p.slug}`}
/>
```

### shadcn

```tsx
<BlogIndex
  title="Blog"
  description="Notes on design and engineering."
  posts={posts}
  postHref={(p) => `/blog/${p.slug}`}
/>
```

### Vue

```vue
<script setup lang="ts">
import { NqBlogIndex, type BlogPostSummary } from "@fadymondy/nasaq/vue";

const posts: BlogPostSummary[] = [
  { slug: "tokens", title: "Design tokens, one source", excerpt: "How one token file feeds React, Vue and Blade.", category: "Design", tags: ["tokens", "css"], date: "2026-04-02", readingMinutes: 5, featured: true },
  { slug: "rtl", title: "Right to left, properly", excerpt: "Logical properties instead of mirrored copies.", category: "Engineering", tags: ["rtl", "css"], date: "2026-03-12", readingMinutes: 7 },
  { slug: "forms", title: "Forms that explain themselves", excerpt: "Inline errors, helpful hints, no surprises.", category: "Product", tags: ["forms"], date: "2026-02-20", readingMinutes: 4 },
];
</script>

<template>
  <NqBlogIndex title="Blog" description="Notes on design and engineering." :posts="posts" :post-href="(p) => `/blog/${p.slug}`" />
</template>
```

### Blade

```blade
@php
    $posts = [
        ['slug' => 'tokens', 'title' => 'Design tokens, one source', 'excerpt' => 'How one token file feeds React, Vue and Blade.', 'category' => 'Design', 'tags' => ['tokens', 'css'], 'date' => '2026-04-02', 'readingMinutes' => 5, 'featured' => true],
        ['slug' => 'rtl', 'title' => 'Right to left, properly', 'excerpt' => 'Logical properties instead of mirrored copies.', 'category' => 'Engineering', 'tags' => ['rtl', 'css'], 'date' => '2026-03-12', 'readingMinutes' => 7],
        ['slug' => 'forms', 'title' => 'Forms that explain themselves', 'excerpt' => 'Inline errors, helpful hints, no surprises.', 'category' => 'Product', 'tags' => ['forms'], 'date' => '2026-02-20', 'readingMinutes' => 4],
        ['slug' => 'motion', 'title' => 'Motion with restraint', 'excerpt' => 'Short, purposeful, and off under reduced motion.', 'category' => 'Design', 'tags' => ['motion'], 'date' => '2026-02-01', 'readingMinutes' => 3],
        ['slug' => 'tables', 'title' => 'Tables people can read', 'excerpt' => 'Density, alignment and sticky headers.', 'category' => 'Engineering', 'tags' => ['tables', 'css'], 'date' => '2026-01-18', 'readingMinutes' => 6],
    ];
@endphp
<x-nq::blog-index title="Blog" description="Notes on design and engineering." :posts="$posts" post-href="/blog/{slug}" :page-size="3" />
```

### HTML + Alpine

```html
<section data-slot="blog-index" aria-labelledby="nq-blog-101477-h" x-data="nqBlogIndex(JSON.parse('{\u0022pageSize\u0022:3,\u0022showFeatured\u0022:true,\u0022posts\u0022:[{\u0022slug\u0022:\u0022tokens\u0022,\u0022category\u0022:\u0022Design\u0022,\u0022tags\u0022:[\u0022tokens\u0022,\u0022css\u0022],\u0022time\u0022:1775088000000,\u0022featured\u0022:true,\u0022hay\u0022:\u0022Design tokens, one source How one token file feeds React, Vue and Blade. Design tokens css \u0022},{\u0022slug\u0022:\u0022rtl\u0022,\u0022category\u0022:\u0022Engineering\u0022,\u0022tags\u0022:[\u0022rtl\u0022,\u0022css\u0022],\u0022time\u0022:1773273600000,\u0022featured\u0022:false,\u0022hay\u0022:\u0022Right to left, properly Logical properties instead of mirrored copies. Engineering rtl css \u0022},{\u0022slug\u0022:\u0022forms\u0022,\u0022category\u0022:\u0022Product\u0022,\u0022tags\u0022:[\u0022forms\u0022],\u0022time\u0022:1771545600000,\u0022featured\u0022:false,\u0022hay\u0022:\u0022Forms that explain themselves Inline errors, helpful hints, no surprises. Product forms \u0022},{\u0022slug\u0022:\u0022motion\u0022,\u0022category\u0022:\u0022Design\u0022,\u0022tags\u0022:[\u0022motion\u0022],\u0022time\u0022:1769904000000,\u0022featured\u0022:false,\u0022hay\u0022:\u0022Motion with restraint Short, purposeful, and off under reduced motion. Design motion \u0022},{\u0022slug\u0022:\u0022tables\u0022,\u0022category\u0022:\u0022Engineering\u0022,\u0022tags\u0022:[\u0022tables\u0022,\u0022css\u0022],\u0022time\u0022:1768694400000,\u0022featured\u0022:false,\u0022hay\u0022:\u0022Tables people can read Density, alignment and sticky headers. Engineering tables css \u0022}],\u0022labels\u0022:{\u0022results\u0022:\u0022{n} articles\u0022,\u0022resultsOne\u0022:\u00221 article\u0022}}'))"
    class="@container flex flex-col gap-8">
    <div data-slot="section-header" class="flex items-end justify-between gap-4">
    <div class="flex min-w-0 flex-col gap-1">
        <h1  id="nq-blog-101477-h"  class="text-h2 text-foreground">Blog</h1>
                    <p class="text-pretty text-body-sm text-muted-foreground">Notes on design and engineering.</p>
            </div>
    </div>
            <div data-featured x-show="featuredShown">
            <article data-slot="post-card" data-variant="featured"
    class="group/post relative flex min-w-0 gap-4 @3xl:grid @3xl:grid-cols-2 @3xl:items-center @3xl:gap-8 flex-col">
            <div data-slot="post-cover" class="relative w-full overflow-hidden rounded-card border border-border bg-secondary transition-[border-color] duration-150 ease-nq group-hover/post:border-nq-line-strong @3xl:aspect-[4/3]">
            <div aria-hidden="true" style="--cover-a: var(--nq-tag-orange); --cover-a-soft: var(--nq-tag-orange-soft); --cover-b-soft: var(--nq-tag-pink-soft); --cover-x: 47%; --cover-y: 31%"
            class="size-full bg-[radial-gradient(circle_at_var(--cover-x)_var(--cover-y),var(--cover-a-soft),transparent_55%),linear-gradient(135deg,var(--cover-a-soft),var(--cover-b-soft))]">
            <div class="absolute -bottom-1/4 -end-[8%] size-2/5 rounded-full border-2 border-[var(--cover-a)] opacity-40"></div>
            <div class="absolute start-[10%] top-[16%] size-6 rounded-full bg-[var(--cover-a)] opacity-30"></div>
        </div>
    </div>
        <div class="flex min-w-0 flex-col items-start gap-2 gap-3">
        <div class="flex flex-wrap items-center gap-2">
                            <span data-slot="badge"     class="inline-flex h-5 shrink-0 items-center gap-1 whitespace-nowrap rounded-[4px] border px-1.5 text-caption font-medium [&_svg]:size-3 border-nq-accent/40 bg-nq-accent/15 text-nq-accent-text">Featured</span>
                        <span data-slot="badge"  style="--tag-solid: var(--nq-tag-pink); --tag-soft: var(--nq-tag-pink-soft)"     class="inline-flex h-5 shrink-0 items-center gap-1 whitespace-nowrap rounded-[4px] border px-1.5 text-caption font-medium [&_svg]:size-3 border-transparent bg-[var(--tag-soft)] text-[var(--tag-solid)]">Design</span>
        </div>
        <h3 class="text-balance text-foreground text-h1">
            <a href="/blog/tokens" dir="auto"
                class="rounded-[2px] outline-none after:absolute after:inset-0 after:content-[''] focus-visible:after:outline-2 focus-visible:after:outline-offset-2 focus-visible:after:outline-nq-focus">Design tokens, one source</a>
        </h3>
        <p dir="auto" class="text-pretty text-muted-foreground text-body">How one token file feeds React, Vue and Blade.</p>
        <div class="flex flex-wrap items-center gap-x-3 gap-y-1">
                        <p class="flex flex-wrap items-center gap-x-3 gap-y-1 text-caption text-muted-foreground">
    <time data-slot="date-time" datetime="2026-04-02T00:00:00+00:00" dir="auto"     class="tabular-nums [unicode-bidi:isolate]">Apr 2, 2026</time>
            <span class="inline-flex items-center gap-1">
            <svg aria-hidden="true" class="size-3" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <circle cx="12" cy="12" r="10"/>
  <path d="M12 6v6l4 2"/>
</svg>            5 min read
        </span>
    </p>
        </div>
                    <span class="mt-1 inline-flex items-center gap-1 text-label text-foreground">
                Read article
                <svg aria-hidden="true" class="size-4 transition-transform duration-150 ease-nq group-hover/post:translate-x-0.5 rtl:-scale-x-100 rtl:group-hover/post:-translate-x-0.5" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <path d="M5 12h14"/>
  <path d="m12 5 7 7-7 7"/>
</svg>            </span>
            </div>
</article>
        </div>
    <div class="flex flex-col gap-3" role="search">
        <div role="group" data-slot="input-group"
    class="group/input-group flex h-control min-h-[var(--nq-touch-min,0px)] w-full min-w-0 items-center overflow-hidden rounded-control border border-input bg-card text-body text-foreground transition-colors duration-150 ease-nq focus-within:border-nq-focus focus-within:outline-1 focus-within:outline-nq-focus has-[[data-invalid]]:border-nq-danger has-[[aria-invalid=true]]:border-nq-danger has-[input:disabled]:cursor-not-allowed has-[input:disabled]:opacity-50 max-w-md"><div data-slot="input-group-addon" data-align="start"
    class="flex h-full shrink-0 items-center gap-1.5 text-body-sm text-muted-foreground [&_svg]:size-4 order-first ps-3 pe-1"><svg aria-hidden="true" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <path d="m21 21-4.34-4.34"/>
  <circle cx="11" cy="11" r="8"/>
</svg></div>
            <input data-slot="input-group-input"     type="search" aria-label="Search articles" placeholder="Search articles…" x-model="query" class="h-full min-w-0 flex-1 border-0 bg-transparent px-3 text-body text-foreground outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed pointer-coarse:text-[16px] [&::-webkit-search-cancel-button]:appearance-none" />
            <div data-slot="input-group-addon" data-align="end"
    x-show="query !== &#039;&#039;" style="display: none" class="flex h-full shrink-0 items-center gap-1.5 text-body-sm text-muted-foreground [&_svg]:size-4 order-last ps-1 pe-3"><button data-slot="button"
     type="button"                         aria-label="Clear search" x-on:click="query = &#039;&#039;" class="inline-flex shrink-0 select-none items-center justify-center gap-2 whitespace-nowrap rounded-control border border-transparent font-sans text-label transition-colors duration-150 ease-nq min-h-[var(--nq-touch-min,0px)] outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus disabled:pointer-events-none disabled:opacity-50 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 text-foreground hover:bg-nq-hover size-control-sm p-0">
        <svg aria-hidden="true" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <path d="M18 6 6 18"/>
  <path d="m6 6 12 12"/>
</svg></button></div></div>
                    <div role="group" data-slot="chip-group" x-data="nqChipGroup('')" x-modelable="value"
    aria-label="Categories" x-model="category" class="-mx-1 flex gap-1.5 overflow-x-auto px-1 pb-1 [scrollbar-width:none] [&::-webkit-scrollbar]:hidden">
    <button data-slot="chip"
     type="button"                         data-value="" data-selected="" aria-pressed="true" x-on:click="select($el.dataset.value)" x-bind:aria-pressed="String(value === $el.dataset.value)" x-bind:data-selected="value === $el.dataset.value ? &#039;&#039; : null" class="inline-flex select-none items-center justify-center gap-2 whitespace-nowrap border border-transparent font-sans text-label transition-colors duration-150 ease-nq min-h-[var(--nq-touch-min,0px)] outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus disabled:pointer-events-none disabled:opacity-50 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 hover:bg-nq-hover h-control-sm shrink-0 rounded-full px-3 text-muted-foreground">
        All</button>
                                    <button data-slot="chip"
     type="button"                         data-value="Design" aria-pressed="false" x-on:click="select($el.dataset.value)" x-bind:aria-pressed="String(value === $el.dataset.value)" x-bind:data-selected="value === $el.dataset.value ? &#039;&#039; : null" class="inline-flex select-none items-center justify-center gap-2 whitespace-nowrap border border-transparent font-sans text-label transition-colors duration-150 ease-nq min-h-[var(--nq-touch-min,0px)] outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus disabled:pointer-events-none disabled:opacity-50 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 hover:bg-nq-hover h-control-sm shrink-0 rounded-full px-3 text-muted-foreground">
        Design <span class="text-muted-foreground">2</span></button>
                                    <button data-slot="chip"
     type="button"                         data-value="Engineering" aria-pressed="false" x-on:click="select($el.dataset.value)" x-bind:aria-pressed="String(value === $el.dataset.value)" x-bind:data-selected="value === $el.dataset.value ? &#039;&#039; : null" class="inline-flex select-none items-center justify-center gap-2 whitespace-nowrap border border-transparent font-sans text-label transition-colors duration-150 ease-nq min-h-[var(--nq-touch-min,0px)] outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus disabled:pointer-events-none disabled:opacity-50 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 hover:bg-nq-hover h-control-sm shrink-0 rounded-full px-3 text-muted-foreground">
        Engineering <span class="text-muted-foreground">2</span></button>
                                    <button data-slot="chip"
     type="button"                         data-value="Product" aria-pressed="false" x-on:click="select($el.dataset.value)" x-bind:aria-pressed="String(value === $el.dataset.value)" x-bind:data-selected="value === $el.dataset.value ? &#039;&#039; : null" class="inline-flex select-none items-center justify-center gap-2 whitespace-nowrap border border-transparent font-sans text-label transition-colors duration-150 ease-nq min-h-[var(--nq-touch-min,0px)] outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus disabled:pointer-events-none disabled:opacity-50 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 hover:bg-nq-hover h-control-sm shrink-0 rounded-full px-3 text-muted-foreground">
        Product <span class="text-muted-foreground">1</span></button>
</div>
                            <div role="group" data-slot="chip-group" x-data="nqChipGroup('')" x-modelable="value"
    aria-label="Tags" x-model="tag" class="-mx-1 flex gap-1.5 overflow-x-auto px-1 pb-1 [scrollbar-width:none] [&::-webkit-scrollbar]:hidden">
    <button data-slot="chip"
     type="button"                         data-value="" data-selected="" aria-pressed="true" x-on:click="select($el.dataset.value)" x-bind:aria-pressed="String(value === $el.dataset.value)" x-bind:data-selected="value === $el.dataset.value ? &#039;&#039; : null" class="inline-flex select-none items-center justify-center gap-2 whitespace-nowrap border border-transparent font-sans text-label transition-colors duration-150 ease-nq min-h-[var(--nq-touch-min,0px)] outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus disabled:pointer-events-none disabled:opacity-50 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 hover:bg-nq-hover h-control-sm shrink-0 rounded-full px-3 text-muted-foreground">
        Any tag</button>
                                    <button data-slot="chip"
     type="button"                         data-value="css" aria-pressed="false" x-on:click="select($el.dataset.value)" x-bind:aria-pressed="String(value === $el.dataset.value)" x-bind:data-selected="value === $el.dataset.value ? &#039;&#039; : null" class="inline-flex select-none items-center justify-center gap-2 whitespace-nowrap border border-transparent font-sans text-label transition-colors duration-150 ease-nq min-h-[var(--nq-touch-min,0px)] outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus disabled:pointer-events-none disabled:opacity-50 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 hover:bg-nq-hover h-control-sm shrink-0 rounded-full px-3 text-muted-foreground">
        <bdi>#css</bdi></button>
                                    <button data-slot="chip"
     type="button"                         data-value="tokens" aria-pressed="false" x-on:click="select($el.dataset.value)" x-bind:aria-pressed="String(value === $el.dataset.value)" x-bind:data-selected="value === $el.dataset.value ? &#039;&#039; : null" class="inline-flex select-none items-center justify-center gap-2 whitespace-nowrap border border-transparent font-sans text-label transition-colors duration-150 ease-nq min-h-[var(--nq-touch-min,0px)] outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus disabled:pointer-events-none disabled:opacity-50 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 hover:bg-nq-hover h-control-sm shrink-0 rounded-full px-3 text-muted-foreground">
        <bdi>#tokens</bdi></button>
                                    <button data-slot="chip"
     type="button"                         data-value="rtl" aria-pressed="false" x-on:click="select($el.dataset.value)" x-bind:aria-pressed="String(value === $el.dataset.value)" x-bind:data-selected="value === $el.dataset.value ? &#039;&#039; : null" class="inline-flex select-none items-center justify-center gap-2 whitespace-nowrap border border-transparent font-sans text-label transition-colors duration-150 ease-nq min-h-[var(--nq-touch-min,0px)] outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus disabled:pointer-events-none disabled:opacity-50 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 hover:bg-nq-hover h-control-sm shrink-0 rounded-full px-3 text-muted-foreground">
        <bdi>#rtl</bdi></button>
                                    <button data-slot="chip"
     type="button"                         data-value="forms" aria-pressed="false" x-on:click="select($el.dataset.value)" x-bind:aria-pressed="String(value === $el.dataset.value)" x-bind:data-selected="value === $el.dataset.value ? &#039;&#039; : null" class="inline-flex select-none items-center justify-center gap-2 whitespace-nowrap border border-transparent font-sans text-label transition-colors duration-150 ease-nq min-h-[var(--nq-touch-min,0px)] outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus disabled:pointer-events-none disabled:opacity-50 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 hover:bg-nq-hover h-control-sm shrink-0 rounded-full px-3 text-muted-foreground">
        <bdi>#forms</bdi></button>
                                    <button data-slot="chip"
     type="button"                         data-value="motion" aria-pressed="false" x-on:click="select($el.dataset.value)" x-bind:aria-pressed="String(value === $el.dataset.value)" x-bind:data-selected="value === $el.dataset.value ? &#039;&#039; : null" class="inline-flex select-none items-center justify-center gap-2 whitespace-nowrap border border-transparent font-sans text-label transition-colors duration-150 ease-nq min-h-[var(--nq-touch-min,0px)] outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus disabled:pointer-events-none disabled:opacity-50 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 hover:bg-nq-hover h-control-sm shrink-0 rounded-full px-3 text-muted-foreground">
        <bdi>#motion</bdi></button>
                                    <button data-slot="chip"
     type="button"                         data-value="tables" aria-pressed="false" x-on:click="select($el.dataset.value)" x-bind:aria-pressed="String(value === $el.dataset.value)" x-bind:data-selected="value === $el.dataset.value ? &#039;&#039; : null" class="inline-flex select-none items-center justify-center gap-2 whitespace-nowrap border border-transparent font-sans text-label transition-colors duration-150 ease-nq min-h-[var(--nq-touch-min,0px)] outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus disabled:pointer-events-none disabled:opacity-50 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 hover:bg-nq-hover h-control-sm shrink-0 rounded-full px-3 text-muted-foreground">
        <bdi>#tables</bdi></button>
</div>
            </div>
    <div class="flex flex-col gap-4">
        <p role="status" aria-live="polite" class="text-body-sm text-muted-foreground" x-text="resultsText">5 articles</p>
        <div x-show="shownCount > 0" class="grid grid-cols-1 gap-x-6 gap-y-10 @2xl:grid-cols-2 @5xl:grid-cols-3" >
                            <div data-post="tokens" class="contents" x-show="visible['tokens']"  style="display: none" >
                    <article data-slot="post-card" data-variant="default"
    class="group/post relative flex min-w-0 gap-4 flex-col">
            <div data-slot="post-cover" class="relative w-full overflow-hidden rounded-card border border-border bg-secondary transition-[border-color] duration-150 ease-nq group-hover/post:border-nq-line-strong">
            <div aria-hidden="true" style="--cover-a: var(--nq-tag-orange); --cover-a-soft: var(--nq-tag-orange-soft); --cover-b-soft: var(--nq-tag-pink-soft); --cover-x: 47%; --cover-y: 31%"
            class="size-full bg-[radial-gradient(circle_at_var(--cover-x)_var(--cover-y),var(--cover-a-soft),transparent_55%),linear-gradient(135deg,var(--cover-a-soft),var(--cover-b-soft))]">
            <div class="absolute -bottom-1/4 -end-[8%] size-2/5 rounded-full border-2 border-[var(--cover-a)] opacity-40"></div>
            <div class="absolute start-[10%] top-[16%] size-6 rounded-full bg-[var(--cover-a)] opacity-30"></div>
        </div>
    </div>
        <div class="flex min-w-0 flex-col items-start gap-2 ">
        <div class="flex flex-wrap items-center gap-2">
                        <span data-slot="badge"  style="--tag-solid: var(--nq-tag-pink); --tag-soft: var(--nq-tag-pink-soft)"     class="inline-flex h-5 shrink-0 items-center gap-1 whitespace-nowrap rounded-[4px] border px-1.5 text-caption font-medium [&_svg]:size-3 border-transparent bg-[var(--tag-soft)] text-[var(--tag-solid)]">Design</span>
        </div>
        <h3 class="text-balance text-foreground text-h3">
            <a href="/blog/tokens" dir="auto"
                class="rounded-[2px] outline-none after:absolute after:inset-0 after:content-[''] focus-visible:after:outline-2 focus-visible:after:outline-offset-2 focus-visible:after:outline-nq-focus">Design tokens, one source</a>
        </h3>
        <p dir="auto" class="text-pretty text-muted-foreground line-clamp-3 text-body-sm">How one token file feeds React, Vue and Blade.</p>
        <div class="flex flex-wrap items-center gap-x-3 gap-y-1">
                        <p class="flex flex-wrap items-center gap-x-3 gap-y-1 text-caption text-muted-foreground">
    <time data-slot="date-time" datetime="2026-04-02T00:00:00+00:00" dir="auto"     class="tabular-nums [unicode-bidi:isolate]">Apr 2, 2026</time>
            <span class="inline-flex items-center gap-1">
            <svg aria-hidden="true" class="size-3" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <circle cx="12" cy="12" r="10"/>
  <path d="M12 6v6l4 2"/>
</svg>            5 min read
        </span>
    </p>
        </div>
            </div>
</article>
                </div>
                            <div data-post="rtl" class="contents" x-show="visible['rtl']" >
                    <article data-slot="post-card" data-variant="default"
    class="group/post relative flex min-w-0 gap-4 flex-col">
            <div data-slot="post-cover" class="relative w-full overflow-hidden rounded-card border border-border bg-secondary transition-[border-color] duration-150 ease-nq group-hover/post:border-nq-line-strong">
            <div aria-hidden="true" style="--cover-a: var(--nq-tag-pink); --cover-a-soft: var(--nq-tag-pink-soft); --cover-b-soft: var(--nq-tag-violet-soft); --cover-x: 49%; --cover-y: 53%"
            class="size-full bg-[radial-gradient(circle_at_var(--cover-x)_var(--cover-y),var(--cover-a-soft),transparent_55%),linear-gradient(135deg,var(--cover-a-soft),var(--cover-b-soft))]">
            <div class="absolute -bottom-1/4 -end-[8%] size-2/5 rounded-full border-2 border-[var(--cover-a)] opacity-40"></div>
            <div class="absolute start-[10%] top-[16%] size-6 rounded-full bg-[var(--cover-a)] opacity-30"></div>
        </div>
    </div>
        <div class="flex min-w-0 flex-col items-start gap-2 ">
        <div class="flex flex-wrap items-center gap-2">
                        <span data-slot="badge"  style="--tag-solid: var(--nq-tag-red); --tag-soft: var(--nq-tag-red-soft)"     class="inline-flex h-5 shrink-0 items-center gap-1 whitespace-nowrap rounded-[4px] border px-1.5 text-caption font-medium [&_svg]:size-3 border-transparent bg-[var(--tag-soft)] text-[var(--tag-solid)]">Engineering</span>
        </div>
        <h3 class="text-balance text-foreground text-h3">
            <a href="/blog/rtl" dir="auto"
                class="rounded-[2px] outline-none after:absolute after:inset-0 after:content-[''] focus-visible:after:outline-2 focus-visible:after:outline-offset-2 focus-visible:after:outline-nq-focus">Right to left, properly</a>
        </h3>
        <p dir="auto" class="text-pretty text-muted-foreground line-clamp-3 text-body-sm">Logical properties instead of mirrored copies.</p>
        <div class="flex flex-wrap items-center gap-x-3 gap-y-1">
                        <p class="flex flex-wrap items-center gap-x-3 gap-y-1 text-caption text-muted-foreground">
    <time data-slot="date-time" datetime="2026-03-12T00:00:00+00:00" dir="auto"     class="tabular-nums [unicode-bidi:isolate]">Mar 12, 2026</time>
            <span class="inline-flex items-center gap-1">
            <svg aria-hidden="true" class="size-3" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <circle cx="12" cy="12" r="10"/>
  <path d="M12 6v6l4 2"/>
</svg>            7 min read
        </span>
    </p>
        </div>
            </div>
</article>
                </div>
                            <div data-post="forms" class="contents" x-show="visible['forms']" >
                    <article data-slot="post-card" data-variant="default"
    class="group/post relative flex min-w-0 gap-4 flex-col">
            <div data-slot="post-cover" class="relative w-full overflow-hidden rounded-card border border-border bg-secondary transition-[border-color] duration-150 ease-nq group-hover/post:border-nq-line-strong">
            <div aria-hidden="true" style="--cover-a: var(--nq-tag-teal); --cover-a-soft: var(--nq-tag-teal-soft); --cover-b-soft: var(--nq-tag-orange-soft); --cover-x: 56%; --cover-y: 52%"
            class="size-full bg-[radial-gradient(circle_at_var(--cover-x)_var(--cover-y),var(--cover-a-soft),transparent_55%),linear-gradient(135deg,var(--cover-a-soft),var(--cover-b-soft))]">
            <div class="absolute -bottom-1/4 -end-[8%] size-2/5 rounded-full border-2 border-[var(--cover-a)] opacity-40"></div>
            <div class="absolute start-[10%] top-[16%] size-6 rounded-full bg-[var(--cover-a)] opacity-30"></div>
        </div>
    </div>
        <div class="flex min-w-0 flex-col items-start gap-2 ">
        <div class="flex flex-wrap items-center gap-2">
                        <span data-slot="badge"  style="--tag-solid: var(--nq-tag-violet); --tag-soft: var(--nq-tag-violet-soft)"     class="inline-flex h-5 shrink-0 items-center gap-1 whitespace-nowrap rounded-[4px] border px-1.5 text-caption font-medium [&_svg]:size-3 border-transparent bg-[var(--tag-soft)] text-[var(--tag-solid)]">Product</span>
        </div>
        <h3 class="text-balance text-foreground text-h3">
            <a href="/blog/forms" dir="auto"
                class="rounded-[2px] outline-none after:absolute after:inset-0 after:content-[''] focus-visible:after:outline-2 focus-visible:after:outline-offset-2 focus-visible:after:outline-nq-focus">Forms that explain themselves</a>
        </h3>
        <p dir="auto" class="text-pretty text-muted-foreground line-clamp-3 text-body-sm">Inline errors, helpful hints, no surprises.</p>
        <div class="flex flex-wrap items-center gap-x-3 gap-y-1">
                        <p class="flex flex-wrap items-center gap-x-3 gap-y-1 text-caption text-muted-foreground">
    <time data-slot="date-time" datetime="2026-02-20T00:00:00+00:00" dir="auto"     class="tabular-nums [unicode-bidi:isolate]">Feb 20, 2026</time>
            <span class="inline-flex items-center gap-1">
            <svg aria-hidden="true" class="size-3" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <circle cx="12" cy="12" r="10"/>
  <path d="M12 6v6l4 2"/>
</svg>            4 min read
        </span>
    </p>
        </div>
            </div>
</article>
                </div>
                            <div data-post="motion" class="contents" x-show="visible['motion']" >
                    <article data-slot="post-card" data-variant="default"
    class="group/post relative flex min-w-0 gap-4 flex-col">
            <div data-slot="post-cover" class="relative w-full overflow-hidden rounded-card border border-border bg-secondary transition-[border-color] duration-150 ease-nq group-hover/post:border-nq-line-strong">
            <div aria-hidden="true" style="--cover-a: var(--nq-tag-green); --cover-a-soft: var(--nq-tag-green-soft); --cover-b-soft: var(--nq-tag-green-soft); --cover-x: 63%; --cover-y: 58%"
            class="size-full bg-[radial-gradient(circle_at_var(--cover-x)_var(--cover-y),var(--cover-a-soft),transparent_55%),linear-gradient(135deg,var(--cover-a-soft),var(--cover-b-soft))]">
            <div class="absolute -bottom-1/4 -end-[8%] size-2/5 rounded-full border-2 border-[var(--cover-a)] opacity-40"></div>
            <div class="absolute start-[10%] top-[16%] size-6 rounded-full bg-[var(--cover-a)] opacity-30"></div>
        </div>
    </div>
        <div class="flex min-w-0 flex-col items-start gap-2 ">
        <div class="flex flex-wrap items-center gap-2">
                        <span data-slot="badge"  style="--tag-solid: var(--nq-tag-pink); --tag-soft: var(--nq-tag-pink-soft)"     class="inline-flex h-5 shrink-0 items-center gap-1 whitespace-nowrap rounded-[4px] border px-1.5 text-caption font-medium [&_svg]:size-3 border-transparent bg-[var(--tag-soft)] text-[var(--tag-solid)]">Design</span>
        </div>
        <h3 class="text-balance text-foreground text-h3">
            <a href="/blog/motion" dir="auto"
                class="rounded-[2px] outline-none after:absolute after:inset-0 after:content-[''] focus-visible:after:outline-2 focus-visible:after:outline-offset-2 focus-visible:after:outline-nq-focus">Motion with restraint</a>
        </h3>
        <p dir="auto" class="text-pretty text-muted-foreground line-clamp-3 text-body-sm">Short, purposeful, and off under reduced motion.</p>
        <div class="flex flex-wrap items-center gap-x-3 gap-y-1">
                        <p class="flex flex-wrap items-center gap-x-3 gap-y-1 text-caption text-muted-foreground">
    <time data-slot="date-time" datetime="2026-02-01T00:00:00+00:00" dir="auto"     class="tabular-nums [unicode-bidi:isolate]">Feb 1, 2026</time>
            <span class="inline-flex items-center gap-1">
            <svg aria-hidden="true" class="size-3" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <circle cx="12" cy="12" r="10"/>
  <path d="M12 6v6l4 2"/>
</svg>            3 min read
        </span>
    </p>
        </div>
            </div>
</article>
                </div>
                            <div data-post="tables" class="contents" x-show="visible['tables']"  style="display: none" >
                    <article data-slot="post-card" data-variant="default"
    class="group/post relative flex min-w-0 gap-4 flex-col">
            <div data-slot="post-cover" class="relative w-full overflow-hidden rounded-card border border-border bg-secondary transition-[border-color] duration-150 ease-nq group-hover/post:border-nq-line-strong">
            <div aria-hidden="true" style="--cover-a: var(--nq-tag-red); --cover-a-soft: var(--nq-tag-red-soft); --cover-b-soft: var(--nq-tag-teal-soft); --cover-x: 46%; --cover-y: 63%"
            class="size-full bg-[radial-gradient(circle_at_var(--cover-x)_var(--cover-y),var(--cover-a-soft),transparent_55%),linear-gradient(135deg,var(--cover-a-soft),var(--cover-b-soft))]">
            <div class="absolute -bottom-1/4 -end-[8%] size-2/5 rounded-full border-2 border-[var(--cover-a)] opacity-40"></div>
            <div class="absolute start-[10%] top-[16%] size-6 rounded-full bg-[var(--cover-a)] opacity-30"></div>
        </div>
    </div>
        <div class="flex min-w-0 flex-col items-start gap-2 ">
        <div class="flex flex-wrap items-center gap-2">
                        <span data-slot="badge"  style="--tag-solid: var(--nq-tag-red); --tag-soft: var(--nq-tag-red-soft)"     class="inline-flex h-5 shrink-0 items-center gap-1 whitespace-nowrap rounded-[4px] border px-1.5 text-caption font-medium [&_svg]:size-3 border-transparent bg-[var(--tag-soft)] text-[var(--tag-solid)]">Engineering</span>
        </div>
        <h3 class="text-balance text-foreground text-h3">
            <a href="/blog/tables" dir="auto"
                class="rounded-[2px] outline-none after:absolute after:inset-0 after:content-[''] focus-visible:after:outline-2 focus-visible:after:outline-offset-2 focus-visible:after:outline-nq-focus">Tables people can read</a>
        </h3>
        <p dir="auto" class="text-pretty text-muted-foreground line-clamp-3 text-body-sm">Density, alignment and sticky headers.</p>
        <div class="flex flex-wrap items-center gap-x-3 gap-y-1">
                        <p class="flex flex-wrap items-center gap-x-3 gap-y-1 text-caption text-muted-foreground">
    <time data-slot="date-time" datetime="2026-01-18T00:00:00+00:00" dir="auto"     class="tabular-nums [unicode-bidi:isolate]">Jan 18, 2026</time>
            <span class="inline-flex items-center gap-1">
            <svg aria-hidden="true" class="size-3" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <circle cx="12" cy="12" r="10"/>
  <path d="M12 6v6l4 2"/>
</svg>            6 min read
        </span>
    </p>
        </div>
            </div>
</article>
                </div>
                    </div>
        <div data-slot="empty-state" x-show="count === 0" style="display: none" class="flex flex-col items-center justify-center gap-3 border border-dashed border-border px-6 py-12 text-center rounded-card">
            <span data-slot="state-icon" class="inline-flex size-10 items-center justify-center rounded-control border border-border bg-card [&amp;_svg]:size-5 text-muted-foreground">
            <svg aria-hidden="true" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <path d="m21 21-4.34-4.34"/>
  <circle cx="11" cy="11" r="8"/>
</svg>        </span>
        <div class="flex max-w-sm flex-col gap-1">
        <p class="text-label text-foreground">No articles match</p>
                    <p class="text-body-sm text-muted-foreground">Try a different word, or clear the filters.</p>
            </div>
            <div class="mt-1 flex flex-wrap items-center justify-center gap-2"><button data-slot="button"
     type="button"                         x-on:click="clearFilters()" class="inline-flex shrink-0 select-none items-center justify-center gap-2 whitespace-nowrap rounded-control border font-sans text-label transition-colors duration-150 ease-nq min-h-[var(--nq-touch-min,0px)] outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus disabled:pointer-events-none disabled:opacity-50 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 border-border bg-card text-foreground hover:bg-nq-hover h-control px-[var(--nq-control-pad)]">
        Clear filters</button></div>
    </div>
        <nav data-slot="pagination" aria-label="Articles pages"
    x-data="nqPagination(1, 2, 1, 1)" x-modelable="page"
    x-model="pageNo" x-effect="pageCount = pageTotal" x-show="pageTotal &gt; 1" class="w-fit max-w-full mx-auto">
    <ul class="flex flex-wrap items-center gap-1">
        <li>
            <button data-slot="button"
     type="button"                  disabled      data-disabled     aria-label="Previous" x-on:click="go(page - 1)" x-bind:disabled="page &lt;= 1" x-bind:data-disabled="page &lt;= 1 ? &#039;&#039; : undefined" class="inline-flex shrink-0 select-none items-center justify-center gap-2 whitespace-nowrap rounded-control border border-transparent font-sans text-label transition-colors duration-150 ease-nq min-h-[var(--nq-touch-min,0px)] outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus disabled:pointer-events-none disabled:opacity-50 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 text-foreground hover:bg-nq-hover size-control-sm p-0">
        <svg data-slot="icon" aria-hidden="true" class="rtl:-scale-x-100" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <path d="m15 18-6-6 6-6"/>
</svg></button>
        </li>
                                    <li data-ssr><button type="button" aria-label="Page 1"  aria-current="page"                     class="inline-flex shrink-0 select-none items-center justify-center gap-2 whitespace-nowrap rounded-control border font-sans text-label transition-colors duration-150 ease-nq min-h-[var(--nq-touch-min,0px)] outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus disabled:pointer-events-none disabled:opacity-50 data-disabled:pointer-events-none data-disabled:opacity-50 [&amp;_svg]:pointer-events-none [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 text-foreground hover:bg-nq-hover size-control-sm p-0 tabular-nums border-primary bg-nq-selected">1</button></li>
                                                <li data-ssr><button type="button" aria-label="Page 2"                     class="inline-flex shrink-0 select-none items-center justify-center gap-2 whitespace-nowrap rounded-control border font-sans text-label transition-colors duration-150 ease-nq min-h-[var(--nq-touch-min,0px)] outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus disabled:pointer-events-none disabled:opacity-50 data-disabled:pointer-events-none data-disabled:opacity-50 [&amp;_svg]:pointer-events-none [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 text-foreground hover:bg-nq-hover size-control-sm p-0 tabular-nums border-transparent">2</button></li>
                            <template x-for="item in items()" :key="item">
            <li :data-slot="typeof item === 'number' ? undefined : 'pagination-ellipsis'" :class="typeof item === 'number' ? '' : 'flex size-control-sm items-center justify-center text-muted-foreground'">
                <button type="button" x-show="typeof item === 'number'" class="inline-flex shrink-0 select-none items-center justify-center gap-2 whitespace-nowrap rounded-control border font-sans text-label transition-colors duration-150 ease-nq min-h-[var(--nq-touch-min,0px)] outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus disabled:pointer-events-none disabled:opacity-50 data-disabled:pointer-events-none data-disabled:opacity-50 [&amp;_svg]:pointer-events-none [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 text-foreground hover:bg-nq-hover size-control-sm p-0 tabular-nums" :class="item === page ? 'border-primary bg-nq-selected' : 'border-transparent'"
                    :aria-label="pageLabel(item)" :aria-current="item === page ? 'page' : undefined" x-text="num(item)" x-on:click="go(item)"></button>
                <span x-show="typeof item !== 'number'" class="contents"><span aria-hidden="true">…</span><span class="sr-only">More pages</span></span>
            </li>
        </template>
        <li>
            <button data-slot="button"
     type="button"                         aria-label="Next" x-on:click="go(page + 1)" x-bind:disabled="page &gt;= pageCount" x-bind:data-disabled="page &gt;= pageCount ? &#039;&#039; : undefined" class="inline-flex shrink-0 select-none items-center justify-center gap-2 whitespace-nowrap rounded-control border border-transparent font-sans text-label transition-colors duration-150 ease-nq min-h-[var(--nq-touch-min,0px)] outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus disabled:pointer-events-none disabled:opacity-50 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 text-foreground hover:bg-nq-hover size-control-sm p-0">
        <svg data-slot="icon" aria-hidden="true" class="rtl:-scale-x-100" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <path d="m9 18 6-6-6-6"/>
</svg></button>
        </li>
    </ul>
</nav>
    </div>
</section>
```
