spoko-design-system 1.19.0 → 1.21.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/README.md +217 -46
- package/package.json +10 -10
- package/src/components/Category/CategoriesCarousel.astro +3 -7
- package/src/components/Category/CategoryDetails.astro +46 -18
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
## [1.21.0](https://github.com/polo-blue/sds/compare/v1.20.1...v1.21.0) (2025-12-15)
|
|
2
|
+
|
|
3
|
+
### Features
|
|
4
|
+
|
|
5
|
+
* **category:** enhance CategoriesCarousel with Schema.org microdata ([903d81b](https://github.com/polo-blue/sds/commit/903d81b24c80d44f118e79c5496e9ea928b0e171))
|
|
6
|
+
|
|
7
|
+
## [1.20.1](https://github.com/polo-blue/sds/compare/v1.20.0...v1.20.1) (2025-12-15)
|
|
8
|
+
|
|
9
|
+
## [1.20.0](https://github.com/polo-blue/sds/compare/v1.19.0...v1.20.0) (2025-12-14)
|
|
10
|
+
|
|
11
|
+
### Features
|
|
12
|
+
|
|
13
|
+
* **category:** add microdata and update dependencies ([f5eadf3](https://github.com/polo-blue/sds/commit/f5eadf370bec9e8ef9ad2934e714302cd3e5d24d))
|
|
14
|
+
|
|
1
15
|
## [1.19.0](https://github.com/polo-blue/sds/compare/v1.18.1...v1.19.0) (2025-12-10)
|
|
2
16
|
|
|
3
17
|
### Features
|
package/README.md
CHANGED
|
@@ -2,48 +2,113 @@
|
|
|
2
2
|
|
|
3
3
|

|
|
4
4
|
|
|
5
|
-
SDS is
|
|
5
|
+
**Spoko Design System (SDS)** is an Astro-based design system with Vue 3 components and UnoCSS for styling. It's published as `spoko-design-system` on npm and serves as both a documentation site and a component library.
|
|
6
|
+
|
|
7
|
+
Live documentation: https://sds.spoko.space/
|
|
8
|
+
|
|
6
9
|
The project is still in the development phase, use at your own risk ;-)
|
|
7
|
-
|
|
10
|
+
|
|
8
11
|
Please feel free to fork it, edit it and let me know what do you think about it.
|
|
9
12
|
|
|
13
|
+
## Requirements
|
|
14
|
+
|
|
15
|
+
- **Node.js**: >= 22.17.0
|
|
16
|
+
- **Package Manager**: pnpm >= 10.16.1 (v10.17.1 recommended)
|
|
17
|
+
|
|
18
|
+
## Dual-Purpose Architecture
|
|
10
19
|
|
|
20
|
+
This project serves two purposes simultaneously:
|
|
11
21
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
| description | Docs intro |
|
|
15
|
-
| layout | ../../layouts/MainLayout.astro |
|
|
22
|
+
1. **Documentation Site**: Astro-based documentation at https://sds.spoko.space/
|
|
23
|
+
2. **npm Package**: Component library exportable as `spoko-design-system`
|
|
16
24
|
|
|
25
|
+
Components must work in BOTH contexts - as part of the Astro site and as importable npm package components.
|
|
17
26
|
|
|
18
|
-
## Getting
|
|
27
|
+
## Getting Started
|
|
19
28
|
|
|
20
29
|
### Installation
|
|
21
30
|
|
|
22
|
-
|
|
31
|
+
Install as a package:
|
|
32
|
+
|
|
33
|
+
```bash
|
|
23
34
|
pnpm add spoko-design-system
|
|
24
35
|
```
|
|
25
36
|
|
|
26
|
-
|
|
37
|
+
Or clone the repository for development:
|
|
27
38
|
|
|
39
|
+
```bash
|
|
40
|
+
git clone https://github.com/polo-blue/sds.git
|
|
41
|
+
cd sds
|
|
42
|
+
pnpm install
|
|
43
|
+
```
|
|
28
44
|
|
|
45
|
+
### Development Commands
|
|
29
46
|
|
|
30
|
-
|
|
31
|
-
|
|
47
|
+
```bash
|
|
48
|
+
pnpm dev # Start development server (runs on port 1234)
|
|
49
|
+
pnpm start # Alias for dev
|
|
50
|
+
pnpm build # Build production site
|
|
51
|
+
pnpm preview # Preview production build
|
|
52
|
+
pnpm check # Run Astro type checking
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Code Quality
|
|
32
56
|
|
|
33
|
-
|
|
57
|
+
```bash
|
|
58
|
+
pnpm lint # Lint all source files
|
|
59
|
+
pnpm lint:fix # Lint and auto-fix issues
|
|
60
|
+
pnpm format # Format code with Prettier
|
|
61
|
+
pnpm format:check # Check code formatting
|
|
62
|
+
```
|
|
34
63
|
|
|
35
|
-
|
|
64
|
+
### Publishing
|
|
36
65
|
|
|
37
|
-
-
|
|
38
|
-
|
|
39
|
-
|
|
66
|
+
This project uses automated **semantic-release** for version management and publishing.
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
pnpm semantic-release # Manual release (usually automated via CI)
|
|
70
|
+
pnpm prepublishOnly # Runs build before publish (automatic)
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Semantic Release & Commit Conventions
|
|
74
|
+
|
|
75
|
+
**All commits MUST follow conventional commits format:**
|
|
40
76
|
|
|
77
|
+
```
|
|
78
|
+
<type>[optional scope]: <description>
|
|
79
|
+
```
|
|
41
80
|
|
|
42
|
-
###
|
|
43
|
-
|
|
81
|
+
### Commit Types
|
|
82
|
+
|
|
83
|
+
- `feat`: New feature → MINOR version bump (0.1.0)
|
|
84
|
+
- `fix`: Bug fix → PATCH version bump (0.0.1)
|
|
85
|
+
- `perf`, `refactor`, `style`, `docs`: → PATCH version bump
|
|
86
|
+
- `test`, `ci`, `chore`: → No release
|
|
87
|
+
|
|
88
|
+
**Breaking Changes**: Add `BREAKING CHANGE:` footer → MAJOR version bump (1.0.0)
|
|
89
|
+
|
|
90
|
+
### Examples
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
feat(components): add Modal component with accessibility features
|
|
94
|
+
fix(Input): resolve floating label positioning
|
|
95
|
+
docs: update Button component examples
|
|
96
|
+
chore: update dependencies [skip ci]
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
On merge to `main`, GitHub Actions automatically:
|
|
100
|
+
1. Analyzes commits
|
|
101
|
+
2. Determines version bump
|
|
102
|
+
3. Updates package.json and CHANGELOG.md
|
|
103
|
+
4. Creates GitHub release
|
|
104
|
+
5. Publishes to npm
|
|
105
|
+
|
|
106
|
+
## Features
|
|
107
|
+
|
|
108
|
+
- ⚡️ [Vue 3](https://github.com/vuejs/core), [Vite](https://github.com/vitejs/vite), [pnpm](https://pnpm.io/) - born with fastness
|
|
44
109
|
- 🎨 [UnoCSS](https://github.com/antfu/unocss) - the instant on-demand atomic CSS engine
|
|
45
110
|
- 😃 [astro-icon](https://github.com/natemoo-re/astro-icon) - for local icons, sprites and `@iconify-json/*` sets
|
|
46
|
-
- 🍔 [astro-navbar](https://github.com/surjithctly/astro-navbar) -
|
|
111
|
+
- 🍔 [astro-navbar](https://github.com/surjithctly/astro-navbar) - fully responsive and accessible headless navigation bar
|
|
47
112
|
- 🔎 [astro-pagefind](https://github.com/shishkin/astro-pagefind) - Astro integration for Pagefind static site search
|
|
48
113
|
- 🗒 [astrojs/mdx](https://github.com/withastro/astro/tree/main/packages/integrations/mdx/) - markdown support
|
|
49
114
|
- 📦 [Playform compression](https://github.com/Playform/compress) - compression utilities to your Astro project
|
|
@@ -51,9 +116,21 @@ Most of the components from this repository can be seen in my projects:
|
|
|
51
116
|
- 🏷️ [astro-meta-tags](https://github.com/patrick91/astro-meta-tags) - Meta Tags inside for Astro Dev Toolbar
|
|
52
117
|
- 🖨 Static-site generation (SSG)
|
|
53
118
|
- 🎡 [Swiper](https://github.com/nolimits4web/swiper) - modern mobile touch slider with hardware accelerated transitions and amazing native behavior
|
|
54
|
-
- 🌠 [View Transitions API](https://docs.astro.build/en/guides/view-transitions/#full-site-view-transitions-spa-mode) -
|
|
119
|
+
- 🌠 [View Transitions API](https://docs.astro.build/en/guides/view-transitions/#full-site-view-transitions-spa-mode) - makes it easy to change the DOM in a single step, while creating an animated transition between the two states
|
|
55
120
|
- ☁️ Deploy on Netlify
|
|
56
121
|
|
|
122
|
+
## Icon System
|
|
123
|
+
|
|
124
|
+
The design system uses two separate but coordinated icon systems:
|
|
125
|
+
|
|
126
|
+
### 1. UnoCSS Icons (configured in `uno-config/index.ts`)
|
|
127
|
+
- Static imports for all icon JSON files
|
|
128
|
+
- Used via `i-{collection}-{name}` classes (e.g., `i-lucide-car`)
|
|
129
|
+
|
|
130
|
+
### 2. astro-icon (configured in `icon.config.ts`)
|
|
131
|
+
- Lists specific icons to include from each collection
|
|
132
|
+
- Used in Astro components via `<Icon name="collection:icon" />`
|
|
133
|
+
|
|
57
134
|
### Icon Collections
|
|
58
135
|
|
|
59
136
|
The design system includes carefully curated icon collections from Iconify:
|
|
@@ -71,62 +148,156 @@ The design system includes carefully curated icon collections from Iconify:
|
|
|
71
148
|
|
|
72
149
|
See the complete list and configuration in [`icon.config.ts`](./icon.config.ts).
|
|
73
150
|
|
|
74
|
-
### Adding
|
|
151
|
+
### Adding New Icons
|
|
75
152
|
|
|
76
|
-
|
|
153
|
+
1. Add icon name to `icon.config.ts` in the appropriate collection's array
|
|
154
|
+
2. Icon is automatically available in both UnoCSS (class) and astro-icon (component)
|
|
155
|
+
|
|
156
|
+
## UnoCSS Configuration
|
|
157
|
+
|
|
158
|
+
**Important**: UnoCSS config is split across two locations:
|
|
159
|
+
|
|
160
|
+
1. **Root `uno.config.ts`**: Simple wrapper that imports the main config
|
|
161
|
+
2. **`uno-config/` directory**: Main configuration system
|
|
162
|
+
- `uno-config/index.ts`: Core config with `createSdsConfig()` function
|
|
163
|
+
- `uno-config/theme/`: Theme definitions (colors, typography, breakpoints, etc.)
|
|
164
|
+
- `uno-config/theme/shortcuts/`: Component shortcuts organized by category
|
|
165
|
+
|
|
166
|
+
### When Modifying UnoCSS
|
|
167
|
+
|
|
168
|
+
- **Theme changes**: Modify files in `uno-config/theme/`
|
|
169
|
+
- **Shortcut additions**: Add to appropriate file in `uno-config/theme/shortcuts/`
|
|
170
|
+
- **Never edit** root `uno.config.ts` directly
|
|
171
|
+
- The `createSdsConfig()` function can be imported by consumers to extend the config
|
|
172
|
+
|
|
173
|
+
### Customizing Core (Colors, Typography, Shadows)
|
|
77
174
|
|
|
78
|
-
|
|
175
|
+
Theme files in `uno-config/theme/`:
|
|
176
|
+
- `colors.ts`: Complete color palette
|
|
177
|
+
- `typography.ts`: Font families, sizes, weights
|
|
178
|
+
- `breakpoints.ts`: Responsive breakpoints
|
|
179
|
+
- `dimensions.ts`: Spacing, sizing scales
|
|
180
|
+
- `effects.ts`: Shadows, borders, transitions
|
|
181
|
+
- `grid.ts`: Grid template configurations
|
|
182
|
+
- `container.ts`: Container max-widths and padding
|
|
79
183
|
|
|
184
|
+
Feel free to add new pages to the Core section in the documentation.
|
|
80
185
|
|
|
81
|
-
|
|
186
|
+
## Adding New Components
|
|
187
|
+
|
|
188
|
+
### 1. Create Component
|
|
189
|
+
|
|
190
|
+
Create component in appropriate location:
|
|
191
|
+
- Vue: `src/components/ComponentName.vue`
|
|
192
|
+
- Astro: `src/components/ComponentName.astro`
|
|
193
|
+
|
|
194
|
+
### 2. Export from Root
|
|
195
|
+
|
|
196
|
+
Export from root `index.ts` (note the `./src/` prefix):
|
|
197
|
+
|
|
198
|
+
```typescript
|
|
199
|
+
// ✅ Correct
|
|
200
|
+
export { default as ComponentName } from './src/components/ComponentName.vue';
|
|
201
|
+
|
|
202
|
+
// ❌ Wrong
|
|
203
|
+
export { default as ComponentName } from './components/ComponentName.vue';
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
### 3. Add Documentation
|
|
207
|
+
|
|
208
|
+
Add documentation page in `src/pages/components/component-name.mdx`
|
|
209
|
+
|
|
210
|
+
### 4. Add to Navigation
|
|
211
|
+
|
|
212
|
+
Add to navigation in `src/config.ts`:
|
|
213
|
+
|
|
214
|
+
```javascript
|
|
82
215
|
export const SIDEBAR = [
|
|
83
216
|
{ text: "Core", header: true },
|
|
84
217
|
{ text: "Introduction", link: "/core/introduction" },
|
|
85
|
-
|
|
218
|
+
// ...
|
|
86
219
|
{ text: "Components", header: true },
|
|
87
|
-
{ text: "
|
|
88
|
-
|
|
220
|
+
{ text: "Component Name", link: "/components/component-name/" },
|
|
221
|
+
];
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
## Adding New Sections
|
|
225
|
+
|
|
226
|
+
Although it's not required, you can create folders for new sections.
|
|
227
|
+
|
|
228
|
+
To show the section on the left side navigation, add it to the navigation config file at `src/config.ts`:
|
|
229
|
+
|
|
230
|
+
```javascript
|
|
231
|
+
export const SIDEBAR = [
|
|
232
|
+
{ text: "Core", header: true },
|
|
233
|
+
{ text: "Introduction", link: "/core/introduction" },
|
|
234
|
+
// ...
|
|
235
|
+
{ text: "Components", header: true },
|
|
236
|
+
{ text: "Buttons", link: "/components/buttons" },
|
|
237
|
+
// ...
|
|
89
238
|
{ text: "New section", header: true },
|
|
90
|
-
{ text: "New component", link: "/new-section/new-component
|
|
239
|
+
{ text: "New component", link: "/new-section/new-component/" },
|
|
91
240
|
];
|
|
92
241
|
```
|
|
93
242
|
|
|
94
|
-
|
|
243
|
+
## Adding New Pages
|
|
95
244
|
|
|
96
|
-
To add new pages just create an
|
|
245
|
+
To add new pages just create an `.astro` or `.mdx` file in `src/pages/[section]/my-page.mdx`. Remember to add it to the navigation config in `src/config.ts` so it shows up in the left side navigation.
|
|
97
246
|
|
|
98
247
|
You're free to organize the pages however you want.
|
|
99
248
|
|
|
100
|
-
|
|
249
|
+
## Component Preview Utility
|
|
101
250
|
|
|
102
|
-
|
|
251
|
+
There's a class called `.component-preview` that you can use to wrap your component in a grid:
|
|
103
252
|
|
|
104
|
-
|
|
253
|
+
```html
|
|
254
|
+
<div class="component-preview">
|
|
255
|
+
<button class="text-white bg-blue-lightest px-4 py-2 rounded-md">Your component</button>
|
|
256
|
+
</div>
|
|
257
|
+
```
|
|
105
258
|
|
|
259
|
+
## Path Aliases
|
|
106
260
|
|
|
107
|
-
|
|
261
|
+
Three main path aliases defined in `tsconfig.json`:
|
|
262
|
+
- `@components/*` → `src/components/*`
|
|
263
|
+
- `@utils/*` → `src/utils/*`
|
|
264
|
+
- `@types/*` → `src/types/*`
|
|
108
265
|
|
|
109
|
-
|
|
266
|
+
## Package Exports
|
|
110
267
|
|
|
268
|
+
The package provides multiple export paths:
|
|
111
269
|
|
|
112
|
-
|
|
270
|
+
```javascript
|
|
271
|
+
import { Button, Input } from 'spoko-design-system'
|
|
272
|
+
import { createSdsConfig } from 'spoko-design-system/uno-config'
|
|
273
|
+
import { iconConfig } from 'spoko-design-system/icons'
|
|
274
|
+
```
|
|
113
275
|
|
|
114
|
-
|
|
276
|
+
Available exports:
|
|
277
|
+
- `.`: Main component exports
|
|
278
|
+
- `./styles/*`: Direct style imports
|
|
279
|
+
- `./icons`: Icon configuration
|
|
280
|
+
- `./icon-collections`: Icon collection list
|
|
281
|
+
- `./uno-config`: UnoCSS config for consumers
|
|
115
282
|
|
|
116
|
-
|
|
283
|
+
## Customizing Page Layout
|
|
117
284
|
|
|
118
|
-
You can
|
|
285
|
+
You can find the css for the pages in `src/styles/content.css`.
|
|
119
286
|
|
|
287
|
+
## Examples
|
|
120
288
|
|
|
121
|
-
|
|
289
|
+
Documentation and live examples:
|
|
290
|
+
- https://sds.spoko.space/
|
|
122
291
|
|
|
123
|
-
|
|
292
|
+
Most of the components from this repository can be seen in production:
|
|
293
|
+
- https://catalog.polo.blue/
|
|
294
|
+
- https://polo.blue
|
|
295
|
+
- https://polo6r.pl
|
|
124
296
|
|
|
125
|
-
|
|
126
|
-
<button class="text-white bg-blue-lightest px-4 py-2 rounded-md">Your component</button>
|
|
127
|
-
</div>
|
|
297
|
+
## Have Fun!
|
|
128
298
|
|
|
299
|
+
Spoko Design System template was made in Poland by **[@spoko.space](https://spoko.space)** for personal and commercial use.
|
|
129
300
|
|
|
130
|
-
|
|
301
|
+
## License
|
|
131
302
|
|
|
132
|
-
|
|
303
|
+
MIT
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "spoko-design-system",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.21.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"private": false,
|
|
6
6
|
"main": "./index.ts",
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
],
|
|
56
56
|
"dependencies": {
|
|
57
57
|
"@algolia/client-search": "^5.46.0",
|
|
58
|
-
"@astrojs/mdx": "^4.3.
|
|
58
|
+
"@astrojs/mdx": "^4.3.13",
|
|
59
59
|
"@astrojs/node": "^9.5.1",
|
|
60
60
|
"@astrojs/sitemap": "^3.6.0",
|
|
61
61
|
"@astrojs/ts-plugin": "^1.10.6",
|
|
@@ -77,20 +77,20 @@
|
|
|
77
77
|
"@iconify-json/ic": "^1.2.4",
|
|
78
78
|
"@iconify-json/icon-park-outline": "^1.2.4",
|
|
79
79
|
"@iconify-json/la": "^1.2.1",
|
|
80
|
-
"@iconify-json/lucide": "^1.2.
|
|
81
|
-
"@iconify-json/material-symbols-light": "^1.2.
|
|
80
|
+
"@iconify-json/lucide": "^1.2.81",
|
|
81
|
+
"@iconify-json/material-symbols-light": "^1.2.50",
|
|
82
82
|
"@iconify-json/mdi": "^1.2.3",
|
|
83
83
|
"@iconify-json/noto-v1": "^1.2.5",
|
|
84
84
|
"@iconify-json/octicon": "^1.2.19",
|
|
85
85
|
"@iconify-json/ph": "^1.2.2",
|
|
86
|
-
"@iconify-json/simple-icons": "^1.2.
|
|
86
|
+
"@iconify-json/simple-icons": "^1.2.63",
|
|
87
87
|
"@iconify-json/streamline": "^1.2.5",
|
|
88
88
|
"@iconify-json/streamline-emojis": "^1.2.4",
|
|
89
89
|
"@iconify-json/streamline-freehand-color": "^1.2.2",
|
|
90
90
|
"@iconify-json/system-uicons": "^1.2.4",
|
|
91
91
|
"@iconify-json/uil": "^1.2.3",
|
|
92
92
|
"@iconify-json/vscode-icons": "^1.2.37",
|
|
93
|
-
"@iconify/json": "^2.2.
|
|
93
|
+
"@iconify/json": "^2.2.418",
|
|
94
94
|
"@iconify/vue": "^5.0.0",
|
|
95
95
|
"@playform/compress": "^0.2.0",
|
|
96
96
|
"@playform/inline": "^0.1.2",
|
|
@@ -121,16 +121,16 @@
|
|
|
121
121
|
"@semantic-release/changelog": "^6.0.3",
|
|
122
122
|
"@semantic-release/git": "^10.0.1",
|
|
123
123
|
"@types/gtag.js": "^0.0.20",
|
|
124
|
-
"@types/node": "^
|
|
124
|
+
"@types/node": "^25.0.2",
|
|
125
125
|
"@typescript-eslint/eslint-plugin": "^8.49.0",
|
|
126
126
|
"@typescript-eslint/parser": "^8.49.0",
|
|
127
127
|
"@unocss/transformer-variant-group": "66.5.10",
|
|
128
|
-
"@vitejs/plugin-vue": "^6.0.
|
|
128
|
+
"@vitejs/plugin-vue": "^6.0.3",
|
|
129
129
|
"@vue/compiler-sfc": "^3.5.25",
|
|
130
130
|
"@vue/eslint-config-typescript": "^14.6.0",
|
|
131
|
-
"astro": "^5.16.
|
|
131
|
+
"astro": "^5.16.5",
|
|
132
132
|
"conventional-changelog-conventionalcommits": "^9.1.0",
|
|
133
|
-
"eslint": "^9.39.
|
|
133
|
+
"eslint": "^9.39.2",
|
|
134
134
|
"eslint-plugin-astro": "^1.5.0",
|
|
135
135
|
"eslint-plugin-vue": "^10.6.2",
|
|
136
136
|
"husky": "^9.1.7",
|
|
@@ -40,16 +40,12 @@ const activeIndex =
|
|
|
40
40
|
categories.map(category => (
|
|
41
41
|
<swiper-slide
|
|
42
42
|
itemprop="hasPart"
|
|
43
|
+
itemscope
|
|
44
|
+
itemtype="https://schema.org/WebPage"
|
|
43
45
|
role="presentation"
|
|
44
46
|
class={`swiper-slide cats-slide group ${category.slug === activeCategorySlug ? 'active' : ''}`}
|
|
45
47
|
>
|
|
46
|
-
<a href={getTranslatedLink(`/${category.slug}/`)} class="carousel-item">
|
|
47
|
-
{
|
|
48
|
-
// itemprop="url"
|
|
49
|
-
// role="menuitem"
|
|
50
|
-
// aria-label={ t(`cat.${category.slug}.name`) }
|
|
51
|
-
}
|
|
52
|
-
|
|
48
|
+
<a itemprop="url" href={getTranslatedLink(`/${category.slug}/`)} class="carousel-item">
|
|
53
49
|
<Image
|
|
54
50
|
src={`${imgDomain}${category.photo}`}
|
|
55
51
|
alt={category.name}
|
|
@@ -30,37 +30,65 @@ const subcategoryPath = subcategory?.path || `/${category.slug}/${subcategory?.s
|
|
|
30
30
|
</div>
|
|
31
31
|
</CategorySidebarToggler>
|
|
32
32
|
|
|
33
|
-
<div
|
|
33
|
+
<div
|
|
34
|
+
class="overflow-x-auto overflow-y-hidden flex max-w-full items-center"
|
|
35
|
+
itemscope
|
|
36
|
+
itemtype="https://schema.org/BreadcrumbList"
|
|
37
|
+
>
|
|
34
38
|
{
|
|
35
39
|
subtitle ? (
|
|
36
40
|
<>
|
|
37
|
-
<
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
+
<div itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
|
|
42
|
+
<a
|
|
43
|
+
class="text-lg font-vw-headregular whitespace-nowrap block"
|
|
44
|
+
href={categoryPath}
|
|
45
|
+
itemprop="item"
|
|
46
|
+
>
|
|
47
|
+
<span itemprop="name">{category.name}</span>
|
|
48
|
+
{titleSmall && <small>{titleSmall}</small>}
|
|
49
|
+
</a>
|
|
50
|
+
<meta itemprop="position" content="1" />
|
|
51
|
+
</div>
|
|
41
52
|
<span class="text-neutral-lighter text-lg inline-block px-1 font-headlight">/</span>
|
|
42
53
|
{!subsubtitle ? (
|
|
43
|
-
<
|
|
44
|
-
|
|
45
|
-
|
|
54
|
+
<div itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
|
|
55
|
+
<h1 class="text-lg py-2.5 sm:py-0 whitespace-nowrap underline underline-offset-6 decoration-blue-300 decoration-0.5">
|
|
56
|
+
<span itemprop="name">{subtitle}</span> <span class="sr-only"> catalog</span>
|
|
57
|
+
</h1>
|
|
58
|
+
<meta itemprop="position" content="2" />
|
|
59
|
+
</div>
|
|
46
60
|
) : (
|
|
47
61
|
<>
|
|
48
|
-
<div
|
|
49
|
-
|
|
62
|
+
<div
|
|
63
|
+
itemprop="itemListElement"
|
|
64
|
+
itemscope
|
|
65
|
+
itemtype="https://schema.org/ListItem"
|
|
66
|
+
class="text-lg py-2.5 sm:py-0 whitespace-nowrap"
|
|
67
|
+
>
|
|
68
|
+
<a href={subcategoryPath} itemprop="item">
|
|
69
|
+
<span itemprop="name">{subtitle}</span>
|
|
70
|
+
</a>
|
|
71
|
+
<meta itemprop="position" content="2" />
|
|
50
72
|
</div>
|
|
51
73
|
<span class="text-neutral-lighter text-lg inline-block px-1 font-headlight">/</span>
|
|
52
|
-
<
|
|
53
|
-
|
|
54
|
-
|
|
74
|
+
<div itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
|
|
75
|
+
<h1 class="text-lg py-2.5 sm:py-0 whitespace-nowrap underline underline-offset-6 decoration-blue-300 decoration-0.5">
|
|
76
|
+
<span itemprop="name">{subsubtitle}</span> <span class="sr-only"> catalog</span>
|
|
77
|
+
</h1>
|
|
78
|
+
<meta itemprop="position" content="3" />
|
|
79
|
+
</div>
|
|
55
80
|
</>
|
|
56
81
|
)}
|
|
57
82
|
</>
|
|
58
83
|
) : (
|
|
59
|
-
<
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
84
|
+
<div itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
|
|
85
|
+
<h1 class="text-lg py-2.5 sm:py-0 whitespace-nowrap">
|
|
86
|
+
<span itemprop="name">{category.name}</span>
|
|
87
|
+
{titleSmall && <small>{titleSmall}</small>}
|
|
88
|
+
<span class="sr-only"> catalog</span>
|
|
89
|
+
</h1>
|
|
90
|
+
<meta itemprop="position" content="1" />
|
|
91
|
+
</div>
|
|
64
92
|
)
|
|
65
93
|
}
|
|
66
94
|
</div>
|