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 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
  ![Version](https://img.shields.io/github/package-json/v/polo-blue/sds)
4
4
 
5
- SDS is the easiest way to start websites with simple design system. Since Astro is compatible with many frameworks, you can import your components and document them right in the markdown files.
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
- | title | Introduction |
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 started
27
+ ## Getting Started
19
28
 
20
29
  ### Installation
21
30
 
22
- ```js
31
+ Install as a package:
32
+
33
+ ```bash
23
34
  pnpm add spoko-design-system
24
35
  ```
25
36
 
26
- or just clone the repository.
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
- ### Example:
31
- - https://sds.spoko.space/
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
- Most of the components from this repository can be seen in my projects:
64
+ ### Publishing
36
65
 
37
- - https://catalog.polo.blue/
38
- - https://polo.blue
39
- - https://polo6r.pl
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
- ### Features
43
- - ⚡️[Vue 3](https://github.com/vuejs/core), [Vite](https://github.com/vitejs/vite), [pnpm](https://pnpm.io/) - born with fastness
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) - fully responsive and accessible headless navigation bar
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) - [View Transition API](https://developer.mozilla.org/en-US/docs/Web/API/Document/startViewTransition) - makes it easy to change the DOM in a single step, while creating an animated transition between the two states. It's available in Chrome 111+ ([more details](https://developer.chrome.com/docs/web-platform/view-transitions?hl=en))
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 new sections
151
+ ### Adding New Icons
75
152
 
76
- Although it's not required, you can create folders for new sections.
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
- To show the section on the left side navigation, add it to the navigation config file at `src/config.ts`.
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
- ```js
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: "Buttons", link: "/components/jumbotron" },
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.md" },
239
+ { text: "New component", link: "/new-section/new-component/" },
91
240
  ];
92
241
  ```
93
242
 
94
- ### Adding new pages
243
+ ## Adding New Pages
95
244
 
96
- To add new pages just create an .astro or markdown 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.
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
- ### Customizing Core section (colors, typography, shadows...)
249
+ ## Component Preview Utility
101
250
 
102
- If you want to customize the default colors, typography or shadows you can find the configuration file at uno.config.ts`. I think I have prepared enough shades of blue ;-)
251
+ There's a class called `.component-preview` that you can use to wrap your component in a grid:
103
252
 
104
- Feel free to add new pages to the Core section
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
- ### Customizing the page layout
261
+ Three main path aliases defined in `tsconfig.json`:
262
+ - `@components/*` → `src/components/*`
263
+ - `@utils/*` → `src/utils/*`
264
+ - `@types/*` → `src/types/*`
108
265
 
109
- You can find the css for the pages in `src/styles/content.css`.
266
+ ## Package Exports
110
267
 
268
+ The package provides multiple export paths:
111
269
 
112
- ### Adding your components
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
- Astro is great for design systems because it allows you to import components from different frameworks like react, vue or svelte.
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
- To get started check how the `MainButton` component is used in the `src/pages/buttons.mdx` file.
283
+ ## Customizing Page Layout
117
284
 
118
- You can import your component library or create your own and document it easily.
285
+ You can find the css for the pages in `src/styles/content.css`.
119
286
 
287
+ ## Examples
120
288
 
121
- ### `.component-preview` utility
289
+ Documentation and live examples:
290
+ - https://sds.spoko.space/
122
291
 
123
- There's a class called `.component-preview` that you can use to wrap your component in a grid, and it will look like this:
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
- <div class="component-preview">
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
- ### Have fun!
301
+ ## License
131
302
 
132
- Spoko Design System template was made in Poland by **[@spoko.space](https://spoko.space)** for personal and commercial use.
303
+ MIT
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "spoko-design-system",
3
- "version": "1.19.0",
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.12",
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.79",
81
- "@iconify-json/material-symbols-light": "^1.2.49",
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.62",
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.416",
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": "^24.10.2",
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.2",
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.4",
131
+ "astro": "^5.16.5",
132
132
  "conventional-changelog-conventionalcommits": "^9.1.0",
133
- "eslint": "^9.39.1",
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 class="overflow-x-auto overflow-y-hidden flex max-w-full items-center">
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
- <a class="text-lg font-vw-headregular whitespace-nowrap block" href={categoryPath}>
38
- {category.name}
39
- {titleSmall && <small>{titleSmall}</small>}
40
- </a>
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
- <h1 class="text-lg py-2.5 sm:py-0 whitespace-nowrap underline underline-offset-6 decoration-blue-300 decoration-0.5">
44
- {subtitle} <span class="sr-only"> catalog</span>
45
- </h1>
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 class="text-lg py-2.5 sm:py-0 whitespace-nowrap">
49
- <a href={subcategoryPath}>{subtitle}</a>
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
- <h1 class="text-lg py-2.5 sm:py-0 whitespace-nowrap underline underline-offset-6 decoration-blue-300 decoration-0.5">
53
- {subsubtitle} <span class="sr-only"> catalog</span>
54
- </h1>
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
- <h1 class="text-lg py-2.5 sm:py-0 whitespace-nowrap">
60
- {category.name}
61
- {titleSmall && <small>{titleSmall}</small>}
62
- <span class="sr-only"> catalog</span>
63
- </h1>
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>