+24
.gitignore
+24
.gitignore
···
1
+
# Logs
2
+
logs
3
+
*.log
4
+
npm-debug.log*
5
+
yarn-debug.log*
6
+
yarn-error.log*
7
+
pnpm-debug.log*
8
+
lerna-debug.log*
9
+
10
+
node_modules
11
+
dist
12
+
dist-ssr
13
+
*.local
14
+
15
+
# Editor directories and files
16
+
.vscode/*
17
+
!.vscode/extensions.json
18
+
.idea
19
+
.DS_Store
20
+
*.suo
21
+
*.ntvs*
22
+
*.njsproj
23
+
*.sln
24
+
*.sw?
+16
.prettierrc.cjs
+16
.prettierrc.cjs
···
1
+
const { extendConfig } = require('@u3u/prettier-config/utils');
2
+
3
+
module.exports = extendConfig('@u3u/prettier-config/tw', {
4
+
bracketSpacing: true,
5
+
bracketSameLine: true,
6
+
endOfLine: 'auto',
7
+
htmlWhitespaceSensitivity: `ignore`,
8
+
jsxBracketSameLine: true,
9
+
jsxSingleQuote: false,
10
+
printWidth: 200,
11
+
trailingComma: 'all',
12
+
proseWrap: 'never',
13
+
semi: false,
14
+
singleQuote: true,
15
+
tabWidth: 4,
16
+
});
+246
PROJECT_STATE.md
+246
PROJECT_STATE.md
···
1
+
# Portfolio Project - Current State Documentation
2
+
3
+
**Generated:** 2025-11-07
4
+
**Status:** Mid-Refactor
5
+
6
+
## Project Overview
7
+
8
+
React 18 + TypeScript portfolio site built with Vite, using Tailwind CSS for styling and React Router for navigation. Data-driven content from JSON files converted from CSV sources.
9
+
10
+
---
11
+
12
+
## Technology Stack
13
+
14
+
- **Framework:** React 18.3.1 + TypeScript 5.6.2
15
+
- **Build Tool:** Vite 7.1.10
16
+
- **Router:** React Router DOM 6.26.2
17
+
- **Styling:** Tailwind CSS 3.4.13 with custom fluid typography plugin
18
+
- **SEO:** react-helmet-async
19
+
- **Icons:** Heroicons & Lucide React
20
+
21
+
---
22
+
23
+
## Site Map (Current vs. Goal)
24
+
25
+
### Current Pages (3/6)
26
+
1. ✅ **Home** (`/`) - Up-to-date
27
+
2. ✅ **About** (`/about`) - Up-to-date
28
+
3. 🟡 **Works** (`/works`) - Structure exists, needs data integration
29
+
30
+
### Goal Pages (To Be Created)
31
+
4. ⚪ **Writing** (`/writing`) - Will consume Bluesky PDS content
32
+
5. ⚪ **Links** (`/links`) - Personal linktree style page
33
+
6. ⚪ **Contact** (`/contact`) - Contact page
34
+
35
+
---
36
+
37
+
## Component Organization
38
+
39
+
### Current Structure
40
+
27 component directories with mixed organization patterns (mid-refactor)
41
+
42
+
### Target Component Structure (4-File System)
43
+
```
44
+
/ComponentName/
45
+
├── ComponentName.tsx # Component implementation
46
+
├── ComponentName.types.ts # TypeScript interfaces
47
+
├── ComponentName.styles.ts # Tailwind class objects
48
+
└── ComponentName.constants.ts # Constants & config
49
+
```
50
+
51
+
### Components Following Pattern (3-file only, NO constants yet)
52
+
- ✅ Heading, Button, Link, Paragraph, Banner, Artwork, Divider
53
+
- ✅ Section (with theme context provider)
54
+
- ✅ PostCarousel, Skills, Tags, Events, Facts, Timeline
55
+
56
+
### Components Needing Refactor
57
+
- Card variants (multiple files in one folder)
58
+
- Navigation components (BackButton, ThemeToggle)
59
+
- Footer, Logo, Breadcrumb (single files)
60
+
- Section/Home/* components (old pattern)
61
+
- home/* components (incomplete)
62
+
63
+
---
64
+
65
+
## Data Management
66
+
67
+
### Protected Data Files (`src/data/`)
68
+
69
+
**JSON Files** (`src/data/json/`):
70
+
- `articles.json` - 8.8 KB - Publication data
71
+
- `casestudies.json` - 14.3 KB - Portfolio projects (16 items)
72
+
- `companies.json` - 6.3 KB - Client information
73
+
- `content.json` - 68.9 KB - Combined dataset
74
+
- `jobs.json` - 17.2 KB - Employment history
75
+
- `skills.json` - 4.1 KB - Professional skills
76
+
77
+
**CSV Source Files** (`src/data/csv/`):
78
+
Expected format: "Barry Prendergast - [Type].csv"
79
+
- Companies, Skills, Portfolio, Jobs, Articles
80
+
81
+
**Data Access Layer** (`src/lib/data/getData.ts`):
82
+
```typescript
83
+
getContent() // All data combined
84
+
getArticles() // Article[]
85
+
getCaseStudies() // CaseStudy[]
86
+
getCompanies() // Company[]
87
+
getJobs() // Job[]
88
+
getSkills() // Skill[]
89
+
getItemBySlug() // Generic lookup
90
+
getFeaturedArticles() // Filtered
91
+
getLatestCaseStudies() // Sorted & limited
92
+
```
93
+
94
+
**Conversion Script:**
95
+
```bash
96
+
npm run convert-content # Runs src/scripts/convertCsvToJson.ts
97
+
```
98
+
99
+
---
100
+
101
+
## Design System
102
+
103
+
### Color Palette
104
+
105
+
**Primary Colors** (from `tailwind.config.ts`):
106
+
- **Blue:** `#0000ff` (bones-blue) - Primary background
107
+
- **White:** `#ffffff` (bones-white) - Text & borders
108
+
- **Black:** `#000000` (bones-black) - Future text color
109
+
- **Yellow:** `bones-yellow` - Focus, highlights, text selection
110
+
111
+
**Neutral Palette:**
112
+
- bones-dimgray (#282828), bones-gainsboro (#DCDCDC)
113
+
- bones-gray (#808080), bones-ghostwhite (#F8F8FF)
114
+
- bones-linen (#FAF0E6), bones-floralwhite (#FFFAF0)
115
+
116
+
**Accent Colors:**
117
+
- Yellows: bones-gold, bones-goldenrod
118
+
- Blues: bones-aliceblue, bones-mediumblue, bones-midnightblue
119
+
- Reds: bones-red, bones-firebrick, bones-darkred
120
+
- Purples: bones-magenta, bones-rebeccapurple, bones-indigo
121
+
122
+
### Typography
123
+
124
+
**Fonts:**
125
+
- **Sans:** DM Sans - Body text
126
+
- **Serif:** DM Serif Display - Display text
127
+
128
+
**Fluid Type Plugin** (Custom Tailwind):
129
+
```css
130
+
/* Responsive scaling with clamp() */
131
+
.fluid-preset-h1 /* 28px → 88px (360px → 1200px viewport) */
132
+
.fluid-preset-h2 /* 22px → 48px */
133
+
.fluid-preset-h3 /* 18px → 32px */
134
+
.fluid-preset-body /* 16px → 18px */
135
+
```
136
+
137
+
### Layout Principles
138
+
139
+
**Requirements:**
140
+
- ✅ Use CSS Grid and Flexbox appropriately
141
+
- ✅ NO margin - use padding and gap only
142
+
- ✅ Scale text between breakpoints
143
+
- ✅ Apply line-height to every text element
144
+
- ✅ Tailwind utilities everywhere
145
+
146
+
---
147
+
148
+
## Current Styling Implementation
149
+
150
+
### Pattern 1: White borders on blue background
151
+
Used in: HomePage, AboutPage
152
+
- Background: `#0000ff`
153
+
- Text: White
154
+
- Borders: White `#ffffff`
155
+
- Links/Buttons: Various scales
156
+
157
+
### Pattern 2: White background (future)
158
+
- Background: White `#ffffff`
159
+
- Text: Black `#000000`
160
+
- Links: Blue `#0000ff`
161
+
162
+
### Theme System
163
+
Section component provides theme context:
164
+
- `mono`, `gray`, `yellow`, `blue`, `red`, `purple`
165
+
- Child components (Button, Heading, etc.) are theme-aware
166
+
167
+
---
168
+
169
+
## Git Workflow
170
+
171
+
**Current Branch:** `main`
172
+
**Status:** Clean working directory
173
+
174
+
**Branching Strategy:**
175
+
- ⚠️ **NEVER push to main without explicit approval**
176
+
- Create feature branches for all work
177
+
- Merge only when approved
178
+
179
+
**Recent Commits:**
180
+
```
181
+
47c702b Merge pull request #10
182
+
f241a4e update to prepare to merge
183
+
3fd813f GitButler Workspace Commit
184
+
9ae9db4 Merge pull request #9
185
+
```
186
+
187
+
---
188
+
189
+
## Immediate Tasks
190
+
191
+
### 1. ✅ Project Documentation (this file)
192
+
193
+
### 2. Component Organization
194
+
- Split multi-component folders into individual component folders
195
+
- Add missing `.constants.ts` files where needed
196
+
- Standardize all components to 4-file system
197
+
198
+
### 3. Data Protection
199
+
- Verify `src/data/` structure integrity
200
+
- Document data dependencies
201
+
- Ensure conversion scripts work correctly
202
+
203
+
### 4. Styling Audit
204
+
- Review styling consistency across components
205
+
- Ensure no margin usage
206
+
- Verify fluid typography implementation
207
+
208
+
### 5. Page Development
209
+
- Fix WorksPage data integration
210
+
- Create Writing page (Bluesky integration)
211
+
- Create Links page
212
+
- Create Contact page
213
+
214
+
---
215
+
216
+
## Key File Locations
217
+
218
+
```
219
+
portfolio/
220
+
├── src/
221
+
│ ├── components/ # 27 component directories
222
+
│ ├── pages/ # HomePage, AboutPage, WorksPage
223
+
│ ├── data/
224
+
│ │ ├── json/ # Data files (protected)
225
+
│ │ └── csv/ # Source CSV files
226
+
│ ├── lib/
227
+
│ │ ├── data/ # getData.ts - data access layer
228
+
│ │ └── utils.ts # cn() utility
229
+
│ ├── scripts/ # convertCsvToJson.ts
230
+
│ ├── types/ # TypeScript definitions
231
+
│ └── main.tsx # Entry point with routing
232
+
├── plugins/ # fluidType.ts - custom Tailwind plugin
233
+
├── tailwind.config.ts # Design system configuration
234
+
└── vite.config.ts # Build configuration
235
+
```
236
+
237
+
---
238
+
239
+
## Notes
240
+
241
+
- **SEO:** All pages use Helmet with JSON-LD structured data
242
+
- **Routing:** Smart Link component handles internal/external URLs
243
+
- **Dark Mode:** Enabled via `next-themes` (class-based)
244
+
- **Icons:** Both @heroicons and lucide-react available
245
+
- **Code Quality:** ESLint + Prettier configured
246
+
- **No State Management:** Simple JSON data loading, no Redux/Zustand needed
+8
README.md
+8
README.md
···
1
+
# React + Vite
2
+
3
+
This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
4
+
5
+
Currently, two official plugins are available:
6
+
7
+
- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh
8
+
- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh
+48
eslint.config.js
+48
eslint.config.js
···
1
+
import js from '@eslint/js';
2
+
import typescript from '@typescript-eslint/eslint-plugin';
3
+
import typescriptParser from '@typescript-eslint/parser';
4
+
import react from 'eslint-plugin-react';
5
+
import reactHooks from 'eslint-plugin-react-hooks';
6
+
import reactRefresh from 'eslint-plugin-react-refresh';
7
+
import globals from 'globals';
8
+
9
+
export default [
10
+
{ ignores: ['dist'] },
11
+
{
12
+
files: ['**/*.{js,jsx,ts,tsx}'],
13
+
languageOptions: {
14
+
ecmaVersion: 2020,
15
+
globals: {
16
+
...globals.browser,
17
+
...globals.node,
18
+
},
19
+
parser: typescriptParser,
20
+
parserOptions: {
21
+
ecmaVersion: 'latest',
22
+
ecmaFeatures: { jsx: true },
23
+
sourceType: 'module',
24
+
project: './tsconfig.eslint.json',
25
+
tsconfigRootDir: process.cwd(),
26
+
},
27
+
},
28
+
settings: { react: { version: '18.3' } },
29
+
plugins: {
30
+
react,
31
+
'react-hooks': reactHooks,
32
+
'react-refresh': reactRefresh,
33
+
'@typescript-eslint': typescript,
34
+
},
35
+
rules: {
36
+
...js.configs.recommended.rules,
37
+
...react.configs.recommended.rules,
38
+
...react.configs['jsx-runtime'].rules,
39
+
...reactHooks.configs.recommended.rules,
40
+
...typescript.configs.recommended.rules,
41
+
'react/jsx-no-target-blank': 'off',
42
+
'react-refresh/only-export-components': [
43
+
'warn',
44
+
{ allowConstantExport: true },
45
+
],
46
+
},
47
+
},
48
+
];
+19
index.html
+19
index.html
···
1
+
<!doctype html>
2
+
<html lang="en">
3
+
<head>
4
+
<meta charset="UTF-8" />
5
+
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
6
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
+
<title>Design by Barry Prendergast</title>
8
+
<script>
9
+
// Set dark mode based on system preference before page renders
10
+
if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
11
+
document.documentElement.classList.add('dark');
12
+
}
13
+
</script>
14
+
</head>
15
+
<body>
16
+
<div id="root"></div>
17
+
<script type="module" src="/src/main.tsx"></script>
18
+
</body>
19
+
</html>
+9299
package-lock.json
+9299
package-lock.json
···
1
+
{
2
+
"name": "portfolio",
3
+
"version": "0.0.0",
4
+
"lockfileVersion": 3,
5
+
"requires": true,
6
+
"packages": {
7
+
"": {
8
+
"name": "portfolio",
9
+
"version": "0.0.0",
10
+
"dependencies": {
11
+
"@headlessui/react": "^2.1.8",
12
+
"@heroicons/react": "^2.1.5",
13
+
"@types/react-helmet-async": "^1.0.1",
14
+
"autoprefixer": "^10.4.20",
15
+
"clsx": "^2.1.1",
16
+
"lucide-react": "^0.446.0",
17
+
"next-themes": "^0.4.6",
18
+
"postcss": "^8.4.47",
19
+
"react": "^18.3.1",
20
+
"react-dom": "^18.3.1",
21
+
"react-helmet-async": "^2.0.5",
22
+
"react-router-dom": "^6.26.2",
23
+
"tailwind-merge": "^2.5.4",
24
+
"tailwindcss": "^3.4.13"
25
+
},
26
+
"devDependencies": {
27
+
"@eslint/js": "^9.11.1",
28
+
"@tailwindcss/typography": "^0.5.16",
29
+
"@types/next": "^8.0.7",
30
+
"@types/node": "^22.9.0",
31
+
"@types/react": "^18.3.10",
32
+
"@types/react-dom": "^18.3.0",
33
+
"@types/react-router-dom": "^5.3.3",
34
+
"@typescript-eslint/eslint-plugin": "^8.8.0",
35
+
"@typescript-eslint/parser": "^8.8.0",
36
+
"@u3u/prettier-config": "^5.1.0",
37
+
"@vitejs/plugin-react": "^4.3.1",
38
+
"csv-parse": "^5.5.6",
39
+
"eslint": "^9.11.1",
40
+
"eslint-config-prettier": "^10.0.1",
41
+
"eslint-plugin-prettier": "^5.2.3",
42
+
"eslint-plugin-react": "^7.35.0",
43
+
"eslint-plugin-react-hooks": "^5.1.0-rc.0",
44
+
"eslint-plugin-react-refresh": "^0.4.9",
45
+
"globals": "^15.9.0",
46
+
"prettier": "^3.5.2",
47
+
"tsx": "^4.19.2",
48
+
"typescript": "^5.6.2",
49
+
"vite": "^7.1.10"
50
+
}
51
+
},
52
+
"node_modules/@alloc/quick-lru": {
53
+
"version": "5.2.0",
54
+
"resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
55
+
"integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
56
+
"license": "MIT",
57
+
"engines": {
58
+
"node": ">=10"
59
+
},
60
+
"funding": {
61
+
"url": "https://github.com/sponsors/sindresorhus"
62
+
}
63
+
},
64
+
"node_modules/@ampproject/remapping": {
65
+
"version": "2.3.0",
66
+
"resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
67
+
"integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
68
+
"dev": true,
69
+
"license": "Apache-2.0",
70
+
"dependencies": {
71
+
"@jridgewell/gen-mapping": "^0.3.5",
72
+
"@jridgewell/trace-mapping": "^0.3.24"
73
+
},
74
+
"engines": {
75
+
"node": ">=6.0.0"
76
+
}
77
+
},
78
+
"node_modules/@astrojs/compiler": {
79
+
"version": "2.11.0",
80
+
"resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-2.11.0.tgz",
81
+
"integrity": "sha512-zZOO7i+JhojO8qmlyR/URui6LyfHJY6m+L9nwyX5GiKD78YoRaZ5tzz6X0fkl+5bD3uwlDHayf6Oe8Fu36RKNg==",
82
+
"dev": true,
83
+
"license": "MIT"
84
+
},
85
+
"node_modules/@augment-vir/assert": {
86
+
"version": "31.10.1",
87
+
"resolved": "https://registry.npmjs.org/@augment-vir/assert/-/assert-31.10.1.tgz",
88
+
"integrity": "sha512-XNSpPHmjXOwJqxaPEjYt9dxk1mzgiaNio6sJ11GQd+8HPFSFRj67AlFeSZKAHgXaYw1vQCd2tmgLyqWJxvTcAQ==",
89
+
"dev": true,
90
+
"license": "(MIT or CC0 1.0)",
91
+
"dependencies": {
92
+
"@augment-vir/core": "^31.10.1",
93
+
"@date-vir/duration": "^7.3.1",
94
+
"deep-eql": "^5.0.2",
95
+
"expect-type": "^1.2.0",
96
+
"type-fest": "^4.37.0"
97
+
},
98
+
"engines": {
99
+
"node": ">=22"
100
+
}
101
+
},
102
+
"node_modules/@augment-vir/common": {
103
+
"version": "31.10.1",
104
+
"resolved": "https://registry.npmjs.org/@augment-vir/common/-/common-31.10.1.tgz",
105
+
"integrity": "sha512-wGHuMdAatfmwJK7evH+Xr/WJRb++Z8o2fFvlWj8LOIaE/IwKur1NCrRbqKKTOfo0L3Ar99oXM6PNWZvVcUH59w==",
106
+
"dev": true,
107
+
"license": "(MIT or CC0 1.0)",
108
+
"dependencies": {
109
+
"@augment-vir/assert": "^31.10.1",
110
+
"@augment-vir/core": "^31.10.1",
111
+
"@date-vir/duration": "^7.3.1",
112
+
"ansi-styles": "^6.2.1",
113
+
"json5": "^2.2.3",
114
+
"type-fest": "^4.37.0",
115
+
"typed-event-target": "^4.0.3"
116
+
},
117
+
"engines": {
118
+
"node": ">=22"
119
+
}
120
+
},
121
+
"node_modules/@augment-vir/common/node_modules/ansi-styles": {
122
+
"version": "6.2.1",
123
+
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
124
+
"integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
125
+
"dev": true,
126
+
"license": "MIT",
127
+
"engines": {
128
+
"node": ">=12"
129
+
},
130
+
"funding": {
131
+
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
132
+
}
133
+
},
134
+
"node_modules/@augment-vir/core": {
135
+
"version": "31.10.1",
136
+
"resolved": "https://registry.npmjs.org/@augment-vir/core/-/core-31.10.1.tgz",
137
+
"integrity": "sha512-SW8saxkOnkZjMajwFlZuX9EMzYFcyl6TuEnlBzcjGndUtYZkfIScQ/rMn+XFoETpPpb5VasoUotPnmO6s6Lxaw==",
138
+
"dev": true,
139
+
"license": "(MIT or CC0 1.0)",
140
+
"dependencies": {
141
+
"@date-vir/duration": "^7.3.1",
142
+
"browser-or-node": "^3.0.0",
143
+
"json5": "^2.2.3",
144
+
"type-fest": "^4.37.0"
145
+
},
146
+
"engines": {
147
+
"node": ">=22"
148
+
}
149
+
},
150
+
"node_modules/@babel/code-frame": {
151
+
"version": "7.26.2",
152
+
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz",
153
+
"integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==",
154
+
"dev": true,
155
+
"license": "MIT",
156
+
"dependencies": {
157
+
"@babel/helper-validator-identifier": "^7.25.9",
158
+
"js-tokens": "^4.0.0",
159
+
"picocolors": "^1.0.0"
160
+
},
161
+
"engines": {
162
+
"node": ">=6.9.0"
163
+
}
164
+
},
165
+
"node_modules/@babel/compat-data": {
166
+
"version": "7.26.8",
167
+
"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz",
168
+
"integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==",
169
+
"dev": true,
170
+
"license": "MIT",
171
+
"engines": {
172
+
"node": ">=6.9.0"
173
+
}
174
+
},
175
+
"node_modules/@babel/core": {
176
+
"version": "7.26.10",
177
+
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz",
178
+
"integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==",
179
+
"dev": true,
180
+
"license": "MIT",
181
+
"dependencies": {
182
+
"@ampproject/remapping": "^2.2.0",
183
+
"@babel/code-frame": "^7.26.2",
184
+
"@babel/generator": "^7.26.10",
185
+
"@babel/helper-compilation-targets": "^7.26.5",
186
+
"@babel/helper-module-transforms": "^7.26.0",
187
+
"@babel/helpers": "^7.26.10",
188
+
"@babel/parser": "^7.26.10",
189
+
"@babel/template": "^7.26.9",
190
+
"@babel/traverse": "^7.26.10",
191
+
"@babel/types": "^7.26.10",
192
+
"convert-source-map": "^2.0.0",
193
+
"debug": "^4.1.0",
194
+
"gensync": "^1.0.0-beta.2",
195
+
"json5": "^2.2.3",
196
+
"semver": "^6.3.1"
197
+
},
198
+
"engines": {
199
+
"node": ">=6.9.0"
200
+
},
201
+
"funding": {
202
+
"type": "opencollective",
203
+
"url": "https://opencollective.com/babel"
204
+
}
205
+
},
206
+
"node_modules/@babel/core/node_modules/semver": {
207
+
"version": "6.3.1",
208
+
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
209
+
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
210
+
"dev": true,
211
+
"license": "ISC",
212
+
"bin": {
213
+
"semver": "bin/semver.js"
214
+
}
215
+
},
216
+
"node_modules/@babel/generator": {
217
+
"version": "7.27.0",
218
+
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.0.tgz",
219
+
"integrity": "sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==",
220
+
"dev": true,
221
+
"license": "MIT",
222
+
"dependencies": {
223
+
"@babel/parser": "^7.27.0",
224
+
"@babel/types": "^7.27.0",
225
+
"@jridgewell/gen-mapping": "^0.3.5",
226
+
"@jridgewell/trace-mapping": "^0.3.25",
227
+
"jsesc": "^3.0.2"
228
+
},
229
+
"engines": {
230
+
"node": ">=6.9.0"
231
+
}
232
+
},
233
+
"node_modules/@babel/helper-compilation-targets": {
234
+
"version": "7.27.0",
235
+
"resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.0.tgz",
236
+
"integrity": "sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==",
237
+
"dev": true,
238
+
"license": "MIT",
239
+
"dependencies": {
240
+
"@babel/compat-data": "^7.26.8",
241
+
"@babel/helper-validator-option": "^7.25.9",
242
+
"browserslist": "^4.24.0",
243
+
"lru-cache": "^5.1.1",
244
+
"semver": "^6.3.1"
245
+
},
246
+
"engines": {
247
+
"node": ">=6.9.0"
248
+
}
249
+
},
250
+
"node_modules/@babel/helper-compilation-targets/node_modules/semver": {
251
+
"version": "6.3.1",
252
+
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
253
+
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
254
+
"dev": true,
255
+
"license": "ISC",
256
+
"bin": {
257
+
"semver": "bin/semver.js"
258
+
}
259
+
},
260
+
"node_modules/@babel/helper-module-imports": {
261
+
"version": "7.25.9",
262
+
"resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz",
263
+
"integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==",
264
+
"dev": true,
265
+
"license": "MIT",
266
+
"dependencies": {
267
+
"@babel/traverse": "^7.25.9",
268
+
"@babel/types": "^7.25.9"
269
+
},
270
+
"engines": {
271
+
"node": ">=6.9.0"
272
+
}
273
+
},
274
+
"node_modules/@babel/helper-module-transforms": {
275
+
"version": "7.26.0",
276
+
"resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz",
277
+
"integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==",
278
+
"dev": true,
279
+
"license": "MIT",
280
+
"dependencies": {
281
+
"@babel/helper-module-imports": "^7.25.9",
282
+
"@babel/helper-validator-identifier": "^7.25.9",
283
+
"@babel/traverse": "^7.25.9"
284
+
},
285
+
"engines": {
286
+
"node": ">=6.9.0"
287
+
},
288
+
"peerDependencies": {
289
+
"@babel/core": "^7.0.0"
290
+
}
291
+
},
292
+
"node_modules/@babel/helper-plugin-utils": {
293
+
"version": "7.26.5",
294
+
"resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz",
295
+
"integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==",
296
+
"dev": true,
297
+
"license": "MIT",
298
+
"engines": {
299
+
"node": ">=6.9.0"
300
+
}
301
+
},
302
+
"node_modules/@babel/helper-string-parser": {
303
+
"version": "7.25.9",
304
+
"resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
305
+
"integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==",
306
+
"dev": true,
307
+
"license": "MIT",
308
+
"engines": {
309
+
"node": ">=6.9.0"
310
+
}
311
+
},
312
+
"node_modules/@babel/helper-validator-identifier": {
313
+
"version": "7.25.9",
314
+
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
315
+
"integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
316
+
"dev": true,
317
+
"license": "MIT",
318
+
"engines": {
319
+
"node": ">=6.9.0"
320
+
}
321
+
},
322
+
"node_modules/@babel/helper-validator-option": {
323
+
"version": "7.25.9",
324
+
"resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz",
325
+
"integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==",
326
+
"dev": true,
327
+
"license": "MIT",
328
+
"engines": {
329
+
"node": ">=6.9.0"
330
+
}
331
+
},
332
+
"node_modules/@babel/helpers": {
333
+
"version": "7.27.0",
334
+
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz",
335
+
"integrity": "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==",
336
+
"dev": true,
337
+
"license": "MIT",
338
+
"dependencies": {
339
+
"@babel/template": "^7.27.0",
340
+
"@babel/types": "^7.27.0"
341
+
},
342
+
"engines": {
343
+
"node": ">=6.9.0"
344
+
}
345
+
},
346
+
"node_modules/@babel/parser": {
347
+
"version": "7.27.0",
348
+
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz",
349
+
"integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==",
350
+
"dev": true,
351
+
"license": "MIT",
352
+
"dependencies": {
353
+
"@babel/types": "^7.27.0"
354
+
},
355
+
"bin": {
356
+
"parser": "bin/babel-parser.js"
357
+
},
358
+
"engines": {
359
+
"node": ">=6.0.0"
360
+
}
361
+
},
362
+
"node_modules/@babel/plugin-transform-react-jsx-self": {
363
+
"version": "7.25.9",
364
+
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz",
365
+
"integrity": "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==",
366
+
"dev": true,
367
+
"license": "MIT",
368
+
"dependencies": {
369
+
"@babel/helper-plugin-utils": "^7.25.9"
370
+
},
371
+
"engines": {
372
+
"node": ">=6.9.0"
373
+
},
374
+
"peerDependencies": {
375
+
"@babel/core": "^7.0.0-0"
376
+
}
377
+
},
378
+
"node_modules/@babel/plugin-transform-react-jsx-source": {
379
+
"version": "7.25.9",
380
+
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz",
381
+
"integrity": "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==",
382
+
"dev": true,
383
+
"license": "MIT",
384
+
"dependencies": {
385
+
"@babel/helper-plugin-utils": "^7.25.9"
386
+
},
387
+
"engines": {
388
+
"node": ">=6.9.0"
389
+
},
390
+
"peerDependencies": {
391
+
"@babel/core": "^7.0.0-0"
392
+
}
393
+
},
394
+
"node_modules/@babel/runtime-corejs3": {
395
+
"version": "7.27.0",
396
+
"resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.27.0.tgz",
397
+
"integrity": "sha512-UWjX6t+v+0ckwZ50Y5ShZLnlk95pP5MyW/pon9tiYzl3+18pkTHTFNTKr7rQbfRXPkowt2QAn30o1b6oswszew==",
398
+
"dev": true,
399
+
"license": "MIT",
400
+
"dependencies": {
401
+
"core-js-pure": "^3.30.2",
402
+
"regenerator-runtime": "^0.14.0"
403
+
},
404
+
"engines": {
405
+
"node": ">=6.9.0"
406
+
}
407
+
},
408
+
"node_modules/@babel/template": {
409
+
"version": "7.27.0",
410
+
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz",
411
+
"integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==",
412
+
"dev": true,
413
+
"license": "MIT",
414
+
"dependencies": {
415
+
"@babel/code-frame": "^7.26.2",
416
+
"@babel/parser": "^7.27.0",
417
+
"@babel/types": "^7.27.0"
418
+
},
419
+
"engines": {
420
+
"node": ">=6.9.0"
421
+
}
422
+
},
423
+
"node_modules/@babel/traverse": {
424
+
"version": "7.27.0",
425
+
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.0.tgz",
426
+
"integrity": "sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==",
427
+
"dev": true,
428
+
"license": "MIT",
429
+
"dependencies": {
430
+
"@babel/code-frame": "^7.26.2",
431
+
"@babel/generator": "^7.27.0",
432
+
"@babel/parser": "^7.27.0",
433
+
"@babel/template": "^7.27.0",
434
+
"@babel/types": "^7.27.0",
435
+
"debug": "^4.3.1",
436
+
"globals": "^11.1.0"
437
+
},
438
+
"engines": {
439
+
"node": ">=6.9.0"
440
+
}
441
+
},
442
+
"node_modules/@babel/traverse/node_modules/globals": {
443
+
"version": "11.12.0",
444
+
"resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
445
+
"integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
446
+
"dev": true,
447
+
"license": "MIT",
448
+
"engines": {
449
+
"node": ">=4"
450
+
}
451
+
},
452
+
"node_modules/@babel/types": {
453
+
"version": "7.27.0",
454
+
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz",
455
+
"integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==",
456
+
"dev": true,
457
+
"license": "MIT",
458
+
"dependencies": {
459
+
"@babel/helper-string-parser": "^7.25.9",
460
+
"@babel/helper-validator-identifier": "^7.25.9"
461
+
},
462
+
"engines": {
463
+
"node": ">=6.9.0"
464
+
}
465
+
},
466
+
"node_modules/@date-vir/duration": {
467
+
"version": "7.3.1",
468
+
"resolved": "https://registry.npmjs.org/@date-vir/duration/-/duration-7.3.1.tgz",
469
+
"integrity": "sha512-MRXg2dz021QdOYx4TRcDFJ1PhiNIr8HsZ73uFot5+yMbE0oMdqEDpetzm3PAYvSrYrC3L/qxr8+cnh6FUr+cRw==",
470
+
"dev": true,
471
+
"license": "(MIT or CC0 1.0)",
472
+
"dependencies": {
473
+
"@types/luxon": "^3.4.2",
474
+
"luxon": "^3.5.0",
475
+
"type-fest": "^4.37.0"
476
+
},
477
+
"engines": {
478
+
"node": ">=22"
479
+
}
480
+
},
481
+
"node_modules/@esbuild/aix-ppc64": {
482
+
"version": "0.25.2",
483
+
"resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.2.tgz",
484
+
"integrity": "sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==",
485
+
"cpu": [
486
+
"ppc64"
487
+
],
488
+
"dev": true,
489
+
"license": "MIT",
490
+
"optional": true,
491
+
"os": [
492
+
"aix"
493
+
],
494
+
"engines": {
495
+
"node": ">=18"
496
+
}
497
+
},
498
+
"node_modules/@esbuild/android-arm": {
499
+
"version": "0.25.2",
500
+
"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.2.tgz",
501
+
"integrity": "sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==",
502
+
"cpu": [
503
+
"arm"
504
+
],
505
+
"dev": true,
506
+
"license": "MIT",
507
+
"optional": true,
508
+
"os": [
509
+
"android"
510
+
],
511
+
"engines": {
512
+
"node": ">=18"
513
+
}
514
+
},
515
+
"node_modules/@esbuild/android-arm64": {
516
+
"version": "0.25.2",
517
+
"resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.2.tgz",
518
+
"integrity": "sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==",
519
+
"cpu": [
520
+
"arm64"
521
+
],
522
+
"dev": true,
523
+
"license": "MIT",
524
+
"optional": true,
525
+
"os": [
526
+
"android"
527
+
],
528
+
"engines": {
529
+
"node": ">=18"
530
+
}
531
+
},
532
+
"node_modules/@esbuild/android-x64": {
533
+
"version": "0.25.2",
534
+
"resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.2.tgz",
535
+
"integrity": "sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==",
536
+
"cpu": [
537
+
"x64"
538
+
],
539
+
"dev": true,
540
+
"license": "MIT",
541
+
"optional": true,
542
+
"os": [
543
+
"android"
544
+
],
545
+
"engines": {
546
+
"node": ">=18"
547
+
}
548
+
},
549
+
"node_modules/@esbuild/darwin-arm64": {
550
+
"version": "0.25.2",
551
+
"resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.2.tgz",
552
+
"integrity": "sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==",
553
+
"cpu": [
554
+
"arm64"
555
+
],
556
+
"dev": true,
557
+
"license": "MIT",
558
+
"optional": true,
559
+
"os": [
560
+
"darwin"
561
+
],
562
+
"engines": {
563
+
"node": ">=18"
564
+
}
565
+
},
566
+
"node_modules/@esbuild/darwin-x64": {
567
+
"version": "0.25.2",
568
+
"resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.2.tgz",
569
+
"integrity": "sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==",
570
+
"cpu": [
571
+
"x64"
572
+
],
573
+
"dev": true,
574
+
"license": "MIT",
575
+
"optional": true,
576
+
"os": [
577
+
"darwin"
578
+
],
579
+
"engines": {
580
+
"node": ">=18"
581
+
}
582
+
},
583
+
"node_modules/@esbuild/freebsd-arm64": {
584
+
"version": "0.25.2",
585
+
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.2.tgz",
586
+
"integrity": "sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==",
587
+
"cpu": [
588
+
"arm64"
589
+
],
590
+
"dev": true,
591
+
"license": "MIT",
592
+
"optional": true,
593
+
"os": [
594
+
"freebsd"
595
+
],
596
+
"engines": {
597
+
"node": ">=18"
598
+
}
599
+
},
600
+
"node_modules/@esbuild/freebsd-x64": {
601
+
"version": "0.25.2",
602
+
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.2.tgz",
603
+
"integrity": "sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==",
604
+
"cpu": [
605
+
"x64"
606
+
],
607
+
"dev": true,
608
+
"license": "MIT",
609
+
"optional": true,
610
+
"os": [
611
+
"freebsd"
612
+
],
613
+
"engines": {
614
+
"node": ">=18"
615
+
}
616
+
},
617
+
"node_modules/@esbuild/linux-arm": {
618
+
"version": "0.25.2",
619
+
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.2.tgz",
620
+
"integrity": "sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==",
621
+
"cpu": [
622
+
"arm"
623
+
],
624
+
"dev": true,
625
+
"license": "MIT",
626
+
"optional": true,
627
+
"os": [
628
+
"linux"
629
+
],
630
+
"engines": {
631
+
"node": ">=18"
632
+
}
633
+
},
634
+
"node_modules/@esbuild/linux-arm64": {
635
+
"version": "0.25.2",
636
+
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.2.tgz",
637
+
"integrity": "sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==",
638
+
"cpu": [
639
+
"arm64"
640
+
],
641
+
"dev": true,
642
+
"license": "MIT",
643
+
"optional": true,
644
+
"os": [
645
+
"linux"
646
+
],
647
+
"engines": {
648
+
"node": ">=18"
649
+
}
650
+
},
651
+
"node_modules/@esbuild/linux-ia32": {
652
+
"version": "0.25.2",
653
+
"resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.2.tgz",
654
+
"integrity": "sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==",
655
+
"cpu": [
656
+
"ia32"
657
+
],
658
+
"dev": true,
659
+
"license": "MIT",
660
+
"optional": true,
661
+
"os": [
662
+
"linux"
663
+
],
664
+
"engines": {
665
+
"node": ">=18"
666
+
}
667
+
},
668
+
"node_modules/@esbuild/linux-loong64": {
669
+
"version": "0.25.2",
670
+
"resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.2.tgz",
671
+
"integrity": "sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==",
672
+
"cpu": [
673
+
"loong64"
674
+
],
675
+
"dev": true,
676
+
"license": "MIT",
677
+
"optional": true,
678
+
"os": [
679
+
"linux"
680
+
],
681
+
"engines": {
682
+
"node": ">=18"
683
+
}
684
+
},
685
+
"node_modules/@esbuild/linux-mips64el": {
686
+
"version": "0.25.2",
687
+
"resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.2.tgz",
688
+
"integrity": "sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==",
689
+
"cpu": [
690
+
"mips64el"
691
+
],
692
+
"dev": true,
693
+
"license": "MIT",
694
+
"optional": true,
695
+
"os": [
696
+
"linux"
697
+
],
698
+
"engines": {
699
+
"node": ">=18"
700
+
}
701
+
},
702
+
"node_modules/@esbuild/linux-ppc64": {
703
+
"version": "0.25.2",
704
+
"resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.2.tgz",
705
+
"integrity": "sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==",
706
+
"cpu": [
707
+
"ppc64"
708
+
],
709
+
"dev": true,
710
+
"license": "MIT",
711
+
"optional": true,
712
+
"os": [
713
+
"linux"
714
+
],
715
+
"engines": {
716
+
"node": ">=18"
717
+
}
718
+
},
719
+
"node_modules/@esbuild/linux-riscv64": {
720
+
"version": "0.25.2",
721
+
"resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.2.tgz",
722
+
"integrity": "sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==",
723
+
"cpu": [
724
+
"riscv64"
725
+
],
726
+
"dev": true,
727
+
"license": "MIT",
728
+
"optional": true,
729
+
"os": [
730
+
"linux"
731
+
],
732
+
"engines": {
733
+
"node": ">=18"
734
+
}
735
+
},
736
+
"node_modules/@esbuild/linux-s390x": {
737
+
"version": "0.25.2",
738
+
"resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.2.tgz",
739
+
"integrity": "sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==",
740
+
"cpu": [
741
+
"s390x"
742
+
],
743
+
"dev": true,
744
+
"license": "MIT",
745
+
"optional": true,
746
+
"os": [
747
+
"linux"
748
+
],
749
+
"engines": {
750
+
"node": ">=18"
751
+
}
752
+
},
753
+
"node_modules/@esbuild/linux-x64": {
754
+
"version": "0.25.2",
755
+
"resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.2.tgz",
756
+
"integrity": "sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==",
757
+
"cpu": [
758
+
"x64"
759
+
],
760
+
"dev": true,
761
+
"license": "MIT",
762
+
"optional": true,
763
+
"os": [
764
+
"linux"
765
+
],
766
+
"engines": {
767
+
"node": ">=18"
768
+
}
769
+
},
770
+
"node_modules/@esbuild/netbsd-arm64": {
771
+
"version": "0.25.2",
772
+
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.2.tgz",
773
+
"integrity": "sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==",
774
+
"cpu": [
775
+
"arm64"
776
+
],
777
+
"dev": true,
778
+
"license": "MIT",
779
+
"optional": true,
780
+
"os": [
781
+
"netbsd"
782
+
],
783
+
"engines": {
784
+
"node": ">=18"
785
+
}
786
+
},
787
+
"node_modules/@esbuild/netbsd-x64": {
788
+
"version": "0.25.2",
789
+
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.2.tgz",
790
+
"integrity": "sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==",
791
+
"cpu": [
792
+
"x64"
793
+
],
794
+
"dev": true,
795
+
"license": "MIT",
796
+
"optional": true,
797
+
"os": [
798
+
"netbsd"
799
+
],
800
+
"engines": {
801
+
"node": ">=18"
802
+
}
803
+
},
804
+
"node_modules/@esbuild/openbsd-arm64": {
805
+
"version": "0.25.2",
806
+
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.2.tgz",
807
+
"integrity": "sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==",
808
+
"cpu": [
809
+
"arm64"
810
+
],
811
+
"dev": true,
812
+
"license": "MIT",
813
+
"optional": true,
814
+
"os": [
815
+
"openbsd"
816
+
],
817
+
"engines": {
818
+
"node": ">=18"
819
+
}
820
+
},
821
+
"node_modules/@esbuild/openbsd-x64": {
822
+
"version": "0.25.2",
823
+
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.2.tgz",
824
+
"integrity": "sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==",
825
+
"cpu": [
826
+
"x64"
827
+
],
828
+
"dev": true,
829
+
"license": "MIT",
830
+
"optional": true,
831
+
"os": [
832
+
"openbsd"
833
+
],
834
+
"engines": {
835
+
"node": ">=18"
836
+
}
837
+
},
838
+
"node_modules/@esbuild/sunos-x64": {
839
+
"version": "0.25.2",
840
+
"resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.2.tgz",
841
+
"integrity": "sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==",
842
+
"cpu": [
843
+
"x64"
844
+
],
845
+
"dev": true,
846
+
"license": "MIT",
847
+
"optional": true,
848
+
"os": [
849
+
"sunos"
850
+
],
851
+
"engines": {
852
+
"node": ">=18"
853
+
}
854
+
},
855
+
"node_modules/@esbuild/win32-arm64": {
856
+
"version": "0.25.2",
857
+
"resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.2.tgz",
858
+
"integrity": "sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==",
859
+
"cpu": [
860
+
"arm64"
861
+
],
862
+
"dev": true,
863
+
"license": "MIT",
864
+
"optional": true,
865
+
"os": [
866
+
"win32"
867
+
],
868
+
"engines": {
869
+
"node": ">=18"
870
+
}
871
+
},
872
+
"node_modules/@esbuild/win32-ia32": {
873
+
"version": "0.25.2",
874
+
"resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.2.tgz",
875
+
"integrity": "sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==",
876
+
"cpu": [
877
+
"ia32"
878
+
],
879
+
"dev": true,
880
+
"license": "MIT",
881
+
"optional": true,
882
+
"os": [
883
+
"win32"
884
+
],
885
+
"engines": {
886
+
"node": ">=18"
887
+
}
888
+
},
889
+
"node_modules/@esbuild/win32-x64": {
890
+
"version": "0.25.2",
891
+
"resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.2.tgz",
892
+
"integrity": "sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==",
893
+
"cpu": [
894
+
"x64"
895
+
],
896
+
"dev": true,
897
+
"license": "MIT",
898
+
"optional": true,
899
+
"os": [
900
+
"win32"
901
+
],
902
+
"engines": {
903
+
"node": ">=18"
904
+
}
905
+
},
906
+
"node_modules/@eslint-community/eslint-utils": {
907
+
"version": "4.9.0",
908
+
"resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz",
909
+
"integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==",
910
+
"dev": true,
911
+
"license": "MIT",
912
+
"dependencies": {
913
+
"eslint-visitor-keys": "^3.4.3"
914
+
},
915
+
"engines": {
916
+
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
917
+
},
918
+
"funding": {
919
+
"url": "https://opencollective.com/eslint"
920
+
},
921
+
"peerDependencies": {
922
+
"eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
923
+
}
924
+
},
925
+
"node_modules/@eslint-community/regexpp": {
926
+
"version": "4.12.1",
927
+
"resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
928
+
"integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
929
+
"dev": true,
930
+
"license": "MIT",
931
+
"engines": {
932
+
"node": "^12.0.0 || ^14.0.0 || >=16.0.0"
933
+
}
934
+
},
935
+
"node_modules/@eslint/config-array": {
936
+
"version": "0.21.0",
937
+
"resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz",
938
+
"integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==",
939
+
"dev": true,
940
+
"license": "Apache-2.0",
941
+
"dependencies": {
942
+
"@eslint/object-schema": "^2.1.6",
943
+
"debug": "^4.3.1",
944
+
"minimatch": "^3.1.2"
945
+
},
946
+
"engines": {
947
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
948
+
}
949
+
},
950
+
"node_modules/@eslint/config-array/node_modules/brace-expansion": {
951
+
"version": "1.1.12",
952
+
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
953
+
"integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
954
+
"dev": true,
955
+
"license": "MIT",
956
+
"dependencies": {
957
+
"balanced-match": "^1.0.0",
958
+
"concat-map": "0.0.1"
959
+
}
960
+
},
961
+
"node_modules/@eslint/config-array/node_modules/minimatch": {
962
+
"version": "3.1.2",
963
+
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
964
+
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
965
+
"dev": true,
966
+
"license": "ISC",
967
+
"dependencies": {
968
+
"brace-expansion": "^1.1.7"
969
+
},
970
+
"engines": {
971
+
"node": "*"
972
+
}
973
+
},
974
+
"node_modules/@eslint/config-helpers": {
975
+
"version": "0.4.0",
976
+
"resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.0.tgz",
977
+
"integrity": "sha512-WUFvV4WoIwW8Bv0KeKCIIEgdSiFOsulyN0xrMu+7z43q/hkOLXjvb5u7UC9jDxvRzcrbEmuZBX5yJZz1741jog==",
978
+
"dev": true,
979
+
"license": "Apache-2.0",
980
+
"dependencies": {
981
+
"@eslint/core": "^0.16.0"
982
+
},
983
+
"engines": {
984
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
985
+
}
986
+
},
987
+
"node_modules/@eslint/core": {
988
+
"version": "0.16.0",
989
+
"resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.16.0.tgz",
990
+
"integrity": "sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==",
991
+
"dev": true,
992
+
"license": "Apache-2.0",
993
+
"dependencies": {
994
+
"@types/json-schema": "^7.0.15"
995
+
},
996
+
"engines": {
997
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
998
+
}
999
+
},
1000
+
"node_modules/@eslint/eslintrc": {
1001
+
"version": "3.3.1",
1002
+
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz",
1003
+
"integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==",
1004
+
"dev": true,
1005
+
"license": "MIT",
1006
+
"dependencies": {
1007
+
"ajv": "^6.12.4",
1008
+
"debug": "^4.3.2",
1009
+
"espree": "^10.0.1",
1010
+
"globals": "^14.0.0",
1011
+
"ignore": "^5.2.0",
1012
+
"import-fresh": "^3.2.1",
1013
+
"js-yaml": "^4.1.0",
1014
+
"minimatch": "^3.1.2",
1015
+
"strip-json-comments": "^3.1.1"
1016
+
},
1017
+
"engines": {
1018
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1019
+
},
1020
+
"funding": {
1021
+
"url": "https://opencollective.com/eslint"
1022
+
}
1023
+
},
1024
+
"node_modules/@eslint/eslintrc/node_modules/ajv": {
1025
+
"version": "6.12.6",
1026
+
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
1027
+
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
1028
+
"dev": true,
1029
+
"license": "MIT",
1030
+
"dependencies": {
1031
+
"fast-deep-equal": "^3.1.1",
1032
+
"fast-json-stable-stringify": "^2.0.0",
1033
+
"json-schema-traverse": "^0.4.1",
1034
+
"uri-js": "^4.2.2"
1035
+
},
1036
+
"funding": {
1037
+
"type": "github",
1038
+
"url": "https://github.com/sponsors/epoberezkin"
1039
+
}
1040
+
},
1041
+
"node_modules/@eslint/eslintrc/node_modules/brace-expansion": {
1042
+
"version": "1.1.12",
1043
+
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
1044
+
"integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
1045
+
"dev": true,
1046
+
"license": "MIT",
1047
+
"dependencies": {
1048
+
"balanced-match": "^1.0.0",
1049
+
"concat-map": "0.0.1"
1050
+
}
1051
+
},
1052
+
"node_modules/@eslint/eslintrc/node_modules/globals": {
1053
+
"version": "14.0.0",
1054
+
"resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
1055
+
"integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
1056
+
"dev": true,
1057
+
"license": "MIT",
1058
+
"engines": {
1059
+
"node": ">=18"
1060
+
},
1061
+
"funding": {
1062
+
"url": "https://github.com/sponsors/sindresorhus"
1063
+
}
1064
+
},
1065
+
"node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": {
1066
+
"version": "0.4.1",
1067
+
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
1068
+
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
1069
+
"dev": true,
1070
+
"license": "MIT"
1071
+
},
1072
+
"node_modules/@eslint/eslintrc/node_modules/minimatch": {
1073
+
"version": "3.1.2",
1074
+
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
1075
+
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
1076
+
"dev": true,
1077
+
"license": "ISC",
1078
+
"dependencies": {
1079
+
"brace-expansion": "^1.1.7"
1080
+
},
1081
+
"engines": {
1082
+
"node": "*"
1083
+
}
1084
+
},
1085
+
"node_modules/@eslint/js": {
1086
+
"version": "9.37.0",
1087
+
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.37.0.tgz",
1088
+
"integrity": "sha512-jaS+NJ+hximswBG6pjNX0uEJZkrT0zwpVi3BA3vX22aFGjJjmgSTSmPpZCRKmoBL5VY/M6p0xsSJx7rk7sy5gg==",
1089
+
"dev": true,
1090
+
"license": "MIT",
1091
+
"engines": {
1092
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1093
+
},
1094
+
"funding": {
1095
+
"url": "https://eslint.org/donate"
1096
+
}
1097
+
},
1098
+
"node_modules/@eslint/object-schema": {
1099
+
"version": "2.1.6",
1100
+
"resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz",
1101
+
"integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==",
1102
+
"dev": true,
1103
+
"license": "Apache-2.0",
1104
+
"engines": {
1105
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1106
+
}
1107
+
},
1108
+
"node_modules/@eslint/plugin-kit": {
1109
+
"version": "0.4.0",
1110
+
"resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.0.tgz",
1111
+
"integrity": "sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==",
1112
+
"dev": true,
1113
+
"license": "Apache-2.0",
1114
+
"dependencies": {
1115
+
"@eslint/core": "^0.16.0",
1116
+
"levn": "^0.4.1"
1117
+
},
1118
+
"engines": {
1119
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1120
+
}
1121
+
},
1122
+
"node_modules/@floating-ui/core": {
1123
+
"version": "1.6.9",
1124
+
"resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.9.tgz",
1125
+
"integrity": "sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==",
1126
+
"license": "MIT",
1127
+
"dependencies": {
1128
+
"@floating-ui/utils": "^0.2.9"
1129
+
}
1130
+
},
1131
+
"node_modules/@floating-ui/dom": {
1132
+
"version": "1.6.13",
1133
+
"resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.13.tgz",
1134
+
"integrity": "sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==",
1135
+
"license": "MIT",
1136
+
"dependencies": {
1137
+
"@floating-ui/core": "^1.6.0",
1138
+
"@floating-ui/utils": "^0.2.9"
1139
+
}
1140
+
},
1141
+
"node_modules/@floating-ui/react": {
1142
+
"version": "0.26.28",
1143
+
"resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.26.28.tgz",
1144
+
"integrity": "sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==",
1145
+
"license": "MIT",
1146
+
"dependencies": {
1147
+
"@floating-ui/react-dom": "^2.1.2",
1148
+
"@floating-ui/utils": "^0.2.8",
1149
+
"tabbable": "^6.0.0"
1150
+
},
1151
+
"peerDependencies": {
1152
+
"react": ">=16.8.0",
1153
+
"react-dom": ">=16.8.0"
1154
+
}
1155
+
},
1156
+
"node_modules/@floating-ui/react-dom": {
1157
+
"version": "2.1.2",
1158
+
"resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.2.tgz",
1159
+
"integrity": "sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==",
1160
+
"license": "MIT",
1161
+
"dependencies": {
1162
+
"@floating-ui/dom": "^1.0.0"
1163
+
},
1164
+
"peerDependencies": {
1165
+
"react": ">=16.8.0",
1166
+
"react-dom": ">=16.8.0"
1167
+
}
1168
+
},
1169
+
"node_modules/@floating-ui/utils": {
1170
+
"version": "0.2.9",
1171
+
"resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.9.tgz",
1172
+
"integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==",
1173
+
"license": "MIT"
1174
+
},
1175
+
"node_modules/@headlessui/react": {
1176
+
"version": "2.2.1",
1177
+
"resolved": "https://registry.npmjs.org/@headlessui/react/-/react-2.2.1.tgz",
1178
+
"integrity": "sha512-daiUqVLae8CKVjEVT19P/izW0aGK0GNhMSAeMlrDebKmoVZHcRRwbxzgtnEadUVDXyBsWo9/UH4KHeniO+0tMg==",
1179
+
"license": "MIT",
1180
+
"dependencies": {
1181
+
"@floating-ui/react": "^0.26.16",
1182
+
"@react-aria/focus": "^3.17.1",
1183
+
"@react-aria/interactions": "^3.21.3",
1184
+
"@tanstack/react-virtual": "^3.11.1"
1185
+
},
1186
+
"engines": {
1187
+
"node": ">=10"
1188
+
},
1189
+
"peerDependencies": {
1190
+
"react": "^18 || ^19 || ^19.0.0-rc",
1191
+
"react-dom": "^18 || ^19 || ^19.0.0-rc"
1192
+
}
1193
+
},
1194
+
"node_modules/@heroicons/react": {
1195
+
"version": "2.2.0",
1196
+
"resolved": "https://registry.npmjs.org/@heroicons/react/-/react-2.2.0.tgz",
1197
+
"integrity": "sha512-LMcepvRaS9LYHJGsF0zzmgKCUim/X3N/DQKc4jepAXJ7l8QxJ1PmxJzqplF2Z3FE4PqBAIGyJAQ/w4B5dsqbtQ==",
1198
+
"license": "MIT",
1199
+
"peerDependencies": {
1200
+
"react": ">= 16 || ^19.0.0-rc"
1201
+
}
1202
+
},
1203
+
"node_modules/@humanfs/core": {
1204
+
"version": "0.19.1",
1205
+
"resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
1206
+
"integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==",
1207
+
"dev": true,
1208
+
"license": "Apache-2.0",
1209
+
"engines": {
1210
+
"node": ">=18.18.0"
1211
+
}
1212
+
},
1213
+
"node_modules/@humanfs/node": {
1214
+
"version": "0.16.6",
1215
+
"resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz",
1216
+
"integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==",
1217
+
"dev": true,
1218
+
"license": "Apache-2.0",
1219
+
"dependencies": {
1220
+
"@humanfs/core": "^0.19.1",
1221
+
"@humanwhocodes/retry": "^0.3.0"
1222
+
},
1223
+
"engines": {
1224
+
"node": ">=18.18.0"
1225
+
}
1226
+
},
1227
+
"node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": {
1228
+
"version": "0.3.1",
1229
+
"resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz",
1230
+
"integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==",
1231
+
"dev": true,
1232
+
"license": "Apache-2.0",
1233
+
"engines": {
1234
+
"node": ">=18.18"
1235
+
},
1236
+
"funding": {
1237
+
"type": "github",
1238
+
"url": "https://github.com/sponsors/nzakas"
1239
+
}
1240
+
},
1241
+
"node_modules/@humanwhocodes/module-importer": {
1242
+
"version": "1.0.1",
1243
+
"resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
1244
+
"integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
1245
+
"dev": true,
1246
+
"license": "Apache-2.0",
1247
+
"engines": {
1248
+
"node": ">=12.22"
1249
+
},
1250
+
"funding": {
1251
+
"type": "github",
1252
+
"url": "https://github.com/sponsors/nzakas"
1253
+
}
1254
+
},
1255
+
"node_modules/@humanwhocodes/retry": {
1256
+
"version": "0.4.2",
1257
+
"resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz",
1258
+
"integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==",
1259
+
"dev": true,
1260
+
"license": "Apache-2.0",
1261
+
"engines": {
1262
+
"node": ">=18.18"
1263
+
},
1264
+
"funding": {
1265
+
"type": "github",
1266
+
"url": "https://github.com/sponsors/nzakas"
1267
+
}
1268
+
},
1269
+
"node_modules/@ianvs/prettier-plugin-sort-imports": {
1270
+
"version": "4.4.1",
1271
+
"resolved": "https://registry.npmjs.org/@ianvs/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-4.4.1.tgz",
1272
+
"integrity": "sha512-F0/Hrcfpy8WuxlQyAWJTEren/uxKhYonOGY4OyWmwRdeTvkh9mMSCxowZLjNkhwi/2ipqCgtXwwOk7tW0mWXkA==",
1273
+
"dev": true,
1274
+
"license": "Apache-2.0",
1275
+
"dependencies": {
1276
+
"@babel/generator": "^7.26.2",
1277
+
"@babel/parser": "^7.26.2",
1278
+
"@babel/traverse": "^7.25.9",
1279
+
"@babel/types": "^7.26.0",
1280
+
"semver": "^7.5.2"
1281
+
},
1282
+
"peerDependencies": {
1283
+
"@vue/compiler-sfc": "2.7.x || 3.x",
1284
+
"prettier": "2 || 3"
1285
+
},
1286
+
"peerDependenciesMeta": {
1287
+
"@vue/compiler-sfc": {
1288
+
"optional": true
1289
+
}
1290
+
}
1291
+
},
1292
+
"node_modules/@isaacs/cliui": {
1293
+
"version": "8.0.2",
1294
+
"resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
1295
+
"integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
1296
+
"license": "ISC",
1297
+
"dependencies": {
1298
+
"string-width": "^5.1.2",
1299
+
"string-width-cjs": "npm:string-width@^4.2.0",
1300
+
"strip-ansi": "^7.0.1",
1301
+
"strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
1302
+
"wrap-ansi": "^8.1.0",
1303
+
"wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
1304
+
},
1305
+
"engines": {
1306
+
"node": ">=12"
1307
+
}
1308
+
},
1309
+
"node_modules/@jridgewell/gen-mapping": {
1310
+
"version": "0.3.8",
1311
+
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz",
1312
+
"integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==",
1313
+
"license": "MIT",
1314
+
"dependencies": {
1315
+
"@jridgewell/set-array": "^1.2.1",
1316
+
"@jridgewell/sourcemap-codec": "^1.4.10",
1317
+
"@jridgewell/trace-mapping": "^0.3.24"
1318
+
},
1319
+
"engines": {
1320
+
"node": ">=6.0.0"
1321
+
}
1322
+
},
1323
+
"node_modules/@jridgewell/resolve-uri": {
1324
+
"version": "3.1.2",
1325
+
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
1326
+
"integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
1327
+
"license": "MIT",
1328
+
"engines": {
1329
+
"node": ">=6.0.0"
1330
+
}
1331
+
},
1332
+
"node_modules/@jridgewell/set-array": {
1333
+
"version": "1.2.1",
1334
+
"resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
1335
+
"integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
1336
+
"license": "MIT",
1337
+
"engines": {
1338
+
"node": ">=6.0.0"
1339
+
}
1340
+
},
1341
+
"node_modules/@jridgewell/sourcemap-codec": {
1342
+
"version": "1.5.0",
1343
+
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
1344
+
"integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
1345
+
"license": "MIT"
1346
+
},
1347
+
"node_modules/@jridgewell/trace-mapping": {
1348
+
"version": "0.3.25",
1349
+
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
1350
+
"integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
1351
+
"license": "MIT",
1352
+
"dependencies": {
1353
+
"@jridgewell/resolve-uri": "^3.1.0",
1354
+
"@jridgewell/sourcemap-codec": "^1.4.14"
1355
+
}
1356
+
},
1357
+
"node_modules/@nodelib/fs.scandir": {
1358
+
"version": "2.1.5",
1359
+
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
1360
+
"integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
1361
+
"license": "MIT",
1362
+
"dependencies": {
1363
+
"@nodelib/fs.stat": "2.0.5",
1364
+
"run-parallel": "^1.1.9"
1365
+
},
1366
+
"engines": {
1367
+
"node": ">= 8"
1368
+
}
1369
+
},
1370
+
"node_modules/@nodelib/fs.stat": {
1371
+
"version": "2.0.5",
1372
+
"resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
1373
+
"integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
1374
+
"license": "MIT",
1375
+
"engines": {
1376
+
"node": ">= 8"
1377
+
}
1378
+
},
1379
+
"node_modules/@nodelib/fs.walk": {
1380
+
"version": "1.2.8",
1381
+
"resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
1382
+
"integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
1383
+
"license": "MIT",
1384
+
"dependencies": {
1385
+
"@nodelib/fs.scandir": "2.1.5",
1386
+
"fastq": "^1.6.0"
1387
+
},
1388
+
"engines": {
1389
+
"node": ">= 8"
1390
+
}
1391
+
},
1392
+
"node_modules/@one-ini/wasm": {
1393
+
"version": "0.1.1",
1394
+
"resolved": "https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz",
1395
+
"integrity": "sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==",
1396
+
"dev": true,
1397
+
"license": "MIT"
1398
+
},
1399
+
"node_modules/@pkgjs/parseargs": {
1400
+
"version": "0.11.0",
1401
+
"resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
1402
+
"integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
1403
+
"license": "MIT",
1404
+
"optional": true,
1405
+
"engines": {
1406
+
"node": ">=14"
1407
+
}
1408
+
},
1409
+
"node_modules/@pkgr/core": {
1410
+
"version": "0.2.0",
1411
+
"resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.0.tgz",
1412
+
"integrity": "sha512-vsJDAkYR6qCPu+ioGScGiMYR7LvZYIXh/dlQeviqoTWNCVfKTLYD/LkNWH4Mxsv2a5vpIRc77FN5DnmK1eBggQ==",
1413
+
"dev": true,
1414
+
"license": "MIT",
1415
+
"engines": {
1416
+
"node": "^12.20.0 || ^14.18.0 || >=16.0.0"
1417
+
},
1418
+
"funding": {
1419
+
"url": "https://opencollective.com/unts"
1420
+
}
1421
+
},
1422
+
"node_modules/@prettier/plugin-php": {
1423
+
"version": "0.22.4",
1424
+
"resolved": "https://registry.npmjs.org/@prettier/plugin-php/-/plugin-php-0.22.4.tgz",
1425
+
"integrity": "sha512-uZWqfyrwsxScIYkmVcfnoQGFmKVMXTHD5pqYT4l8fxzm5P3XY94hTPbf8X6TFCi2QTZBIot7GS8lfIjQjldc2g==",
1426
+
"dev": true,
1427
+
"license": "MIT",
1428
+
"dependencies": {
1429
+
"linguist-languages": "^7.27.0",
1430
+
"php-parser": "^3.1.5"
1431
+
},
1432
+
"peerDependencies": {
1433
+
"prettier": "^3.0.0"
1434
+
}
1435
+
},
1436
+
"node_modules/@prettier/plugin-xml": {
1437
+
"version": "3.4.1",
1438
+
"resolved": "https://registry.npmjs.org/@prettier/plugin-xml/-/plugin-xml-3.4.1.tgz",
1439
+
"integrity": "sha512-Uf/6/+9ez6z/IvZErgobZ2G9n1ybxF5BhCd7eMcKqfoWuOzzNUxBipNo3QAP8kRC1VD18TIo84no7LhqtyDcTg==",
1440
+
"dev": true,
1441
+
"license": "MIT",
1442
+
"dependencies": {
1443
+
"@xml-tools/parser": "^1.0.11"
1444
+
},
1445
+
"peerDependencies": {
1446
+
"prettier": "^3.0.0"
1447
+
}
1448
+
},
1449
+
"node_modules/@prisma/prisma-schema-wasm": {
1450
+
"version": "4.17.0-26.6b0aef69b7cdfc787f822ecd7cdc76d5f1991584",
1451
+
"resolved": "https://registry.npmjs.org/@prisma/prisma-schema-wasm/-/prisma-schema-wasm-4.17.0-26.6b0aef69b7cdfc787f822ecd7cdc76d5f1991584.tgz",
1452
+
"integrity": "sha512-JFdsnSgBPN8reDTLOI9Vh/6ccCb2aD1LbY/LWQnkcIgNo6IdpzvuM+qRVbBuA6IZP2SdqQI8Lu6RL2P8EFBQUA==",
1453
+
"dev": true,
1454
+
"license": "Apache-2.0"
1455
+
},
1456
+
"node_modules/@react-aria/focus": {
1457
+
"version": "3.20.1",
1458
+
"resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.20.1.tgz",
1459
+
"integrity": "sha512-lgYs+sQ1TtBrAXnAdRBQrBo0/7o5H6IrfDxec1j+VRpcXL0xyk0xPq+m3lZp8typzIghqDgpnKkJ5Jf4OrzPIw==",
1460
+
"license": "Apache-2.0",
1461
+
"dependencies": {
1462
+
"@react-aria/interactions": "^3.24.1",
1463
+
"@react-aria/utils": "^3.28.1",
1464
+
"@react-types/shared": "^3.28.0",
1465
+
"@swc/helpers": "^0.5.0",
1466
+
"clsx": "^2.0.0"
1467
+
},
1468
+
"peerDependencies": {
1469
+
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
1470
+
"react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
1471
+
}
1472
+
},
1473
+
"node_modules/@react-aria/interactions": {
1474
+
"version": "3.24.1",
1475
+
"resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.24.1.tgz",
1476
+
"integrity": "sha512-OWEcIC6UQfWq4Td5Ptuh4PZQ4LHLJr/JL2jGYvuNL6EgL3bWvzPrRYIF/R64YbfVxIC7FeZpPSkS07sZ93/NoA==",
1477
+
"license": "Apache-2.0",
1478
+
"dependencies": {
1479
+
"@react-aria/ssr": "^3.9.7",
1480
+
"@react-aria/utils": "^3.28.1",
1481
+
"@react-stately/flags": "^3.1.0",
1482
+
"@react-types/shared": "^3.28.0",
1483
+
"@swc/helpers": "^0.5.0"
1484
+
},
1485
+
"peerDependencies": {
1486
+
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
1487
+
"react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
1488
+
}
1489
+
},
1490
+
"node_modules/@react-aria/ssr": {
1491
+
"version": "3.9.7",
1492
+
"resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.7.tgz",
1493
+
"integrity": "sha512-GQygZaGlmYjmYM+tiNBA5C6acmiDWF52Nqd40bBp0Znk4M4hP+LTmI0lpI1BuKMw45T8RIhrAsICIfKwZvi2Gg==",
1494
+
"license": "Apache-2.0",
1495
+
"dependencies": {
1496
+
"@swc/helpers": "^0.5.0"
1497
+
},
1498
+
"engines": {
1499
+
"node": ">= 12"
1500
+
},
1501
+
"peerDependencies": {
1502
+
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
1503
+
}
1504
+
},
1505
+
"node_modules/@react-aria/utils": {
1506
+
"version": "3.28.1",
1507
+
"resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.28.1.tgz",
1508
+
"integrity": "sha512-mnHFF4YOVu9BRFQ1SZSKfPhg3z+lBRYoW5mLcYTQihbKhz48+I1sqRkP7ahMITr8ANH3nb34YaMME4XWmK2Mgg==",
1509
+
"license": "Apache-2.0",
1510
+
"dependencies": {
1511
+
"@react-aria/ssr": "^3.9.7",
1512
+
"@react-stately/flags": "^3.1.0",
1513
+
"@react-stately/utils": "^3.10.5",
1514
+
"@react-types/shared": "^3.28.0",
1515
+
"@swc/helpers": "^0.5.0",
1516
+
"clsx": "^2.0.0"
1517
+
},
1518
+
"peerDependencies": {
1519
+
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
1520
+
"react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
1521
+
}
1522
+
},
1523
+
"node_modules/@react-stately/flags": {
1524
+
"version": "3.1.0",
1525
+
"resolved": "https://registry.npmjs.org/@react-stately/flags/-/flags-3.1.0.tgz",
1526
+
"integrity": "sha512-KSHOCxTFpBtxhIRcKwsD1YDTaNxFtCYuAUb0KEihc16QwqZViq4hasgPBs2gYm7fHRbw7WYzWKf6ZSo/+YsFlg==",
1527
+
"license": "Apache-2.0",
1528
+
"dependencies": {
1529
+
"@swc/helpers": "^0.5.0"
1530
+
}
1531
+
},
1532
+
"node_modules/@react-stately/utils": {
1533
+
"version": "3.10.5",
1534
+
"resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.10.5.tgz",
1535
+
"integrity": "sha512-iMQSGcpaecghDIh3mZEpZfoFH3ExBwTtuBEcvZ2XnGzCgQjeYXcMdIUwAfVQLXFTdHUHGF6Gu6/dFrYsCzySBQ==",
1536
+
"license": "Apache-2.0",
1537
+
"dependencies": {
1538
+
"@swc/helpers": "^0.5.0"
1539
+
},
1540
+
"peerDependencies": {
1541
+
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
1542
+
}
1543
+
},
1544
+
"node_modules/@react-types/shared": {
1545
+
"version": "3.28.0",
1546
+
"resolved": "https://registry.npmjs.org/@react-types/shared/-/shared-3.28.0.tgz",
1547
+
"integrity": "sha512-9oMEYIDc3sk0G5rysnYvdNrkSg7B04yTKl50HHSZVbokeHpnU0yRmsDaWb9B/5RprcKj8XszEk5guBO8Sa/Q+Q==",
1548
+
"license": "Apache-2.0",
1549
+
"peerDependencies": {
1550
+
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
1551
+
}
1552
+
},
1553
+
"node_modules/@remix-run/router": {
1554
+
"version": "1.23.0",
1555
+
"resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.0.tgz",
1556
+
"integrity": "sha512-O3rHJzAQKamUz1fvE0Qaw0xSFqsA/yafi2iqeE0pvdFtCO1viYx8QL6f3Ln/aCCTLxs68SLf0KPM9eSeM8yBnA==",
1557
+
"license": "MIT",
1558
+
"engines": {
1559
+
"node": ">=14.0.0"
1560
+
}
1561
+
},
1562
+
"node_modules/@rollup/rollup-android-arm-eabi": {
1563
+
"version": "4.52.4",
1564
+
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.4.tgz",
1565
+
"integrity": "sha512-BTm2qKNnWIQ5auf4deoetINJm2JzvihvGb9R6K/ETwKLql/Bb3Eg2H1FBp1gUb4YGbydMA3jcmQTR73q7J+GAA==",
1566
+
"cpu": [
1567
+
"arm"
1568
+
],
1569
+
"dev": true,
1570
+
"license": "MIT",
1571
+
"optional": true,
1572
+
"os": [
1573
+
"android"
1574
+
]
1575
+
},
1576
+
"node_modules/@rollup/rollup-android-arm64": {
1577
+
"version": "4.52.4",
1578
+
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.4.tgz",
1579
+
"integrity": "sha512-P9LDQiC5vpgGFgz7GSM6dKPCiqR3XYN1WwJKA4/BUVDjHpYsf3iBEmVz62uyq20NGYbiGPR5cNHI7T1HqxNs2w==",
1580
+
"cpu": [
1581
+
"arm64"
1582
+
],
1583
+
"dev": true,
1584
+
"license": "MIT",
1585
+
"optional": true,
1586
+
"os": [
1587
+
"android"
1588
+
]
1589
+
},
1590
+
"node_modules/@rollup/rollup-darwin-arm64": {
1591
+
"version": "4.52.4",
1592
+
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.4.tgz",
1593
+
"integrity": "sha512-QRWSW+bVccAvZF6cbNZBJwAehmvG9NwfWHwMy4GbWi/BQIA/laTIktebT2ipVjNncqE6GLPxOok5hsECgAxGZg==",
1594
+
"cpu": [
1595
+
"arm64"
1596
+
],
1597
+
"dev": true,
1598
+
"license": "MIT",
1599
+
"optional": true,
1600
+
"os": [
1601
+
"darwin"
1602
+
]
1603
+
},
1604
+
"node_modules/@rollup/rollup-darwin-x64": {
1605
+
"version": "4.52.4",
1606
+
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.4.tgz",
1607
+
"integrity": "sha512-hZgP05pResAkRJxL1b+7yxCnXPGsXU0fG9Yfd6dUaoGk+FhdPKCJ5L1Sumyxn8kvw8Qi5PvQ8ulenUbRjzeCTw==",
1608
+
"cpu": [
1609
+
"x64"
1610
+
],
1611
+
"dev": true,
1612
+
"license": "MIT",
1613
+
"optional": true,
1614
+
"os": [
1615
+
"darwin"
1616
+
]
1617
+
},
1618
+
"node_modules/@rollup/rollup-freebsd-arm64": {
1619
+
"version": "4.52.4",
1620
+
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.4.tgz",
1621
+
"integrity": "sha512-xmc30VshuBNUd58Xk4TKAEcRZHaXlV+tCxIXELiE9sQuK3kG8ZFgSPi57UBJt8/ogfhAF5Oz4ZSUBN77weM+mQ==",
1622
+
"cpu": [
1623
+
"arm64"
1624
+
],
1625
+
"dev": true,
1626
+
"license": "MIT",
1627
+
"optional": true,
1628
+
"os": [
1629
+
"freebsd"
1630
+
]
1631
+
},
1632
+
"node_modules/@rollup/rollup-freebsd-x64": {
1633
+
"version": "4.52.4",
1634
+
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.4.tgz",
1635
+
"integrity": "sha512-WdSLpZFjOEqNZGmHflxyifolwAiZmDQzuOzIq9L27ButpCVpD7KzTRtEG1I0wMPFyiyUdOO+4t8GvrnBLQSwpw==",
1636
+
"cpu": [
1637
+
"x64"
1638
+
],
1639
+
"dev": true,
1640
+
"license": "MIT",
1641
+
"optional": true,
1642
+
"os": [
1643
+
"freebsd"
1644
+
]
1645
+
},
1646
+
"node_modules/@rollup/rollup-linux-arm-gnueabihf": {
1647
+
"version": "4.52.4",
1648
+
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.4.tgz",
1649
+
"integrity": "sha512-xRiOu9Of1FZ4SxVbB0iEDXc4ddIcjCv2aj03dmW8UrZIW7aIQ9jVJdLBIhxBI+MaTnGAKyvMwPwQnoOEvP7FgQ==",
1650
+
"cpu": [
1651
+
"arm"
1652
+
],
1653
+
"dev": true,
1654
+
"license": "MIT",
1655
+
"optional": true,
1656
+
"os": [
1657
+
"linux"
1658
+
]
1659
+
},
1660
+
"node_modules/@rollup/rollup-linux-arm-musleabihf": {
1661
+
"version": "4.52.4",
1662
+
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.4.tgz",
1663
+
"integrity": "sha512-FbhM2p9TJAmEIEhIgzR4soUcsW49e9veAQCziwbR+XWB2zqJ12b4i/+hel9yLiD8pLncDH4fKIPIbt5238341Q==",
1664
+
"cpu": [
1665
+
"arm"
1666
+
],
1667
+
"dev": true,
1668
+
"license": "MIT",
1669
+
"optional": true,
1670
+
"os": [
1671
+
"linux"
1672
+
]
1673
+
},
1674
+
"node_modules/@rollup/rollup-linux-arm64-gnu": {
1675
+
"version": "4.52.4",
1676
+
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.4.tgz",
1677
+
"integrity": "sha512-4n4gVwhPHR9q/g8lKCyz0yuaD0MvDf7dV4f9tHt0C73Mp8h38UCtSCSE6R9iBlTbXlmA8CjpsZoujhszefqueg==",
1678
+
"cpu": [
1679
+
"arm64"
1680
+
],
1681
+
"dev": true,
1682
+
"license": "MIT",
1683
+
"optional": true,
1684
+
"os": [
1685
+
"linux"
1686
+
]
1687
+
},
1688
+
"node_modules/@rollup/rollup-linux-arm64-musl": {
1689
+
"version": "4.52.4",
1690
+
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.4.tgz",
1691
+
"integrity": "sha512-u0n17nGA0nvi/11gcZKsjkLj1QIpAuPFQbR48Subo7SmZJnGxDpspyw2kbpuoQnyK+9pwf3pAoEXerJs/8Mi9g==",
1692
+
"cpu": [
1693
+
"arm64"
1694
+
],
1695
+
"dev": true,
1696
+
"license": "MIT",
1697
+
"optional": true,
1698
+
"os": [
1699
+
"linux"
1700
+
]
1701
+
},
1702
+
"node_modules/@rollup/rollup-linux-loong64-gnu": {
1703
+
"version": "4.52.4",
1704
+
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.4.tgz",
1705
+
"integrity": "sha512-0G2c2lpYtbTuXo8KEJkDkClE/+/2AFPdPAbmaHoE870foRFs4pBrDehilMcrSScrN/fB/1HTaWO4bqw+ewBzMQ==",
1706
+
"cpu": [
1707
+
"loong64"
1708
+
],
1709
+
"dev": true,
1710
+
"license": "MIT",
1711
+
"optional": true,
1712
+
"os": [
1713
+
"linux"
1714
+
]
1715
+
},
1716
+
"node_modules/@rollup/rollup-linux-ppc64-gnu": {
1717
+
"version": "4.52.4",
1718
+
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.4.tgz",
1719
+
"integrity": "sha512-teSACug1GyZHmPDv14VNbvZFX779UqWTsd7KtTM9JIZRDI5NUwYSIS30kzI8m06gOPB//jtpqlhmraQ68b5X2g==",
1720
+
"cpu": [
1721
+
"ppc64"
1722
+
],
1723
+
"dev": true,
1724
+
"license": "MIT",
1725
+
"optional": true,
1726
+
"os": [
1727
+
"linux"
1728
+
]
1729
+
},
1730
+
"node_modules/@rollup/rollup-linux-riscv64-gnu": {
1731
+
"version": "4.52.4",
1732
+
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.4.tgz",
1733
+
"integrity": "sha512-/MOEW3aHjjs1p4Pw1Xk4+3egRevx8Ji9N6HUIA1Ifh8Q+cg9dremvFCUbOX2Zebz80BwJIgCBUemjqhU5XI5Eg==",
1734
+
"cpu": [
1735
+
"riscv64"
1736
+
],
1737
+
"dev": true,
1738
+
"license": "MIT",
1739
+
"optional": true,
1740
+
"os": [
1741
+
"linux"
1742
+
]
1743
+
},
1744
+
"node_modules/@rollup/rollup-linux-riscv64-musl": {
1745
+
"version": "4.52.4",
1746
+
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.4.tgz",
1747
+
"integrity": "sha512-1HHmsRyh845QDpEWzOFtMCph5Ts+9+yllCrREuBR/vg2RogAQGGBRC8lDPrPOMnrdOJ+mt1WLMOC2Kao/UwcvA==",
1748
+
"cpu": [
1749
+
"riscv64"
1750
+
],
1751
+
"dev": true,
1752
+
"license": "MIT",
1753
+
"optional": true,
1754
+
"os": [
1755
+
"linux"
1756
+
]
1757
+
},
1758
+
"node_modules/@rollup/rollup-linux-s390x-gnu": {
1759
+
"version": "4.52.4",
1760
+
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.4.tgz",
1761
+
"integrity": "sha512-seoeZp4L/6D1MUyjWkOMRU6/iLmCU2EjbMTyAG4oIOs1/I82Y5lTeaxW0KBfkUdHAWN7j25bpkt0rjnOgAcQcA==",
1762
+
"cpu": [
1763
+
"s390x"
1764
+
],
1765
+
"dev": true,
1766
+
"license": "MIT",
1767
+
"optional": true,
1768
+
"os": [
1769
+
"linux"
1770
+
]
1771
+
},
1772
+
"node_modules/@rollup/rollup-linux-x64-gnu": {
1773
+
"version": "4.52.4",
1774
+
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.4.tgz",
1775
+
"integrity": "sha512-Wi6AXf0k0L7E2gteNsNHUs7UMwCIhsCTs6+tqQ5GPwVRWMaflqGec4Sd8n6+FNFDw9vGcReqk2KzBDhCa1DLYg==",
1776
+
"cpu": [
1777
+
"x64"
1778
+
],
1779
+
"dev": true,
1780
+
"license": "MIT",
1781
+
"optional": true,
1782
+
"os": [
1783
+
"linux"
1784
+
]
1785
+
},
1786
+
"node_modules/@rollup/rollup-linux-x64-musl": {
1787
+
"version": "4.52.4",
1788
+
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.4.tgz",
1789
+
"integrity": "sha512-dtBZYjDmCQ9hW+WgEkaffvRRCKm767wWhxsFW3Lw86VXz/uJRuD438/XvbZT//B96Vs8oTA8Q4A0AfHbrxP9zw==",
1790
+
"cpu": [
1791
+
"x64"
1792
+
],
1793
+
"dev": true,
1794
+
"license": "MIT",
1795
+
"optional": true,
1796
+
"os": [
1797
+
"linux"
1798
+
]
1799
+
},
1800
+
"node_modules/@rollup/rollup-openharmony-arm64": {
1801
+
"version": "4.52.4",
1802
+
"resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.4.tgz",
1803
+
"integrity": "sha512-1ox+GqgRWqaB1RnyZXL8PD6E5f7YyRUJYnCqKpNzxzP0TkaUh112NDrR9Tt+C8rJ4x5G9Mk8PQR3o7Ku2RKqKA==",
1804
+
"cpu": [
1805
+
"arm64"
1806
+
],
1807
+
"dev": true,
1808
+
"license": "MIT",
1809
+
"optional": true,
1810
+
"os": [
1811
+
"openharmony"
1812
+
]
1813
+
},
1814
+
"node_modules/@rollup/rollup-win32-arm64-msvc": {
1815
+
"version": "4.52.4",
1816
+
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.4.tgz",
1817
+
"integrity": "sha512-8GKr640PdFNXwzIE0IrkMWUNUomILLkfeHjXBi/nUvFlpZP+FA8BKGKpacjW6OUUHaNI6sUURxR2U2g78FOHWQ==",
1818
+
"cpu": [
1819
+
"arm64"
1820
+
],
1821
+
"dev": true,
1822
+
"license": "MIT",
1823
+
"optional": true,
1824
+
"os": [
1825
+
"win32"
1826
+
]
1827
+
},
1828
+
"node_modules/@rollup/rollup-win32-ia32-msvc": {
1829
+
"version": "4.52.4",
1830
+
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.4.tgz",
1831
+
"integrity": "sha512-AIy/jdJ7WtJ/F6EcfOb2GjR9UweO0n43jNObQMb6oGxkYTfLcnN7vYYpG+CN3lLxrQkzWnMOoNSHTW54pgbVxw==",
1832
+
"cpu": [
1833
+
"ia32"
1834
+
],
1835
+
"dev": true,
1836
+
"license": "MIT",
1837
+
"optional": true,
1838
+
"os": [
1839
+
"win32"
1840
+
]
1841
+
},
1842
+
"node_modules/@rollup/rollup-win32-x64-gnu": {
1843
+
"version": "4.52.4",
1844
+
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.4.tgz",
1845
+
"integrity": "sha512-UF9KfsH9yEam0UjTwAgdK0anlQ7c8/pWPU2yVjyWcF1I1thABt6WXE47cI71pGiZ8wGvxohBoLnxM04L/wj8mQ==",
1846
+
"cpu": [
1847
+
"x64"
1848
+
],
1849
+
"dev": true,
1850
+
"license": "MIT",
1851
+
"optional": true,
1852
+
"os": [
1853
+
"win32"
1854
+
]
1855
+
},
1856
+
"node_modules/@rollup/rollup-win32-x64-msvc": {
1857
+
"version": "4.52.4",
1858
+
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.4.tgz",
1859
+
"integrity": "sha512-bf9PtUa0u8IXDVxzRToFQKsNCRz9qLYfR/MpECxl4mRoWYjAeFjgxj1XdZr2M/GNVpT05p+LgQOHopYDlUu6/w==",
1860
+
"cpu": [
1861
+
"x64"
1862
+
],
1863
+
"dev": true,
1864
+
"license": "MIT",
1865
+
"optional": true,
1866
+
"os": [
1867
+
"win32"
1868
+
]
1869
+
},
1870
+
"node_modules/@shufo/prettier-plugin-blade": {
1871
+
"version": "1.15.3",
1872
+
"resolved": "https://registry.npmjs.org/@shufo/prettier-plugin-blade/-/prettier-plugin-blade-1.15.3.tgz",
1873
+
"integrity": "sha512-c9lGQwWGbaRHkzTQGf/EesrJzQAC/bn11XG6I8Ce9yv58gRaW/l3I+/bhO+cNh7YpaYZcPBgY4QhtAZZyTo/mA==",
1874
+
"dev": true,
1875
+
"license": "MIT",
1876
+
"dependencies": {
1877
+
"blade-formatter": "1.42.2",
1878
+
"prettier": "3.4.2"
1879
+
},
1880
+
"engines": {
1881
+
"node": ">= 14.0.0"
1882
+
}
1883
+
},
1884
+
"node_modules/@shufo/prettier-plugin-blade/node_modules/prettier": {
1885
+
"version": "3.4.2",
1886
+
"resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz",
1887
+
"integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==",
1888
+
"dev": true,
1889
+
"license": "MIT",
1890
+
"bin": {
1891
+
"prettier": "bin/prettier.cjs"
1892
+
},
1893
+
"engines": {
1894
+
"node": ">=14"
1895
+
},
1896
+
"funding": {
1897
+
"url": "https://github.com/prettier/prettier?sponsor=1"
1898
+
}
1899
+
},
1900
+
"node_modules/@shufo/tailwindcss-class-sorter": {
1901
+
"version": "3.0.1",
1902
+
"resolved": "https://registry.npmjs.org/@shufo/tailwindcss-class-sorter/-/tailwindcss-class-sorter-3.0.1.tgz",
1903
+
"integrity": "sha512-y9SMobvwElX2G6vdg4odJ6UL6hu/o5RlMsdwEeDLGaqHU3BLSw9CeitGgBus6kadjjDdT2wseG0Tl5yXWdc4UQ==",
1904
+
"dev": true,
1905
+
"license": "MIT",
1906
+
"dependencies": {
1907
+
"escalade": "^3.1.1",
1908
+
"object-hash": "^3.0.0",
1909
+
"tailwindcss": "^3.3.2"
1910
+
},
1911
+
"engines": {
1912
+
"node": ">= 14.0.0"
1913
+
}
1914
+
},
1915
+
"node_modules/@swc/helpers": {
1916
+
"version": "0.5.15",
1917
+
"resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz",
1918
+
"integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==",
1919
+
"license": "Apache-2.0",
1920
+
"dependencies": {
1921
+
"tslib": "^2.8.0"
1922
+
}
1923
+
},
1924
+
"node_modules/@tailwindcss/typography": {
1925
+
"version": "0.5.16",
1926
+
"resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.16.tgz",
1927
+
"integrity": "sha512-0wDLwCVF5V3x3b1SGXPCDcdsbDHMBe+lkFzBRaHeLvNi+nrrnZ1lA18u+OTWO8iSWU2GxUOCvlXtDuqftc1oiA==",
1928
+
"dev": true,
1929
+
"license": "MIT",
1930
+
"dependencies": {
1931
+
"lodash.castarray": "^4.4.0",
1932
+
"lodash.isplainobject": "^4.0.6",
1933
+
"lodash.merge": "^4.6.2",
1934
+
"postcss-selector-parser": "6.0.10"
1935
+
},
1936
+
"peerDependencies": {
1937
+
"tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1"
1938
+
}
1939
+
},
1940
+
"node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser": {
1941
+
"version": "6.0.10",
1942
+
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz",
1943
+
"integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==",
1944
+
"dev": true,
1945
+
"license": "MIT",
1946
+
"dependencies": {
1947
+
"cssesc": "^3.0.0",
1948
+
"util-deprecate": "^1.0.2"
1949
+
},
1950
+
"engines": {
1951
+
"node": ">=4"
1952
+
}
1953
+
},
1954
+
"node_modules/@tanstack/react-virtual": {
1955
+
"version": "3.13.6",
1956
+
"resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.13.6.tgz",
1957
+
"integrity": "sha512-WT7nWs8ximoQ0CDx/ngoFP7HbQF9Q2wQe4nh2NB+u2486eX3nZRE40P9g6ccCVq7ZfTSH5gFOuCoVH5DLNS/aA==",
1958
+
"license": "MIT",
1959
+
"dependencies": {
1960
+
"@tanstack/virtual-core": "3.13.6"
1961
+
},
1962
+
"funding": {
1963
+
"type": "github",
1964
+
"url": "https://github.com/sponsors/tannerlinsley"
1965
+
},
1966
+
"peerDependencies": {
1967
+
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
1968
+
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
1969
+
}
1970
+
},
1971
+
"node_modules/@tanstack/virtual-core": {
1972
+
"version": "3.13.6",
1973
+
"resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.13.6.tgz",
1974
+
"integrity": "sha512-cnQUeWnhNP8tJ4WsGcYiX24Gjkc9ALstLbHcBj1t3E7EimN6n6kHH+DPV4PpDnuw00NApQp+ViojMj1GRdwYQg==",
1975
+
"license": "MIT",
1976
+
"funding": {
1977
+
"type": "github",
1978
+
"url": "https://github.com/sponsors/tannerlinsley"
1979
+
}
1980
+
},
1981
+
"node_modules/@types/babel__core": {
1982
+
"version": "7.20.5",
1983
+
"resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
1984
+
"integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
1985
+
"dev": true,
1986
+
"license": "MIT",
1987
+
"dependencies": {
1988
+
"@babel/parser": "^7.20.7",
1989
+
"@babel/types": "^7.20.7",
1990
+
"@types/babel__generator": "*",
1991
+
"@types/babel__template": "*",
1992
+
"@types/babel__traverse": "*"
1993
+
}
1994
+
},
1995
+
"node_modules/@types/babel__generator": {
1996
+
"version": "7.27.0",
1997
+
"resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz",
1998
+
"integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==",
1999
+
"dev": true,
2000
+
"license": "MIT",
2001
+
"dependencies": {
2002
+
"@babel/types": "^7.0.0"
2003
+
}
2004
+
},
2005
+
"node_modules/@types/babel__template": {
2006
+
"version": "7.4.4",
2007
+
"resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
2008
+
"integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
2009
+
"dev": true,
2010
+
"license": "MIT",
2011
+
"dependencies": {
2012
+
"@babel/parser": "^7.1.0",
2013
+
"@babel/types": "^7.0.0"
2014
+
}
2015
+
},
2016
+
"node_modules/@types/babel__traverse": {
2017
+
"version": "7.20.7",
2018
+
"resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz",
2019
+
"integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==",
2020
+
"dev": true,
2021
+
"license": "MIT",
2022
+
"dependencies": {
2023
+
"@babel/types": "^7.20.7"
2024
+
}
2025
+
},
2026
+
"node_modules/@types/debug": {
2027
+
"version": "4.1.12",
2028
+
"resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz",
2029
+
"integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==",
2030
+
"dev": true,
2031
+
"license": "MIT",
2032
+
"dependencies": {
2033
+
"@types/ms": "*"
2034
+
}
2035
+
},
2036
+
"node_modules/@types/estree": {
2037
+
"version": "1.0.8",
2038
+
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
2039
+
"integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
2040
+
"dev": true,
2041
+
"license": "MIT"
2042
+
},
2043
+
"node_modules/@types/history": {
2044
+
"version": "4.7.11",
2045
+
"resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz",
2046
+
"integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==",
2047
+
"dev": true,
2048
+
"license": "MIT"
2049
+
},
2050
+
"node_modules/@types/json-schema": {
2051
+
"version": "7.0.15",
2052
+
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
2053
+
"integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
2054
+
"dev": true,
2055
+
"license": "MIT"
2056
+
},
2057
+
"node_modules/@types/luxon": {
2058
+
"version": "3.6.2",
2059
+
"resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.6.2.tgz",
2060
+
"integrity": "sha512-R/BdP7OxEMc44l2Ex5lSXHoIXTB2JLNa3y2QISIbr58U/YcsffyQrYW//hZSdrfxrjRZj3GcUoxMPGdO8gSYuw==",
2061
+
"dev": true,
2062
+
"license": "MIT"
2063
+
},
2064
+
"node_modules/@types/mdast": {
2065
+
"version": "4.0.4",
2066
+
"resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
2067
+
"integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
2068
+
"dev": true,
2069
+
"license": "MIT",
2070
+
"dependencies": {
2071
+
"@types/unist": "*"
2072
+
}
2073
+
},
2074
+
"node_modules/@types/ms": {
2075
+
"version": "2.1.0",
2076
+
"resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz",
2077
+
"integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==",
2078
+
"dev": true,
2079
+
"license": "MIT"
2080
+
},
2081
+
"node_modules/@types/next": {
2082
+
"version": "8.0.7",
2083
+
"resolved": "https://registry.npmjs.org/@types/next/-/next-8.0.7.tgz",
2084
+
"integrity": "sha512-I/Gcj1YfOFmpBBX5XgBP1t1wKcFS0TGk8ytW99ujjvCp8U31QuKqM3fvvGb7+Hf1CJt3BAAgzGT0aCigqO5opQ==",
2085
+
"dev": true,
2086
+
"license": "MIT",
2087
+
"dependencies": {
2088
+
"@types/next-server": "*",
2089
+
"@types/node": "*",
2090
+
"@types/node-fetch": "*",
2091
+
"@types/react": "*"
2092
+
}
2093
+
},
2094
+
"node_modules/@types/next-server": {
2095
+
"version": "8.1.2",
2096
+
"resolved": "https://registry.npmjs.org/@types/next-server/-/next-server-8.1.2.tgz",
2097
+
"integrity": "sha512-Fm4QhAxwDlC9AHiGy23Lhv7DeTTt1O1s7tnAsyVOLPjePmYXPZVbOCrxd2oRHZnIIYWw41JelLbq4hN1B5idlQ==",
2098
+
"dev": true,
2099
+
"license": "MIT",
2100
+
"dependencies": {
2101
+
"@types/next": "*",
2102
+
"@types/node": "*",
2103
+
"@types/react": "*",
2104
+
"@types/react-loadable": "*"
2105
+
}
2106
+
},
2107
+
"node_modules/@types/node": {
2108
+
"version": "22.14.0",
2109
+
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.14.0.tgz",
2110
+
"integrity": "sha512-Kmpl+z84ILoG+3T/zQFyAJsU6EPTmOCj8/2+83fSN6djd6I4o7uOuGIH6vq3PrjY5BGitSbFuMN18j3iknubbA==",
2111
+
"dev": true,
2112
+
"license": "MIT",
2113
+
"dependencies": {
2114
+
"undici-types": "~6.21.0"
2115
+
}
2116
+
},
2117
+
"node_modules/@types/node-fetch": {
2118
+
"version": "2.6.13",
2119
+
"resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.13.tgz",
2120
+
"integrity": "sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==",
2121
+
"dev": true,
2122
+
"license": "MIT",
2123
+
"dependencies": {
2124
+
"@types/node": "*",
2125
+
"form-data": "^4.0.4"
2126
+
}
2127
+
},
2128
+
"node_modules/@types/prop-types": {
2129
+
"version": "15.7.14",
2130
+
"resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz",
2131
+
"integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==",
2132
+
"license": "MIT"
2133
+
},
2134
+
"node_modules/@types/react": {
2135
+
"version": "18.3.20",
2136
+
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.20.tgz",
2137
+
"integrity": "sha512-IPaCZN7PShZK/3t6Q87pfTkRm6oLTd4vztyoj+cbHUF1g3FfVb2tFIL79uCRKEfv16AhqDMBywP2VW3KIZUvcg==",
2138
+
"license": "MIT",
2139
+
"dependencies": {
2140
+
"@types/prop-types": "*",
2141
+
"csstype": "^3.0.2"
2142
+
}
2143
+
},
2144
+
"node_modules/@types/react-dom": {
2145
+
"version": "18.3.6",
2146
+
"resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.6.tgz",
2147
+
"integrity": "sha512-nf22//wEbKXusP6E9pfOCDwFdHAX4u172eaJI4YkDRQEZiorm6KfYnSC2SWLDMVWUOWPERmJnN0ujeAfTBLvrw==",
2148
+
"dev": true,
2149
+
"license": "MIT",
2150
+
"peerDependencies": {
2151
+
"@types/react": "^18.0.0"
2152
+
}
2153
+
},
2154
+
"node_modules/@types/react-helmet": {
2155
+
"version": "6.1.11",
2156
+
"resolved": "https://registry.npmjs.org/@types/react-helmet/-/react-helmet-6.1.11.tgz",
2157
+
"integrity": "sha512-0QcdGLddTERotCXo3VFlUSWO3ztraw8nZ6e3zJSgG7apwV5xt+pJUS8ewPBqT4NYB1optGLprNQzFleIY84u/g==",
2158
+
"license": "MIT",
2159
+
"dependencies": {
2160
+
"@types/react": "*"
2161
+
}
2162
+
},
2163
+
"node_modules/@types/react-helmet-async": {
2164
+
"version": "1.0.1",
2165
+
"resolved": "https://registry.npmjs.org/@types/react-helmet-async/-/react-helmet-async-1.0.1.tgz",
2166
+
"integrity": "sha512-ZtCdcSmNmtU/dlV2kJ3sVS52i9hMSo/w9iMYBmjdx4aHzNSIUSOZycFslyDRNbt0efwk3V56Bw51+vaYQ7zuXA==",
2167
+
"license": "MIT",
2168
+
"dependencies": {
2169
+
"@types/react": "*",
2170
+
"@types/react-helmet": "*"
2171
+
}
2172
+
},
2173
+
"node_modules/@types/react-loadable": {
2174
+
"version": "5.5.11",
2175
+
"resolved": "https://registry.npmjs.org/@types/react-loadable/-/react-loadable-5.5.11.tgz",
2176
+
"integrity": "sha512-/tq2IJ853MoIFRBmqVOxnGsRRjER5TmEKzsZtaAkiXAWoDeKgR/QNOT1vd9k0p9h/F616X21cpNh3hu4RutzRQ==",
2177
+
"dev": true,
2178
+
"license": "MIT",
2179
+
"dependencies": {
2180
+
"@types/react": "*",
2181
+
"@types/webpack": "^4"
2182
+
}
2183
+
},
2184
+
"node_modules/@types/react-router": {
2185
+
"version": "5.1.20",
2186
+
"resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz",
2187
+
"integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==",
2188
+
"dev": true,
2189
+
"license": "MIT",
2190
+
"dependencies": {
2191
+
"@types/history": "^4.7.11",
2192
+
"@types/react": "*"
2193
+
}
2194
+
},
2195
+
"node_modules/@types/react-router-dom": {
2196
+
"version": "5.3.3",
2197
+
"resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz",
2198
+
"integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==",
2199
+
"dev": true,
2200
+
"license": "MIT",
2201
+
"dependencies": {
2202
+
"@types/history": "^4.7.11",
2203
+
"@types/react": "*",
2204
+
"@types/react-router": "*"
2205
+
}
2206
+
},
2207
+
"node_modules/@types/source-list-map": {
2208
+
"version": "0.1.6",
2209
+
"resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.6.tgz",
2210
+
"integrity": "sha512-5JcVt1u5HDmlXkwOD2nslZVllBBc7HDuOICfiZah2Z0is8M8g+ddAEawbmd3VjedfDHBzxCaXLs07QEmb7y54g==",
2211
+
"dev": true,
2212
+
"license": "MIT"
2213
+
},
2214
+
"node_modules/@types/tapable": {
2215
+
"version": "1.0.12",
2216
+
"resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.12.tgz",
2217
+
"integrity": "sha512-bTHG8fcxEqv1M9+TD14P8ok8hjxoOCkfKc8XXLaaD05kI7ohpeI956jtDOD3XHKBQrlyPughUtzm1jtVhHpA5Q==",
2218
+
"dev": true,
2219
+
"license": "MIT"
2220
+
},
2221
+
"node_modules/@types/uglify-js": {
2222
+
"version": "3.17.5",
2223
+
"resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.17.5.tgz",
2224
+
"integrity": "sha512-TU+fZFBTBcXj/GpDpDaBmgWk/gn96kMZ+uocaFUlV2f8a6WdMzzI44QBCmGcCiYR0Y6ZlNRiyUyKKt5nl/lbzQ==",
2225
+
"dev": true,
2226
+
"license": "MIT",
2227
+
"dependencies": {
2228
+
"source-map": "^0.6.1"
2229
+
}
2230
+
},
2231
+
"node_modules/@types/unist": {
2232
+
"version": "3.0.3",
2233
+
"resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
2234
+
"integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
2235
+
"dev": true,
2236
+
"license": "MIT"
2237
+
},
2238
+
"node_modules/@types/webpack": {
2239
+
"version": "4.41.40",
2240
+
"resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.40.tgz",
2241
+
"integrity": "sha512-u6kMFSBM9HcoTpUXnL6mt2HSzftqb3JgYV6oxIgL2dl6sX6aCa5k6SOkzv5DuZjBTPUE/dJltKtwwuqrkZHpfw==",
2242
+
"dev": true,
2243
+
"license": "MIT",
2244
+
"dependencies": {
2245
+
"@types/node": "*",
2246
+
"@types/tapable": "^1",
2247
+
"@types/uglify-js": "*",
2248
+
"@types/webpack-sources": "*",
2249
+
"anymatch": "^3.0.0",
2250
+
"source-map": "^0.6.0"
2251
+
}
2252
+
},
2253
+
"node_modules/@types/webpack-sources": {
2254
+
"version": "3.2.3",
2255
+
"resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-3.2.3.tgz",
2256
+
"integrity": "sha512-4nZOdMwSPHZ4pTEZzSp0AsTM4K7Qmu40UKW4tJDiOVs20UzYF9l+qUe4s0ftfN0pin06n+5cWWDJXH+sbhAiDw==",
2257
+
"dev": true,
2258
+
"license": "MIT",
2259
+
"dependencies": {
2260
+
"@types/node": "*",
2261
+
"@types/source-list-map": "*",
2262
+
"source-map": "^0.7.3"
2263
+
}
2264
+
},
2265
+
"node_modules/@types/webpack-sources/node_modules/source-map": {
2266
+
"version": "0.7.6",
2267
+
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz",
2268
+
"integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==",
2269
+
"dev": true,
2270
+
"license": "BSD-3-Clause",
2271
+
"engines": {
2272
+
"node": ">= 12"
2273
+
}
2274
+
},
2275
+
"node_modules/@typescript-eslint/eslint-plugin": {
2276
+
"version": "8.29.0",
2277
+
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.29.0.tgz",
2278
+
"integrity": "sha512-PAIpk/U7NIS6H7TEtN45SPGLQaHNgB7wSjsQV/8+KYokAb2T/gloOA/Bee2yd4/yKVhPKe5LlaUGhAZk5zmSaQ==",
2279
+
"dev": true,
2280
+
"license": "MIT",
2281
+
"dependencies": {
2282
+
"@eslint-community/regexpp": "^4.10.0",
2283
+
"@typescript-eslint/scope-manager": "8.29.0",
2284
+
"@typescript-eslint/type-utils": "8.29.0",
2285
+
"@typescript-eslint/utils": "8.29.0",
2286
+
"@typescript-eslint/visitor-keys": "8.29.0",
2287
+
"graphemer": "^1.4.0",
2288
+
"ignore": "^5.3.1",
2289
+
"natural-compare": "^1.4.0",
2290
+
"ts-api-utils": "^2.0.1"
2291
+
},
2292
+
"engines": {
2293
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
2294
+
},
2295
+
"funding": {
2296
+
"type": "opencollective",
2297
+
"url": "https://opencollective.com/typescript-eslint"
2298
+
},
2299
+
"peerDependencies": {
2300
+
"@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0",
2301
+
"eslint": "^8.57.0 || ^9.0.0",
2302
+
"typescript": ">=4.8.4 <5.9.0"
2303
+
}
2304
+
},
2305
+
"node_modules/@typescript-eslint/parser": {
2306
+
"version": "8.29.0",
2307
+
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.29.0.tgz",
2308
+
"integrity": "sha512-8C0+jlNJOwQso2GapCVWWfW/rzaq7Lbme+vGUFKE31djwNncIpgXD7Cd4weEsDdkoZDjH0lwwr3QDQFuyrMg9g==",
2309
+
"dev": true,
2310
+
"license": "MIT",
2311
+
"dependencies": {
2312
+
"@typescript-eslint/scope-manager": "8.29.0",
2313
+
"@typescript-eslint/types": "8.29.0",
2314
+
"@typescript-eslint/typescript-estree": "8.29.0",
2315
+
"@typescript-eslint/visitor-keys": "8.29.0",
2316
+
"debug": "^4.3.4"
2317
+
},
2318
+
"engines": {
2319
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
2320
+
},
2321
+
"funding": {
2322
+
"type": "opencollective",
2323
+
"url": "https://opencollective.com/typescript-eslint"
2324
+
},
2325
+
"peerDependencies": {
2326
+
"eslint": "^8.57.0 || ^9.0.0",
2327
+
"typescript": ">=4.8.4 <5.9.0"
2328
+
}
2329
+
},
2330
+
"node_modules/@typescript-eslint/scope-manager": {
2331
+
"version": "8.29.0",
2332
+
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.29.0.tgz",
2333
+
"integrity": "sha512-aO1PVsq7Gm+tcghabUpzEnVSFMCU4/nYIgC2GOatJcllvWfnhrgW0ZEbnTxm36QsikmCN1K/6ZgM7fok2I7xNw==",
2334
+
"dev": true,
2335
+
"license": "MIT",
2336
+
"dependencies": {
2337
+
"@typescript-eslint/types": "8.29.0",
2338
+
"@typescript-eslint/visitor-keys": "8.29.0"
2339
+
},
2340
+
"engines": {
2341
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
2342
+
},
2343
+
"funding": {
2344
+
"type": "opencollective",
2345
+
"url": "https://opencollective.com/typescript-eslint"
2346
+
}
2347
+
},
2348
+
"node_modules/@typescript-eslint/type-utils": {
2349
+
"version": "8.29.0",
2350
+
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.29.0.tgz",
2351
+
"integrity": "sha512-ahaWQ42JAOx+NKEf5++WC/ua17q5l+j1GFrbbpVKzFL/tKVc0aYY8rVSYUpUvt2hUP1YBr7mwXzx+E/DfUWI9Q==",
2352
+
"dev": true,
2353
+
"license": "MIT",
2354
+
"dependencies": {
2355
+
"@typescript-eslint/typescript-estree": "8.29.0",
2356
+
"@typescript-eslint/utils": "8.29.0",
2357
+
"debug": "^4.3.4",
2358
+
"ts-api-utils": "^2.0.1"
2359
+
},
2360
+
"engines": {
2361
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
2362
+
},
2363
+
"funding": {
2364
+
"type": "opencollective",
2365
+
"url": "https://opencollective.com/typescript-eslint"
2366
+
},
2367
+
"peerDependencies": {
2368
+
"eslint": "^8.57.0 || ^9.0.0",
2369
+
"typescript": ">=4.8.4 <5.9.0"
2370
+
}
2371
+
},
2372
+
"node_modules/@typescript-eslint/types": {
2373
+
"version": "8.29.0",
2374
+
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.29.0.tgz",
2375
+
"integrity": "sha512-wcJL/+cOXV+RE3gjCyl/V2G877+2faqvlgtso/ZRbTCnZazh0gXhe+7gbAnfubzN2bNsBtZjDvlh7ero8uIbzg==",
2376
+
"dev": true,
2377
+
"license": "MIT",
2378
+
"engines": {
2379
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
2380
+
},
2381
+
"funding": {
2382
+
"type": "opencollective",
2383
+
"url": "https://opencollective.com/typescript-eslint"
2384
+
}
2385
+
},
2386
+
"node_modules/@typescript-eslint/typescript-estree": {
2387
+
"version": "8.29.0",
2388
+
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.29.0.tgz",
2389
+
"integrity": "sha512-yOfen3jE9ISZR/hHpU/bmNvTtBW1NjRbkSFdZOksL1N+ybPEE7UVGMwqvS6CP022Rp00Sb0tdiIkhSCe6NI8ow==",
2390
+
"dev": true,
2391
+
"license": "MIT",
2392
+
"dependencies": {
2393
+
"@typescript-eslint/types": "8.29.0",
2394
+
"@typescript-eslint/visitor-keys": "8.29.0",
2395
+
"debug": "^4.3.4",
2396
+
"fast-glob": "^3.3.2",
2397
+
"is-glob": "^4.0.3",
2398
+
"minimatch": "^9.0.4",
2399
+
"semver": "^7.6.0",
2400
+
"ts-api-utils": "^2.0.1"
2401
+
},
2402
+
"engines": {
2403
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
2404
+
},
2405
+
"funding": {
2406
+
"type": "opencollective",
2407
+
"url": "https://opencollective.com/typescript-eslint"
2408
+
},
2409
+
"peerDependencies": {
2410
+
"typescript": ">=4.8.4 <5.9.0"
2411
+
}
2412
+
},
2413
+
"node_modules/@typescript-eslint/utils": {
2414
+
"version": "8.29.0",
2415
+
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.29.0.tgz",
2416
+
"integrity": "sha512-gX/A0Mz9Bskm8avSWFcK0gP7cZpbY4AIo6B0hWYFCaIsz750oaiWR4Jr2CI+PQhfW1CpcQr9OlfPS+kMFegjXA==",
2417
+
"dev": true,
2418
+
"license": "MIT",
2419
+
"dependencies": {
2420
+
"@eslint-community/eslint-utils": "^4.4.0",
2421
+
"@typescript-eslint/scope-manager": "8.29.0",
2422
+
"@typescript-eslint/types": "8.29.0",
2423
+
"@typescript-eslint/typescript-estree": "8.29.0"
2424
+
},
2425
+
"engines": {
2426
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
2427
+
},
2428
+
"funding": {
2429
+
"type": "opencollective",
2430
+
"url": "https://opencollective.com/typescript-eslint"
2431
+
},
2432
+
"peerDependencies": {
2433
+
"eslint": "^8.57.0 || ^9.0.0",
2434
+
"typescript": ">=4.8.4 <5.9.0"
2435
+
}
2436
+
},
2437
+
"node_modules/@typescript-eslint/visitor-keys": {
2438
+
"version": "8.29.0",
2439
+
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.29.0.tgz",
2440
+
"integrity": "sha512-Sne/pVz8ryR03NFK21VpN88dZ2FdQXOlq3VIklbrTYEt8yXtRFr9tvUhqvCeKjqYk5FSim37sHbooT6vzBTZcg==",
2441
+
"dev": true,
2442
+
"license": "MIT",
2443
+
"dependencies": {
2444
+
"@typescript-eslint/types": "8.29.0",
2445
+
"eslint-visitor-keys": "^4.2.0"
2446
+
},
2447
+
"engines": {
2448
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
2449
+
},
2450
+
"funding": {
2451
+
"type": "opencollective",
2452
+
"url": "https://opencollective.com/typescript-eslint"
2453
+
}
2454
+
},
2455
+
"node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": {
2456
+
"version": "4.2.0",
2457
+
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz",
2458
+
"integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==",
2459
+
"dev": true,
2460
+
"license": "Apache-2.0",
2461
+
"engines": {
2462
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
2463
+
},
2464
+
"funding": {
2465
+
"url": "https://opencollective.com/eslint"
2466
+
}
2467
+
},
2468
+
"node_modules/@u3u/prettier-config": {
2469
+
"version": "5.2.0",
2470
+
"resolved": "https://registry.npmjs.org/@u3u/prettier-config/-/prettier-config-5.2.0.tgz",
2471
+
"integrity": "sha512-XxiVGBxnPKqG72MiPGsIFqZRKU4Kow2ylnjxMf8WHFQr+K6kSgXou1OVnwiKZdKK4UyYMxoakM+L1pTKu2BwHg==",
2472
+
"dev": true,
2473
+
"license": "MIT",
2474
+
"dependencies": {
2475
+
"@ianvs/prettier-plugin-sort-imports": "^4.4.1",
2476
+
"@prettier/plugin-php": "^0.22.4",
2477
+
"@prettier/plugin-xml": "^3.4.1",
2478
+
"@shufo/prettier-plugin-blade": "^1.15.3",
2479
+
"deepmerge": "^4.3.1",
2480
+
"local-pkg": "^0.5.1",
2481
+
"prettier-plugin-astro": "^0.14.1",
2482
+
"prettier-plugin-classnames": "^0.7.7",
2483
+
"prettier-plugin-ini": "^1.3.0",
2484
+
"prettier-plugin-jsdoc": "^1.3.2",
2485
+
"prettier-plugin-merge": "^0.7.2",
2486
+
"prettier-plugin-multiline-arrays": "^4.0.2",
2487
+
"prettier-plugin-nginx": "^1.0.3",
2488
+
"prettier-plugin-packagejson": "^2.5.10",
2489
+
"prettier-plugin-prisma": "^5.0.0",
2490
+
"prettier-plugin-sh": "^0.15.0",
2491
+
"prettier-plugin-sort-json": "^4.1.1",
2492
+
"prettier-plugin-sql": "^0.18.1",
2493
+
"prettier-plugin-tailwindcss": "^0.6.11",
2494
+
"remeda": "^2.21.1"
2495
+
},
2496
+
"peerDependencies": {
2497
+
"prettier": ">=3.0.0"
2498
+
}
2499
+
},
2500
+
"node_modules/@vitejs/plugin-react": {
2501
+
"version": "4.3.4",
2502
+
"resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.4.tgz",
2503
+
"integrity": "sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==",
2504
+
"dev": true,
2505
+
"license": "MIT",
2506
+
"dependencies": {
2507
+
"@babel/core": "^7.26.0",
2508
+
"@babel/plugin-transform-react-jsx-self": "^7.25.9",
2509
+
"@babel/plugin-transform-react-jsx-source": "^7.25.9",
2510
+
"@types/babel__core": "^7.20.5",
2511
+
"react-refresh": "^0.14.2"
2512
+
},
2513
+
"engines": {
2514
+
"node": "^14.18.0 || >=16.0.0"
2515
+
},
2516
+
"peerDependencies": {
2517
+
"vite": "^4.2.0 || ^5.0.0 || ^6.0.0"
2518
+
}
2519
+
},
2520
+
"node_modules/@xml-tools/parser": {
2521
+
"version": "1.0.11",
2522
+
"resolved": "https://registry.npmjs.org/@xml-tools/parser/-/parser-1.0.11.tgz",
2523
+
"integrity": "sha512-aKqQ077XnR+oQtHJlrAflaZaL7qZsulWc/i/ZEooar5JiWj1eLt0+Wg28cpa+XLney107wXqneC+oG1IZvxkTA==",
2524
+
"dev": true,
2525
+
"license": "Apache-2.0",
2526
+
"dependencies": {
2527
+
"chevrotain": "7.1.1"
2528
+
}
2529
+
},
2530
+
"node_modules/abbrev": {
2531
+
"version": "2.0.0",
2532
+
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz",
2533
+
"integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==",
2534
+
"dev": true,
2535
+
"license": "ISC",
2536
+
"engines": {
2537
+
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
2538
+
}
2539
+
},
2540
+
"node_modules/acorn": {
2541
+
"version": "8.15.0",
2542
+
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
2543
+
"integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
2544
+
"dev": true,
2545
+
"license": "MIT",
2546
+
"bin": {
2547
+
"acorn": "bin/acorn"
2548
+
},
2549
+
"engines": {
2550
+
"node": ">=0.4.0"
2551
+
}
2552
+
},
2553
+
"node_modules/acorn-jsx": {
2554
+
"version": "5.3.2",
2555
+
"resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
2556
+
"integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
2557
+
"dev": true,
2558
+
"license": "MIT",
2559
+
"peerDependencies": {
2560
+
"acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
2561
+
}
2562
+
},
2563
+
"node_modules/aigle": {
2564
+
"version": "1.14.1",
2565
+
"resolved": "https://registry.npmjs.org/aigle/-/aigle-1.14.1.tgz",
2566
+
"integrity": "sha512-bCmQ65CEebspmpbWFs6ab3S27TNyVH1b5MledX8KoiGxUhsJmPUUGpaoSijhwawNnq5Lt8jbcq7Z7gUAD0nuTw==",
2567
+
"dev": true,
2568
+
"license": "MIT",
2569
+
"dependencies": {
2570
+
"aigle-core": "^1.0.0"
2571
+
}
2572
+
},
2573
+
"node_modules/aigle-core": {
2574
+
"version": "1.0.0",
2575
+
"resolved": "https://registry.npmjs.org/aigle-core/-/aigle-core-1.0.0.tgz",
2576
+
"integrity": "sha512-uGFWPumk5DLvYnUphNnff+kWC8VeAnjPbbU8ovsSHflKXGX77SD7cAN/aSBCLX3xnoJAM9KdtRgxUygRnSSu7A==",
2577
+
"dev": true,
2578
+
"license": "MIT"
2579
+
},
2580
+
"node_modules/ajv": {
2581
+
"version": "8.17.1",
2582
+
"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
2583
+
"integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
2584
+
"dev": true,
2585
+
"license": "MIT",
2586
+
"dependencies": {
2587
+
"fast-deep-equal": "^3.1.3",
2588
+
"fast-uri": "^3.0.1",
2589
+
"json-schema-traverse": "^1.0.0",
2590
+
"require-from-string": "^2.0.2"
2591
+
},
2592
+
"funding": {
2593
+
"type": "github",
2594
+
"url": "https://github.com/sponsors/epoberezkin"
2595
+
}
2596
+
},
2597
+
"node_modules/ansi-regex": {
2598
+
"version": "6.1.0",
2599
+
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
2600
+
"integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
2601
+
"license": "MIT",
2602
+
"engines": {
2603
+
"node": ">=12"
2604
+
},
2605
+
"funding": {
2606
+
"url": "https://github.com/chalk/ansi-regex?sponsor=1"
2607
+
}
2608
+
},
2609
+
"node_modules/ansi-styles": {
2610
+
"version": "4.3.0",
2611
+
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
2612
+
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
2613
+
"license": "MIT",
2614
+
"dependencies": {
2615
+
"color-convert": "^2.0.1"
2616
+
},
2617
+
"engines": {
2618
+
"node": ">=8"
2619
+
},
2620
+
"funding": {
2621
+
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
2622
+
}
2623
+
},
2624
+
"node_modules/any-promise": {
2625
+
"version": "1.3.0",
2626
+
"resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
2627
+
"integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
2628
+
"license": "MIT"
2629
+
},
2630
+
"node_modules/anymatch": {
2631
+
"version": "3.1.3",
2632
+
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
2633
+
"integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
2634
+
"license": "ISC",
2635
+
"dependencies": {
2636
+
"normalize-path": "^3.0.0",
2637
+
"picomatch": "^2.0.4"
2638
+
},
2639
+
"engines": {
2640
+
"node": ">= 8"
2641
+
}
2642
+
},
2643
+
"node_modules/arg": {
2644
+
"version": "5.0.2",
2645
+
"resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
2646
+
"integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
2647
+
"license": "MIT"
2648
+
},
2649
+
"node_modules/argparse": {
2650
+
"version": "2.0.1",
2651
+
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
2652
+
"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
2653
+
"dev": true,
2654
+
"license": "Python-2.0"
2655
+
},
2656
+
"node_modules/array-buffer-byte-length": {
2657
+
"version": "1.0.2",
2658
+
"resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz",
2659
+
"integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==",
2660
+
"dev": true,
2661
+
"license": "MIT",
2662
+
"dependencies": {
2663
+
"call-bound": "^1.0.3",
2664
+
"is-array-buffer": "^3.0.5"
2665
+
},
2666
+
"engines": {
2667
+
"node": ">= 0.4"
2668
+
},
2669
+
"funding": {
2670
+
"url": "https://github.com/sponsors/ljharb"
2671
+
}
2672
+
},
2673
+
"node_modules/array-includes": {
2674
+
"version": "3.1.8",
2675
+
"resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz",
2676
+
"integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==",
2677
+
"dev": true,
2678
+
"license": "MIT",
2679
+
"dependencies": {
2680
+
"call-bind": "^1.0.7",
2681
+
"define-properties": "^1.2.1",
2682
+
"es-abstract": "^1.23.2",
2683
+
"es-object-atoms": "^1.0.0",
2684
+
"get-intrinsic": "^1.2.4",
2685
+
"is-string": "^1.0.7"
2686
+
},
2687
+
"engines": {
2688
+
"node": ">= 0.4"
2689
+
},
2690
+
"funding": {
2691
+
"url": "https://github.com/sponsors/ljharb"
2692
+
}
2693
+
},
2694
+
"node_modules/array.prototype.findlast": {
2695
+
"version": "1.2.5",
2696
+
"resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz",
2697
+
"integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==",
2698
+
"dev": true,
2699
+
"license": "MIT",
2700
+
"dependencies": {
2701
+
"call-bind": "^1.0.7",
2702
+
"define-properties": "^1.2.1",
2703
+
"es-abstract": "^1.23.2",
2704
+
"es-errors": "^1.3.0",
2705
+
"es-object-atoms": "^1.0.0",
2706
+
"es-shim-unscopables": "^1.0.2"
2707
+
},
2708
+
"engines": {
2709
+
"node": ">= 0.4"
2710
+
},
2711
+
"funding": {
2712
+
"url": "https://github.com/sponsors/ljharb"
2713
+
}
2714
+
},
2715
+
"node_modules/array.prototype.flat": {
2716
+
"version": "1.3.3",
2717
+
"resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz",
2718
+
"integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==",
2719
+
"dev": true,
2720
+
"license": "MIT",
2721
+
"dependencies": {
2722
+
"call-bind": "^1.0.8",
2723
+
"define-properties": "^1.2.1",
2724
+
"es-abstract": "^1.23.5",
2725
+
"es-shim-unscopables": "^1.0.2"
2726
+
},
2727
+
"engines": {
2728
+
"node": ">= 0.4"
2729
+
},
2730
+
"funding": {
2731
+
"url": "https://github.com/sponsors/ljharb"
2732
+
}
2733
+
},
2734
+
"node_modules/array.prototype.flatmap": {
2735
+
"version": "1.3.3",
2736
+
"resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz",
2737
+
"integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==",
2738
+
"dev": true,
2739
+
"license": "MIT",
2740
+
"dependencies": {
2741
+
"call-bind": "^1.0.8",
2742
+
"define-properties": "^1.2.1",
2743
+
"es-abstract": "^1.23.5",
2744
+
"es-shim-unscopables": "^1.0.2"
2745
+
},
2746
+
"engines": {
2747
+
"node": ">= 0.4"
2748
+
},
2749
+
"funding": {
2750
+
"url": "https://github.com/sponsors/ljharb"
2751
+
}
2752
+
},
2753
+
"node_modules/array.prototype.tosorted": {
2754
+
"version": "1.1.4",
2755
+
"resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz",
2756
+
"integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==",
2757
+
"dev": true,
2758
+
"license": "MIT",
2759
+
"dependencies": {
2760
+
"call-bind": "^1.0.7",
2761
+
"define-properties": "^1.2.1",
2762
+
"es-abstract": "^1.23.3",
2763
+
"es-errors": "^1.3.0",
2764
+
"es-shim-unscopables": "^1.0.2"
2765
+
},
2766
+
"engines": {
2767
+
"node": ">= 0.4"
2768
+
}
2769
+
},
2770
+
"node_modules/arraybuffer.prototype.slice": {
2771
+
"version": "1.0.4",
2772
+
"resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz",
2773
+
"integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==",
2774
+
"dev": true,
2775
+
"license": "MIT",
2776
+
"dependencies": {
2777
+
"array-buffer-byte-length": "^1.0.1",
2778
+
"call-bind": "^1.0.8",
2779
+
"define-properties": "^1.2.1",
2780
+
"es-abstract": "^1.23.5",
2781
+
"es-errors": "^1.3.0",
2782
+
"get-intrinsic": "^1.2.6",
2783
+
"is-array-buffer": "^3.0.4"
2784
+
},
2785
+
"engines": {
2786
+
"node": ">= 0.4"
2787
+
},
2788
+
"funding": {
2789
+
"url": "https://github.com/sponsors/ljharb"
2790
+
}
2791
+
},
2792
+
"node_modules/async-function": {
2793
+
"version": "1.0.0",
2794
+
"resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz",
2795
+
"integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==",
2796
+
"dev": true,
2797
+
"license": "MIT",
2798
+
"engines": {
2799
+
"node": ">= 0.4"
2800
+
}
2801
+
},
2802
+
"node_modules/asynckit": {
2803
+
"version": "0.4.0",
2804
+
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
2805
+
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
2806
+
"dev": true,
2807
+
"license": "MIT"
2808
+
},
2809
+
"node_modules/autoprefixer": {
2810
+
"version": "10.4.21",
2811
+
"resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz",
2812
+
"integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==",
2813
+
"funding": [
2814
+
{
2815
+
"type": "opencollective",
2816
+
"url": "https://opencollective.com/postcss/"
2817
+
},
2818
+
{
2819
+
"type": "tidelift",
2820
+
"url": "https://tidelift.com/funding/github/npm/autoprefixer"
2821
+
},
2822
+
{
2823
+
"type": "github",
2824
+
"url": "https://github.com/sponsors/ai"
2825
+
}
2826
+
],
2827
+
"license": "MIT",
2828
+
"dependencies": {
2829
+
"browserslist": "^4.24.4",
2830
+
"caniuse-lite": "^1.0.30001702",
2831
+
"fraction.js": "^4.3.7",
2832
+
"normalize-range": "^0.1.2",
2833
+
"picocolors": "^1.1.1",
2834
+
"postcss-value-parser": "^4.2.0"
2835
+
},
2836
+
"bin": {
2837
+
"autoprefixer": "bin/autoprefixer"
2838
+
},
2839
+
"engines": {
2840
+
"node": "^10 || ^12 || >=14"
2841
+
},
2842
+
"peerDependencies": {
2843
+
"postcss": "^8.1.0"
2844
+
}
2845
+
},
2846
+
"node_modules/available-typed-arrays": {
2847
+
"version": "1.0.7",
2848
+
"resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
2849
+
"integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
2850
+
"dev": true,
2851
+
"license": "MIT",
2852
+
"dependencies": {
2853
+
"possible-typed-array-names": "^1.0.0"
2854
+
},
2855
+
"engines": {
2856
+
"node": ">= 0.4"
2857
+
},
2858
+
"funding": {
2859
+
"url": "https://github.com/sponsors/ljharb"
2860
+
}
2861
+
},
2862
+
"node_modules/balanced-match": {
2863
+
"version": "1.0.2",
2864
+
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
2865
+
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
2866
+
"license": "MIT"
2867
+
},
2868
+
"node_modules/big-integer": {
2869
+
"version": "1.6.52",
2870
+
"resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz",
2871
+
"integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==",
2872
+
"dev": true,
2873
+
"license": "Unlicense",
2874
+
"engines": {
2875
+
"node": ">=0.6"
2876
+
}
2877
+
},
2878
+
"node_modules/binary-extensions": {
2879
+
"version": "2.3.0",
2880
+
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
2881
+
"integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
2882
+
"license": "MIT",
2883
+
"engines": {
2884
+
"node": ">=8"
2885
+
},
2886
+
"funding": {
2887
+
"url": "https://github.com/sponsors/sindresorhus"
2888
+
}
2889
+
},
2890
+
"node_modules/binary-searching": {
2891
+
"version": "2.0.5",
2892
+
"resolved": "https://registry.npmjs.org/binary-searching/-/binary-searching-2.0.5.tgz",
2893
+
"integrity": "sha512-v4N2l3RxL+m4zDxyxz3Ne2aTmiPn8ZUpKFpdPtO+ItW1NcTCXA7JeHG5GMBSvoKSkQZ9ycS+EouDVxYB9ufKWA==",
2894
+
"dev": true,
2895
+
"license": "MIT"
2896
+
},
2897
+
"node_modules/blade-formatter": {
2898
+
"version": "1.42.2",
2899
+
"resolved": "https://registry.npmjs.org/blade-formatter/-/blade-formatter-1.42.2.tgz",
2900
+
"integrity": "sha512-mbjnget+vJ8fcKiEn0Et1IepMdiKoDGxSROt6qFKF3UW+tmRuvr/v/CK8GECJL+RE6jsJo8x3mFXrDZk+RgjDQ==",
2901
+
"dev": true,
2902
+
"license": "MIT",
2903
+
"dependencies": {
2904
+
"@prettier/plugin-php": "^0.22.4",
2905
+
"@shufo/tailwindcss-class-sorter": "3.0.1",
2906
+
"aigle": "^1.14.1",
2907
+
"ajv": "^8.9.0",
2908
+
"chalk": "^4.1.0",
2909
+
"concat-stream": "^2.0.0",
2910
+
"detect-indent": "^6.0.0",
2911
+
"find-config": "^1.0.0",
2912
+
"glob": "^10.0.0",
2913
+
"html-attribute-sorter": "^0.4.3",
2914
+
"ignore": "^6.0.0",
2915
+
"js-beautify": "^1.14.8",
2916
+
"lodash": "^4.17.19",
2917
+
"php-parser": "3.2.2",
2918
+
"prettier": "^3.2.5",
2919
+
"string-replace-async": "^2.0.0",
2920
+
"tailwindcss": "^3.1.8",
2921
+
"vscode-oniguruma": "1.7.0",
2922
+
"vscode-textmate": "^7.0.1",
2923
+
"xregexp": "^5.0.1",
2924
+
"yargs": "^17.3.1"
2925
+
},
2926
+
"bin": {
2927
+
"blade-formatter": "bin/blade-formatter.cjs"
2928
+
},
2929
+
"engines": {
2930
+
"node": ">= 14.0.0"
2931
+
}
2932
+
},
2933
+
"node_modules/blade-formatter/node_modules/ignore": {
2934
+
"version": "6.0.2",
2935
+
"resolved": "https://registry.npmjs.org/ignore/-/ignore-6.0.2.tgz",
2936
+
"integrity": "sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==",
2937
+
"dev": true,
2938
+
"license": "MIT",
2939
+
"engines": {
2940
+
"node": ">= 4"
2941
+
}
2942
+
},
2943
+
"node_modules/brace-expansion": {
2944
+
"version": "2.0.2",
2945
+
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
2946
+
"integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
2947
+
"license": "MIT",
2948
+
"dependencies": {
2949
+
"balanced-match": "^1.0.0"
2950
+
}
2951
+
},
2952
+
"node_modules/braces": {
2953
+
"version": "3.0.3",
2954
+
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
2955
+
"integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
2956
+
"license": "MIT",
2957
+
"dependencies": {
2958
+
"fill-range": "^7.1.1"
2959
+
},
2960
+
"engines": {
2961
+
"node": ">=8"
2962
+
}
2963
+
},
2964
+
"node_modules/browser-or-node": {
2965
+
"version": "3.0.0",
2966
+
"resolved": "https://registry.npmjs.org/browser-or-node/-/browser-or-node-3.0.0.tgz",
2967
+
"integrity": "sha512-iczIdVJzGEYhP5DqQxYM9Hh7Ztpqqi+CXZpSmX8ALFs9ecXkQIeqRyM6TfxEfMVpwhl3dSuDvxdzzo9sUOIVBQ==",
2968
+
"dev": true,
2969
+
"license": "MIT"
2970
+
},
2971
+
"node_modules/browserslist": {
2972
+
"version": "4.24.4",
2973
+
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz",
2974
+
"integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==",
2975
+
"funding": [
2976
+
{
2977
+
"type": "opencollective",
2978
+
"url": "https://opencollective.com/browserslist"
2979
+
},
2980
+
{
2981
+
"type": "tidelift",
2982
+
"url": "https://tidelift.com/funding/github/npm/browserslist"
2983
+
},
2984
+
{
2985
+
"type": "github",
2986
+
"url": "https://github.com/sponsors/ai"
2987
+
}
2988
+
],
2989
+
"license": "MIT",
2990
+
"dependencies": {
2991
+
"caniuse-lite": "^1.0.30001688",
2992
+
"electron-to-chromium": "^1.5.73",
2993
+
"node-releases": "^2.0.19",
2994
+
"update-browserslist-db": "^1.1.1"
2995
+
},
2996
+
"bin": {
2997
+
"browserslist": "cli.js"
2998
+
},
2999
+
"engines": {
3000
+
"node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
3001
+
}
3002
+
},
3003
+
"node_modules/buffer-from": {
3004
+
"version": "1.1.2",
3005
+
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
3006
+
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
3007
+
"dev": true,
3008
+
"license": "MIT"
3009
+
},
3010
+
"node_modules/call-bind": {
3011
+
"version": "1.0.8",
3012
+
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz",
3013
+
"integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==",
3014
+
"dev": true,
3015
+
"license": "MIT",
3016
+
"dependencies": {
3017
+
"call-bind-apply-helpers": "^1.0.0",
3018
+
"es-define-property": "^1.0.0",
3019
+
"get-intrinsic": "^1.2.4",
3020
+
"set-function-length": "^1.2.2"
3021
+
},
3022
+
"engines": {
3023
+
"node": ">= 0.4"
3024
+
},
3025
+
"funding": {
3026
+
"url": "https://github.com/sponsors/ljharb"
3027
+
}
3028
+
},
3029
+
"node_modules/call-bind-apply-helpers": {
3030
+
"version": "1.0.2",
3031
+
"resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
3032
+
"integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
3033
+
"dev": true,
3034
+
"license": "MIT",
3035
+
"dependencies": {
3036
+
"es-errors": "^1.3.0",
3037
+
"function-bind": "^1.1.2"
3038
+
},
3039
+
"engines": {
3040
+
"node": ">= 0.4"
3041
+
}
3042
+
},
3043
+
"node_modules/call-bound": {
3044
+
"version": "1.0.4",
3045
+
"resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
3046
+
"integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
3047
+
"dev": true,
3048
+
"license": "MIT",
3049
+
"dependencies": {
3050
+
"call-bind-apply-helpers": "^1.0.2",
3051
+
"get-intrinsic": "^1.3.0"
3052
+
},
3053
+
"engines": {
3054
+
"node": ">= 0.4"
3055
+
},
3056
+
"funding": {
3057
+
"url": "https://github.com/sponsors/ljharb"
3058
+
}
3059
+
},
3060
+
"node_modules/callsites": {
3061
+
"version": "3.1.0",
3062
+
"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
3063
+
"integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
3064
+
"dev": true,
3065
+
"license": "MIT",
3066
+
"engines": {
3067
+
"node": ">=6"
3068
+
}
3069
+
},
3070
+
"node_modules/camelcase-css": {
3071
+
"version": "2.0.1",
3072
+
"resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
3073
+
"integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
3074
+
"license": "MIT",
3075
+
"engines": {
3076
+
"node": ">= 6"
3077
+
}
3078
+
},
3079
+
"node_modules/caniuse-lite": {
3080
+
"version": "1.0.30001710",
3081
+
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001710.tgz",
3082
+
"integrity": "sha512-B5C0I0UmaGqHgo5FuqJ7hBd4L57A4dDD+Xi+XX1nXOoxGeDdY4Ko38qJYOyqznBVJEqON5p8P1x5zRR3+rsnxA==",
3083
+
"funding": [
3084
+
{
3085
+
"type": "opencollective",
3086
+
"url": "https://opencollective.com/browserslist"
3087
+
},
3088
+
{
3089
+
"type": "tidelift",
3090
+
"url": "https://tidelift.com/funding/github/npm/caniuse-lite"
3091
+
},
3092
+
{
3093
+
"type": "github",
3094
+
"url": "https://github.com/sponsors/ai"
3095
+
}
3096
+
],
3097
+
"license": "CC-BY-4.0"
3098
+
},
3099
+
"node_modules/chalk": {
3100
+
"version": "4.1.2",
3101
+
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
3102
+
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
3103
+
"dev": true,
3104
+
"license": "MIT",
3105
+
"dependencies": {
3106
+
"ansi-styles": "^4.1.0",
3107
+
"supports-color": "^7.1.0"
3108
+
},
3109
+
"engines": {
3110
+
"node": ">=10"
3111
+
},
3112
+
"funding": {
3113
+
"url": "https://github.com/chalk/chalk?sponsor=1"
3114
+
}
3115
+
},
3116
+
"node_modules/character-entities": {
3117
+
"version": "2.0.2",
3118
+
"resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz",
3119
+
"integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==",
3120
+
"dev": true,
3121
+
"license": "MIT",
3122
+
"funding": {
3123
+
"type": "github",
3124
+
"url": "https://github.com/sponsors/wooorm"
3125
+
}
3126
+
},
3127
+
"node_modules/chevrotain": {
3128
+
"version": "7.1.1",
3129
+
"resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-7.1.1.tgz",
3130
+
"integrity": "sha512-wy3mC1x4ye+O+QkEinVJkPf5u2vsrDIYW9G7ZuwFl6v/Yu0LwUuT2POsb+NUWApebyxfkQq6+yDfRExbnI5rcw==",
3131
+
"dev": true,
3132
+
"license": "Apache-2.0",
3133
+
"dependencies": {
3134
+
"regexp-to-ast": "0.5.0"
3135
+
}
3136
+
},
3137
+
"node_modules/chokidar": {
3138
+
"version": "3.6.0",
3139
+
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
3140
+
"integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
3141
+
"license": "MIT",
3142
+
"dependencies": {
3143
+
"anymatch": "~3.1.2",
3144
+
"braces": "~3.0.2",
3145
+
"glob-parent": "~5.1.2",
3146
+
"is-binary-path": "~2.1.0",
3147
+
"is-glob": "~4.0.1",
3148
+
"normalize-path": "~3.0.0",
3149
+
"readdirp": "~3.6.0"
3150
+
},
3151
+
"engines": {
3152
+
"node": ">= 8.10.0"
3153
+
},
3154
+
"funding": {
3155
+
"url": "https://paulmillr.com/funding/"
3156
+
},
3157
+
"optionalDependencies": {
3158
+
"fsevents": "~2.3.2"
3159
+
}
3160
+
},
3161
+
"node_modules/chokidar/node_modules/glob-parent": {
3162
+
"version": "5.1.2",
3163
+
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
3164
+
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
3165
+
"license": "ISC",
3166
+
"dependencies": {
3167
+
"is-glob": "^4.0.1"
3168
+
},
3169
+
"engines": {
3170
+
"node": ">= 6"
3171
+
}
3172
+
},
3173
+
"node_modules/cliui": {
3174
+
"version": "8.0.1",
3175
+
"resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
3176
+
"integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
3177
+
"dev": true,
3178
+
"license": "ISC",
3179
+
"dependencies": {
3180
+
"string-width": "^4.2.0",
3181
+
"strip-ansi": "^6.0.1",
3182
+
"wrap-ansi": "^7.0.0"
3183
+
},
3184
+
"engines": {
3185
+
"node": ">=12"
3186
+
}
3187
+
},
3188
+
"node_modules/cliui/node_modules/ansi-regex": {
3189
+
"version": "5.0.1",
3190
+
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
3191
+
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
3192
+
"dev": true,
3193
+
"license": "MIT",
3194
+
"engines": {
3195
+
"node": ">=8"
3196
+
}
3197
+
},
3198
+
"node_modules/cliui/node_modules/emoji-regex": {
3199
+
"version": "8.0.0",
3200
+
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
3201
+
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
3202
+
"dev": true,
3203
+
"license": "MIT"
3204
+
},
3205
+
"node_modules/cliui/node_modules/string-width": {
3206
+
"version": "4.2.3",
3207
+
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
3208
+
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
3209
+
"dev": true,
3210
+
"license": "MIT",
3211
+
"dependencies": {
3212
+
"emoji-regex": "^8.0.0",
3213
+
"is-fullwidth-code-point": "^3.0.0",
3214
+
"strip-ansi": "^6.0.1"
3215
+
},
3216
+
"engines": {
3217
+
"node": ">=8"
3218
+
}
3219
+
},
3220
+
"node_modules/cliui/node_modules/strip-ansi": {
3221
+
"version": "6.0.1",
3222
+
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
3223
+
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
3224
+
"dev": true,
3225
+
"license": "MIT",
3226
+
"dependencies": {
3227
+
"ansi-regex": "^5.0.1"
3228
+
},
3229
+
"engines": {
3230
+
"node": ">=8"
3231
+
}
3232
+
},
3233
+
"node_modules/cliui/node_modules/wrap-ansi": {
3234
+
"version": "7.0.0",
3235
+
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
3236
+
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
3237
+
"dev": true,
3238
+
"license": "MIT",
3239
+
"dependencies": {
3240
+
"ansi-styles": "^4.0.0",
3241
+
"string-width": "^4.1.0",
3242
+
"strip-ansi": "^6.0.0"
3243
+
},
3244
+
"engines": {
3245
+
"node": ">=10"
3246
+
},
3247
+
"funding": {
3248
+
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
3249
+
}
3250
+
},
3251
+
"node_modules/clsx": {
3252
+
"version": "2.1.1",
3253
+
"resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
3254
+
"integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
3255
+
"license": "MIT",
3256
+
"engines": {
3257
+
"node": ">=6"
3258
+
}
3259
+
},
3260
+
"node_modules/color-convert": {
3261
+
"version": "2.0.1",
3262
+
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
3263
+
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
3264
+
"license": "MIT",
3265
+
"dependencies": {
3266
+
"color-name": "~1.1.4"
3267
+
},
3268
+
"engines": {
3269
+
"node": ">=7.0.0"
3270
+
}
3271
+
},
3272
+
"node_modules/color-name": {
3273
+
"version": "1.1.4",
3274
+
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
3275
+
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
3276
+
"license": "MIT"
3277
+
},
3278
+
"node_modules/combined-stream": {
3279
+
"version": "1.0.8",
3280
+
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
3281
+
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
3282
+
"dev": true,
3283
+
"license": "MIT",
3284
+
"dependencies": {
3285
+
"delayed-stream": "~1.0.0"
3286
+
},
3287
+
"engines": {
3288
+
"node": ">= 0.8"
3289
+
}
3290
+
},
3291
+
"node_modules/commander": {
3292
+
"version": "10.0.1",
3293
+
"resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz",
3294
+
"integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==",
3295
+
"dev": true,
3296
+
"license": "MIT",
3297
+
"engines": {
3298
+
"node": ">=14"
3299
+
}
3300
+
},
3301
+
"node_modules/comment-parser": {
3302
+
"version": "1.4.1",
3303
+
"resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz",
3304
+
"integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==",
3305
+
"dev": true,
3306
+
"license": "MIT",
3307
+
"engines": {
3308
+
"node": ">= 12.0.0"
3309
+
}
3310
+
},
3311
+
"node_modules/concat-map": {
3312
+
"version": "0.0.1",
3313
+
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
3314
+
"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
3315
+
"dev": true,
3316
+
"license": "MIT"
3317
+
},
3318
+
"node_modules/concat-stream": {
3319
+
"version": "2.0.0",
3320
+
"resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz",
3321
+
"integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==",
3322
+
"dev": true,
3323
+
"engines": [
3324
+
"node >= 6.0"
3325
+
],
3326
+
"license": "MIT",
3327
+
"dependencies": {
3328
+
"buffer-from": "^1.0.0",
3329
+
"inherits": "^2.0.3",
3330
+
"readable-stream": "^3.0.2",
3331
+
"typedarray": "^0.0.6"
3332
+
}
3333
+
},
3334
+
"node_modules/confbox": {
3335
+
"version": "0.1.8",
3336
+
"resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz",
3337
+
"integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==",
3338
+
"dev": true,
3339
+
"license": "MIT"
3340
+
},
3341
+
"node_modules/config-chain": {
3342
+
"version": "1.1.13",
3343
+
"resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz",
3344
+
"integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==",
3345
+
"dev": true,
3346
+
"license": "MIT",
3347
+
"dependencies": {
3348
+
"ini": "^1.3.4",
3349
+
"proto-list": "~1.2.1"
3350
+
}
3351
+
},
3352
+
"node_modules/convert-source-map": {
3353
+
"version": "2.0.0",
3354
+
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
3355
+
"integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
3356
+
"dev": true,
3357
+
"license": "MIT"
3358
+
},
3359
+
"node_modules/core-js-pure": {
3360
+
"version": "3.41.0",
3361
+
"resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.41.0.tgz",
3362
+
"integrity": "sha512-71Gzp96T9YPk63aUvE5Q5qP+DryB4ZloUZPSOebGM88VNw8VNfvdA7z6kGA8iGOTEzAomsRidp4jXSmUIJsL+Q==",
3363
+
"dev": true,
3364
+
"hasInstallScript": true,
3365
+
"license": "MIT",
3366
+
"funding": {
3367
+
"type": "opencollective",
3368
+
"url": "https://opencollective.com/core-js"
3369
+
}
3370
+
},
3371
+
"node_modules/cross-spawn": {
3372
+
"version": "7.0.6",
3373
+
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
3374
+
"integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
3375
+
"license": "MIT",
3376
+
"dependencies": {
3377
+
"path-key": "^3.1.0",
3378
+
"shebang-command": "^2.0.0",
3379
+
"which": "^2.0.1"
3380
+
},
3381
+
"engines": {
3382
+
"node": ">= 8"
3383
+
}
3384
+
},
3385
+
"node_modules/cssesc": {
3386
+
"version": "3.0.0",
3387
+
"resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
3388
+
"integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
3389
+
"license": "MIT",
3390
+
"bin": {
3391
+
"cssesc": "bin/cssesc"
3392
+
},
3393
+
"engines": {
3394
+
"node": ">=4"
3395
+
}
3396
+
},
3397
+
"node_modules/csstype": {
3398
+
"version": "3.1.3",
3399
+
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
3400
+
"integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
3401
+
"license": "MIT"
3402
+
},
3403
+
"node_modules/csv-parse": {
3404
+
"version": "5.6.0",
3405
+
"resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-5.6.0.tgz",
3406
+
"integrity": "sha512-l3nz3euub2QMg5ouu5U09Ew9Wf6/wQ8I++ch1loQ0ljmzhmfZYrH9fflS22i/PQEvsPvxCwxgz5q7UB8K1JO4Q==",
3407
+
"dev": true,
3408
+
"license": "MIT"
3409
+
},
3410
+
"node_modules/data-view-buffer": {
3411
+
"version": "1.0.2",
3412
+
"resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz",
3413
+
"integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==",
3414
+
"dev": true,
3415
+
"license": "MIT",
3416
+
"dependencies": {
3417
+
"call-bound": "^1.0.3",
3418
+
"es-errors": "^1.3.0",
3419
+
"is-data-view": "^1.0.2"
3420
+
},
3421
+
"engines": {
3422
+
"node": ">= 0.4"
3423
+
},
3424
+
"funding": {
3425
+
"url": "https://github.com/sponsors/ljharb"
3426
+
}
3427
+
},
3428
+
"node_modules/data-view-byte-length": {
3429
+
"version": "1.0.2",
3430
+
"resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz",
3431
+
"integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==",
3432
+
"dev": true,
3433
+
"license": "MIT",
3434
+
"dependencies": {
3435
+
"call-bound": "^1.0.3",
3436
+
"es-errors": "^1.3.0",
3437
+
"is-data-view": "^1.0.2"
3438
+
},
3439
+
"engines": {
3440
+
"node": ">= 0.4"
3441
+
},
3442
+
"funding": {
3443
+
"url": "https://github.com/sponsors/inspect-js"
3444
+
}
3445
+
},
3446
+
"node_modules/data-view-byte-offset": {
3447
+
"version": "1.0.1",
3448
+
"resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz",
3449
+
"integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==",
3450
+
"dev": true,
3451
+
"license": "MIT",
3452
+
"dependencies": {
3453
+
"call-bound": "^1.0.2",
3454
+
"es-errors": "^1.3.0",
3455
+
"is-data-view": "^1.0.1"
3456
+
},
3457
+
"engines": {
3458
+
"node": ">= 0.4"
3459
+
},
3460
+
"funding": {
3461
+
"url": "https://github.com/sponsors/ljharb"
3462
+
}
3463
+
},
3464
+
"node_modules/debug": {
3465
+
"version": "4.4.0",
3466
+
"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
3467
+
"integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
3468
+
"dev": true,
3469
+
"license": "MIT",
3470
+
"dependencies": {
3471
+
"ms": "^2.1.3"
3472
+
},
3473
+
"engines": {
3474
+
"node": ">=6.0"
3475
+
},
3476
+
"peerDependenciesMeta": {
3477
+
"supports-color": {
3478
+
"optional": true
3479
+
}
3480
+
}
3481
+
},
3482
+
"node_modules/decode-named-character-reference": {
3483
+
"version": "1.1.0",
3484
+
"resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.1.0.tgz",
3485
+
"integrity": "sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==",
3486
+
"dev": true,
3487
+
"license": "MIT",
3488
+
"dependencies": {
3489
+
"character-entities": "^2.0.0"
3490
+
},
3491
+
"funding": {
3492
+
"type": "github",
3493
+
"url": "https://github.com/sponsors/wooorm"
3494
+
}
3495
+
},
3496
+
"node_modules/deep-eql": {
3497
+
"version": "5.0.2",
3498
+
"resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz",
3499
+
"integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==",
3500
+
"dev": true,
3501
+
"license": "MIT",
3502
+
"engines": {
3503
+
"node": ">=6"
3504
+
}
3505
+
},
3506
+
"node_modules/deep-is": {
3507
+
"version": "0.1.4",
3508
+
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
3509
+
"integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
3510
+
"dev": true,
3511
+
"license": "MIT"
3512
+
},
3513
+
"node_modules/deepmerge": {
3514
+
"version": "4.3.1",
3515
+
"resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
3516
+
"integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
3517
+
"dev": true,
3518
+
"license": "MIT",
3519
+
"engines": {
3520
+
"node": ">=0.10.0"
3521
+
}
3522
+
},
3523
+
"node_modules/define-data-property": {
3524
+
"version": "1.1.4",
3525
+
"resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
3526
+
"integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
3527
+
"dev": true,
3528
+
"license": "MIT",
3529
+
"dependencies": {
3530
+
"es-define-property": "^1.0.0",
3531
+
"es-errors": "^1.3.0",
3532
+
"gopd": "^1.0.1"
3533
+
},
3534
+
"engines": {
3535
+
"node": ">= 0.4"
3536
+
},
3537
+
"funding": {
3538
+
"url": "https://github.com/sponsors/ljharb"
3539
+
}
3540
+
},
3541
+
"node_modules/define-properties": {
3542
+
"version": "1.2.1",
3543
+
"resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
3544
+
"integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
3545
+
"dev": true,
3546
+
"license": "MIT",
3547
+
"dependencies": {
3548
+
"define-data-property": "^1.0.1",
3549
+
"has-property-descriptors": "^1.0.0",
3550
+
"object-keys": "^1.1.1"
3551
+
},
3552
+
"engines": {
3553
+
"node": ">= 0.4"
3554
+
},
3555
+
"funding": {
3556
+
"url": "https://github.com/sponsors/ljharb"
3557
+
}
3558
+
},
3559
+
"node_modules/delayed-stream": {
3560
+
"version": "1.0.0",
3561
+
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
3562
+
"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
3563
+
"dev": true,
3564
+
"license": "MIT",
3565
+
"engines": {
3566
+
"node": ">=0.4.0"
3567
+
}
3568
+
},
3569
+
"node_modules/dequal": {
3570
+
"version": "2.0.3",
3571
+
"resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
3572
+
"integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
3573
+
"dev": true,
3574
+
"license": "MIT",
3575
+
"engines": {
3576
+
"node": ">=6"
3577
+
}
3578
+
},
3579
+
"node_modules/detect-indent": {
3580
+
"version": "6.1.0",
3581
+
"resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz",
3582
+
"integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==",
3583
+
"dev": true,
3584
+
"license": "MIT",
3585
+
"engines": {
3586
+
"node": ">=8"
3587
+
}
3588
+
},
3589
+
"node_modules/detect-newline": {
3590
+
"version": "4.0.1",
3591
+
"resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-4.0.1.tgz",
3592
+
"integrity": "sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog==",
3593
+
"dev": true,
3594
+
"license": "MIT",
3595
+
"engines": {
3596
+
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
3597
+
},
3598
+
"funding": {
3599
+
"url": "https://github.com/sponsors/sindresorhus"
3600
+
}
3601
+
},
3602
+
"node_modules/devlop": {
3603
+
"version": "1.1.0",
3604
+
"resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz",
3605
+
"integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==",
3606
+
"dev": true,
3607
+
"license": "MIT",
3608
+
"dependencies": {
3609
+
"dequal": "^2.0.0"
3610
+
},
3611
+
"funding": {
3612
+
"type": "github",
3613
+
"url": "https://github.com/sponsors/wooorm"
3614
+
}
3615
+
},
3616
+
"node_modules/didyoumean": {
3617
+
"version": "1.2.2",
3618
+
"resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
3619
+
"integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
3620
+
"license": "Apache-2.0"
3621
+
},
3622
+
"node_modules/diff": {
3623
+
"version": "5.1.0",
3624
+
"resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz",
3625
+
"integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==",
3626
+
"dev": true,
3627
+
"license": "BSD-3-Clause",
3628
+
"engines": {
3629
+
"node": ">=0.3.1"
3630
+
}
3631
+
},
3632
+
"node_modules/discontinuous-range": {
3633
+
"version": "1.0.0",
3634
+
"resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz",
3635
+
"integrity": "sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==",
3636
+
"dev": true,
3637
+
"license": "MIT"
3638
+
},
3639
+
"node_modules/dlv": {
3640
+
"version": "1.1.3",
3641
+
"resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
3642
+
"integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
3643
+
"license": "MIT"
3644
+
},
3645
+
"node_modules/doctrine": {
3646
+
"version": "2.1.0",
3647
+
"resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
3648
+
"integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
3649
+
"dev": true,
3650
+
"license": "Apache-2.0",
3651
+
"dependencies": {
3652
+
"esutils": "^2.0.2"
3653
+
},
3654
+
"engines": {
3655
+
"node": ">=0.10.0"
3656
+
}
3657
+
},
3658
+
"node_modules/dunder-proto": {
3659
+
"version": "1.0.1",
3660
+
"resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
3661
+
"integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
3662
+
"dev": true,
3663
+
"license": "MIT",
3664
+
"dependencies": {
3665
+
"call-bind-apply-helpers": "^1.0.1",
3666
+
"es-errors": "^1.3.0",
3667
+
"gopd": "^1.2.0"
3668
+
},
3669
+
"engines": {
3670
+
"node": ">= 0.4"
3671
+
}
3672
+
},
3673
+
"node_modules/eastasianwidth": {
3674
+
"version": "0.2.0",
3675
+
"resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
3676
+
"integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
3677
+
"license": "MIT"
3678
+
},
3679
+
"node_modules/editorconfig": {
3680
+
"version": "1.0.4",
3681
+
"resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-1.0.4.tgz",
3682
+
"integrity": "sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==",
3683
+
"dev": true,
3684
+
"license": "MIT",
3685
+
"dependencies": {
3686
+
"@one-ini/wasm": "0.1.1",
3687
+
"commander": "^10.0.0",
3688
+
"minimatch": "9.0.1",
3689
+
"semver": "^7.5.3"
3690
+
},
3691
+
"bin": {
3692
+
"editorconfig": "bin/editorconfig"
3693
+
},
3694
+
"engines": {
3695
+
"node": ">=14"
3696
+
}
3697
+
},
3698
+
"node_modules/editorconfig/node_modules/minimatch": {
3699
+
"version": "9.0.1",
3700
+
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz",
3701
+
"integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==",
3702
+
"dev": true,
3703
+
"license": "ISC",
3704
+
"dependencies": {
3705
+
"brace-expansion": "^2.0.1"
3706
+
},
3707
+
"engines": {
3708
+
"node": ">=16 || 14 >=14.17"
3709
+
},
3710
+
"funding": {
3711
+
"url": "https://github.com/sponsors/isaacs"
3712
+
}
3713
+
},
3714
+
"node_modules/electron-to-chromium": {
3715
+
"version": "1.5.132",
3716
+
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.132.tgz",
3717
+
"integrity": "sha512-QgX9EBvWGmvSRa74zqfnG7+Eno0Ak0vftBll0Pt2/z5b3bEGYL6OUXLgKPtvx73dn3dvwrlyVkjPKRRlhLYTEg==",
3718
+
"license": "ISC"
3719
+
},
3720
+
"node_modules/emoji-regex": {
3721
+
"version": "9.2.2",
3722
+
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
3723
+
"integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
3724
+
"license": "MIT"
3725
+
},
3726
+
"node_modules/es-abstract": {
3727
+
"version": "1.23.9",
3728
+
"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz",
3729
+
"integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==",
3730
+
"dev": true,
3731
+
"license": "MIT",
3732
+
"dependencies": {
3733
+
"array-buffer-byte-length": "^1.0.2",
3734
+
"arraybuffer.prototype.slice": "^1.0.4",
3735
+
"available-typed-arrays": "^1.0.7",
3736
+
"call-bind": "^1.0.8",
3737
+
"call-bound": "^1.0.3",
3738
+
"data-view-buffer": "^1.0.2",
3739
+
"data-view-byte-length": "^1.0.2",
3740
+
"data-view-byte-offset": "^1.0.1",
3741
+
"es-define-property": "^1.0.1",
3742
+
"es-errors": "^1.3.0",
3743
+
"es-object-atoms": "^1.0.0",
3744
+
"es-set-tostringtag": "^2.1.0",
3745
+
"es-to-primitive": "^1.3.0",
3746
+
"function.prototype.name": "^1.1.8",
3747
+
"get-intrinsic": "^1.2.7",
3748
+
"get-proto": "^1.0.0",
3749
+
"get-symbol-description": "^1.1.0",
3750
+
"globalthis": "^1.0.4",
3751
+
"gopd": "^1.2.0",
3752
+
"has-property-descriptors": "^1.0.2",
3753
+
"has-proto": "^1.2.0",
3754
+
"has-symbols": "^1.1.0",
3755
+
"hasown": "^2.0.2",
3756
+
"internal-slot": "^1.1.0",
3757
+
"is-array-buffer": "^3.0.5",
3758
+
"is-callable": "^1.2.7",
3759
+
"is-data-view": "^1.0.2",
3760
+
"is-regex": "^1.2.1",
3761
+
"is-shared-array-buffer": "^1.0.4",
3762
+
"is-string": "^1.1.1",
3763
+
"is-typed-array": "^1.1.15",
3764
+
"is-weakref": "^1.1.0",
3765
+
"math-intrinsics": "^1.1.0",
3766
+
"object-inspect": "^1.13.3",
3767
+
"object-keys": "^1.1.1",
3768
+
"object.assign": "^4.1.7",
3769
+
"own-keys": "^1.0.1",
3770
+
"regexp.prototype.flags": "^1.5.3",
3771
+
"safe-array-concat": "^1.1.3",
3772
+
"safe-push-apply": "^1.0.0",
3773
+
"safe-regex-test": "^1.1.0",
3774
+
"set-proto": "^1.0.0",
3775
+
"string.prototype.trim": "^1.2.10",
3776
+
"string.prototype.trimend": "^1.0.9",
3777
+
"string.prototype.trimstart": "^1.0.8",
3778
+
"typed-array-buffer": "^1.0.3",
3779
+
"typed-array-byte-length": "^1.0.3",
3780
+
"typed-array-byte-offset": "^1.0.4",
3781
+
"typed-array-length": "^1.0.7",
3782
+
"unbox-primitive": "^1.1.0",
3783
+
"which-typed-array": "^1.1.18"
3784
+
},
3785
+
"engines": {
3786
+
"node": ">= 0.4"
3787
+
},
3788
+
"funding": {
3789
+
"url": "https://github.com/sponsors/ljharb"
3790
+
}
3791
+
},
3792
+
"node_modules/es-define-property": {
3793
+
"version": "1.0.1",
3794
+
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
3795
+
"integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
3796
+
"dev": true,
3797
+
"license": "MIT",
3798
+
"engines": {
3799
+
"node": ">= 0.4"
3800
+
}
3801
+
},
3802
+
"node_modules/es-errors": {
3803
+
"version": "1.3.0",
3804
+
"resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
3805
+
"integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
3806
+
"dev": true,
3807
+
"license": "MIT",
3808
+
"engines": {
3809
+
"node": ">= 0.4"
3810
+
}
3811
+
},
3812
+
"node_modules/es-iterator-helpers": {
3813
+
"version": "1.2.1",
3814
+
"resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz",
3815
+
"integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==",
3816
+
"dev": true,
3817
+
"license": "MIT",
3818
+
"dependencies": {
3819
+
"call-bind": "^1.0.8",
3820
+
"call-bound": "^1.0.3",
3821
+
"define-properties": "^1.2.1",
3822
+
"es-abstract": "^1.23.6",
3823
+
"es-errors": "^1.3.0",
3824
+
"es-set-tostringtag": "^2.0.3",
3825
+
"function-bind": "^1.1.2",
3826
+
"get-intrinsic": "^1.2.6",
3827
+
"globalthis": "^1.0.4",
3828
+
"gopd": "^1.2.0",
3829
+
"has-property-descriptors": "^1.0.2",
3830
+
"has-proto": "^1.2.0",
3831
+
"has-symbols": "^1.1.0",
3832
+
"internal-slot": "^1.1.0",
3833
+
"iterator.prototype": "^1.1.4",
3834
+
"safe-array-concat": "^1.1.3"
3835
+
},
3836
+
"engines": {
3837
+
"node": ">= 0.4"
3838
+
}
3839
+
},
3840
+
"node_modules/es-object-atoms": {
3841
+
"version": "1.1.1",
3842
+
"resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
3843
+
"integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
3844
+
"dev": true,
3845
+
"license": "MIT",
3846
+
"dependencies": {
3847
+
"es-errors": "^1.3.0"
3848
+
},
3849
+
"engines": {
3850
+
"node": ">= 0.4"
3851
+
}
3852
+
},
3853
+
"node_modules/es-set-tostringtag": {
3854
+
"version": "2.1.0",
3855
+
"resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
3856
+
"integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
3857
+
"dev": true,
3858
+
"license": "MIT",
3859
+
"dependencies": {
3860
+
"es-errors": "^1.3.0",
3861
+
"get-intrinsic": "^1.2.6",
3862
+
"has-tostringtag": "^1.0.2",
3863
+
"hasown": "^2.0.2"
3864
+
},
3865
+
"engines": {
3866
+
"node": ">= 0.4"
3867
+
}
3868
+
},
3869
+
"node_modules/es-shim-unscopables": {
3870
+
"version": "1.1.0",
3871
+
"resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz",
3872
+
"integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==",
3873
+
"dev": true,
3874
+
"license": "MIT",
3875
+
"dependencies": {
3876
+
"hasown": "^2.0.2"
3877
+
},
3878
+
"engines": {
3879
+
"node": ">= 0.4"
3880
+
}
3881
+
},
3882
+
"node_modules/es-to-primitive": {
3883
+
"version": "1.3.0",
3884
+
"resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz",
3885
+
"integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==",
3886
+
"dev": true,
3887
+
"license": "MIT",
3888
+
"dependencies": {
3889
+
"is-callable": "^1.2.7",
3890
+
"is-date-object": "^1.0.5",
3891
+
"is-symbol": "^1.0.4"
3892
+
},
3893
+
"engines": {
3894
+
"node": ">= 0.4"
3895
+
},
3896
+
"funding": {
3897
+
"url": "https://github.com/sponsors/ljharb"
3898
+
}
3899
+
},
3900
+
"node_modules/esbuild": {
3901
+
"version": "0.25.2",
3902
+
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.2.tgz",
3903
+
"integrity": "sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==",
3904
+
"dev": true,
3905
+
"hasInstallScript": true,
3906
+
"license": "MIT",
3907
+
"bin": {
3908
+
"esbuild": "bin/esbuild"
3909
+
},
3910
+
"engines": {
3911
+
"node": ">=18"
3912
+
},
3913
+
"optionalDependencies": {
3914
+
"@esbuild/aix-ppc64": "0.25.2",
3915
+
"@esbuild/android-arm": "0.25.2",
3916
+
"@esbuild/android-arm64": "0.25.2",
3917
+
"@esbuild/android-x64": "0.25.2",
3918
+
"@esbuild/darwin-arm64": "0.25.2",
3919
+
"@esbuild/darwin-x64": "0.25.2",
3920
+
"@esbuild/freebsd-arm64": "0.25.2",
3921
+
"@esbuild/freebsd-x64": "0.25.2",
3922
+
"@esbuild/linux-arm": "0.25.2",
3923
+
"@esbuild/linux-arm64": "0.25.2",
3924
+
"@esbuild/linux-ia32": "0.25.2",
3925
+
"@esbuild/linux-loong64": "0.25.2",
3926
+
"@esbuild/linux-mips64el": "0.25.2",
3927
+
"@esbuild/linux-ppc64": "0.25.2",
3928
+
"@esbuild/linux-riscv64": "0.25.2",
3929
+
"@esbuild/linux-s390x": "0.25.2",
3930
+
"@esbuild/linux-x64": "0.25.2",
3931
+
"@esbuild/netbsd-arm64": "0.25.2",
3932
+
"@esbuild/netbsd-x64": "0.25.2",
3933
+
"@esbuild/openbsd-arm64": "0.25.2",
3934
+
"@esbuild/openbsd-x64": "0.25.2",
3935
+
"@esbuild/sunos-x64": "0.25.2",
3936
+
"@esbuild/win32-arm64": "0.25.2",
3937
+
"@esbuild/win32-ia32": "0.25.2",
3938
+
"@esbuild/win32-x64": "0.25.2"
3939
+
}
3940
+
},
3941
+
"node_modules/escalade": {
3942
+
"version": "3.2.0",
3943
+
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
3944
+
"integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
3945
+
"license": "MIT",
3946
+
"engines": {
3947
+
"node": ">=6"
3948
+
}
3949
+
},
3950
+
"node_modules/escape-string-regexp": {
3951
+
"version": "4.0.0",
3952
+
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
3953
+
"integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
3954
+
"dev": true,
3955
+
"license": "MIT",
3956
+
"engines": {
3957
+
"node": ">=10"
3958
+
},
3959
+
"funding": {
3960
+
"url": "https://github.com/sponsors/sindresorhus"
3961
+
}
3962
+
},
3963
+
"node_modules/eslint": {
3964
+
"version": "9.37.0",
3965
+
"resolved": "https://registry.npmjs.org/eslint/-/eslint-9.37.0.tgz",
3966
+
"integrity": "sha512-XyLmROnACWqSxiGYArdef1fItQd47weqB7iwtfr9JHwRrqIXZdcFMvvEcL9xHCmL0SNsOvF0c42lWyM1U5dgig==",
3967
+
"dev": true,
3968
+
"license": "MIT",
3969
+
"dependencies": {
3970
+
"@eslint-community/eslint-utils": "^4.8.0",
3971
+
"@eslint-community/regexpp": "^4.12.1",
3972
+
"@eslint/config-array": "^0.21.0",
3973
+
"@eslint/config-helpers": "^0.4.0",
3974
+
"@eslint/core": "^0.16.0",
3975
+
"@eslint/eslintrc": "^3.3.1",
3976
+
"@eslint/js": "9.37.0",
3977
+
"@eslint/plugin-kit": "^0.4.0",
3978
+
"@humanfs/node": "^0.16.6",
3979
+
"@humanwhocodes/module-importer": "^1.0.1",
3980
+
"@humanwhocodes/retry": "^0.4.2",
3981
+
"@types/estree": "^1.0.6",
3982
+
"@types/json-schema": "^7.0.15",
3983
+
"ajv": "^6.12.4",
3984
+
"chalk": "^4.0.0",
3985
+
"cross-spawn": "^7.0.6",
3986
+
"debug": "^4.3.2",
3987
+
"escape-string-regexp": "^4.0.0",
3988
+
"eslint-scope": "^8.4.0",
3989
+
"eslint-visitor-keys": "^4.2.1",
3990
+
"espree": "^10.4.0",
3991
+
"esquery": "^1.5.0",
3992
+
"esutils": "^2.0.2",
3993
+
"fast-deep-equal": "^3.1.3",
3994
+
"file-entry-cache": "^8.0.0",
3995
+
"find-up": "^5.0.0",
3996
+
"glob-parent": "^6.0.2",
3997
+
"ignore": "^5.2.0",
3998
+
"imurmurhash": "^0.1.4",
3999
+
"is-glob": "^4.0.0",
4000
+
"json-stable-stringify-without-jsonify": "^1.0.1",
4001
+
"lodash.merge": "^4.6.2",
4002
+
"minimatch": "^3.1.2",
4003
+
"natural-compare": "^1.4.0",
4004
+
"optionator": "^0.9.3"
4005
+
},
4006
+
"bin": {
4007
+
"eslint": "bin/eslint.js"
4008
+
},
4009
+
"engines": {
4010
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
4011
+
},
4012
+
"funding": {
4013
+
"url": "https://eslint.org/donate"
4014
+
},
4015
+
"peerDependencies": {
4016
+
"jiti": "*"
4017
+
},
4018
+
"peerDependenciesMeta": {
4019
+
"jiti": {
4020
+
"optional": true
4021
+
}
4022
+
}
4023
+
},
4024
+
"node_modules/eslint-config-prettier": {
4025
+
"version": "10.1.1",
4026
+
"resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.1.tgz",
4027
+
"integrity": "sha512-4EQQr6wXwS+ZJSzaR5ZCrYgLxqvUjdXctaEtBqHcbkW944B1NQyO4qpdHQbXBONfwxXdkAY81HH4+LUfrg+zPw==",
4028
+
"dev": true,
4029
+
"license": "MIT",
4030
+
"bin": {
4031
+
"eslint-config-prettier": "bin/cli.js"
4032
+
},
4033
+
"peerDependencies": {
4034
+
"eslint": ">=7.0.0"
4035
+
}
4036
+
},
4037
+
"node_modules/eslint-plugin-prettier": {
4038
+
"version": "5.2.6",
4039
+
"resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.6.tgz",
4040
+
"integrity": "sha512-mUcf7QG2Tjk7H055Jk0lGBjbgDnfrvqjhXh9t2xLMSCjZVcw9Rb1V6sVNXO0th3jgeO7zllWPTNRil3JW94TnQ==",
4041
+
"dev": true,
4042
+
"license": "MIT",
4043
+
"dependencies": {
4044
+
"prettier-linter-helpers": "^1.0.0",
4045
+
"synckit": "^0.11.0"
4046
+
},
4047
+
"engines": {
4048
+
"node": "^14.18.0 || >=16.0.0"
4049
+
},
4050
+
"funding": {
4051
+
"url": "https://opencollective.com/eslint-plugin-prettier"
4052
+
},
4053
+
"peerDependencies": {
4054
+
"@types/eslint": ">=8.0.0",
4055
+
"eslint": ">=8.0.0",
4056
+
"eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0",
4057
+
"prettier": ">=3.0.0"
4058
+
},
4059
+
"peerDependenciesMeta": {
4060
+
"@types/eslint": {
4061
+
"optional": true
4062
+
},
4063
+
"eslint-config-prettier": {
4064
+
"optional": true
4065
+
}
4066
+
}
4067
+
},
4068
+
"node_modules/eslint-plugin-react": {
4069
+
"version": "7.37.5",
4070
+
"resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz",
4071
+
"integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==",
4072
+
"dev": true,
4073
+
"license": "MIT",
4074
+
"dependencies": {
4075
+
"array-includes": "^3.1.8",
4076
+
"array.prototype.findlast": "^1.2.5",
4077
+
"array.prototype.flatmap": "^1.3.3",
4078
+
"array.prototype.tosorted": "^1.1.4",
4079
+
"doctrine": "^2.1.0",
4080
+
"es-iterator-helpers": "^1.2.1",
4081
+
"estraverse": "^5.3.0",
4082
+
"hasown": "^2.0.2",
4083
+
"jsx-ast-utils": "^2.4.1 || ^3.0.0",
4084
+
"minimatch": "^3.1.2",
4085
+
"object.entries": "^1.1.9",
4086
+
"object.fromentries": "^2.0.8",
4087
+
"object.values": "^1.2.1",
4088
+
"prop-types": "^15.8.1",
4089
+
"resolve": "^2.0.0-next.5",
4090
+
"semver": "^6.3.1",
4091
+
"string.prototype.matchall": "^4.0.12",
4092
+
"string.prototype.repeat": "^1.0.0"
4093
+
},
4094
+
"engines": {
4095
+
"node": ">=4"
4096
+
},
4097
+
"peerDependencies": {
4098
+
"eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7"
4099
+
}
4100
+
},
4101
+
"node_modules/eslint-plugin-react-hooks": {
4102
+
"version": "5.2.0",
4103
+
"resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz",
4104
+
"integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==",
4105
+
"dev": true,
4106
+
"license": "MIT",
4107
+
"engines": {
4108
+
"node": ">=10"
4109
+
},
4110
+
"peerDependencies": {
4111
+
"eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0"
4112
+
}
4113
+
},
4114
+
"node_modules/eslint-plugin-react-refresh": {
4115
+
"version": "0.4.19",
4116
+
"resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.19.tgz",
4117
+
"integrity": "sha512-eyy8pcr/YxSYjBoqIFSrlbn9i/xvxUFa8CjzAYo9cFjgGXqq1hyjihcpZvxRLalpaWmueWR81xn7vuKmAFijDQ==",
4118
+
"dev": true,
4119
+
"license": "MIT",
4120
+
"peerDependencies": {
4121
+
"eslint": ">=8.40"
4122
+
}
4123
+
},
4124
+
"node_modules/eslint-plugin-react/node_modules/brace-expansion": {
4125
+
"version": "1.1.12",
4126
+
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
4127
+
"integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
4128
+
"dev": true,
4129
+
"license": "MIT",
4130
+
"dependencies": {
4131
+
"balanced-match": "^1.0.0",
4132
+
"concat-map": "0.0.1"
4133
+
}
4134
+
},
4135
+
"node_modules/eslint-plugin-react/node_modules/minimatch": {
4136
+
"version": "3.1.2",
4137
+
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
4138
+
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
4139
+
"dev": true,
4140
+
"license": "ISC",
4141
+
"dependencies": {
4142
+
"brace-expansion": "^1.1.7"
4143
+
},
4144
+
"engines": {
4145
+
"node": "*"
4146
+
}
4147
+
},
4148
+
"node_modules/eslint-plugin-react/node_modules/semver": {
4149
+
"version": "6.3.1",
4150
+
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
4151
+
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
4152
+
"dev": true,
4153
+
"license": "ISC",
4154
+
"bin": {
4155
+
"semver": "bin/semver.js"
4156
+
}
4157
+
},
4158
+
"node_modules/eslint-scope": {
4159
+
"version": "8.4.0",
4160
+
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz",
4161
+
"integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==",
4162
+
"dev": true,
4163
+
"license": "BSD-2-Clause",
4164
+
"dependencies": {
4165
+
"esrecurse": "^4.3.0",
4166
+
"estraverse": "^5.2.0"
4167
+
},
4168
+
"engines": {
4169
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
4170
+
},
4171
+
"funding": {
4172
+
"url": "https://opencollective.com/eslint"
4173
+
}
4174
+
},
4175
+
"node_modules/eslint-visitor-keys": {
4176
+
"version": "3.4.3",
4177
+
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
4178
+
"integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
4179
+
"dev": true,
4180
+
"license": "Apache-2.0",
4181
+
"engines": {
4182
+
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
4183
+
},
4184
+
"funding": {
4185
+
"url": "https://opencollective.com/eslint"
4186
+
}
4187
+
},
4188
+
"node_modules/eslint/node_modules/ajv": {
4189
+
"version": "6.12.6",
4190
+
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
4191
+
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
4192
+
"dev": true,
4193
+
"license": "MIT",
4194
+
"dependencies": {
4195
+
"fast-deep-equal": "^3.1.1",
4196
+
"fast-json-stable-stringify": "^2.0.0",
4197
+
"json-schema-traverse": "^0.4.1",
4198
+
"uri-js": "^4.2.2"
4199
+
},
4200
+
"funding": {
4201
+
"type": "github",
4202
+
"url": "https://github.com/sponsors/epoberezkin"
4203
+
}
4204
+
},
4205
+
"node_modules/eslint/node_modules/brace-expansion": {
4206
+
"version": "1.1.12",
4207
+
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
4208
+
"integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
4209
+
"dev": true,
4210
+
"license": "MIT",
4211
+
"dependencies": {
4212
+
"balanced-match": "^1.0.0",
4213
+
"concat-map": "0.0.1"
4214
+
}
4215
+
},
4216
+
"node_modules/eslint/node_modules/eslint-visitor-keys": {
4217
+
"version": "4.2.1",
4218
+
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
4219
+
"integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
4220
+
"dev": true,
4221
+
"license": "Apache-2.0",
4222
+
"engines": {
4223
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
4224
+
},
4225
+
"funding": {
4226
+
"url": "https://opencollective.com/eslint"
4227
+
}
4228
+
},
4229
+
"node_modules/eslint/node_modules/json-schema-traverse": {
4230
+
"version": "0.4.1",
4231
+
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
4232
+
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
4233
+
"dev": true,
4234
+
"license": "MIT"
4235
+
},
4236
+
"node_modules/eslint/node_modules/minimatch": {
4237
+
"version": "3.1.2",
4238
+
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
4239
+
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
4240
+
"dev": true,
4241
+
"license": "ISC",
4242
+
"dependencies": {
4243
+
"brace-expansion": "^1.1.7"
4244
+
},
4245
+
"engines": {
4246
+
"node": "*"
4247
+
}
4248
+
},
4249
+
"node_modules/espree": {
4250
+
"version": "10.4.0",
4251
+
"resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
4252
+
"integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
4253
+
"dev": true,
4254
+
"license": "BSD-2-Clause",
4255
+
"dependencies": {
4256
+
"acorn": "^8.15.0",
4257
+
"acorn-jsx": "^5.3.2",
4258
+
"eslint-visitor-keys": "^4.2.1"
4259
+
},
4260
+
"engines": {
4261
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
4262
+
},
4263
+
"funding": {
4264
+
"url": "https://opencollective.com/eslint"
4265
+
}
4266
+
},
4267
+
"node_modules/espree/node_modules/eslint-visitor-keys": {
4268
+
"version": "4.2.1",
4269
+
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
4270
+
"integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
4271
+
"dev": true,
4272
+
"license": "Apache-2.0",
4273
+
"engines": {
4274
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
4275
+
},
4276
+
"funding": {
4277
+
"url": "https://opencollective.com/eslint"
4278
+
}
4279
+
},
4280
+
"node_modules/esquery": {
4281
+
"version": "1.6.0",
4282
+
"resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
4283
+
"integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
4284
+
"dev": true,
4285
+
"license": "BSD-3-Clause",
4286
+
"dependencies": {
4287
+
"estraverse": "^5.1.0"
4288
+
},
4289
+
"engines": {
4290
+
"node": ">=0.10"
4291
+
}
4292
+
},
4293
+
"node_modules/esrecurse": {
4294
+
"version": "4.3.0",
4295
+
"resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
4296
+
"integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
4297
+
"dev": true,
4298
+
"license": "BSD-2-Clause",
4299
+
"dependencies": {
4300
+
"estraverse": "^5.2.0"
4301
+
},
4302
+
"engines": {
4303
+
"node": ">=4.0"
4304
+
}
4305
+
},
4306
+
"node_modules/estraverse": {
4307
+
"version": "5.3.0",
4308
+
"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
4309
+
"integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
4310
+
"dev": true,
4311
+
"license": "BSD-2-Clause",
4312
+
"engines": {
4313
+
"node": ">=4.0"
4314
+
}
4315
+
},
4316
+
"node_modules/esutils": {
4317
+
"version": "2.0.3",
4318
+
"resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
4319
+
"integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
4320
+
"dev": true,
4321
+
"license": "BSD-2-Clause",
4322
+
"engines": {
4323
+
"node": ">=0.10.0"
4324
+
}
4325
+
},
4326
+
"node_modules/expect-type": {
4327
+
"version": "1.2.1",
4328
+
"resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.1.tgz",
4329
+
"integrity": "sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==",
4330
+
"dev": true,
4331
+
"license": "Apache-2.0",
4332
+
"engines": {
4333
+
"node": ">=12.0.0"
4334
+
}
4335
+
},
4336
+
"node_modules/fast-deep-equal": {
4337
+
"version": "3.1.3",
4338
+
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
4339
+
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
4340
+
"dev": true,
4341
+
"license": "MIT"
4342
+
},
4343
+
"node_modules/fast-diff": {
4344
+
"version": "1.3.0",
4345
+
"resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz",
4346
+
"integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==",
4347
+
"dev": true,
4348
+
"license": "Apache-2.0"
4349
+
},
4350
+
"node_modules/fast-glob": {
4351
+
"version": "3.3.3",
4352
+
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
4353
+
"integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
4354
+
"license": "MIT",
4355
+
"dependencies": {
4356
+
"@nodelib/fs.stat": "^2.0.2",
4357
+
"@nodelib/fs.walk": "^1.2.3",
4358
+
"glob-parent": "^5.1.2",
4359
+
"merge2": "^1.3.0",
4360
+
"micromatch": "^4.0.8"
4361
+
},
4362
+
"engines": {
4363
+
"node": ">=8.6.0"
4364
+
}
4365
+
},
4366
+
"node_modules/fast-glob/node_modules/glob-parent": {
4367
+
"version": "5.1.2",
4368
+
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
4369
+
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
4370
+
"license": "ISC",
4371
+
"dependencies": {
4372
+
"is-glob": "^4.0.1"
4373
+
},
4374
+
"engines": {
4375
+
"node": ">= 6"
4376
+
}
4377
+
},
4378
+
"node_modules/fast-json-stable-stringify": {
4379
+
"version": "2.1.0",
4380
+
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
4381
+
"integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
4382
+
"dev": true,
4383
+
"license": "MIT"
4384
+
},
4385
+
"node_modules/fast-levenshtein": {
4386
+
"version": "2.0.6",
4387
+
"resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
4388
+
"integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
4389
+
"dev": true,
4390
+
"license": "MIT"
4391
+
},
4392
+
"node_modules/fast-uri": {
4393
+
"version": "3.0.6",
4394
+
"resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz",
4395
+
"integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==",
4396
+
"dev": true,
4397
+
"funding": [
4398
+
{
4399
+
"type": "github",
4400
+
"url": "https://github.com/sponsors/fastify"
4401
+
},
4402
+
{
4403
+
"type": "opencollective",
4404
+
"url": "https://opencollective.com/fastify"
4405
+
}
4406
+
],
4407
+
"license": "BSD-3-Clause"
4408
+
},
4409
+
"node_modules/fastq": {
4410
+
"version": "1.19.1",
4411
+
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz",
4412
+
"integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==",
4413
+
"license": "ISC",
4414
+
"dependencies": {
4415
+
"reusify": "^1.0.4"
4416
+
}
4417
+
},
4418
+
"node_modules/file-entry-cache": {
4419
+
"version": "8.0.0",
4420
+
"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
4421
+
"integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
4422
+
"dev": true,
4423
+
"license": "MIT",
4424
+
"dependencies": {
4425
+
"flat-cache": "^4.0.0"
4426
+
},
4427
+
"engines": {
4428
+
"node": ">=16.0.0"
4429
+
}
4430
+
},
4431
+
"node_modules/fill-range": {
4432
+
"version": "7.1.1",
4433
+
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
4434
+
"integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
4435
+
"license": "MIT",
4436
+
"dependencies": {
4437
+
"to-regex-range": "^5.0.1"
4438
+
},
4439
+
"engines": {
4440
+
"node": ">=8"
4441
+
}
4442
+
},
4443
+
"node_modules/find-config": {
4444
+
"version": "1.0.0",
4445
+
"resolved": "https://registry.npmjs.org/find-config/-/find-config-1.0.0.tgz",
4446
+
"integrity": "sha512-Z+suHH+7LSE40WfUeZPIxSxypCWvrzdVc60xAjUShZeT5eMWM0/FQUduq3HjluyfAHWvC/aOBkT1pTZktyF/jg==",
4447
+
"dev": true,
4448
+
"license": "MIT",
4449
+
"dependencies": {
4450
+
"user-home": "^2.0.0"
4451
+
},
4452
+
"engines": {
4453
+
"node": ">= 0.12"
4454
+
}
4455
+
},
4456
+
"node_modules/find-up": {
4457
+
"version": "5.0.0",
4458
+
"resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
4459
+
"integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
4460
+
"dev": true,
4461
+
"license": "MIT",
4462
+
"dependencies": {
4463
+
"locate-path": "^6.0.0",
4464
+
"path-exists": "^4.0.0"
4465
+
},
4466
+
"engines": {
4467
+
"node": ">=10"
4468
+
},
4469
+
"funding": {
4470
+
"url": "https://github.com/sponsors/sindresorhus"
4471
+
}
4472
+
},
4473
+
"node_modules/flat-cache": {
4474
+
"version": "4.0.1",
4475
+
"resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
4476
+
"integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
4477
+
"dev": true,
4478
+
"license": "MIT",
4479
+
"dependencies": {
4480
+
"flatted": "^3.2.9",
4481
+
"keyv": "^4.5.4"
4482
+
},
4483
+
"engines": {
4484
+
"node": ">=16"
4485
+
}
4486
+
},
4487
+
"node_modules/flatted": {
4488
+
"version": "3.3.3",
4489
+
"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz",
4490
+
"integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==",
4491
+
"dev": true,
4492
+
"license": "ISC"
4493
+
},
4494
+
"node_modules/for-each": {
4495
+
"version": "0.3.5",
4496
+
"resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz",
4497
+
"integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==",
4498
+
"dev": true,
4499
+
"license": "MIT",
4500
+
"dependencies": {
4501
+
"is-callable": "^1.2.7"
4502
+
},
4503
+
"engines": {
4504
+
"node": ">= 0.4"
4505
+
},
4506
+
"funding": {
4507
+
"url": "https://github.com/sponsors/ljharb"
4508
+
}
4509
+
},
4510
+
"node_modules/foreground-child": {
4511
+
"version": "3.3.1",
4512
+
"resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
4513
+
"integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==",
4514
+
"license": "ISC",
4515
+
"dependencies": {
4516
+
"cross-spawn": "^7.0.6",
4517
+
"signal-exit": "^4.0.1"
4518
+
},
4519
+
"engines": {
4520
+
"node": ">=14"
4521
+
},
4522
+
"funding": {
4523
+
"url": "https://github.com/sponsors/isaacs"
4524
+
}
4525
+
},
4526
+
"node_modules/form-data": {
4527
+
"version": "4.0.4",
4528
+
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz",
4529
+
"integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==",
4530
+
"dev": true,
4531
+
"license": "MIT",
4532
+
"dependencies": {
4533
+
"asynckit": "^0.4.0",
4534
+
"combined-stream": "^1.0.8",
4535
+
"es-set-tostringtag": "^2.1.0",
4536
+
"hasown": "^2.0.2",
4537
+
"mime-types": "^2.1.12"
4538
+
},
4539
+
"engines": {
4540
+
"node": ">= 6"
4541
+
}
4542
+
},
4543
+
"node_modules/fraction.js": {
4544
+
"version": "4.3.7",
4545
+
"resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz",
4546
+
"integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==",
4547
+
"license": "MIT",
4548
+
"engines": {
4549
+
"node": "*"
4550
+
},
4551
+
"funding": {
4552
+
"type": "patreon",
4553
+
"url": "https://github.com/sponsors/rawify"
4554
+
}
4555
+
},
4556
+
"node_modules/fsevents": {
4557
+
"version": "2.3.3",
4558
+
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
4559
+
"integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
4560
+
"hasInstallScript": true,
4561
+
"license": "MIT",
4562
+
"optional": true,
4563
+
"os": [
4564
+
"darwin"
4565
+
],
4566
+
"engines": {
4567
+
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
4568
+
}
4569
+
},
4570
+
"node_modules/function-bind": {
4571
+
"version": "1.1.2",
4572
+
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
4573
+
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
4574
+
"license": "MIT",
4575
+
"funding": {
4576
+
"url": "https://github.com/sponsors/ljharb"
4577
+
}
4578
+
},
4579
+
"node_modules/function.prototype.name": {
4580
+
"version": "1.1.8",
4581
+
"resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz",
4582
+
"integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==",
4583
+
"dev": true,
4584
+
"license": "MIT",
4585
+
"dependencies": {
4586
+
"call-bind": "^1.0.8",
4587
+
"call-bound": "^1.0.3",
4588
+
"define-properties": "^1.2.1",
4589
+
"functions-have-names": "^1.2.3",
4590
+
"hasown": "^2.0.2",
4591
+
"is-callable": "^1.2.7"
4592
+
},
4593
+
"engines": {
4594
+
"node": ">= 0.4"
4595
+
},
4596
+
"funding": {
4597
+
"url": "https://github.com/sponsors/ljharb"
4598
+
}
4599
+
},
4600
+
"node_modules/functions-have-names": {
4601
+
"version": "1.2.3",
4602
+
"resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
4603
+
"integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
4604
+
"dev": true,
4605
+
"license": "MIT",
4606
+
"funding": {
4607
+
"url": "https://github.com/sponsors/ljharb"
4608
+
}
4609
+
},
4610
+
"node_modules/gensync": {
4611
+
"version": "1.0.0-beta.2",
4612
+
"resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
4613
+
"integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
4614
+
"dev": true,
4615
+
"license": "MIT",
4616
+
"engines": {
4617
+
"node": ">=6.9.0"
4618
+
}
4619
+
},
4620
+
"node_modules/get-caller-file": {
4621
+
"version": "2.0.5",
4622
+
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
4623
+
"integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
4624
+
"dev": true,
4625
+
"license": "ISC",
4626
+
"engines": {
4627
+
"node": "6.* || 8.* || >= 10.*"
4628
+
}
4629
+
},
4630
+
"node_modules/get-intrinsic": {
4631
+
"version": "1.3.0",
4632
+
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
4633
+
"integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
4634
+
"dev": true,
4635
+
"license": "MIT",
4636
+
"dependencies": {
4637
+
"call-bind-apply-helpers": "^1.0.2",
4638
+
"es-define-property": "^1.0.1",
4639
+
"es-errors": "^1.3.0",
4640
+
"es-object-atoms": "^1.1.1",
4641
+
"function-bind": "^1.1.2",
4642
+
"get-proto": "^1.0.1",
4643
+
"gopd": "^1.2.0",
4644
+
"has-symbols": "^1.1.0",
4645
+
"hasown": "^2.0.2",
4646
+
"math-intrinsics": "^1.1.0"
4647
+
},
4648
+
"engines": {
4649
+
"node": ">= 0.4"
4650
+
},
4651
+
"funding": {
4652
+
"url": "https://github.com/sponsors/ljharb"
4653
+
}
4654
+
},
4655
+
"node_modules/get-proto": {
4656
+
"version": "1.0.1",
4657
+
"resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
4658
+
"integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
4659
+
"dev": true,
4660
+
"license": "MIT",
4661
+
"dependencies": {
4662
+
"dunder-proto": "^1.0.1",
4663
+
"es-object-atoms": "^1.0.0"
4664
+
},
4665
+
"engines": {
4666
+
"node": ">= 0.4"
4667
+
}
4668
+
},
4669
+
"node_modules/get-stdin": {
4670
+
"version": "9.0.0",
4671
+
"resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz",
4672
+
"integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==",
4673
+
"dev": true,
4674
+
"license": "MIT",
4675
+
"engines": {
4676
+
"node": ">=12"
4677
+
},
4678
+
"funding": {
4679
+
"url": "https://github.com/sponsors/sindresorhus"
4680
+
}
4681
+
},
4682
+
"node_modules/get-symbol-description": {
4683
+
"version": "1.1.0",
4684
+
"resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz",
4685
+
"integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==",
4686
+
"dev": true,
4687
+
"license": "MIT",
4688
+
"dependencies": {
4689
+
"call-bound": "^1.0.3",
4690
+
"es-errors": "^1.3.0",
4691
+
"get-intrinsic": "^1.2.6"
4692
+
},
4693
+
"engines": {
4694
+
"node": ">= 0.4"
4695
+
},
4696
+
"funding": {
4697
+
"url": "https://github.com/sponsors/ljharb"
4698
+
}
4699
+
},
4700
+
"node_modules/get-tsconfig": {
4701
+
"version": "4.10.0",
4702
+
"resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.0.tgz",
4703
+
"integrity": "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==",
4704
+
"dev": true,
4705
+
"license": "MIT",
4706
+
"dependencies": {
4707
+
"resolve-pkg-maps": "^1.0.0"
4708
+
},
4709
+
"funding": {
4710
+
"url": "https://github.com/privatenumber/get-tsconfig?sponsor=1"
4711
+
}
4712
+
},
4713
+
"node_modules/git-hooks-list": {
4714
+
"version": "3.2.0",
4715
+
"resolved": "https://registry.npmjs.org/git-hooks-list/-/git-hooks-list-3.2.0.tgz",
4716
+
"integrity": "sha512-ZHG9a1gEhUMX1TvGrLdyWb9kDopCBbTnI8z4JgRMYxsijWipgjSEYoPWqBuIB0DnRnvqlQSEeVmzpeuPm7NdFQ==",
4717
+
"dev": true,
4718
+
"license": "MIT",
4719
+
"funding": {
4720
+
"url": "https://github.com/fisker/git-hooks-list?sponsor=1"
4721
+
}
4722
+
},
4723
+
"node_modules/glob": {
4724
+
"version": "10.4.5",
4725
+
"resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
4726
+
"integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
4727
+
"license": "ISC",
4728
+
"dependencies": {
4729
+
"foreground-child": "^3.1.0",
4730
+
"jackspeak": "^3.1.2",
4731
+
"minimatch": "^9.0.4",
4732
+
"minipass": "^7.1.2",
4733
+
"package-json-from-dist": "^1.0.0",
4734
+
"path-scurry": "^1.11.1"
4735
+
},
4736
+
"bin": {
4737
+
"glob": "dist/esm/bin.mjs"
4738
+
},
4739
+
"funding": {
4740
+
"url": "https://github.com/sponsors/isaacs"
4741
+
}
4742
+
},
4743
+
"node_modules/glob-parent": {
4744
+
"version": "6.0.2",
4745
+
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
4746
+
"integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
4747
+
"license": "ISC",
4748
+
"dependencies": {
4749
+
"is-glob": "^4.0.3"
4750
+
},
4751
+
"engines": {
4752
+
"node": ">=10.13.0"
4753
+
}
4754
+
},
4755
+
"node_modules/globals": {
4756
+
"version": "15.15.0",
4757
+
"resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz",
4758
+
"integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==",
4759
+
"dev": true,
4760
+
"license": "MIT",
4761
+
"engines": {
4762
+
"node": ">=18"
4763
+
},
4764
+
"funding": {
4765
+
"url": "https://github.com/sponsors/sindresorhus"
4766
+
}
4767
+
},
4768
+
"node_modules/globalthis": {
4769
+
"version": "1.0.4",
4770
+
"resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz",
4771
+
"integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==",
4772
+
"dev": true,
4773
+
"license": "MIT",
4774
+
"dependencies": {
4775
+
"define-properties": "^1.2.1",
4776
+
"gopd": "^1.0.1"
4777
+
},
4778
+
"engines": {
4779
+
"node": ">= 0.4"
4780
+
},
4781
+
"funding": {
4782
+
"url": "https://github.com/sponsors/ljharb"
4783
+
}
4784
+
},
4785
+
"node_modules/gopd": {
4786
+
"version": "1.2.0",
4787
+
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
4788
+
"integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
4789
+
"dev": true,
4790
+
"license": "MIT",
4791
+
"engines": {
4792
+
"node": ">= 0.4"
4793
+
},
4794
+
"funding": {
4795
+
"url": "https://github.com/sponsors/ljharb"
4796
+
}
4797
+
},
4798
+
"node_modules/graphemer": {
4799
+
"version": "1.4.0",
4800
+
"resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
4801
+
"integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
4802
+
"dev": true,
4803
+
"license": "MIT"
4804
+
},
4805
+
"node_modules/has-bigints": {
4806
+
"version": "1.1.0",
4807
+
"resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz",
4808
+
"integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==",
4809
+
"dev": true,
4810
+
"license": "MIT",
4811
+
"engines": {
4812
+
"node": ">= 0.4"
4813
+
},
4814
+
"funding": {
4815
+
"url": "https://github.com/sponsors/ljharb"
4816
+
}
4817
+
},
4818
+
"node_modules/has-flag": {
4819
+
"version": "4.0.0",
4820
+
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
4821
+
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
4822
+
"dev": true,
4823
+
"license": "MIT",
4824
+
"engines": {
4825
+
"node": ">=8"
4826
+
}
4827
+
},
4828
+
"node_modules/has-property-descriptors": {
4829
+
"version": "1.0.2",
4830
+
"resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
4831
+
"integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
4832
+
"dev": true,
4833
+
"license": "MIT",
4834
+
"dependencies": {
4835
+
"es-define-property": "^1.0.0"
4836
+
},
4837
+
"funding": {
4838
+
"url": "https://github.com/sponsors/ljharb"
4839
+
}
4840
+
},
4841
+
"node_modules/has-proto": {
4842
+
"version": "1.2.0",
4843
+
"resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz",
4844
+
"integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==",
4845
+
"dev": true,
4846
+
"license": "MIT",
4847
+
"dependencies": {
4848
+
"dunder-proto": "^1.0.0"
4849
+
},
4850
+
"engines": {
4851
+
"node": ">= 0.4"
4852
+
},
4853
+
"funding": {
4854
+
"url": "https://github.com/sponsors/ljharb"
4855
+
}
4856
+
},
4857
+
"node_modules/has-symbols": {
4858
+
"version": "1.1.0",
4859
+
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
4860
+
"integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
4861
+
"dev": true,
4862
+
"license": "MIT",
4863
+
"engines": {
4864
+
"node": ">= 0.4"
4865
+
},
4866
+
"funding": {
4867
+
"url": "https://github.com/sponsors/ljharb"
4868
+
}
4869
+
},
4870
+
"node_modules/has-tostringtag": {
4871
+
"version": "1.0.2",
4872
+
"resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
4873
+
"integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
4874
+
"dev": true,
4875
+
"license": "MIT",
4876
+
"dependencies": {
4877
+
"has-symbols": "^1.0.3"
4878
+
},
4879
+
"engines": {
4880
+
"node": ">= 0.4"
4881
+
},
4882
+
"funding": {
4883
+
"url": "https://github.com/sponsors/ljharb"
4884
+
}
4885
+
},
4886
+
"node_modules/hasown": {
4887
+
"version": "2.0.2",
4888
+
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
4889
+
"integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
4890
+
"license": "MIT",
4891
+
"dependencies": {
4892
+
"function-bind": "^1.1.2"
4893
+
},
4894
+
"engines": {
4895
+
"node": ">= 0.4"
4896
+
}
4897
+
},
4898
+
"node_modules/html-attribute-sorter": {
4899
+
"version": "0.4.3",
4900
+
"resolved": "https://registry.npmjs.org/html-attribute-sorter/-/html-attribute-sorter-0.4.3.tgz",
4901
+
"integrity": "sha512-HWSvaXJki44tg0uR1t+j5pRdUVpNiZcJaoB/PFhss/YoAw9cxUDLCpIBbLWQmKjBQfWk91P6LaRnredEyabrDw==",
4902
+
"dev": true,
4903
+
"license": "MIT",
4904
+
"engines": {
4905
+
"node": ">= 12.0.0"
4906
+
}
4907
+
},
4908
+
"node_modules/ignore": {
4909
+
"version": "5.3.2",
4910
+
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
4911
+
"integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
4912
+
"dev": true,
4913
+
"license": "MIT",
4914
+
"engines": {
4915
+
"node": ">= 4"
4916
+
}
4917
+
},
4918
+
"node_modules/import-fresh": {
4919
+
"version": "3.3.1",
4920
+
"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
4921
+
"integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
4922
+
"dev": true,
4923
+
"license": "MIT",
4924
+
"dependencies": {
4925
+
"parent-module": "^1.0.0",
4926
+
"resolve-from": "^4.0.0"
4927
+
},
4928
+
"engines": {
4929
+
"node": ">=6"
4930
+
},
4931
+
"funding": {
4932
+
"url": "https://github.com/sponsors/sindresorhus"
4933
+
}
4934
+
},
4935
+
"node_modules/imurmurhash": {
4936
+
"version": "0.1.4",
4937
+
"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
4938
+
"integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
4939
+
"dev": true,
4940
+
"license": "MIT",
4941
+
"engines": {
4942
+
"node": ">=0.8.19"
4943
+
}
4944
+
},
4945
+
"node_modules/inherits": {
4946
+
"version": "2.0.4",
4947
+
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
4948
+
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
4949
+
"dev": true,
4950
+
"license": "ISC"
4951
+
},
4952
+
"node_modules/ini": {
4953
+
"version": "1.3.8",
4954
+
"resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
4955
+
"integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
4956
+
"dev": true,
4957
+
"license": "ISC"
4958
+
},
4959
+
"node_modules/internal-slot": {
4960
+
"version": "1.1.0",
4961
+
"resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz",
4962
+
"integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==",
4963
+
"dev": true,
4964
+
"license": "MIT",
4965
+
"dependencies": {
4966
+
"es-errors": "^1.3.0",
4967
+
"hasown": "^2.0.2",
4968
+
"side-channel": "^1.1.0"
4969
+
},
4970
+
"engines": {
4971
+
"node": ">= 0.4"
4972
+
}
4973
+
},
4974
+
"node_modules/invariant": {
4975
+
"version": "2.2.4",
4976
+
"resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
4977
+
"integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
4978
+
"license": "MIT",
4979
+
"dependencies": {
4980
+
"loose-envify": "^1.0.0"
4981
+
}
4982
+
},
4983
+
"node_modules/is-array-buffer": {
4984
+
"version": "3.0.5",
4985
+
"resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz",
4986
+
"integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==",
4987
+
"dev": true,
4988
+
"license": "MIT",
4989
+
"dependencies": {
4990
+
"call-bind": "^1.0.8",
4991
+
"call-bound": "^1.0.3",
4992
+
"get-intrinsic": "^1.2.6"
4993
+
},
4994
+
"engines": {
4995
+
"node": ">= 0.4"
4996
+
},
4997
+
"funding": {
4998
+
"url": "https://github.com/sponsors/ljharb"
4999
+
}
5000
+
},
5001
+
"node_modules/is-async-function": {
5002
+
"version": "2.1.1",
5003
+
"resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz",
5004
+
"integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==",
5005
+
"dev": true,
5006
+
"license": "MIT",
5007
+
"dependencies": {
5008
+
"async-function": "^1.0.0",
5009
+
"call-bound": "^1.0.3",
5010
+
"get-proto": "^1.0.1",
5011
+
"has-tostringtag": "^1.0.2",
5012
+
"safe-regex-test": "^1.1.0"
5013
+
},
5014
+
"engines": {
5015
+
"node": ">= 0.4"
5016
+
},
5017
+
"funding": {
5018
+
"url": "https://github.com/sponsors/ljharb"
5019
+
}
5020
+
},
5021
+
"node_modules/is-bigint": {
5022
+
"version": "1.1.0",
5023
+
"resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz",
5024
+
"integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==",
5025
+
"dev": true,
5026
+
"license": "MIT",
5027
+
"dependencies": {
5028
+
"has-bigints": "^1.0.2"
5029
+
},
5030
+
"engines": {
5031
+
"node": ">= 0.4"
5032
+
},
5033
+
"funding": {
5034
+
"url": "https://github.com/sponsors/ljharb"
5035
+
}
5036
+
},
5037
+
"node_modules/is-binary-path": {
5038
+
"version": "2.1.0",
5039
+
"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
5040
+
"integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
5041
+
"license": "MIT",
5042
+
"dependencies": {
5043
+
"binary-extensions": "^2.0.0"
5044
+
},
5045
+
"engines": {
5046
+
"node": ">=8"
5047
+
}
5048
+
},
5049
+
"node_modules/is-boolean-object": {
5050
+
"version": "1.2.2",
5051
+
"resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz",
5052
+
"integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==",
5053
+
"dev": true,
5054
+
"license": "MIT",
5055
+
"dependencies": {
5056
+
"call-bound": "^1.0.3",
5057
+
"has-tostringtag": "^1.0.2"
5058
+
},
5059
+
"engines": {
5060
+
"node": ">= 0.4"
5061
+
},
5062
+
"funding": {
5063
+
"url": "https://github.com/sponsors/ljharb"
5064
+
}
5065
+
},
5066
+
"node_modules/is-callable": {
5067
+
"version": "1.2.7",
5068
+
"resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
5069
+
"integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
5070
+
"dev": true,
5071
+
"license": "MIT",
5072
+
"engines": {
5073
+
"node": ">= 0.4"
5074
+
},
5075
+
"funding": {
5076
+
"url": "https://github.com/sponsors/ljharb"
5077
+
}
5078
+
},
5079
+
"node_modules/is-core-module": {
5080
+
"version": "2.16.1",
5081
+
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
5082
+
"integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
5083
+
"license": "MIT",
5084
+
"dependencies": {
5085
+
"hasown": "^2.0.2"
5086
+
},
5087
+
"engines": {
5088
+
"node": ">= 0.4"
5089
+
},
5090
+
"funding": {
5091
+
"url": "https://github.com/sponsors/ljharb"
5092
+
}
5093
+
},
5094
+
"node_modules/is-data-view": {
5095
+
"version": "1.0.2",
5096
+
"resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz",
5097
+
"integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==",
5098
+
"dev": true,
5099
+
"license": "MIT",
5100
+
"dependencies": {
5101
+
"call-bound": "^1.0.2",
5102
+
"get-intrinsic": "^1.2.6",
5103
+
"is-typed-array": "^1.1.13"
5104
+
},
5105
+
"engines": {
5106
+
"node": ">= 0.4"
5107
+
},
5108
+
"funding": {
5109
+
"url": "https://github.com/sponsors/ljharb"
5110
+
}
5111
+
},
5112
+
"node_modules/is-date-object": {
5113
+
"version": "1.1.0",
5114
+
"resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz",
5115
+
"integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==",
5116
+
"dev": true,
5117
+
"license": "MIT",
5118
+
"dependencies": {
5119
+
"call-bound": "^1.0.2",
5120
+
"has-tostringtag": "^1.0.2"
5121
+
},
5122
+
"engines": {
5123
+
"node": ">= 0.4"
5124
+
},
5125
+
"funding": {
5126
+
"url": "https://github.com/sponsors/ljharb"
5127
+
}
5128
+
},
5129
+
"node_modules/is-extglob": {
5130
+
"version": "2.1.1",
5131
+
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
5132
+
"integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
5133
+
"license": "MIT",
5134
+
"engines": {
5135
+
"node": ">=0.10.0"
5136
+
}
5137
+
},
5138
+
"node_modules/is-finalizationregistry": {
5139
+
"version": "1.1.1",
5140
+
"resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz",
5141
+
"integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==",
5142
+
"dev": true,
5143
+
"license": "MIT",
5144
+
"dependencies": {
5145
+
"call-bound": "^1.0.3"
5146
+
},
5147
+
"engines": {
5148
+
"node": ">= 0.4"
5149
+
},
5150
+
"funding": {
5151
+
"url": "https://github.com/sponsors/ljharb"
5152
+
}
5153
+
},
5154
+
"node_modules/is-fullwidth-code-point": {
5155
+
"version": "3.0.0",
5156
+
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
5157
+
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
5158
+
"license": "MIT",
5159
+
"engines": {
5160
+
"node": ">=8"
5161
+
}
5162
+
},
5163
+
"node_modules/is-generator-function": {
5164
+
"version": "1.1.0",
5165
+
"resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz",
5166
+
"integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==",
5167
+
"dev": true,
5168
+
"license": "MIT",
5169
+
"dependencies": {
5170
+
"call-bound": "^1.0.3",
5171
+
"get-proto": "^1.0.0",
5172
+
"has-tostringtag": "^1.0.2",
5173
+
"safe-regex-test": "^1.1.0"
5174
+
},
5175
+
"engines": {
5176
+
"node": ">= 0.4"
5177
+
},
5178
+
"funding": {
5179
+
"url": "https://github.com/sponsors/ljharb"
5180
+
}
5181
+
},
5182
+
"node_modules/is-glob": {
5183
+
"version": "4.0.3",
5184
+
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
5185
+
"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
5186
+
"license": "MIT",
5187
+
"dependencies": {
5188
+
"is-extglob": "^2.1.1"
5189
+
},
5190
+
"engines": {
5191
+
"node": ">=0.10.0"
5192
+
}
5193
+
},
5194
+
"node_modules/is-map": {
5195
+
"version": "2.0.3",
5196
+
"resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz",
5197
+
"integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==",
5198
+
"dev": true,
5199
+
"license": "MIT",
5200
+
"engines": {
5201
+
"node": ">= 0.4"
5202
+
},
5203
+
"funding": {
5204
+
"url": "https://github.com/sponsors/ljharb"
5205
+
}
5206
+
},
5207
+
"node_modules/is-number": {
5208
+
"version": "7.0.0",
5209
+
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
5210
+
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
5211
+
"license": "MIT",
5212
+
"engines": {
5213
+
"node": ">=0.12.0"
5214
+
}
5215
+
},
5216
+
"node_modules/is-number-object": {
5217
+
"version": "1.1.1",
5218
+
"resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz",
5219
+
"integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==",
5220
+
"dev": true,
5221
+
"license": "MIT",
5222
+
"dependencies": {
5223
+
"call-bound": "^1.0.3",
5224
+
"has-tostringtag": "^1.0.2"
5225
+
},
5226
+
"engines": {
5227
+
"node": ">= 0.4"
5228
+
},
5229
+
"funding": {
5230
+
"url": "https://github.com/sponsors/ljharb"
5231
+
}
5232
+
},
5233
+
"node_modules/is-plain-obj": {
5234
+
"version": "4.1.0",
5235
+
"resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
5236
+
"integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
5237
+
"dev": true,
5238
+
"license": "MIT",
5239
+
"engines": {
5240
+
"node": ">=12"
5241
+
},
5242
+
"funding": {
5243
+
"url": "https://github.com/sponsors/sindresorhus"
5244
+
}
5245
+
},
5246
+
"node_modules/is-regex": {
5247
+
"version": "1.2.1",
5248
+
"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz",
5249
+
"integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==",
5250
+
"dev": true,
5251
+
"license": "MIT",
5252
+
"dependencies": {
5253
+
"call-bound": "^1.0.2",
5254
+
"gopd": "^1.2.0",
5255
+
"has-tostringtag": "^1.0.2",
5256
+
"hasown": "^2.0.2"
5257
+
},
5258
+
"engines": {
5259
+
"node": ">= 0.4"
5260
+
},
5261
+
"funding": {
5262
+
"url": "https://github.com/sponsors/ljharb"
5263
+
}
5264
+
},
5265
+
"node_modules/is-set": {
5266
+
"version": "2.0.3",
5267
+
"resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz",
5268
+
"integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==",
5269
+
"dev": true,
5270
+
"license": "MIT",
5271
+
"engines": {
5272
+
"node": ">= 0.4"
5273
+
},
5274
+
"funding": {
5275
+
"url": "https://github.com/sponsors/ljharb"
5276
+
}
5277
+
},
5278
+
"node_modules/is-shared-array-buffer": {
5279
+
"version": "1.0.4",
5280
+
"resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz",
5281
+
"integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==",
5282
+
"dev": true,
5283
+
"license": "MIT",
5284
+
"dependencies": {
5285
+
"call-bound": "^1.0.3"
5286
+
},
5287
+
"engines": {
5288
+
"node": ">= 0.4"
5289
+
},
5290
+
"funding": {
5291
+
"url": "https://github.com/sponsors/ljharb"
5292
+
}
5293
+
},
5294
+
"node_modules/is-string": {
5295
+
"version": "1.1.1",
5296
+
"resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz",
5297
+
"integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==",
5298
+
"dev": true,
5299
+
"license": "MIT",
5300
+
"dependencies": {
5301
+
"call-bound": "^1.0.3",
5302
+
"has-tostringtag": "^1.0.2"
5303
+
},
5304
+
"engines": {
5305
+
"node": ">= 0.4"
5306
+
},
5307
+
"funding": {
5308
+
"url": "https://github.com/sponsors/ljharb"
5309
+
}
5310
+
},
5311
+
"node_modules/is-symbol": {
5312
+
"version": "1.1.1",
5313
+
"resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz",
5314
+
"integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==",
5315
+
"dev": true,
5316
+
"license": "MIT",
5317
+
"dependencies": {
5318
+
"call-bound": "^1.0.2",
5319
+
"has-symbols": "^1.1.0",
5320
+
"safe-regex-test": "^1.1.0"
5321
+
},
5322
+
"engines": {
5323
+
"node": ">= 0.4"
5324
+
},
5325
+
"funding": {
5326
+
"url": "https://github.com/sponsors/ljharb"
5327
+
}
5328
+
},
5329
+
"node_modules/is-typed-array": {
5330
+
"version": "1.1.15",
5331
+
"resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz",
5332
+
"integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==",
5333
+
"dev": true,
5334
+
"license": "MIT",
5335
+
"dependencies": {
5336
+
"which-typed-array": "^1.1.16"
5337
+
},
5338
+
"engines": {
5339
+
"node": ">= 0.4"
5340
+
},
5341
+
"funding": {
5342
+
"url": "https://github.com/sponsors/ljharb"
5343
+
}
5344
+
},
5345
+
"node_modules/is-weakmap": {
5346
+
"version": "2.0.2",
5347
+
"resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz",
5348
+
"integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==",
5349
+
"dev": true,
5350
+
"license": "MIT",
5351
+
"engines": {
5352
+
"node": ">= 0.4"
5353
+
},
5354
+
"funding": {
5355
+
"url": "https://github.com/sponsors/ljharb"
5356
+
}
5357
+
},
5358
+
"node_modules/is-weakref": {
5359
+
"version": "1.1.1",
5360
+
"resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz",
5361
+
"integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==",
5362
+
"dev": true,
5363
+
"license": "MIT",
5364
+
"dependencies": {
5365
+
"call-bound": "^1.0.3"
5366
+
},
5367
+
"engines": {
5368
+
"node": ">= 0.4"
5369
+
},
5370
+
"funding": {
5371
+
"url": "https://github.com/sponsors/ljharb"
5372
+
}
5373
+
},
5374
+
"node_modules/is-weakset": {
5375
+
"version": "2.0.4",
5376
+
"resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz",
5377
+
"integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==",
5378
+
"dev": true,
5379
+
"license": "MIT",
5380
+
"dependencies": {
5381
+
"call-bound": "^1.0.3",
5382
+
"get-intrinsic": "^1.2.6"
5383
+
},
5384
+
"engines": {
5385
+
"node": ">= 0.4"
5386
+
},
5387
+
"funding": {
5388
+
"url": "https://github.com/sponsors/ljharb"
5389
+
}
5390
+
},
5391
+
"node_modules/isarray": {
5392
+
"version": "2.0.5",
5393
+
"resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
5394
+
"integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
5395
+
"dev": true,
5396
+
"license": "MIT"
5397
+
},
5398
+
"node_modules/isexe": {
5399
+
"version": "2.0.0",
5400
+
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
5401
+
"integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
5402
+
"license": "ISC"
5403
+
},
5404
+
"node_modules/iterator.prototype": {
5405
+
"version": "1.1.5",
5406
+
"resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz",
5407
+
"integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==",
5408
+
"dev": true,
5409
+
"license": "MIT",
5410
+
"dependencies": {
5411
+
"define-data-property": "^1.1.4",
5412
+
"es-object-atoms": "^1.0.0",
5413
+
"get-intrinsic": "^1.2.6",
5414
+
"get-proto": "^1.0.0",
5415
+
"has-symbols": "^1.1.0",
5416
+
"set-function-name": "^2.0.2"
5417
+
},
5418
+
"engines": {
5419
+
"node": ">= 0.4"
5420
+
}
5421
+
},
5422
+
"node_modules/jackspeak": {
5423
+
"version": "3.4.3",
5424
+
"resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
5425
+
"integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
5426
+
"license": "BlueOak-1.0.0",
5427
+
"dependencies": {
5428
+
"@isaacs/cliui": "^8.0.2"
5429
+
},
5430
+
"funding": {
5431
+
"url": "https://github.com/sponsors/isaacs"
5432
+
},
5433
+
"optionalDependencies": {
5434
+
"@pkgjs/parseargs": "^0.11.0"
5435
+
}
5436
+
},
5437
+
"node_modules/jiti": {
5438
+
"version": "1.21.7",
5439
+
"resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz",
5440
+
"integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==",
5441
+
"license": "MIT",
5442
+
"bin": {
5443
+
"jiti": "bin/jiti.js"
5444
+
}
5445
+
},
5446
+
"node_modules/js-beautify": {
5447
+
"version": "1.15.4",
5448
+
"resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.15.4.tgz",
5449
+
"integrity": "sha512-9/KXeZUKKJwqCXUdBxFJ3vPh467OCckSBmYDwSK/EtV090K+iMJ7zx2S3HLVDIWFQdqMIsZWbnaGiba18aWhaA==",
5450
+
"dev": true,
5451
+
"license": "MIT",
5452
+
"dependencies": {
5453
+
"config-chain": "^1.1.13",
5454
+
"editorconfig": "^1.0.4",
5455
+
"glob": "^10.4.2",
5456
+
"js-cookie": "^3.0.5",
5457
+
"nopt": "^7.2.1"
5458
+
},
5459
+
"bin": {
5460
+
"css-beautify": "js/bin/css-beautify.js",
5461
+
"html-beautify": "js/bin/html-beautify.js",
5462
+
"js-beautify": "js/bin/js-beautify.js"
5463
+
},
5464
+
"engines": {
5465
+
"node": ">=14"
5466
+
}
5467
+
},
5468
+
"node_modules/js-cookie": {
5469
+
"version": "3.0.5",
5470
+
"resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz",
5471
+
"integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==",
5472
+
"dev": true,
5473
+
"license": "MIT",
5474
+
"engines": {
5475
+
"node": ">=14"
5476
+
}
5477
+
},
5478
+
"node_modules/js-tokens": {
5479
+
"version": "4.0.0",
5480
+
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
5481
+
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
5482
+
"license": "MIT"
5483
+
},
5484
+
"node_modules/js-yaml": {
5485
+
"version": "4.1.0",
5486
+
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
5487
+
"integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
5488
+
"dev": true,
5489
+
"license": "MIT",
5490
+
"dependencies": {
5491
+
"argparse": "^2.0.1"
5492
+
},
5493
+
"bin": {
5494
+
"js-yaml": "bin/js-yaml.js"
5495
+
}
5496
+
},
5497
+
"node_modules/jsesc": {
5498
+
"version": "3.1.0",
5499
+
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
5500
+
"integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
5501
+
"dev": true,
5502
+
"license": "MIT",
5503
+
"bin": {
5504
+
"jsesc": "bin/jsesc"
5505
+
},
5506
+
"engines": {
5507
+
"node": ">=6"
5508
+
}
5509
+
},
5510
+
"node_modules/json-buffer": {
5511
+
"version": "3.0.1",
5512
+
"resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
5513
+
"integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
5514
+
"dev": true,
5515
+
"license": "MIT"
5516
+
},
5517
+
"node_modules/json-schema-traverse": {
5518
+
"version": "1.0.0",
5519
+
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
5520
+
"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
5521
+
"dev": true,
5522
+
"license": "MIT"
5523
+
},
5524
+
"node_modules/json-stable-stringify-without-jsonify": {
5525
+
"version": "1.0.1",
5526
+
"resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
5527
+
"integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
5528
+
"dev": true,
5529
+
"license": "MIT"
5530
+
},
5531
+
"node_modules/json5": {
5532
+
"version": "2.2.3",
5533
+
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
5534
+
"integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
5535
+
"dev": true,
5536
+
"license": "MIT",
5537
+
"bin": {
5538
+
"json5": "lib/cli.js"
5539
+
},
5540
+
"engines": {
5541
+
"node": ">=6"
5542
+
}
5543
+
},
5544
+
"node_modules/jsox": {
5545
+
"version": "1.2.121",
5546
+
"resolved": "https://registry.npmjs.org/jsox/-/jsox-1.2.121.tgz",
5547
+
"integrity": "sha512-9Ag50tKhpTwS6r5wh3MJSAvpSof0UBr39Pto8OnzFT32Z/pAbxAsKHzyvsyMEHVslELvHyO/4/jaQELHk8wDcw==",
5548
+
"dev": true,
5549
+
"license": "MIT",
5550
+
"bin": {
5551
+
"jsox": "lib/cli.js"
5552
+
}
5553
+
},
5554
+
"node_modules/jsx-ast-utils": {
5555
+
"version": "3.3.5",
5556
+
"resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz",
5557
+
"integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==",
5558
+
"dev": true,
5559
+
"license": "MIT",
5560
+
"dependencies": {
5561
+
"array-includes": "^3.1.6",
5562
+
"array.prototype.flat": "^1.3.1",
5563
+
"object.assign": "^4.1.4",
5564
+
"object.values": "^1.1.6"
5565
+
},
5566
+
"engines": {
5567
+
"node": ">=4.0"
5568
+
}
5569
+
},
5570
+
"node_modules/keyv": {
5571
+
"version": "4.5.4",
5572
+
"resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
5573
+
"integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
5574
+
"dev": true,
5575
+
"license": "MIT",
5576
+
"dependencies": {
5577
+
"json-buffer": "3.0.1"
5578
+
}
5579
+
},
5580
+
"node_modules/levn": {
5581
+
"version": "0.4.1",
5582
+
"resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
5583
+
"integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
5584
+
"dev": true,
5585
+
"license": "MIT",
5586
+
"dependencies": {
5587
+
"prelude-ls": "^1.2.1",
5588
+
"type-check": "~0.4.0"
5589
+
},
5590
+
"engines": {
5591
+
"node": ">= 0.8.0"
5592
+
}
5593
+
},
5594
+
"node_modules/lilconfig": {
5595
+
"version": "3.1.3",
5596
+
"resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz",
5597
+
"integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==",
5598
+
"license": "MIT",
5599
+
"engines": {
5600
+
"node": ">=14"
5601
+
},
5602
+
"funding": {
5603
+
"url": "https://github.com/sponsors/antonk52"
5604
+
}
5605
+
},
5606
+
"node_modules/lines-and-columns": {
5607
+
"version": "1.2.4",
5608
+
"resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
5609
+
"integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
5610
+
"license": "MIT"
5611
+
},
5612
+
"node_modules/linguist-languages": {
5613
+
"version": "7.29.0",
5614
+
"resolved": "https://registry.npmjs.org/linguist-languages/-/linguist-languages-7.29.0.tgz",
5615
+
"integrity": "sha512-KTh6ltVzr3ycnqxWw7zlzy8CqTSrpdymUzGl0EgYxK7cHoRgsX3VrZw4ExCWGCPX3uxxa7kgZwir4zeQkqjdZw==",
5616
+
"dev": true,
5617
+
"license": "MIT"
5618
+
},
5619
+
"node_modules/local-pkg": {
5620
+
"version": "0.5.1",
5621
+
"resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.1.tgz",
5622
+
"integrity": "sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==",
5623
+
"dev": true,
5624
+
"license": "MIT",
5625
+
"dependencies": {
5626
+
"mlly": "^1.7.3",
5627
+
"pkg-types": "^1.2.1"
5628
+
},
5629
+
"engines": {
5630
+
"node": ">=14"
5631
+
},
5632
+
"funding": {
5633
+
"url": "https://github.com/sponsors/antfu"
5634
+
}
5635
+
},
5636
+
"node_modules/locate-path": {
5637
+
"version": "6.0.0",
5638
+
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
5639
+
"integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
5640
+
"dev": true,
5641
+
"license": "MIT",
5642
+
"dependencies": {
5643
+
"p-locate": "^5.0.0"
5644
+
},
5645
+
"engines": {
5646
+
"node": ">=10"
5647
+
},
5648
+
"funding": {
5649
+
"url": "https://github.com/sponsors/sindresorhus"
5650
+
}
5651
+
},
5652
+
"node_modules/lodash": {
5653
+
"version": "4.17.21",
5654
+
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
5655
+
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
5656
+
"dev": true,
5657
+
"license": "MIT"
5658
+
},
5659
+
"node_modules/lodash.castarray": {
5660
+
"version": "4.4.0",
5661
+
"resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz",
5662
+
"integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==",
5663
+
"dev": true,
5664
+
"license": "MIT"
5665
+
},
5666
+
"node_modules/lodash.isplainobject": {
5667
+
"version": "4.0.6",
5668
+
"resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
5669
+
"integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==",
5670
+
"dev": true,
5671
+
"license": "MIT"
5672
+
},
5673
+
"node_modules/lodash.merge": {
5674
+
"version": "4.6.2",
5675
+
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
5676
+
"integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
5677
+
"dev": true,
5678
+
"license": "MIT"
5679
+
},
5680
+
"node_modules/loose-envify": {
5681
+
"version": "1.4.0",
5682
+
"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
5683
+
"integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
5684
+
"license": "MIT",
5685
+
"dependencies": {
5686
+
"js-tokens": "^3.0.0 || ^4.0.0"
5687
+
},
5688
+
"bin": {
5689
+
"loose-envify": "cli.js"
5690
+
}
5691
+
},
5692
+
"node_modules/lru-cache": {
5693
+
"version": "5.1.1",
5694
+
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
5695
+
"integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
5696
+
"dev": true,
5697
+
"license": "ISC",
5698
+
"dependencies": {
5699
+
"yallist": "^3.0.2"
5700
+
}
5701
+
},
5702
+
"node_modules/lucide-react": {
5703
+
"version": "0.446.0",
5704
+
"resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.446.0.tgz",
5705
+
"integrity": "sha512-BU7gy8MfBMqvEdDPH79VhOXSEgyG8TSPOKWaExWGCQVqnGH7wGgDngPbofu+KdtVjPQBWbEmnfMTq90CTiiDRg==",
5706
+
"license": "ISC",
5707
+
"peerDependencies": {
5708
+
"react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc"
5709
+
}
5710
+
},
5711
+
"node_modules/luxon": {
5712
+
"version": "3.6.1",
5713
+
"resolved": "https://registry.npmjs.org/luxon/-/luxon-3.6.1.tgz",
5714
+
"integrity": "sha512-tJLxrKJhO2ukZ5z0gyjY1zPh3Rh88Ej9P7jNrZiHMUXHae1yvI2imgOZtL1TO8TW6biMMKfTtAOoEJANgtWBMQ==",
5715
+
"dev": true,
5716
+
"license": "MIT",
5717
+
"engines": {
5718
+
"node": ">=12"
5719
+
}
5720
+
},
5721
+
"node_modules/math-intrinsics": {
5722
+
"version": "1.1.0",
5723
+
"resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
5724
+
"integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
5725
+
"dev": true,
5726
+
"license": "MIT",
5727
+
"engines": {
5728
+
"node": ">= 0.4"
5729
+
}
5730
+
},
5731
+
"node_modules/mdast-util-from-markdown": {
5732
+
"version": "2.0.2",
5733
+
"resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz",
5734
+
"integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==",
5735
+
"dev": true,
5736
+
"license": "MIT",
5737
+
"dependencies": {
5738
+
"@types/mdast": "^4.0.0",
5739
+
"@types/unist": "^3.0.0",
5740
+
"decode-named-character-reference": "^1.0.0",
5741
+
"devlop": "^1.0.0",
5742
+
"mdast-util-to-string": "^4.0.0",
5743
+
"micromark": "^4.0.0",
5744
+
"micromark-util-decode-numeric-character-reference": "^2.0.0",
5745
+
"micromark-util-decode-string": "^2.0.0",
5746
+
"micromark-util-normalize-identifier": "^2.0.0",
5747
+
"micromark-util-symbol": "^2.0.0",
5748
+
"micromark-util-types": "^2.0.0",
5749
+
"unist-util-stringify-position": "^4.0.0"
5750
+
},
5751
+
"funding": {
5752
+
"type": "opencollective",
5753
+
"url": "https://opencollective.com/unified"
5754
+
}
5755
+
},
5756
+
"node_modules/mdast-util-to-string": {
5757
+
"version": "4.0.0",
5758
+
"resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz",
5759
+
"integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==",
5760
+
"dev": true,
5761
+
"license": "MIT",
5762
+
"dependencies": {
5763
+
"@types/mdast": "^4.0.0"
5764
+
},
5765
+
"funding": {
5766
+
"type": "opencollective",
5767
+
"url": "https://opencollective.com/unified"
5768
+
}
5769
+
},
5770
+
"node_modules/merge2": {
5771
+
"version": "1.4.1",
5772
+
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
5773
+
"integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
5774
+
"license": "MIT",
5775
+
"engines": {
5776
+
"node": ">= 8"
5777
+
}
5778
+
},
5779
+
"node_modules/micromark": {
5780
+
"version": "4.0.2",
5781
+
"resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz",
5782
+
"integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==",
5783
+
"dev": true,
5784
+
"funding": [
5785
+
{
5786
+
"type": "GitHub Sponsors",
5787
+
"url": "https://github.com/sponsors/unifiedjs"
5788
+
},
5789
+
{
5790
+
"type": "OpenCollective",
5791
+
"url": "https://opencollective.com/unified"
5792
+
}
5793
+
],
5794
+
"license": "MIT",
5795
+
"dependencies": {
5796
+
"@types/debug": "^4.0.0",
5797
+
"debug": "^4.0.0",
5798
+
"decode-named-character-reference": "^1.0.0",
5799
+
"devlop": "^1.0.0",
5800
+
"micromark-core-commonmark": "^2.0.0",
5801
+
"micromark-factory-space": "^2.0.0",
5802
+
"micromark-util-character": "^2.0.0",
5803
+
"micromark-util-chunked": "^2.0.0",
5804
+
"micromark-util-combine-extensions": "^2.0.0",
5805
+
"micromark-util-decode-numeric-character-reference": "^2.0.0",
5806
+
"micromark-util-encode": "^2.0.0",
5807
+
"micromark-util-normalize-identifier": "^2.0.0",
5808
+
"micromark-util-resolve-all": "^2.0.0",
5809
+
"micromark-util-sanitize-uri": "^2.0.0",
5810
+
"micromark-util-subtokenize": "^2.0.0",
5811
+
"micromark-util-symbol": "^2.0.0",
5812
+
"micromark-util-types": "^2.0.0"
5813
+
}
5814
+
},
5815
+
"node_modules/micromark-core-commonmark": {
5816
+
"version": "2.0.3",
5817
+
"resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz",
5818
+
"integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==",
5819
+
"dev": true,
5820
+
"funding": [
5821
+
{
5822
+
"type": "GitHub Sponsors",
5823
+
"url": "https://github.com/sponsors/unifiedjs"
5824
+
},
5825
+
{
5826
+
"type": "OpenCollective",
5827
+
"url": "https://opencollective.com/unified"
5828
+
}
5829
+
],
5830
+
"license": "MIT",
5831
+
"dependencies": {
5832
+
"decode-named-character-reference": "^1.0.0",
5833
+
"devlop": "^1.0.0",
5834
+
"micromark-factory-destination": "^2.0.0",
5835
+
"micromark-factory-label": "^2.0.0",
5836
+
"micromark-factory-space": "^2.0.0",
5837
+
"micromark-factory-title": "^2.0.0",
5838
+
"micromark-factory-whitespace": "^2.0.0",
5839
+
"micromark-util-character": "^2.0.0",
5840
+
"micromark-util-chunked": "^2.0.0",
5841
+
"micromark-util-classify-character": "^2.0.0",
5842
+
"micromark-util-html-tag-name": "^2.0.0",
5843
+
"micromark-util-normalize-identifier": "^2.0.0",
5844
+
"micromark-util-resolve-all": "^2.0.0",
5845
+
"micromark-util-subtokenize": "^2.0.0",
5846
+
"micromark-util-symbol": "^2.0.0",
5847
+
"micromark-util-types": "^2.0.0"
5848
+
}
5849
+
},
5850
+
"node_modules/micromark-factory-destination": {
5851
+
"version": "2.0.1",
5852
+
"resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz",
5853
+
"integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==",
5854
+
"dev": true,
5855
+
"funding": [
5856
+
{
5857
+
"type": "GitHub Sponsors",
5858
+
"url": "https://github.com/sponsors/unifiedjs"
5859
+
},
5860
+
{
5861
+
"type": "OpenCollective",
5862
+
"url": "https://opencollective.com/unified"
5863
+
}
5864
+
],
5865
+
"license": "MIT",
5866
+
"dependencies": {
5867
+
"micromark-util-character": "^2.0.0",
5868
+
"micromark-util-symbol": "^2.0.0",
5869
+
"micromark-util-types": "^2.0.0"
5870
+
}
5871
+
},
5872
+
"node_modules/micromark-factory-label": {
5873
+
"version": "2.0.1",
5874
+
"resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz",
5875
+
"integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==",
5876
+
"dev": true,
5877
+
"funding": [
5878
+
{
5879
+
"type": "GitHub Sponsors",
5880
+
"url": "https://github.com/sponsors/unifiedjs"
5881
+
},
5882
+
{
5883
+
"type": "OpenCollective",
5884
+
"url": "https://opencollective.com/unified"
5885
+
}
5886
+
],
5887
+
"license": "MIT",
5888
+
"dependencies": {
5889
+
"devlop": "^1.0.0",
5890
+
"micromark-util-character": "^2.0.0",
5891
+
"micromark-util-symbol": "^2.0.0",
5892
+
"micromark-util-types": "^2.0.0"
5893
+
}
5894
+
},
5895
+
"node_modules/micromark-factory-space": {
5896
+
"version": "2.0.1",
5897
+
"resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz",
5898
+
"integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==",
5899
+
"dev": true,
5900
+
"funding": [
5901
+
{
5902
+
"type": "GitHub Sponsors",
5903
+
"url": "https://github.com/sponsors/unifiedjs"
5904
+
},
5905
+
{
5906
+
"type": "OpenCollective",
5907
+
"url": "https://opencollective.com/unified"
5908
+
}
5909
+
],
5910
+
"license": "MIT",
5911
+
"dependencies": {
5912
+
"micromark-util-character": "^2.0.0",
5913
+
"micromark-util-types": "^2.0.0"
5914
+
}
5915
+
},
5916
+
"node_modules/micromark-factory-title": {
5917
+
"version": "2.0.1",
5918
+
"resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz",
5919
+
"integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==",
5920
+
"dev": true,
5921
+
"funding": [
5922
+
{
5923
+
"type": "GitHub Sponsors",
5924
+
"url": "https://github.com/sponsors/unifiedjs"
5925
+
},
5926
+
{
5927
+
"type": "OpenCollective",
5928
+
"url": "https://opencollective.com/unified"
5929
+
}
5930
+
],
5931
+
"license": "MIT",
5932
+
"dependencies": {
5933
+
"micromark-factory-space": "^2.0.0",
5934
+
"micromark-util-character": "^2.0.0",
5935
+
"micromark-util-symbol": "^2.0.0",
5936
+
"micromark-util-types": "^2.0.0"
5937
+
}
5938
+
},
5939
+
"node_modules/micromark-factory-whitespace": {
5940
+
"version": "2.0.1",
5941
+
"resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz",
5942
+
"integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==",
5943
+
"dev": true,
5944
+
"funding": [
5945
+
{
5946
+
"type": "GitHub Sponsors",
5947
+
"url": "https://github.com/sponsors/unifiedjs"
5948
+
},
5949
+
{
5950
+
"type": "OpenCollective",
5951
+
"url": "https://opencollective.com/unified"
5952
+
}
5953
+
],
5954
+
"license": "MIT",
5955
+
"dependencies": {
5956
+
"micromark-factory-space": "^2.0.0",
5957
+
"micromark-util-character": "^2.0.0",
5958
+
"micromark-util-symbol": "^2.0.0",
5959
+
"micromark-util-types": "^2.0.0"
5960
+
}
5961
+
},
5962
+
"node_modules/micromark-util-character": {
5963
+
"version": "2.1.1",
5964
+
"resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz",
5965
+
"integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==",
5966
+
"dev": true,
5967
+
"funding": [
5968
+
{
5969
+
"type": "GitHub Sponsors",
5970
+
"url": "https://github.com/sponsors/unifiedjs"
5971
+
},
5972
+
{
5973
+
"type": "OpenCollective",
5974
+
"url": "https://opencollective.com/unified"
5975
+
}
5976
+
],
5977
+
"license": "MIT",
5978
+
"dependencies": {
5979
+
"micromark-util-symbol": "^2.0.0",
5980
+
"micromark-util-types": "^2.0.0"
5981
+
}
5982
+
},
5983
+
"node_modules/micromark-util-chunked": {
5984
+
"version": "2.0.1",
5985
+
"resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz",
5986
+
"integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==",
5987
+
"dev": true,
5988
+
"funding": [
5989
+
{
5990
+
"type": "GitHub Sponsors",
5991
+
"url": "https://github.com/sponsors/unifiedjs"
5992
+
},
5993
+
{
5994
+
"type": "OpenCollective",
5995
+
"url": "https://opencollective.com/unified"
5996
+
}
5997
+
],
5998
+
"license": "MIT",
5999
+
"dependencies": {
6000
+
"micromark-util-symbol": "^2.0.0"
6001
+
}
6002
+
},
6003
+
"node_modules/micromark-util-classify-character": {
6004
+
"version": "2.0.1",
6005
+
"resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz",
6006
+
"integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==",
6007
+
"dev": true,
6008
+
"funding": [
6009
+
{
6010
+
"type": "GitHub Sponsors",
6011
+
"url": "https://github.com/sponsors/unifiedjs"
6012
+
},
6013
+
{
6014
+
"type": "OpenCollective",
6015
+
"url": "https://opencollective.com/unified"
6016
+
}
6017
+
],
6018
+
"license": "MIT",
6019
+
"dependencies": {
6020
+
"micromark-util-character": "^2.0.0",
6021
+
"micromark-util-symbol": "^2.0.0",
6022
+
"micromark-util-types": "^2.0.0"
6023
+
}
6024
+
},
6025
+
"node_modules/micromark-util-combine-extensions": {
6026
+
"version": "2.0.1",
6027
+
"resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz",
6028
+
"integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==",
6029
+
"dev": true,
6030
+
"funding": [
6031
+
{
6032
+
"type": "GitHub Sponsors",
6033
+
"url": "https://github.com/sponsors/unifiedjs"
6034
+
},
6035
+
{
6036
+
"type": "OpenCollective",
6037
+
"url": "https://opencollective.com/unified"
6038
+
}
6039
+
],
6040
+
"license": "MIT",
6041
+
"dependencies": {
6042
+
"micromark-util-chunked": "^2.0.0",
6043
+
"micromark-util-types": "^2.0.0"
6044
+
}
6045
+
},
6046
+
"node_modules/micromark-util-decode-numeric-character-reference": {
6047
+
"version": "2.0.2",
6048
+
"resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz",
6049
+
"integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==",
6050
+
"dev": true,
6051
+
"funding": [
6052
+
{
6053
+
"type": "GitHub Sponsors",
6054
+
"url": "https://github.com/sponsors/unifiedjs"
6055
+
},
6056
+
{
6057
+
"type": "OpenCollective",
6058
+
"url": "https://opencollective.com/unified"
6059
+
}
6060
+
],
6061
+
"license": "MIT",
6062
+
"dependencies": {
6063
+
"micromark-util-symbol": "^2.0.0"
6064
+
}
6065
+
},
6066
+
"node_modules/micromark-util-decode-string": {
6067
+
"version": "2.0.1",
6068
+
"resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz",
6069
+
"integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==",
6070
+
"dev": true,
6071
+
"funding": [
6072
+
{
6073
+
"type": "GitHub Sponsors",
6074
+
"url": "https://github.com/sponsors/unifiedjs"
6075
+
},
6076
+
{
6077
+
"type": "OpenCollective",
6078
+
"url": "https://opencollective.com/unified"
6079
+
}
6080
+
],
6081
+
"license": "MIT",
6082
+
"dependencies": {
6083
+
"decode-named-character-reference": "^1.0.0",
6084
+
"micromark-util-character": "^2.0.0",
6085
+
"micromark-util-decode-numeric-character-reference": "^2.0.0",
6086
+
"micromark-util-symbol": "^2.0.0"
6087
+
}
6088
+
},
6089
+
"node_modules/micromark-util-encode": {
6090
+
"version": "2.0.1",
6091
+
"resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz",
6092
+
"integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==",
6093
+
"dev": true,
6094
+
"funding": [
6095
+
{
6096
+
"type": "GitHub Sponsors",
6097
+
"url": "https://github.com/sponsors/unifiedjs"
6098
+
},
6099
+
{
6100
+
"type": "OpenCollective",
6101
+
"url": "https://opencollective.com/unified"
6102
+
}
6103
+
],
6104
+
"license": "MIT"
6105
+
},
6106
+
"node_modules/micromark-util-html-tag-name": {
6107
+
"version": "2.0.1",
6108
+
"resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz",
6109
+
"integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==",
6110
+
"dev": true,
6111
+
"funding": [
6112
+
{
6113
+
"type": "GitHub Sponsors",
6114
+
"url": "https://github.com/sponsors/unifiedjs"
6115
+
},
6116
+
{
6117
+
"type": "OpenCollective",
6118
+
"url": "https://opencollective.com/unified"
6119
+
}
6120
+
],
6121
+
"license": "MIT"
6122
+
},
6123
+
"node_modules/micromark-util-normalize-identifier": {
6124
+
"version": "2.0.1",
6125
+
"resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz",
6126
+
"integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==",
6127
+
"dev": true,
6128
+
"funding": [
6129
+
{
6130
+
"type": "GitHub Sponsors",
6131
+
"url": "https://github.com/sponsors/unifiedjs"
6132
+
},
6133
+
{
6134
+
"type": "OpenCollective",
6135
+
"url": "https://opencollective.com/unified"
6136
+
}
6137
+
],
6138
+
"license": "MIT",
6139
+
"dependencies": {
6140
+
"micromark-util-symbol": "^2.0.0"
6141
+
}
6142
+
},
6143
+
"node_modules/micromark-util-resolve-all": {
6144
+
"version": "2.0.1",
6145
+
"resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz",
6146
+
"integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==",
6147
+
"dev": true,
6148
+
"funding": [
6149
+
{
6150
+
"type": "GitHub Sponsors",
6151
+
"url": "https://github.com/sponsors/unifiedjs"
6152
+
},
6153
+
{
6154
+
"type": "OpenCollective",
6155
+
"url": "https://opencollective.com/unified"
6156
+
}
6157
+
],
6158
+
"license": "MIT",
6159
+
"dependencies": {
6160
+
"micromark-util-types": "^2.0.0"
6161
+
}
6162
+
},
6163
+
"node_modules/micromark-util-sanitize-uri": {
6164
+
"version": "2.0.1",
6165
+
"resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz",
6166
+
"integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==",
6167
+
"dev": true,
6168
+
"funding": [
6169
+
{
6170
+
"type": "GitHub Sponsors",
6171
+
"url": "https://github.com/sponsors/unifiedjs"
6172
+
},
6173
+
{
6174
+
"type": "OpenCollective",
6175
+
"url": "https://opencollective.com/unified"
6176
+
}
6177
+
],
6178
+
"license": "MIT",
6179
+
"dependencies": {
6180
+
"micromark-util-character": "^2.0.0",
6181
+
"micromark-util-encode": "^2.0.0",
6182
+
"micromark-util-symbol": "^2.0.0"
6183
+
}
6184
+
},
6185
+
"node_modules/micromark-util-subtokenize": {
6186
+
"version": "2.1.0",
6187
+
"resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz",
6188
+
"integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==",
6189
+
"dev": true,
6190
+
"funding": [
6191
+
{
6192
+
"type": "GitHub Sponsors",
6193
+
"url": "https://github.com/sponsors/unifiedjs"
6194
+
},
6195
+
{
6196
+
"type": "OpenCollective",
6197
+
"url": "https://opencollective.com/unified"
6198
+
}
6199
+
],
6200
+
"license": "MIT",
6201
+
"dependencies": {
6202
+
"devlop": "^1.0.0",
6203
+
"micromark-util-chunked": "^2.0.0",
6204
+
"micromark-util-symbol": "^2.0.0",
6205
+
"micromark-util-types": "^2.0.0"
6206
+
}
6207
+
},
6208
+
"node_modules/micromark-util-symbol": {
6209
+
"version": "2.0.1",
6210
+
"resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz",
6211
+
"integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==",
6212
+
"dev": true,
6213
+
"funding": [
6214
+
{
6215
+
"type": "GitHub Sponsors",
6216
+
"url": "https://github.com/sponsors/unifiedjs"
6217
+
},
6218
+
{
6219
+
"type": "OpenCollective",
6220
+
"url": "https://opencollective.com/unified"
6221
+
}
6222
+
],
6223
+
"license": "MIT"
6224
+
},
6225
+
"node_modules/micromark-util-types": {
6226
+
"version": "2.0.2",
6227
+
"resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz",
6228
+
"integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==",
6229
+
"dev": true,
6230
+
"funding": [
6231
+
{
6232
+
"type": "GitHub Sponsors",
6233
+
"url": "https://github.com/sponsors/unifiedjs"
6234
+
},
6235
+
{
6236
+
"type": "OpenCollective",
6237
+
"url": "https://opencollective.com/unified"
6238
+
}
6239
+
],
6240
+
"license": "MIT"
6241
+
},
6242
+
"node_modules/micromatch": {
6243
+
"version": "4.0.8",
6244
+
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
6245
+
"integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
6246
+
"license": "MIT",
6247
+
"dependencies": {
6248
+
"braces": "^3.0.3",
6249
+
"picomatch": "^2.3.1"
6250
+
},
6251
+
"engines": {
6252
+
"node": ">=8.6"
6253
+
}
6254
+
},
6255
+
"node_modules/mime-db": {
6256
+
"version": "1.52.0",
6257
+
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
6258
+
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
6259
+
"dev": true,
6260
+
"license": "MIT",
6261
+
"engines": {
6262
+
"node": ">= 0.6"
6263
+
}
6264
+
},
6265
+
"node_modules/mime-types": {
6266
+
"version": "2.1.35",
6267
+
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
6268
+
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
6269
+
"dev": true,
6270
+
"license": "MIT",
6271
+
"dependencies": {
6272
+
"mime-db": "1.52.0"
6273
+
},
6274
+
"engines": {
6275
+
"node": ">= 0.6"
6276
+
}
6277
+
},
6278
+
"node_modules/minimatch": {
6279
+
"version": "9.0.5",
6280
+
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
6281
+
"integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
6282
+
"license": "ISC",
6283
+
"dependencies": {
6284
+
"brace-expansion": "^2.0.1"
6285
+
},
6286
+
"engines": {
6287
+
"node": ">=16 || 14 >=14.17"
6288
+
},
6289
+
"funding": {
6290
+
"url": "https://github.com/sponsors/isaacs"
6291
+
}
6292
+
},
6293
+
"node_modules/minipass": {
6294
+
"version": "7.1.2",
6295
+
"resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
6296
+
"integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
6297
+
"license": "ISC",
6298
+
"engines": {
6299
+
"node": ">=16 || 14 >=14.17"
6300
+
}
6301
+
},
6302
+
"node_modules/mlly": {
6303
+
"version": "1.7.4",
6304
+
"resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.4.tgz",
6305
+
"integrity": "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==",
6306
+
"dev": true,
6307
+
"license": "MIT",
6308
+
"dependencies": {
6309
+
"acorn": "^8.14.0",
6310
+
"pathe": "^2.0.1",
6311
+
"pkg-types": "^1.3.0",
6312
+
"ufo": "^1.5.4"
6313
+
}
6314
+
},
6315
+
"node_modules/moo": {
6316
+
"version": "0.5.2",
6317
+
"resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz",
6318
+
"integrity": "sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==",
6319
+
"dev": true,
6320
+
"license": "BSD-3-Clause"
6321
+
},
6322
+
"node_modules/ms": {
6323
+
"version": "2.1.3",
6324
+
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
6325
+
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
6326
+
"dev": true,
6327
+
"license": "MIT"
6328
+
},
6329
+
"node_modules/mvdan-sh": {
6330
+
"version": "0.10.1",
6331
+
"resolved": "https://registry.npmjs.org/mvdan-sh/-/mvdan-sh-0.10.1.tgz",
6332
+
"integrity": "sha512-kMbrH0EObaKmK3nVRKUIIya1dpASHIEusM13S4V1ViHFuxuNxCo+arxoa6j/dbV22YBGjl7UKJm9QQKJ2Crzhg==",
6333
+
"dev": true,
6334
+
"license": "BSD-3-Clause"
6335
+
},
6336
+
"node_modules/mz": {
6337
+
"version": "2.7.0",
6338
+
"resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
6339
+
"integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
6340
+
"license": "MIT",
6341
+
"dependencies": {
6342
+
"any-promise": "^1.0.0",
6343
+
"object-assign": "^4.0.1",
6344
+
"thenify-all": "^1.0.0"
6345
+
}
6346
+
},
6347
+
"node_modules/nanoid": {
6348
+
"version": "3.3.11",
6349
+
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
6350
+
"integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
6351
+
"funding": [
6352
+
{
6353
+
"type": "github",
6354
+
"url": "https://github.com/sponsors/ai"
6355
+
}
6356
+
],
6357
+
"license": "MIT",
6358
+
"bin": {
6359
+
"nanoid": "bin/nanoid.cjs"
6360
+
},
6361
+
"engines": {
6362
+
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
6363
+
}
6364
+
},
6365
+
"node_modules/natural-compare": {
6366
+
"version": "1.4.0",
6367
+
"resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
6368
+
"integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
6369
+
"dev": true,
6370
+
"license": "MIT"
6371
+
},
6372
+
"node_modules/nearley": {
6373
+
"version": "2.20.1",
6374
+
"resolved": "https://registry.npmjs.org/nearley/-/nearley-2.20.1.tgz",
6375
+
"integrity": "sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==",
6376
+
"dev": true,
6377
+
"license": "MIT",
6378
+
"dependencies": {
6379
+
"commander": "^2.19.0",
6380
+
"moo": "^0.5.0",
6381
+
"railroad-diagrams": "^1.0.0",
6382
+
"randexp": "0.4.6"
6383
+
},
6384
+
"bin": {
6385
+
"nearley-railroad": "bin/nearley-railroad.js",
6386
+
"nearley-test": "bin/nearley-test.js",
6387
+
"nearley-unparse": "bin/nearley-unparse.js",
6388
+
"nearleyc": "bin/nearleyc.js"
6389
+
},
6390
+
"funding": {
6391
+
"type": "individual",
6392
+
"url": "https://nearley.js.org/#give-to-nearley"
6393
+
}
6394
+
},
6395
+
"node_modules/nearley/node_modules/commander": {
6396
+
"version": "2.20.3",
6397
+
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
6398
+
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
6399
+
"dev": true,
6400
+
"license": "MIT"
6401
+
},
6402
+
"node_modules/next-themes": {
6403
+
"version": "0.4.6",
6404
+
"resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.4.6.tgz",
6405
+
"integrity": "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==",
6406
+
"license": "MIT",
6407
+
"peerDependencies": {
6408
+
"react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc",
6409
+
"react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc"
6410
+
}
6411
+
},
6412
+
"node_modules/node-releases": {
6413
+
"version": "2.0.19",
6414
+
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
6415
+
"integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
6416
+
"license": "MIT"
6417
+
},
6418
+
"node_modules/node-sql-parser": {
6419
+
"version": "4.18.0",
6420
+
"resolved": "https://registry.npmjs.org/node-sql-parser/-/node-sql-parser-4.18.0.tgz",
6421
+
"integrity": "sha512-2YEOR5qlI1zUFbGMLKNfsrR5JUvFg9LxIRVE+xJe962pfVLH0rnItqLzv96XVs1Y1UIR8FxsXAuvX/lYAWZ2BQ==",
6422
+
"dev": true,
6423
+
"license": "Apache-2.0",
6424
+
"dependencies": {
6425
+
"big-integer": "^1.6.48"
6426
+
},
6427
+
"engines": {
6428
+
"node": ">=8"
6429
+
}
6430
+
},
6431
+
"node_modules/nopt": {
6432
+
"version": "7.2.1",
6433
+
"resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz",
6434
+
"integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==",
6435
+
"dev": true,
6436
+
"license": "ISC",
6437
+
"dependencies": {
6438
+
"abbrev": "^2.0.0"
6439
+
},
6440
+
"bin": {
6441
+
"nopt": "bin/nopt.js"
6442
+
},
6443
+
"engines": {
6444
+
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
6445
+
}
6446
+
},
6447
+
"node_modules/normalize-path": {
6448
+
"version": "3.0.0",
6449
+
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
6450
+
"integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
6451
+
"license": "MIT",
6452
+
"engines": {
6453
+
"node": ">=0.10.0"
6454
+
}
6455
+
},
6456
+
"node_modules/normalize-range": {
6457
+
"version": "0.1.2",
6458
+
"resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
6459
+
"integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
6460
+
"license": "MIT",
6461
+
"engines": {
6462
+
"node": ">=0.10.0"
6463
+
}
6464
+
},
6465
+
"node_modules/object-assign": {
6466
+
"version": "4.1.1",
6467
+
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
6468
+
"integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
6469
+
"license": "MIT",
6470
+
"engines": {
6471
+
"node": ">=0.10.0"
6472
+
}
6473
+
},
6474
+
"node_modules/object-hash": {
6475
+
"version": "3.0.0",
6476
+
"resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
6477
+
"integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
6478
+
"license": "MIT",
6479
+
"engines": {
6480
+
"node": ">= 6"
6481
+
}
6482
+
},
6483
+
"node_modules/object-inspect": {
6484
+
"version": "1.13.4",
6485
+
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
6486
+
"integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
6487
+
"dev": true,
6488
+
"license": "MIT",
6489
+
"engines": {
6490
+
"node": ">= 0.4"
6491
+
},
6492
+
"funding": {
6493
+
"url": "https://github.com/sponsors/ljharb"
6494
+
}
6495
+
},
6496
+
"node_modules/object-keys": {
6497
+
"version": "1.1.1",
6498
+
"resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
6499
+
"integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
6500
+
"dev": true,
6501
+
"license": "MIT",
6502
+
"engines": {
6503
+
"node": ">= 0.4"
6504
+
}
6505
+
},
6506
+
"node_modules/object.assign": {
6507
+
"version": "4.1.7",
6508
+
"resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz",
6509
+
"integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==",
6510
+
"dev": true,
6511
+
"license": "MIT",
6512
+
"dependencies": {
6513
+
"call-bind": "^1.0.8",
6514
+
"call-bound": "^1.0.3",
6515
+
"define-properties": "^1.2.1",
6516
+
"es-object-atoms": "^1.0.0",
6517
+
"has-symbols": "^1.1.0",
6518
+
"object-keys": "^1.1.1"
6519
+
},
6520
+
"engines": {
6521
+
"node": ">= 0.4"
6522
+
},
6523
+
"funding": {
6524
+
"url": "https://github.com/sponsors/ljharb"
6525
+
}
6526
+
},
6527
+
"node_modules/object.entries": {
6528
+
"version": "1.1.9",
6529
+
"resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz",
6530
+
"integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==",
6531
+
"dev": true,
6532
+
"license": "MIT",
6533
+
"dependencies": {
6534
+
"call-bind": "^1.0.8",
6535
+
"call-bound": "^1.0.4",
6536
+
"define-properties": "^1.2.1",
6537
+
"es-object-atoms": "^1.1.1"
6538
+
},
6539
+
"engines": {
6540
+
"node": ">= 0.4"
6541
+
}
6542
+
},
6543
+
"node_modules/object.fromentries": {
6544
+
"version": "2.0.8",
6545
+
"resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz",
6546
+
"integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==",
6547
+
"dev": true,
6548
+
"license": "MIT",
6549
+
"dependencies": {
6550
+
"call-bind": "^1.0.7",
6551
+
"define-properties": "^1.2.1",
6552
+
"es-abstract": "^1.23.2",
6553
+
"es-object-atoms": "^1.0.0"
6554
+
},
6555
+
"engines": {
6556
+
"node": ">= 0.4"
6557
+
},
6558
+
"funding": {
6559
+
"url": "https://github.com/sponsors/ljharb"
6560
+
}
6561
+
},
6562
+
"node_modules/object.values": {
6563
+
"version": "1.2.1",
6564
+
"resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz",
6565
+
"integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==",
6566
+
"dev": true,
6567
+
"license": "MIT",
6568
+
"dependencies": {
6569
+
"call-bind": "^1.0.8",
6570
+
"call-bound": "^1.0.3",
6571
+
"define-properties": "^1.2.1",
6572
+
"es-object-atoms": "^1.0.0"
6573
+
},
6574
+
"engines": {
6575
+
"node": ">= 0.4"
6576
+
},
6577
+
"funding": {
6578
+
"url": "https://github.com/sponsors/ljharb"
6579
+
}
6580
+
},
6581
+
"node_modules/optionator": {
6582
+
"version": "0.9.4",
6583
+
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
6584
+
"integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
6585
+
"dev": true,
6586
+
"license": "MIT",
6587
+
"dependencies": {
6588
+
"deep-is": "^0.1.3",
6589
+
"fast-levenshtein": "^2.0.6",
6590
+
"levn": "^0.4.1",
6591
+
"prelude-ls": "^1.2.1",
6592
+
"type-check": "^0.4.0",
6593
+
"word-wrap": "^1.2.5"
6594
+
},
6595
+
"engines": {
6596
+
"node": ">= 0.8.0"
6597
+
}
6598
+
},
6599
+
"node_modules/os-homedir": {
6600
+
"version": "1.0.2",
6601
+
"resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
6602
+
"integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==",
6603
+
"dev": true,
6604
+
"license": "MIT",
6605
+
"engines": {
6606
+
"node": ">=0.10.0"
6607
+
}
6608
+
},
6609
+
"node_modules/own-keys": {
6610
+
"version": "1.0.1",
6611
+
"resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz",
6612
+
"integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==",
6613
+
"dev": true,
6614
+
"license": "MIT",
6615
+
"dependencies": {
6616
+
"get-intrinsic": "^1.2.6",
6617
+
"object-keys": "^1.1.1",
6618
+
"safe-push-apply": "^1.0.0"
6619
+
},
6620
+
"engines": {
6621
+
"node": ">= 0.4"
6622
+
},
6623
+
"funding": {
6624
+
"url": "https://github.com/sponsors/ljharb"
6625
+
}
6626
+
},
6627
+
"node_modules/p-limit": {
6628
+
"version": "3.1.0",
6629
+
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
6630
+
"integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
6631
+
"dev": true,
6632
+
"license": "MIT",
6633
+
"dependencies": {
6634
+
"yocto-queue": "^0.1.0"
6635
+
},
6636
+
"engines": {
6637
+
"node": ">=10"
6638
+
},
6639
+
"funding": {
6640
+
"url": "https://github.com/sponsors/sindresorhus"
6641
+
}
6642
+
},
6643
+
"node_modules/p-locate": {
6644
+
"version": "5.0.0",
6645
+
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
6646
+
"integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
6647
+
"dev": true,
6648
+
"license": "MIT",
6649
+
"dependencies": {
6650
+
"p-limit": "^3.0.2"
6651
+
},
6652
+
"engines": {
6653
+
"node": ">=10"
6654
+
},
6655
+
"funding": {
6656
+
"url": "https://github.com/sponsors/sindresorhus"
6657
+
}
6658
+
},
6659
+
"node_modules/package-json-from-dist": {
6660
+
"version": "1.0.1",
6661
+
"resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
6662
+
"integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
6663
+
"license": "BlueOak-1.0.0"
6664
+
},
6665
+
"node_modules/parent-module": {
6666
+
"version": "1.0.1",
6667
+
"resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
6668
+
"integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
6669
+
"dev": true,
6670
+
"license": "MIT",
6671
+
"dependencies": {
6672
+
"callsites": "^3.0.0"
6673
+
},
6674
+
"engines": {
6675
+
"node": ">=6"
6676
+
}
6677
+
},
6678
+
"node_modules/path-exists": {
6679
+
"version": "4.0.0",
6680
+
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
6681
+
"integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
6682
+
"dev": true,
6683
+
"license": "MIT",
6684
+
"engines": {
6685
+
"node": ">=8"
6686
+
}
6687
+
},
6688
+
"node_modules/path-key": {
6689
+
"version": "3.1.1",
6690
+
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
6691
+
"integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
6692
+
"license": "MIT",
6693
+
"engines": {
6694
+
"node": ">=8"
6695
+
}
6696
+
},
6697
+
"node_modules/path-parse": {
6698
+
"version": "1.0.7",
6699
+
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
6700
+
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
6701
+
"license": "MIT"
6702
+
},
6703
+
"node_modules/path-scurry": {
6704
+
"version": "1.11.1",
6705
+
"resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
6706
+
"integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
6707
+
"license": "BlueOak-1.0.0",
6708
+
"dependencies": {
6709
+
"lru-cache": "^10.2.0",
6710
+
"minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
6711
+
},
6712
+
"engines": {
6713
+
"node": ">=16 || 14 >=14.18"
6714
+
},
6715
+
"funding": {
6716
+
"url": "https://github.com/sponsors/isaacs"
6717
+
}
6718
+
},
6719
+
"node_modules/path-scurry/node_modules/lru-cache": {
6720
+
"version": "10.4.3",
6721
+
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
6722
+
"integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
6723
+
"license": "ISC"
6724
+
},
6725
+
"node_modules/pathe": {
6726
+
"version": "2.0.3",
6727
+
"resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
6728
+
"integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
6729
+
"dev": true,
6730
+
"license": "MIT"
6731
+
},
6732
+
"node_modules/php-parser": {
6733
+
"version": "3.2.2",
6734
+
"resolved": "https://registry.npmjs.org/php-parser/-/php-parser-3.2.2.tgz",
6735
+
"integrity": "sha512-voj3rzCJmEbwHwH3QteON28wA6K+JbcaJEofyUZkUXmcViiXofjbSbcE5PtqtjX6nstnnAEYCFoRq0mkjP5/cg==",
6736
+
"dev": true,
6737
+
"license": "BSD-3-Clause"
6738
+
},
6739
+
"node_modules/picocolors": {
6740
+
"version": "1.1.1",
6741
+
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
6742
+
"integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
6743
+
"license": "ISC"
6744
+
},
6745
+
"node_modules/picomatch": {
6746
+
"version": "2.3.1",
6747
+
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
6748
+
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
6749
+
"license": "MIT",
6750
+
"engines": {
6751
+
"node": ">=8.6"
6752
+
},
6753
+
"funding": {
6754
+
"url": "https://github.com/sponsors/jonschlinkert"
6755
+
}
6756
+
},
6757
+
"node_modules/pify": {
6758
+
"version": "2.3.0",
6759
+
"resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
6760
+
"integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
6761
+
"license": "MIT",
6762
+
"engines": {
6763
+
"node": ">=0.10.0"
6764
+
}
6765
+
},
6766
+
"node_modules/pirates": {
6767
+
"version": "4.0.7",
6768
+
"resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz",
6769
+
"integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==",
6770
+
"license": "MIT",
6771
+
"engines": {
6772
+
"node": ">= 6"
6773
+
}
6774
+
},
6775
+
"node_modules/pkg-types": {
6776
+
"version": "1.3.1",
6777
+
"resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz",
6778
+
"integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==",
6779
+
"dev": true,
6780
+
"license": "MIT",
6781
+
"dependencies": {
6782
+
"confbox": "^0.1.8",
6783
+
"mlly": "^1.7.4",
6784
+
"pathe": "^2.0.1"
6785
+
}
6786
+
},
6787
+
"node_modules/possible-typed-array-names": {
6788
+
"version": "1.1.0",
6789
+
"resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz",
6790
+
"integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==",
6791
+
"dev": true,
6792
+
"license": "MIT",
6793
+
"engines": {
6794
+
"node": ">= 0.4"
6795
+
}
6796
+
},
6797
+
"node_modules/postcss": {
6798
+
"version": "8.5.6",
6799
+
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
6800
+
"integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
6801
+
"funding": [
6802
+
{
6803
+
"type": "opencollective",
6804
+
"url": "https://opencollective.com/postcss/"
6805
+
},
6806
+
{
6807
+
"type": "tidelift",
6808
+
"url": "https://tidelift.com/funding/github/npm/postcss"
6809
+
},
6810
+
{
6811
+
"type": "github",
6812
+
"url": "https://github.com/sponsors/ai"
6813
+
}
6814
+
],
6815
+
"license": "MIT",
6816
+
"dependencies": {
6817
+
"nanoid": "^3.3.11",
6818
+
"picocolors": "^1.1.1",
6819
+
"source-map-js": "^1.2.1"
6820
+
},
6821
+
"engines": {
6822
+
"node": "^10 || ^12 || >=14"
6823
+
}
6824
+
},
6825
+
"node_modules/postcss-import": {
6826
+
"version": "15.1.0",
6827
+
"resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz",
6828
+
"integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==",
6829
+
"license": "MIT",
6830
+
"dependencies": {
6831
+
"postcss-value-parser": "^4.0.0",
6832
+
"read-cache": "^1.0.0",
6833
+
"resolve": "^1.1.7"
6834
+
},
6835
+
"engines": {
6836
+
"node": ">=14.0.0"
6837
+
},
6838
+
"peerDependencies": {
6839
+
"postcss": "^8.0.0"
6840
+
}
6841
+
},
6842
+
"node_modules/postcss-import/node_modules/resolve": {
6843
+
"version": "1.22.10",
6844
+
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
6845
+
"integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==",
6846
+
"license": "MIT",
6847
+
"dependencies": {
6848
+
"is-core-module": "^2.16.0",
6849
+
"path-parse": "^1.0.7",
6850
+
"supports-preserve-symlinks-flag": "^1.0.0"
6851
+
},
6852
+
"bin": {
6853
+
"resolve": "bin/resolve"
6854
+
},
6855
+
"engines": {
6856
+
"node": ">= 0.4"
6857
+
},
6858
+
"funding": {
6859
+
"url": "https://github.com/sponsors/ljharb"
6860
+
}
6861
+
},
6862
+
"node_modules/postcss-js": {
6863
+
"version": "4.0.1",
6864
+
"resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz",
6865
+
"integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==",
6866
+
"license": "MIT",
6867
+
"dependencies": {
6868
+
"camelcase-css": "^2.0.1"
6869
+
},
6870
+
"engines": {
6871
+
"node": "^12 || ^14 || >= 16"
6872
+
},
6873
+
"funding": {
6874
+
"type": "opencollective",
6875
+
"url": "https://opencollective.com/postcss/"
6876
+
},
6877
+
"peerDependencies": {
6878
+
"postcss": "^8.4.21"
6879
+
}
6880
+
},
6881
+
"node_modules/postcss-load-config": {
6882
+
"version": "4.0.2",
6883
+
"resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz",
6884
+
"integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==",
6885
+
"funding": [
6886
+
{
6887
+
"type": "opencollective",
6888
+
"url": "https://opencollective.com/postcss/"
6889
+
},
6890
+
{
6891
+
"type": "github",
6892
+
"url": "https://github.com/sponsors/ai"
6893
+
}
6894
+
],
6895
+
"license": "MIT",
6896
+
"dependencies": {
6897
+
"lilconfig": "^3.0.0",
6898
+
"yaml": "^2.3.4"
6899
+
},
6900
+
"engines": {
6901
+
"node": ">= 14"
6902
+
},
6903
+
"peerDependencies": {
6904
+
"postcss": ">=8.0.9",
6905
+
"ts-node": ">=9.0.0"
6906
+
},
6907
+
"peerDependenciesMeta": {
6908
+
"postcss": {
6909
+
"optional": true
6910
+
},
6911
+
"ts-node": {
6912
+
"optional": true
6913
+
}
6914
+
}
6915
+
},
6916
+
"node_modules/postcss-nested": {
6917
+
"version": "6.2.0",
6918
+
"resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz",
6919
+
"integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==",
6920
+
"funding": [
6921
+
{
6922
+
"type": "opencollective",
6923
+
"url": "https://opencollective.com/postcss/"
6924
+
},
6925
+
{
6926
+
"type": "github",
6927
+
"url": "https://github.com/sponsors/ai"
6928
+
}
6929
+
],
6930
+
"license": "MIT",
6931
+
"dependencies": {
6932
+
"postcss-selector-parser": "^6.1.1"
6933
+
},
6934
+
"engines": {
6935
+
"node": ">=12.0"
6936
+
},
6937
+
"peerDependencies": {
6938
+
"postcss": "^8.2.14"
6939
+
}
6940
+
},
6941
+
"node_modules/postcss-selector-parser": {
6942
+
"version": "6.1.2",
6943
+
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
6944
+
"integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
6945
+
"license": "MIT",
6946
+
"dependencies": {
6947
+
"cssesc": "^3.0.0",
6948
+
"util-deprecate": "^1.0.2"
6949
+
},
6950
+
"engines": {
6951
+
"node": ">=4"
6952
+
}
6953
+
},
6954
+
"node_modules/postcss-value-parser": {
6955
+
"version": "4.2.0",
6956
+
"resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
6957
+
"integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
6958
+
"license": "MIT"
6959
+
},
6960
+
"node_modules/prelude-ls": {
6961
+
"version": "1.2.1",
6962
+
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
6963
+
"integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
6964
+
"dev": true,
6965
+
"license": "MIT",
6966
+
"engines": {
6967
+
"node": ">= 0.8.0"
6968
+
}
6969
+
},
6970
+
"node_modules/prettier": {
6971
+
"version": "3.5.3",
6972
+
"resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz",
6973
+
"integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==",
6974
+
"dev": true,
6975
+
"license": "MIT",
6976
+
"bin": {
6977
+
"prettier": "bin/prettier.cjs"
6978
+
},
6979
+
"engines": {
6980
+
"node": ">=14"
6981
+
},
6982
+
"funding": {
6983
+
"url": "https://github.com/prettier/prettier?sponsor=1"
6984
+
}
6985
+
},
6986
+
"node_modules/prettier-linter-helpers": {
6987
+
"version": "1.0.0",
6988
+
"resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
6989
+
"integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
6990
+
"dev": true,
6991
+
"license": "MIT",
6992
+
"dependencies": {
6993
+
"fast-diff": "^1.1.2"
6994
+
},
6995
+
"engines": {
6996
+
"node": ">=6.0.0"
6997
+
}
6998
+
},
6999
+
"node_modules/prettier-plugin-astro": {
7000
+
"version": "0.14.1",
7001
+
"resolved": "https://registry.npmjs.org/prettier-plugin-astro/-/prettier-plugin-astro-0.14.1.tgz",
7002
+
"integrity": "sha512-RiBETaaP9veVstE4vUwSIcdATj6dKmXljouXc/DDNwBSPTp8FRkLGDSGFClKsAFeeg+13SB0Z1JZvbD76bigJw==",
7003
+
"dev": true,
7004
+
"license": "MIT",
7005
+
"dependencies": {
7006
+
"@astrojs/compiler": "^2.9.1",
7007
+
"prettier": "^3.0.0",
7008
+
"sass-formatter": "^0.7.6"
7009
+
},
7010
+
"engines": {
7011
+
"node": "^14.15.0 || >=16.0.0"
7012
+
}
7013
+
},
7014
+
"node_modules/prettier-plugin-classnames": {
7015
+
"version": "0.7.7",
7016
+
"resolved": "https://registry.npmjs.org/prettier-plugin-classnames/-/prettier-plugin-classnames-0.7.7.tgz",
7017
+
"integrity": "sha512-qn+hhpru++ieZ6B6mKt7j6ETPvgOQnJvJ51Yl4rnHneK/vnFxEFOpzFmp1Urcs7Zd/JgUKiaoHIiSSw3LmPy/Q==",
7018
+
"dev": true,
7019
+
"license": "MIT",
7020
+
"engines": {
7021
+
"node": ">=14"
7022
+
},
7023
+
"peerDependencies": {
7024
+
"prettier": "^2 || ^3",
7025
+
"prettier-plugin-astro": "*",
7026
+
"prettier-plugin-svelte": "*"
7027
+
},
7028
+
"peerDependenciesMeta": {
7029
+
"prettier-plugin-astro": {
7030
+
"optional": true
7031
+
},
7032
+
"prettier-plugin-svelte": {
7033
+
"optional": true
7034
+
}
7035
+
}
7036
+
},
7037
+
"node_modules/prettier-plugin-ini": {
7038
+
"version": "1.3.0",
7039
+
"resolved": "https://registry.npmjs.org/prettier-plugin-ini/-/prettier-plugin-ini-1.3.0.tgz",
7040
+
"integrity": "sha512-kX1KnPwITCTtYV0MTBZQKuFLxcNcbHOS9r7Ta1jHLLvRvZRTzHHqX0MEZMrCkedjLuxpQSgzr4aC5IRd+R3FPw==",
7041
+
"dev": true,
7042
+
"license": "MIT",
7043
+
"dependencies": {
7044
+
"prettier": ">=3.0.0-alpha.3"
7045
+
}
7046
+
},
7047
+
"node_modules/prettier-plugin-jsdoc": {
7048
+
"version": "1.3.2",
7049
+
"resolved": "https://registry.npmjs.org/prettier-plugin-jsdoc/-/prettier-plugin-jsdoc-1.3.2.tgz",
7050
+
"integrity": "sha512-LNi9eq0TjyZn/PUNf/SYQxxUvGg5FLK4alEbi3i/S+2JbMyTu790c/puFueXzx09KP44oWCJ+TaHRyM/a0rKJQ==",
7051
+
"dev": true,
7052
+
"license": "MIT",
7053
+
"dependencies": {
7054
+
"binary-searching": "^2.0.5",
7055
+
"comment-parser": "^1.4.0",
7056
+
"mdast-util-from-markdown": "^2.0.0"
7057
+
},
7058
+
"engines": {
7059
+
"node": ">=14.13.1 || >=16.0.0"
7060
+
},
7061
+
"peerDependencies": {
7062
+
"prettier": "^3.0.0"
7063
+
}
7064
+
},
7065
+
"node_modules/prettier-plugin-merge": {
7066
+
"version": "0.7.3",
7067
+
"resolved": "https://registry.npmjs.org/prettier-plugin-merge/-/prettier-plugin-merge-0.7.3.tgz",
7068
+
"integrity": "sha512-5b4h5MZRFFTqlGWMWS3KOFUWTfEesXdMPjaT5LbTw9Jck7Ghu1hjrhM6P0Dfrzhf0zrqdwIjyFMtF6YG90dOXg==",
7069
+
"dev": true,
7070
+
"license": "MIT",
7071
+
"dependencies": {
7072
+
"diff": "5.1.0"
7073
+
},
7074
+
"engines": {
7075
+
"node": ">=14"
7076
+
},
7077
+
"peerDependencies": {
7078
+
"prettier": "^2 || ^3"
7079
+
}
7080
+
},
7081
+
"node_modules/prettier-plugin-multiline-arrays": {
7082
+
"version": "4.0.3",
7083
+
"resolved": "https://registry.npmjs.org/prettier-plugin-multiline-arrays/-/prettier-plugin-multiline-arrays-4.0.3.tgz",
7084
+
"integrity": "sha512-H1f/0zbvlO/FR0Fmyl31sSBodsIZkuQF0Omi9BrptLU31rZ+Almt9BbrE8IS3BFT/DGKePKb55XqN660LTnmsQ==",
7085
+
"dev": true,
7086
+
"license": "(MIT or CC0 1.0)",
7087
+
"dependencies": {
7088
+
"@augment-vir/common": "^31.10.1",
7089
+
"proxy-vir": "^2.0.1"
7090
+
},
7091
+
"engines": {
7092
+
"node": ">=20"
7093
+
},
7094
+
"peerDependencies": {
7095
+
"prettier": ">=3.0.0"
7096
+
}
7097
+
},
7098
+
"node_modules/prettier-plugin-nginx": {
7099
+
"version": "1.0.3",
7100
+
"resolved": "https://registry.npmjs.org/prettier-plugin-nginx/-/prettier-plugin-nginx-1.0.3.tgz",
7101
+
"integrity": "sha512-vV5q85s8XnV6NEgvz1gVLfZhmxAxY03MyOYj2ApBpjFkbs00lRsRkTmqO9L39ADuD18z1RRCcfZ3eVxKhI/nqg==",
7102
+
"dev": true,
7103
+
"license": "MIT"
7104
+
},
7105
+
"node_modules/prettier-plugin-packagejson": {
7106
+
"version": "2.5.10",
7107
+
"resolved": "https://registry.npmjs.org/prettier-plugin-packagejson/-/prettier-plugin-packagejson-2.5.10.tgz",
7108
+
"integrity": "sha512-LUxATI5YsImIVSaaLJlJ3aE6wTD+nvots18U3GuQMJpUyClChaZlQrqx3dBnbhF20OnKWZyx8EgyZypQtBDtgQ==",
7109
+
"dev": true,
7110
+
"license": "MIT",
7111
+
"dependencies": {
7112
+
"sort-package-json": "2.15.1",
7113
+
"synckit": "0.9.2"
7114
+
},
7115
+
"peerDependencies": {
7116
+
"prettier": ">= 1.16.0"
7117
+
},
7118
+
"peerDependenciesMeta": {
7119
+
"prettier": {
7120
+
"optional": true
7121
+
}
7122
+
}
7123
+
},
7124
+
"node_modules/prettier-plugin-packagejson/node_modules/@pkgr/core": {
7125
+
"version": "0.1.2",
7126
+
"resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.2.tgz",
7127
+
"integrity": "sha512-fdDH1LSGfZdTH2sxdpVMw31BanV28K/Gry0cVFxaNP77neJSkd82mM8ErPNYs9e+0O7SdHBLTDzDgwUuy18RnQ==",
7128
+
"dev": true,
7129
+
"license": "MIT",
7130
+
"engines": {
7131
+
"node": "^12.20.0 || ^14.18.0 || >=16.0.0"
7132
+
},
7133
+
"funding": {
7134
+
"url": "https://opencollective.com/unts"
7135
+
}
7136
+
},
7137
+
"node_modules/prettier-plugin-packagejson/node_modules/synckit": {
7138
+
"version": "0.9.2",
7139
+
"resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz",
7140
+
"integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==",
7141
+
"dev": true,
7142
+
"license": "MIT",
7143
+
"dependencies": {
7144
+
"@pkgr/core": "^0.1.0",
7145
+
"tslib": "^2.6.2"
7146
+
},
7147
+
"engines": {
7148
+
"node": "^14.18.0 || >=16.0.0"
7149
+
},
7150
+
"funding": {
7151
+
"url": "https://opencollective.com/unts"
7152
+
}
7153
+
},
7154
+
"node_modules/prettier-plugin-prisma": {
7155
+
"version": "5.0.0",
7156
+
"resolved": "https://registry.npmjs.org/prettier-plugin-prisma/-/prettier-plugin-prisma-5.0.0.tgz",
7157
+
"integrity": "sha512-jTJV04D9+yF7ziOOMs7CJe4ijgAH7DEGjt0SAWAToGNRy1H6BEhvcKA2UQH6gC6KVW5zeeOSAvsoiDDTt9oKXg==",
7158
+
"dev": true,
7159
+
"license": "MIT",
7160
+
"dependencies": {
7161
+
"@prisma/prisma-schema-wasm": "4.17.0-26.6b0aef69b7cdfc787f822ecd7cdc76d5f1991584"
7162
+
},
7163
+
"engines": {
7164
+
"node": ">=14",
7165
+
"npm": ">=8"
7166
+
},
7167
+
"peerDependencies": {
7168
+
"prettier": ">=2 || >=3"
7169
+
}
7170
+
},
7171
+
"node_modules/prettier-plugin-sh": {
7172
+
"version": "0.15.0",
7173
+
"resolved": "https://registry.npmjs.org/prettier-plugin-sh/-/prettier-plugin-sh-0.15.0.tgz",
7174
+
"integrity": "sha512-U0PikJr/yr2bzzARl43qI0mApBj0C1xdAfA04AZa6LnvIKawXHhuy2fFo6LNA7weRzGlAiNbaEFfKMFo0nZr/A==",
7175
+
"dev": true,
7176
+
"license": "MIT",
7177
+
"dependencies": {
7178
+
"mvdan-sh": "^0.10.1",
7179
+
"sh-syntax": "^0.4.2"
7180
+
},
7181
+
"engines": {
7182
+
"node": ">=16.0.0"
7183
+
},
7184
+
"funding": {
7185
+
"url": "https://opencollective.com/unts"
7186
+
},
7187
+
"peerDependencies": {
7188
+
"prettier": "^3.0.3"
7189
+
}
7190
+
},
7191
+
"node_modules/prettier-plugin-sort-json": {
7192
+
"version": "4.1.1",
7193
+
"resolved": "https://registry.npmjs.org/prettier-plugin-sort-json/-/prettier-plugin-sort-json-4.1.1.tgz",
7194
+
"integrity": "sha512-uJ49wCzwJ/foKKV4tIPxqi4jFFvwUzw4oACMRG2dcmDhBKrxBv0L2wSKkAqHCmxKCvj0xcCZS4jO2kSJO/tRJw==",
7195
+
"dev": true,
7196
+
"license": "MIT",
7197
+
"engines": {
7198
+
"node": ">=18.0.0"
7199
+
},
7200
+
"peerDependencies": {
7201
+
"prettier": "^3.0.0"
7202
+
}
7203
+
},
7204
+
"node_modules/prettier-plugin-sql": {
7205
+
"version": "0.18.1",
7206
+
"resolved": "https://registry.npmjs.org/prettier-plugin-sql/-/prettier-plugin-sql-0.18.1.tgz",
7207
+
"integrity": "sha512-2+Nob2sg7hzLAKJoE6sfgtkhBZCqOzrWHZPvE4Kee/e80oOyI4qwy9vypeltqNBJwTtq3uiKPrCxlT03bBpOaw==",
7208
+
"dev": true,
7209
+
"license": "MIT",
7210
+
"dependencies": {
7211
+
"jsox": "^1.2.119",
7212
+
"node-sql-parser": "^4.12.0",
7213
+
"sql-formatter": "^15.0.2",
7214
+
"tslib": "^2.6.2"
7215
+
},
7216
+
"engines": {
7217
+
"node": "^14.18.0 || >=16.0.0"
7218
+
},
7219
+
"funding": {
7220
+
"url": "https://opencollective.com/unts"
7221
+
},
7222
+
"peerDependencies": {
7223
+
"prettier": "^3.0.3"
7224
+
}
7225
+
},
7226
+
"node_modules/prettier-plugin-tailwindcss": {
7227
+
"version": "0.6.11",
7228
+
"resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.6.11.tgz",
7229
+
"integrity": "sha512-YxaYSIvZPAqhrrEpRtonnrXdghZg1irNg4qrjboCXrpybLWVs55cW2N3juhspVJiO0JBvYJT8SYsJpc8OQSnsA==",
7230
+
"dev": true,
7231
+
"license": "MIT",
7232
+
"engines": {
7233
+
"node": ">=14.21.3"
7234
+
},
7235
+
"peerDependencies": {
7236
+
"@ianvs/prettier-plugin-sort-imports": "*",
7237
+
"@prettier/plugin-pug": "*",
7238
+
"@shopify/prettier-plugin-liquid": "*",
7239
+
"@trivago/prettier-plugin-sort-imports": "*",
7240
+
"@zackad/prettier-plugin-twig": "*",
7241
+
"prettier": "^3.0",
7242
+
"prettier-plugin-astro": "*",
7243
+
"prettier-plugin-css-order": "*",
7244
+
"prettier-plugin-import-sort": "*",
7245
+
"prettier-plugin-jsdoc": "*",
7246
+
"prettier-plugin-marko": "*",
7247
+
"prettier-plugin-multiline-arrays": "*",
7248
+
"prettier-plugin-organize-attributes": "*",
7249
+
"prettier-plugin-organize-imports": "*",
7250
+
"prettier-plugin-sort-imports": "*",
7251
+
"prettier-plugin-style-order": "*",
7252
+
"prettier-plugin-svelte": "*"
7253
+
},
7254
+
"peerDependenciesMeta": {
7255
+
"@ianvs/prettier-plugin-sort-imports": {
7256
+
"optional": true
7257
+
},
7258
+
"@prettier/plugin-pug": {
7259
+
"optional": true
7260
+
},
7261
+
"@shopify/prettier-plugin-liquid": {
7262
+
"optional": true
7263
+
},
7264
+
"@trivago/prettier-plugin-sort-imports": {
7265
+
"optional": true
7266
+
},
7267
+
"@zackad/prettier-plugin-twig": {
7268
+
"optional": true
7269
+
},
7270
+
"prettier-plugin-astro": {
7271
+
"optional": true
7272
+
},
7273
+
"prettier-plugin-css-order": {
7274
+
"optional": true
7275
+
},
7276
+
"prettier-plugin-import-sort": {
7277
+
"optional": true
7278
+
},
7279
+
"prettier-plugin-jsdoc": {
7280
+
"optional": true
7281
+
},
7282
+
"prettier-plugin-marko": {
7283
+
"optional": true
7284
+
},
7285
+
"prettier-plugin-multiline-arrays": {
7286
+
"optional": true
7287
+
},
7288
+
"prettier-plugin-organize-attributes": {
7289
+
"optional": true
7290
+
},
7291
+
"prettier-plugin-organize-imports": {
7292
+
"optional": true
7293
+
},
7294
+
"prettier-plugin-sort-imports": {
7295
+
"optional": true
7296
+
},
7297
+
"prettier-plugin-style-order": {
7298
+
"optional": true
7299
+
},
7300
+
"prettier-plugin-svelte": {
7301
+
"optional": true
7302
+
}
7303
+
}
7304
+
},
7305
+
"node_modules/prop-types": {
7306
+
"version": "15.8.1",
7307
+
"resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
7308
+
"integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
7309
+
"dev": true,
7310
+
"license": "MIT",
7311
+
"dependencies": {
7312
+
"loose-envify": "^1.4.0",
7313
+
"object-assign": "^4.1.1",
7314
+
"react-is": "^16.13.1"
7315
+
}
7316
+
},
7317
+
"node_modules/proto-list": {
7318
+
"version": "1.2.4",
7319
+
"resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz",
7320
+
"integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==",
7321
+
"dev": true,
7322
+
"license": "ISC"
7323
+
},
7324
+
"node_modules/proxy-vir": {
7325
+
"version": "2.0.1",
7326
+
"resolved": "https://registry.npmjs.org/proxy-vir/-/proxy-vir-2.0.1.tgz",
7327
+
"integrity": "sha512-hjy5mWzHZhgRGh0f90f0Bz3VrGUe0T+AlhwnETakzRdvaN9RtPYLQG1+ZuEzSDK95FAhPYd26nEi1xVrXqvBwg==",
7328
+
"dev": true,
7329
+
"license": "(MIT or CC0 1.0)",
7330
+
"dependencies": {
7331
+
"@augment-vir/assert": "^31.1.0",
7332
+
"@augment-vir/common": "^31.1.0"
7333
+
},
7334
+
"engines": {
7335
+
"node": ">=22"
7336
+
}
7337
+
},
7338
+
"node_modules/punycode": {
7339
+
"version": "2.3.1",
7340
+
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
7341
+
"integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
7342
+
"dev": true,
7343
+
"license": "MIT",
7344
+
"engines": {
7345
+
"node": ">=6"
7346
+
}
7347
+
},
7348
+
"node_modules/queue-microtask": {
7349
+
"version": "1.2.3",
7350
+
"resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
7351
+
"integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
7352
+
"funding": [
7353
+
{
7354
+
"type": "github",
7355
+
"url": "https://github.com/sponsors/feross"
7356
+
},
7357
+
{
7358
+
"type": "patreon",
7359
+
"url": "https://www.patreon.com/feross"
7360
+
},
7361
+
{
7362
+
"type": "consulting",
7363
+
"url": "https://feross.org/support"
7364
+
}
7365
+
],
7366
+
"license": "MIT"
7367
+
},
7368
+
"node_modules/railroad-diagrams": {
7369
+
"version": "1.0.0",
7370
+
"resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz",
7371
+
"integrity": "sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==",
7372
+
"dev": true,
7373
+
"license": "CC0-1.0"
7374
+
},
7375
+
"node_modules/randexp": {
7376
+
"version": "0.4.6",
7377
+
"resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz",
7378
+
"integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==",
7379
+
"dev": true,
7380
+
"license": "MIT",
7381
+
"dependencies": {
7382
+
"discontinuous-range": "1.0.0",
7383
+
"ret": "~0.1.10"
7384
+
},
7385
+
"engines": {
7386
+
"node": ">=0.12"
7387
+
}
7388
+
},
7389
+
"node_modules/react": {
7390
+
"version": "18.3.1",
7391
+
"resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
7392
+
"integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
7393
+
"license": "MIT",
7394
+
"dependencies": {
7395
+
"loose-envify": "^1.1.0"
7396
+
},
7397
+
"engines": {
7398
+
"node": ">=0.10.0"
7399
+
}
7400
+
},
7401
+
"node_modules/react-dom": {
7402
+
"version": "18.3.1",
7403
+
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
7404
+
"integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
7405
+
"license": "MIT",
7406
+
"dependencies": {
7407
+
"loose-envify": "^1.1.0",
7408
+
"scheduler": "^0.23.2"
7409
+
},
7410
+
"peerDependencies": {
7411
+
"react": "^18.3.1"
7412
+
}
7413
+
},
7414
+
"node_modules/react-fast-compare": {
7415
+
"version": "3.2.2",
7416
+
"resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz",
7417
+
"integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==",
7418
+
"license": "MIT"
7419
+
},
7420
+
"node_modules/react-helmet-async": {
7421
+
"version": "2.0.5",
7422
+
"resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-2.0.5.tgz",
7423
+
"integrity": "sha512-rYUYHeus+i27MvFE+Jaa4WsyBKGkL6qVgbJvSBoX8mbsWoABJXdEO0bZyi0F6i+4f0NuIb8AvqPMj3iXFHkMwg==",
7424
+
"license": "Apache-2.0",
7425
+
"dependencies": {
7426
+
"invariant": "^2.2.4",
7427
+
"react-fast-compare": "^3.2.2",
7428
+
"shallowequal": "^1.1.0"
7429
+
},
7430
+
"peerDependencies": {
7431
+
"react": "^16.6.0 || ^17.0.0 || ^18.0.0"
7432
+
}
7433
+
},
7434
+
"node_modules/react-is": {
7435
+
"version": "16.13.1",
7436
+
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
7437
+
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
7438
+
"dev": true,
7439
+
"license": "MIT"
7440
+
},
7441
+
"node_modules/react-refresh": {
7442
+
"version": "0.14.2",
7443
+
"resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz",
7444
+
"integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==",
7445
+
"dev": true,
7446
+
"license": "MIT",
7447
+
"engines": {
7448
+
"node": ">=0.10.0"
7449
+
}
7450
+
},
7451
+
"node_modules/react-router": {
7452
+
"version": "6.30.0",
7453
+
"resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.0.tgz",
7454
+
"integrity": "sha512-D3X8FyH9nBcTSHGdEKurK7r8OYE1kKFn3d/CF+CoxbSHkxU7o37+Uh7eAHRXr6k2tSExXYO++07PeXJtA/dEhQ==",
7455
+
"license": "MIT",
7456
+
"dependencies": {
7457
+
"@remix-run/router": "1.23.0"
7458
+
},
7459
+
"engines": {
7460
+
"node": ">=14.0.0"
7461
+
},
7462
+
"peerDependencies": {
7463
+
"react": ">=16.8"
7464
+
}
7465
+
},
7466
+
"node_modules/react-router-dom": {
7467
+
"version": "6.30.0",
7468
+
"resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.0.tgz",
7469
+
"integrity": "sha512-x30B78HV5tFk8ex0ITwzC9TTZMua4jGyA9IUlH1JLQYQTFyxr/ZxwOJq7evg1JX1qGVUcvhsmQSKdPncQrjTgA==",
7470
+
"license": "MIT",
7471
+
"dependencies": {
7472
+
"@remix-run/router": "1.23.0",
7473
+
"react-router": "6.30.0"
7474
+
},
7475
+
"engines": {
7476
+
"node": ">=14.0.0"
7477
+
},
7478
+
"peerDependencies": {
7479
+
"react": ">=16.8",
7480
+
"react-dom": ">=16.8"
7481
+
}
7482
+
},
7483
+
"node_modules/read-cache": {
7484
+
"version": "1.0.0",
7485
+
"resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
7486
+
"integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
7487
+
"license": "MIT",
7488
+
"dependencies": {
7489
+
"pify": "^2.3.0"
7490
+
}
7491
+
},
7492
+
"node_modules/readable-stream": {
7493
+
"version": "3.6.2",
7494
+
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
7495
+
"integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
7496
+
"dev": true,
7497
+
"license": "MIT",
7498
+
"dependencies": {
7499
+
"inherits": "^2.0.3",
7500
+
"string_decoder": "^1.1.1",
7501
+
"util-deprecate": "^1.0.1"
7502
+
},
7503
+
"engines": {
7504
+
"node": ">= 6"
7505
+
}
7506
+
},
7507
+
"node_modules/readdirp": {
7508
+
"version": "3.6.0",
7509
+
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
7510
+
"integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
7511
+
"license": "MIT",
7512
+
"dependencies": {
7513
+
"picomatch": "^2.2.1"
7514
+
},
7515
+
"engines": {
7516
+
"node": ">=8.10.0"
7517
+
}
7518
+
},
7519
+
"node_modules/reflect.getprototypeof": {
7520
+
"version": "1.0.10",
7521
+
"resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz",
7522
+
"integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==",
7523
+
"dev": true,
7524
+
"license": "MIT",
7525
+
"dependencies": {
7526
+
"call-bind": "^1.0.8",
7527
+
"define-properties": "^1.2.1",
7528
+
"es-abstract": "^1.23.9",
7529
+
"es-errors": "^1.3.0",
7530
+
"es-object-atoms": "^1.0.0",
7531
+
"get-intrinsic": "^1.2.7",
7532
+
"get-proto": "^1.0.1",
7533
+
"which-builtin-type": "^1.2.1"
7534
+
},
7535
+
"engines": {
7536
+
"node": ">= 0.4"
7537
+
},
7538
+
"funding": {
7539
+
"url": "https://github.com/sponsors/ljharb"
7540
+
}
7541
+
},
7542
+
"node_modules/regenerator-runtime": {
7543
+
"version": "0.14.1",
7544
+
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
7545
+
"integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==",
7546
+
"dev": true,
7547
+
"license": "MIT"
7548
+
},
7549
+
"node_modules/regexp-to-ast": {
7550
+
"version": "0.5.0",
7551
+
"resolved": "https://registry.npmjs.org/regexp-to-ast/-/regexp-to-ast-0.5.0.tgz",
7552
+
"integrity": "sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw==",
7553
+
"dev": true,
7554
+
"license": "MIT"
7555
+
},
7556
+
"node_modules/regexp.prototype.flags": {
7557
+
"version": "1.5.4",
7558
+
"resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz",
7559
+
"integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==",
7560
+
"dev": true,
7561
+
"license": "MIT",
7562
+
"dependencies": {
7563
+
"call-bind": "^1.0.8",
7564
+
"define-properties": "^1.2.1",
7565
+
"es-errors": "^1.3.0",
7566
+
"get-proto": "^1.0.1",
7567
+
"gopd": "^1.2.0",
7568
+
"set-function-name": "^2.0.2"
7569
+
},
7570
+
"engines": {
7571
+
"node": ">= 0.4"
7572
+
},
7573
+
"funding": {
7574
+
"url": "https://github.com/sponsors/ljharb"
7575
+
}
7576
+
},
7577
+
"node_modules/remeda": {
7578
+
"version": "2.21.2",
7579
+
"resolved": "https://registry.npmjs.org/remeda/-/remeda-2.21.2.tgz",
7580
+
"integrity": "sha512-wdhkMDou8HRpD7RnxKJ/FHJWEGXRH7jV/pb0NsdLLSoBo+G9RjtxcY41hVhogLfEMkThk6aySKjs+Yd6PnpzBA==",
7581
+
"dev": true,
7582
+
"license": "MIT",
7583
+
"dependencies": {
7584
+
"type-fest": "^4.37.0"
7585
+
}
7586
+
},
7587
+
"node_modules/require-directory": {
7588
+
"version": "2.1.1",
7589
+
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
7590
+
"integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
7591
+
"dev": true,
7592
+
"license": "MIT",
7593
+
"engines": {
7594
+
"node": ">=0.10.0"
7595
+
}
7596
+
},
7597
+
"node_modules/require-from-string": {
7598
+
"version": "2.0.2",
7599
+
"resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
7600
+
"integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
7601
+
"dev": true,
7602
+
"license": "MIT",
7603
+
"engines": {
7604
+
"node": ">=0.10.0"
7605
+
}
7606
+
},
7607
+
"node_modules/resolve": {
7608
+
"version": "2.0.0-next.5",
7609
+
"resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz",
7610
+
"integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==",
7611
+
"dev": true,
7612
+
"license": "MIT",
7613
+
"dependencies": {
7614
+
"is-core-module": "^2.13.0",
7615
+
"path-parse": "^1.0.7",
7616
+
"supports-preserve-symlinks-flag": "^1.0.0"
7617
+
},
7618
+
"bin": {
7619
+
"resolve": "bin/resolve"
7620
+
},
7621
+
"funding": {
7622
+
"url": "https://github.com/sponsors/ljharb"
7623
+
}
7624
+
},
7625
+
"node_modules/resolve-from": {
7626
+
"version": "4.0.0",
7627
+
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
7628
+
"integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
7629
+
"dev": true,
7630
+
"license": "MIT",
7631
+
"engines": {
7632
+
"node": ">=4"
7633
+
}
7634
+
},
7635
+
"node_modules/resolve-pkg-maps": {
7636
+
"version": "1.0.0",
7637
+
"resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz",
7638
+
"integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==",
7639
+
"dev": true,
7640
+
"license": "MIT",
7641
+
"funding": {
7642
+
"url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1"
7643
+
}
7644
+
},
7645
+
"node_modules/ret": {
7646
+
"version": "0.1.15",
7647
+
"resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
7648
+
"integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
7649
+
"dev": true,
7650
+
"license": "MIT",
7651
+
"engines": {
7652
+
"node": ">=0.12"
7653
+
}
7654
+
},
7655
+
"node_modules/reusify": {
7656
+
"version": "1.1.0",
7657
+
"resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
7658
+
"integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
7659
+
"license": "MIT",
7660
+
"engines": {
7661
+
"iojs": ">=1.0.0",
7662
+
"node": ">=0.10.0"
7663
+
}
7664
+
},
7665
+
"node_modules/rollup": {
7666
+
"version": "4.52.4",
7667
+
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.4.tgz",
7668
+
"integrity": "sha512-CLEVl+MnPAiKh5pl4dEWSyMTpuflgNQiLGhMv8ezD5W/qP8AKvmYpCOKRRNOh7oRKnauBZ4SyeYkMS+1VSyKwQ==",
7669
+
"dev": true,
7670
+
"license": "MIT",
7671
+
"dependencies": {
7672
+
"@types/estree": "1.0.8"
7673
+
},
7674
+
"bin": {
7675
+
"rollup": "dist/bin/rollup"
7676
+
},
7677
+
"engines": {
7678
+
"node": ">=18.0.0",
7679
+
"npm": ">=8.0.0"
7680
+
},
7681
+
"optionalDependencies": {
7682
+
"@rollup/rollup-android-arm-eabi": "4.52.4",
7683
+
"@rollup/rollup-android-arm64": "4.52.4",
7684
+
"@rollup/rollup-darwin-arm64": "4.52.4",
7685
+
"@rollup/rollup-darwin-x64": "4.52.4",
7686
+
"@rollup/rollup-freebsd-arm64": "4.52.4",
7687
+
"@rollup/rollup-freebsd-x64": "4.52.4",
7688
+
"@rollup/rollup-linux-arm-gnueabihf": "4.52.4",
7689
+
"@rollup/rollup-linux-arm-musleabihf": "4.52.4",
7690
+
"@rollup/rollup-linux-arm64-gnu": "4.52.4",
7691
+
"@rollup/rollup-linux-arm64-musl": "4.52.4",
7692
+
"@rollup/rollup-linux-loong64-gnu": "4.52.4",
7693
+
"@rollup/rollup-linux-ppc64-gnu": "4.52.4",
7694
+
"@rollup/rollup-linux-riscv64-gnu": "4.52.4",
7695
+
"@rollup/rollup-linux-riscv64-musl": "4.52.4",
7696
+
"@rollup/rollup-linux-s390x-gnu": "4.52.4",
7697
+
"@rollup/rollup-linux-x64-gnu": "4.52.4",
7698
+
"@rollup/rollup-linux-x64-musl": "4.52.4",
7699
+
"@rollup/rollup-openharmony-arm64": "4.52.4",
7700
+
"@rollup/rollup-win32-arm64-msvc": "4.52.4",
7701
+
"@rollup/rollup-win32-ia32-msvc": "4.52.4",
7702
+
"@rollup/rollup-win32-x64-gnu": "4.52.4",
7703
+
"@rollup/rollup-win32-x64-msvc": "4.52.4",
7704
+
"fsevents": "~2.3.2"
7705
+
}
7706
+
},
7707
+
"node_modules/run-parallel": {
7708
+
"version": "1.2.0",
7709
+
"resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
7710
+
"integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
7711
+
"funding": [
7712
+
{
7713
+
"type": "github",
7714
+
"url": "https://github.com/sponsors/feross"
7715
+
},
7716
+
{
7717
+
"type": "patreon",
7718
+
"url": "https://www.patreon.com/feross"
7719
+
},
7720
+
{
7721
+
"type": "consulting",
7722
+
"url": "https://feross.org/support"
7723
+
}
7724
+
],
7725
+
"license": "MIT",
7726
+
"dependencies": {
7727
+
"queue-microtask": "^1.2.2"
7728
+
}
7729
+
},
7730
+
"node_modules/s.color": {
7731
+
"version": "0.0.15",
7732
+
"resolved": "https://registry.npmjs.org/s.color/-/s.color-0.0.15.tgz",
7733
+
"integrity": "sha512-AUNrbEUHeKY8XsYr/DYpl+qk5+aM+DChopnWOPEzn8YKzOhv4l2zH6LzZms3tOZP3wwdOyc0RmTciyi46HLIuA==",
7734
+
"dev": true,
7735
+
"license": "MIT"
7736
+
},
7737
+
"node_modules/safe-array-concat": {
7738
+
"version": "1.1.3",
7739
+
"resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz",
7740
+
"integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==",
7741
+
"dev": true,
7742
+
"license": "MIT",
7743
+
"dependencies": {
7744
+
"call-bind": "^1.0.8",
7745
+
"call-bound": "^1.0.2",
7746
+
"get-intrinsic": "^1.2.6",
7747
+
"has-symbols": "^1.1.0",
7748
+
"isarray": "^2.0.5"
7749
+
},
7750
+
"engines": {
7751
+
"node": ">=0.4"
7752
+
},
7753
+
"funding": {
7754
+
"url": "https://github.com/sponsors/ljharb"
7755
+
}
7756
+
},
7757
+
"node_modules/safe-buffer": {
7758
+
"version": "5.2.1",
7759
+
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
7760
+
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
7761
+
"dev": true,
7762
+
"funding": [
7763
+
{
7764
+
"type": "github",
7765
+
"url": "https://github.com/sponsors/feross"
7766
+
},
7767
+
{
7768
+
"type": "patreon",
7769
+
"url": "https://www.patreon.com/feross"
7770
+
},
7771
+
{
7772
+
"type": "consulting",
7773
+
"url": "https://feross.org/support"
7774
+
}
7775
+
],
7776
+
"license": "MIT"
7777
+
},
7778
+
"node_modules/safe-push-apply": {
7779
+
"version": "1.0.0",
7780
+
"resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz",
7781
+
"integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==",
7782
+
"dev": true,
7783
+
"license": "MIT",
7784
+
"dependencies": {
7785
+
"es-errors": "^1.3.0",
7786
+
"isarray": "^2.0.5"
7787
+
},
7788
+
"engines": {
7789
+
"node": ">= 0.4"
7790
+
},
7791
+
"funding": {
7792
+
"url": "https://github.com/sponsors/ljharb"
7793
+
}
7794
+
},
7795
+
"node_modules/safe-regex-test": {
7796
+
"version": "1.1.0",
7797
+
"resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz",
7798
+
"integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==",
7799
+
"dev": true,
7800
+
"license": "MIT",
7801
+
"dependencies": {
7802
+
"call-bound": "^1.0.2",
7803
+
"es-errors": "^1.3.0",
7804
+
"is-regex": "^1.2.1"
7805
+
},
7806
+
"engines": {
7807
+
"node": ">= 0.4"
7808
+
},
7809
+
"funding": {
7810
+
"url": "https://github.com/sponsors/ljharb"
7811
+
}
7812
+
},
7813
+
"node_modules/sass-formatter": {
7814
+
"version": "0.7.9",
7815
+
"resolved": "https://registry.npmjs.org/sass-formatter/-/sass-formatter-0.7.9.tgz",
7816
+
"integrity": "sha512-CWZ8XiSim+fJVG0cFLStwDvft1VI7uvXdCNJYXhDvowiv+DsbD1nXLiQ4zrE5UBvj5DWZJ93cwN0NX5PMsr1Pw==",
7817
+
"dev": true,
7818
+
"license": "MIT",
7819
+
"dependencies": {
7820
+
"suf-log": "^2.5.3"
7821
+
}
7822
+
},
7823
+
"node_modules/scheduler": {
7824
+
"version": "0.23.2",
7825
+
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz",
7826
+
"integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==",
7827
+
"license": "MIT",
7828
+
"dependencies": {
7829
+
"loose-envify": "^1.1.0"
7830
+
}
7831
+
},
7832
+
"node_modules/semver": {
7833
+
"version": "7.7.1",
7834
+
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
7835
+
"integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
7836
+
"dev": true,
7837
+
"license": "ISC",
7838
+
"bin": {
7839
+
"semver": "bin/semver.js"
7840
+
},
7841
+
"engines": {
7842
+
"node": ">=10"
7843
+
}
7844
+
},
7845
+
"node_modules/set-function-length": {
7846
+
"version": "1.2.2",
7847
+
"resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
7848
+
"integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
7849
+
"dev": true,
7850
+
"license": "MIT",
7851
+
"dependencies": {
7852
+
"define-data-property": "^1.1.4",
7853
+
"es-errors": "^1.3.0",
7854
+
"function-bind": "^1.1.2",
7855
+
"get-intrinsic": "^1.2.4",
7856
+
"gopd": "^1.0.1",
7857
+
"has-property-descriptors": "^1.0.2"
7858
+
},
7859
+
"engines": {
7860
+
"node": ">= 0.4"
7861
+
}
7862
+
},
7863
+
"node_modules/set-function-name": {
7864
+
"version": "2.0.2",
7865
+
"resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz",
7866
+
"integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==",
7867
+
"dev": true,
7868
+
"license": "MIT",
7869
+
"dependencies": {
7870
+
"define-data-property": "^1.1.4",
7871
+
"es-errors": "^1.3.0",
7872
+
"functions-have-names": "^1.2.3",
7873
+
"has-property-descriptors": "^1.0.2"
7874
+
},
7875
+
"engines": {
7876
+
"node": ">= 0.4"
7877
+
}
7878
+
},
7879
+
"node_modules/set-proto": {
7880
+
"version": "1.0.0",
7881
+
"resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz",
7882
+
"integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==",
7883
+
"dev": true,
7884
+
"license": "MIT",
7885
+
"dependencies": {
7886
+
"dunder-proto": "^1.0.1",
7887
+
"es-errors": "^1.3.0",
7888
+
"es-object-atoms": "^1.0.0"
7889
+
},
7890
+
"engines": {
7891
+
"node": ">= 0.4"
7892
+
}
7893
+
},
7894
+
"node_modules/sh-syntax": {
7895
+
"version": "0.4.2",
7896
+
"resolved": "https://registry.npmjs.org/sh-syntax/-/sh-syntax-0.4.2.tgz",
7897
+
"integrity": "sha512-/l2UZ5fhGZLVZa16XQM9/Vq/hezGGbdHeVEA01uWjOL1+7Ek/gt6FquW0iKKws4a9AYPYvlz6RyVvjh3JxOteg==",
7898
+
"dev": true,
7899
+
"license": "MIT",
7900
+
"dependencies": {
7901
+
"tslib": "^2.6.2"
7902
+
},
7903
+
"engines": {
7904
+
"node": ">=16.0.0"
7905
+
},
7906
+
"funding": {
7907
+
"url": "https://opencollective.com/unts"
7908
+
}
7909
+
},
7910
+
"node_modules/shallowequal": {
7911
+
"version": "1.1.0",
7912
+
"resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz",
7913
+
"integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==",
7914
+
"license": "MIT"
7915
+
},
7916
+
"node_modules/shebang-command": {
7917
+
"version": "2.0.0",
7918
+
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
7919
+
"integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
7920
+
"license": "MIT",
7921
+
"dependencies": {
7922
+
"shebang-regex": "^3.0.0"
7923
+
},
7924
+
"engines": {
7925
+
"node": ">=8"
7926
+
}
7927
+
},
7928
+
"node_modules/shebang-regex": {
7929
+
"version": "3.0.0",
7930
+
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
7931
+
"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
7932
+
"license": "MIT",
7933
+
"engines": {
7934
+
"node": ">=8"
7935
+
}
7936
+
},
7937
+
"node_modules/side-channel": {
7938
+
"version": "1.1.0",
7939
+
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
7940
+
"integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
7941
+
"dev": true,
7942
+
"license": "MIT",
7943
+
"dependencies": {
7944
+
"es-errors": "^1.3.0",
7945
+
"object-inspect": "^1.13.3",
7946
+
"side-channel-list": "^1.0.0",
7947
+
"side-channel-map": "^1.0.1",
7948
+
"side-channel-weakmap": "^1.0.2"
7949
+
},
7950
+
"engines": {
7951
+
"node": ">= 0.4"
7952
+
},
7953
+
"funding": {
7954
+
"url": "https://github.com/sponsors/ljharb"
7955
+
}
7956
+
},
7957
+
"node_modules/side-channel-list": {
7958
+
"version": "1.0.0",
7959
+
"resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
7960
+
"integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
7961
+
"dev": true,
7962
+
"license": "MIT",
7963
+
"dependencies": {
7964
+
"es-errors": "^1.3.0",
7965
+
"object-inspect": "^1.13.3"
7966
+
},
7967
+
"engines": {
7968
+
"node": ">= 0.4"
7969
+
},
7970
+
"funding": {
7971
+
"url": "https://github.com/sponsors/ljharb"
7972
+
}
7973
+
},
7974
+
"node_modules/side-channel-map": {
7975
+
"version": "1.0.1",
7976
+
"resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
7977
+
"integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
7978
+
"dev": true,
7979
+
"license": "MIT",
7980
+
"dependencies": {
7981
+
"call-bound": "^1.0.2",
7982
+
"es-errors": "^1.3.0",
7983
+
"get-intrinsic": "^1.2.5",
7984
+
"object-inspect": "^1.13.3"
7985
+
},
7986
+
"engines": {
7987
+
"node": ">= 0.4"
7988
+
},
7989
+
"funding": {
7990
+
"url": "https://github.com/sponsors/ljharb"
7991
+
}
7992
+
},
7993
+
"node_modules/side-channel-weakmap": {
7994
+
"version": "1.0.2",
7995
+
"resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
7996
+
"integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
7997
+
"dev": true,
7998
+
"license": "MIT",
7999
+
"dependencies": {
8000
+
"call-bound": "^1.0.2",
8001
+
"es-errors": "^1.3.0",
8002
+
"get-intrinsic": "^1.2.5",
8003
+
"object-inspect": "^1.13.3",
8004
+
"side-channel-map": "^1.0.1"
8005
+
},
8006
+
"engines": {
8007
+
"node": ">= 0.4"
8008
+
},
8009
+
"funding": {
8010
+
"url": "https://github.com/sponsors/ljharb"
8011
+
}
8012
+
},
8013
+
"node_modules/signal-exit": {
8014
+
"version": "4.1.0",
8015
+
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
8016
+
"integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
8017
+
"license": "ISC",
8018
+
"engines": {
8019
+
"node": ">=14"
8020
+
},
8021
+
"funding": {
8022
+
"url": "https://github.com/sponsors/isaacs"
8023
+
}
8024
+
},
8025
+
"node_modules/sort-object-keys": {
8026
+
"version": "1.1.3",
8027
+
"resolved": "https://registry.npmjs.org/sort-object-keys/-/sort-object-keys-1.1.3.tgz",
8028
+
"integrity": "sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==",
8029
+
"dev": true,
8030
+
"license": "MIT"
8031
+
},
8032
+
"node_modules/sort-package-json": {
8033
+
"version": "2.15.1",
8034
+
"resolved": "https://registry.npmjs.org/sort-package-json/-/sort-package-json-2.15.1.tgz",
8035
+
"integrity": "sha512-9x9+o8krTT2saA9liI4BljNjwAbvUnWf11Wq+i/iZt8nl2UGYnf3TH5uBydE7VALmP7AGwlfszuEeL8BDyb0YA==",
8036
+
"dev": true,
8037
+
"license": "MIT",
8038
+
"dependencies": {
8039
+
"detect-indent": "^7.0.1",
8040
+
"detect-newline": "^4.0.0",
8041
+
"get-stdin": "^9.0.0",
8042
+
"git-hooks-list": "^3.0.0",
8043
+
"is-plain-obj": "^4.1.0",
8044
+
"semver": "^7.6.0",
8045
+
"sort-object-keys": "^1.1.3",
8046
+
"tinyglobby": "^0.2.9"
8047
+
},
8048
+
"bin": {
8049
+
"sort-package-json": "cli.js"
8050
+
}
8051
+
},
8052
+
"node_modules/sort-package-json/node_modules/detect-indent": {
8053
+
"version": "7.0.1",
8054
+
"resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-7.0.1.tgz",
8055
+
"integrity": "sha512-Mc7QhQ8s+cLrnUfU/Ji94vG/r8M26m8f++vyres4ZoojaRDpZ1eSIh/EpzLNwlWuvzSZ3UbDFspjFvTDXe6e/g==",
8056
+
"dev": true,
8057
+
"license": "MIT",
8058
+
"engines": {
8059
+
"node": ">=12.20"
8060
+
}
8061
+
},
8062
+
"node_modules/source-map": {
8063
+
"version": "0.6.1",
8064
+
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
8065
+
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
8066
+
"dev": true,
8067
+
"license": "BSD-3-Clause",
8068
+
"engines": {
8069
+
"node": ">=0.10.0"
8070
+
}
8071
+
},
8072
+
"node_modules/source-map-js": {
8073
+
"version": "1.2.1",
8074
+
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
8075
+
"integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
8076
+
"license": "BSD-3-Clause",
8077
+
"engines": {
8078
+
"node": ">=0.10.0"
8079
+
}
8080
+
},
8081
+
"node_modules/sql-formatter": {
8082
+
"version": "15.5.2",
8083
+
"resolved": "https://registry.npmjs.org/sql-formatter/-/sql-formatter-15.5.2.tgz",
8084
+
"integrity": "sha512-+9xZgiv1DP/c7GxkkBUHRZOf4j35gquVdwEm0rg16qKRYeFkv1+/vEeO13fsUbbz06KUotIyASJ+hyau8LM8Kg==",
8085
+
"dev": true,
8086
+
"license": "MIT",
8087
+
"dependencies": {
8088
+
"argparse": "^2.0.1",
8089
+
"nearley": "^2.20.1"
8090
+
},
8091
+
"bin": {
8092
+
"sql-formatter": "bin/sql-formatter-cli.cjs"
8093
+
}
8094
+
},
8095
+
"node_modules/string_decoder": {
8096
+
"version": "1.3.0",
8097
+
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
8098
+
"integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
8099
+
"dev": true,
8100
+
"license": "MIT",
8101
+
"dependencies": {
8102
+
"safe-buffer": "~5.2.0"
8103
+
}
8104
+
},
8105
+
"node_modules/string-replace-async": {
8106
+
"version": "2.0.0",
8107
+
"resolved": "https://registry.npmjs.org/string-replace-async/-/string-replace-async-2.0.0.tgz",
8108
+
"integrity": "sha512-AHMupZscUiDh07F1QziX7PLoB1DQ/pzu19vc8Xa8LwZcgnOXaw7yCgBuSYrxVEfaM2d8scc3Gtp+i+QJZV+spw==",
8109
+
"dev": true,
8110
+
"license": "MIT",
8111
+
"engines": {
8112
+
"node": ">=0.12"
8113
+
}
8114
+
},
8115
+
"node_modules/string-width": {
8116
+
"version": "5.1.2",
8117
+
"resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
8118
+
"integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
8119
+
"license": "MIT",
8120
+
"dependencies": {
8121
+
"eastasianwidth": "^0.2.0",
8122
+
"emoji-regex": "^9.2.2",
8123
+
"strip-ansi": "^7.0.1"
8124
+
},
8125
+
"engines": {
8126
+
"node": ">=12"
8127
+
},
8128
+
"funding": {
8129
+
"url": "https://github.com/sponsors/sindresorhus"
8130
+
}
8131
+
},
8132
+
"node_modules/string-width-cjs": {
8133
+
"name": "string-width",
8134
+
"version": "4.2.3",
8135
+
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
8136
+
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
8137
+
"license": "MIT",
8138
+
"dependencies": {
8139
+
"emoji-regex": "^8.0.0",
8140
+
"is-fullwidth-code-point": "^3.0.0",
8141
+
"strip-ansi": "^6.0.1"
8142
+
},
8143
+
"engines": {
8144
+
"node": ">=8"
8145
+
}
8146
+
},
8147
+
"node_modules/string-width-cjs/node_modules/ansi-regex": {
8148
+
"version": "5.0.1",
8149
+
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
8150
+
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
8151
+
"license": "MIT",
8152
+
"engines": {
8153
+
"node": ">=8"
8154
+
}
8155
+
},
8156
+
"node_modules/string-width-cjs/node_modules/emoji-regex": {
8157
+
"version": "8.0.0",
8158
+
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
8159
+
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
8160
+
"license": "MIT"
8161
+
},
8162
+
"node_modules/string-width-cjs/node_modules/strip-ansi": {
8163
+
"version": "6.0.1",
8164
+
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
8165
+
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
8166
+
"license": "MIT",
8167
+
"dependencies": {
8168
+
"ansi-regex": "^5.0.1"
8169
+
},
8170
+
"engines": {
8171
+
"node": ">=8"
8172
+
}
8173
+
},
8174
+
"node_modules/string.prototype.matchall": {
8175
+
"version": "4.0.12",
8176
+
"resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz",
8177
+
"integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==",
8178
+
"dev": true,
8179
+
"license": "MIT",
8180
+
"dependencies": {
8181
+
"call-bind": "^1.0.8",
8182
+
"call-bound": "^1.0.3",
8183
+
"define-properties": "^1.2.1",
8184
+
"es-abstract": "^1.23.6",
8185
+
"es-errors": "^1.3.0",
8186
+
"es-object-atoms": "^1.0.0",
8187
+
"get-intrinsic": "^1.2.6",
8188
+
"gopd": "^1.2.0",
8189
+
"has-symbols": "^1.1.0",
8190
+
"internal-slot": "^1.1.0",
8191
+
"regexp.prototype.flags": "^1.5.3",
8192
+
"set-function-name": "^2.0.2",
8193
+
"side-channel": "^1.1.0"
8194
+
},
8195
+
"engines": {
8196
+
"node": ">= 0.4"
8197
+
},
8198
+
"funding": {
8199
+
"url": "https://github.com/sponsors/ljharb"
8200
+
}
8201
+
},
8202
+
"node_modules/string.prototype.repeat": {
8203
+
"version": "1.0.0",
8204
+
"resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz",
8205
+
"integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==",
8206
+
"dev": true,
8207
+
"license": "MIT",
8208
+
"dependencies": {
8209
+
"define-properties": "^1.1.3",
8210
+
"es-abstract": "^1.17.5"
8211
+
}
8212
+
},
8213
+
"node_modules/string.prototype.trim": {
8214
+
"version": "1.2.10",
8215
+
"resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz",
8216
+
"integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==",
8217
+
"dev": true,
8218
+
"license": "MIT",
8219
+
"dependencies": {
8220
+
"call-bind": "^1.0.8",
8221
+
"call-bound": "^1.0.2",
8222
+
"define-data-property": "^1.1.4",
8223
+
"define-properties": "^1.2.1",
8224
+
"es-abstract": "^1.23.5",
8225
+
"es-object-atoms": "^1.0.0",
8226
+
"has-property-descriptors": "^1.0.2"
8227
+
},
8228
+
"engines": {
8229
+
"node": ">= 0.4"
8230
+
},
8231
+
"funding": {
8232
+
"url": "https://github.com/sponsors/ljharb"
8233
+
}
8234
+
},
8235
+
"node_modules/string.prototype.trimend": {
8236
+
"version": "1.0.9",
8237
+
"resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz",
8238
+
"integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==",
8239
+
"dev": true,
8240
+
"license": "MIT",
8241
+
"dependencies": {
8242
+
"call-bind": "^1.0.8",
8243
+
"call-bound": "^1.0.2",
8244
+
"define-properties": "^1.2.1",
8245
+
"es-object-atoms": "^1.0.0"
8246
+
},
8247
+
"engines": {
8248
+
"node": ">= 0.4"
8249
+
},
8250
+
"funding": {
8251
+
"url": "https://github.com/sponsors/ljharb"
8252
+
}
8253
+
},
8254
+
"node_modules/string.prototype.trimstart": {
8255
+
"version": "1.0.8",
8256
+
"resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz",
8257
+
"integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==",
8258
+
"dev": true,
8259
+
"license": "MIT",
8260
+
"dependencies": {
8261
+
"call-bind": "^1.0.7",
8262
+
"define-properties": "^1.2.1",
8263
+
"es-object-atoms": "^1.0.0"
8264
+
},
8265
+
"engines": {
8266
+
"node": ">= 0.4"
8267
+
},
8268
+
"funding": {
8269
+
"url": "https://github.com/sponsors/ljharb"
8270
+
}
8271
+
},
8272
+
"node_modules/strip-ansi": {
8273
+
"version": "7.1.0",
8274
+
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
8275
+
"integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
8276
+
"license": "MIT",
8277
+
"dependencies": {
8278
+
"ansi-regex": "^6.0.1"
8279
+
},
8280
+
"engines": {
8281
+
"node": ">=12"
8282
+
},
8283
+
"funding": {
8284
+
"url": "https://github.com/chalk/strip-ansi?sponsor=1"
8285
+
}
8286
+
},
8287
+
"node_modules/strip-ansi-cjs": {
8288
+
"name": "strip-ansi",
8289
+
"version": "6.0.1",
8290
+
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
8291
+
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
8292
+
"license": "MIT",
8293
+
"dependencies": {
8294
+
"ansi-regex": "^5.0.1"
8295
+
},
8296
+
"engines": {
8297
+
"node": ">=8"
8298
+
}
8299
+
},
8300
+
"node_modules/strip-ansi-cjs/node_modules/ansi-regex": {
8301
+
"version": "5.0.1",
8302
+
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
8303
+
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
8304
+
"license": "MIT",
8305
+
"engines": {
8306
+
"node": ">=8"
8307
+
}
8308
+
},
8309
+
"node_modules/strip-json-comments": {
8310
+
"version": "3.1.1",
8311
+
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
8312
+
"integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
8313
+
"dev": true,
8314
+
"license": "MIT",
8315
+
"engines": {
8316
+
"node": ">=8"
8317
+
},
8318
+
"funding": {
8319
+
"url": "https://github.com/sponsors/sindresorhus"
8320
+
}
8321
+
},
8322
+
"node_modules/sucrase": {
8323
+
"version": "3.35.0",
8324
+
"resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz",
8325
+
"integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==",
8326
+
"license": "MIT",
8327
+
"dependencies": {
8328
+
"@jridgewell/gen-mapping": "^0.3.2",
8329
+
"commander": "^4.0.0",
8330
+
"glob": "^10.3.10",
8331
+
"lines-and-columns": "^1.1.6",
8332
+
"mz": "^2.7.0",
8333
+
"pirates": "^4.0.1",
8334
+
"ts-interface-checker": "^0.1.9"
8335
+
},
8336
+
"bin": {
8337
+
"sucrase": "bin/sucrase",
8338
+
"sucrase-node": "bin/sucrase-node"
8339
+
},
8340
+
"engines": {
8341
+
"node": ">=16 || 14 >=14.17"
8342
+
}
8343
+
},
8344
+
"node_modules/sucrase/node_modules/commander": {
8345
+
"version": "4.1.1",
8346
+
"resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
8347
+
"integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
8348
+
"license": "MIT",
8349
+
"engines": {
8350
+
"node": ">= 6"
8351
+
}
8352
+
},
8353
+
"node_modules/suf-log": {
8354
+
"version": "2.5.3",
8355
+
"resolved": "https://registry.npmjs.org/suf-log/-/suf-log-2.5.3.tgz",
8356
+
"integrity": "sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow==",
8357
+
"dev": true,
8358
+
"license": "MIT",
8359
+
"dependencies": {
8360
+
"s.color": "0.0.15"
8361
+
}
8362
+
},
8363
+
"node_modules/supports-color": {
8364
+
"version": "7.2.0",
8365
+
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
8366
+
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
8367
+
"dev": true,
8368
+
"license": "MIT",
8369
+
"dependencies": {
8370
+
"has-flag": "^4.0.0"
8371
+
},
8372
+
"engines": {
8373
+
"node": ">=8"
8374
+
}
8375
+
},
8376
+
"node_modules/supports-preserve-symlinks-flag": {
8377
+
"version": "1.0.0",
8378
+
"resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
8379
+
"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
8380
+
"license": "MIT",
8381
+
"engines": {
8382
+
"node": ">= 0.4"
8383
+
},
8384
+
"funding": {
8385
+
"url": "https://github.com/sponsors/ljharb"
8386
+
}
8387
+
},
8388
+
"node_modules/synckit": {
8389
+
"version": "0.11.2",
8390
+
"resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.2.tgz",
8391
+
"integrity": "sha512-1IUffI8zZ8qUMB3NUJIjk0RpLroG/8NkQDAWH1NbB2iJ0/5pn3M8rxfNzMz4GH9OnYaGYn31LEDSXJp/qIlxgA==",
8392
+
"dev": true,
8393
+
"license": "MIT",
8394
+
"dependencies": {
8395
+
"@pkgr/core": "^0.2.0",
8396
+
"tslib": "^2.8.1"
8397
+
},
8398
+
"engines": {
8399
+
"node": "^14.18.0 || >=16.0.0"
8400
+
},
8401
+
"funding": {
8402
+
"url": "https://opencollective.com/synckit"
8403
+
}
8404
+
},
8405
+
"node_modules/tabbable": {
8406
+
"version": "6.2.0",
8407
+
"resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz",
8408
+
"integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==",
8409
+
"license": "MIT"
8410
+
},
8411
+
"node_modules/tailwind-merge": {
8412
+
"version": "2.6.0",
8413
+
"resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.6.0.tgz",
8414
+
"integrity": "sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==",
8415
+
"license": "MIT",
8416
+
"funding": {
8417
+
"type": "github",
8418
+
"url": "https://github.com/sponsors/dcastil"
8419
+
}
8420
+
},
8421
+
"node_modules/tailwindcss": {
8422
+
"version": "3.4.17",
8423
+
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz",
8424
+
"integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==",
8425
+
"license": "MIT",
8426
+
"dependencies": {
8427
+
"@alloc/quick-lru": "^5.2.0",
8428
+
"arg": "^5.0.2",
8429
+
"chokidar": "^3.6.0",
8430
+
"didyoumean": "^1.2.2",
8431
+
"dlv": "^1.1.3",
8432
+
"fast-glob": "^3.3.2",
8433
+
"glob-parent": "^6.0.2",
8434
+
"is-glob": "^4.0.3",
8435
+
"jiti": "^1.21.6",
8436
+
"lilconfig": "^3.1.3",
8437
+
"micromatch": "^4.0.8",
8438
+
"normalize-path": "^3.0.0",
8439
+
"object-hash": "^3.0.0",
8440
+
"picocolors": "^1.1.1",
8441
+
"postcss": "^8.4.47",
8442
+
"postcss-import": "^15.1.0",
8443
+
"postcss-js": "^4.0.1",
8444
+
"postcss-load-config": "^4.0.2",
8445
+
"postcss-nested": "^6.2.0",
8446
+
"postcss-selector-parser": "^6.1.2",
8447
+
"resolve": "^1.22.8",
8448
+
"sucrase": "^3.35.0"
8449
+
},
8450
+
"bin": {
8451
+
"tailwind": "lib/cli.js",
8452
+
"tailwindcss": "lib/cli.js"
8453
+
},
8454
+
"engines": {
8455
+
"node": ">=14.0.0"
8456
+
}
8457
+
},
8458
+
"node_modules/tailwindcss/node_modules/resolve": {
8459
+
"version": "1.22.10",
8460
+
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
8461
+
"integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==",
8462
+
"license": "MIT",
8463
+
"dependencies": {
8464
+
"is-core-module": "^2.16.0",
8465
+
"path-parse": "^1.0.7",
8466
+
"supports-preserve-symlinks-flag": "^1.0.0"
8467
+
},
8468
+
"bin": {
8469
+
"resolve": "bin/resolve"
8470
+
},
8471
+
"engines": {
8472
+
"node": ">= 0.4"
8473
+
},
8474
+
"funding": {
8475
+
"url": "https://github.com/sponsors/ljharb"
8476
+
}
8477
+
},
8478
+
"node_modules/thenify": {
8479
+
"version": "3.3.1",
8480
+
"resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
8481
+
"integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
8482
+
"license": "MIT",
8483
+
"dependencies": {
8484
+
"any-promise": "^1.0.0"
8485
+
}
8486
+
},
8487
+
"node_modules/thenify-all": {
8488
+
"version": "1.6.0",
8489
+
"resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
8490
+
"integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
8491
+
"license": "MIT",
8492
+
"dependencies": {
8493
+
"thenify": ">= 3.1.0 < 4"
8494
+
},
8495
+
"engines": {
8496
+
"node": ">=0.8"
8497
+
}
8498
+
},
8499
+
"node_modules/tinyglobby": {
8500
+
"version": "0.2.15",
8501
+
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
8502
+
"integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
8503
+
"dev": true,
8504
+
"license": "MIT",
8505
+
"dependencies": {
8506
+
"fdir": "^6.5.0",
8507
+
"picomatch": "^4.0.3"
8508
+
},
8509
+
"engines": {
8510
+
"node": ">=12.0.0"
8511
+
},
8512
+
"funding": {
8513
+
"url": "https://github.com/sponsors/SuperchupuDev"
8514
+
}
8515
+
},
8516
+
"node_modules/tinyglobby/node_modules/fdir": {
8517
+
"version": "6.5.0",
8518
+
"resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
8519
+
"integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
8520
+
"dev": true,
8521
+
"license": "MIT",
8522
+
"engines": {
8523
+
"node": ">=12.0.0"
8524
+
},
8525
+
"peerDependencies": {
8526
+
"picomatch": "^3 || ^4"
8527
+
},
8528
+
"peerDependenciesMeta": {
8529
+
"picomatch": {
8530
+
"optional": true
8531
+
}
8532
+
}
8533
+
},
8534
+
"node_modules/tinyglobby/node_modules/picomatch": {
8535
+
"version": "4.0.3",
8536
+
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
8537
+
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
8538
+
"dev": true,
8539
+
"license": "MIT",
8540
+
"engines": {
8541
+
"node": ">=12"
8542
+
},
8543
+
"funding": {
8544
+
"url": "https://github.com/sponsors/jonschlinkert"
8545
+
}
8546
+
},
8547
+
"node_modules/to-regex-range": {
8548
+
"version": "5.0.1",
8549
+
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
8550
+
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
8551
+
"license": "MIT",
8552
+
"dependencies": {
8553
+
"is-number": "^7.0.0"
8554
+
},
8555
+
"engines": {
8556
+
"node": ">=8.0"
8557
+
}
8558
+
},
8559
+
"node_modules/ts-api-utils": {
8560
+
"version": "2.1.0",
8561
+
"resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
8562
+
"integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==",
8563
+
"dev": true,
8564
+
"license": "MIT",
8565
+
"engines": {
8566
+
"node": ">=18.12"
8567
+
},
8568
+
"peerDependencies": {
8569
+
"typescript": ">=4.8.4"
8570
+
}
8571
+
},
8572
+
"node_modules/ts-interface-checker": {
8573
+
"version": "0.1.13",
8574
+
"resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
8575
+
"integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
8576
+
"license": "Apache-2.0"
8577
+
},
8578
+
"node_modules/tslib": {
8579
+
"version": "2.8.1",
8580
+
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
8581
+
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
8582
+
"license": "0BSD"
8583
+
},
8584
+
"node_modules/tsx": {
8585
+
"version": "4.19.3",
8586
+
"resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.3.tgz",
8587
+
"integrity": "sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ==",
8588
+
"dev": true,
8589
+
"license": "MIT",
8590
+
"dependencies": {
8591
+
"esbuild": "~0.25.0",
8592
+
"get-tsconfig": "^4.7.5"
8593
+
},
8594
+
"bin": {
8595
+
"tsx": "dist/cli.mjs"
8596
+
},
8597
+
"engines": {
8598
+
"node": ">=18.0.0"
8599
+
},
8600
+
"optionalDependencies": {
8601
+
"fsevents": "~2.3.3"
8602
+
}
8603
+
},
8604
+
"node_modules/type-check": {
8605
+
"version": "0.4.0",
8606
+
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
8607
+
"integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
8608
+
"dev": true,
8609
+
"license": "MIT",
8610
+
"dependencies": {
8611
+
"prelude-ls": "^1.2.1"
8612
+
},
8613
+
"engines": {
8614
+
"node": ">= 0.8.0"
8615
+
}
8616
+
},
8617
+
"node_modules/type-fest": {
8618
+
"version": "4.39.1",
8619
+
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.39.1.tgz",
8620
+
"integrity": "sha512-uW9qzd66uyHYxwyVBYiwS4Oi0qZyUqwjU+Oevr6ZogYiXt99EOYtwvzMSLw1c3lYo2HzJsep/NB23iEVEgjG/w==",
8621
+
"dev": true,
8622
+
"license": "(MIT OR CC0-1.0)",
8623
+
"engines": {
8624
+
"node": ">=16"
8625
+
},
8626
+
"funding": {
8627
+
"url": "https://github.com/sponsors/sindresorhus"
8628
+
}
8629
+
},
8630
+
"node_modules/typed-array-buffer": {
8631
+
"version": "1.0.3",
8632
+
"resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz",
8633
+
"integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==",
8634
+
"dev": true,
8635
+
"license": "MIT",
8636
+
"dependencies": {
8637
+
"call-bound": "^1.0.3",
8638
+
"es-errors": "^1.3.0",
8639
+
"is-typed-array": "^1.1.14"
8640
+
},
8641
+
"engines": {
8642
+
"node": ">= 0.4"
8643
+
}
8644
+
},
8645
+
"node_modules/typed-array-byte-length": {
8646
+
"version": "1.0.3",
8647
+
"resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz",
8648
+
"integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==",
8649
+
"dev": true,
8650
+
"license": "MIT",
8651
+
"dependencies": {
8652
+
"call-bind": "^1.0.8",
8653
+
"for-each": "^0.3.3",
8654
+
"gopd": "^1.2.0",
8655
+
"has-proto": "^1.2.0",
8656
+
"is-typed-array": "^1.1.14"
8657
+
},
8658
+
"engines": {
8659
+
"node": ">= 0.4"
8660
+
},
8661
+
"funding": {
8662
+
"url": "https://github.com/sponsors/ljharb"
8663
+
}
8664
+
},
8665
+
"node_modules/typed-array-byte-offset": {
8666
+
"version": "1.0.4",
8667
+
"resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz",
8668
+
"integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==",
8669
+
"dev": true,
8670
+
"license": "MIT",
8671
+
"dependencies": {
8672
+
"available-typed-arrays": "^1.0.7",
8673
+
"call-bind": "^1.0.8",
8674
+
"for-each": "^0.3.3",
8675
+
"gopd": "^1.2.0",
8676
+
"has-proto": "^1.2.0",
8677
+
"is-typed-array": "^1.1.15",
8678
+
"reflect.getprototypeof": "^1.0.9"
8679
+
},
8680
+
"engines": {
8681
+
"node": ">= 0.4"
8682
+
},
8683
+
"funding": {
8684
+
"url": "https://github.com/sponsors/ljharb"
8685
+
}
8686
+
},
8687
+
"node_modules/typed-array-length": {
8688
+
"version": "1.0.7",
8689
+
"resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz",
8690
+
"integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==",
8691
+
"dev": true,
8692
+
"license": "MIT",
8693
+
"dependencies": {
8694
+
"call-bind": "^1.0.7",
8695
+
"for-each": "^0.3.3",
8696
+
"gopd": "^1.0.1",
8697
+
"is-typed-array": "^1.1.13",
8698
+
"possible-typed-array-names": "^1.0.0",
8699
+
"reflect.getprototypeof": "^1.0.6"
8700
+
},
8701
+
"engines": {
8702
+
"node": ">= 0.4"
8703
+
},
8704
+
"funding": {
8705
+
"url": "https://github.com/sponsors/ljharb"
8706
+
}
8707
+
},
8708
+
"node_modules/typed-event-target": {
8709
+
"version": "4.0.3",
8710
+
"resolved": "https://registry.npmjs.org/typed-event-target/-/typed-event-target-4.0.3.tgz",
8711
+
"integrity": "sha512-CwpGF+ne1ju2zZo9Cx1VCG6fWQkcV8Mu1cFH2i4hciiuch3u6GahNirkfOE+S+9cegZ5NKvyR7gCXedJbV5uvQ==",
8712
+
"dev": true,
8713
+
"license": "(MIT or CC0 1.0)",
8714
+
"dependencies": {
8715
+
"@augment-vir/assert": "^31.9.3",
8716
+
"@augment-vir/common": "^31.9.3",
8717
+
"@augment-vir/core": "^31.9.3"
8718
+
},
8719
+
"engines": {
8720
+
"node": ">=22"
8721
+
}
8722
+
},
8723
+
"node_modules/typedarray": {
8724
+
"version": "0.0.6",
8725
+
"resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
8726
+
"integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==",
8727
+
"dev": true,
8728
+
"license": "MIT"
8729
+
},
8730
+
"node_modules/typescript": {
8731
+
"version": "5.8.2",
8732
+
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz",
8733
+
"integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==",
8734
+
"dev": true,
8735
+
"license": "Apache-2.0",
8736
+
"bin": {
8737
+
"tsc": "bin/tsc",
8738
+
"tsserver": "bin/tsserver"
8739
+
},
8740
+
"engines": {
8741
+
"node": ">=14.17"
8742
+
}
8743
+
},
8744
+
"node_modules/ufo": {
8745
+
"version": "1.5.4",
8746
+
"resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz",
8747
+
"integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==",
8748
+
"dev": true,
8749
+
"license": "MIT"
8750
+
},
8751
+
"node_modules/unbox-primitive": {
8752
+
"version": "1.1.0",
8753
+
"resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz",
8754
+
"integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==",
8755
+
"dev": true,
8756
+
"license": "MIT",
8757
+
"dependencies": {
8758
+
"call-bound": "^1.0.3",
8759
+
"has-bigints": "^1.0.2",
8760
+
"has-symbols": "^1.1.0",
8761
+
"which-boxed-primitive": "^1.1.1"
8762
+
},
8763
+
"engines": {
8764
+
"node": ">= 0.4"
8765
+
},
8766
+
"funding": {
8767
+
"url": "https://github.com/sponsors/ljharb"
8768
+
}
8769
+
},
8770
+
"node_modules/undici-types": {
8771
+
"version": "6.21.0",
8772
+
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
8773
+
"integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
8774
+
"dev": true,
8775
+
"license": "MIT"
8776
+
},
8777
+
"node_modules/unist-util-stringify-position": {
8778
+
"version": "4.0.0",
8779
+
"resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz",
8780
+
"integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==",
8781
+
"dev": true,
8782
+
"license": "MIT",
8783
+
"dependencies": {
8784
+
"@types/unist": "^3.0.0"
8785
+
},
8786
+
"funding": {
8787
+
"type": "opencollective",
8788
+
"url": "https://opencollective.com/unified"
8789
+
}
8790
+
},
8791
+
"node_modules/update-browserslist-db": {
8792
+
"version": "1.1.3",
8793
+
"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
8794
+
"integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==",
8795
+
"funding": [
8796
+
{
8797
+
"type": "opencollective",
8798
+
"url": "https://opencollective.com/browserslist"
8799
+
},
8800
+
{
8801
+
"type": "tidelift",
8802
+
"url": "https://tidelift.com/funding/github/npm/browserslist"
8803
+
},
8804
+
{
8805
+
"type": "github",
8806
+
"url": "https://github.com/sponsors/ai"
8807
+
}
8808
+
],
8809
+
"license": "MIT",
8810
+
"dependencies": {
8811
+
"escalade": "^3.2.0",
8812
+
"picocolors": "^1.1.1"
8813
+
},
8814
+
"bin": {
8815
+
"update-browserslist-db": "cli.js"
8816
+
},
8817
+
"peerDependencies": {
8818
+
"browserslist": ">= 4.21.0"
8819
+
}
8820
+
},
8821
+
"node_modules/uri-js": {
8822
+
"version": "4.4.1",
8823
+
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
8824
+
"integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
8825
+
"dev": true,
8826
+
"license": "BSD-2-Clause",
8827
+
"dependencies": {
8828
+
"punycode": "^2.1.0"
8829
+
}
8830
+
},
8831
+
"node_modules/user-home": {
8832
+
"version": "2.0.0",
8833
+
"resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz",
8834
+
"integrity": "sha512-KMWqdlOcjCYdtIJpicDSFBQ8nFwS2i9sslAd6f4+CBGcU4gist2REnr2fxj2YocvJFxSF3ZOHLYLVZnUxv4BZQ==",
8835
+
"dev": true,
8836
+
"license": "MIT",
8837
+
"dependencies": {
8838
+
"os-homedir": "^1.0.0"
8839
+
},
8840
+
"engines": {
8841
+
"node": ">=0.10.0"
8842
+
}
8843
+
},
8844
+
"node_modules/util-deprecate": {
8845
+
"version": "1.0.2",
8846
+
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
8847
+
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
8848
+
"license": "MIT"
8849
+
},
8850
+
"node_modules/vite": {
8851
+
"version": "7.1.10",
8852
+
"resolved": "https://registry.npmjs.org/vite/-/vite-7.1.10.tgz",
8853
+
"integrity": "sha512-CmuvUBzVJ/e3HGxhg6cYk88NGgTnBoOo7ogtfJJ0fefUWAxN/WDSUa50o+oVBxuIhO8FoEZW0j2eW7sfjs5EtA==",
8854
+
"dev": true,
8855
+
"license": "MIT",
8856
+
"dependencies": {
8857
+
"esbuild": "^0.25.0",
8858
+
"fdir": "^6.5.0",
8859
+
"picomatch": "^4.0.3",
8860
+
"postcss": "^8.5.6",
8861
+
"rollup": "^4.43.0",
8862
+
"tinyglobby": "^0.2.15"
8863
+
},
8864
+
"bin": {
8865
+
"vite": "bin/vite.js"
8866
+
},
8867
+
"engines": {
8868
+
"node": "^20.19.0 || >=22.12.0"
8869
+
},
8870
+
"funding": {
8871
+
"url": "https://github.com/vitejs/vite?sponsor=1"
8872
+
},
8873
+
"optionalDependencies": {
8874
+
"fsevents": "~2.3.3"
8875
+
},
8876
+
"peerDependencies": {
8877
+
"@types/node": "^20.19.0 || >=22.12.0",
8878
+
"jiti": ">=1.21.0",
8879
+
"less": "^4.0.0",
8880
+
"lightningcss": "^1.21.0",
8881
+
"sass": "^1.70.0",
8882
+
"sass-embedded": "^1.70.0",
8883
+
"stylus": ">=0.54.8",
8884
+
"sugarss": "^5.0.0",
8885
+
"terser": "^5.16.0",
8886
+
"tsx": "^4.8.1",
8887
+
"yaml": "^2.4.2"
8888
+
},
8889
+
"peerDependenciesMeta": {
8890
+
"@types/node": {
8891
+
"optional": true
8892
+
},
8893
+
"jiti": {
8894
+
"optional": true
8895
+
},
8896
+
"less": {
8897
+
"optional": true
8898
+
},
8899
+
"lightningcss": {
8900
+
"optional": true
8901
+
},
8902
+
"sass": {
8903
+
"optional": true
8904
+
},
8905
+
"sass-embedded": {
8906
+
"optional": true
8907
+
},
8908
+
"stylus": {
8909
+
"optional": true
8910
+
},
8911
+
"sugarss": {
8912
+
"optional": true
8913
+
},
8914
+
"terser": {
8915
+
"optional": true
8916
+
},
8917
+
"tsx": {
8918
+
"optional": true
8919
+
},
8920
+
"yaml": {
8921
+
"optional": true
8922
+
}
8923
+
}
8924
+
},
8925
+
"node_modules/vite/node_modules/fdir": {
8926
+
"version": "6.5.0",
8927
+
"resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
8928
+
"integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
8929
+
"dev": true,
8930
+
"license": "MIT",
8931
+
"engines": {
8932
+
"node": ">=12.0.0"
8933
+
},
8934
+
"peerDependencies": {
8935
+
"picomatch": "^3 || ^4"
8936
+
},
8937
+
"peerDependenciesMeta": {
8938
+
"picomatch": {
8939
+
"optional": true
8940
+
}
8941
+
}
8942
+
},
8943
+
"node_modules/vite/node_modules/picomatch": {
8944
+
"version": "4.0.3",
8945
+
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
8946
+
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
8947
+
"dev": true,
8948
+
"license": "MIT",
8949
+
"engines": {
8950
+
"node": ">=12"
8951
+
},
8952
+
"funding": {
8953
+
"url": "https://github.com/sponsors/jonschlinkert"
8954
+
}
8955
+
},
8956
+
"node_modules/vscode-oniguruma": {
8957
+
"version": "1.7.0",
8958
+
"resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz",
8959
+
"integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==",
8960
+
"dev": true,
8961
+
"license": "MIT"
8962
+
},
8963
+
"node_modules/vscode-textmate": {
8964
+
"version": "7.0.4",
8965
+
"resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-7.0.4.tgz",
8966
+
"integrity": "sha512-9hJp0xL7HW1Q5OgGe03NACo7yiCTMEk3WU/rtKXUbncLtdg6rVVNJnHwD88UhbIYU2KoxY0Dih0x+kIsmUKn2A==",
8967
+
"dev": true,
8968
+
"license": "MIT"
8969
+
},
8970
+
"node_modules/which": {
8971
+
"version": "2.0.2",
8972
+
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
8973
+
"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
8974
+
"license": "ISC",
8975
+
"dependencies": {
8976
+
"isexe": "^2.0.0"
8977
+
},
8978
+
"bin": {
8979
+
"node-which": "bin/node-which"
8980
+
},
8981
+
"engines": {
8982
+
"node": ">= 8"
8983
+
}
8984
+
},
8985
+
"node_modules/which-boxed-primitive": {
8986
+
"version": "1.1.1",
8987
+
"resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz",
8988
+
"integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==",
8989
+
"dev": true,
8990
+
"license": "MIT",
8991
+
"dependencies": {
8992
+
"is-bigint": "^1.1.0",
8993
+
"is-boolean-object": "^1.2.1",
8994
+
"is-number-object": "^1.1.1",
8995
+
"is-string": "^1.1.1",
8996
+
"is-symbol": "^1.1.1"
8997
+
},
8998
+
"engines": {
8999
+
"node": ">= 0.4"
9000
+
},
9001
+
"funding": {
9002
+
"url": "https://github.com/sponsors/ljharb"
9003
+
}
9004
+
},
9005
+
"node_modules/which-builtin-type": {
9006
+
"version": "1.2.1",
9007
+
"resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz",
9008
+
"integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==",
9009
+
"dev": true,
9010
+
"license": "MIT",
9011
+
"dependencies": {
9012
+
"call-bound": "^1.0.2",
9013
+
"function.prototype.name": "^1.1.6",
9014
+
"has-tostringtag": "^1.0.2",
9015
+
"is-async-function": "^2.0.0",
9016
+
"is-date-object": "^1.1.0",
9017
+
"is-finalizationregistry": "^1.1.0",
9018
+
"is-generator-function": "^1.0.10",
9019
+
"is-regex": "^1.2.1",
9020
+
"is-weakref": "^1.0.2",
9021
+
"isarray": "^2.0.5",
9022
+
"which-boxed-primitive": "^1.1.0",
9023
+
"which-collection": "^1.0.2",
9024
+
"which-typed-array": "^1.1.16"
9025
+
},
9026
+
"engines": {
9027
+
"node": ">= 0.4"
9028
+
},
9029
+
"funding": {
9030
+
"url": "https://github.com/sponsors/ljharb"
9031
+
}
9032
+
},
9033
+
"node_modules/which-collection": {
9034
+
"version": "1.0.2",
9035
+
"resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz",
9036
+
"integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==",
9037
+
"dev": true,
9038
+
"license": "MIT",
9039
+
"dependencies": {
9040
+
"is-map": "^2.0.3",
9041
+
"is-set": "^2.0.3",
9042
+
"is-weakmap": "^2.0.2",
9043
+
"is-weakset": "^2.0.3"
9044
+
},
9045
+
"engines": {
9046
+
"node": ">= 0.4"
9047
+
},
9048
+
"funding": {
9049
+
"url": "https://github.com/sponsors/ljharb"
9050
+
}
9051
+
},
9052
+
"node_modules/which-typed-array": {
9053
+
"version": "1.1.19",
9054
+
"resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz",
9055
+
"integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==",
9056
+
"dev": true,
9057
+
"license": "MIT",
9058
+
"dependencies": {
9059
+
"available-typed-arrays": "^1.0.7",
9060
+
"call-bind": "^1.0.8",
9061
+
"call-bound": "^1.0.4",
9062
+
"for-each": "^0.3.5",
9063
+
"get-proto": "^1.0.1",
9064
+
"gopd": "^1.2.0",
9065
+
"has-tostringtag": "^1.0.2"
9066
+
},
9067
+
"engines": {
9068
+
"node": ">= 0.4"
9069
+
},
9070
+
"funding": {
9071
+
"url": "https://github.com/sponsors/ljharb"
9072
+
}
9073
+
},
9074
+
"node_modules/word-wrap": {
9075
+
"version": "1.2.5",
9076
+
"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
9077
+
"integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
9078
+
"dev": true,
9079
+
"license": "MIT",
9080
+
"engines": {
9081
+
"node": ">=0.10.0"
9082
+
}
9083
+
},
9084
+
"node_modules/wrap-ansi": {
9085
+
"version": "8.1.0",
9086
+
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
9087
+
"integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
9088
+
"license": "MIT",
9089
+
"dependencies": {
9090
+
"ansi-styles": "^6.1.0",
9091
+
"string-width": "^5.0.1",
9092
+
"strip-ansi": "^7.0.1"
9093
+
},
9094
+
"engines": {
9095
+
"node": ">=12"
9096
+
},
9097
+
"funding": {
9098
+
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
9099
+
}
9100
+
},
9101
+
"node_modules/wrap-ansi-cjs": {
9102
+
"name": "wrap-ansi",
9103
+
"version": "7.0.0",
9104
+
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
9105
+
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
9106
+
"license": "MIT",
9107
+
"dependencies": {
9108
+
"ansi-styles": "^4.0.0",
9109
+
"string-width": "^4.1.0",
9110
+
"strip-ansi": "^6.0.0"
9111
+
},
9112
+
"engines": {
9113
+
"node": ">=10"
9114
+
},
9115
+
"funding": {
9116
+
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
9117
+
}
9118
+
},
9119
+
"node_modules/wrap-ansi-cjs/node_modules/ansi-regex": {
9120
+
"version": "5.0.1",
9121
+
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
9122
+
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
9123
+
"license": "MIT",
9124
+
"engines": {
9125
+
"node": ">=8"
9126
+
}
9127
+
},
9128
+
"node_modules/wrap-ansi-cjs/node_modules/emoji-regex": {
9129
+
"version": "8.0.0",
9130
+
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
9131
+
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
9132
+
"license": "MIT"
9133
+
},
9134
+
"node_modules/wrap-ansi-cjs/node_modules/string-width": {
9135
+
"version": "4.2.3",
9136
+
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
9137
+
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
9138
+
"license": "MIT",
9139
+
"dependencies": {
9140
+
"emoji-regex": "^8.0.0",
9141
+
"is-fullwidth-code-point": "^3.0.0",
9142
+
"strip-ansi": "^6.0.1"
9143
+
},
9144
+
"engines": {
9145
+
"node": ">=8"
9146
+
}
9147
+
},
9148
+
"node_modules/wrap-ansi-cjs/node_modules/strip-ansi": {
9149
+
"version": "6.0.1",
9150
+
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
9151
+
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
9152
+
"license": "MIT",
9153
+
"dependencies": {
9154
+
"ansi-regex": "^5.0.1"
9155
+
},
9156
+
"engines": {
9157
+
"node": ">=8"
9158
+
}
9159
+
},
9160
+
"node_modules/wrap-ansi/node_modules/ansi-styles": {
9161
+
"version": "6.2.1",
9162
+
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
9163
+
"integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
9164
+
"license": "MIT",
9165
+
"engines": {
9166
+
"node": ">=12"
9167
+
},
9168
+
"funding": {
9169
+
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
9170
+
}
9171
+
},
9172
+
"node_modules/xregexp": {
9173
+
"version": "5.1.2",
9174
+
"resolved": "https://registry.npmjs.org/xregexp/-/xregexp-5.1.2.tgz",
9175
+
"integrity": "sha512-6hGgEMCGhqCTFEJbqmWrNIPqfpdirdGWkqshu7fFZddmTSfgv5Sn9D2SaKloR79s5VUiUlpwzg3CM3G6D3VIlw==",
9176
+
"dev": true,
9177
+
"license": "MIT",
9178
+
"dependencies": {
9179
+
"@babel/runtime-corejs3": "^7.26.9"
9180
+
}
9181
+
},
9182
+
"node_modules/y18n": {
9183
+
"version": "5.0.8",
9184
+
"resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
9185
+
"integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
9186
+
"dev": true,
9187
+
"license": "ISC",
9188
+
"engines": {
9189
+
"node": ">=10"
9190
+
}
9191
+
},
9192
+
"node_modules/yallist": {
9193
+
"version": "3.1.1",
9194
+
"resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
9195
+
"integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
9196
+
"dev": true,
9197
+
"license": "ISC"
9198
+
},
9199
+
"node_modules/yaml": {
9200
+
"version": "2.7.1",
9201
+
"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.1.tgz",
9202
+
"integrity": "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==",
9203
+
"license": "ISC",
9204
+
"bin": {
9205
+
"yaml": "bin.mjs"
9206
+
},
9207
+
"engines": {
9208
+
"node": ">= 14"
9209
+
}
9210
+
},
9211
+
"node_modules/yargs": {
9212
+
"version": "17.7.2",
9213
+
"resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
9214
+
"integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
9215
+
"dev": true,
9216
+
"license": "MIT",
9217
+
"dependencies": {
9218
+
"cliui": "^8.0.1",
9219
+
"escalade": "^3.1.1",
9220
+
"get-caller-file": "^2.0.5",
9221
+
"require-directory": "^2.1.1",
9222
+
"string-width": "^4.2.3",
9223
+
"y18n": "^5.0.5",
9224
+
"yargs-parser": "^21.1.1"
9225
+
},
9226
+
"engines": {
9227
+
"node": ">=12"
9228
+
}
9229
+
},
9230
+
"node_modules/yargs-parser": {
9231
+
"version": "21.1.1",
9232
+
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
9233
+
"integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
9234
+
"dev": true,
9235
+
"license": "ISC",
9236
+
"engines": {
9237
+
"node": ">=12"
9238
+
}
9239
+
},
9240
+
"node_modules/yargs/node_modules/ansi-regex": {
9241
+
"version": "5.0.1",
9242
+
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
9243
+
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
9244
+
"dev": true,
9245
+
"license": "MIT",
9246
+
"engines": {
9247
+
"node": ">=8"
9248
+
}
9249
+
},
9250
+
"node_modules/yargs/node_modules/emoji-regex": {
9251
+
"version": "8.0.0",
9252
+
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
9253
+
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
9254
+
"dev": true,
9255
+
"license": "MIT"
9256
+
},
9257
+
"node_modules/yargs/node_modules/string-width": {
9258
+
"version": "4.2.3",
9259
+
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
9260
+
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
9261
+
"dev": true,
9262
+
"license": "MIT",
9263
+
"dependencies": {
9264
+
"emoji-regex": "^8.0.0",
9265
+
"is-fullwidth-code-point": "^3.0.0",
9266
+
"strip-ansi": "^6.0.1"
9267
+
},
9268
+
"engines": {
9269
+
"node": ">=8"
9270
+
}
9271
+
},
9272
+
"node_modules/yargs/node_modules/strip-ansi": {
9273
+
"version": "6.0.1",
9274
+
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
9275
+
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
9276
+
"dev": true,
9277
+
"license": "MIT",
9278
+
"dependencies": {
9279
+
"ansi-regex": "^5.0.1"
9280
+
},
9281
+
"engines": {
9282
+
"node": ">=8"
9283
+
}
9284
+
},
9285
+
"node_modules/yocto-queue": {
9286
+
"version": "0.1.0",
9287
+
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
9288
+
"integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
9289
+
"dev": true,
9290
+
"license": "MIT",
9291
+
"engines": {
9292
+
"node": ">=10"
9293
+
},
9294
+
"funding": {
9295
+
"url": "https://github.com/sponsors/sindresorhus"
9296
+
}
9297
+
}
9298
+
}
9299
+
}
+55
package.json
+55
package.json
···
1
+
{
2
+
"name": "portfolio",
3
+
"version": "0.0.0",
4
+
"private": true,
5
+
"type": "module",
6
+
"scripts": {
7
+
"build": "tsc && vite build",
8
+
"convert-content": "tsx src/scripts/convertCsvToJson.ts",
9
+
"dev": "vite",
10
+
"format": "prettier --write .",
11
+
"lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
12
+
"preview": "vite preview"
13
+
},
14
+
"dependencies": {
15
+
"@headlessui/react": "^2.1.8",
16
+
"@heroicons/react": "^2.1.5",
17
+
"@types/react-helmet-async": "^1.0.1",
18
+
"autoprefixer": "^10.4.20",
19
+
"clsx": "^2.1.1",
20
+
"lucide-react": "^0.446.0",
21
+
"next-themes": "^0.4.6",
22
+
"postcss": "^8.4.47",
23
+
"react": "^18.3.1",
24
+
"react-dom": "^18.3.1",
25
+
"react-helmet-async": "^2.0.5",
26
+
"react-router-dom": "^6.26.2",
27
+
"tailwind-merge": "^2.5.4",
28
+
"tailwindcss": "^3.4.13"
29
+
},
30
+
"devDependencies": {
31
+
"@eslint/js": "^9.11.1",
32
+
"@tailwindcss/typography": "^0.5.16",
33
+
"@types/next": "^8.0.7",
34
+
"@types/node": "^22.9.0",
35
+
"@types/react": "^18.3.10",
36
+
"@types/react-dom": "^18.3.0",
37
+
"@types/react-router-dom": "^5.3.3",
38
+
"@typescript-eslint/eslint-plugin": "^8.8.0",
39
+
"@typescript-eslint/parser": "^8.8.0",
40
+
"@u3u/prettier-config": "^5.1.0",
41
+
"@vitejs/plugin-react": "^4.3.1",
42
+
"csv-parse": "^5.5.6",
43
+
"eslint": "^9.11.1",
44
+
"eslint-config-prettier": "^10.0.1",
45
+
"eslint-plugin-prettier": "^5.2.3",
46
+
"eslint-plugin-react": "^7.35.0",
47
+
"eslint-plugin-react-hooks": "^5.1.0-rc.0",
48
+
"eslint-plugin-react-refresh": "^0.4.9",
49
+
"globals": "^15.9.0",
50
+
"prettier": "^3.5.2",
51
+
"tsx": "^4.19.2",
52
+
"typescript": "^5.6.2",
53
+
"vite": "^7.1.10"
54
+
}
55
+
}
+126
plugins/fluidType.ts
+126
plugins/fluidType.ts
···
1
+
import plugin from 'tailwindcss/plugin';
2
+
3
+
/**
4
+
* Utility syntax (arbitrary values):
5
+
*
6
+
* - Font-size: fluid-[minPx_maxPx@vwMinPx_vwMaxPx] e.g. fluid-[28_88@360_1200]
7
+
* - Line-height (optional): fluid-lh-[minMax@vwMin_vwMax] values are plain numbers (unitless), e.g.
8
+
* fluid-lh-[1.15_1.25@360_1200]
9
+
* - Letter-spacing (optional, em): fluid-ls-[minEm_maxEm@vwMin_vwMax] e.g. fluid-ls-[-0.01_-0.02@360_1200]
10
+
*
11
+
* Notes:
12
+
*
13
+
* - Assumes 16px = 1rem.
14
+
* - Uses linear interpolation between vwMin and vwMax.
15
+
* - Guards with clamp() to cap at the ends.
16
+
*/
17
+
export default function fluidType() {
18
+
return plugin(function ({ matchUtilities, theme }) {
19
+
const toNum = (s: string) => Number(s.trim());
20
+
21
+
const parse = (raw: string) => {
22
+
// "28_88@360_1200"
23
+
const [mm, rr] = raw.split('@');
24
+
if (!mm || !rr) throw new Error('Expected pattern min_max@vwMin_vwMax');
25
+
const [min, max] = mm.split('_').map(toNum);
26
+
const [vwMin, vwMax] = rr.split('_').map(toNum);
27
+
return { min, max, vwMin, vwMax };
28
+
};
29
+
30
+
// font-size in px -> rem
31
+
matchUtilities(
32
+
{
33
+
fluid: (value: string) => {
34
+
const { min, max, vwMin, vwMax } = parse(value);
35
+
const minRem = `${min / 16}rem`;
36
+
const maxRem = `${max / 16}rem`;
37
+
const slope = max - min; // px
38
+
const range = vwMax - vwMin; // px
39
+
// clamp(min, preferred, max)
40
+
// preferred = min + (slope) * ((100vw - vwMin) / range)
41
+
return {
42
+
fontSize: `clamp(${minRem}, calc(${minRem} + ${slope.toFixed(6)} * ((100vw - ${vwMin}px) / ${range})), ${maxRem})`,
43
+
};
44
+
},
45
+
},
46
+
{ values: {}, type: 'any' },
47
+
);
48
+
49
+
// line-height (unitless)
50
+
matchUtilities(
51
+
{
52
+
'fluid-lh': (value: string) => {
53
+
const { min, max, vwMin, vwMax } = parse(value);
54
+
const slope = max - min;
55
+
const range = vwMax - vwMin;
56
+
return {
57
+
lineHeight: `clamp(${min}, calc(${min} + ${slope.toFixed(6)} * ((100vw - ${vwMin}px) / ${range})), ${max})`,
58
+
};
59
+
},
60
+
},
61
+
{ values: {}, type: 'any' },
62
+
);
63
+
64
+
// letter-spacing in em
65
+
matchUtilities(
66
+
{
67
+
'fluid-ls': (value: string) => {
68
+
const { min, max, vwMin, vwMax } = parse(value);
69
+
const slope = max - min;
70
+
const range = vwMax - vwMin;
71
+
return {
72
+
letterSpacing: `clamp(${min}em, calc(${min}em + ${slope.toFixed(6)}em * ((100vw - ${vwMin}px) / ${range})), ${max}em)`,
73
+
};
74
+
},
75
+
},
76
+
{ values: {}, type: 'any' },
77
+
);
78
+
79
+
// Optional presets for common typography scales
80
+
const fsPresets: Record<string, [number, number, number, number]> = {
81
+
h1: [
82
+
28,
83
+
88,
84
+
360,
85
+
1200,
86
+
],
87
+
h2: [
88
+
22,
89
+
48,
90
+
360,
91
+
1200,
92
+
],
93
+
h3: [
94
+
18,
95
+
32,
96
+
360,
97
+
1200,
98
+
],
99
+
body: [
100
+
16,
101
+
18,
102
+
360,
103
+
1200,
104
+
],
105
+
};
106
+
107
+
matchUtilities(
108
+
{
109
+
'fluid-preset': (key: string) => {
110
+
const p = fsPresets[key];
111
+
if (!p) return {};
112
+
const [
113
+
min,
114
+
max,
115
+
vwMin,
116
+
vwMax,
117
+
] = p;
118
+
return {
119
+
fontSize: `clamp(${min / 16}rem, calc(${min / 16}rem + ${(max - min).toFixed(6)} * ((100vw - ${vwMin}px) / ${vwMax - vwMin})), ${max / 16}rem)`,
120
+
};
121
+
},
122
+
},
123
+
{ values: Object.fromEntries(Object.keys(fsPresets).map((k) => [k, k])) },
124
+
);
125
+
});
126
+
}
+6
postcss.config.js
+6
postcss.config.js
+7
public/Artworks/design.svg
+7
public/Artworks/design.svg
···
1
+
<svg xmlns="http://www.w3.org/2000/svg" fill="none" height="512" viewBox="0 0 768 512" width="768">
2
+
<rect fill="#006400" height="512" width="768" />
3
+
<path
4
+
d="M364.625 231.746V112.812H288.125V231.746V234.734L286.332 237.125L239.715 304.062H370.602L387.336 313.625H386.738H235.531H233.141L202.062 359.047V399.688H402.875V409.25H202.062H192.5V399.688V356.059L278.562 231.746V112.812H264.219H259.438V103.25H264.219H278.562H288.125H364.625H374.188H388.531H393.312V112.812H388.531H374.188V231.746L390.922 256.848L386.141 265.812L365.82 237.125L364.625 234.734V231.746ZM505.672 252.066C510.453 253.859 514.637 256.848 518.82 259.836L539.738 247.883L561.852 286.133L566.633 294.5L558.266 299.281L545.715 306.453C545.715 308.844 545.715 311.234 545.715 313.625C545.715 316.016 545.715 318.406 545.715 320.797L558.266 328.566L566.633 333.348L561.852 341.117L539.738 379.367L518.82 367.414C514.637 370.402 510.453 373.391 505.672 375.184V390.723V400.285H496.109H462.641H453.078V390.723V375.781C448.297 373.391 443.516 371 439.332 368.012L418.414 379.965L396.301 341.715L391.52 333.348L399.887 328.566L412.438 321.395C412.438 319.004 411.84 316.016 411.84 313.625C411.84 311.234 412.438 308.844 412.438 306.453L399.887 299.281L391.52 294.5L396.301 286.133L413.633 256.25L418.414 247.883L426.781 252.664L439.332 259.836C443.516 256.848 448.297 253.859 453.078 252.066V236.527V226.965H462.641H496.109H505.672V236.527V252.066ZM536.152 261.031L523.602 268.203L518.223 271.191L512.844 267.605C509.855 265.215 505.672 262.824 501.488 261.031L496.109 258.641V252.066V236.527H462.641V252.066V258.641L456.664 261.031C452.48 262.824 448.297 265.215 445.309 267.605L439.93 271.191L434.551 268.203L422 261.031L404.668 290.914L417.219 298.086L422.598 301.074L422 307.648C422 309.441 421.402 311.832 421.402 313.625C421.402 316.016 422 317.809 422 320.199L422.598 326.176L417.219 329.164L404.668 336.934L422 366.816L434.551 359.645L439.93 356.059L445.309 360.242C448.895 362.633 452.48 365.023 456.664 366.816L462.641 369.207V375.184V390.723H496.109V375.184V369.207L501.488 366.219C505.672 364.426 509.258 362.633 512.844 359.645L518.223 356.059L523.602 359.047L536.152 366.816L553.484 336.336L540.934 329.164L535.555 326.176L536.152 320.199C536.152 317.809 536.75 316.016 536.75 313.625C536.75 311.832 536.152 309.441 536.152 307.648L535.555 301.074L540.934 298.086L553.484 290.914L536.152 261.031ZM479.375 294.5C468.617 294.5 460.25 303.465 460.25 313.625C460.25 324.383 468.617 332.75 479.375 332.75C489.535 332.75 498.5 324.383 498.5 313.625C498.5 303.465 489.535 294.5 479.375 294.5ZM479.375 342.312C468.617 342.312 459.652 336.934 454.273 327.969C448.895 319.004 448.895 308.246 454.273 299.281C459.652 290.316 468.617 284.938 479.375 284.938C489.535 284.938 498.5 290.316 503.879 299.281C509.258 308.246 509.258 319.004 503.879 327.969C498.5 336.934 489.535 342.312 479.375 342.312Z"
5
+
fill="#7FFF00"
6
+
/>
7
+
</svg>
+14
public/Artworks/operations.svg
+14
public/Artworks/operations.svg
···
1
+
<svg xmlns="http://www.w3.org/2000/svg" fill="none" height="1024" viewBox="0 0 1536 1024" width="1536">
2
+
<g clip-path="url(#clip0_597_12)">
3
+
<rect fill="#4B0082" height="1024" width="1536" />
4
+
<path
5
+
d="M626.25 465.25L639.539 441.625L800.484 159.602L815.25 134.5L828.539 159.602L989.484 441.625L1004.25 465.25H976.195H652.828H626.25ZM815.25 183.227L666.117 441.625H962.906L815.25 183.227ZM579 536.125C518.461 536.125 465.305 568.609 435.773 618.812C404.766 670.492 404.766 733.984 435.773 784.188C465.305 835.867 518.461 866.875 579 866.875C638.062 866.875 691.219 835.867 720.75 784.188C751.758 733.984 751.758 670.492 720.75 618.812C691.219 568.609 638.062 536.125 579 536.125ZM579 890.5C511.078 890.5 449.062 855.062 415.102 796C381.141 738.414 381.141 666.062 415.102 607C449.062 549.414 511.078 512.5 579 512.5C645.445 512.5 707.461 549.414 741.422 607C775.383 666.062 775.383 738.414 741.422 796C707.461 855.062 645.445 890.5 579 890.5ZM1122.38 559.75H838.875V843.25H1122.38V559.75ZM838.875 536.125H1122.38H1146V559.75V843.25V866.875H1122.38H838.875H815.25V843.25V559.75V536.125H838.875Z"
6
+
fill="#FF00FF"
7
+
/>
8
+
</g>
9
+
<defs>
10
+
<clipPath id="clip0_597_12">
11
+
<rect fill="white" height="1024" width="1536" />
12
+
</clipPath>
13
+
</defs>
14
+
</svg>
+14
public/Artworks/strategy.svg
+14
public/Artworks/strategy.svg
···
1
+
<svg xmlns="http://www.w3.org/2000/svg" fill="none" height="1024" viewBox="0 0 1536 1024" width="1536">
2
+
<g clip-path="url(#clip0_597_6)">
3
+
<rect fill="#8B0000" height="1024" width="1536" />
4
+
<path
5
+
d="M654.305 772.375C607.055 714.789 579 640.961 579 559.75C579 404.711 686.789 273.297 831.492 239.336C778.336 189.133 704.508 158.125 626.25 158.125C456.445 158.125 319.125 296.922 319.125 465.25C319.125 635.055 456.445 772.375 626.25 772.375C635.109 772.375 645.445 772.375 654.305 772.375ZM682.359 767.945C825.586 741.367 933.375 615.859 933.375 465.25C933.375 385.516 902.367 313.164 852.164 258.531C710.414 285.109 602.625 410.617 602.625 559.75C602.625 640.961 632.156 713.312 682.359 767.945ZM673.5 793.047C658.734 796 642.492 796 626.25 796C443.156 796 295.5 648.344 295.5 465.25C295.5 283.633 443.156 134.5 626.25 134.5C717.797 134.5 800.484 172.891 861.023 233.43C875.789 230.477 892.031 229 909.75 229C1091.37 229 1240.5 378.133 1240.5 559.75C1240.5 742.844 1091.37 890.5 909.75 890.5C816.727 890.5 734.039 853.586 673.5 793.047ZM880.219 254.102C927.469 311.688 957 385.516 957 465.25C957 621.766 847.734 753.18 703.031 787.141C757.664 837.344 830.016 866.875 909.75 866.875C1078.08 866.875 1216.88 729.555 1216.88 559.75C1216.88 391.422 1078.08 252.625 909.75 252.625C899.414 252.625 889.078 254.102 880.219 254.102Z"
6
+
fill="#FF0000"
7
+
/>
8
+
</g>
9
+
<defs>
10
+
<clipPath id="clip0_597_6">
11
+
<rect fill="white" height="1024" width="1536" />
12
+
</clipPath>
13
+
</defs>
14
+
</svg>
public/avatar-square.jpeg
public/avatar-square.jpeg
This is a binary file and will not be displayed.
public/avatar-tall.jpeg
public/avatar-tall.jpeg
This is a binary file and will not be displayed.
public/avatar-wide.jpeg
public/avatar-wide.jpeg
This is a binary file and will not be displayed.
+42
src/App.css
+42
src/App.css
···
1
+
#root {
2
+
max-width: 1280px;
3
+
margin: 0 auto;
4
+
padding: 2rem;
5
+
text-align: center;
6
+
}
7
+
8
+
.logo {
9
+
height: 6em;
10
+
padding: 1.5em;
11
+
will-change: filter;
12
+
transition: filter 300ms;
13
+
}
14
+
.logo:hover {
15
+
filter: drop-shadow(0 0 2em #646cffaa);
16
+
}
17
+
.logo.react:hover {
18
+
filter: drop-shadow(0 0 2em #61dafbaa);
19
+
}
20
+
21
+
@keyframes logo-spin {
22
+
from {
23
+
transform: rotate(0deg);
24
+
}
25
+
to {
26
+
transform: rotate(360deg);
27
+
}
28
+
}
29
+
30
+
@media (prefers-reduced-motion: no-preference) {
31
+
a:nth-of-type(2) .logo {
32
+
animation: logo-spin infinite 20s linear;
33
+
}
34
+
}
35
+
36
+
.card {
37
+
padding: 2em;
38
+
}
39
+
40
+
.read-the-docs {
41
+
color: #888;
42
+
}
+48
src/App.tsx
+48
src/App.tsx
···
1
+
import AboutPage from '@/pages/AboutPage';
2
+
import HomePage from '@/pages/HomePage';
3
+
import WorksPage from '@/pages/WorksPage';
4
+
import WritingPage from '@/pages/WritingPage';
5
+
import React, { useEffect } from 'react';
6
+
import { Route, Routes } from 'react-router-dom';
7
+
8
+
/**
9
+
* Main App component with routing.
10
+
*
11
+
* @returns Main application JSX element
12
+
*/
13
+
const App: React.FC = () => {
14
+
// Set dark mode based on system preference
15
+
useEffect(() => {
16
+
const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
17
+
18
+
const updateTheme = (e: MediaQueryListEvent | MediaQueryList) => {
19
+
if (e.matches) {
20
+
document.documentElement.classList.add('dark');
21
+
} else {
22
+
document.documentElement.classList.remove('dark');
23
+
}
24
+
};
25
+
26
+
// Set initial theme
27
+
updateTheme(mediaQuery);
28
+
29
+
// Listen for changes
30
+
mediaQuery.addEventListener('change', updateTheme);
31
+
32
+
return () => mediaQuery.removeEventListener('change', updateTheme);
33
+
}, []);
34
+
35
+
return (
36
+
<div id="app" className="min-h-screen">
37
+
<Routes>
38
+
<Route path="/" element={<HomePage />} />
39
+
<Route path="/about" element={<AboutPage />} />
40
+
<Route path="/works" element={<WorksPage />} />
41
+
<Route path="/writing" element={<WritingPage />} />
42
+
{/* <Route path="/studies" element={<Studies />} /> */}
43
+
</Routes>
44
+
</div>
45
+
);
46
+
};
47
+
48
+
export default App;
+3
src/components/Artwork/Artwork.styles.ts
+3
src/components/Artwork/Artwork.styles.ts
+8
src/components/Artwork/Artwork.tsx
+8
src/components/Artwork/Artwork.tsx
···
1
+
import { cn } from '@/lib/utils';
2
+
import React from 'react';
3
+
import { artworkStyles } from './Artwork.styles';
4
+
import { ArtworkProps } from './Artwork.types';
5
+
6
+
export const Artwork: React.FC<ArtworkProps> = ({ name, className }) => {
7
+
return <img src={`/Artworks/${name}.svg`} alt={name} className={cn(artworkStyles.base, className)} />;
8
+
};
+6
src/components/Artwork/Artwork.types.ts
+6
src/components/Artwork/Artwork.types.ts
+7
src/components/BackButton/BackButton.constants.ts
+7
src/components/BackButton/BackButton.constants.ts
+4
src/components/BackButton/BackButton.styles.ts
+4
src/components/BackButton/BackButton.styles.ts
···
1
+
export const button =
2
+
'inline-flex items-center px-4 py-2 rounded-full bg-bones-black-5 dark:bg-bones-white-20 text-bones-black-60 dark:text-bones-white-80 hover:bg-bones-blue-10 hover:text-bones-blue dark:hover:bg-bones-blue-20 dark:hover:text-bones-blue transition-colors';
3
+
4
+
export const icon = 'w-4 h-4 mr-2';
+22
src/components/BackButton/BackButton.tsx
+22
src/components/BackButton/BackButton.tsx
···
1
+
import { useNavigate } from 'react-router-dom';
2
+
import * as styles from './BackButton.styles';
3
+
import { BUTTON_TEXT, ICON_PATH, ICON_VIEWBOX, STROKE_WIDTH } from './BackButton.constants';
4
+
5
+
export default function BackButton() {
6
+
const navigate = useNavigate();
7
+
8
+
return (
9
+
<button onClick={() => navigate(-1)} className={styles.button}>
10
+
<svg
11
+
className={styles.icon}
12
+
fill="none"
13
+
stroke="currentColor"
14
+
viewBox={ICON_VIEWBOX}
15
+
xmlns="http://www.w3.org/2000/svg"
16
+
>
17
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={STROKE_WIDTH} d={ICON_PATH} />
18
+
</svg>
19
+
{BUTTON_TEXT}
20
+
</button>
21
+
);
22
+
}
+2
src/components/BackButton/BackButton.types.ts
+2
src/components/BackButton/BackButton.types.ts
+2
src/components/Banner/Banner.styles.ts
+2
src/components/Banner/Banner.styles.ts
+23
src/components/Banner/Banner.tsx
+23
src/components/Banner/Banner.tsx
···
1
+
import { cn } from '@/lib/utils';
2
+
import React from 'react';
3
+
import { Paragraph } from '../Paragraph/Paragraph';
4
+
import { Link } from '../Link/Link';
5
+
import { banner } from './Banner.styles';
6
+
import { BannerProps } from './Banner.types';
7
+
8
+
export const Banner: React.FC<BannerProps> = ({ message, linkText, linkUrl, className = '' }) => {
9
+
return (
10
+
<div className={cn(banner, className)} role="banner">
11
+
<div className="flex items-center mx-auto">
12
+
<Paragraph className="text-sm font-normal">
13
+
{message}{' '}
14
+
{linkText && linkUrl && (
15
+
<Link href={linkUrl}>
16
+
{linkText}
17
+
</Link>
18
+
)}
19
+
</Paragraph>
20
+
</div>
21
+
</div>
22
+
);
23
+
};
+7
src/components/Banner/Banner.types.ts
+7
src/components/Banner/Banner.types.ts
+16
src/components/Breadcrumb/Breadcrumb.constants.ts
+16
src/components/Breadcrumb/Breadcrumb.constants.ts
···
1
+
export const DEFAULT_BASE = 'Home';
2
+
3
+
export const ARIA_LABEL = 'Breadcrumb';
4
+
5
+
export const SEPARATOR_ICON = {
6
+
xmlns: 'http://www.w3.org/2000/svg',
7
+
width: '24',
8
+
height: '24',
9
+
viewBox: '0 0 24 24',
10
+
fill: 'none',
11
+
stroke: 'currentColor',
12
+
strokeWidth: '2',
13
+
strokeLinecap: 'round' as const,
14
+
strokeLinejoin: 'round' as const,
15
+
path: 'm9 18 6-6-6-6',
16
+
};
+7
src/components/Breadcrumb/Breadcrumb.styles.ts
+7
src/components/Breadcrumb/Breadcrumb.styles.ts
···
1
+
export const breadcrumbList = 'flex items-center whitespace-nowrap';
2
+
3
+
export const breadcrumbItem = 'inline-flex items-center';
4
+
5
+
export const currentPage = 'font-semibold text-brand-800 dark:text-brand-200';
6
+
7
+
export const separator = 'shrink-0 mx-2 size-4 text-brand-400 dark:text-brand-600';
+65
src/components/Breadcrumb/Breadcrumb.tsx
+65
src/components/Breadcrumb/Breadcrumb.tsx
···
1
+
import { Link } from '@/components/Link/Link';
2
+
import React from 'react';
3
+
import { useLocation } from 'react-router-dom';
4
+
import * as styles from './Breadcrumb.styles';
5
+
import { ARIA_LABEL, DEFAULT_BASE, SEPARATOR_ICON } from './Breadcrumb.constants';
6
+
import { BreadcrumbPath, BreadcrumbProps } from './Breadcrumb.types';
7
+
8
+
const Breadcrumb: React.FC<BreadcrumbProps> = ({ base = DEFAULT_BASE }) => {
9
+
const location = useLocation();
10
+
const { pathname } = location;
11
+
12
+
// Split the pathname and filter out empty strings
13
+
const paths = pathname.split('/').filter(Boolean);
14
+
15
+
// If on the home page, show only the base and return early
16
+
if (paths.length === 0) {
17
+
return (
18
+
<nav aria-label={ARIA_LABEL}>
19
+
<ol className={styles.breadcrumbList}>
20
+
<li className={styles.breadcrumbItem}>
21
+
<span className={styles.currentPage}>{base}</span>
22
+
</li>
23
+
</ol>
24
+
</nav>
25
+
);
26
+
}
27
+
28
+
// Build breadcrumb links for all other paths
29
+
const breadcrumbPaths: BreadcrumbPath[] = paths.map((path, index) => {
30
+
const href = `/${paths.slice(0, index + 1).join('/')}`;
31
+
const name = path.charAt(0).toUpperCase() + path.slice(1);
32
+
return { name, href };
33
+
});
34
+
35
+
return (
36
+
<nav aria-label={ARIA_LABEL}>
37
+
<ol className={styles.breadcrumbList}>
38
+
<li className={styles.breadcrumbItem}>
39
+
<Link to="/">{base}</Link>
40
+
<svg className={styles.separator} {...SEPARATOR_ICON}>
41
+
<path d={SEPARATOR_ICON.path}></path>
42
+
</svg>
43
+
</li>
44
+
{breadcrumbPaths.map((path, index) => (
45
+
<li key={index} className={styles.breadcrumbItem}>
46
+
{index === breadcrumbPaths.length - 1 ? (
47
+
// If it's the last item, display it as text (not a link)
48
+
<span className={styles.currentPage}>{path.name}</span>
49
+
) : (
50
+
// Otherwise, display it as a link
51
+
<Link to={path.href}>
52
+
{path.name}
53
+
<svg className={styles.separator} {...SEPARATOR_ICON}>
54
+
<path d={SEPARATOR_ICON.path}></path>
55
+
</svg>
56
+
</Link>
57
+
)}
58
+
</li>
59
+
))}
60
+
</ol>
61
+
</nav>
62
+
);
63
+
};
64
+
65
+
export default Breadcrumb;
+8
src/components/Breadcrumb/Breadcrumb.types.ts
+8
src/components/Breadcrumb/Breadcrumb.types.ts
+8
src/components/Button/Button.styles.ts
+8
src/components/Button/Button.styles.ts
···
1
+
// Button inherits from page theme context
2
+
// Buttons use semi-transparent backgrounds with borders matching the page theme rules
3
+
export const buttonBase = 'text-2xl font-bold px-8 py-4 transition-colors duration-200 border-2';
4
+
5
+
export const buttonVariants = {
6
+
primary: 'tracking-wider',
7
+
secondary: 'tracking-wide',
8
+
} as const;
+24
src/components/Button/Button.tsx
+24
src/components/Button/Button.tsx
···
1
+
import { usePageTheme } from '@/components/Layout/Layout';
2
+
import { cn } from '@/lib/utils';
3
+
import React from 'react';
4
+
import { buttonBase, buttonVariants } from './Button.styles';
5
+
import { ButtonProps } from './Button.types';
6
+
7
+
export const Button: React.FC<ButtonProps> = ({ children, variant = 'primary', className = '', ...props }) => {
8
+
const pageTheme = usePageTheme();
9
+
10
+
// Theme-based button colors:
11
+
// Accent: white border, semi-transparent white bg
12
+
// Default: blue border in light mode, white in dark, semi-transparent bg
13
+
const themeClasses = pageTheme === 'accent'
14
+
? 'border-bones-white bg-bones-white-20 hover:bg-bones-white-30'
15
+
: 'border-bones-blue dark:border-bones-white bg-bones-blue-10 dark:bg-bones-white-10 hover:bg-bones-blue-20 dark:hover:bg-bones-white-20';
16
+
17
+
return (
18
+
<button className={cn(buttonBase, buttonVariants[variant], themeClasses, className)} {...props}>
19
+
{children}
20
+
</button>
21
+
);
22
+
};
23
+
24
+
export default Button;
+9
src/components/Button/Button.types.ts
+9
src/components/Button/Button.types.ts
+5
src/components/CardArticle/CardArticle.constants.ts
+5
src/components/CardArticle/CardArticle.constants.ts
+10
src/components/CardArticle/CardArticle.styles.ts
+10
src/components/CardArticle/CardArticle.styles.ts
···
1
+
export const cardWrapper = 'group relative flex flex-col h-full bg-bones-white dark:bg-bones-black';
2
+
export const contentContainer = 'flex flex-col flex-grow gap-4 p-8 justify-between';
3
+
export const coverImage = 'object-cover w-full h-full transition-transform group-hover:scale-105';
4
+
export const coverImageContainer = 'relative aspect-[16/9] w-full overflow-hidden bg-neutral-100 dark:bg-neutral-700';
5
+
export const date = 'text-neutral-600 dark:text-neutral-400';
6
+
export const detailContainer = 'flex flex-col gap-1';
7
+
export const metaContainer = 'flex items-center justify-between';
8
+
export const publicationContainer = 'flex items-center gap-2';
9
+
export const publicationIcon = 'h-8 w-8 object-contain';
10
+
export const publicationName = 'font-medium text-neutral-900 dark:text-neutral-100';
+42
src/components/CardArticle/CardArticle.tsx
+42
src/components/CardArticle/CardArticle.tsx
···
1
+
import { Heading } from '@/components/Heading/Heading';
2
+
import { Paragraph } from '@/components/Paragraph/Paragraph';
3
+
import React from 'react';
4
+
import { DATE_FORMAT_OPTIONS } from './CardArticle.constants';
5
+
import * as styles from './CardArticle.styles';
6
+
import { CardArticleProps } from './CardArticle.types';
7
+
8
+
export const CardArticle: React.FC<CardArticleProps> = ({ article }) => {
9
+
const formattedDate = new Date(article.published).toLocaleDateString('en-US', DATE_FORMAT_OPTIONS);
10
+
11
+
return (
12
+
<a href={article.articleUrl} target="_blank" rel="noopener noreferrer" className={styles.cardWrapper}>
13
+
{/* Cover Image (if available) */}
14
+
{article.coverImage && (
15
+
<div className={styles.coverImageContainer}>
16
+
<img src={article.coverImage} alt="" className={styles.coverImage} />
17
+
</div>
18
+
)}
19
+
20
+
{/* Content */}
21
+
<div className={styles.contentContainer}>
22
+
{/* Publication Name (left) and Date (right) */}
23
+
<div className={styles.metaContainer}>
24
+
<div className={styles.publicationContainer}>
25
+
{article.publicationIcon && <img src={article.publicationIcon} alt="" className={styles.publicationIcon} />}
26
+
<span className={styles.publicationName}>{article.publication}</span>
27
+
</div>
28
+
<span className={styles.date}>{formattedDate}</span>
29
+
</div>
30
+
<div className={styles.detailContainer}>
31
+
{/* Title */}
32
+
<Heading level={3} style="title">
33
+
{article.title}
34
+
</Heading>
35
+
36
+
{/* Description */}
37
+
{article.subtitle && <Paragraph>{article.subtitle}</Paragraph>}
38
+
</div>
39
+
</div>
40
+
</a>
41
+
);
42
+
};
+11
src/components/CardArticle/CardArticle.types.ts
+11
src/components/CardArticle/CardArticle.types.ts
+8
src/components/CardNote/CardNote.constants.ts
+8
src/components/CardNote/CardNote.constants.ts
+27
src/components/CardNote/CardNote.styles.ts
+27
src/components/CardNote/CardNote.styles.ts
···
1
+
import { cn } from '@/lib/utils';
2
+
3
+
export const getCardWrapperStyles = (onClick?: () => void, className?: string) =>
4
+
cn(
5
+
'group relative flex flex-col bg-white dark:bg-neutral-800 rounded-lg overflow-hidden transition-all',
6
+
onClick && 'cursor-pointer hover:shadow-lg',
7
+
className,
8
+
);
9
+
10
+
export const coverImageContainer =
11
+
'relative aspect-[16/9] w-full overflow-hidden bg-neutral-100 dark:bg-neutral-700';
12
+
13
+
export const coverImage = 'object-cover w-full h-full transition-transform group-hover:scale-105';
14
+
15
+
export const contentContainer = 'flex flex-col gap-4 p-6';
16
+
17
+
export const badgeMetaContainer = 'flex items-center justify-between gap-4';
18
+
19
+
export const getBadgeStyles = (variant: 'primary' | 'secondary' = 'primary') =>
20
+
cn(
21
+
'inline-flex px-3 py-1 text-sm font-medium rounded-full',
22
+
variant === 'primary'
23
+
? 'bg-brand-100 text-brand-900 dark:bg-brand-800 dark:text-brand-100'
24
+
: 'bg-neutral-100 text-neutral-900 dark:bg-neutral-700 dark:text-neutral-100',
25
+
);
26
+
27
+
export const metaContainer = 'flex items-center gap-2 text-sm text-neutral-600 dark:text-neutral-400';
+41
src/components/CardNote/CardNote.tsx
+41
src/components/CardNote/CardNote.tsx
···
1
+
import React from 'react';
2
+
import { Heading } from '../Heading/Heading';
3
+
import { Paragraph } from '../Paragraph/Paragraph';
4
+
import * as styles from './CardNote.styles';
5
+
import { META_SEPARATOR } from './CardNote.constants';
6
+
import { BaseCardNoteProps } from './CardNote.types';
7
+
8
+
export const CardNote: React.FC<BaseCardNoteProps> = ({ className, coverImage, badge, meta, title, description, onClick }) => {
9
+
const CardWrapper = onClick ? 'button' : 'div';
10
+
11
+
return (
12
+
<CardWrapper className={styles.getCardWrapperStyles(onClick, className)} onClick={onClick}>
13
+
{/* Cover Image */}
14
+
{coverImage && (
15
+
<div className={styles.coverImageContainer}>
16
+
<img src={coverImage} alt="" className={styles.coverImage} />
17
+
</div>
18
+
)}
19
+
20
+
{/* Content */}
21
+
<div className={styles.contentContainer}>
22
+
{/* Badge + Meta */}
23
+
<div className={styles.badgeMetaContainer}>
24
+
{badge && <span className={styles.getBadgeStyles(badge.variant)}>{badge.label}</span>}
25
+
{meta && (
26
+
<div className={styles.metaContainer}>
27
+
{meta.company && <span>{meta.company}</span>}
28
+
{meta.company && meta.date && <span>{META_SEPARATOR}</span>}
29
+
{meta.date && <span>{meta.date}</span>}
30
+
</div>
31
+
)}
32
+
</div>
33
+
34
+
{/* Title */}
35
+
<Heading level={3}>{title}</Heading>
36
+
{/* Description */}
37
+
{description && <Paragraph>{description}</Paragraph>}
38
+
</div>
39
+
</CardWrapper>
40
+
);
41
+
};
+26
src/components/CardNote/CardNote.types.ts
+26
src/components/CardNote/CardNote.types.ts
···
1
+
export interface BaseCardNoteProps {
2
+
className?: string;
3
+
coverImage?: string;
4
+
badge?: {
5
+
label: string;
6
+
variant?: 'primary' | 'secondary';
7
+
};
8
+
meta?: {
9
+
company?: string;
10
+
date?: string;
11
+
subtitle?: string;
12
+
};
13
+
title: string;
14
+
description?: string;
15
+
onClick?: () => void;
16
+
}
17
+
18
+
export interface Study {
19
+
name: string;
20
+
summary: string;
21
+
coverImage: string;
22
+
type: string;
23
+
endDate: string;
24
+
company: string;
25
+
slug: string;
26
+
}
+4
src/components/CardNote/index.ts
+4
src/components/CardNote/index.ts
+1
src/components/CardRole/CardRole.constants.ts
+1
src/components/CardRole/CardRole.constants.ts
···
1
+
export const ROLES_BASE_PATH = '/roles';
+1
src/components/CardRole/CardRole.styles.ts
+1
src/components/CardRole/CardRole.styles.ts
···
1
+
// No custom styles needed - using Card component defaults
+21
src/components/CardRole/CardRole.tsx
+21
src/components/CardRole/CardRole.tsx
···
1
+
import { CardNote } from '@/components/CardNote/CardNote';
2
+
import React from 'react';
3
+
import { useNavigate } from 'react-router-dom';
4
+
import { ROLES_BASE_PATH } from './CardRole.constants';
5
+
import { CardRoleProps } from './CardRole.types';
6
+
7
+
export const CardRole: React.FC<CardRoleProps> = ({ role }) => {
8
+
const navigate = useNavigate();
9
+
10
+
return (
11
+
<CardNote
12
+
coverImage={role.coverImage}
13
+
meta={{
14
+
date: role.date,
15
+
}}
16
+
title={role.title}
17
+
description={`${role.company} | ${role.subtitle}`}
18
+
onClick={() => navigate(`${ROLES_BASE_PATH}/${role.slug}`)}
19
+
/>
20
+
);
21
+
};
+10
src/components/CardRole/CardRole.types.ts
+10
src/components/CardRole/CardRole.types.ts
+9
src/components/CardStudy/CardStudy.constants.ts
+9
src/components/CardStudy/CardStudy.constants.ts
+1
src/components/CardStudy/CardStudy.styles.ts
+1
src/components/CardStudy/CardStudy.styles.ts
···
1
+
export const cardWrapper = 'group cursor-pointer transition-all hover:shadow-lg hover:-translate-y-1';
+28
src/components/CardStudy/CardStudy.tsx
+28
src/components/CardStudy/CardStudy.tsx
···
1
+
import { CardNote } from '@/components/CardNote/CardNote';
2
+
import React from 'react';
3
+
import { useNavigate } from 'react-router-dom';
4
+
import * as styles from './CardStudy.styles';
5
+
import { BADGE_VARIANT, CASE_STUDIES_BASE_PATH, DATE_FORMAT_OPTIONS } from './CardStudy.constants';
6
+
import { CardStudyProps } from './CardStudy.types';
7
+
8
+
export const CardStudy: React.FC<CardStudyProps> = ({ caseStudy }) => {
9
+
const navigate = useNavigate();
10
+
11
+
return (
12
+
<CardNote
13
+
coverImage={caseStudy.coverImage}
14
+
badge={{
15
+
label: caseStudy.type,
16
+
variant: BADGE_VARIANT,
17
+
}}
18
+
meta={{
19
+
company: caseStudy.company,
20
+
date: new Date(caseStudy.endDate).toLocaleDateString('en-US', DATE_FORMAT_OPTIONS),
21
+
}}
22
+
title={caseStudy.name}
23
+
description={caseStudy.summary}
24
+
onClick={() => navigate(`${CASE_STUDIES_BASE_PATH}/${caseStudy.slug}`)}
25
+
className={styles.cardWrapper}
26
+
/>
27
+
);
28
+
};
+11
src/components/CardStudy/CardStudy.types.ts
+11
src/components/CardStudy/CardStudy.types.ts
+3
src/components/Divider/Divider.styles.ts
+3
src/components/Divider/Divider.styles.ts
+19
src/components/Divider/Divider.tsx
+19
src/components/Divider/Divider.tsx
···
1
+
import { usePageTheme } from '@/components/Layout/Layout';
2
+
import { cn } from '@/lib/utils';
3
+
import React from 'react';
4
+
import { dividerHorizontal, dividerVertical } from './Divider.styles';
5
+
import { DividerProps } from './Divider.types';
6
+
7
+
export const Divider: React.FC<DividerProps> = ({ className = '', orientation = 'horizontal' }) => {
8
+
const pageTheme = usePageTheme();
9
+
10
+
// Theme-based divider colors:
11
+
// Accent: white border
12
+
// Default: black border in light mode, white in dark
13
+
const themeClasses =
14
+
pageTheme === 'accent' ? 'border-bones-white' : 'border-bones-black-30 dark:border-bones-white-30';
15
+
16
+
const orientationStyles = orientation === 'vertical' ? dividerVertical : dividerHorizontal;
17
+
18
+
return <hr className={cn(orientationStyles, themeClasses, className)} />;
19
+
};
+4
src/components/Divider/Divider.types.ts
+4
src/components/Divider/Divider.types.ts
+6
src/components/Events/Event.styles.ts
+6
src/components/Events/Event.styles.ts
···
1
+
export const eventStyles = {
2
+
wrapper: 'px-8 py-12 bg-bones-white dark:bg-bones-black flex flex-col gap-8',
3
+
title: 'text-2xl font-bold font-dm-sans text-neutral-900',
4
+
subtitle: 'text-lg font-normal font-dm-sans text-neutral-700 italic mt-2',
5
+
meta: 'text-sm font-medium font-dm-sans text-neutral-500 uppercase mt-4',
6
+
} as const;
+32
src/components/Events/Event.tsx
+32
src/components/Events/Event.tsx
···
1
+
import { Heading } from '@/components/Heading/Heading';
2
+
import { Paragraph } from '@/components/Paragraph/Paragraph';
3
+
import { cn } from '@/lib/utils';
4
+
import React from 'react';
5
+
import { eventStyles } from './Event.styles';
6
+
import { EventProps } from './Event.types';
7
+
8
+
export const Event: React.FC<EventProps> = ({
9
+
eventType,
10
+
eventTitle,
11
+
eventDescription,
12
+
eventStartYear,
13
+
eventEndYear,
14
+
eventAffiliation,
15
+
className = '',
16
+
}) => (
17
+
<div className={cn(eventStyles.wrapper, className)}>
18
+
<div className="flex items-center justify-between">
19
+
<Paragraph size="footnote">{eventAffiliation}</Paragraph>
20
+
<Paragraph size="footnote">
21
+
{eventStartYear} – {eventEndYear}
22
+
</Paragraph>
23
+
</div>
24
+
<div className="flex flex-col gap-2">
25
+
<Heading level={3} style="body">
26
+
{eventTitle}
27
+
</Heading>
28
+
<Paragraph size="body">{eventDescription}</Paragraph>
29
+
</div>
30
+
<Paragraph size="footnote">{eventType}</Paragraph>
31
+
</div>
32
+
);
+9
src/components/Events/Event.types.ts
+9
src/components/Events/Event.types.ts
+3
src/components/Events/Events.styles.ts
+3
src/components/Events/Events.styles.ts
+21
src/components/Events/Events.tsx
+21
src/components/Events/Events.tsx
···
1
+
import { cn } from '@/lib/utils';
2
+
import React from 'react';
3
+
import { Event } from './Event';
4
+
import { eventsStyles } from './Events.styles';
5
+
import { EventsProps } from './Events.types';
6
+
7
+
export const Events: React.FC<EventsProps> = ({ items, className = '' }) => (
8
+
<div className={cn(eventsStyles.wrapper, className)}>
9
+
{items.map((item) => (
10
+
<Event
11
+
key={item.eventTitle}
12
+
eventType={item.eventType}
13
+
eventTitle={item.eventTitle}
14
+
eventDescription={item.eventDescription}
15
+
eventStartYear={item.eventStartYear}
16
+
eventEndYear={item.eventEndYear}
17
+
eventAffiliation={item.eventAffiliation}
18
+
/>
19
+
))}
20
+
</div>
21
+
);
+6
src/components/Events/Events.types.ts
+6
src/components/Events/Events.types.ts
+3
src/components/Facts/Fact.styles.ts
+3
src/components/Facts/Fact.styles.ts
+15
src/components/Facts/Fact.tsx
+15
src/components/Facts/Fact.tsx
···
1
+
import { Heading } from '@/components/Heading/Heading';
2
+
import { Paragraph } from '@/components/Paragraph/Paragraph';
3
+
import { cn } from '@/lib/utils';
4
+
import React from 'react';
5
+
import { factStyles } from './Fact.styles';
6
+
import { FactProps } from './Fact.types';
7
+
8
+
export const Fact: React.FC<FactProps> = ({ title, subtitle, className = '' }) => (
9
+
<div className={cn(factStyles.wrapper, className)}>
10
+
<Heading level={3} style="body">
11
+
{title}
12
+
</Heading>
13
+
<Paragraph size="body">{subtitle}</Paragraph>
14
+
</div>
15
+
);
+5
src/components/Facts/Fact.types.ts
+5
src/components/Facts/Fact.types.ts
+3
src/components/Facts/Facts.styles.ts
+3
src/components/Facts/Facts.styles.ts
+15
src/components/Facts/Facts.tsx
+15
src/components/Facts/Facts.tsx
···
1
+
import { cn } from '@/lib/utils';
2
+
import React from 'react';
3
+
import { Fact } from './Fact';
4
+
import { factsStyles } from './Facts.styles';
5
+
import { FactsProps } from './Facts.types';
6
+
7
+
export const Facts: React.FC<FactsProps> = ({ items, className = '' }) => {
8
+
return (
9
+
<div className={cn(factsStyles.wrapper, className)}>
10
+
{items.map((item) => (
11
+
<Fact key={item.title} title={item.title} subtitle={item.subtitle} />
12
+
))}
13
+
</div>
14
+
);
15
+
};
+6
src/components/Facts/Facts.types.ts
+6
src/components/Facts/Facts.types.ts
+12
src/components/Heading/Heading.styles.ts
+12
src/components/Heading/Heading.styles.ts
···
1
+
export const HeadingStyles = {
2
+
base: 'font-bold font-dm-sans',
3
+
sizes: {
4
+
billboard: 'italic font-medium text-6xl sm:text-3xl md:text-4xl lg:text-5xl xl:text-6xl leading-normal',
5
+
body: 'italic text-xl sm:text-xl md:text-2xl lg:text-3xl xl:text-3xl leading-normal',
6
+
footnote: 'italic text-base sm:text-base md:text-lg lg:text-xl xl:text-xl font-semibold leading-normal',
7
+
page: 'italic text-1xl sm:text-1xl md:text-1xl lg:text-2xl xl:text-3xl leading-normal',
8
+
section: 'italic text-3xl sm:text-3xl md:text-4xl lg:text-5xl xl:text-5xl leading-normal',
9
+
title:
10
+
'italic text-3xl sm:text-3xl md:text-4xl lg:text-5xl xl:text-5xl leading-tight sm:leading-tight md:leading-tight lg:leading-tight xl:leading-tight 2xl:leading-tight',
11
+
},
12
+
} as const;
+37
src/components/Heading/Heading.tsx
+37
src/components/Heading/Heading.tsx
···
1
+
import { cn } from '@/lib/utils';
2
+
import React from 'react';
3
+
import { HeadingStyles } from './Heading.styles';
4
+
import { HeadingLevel, HeadingProps } from './Heading.types';
5
+
6
+
const getHeadingTag = (level: HeadingLevel) => {
7
+
switch (level) {
8
+
case 1:
9
+
return 'h1';
10
+
case 2:
11
+
return 'h2';
12
+
case 3:
13
+
return 'h3';
14
+
case 4:
15
+
return 'h4';
16
+
default:
17
+
return 'h3';
18
+
}
19
+
};
20
+
21
+
export const Heading = React.forwardRef<HTMLHeadingElement, HeadingProps>(
22
+
({ children, level = 3, style = 'body', className = '', ...props }, ref) => {
23
+
const Component = getHeadingTag(level);
24
+
25
+
return React.createElement(
26
+
Component,
27
+
{
28
+
ref,
29
+
className: cn(HeadingStyles.base, HeadingStyles.sizes[style], className),
30
+
...props,
31
+
},
32
+
children,
33
+
);
34
+
},
35
+
);
36
+
37
+
Heading.displayName = 'Heading';
+11
src/components/Heading/Heading.types.ts
+11
src/components/Heading/Heading.types.ts
···
1
+
import { ReactNode } from 'react';
2
+
3
+
export type HeadingLevel = 1 | 2 | 3 | 4;
4
+
export type HeadingStyle = 'page' | 'section' | 'body' | 'billboard' | 'footnote' | `title`;
5
+
6
+
export interface HeadingProps {
7
+
children: ReactNode;
8
+
level?: HeadingLevel; // Semantic HTML tag
9
+
style?: HeadingStyle; // Visual style class
10
+
className?: string;
11
+
}
+1
src/components/Layout/Layout.constants.ts
+1
src/components/Layout/Layout.constants.ts
···
1
+
export const DEFAULT_THEME = 'default' as const;
+22
src/components/Layout/Layout.styles.ts
+22
src/components/Layout/Layout.styles.ts
···
1
+
import { cn } from '@/lib/utils';
2
+
import { PageTheme } from './Layout.types';
3
+
4
+
export const getLayoutStyles = (theme: PageTheme = 'default') =>
5
+
cn(
6
+
'grid grid-cols-1 md:grid-cols-3 min-h-screen gap-0',
7
+
// Accent theme: blue (light) / mediumblue (dark), white text
8
+
theme === 'accent' && 'bg-bones-blue dark:bg-bones-mediumblue text-bones-white',
9
+
// Default theme: white (light) / black (dark), black/white text
10
+
theme === 'default' && 'bg-bones-white dark:bg-bones-black text-bones-black dark:text-bones-white',
11
+
);
12
+
13
+
export const main = 'md:col-span-2 p-12 md:order-1';
14
+
15
+
export const getAsideStyles = (theme: PageTheme = 'default') =>
16
+
cn(
17
+
'md:col-span-1 p-12 md:order-2',
18
+
// Accent theme: white border with transparency
19
+
theme === 'accent' && 'border-l border-bones-white-20',
20
+
// Default theme: black/white borders based on mode
21
+
theme === 'default' && 'border-l border-bones-black-20 dark:border-bones-white-20',
22
+
);
+26
src/components/Layout/Layout.tsx
+26
src/components/Layout/Layout.tsx
···
1
+
import React, { createContext, useContext } from 'react';
2
+
import * as styles from './Layout.styles';
3
+
import { DEFAULT_THEME } from './Layout.constants';
4
+
import { AsideProps, LayoutProps, PageTheme, MainProps } from './Layout.types';
5
+
6
+
// Context to share page theme with child components
7
+
const PageThemeContext = createContext<PageTheme>(DEFAULT_THEME);
8
+
9
+
export const usePageTheme = () => useContext(PageThemeContext);
10
+
11
+
export const Layout: React.FC<LayoutProps> = ({ children, theme = DEFAULT_THEME }) => {
12
+
return (
13
+
<PageThemeContext.Provider value={theme}>
14
+
<div className={styles.getLayoutStyles(theme)}>{children}</div>
15
+
</PageThemeContext.Provider>
16
+
);
17
+
};
18
+
19
+
export const Main: React.FC<MainProps> = ({ children }) => {
20
+
return <main className={styles.main}>{children}</main>;
21
+
};
22
+
23
+
export const Aside: React.FC<AsideProps> = ({ children }) => {
24
+
const theme = usePageTheme();
25
+
return <aside className={styles.getAsideStyles(theme)}>{children}</aside>;
26
+
};
+16
src/components/Layout/Layout.types.ts
+16
src/components/Layout/Layout.types.ts
···
1
+
import { ReactNode } from 'react';
2
+
3
+
export type PageTheme = 'accent' | 'default';
4
+
5
+
export interface LayoutProps {
6
+
children: ReactNode;
7
+
theme?: PageTheme;
8
+
}
9
+
10
+
export interface MainProps {
11
+
children: ReactNode;
12
+
}
13
+
14
+
export interface AsideProps {
15
+
children: ReactNode;
16
+
}
+17
src/components/Link/Link.styles.ts
+17
src/components/Link/Link.styles.ts
···
1
+
export const linkBaseStyles = `
2
+
focus:outline-none
3
+
focus:ring-4 focus:ring-offset-2 focus:ring-bones-yellow dark:focus:ring-bones-gold
4
+
transition ease-in-out duration-200
5
+
`;
6
+
7
+
export const underlineStyles = {
8
+
none: 'no-underline',
9
+
hover: 'hover:underline',
10
+
always: 'underline',
11
+
};
12
+
13
+
export const underlinePositionStyles = {
14
+
left: 'decoration-left',
15
+
center: 'decoration-center',
16
+
right: 'decoration-right',
17
+
};
+53
src/components/Link/Link.tsx
+53
src/components/Link/Link.tsx
···
1
+
import { cn } from '@/lib/utils';
2
+
import React from 'react';
3
+
import { Link as RouterLink } from 'react-router-dom';
4
+
import { linkBaseStyles, underlinePositionStyles, underlineStyles } from './Link.styles';
5
+
import { LinkProps } from './Link.types';
6
+
import { usePageTheme } from '@/components/Layout/Layout';
7
+
8
+
export const Link: React.FC<LinkProps> = ({
9
+
to,
10
+
href,
11
+
children,
12
+
underline = 'always',
13
+
underlinePosition = 'center',
14
+
className,
15
+
...props
16
+
}) => {
17
+
// Convert `to` to `href` if `to` is provided
18
+
const linkHref = to || href;
19
+
20
+
// Get page theme from context
21
+
const pageTheme = usePageTheme();
22
+
23
+
const underlineClass = underlineStyles[underline];
24
+
const positionClass = underlinePositionStyles[underlinePosition];
25
+
26
+
// Theme-based link colors:
27
+
// Accent: white text (inherits from parent)
28
+
// Default: blue text in light mode, white in dark mode
29
+
const themeColorClass = pageTheme === 'accent'
30
+
? 'text-bones-white'
31
+
: 'text-bones-blue dark:text-bones-white';
32
+
33
+
// Check if this is an internal link (starts with / and no protocol)
34
+
const isInternal = linkHref?.startsWith('/') && !linkHref.startsWith('//');
35
+
36
+
const linkClasses = cn(linkBaseStyles, underlineClass, positionClass, themeColorClass, className);
37
+
38
+
// Use React Router Link for internal navigation
39
+
if (isInternal && linkHref) {
40
+
return (
41
+
<RouterLink to={linkHref} className={linkClasses} {...props}>
42
+
{children}
43
+
</RouterLink>
44
+
);
45
+
}
46
+
47
+
// Use regular anchor for external links
48
+
return (
49
+
<a href={linkHref} className={linkClasses} {...props}>
50
+
{children}
51
+
</a>
52
+
);
53
+
};
+8
src/components/Link/Link.types.ts
+8
src/components/Link/Link.types.ts
+14
src/components/Logo/Logo.constants.ts
+14
src/components/Logo/Logo.constants.ts
···
1
+
export const ARIA_LABEL = 'Go to Home';
2
+
3
+
export const SVG_VIEWBOX = '0 0 100 100';
4
+
5
+
export const STROKE_WIDTH = '10';
6
+
7
+
export const RECT_DIMENSIONS = {
8
+
x: '10',
9
+
y: '10',
10
+
width: '80',
11
+
height: '80',
12
+
};
13
+
14
+
export const LOGO_ARIA_LABEL = 'Logo';
+6
src/components/Logo/Logo.styles.ts
+6
src/components/Logo/Logo.styles.ts
···
1
+
export const button =
2
+
'group flex items-center space-x-3 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-yellow-500 dark:focus:ring-yellow-400';
3
+
4
+
export const iconContainer = 'w-10 h-10 border-2 border-current group-hover:scale-105 transition-transform duration-200 ease-in-out';
5
+
6
+
export const svg = 'w-full h-full';
+30
src/components/Logo/Logo.tsx
+30
src/components/Logo/Logo.tsx
···
1
+
import React from 'react';
2
+
import { useNavigate } from 'react-router-dom';
3
+
import * as styles from './Logo.styles';
4
+
import { ARIA_LABEL, LOGO_ARIA_LABEL, RECT_DIMENSIONS, STROKE_WIDTH, SVG_VIEWBOX } from './Logo.constants';
5
+
6
+
const Logo: React.FC = () => {
7
+
const navigate = useNavigate();
8
+
9
+
return (
10
+
<button onClick={() => navigate('/')} aria-label={ARIA_LABEL} className={styles.button}>
11
+
{/* Placeholder Square Logo */}
12
+
<div className={styles.iconContainer}>
13
+
<svg
14
+
xmlns="http://www.w3.org/2000/svg"
15
+
viewBox={SVG_VIEWBOX}
16
+
fill="none"
17
+
stroke="currentColor"
18
+
strokeWidth={STROKE_WIDTH}
19
+
className={styles.svg}
20
+
role="img"
21
+
aria-label={LOGO_ARIA_LABEL}
22
+
>
23
+
<rect x={RECT_DIMENSIONS.x} y={RECT_DIMENSIONS.y} width={RECT_DIMENSIONS.width} height={RECT_DIMENSIONS.height} />
24
+
</svg>
25
+
</div>
26
+
</button>
27
+
);
28
+
};
29
+
30
+
export default Logo;
+2
src/components/Logo/Logo.types.ts
+2
src/components/Logo/Logo.types.ts
+21
src/components/Paragraph/Paragraph.styles.ts
+21
src/components/Paragraph/Paragraph.styles.ts
···
1
+
export const paragraphStyles = {
2
+
base: 'font-dm-sans',
3
+
sizes: {
4
+
body: 'text-lg sm:text-lg md:text-lg lg:text-xl xl:text-2xl leading-snug sm:leading-snug md:leading-normal lg:leading-normal xl:leading-relaxed',
5
+
blockquote:
6
+
'italic text-6xl sm:text-6xl md:text-7xl lg:text-8xl xl:text-8xl leading-tight sm:leading-tight md:leading-tight lg:leading-tight xl:leading-tight',
7
+
byline:
8
+
'font-medium text-1xl sm:text-1xl md:text-1xl lg:text-2xl xl:text-2xl leading-snug sm:leading-snug md:leading-normal lg:leading-normal xl:leading-normal',
9
+
caption:
10
+
'font-medium text-sm sm:text-sm md:text-base lg:text-base xl:text-base leading-snug sm:leading-snug md:leading-normal lg:leading-normal xl:leading-normal',
11
+
display:
12
+
'font-black text-4xl sm:text-5xl md:text-5xl lg:text-7xl xl:text-8xl leading-tight sm:leading-tight md:leading-tight lg:leading-none xl:leading-none',
13
+
footnote:
14
+
'text-sm sm:text-sm md:text-base lg:text-lg xl:text-lg leading-snug sm:leading-snug md:leading-normal lg:leading-normal xl:leading-normal',
15
+
label:
16
+
'font-medium text-1xl sm:text-1xl md:text-1xl lg:text-2xl xl:text-2xl leading-snug sm:leading-snug md:leading-normal lg:leading-normal xl:leading-normal',
17
+
lede: 'italic text-2xl sm:text-2xl md:text-2xl lg:text-3xl xl:text-4xl leading-snug sm:leading-snug md:leading-normal lg:leading-normal xl:leading-relaxed',
18
+
billboard:
19
+
'font-medium text-6xl sm:text-3xl md:text-4xl lg:text-5xl xl:text-6xl leading-tight sm:leading-tight md:leading-tight lg:leading-tight xl:leading-tight',
20
+
},
21
+
} as const;
+16
src/components/Paragraph/Paragraph.tsx
+16
src/components/Paragraph/Paragraph.tsx
···
1
+
import { cn } from '@/lib/utils';
2
+
import React from 'react';
3
+
import { paragraphStyles } from './Paragraph.styles';
4
+
import { ParagraphProps } from './Paragraph.types';
5
+
6
+
export const Paragraph = React.forwardRef<HTMLParagraphElement, ParagraphProps>(
7
+
({ children, size = 'body', className = '' }, ref) => {
8
+
return (
9
+
<p ref={ref} className={cn(paragraphStyles.base, paragraphStyles.sizes[size], className)}>
10
+
{children}
11
+
</p>
12
+
);
13
+
},
14
+
);
15
+
16
+
Paragraph.displayName = 'Paragraph';
+9
src/components/Paragraph/Paragraph.types.ts
+9
src/components/Paragraph/Paragraph.types.ts
···
1
+
import { ReactNode } from 'react';
2
+
3
+
export type ParagraphSize = 'footnote' | 'body' | 'lede' | 'label' | 'display' | 'blockquote' | 'caption' | 'byline' | 'billboard';
4
+
5
+
export interface ParagraphProps {
6
+
children: ReactNode;
7
+
size?: ParagraphSize;
8
+
className?: string;
9
+
}
+14
src/components/PostCarousel/PostCarousel.styles.ts
+14
src/components/PostCarousel/PostCarousel.styles.ts
···
1
+
export const carouselContainer = 'w-full py-8';
2
+
export const carouselTitle = 'text-2xl font-bold mb-6';
3
+
export const carouselWrapper = 'relative overflow-hidden';
4
+
export const carouselTrack = 'flex transition-transform duration-300 ease-in-out';
5
+
export const postCard = 'px-2 flex-shrink-0 transition-all duration-300';
6
+
export const cardContent = 'h-full border rounded-lg overflow-hidden shadow-sm hover:shadow-md transition-shadow';
7
+
export const cardImageWrapper = 'relative aspect-video overflow-hidden';
8
+
export const cardTextWrapper = 'p-4';
9
+
export const postMeta = 'text-sm text-muted-foreground mb-2';
10
+
export const postTitle = 'font-semibold text-lg mb-2 line-clamp-2';
11
+
export const postExcerpt = 'text-muted-foreground line-clamp-3';
12
+
export const navigationWrapper = 'flex items-center justify-between mt-6';
13
+
export const buttonGroup = 'flex gap-2';
14
+
export const navButton = 'p-2 rounded-lg hover:bg-gray-200 dark:hover:bg-gray-700';
+137
src/components/PostCarousel/PostCarousel.tsx
+137
src/components/PostCarousel/PostCarousel.tsx
···
1
+
import { ChevronLeft, ChevronRight } from 'lucide-react';
2
+
import { useEffect, useRef, useState } from 'react';
3
+
// Components
4
+
import { Button } from '../Button/Button';
5
+
import { CardArticle } from '../CardArticle/CardArticle';
6
+
import { Heading } from '../Heading/Heading';
7
+
import { Paragraph } from '../Paragraph/Paragraph';
8
+
// Styles & Types
9
+
import * as styles from './PostCarousel.styles';
10
+
import { PostCarouselProps } from './PostCarousel.types';
11
+
12
+
export default function PostCarousel({ posts, title = 'Latest Posts' }: PostCarouselProps) {
13
+
const [currentIndex, setCurrentIndex] = useState(0);
14
+
const [visibleCount, setVisibleCount] = useState(3);
15
+
const containerRef = useRef<HTMLDivElement>(null);
16
+
const carouselRef = useRef<HTMLDivElement>(null);
17
+
const [announcement, setAnnouncement] = useState('');
18
+
19
+
// Resize Logic (Detect How Many Cards to Show)
20
+
useEffect(() => {
21
+
const updateVisibleCount = () => {
22
+
if (!containerRef.current) return;
23
+
const width = containerRef.current.offsetWidth;
24
+
let newCount = width < 640 ? 1 : width < 1024 ? 2 : 3;
25
+
setVisibleCount(newCount);
26
+
setCurrentIndex((prevIndex) => Math.min(prevIndex, Math.max(0, posts.length - newCount)));
27
+
};
28
+
29
+
let resizeTimer: ReturnType<typeof setTimeout>;
30
+
const handleResize = () => {
31
+
clearTimeout(resizeTimer);
32
+
resizeTimer = setTimeout(updateVisibleCount, 100);
33
+
};
34
+
35
+
updateVisibleCount();
36
+
window.addEventListener('resize', handleResize);
37
+
return () => {
38
+
window.removeEventListener('resize', handleResize);
39
+
clearTimeout(resizeTimer);
40
+
};
41
+
}, [posts.length]);
42
+
43
+
// Navigation Logic
44
+
const goToPrevious = () => {
45
+
if (currentIndex === 0) return;
46
+
setCurrentIndex((prevIndex) => Math.max(0, prevIndex - visibleCount));
47
+
};
48
+
49
+
const goToNext = () => {
50
+
if (currentIndex + visibleCount >= posts.length) return;
51
+
setCurrentIndex((prevIndex) => Math.min(posts.length - visibleCount, prevIndex + visibleCount));
52
+
};
53
+
54
+
// Announce Navigation for Screen Readers
55
+
useEffect(() => {
56
+
setAnnouncement(
57
+
`Showing posts ${currentIndex + 1} to ${Math.min(currentIndex + visibleCount, posts.length)} of ${posts.length}`,
58
+
);
59
+
}, [
60
+
currentIndex,
61
+
visibleCount,
62
+
posts.length,
63
+
]);
64
+
65
+
return (
66
+
<section
67
+
className={styles.carouselContainer}
68
+
aria-labelledby="carousel-heading"
69
+
role="region"
70
+
aria-roledescription="carousel"
71
+
>
72
+
{title && (
73
+
<Heading level={2} className={styles.carouselTitle}>
74
+
{title}
75
+
</Heading>
76
+
)}
77
+
78
+
{/* Screen reader announcement */}
79
+
<div className="sr-only" aria-live="polite" aria-atomic="true">
80
+
{announcement}
81
+
</div>
82
+
83
+
{/* Main Carousel Container */}
84
+
<div className={styles.carouselWrapper} ref={containerRef}>
85
+
<div className="relative mx-[-5%] px-[5%]">
86
+
<div
87
+
ref={carouselRef}
88
+
className={styles.carouselTrack}
89
+
style={{
90
+
transform: `translateX(calc(-${currentIndex * (100 / visibleCount)}% + ${currentIndex > 0 ? '5%' : '0%'}))`,
91
+
}}
92
+
aria-live="polite"
93
+
>
94
+
{posts.map((post) => (
95
+
<div
96
+
key={post.key}
97
+
className={`px-2 flex-shrink-0 transition-all duration-300`}
98
+
style={{ width: `${100 / visibleCount}%` }}
99
+
aria-hidden={post.key < currentIndex || post.key >= currentIndex + visibleCount} // ✅ post.key is now correctly used as a number
100
+
>
101
+
<CardArticle
102
+
article={{
103
+
title: post.title,
104
+
subtitle: post.summary,
105
+
coverImage: post.coverImage,
106
+
articleUrl: post.canonicalURL,
107
+
publication: post.affiliationName,
108
+
published: post.published,
109
+
}}
110
+
/>
111
+
</div>
112
+
))}
113
+
</div>
114
+
</div>
115
+
</div>
116
+
117
+
{/* Navigation Controls */}
118
+
<div className={styles.navigationWrapper}>
119
+
<Paragraph className="text-sm text-muted-foreground">
120
+
Showing {currentIndex + 1}-{Math.min(currentIndex + visibleCount, posts.length)} of {posts.length} posts
121
+
</Paragraph>
122
+
<div className={styles.buttonGroup} role="group" aria-label="Carousel navigation">
123
+
<Button className={styles.navButton} onClick={goToPrevious} disabled={currentIndex === 0}>
124
+
<ChevronLeft className="h-4 w-4" />
125
+
</Button>
126
+
<Button
127
+
className={styles.navButton}
128
+
onClick={goToNext}
129
+
disabled={currentIndex + visibleCount >= posts.length}
130
+
>
131
+
<ChevronRight className="h-4 w-4" />
132
+
</Button>
133
+
</div>
134
+
</div>
135
+
</section>
136
+
);
137
+
}
+14
src/components/PostCarousel/PostCarousel.types.ts
+14
src/components/PostCarousel/PostCarousel.types.ts
···
1
+
export interface PostCarouselProps {
2
+
posts: {
3
+
key: number;
4
+
title: string;
5
+
slug: string;
6
+
summary: string;
7
+
coverImage: string;
8
+
canonicalURL: string;
9
+
published: string;
10
+
affiliationName: string;
11
+
affiliationURL?: string;
12
+
}[];
13
+
title?: string;
14
+
}
+129
src/components/README.md
+129
src/components/README.md
···
1
+
# Component Structure
2
+
3
+
All components follow a consistent 4-file system.
4
+
5
+
## File Structure
6
+
7
+
```
8
+
/ComponentName/
9
+
├── ComponentName.tsx # Component implementation
10
+
├── ComponentName.types.ts # TypeScript interfaces
11
+
├── ComponentName.styles.ts # Tailwind class strings
12
+
└── ComponentName.constants.ts # Hardcoded values, configs
13
+
```
14
+
15
+
**Simple components** may skip `.constants.ts` if they have no hardcoded values.
16
+
17
+
## Quick Reference
18
+
19
+
### ComponentName.tsx
20
+
Component logic and JSX. Import from sibling files.
21
+
22
+
```typescript
23
+
import * as styles from './Button.styles';
24
+
import { DEFAULT_VARIANT } from './Button.constants';
25
+
import { ButtonProps } from './Button.types';
26
+
27
+
export const Button: React.FC<ButtonProps> = ({
28
+
variant = DEFAULT_VARIANT,
29
+
children
30
+
}) => (
31
+
<button className={styles.getButtonStyles(variant)}>
32
+
{children}
33
+
</button>
34
+
);
35
+
```
36
+
37
+
### ComponentName.types.ts
38
+
All TypeScript interfaces and types.
39
+
40
+
```typescript
41
+
export interface ButtonProps {
42
+
variant?: 'primary' | 'secondary';
43
+
children: React.ReactNode;
44
+
}
45
+
```
46
+
47
+
### ComponentName.styles.ts
48
+
Tailwind class strings. Use `cn()` for dynamic styles.
49
+
50
+
```typescript
51
+
import { cn } from '@/lib/utils';
52
+
53
+
export const button = 'px-4 py-2 rounded font-medium';
54
+
55
+
export const getButtonStyles = (variant: string) =>
56
+
cn(button, variant === 'primary' ? 'bg-blue-600' : 'bg-gray-200');
57
+
```
58
+
59
+
### ComponentName.constants.ts
60
+
Extract hardcoded values here.
61
+
62
+
```typescript
63
+
export const DEFAULT_VARIANT = 'primary' as const;
64
+
65
+
export const SOCIAL_LINKS = [
66
+
{ href: 'https://github.com', label: 'GitHub' },
67
+
] as const;
68
+
```
69
+
70
+
## Styling Rules
71
+
72
+
1. **Use Tailwind utilities only** - No inline styles or CSS modules
73
+
2. **Never use margin** - Use `gap` for spacing between children, `padding` for internal spacing
74
+
3. **Always include line-height** - Every text element needs leading-*
75
+
4. **Scale responsively** - Use breakpoint prefixes: `text-4xl md:text-6xl`
76
+
77
+
**Good:**
78
+
```typescript
79
+
export const container = 'flex flex-col gap-4 p-6';
80
+
```
81
+
82
+
**Bad:**
83
+
```typescript
84
+
export const container = 'flex flex-col mt-4 mb-8'; // ❌ No margin!
85
+
```
86
+
87
+
## Common Patterns
88
+
89
+
### Base + Variant
90
+
**Card** is the base component. **CardArticle**, **CardRole**, **CardStudy** wrap it with domain-specific logic.
91
+
92
+
```typescript
93
+
// CardArticle wraps base Card
94
+
import { Card } from '@/components/Card/Card';
95
+
96
+
export const CardArticle: React.FC<CardArticleProps> = ({ article }) => (
97
+
<a href={article.url}>
98
+
<Card title={article.title} description={article.subtitle} />
99
+
</a>
100
+
);
101
+
```
102
+
103
+
### Context-Aware
104
+
**Section** provides theme context. **Button**, **Heading**, etc. read from it.
105
+
106
+
```typescript
107
+
<Section theme="blue">
108
+
<Button /> {/* Automatically styled for blue theme */}
109
+
</Section>
110
+
```
111
+
112
+
## Design System
113
+
114
+
**Colors:** `bones-blue`, `bones-white`, `bones-black`, `bones-yellow`
115
+
**Fonts:** `font-sans` (DM Sans), `font-serif` (DM Serif Display)
116
+
**Themes:** `mono`, `gray`, `yellow`, `blue`, `red`, `purple`
117
+
118
+
## Quick Start
119
+
120
+
```bash
121
+
# Create new component
122
+
mkdir src/components/NewComponent
123
+
cd src/components/NewComponent
124
+
125
+
# Create files
126
+
touch NewComponent.tsx NewComponent.types.ts NewComponent.styles.ts NewComponent.constants.ts
127
+
```
128
+
129
+
Look at **Button**, **Card**, or **Navigation** for examples.
+2
src/components/Section/Section.styles.ts
+2
src/components/Section/Section.styles.ts
+14
src/components/Section/Section.tsx
+14
src/components/Section/Section.tsx
···
1
+
import { cn } from '@/lib/utils';
2
+
import React from 'react';
3
+
import { section } from './Section.styles';
4
+
import { SectionProps } from './Section.types';
5
+
6
+
export const Section: React.FC<SectionProps> = ({ children, className = '', ...props }) => {
7
+
return (
8
+
<section className={cn(section, className)} {...props}>
9
+
<div className="container flex flex-col gap-16 mx-auto">{children}</div>
10
+
</section>
11
+
);
12
+
};
13
+
14
+
export default Section;
+7
src/components/Section/Section.types.ts
+7
src/components/Section/Section.types.ts
+7
src/components/Section/SectionContext.tsx
+7
src/components/Section/SectionContext.tsx
···
1
+
// SectionContext is deprecated - components now use PageThemeContext from Layout
2
+
// This file is kept for backwards compatibility but should not be used
3
+
import { createContext } from 'react';
4
+
5
+
export const SectionContext = createContext<{ theme: string }>({
6
+
theme: 'default',
7
+
});
+157
src/components/Sidebar/.Sidebar.tsx.off
+157
src/components/Sidebar/.Sidebar.tsx.off
···
1
+
import { Button } from '@/components/Button/Button';
2
+
import { Link } from '@/components/Link/Link';
3
+
import Logo from '@/components/Logo/Logo';
4
+
import { Folder, Github, Home, Linkedin, Mail, Menu, Newspaper, User, X } from 'lucide-react';
5
+
import React, { useState } from 'react';
6
+
import { useLocation } from 'react-router-dom';
7
+
8
+
const Sidebar: React.FC = () => {
9
+
const location = useLocation();
10
+
const [isOpen, setIsOpen] = useState(false);
11
+
12
+
const toggleMenu = () => setIsOpen(!isOpen);
13
+
const closeMenu = () => setIsOpen(false);
14
+
15
+
const isActive = (path: string) => location.pathname === path;
16
+
17
+
const primaryNav = [
18
+
{
19
+
to: '/',
20
+
label: 'Home',
21
+
icon: <Home size={20} />,
22
+
},
23
+
{
24
+
to: '/about',
25
+
label: 'About',
26
+
icon: <User size={20} />,
27
+
},
28
+
{
29
+
to: '/articles',
30
+
label: 'Articles',
31
+
icon: <Newspaper size={20} />,
32
+
},
33
+
{
34
+
to: '/case-studies',
35
+
label: 'Case Studies',
36
+
icon: <Folder size={20} />,
37
+
},
38
+
];
39
+
40
+
const secondaryNav = [
41
+
{
42
+
href: 'https://linkedin.com',
43
+
label: 'LinkedIn',
44
+
icon: <Linkedin size={20} />,
45
+
},
46
+
{
47
+
href: 'https://Github.com',
48
+
label: 'Github',
49
+
icon: <Github size={20} />,
50
+
},
51
+
];
52
+
53
+
return (
54
+
<>
55
+
{/* Menu Toggle Button */}
56
+
<Button
57
+
variant="label"
58
+
size="normal"
59
+
shape="icon"
60
+
className="fixed top-4 left-4 z-50 md:hidden"
61
+
onClick={toggleMenu}
62
+
icon={isOpen ? <X size={24} /> : <Menu size={24} />}
63
+
aria-label="Toggle Menu"
64
+
/>
65
+
66
+
{/* Sidebar */}
67
+
<aside
68
+
className={`fixed top-0 left-0 h-full w-64 bg-white dark:bg-neutral-950 z-40 transition-transform transform
69
+
${isOpen ? 'translate-x-0' : '-translate-x-full'}
70
+
md:translate-x-0 md:w-20 lg:w-64
71
+
`}
72
+
>
73
+
<div className="flex flex-col h-full justify-between">
74
+
{/* Top Section */}
75
+
<div>
76
+
{/* Logo */}
77
+
<div className="p-4">
78
+
<Logo />
79
+
</div>
80
+
81
+
{/* Primary Navigation */}
82
+
<nav className="mt-4 space-y-2">
83
+
<ul>
84
+
{primaryNav.map((item, index) => (
85
+
<li key={index}>
86
+
<Button
87
+
variant={isActive(item.to) ? 'primary' : 'label'}
88
+
size="normal"
89
+
shape="label"
90
+
className="w-full justify-start text-left"
91
+
onClick={() => {
92
+
window.location.href = item.to;
93
+
closeMenu();
94
+
}}
95
+
icon={<span className="mr-3">{item.icon}</span>}
96
+
>
97
+
<span className="hidden lg:inline">{item.label}</span>
98
+
</Button>
99
+
</li>
100
+
))}
101
+
</ul>
102
+
</nav>
103
+
</div>
104
+
105
+
{/* Bottom Section */}
106
+
<div className="mb-4">
107
+
{/* Secondary Navigation */}
108
+
<nav className="mt-4 space-y-2">
109
+
<ul>
110
+
{secondaryNav.map((item, index) => (
111
+
<li key={index}>
112
+
<Link
113
+
href={item.href}
114
+
target="_blank"
115
+
rel="noopener noreferrer"
116
+
className="flex items-center text-sm text-neutral-600 hover:text-brand-500 dark:text-neutral-400 dark:hover:text-brand-400"
117
+
>
118
+
{item.icon}
119
+
<span className="ml-2">{item.label}</span>
120
+
</Link>
121
+
</li>
122
+
))}
123
+
</ul>
124
+
</nav>
125
+
126
+
{/* Contact Button */}
127
+
<div className="mt-4">
128
+
<Button
129
+
variant="secondary"
130
+
size="normal"
131
+
className="w-full justify-center"
132
+
onClick={() => {
133
+
window.location.href = '/contact';
134
+
closeMenu();
135
+
}}
136
+
icon={<Mail size={20} />}
137
+
>
138
+
Contact Me
139
+
</Button>
140
+
</div>
141
+
</div>
142
+
</div>
143
+
</aside>
144
+
145
+
{/* Overlay for Mobile */}
146
+
<div
147
+
className={`fixed inset-0 bg-black/50 z-30 transition-opacity ${
148
+
isOpen ? 'opacity-100' : 'opacity-0 pointer-events-none'
149
+
} md:hidden`}
150
+
onClick={closeMenu}
151
+
aria-hidden="true"
152
+
/>
153
+
</>
154
+
);
155
+
};
156
+
157
+
export default Sidebar;
+3
src/components/Skills/Skill.styles.ts
+3
src/components/Skills/Skill.styles.ts
+31
src/components/Skills/Skill.tsx
+31
src/components/Skills/Skill.tsx
···
1
+
import { Artwork } from '@/components/Artwork/Artwork';
2
+
import { Heading } from '@/components/Heading/Heading';
3
+
import { Paragraph } from '@/components/Paragraph/Paragraph';
4
+
import { cn } from '@/lib/utils';
5
+
import React from 'react';
6
+
import { Tags } from '../Tags/Tags';
7
+
import { skillStyles } from './Skill.styles';
8
+
import { SkillProps } from './Skill.types';
9
+
10
+
export const Skill: React.FC<SkillProps> = ({
11
+
skillTitle,
12
+
skillDescription,
13
+
skillApproach,
14
+
skillArtwork,
15
+
skillTags,
16
+
className = '',
17
+
}) => (
18
+
<div className={cn(skillStyles.wrapper, className)}>
19
+
<div className="flex flex-col gap-8">
20
+
<Artwork name={skillArtwork} />
21
+
<div className="flex flex-col gap-2">
22
+
<Heading level={3} style="body">
23
+
{skillTitle}
24
+
</Heading>
25
+
<Paragraph size="byline">{skillDescription}</Paragraph>
26
+
<Paragraph size="body">{skillApproach}</Paragraph>
27
+
<Tags tags={skillTags} />
28
+
</div>
29
+
</div>
30
+
</div>
31
+
);
+10
src/components/Skills/Skill.types.ts
+10
src/components/Skills/Skill.types.ts
+3
src/components/Skills/Skills.styles.ts
+3
src/components/Skills/Skills.styles.ts
+20
src/components/Skills/Skills.tsx
+20
src/components/Skills/Skills.tsx
···
1
+
import { cn } from '@/lib/utils';
2
+
import React from 'react';
3
+
import { Skill } from './Skill';
4
+
import { skillsStyles } from './Skills.styles';
5
+
import { SkillsProps } from './Skills.types';
6
+
7
+
export const Skills: React.FC<SkillsProps> = ({ items, className = '' }) => (
8
+
<div className={cn(skillsStyles.wrapper, className)}>
9
+
{items.map((item) => (
10
+
<Skill
11
+
key={item.skillTitle}
12
+
skillArtwork={item.skillArtwork}
13
+
skillTitle={item.skillTitle}
14
+
skillDescription={item.skillDescription}
15
+
skillApproach={item.skillApproach}
16
+
skillTags={item.skillTags}
17
+
/>
18
+
))}
19
+
</div>
20
+
);
+6
src/components/Skills/Skills.types.ts
+6
src/components/Skills/Skills.types.ts
+27
src/components/TLDRProfile/TLDRProfile.constants.ts
+27
src/components/TLDRProfile/TLDRProfile.constants.ts
···
1
+
export const PROFILE = {
2
+
name: 'Barry Prendergast',
3
+
title: 'Consulting Design Strategist',
4
+
location: 'Berlin, Germany',
5
+
experience: 'Since 2008 (17+ years)',
6
+
avatarSrc: '/avatar-square.jpeg',
7
+
} as const;
8
+
9
+
export const SECTIONS = {
10
+
specializations: 'Specializations',
11
+
connect: 'Connect',
12
+
} as const;
13
+
14
+
export const CONNECT_LINKS = [
15
+
{
16
+
href: 'https://calendar.app.google/cuYkSrDLca1Wxfqo9',
17
+
label: 'Book a meeting',
18
+
},
19
+
{
20
+
href: 'https://linkedin.com/in/barryprendergast',
21
+
label: 'LinkedIn',
22
+
},
23
+
{
24
+
href: 'https://signal.me/#eu/XO_aKC1aE1GZYWdMx7WK7HKGSCfrlpNhlxLGNi774dhiL7qr32BAMrH1BqgChaiM',
25
+
label: 'Signal',
26
+
},
27
+
] as const;
+19
src/components/TLDRProfile/TLDRProfile.styles.ts
+19
src/components/TLDRProfile/TLDRProfile.styles.ts
···
1
+
export const container = 'flex flex-col gap-6 sticky top-0';
2
+
3
+
export const innerContainer = 'flex flex-col gap-6';
4
+
5
+
// Avatar - no border needed, Aside handles the separator
6
+
export const avatar = 'w-32 h-32 md:w-48 md:h-48 aspect-square object-cover';
7
+
8
+
export const infoSection = 'flex flex-col gap-4';
9
+
10
+
export const name = 'text-4xl font-medium';
11
+
12
+
// Secondary text: 60% opacity of current text color (inherits from page theme)
13
+
export const detail = 'text-xl opacity-60';
14
+
15
+
export const section = 'flex flex-col gap-2';
16
+
17
+
export const sectionTitle = 'text-xl font-medium';
18
+
19
+
export const connectLinks = 'flex flex-col gap-2 text-lg';
+44
src/components/TLDRProfile/TLDRProfile.tsx
+44
src/components/TLDRProfile/TLDRProfile.tsx
···
1
+
import { Link } from '@/components/Link/Link';
2
+
import { Tags } from '@/components/Tags/Tags';
3
+
import { specializations } from '@/data/specializations';
4
+
import type { JSX } from 'react';
5
+
import * as styles from './TLDRProfile.styles';
6
+
import { CONNECT_LINKS, PROFILE, SECTIONS } from './TLDRProfile.constants';
7
+
8
+
/**
9
+
* TL;DR Profile sidebar component
10
+
*
11
+
* @returns JSX element with profile photo and summary information
12
+
*/
13
+
export default function TLDRProfile(): JSX.Element {
14
+
return (
15
+
<div className={styles.container}>
16
+
<div className={styles.innerContainer}>
17
+
<img src={PROFILE.avatarSrc} alt={PROFILE.name} className={styles.avatar} />
18
+
19
+
<div className={styles.infoSection}>
20
+
<h1 className={styles.name}>{PROFILE.name}</h1>
21
+
<p className={styles.detail}>{PROFILE.title}</p>
22
+
<p className={styles.detail}>{PROFILE.location}</p>
23
+
<p className={styles.detail}>{PROFILE.experience}</p>
24
+
</div>
25
+
26
+
<div className={styles.section}>
27
+
<p className={styles.sectionTitle}>{SECTIONS.specializations}</p>
28
+
<Tags tags={specializations} className="flex-wrap" />
29
+
</div>
30
+
31
+
<div className={styles.section}>
32
+
<p className={styles.sectionTitle}>{SECTIONS.connect}</p>
33
+
<div className={styles.connectLinks}>
34
+
{CONNECT_LINKS.map((link) => (
35
+
<Link key={link.href} href={link.href} target="_blank" rel="noopener noreferrer">
36
+
{link.label}
37
+
</Link>
38
+
))}
39
+
</div>
40
+
</div>
41
+
</div>
42
+
</div>
43
+
);
44
+
}
+2
src/components/TLDRProfile/TLDRProfile.types.ts
+2
src/components/TLDRProfile/TLDRProfile.types.ts
+3
src/components/Tags/Tag.styles.ts
+3
src/components/Tags/Tag.styles.ts
+13
src/components/Tags/Tag.tsx
+13
src/components/Tags/Tag.tsx
···
1
+
import { cn } from '@/lib/utils';
2
+
import React from 'react';
3
+
import { Paragraph } from '../Paragraph/Paragraph';
4
+
import { tagStyles } from './Tag.styles';
5
+
import { TagProps } from './Tag.types';
6
+
7
+
export const Tag: React.FC<TagProps> = ({ label, className = '' }) => {
8
+
return (
9
+
<div className={cn(tagStyles.base, className)}>
10
+
<Paragraph size="label">{label}</Paragraph>
11
+
</div>
12
+
);
13
+
};
+4
src/components/Tags/Tag.types.ts
+4
src/components/Tags/Tag.types.ts
+3
src/components/Tags/Tags.styles.ts
+3
src/components/Tags/Tags.styles.ts
+30
src/components/Tags/Tags.tsx
+30
src/components/Tags/Tags.tsx
···
1
+
import { cn } from '@/lib/utils';
2
+
import React from 'react';
3
+
import { Paragraph } from '../Paragraph/Paragraph';
4
+
5
+
interface TagProps {
6
+
label: string;
7
+
}
8
+
9
+
export const Tag: React.FC<TagProps> = ({ label }) => (
10
+
<span className="px-2 py-1 text-sm font-medium bg-gray-200 rounded">{label}</span>
11
+
);
12
+
13
+
interface TagsProps {
14
+
tags?: string;
15
+
className?: string;
16
+
}
17
+
18
+
export const Tags: React.FC<TagsProps> = ({ tags = '', className = '' }) => {
19
+
const tagArray = tags ? tags.split(',').map((tag) => tag.trim()) : [];
20
+
21
+
return (
22
+
<div className={cn('flex flex-wrap gap-2', className)}>
23
+
{tagArray.length > 0 ? (
24
+
tagArray.map((tag, index) => <Tag key={`${tag}-${index}`} label={tag} />)
25
+
) : (
26
+
<Paragraph size="label">No tags available</Paragraph>
27
+
)}
28
+
</div>
29
+
);
30
+
};
+4
src/components/Tags/Tags.types.ts
+4
src/components/Tags/Tags.types.ts
+19
src/components/ThemeToggle/ThemeToggle.constants.ts
+19
src/components/ThemeToggle/ThemeToggle.constants.ts
···
1
+
export const THEME_STORAGE_KEY = 'theme';
2
+
3
+
export const THEME_DARK = 'dark';
4
+
export const THEME_LIGHT = 'light';
5
+
6
+
export const ARIA_LABEL = 'Toggle theme';
7
+
8
+
export const ICON_VIEWBOX = '0 0 24 24';
9
+
10
+
export const STROKE_WIDTH = 2;
11
+
12
+
// Sun icon path
13
+
export const SUN_ICON_PATH =
14
+
'M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z';
15
+
16
+
// Moon icon path
17
+
export const MOON_ICON_PATH = 'M20.354 15.354A9 9 0 018.646 3.646 9.003 9.003 0 0012 21a9.003 9.003 0 008.354-5.646z';
18
+
19
+
export const MEDIA_QUERY_DARK = '(prefers-color-scheme: dark)';
+4
src/components/ThemeToggle/ThemeToggle.styles.ts
+4
src/components/ThemeToggle/ThemeToggle.styles.ts
+70
src/components/ThemeToggle/ThemeToggle.tsx
+70
src/components/ThemeToggle/ThemeToggle.tsx
···
1
+
import { useEffect, useState } from 'react';
2
+
import * as styles from './ThemeToggle.styles';
3
+
import {
4
+
ARIA_LABEL,
5
+
ICON_VIEWBOX,
6
+
MEDIA_QUERY_DARK,
7
+
MOON_ICON_PATH,
8
+
STROKE_WIDTH,
9
+
SUN_ICON_PATH,
10
+
THEME_DARK,
11
+
THEME_LIGHT,
12
+
THEME_STORAGE_KEY,
13
+
} from './ThemeToggle.constants';
14
+
15
+
export default function ThemeToggle() {
16
+
const [isDark, setIsDark] = useState(false);
17
+
18
+
// Initialize theme from localStorage or system preference
19
+
useEffect(() => {
20
+
const savedTheme = localStorage.getItem(THEME_STORAGE_KEY);
21
+
const prefersDark = window.matchMedia(MEDIA_QUERY_DARK).matches;
22
+
23
+
if (savedTheme === THEME_DARK || (!savedTheme && prefersDark)) {
24
+
setIsDark(true);
25
+
document.documentElement.classList.add(THEME_DARK);
26
+
} else {
27
+
setIsDark(false);
28
+
document.documentElement.classList.remove(THEME_DARK);
29
+
}
30
+
}, []);
31
+
32
+
const toggleTheme = () => {
33
+
const newIsDark = !isDark;
34
+
setIsDark(newIsDark);
35
+
36
+
if (newIsDark) {
37
+
document.documentElement.classList.add(THEME_DARK);
38
+
localStorage.setItem(THEME_STORAGE_KEY, THEME_DARK);
39
+
} else {
40
+
document.documentElement.classList.remove(THEME_DARK);
41
+
localStorage.setItem(THEME_STORAGE_KEY, THEME_LIGHT);
42
+
}
43
+
};
44
+
45
+
return (
46
+
<button onClick={toggleTheme} className={styles.button} aria-label={ARIA_LABEL}>
47
+
{isDark ? (
48
+
<svg
49
+
className={styles.icon}
50
+
fill="none"
51
+
stroke="currentColor"
52
+
viewBox={ICON_VIEWBOX}
53
+
xmlns="http://www.w3.org/2000/svg"
54
+
>
55
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={STROKE_WIDTH} d={SUN_ICON_PATH} />
56
+
</svg>
57
+
) : (
58
+
<svg
59
+
className={styles.icon}
60
+
fill="none"
61
+
stroke="currentColor"
62
+
viewBox={ICON_VIEWBOX}
63
+
xmlns="http://www.w3.org/2000/svg"
64
+
>
65
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={STROKE_WIDTH} d={MOON_ICON_PATH} />
66
+
</svg>
67
+
)}
68
+
</button>
69
+
);
70
+
}
+2
src/components/ThemeToggle/ThemeToggle.types.ts
+2
src/components/ThemeToggle/ThemeToggle.types.ts
+9
src/components/Timeline/Timeline.styles.ts
+9
src/components/Timeline/Timeline.styles.ts
···
1
+
export const timelineStyles = {
2
+
wrapper: 'flex flex-col py-8 gap-8 border-l-2 border-bones-black dark:border-bones-white',
3
+
indicator: 'absolute -left-1 h-2 w-2 rounded-full bg-bones-black dark:bg-bones-white',
4
+
item: 'flex flex-col gap-2 relative',
5
+
date: 'text-bones-black dark:text-bones-white ml-12',
6
+
contentWrapper: 'flex flex-col gap-0 ml-12',
7
+
title: 'text-neutral-900 dark:text-neutral-100',
8
+
description: 'text-bones-black dark:text-bones-white',
9
+
};
+29
src/components/Timeline/Timeline.tsx
+29
src/components/Timeline/Timeline.tsx
···
1
+
import { Heading } from '@/components/Heading/Heading';
2
+
import { Paragraph } from '@/components/Paragraph/Paragraph';
3
+
import { cn } from '@/lib/utils';
4
+
import React from 'react';
5
+
import { timelineStyles } from './Timeline.styles';
6
+
import { TimelineProps } from './Timeline.types';
7
+
8
+
export const Timeline: React.FC<TimelineProps> = ({ items, className }) => {
9
+
return (
10
+
<ol className={cn(timelineStyles.wrapper, className)}>
11
+
{items.map((item, idx) => (
12
+
<li key={idx} className={timelineStyles.item}>
13
+
<div className="flex items-center">
14
+
<span className={timelineStyles.indicator}></span>
15
+
<span className={timelineStyles.date}>{item.date}</span>
16
+
</div>
17
+
<div className={timelineStyles.contentWrapper}>
18
+
<Heading level={4} style="footnote" className={timelineStyles.title}>
19
+
{item.title}
20
+
</Heading>
21
+
<Paragraph size="footnote" className={timelineStyles.description}>
22
+
{item.description}
23
+
</Paragraph>
24
+
</div>
25
+
</li>
26
+
))}
27
+
</ol>
28
+
);
29
+
};
+10
src/components/Timeline/Timeline.types.ts
+10
src/components/Timeline/Timeline.types.ts
+20
src/components/TopBar/TopBar.constants.ts
+20
src/components/TopBar/TopBar.constants.ts
···
1
+
export const SOCIAL_LINKS = [
2
+
{
3
+
href: 'https://linkedin.com',
4
+
label: 'LinkedIn',
5
+
},
6
+
{
7
+
href: 'https://github.com',
8
+
label: 'GitHub',
9
+
},
10
+
{
11
+
href: 'https://twitter.com',
12
+
label: 'Twitter',
13
+
},
14
+
] as const;
15
+
16
+
export const ARIA_LABELS = {
17
+
desktopNav: 'Social Links',
18
+
mobileNav: 'Mobile Social Links',
19
+
mobileMenu: 'mobile-menu',
20
+
} as const;
+17
src/components/TopBar/TopBar.styles.ts
+17
src/components/TopBar/TopBar.styles.ts
···
1
+
export const header =
2
+
'sticky top-0 left-0 z-30 w-full md:w-[calc(100%-256px)] md:ml-64 transition-all bg-neutral-100 dark:bg-neutral-900 shadow-md';
3
+
4
+
export const container = 'container mx-auto px-4 py-6 flex justify-between items-center';
5
+
6
+
export const desktopNav = 'hidden md:flex space-x-4';
7
+
8
+
export const socialLink = 'text-text dark:text-neutral-100 hover:text-primary dark:hover:text-brand-400';
9
+
10
+
export const mobileMenuButton = 'md:hidden text-text dark:text-neutral-100';
11
+
12
+
export const getMobileNav = (isOpen: boolean) =>
13
+
`md:hidden bg-white dark:bg-neutral-900 shadow-md transition-all ${isOpen ? 'block' : 'hidden'}`;
14
+
15
+
export const mobileList = 'space-y-4 px-4 py-6';
16
+
17
+
export const mobileSocialLink = 'block text-text dark:text-neutral-100 hover:text-primary dark:hover:text-brand-400';
+59
src/components/TopBar/TopBar.tsx
+59
src/components/TopBar/TopBar.tsx
···
1
+
import Breadcrumb from '@/components/Breadcrumb/Breadcrumb';
2
+
import { Menu, X } from 'lucide-react';
3
+
import React from 'react';
4
+
import * as styles from './TopBar.styles';
5
+
import { ARIA_LABELS, SOCIAL_LINKS } from './TopBar.constants';
6
+
7
+
const TopBar: React.FC = () => {
8
+
const [menuOpen, setMenuOpen] = React.useState(false);
9
+
10
+
const toggleMenu = () => setMenuOpen(!menuOpen);
11
+
12
+
return (
13
+
<header className={styles.header}>
14
+
<div className={styles.container}>
15
+
<Breadcrumb />
16
+
17
+
{/* Desktop Social Links */}
18
+
<nav className={styles.desktopNav} aria-label={ARIA_LABELS.desktopNav}>
19
+
{SOCIAL_LINKS.map((link) => (
20
+
<a
21
+
key={link.href}
22
+
href={link.href}
23
+
target="_blank"
24
+
rel="noopener noreferrer"
25
+
className={styles.socialLink}
26
+
>
27
+
{link.label}
28
+
</a>
29
+
))}
30
+
</nav>
31
+
32
+
{/* Mobile Menu Button */}
33
+
<button
34
+
className={styles.mobileMenuButton}
35
+
onClick={toggleMenu}
36
+
aria-controls={ARIA_LABELS.mobileMenu}
37
+
aria-expanded={menuOpen}
38
+
>
39
+
{menuOpen ? <X /> : <Menu />}
40
+
</button>
41
+
</div>
42
+
43
+
{/* Mobile Social Links */}
44
+
<nav id={ARIA_LABELS.mobileMenu} className={styles.getMobileNav(menuOpen)} aria-label={ARIA_LABELS.mobileNav}>
45
+
<ul className={styles.mobileList}>
46
+
{SOCIAL_LINKS.map((link) => (
47
+
<li key={link.href}>
48
+
<a href={link.href} target="_blank" rel="noopener noreferrer" className={styles.mobileSocialLink}>
49
+
{link.label}
50
+
</a>
51
+
</li>
52
+
))}
53
+
</ul>
54
+
</nav>
55
+
</header>
56
+
);
57
+
};
58
+
59
+
export default TopBar;
+2
src/components/TopBar/TopBar.types.ts
+2
src/components/TopBar/TopBar.types.ts
+15
src/config/atproto/buildUrls.ts
+15
src/config/atproto/buildUrls.ts
···
1
+
import { ATPROTO_CONFIG } from './getConfig';
2
+
3
+
/**
4
+
* Constructs the XRPC URL for listing records from a collection
5
+
*/
6
+
export function buildRecordsUrl(collection: string, repo: string = ATPROTO_CONFIG.DID): string {
7
+
return `${ATPROTO_CONFIG.PDS_URL}/xrpc/com.atproto.repo.listRecords?repo=${repo}&collection=${collection}`;
8
+
}
9
+
10
+
/**
11
+
* Constructs the CDN URL for a blob (image)
12
+
*/
13
+
export function buildBlobUrl(blobRef: string, did: string = ATPROTO_CONFIG.DID): string {
14
+
return `${ATPROTO_CONFIG.CDN_URL}/img/avatar/plain/${did}/${blobRef}@jpeg`;
15
+
}
+23
src/config/atproto/getConfig.ts
+23
src/config/atproto/getConfig.ts
···
1
+
/**
2
+
* AT Protocol configuration
3
+
* Centralized configuration for connecting to AT Protocol PDS
4
+
*/
5
+
6
+
export const ATPROTO_CONFIG = {
7
+
/** Your DID (Decentralized Identifier) */
8
+
DID: 'did:plc:s2rczyxit2v5vzedxqs326ri',
9
+
10
+
/** PDS (Personal Data Server) URL */
11
+
PDS_URL: 'https://rooter.us-west.host.bsky.network',
12
+
13
+
/** Bluesky CDN URL for blob storage (images, etc.) */
14
+
CDN_URL: 'https://cdn.bsky.app',
15
+
} as const;
16
+
17
+
/**
18
+
* Collection identifiers for AT Protocol records
19
+
*/
20
+
export const ATPROTO_COLLECTIONS = {
21
+
PUBLICATION: 'pub.leaflet.publication',
22
+
DOCUMENT: 'pub.leaflet.document',
23
+
} as const;
+6
src/config/atproto/index.ts
+6
src/config/atproto/index.ts
+12
src/data/.csv/Barry Prendergast - Companies.csv
+12
src/data/.csv/Barry Prendergast - Companies.csv
···
1
+
Name,Slug,Collection ID,Item ID,Created On,Updated On,Published On,Website,Type,Industry,City,Country,Logo
2
+
Brandwatch,brandwatch,6492fe188837ee33a22fed4d,6493050c606e51cb999dc8ba,Wed Jun 21 2023 14:11:24 GMT+0000 (Coordinated Universal Time),Sat Jun 24 2023 05:13:33 GMT+0000 (Coordinated Universal Time),Sat Jun 24 2023 05:33:18 GMT+0000 (Coordinated Universal Time),https://www.brandwatch.com/,B2B,Consumer Intelligence,Brighton,UK,
3
+
EDF Energy,edf-energy,6492fe188837ee33a22fed4d,649304c7a2b9d1603236d4b8,Wed Jun 21 2023 14:10:15 GMT+0000 (Coordinated Universal Time),Sat Jun 24 2023 05:13:42 GMT+0000 (Coordinated Universal Time),Sat Jun 24 2023 05:33:18 GMT+0000 (Coordinated Universal Time),https://www.edfenergy.com/about/innovation/challenge,B2C,Energy Generation & Supply,Brighton,UK,
4
+
Home Office,home-office,6492fe188837ee33a22fed4d,649679613d19cea8ea2caf00,Sat Jun 24 2023 05:04:33 GMT+0000 (Coordinated Universal Time),Sat Jun 24 2023 05:10:39 GMT+0000 (Coordinated Universal Time),Sat Jun 24 2023 05:33:18 GMT+0000 (Coordinated Universal Time),https://www.gov.uk/government/organisations/home-office,,Government,London,UK,
5
+
LEO Pharma,leo-pharma,6492fe188837ee33a22fed4d,6492ff9e1cb5762c2192da9a,Wed Jun 21 2023 13:48:14 GMT+0000 (Coordinated Universal Time),Sat Jun 24 2023 05:13:52 GMT+0000 (Coordinated Universal Time),Sat Jun 24 2023 05:33:18 GMT+0000 (Coordinated Universal Time),https://www.leo-pharma.com/,B2C,Pharmaceutical,Copenhagen,Denmark,
6
+
MediaTonic,mediatonic,6492fe188837ee33a22fed4d,649678eee54dbd7686a713a3,Sat Jun 24 2023 05:02:38 GMT+0000 (Coordinated Universal Time),Sat Jun 24 2023 05:13:18 GMT+0000 (Coordinated Universal Time),Sat Jun 24 2023 05:33:18 GMT+0000 (Coordinated Universal Time),https://mediatonicgames.com/,B2B,Video games,Brighton,UK,
7
+
Morressier,morressier,6492fe188837ee33a22fed4d,6493046b403abc6e1ca59032,Wed Jun 21 2023 14:08:43 GMT+0000 (Coordinated Universal Time),Sat Jun 24 2023 05:13:48 GMT+0000 (Coordinated Universal Time),Sat Jun 24 2023 05:33:18 GMT+0000 (Coordinated Universal Time),https://www.morressier.com/,B2B,Scientific Publishing,Berlin,Germany,
8
+
MyGoodPlanet,mygoodplanet,6492fe188837ee33a22fed4d,64967a690b2841f15cf81353,Sat Jun 24 2023 05:08:57 GMT+0000 (Coordinated Universal Time),Sat Jun 24 2023 05:13:01 GMT+0000 (Coordinated Universal Time),Sat Jun 24 2023 05:33:18 GMT+0000 (Coordinated Universal Time),,B2C,Publishing,Dublin,Ireland,
9
+
Relentless Software,relentless-software,6492fe188837ee33a22fed4d,6496780b1624e29a27b7ecbc,Sat Jun 24 2023 04:58:51 GMT+0000 (Coordinated Universal Time),Sat Jun 24 2023 05:13:28 GMT+0000 (Coordinated Universal Time),Sat Jun 24 2023 05:33:18 GMT+0000 (Coordinated Universal Time),http://www.relentless.co.uk/,B2B,Video games,Brighton,UK,
10
+
Scenestealer,scenestealer,6492fe188837ee33a22fed4d,64967aaa860a8ebaefe69a00,Sat Jun 24 2023 05:10:02 GMT+0000 (Coordinated Universal Time),Sat Jun 24 2023 05:12:55 GMT+0000 (Coordinated Universal Time),Sat Jun 24 2023 05:33:18 GMT+0000 (Coordinated Universal Time),http://www.scenestealer.tv/,B2B,Marketing Automation,Brighton,UK,
11
+
Schlumberger,schlumberger,6492fe188837ee33a22fed4d,64967879aace6d8ddffd0060,Sat Jun 24 2023 05:00:41 GMT+0000 (Coordinated Universal Time),Sat Jun 24 2023 05:13:23 GMT+0000 (Coordinated Universal Time),Sat Jun 24 2023 05:33:18 GMT+0000 (Coordinated Universal Time),https://www.software.slb.com/,B2B,Energy Services & Equipment,London,UK,
12
+
Spotler,spotler,6492fe188837ee33a22fed4d,649679fe246701a71ce9d1a4,Sat Jun 24 2023 05:07:10 GMT+0000 (Coordinated Universal Time),Sat Jun 24 2023 05:13:06 GMT+0000 (Coordinated Universal Time),Sat Jun 24 2023 05:33:18 GMT+0000 (Coordinated Universal Time),https://spotler.co.uk/,B2B,Marketing Automation,Brighton,UK,
+14
src/data/.csv/Barry Prendergast - Jobs.csv
+14
src/data/.csv/Barry Prendergast - Jobs.csv
···
1
+
Job title,Slug,Collection ID,Item ID,Created On,Updated On,Published On,cover,Job description,User need,Start date,End date,Employment type,Company,Skills,Case Studies,Client
2
+
Design Director (Consulting),design-director-mgp,63020a6ad41103ed37d74166,63020a6ad41103c60ed74185,Sun Aug 07 2022 08:21:28 GMT+0000 (Coordinated Universal Time),Sun Jul 02 2023 00:31:07 GMT+0000 (Coordinated Universal Time),Sun Jul 02 2023 00:47:22 GMT+0000 (Coordinated Universal Time),,"As interim design director at MyGoodPlanet, I helped set the company's design strategy, grow and guide the product design team, and establish scalable UX practices and operations as they pivoted from news publishing to e-commerce.",Supporting environmentally conscious shoppers to make informed and sustainable shopping decisions.,Sat Jul 07 2018 00:00:00 GMT+0000 (Coordinated Universal Time),Sun Jul 07 2019 00:00:00 GMT+0000 (Coordinated Universal Time),Contract,mygoodplanet,team-management; design-leadership; design-operations; design-strategy; design-systems; stakeholder-engagement; rapid-prototyping; product-design; persuasive-communication; people-management; journey-mapping; digital-transformation; design-thinking,defining-the-product-strategy-for-eco-shopping,MyGoodPlanet
3
+
Lead Product Designer,lead-product-designer-morressier,63020a6ad41103ed37d74166,63020a6ad4110350e1d74183,Sun Aug 07 2022 08:21:28 GMT+0000 (Coordinated Universal Time),Sun Jul 02 2023 00:38:48 GMT+0000 (Coordinated Universal Time),Sun Jul 02 2023 00:47:22 GMT+0000 (Coordinated Universal Time),,"As the lead designer, I worked with product managers, engineers, data scientists and customer stakeholders to research and design new features for attending hybrid academic events, publishing conference proceedings, networking with peers and discovering the latest research. I also supported product design strategy, led and scaled the design team, supported professional development, matured UX design practices and improved agile development processes.","Enabling scientific communities, institutions and publishers to better create, discover and share research.",Thu Oct 10 2019 00:00:00 GMT+0000 (Coordinated Universal Time),Fri Sep 09 2022 00:00:00 GMT+0000 (Coordinated Universal Time),Full-time,morressier,agile-methodologies; team-management; content-design; data-visualisation; design-leadership; design-methodologies; design-operations; design-strategy; design-systems; design-thinking; information-architecture; interaction-design; interface-design; journey-mapping; lean-ux; people-management; persuasive-communication; product-design; rapid-prototyping; stakeholder-engagement; usability-testing; ux-research; accessibility,scaling-morressier-design-system; scaling-design-feedback; improving-the-recruitment-experience-for-design-candidates,Morressier
4
+
Principal Product Designer,principal-product-designer-edf,63020a6ad41103ed37d74166,6413c60c14fcdd15827c96a7,Fri Mar 17 2023 01:44:44 GMT+0000 (Coordinated Universal Time),Sun Jul 02 2023 00:31:32 GMT+0000 (Coordinated Universal Time),Sun Jul 02 2023 00:47:22 GMT+0000 (Coordinated Universal Time),,"As principal product designer for EDF Energy's innovation lab working on the Smart Energy initiative, I worked with engineers, business development managers and startup founders to research, design and launch experimental web, mobile and hardware products for energy usage monitoring, disambiguation, waste reduction and automation for residential bill-payers.",Helping residential bill-payers better understand and manage their energy consumption.,Sat Sep 09 2017 00:00:00 GMT+0000 (Coordinated Universal Time),Sat Feb 02 2019 00:00:00 GMT+0000 (Coordinated Universal Time),Contract,edf-energy,agile-methodologies; data-visualization; design-leadership; design-strategy; interaction-design; interface-design; internet-of-things; journey-mapping; product-design; rapid-prototyping; stakeholder-engagement; usability-testing; ux-research,smarter-energy,XXXXXXXX
5
+
Principal Product Designer,principal-product-designer-leo,63020a6ad41103ed37d74166,63020a6ad411039d28d74187,Sun Aug 07 2022 08:21:28 GMT+0000 (Coordinated Universal Time),Sat Jun 24 2023 14:32:31 GMT+0000 (Coordinated Universal Time),Sun Jun 25 2023 06:48:40 GMT+0000 (Coordinated Universal Time),,"As Principal Product Designer at LEO Pharma's Innovation Lab, I collaborated with dermatologists, ethnographers, data scientists and patients to research and design experimental medical devices that use computer vision and machine learning technologies to diagnose skin conditions and provide timely, relevant and actionable treatment advice.","Enabling people living with a skin condition to get a diagnosis, communicate with their healthcare providers and receive clear personalised treatments more easily.",Sat Feb 02 2019 00:00:00 GMT+0000 (Coordinated Universal Time),Thu Oct 10 2019 00:00:00 GMT+0000 (Coordinated Universal Time),Contract,leo-pharma,accessibility; agile-methodologies; design-leadership; design-methodologies; design-strategy; design-systems; interaction-design; interface-design; journey-mapping; product-design; rapid-prototyping; stakeholder-engagement; usability-testing; ux-research,ohmu,XXXXXXXX
6
+
Senior UX Designer,senior-ux-designer-brandwatch,63020a6ad41103ed37d74166,63020a6ad41103c831d74189,Sun Aug 07 2022 08:21:28 GMT+0000 (Coordinated Universal Time),Sun Jul 02 2023 00:32:51 GMT+0000 (Coordinated Universal Time),Sun Jul 02 2023 00:47:22 GMT+0000 (Coordinated Universal Time),,"As a Senior Designer at Vizia, I lead the design from discovery to launch for new product experiences and experimental features for C-level, market research, analyst, business development and content marketing users. My team's work had a direct and positive impact on the digital transformation initiatives of clients such as American Airlines, Bank of America, British Red Cross, Samsung, Twitter, Walmart and Unilever.","Helping enterprise companies become more data-driven by better integrating, visualising and sharing timely relevant actionable insights, alerts and reports.",Tue Mar 03 2015 00:00:00 GMT+0000 (Coordinated Universal Time),Mon Oct 10 2016 00:00:00 GMT+0000 (Coordinated Universal Time),Full-time,brandwatch,accessibility; agile-methodologies; data-visualization; design-leadership; design-methodologies; design-strategy; design-systems; information-architecture; interaction-design; interface-design; journey-mapping; product-design; rapid-prototyping; stakeholder-engagement; usability-testing; ux-research,brandwatch-vizia,XXXXXXXX
7
+
Service Designer,service-designer-ukgov,63020a6ad41103ed37d74166,63020a6ad411034b4ed74188,Sun Aug 07 2022 08:21:28 GMT+0000 (Coordinated Universal Time),Sat Jun 24 2023 14:32:22 GMT+0000 (Coordinated Universal Time),Sun Jun 25 2023 06:48:40 GMT+0000 (Coordinated Universal Time),,"As a Service Designer on the UK visas and immigration digital transformation team, I collaborated with user researchers, interaction designers, engineers and civil servants to improve caseworker decision-making capabilities with secure, efficient and effective tools, processes and realtime data assets, through an agile participatory design process, compliant with UK government's digital service standards. This was a hybrid role that also involved significant hands-on interaction design, prototyping and testing with service users.","Supporting foreign nationals to access more efficient, ethical and humane visa and immigration services when seeking to live and work in the UK.",Mon Oct 10 2016 00:00:00 GMT+0000 (Coordinated Universal Time),Fri Mar 03 2017 00:00:00 GMT+0000 (Coordinated Universal Time),Contract,home-office,accessibility; agile-methodologies; data-visualization; design-leadership; design-methodologies; design-strategy; design-systems; interaction-design; journey-mapping; rapid-prototyping; service-design; stakeholder-engagement; usability-testing,,XXXXXXXX
8
+
Staff Product Designer,staff-product-designer-morressier,63020a6ad41103ed37d74166,63020a6ad41103ecadd74182,Sun Aug 07 2022 08:21:28 GMT+0000 (Coordinated Universal Time),Sun Jul 02 2023 00:41:10 GMT+0000 (Coordinated Universal Time),Sun Jul 02 2023 00:47:22 GMT+0000 (Coordinated Universal Time),https://uploads-ssl.webflow.com/63020a6ad41103e186d7416a/64933918d8f1b775db892710_product-school-nOvIa_x_tfo-unsplash.jpeg,"In this role, I collaborate with product managers, engineers, data scientists and stakeholders to research and develop new and improved products that help scientists to publish and discover scientific research, and network with peers - all in a fast-paced, agile and fully remote environment. I also drive product design strategy, support and nurture the design team, mature and operationalise participatory UX design practices, improve cross-functional agile product development processes, and own scaling the design system.","Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit.",Mon Nov 01 2021 00:00:00 GMT+0000 (Coordinated Universal Time),,Full-time,morressier,accessibility; agile-methodologies; team-management; content-design; design-leadership; design-methodologies; design-operations; design-strategy; design-systems; design-thinking; digital-transformation; information-architecture; interaction-design; interface-design; journey-mapping; lean-ux; persuasive-communication; product-design; rapid-prototyping; service-design; stakeholder-engagement; usability-testing; ux-research,morressier-discovery; scaling-morressier-design-system; scaling-design-feedback,Morressier
9
+
Staff Service Designer,staff-service-designer-edf,63020a6ad41103ed37d74166,63020a6ad411031266d74184,Sun Aug 07 2022 08:21:28 GMT+0000 (Coordinated Universal Time),Sun Jul 02 2023 00:36:54 GMT+0000 (Coordinated Universal Time),Sun Jul 02 2023 00:47:22 GMT+0000 (Coordinated Universal Time),,"As staff service designer, I collaboarted with senior stakeholders, engineers, ux designers, customer service managers and OFGEM regulators to enhance the residential bill-payer's experience buying energy, understanding their usage, resolving billing issues, and staying out of debt. This was a strategic role working at a strategic level in the Customer division to support the national Smart Meter roll-out.",Helping residential bill-payers better understand and manage their energy consumption. ,Fri Mar 03 2017 00:00:00 GMT+0000 (Coordinated Universal Time),Fri Sep 01 2017 00:00:00 GMT+0000 (Coordinated Universal Time),Contract,edf-energy,accessibility; agile-methodologies; content-design; design-leadership; design-methodologies; design-operations; design-strategy; digital-transformation; internet-of-things; design-systems; journey-mapping; people-management; interaction-design; information-architecture; persuasive-communication; rapid-prototyping; service-design; stakeholder-engagement; usability-testing; ux-research,smarter-energy,EDF Energy
10
+
User Interface Designer,user-interface-designer-relentless,63020a6ad41103ed37d74166,63020a6ad411037939d741d4,Wed Aug 10 2022 09:37:41 GMT+0000 (Coordinated Universal Time),Sat Jun 24 2023 14:31:45 GMT+0000 (Coordinated Universal Time),Sun Jun 25 2023 06:48:40 GMT+0000 (Coordinated Universal Time),,,,Tue Jan 01 2008 00:00:00 GMT+0000 (Coordinated Universal Time),Sat Dec 12 2009 00:00:00 GMT+0000 (Coordinated Universal Time),Full-time,relentless-software,design-systems; interaction-design; interface-design; stakeholder-engagement,,XXXXXXXX
11
+
UX Design Manager,ux-design-manager-pure360,63020a6ad41103ed37d74166,63020a6ad411030f93d74186,Sun Aug 07 2022 08:21:28 GMT+0000 (Coordinated Universal Time),Sun Jul 02 2023 00:35:06 GMT+0000 (Coordinated Universal Time),Sun Jul 02 2023 00:47:22 GMT+0000 (Coordinated Universal Time),,"As design team lead, I set product design strategy, led and grew the design team, matured design practices and career development paths. I worked with product managers and engineers to redesign and launch the Pure360 Campaign product. I also collaborated with designers and engineers to design and implement the company's first design system initiative.","Helping organisations acquire and retain new customers, increase revenue and deepen customer loyalty through targeted content marketing.",Mon Mar 03 2014 00:00:00 GMT+0000 (Coordinated Universal Time),Tue Mar 03 2015 00:00:00 GMT+0000 (Coordinated Universal Time),Full-time,spotler,agile-methodologies; design-leadership; design-systems; design-thinking; interaction-design; interface-design; design-strategy; journey-mapping; persuasive-communication; rapid-prototyping; product-design; stakeholder-engagement; usability-testing; ux-research; accessibility,,XXXXXXXX
12
+
UX Designer,ux-designer-mediatonic,63020a6ad41103ed37d74166,63020a6ad4110383c3d741b0,Sun Aug 07 2022 08:21:29 GMT+0000 (Coordinated Universal Time),Sat Jun 24 2023 14:32:07 GMT+0000 (Coordinated Universal Time),Sun Jun 25 2023 06:48:40 GMT+0000 (Coordinated Universal Time),,"I worked with product owners, game designers, artists and developers to create award-winning games for clients such as AdultSwim, Namco, SquareEnix and Ubisoft, as well as Mediatonic's own IP for mobile and console platforms. I researched, designed and tested new gaming experiences that attracted audiences, removed usability barriers to play, provided simple and clear feedback, and connected players on the couch and online. As the first UX designer at Mediatonic, I also promoted and coached better design principles and practices, and matured cross-functional collaboration rituals.","Enabling gamers to play more inclusive, approachable, fair and fun games.",Wed Oct 10 2012 00:00:00 GMT+0000 (Coordinated Universal Time),Mon Mar 03 2014 00:00:00 GMT+0000 (Coordinated Universal Time),Full-time,mediatonic,design-systems; interaction-design; interface-design; usability-testing,,XXXXXXXX
13
+
UX Designer,ux-designer-scenestealer,63020a6ad41103ed37d74166,63020a6ad411034f8fd7419d,Sun Aug 07 2022 08:21:29 GMT+0000 (Coordinated Universal Time),Sat Jun 24 2023 05:10:57 GMT+0000 (Coordinated Universal Time),Sat Jun 24 2023 05:33:18 GMT+0000 (Coordinated Universal Time),,,,Wed Apr 04 2012 00:00:00 GMT+0000 (Coordinated Universal Time),Sun Sep 09 2012 00:00:00 GMT+0000 (Coordinated Universal Time),Contract,scenestealer,design-strategy; design-systems; interaction-design; interface-design; product-design; usability-testing; ux-research,,Scenestealer
14
+
UX Designer,ux-designer-slb,63020a6ad41103ed37d74166,63020a6ad411037272d741c3,Sun Aug 07 2022 08:21:29 GMT+0000 (Coordinated Universal Time),Sat Jun 24 2023 14:32:00 GMT+0000 (Coordinated Universal Time),Sun Jun 25 2023 06:48:40 GMT+0000 (Coordinated Universal Time),,,,Fri Jan 01 2010 00:00:00 GMT+0000 (Coordinated Universal Time),Wed Apr 04 2012 00:00:00 GMT+0000 (Coordinated Universal Time),Contract,schlumberger,design-leadership; interface-design; interaction-design; information-architecture; stakeholder-engagement; usability-testing,,XXXXXXXX
+9
src/data/.csv/Barry Prendergast - Portfolio.csv
+9
src/data/.csv/Barry Prendergast - Portfolio.csv
···
1
+
Case Study Name,Slug,Collection ID,Item ID,Created On,Updated On,Published On,Cover Image,Summary,Body,Pitch Embed,Type,End Date,Role,Company,Relevant Skills
2
+
Democratising insightful decision making across organisations,brandwatch-vizia,63020a6ad411031c64d74168,64171a179f12e0f16aed2556,Sun Mar 19 2023 14:20:07 GMT+0000 (Coordinated Universal Time),Fri May 24 2024 11:42:02 GMT+0000 (Coordinated Universal Time),Fri May 24 2024 11:51:23 GMT+0000 (Coordinated Universal Time),https://uploads-ssl.webflow.com/63020a6ad41103e186d7416a/64a11cd365d155b164b5a017_hero--19.svg,Cras mattis consectetur purus sit amet fermentum.,"<p id="""">Maecenas faucibus mollis interdum. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam quis risus eget urna mollis ornare vel eu leo. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed posuere consectetur est at lobortis. Etiam porta sem malesuada magna mollis euismod.</p><p id="""">Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Etiam porta sem malesuada magna mollis euismod. Curabitur blandit tempus porttitor. Curabitur blandit tempus porttitor.</p>",5176aa05-c687-4582-9b81-344dc9944a38,product-design,Mon Oct 31 2016 00:00:00 GMT+0000 (Coordinated Universal Time),senior-ux-designer-brandwatch,brandwatch,data-visualization; design-strategy; interaction-design; interface-design; internet-of-things; product-design; rapid-prototyping; stakeholder-engagement; usability-testing
3
+
Defining the product strategy for eco shopping,defining-the-product-strategy-for-eco-shopping,63020a6ad411031c64d74168,64998000362d4092f139d994,Mon Jun 26 2023 12:09:36 GMT+0000 (Coordinated Universal Time),Fri May 24 2024 11:40:49 GMT+0000 (Coordinated Universal Time),Fri May 24 2024 11:51:23 GMT+0000 (Coordinated Universal Time),https://uploads-ssl.webflow.com/63020a6ad41103e186d7416a/64a085ac08379c1910b65581_22.png,"Sed posuere consectetur est at lobortis. Sed posuere consectetur est at lobortis. Nullam quis risus eget urna mollis ornare vel eu leo. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Donec ullamcorper nulla non metus auctor fringilla.",,sdf,design-strategy,Wed Jul 31 2019 00:00:00 GMT+0000 (Coordinated Universal Time),design-director-mgp,mygoodplanet,
4
+
Improving the recruitment experience for Design candidates,improving-the-recruitment-experience-for-design-candidates,63020a6ad411031c64d74168,64997fd84e68f4e3552d1f17,Mon Jun 26 2023 12:08:56 GMT+0000 (Coordinated Universal Time),Fri May 24 2024 11:41:28 GMT+0000 (Coordinated Universal Time),Fri May 24 2024 11:51:23 GMT+0000 (Coordinated Universal Time),https://uploads-ssl.webflow.com/63020a6ad41103e186d7416a/64a11cb6c1bfe86c75f70982_hero--20.svg,"Sed posuere consectetur est at lobortis. Sed posuere consectetur est at lobortis. Nullam quis risus eget urna mollis ornare vel eu leo. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Donec ullamcorper nulla non metus auctor fringilla.",,sdf,design-operations,Wed Mar 31 2021 00:00:00 GMT+0000 (Coordinated Universal Time),lead-product-designer-morressier,morressier,
5
+
Building a professional community for scientists,morressier-discovery,63020a6ad411031c64d74168,63020a6ad411030b7cd741da,Sun Aug 07 2022 11:48:45 GMT+0000 (Coordinated Universal Time),Fri May 24 2024 11:48:37 GMT+0000 (Coordinated Universal Time),Fri May 24 2024 11:51:23 GMT+0000 (Coordinated Universal Time),https://uploads-ssl.webflow.com/63020a6ad41103e186d7416a/64a11cff7c06a4e2d7ca8c39_hero--27.svg,"Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vestibulum id ligula porta felis euismod semper. Sed posuere consectetur est at lobortis. Praesent commodo cursus magna, vel scelerisque nisl consectetur et.",,dg,product-design,Mon Oct 31 2022 00:00:00 GMT+0000 (Coordinated Universal Time),lead-product-designer-morressier,morressier,
6
+
Designing dermatology as a digital service,ohmu,63020a6ad411031c64d74168,63020a6ad41103867dd741de,Sun Aug 07 2022 10:24:08 GMT+0000 (Coordinated Universal Time),Fri May 24 2024 11:48:07 GMT+0000 (Coordinated Universal Time),Fri May 24 2024 11:51:23 GMT+0000 (Coordinated Universal Time),https://uploads-ssl.webflow.com/63020a6ad41103e186d7416a/634435bbf7d7aa6d7edaaf9b_02.svg,"Sed posuere consectetur est at lobortis. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Etiam porta sem malesuada magna mollis euismod. Donec id elit non mi porta gravida at eget metus. Cras mattis consectetur purus sit amet fermentum.",,0db6241a-42c5-49f0-b4bf-e94e6809fbdd,product-design,Thu Oct 31 2019 00:00:00 GMT+0000 (Coordinated Universal Time),principal-product-designer-leo,leo-pharma,
7
+
Scaling product design feedback,scaling-design-feedback,63020a6ad411031c64d74168,63020a6ad411033f4fd741dd,Sun Aug 07 2022 11:48:13 GMT+0000 (Coordinated Universal Time),Fri May 24 2024 11:47:28 GMT+0000 (Coordinated Universal Time),Fri May 24 2024 11:51:23 GMT+0000 (Coordinated Universal Time),https://uploads-ssl.webflow.com/63020a6ad41103e186d7416a/64a11d0b81b40a3acc12f5f4_hero--13.svg,"Sed posuere consectetur est at lobortis. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Etiam porta sem malesuada magna mollis euismod. Donec id elit non mi porta gravida at eget metus. Cras mattis consectetur purus sit amet fermentum.",,sdg,design-operations,Fri Sep 30 2022 00:00:00 GMT+0000 (Coordinated Universal Time),lead-product-designer-morressier,morressier,
8
+
Scaling a platform design system,scaling-morressier-design-system,63020a6ad411031c64d74168,63020a6ad411035a50d741dc,Sun Aug 14 2022 08:44:05 GMT+0000 (Coordinated Universal Time),Fri May 24 2024 11:42:26 GMT+0000 (Coordinated Universal Time),Fri May 24 2024 11:51:23 GMT+0000 (Coordinated Universal Time),https://uploads-ssl.webflow.com/63020a6ad41103e186d7416a/64a11ce66265165d6d6150e8_hero--18.svg,"Maecenas faucibus mollis interdum. Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget metus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas sed diam eget risus varius blandit sit amet non magna. Nullam quis risus eget urna mollis ornare vel eu leo. Lorem ipsum dolor sit amet, consectetur adipiscing elit.","<blockquote id="""">Curabitur blandit tempus porttitor. Donec id elit non mi porta gravida at eget metus. Donec ullamcorper nulla non metus auctor fringilla. Etiam porta sem malesuada magna mollis euismod. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Vestibulum id ligula porta felis euismod semper.</blockquote><p id=""""></p>",d60a06f5-7b62-4589-9eae-e1b5dc6da624,design-operations,Tue Apr 30 2024 00:00:00 GMT+0000 (Coordinated Universal Time),staff-product-designer-morressier,morressier,accessibility; design-leadership; design-operations; design-systems; design-strategy; interaction-design; interface-design; usability-testing
9
+
Reducing energy waste at home,smarter-energy,63020a6ad411031c64d74168,63020a6ad4110313b7d741db,Wed Aug 10 2022 09:44:10 GMT+0000 (Coordinated Universal Time),Thu Aug 08 2024 17:35:28 GMT+0000 (Coordinated Universal Time),Fri May 24 2024 11:51:23 GMT+0000 (Coordinated Universal Time),https://uploads-ssl.webflow.com/63020a6ad41103e186d7416a/6493d6f335cf63e96965c570_15.svg,"Sed posuere consectetur est at lobortis. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Etiam porta sem malesuada magna mollis euismod. Donec id elit non mi porta gravida at eget metus. Cras mattis consectetur purus sit amet fermentum.","<p id="""">When EDF Energy, a global leader serving over 3.5 million UK households, approached me to helm the design of Circuits, I knew it was a chance to create something extraordinary. Circuits would become a pioneering omni-channel platform empowering millions of customers to revolutionize their relationship with energy.</p><p>I had just completed 6 months working on some Service Design work for the Customer division, and was excited to join the BlueLab, their internal startup accelerator working with founders and technology partners to support innovation in the energy and connected home space.</p><p>Our insights informed the major investments by Customer division across energy and device sales, billing and customer support.</p><p id=""""><em>Incredibly</em>, in just 12 months after the major launch of, we surpased our goals, achieving:</p><p id="""">- 15% reduction in cost-to-serve, saving £3m annually <br>- 25% increase in resolved complaints, restoring trust for 150,000+ homes<br>- 12% reduction in bad debt, recovering £15.6m in the first year alone</p><h2 id="""">Relentless Customer Focus: Understanding the Human Impact</h2><p id="""">To reshape an industry, you must first understand its beating heart: the customers. I led an ambitious research program to map the depths of the customer experience:</p><p id="""">- Surveyed 500 households to quantify needs, attitudes and pain points<br>- Conducted 30 in-home ethnographic interviews to intimately understand customer journeys<br>- Analyzed dozens of competitors across energy, finance and home services to uncover opportunities for radical differentiation</p><p id="""">Through this rigorous discovery process, we uncovered patterns of human stories behind EDF's challenges: worried families struggling to interpret bills, confused customers dreading impersonal call centers, households craving control over rising costs. These insights fueled our resolve to drive a greater change.</p><h2 id="""">Painting an Ambitious Vision</h2><p id="""">Armed with deep customer empathy, I worked with Product Management to build out a bold vision and strategyfor Circuits to rally my team and stakeholders:</p><blockquote id="""">We will create the experience customers have been dreaming of: empowering them with beautifully simple tools to achieve a new level of confidence and control over their energy. We won't rest until we've transformed energy from a source of stress to an effortless ally in creating better lives.</blockquote><p id="""">To paint a vivid path forward, I delivered:<br>- Meticulously redesigned customer journeys across web, mobile, call-center and in-home touchpoints <br>- Comprehensive service blueprints aligning frontend experiences with backend operations<br>- Inspiring product roadmaps balancing customer delight, business value and technical feasibility</p><p id="""">### Accelerating Innovation Through Rapid Experimentation</p><p id="""">To maintain a blistering pace under towering ambiguity, I pioneered a culture of ruthless experimentation and validated learning cycles:</p><p id="""">- Launched unbranded landing pages to test demand for key features, generating a 35% increase in lead conversion<br>- Prototyped energy-saving chatbots on WhatsApp and Alexa, uncovering a 10X increase in customer engagement <br>- Designed and shipped a 3-month trial of physical Energy Tip Cards to 5,000 homes, yielding a 7% reduction in monthly usage</p><p id="""">By treating every step forward as a measurable learning opportunity , we could engage safely with riskier propositions and ensure every recommendation delivered to the Customer business was grounded in real customer value.</p><h2 id="""">Leading with Resilience and Ingenuity</h2><p id="""">Rewiring a legacy organization and industry was never going to be easy. When our initial assumptions failed or constraints changed, I led with poise and creative determination. </p><p id="""">I reworked journey maps to close gaps between customer needs and business capabilities. I guided engineers to cleverly phase technical architecture to unblock early customer value. When morale flagged, I evangelized user-centricity, turning skeptics into champions.</p><p id="""">### A Platform for Transformation</p><p id="""">Circuits has ignited a customer-obsessed revolution within EDF and across the energy industry. My team didn't just craft a groundbreaking product - we equipped an organization to continuously innovate around customer needs.</p><p id="""">I'm immensely proud of the design leadership, resilience and vision I brought to this ambitious undertaking. Circuits is so much more than pixels and code - it's a platform for transforming millions of lives. And we're only getting started.</p><p></p>",e633669d-7e72-4a31-a99e-e282c7bf96a8,product-design,Wed May 08 2019 00:00:00 GMT+0000 (Coordinated Universal Time),staff-service-designer-edf,edf-energy,
+29
src/data/.csv/Barry Prendergast - Skills.csv
+29
src/data/.csv/Barry Prendergast - Skills.csv
···
1
+
Skill,Slug,Collection ID,Item ID,Created On,Updated On,Published On
2
+
Accessibility,accessibility,63020a6ad41103c21ed74167,6413cae724cfc21d48f1b17c,Fri Mar 17 2023 02:05:27 GMT+0000 (Coordinated Universal Time),Tue Jul 18 2023 05:51:30 GMT+0000 (Coordinated Universal Time),Tue Jul 18 2023 05:51:50 GMT+0000 (Coordinated Universal Time)
3
+
Agile Methodologies,agile-methodologies,63020a6ad41103c21ed74167,6413cae79d689ff2fb09dfaa,Fri Mar 17 2023 02:05:27 GMT+0000 (Coordinated Universal Time),Fri Mar 17 2023 02:05:27 GMT+0000 (Coordinated Universal Time),Wed Jun 21 2023 10:12:05 GMT+0000 (Coordinated Universal Time)
4
+
"HTML, CSS & JS",code,63020a6ad41103c21ed74167,64980d741402de60d8573bd7,Sun Jun 25 2023 09:48:36 GMT+0000 (Coordinated Universal Time),Tue Jul 18 2023 05:50:04 GMT+0000 (Coordinated Universal Time),Tue Jul 18 2023 05:51:50 GMT+0000 (Coordinated Universal Time)
5
+
Content Design,content-design,63020a6ad41103c21ed74167,64980e1916a439bddb8c049c,Sun Jun 25 2023 09:51:21 GMT+0000 (Coordinated Universal Time),Sun Jun 25 2023 09:51:21 GMT+0000 (Coordinated Universal Time),Sun Jun 25 2023 10:13:32 GMT+0000 (Coordinated Universal Time)
6
+
Data Visualisation,data-visualisation,63020a6ad41103c21ed74167,64980ddce789129d1318f695,Sun Jun 25 2023 09:50:20 GMT+0000 (Coordinated Universal Time),Tue Jul 18 2023 05:50:17 GMT+0000 (Coordinated Universal Time),
7
+
Data Visualization,data-visualization,63020a6ad41103c21ed74167,6413cae7be9e524c66a5d320,Fri Mar 17 2023 02:05:27 GMT+0000 (Coordinated Universal Time),Tue Jul 18 2023 05:51:19 GMT+0000 (Coordinated Universal Time),
8
+
Design Leadership,design-leadership,63020a6ad41103c21ed74167,6413cae797f1d15204cb91b0,Fri Mar 17 2023 02:05:27 GMT+0000 (Coordinated Universal Time),Fri Mar 17 2023 02:05:27 GMT+0000 (Coordinated Universal Time),Wed Jun 21 2023 10:12:05 GMT+0000 (Coordinated Universal Time)
9
+
Design Methodologies,design-methodologies,63020a6ad41103c21ed74167,6413cae72810c5a947d3be4c,Fri Mar 17 2023 02:05:27 GMT+0000 (Coordinated Universal Time),Fri Mar 17 2023 02:05:27 GMT+0000 (Coordinated Universal Time),Wed Jun 21 2023 10:12:05 GMT+0000 (Coordinated Universal Time)
10
+
Design Operations,design-operations,63020a6ad41103c21ed74167,6413cae7f4c32ad168a729a0,Fri Mar 17 2023 02:05:27 GMT+0000 (Coordinated Universal Time),Fri Mar 17 2023 02:05:27 GMT+0000 (Coordinated Universal Time),Wed Jun 21 2023 10:12:05 GMT+0000 (Coordinated Universal Time)
11
+
Design Strategy,design-strategy,63020a6ad41103c21ed74167,6413cae7fc983cdd5cb74804,Fri Mar 17 2023 02:05:27 GMT+0000 (Coordinated Universal Time),Fri Mar 17 2023 02:05:27 GMT+0000 (Coordinated Universal Time),Wed Jun 21 2023 10:12:05 GMT+0000 (Coordinated Universal Time)
12
+
Design Systems,design-systems,63020a6ad41103c21ed74167,6413cae79741e4b62dab6453,Fri Mar 17 2023 02:05:27 GMT+0000 (Coordinated Universal Time),Fri Mar 17 2023 02:05:27 GMT+0000 (Coordinated Universal Time),Wed Jun 21 2023 10:12:05 GMT+0000 (Coordinated Universal Time)
13
+
Design Thinking,design-thinking,63020a6ad41103c21ed74167,64980df9b759173dc6500847,Sun Jun 25 2023 09:50:49 GMT+0000 (Coordinated Universal Time),Sun Jun 25 2023 09:50:49 GMT+0000 (Coordinated Universal Time),Sun Jun 25 2023 10:13:32 GMT+0000 (Coordinated Universal Time)
14
+
Digital Transformation,digital-transformation,63020a6ad41103c21ed74167,64980ea0259b9b181d412b5a,Sun Jun 25 2023 09:53:36 GMT+0000 (Coordinated Universal Time),Tue Jul 18 2023 05:51:37 GMT+0000 (Coordinated Universal Time),
15
+
Information Architecture,information-architecture,63020a6ad41103c21ed74167,6413cae79741e43935ab6454,Fri Mar 17 2023 02:05:27 GMT+0000 (Coordinated Universal Time),Fri Mar 17 2023 02:05:27 GMT+0000 (Coordinated Universal Time),Wed Jun 21 2023 10:12:05 GMT+0000 (Coordinated Universal Time)
16
+
Interaction Design,interaction-design,63020a6ad41103c21ed74167,6413cae7f4c32a3355a729a8,Fri Mar 17 2023 02:05:27 GMT+0000 (Coordinated Universal Time),Fri Mar 17 2023 02:05:27 GMT+0000 (Coordinated Universal Time),Wed Jun 21 2023 10:12:05 GMT+0000 (Coordinated Universal Time)
17
+
Interface Design,interface-design,63020a6ad41103c21ed74167,6413cae71aacf0fb2becb9c2,Fri Mar 17 2023 02:05:27 GMT+0000 (Coordinated Universal Time),Fri Mar 17 2023 02:05:27 GMT+0000 (Coordinated Universal Time),Wed Jun 21 2023 10:12:05 GMT+0000 (Coordinated Universal Time)
18
+
Internet of Things (IoT),internet-of-things,63020a6ad41103c21ed74167,6413cae71aacf01a47ecb9c4,Fri Mar 17 2023 02:05:27 GMT+0000 (Coordinated Universal Time),Tue Jul 18 2023 05:50:59 GMT+0000 (Coordinated Universal Time),
19
+
Journey Mapping,journey-mapping,63020a6ad41103c21ed74167,6413cae7be9e52cb45a5d329,Fri Mar 17 2023 02:05:27 GMT+0000 (Coordinated Universal Time),Fri Mar 17 2023 02:05:27 GMT+0000 (Coordinated Universal Time),Wed Jun 21 2023 10:12:05 GMT+0000 (Coordinated Universal Time)
20
+
Lean UX,lean-ux,63020a6ad41103c21ed74167,64980df13a344d8f4aef7139,Sun Jun 25 2023 09:50:41 GMT+0000 (Coordinated Universal Time),Sun Jun 25 2023 09:50:41 GMT+0000 (Coordinated Universal Time),Sun Jun 25 2023 10:13:32 GMT+0000 (Coordinated Universal Time)
21
+
People Management,people-management,63020a6ad41103c21ed74167,64981a5e2b48a0c9cd700b37,Sun Jun 25 2023 10:43:42 GMT+0000 (Coordinated Universal Time),Sun Jun 25 2023 10:43:42 GMT+0000 (Coordinated Universal Time),Sun Jun 25 2023 10:43:48 GMT+0000 (Coordinated Universal Time)
22
+
Persuasive Communication,persuasive-communication,63020a6ad41103c21ed74167,64980e66202d925b04c81e23,Sun Jun 25 2023 09:52:38 GMT+0000 (Coordinated Universal Time),Sun Jun 25 2023 09:53:54 GMT+0000 (Coordinated Universal Time),Sun Jun 25 2023 10:13:32 GMT+0000 (Coordinated Universal Time)
23
+
Product Design,product-design,63020a6ad41103c21ed74167,6413cae89d689f117309dfac,Fri Mar 17 2023 02:05:28 GMT+0000 (Coordinated Universal Time),Fri Mar 17 2023 02:05:28 GMT+0000 (Coordinated Universal Time),Wed Jun 21 2023 10:12:05 GMT+0000 (Coordinated Universal Time)
24
+
Rapid Prototyping,rapid-prototyping,63020a6ad41103c21ed74167,6413cae80ee69ab18fa7e91d,Fri Mar 17 2023 02:05:28 GMT+0000 (Coordinated Universal Time),Fri Mar 17 2023 02:05:28 GMT+0000 (Coordinated Universal Time),Wed Jun 21 2023 10:12:05 GMT+0000 (Coordinated Universal Time)
25
+
Service Design,service-design,63020a6ad41103c21ed74167,6413cae80eac7c0dd4ee38c7,Fri Mar 17 2023 02:05:28 GMT+0000 (Coordinated Universal Time),Fri Mar 17 2023 02:05:28 GMT+0000 (Coordinated Universal Time),Wed Jun 21 2023 10:12:05 GMT+0000 (Coordinated Universal Time)
26
+
Stakeholder Engagement,stakeholder-engagement,63020a6ad41103c21ed74167,6413cae82810c51ca6d3be4e,Fri Mar 17 2023 02:05:28 GMT+0000 (Coordinated Universal Time),Fri Mar 17 2023 02:05:28 GMT+0000 (Coordinated Universal Time),Wed Jun 21 2023 10:12:05 GMT+0000 (Coordinated Universal Time)
27
+
Career Development,team-management,63020a6ad41103c21ed74167,6413cae89741e48690ab645e,Fri Mar 17 2023 02:05:28 GMT+0000 (Coordinated Universal Time),Sun Jun 25 2023 10:43:29 GMT+0000 (Coordinated Universal Time),Sun Jun 25 2023 10:43:48 GMT+0000 (Coordinated Universal Time)
28
+
Usability Testing,usability-testing,63020a6ad41103c21ed74167,6413cae825deb17304f3e643,Fri Mar 17 2023 02:05:28 GMT+0000 (Coordinated Universal Time),Fri Mar 17 2023 02:05:28 GMT+0000 (Coordinated Universal Time),Wed Jun 21 2023 10:12:05 GMT+0000 (Coordinated Universal Time)
29
+
UX Research,ux-research,63020a6ad41103c21ed74167,6413cae8cf050a4c0e7de89b,Fri Mar 17 2023 02:05:28 GMT+0000 (Coordinated Universal Time),Fri Mar 17 2023 02:05:28 GMT+0000 (Coordinated Universal Time),Wed Jun 21 2023 10:12:05 GMT+0000 (Coordinated Universal Time)
+5
src/data/.csv/Barry Prendergast - Types.csv
+5
src/data/.csv/Barry Prendergast - Types.csv
···
1
+
Name,Slug,Collection ID,Item ID,Created On,Updated On,Published On,Icon
2
+
DesignOps,design-operations,649980ff9d79302feded07bc,6499820aa5a5d814dec627b6,Mon Jun 26 2023 12:18:18 GMT+0000 (Coordinated Universal Time),Sun Jul 02 2023 04:42:24 GMT+0000 (Coordinated Universal Time),Sun Jul 02 2023 09:09:37 GMT+0000 (Coordinated Universal Time),
3
+
Design Strategy,design-strategy,649980ff9d79302feded07bc,6499825c9b48cef78452be6a,Mon Jun 26 2023 12:19:40 GMT+0000 (Coordinated Universal Time),Mon Jun 26 2023 12:19:40 GMT+0000 (Coordinated Universal Time),Sun Jul 02 2023 00:47:22 GMT+0000 (Coordinated Universal Time),
4
+
Product Design,product-design,649980ff9d79302feded07bc,649981bf979306f7e73e1293,Mon Jun 26 2023 12:17:03 GMT+0000 (Coordinated Universal Time),Mon Jun 26 2023 12:17:03 GMT+0000 (Coordinated Universal Time),Sun Jul 02 2023 00:47:22 GMT+0000 (Coordinated Universal Time),
5
+
Service Design,service-design,649980ff9d79302feded07bc,649981ea13c4ae0865175e08,Mon Jun 26 2023 12:17:46 GMT+0000 (Coordinated Universal Time),Mon Jun 26 2023 12:17:46 GMT+0000 (Coordinated Universal Time),Sun Jul 02 2023 00:47:22 GMT+0000 (Coordinated Universal Time),
+169
src/data/json/casestudies.json
+169
src/data/json/casestudies.json
···
1
+
[
2
+
{
3
+
"affiliation": "brandwatch",
4
+
"affiliationURL": "https://medium.com/@render_ghost/",
5
+
"body": "<p id=\"\">Maecenas faucibus mollis interdum. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam quis risus eget urna mollis ornare vel eu leo. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed posuere consectetur est at lobortis. Etiam porta sem malesuada magna mollis euismod.</p><p id=\"\">Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Etiam porta sem malesuada magna mollis euismod. Curabitur blandit tempus porttitor. Curabitur blandit tempus porttitor.</p>",
6
+
"collectionId": "63020a6ad411031c64d74168",
7
+
"coverImage": "https://uploads-ssl.webflow.com/63020a6ad41103e186d7416a/64a11cd365d155b164b5a017_hero--19.svg",
8
+
"endDate": "Mon Oct 31 2016 00:00:00 GMT+0000 (Coordinated Universal Time)",
9
+
"itemId": "64171a179f12e0f16aed2556",
10
+
"pitchEmbed": "5176aa05-c687-4582-9b81-344dc9944a38",
11
+
"published": "Fri May 24 2024 11:51:23 GMT+0000 (Coordinated Universal Time)",
12
+
"relevantSkills": [
13
+
"data-visualization",
14
+
"design-strategy",
15
+
"interaction-design",
16
+
"interface-design",
17
+
"internet-of-things",
18
+
"product-design",
19
+
"rapid-prototyping",
20
+
"stakeholder-engagement",
21
+
"usability-testing"
22
+
],
23
+
"role": "senior-ux-designer-brandwatch",
24
+
"slug": "brandwatch-vizia",
25
+
"summary": "Cras mattis consectetur purus sit amet fermentum.",
26
+
"title": "Democratising insightful decision making across organisations",
27
+
"type": "product-design"
28
+
},
29
+
{
30
+
"affiliation": "mygoodplanet",
31
+
"affiliationURL": "https://medium.com/@render_ghost/",
32
+
"body": "",
33
+
"collectionId": "63020a6ad411031c64d74168",
34
+
"coverImage": "https://uploads-ssl.webflow.com/63020a6ad41103e186d7416a/64a085ac08379c1910b65581_22.png",
35
+
"endDate": "Wed Jul 31 2019 00:00:00 GMT+0000 (Coordinated Universal Time)",
36
+
"itemId": "64998000362d4092f139d994",
37
+
"pitchEmbed": "sdf",
38
+
"published": "Fri May 24 2024 11:51:23 GMT+0000 (Coordinated Universal Time)",
39
+
"relevantSkills": [
40
+
""
41
+
],
42
+
"role": "design-director-mgp",
43
+
"slug": "defining-the-product-strategy-for-eco-shopping",
44
+
"summary": "Sed posuere consectetur est at lobortis. Sed posuere consectetur est at lobortis. Nullam quis risus eget urna mollis ornare vel eu leo. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Donec ullamcorper nulla non metus auctor fringilla.",
45
+
"title": "Defining the product strategy for eco shopping",
46
+
"type": "design-strategy"
47
+
},
48
+
{
49
+
"affiliation": "morressier",
50
+
"affiliationURL": "https://medium.com/@render_ghost/",
51
+
"body": "",
52
+
"collectionId": "63020a6ad411031c64d74168",
53
+
"coverImage": "https://uploads-ssl.webflow.com/63020a6ad41103e186d7416a/64a11cb6c1bfe86c75f70982_hero--20.svg",
54
+
"endDate": "Wed Mar 31 2021 00:00:00 GMT+0000 (Coordinated Universal Time)",
55
+
"itemId": "64997fd84e68f4e3552d1f17",
56
+
"pitchEmbed": "sdf",
57
+
"published": "Fri May 24 2024 11:51:23 GMT+0000 (Coordinated Universal Time)",
58
+
"relevantSkills": [
59
+
""
60
+
],
61
+
"role": "lead-product-designer-morressier",
62
+
"slug": "improving-the-recruitment-experience-for-design-candidates",
63
+
"summary": "Sed posuere consectetur est at lobortis. Sed posuere consectetur est at lobortis. Nullam quis risus eget urna mollis ornare vel eu leo. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Donec ullamcorper nulla non metus auctor fringilla.",
64
+
"title": "Improving the recruitment experience for Design candidates",
65
+
"type": "design-operations"
66
+
},
67
+
{
68
+
"affiliation": "morressier",
69
+
"affiliationURL": "https://medium.com/@render_ghost/",
70
+
"body": "",
71
+
"collectionId": "63020a6ad411031c64d74168",
72
+
"coverImage": "https://uploads-ssl.webflow.com/63020a6ad41103e186d7416a/64a11cff7c06a4e2d7ca8c39_hero--27.svg",
73
+
"endDate": "Mon Oct 31 2022 00:00:00 GMT+0000 (Coordinated Universal Time)",
74
+
"itemId": "63020a6ad411030b7cd741da",
75
+
"pitchEmbed": "dg",
76
+
"published": "Fri May 24 2024 11:51:23 GMT+0000 (Coordinated Universal Time)",
77
+
"relevantSkills": [
78
+
""
79
+
],
80
+
"role": "lead-product-designer-morressier",
81
+
"slug": "morressier-discovery",
82
+
"summary": "Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vestibulum id ligula porta felis euismod semper. Sed posuere consectetur est at lobortis. Praesent commodo cursus magna, vel scelerisque nisl consectetur et.",
83
+
"title": "Building a professional community for scientists",
84
+
"type": "product-design"
85
+
},
86
+
{
87
+
"affiliation": "leo-pharma",
88
+
"affiliationURL": "https://medium.com/@render_ghost/",
89
+
"body": "",
90
+
"collectionId": "63020a6ad411031c64d74168",
91
+
"coverImage": "https://uploads-ssl.webflow.com/63020a6ad41103e186d7416a/634435bbf7d7aa6d7edaaf9b_02.svg",
92
+
"endDate": "Thu Oct 31 2019 00:00:00 GMT+0000 (Coordinated Universal Time)",
93
+
"itemId": "63020a6ad41103867dd741de",
94
+
"pitchEmbed": "0db6241a-42c5-49f0-b4bf-e94e6809fbdd",
95
+
"published": "Fri May 24 2024 11:51:23 GMT+0000 (Coordinated Universal Time)",
96
+
"relevantSkills": [
97
+
""
98
+
],
99
+
"role": "principal-product-designer-leo",
100
+
"slug": "ohmu",
101
+
"summary": "Sed posuere consectetur est at lobortis. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Etiam porta sem malesuada magna mollis euismod. Donec id elit non mi porta gravida at eget metus. Cras mattis consectetur purus sit amet fermentum.",
102
+
"title": "Designing dermatology as a digital service",
103
+
"type": "product-design"
104
+
},
105
+
{
106
+
"affiliation": "morressier",
107
+
"affiliationURL": "https://medium.com/@render_ghost/",
108
+
"body": "",
109
+
"collectionId": "63020a6ad411031c64d74168",
110
+
"coverImage": "https://uploads-ssl.webflow.com/63020a6ad41103e186d7416a/64a11d0b81b40a3acc12f5f4_hero--13.svg",
111
+
"endDate": "Fri Sep 30 2022 00:00:00 GMT+0000 (Coordinated Universal Time)",
112
+
"itemId": "63020a6ad411033f4fd741dd",
113
+
"pitchEmbed": "sdg",
114
+
"published": "Fri May 24 2024 11:51:23 GMT+0000 (Coordinated Universal Time)",
115
+
"relevantSkills": [
116
+
""
117
+
],
118
+
"role": "lead-product-designer-morressier",
119
+
"slug": "scaling-design-feedback",
120
+
"summary": "Sed posuere consectetur est at lobortis. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Etiam porta sem malesuada magna mollis euismod. Donec id elit non mi porta gravida at eget metus. Cras mattis consectetur purus sit amet fermentum.",
121
+
"title": "Scaling product design feedback",
122
+
"type": "design-operations"
123
+
},
124
+
{
125
+
"affiliation": "morressier",
126
+
"affiliationURL": "https://medium.com/@render_ghost/",
127
+
"body": "<blockquote id=\"\">Curabitur blandit tempus porttitor. Donec id elit non mi porta gravida at eget metus. Donec ullamcorper nulla non metus auctor fringilla. Etiam porta sem malesuada magna mollis euismod. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Vestibulum id ligula porta felis euismod semper.</blockquote><p id=\"\"></p>",
128
+
"collectionId": "63020a6ad411031c64d74168",
129
+
"coverImage": "https://uploads-ssl.webflow.com/63020a6ad41103e186d7416a/64a11ce66265165d6d6150e8_hero--18.svg",
130
+
"endDate": "Tue Apr 30 2024 00:00:00 GMT+0000 (Coordinated Universal Time)",
131
+
"itemId": "63020a6ad411035a50d741dc",
132
+
"pitchEmbed": "d60a06f5-7b62-4589-9eae-e1b5dc6da624",
133
+
"published": "Fri May 24 2024 11:51:23 GMT+0000 (Coordinated Universal Time)",
134
+
"relevantSkills": [
135
+
"accessibility",
136
+
"design-leadership",
137
+
"design-operations",
138
+
"design-systems",
139
+
"design-strategy",
140
+
"interaction-design",
141
+
"interface-design",
142
+
"usability-testing"
143
+
],
144
+
"role": "staff-product-designer-morressier",
145
+
"slug": "scaling-morressier-design-system",
146
+
"summary": "Maecenas faucibus mollis interdum. Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget metus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas sed diam eget risus varius blandit sit amet non magna. Nullam quis risus eget urna mollis ornare vel eu leo. Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
147
+
"title": "Scaling a platform design system",
148
+
"type": "design-operations"
149
+
},
150
+
{
151
+
"affiliation": "edf-energy",
152
+
"affiliationURL": "https://medium.com/@render_ghost/",
153
+
"body": "<p id=\"\">When EDF Energy, a global leader serving over 3.5 million UK households, approached me to helm the design of Circuits, I knew it was a chance to create something extraordinary. Circuits would become a pioneering omni-channel platform empowering millions of customers to revolutionize their relationship with energy.</p><p>I had just completed 6 months working on some Service Design work for the Customer division, and was excited to join the BlueLab, their internal startup accelerator working with founders and technology partners to support innovation in the energy and connected home space.</p><p>Our insights informed the major investments by Customer division across energy and device sales, billing and customer support.</p><p id=\"\"><em>Incredibly</em>, in just 12 months after the major launch of, we surpased our goals, achieving:</p><p id=\"\">- 15% reduction in cost-to-serve, saving £3m annually <br>- 25% increase in resolved complaints, restoring trust for 150,000+ homes<br>- 12% reduction in bad debt, recovering £15.6m in the first year alone</p><h2 id=\"\">Relentless Customer Focus: Understanding the Human Impact</h2><p id=\"\">To reshape an industry, you must first understand its beating heart: the customers. I led an ambitious research program to map the depths of the customer experience:</p><p id=\"\">- Surveyed 500 households to quantify needs, attitudes and pain points<br>- Conducted 30 in-home ethnographic interviews to intimately understand customer journeys<br>- Analyzed dozens of competitors across energy, finance and home services to uncover opportunities for radical differentiation</p><p id=\"\">Through this rigorous discovery process, we uncovered patterns of human stories behind EDF's challenges: worried families struggling to interpret bills, confused customers dreading impersonal call centers, households craving control over rising costs. These insights fueled our resolve to drive a greater change.</p><h2 id=\"\">Painting an Ambitious Vision</h2><p id=\"\">Armed with deep customer empathy, I worked with Product Management to build out a bold vision and strategyfor Circuits to rally my team and stakeholders:</p><blockquote id=\"\">We will create the experience customers have been dreaming of: empowering them with beautifully simple tools to achieve a new level of confidence and control over their energy. We won't rest until we've transformed energy from a source of stress to an effortless ally in creating better lives.</blockquote><p id=\"\">To paint a vivid path forward, I delivered:<br>- Meticulously redesigned customer journeys across web, mobile, call-center and in-home touchpoints <br>- Comprehensive service blueprints aligning frontend experiences with backend operations<br>- Inspiring product roadmaps balancing customer delight, business value and technical feasibility</p><p id=\"\">### Accelerating Innovation Through Rapid Experimentation</p><p id=\"\">To maintain a blistering pace under towering ambiguity, I pioneered a culture of ruthless experimentation and validated learning cycles:</p><p id=\"\">- Launched unbranded landing pages to test demand for key features, generating a 35% increase in lead conversion<br>- Prototyped energy-saving chatbots on WhatsApp and Alexa, uncovering a 10X increase in customer engagement <br>- Designed and shipped a 3-month trial of physical Energy Tip Cards to 5,000 homes, yielding a 7% reduction in monthly usage</p><p id=\"\">By treating every step forward as a measurable learning opportunity , we could engage safely with riskier propositions and ensure every recommendation delivered to the Customer business was grounded in real customer value.</p><h2 id=\"\">Leading with Resilience and Ingenuity</h2><p id=\"\">Rewiring a legacy organization and industry was never going to be easy. When our initial assumptions failed or constraints changed, I led with poise and creative determination. </p><p id=\"\">I reworked journey maps to close gaps between customer needs and business capabilities. I guided engineers to cleverly phase technical architecture to unblock early customer value. When morale flagged, I evangelized user-centricity, turning skeptics into champions.</p><p id=\"\">### A Platform for Transformation</p><p id=\"\">Circuits has ignited a customer-obsessed revolution within EDF and across the energy industry. My team didn't just craft a groundbreaking product - we equipped an organization to continuously innovate around customer needs.</p><p id=\"\">I'm immensely proud of the design leadership, resilience and vision I brought to this ambitious undertaking. Circuits is so much more than pixels and code - it's a platform for transforming millions of lives. And we're only getting started.</p><p></p>",
154
+
"collectionId": "63020a6ad411031c64d74168",
155
+
"coverImage": "https://uploads-ssl.webflow.com/63020a6ad41103e186d7416a/6493d6f335cf63e96965c570_15.svg",
156
+
"endDate": "Wed May 08 2019 00:00:00 GMT+0000 (Coordinated Universal Time)",
157
+
"itemId": "63020a6ad4110313b7d741db",
158
+
"pitchEmbed": "e633669d-7e72-4a31-a99e-e282c7bf96a8",
159
+
"published": "Fri May 24 2024 11:51:23 GMT+0000 (Coordinated Universal Time)",
160
+
"relevantSkills": [
161
+
""
162
+
],
163
+
"role": "staff-service-designer-edf",
164
+
"slug": "smarter-energy",
165
+
"summary": "Sed posuere consectetur est at lobortis. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Etiam porta sem malesuada magna mollis euismod. Donec id elit non mi porta gravida at eget metus. Cras mattis consectetur purus sit amet fermentum.",
166
+
"title": "Reducing energy waste at home",
167
+
"type": "product-design"
168
+
}
169
+
]
+167
src/data/json/companies.json
+167
src/data/json/companies.json
···
1
+
[
2
+
{
3
+
"city": "Brighton",
4
+
"collectionId": "6492fe188837ee33a22fed4d",
5
+
"country": "UK",
6
+
"createdOn": "Wed Jun 21 2023 14:11:24 GMT+0000 (Coordinated Universal Time)",
7
+
"industry": "Consumer Intelligence",
8
+
"itemId": "6493050c606e51cb999dc8ba",
9
+
"logo": "",
10
+
"name": "Brandwatch",
11
+
"publishedOn": "Sat Jun 24 2023 05:33:18 GMT+0000 (Coordinated Universal Time)",
12
+
"slug": "brandwatch",
13
+
"type": "B2B",
14
+
"updatedOn": "Sat Jun 24 2023 05:13:33 GMT+0000 (Coordinated Universal Time)",
15
+
"website": "https://www.brandwatch.com/"
16
+
},
17
+
{
18
+
"city": "Brighton",
19
+
"collectionId": "6492fe188837ee33a22fed4d",
20
+
"country": "UK",
21
+
"createdOn": "Wed Jun 21 2023 14:10:15 GMT+0000 (Coordinated Universal Time)",
22
+
"industry": "Energy Generation & Supply",
23
+
"itemId": "649304c7a2b9d1603236d4b8",
24
+
"logo": "",
25
+
"name": "EDF Energy",
26
+
"publishedOn": "Sat Jun 24 2023 05:33:18 GMT+0000 (Coordinated Universal Time)",
27
+
"slug": "edf-energy",
28
+
"type": "B2C",
29
+
"updatedOn": "Sat Jun 24 2023 05:13:42 GMT+0000 (Coordinated Universal Time)",
30
+
"website": "https://www.edfenergy.com/about/innovation/challenge"
31
+
},
32
+
{
33
+
"city": "London",
34
+
"collectionId": "6492fe188837ee33a22fed4d",
35
+
"country": "UK",
36
+
"createdOn": "Sat Jun 24 2023 05:04:33 GMT+0000 (Coordinated Universal Time)",
37
+
"industry": "Government",
38
+
"itemId": "649679613d19cea8ea2caf00",
39
+
"logo": "",
40
+
"name": "Home Office",
41
+
"publishedOn": "Sat Jun 24 2023 05:33:18 GMT+0000 (Coordinated Universal Time)",
42
+
"slug": "home-office",
43
+
"type": "",
44
+
"updatedOn": "Sat Jun 24 2023 05:10:39 GMT+0000 (Coordinated Universal Time)",
45
+
"website": "https://www.gov.uk/government/organisations/home-office"
46
+
},
47
+
{
48
+
"city": "Copenhagen",
49
+
"collectionId": "6492fe188837ee33a22fed4d",
50
+
"country": "Denmark",
51
+
"createdOn": "Wed Jun 21 2023 13:48:14 GMT+0000 (Coordinated Universal Time)",
52
+
"industry": "Pharmaceutical",
53
+
"itemId": "6492ff9e1cb5762c2192da9a",
54
+
"logo": "",
55
+
"name": "LEO Pharma",
56
+
"publishedOn": "Sat Jun 24 2023 05:33:18 GMT+0000 (Coordinated Universal Time)",
57
+
"slug": "leo-pharma",
58
+
"type": "B2C",
59
+
"updatedOn": "Sat Jun 24 2023 05:13:52 GMT+0000 (Coordinated Universal Time)",
60
+
"website": "https://www.leo-pharma.com/"
61
+
},
62
+
{
63
+
"city": "Brighton",
64
+
"collectionId": "6492fe188837ee33a22fed4d",
65
+
"country": "UK",
66
+
"createdOn": "Sat Jun 24 2023 05:02:38 GMT+0000 (Coordinated Universal Time)",
67
+
"industry": "Video games",
68
+
"itemId": "649678eee54dbd7686a713a3",
69
+
"logo": "",
70
+
"name": "MediaTonic",
71
+
"publishedOn": "Sat Jun 24 2023 05:33:18 GMT+0000 (Coordinated Universal Time)",
72
+
"slug": "mediatonic",
73
+
"type": "B2B",
74
+
"updatedOn": "Sat Jun 24 2023 05:13:18 GMT+0000 (Coordinated Universal Time)",
75
+
"website": "https://mediatonicgames.com/"
76
+
},
77
+
{
78
+
"city": "Berlin",
79
+
"collectionId": "6492fe188837ee33a22fed4d",
80
+
"country": "Germany",
81
+
"createdOn": "Wed Jun 21 2023 14:08:43 GMT+0000 (Coordinated Universal Time)",
82
+
"industry": "Scientific Publishing",
83
+
"itemId": "6493046b403abc6e1ca59032",
84
+
"logo": "",
85
+
"name": "Morressier",
86
+
"publishedOn": "Sat Jun 24 2023 05:33:18 GMT+0000 (Coordinated Universal Time)",
87
+
"slug": "morressier",
88
+
"type": "B2B",
89
+
"updatedOn": "Sat Jun 24 2023 05:13:48 GMT+0000 (Coordinated Universal Time)",
90
+
"website": "https://www.morressier.com/"
91
+
},
92
+
{
93
+
"city": "Dublin",
94
+
"collectionId": "6492fe188837ee33a22fed4d",
95
+
"country": "Ireland",
96
+
"createdOn": "Sat Jun 24 2023 05:08:57 GMT+0000 (Coordinated Universal Time)",
97
+
"industry": "Publishing",
98
+
"itemId": "64967a690b2841f15cf81353",
99
+
"logo": "",
100
+
"name": "MyGoodPlanet",
101
+
"publishedOn": "Sat Jun 24 2023 05:33:18 GMT+0000 (Coordinated Universal Time)",
102
+
"slug": "mygoodplanet",
103
+
"type": "B2C",
104
+
"updatedOn": "Sat Jun 24 2023 05:13:01 GMT+0000 (Coordinated Universal Time)",
105
+
"website": ""
106
+
},
107
+
{
108
+
"city": "Brighton",
109
+
"collectionId": "6492fe188837ee33a22fed4d",
110
+
"country": "UK",
111
+
"createdOn": "Sat Jun 24 2023 04:58:51 GMT+0000 (Coordinated Universal Time)",
112
+
"industry": "Video games",
113
+
"itemId": "6496780b1624e29a27b7ecbc",
114
+
"logo": "",
115
+
"name": "Relentless Software",
116
+
"publishedOn": "Sat Jun 24 2023 05:33:18 GMT+0000 (Coordinated Universal Time)",
117
+
"slug": "relentless-software",
118
+
"type": "B2B",
119
+
"updatedOn": "Sat Jun 24 2023 05:13:28 GMT+0000 (Coordinated Universal Time)",
120
+
"website": "http://www.relentless.co.uk/"
121
+
},
122
+
{
123
+
"city": "Brighton",
124
+
"collectionId": "6492fe188837ee33a22fed4d",
125
+
"country": "UK",
126
+
"createdOn": "Sat Jun 24 2023 05:10:02 GMT+0000 (Coordinated Universal Time)",
127
+
"industry": "Marketing Automation",
128
+
"itemId": "64967aaa860a8ebaefe69a00",
129
+
"logo": "",
130
+
"name": "Scenestealer",
131
+
"publishedOn": "Sat Jun 24 2023 05:33:18 GMT+0000 (Coordinated Universal Time)",
132
+
"slug": "scenestealer",
133
+
"type": "B2B",
134
+
"updatedOn": "Sat Jun 24 2023 05:12:55 GMT+0000 (Coordinated Universal Time)",
135
+
"website": "http://www.scenestealer.tv/"
136
+
},
137
+
{
138
+
"city": "London",
139
+
"collectionId": "6492fe188837ee33a22fed4d",
140
+
"country": "UK",
141
+
"createdOn": "Sat Jun 24 2023 05:00:41 GMT+0000 (Coordinated Universal Time)",
142
+
"industry": "Energy Services & Equipment",
143
+
"itemId": "64967879aace6d8ddffd0060",
144
+
"logo": "",
145
+
"name": "Schlumberger",
146
+
"publishedOn": "Sat Jun 24 2023 05:33:18 GMT+0000 (Coordinated Universal Time)",
147
+
"slug": "schlumberger",
148
+
"type": "B2B",
149
+
"updatedOn": "Sat Jun 24 2023 05:13:23 GMT+0000 (Coordinated Universal Time)",
150
+
"website": "https://www.software.slb.com/"
151
+
},
152
+
{
153
+
"city": "Brighton",
154
+
"collectionId": "6492fe188837ee33a22fed4d",
155
+
"country": "UK",
156
+
"createdOn": "Sat Jun 24 2023 05:07:10 GMT+0000 (Coordinated Universal Time)",
157
+
"industry": "Marketing Automation",
158
+
"itemId": "649679fe246701a71ce9d1a4",
159
+
"logo": "",
160
+
"name": "Spotler",
161
+
"publishedOn": "Sat Jun 24 2023 05:33:18 GMT+0000 (Coordinated Universal Time)",
162
+
"slug": "spotler",
163
+
"type": "B2B",
164
+
"updatedOn": "Sat Jun 24 2023 05:13:06 GMT+0000 (Coordinated Universal Time)",
165
+
"website": "https://spotler.co.uk/"
166
+
}
167
+
]
+1257
src/data/json/content.json
+1257
src/data/json/content.json
···
1
+
{
2
+
"articles": [
3
+
{
4
+
"articleUrl": "https://blog.prototypr.io/against-shoot-first-ask-questions-later-my-response-to-user-research-is-overrated-5389f21fb20",
5
+
"collectionId": "63020a6ad411038554d74169",
6
+
"coverImage": "https://uploads-ssl.webflow.com/63020a6ad41103e186d7416a/63020a6ad411038404d74175_1_wpQQwOdCWz72gsyg0y6Geg.png",
7
+
"createdOn": "Wed Aug 17 2022 21:53:57 GMT+0000 (Coordinated Universal Time)",
8
+
"featured": true,
9
+
"itemId": "63020a6ad411035302d741e1",
10
+
"publication": "Prototypr",
11
+
"publicationUrl": "https://blog.prototypr.io/",
12
+
"published": "Fri Feb 17 2017 00:00:00 GMT+0000 (Coordinated Universal Time)",
13
+
"publishedOn": "Sat Jun 24 2023 05:37:07 GMT+0000 (Coordinated Universal Time)",
14
+
"slug": "against-shoot-first-ask-questions-later-my-response-to-user-research-is-overrated",
15
+
"subtitle": "My 2 cents about the discussion emerging in the research and design community today.",
16
+
"title": "Against “shoot first, ask questions later” — my response to “User research is overrated”",
17
+
"updatedOn": "Sat Jun 24 2023 05:36:43 GMT+0000 (Coordinated Universal Time)"
18
+
},
19
+
{
20
+
"articleUrl": "https://medium.com/@render_ghost/i-am-not-a-real-person-71a7876923b4",
21
+
"collectionId": "63020a6ad411038554d74169",
22
+
"coverImage": "https://uploads-ssl.webflow.com/63020a6ad41103e186d7416a/64967e75d452680d29750b8b_1_txqBUt16DKkXFtmiQrhysw.webp",
23
+
"createdOn": "Sat Jun 24 2023 05:26:16 GMT+0000 (Coordinated Universal Time)",
24
+
"featured": false,
25
+
"itemId": "64967e78c53904c45ebb2672",
26
+
"publication": "Personal Blog",
27
+
"publicationUrl": "https://medium.com/@render_ghost/",
28
+
"published": "Fri Dec 09 2022 00:00:00 GMT+0000 (Coordinated Universal Time)",
29
+
"publishedOn": "Sat Jun 24 2023 05:33:18 GMT+0000 (Coordinated Universal Time)",
30
+
"slug": "i-am-not-a-real-person",
31
+
"subtitle": "It’s easy to find a job on LinkedIn when you don’t actually exist, but are still #OpenToWork",
32
+
"title": "I am not a real person.",
33
+
"updatedOn": "Sat Jun 24 2023 05:26:16 GMT+0000 (Coordinated Universal Time)"
34
+
},
35
+
{
36
+
"articleUrl": "https://medium.com/@render_ghost/your-smartphone-is-harassing-you-with-unwelcome-interruptions-stop-it-80af8fad3435",
37
+
"collectionId": "63020a6ad411038554d74169",
38
+
"coverImage": "https://uploads-ssl.webflow.com/63020a6ad41103e186d7416a/63020a6ad4110399b7d74176_1_E_KrzykTOVP-rKgo42CaBw.png",
39
+
"createdOn": "Wed Aug 17 2022 22:01:06 GMT+0000 (Coordinated Universal Time)",
40
+
"featured": false,
41
+
"itemId": "63020a6ad411032f38d741e3",
42
+
"publication": "Personal Blog",
43
+
"publicationUrl": "https://medium.com/@render_ghost",
44
+
"published": "Sat Jan 07 2017 00:00:00 GMT+0000 (Coordinated Universal Time)",
45
+
"publishedOn": "Sat Jun 24 2023 05:33:18 GMT+0000 (Coordinated Universal Time)",
46
+
"slug": "is-your-phone-harassing-you-with-constant-interruption-make-it-stop",
47
+
"subtitle": "How to take control of contant disruption and needless distractions to your improve focus and mental health.",
48
+
"title": "Is your phone harassing you with constant interruption? Make it stop.",
49
+
"updatedOn": "Sat Jun 24 2023 05:30:46 GMT+0000 (Coordinated Universal Time)"
50
+
},
51
+
{
52
+
"articleUrl": "https://medium.com/framer-prototyping/letting-the-country-be-its-own-map-d723b47b5ecc",
53
+
"collectionId": "63020a6ad411038554d74169",
54
+
"coverImage": "https://uploads-ssl.webflow.com/63020a6ad41103e186d7416a/63020a6ad411033642d74177_1_u9hU0I7uFYtE5SHZSt6eYw.png",
55
+
"createdOn": "Wed Aug 17 2022 21:59:15 GMT+0000 (Coordinated Universal Time)",
56
+
"featured": false,
57
+
"itemId": "63020a6ad411032c68d741e2",
58
+
"publication": "Framer",
59
+
"publicationUrl": "https://medium.com/framer-prototyping",
60
+
"published": "Wed Aug 24 2016 00:00:00 GMT+0000 (Coordinated Universal Time)",
61
+
"publishedOn": "Sat Jun 24 2023 05:33:18 GMT+0000 (Coordinated Universal Time)",
62
+
"slug": "letting-the-country-be-its-own-map",
63
+
"subtitle": "Imagining pattern design tools to build systems for the web.",
64
+
"title": "Letting the country be its own map.",
65
+
"updatedOn": "Sat Jun 24 2023 05:30:39 GMT+0000 (Coordinated Universal Time)"
66
+
},
67
+
{
68
+
"articleUrl": "https://bootcamp.uxdesign.cc/mastering-the-art-of-ai-collaboration-8eb422bb05ea",
69
+
"collectionId": "63020a6ad411038554d74169",
70
+
"coverImage": "https://uploads-ssl.webflow.com/63020a6ad41103e186d7416a/64967d6660567a7836f3d165_1_czo3tnQWPYd1dnyCKJBtgg.webp",
71
+
"createdOn": "Sat Jun 24 2023 05:22:06 GMT+0000 (Coordinated Universal Time)",
72
+
"featured": false,
73
+
"itemId": "64967d7e6cd6457bafdd1490",
74
+
"publication": "Bootcamp",
75
+
"publicationUrl": "https://bootcamp.uxdesign.cc/",
76
+
"published": "Thu Apr 20 2023 00:00:00 GMT+0000 (Coordinated Universal Time)",
77
+
"publishedOn": "Sat Jun 24 2023 05:33:18 GMT+0000 (Coordinated Universal Time)",
78
+
"slug": "mastering-the-art-of-ai-collaboration",
79
+
"subtitle": "Strategies for achieving the best possible outcomes.",
80
+
"title": "Mastering the art of AI collaboration",
81
+
"updatedOn": "Sat Jun 24 2023 05:22:06 GMT+0000 (Coordinated Universal Time)"
82
+
},
83
+
{
84
+
"articleUrl": "https://medium.com/@render_ghost/designer-know-your-place-c3fef11a19ce",
85
+
"collectionId": "63020a6ad411038554d74169",
86
+
"coverImage": "https://uploads-ssl.webflow.com/63020a6ad41103e186d7416a/64967fc360a0e31c39dbcbed_1_WMTOIoKHjWJQHyloR-qe7A.webp",
87
+
"createdOn": "Sat Jun 24 2023 05:32:19 GMT+0000 (Coordinated Universal Time)",
88
+
"featured": false,
89
+
"itemId": "64967fe339adcad38fce2cff",
90
+
"publication": "Personal Blog",
91
+
"publicationUrl": "https://medium.com/@render_ghost/",
92
+
"published": "Sat May 17 2014 00:00:00 GMT+0000 (Coordinated Universal Time)",
93
+
"publishedOn": "Sat Jun 24 2023 05:33:18 GMT+0000 (Coordinated Universal Time)",
94
+
"slug": "on-desire-paths",
95
+
"subtitle": "Where design decisions and user intentions collide.",
96
+
"title": "On desire paths.",
97
+
"updatedOn": "Sat Jun 24 2023 05:32:19 GMT+0000 (Coordinated Universal Time)"
98
+
},
99
+
{
100
+
"articleUrl": "https://bootcamp.uxdesign.cc/the-best-portfolio-is-one-that-gets-you-hired-part-1-storytelling-e139d2fd0f12",
101
+
"collectionId": "63020a6ad411038554d74169",
102
+
"coverImage": "https://uploads-ssl.webflow.com/63020a6ad41103e186d7416a/63020a6ad41103eb50d74174_1_7XFt1OirbPaGk8LOswnzvg.png",
103
+
"createdOn": "Wed Aug 17 2022 21:46:31 GMT+0000 (Coordinated Universal Time)",
104
+
"featured": true,
105
+
"itemId": "63020a6ad411031f43d741df",
106
+
"publication": "BootCamp",
107
+
"publicationUrl": "https://bootcamp.uxdesign.cc/",
108
+
"published": "Tue Mar 15 2022 00:00:00 GMT+0000 (Coordinated Universal Time)",
109
+
"publishedOn": "Sat Jun 24 2023 05:37:07 GMT+0000 (Coordinated Universal Time)",
110
+
"slug": "the-best-portfolio-is-one-that-gets-you-hired-part-1-storytelling",
111
+
"subtitle": "Morressier’s product design team explains how to tell an authentic and compelling story about yourself and use your portfolio to get the design roles you want.",
112
+
"title": "The best portfolio is one that gets you hired — Part 1: Storytelling",
113
+
"updatedOn": "Sat Jun 24 2023 05:36:09 GMT+0000 (Coordinated Universal Time)"
114
+
},
115
+
{
116
+
"articleUrl": "https://medium.com/@render_ghost/the-best-portfolio-is-one-that-gets-you-hired-part-2-curation-20ab27697344",
117
+
"collectionId": "63020a6ad411038554d74169",
118
+
"coverImage": "https://uploads-ssl.webflow.com/63020a6ad41103e186d7416a/63020a6ad41103f3bed74173_1_fJlYbqN21frh7S9UmMOPrg.png",
119
+
"createdOn": "Wed Aug 17 2022 21:47:58 GMT+0000 (Coordinated Universal Time)",
120
+
"featured": false,
121
+
"itemId": "63020a6ad411031539d741e0",
122
+
"publication": "Bootcamp",
123
+
"publicationUrl": "https://bootcamp.uxdesign.cc/",
124
+
"published": "Tue Mar 15 2022 00:00:00 GMT+0000 (Coordinated Universal Time)",
125
+
"publishedOn": "Sat Jun 24 2023 05:33:18 GMT+0000 (Coordinated Universal Time)",
126
+
"slug": "the-best-portfolio-is-one-that-gets-you-hired-part-2-curation",
127
+
"subtitle": "Morressier’s product design team explains how to curate and organise your portfolio to get the design roles you want.",
128
+
"title": "The best portfolio is one that gets you hired — Part 2: Curation",
129
+
"updatedOn": "Sat Jun 24 2023 05:28:20 GMT+0000 (Coordinated Universal Time)"
130
+
},
131
+
{
132
+
"articleUrl": "https://medium.com/@render_ghost/the-prophetic-lens-of-pixars-wall-e-1be009f5f11f",
133
+
"collectionId": "63020a6ad411038554d74169",
134
+
"coverImage": "https://uploads-ssl.webflow.com/63020a6ad41103e186d7416a/64967d1b0b2841f15cf9ca6b_0_aeGW0t1ySAxAywPr.webp",
135
+
"createdOn": "Sat Jun 24 2023 05:20:50 GMT+0000 (Coordinated Universal Time)",
136
+
"featured": false,
137
+
"itemId": "64967d320b2841f15cf9d42d",
138
+
"publication": "Personal Blog",
139
+
"publicationUrl": "https://medium.com/@render_ghost",
140
+
"published": "Fri May 19 2023 00:00:00 GMT+0000 (Coordinated Universal Time)",
141
+
"publishedOn": "Sat Jun 24 2023 05:33:18 GMT+0000 (Coordinated Universal Time)",
142
+
"slug": "the-prophetic-lens-of-pixars-wall-e",
143
+
"subtitle": "A Dystopian Parable about the Inevitable Future of Humanity.",
144
+
"title": "The Prophetic Lens of Pixar’s Wall-E",
145
+
"updatedOn": "Sat Jun 24 2023 05:20:50 GMT+0000 (Coordinated Universal Time)"
146
+
},
147
+
{
148
+
"articleUrl": "https://medium.com/@render_ghost/the-town-square-is-on-fire-please-disperse-and-return-to-the-safety-of-your-homes-abb98792a7ce",
149
+
"collectionId": "63020a6ad411038554d74169",
150
+
"coverImage": "https://uploads-ssl.webflow.com/63020a6ad41103e186d7416a/64967e9fb42c05721c619737_0_SVKvUVnOXh1rD8Zc.webp",
151
+
"createdOn": "Sat Jun 24 2023 05:27:15 GMT+0000 (Coordinated Universal Time)",
152
+
"featured": false,
153
+
"itemId": "64967eb340c50cc3a62d9bd3",
154
+
"publication": "Personal Blog",
155
+
"publicationUrl": "https://medium.com/@render_ghost/",
156
+
"published": "Sat Nov 19 2022 00:00:00 GMT+0000 (Coordinated Universal Time)",
157
+
"publishedOn": "Sat Jun 24 2023 05:33:18 GMT+0000 (Coordinated Universal Time)",
158
+
"slug": "the-town-square-is-on-fire-please-disperse-and-return-to-the-safety-of-your-homes",
159
+
"subtitle": "Now that we’re living through Twitter’s nosedive at the hands of the world’s smartest dumb-ass, many of us are reasonably debating where to go next.",
160
+
"title": "The town square is on fire. Please disperse, and return to the safety of your homes.",
161
+
"updatedOn": "Sat Jun 24 2023 05:27:15 GMT+0000 (Coordinated Universal Time)"
162
+
},
163
+
{
164
+
"articleUrl": "https://bootcamp.uxdesign.cc/why-job-posts-fail-to-attract-and-engage-top-design-talent-spoilers-theyre-so-so-so-incredibly-e1d8e0b34b53",
165
+
"collectionId": "63020a6ad411038554d74169",
166
+
"coverImage": "https://uploads-ssl.webflow.com/63020a6ad41103e186d7416a/64967dc4c5714ebd7a33a673_1_tmH_zNYh_xww0GYxcbz1yA.webp",
167
+
"createdOn": "Sat Jun 24 2023 05:23:41 GMT+0000 (Coordinated Universal Time)",
168
+
"featured": false,
169
+
"itemId": "64967ddd60567a7836f419cc",
170
+
"publication": "Bootcamp",
171
+
"publicationUrl": "https://bootcamp.uxdesign.cc/",
172
+
"published": "Sat Mar 18 2023 00:00:00 GMT+0000 (Coordinated Universal Time)",
173
+
"publishedOn": "Sat Jun 24 2023 05:37:07 GMT+0000 (Coordinated Universal Time)",
174
+
"slug": "why-job-posts-fail-to-attract-and-engage-top-design-talent-spoilers-theyre-so-so-so-incredibly-boring",
175
+
"subtitle": "Write engaging job posts that connect with valuable design candidates and don't put them to sleep.",
176
+
"title": "Why job posts fail to attract and engage top design talent (spoilers: they’re so so so incredibly boring)",
177
+
"updatedOn": "Sat Jun 24 2023 05:36:57 GMT+0000 (Coordinated Universal Time)"
178
+
},
179
+
{
180
+
"articleUrl": "https://bootcamp.uxdesign.cc/your-boss-was-right-to-not-support-your-design-project-ffc6bb956893",
181
+
"collectionId": "63020a6ad411038554d74169",
182
+
"coverImage": "https://uploads-ssl.webflow.com/63020a6ad41103e186d7416a/649823e10fdcb656eae7e365_boss.png",
183
+
"createdOn": "Sat Jun 24 2023 05:25:05 GMT+0000 (Coordinated Universal Time)",
184
+
"featured": true,
185
+
"itemId": "64967e31860a8ebaefea7843",
186
+
"publication": "Bootcamp",
187
+
"publicationUrl": "https://bootcamp.uxdesign.cc/",
188
+
"published": "Sat Mar 11 2023 00:00:00 GMT+0000 (Coordinated Universal Time)",
189
+
"publishedOn": "Sun Jun 25 2023 11:26:35 GMT+0000 (Coordinated Universal Time)",
190
+
"slug": "your-boss-was-probably-right-not-to-support-your-design-ideas",
191
+
"subtitle": "Business leaders don't care about design, and that's a good thing.",
192
+
"title": "Your boss was probably right not to support your design ideas.",
193
+
"updatedOn": "Sun Jun 25 2023 11:24:47 GMT+0000 (Coordinated Universal Time)"
194
+
}
195
+
],
196
+
"caseStudies": [
197
+
{
198
+
"body": "<p id=\"\">Maecenas faucibus mollis interdum. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam quis risus eget urna mollis ornare vel eu leo. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed posuere consectetur est at lobortis. Etiam porta sem malesuada magna mollis euismod.</p><p id=\"\">Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Etiam porta sem malesuada magna mollis euismod. Curabitur blandit tempus porttitor. Curabitur blandit tempus porttitor.</p>",
199
+
"collectionId": "63020a6ad411031c64d74168",
200
+
"company": "brandwatch",
201
+
"coverImage": "https://uploads-ssl.webflow.com/63020a6ad41103e186d7416a/64a11cd365d155b164b5a017_hero--19.svg",
202
+
"createdOn": "Sun Mar 19 2023 14:20:07 GMT+0000 (Coordinated Universal Time)",
203
+
"endDate": "Mon Oct 31 2016 00:00:00 GMT+0000 (Coordinated Universal Time)",
204
+
"itemId": "64171a179f12e0f16aed2556",
205
+
"name": "Democratising insightful decision making across organisations",
206
+
"pitchEmbed": "5176aa05-c687-4582-9b81-344dc9944a38",
207
+
"publishedOn": "Fri May 24 2024 11:51:23 GMT+0000 (Coordinated Universal Time)",
208
+
"relevantSkills": [
209
+
"data-visualization",
210
+
"design-strategy",
211
+
"interaction-design",
212
+
"interface-design",
213
+
"internet-of-things",
214
+
"product-design",
215
+
"rapid-prototyping",
216
+
"stakeholder-engagement",
217
+
"usability-testing"
218
+
],
219
+
"role": "senior-ux-designer-brandwatch",
220
+
"slug": "brandwatch-vizia",
221
+
"summary": "Cras mattis consectetur purus sit amet fermentum.",
222
+
"type": "product-design",
223
+
"updatedOn": "Fri May 24 2024 11:42:02 GMT+0000 (Coordinated Universal Time)"
224
+
},
225
+
{
226
+
"body": "",
227
+
"collectionId": "63020a6ad411031c64d74168",
228
+
"company": "mygoodplanet",
229
+
"coverImage": "https://uploads-ssl.webflow.com/63020a6ad41103e186d7416a/64a085ac08379c1910b65581_22.png",
230
+
"createdOn": "Mon Jun 26 2023 12:09:36 GMT+0000 (Coordinated Universal Time)",
231
+
"endDate": "Wed Jul 31 2019 00:00:00 GMT+0000 (Coordinated Universal Time)",
232
+
"itemId": "64998000362d4092f139d994",
233
+
"name": "Defining the product strategy for eco shopping",
234
+
"pitchEmbed": "sdf",
235
+
"publishedOn": "Fri May 24 2024 11:51:23 GMT+0000 (Coordinated Universal Time)",
236
+
"relevantSkills": [
237
+
""
238
+
],
239
+
"role": "design-director-mgp",
240
+
"slug": "defining-the-product-strategy-for-eco-shopping",
241
+
"summary": "Sed posuere consectetur est at lobortis. Sed posuere consectetur est at lobortis. Nullam quis risus eget urna mollis ornare vel eu leo. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Donec ullamcorper nulla non metus auctor fringilla.",
242
+
"type": "design-strategy",
243
+
"updatedOn": "Fri May 24 2024 11:40:49 GMT+0000 (Coordinated Universal Time)"
244
+
},
245
+
{
246
+
"body": "",
247
+
"collectionId": "63020a6ad411031c64d74168",
248
+
"company": "morressier",
249
+
"coverImage": "https://uploads-ssl.webflow.com/63020a6ad41103e186d7416a/64a11cb6c1bfe86c75f70982_hero--20.svg",
250
+
"createdOn": "Mon Jun 26 2023 12:08:56 GMT+0000 (Coordinated Universal Time)",
251
+
"endDate": "Wed Mar 31 2021 00:00:00 GMT+0000 (Coordinated Universal Time)",
252
+
"itemId": "64997fd84e68f4e3552d1f17",
253
+
"name": "Improving the recruitment experience for Design candidates",
254
+
"pitchEmbed": "sdf",
255
+
"publishedOn": "Fri May 24 2024 11:51:23 GMT+0000 (Coordinated Universal Time)",
256
+
"relevantSkills": [
257
+
""
258
+
],
259
+
"role": "lead-product-designer-morressier",
260
+
"slug": "improving-the-recruitment-experience-for-design-candidates",
261
+
"summary": "Sed posuere consectetur est at lobortis. Sed posuere consectetur est at lobortis. Nullam quis risus eget urna mollis ornare vel eu leo. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Donec ullamcorper nulla non metus auctor fringilla.",
262
+
"type": "design-operations",
263
+
"updatedOn": "Fri May 24 2024 11:41:28 GMT+0000 (Coordinated Universal Time)"
264
+
},
265
+
{
266
+
"body": "",
267
+
"collectionId": "63020a6ad411031c64d74168",
268
+
"company": "morressier",
269
+
"coverImage": "https://uploads-ssl.webflow.com/63020a6ad41103e186d7416a/64a11cff7c06a4e2d7ca8c39_hero--27.svg",
270
+
"createdOn": "Sun Aug 07 2022 11:48:45 GMT+0000 (Coordinated Universal Time)",
271
+
"endDate": "Mon Oct 31 2022 00:00:00 GMT+0000 (Coordinated Universal Time)",
272
+
"itemId": "63020a6ad411030b7cd741da",
273
+
"name": "Building a professional community for scientists",
274
+
"pitchEmbed": "dg",
275
+
"publishedOn": "Fri May 24 2024 11:51:23 GMT+0000 (Coordinated Universal Time)",
276
+
"relevantSkills": [
277
+
""
278
+
],
279
+
"role": "lead-product-designer-morressier",
280
+
"slug": "morressier-discovery",
281
+
"summary": "Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vestibulum id ligula porta felis euismod semper. Sed posuere consectetur est at lobortis. Praesent commodo cursus magna, vel scelerisque nisl consectetur et.",
282
+
"type": "product-design",
283
+
"updatedOn": "Fri May 24 2024 11:48:37 GMT+0000 (Coordinated Universal Time)"
284
+
},
285
+
{
286
+
"body": "",
287
+
"collectionId": "63020a6ad411031c64d74168",
288
+
"company": "leo-pharma",
289
+
"coverImage": "https://uploads-ssl.webflow.com/63020a6ad41103e186d7416a/634435bbf7d7aa6d7edaaf9b_02.svg",
290
+
"createdOn": "Sun Aug 07 2022 10:24:08 GMT+0000 (Coordinated Universal Time)",
291
+
"endDate": "Thu Oct 31 2019 00:00:00 GMT+0000 (Coordinated Universal Time)",
292
+
"itemId": "63020a6ad41103867dd741de",
293
+
"name": "Designing dermatology as a digital service",
294
+
"pitchEmbed": "0db6241a-42c5-49f0-b4bf-e94e6809fbdd",
295
+
"publishedOn": "Fri May 24 2024 11:51:23 GMT+0000 (Coordinated Universal Time)",
296
+
"relevantSkills": [
297
+
""
298
+
],
299
+
"role": "principal-product-designer-leo",
300
+
"slug": "ohmu",
301
+
"summary": "Sed posuere consectetur est at lobortis. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Etiam porta sem malesuada magna mollis euismod. Donec id elit non mi porta gravida at eget metus. Cras mattis consectetur purus sit amet fermentum.",
302
+
"type": "product-design",
303
+
"updatedOn": "Fri May 24 2024 11:48:07 GMT+0000 (Coordinated Universal Time)"
304
+
},
305
+
{
306
+
"body": "",
307
+
"collectionId": "63020a6ad411031c64d74168",
308
+
"company": "morressier",
309
+
"coverImage": "https://uploads-ssl.webflow.com/63020a6ad41103e186d7416a/64a11d0b81b40a3acc12f5f4_hero--13.svg",
310
+
"createdOn": "Sun Aug 07 2022 11:48:13 GMT+0000 (Coordinated Universal Time)",
311
+
"endDate": "Fri Sep 30 2022 00:00:00 GMT+0000 (Coordinated Universal Time)",
312
+
"itemId": "63020a6ad411033f4fd741dd",
313
+
"name": "Scaling product design feedback",
314
+
"pitchEmbed": "sdg",
315
+
"publishedOn": "Fri May 24 2024 11:51:23 GMT+0000 (Coordinated Universal Time)",
316
+
"relevantSkills": [
317
+
""
318
+
],
319
+
"role": "lead-product-designer-morressier",
320
+
"slug": "scaling-design-feedback",
321
+
"summary": "Sed posuere consectetur est at lobortis. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Etiam porta sem malesuada magna mollis euismod. Donec id elit non mi porta gravida at eget metus. Cras mattis consectetur purus sit amet fermentum.",
322
+
"type": "design-operations",
323
+
"updatedOn": "Fri May 24 2024 11:47:28 GMT+0000 (Coordinated Universal Time)"
324
+
},
325
+
{
326
+
"body": "<blockquote id=\"\">Curabitur blandit tempus porttitor. Donec id elit non mi porta gravida at eget metus. Donec ullamcorper nulla non metus auctor fringilla. Etiam porta sem malesuada magna mollis euismod. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Vestibulum id ligula porta felis euismod semper.</blockquote><p id=\"\"></p>",
327
+
"collectionId": "63020a6ad411031c64d74168",
328
+
"company": "morressier",
329
+
"coverImage": "https://uploads-ssl.webflow.com/63020a6ad41103e186d7416a/64a11ce66265165d6d6150e8_hero--18.svg",
330
+
"createdOn": "Sun Aug 14 2022 08:44:05 GMT+0000 (Coordinated Universal Time)",
331
+
"endDate": "Tue Apr 30 2024 00:00:00 GMT+0000 (Coordinated Universal Time)",
332
+
"itemId": "63020a6ad411035a50d741dc",
333
+
"name": "Scaling a platform design system",
334
+
"pitchEmbed": "d60a06f5-7b62-4589-9eae-e1b5dc6da624",
335
+
"publishedOn": "Fri May 24 2024 11:51:23 GMT+0000 (Coordinated Universal Time)",
336
+
"relevantSkills": [
337
+
"accessibility",
338
+
"design-leadership",
339
+
"design-operations",
340
+
"design-systems",
341
+
"design-strategy",
342
+
"interaction-design",
343
+
"interface-design",
344
+
"usability-testing"
345
+
],
346
+
"role": "staff-product-designer-morressier",
347
+
"slug": "scaling-morressier-design-system",
348
+
"summary": "Maecenas faucibus mollis interdum. Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget metus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas sed diam eget risus varius blandit sit amet non magna. Nullam quis risus eget urna mollis ornare vel eu leo. Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
349
+
"type": "design-operations",
350
+
"updatedOn": "Fri May 24 2024 11:42:26 GMT+0000 (Coordinated Universal Time)"
351
+
},
352
+
{
353
+
"body": "<p id=\"\">When EDF Energy, a global leader serving over 3.5 million UK households, approached me to helm the design of Circuits, I knew it was a chance to create something extraordinary. Circuits would become a pioneering omni-channel platform empowering millions of customers to revolutionize their relationship with energy.</p><p>I had just completed 6 months working on some Service Design work for the Customer division, and was excited to join the BlueLab, their internal startup accelerator working with founders and technology partners to support innovation in the energy and connected home space.</p><p>Our insights informed the major investments by Customer division across energy and device sales, billing and customer support.</p><p id=\"\"><em>Incredibly</em>, in just 12 months after the major launch of, we surpased our goals, achieving:</p><p id=\"\">- 15% reduction in cost-to-serve, saving £3m annually <br>- 25% increase in resolved complaints, restoring trust for 150,000+ homes<br>- 12% reduction in bad debt, recovering £15.6m in the first year alone</p><h2 id=\"\">Relentless Customer Focus: Understanding the Human Impact</h2><p id=\"\">To reshape an industry, you must first understand its beating heart: the customers. I led an ambitious research program to map the depths of the customer experience:</p><p id=\"\">- Surveyed 500 households to quantify needs, attitudes and pain points<br>- Conducted 30 in-home ethnographic interviews to intimately understand customer journeys<br>- Analyzed dozens of competitors across energy, finance and home services to uncover opportunities for radical differentiation</p><p id=\"\">Through this rigorous discovery process, we uncovered patterns of human stories behind EDF's challenges: worried families struggling to interpret bills, confused customers dreading impersonal call centers, households craving control over rising costs. These insights fueled our resolve to drive a greater change.</p><h2 id=\"\">Painting an Ambitious Vision</h2><p id=\"\">Armed with deep customer empathy, I worked with Product Management to build out a bold vision and strategyfor Circuits to rally my team and stakeholders:</p><blockquote id=\"\">We will create the experience customers have been dreaming of: empowering them with beautifully simple tools to achieve a new level of confidence and control over their energy. We won't rest until we've transformed energy from a source of stress to an effortless ally in creating better lives.</blockquote><p id=\"\">To paint a vivid path forward, I delivered:<br>- Meticulously redesigned customer journeys across web, mobile, call-center and in-home touchpoints <br>- Comprehensive service blueprints aligning frontend experiences with backend operations<br>- Inspiring product roadmaps balancing customer delight, business value and technical feasibility</p><p id=\"\">### Accelerating Innovation Through Rapid Experimentation</p><p id=\"\">To maintain a blistering pace under towering ambiguity, I pioneered a culture of ruthless experimentation and validated learning cycles:</p><p id=\"\">- Launched unbranded landing pages to test demand for key features, generating a 35% increase in lead conversion<br>- Prototyped energy-saving chatbots on WhatsApp and Alexa, uncovering a 10X increase in customer engagement <br>- Designed and shipped a 3-month trial of physical Energy Tip Cards to 5,000 homes, yielding a 7% reduction in monthly usage</p><p id=\"\">By treating every step forward as a measurable learning opportunity , we could engage safely with riskier propositions and ensure every recommendation delivered to the Customer business was grounded in real customer value.</p><h2 id=\"\">Leading with Resilience and Ingenuity</h2><p id=\"\">Rewiring a legacy organization and industry was never going to be easy. When our initial assumptions failed or constraints changed, I led with poise and creative determination. </p><p id=\"\">I reworked journey maps to close gaps between customer needs and business capabilities. I guided engineers to cleverly phase technical architecture to unblock early customer value. When morale flagged, I evangelized user-centricity, turning skeptics into champions.</p><p id=\"\">### A Platform for Transformation</p><p id=\"\">Circuits has ignited a customer-obsessed revolution within EDF and across the energy industry. My team didn't just craft a groundbreaking product - we equipped an organization to continuously innovate around customer needs.</p><p id=\"\">I'm immensely proud of the design leadership, resilience and vision I brought to this ambitious undertaking. Circuits is so much more than pixels and code - it's a platform for transforming millions of lives. And we're only getting started.</p><p></p>",
354
+
"collectionId": "63020a6ad411031c64d74168",
355
+
"company": "edf-energy",
356
+
"coverImage": "https://uploads-ssl.webflow.com/63020a6ad41103e186d7416a/6493d6f335cf63e96965c570_15.svg",
357
+
"createdOn": "Wed Aug 10 2022 09:44:10 GMT+0000 (Coordinated Universal Time)",
358
+
"endDate": "Wed May 08 2019 00:00:00 GMT+0000 (Coordinated Universal Time)",
359
+
"itemId": "63020a6ad4110313b7d741db",
360
+
"name": "Reducing energy waste at home",
361
+
"pitchEmbed": "e633669d-7e72-4a31-a99e-e282c7bf96a8",
362
+
"publishedOn": "Fri May 24 2024 11:51:23 GMT+0000 (Coordinated Universal Time)",
363
+
"relevantSkills": [
364
+
""
365
+
],
366
+
"role": "staff-service-designer-edf",
367
+
"slug": "smarter-energy",
368
+
"summary": "Sed posuere consectetur est at lobortis. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Etiam porta sem malesuada magna mollis euismod. Donec id elit non mi porta gravida at eget metus. Cras mattis consectetur purus sit amet fermentum.",
369
+
"type": "product-design",
370
+
"updatedOn": "Thu Aug 08 2024 17:35:28 GMT+0000 (Coordinated Universal Time)"
371
+
}
372
+
],
373
+
"companies": [
374
+
{
375
+
"city": "Brighton",
376
+
"collectionId": "6492fe188837ee33a22fed4d",
377
+
"country": "UK",
378
+
"createdOn": "Wed Jun 21 2023 14:11:24 GMT+0000 (Coordinated Universal Time)",
379
+
"industry": "Consumer Intelligence",
380
+
"itemId": "6493050c606e51cb999dc8ba",
381
+
"logo": "",
382
+
"name": "Brandwatch",
383
+
"publishedOn": "Sat Jun 24 2023 05:33:18 GMT+0000 (Coordinated Universal Time)",
384
+
"slug": "brandwatch",
385
+
"type": "B2B",
386
+
"updatedOn": "Sat Jun 24 2023 05:13:33 GMT+0000 (Coordinated Universal Time)",
387
+
"website": "https://www.brandwatch.com/"
388
+
},
389
+
{
390
+
"city": "Brighton",
391
+
"collectionId": "6492fe188837ee33a22fed4d",
392
+
"country": "UK",
393
+
"createdOn": "Wed Jun 21 2023 14:10:15 GMT+0000 (Coordinated Universal Time)",
394
+
"industry": "Energy Generation & Supply",
395
+
"itemId": "649304c7a2b9d1603236d4b8",
396
+
"logo": "",
397
+
"name": "EDF Energy",
398
+
"publishedOn": "Sat Jun 24 2023 05:33:18 GMT+0000 (Coordinated Universal Time)",
399
+
"slug": "edf-energy",
400
+
"type": "B2C",
401
+
"updatedOn": "Sat Jun 24 2023 05:13:42 GMT+0000 (Coordinated Universal Time)",
402
+
"website": "https://www.edfenergy.com/about/innovation/challenge"
403
+
},
404
+
{
405
+
"city": "London",
406
+
"collectionId": "6492fe188837ee33a22fed4d",
407
+
"country": "UK",
408
+
"createdOn": "Sat Jun 24 2023 05:04:33 GMT+0000 (Coordinated Universal Time)",
409
+
"industry": "Government",
410
+
"itemId": "649679613d19cea8ea2caf00",
411
+
"logo": "",
412
+
"name": "Home Office",
413
+
"publishedOn": "Sat Jun 24 2023 05:33:18 GMT+0000 (Coordinated Universal Time)",
414
+
"slug": "home-office",
415
+
"type": "",
416
+
"updatedOn": "Sat Jun 24 2023 05:10:39 GMT+0000 (Coordinated Universal Time)",
417
+
"website": "https://www.gov.uk/government/organisations/home-office"
418
+
},
419
+
{
420
+
"city": "Copenhagen",
421
+
"collectionId": "6492fe188837ee33a22fed4d",
422
+
"country": "Denmark",
423
+
"createdOn": "Wed Jun 21 2023 13:48:14 GMT+0000 (Coordinated Universal Time)",
424
+
"industry": "Pharmaceutical",
425
+
"itemId": "6492ff9e1cb5762c2192da9a",
426
+
"logo": "",
427
+
"name": "LEO Pharma",
428
+
"publishedOn": "Sat Jun 24 2023 05:33:18 GMT+0000 (Coordinated Universal Time)",
429
+
"slug": "leo-pharma",
430
+
"type": "B2C",
431
+
"updatedOn": "Sat Jun 24 2023 05:13:52 GMT+0000 (Coordinated Universal Time)",
432
+
"website": "https://www.leo-pharma.com/"
433
+
},
434
+
{
435
+
"city": "Brighton",
436
+
"collectionId": "6492fe188837ee33a22fed4d",
437
+
"country": "UK",
438
+
"createdOn": "Sat Jun 24 2023 05:02:38 GMT+0000 (Coordinated Universal Time)",
439
+
"industry": "Video games",
440
+
"itemId": "649678eee54dbd7686a713a3",
441
+
"logo": "",
442
+
"name": "MediaTonic",
443
+
"publishedOn": "Sat Jun 24 2023 05:33:18 GMT+0000 (Coordinated Universal Time)",
444
+
"slug": "mediatonic",
445
+
"type": "B2B",
446
+
"updatedOn": "Sat Jun 24 2023 05:13:18 GMT+0000 (Coordinated Universal Time)",
447
+
"website": "https://mediatonicgames.com/"
448
+
},
449
+
{
450
+
"city": "Berlin",
451
+
"collectionId": "6492fe188837ee33a22fed4d",
452
+
"country": "Germany",
453
+
"createdOn": "Wed Jun 21 2023 14:08:43 GMT+0000 (Coordinated Universal Time)",
454
+
"industry": "Scientific Publishing",
455
+
"itemId": "6493046b403abc6e1ca59032",
456
+
"logo": "",
457
+
"name": "Morressier",
458
+
"publishedOn": "Sat Jun 24 2023 05:33:18 GMT+0000 (Coordinated Universal Time)",
459
+
"slug": "morressier",
460
+
"type": "B2B",
461
+
"updatedOn": "Sat Jun 24 2023 05:13:48 GMT+0000 (Coordinated Universal Time)",
462
+
"website": "https://www.morressier.com/"
463
+
},
464
+
{
465
+
"city": "Dublin",
466
+
"collectionId": "6492fe188837ee33a22fed4d",
467
+
"country": "Ireland",
468
+
"createdOn": "Sat Jun 24 2023 05:08:57 GMT+0000 (Coordinated Universal Time)",
469
+
"industry": "Publishing",
470
+
"itemId": "64967a690b2841f15cf81353",
471
+
"logo": "",
472
+
"name": "MyGoodPlanet",
473
+
"publishedOn": "Sat Jun 24 2023 05:33:18 GMT+0000 (Coordinated Universal Time)",
474
+
"slug": "mygoodplanet",
475
+
"type": "B2C",
476
+
"updatedOn": "Sat Jun 24 2023 05:13:01 GMT+0000 (Coordinated Universal Time)",
477
+
"website": ""
478
+
},
479
+
{
480
+
"city": "Brighton",
481
+
"collectionId": "6492fe188837ee33a22fed4d",
482
+
"country": "UK",
483
+
"createdOn": "Sat Jun 24 2023 04:58:51 GMT+0000 (Coordinated Universal Time)",
484
+
"industry": "Video games",
485
+
"itemId": "6496780b1624e29a27b7ecbc",
486
+
"logo": "",
487
+
"name": "Relentless Software",
488
+
"publishedOn": "Sat Jun 24 2023 05:33:18 GMT+0000 (Coordinated Universal Time)",
489
+
"slug": "relentless-software",
490
+
"type": "B2B",
491
+
"updatedOn": "Sat Jun 24 2023 05:13:28 GMT+0000 (Coordinated Universal Time)",
492
+
"website": "http://www.relentless.co.uk/"
493
+
},
494
+
{
495
+
"city": "Brighton",
496
+
"collectionId": "6492fe188837ee33a22fed4d",
497
+
"country": "UK",
498
+
"createdOn": "Sat Jun 24 2023 05:10:02 GMT+0000 (Coordinated Universal Time)",
499
+
"industry": "Marketing Automation",
500
+
"itemId": "64967aaa860a8ebaefe69a00",
501
+
"logo": "",
502
+
"name": "Scenestealer",
503
+
"publishedOn": "Sat Jun 24 2023 05:33:18 GMT+0000 (Coordinated Universal Time)",
504
+
"slug": "scenestealer",
505
+
"type": "B2B",
506
+
"updatedOn": "Sat Jun 24 2023 05:12:55 GMT+0000 (Coordinated Universal Time)",
507
+
"website": "http://www.scenestealer.tv/"
508
+
},
509
+
{
510
+
"city": "London",
511
+
"collectionId": "6492fe188837ee33a22fed4d",
512
+
"country": "UK",
513
+
"createdOn": "Sat Jun 24 2023 05:00:41 GMT+0000 (Coordinated Universal Time)",
514
+
"industry": "Energy Services & Equipment",
515
+
"itemId": "64967879aace6d8ddffd0060",
516
+
"logo": "",
517
+
"name": "Schlumberger",
518
+
"publishedOn": "Sat Jun 24 2023 05:33:18 GMT+0000 (Coordinated Universal Time)",
519
+
"slug": "schlumberger",
520
+
"type": "B2B",
521
+
"updatedOn": "Sat Jun 24 2023 05:13:23 GMT+0000 (Coordinated Universal Time)",
522
+
"website": "https://www.software.slb.com/"
523
+
},
524
+
{
525
+
"city": "Brighton",
526
+
"collectionId": "6492fe188837ee33a22fed4d",
527
+
"country": "UK",
528
+
"createdOn": "Sat Jun 24 2023 05:07:10 GMT+0000 (Coordinated Universal Time)",
529
+
"industry": "Marketing Automation",
530
+
"itemId": "649679fe246701a71ce9d1a4",
531
+
"logo": "",
532
+
"name": "Spotler",
533
+
"publishedOn": "Sat Jun 24 2023 05:33:18 GMT+0000 (Coordinated Universal Time)",
534
+
"slug": "spotler",
535
+
"type": "B2B",
536
+
"updatedOn": "Sat Jun 24 2023 05:13:06 GMT+0000 (Coordinated Universal Time)",
537
+
"website": "https://spotler.co.uk/"
538
+
}
539
+
],
540
+
"jobs": [
541
+
{
542
+
"caseStudies": [
543
+
"defining-the-product-strategy-for-eco-shopping"
544
+
],
545
+
"client": "MyGoodPlanet",
546
+
"collectionId": "63020a6ad41103ed37d74166",
547
+
"company": "mygoodplanet",
548
+
"cover": "",
549
+
"createdOn": "Sun Aug 07 2022 08:21:28 GMT+0000 (Coordinated Universal Time)",
550
+
"employmentType": "Contract",
551
+
"endDate": "Sun Jul 07 2019 00:00:00 GMT+0000 (Coordinated Universal Time)",
552
+
"itemId": "63020a6ad41103c60ed74185",
553
+
"jobDescription": "As interim design director at MyGoodPlanet, I helped set the company's design strategy, grow and guide the product design team, and establish scalable UX practices and operations as they pivoted from news publishing to e-commerce.",
554
+
"jobTitle": "Design Director (Consulting)",
555
+
"publishedOn": "Sun Jul 02 2023 00:47:22 GMT+0000 (Coordinated Universal Time)",
556
+
"skills": [
557
+
"team-management",
558
+
"design-leadership",
559
+
"design-operations",
560
+
"design-strategy",
561
+
"design-systems",
562
+
"stakeholder-engagement",
563
+
"rapid-prototyping",
564
+
"product-design",
565
+
"persuasive-communication",
566
+
"people-management",
567
+
"journey-mapping",
568
+
"digital-transformation",
569
+
"design-thinking"
570
+
],
571
+
"slug": "design-director-mgp",
572
+
"startDate": "Sat Jul 07 2018 00:00:00 GMT+0000 (Coordinated Universal Time)",
573
+
"updatedOn": "Sun Jul 02 2023 00:31:07 GMT+0000 (Coordinated Universal Time)",
574
+
"userNeed": "Supporting environmentally conscious shoppers to make informed and sustainable shopping decisions."
575
+
},
576
+
{
577
+
"caseStudies": [
578
+
"scaling-morressier-design-system",
579
+
"scaling-design-feedback",
580
+
"improving-the-recruitment-experience-for-design-candidates"
581
+
],
582
+
"client": "Morressier",
583
+
"collectionId": "63020a6ad41103ed37d74166",
584
+
"company": "morressier",
585
+
"cover": "",
586
+
"createdOn": "Sun Aug 07 2022 08:21:28 GMT+0000 (Coordinated Universal Time)",
587
+
"employmentType": "Full-time",
588
+
"endDate": "Fri Sep 09 2022 00:00:00 GMT+0000 (Coordinated Universal Time)",
589
+
"itemId": "63020a6ad4110350e1d74183",
590
+
"jobDescription": "As the lead designer, I worked with product managers, engineers, data scientists and customer stakeholders to research and design new features for attending hybrid academic events, publishing conference proceedings, networking with peers and discovering the latest research. I also supported product design strategy, led and scaled the design team, supported professional development, matured UX design practices and improved agile development processes.",
591
+
"jobTitle": "Lead Product Designer",
592
+
"publishedOn": "Sun Jul 02 2023 00:47:22 GMT+0000 (Coordinated Universal Time)",
593
+
"skills": [
594
+
"agile-methodologies",
595
+
"team-management",
596
+
"content-design",
597
+
"data-visualisation",
598
+
"design-leadership",
599
+
"design-methodologies",
600
+
"design-operations",
601
+
"design-strategy",
602
+
"design-systems",
603
+
"design-thinking",
604
+
"information-architecture",
605
+
"interaction-design",
606
+
"interface-design",
607
+
"journey-mapping",
608
+
"lean-ux",
609
+
"people-management",
610
+
"persuasive-communication",
611
+
"product-design",
612
+
"rapid-prototyping",
613
+
"stakeholder-engagement",
614
+
"usability-testing",
615
+
"ux-research",
616
+
"accessibility"
617
+
],
618
+
"slug": "lead-product-designer-morressier",
619
+
"startDate": "Thu Oct 10 2019 00:00:00 GMT+0000 (Coordinated Universal Time)",
620
+
"updatedOn": "Sun Jul 02 2023 00:38:48 GMT+0000 (Coordinated Universal Time)",
621
+
"userNeed": "Enabling scientific communities, institutions and publishers to better create, discover and share research."
622
+
},
623
+
{
624
+
"caseStudies": [
625
+
"smarter-energy"
626
+
],
627
+
"client": "XXXXXXXX",
628
+
"collectionId": "63020a6ad41103ed37d74166",
629
+
"company": "edf-energy",
630
+
"cover": "",
631
+
"createdOn": "Fri Mar 17 2023 01:44:44 GMT+0000 (Coordinated Universal Time)",
632
+
"employmentType": "Contract",
633
+
"endDate": "Sat Feb 02 2019 00:00:00 GMT+0000 (Coordinated Universal Time)",
634
+
"itemId": "6413c60c14fcdd15827c96a7",
635
+
"jobDescription": "As principal product designer for EDF Energy's innovation lab working on the Smart Energy initiative, I worked with engineers, business development managers and startup founders to research, design and launch experimental web, mobile and hardware products for energy usage monitoring, disambiguation, waste reduction and automation for residential bill-payers.",
636
+
"jobTitle": "Principal Product Designer",
637
+
"publishedOn": "Sun Jul 02 2023 00:47:22 GMT+0000 (Coordinated Universal Time)",
638
+
"skills": [
639
+
"agile-methodologies",
640
+
"data-visualization",
641
+
"design-leadership",
642
+
"design-strategy",
643
+
"interaction-design",
644
+
"interface-design",
645
+
"internet-of-things",
646
+
"journey-mapping",
647
+
"product-design",
648
+
"rapid-prototyping",
649
+
"stakeholder-engagement",
650
+
"usability-testing",
651
+
"ux-research"
652
+
],
653
+
"slug": "principal-product-designer-edf",
654
+
"startDate": "Sat Sep 09 2017 00:00:00 GMT+0000 (Coordinated Universal Time)",
655
+
"updatedOn": "Sun Jul 02 2023 00:31:32 GMT+0000 (Coordinated Universal Time)",
656
+
"userNeed": "Helping residential bill-payers better understand and manage their energy consumption."
657
+
},
658
+
{
659
+
"caseStudies": [
660
+
"ohmu"
661
+
],
662
+
"client": "XXXXXXXX",
663
+
"collectionId": "63020a6ad41103ed37d74166",
664
+
"company": "leo-pharma",
665
+
"cover": "",
666
+
"createdOn": "Sun Aug 07 2022 08:21:28 GMT+0000 (Coordinated Universal Time)",
667
+
"employmentType": "Contract",
668
+
"endDate": "Thu Oct 10 2019 00:00:00 GMT+0000 (Coordinated Universal Time)",
669
+
"itemId": "63020a6ad411039d28d74187",
670
+
"jobDescription": "As Principal Product Designer at LEO Pharma's Innovation Lab, I collaborated with dermatologists, ethnographers, data scientists and patients to research and design experimental medical devices that use computer vision and machine learning technologies to diagnose skin conditions and provide timely, relevant and actionable treatment advice.",
671
+
"jobTitle": "Principal Product Designer",
672
+
"publishedOn": "Sun Jun 25 2023 06:48:40 GMT+0000 (Coordinated Universal Time)",
673
+
"skills": [
674
+
"accessibility",
675
+
"agile-methodologies",
676
+
"design-leadership",
677
+
"design-methodologies",
678
+
"design-strategy",
679
+
"design-systems",
680
+
"interaction-design",
681
+
"interface-design",
682
+
"journey-mapping",
683
+
"product-design",
684
+
"rapid-prototyping",
685
+
"stakeholder-engagement",
686
+
"usability-testing",
687
+
"ux-research"
688
+
],
689
+
"slug": "principal-product-designer-leo",
690
+
"startDate": "Sat Feb 02 2019 00:00:00 GMT+0000 (Coordinated Universal Time)",
691
+
"updatedOn": "Sat Jun 24 2023 14:32:31 GMT+0000 (Coordinated Universal Time)",
692
+
"userNeed": "Enabling people living with a skin condition to get a diagnosis, communicate with their healthcare providers and receive clear personalised treatments more easily."
693
+
},
694
+
{
695
+
"caseStudies": [
696
+
"brandwatch-vizia"
697
+
],
698
+
"client": "XXXXXXXX",
699
+
"collectionId": "63020a6ad41103ed37d74166",
700
+
"company": "brandwatch",
701
+
"cover": "",
702
+
"createdOn": "Sun Aug 07 2022 08:21:28 GMT+0000 (Coordinated Universal Time)",
703
+
"employmentType": "Full-time",
704
+
"endDate": "Mon Oct 10 2016 00:00:00 GMT+0000 (Coordinated Universal Time)",
705
+
"itemId": "63020a6ad41103c831d74189",
706
+
"jobDescription": "As a Senior Designer at Vizia, I lead the design from discovery to launch for new product experiences and experimental features for C-level, market research, analyst, business development and content marketing users. My team's work had a direct and positive impact on the digital transformation initiatives of clients such as American Airlines, Bank of America, British Red Cross, Samsung, Twitter, Walmart and Unilever.",
707
+
"jobTitle": "Senior UX Designer",
708
+
"publishedOn": "Sun Jul 02 2023 00:47:22 GMT+0000 (Coordinated Universal Time)",
709
+
"skills": [
710
+
"accessibility",
711
+
"agile-methodologies",
712
+
"data-visualization",
713
+
"design-leadership",
714
+
"design-methodologies",
715
+
"design-strategy",
716
+
"design-systems",
717
+
"information-architecture",
718
+
"interaction-design",
719
+
"interface-design",
720
+
"journey-mapping",
721
+
"product-design",
722
+
"rapid-prototyping",
723
+
"stakeholder-engagement",
724
+
"usability-testing",
725
+
"ux-research"
726
+
],
727
+
"slug": "senior-ux-designer-brandwatch",
728
+
"startDate": "Tue Mar 03 2015 00:00:00 GMT+0000 (Coordinated Universal Time)",
729
+
"updatedOn": "Sun Jul 02 2023 00:32:51 GMT+0000 (Coordinated Universal Time)",
730
+
"userNeed": "Helping enterprise companies become more data-driven by better integrating, visualising and sharing timely relevant actionable insights, alerts and reports."
731
+
},
732
+
{
733
+
"caseStudies": [
734
+
""
735
+
],
736
+
"client": "XXXXXXXX",
737
+
"collectionId": "63020a6ad41103ed37d74166",
738
+
"company": "home-office",
739
+
"cover": "",
740
+
"createdOn": "Sun Aug 07 2022 08:21:28 GMT+0000 (Coordinated Universal Time)",
741
+
"employmentType": "Contract",
742
+
"endDate": "Fri Mar 03 2017 00:00:00 GMT+0000 (Coordinated Universal Time)",
743
+
"itemId": "63020a6ad411034b4ed74188",
744
+
"jobDescription": "As a Service Designer on the UK visas and immigration digital transformation team, I collaborated with user researchers, interaction designers, engineers and civil servants to improve caseworker decision-making capabilities with secure, efficient and effective tools, processes and realtime data assets, through an agile participatory design process, compliant with UK government's digital service standards. This was a hybrid role that also involved significant hands-on interaction design, prototyping and testing with service users.",
745
+
"jobTitle": "Service Designer",
746
+
"publishedOn": "Sun Jun 25 2023 06:48:40 GMT+0000 (Coordinated Universal Time)",
747
+
"skills": [
748
+
"accessibility",
749
+
"agile-methodologies",
750
+
"data-visualization",
751
+
"design-leadership",
752
+
"design-methodologies",
753
+
"design-strategy",
754
+
"design-systems",
755
+
"interaction-design",
756
+
"journey-mapping",
757
+
"rapid-prototyping",
758
+
"service-design",
759
+
"stakeholder-engagement",
760
+
"usability-testing"
761
+
],
762
+
"slug": "service-designer-ukgov",
763
+
"startDate": "Mon Oct 10 2016 00:00:00 GMT+0000 (Coordinated Universal Time)",
764
+
"updatedOn": "Sat Jun 24 2023 14:32:22 GMT+0000 (Coordinated Universal Time)",
765
+
"userNeed": "Supporting foreign nationals to access more efficient, ethical and humane visa and immigration services when seeking to live and work in the UK."
766
+
},
767
+
{
768
+
"caseStudies": [
769
+
"morressier-discovery",
770
+
"scaling-morressier-design-system",
771
+
"scaling-design-feedback"
772
+
],
773
+
"client": "Morressier",
774
+
"collectionId": "63020a6ad41103ed37d74166",
775
+
"company": "morressier",
776
+
"cover": "https://uploads-ssl.webflow.com/63020a6ad41103e186d7416a/64933918d8f1b775db892710_product-school-nOvIa_x_tfo-unsplash.jpeg",
777
+
"createdOn": "Sun Aug 07 2022 08:21:28 GMT+0000 (Coordinated Universal Time)",
778
+
"employmentType": "Full-time",
779
+
"endDate": "",
780
+
"itemId": "63020a6ad41103ecadd74182",
781
+
"jobDescription": "In this role, I collaborate with product managers, engineers, data scientists and stakeholders to research and develop new and improved products that help scientists to publish and discover scientific research, and network with peers - all in a fast-paced, agile and fully remote environment. I also drive product design strategy, support and nurture the design team, mature and operationalise participatory UX design practices, improve cross-functional agile product development processes, and own scaling the design system.",
782
+
"jobTitle": "Staff Product Designer",
783
+
"publishedOn": "Sun Jul 02 2023 00:47:22 GMT+0000 (Coordinated Universal Time)",
784
+
"skills": [
785
+
"accessibility",
786
+
"agile-methodologies",
787
+
"team-management",
788
+
"content-design",
789
+
"design-leadership",
790
+
"design-methodologies",
791
+
"design-operations",
792
+
"design-strategy",
793
+
"design-systems",
794
+
"design-thinking",
795
+
"digital-transformation",
796
+
"information-architecture",
797
+
"interaction-design",
798
+
"interface-design",
799
+
"journey-mapping",
800
+
"lean-ux",
801
+
"persuasive-communication",
802
+
"product-design",
803
+
"rapid-prototyping",
804
+
"service-design",
805
+
"stakeholder-engagement",
806
+
"usability-testing",
807
+
"ux-research"
808
+
],
809
+
"slug": "staff-product-designer-morressier",
810
+
"startDate": "Mon Nov 01 2021 00:00:00 GMT+0000 (Coordinated Universal Time)",
811
+
"updatedOn": "Sun Jul 02 2023 00:41:10 GMT+0000 (Coordinated Universal Time)",
812
+
"userNeed": "Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit."
813
+
},
814
+
{
815
+
"caseStudies": [
816
+
"smarter-energy"
817
+
],
818
+
"client": "EDF Energy",
819
+
"collectionId": "63020a6ad41103ed37d74166",
820
+
"company": "edf-energy",
821
+
"cover": "",
822
+
"createdOn": "Sun Aug 07 2022 08:21:28 GMT+0000 (Coordinated Universal Time)",
823
+
"employmentType": "Contract",
824
+
"endDate": "Fri Sep 01 2017 00:00:00 GMT+0000 (Coordinated Universal Time)",
825
+
"itemId": "63020a6ad411031266d74184",
826
+
"jobDescription": "As staff service designer, I collaboarted with senior stakeholders, engineers, ux designers, customer service managers and OFGEM regulators to enhance the residential bill-payer's experience buying energy, understanding their usage, resolving billing issues, and staying out of debt. This was a strategic role working at a strategic level in the Customer division to support the national Smart Meter roll-out.",
827
+
"jobTitle": "Staff Service Designer",
828
+
"publishedOn": "Sun Jul 02 2023 00:47:22 GMT+0000 (Coordinated Universal Time)",
829
+
"skills": [
830
+
"accessibility",
831
+
"agile-methodologies",
832
+
"content-design",
833
+
"design-leadership",
834
+
"design-methodologies",
835
+
"design-operations",
836
+
"design-strategy",
837
+
"digital-transformation",
838
+
"internet-of-things",
839
+
"design-systems",
840
+
"journey-mapping",
841
+
"people-management",
842
+
"interaction-design",
843
+
"information-architecture",
844
+
"persuasive-communication",
845
+
"rapid-prototyping",
846
+
"service-design",
847
+
"stakeholder-engagement",
848
+
"usability-testing",
849
+
"ux-research"
850
+
],
851
+
"slug": "staff-service-designer-edf",
852
+
"startDate": "Fri Mar 03 2017 00:00:00 GMT+0000 (Coordinated Universal Time)",
853
+
"updatedOn": "Sun Jul 02 2023 00:36:54 GMT+0000 (Coordinated Universal Time)",
854
+
"userNeed": "Helping residential bill-payers better understand and manage their energy consumption. "
855
+
},
856
+
{
857
+
"caseStudies": [
858
+
""
859
+
],
860
+
"client": "XXXXXXXX",
861
+
"collectionId": "63020a6ad41103ed37d74166",
862
+
"company": "relentless-software",
863
+
"cover": "",
864
+
"createdOn": "Wed Aug 10 2022 09:37:41 GMT+0000 (Coordinated Universal Time)",
865
+
"employmentType": "Full-time",
866
+
"endDate": "Sat Dec 12 2009 00:00:00 GMT+0000 (Coordinated Universal Time)",
867
+
"itemId": "63020a6ad411037939d741d4",
868
+
"jobDescription": "",
869
+
"jobTitle": "User Interface Designer",
870
+
"publishedOn": "Sun Jun 25 2023 06:48:40 GMT+0000 (Coordinated Universal Time)",
871
+
"skills": [
872
+
"design-systems",
873
+
"interaction-design",
874
+
"interface-design",
875
+
"stakeholder-engagement"
876
+
],
877
+
"slug": "user-interface-designer-relentless",
878
+
"startDate": "Tue Jan 01 2008 00:00:00 GMT+0000 (Coordinated Universal Time)",
879
+
"updatedOn": "Sat Jun 24 2023 14:31:45 GMT+0000 (Coordinated Universal Time)",
880
+
"userNeed": ""
881
+
},
882
+
{
883
+
"caseStudies": [
884
+
""
885
+
],
886
+
"client": "XXXXXXXX",
887
+
"collectionId": "63020a6ad41103ed37d74166",
888
+
"company": "spotler",
889
+
"cover": "",
890
+
"createdOn": "Sun Aug 07 2022 08:21:28 GMT+0000 (Coordinated Universal Time)",
891
+
"employmentType": "Full-time",
892
+
"endDate": "Tue Mar 03 2015 00:00:00 GMT+0000 (Coordinated Universal Time)",
893
+
"itemId": "63020a6ad411030f93d74186",
894
+
"jobDescription": "As design team lead, I set product design strategy, led and grew the design team, matured design practices and career development paths. I worked with product managers and engineers to redesign and launch the Pure360 Campaign product. I also collaborated with designers and engineers to design and implement the company's first design system initiative.",
895
+
"jobTitle": "UX Design Manager",
896
+
"publishedOn": "Sun Jul 02 2023 00:47:22 GMT+0000 (Coordinated Universal Time)",
897
+
"skills": [
898
+
"agile-methodologies",
899
+
"design-leadership",
900
+
"design-systems",
901
+
"design-thinking",
902
+
"interaction-design",
903
+
"interface-design",
904
+
"design-strategy",
905
+
"journey-mapping",
906
+
"persuasive-communication",
907
+
"rapid-prototyping",
908
+
"product-design",
909
+
"stakeholder-engagement",
910
+
"usability-testing",
911
+
"ux-research",
912
+
"accessibility"
913
+
],
914
+
"slug": "ux-design-manager-pure360",
915
+
"startDate": "Mon Mar 03 2014 00:00:00 GMT+0000 (Coordinated Universal Time)",
916
+
"updatedOn": "Sun Jul 02 2023 00:35:06 GMT+0000 (Coordinated Universal Time)",
917
+
"userNeed": "Helping organisations acquire and retain new customers, increase revenue and deepen customer loyalty through targeted content marketing."
918
+
},
919
+
{
920
+
"caseStudies": [
921
+
""
922
+
],
923
+
"client": "XXXXXXXX",
924
+
"collectionId": "63020a6ad41103ed37d74166",
925
+
"company": "mediatonic",
926
+
"cover": "",
927
+
"createdOn": "Sun Aug 07 2022 08:21:29 GMT+0000 (Coordinated Universal Time)",
928
+
"employmentType": "Full-time",
929
+
"endDate": "Mon Mar 03 2014 00:00:00 GMT+0000 (Coordinated Universal Time)",
930
+
"itemId": "63020a6ad4110383c3d741b0",
931
+
"jobDescription": "I worked with product owners, game designers, artists and developers to create award-winning games for clients such as AdultSwim, Namco, SquareEnix and Ubisoft, as well as Mediatonic's own IP for mobile and console platforms. I researched, designed and tested new gaming experiences that attracted audiences, removed usability barriers to play, provided simple and clear feedback, and connected players on the couch and online. As the first UX designer at Mediatonic, I also promoted and coached better design principles and practices, and matured cross-functional collaboration rituals.",
932
+
"jobTitle": "UX Designer",
933
+
"publishedOn": "Sun Jun 25 2023 06:48:40 GMT+0000 (Coordinated Universal Time)",
934
+
"skills": [
935
+
"design-systems",
936
+
"interaction-design",
937
+
"interface-design",
938
+
"usability-testing"
939
+
],
940
+
"slug": "ux-designer-mediatonic",
941
+
"startDate": "Wed Oct 10 2012 00:00:00 GMT+0000 (Coordinated Universal Time)",
942
+
"updatedOn": "Sat Jun 24 2023 14:32:07 GMT+0000 (Coordinated Universal Time)",
943
+
"userNeed": "Enabling gamers to play more inclusive, approachable, fair and fun games."
944
+
},
945
+
{
946
+
"caseStudies": [
947
+
""
948
+
],
949
+
"client": "Scenestealer",
950
+
"collectionId": "63020a6ad41103ed37d74166",
951
+
"company": "scenestealer",
952
+
"cover": "",
953
+
"createdOn": "Sun Aug 07 2022 08:21:29 GMT+0000 (Coordinated Universal Time)",
954
+
"employmentType": "Contract",
955
+
"endDate": "Sun Sep 09 2012 00:00:00 GMT+0000 (Coordinated Universal Time)",
956
+
"itemId": "63020a6ad411034f8fd7419d",
957
+
"jobDescription": "",
958
+
"jobTitle": "UX Designer",
959
+
"publishedOn": "Sat Jun 24 2023 05:33:18 GMT+0000 (Coordinated Universal Time)",
960
+
"skills": [
961
+
"design-strategy",
962
+
"design-systems",
963
+
"interaction-design",
964
+
"interface-design",
965
+
"product-design",
966
+
"usability-testing",
967
+
"ux-research"
968
+
],
969
+
"slug": "ux-designer-scenestealer",
970
+
"startDate": "Wed Apr 04 2012 00:00:00 GMT+0000 (Coordinated Universal Time)",
971
+
"updatedOn": "Sat Jun 24 2023 05:10:57 GMT+0000 (Coordinated Universal Time)",
972
+
"userNeed": ""
973
+
},
974
+
{
975
+
"caseStudies": [
976
+
""
977
+
],
978
+
"client": "XXXXXXXX",
979
+
"collectionId": "63020a6ad41103ed37d74166",
980
+
"company": "schlumberger",
981
+
"cover": "",
982
+
"createdOn": "Sun Aug 07 2022 08:21:29 GMT+0000 (Coordinated Universal Time)",
983
+
"employmentType": "Contract",
984
+
"endDate": "Wed Apr 04 2012 00:00:00 GMT+0000 (Coordinated Universal Time)",
985
+
"itemId": "63020a6ad411037272d741c3",
986
+
"jobDescription": "",
987
+
"jobTitle": "UX Designer",
988
+
"publishedOn": "Sun Jun 25 2023 06:48:40 GMT+0000 (Coordinated Universal Time)",
989
+
"skills": [
990
+
"design-leadership",
991
+
"interface-design",
992
+
"interaction-design",
993
+
"information-architecture",
994
+
"stakeholder-engagement",
995
+
"usability-testing"
996
+
],
997
+
"slug": "ux-designer-slb",
998
+
"startDate": "Fri Jan 01 2010 00:00:00 GMT+0000 (Coordinated Universal Time)",
999
+
"updatedOn": "Sat Jun 24 2023 14:32:00 GMT+0000 (Coordinated Universal Time)",
1000
+
"userNeed": ""
1001
+
}
1002
+
],
1003
+
"skills": [
1004
+
{
1005
+
"collectionId": "63020a6ad41103c21ed74167",
1006
+
"createdOn": "Fri Mar 17 2023 02:05:27 GMT+0000 (Coordinated Universal Time)",
1007
+
"itemId": "6413cae724cfc21d48f1b17c",
1008
+
"name": "Accessibility",
1009
+
"publishedOn": "Tue Jul 18 2023 05:51:50 GMT+0000 (Coordinated Universal Time)",
1010
+
"slug": "accessibility",
1011
+
"updatedOn": "Tue Jul 18 2023 05:51:30 GMT+0000 (Coordinated Universal Time)"
1012
+
},
1013
+
{
1014
+
"collectionId": "63020a6ad41103c21ed74167",
1015
+
"createdOn": "Fri Mar 17 2023 02:05:27 GMT+0000 (Coordinated Universal Time)",
1016
+
"itemId": "6413cae79d689ff2fb09dfaa",
1017
+
"name": "Agile Methodologies",
1018
+
"publishedOn": "Wed Jun 21 2023 10:12:05 GMT+0000 (Coordinated Universal Time)",
1019
+
"slug": "agile-methodologies",
1020
+
"updatedOn": "Fri Mar 17 2023 02:05:27 GMT+0000 (Coordinated Universal Time)"
1021
+
},
1022
+
{
1023
+
"collectionId": "63020a6ad41103c21ed74167",
1024
+
"createdOn": "Sun Jun 25 2023 09:48:36 GMT+0000 (Coordinated Universal Time)",
1025
+
"itemId": "64980d741402de60d8573bd7",
1026
+
"name": "HTML, CSS & JS",
1027
+
"publishedOn": "Tue Jul 18 2023 05:51:50 GMT+0000 (Coordinated Universal Time)",
1028
+
"slug": "code",
1029
+
"updatedOn": "Tue Jul 18 2023 05:50:04 GMT+0000 (Coordinated Universal Time)"
1030
+
},
1031
+
{
1032
+
"collectionId": "63020a6ad41103c21ed74167",
1033
+
"createdOn": "Sun Jun 25 2023 09:51:21 GMT+0000 (Coordinated Universal Time)",
1034
+
"itemId": "64980e1916a439bddb8c049c",
1035
+
"name": "Content Design",
1036
+
"publishedOn": "Sun Jun 25 2023 10:13:32 GMT+0000 (Coordinated Universal Time)",
1037
+
"slug": "content-design",
1038
+
"updatedOn": "Sun Jun 25 2023 09:51:21 GMT+0000 (Coordinated Universal Time)"
1039
+
},
1040
+
{
1041
+
"collectionId": "63020a6ad41103c21ed74167",
1042
+
"createdOn": "Sun Jun 25 2023 09:50:20 GMT+0000 (Coordinated Universal Time)",
1043
+
"itemId": "64980ddce789129d1318f695",
1044
+
"name": "Data Visualisation",
1045
+
"publishedOn": "",
1046
+
"slug": "data-visualisation",
1047
+
"updatedOn": "Tue Jul 18 2023 05:50:17 GMT+0000 (Coordinated Universal Time)"
1048
+
},
1049
+
{
1050
+
"collectionId": "63020a6ad41103c21ed74167",
1051
+
"createdOn": "Fri Mar 17 2023 02:05:27 GMT+0000 (Coordinated Universal Time)",
1052
+
"itemId": "6413cae7be9e524c66a5d320",
1053
+
"name": "Data Visualization",
1054
+
"publishedOn": "",
1055
+
"slug": "data-visualization",
1056
+
"updatedOn": "Tue Jul 18 2023 05:51:19 GMT+0000 (Coordinated Universal Time)"
1057
+
},
1058
+
{
1059
+
"collectionId": "63020a6ad41103c21ed74167",
1060
+
"createdOn": "Fri Mar 17 2023 02:05:27 GMT+0000 (Coordinated Universal Time)",
1061
+
"itemId": "6413cae797f1d15204cb91b0",
1062
+
"name": "Design Leadership",
1063
+
"publishedOn": "Wed Jun 21 2023 10:12:05 GMT+0000 (Coordinated Universal Time)",
1064
+
"slug": "design-leadership",
1065
+
"updatedOn": "Fri Mar 17 2023 02:05:27 GMT+0000 (Coordinated Universal Time)"
1066
+
},
1067
+
{
1068
+
"collectionId": "63020a6ad41103c21ed74167",
1069
+
"createdOn": "Fri Mar 17 2023 02:05:27 GMT+0000 (Coordinated Universal Time)",
1070
+
"itemId": "6413cae72810c5a947d3be4c",
1071
+
"name": "Design Methodologies",
1072
+
"publishedOn": "Wed Jun 21 2023 10:12:05 GMT+0000 (Coordinated Universal Time)",
1073
+
"slug": "design-methodologies",
1074
+
"updatedOn": "Fri Mar 17 2023 02:05:27 GMT+0000 (Coordinated Universal Time)"
1075
+
},
1076
+
{
1077
+
"collectionId": "63020a6ad41103c21ed74167",
1078
+
"createdOn": "Fri Mar 17 2023 02:05:27 GMT+0000 (Coordinated Universal Time)",
1079
+
"itemId": "6413cae7f4c32ad168a729a0",
1080
+
"name": "Design Operations",
1081
+
"publishedOn": "Wed Jun 21 2023 10:12:05 GMT+0000 (Coordinated Universal Time)",
1082
+
"slug": "design-operations",
1083
+
"updatedOn": "Fri Mar 17 2023 02:05:27 GMT+0000 (Coordinated Universal Time)"
1084
+
},
1085
+
{
1086
+
"collectionId": "63020a6ad41103c21ed74167",
1087
+
"createdOn": "Fri Mar 17 2023 02:05:27 GMT+0000 (Coordinated Universal Time)",
1088
+
"itemId": "6413cae7fc983cdd5cb74804",
1089
+
"name": "Design Strategy",
1090
+
"publishedOn": "Wed Jun 21 2023 10:12:05 GMT+0000 (Coordinated Universal Time)",
1091
+
"slug": "design-strategy",
1092
+
"updatedOn": "Fri Mar 17 2023 02:05:27 GMT+0000 (Coordinated Universal Time)"
1093
+
},
1094
+
{
1095
+
"collectionId": "63020a6ad41103c21ed74167",
1096
+
"createdOn": "Fri Mar 17 2023 02:05:27 GMT+0000 (Coordinated Universal Time)",
1097
+
"itemId": "6413cae79741e4b62dab6453",
1098
+
"name": "Design Systems",
1099
+
"publishedOn": "Wed Jun 21 2023 10:12:05 GMT+0000 (Coordinated Universal Time)",
1100
+
"slug": "design-systems",
1101
+
"updatedOn": "Fri Mar 17 2023 02:05:27 GMT+0000 (Coordinated Universal Time)"
1102
+
},
1103
+
{
1104
+
"collectionId": "63020a6ad41103c21ed74167",
1105
+
"createdOn": "Sun Jun 25 2023 09:50:49 GMT+0000 (Coordinated Universal Time)",
1106
+
"itemId": "64980df9b759173dc6500847",
1107
+
"name": "Design Thinking",
1108
+
"publishedOn": "Sun Jun 25 2023 10:13:32 GMT+0000 (Coordinated Universal Time)",
1109
+
"slug": "design-thinking",
1110
+
"updatedOn": "Sun Jun 25 2023 09:50:49 GMT+0000 (Coordinated Universal Time)"
1111
+
},
1112
+
{
1113
+
"collectionId": "63020a6ad41103c21ed74167",
1114
+
"createdOn": "Sun Jun 25 2023 09:53:36 GMT+0000 (Coordinated Universal Time)",
1115
+
"itemId": "64980ea0259b9b181d412b5a",
1116
+
"name": "Digital Transformation",
1117
+
"publishedOn": "",
1118
+
"slug": "digital-transformation",
1119
+
"updatedOn": "Tue Jul 18 2023 05:51:37 GMT+0000 (Coordinated Universal Time)"
1120
+
},
1121
+
{
1122
+
"collectionId": "63020a6ad41103c21ed74167",
1123
+
"createdOn": "Fri Mar 17 2023 02:05:27 GMT+0000 (Coordinated Universal Time)",
1124
+
"itemId": "6413cae79741e43935ab6454",
1125
+
"name": "Information Architecture",
1126
+
"publishedOn": "Wed Jun 21 2023 10:12:05 GMT+0000 (Coordinated Universal Time)",
1127
+
"slug": "information-architecture",
1128
+
"updatedOn": "Fri Mar 17 2023 02:05:27 GMT+0000 (Coordinated Universal Time)"
1129
+
},
1130
+
{
1131
+
"collectionId": "63020a6ad41103c21ed74167",
1132
+
"createdOn": "Fri Mar 17 2023 02:05:27 GMT+0000 (Coordinated Universal Time)",
1133
+
"itemId": "6413cae7f4c32a3355a729a8",
1134
+
"name": "Interaction Design",
1135
+
"publishedOn": "Wed Jun 21 2023 10:12:05 GMT+0000 (Coordinated Universal Time)",
1136
+
"slug": "interaction-design",
1137
+
"updatedOn": "Fri Mar 17 2023 02:05:27 GMT+0000 (Coordinated Universal Time)"
1138
+
},
1139
+
{
1140
+
"collectionId": "63020a6ad41103c21ed74167",
1141
+
"createdOn": "Fri Mar 17 2023 02:05:27 GMT+0000 (Coordinated Universal Time)",
1142
+
"itemId": "6413cae71aacf0fb2becb9c2",
1143
+
"name": "Interface Design",
1144
+
"publishedOn": "Wed Jun 21 2023 10:12:05 GMT+0000 (Coordinated Universal Time)",
1145
+
"slug": "interface-design",
1146
+
"updatedOn": "Fri Mar 17 2023 02:05:27 GMT+0000 (Coordinated Universal Time)"
1147
+
},
1148
+
{
1149
+
"collectionId": "63020a6ad41103c21ed74167",
1150
+
"createdOn": "Fri Mar 17 2023 02:05:27 GMT+0000 (Coordinated Universal Time)",
1151
+
"itemId": "6413cae71aacf01a47ecb9c4",
1152
+
"name": "Internet of Things (IoT)",
1153
+
"publishedOn": "",
1154
+
"slug": "internet-of-things",
1155
+
"updatedOn": "Tue Jul 18 2023 05:50:59 GMT+0000 (Coordinated Universal Time)"
1156
+
},
1157
+
{
1158
+
"collectionId": "63020a6ad41103c21ed74167",
1159
+
"createdOn": "Fri Mar 17 2023 02:05:27 GMT+0000 (Coordinated Universal Time)",
1160
+
"itemId": "6413cae7be9e52cb45a5d329",
1161
+
"name": "Journey Mapping",
1162
+
"publishedOn": "Wed Jun 21 2023 10:12:05 GMT+0000 (Coordinated Universal Time)",
1163
+
"slug": "journey-mapping",
1164
+
"updatedOn": "Fri Mar 17 2023 02:05:27 GMT+0000 (Coordinated Universal Time)"
1165
+
},
1166
+
{
1167
+
"collectionId": "63020a6ad41103c21ed74167",
1168
+
"createdOn": "Sun Jun 25 2023 09:50:41 GMT+0000 (Coordinated Universal Time)",
1169
+
"itemId": "64980df13a344d8f4aef7139",
1170
+
"name": "Lean UX",
1171
+
"publishedOn": "Sun Jun 25 2023 10:13:32 GMT+0000 (Coordinated Universal Time)",
1172
+
"slug": "lean-ux",
1173
+
"updatedOn": "Sun Jun 25 2023 09:50:41 GMT+0000 (Coordinated Universal Time)"
1174
+
},
1175
+
{
1176
+
"collectionId": "63020a6ad41103c21ed74167",
1177
+
"createdOn": "Sun Jun 25 2023 10:43:42 GMT+0000 (Coordinated Universal Time)",
1178
+
"itemId": "64981a5e2b48a0c9cd700b37",
1179
+
"name": "People Management",
1180
+
"publishedOn": "Sun Jun 25 2023 10:43:48 GMT+0000 (Coordinated Universal Time)",
1181
+
"slug": "people-management",
1182
+
"updatedOn": "Sun Jun 25 2023 10:43:42 GMT+0000 (Coordinated Universal Time)"
1183
+
},
1184
+
{
1185
+
"collectionId": "63020a6ad41103c21ed74167",
1186
+
"createdOn": "Sun Jun 25 2023 09:52:38 GMT+0000 (Coordinated Universal Time)",
1187
+
"itemId": "64980e66202d925b04c81e23",
1188
+
"name": "Persuasive Communication",
1189
+
"publishedOn": "Sun Jun 25 2023 10:13:32 GMT+0000 (Coordinated Universal Time)",
1190
+
"slug": "persuasive-communication",
1191
+
"updatedOn": "Sun Jun 25 2023 09:53:54 GMT+0000 (Coordinated Universal Time)"
1192
+
},
1193
+
{
1194
+
"collectionId": "63020a6ad41103c21ed74167",
1195
+
"createdOn": "Fri Mar 17 2023 02:05:28 GMT+0000 (Coordinated Universal Time)",
1196
+
"itemId": "6413cae89d689f117309dfac",
1197
+
"name": "Product Design",
1198
+
"publishedOn": "Wed Jun 21 2023 10:12:05 GMT+0000 (Coordinated Universal Time)",
1199
+
"slug": "product-design",
1200
+
"updatedOn": "Fri Mar 17 2023 02:05:28 GMT+0000 (Coordinated Universal Time)"
1201
+
},
1202
+
{
1203
+
"collectionId": "63020a6ad41103c21ed74167",
1204
+
"createdOn": "Fri Mar 17 2023 02:05:28 GMT+0000 (Coordinated Universal Time)",
1205
+
"itemId": "6413cae80ee69ab18fa7e91d",
1206
+
"name": "Rapid Prototyping",
1207
+
"publishedOn": "Wed Jun 21 2023 10:12:05 GMT+0000 (Coordinated Universal Time)",
1208
+
"slug": "rapid-prototyping",
1209
+
"updatedOn": "Fri Mar 17 2023 02:05:28 GMT+0000 (Coordinated Universal Time)"
1210
+
},
1211
+
{
1212
+
"collectionId": "63020a6ad41103c21ed74167",
1213
+
"createdOn": "Fri Mar 17 2023 02:05:28 GMT+0000 (Coordinated Universal Time)",
1214
+
"itemId": "6413cae80eac7c0dd4ee38c7",
1215
+
"name": "Service Design",
1216
+
"publishedOn": "Wed Jun 21 2023 10:12:05 GMT+0000 (Coordinated Universal Time)",
1217
+
"slug": "service-design",
1218
+
"updatedOn": "Fri Mar 17 2023 02:05:28 GMT+0000 (Coordinated Universal Time)"
1219
+
},
1220
+
{
1221
+
"collectionId": "63020a6ad41103c21ed74167",
1222
+
"createdOn": "Fri Mar 17 2023 02:05:28 GMT+0000 (Coordinated Universal Time)",
1223
+
"itemId": "6413cae82810c51ca6d3be4e",
1224
+
"name": "Stakeholder Engagement",
1225
+
"publishedOn": "Wed Jun 21 2023 10:12:05 GMT+0000 (Coordinated Universal Time)",
1226
+
"slug": "stakeholder-engagement",
1227
+
"updatedOn": "Fri Mar 17 2023 02:05:28 GMT+0000 (Coordinated Universal Time)"
1228
+
},
1229
+
{
1230
+
"collectionId": "63020a6ad41103c21ed74167",
1231
+
"createdOn": "Fri Mar 17 2023 02:05:28 GMT+0000 (Coordinated Universal Time)",
1232
+
"itemId": "6413cae89741e48690ab645e",
1233
+
"name": "Career Development",
1234
+
"publishedOn": "Sun Jun 25 2023 10:43:48 GMT+0000 (Coordinated Universal Time)",
1235
+
"slug": "team-management",
1236
+
"updatedOn": "Sun Jun 25 2023 10:43:29 GMT+0000 (Coordinated Universal Time)"
1237
+
},
1238
+
{
1239
+
"collectionId": "63020a6ad41103c21ed74167",
1240
+
"createdOn": "Fri Mar 17 2023 02:05:28 GMT+0000 (Coordinated Universal Time)",
1241
+
"itemId": "6413cae825deb17304f3e643",
1242
+
"name": "Usability Testing",
1243
+
"publishedOn": "Wed Jun 21 2023 10:12:05 GMT+0000 (Coordinated Universal Time)",
1244
+
"slug": "usability-testing",
1245
+
"updatedOn": "Fri Mar 17 2023 02:05:28 GMT+0000 (Coordinated Universal Time)"
1246
+
},
1247
+
{
1248
+
"collectionId": "63020a6ad41103c21ed74167",
1249
+
"createdOn": "Fri Mar 17 2023 02:05:28 GMT+0000 (Coordinated Universal Time)",
1250
+
"itemId": "6413cae8cf050a4c0e7de89b",
1251
+
"name": "UX Research",
1252
+
"publishedOn": "Wed Jun 21 2023 10:12:05 GMT+0000 (Coordinated Universal Time)",
1253
+
"slug": "ux-research",
1254
+
"updatedOn": "Fri Mar 17 2023 02:05:28 GMT+0000 (Coordinated Universal Time)"
1255
+
}
1256
+
]
1257
+
}
+399
src/data/json/jobs.json
+399
src/data/json/jobs.json
···
1
+
[
2
+
{
3
+
"caseStudies": [
4
+
"defining-the-product-strategy-for-eco-shopping"
5
+
],
6
+
"client": "MyGoodPlanet",
7
+
"company": "mygoodplanet",
8
+
"description": "As interim design director at MyGoodPlanet, I helped set the company's design strategy, grow and guide the product design team, and establish scalable UX practices and operations as they pivoted from news publishing to e-commerce.",
9
+
"employmentType": "Contract",
10
+
"endDate": "Sun Jul 07 2019 00:00:00 GMT+0000 (Coordinated Universal Time)",
11
+
"published": "Sun Jul 02 2023 00:47:22 GMT+0000 (Coordinated Universal Time)",
12
+
"skills": [
13
+
"team-management",
14
+
"design-leadership",
15
+
"design-operations",
16
+
"design-strategy",
17
+
"design-systems",
18
+
"stakeholder-engagement",
19
+
"rapid-prototyping",
20
+
"product-design",
21
+
"persuasive-communication",
22
+
"people-management",
23
+
"journey-mapping",
24
+
"digital-transformation",
25
+
"design-thinking"
26
+
],
27
+
"slug": "design-director-mgp",
28
+
"startDate": "Sat Jul 07 2018 00:00:00 GMT+0000 (Coordinated Universal Time)",
29
+
"summary": "Supporting environmentally conscious shoppers to make informed and sustainable shopping decisions.",
30
+
"title": "Design Director (Consulting)"
31
+
},
32
+
{
33
+
"caseStudies": [
34
+
"scaling-morressier-design-system",
35
+
"scaling-design-feedback",
36
+
"improving-the-recruitment-experience-for-design-candidates"
37
+
],
38
+
"client": "Morressier",
39
+
"company": "morressier",
40
+
"description": "As the lead designer, I worked with product managers, engineers, data scientists and customer stakeholders to research and design new features for attending hybrid academic events, publishing conference proceedings, networking with peers and discovering the latest research. I also supported product design strategy, led and scaled the design team, supported professional development, matured UX design practices and improved agile development processes.",
41
+
"employmentType": "Full-time",
42
+
"endDate": "Fri Sep 09 2022 00:00:00 GMT+0000 (Coordinated Universal Time)",
43
+
"published": "Sun Jul 02 2023 00:47:22 GMT+0000 (Coordinated Universal Time)",
44
+
"skills": [
45
+
"agile-methodologies",
46
+
"team-management",
47
+
"content-design",
48
+
"data-visualisation",
49
+
"design-leadership",
50
+
"design-methodologies",
51
+
"design-operations",
52
+
"design-strategy",
53
+
"design-systems",
54
+
"design-thinking",
55
+
"information-architecture",
56
+
"interaction-design",
57
+
"interface-design",
58
+
"journey-mapping",
59
+
"lean-ux",
60
+
"people-management",
61
+
"persuasive-communication",
62
+
"product-design",
63
+
"rapid-prototyping",
64
+
"stakeholder-engagement",
65
+
"usability-testing",
66
+
"ux-research",
67
+
"accessibility"
68
+
],
69
+
"slug": "lead-product-designer-morressier",
70
+
"startDate": "Thu Oct 10 2019 00:00:00 GMT+0000 (Coordinated Universal Time)",
71
+
"summary": "Enabling scientific communities, institutions and publishers to better create, discover and share research.",
72
+
"title": "Lead Product Designer"
73
+
},
74
+
{
75
+
"caseStudies": [
76
+
"smarter-energy"
77
+
],
78
+
"client": "XXXXXXXX",
79
+
"company": "edf-energy",
80
+
"description": "As principal product designer for EDF Energy's innovation lab working on the Smart Energy initiative, I worked with engineers, business development managers and startup founders to research, design and launch experimental web, mobile and hardware products for energy usage monitoring, disambiguation, waste reduction and automation for residential bill-payers.",
81
+
"employmentType": "Contract",
82
+
"endDate": "Sat Feb 02 2019 00:00:00 GMT+0000 (Coordinated Universal Time)",
83
+
"published": "Sun Jul 02 2023 00:47:22 GMT+0000 (Coordinated Universal Time)",
84
+
"skills": [
85
+
"agile-methodologies",
86
+
"data-visualization",
87
+
"design-leadership",
88
+
"design-strategy",
89
+
"interaction-design",
90
+
"interface-design",
91
+
"internet-of-things",
92
+
"journey-mapping",
93
+
"product-design",
94
+
"rapid-prototyping",
95
+
"stakeholder-engagement",
96
+
"usability-testing",
97
+
"ux-research"
98
+
],
99
+
"slug": "principal-product-designer-edf",
100
+
"startDate": "Sat Sep 09 2017 00:00:00 GMT+0000 (Coordinated Universal Time)",
101
+
"summary": "Helping residential bill-payers better understand and manage their energy consumption.",
102
+
"title": "Principal Product Designer"
103
+
},
104
+
{
105
+
"caseStudies": [
106
+
"ohmu"
107
+
],
108
+
"client": "XXXXXXXX",
109
+
"company": "leo-pharma",
110
+
"description": "As Principal Product Designer at LEO Pharma's Innovation Lab, I collaborated with dermatologists, ethnographers, data scientists and patients to research and design experimental medical devices that use computer vision and machine learning technologies to diagnose skin conditions and provide timely, relevant and actionable treatment advice.",
111
+
"employmentType": "Contract",
112
+
"endDate": "Thu Oct 10 2019 00:00:00 GMT+0000 (Coordinated Universal Time)",
113
+
"published": "Sun Jun 25 2023 06:48:40 GMT+0000 (Coordinated Universal Time)",
114
+
"skills": [
115
+
"accessibility",
116
+
"agile-methodologies",
117
+
"design-leadership",
118
+
"design-methodologies",
119
+
"design-strategy",
120
+
"design-systems",
121
+
"interaction-design",
122
+
"interface-design",
123
+
"journey-mapping",
124
+
"product-design",
125
+
"rapid-prototyping",
126
+
"stakeholder-engagement",
127
+
"usability-testing",
128
+
"ux-research"
129
+
],
130
+
"slug": "principal-product-designer-leo",
131
+
"startDate": "Sat Feb 02 2019 00:00:00 GMT+0000 (Coordinated Universal Time)",
132
+
"summary": "Enabling people living with a skin condition to get a diagnosis, communicate with their healthcare providers and receive clear personalised treatments more easily.",
133
+
"title": "Principal Product Designer"
134
+
},
135
+
{
136
+
"caseStudies": [
137
+
"brandwatch-vizia"
138
+
],
139
+
"client": "XXXXXXXX",
140
+
"company": "brandwatch",
141
+
"description": "As a Senior Designer at Vizia, I lead the design from discovery to launch for new product experiences and experimental features for C-level, market research, analyst, business development and content marketing users. My team's work had a direct and positive impact on the digital transformation initiatives of clients such as American Airlines, Bank of America, British Red Cross, Samsung, Twitter, Walmart and Unilever.",
142
+
"employmentType": "Full-time",
143
+
"endDate": "Mon Oct 10 2016 00:00:00 GMT+0000 (Coordinated Universal Time)",
144
+
"published": "Sun Jul 02 2023 00:47:22 GMT+0000 (Coordinated Universal Time)",
145
+
"skills": [
146
+
"accessibility",
147
+
"agile-methodologies",
148
+
"data-visualization",
149
+
"design-leadership",
150
+
"design-methodologies",
151
+
"design-strategy",
152
+
"design-systems",
153
+
"information-architecture",
154
+
"interaction-design",
155
+
"interface-design",
156
+
"journey-mapping",
157
+
"product-design",
158
+
"rapid-prototyping",
159
+
"stakeholder-engagement",
160
+
"usability-testing",
161
+
"ux-research"
162
+
],
163
+
"slug": "senior-ux-designer-brandwatch",
164
+
"startDate": "Tue Mar 03 2015 00:00:00 GMT+0000 (Coordinated Universal Time)",
165
+
"summary": "Helping enterprise companies become more data-driven by better integrating, visualising and sharing timely relevant actionable insights, alerts and reports.",
166
+
"title": "Senior UX Designer"
167
+
},
168
+
{
169
+
"caseStudies": [
170
+
""
171
+
],
172
+
"client": "XXXXXXXX",
173
+
"company": "home-office",
174
+
"description": "As a Service Designer on the UK visas and immigration digital transformation team, I collaborated with user researchers, interaction designers, engineers and civil servants to improve caseworker decision-making capabilities with secure, efficient and effective tools, processes and realtime data assets, through an agile participatory design process, compliant with UK government's digital service standards. This was a hybrid role that also involved significant hands-on interaction design, prototyping and testing with service users.",
175
+
"employmentType": "Contract",
176
+
"endDate": "Fri Mar 03 2017 00:00:00 GMT+0000 (Coordinated Universal Time)",
177
+
"published": "Sun Jun 25 2023 06:48:40 GMT+0000 (Coordinated Universal Time)",
178
+
"skills": [
179
+
"accessibility",
180
+
"agile-methodologies",
181
+
"data-visualization",
182
+
"design-leadership",
183
+
"design-methodologies",
184
+
"design-strategy",
185
+
"design-systems",
186
+
"interaction-design",
187
+
"journey-mapping",
188
+
"rapid-prototyping",
189
+
"service-design",
190
+
"stakeholder-engagement",
191
+
"usability-testing"
192
+
],
193
+
"slug": "service-designer-ukgov",
194
+
"startDate": "Mon Oct 10 2016 00:00:00 GMT+0000 (Coordinated Universal Time)",
195
+
"summary": "Supporting foreign nationals to access more efficient, ethical and humane visa and immigration services when seeking to live and work in the UK.",
196
+
"title": "Service Designer"
197
+
},
198
+
{
199
+
"caseStudies": [
200
+
"morressier-discovery",
201
+
"scaling-morressier-design-system",
202
+
"scaling-design-feedback"
203
+
],
204
+
"client": "Morressier",
205
+
"company": "morressier",
206
+
"cover": "https://uploads-ssl.webflow.com/63020a6ad41103e186d7416a/64933918d8f1b775db892710_product-school-nOvIa_x_tfo-unsplash.jpeg",
207
+
"description": "In this role, I collaborate with product managers, engineers, data scientists and stakeholders to research and develop new and improved products that help scientists to publish and discover scientific research, and network with peers - all in a fast-paced, agile and fully remote environment. I also drive product design strategy, support and nurture the design team, mature and operationalise participatory UX design practices, improve cross-functional agile product development processes, and own scaling the design system.",
208
+
"employmentType": "Full-time",
209
+
"endDate": "",
210
+
"published": "Sun Jul 02 2023 00:47:22 GMT+0000 (Coordinated Universal Time)",
211
+
"skills": [
212
+
"accessibility",
213
+
"agile-methodologies",
214
+
"team-management",
215
+
"content-design",
216
+
"design-leadership",
217
+
"design-methodologies",
218
+
"design-operations",
219
+
"design-strategy",
220
+
"design-systems",
221
+
"design-thinking",
222
+
"digital-transformation",
223
+
"information-architecture",
224
+
"interaction-design",
225
+
"interface-design",
226
+
"journey-mapping",
227
+
"lean-ux",
228
+
"persuasive-communication",
229
+
"product-design",
230
+
"rapid-prototyping",
231
+
"service-design",
232
+
"stakeholder-engagement",
233
+
"usability-testing",
234
+
"ux-research"
235
+
],
236
+
"slug": "staff-product-designer-morressier",
237
+
"startDate": "Mon Nov 01 2021 00:00:00 GMT+0000 (Coordinated Universal Time)",
238
+
"summary": "Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit.",
239
+
"title": "Staff Product Designer"
240
+
},
241
+
{
242
+
"caseStudies": [
243
+
"smarter-energy"
244
+
],
245
+
"client": "EDF Energy",
246
+
"company": "edf-energy",
247
+
"description": "As staff service designer, I collaboarted with senior stakeholders, engineers, ux designers, customer service managers and OFGEM regulators to enhance the residential bill-payer's experience buying energy, understanding their usage, resolving billing issues, and staying out of debt. This was a strategic role working at a strategic level in the Customer division to support the national Smart Meter roll-out.",
248
+
"employmentType": "Contract",
249
+
"endDate": "Fri Sep 01 2017 00:00:00 GMT+0000 (Coordinated Universal Time)",
250
+
"published": "Sun Jul 02 2023 00:47:22 GMT+0000 (Coordinated Universal Time)",
251
+
"skills": [
252
+
"accessibility",
253
+
"agile-methodologies",
254
+
"content-design",
255
+
"design-leadership",
256
+
"design-methodologies",
257
+
"design-operations",
258
+
"design-strategy",
259
+
"digital-transformation",
260
+
"internet-of-things",
261
+
"design-systems",
262
+
"journey-mapping",
263
+
"people-management",
264
+
"interaction-design",
265
+
"information-architecture",
266
+
"persuasive-communication",
267
+
"rapid-prototyping",
268
+
"service-design",
269
+
"stakeholder-engagement",
270
+
"usability-testing",
271
+
"ux-research"
272
+
],
273
+
"slug": "staff-service-designer-edf",
274
+
"startDate": "Fri Mar 03 2017 00:00:00 GMT+0000 (Coordinated Universal Time)",
275
+
"summary": "Helping residential bill-payers better understand and manage their energy consumption. ",
276
+
"title": "Staff Service Designer"
277
+
},
278
+
{
279
+
"caseStudies": [
280
+
""
281
+
],
282
+
"client": "XXXXXXXX",
283
+
"company": "relentless-software",
284
+
"description": "",
285
+
"employmentType": "Full-time",
286
+
"endDate": "Sat Dec 12 2009 00:00:00 GMT+0000 (Coordinated Universal Time)",
287
+
"published": "Sun Jun 25 2023 06:48:40 GMT+0000 (Coordinated Universal Time)",
288
+
"skills": [
289
+
"design-systems",
290
+
"interaction-design",
291
+
"interface-design",
292
+
"stakeholder-engagement"
293
+
],
294
+
"slug": "user-interface-designer-relentless",
295
+
"startDate": "Tue Jan 01 2008 00:00:00 GMT+0000 (Coordinated Universal Time)",
296
+
"summary": "",
297
+
"title": "User Interface Designer"
298
+
},
299
+
{
300
+
"caseStudies": [
301
+
""
302
+
],
303
+
"client": "XXXXXXXX",
304
+
"company": "spotler",
305
+
"description": "As design team lead, I set product design strategy, led and grew the design team, matured design practices and career development paths. I worked with product managers and engineers to redesign and launch the Pure360 Campaign product. I also collaborated with designers and engineers to design and implement the company's first design system initiative.",
306
+
"employmentType": "Full-time",
307
+
"endDate": "Tue Mar 03 2015 00:00:00 GMT+0000 (Coordinated Universal Time)",
308
+
"published": "Sun Jul 02 2023 00:47:22 GMT+0000 (Coordinated Universal Time)",
309
+
"skills": [
310
+
"agile-methodologies",
311
+
"design-leadership",
312
+
"design-systems",
313
+
"design-thinking",
314
+
"interaction-design",
315
+
"interface-design",
316
+
"design-strategy",
317
+
"journey-mapping",
318
+
"persuasive-communication",
319
+
"rapid-prototyping",
320
+
"product-design",
321
+
"stakeholder-engagement",
322
+
"usability-testing",
323
+
"ux-research",
324
+
"accessibility"
325
+
],
326
+
"slug": "ux-design-manager-pure360",
327
+
"startDate": "Mon Mar 03 2014 00:00:00 GMT+0000 (Coordinated Universal Time)",
328
+
"summary": "Helping organisations acquire and retain new customers, increase revenue and deepen customer loyalty through targeted content marketing.",
329
+
"title": "UX Design Manager"
330
+
},
331
+
{
332
+
"caseStudies": [
333
+
""
334
+
],
335
+
"client": "XXXXXXXX",
336
+
"company": "mediatonic",
337
+
"description": "I worked with product owners, game designers, artists and developers to create award-winning games for clients such as AdultSwim, Namco, SquareEnix and Ubisoft, as well as Mediatonic's own IP for mobile and console platforms. I researched, designed and tested new gaming experiences that attracted audiences, removed usability barriers to play, provided simple and clear feedback, and connected players on the couch and online. As the first UX designer at Mediatonic, I also promoted and coached better design principles and practices, and matured cross-functional collaboration rituals.",
338
+
"employmentType": "Full-time",
339
+
"endDate": "Mon Mar 03 2014 00:00:00 GMT+0000 (Coordinated Universal Time)",
340
+
"published": "Sun Jun 25 2023 06:48:40 GMT+0000 (Coordinated Universal Time)",
341
+
"skills": [
342
+
"design-systems",
343
+
"interaction-design",
344
+
"interface-design",
345
+
"usability-testing"
346
+
],
347
+
"slug": "ux-designer-mediatonic",
348
+
"startDate": "Wed Oct 10 2012 00:00:00 GMT+0000 (Coordinated Universal Time)",
349
+
"summary": "Enabling gamers to play more inclusive, approachable, fair and fun games.",
350
+
"title": "UX Designer"
351
+
},
352
+
{
353
+
"caseStudies": [
354
+
""
355
+
],
356
+
"client": "Scenestealer",
357
+
"company": "scenestealer",
358
+
"description": "",
359
+
"employmentType": "Contract",
360
+
"endDate": "Sun Sep 09 2012 00:00:00 GMT+0000 (Coordinated Universal Time)",
361
+
"published": "Sat Jun 24 2023 05:33:18 GMT+0000 (Coordinated Universal Time)",
362
+
"skills": [
363
+
"design-strategy",
364
+
"design-systems",
365
+
"interaction-design",
366
+
"interface-design",
367
+
"product-design",
368
+
"usability-testing",
369
+
"ux-research"
370
+
],
371
+
"slug": "ux-designer-scenestealer",
372
+
"startDate": "Wed Apr 04 2012 00:00:00 GMT+0000 (Coordinated Universal Time)",
373
+
"summary": "",
374
+
"title": "UX Designer"
375
+
},
376
+
{
377
+
"caseStudies": [
378
+
""
379
+
],
380
+
"client": "XXXXXXXX",
381
+
"company": "schlumberger",
382
+
"description": "",
383
+
"employmentType": "Contract",
384
+
"endDate": "Wed Apr 04 2012 00:00:00 GMT+0000 (Coordinated Universal Time)",
385
+
"published": "Sun Jun 25 2023 06:48:40 GMT+0000 (Coordinated Universal Time)",
386
+
"skills": [
387
+
"design-leadership",
388
+
"interface-design",
389
+
"interaction-design",
390
+
"information-architecture",
391
+
"stakeholder-engagement",
392
+
"usability-testing"
393
+
],
394
+
"slug": "ux-designer-slb",
395
+
"startDate": "Fri Jan 01 2010 00:00:00 GMT+0000 (Coordinated Universal Time)",
396
+
"summary": "",
397
+
"title": "UX Designer"
398
+
}
399
+
]
+142
src/data/json/skills.json
+142
src/data/json/skills.json
···
1
+
[
2
+
{
3
+
"name": "Accessibility",
4
+
"published": "Tue Jul 18 2023 05:51:50 GMT+0000 (Coordinated Universal Time)",
5
+
"slug": "accessibility"
6
+
},
7
+
{
8
+
"name": "Agile Methodologies",
9
+
"published": "Wed Jun 21 2023 10:12:05 GMT+0000 (Coordinated Universal Time)",
10
+
"slug": "agile-methodologies"
11
+
},
12
+
{
13
+
"name": "HTML, CSS & JS",
14
+
"published": "Tue Jul 18 2023 05:51:50 GMT+0000 (Coordinated Universal Time)",
15
+
"slug": "code"
16
+
},
17
+
{
18
+
"name": "Content Design",
19
+
"published": "Sun Jun 25 2023 10:13:32 GMT+0000 (Coordinated Universal Time)",
20
+
"slug": "content-design"
21
+
},
22
+
{
23
+
"name": "Data Visualisation",
24
+
"published": "",
25
+
"slug": "data-visualisation"
26
+
},
27
+
{
28
+
"name": "Data Visualization",
29
+
"published": "",
30
+
"slug": "data-visualization"
31
+
},
32
+
{
33
+
"name": "Design Leadership",
34
+
"published": "Wed Jun 21 2023 10:12:05 GMT+0000 (Coordinated Universal Time)",
35
+
"slug": "design-leadership"
36
+
},
37
+
{
38
+
"name": "Design Methodologies",
39
+
"published": "Wed Jun 21 2023 10:12:05 GMT+0000 (Coordinated Universal Time)",
40
+
"slug": "design-methodologies"
41
+
},
42
+
{
43
+
"name": "Design Operations",
44
+
"published": "Wed Jun 21 2023 10:12:05 GMT+0000 (Coordinated Universal Time)",
45
+
"slug": "design-operations"
46
+
},
47
+
{
48
+
"name": "Design Strategy",
49
+
"published": "Wed Jun 21 2023 10:12:05 GMT+0000 (Coordinated Universal Time)",
50
+
"slug": "design-strategy"
51
+
},
52
+
{
53
+
"name": "Design Systems",
54
+
"published": "Wed Jun 21 2023 10:12:05 GMT+0000 (Coordinated Universal Time)",
55
+
"slug": "design-systems"
56
+
},
57
+
{
58
+
"name": "Design Thinking",
59
+
"published": "Sun Jun 25 2023 10:13:32 GMT+0000 (Coordinated Universal Time)",
60
+
"slug": "design-thinking"
61
+
},
62
+
{
63
+
"name": "Digital Transformation",
64
+
"published": "",
65
+
"slug": "digital-transformation"
66
+
},
67
+
{
68
+
"name": "Information Architecture",
69
+
"published": "Wed Jun 21 2023 10:12:05 GMT+0000 (Coordinated Universal Time)",
70
+
"slug": "information-architecture"
71
+
},
72
+
{
73
+
"name": "Interaction Design",
74
+
"published": "Wed Jun 21 2023 10:12:05 GMT+0000 (Coordinated Universal Time)",
75
+
"slug": "interaction-design"
76
+
},
77
+
{
78
+
"name": "Interface Design",
79
+
"published": "Wed Jun 21 2023 10:12:05 GMT+0000 (Coordinated Universal Time)",
80
+
"slug": "interface-design"
81
+
},
82
+
{
83
+
"name": "Internet of Things (IoT)",
84
+
"published": "",
85
+
"slug": "internet-of-things"
86
+
},
87
+
{
88
+
"name": "Journey Mapping",
89
+
"published": "Wed Jun 21 2023 10:12:05 GMT+0000 (Coordinated Universal Time)",
90
+
"slug": "journey-mapping"
91
+
},
92
+
{
93
+
"name": "Lean UX",
94
+
"published": "Sun Jun 25 2023 10:13:32 GMT+0000 (Coordinated Universal Time)",
95
+
"slug": "lean-ux"
96
+
},
97
+
{
98
+
"name": "People Management",
99
+
"published": "Sun Jun 25 2023 10:43:48 GMT+0000 (Coordinated Universal Time)",
100
+
"slug": "people-management"
101
+
},
102
+
{
103
+
"name": "Persuasive Communication",
104
+
"published": "Sun Jun 25 2023 10:13:32 GMT+0000 (Coordinated Universal Time)",
105
+
"slug": "persuasive-communication"
106
+
},
107
+
{
108
+
"name": "Product Design",
109
+
"published": "Wed Jun 21 2023 10:12:05 GMT+0000 (Coordinated Universal Time)",
110
+
"slug": "product-design"
111
+
},
112
+
{
113
+
"name": "Rapid Prototyping",
114
+
"published": "Wed Jun 21 2023 10:12:05 GMT+0000 (Coordinated Universal Time)",
115
+
"slug": "rapid-prototyping"
116
+
},
117
+
{
118
+
"name": "Service Design",
119
+
"published": "Wed Jun 21 2023 10:12:05 GMT+0000 (Coordinated Universal Time)",
120
+
"slug": "service-design"
121
+
},
122
+
{
123
+
"name": "Stakeholder Engagement",
124
+
"published": "Wed Jun 21 2023 10:12:05 GMT+0000 (Coordinated Universal Time)",
125
+
"slug": "stakeholder-engagement"
126
+
},
127
+
{
128
+
"name": "Career Development",
129
+
"published": "Sun Jun 25 2023 10:43:48 GMT+0000 (Coordinated Universal Time)",
130
+
"slug": "team-management"
131
+
},
132
+
{
133
+
"name": "Usability Testing",
134
+
"published": "Wed Jun 21 2023 10:12:05 GMT+0000 (Coordinated Universal Time)",
135
+
"slug": "usability-testing"
136
+
},
137
+
{
138
+
"name": "UX Research",
139
+
"published": "Wed Jun 21 2023 10:12:05 GMT+0000 (Coordinated Universal Time)",
140
+
"slug": "ux-research"
141
+
}
142
+
]
+2
src/data/specializations.ts
+2
src/data/specializations.ts
+3975
src/global.css
+3975
src/global.css
···
1
+
html {
2
+
-webkit-text-size-adjust: 100%;
3
+
-ms-text-size-adjust: 100%;
4
+
font-family: sans-serif;
5
+
}
6
+
7
+
body {
8
+
margin: 0;
9
+
}
10
+
11
+
article,
12
+
aside,
13
+
details,
14
+
figcaption,
15
+
figure,
16
+
footer,
17
+
header,
18
+
hgroup,
19
+
main,
20
+
menu,
21
+
nav,
22
+
section,
23
+
summary {
24
+
display: block;
25
+
}
26
+
27
+
audio,
28
+
canvas,
29
+
progress,
30
+
video {
31
+
vertical-align: baseline;
32
+
display: inline-block;
33
+
}
34
+
35
+
audio:not([controls]) {
36
+
height: 0;
37
+
display: none;
38
+
}
39
+
40
+
[hidden],
41
+
template {
42
+
display: none;
43
+
}
44
+
45
+
a {
46
+
background-color: rgba(0, 0, 0, 0);
47
+
}
48
+
49
+
a:active,
50
+
a:hover {
51
+
outline: 0;
52
+
}
53
+
54
+
abbr[title] {
55
+
border-bottom: 1px dotted;
56
+
}
57
+
58
+
b,
59
+
strong {
60
+
font-weight: bold;
61
+
}
62
+
63
+
dfn {
64
+
font-style: italic;
65
+
}
66
+
67
+
h1 {
68
+
margin: 0.67em 0;
69
+
font-size: 2em;
70
+
}
71
+
72
+
mark {
73
+
color: #000;
74
+
background: #ff0;
75
+
}
76
+
77
+
small {
78
+
font-size: 80%;
79
+
}
80
+
81
+
sub,
82
+
sup {
83
+
vertical-align: baseline;
84
+
font-size: 75%;
85
+
line-height: 0;
86
+
position: relative;
87
+
}
88
+
89
+
sup {
90
+
top: -0.5em;
91
+
}
92
+
93
+
sub {
94
+
bottom: -0.25em;
95
+
}
96
+
97
+
img {
98
+
border: 0;
99
+
}
100
+
101
+
svg:not(:root) {
102
+
overflow: hidden;
103
+
}
104
+
105
+
hr {
106
+
box-sizing: content-box;
107
+
height: 0;
108
+
}
109
+
110
+
pre {
111
+
overflow: auto;
112
+
}
113
+
114
+
code,
115
+
kbd,
116
+
pre,
117
+
samp {
118
+
font-family: monospace;
119
+
font-size: 1em;
120
+
}
121
+
122
+
button,
123
+
input,
124
+
optgroup,
125
+
select,
126
+
textarea {
127
+
color: inherit;
128
+
font: inherit;
129
+
margin: 0;
130
+
}
131
+
132
+
button {
133
+
overflow: visible;
134
+
}
135
+
136
+
button,
137
+
select {
138
+
text-transform: none;
139
+
}
140
+
141
+
button,
142
+
html input[type='button'],
143
+
input[type='reset'] {
144
+
-webkit-appearance: button;
145
+
appearance: button;
146
+
cursor: pointer;
147
+
}
148
+
149
+
button[disabled],
150
+
html input[disabled] {
151
+
cursor: default;
152
+
}
153
+
154
+
button::-moz-focus-inner,
155
+
input::-moz-focus-inner {
156
+
border: 0;
157
+
padding: 0;
158
+
}
159
+
160
+
input {
161
+
line-height: normal;
162
+
}
163
+
164
+
input[type='checkbox'],
165
+
input[type='radio'] {
166
+
box-sizing: border-box;
167
+
padding: 0;
168
+
}
169
+
170
+
input[type='number']::-webkit-inner-spin-button,
171
+
input[type='number']::-webkit-outer-spin-button {
172
+
height: auto;
173
+
}
174
+
175
+
input[type='search'] {
176
+
-webkit-appearance: none;
177
+
appearance: none;
178
+
}
179
+
180
+
input[type='search']::-webkit-search-cancel-button,
181
+
input[type='search']::-webkit-search-decoration {
182
+
-webkit-appearance: none;
183
+
}
184
+
185
+
legend {
186
+
border: 0;
187
+
padding: 0;
188
+
}
189
+
190
+
textarea {
191
+
overflow: auto;
192
+
}
193
+
194
+
optgroup {
195
+
font-weight: bold;
196
+
}
197
+
198
+
table {
199
+
border-collapse: collapse;
200
+
border-spacing: 0;
201
+
}
202
+
203
+
td,
204
+
th {
205
+
padding: 0;
206
+
}
207
+
208
+
@font-face {
209
+
font-family: webflow-icons;
210
+
src: url('data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SBiUAAAC8AAAAYGNtYXDpP+a4AAABHAAAAFxnYXNwAAAAEAAAAXgAAAAIZ2x5ZmhS2XEAAAGAAAADHGhlYWQTFw3HAAAEnAAAADZoaGVhCXYFgQAABNQAAAAkaG10eCe4A1oAAAT4AAAAMGxvY2EDtALGAAAFKAAAABptYXhwABAAPgAABUQAAAAgbmFtZSoCsMsAAAVkAAABznBvc3QAAwAAAAAHNAAAACAAAwP4AZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADpAwPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAADAAAAAwAAABwAAQADAAAAHAADAAEAAAAcAAQAQAAAAAwACAACAAQAAQAg5gPpA//9//8AAAAAACDmAOkA//3//wAB/+MaBBcIAAMAAQAAAAAAAAAAAAAAAAABAAH//wAPAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAAAAAAAAAAAAAgAANzkBAAAAAAEBIAAAAyADgAAFAAAJAQcJARcDIP5AQAGA/oBAAcABwED+gP6AQAABAOAAAALgA4AABQAAEwEXCQEH4AHAQP6AAYBAAcABwED+gP6AQAAAAwDAAOADQALAAA8AHwAvAAABISIGHQEUFjMhMjY9ATQmByEiBh0BFBYzITI2PQE0JgchIgYdARQWMyEyNj0BNCYDIP3ADRMTDQJADRMTDf3ADRMTDQJADRMTDf3ADRMTDQJADRMTAsATDSANExMNIA0TwBMNIA0TEw0gDRPAEw0gDRMTDSANEwAAAAABAJ0AtAOBApUABQAACQIHCQEDJP7r/upcAXEBcgKU/usBFVz+fAGEAAAAAAL//f+9BAMDwwAEAAkAABcBJwEXAwE3AQdpA5ps/GZsbAOabPxmbEMDmmz8ZmwDmvxmbAOabAAAAgAA/8AEAAPAAB0AOwAABSInLgEnJjU0Nz4BNzYzMTIXHgEXFhUUBw4BBwYjNTI3PgE3NjU0Jy4BJyYjMSIHDgEHBhUUFx4BFxYzAgBqXV6LKCgoKIteXWpqXV6LKCgoKIteXWpVSktvICEhIG9LSlVVSktvICEhIG9LSlVAKCiLXl1qal1eiygoKCiLXl1qal1eiygoZiEgb0tKVVVKS28gISEgb0tKVVVKS28gIQABAAABwAIAA8AAEgAAEzQ3PgE3NjMxFSIHDgEHBhUxIwAoKIteXWpVSktvICFmAcBqXV6LKChmISBvS0pVAAAAAgAA/8AFtgPAADIAOgAAARYXHgEXFhUUBw4BBwYHIxUhIicuAScmNTQ3PgE3NjMxOAExNDc+ATc2MzIXHgEXFhcVATMJATMVMzUEjD83NlAXFxYXTjU1PQL8kz01Nk8XFxcXTzY1PSIjd1BQWlJJSXInJw3+mdv+2/7c25MCUQYcHFg5OUA/ODlXHBwIAhcXTzY1PTw1Nk8XF1tQUHcjIhwcYUNDTgL+3QFt/pOTkwABAAAAAQAAmM7nP18PPPUACwQAAAAAANciZKUAAAAA1yJkpf/9/70FtgPDAAAACAACAAAAAAAAAAEAAAPA/8AAAAW3//3//QW2AAEAAAAAAAAAAAAAAAAAAAAMBAAAAAAAAAAAAAAAAgAAAAQAASAEAADgBAAAwAQAAJ0EAP/9BAAAAAQAAAAFtwAAAAAAAAAKABQAHgAyAEYAjACiAL4BFgE2AY4AAAABAAAADAA8AAMAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAADgCuAAEAAAAAAAEADQAAAAEAAAAAAAIABwCWAAEAAAAAAAMADQBIAAEAAAAAAAQADQCrAAEAAAAAAAUACwAnAAEAAAAAAAYADQBvAAEAAAAAAAoAGgDSAAMAAQQJAAEAGgANAAMAAQQJAAIADgCdAAMAAQQJAAMAGgBVAAMAAQQJAAQAGgC4AAMAAQQJAAUAFgAyAAMAAQQJAAYAGgB8AAMAAQQJAAoANADsd2ViZmxvdy1pY29ucwB3AGUAYgBmAGwAbwB3AC0AaQBjAG8AbgBzVmVyc2lvbiAxLjAAVgBlAHIAcwBpAG8AbgAgADEALgAwd2ViZmxvdy1pY29ucwB3AGUAYgBmAGwAbwB3AC0AaQBjAG8AbgBzd2ViZmxvdy1pY29ucwB3AGUAYgBmAGwAbwB3AC0AaQBjAG8AbgBzUmVndWxhcgBSAGUAZwB1AGwAYQByd2ViZmxvdy1pY29ucwB3AGUAYgBmAGwAbwB3AC0AaQBjAG8AbgBzRm9udCBnZW5lcmF0ZWQgYnkgSWNvTW9vbi4ARgBvAG4AdAAgAGcAZQBuAGUAcgBhAHQAZQBkACAAYgB5ACAASQBjAG8ATQBvAG8AbgAuAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==')
211
+
format('truetype');
212
+
font-weight: normal;
213
+
font-style: normal;
214
+
}
215
+
216
+
[class^='w-icon-'],
217
+
[class*=' w-icon-'] {
218
+
font-variant: normal;
219
+
text-transform: none;
220
+
-webkit-font-smoothing: antialiased;
221
+
-moz-osx-font-smoothing: grayscale;
222
+
font-style: normal;
223
+
font-weight: normal;
224
+
line-height: 1;
225
+
font-family: webflow-icons !important;
226
+
}
227
+
228
+
.w-icon-slider-right:before {
229
+
content: '';
230
+
}
231
+
232
+
.w-icon-slider-left:before {
233
+
content: '';
234
+
}
235
+
236
+
.w-icon-nav-menu:before {
237
+
content: '';
238
+
}
239
+
240
+
.w-icon-arrow-down:before,
241
+
.w-icon-dropdown-toggle:before {
242
+
content: '';
243
+
}
244
+
245
+
.w-icon-file-upload-remove:before {
246
+
content: '';
247
+
}
248
+
249
+
.w-icon-file-upload-icon:before {
250
+
content: '';
251
+
}
252
+
253
+
* {
254
+
box-sizing: border-box;
255
+
}
256
+
257
+
html {
258
+
height: 100%;
259
+
}
260
+
261
+
body {
262
+
color: #333;
263
+
background-color: #fff;
264
+
min-height: 100%;
265
+
margin: 0;
266
+
font-family: Arial, sans-serif;
267
+
font-size: 14px;
268
+
line-height: 20px;
269
+
}
270
+
271
+
img {
272
+
vertical-align: middle;
273
+
max-width: 100%;
274
+
display: inline-block;
275
+
}
276
+
277
+
html.w-mod-touch * {
278
+
background-attachment: scroll !important;
279
+
}
280
+
281
+
.w-block {
282
+
display: block;
283
+
}
284
+
285
+
.w-inline-block {
286
+
max-width: 100%;
287
+
display: inline-block;
288
+
}
289
+
290
+
.w-clearfix:before,
291
+
.w-clearfix:after {
292
+
content: ' ';
293
+
grid-area: 1 / 1 / 2 / 2;
294
+
display: table;
295
+
}
296
+
297
+
.w-clearfix:after {
298
+
clear: both;
299
+
}
300
+
301
+
.w-hidden {
302
+
display: none;
303
+
}
304
+
305
+
.w-button {
306
+
color: #fff;
307
+
line-height: inherit;
308
+
cursor: pointer;
309
+
background-color: #3898ec;
310
+
border: 0;
311
+
border-radius: 0;
312
+
padding: 9px 15px;
313
+
text-decoration: none;
314
+
display: inline-block;
315
+
}
316
+
317
+
input.w-button {
318
+
-webkit-appearance: button;
319
+
appearance: button;
320
+
}
321
+
322
+
html[data-w-dynpage] [data-w-cloak] {
323
+
color: rgba(0, 0, 0, 0) !important;
324
+
}
325
+
326
+
.w-code-block {
327
+
margin: unset;
328
+
}
329
+
330
+
pre.w-code-block code {
331
+
all: inherit;
332
+
}
333
+
334
+
.w-webflow-badge,
335
+
.w-webflow-badge * {
336
+
z-index: auto;
337
+
visibility: visible;
338
+
box-sizing: border-box;
339
+
float: none;
340
+
clear: none;
341
+
box-shadow: none;
342
+
opacity: 1;
343
+
direction: ltr;
344
+
font-family: inherit;
345
+
font-weight: inherit;
346
+
color: inherit;
347
+
font-size: inherit;
348
+
line-height: inherit;
349
+
font-style: inherit;
350
+
font-variant: inherit;
351
+
text-align: inherit;
352
+
letter-spacing: inherit;
353
+
-webkit-text-decoration: inherit;
354
+
text-decoration: inherit;
355
+
text-indent: 0;
356
+
text-transform: inherit;
357
+
text-shadow: none;
358
+
cursor: inherit;
359
+
white-space: inherit;
360
+
word-break: normal;
361
+
word-spacing: normal;
362
+
word-wrap: normal;
363
+
background: none;
364
+
border: 0 rgba(0, 0, 0, 0);
365
+
border-radius: 0;
366
+
width: auto;
367
+
min-width: 0;
368
+
max-width: none;
369
+
height: auto;
370
+
min-height: 0;
371
+
max-height: none;
372
+
margin: 0;
373
+
padding: 0;
374
+
list-style-type: disc;
375
+
transition: none;
376
+
display: block;
377
+
position: static;
378
+
top: auto;
379
+
bottom: auto;
380
+
left: auto;
381
+
right: auto;
382
+
overflow: visible;
383
+
transform: none;
384
+
}
385
+
386
+
.w-webflow-badge {
387
+
white-space: nowrap;
388
+
cursor: pointer;
389
+
box-shadow:
390
+
0 0 0 1px rgba(0, 0, 0, 0.1),
391
+
0 1px 3px rgba(0, 0, 0, 0.1);
392
+
visibility: visible !important;
393
+
z-index: 2147483647 !important;
394
+
color: #aaadb0 !important;
395
+
opacity: 1 !important;
396
+
background-color: #fff !important;
397
+
border-radius: 3px !important;
398
+
width: auto !important;
399
+
height: auto !important;
400
+
margin: 0 !important;
401
+
padding: 6px !important;
402
+
font-size: 12px !important;
403
+
line-height: 14px !important;
404
+
text-decoration: none !important;
405
+
display: inline-block !important;
406
+
position: fixed !important;
407
+
top: auto !important;
408
+
bottom: 12px !important;
409
+
left: auto !important;
410
+
right: 12px !important;
411
+
overflow: visible !important;
412
+
transform: none !important;
413
+
}
414
+
415
+
.w-webflow-badge > img {
416
+
visibility: visible !important;
417
+
opacity: 1 !important;
418
+
vertical-align: middle !important;
419
+
display: inline-block !important;
420
+
}
421
+
422
+
h1,
423
+
h2,
424
+
h3,
425
+
h4,
426
+
h5,
427
+
h6 {
428
+
margin-bottom: 10px;
429
+
font-weight: bold;
430
+
}
431
+
432
+
h1 {
433
+
margin-top: 20px;
434
+
font-size: 38px;
435
+
line-height: 44px;
436
+
}
437
+
438
+
h2 {
439
+
margin-top: 20px;
440
+
font-size: 32px;
441
+
line-height: 36px;
442
+
}
443
+
444
+
h3 {
445
+
margin-top: 20px;
446
+
font-size: 24px;
447
+
line-height: 30px;
448
+
}
449
+
450
+
h4 {
451
+
margin-top: 10px;
452
+
font-size: 18px;
453
+
line-height: 24px;
454
+
}
455
+
456
+
h5 {
457
+
margin-top: 10px;
458
+
font-size: 14px;
459
+
line-height: 20px;
460
+
}
461
+
462
+
h6 {
463
+
margin-top: 10px;
464
+
font-size: 12px;
465
+
line-height: 18px;
466
+
}
467
+
468
+
p {
469
+
margin-top: 0;
470
+
margin-bottom: 10px;
471
+
}
472
+
473
+
blockquote {
474
+
border-left: 5px solid #e2e2e2;
475
+
margin: 0 0 10px;
476
+
padding: 10px 20px;
477
+
font-size: 18px;
478
+
line-height: 22px;
479
+
}
480
+
481
+
figure {
482
+
margin: 0 0 10px;
483
+
}
484
+
485
+
figcaption {
486
+
text-align: center;
487
+
margin-top: 5px;
488
+
}
489
+
490
+
ul,
491
+
ol {
492
+
margin-top: 0;
493
+
margin-bottom: 10px;
494
+
padding-left: 40px;
495
+
}
496
+
497
+
.w-list-unstyled {
498
+
padding-left: 0;
499
+
list-style: none;
500
+
}
501
+
502
+
.w-embed:before,
503
+
.w-embed:after {
504
+
content: ' ';
505
+
grid-area: 1 / 1 / 2 / 2;
506
+
display: table;
507
+
}
508
+
509
+
.w-embed:after {
510
+
clear: both;
511
+
}
512
+
513
+
.w-video {
514
+
width: 100%;
515
+
padding: 0;
516
+
position: relative;
517
+
}
518
+
519
+
.w-video iframe,
520
+
.w-video object,
521
+
.w-video embed {
522
+
border: none;
523
+
width: 100%;
524
+
height: 100%;
525
+
position: absolute;
526
+
top: 0;
527
+
left: 0;
528
+
}
529
+
530
+
fieldset {
531
+
border: 0;
532
+
margin: 0;
533
+
padding: 0;
534
+
}
535
+
536
+
button,
537
+
[type='button'],
538
+
[type='reset'] {
539
+
cursor: pointer;
540
+
-webkit-appearance: button;
541
+
appearance: button;
542
+
border: 0;
543
+
}
544
+
545
+
.w-form {
546
+
margin: 0 0 15px;
547
+
}
548
+
549
+
.w-form-done {
550
+
text-align: center;
551
+
background-color: #ddd;
552
+
padding: 20px;
553
+
display: none;
554
+
}
555
+
556
+
.w-form-fail {
557
+
background-color: #ffdede;
558
+
margin-top: 10px;
559
+
padding: 10px;
560
+
display: none;
561
+
}
562
+
563
+
label {
564
+
margin-bottom: 5px;
565
+
font-weight: bold;
566
+
display: block;
567
+
}
568
+
569
+
.w-input,
570
+
.w-select {
571
+
color: #333;
572
+
background-color: #fff;
573
+
border: 1px solid #ccc;
574
+
width: 100%;
575
+
height: 38px;
576
+
margin-bottom: 10px;
577
+
padding: 8px 12px;
578
+
font-size: 14px;
579
+
line-height: 1.42857;
580
+
display: block;
581
+
}
582
+
583
+
.w-input:-moz-placeholder,
584
+
.w-select:-moz-placeholder {
585
+
color: #999;
586
+
}
587
+
588
+
.w-input::-moz-placeholder,
589
+
.w-select::-moz-placeholder {
590
+
color: #999;
591
+
opacity: 1;
592
+
}
593
+
594
+
.w-input::-webkit-input-placeholder,
595
+
.w-select::-webkit-input-placeholder {
596
+
color: #999;
597
+
}
598
+
599
+
.w-input:focus,
600
+
.w-select:focus {
601
+
border-color: #3898ec;
602
+
outline: 0;
603
+
}
604
+
605
+
.w-input[disabled],
606
+
.w-select[disabled],
607
+
.w-input[readonly],
608
+
.w-select[readonly],
609
+
fieldset[disabled] .w-input,
610
+
fieldset[disabled] .w-select {
611
+
cursor: not-allowed;
612
+
}
613
+
614
+
.w-input[disabled]:not(.w-input-disabled),
615
+
.w-select[disabled]:not(.w-input-disabled),
616
+
.w-input[readonly],
617
+
.w-select[readonly],
618
+
fieldset[disabled]:not(.w-input-disabled) .w-input,
619
+
fieldset[disabled]:not(.w-input-disabled) .w-select {
620
+
background-color: #eee;
621
+
}
622
+
623
+
textarea.w-input,
624
+
textarea.w-select {
625
+
height: auto;
626
+
}
627
+
628
+
.w-select {
629
+
background-color: #f3f3f3;
630
+
}
631
+
632
+
.w-select[multiple] {
633
+
height: auto;
634
+
}
635
+
636
+
.w-form-label {
637
+
cursor: pointer;
638
+
margin-bottom: 0;
639
+
font-weight: normal;
640
+
display: inline-block;
641
+
}
642
+
643
+
.w-radio {
644
+
margin-bottom: 5px;
645
+
padding-left: 20px;
646
+
display: block;
647
+
}
648
+
649
+
.w-radio:before,
650
+
.w-radio:after {
651
+
content: ' ';
652
+
grid-area: 1 / 1 / 2 / 2;
653
+
display: table;
654
+
}
655
+
656
+
.w-radio:after {
657
+
clear: both;
658
+
}
659
+
660
+
.w-radio-input {
661
+
float: left;
662
+
margin: 3px 0 0 -20px;
663
+
line-height: normal;
664
+
}
665
+
666
+
.w-file-upload {
667
+
margin-bottom: 10px;
668
+
display: block;
669
+
}
670
+
671
+
.w-file-upload-input {
672
+
opacity: 0;
673
+
z-index: -100;
674
+
width: 0.1px;
675
+
height: 0.1px;
676
+
position: absolute;
677
+
overflow: hidden;
678
+
}
679
+
680
+
.w-file-upload-default,
681
+
.w-file-upload-uploading,
682
+
.w-file-upload-success {
683
+
color: #333;
684
+
display: inline-block;
685
+
}
686
+
687
+
.w-file-upload-error {
688
+
margin-top: 10px;
689
+
display: block;
690
+
}
691
+
692
+
.w-file-upload-default.w-hidden,
693
+
.w-file-upload-uploading.w-hidden,
694
+
.w-file-upload-error.w-hidden,
695
+
.w-file-upload-success.w-hidden {
696
+
display: none;
697
+
}
698
+
699
+
.w-file-upload-uploading-btn {
700
+
cursor: pointer;
701
+
background-color: #fafafa;
702
+
border: 1px solid #ccc;
703
+
margin: 0;
704
+
padding: 8px 12px;
705
+
font-size: 14px;
706
+
font-weight: normal;
707
+
display: flex;
708
+
}
709
+
710
+
.w-file-upload-file {
711
+
background-color: #fafafa;
712
+
border: 1px solid #ccc;
713
+
flex-grow: 1;
714
+
justify-content: space-between;
715
+
margin: 0;
716
+
padding: 8px 9px 8px 11px;
717
+
display: flex;
718
+
}
719
+
720
+
.w-file-upload-file-name {
721
+
font-size: 14px;
722
+
font-weight: normal;
723
+
display: block;
724
+
}
725
+
726
+
.w-file-remove-link {
727
+
cursor: pointer;
728
+
width: auto;
729
+
height: auto;
730
+
margin-top: 3px;
731
+
margin-left: 10px;
732
+
padding: 3px;
733
+
display: block;
734
+
}
735
+
736
+
.w-icon-file-upload-remove {
737
+
margin: auto;
738
+
font-size: 10px;
739
+
}
740
+
741
+
.w-file-upload-error-msg {
742
+
color: #ea384c;
743
+
padding: 2px 0;
744
+
display: inline-block;
745
+
}
746
+
747
+
.w-file-upload-info {
748
+
padding: 0 12px;
749
+
line-height: 38px;
750
+
display: inline-block;
751
+
}
752
+
753
+
.w-file-upload-label {
754
+
cursor: pointer;
755
+
background-color: #fafafa;
756
+
border: 1px solid #ccc;
757
+
margin: 0;
758
+
padding: 8px 12px;
759
+
font-size: 14px;
760
+
font-weight: normal;
761
+
display: inline-block;
762
+
}
763
+
764
+
.w-icon-file-upload-icon,
765
+
.w-icon-file-upload-uploading {
766
+
width: 20px;
767
+
margin-right: 8px;
768
+
display: inline-block;
769
+
}
770
+
771
+
.w-icon-file-upload-uploading {
772
+
height: 20px;
773
+
}
774
+
775
+
.w-container {
776
+
max-width: 940px;
777
+
margin-left: auto;
778
+
margin-right: auto;
779
+
}
780
+
781
+
.w-container:before,
782
+
.w-container:after {
783
+
content: ' ';
784
+
grid-area: 1 / 1 / 2 / 2;
785
+
display: table;
786
+
}
787
+
788
+
.w-container:after {
789
+
clear: both;
790
+
}
791
+
792
+
.w-container .w-row {
793
+
margin-left: -10px;
794
+
margin-right: -10px;
795
+
}
796
+
797
+
.w-row:before,
798
+
.w-row:after {
799
+
content: ' ';
800
+
grid-area: 1 / 1 / 2 / 2;
801
+
display: table;
802
+
}
803
+
804
+
.w-row:after {
805
+
clear: both;
806
+
}
807
+
808
+
.w-row .w-row {
809
+
margin-left: 0;
810
+
margin-right: 0;
811
+
}
812
+
813
+
.w-col {
814
+
float: left;
815
+
width: 100%;
816
+
min-height: 1px;
817
+
padding-left: 10px;
818
+
padding-right: 10px;
819
+
position: relative;
820
+
}
821
+
822
+
.w-col .w-col {
823
+
padding-left: 0;
824
+
padding-right: 0;
825
+
}
826
+
827
+
.w-col-1 {
828
+
width: 8.33333%;
829
+
}
830
+
831
+
.w-col-2 {
832
+
width: 16.6667%;
833
+
}
834
+
835
+
.w-col-3 {
836
+
width: 25%;
837
+
}
838
+
839
+
.w-col-4 {
840
+
width: 33.3333%;
841
+
}
842
+
843
+
.w-col-5 {
844
+
width: 41.6667%;
845
+
}
846
+
847
+
.w-col-6 {
848
+
width: 50%;
849
+
}
850
+
851
+
.w-col-7 {
852
+
width: 58.3333%;
853
+
}
854
+
855
+
.w-col-8 {
856
+
width: 66.6667%;
857
+
}
858
+
859
+
.w-col-9 {
860
+
width: 75%;
861
+
}
862
+
863
+
.w-col-10 {
864
+
width: 83.3333%;
865
+
}
866
+
867
+
.w-col-11 {
868
+
width: 91.6667%;
869
+
}
870
+
871
+
.w-col-12 {
872
+
width: 100%;
873
+
}
874
+
875
+
.w-hidden-main {
876
+
display: none !important;
877
+
}
878
+
879
+
@media screen and (max-width: 991px) {
880
+
.w-container {
881
+
max-width: 728px;
882
+
}
883
+
884
+
.w-hidden-main {
885
+
display: inherit !important;
886
+
}
887
+
888
+
.w-hidden-medium {
889
+
display: none !important;
890
+
}
891
+
892
+
.w-col-medium-1 {
893
+
width: 8.33333%;
894
+
}
895
+
896
+
.w-col-medium-2 {
897
+
width: 16.6667%;
898
+
}
899
+
900
+
.w-col-medium-3 {
901
+
width: 25%;
902
+
}
903
+
904
+
.w-col-medium-4 {
905
+
width: 33.3333%;
906
+
}
907
+
908
+
.w-col-medium-5 {
909
+
width: 41.6667%;
910
+
}
911
+
912
+
.w-col-medium-6 {
913
+
width: 50%;
914
+
}
915
+
916
+
.w-col-medium-7 {
917
+
width: 58.3333%;
918
+
}
919
+
920
+
.w-col-medium-8 {
921
+
width: 66.6667%;
922
+
}
923
+
924
+
.w-col-medium-9 {
925
+
width: 75%;
926
+
}
927
+
928
+
.w-col-medium-10 {
929
+
width: 83.3333%;
930
+
}
931
+
932
+
.w-col-medium-11 {
933
+
width: 91.6667%;
934
+
}
935
+
936
+
.w-col-medium-12 {
937
+
width: 100%;
938
+
}
939
+
940
+
.w-col-stack {
941
+
width: 100%;
942
+
left: auto;
943
+
right: auto;
944
+
}
945
+
}
946
+
947
+
@media screen and (max-width: 767px) {
948
+
.w-hidden-main,
949
+
.w-hidden-medium {
950
+
display: inherit !important;
951
+
}
952
+
953
+
.w-hidden-small {
954
+
display: none !important;
955
+
}
956
+
957
+
.w-row,
958
+
.w-container .w-row {
959
+
margin-left: 0;
960
+
margin-right: 0;
961
+
}
962
+
963
+
.w-col {
964
+
width: 100%;
965
+
left: auto;
966
+
right: auto;
967
+
}
968
+
969
+
.w-col-small-1 {
970
+
width: 8.33333%;
971
+
}
972
+
973
+
.w-col-small-2 {
974
+
width: 16.6667%;
975
+
}
976
+
977
+
.w-col-small-3 {
978
+
width: 25%;
979
+
}
980
+
981
+
.w-col-small-4 {
982
+
width: 33.3333%;
983
+
}
984
+
985
+
.w-col-small-5 {
986
+
width: 41.6667%;
987
+
}
988
+
989
+
.w-col-small-6 {
990
+
width: 50%;
991
+
}
992
+
993
+
.w-col-small-7 {
994
+
width: 58.3333%;
995
+
}
996
+
997
+
.w-col-small-8 {
998
+
width: 66.6667%;
999
+
}
1000
+
1001
+
.w-col-small-9 {
1002
+
width: 75%;
1003
+
}
1004
+
1005
+
.w-col-small-10 {
1006
+
width: 83.3333%;
1007
+
}
1008
+
1009
+
.w-col-small-11 {
1010
+
width: 91.6667%;
1011
+
}
1012
+
1013
+
.w-col-small-12 {
1014
+
width: 100%;
1015
+
}
1016
+
}
1017
+
1018
+
@media screen and (max-width: 479px) {
1019
+
.w-container {
1020
+
max-width: none;
1021
+
}
1022
+
1023
+
.w-hidden-main,
1024
+
.w-hidden-medium,
1025
+
.w-hidden-small {
1026
+
display: inherit !important;
1027
+
}
1028
+
1029
+
.w-hidden-tiny {
1030
+
display: none !important;
1031
+
}
1032
+
1033
+
.w-col {
1034
+
width: 100%;
1035
+
}
1036
+
1037
+
.w-col-tiny-1 {
1038
+
width: 8.33333%;
1039
+
}
1040
+
1041
+
.w-col-tiny-2 {
1042
+
width: 16.6667%;
1043
+
}
1044
+
1045
+
.w-col-tiny-3 {
1046
+
width: 25%;
1047
+
}
1048
+
1049
+
.w-col-tiny-4 {
1050
+
width: 33.3333%;
1051
+
}
1052
+
1053
+
.w-col-tiny-5 {
1054
+
width: 41.6667%;
1055
+
}
1056
+
1057
+
.w-col-tiny-6 {
1058
+
width: 50%;
1059
+
}
1060
+
1061
+
.w-col-tiny-7 {
1062
+
width: 58.3333%;
1063
+
}
1064
+
1065
+
.w-col-tiny-8 {
1066
+
width: 66.6667%;
1067
+
}
1068
+
1069
+
.w-col-tiny-9 {
1070
+
width: 75%;
1071
+
}
1072
+
1073
+
.w-col-tiny-10 {
1074
+
width: 83.3333%;
1075
+
}
1076
+
1077
+
.w-col-tiny-11 {
1078
+
width: 91.6667%;
1079
+
}
1080
+
1081
+
.w-col-tiny-12 {
1082
+
width: 100%;
1083
+
}
1084
+
}
1085
+
1086
+
.w-widget {
1087
+
position: relative;
1088
+
}
1089
+
1090
+
.w-widget-map {
1091
+
width: 100%;
1092
+
height: 400px;
1093
+
}
1094
+
1095
+
.w-widget-map label {
1096
+
width: auto;
1097
+
display: inline;
1098
+
}
1099
+
1100
+
.w-widget-map img {
1101
+
max-width: inherit;
1102
+
}
1103
+
1104
+
.w-widget-map .gm-style-iw {
1105
+
text-align: center;
1106
+
}
1107
+
1108
+
.w-widget-map .gm-style-iw > button {
1109
+
display: none !important;
1110
+
}
1111
+
1112
+
.w-widget-twitter {
1113
+
overflow: hidden;
1114
+
}
1115
+
1116
+
.w-widget-twitter-count-shim {
1117
+
vertical-align: top;
1118
+
text-align: center;
1119
+
background: #fff;
1120
+
border: 1px solid #758696;
1121
+
border-radius: 3px;
1122
+
width: 28px;
1123
+
height: 20px;
1124
+
display: inline-block;
1125
+
position: relative;
1126
+
}
1127
+
1128
+
.w-widget-twitter-count-shim * {
1129
+
pointer-events: none;
1130
+
-webkit-user-select: none;
1131
+
-ms-user-select: none;
1132
+
user-select: none;
1133
+
}
1134
+
1135
+
.w-widget-twitter-count-shim .w-widget-twitter-count-inner {
1136
+
text-align: center;
1137
+
color: #999;
1138
+
font-family: serif;
1139
+
font-size: 15px;
1140
+
line-height: 12px;
1141
+
position: relative;
1142
+
}
1143
+
1144
+
.w-widget-twitter-count-shim .w-widget-twitter-count-clear {
1145
+
display: block;
1146
+
position: relative;
1147
+
}
1148
+
1149
+
.w-widget-twitter-count-shim.w--large {
1150
+
width: 36px;
1151
+
height: 28px;
1152
+
}
1153
+
1154
+
.w-widget-twitter-count-shim.w--large .w-widget-twitter-count-inner {
1155
+
font-size: 18px;
1156
+
line-height: 18px;
1157
+
}
1158
+
1159
+
.w-widget-twitter-count-shim:not(.w--vertical) {
1160
+
margin-left: 5px;
1161
+
margin-right: 8px;
1162
+
}
1163
+
1164
+
.w-widget-twitter-count-shim:not(.w--vertical).w--large {
1165
+
margin-left: 6px;
1166
+
}
1167
+
1168
+
.w-widget-twitter-count-shim:not(.w--vertical):before,
1169
+
.w-widget-twitter-count-shim:not(.w--vertical):after {
1170
+
content: ' ';
1171
+
pointer-events: none;
1172
+
border: solid rgba(0, 0, 0, 0);
1173
+
width: 0;
1174
+
height: 0;
1175
+
position: absolute;
1176
+
top: 50%;
1177
+
left: 0;
1178
+
}
1179
+
1180
+
.w-widget-twitter-count-shim:not(.w--vertical):before {
1181
+
border-width: 4px;
1182
+
border-color: rgba(117, 134, 150, 0) #5d6c7b rgba(117, 134, 150, 0) rgba(117, 134, 150, 0);
1183
+
margin-top: -4px;
1184
+
margin-left: -9px;
1185
+
}
1186
+
1187
+
.w-widget-twitter-count-shim:not(.w--vertical).w--large:before {
1188
+
border-width: 5px;
1189
+
margin-top: -5px;
1190
+
margin-left: -10px;
1191
+
}
1192
+
1193
+
.w-widget-twitter-count-shim:not(.w--vertical):after {
1194
+
border-width: 4px;
1195
+
border-color: rgba(255, 255, 255, 0) #fff rgba(255, 255, 255, 0) rgba(255, 255, 255, 0);
1196
+
margin-top: -4px;
1197
+
margin-left: -8px;
1198
+
}
1199
+
1200
+
.w-widget-twitter-count-shim:not(.w--vertical).w--large:after {
1201
+
border-width: 5px;
1202
+
margin-top: -5px;
1203
+
margin-left: -9px;
1204
+
}
1205
+
1206
+
.w-widget-twitter-count-shim.w--vertical {
1207
+
width: 61px;
1208
+
height: 33px;
1209
+
margin-bottom: 8px;
1210
+
}
1211
+
1212
+
.w-widget-twitter-count-shim.w--vertical:before,
1213
+
.w-widget-twitter-count-shim.w--vertical:after {
1214
+
content: ' ';
1215
+
pointer-events: none;
1216
+
border: solid rgba(0, 0, 0, 0);
1217
+
width: 0;
1218
+
height: 0;
1219
+
position: absolute;
1220
+
top: 100%;
1221
+
left: 50%;
1222
+
}
1223
+
1224
+
.w-widget-twitter-count-shim.w--vertical:before {
1225
+
border-width: 5px;
1226
+
border-color: #5d6c7b rgba(117, 134, 150, 0) rgba(117, 134, 150, 0);
1227
+
margin-left: -5px;
1228
+
}
1229
+
1230
+
.w-widget-twitter-count-shim.w--vertical:after {
1231
+
border-width: 4px;
1232
+
border-color: #fff rgba(255, 255, 255, 0) rgba(255, 255, 255, 0);
1233
+
margin-left: -4px;
1234
+
}
1235
+
1236
+
.w-widget-twitter-count-shim.w--vertical .w-widget-twitter-count-inner {
1237
+
font-size: 18px;
1238
+
line-height: 22px;
1239
+
}
1240
+
1241
+
.w-widget-twitter-count-shim.w--vertical.w--large {
1242
+
width: 76px;
1243
+
}
1244
+
1245
+
.w-background-video {
1246
+
color: #fff;
1247
+
height: 500px;
1248
+
position: relative;
1249
+
overflow: hidden;
1250
+
}
1251
+
1252
+
.w-background-video > video {
1253
+
object-fit: cover;
1254
+
z-index: -100;
1255
+
background-position: 50%;
1256
+
background-size: cover;
1257
+
width: 100%;
1258
+
height: 100%;
1259
+
margin: auto;
1260
+
position: absolute;
1261
+
top: -100%;
1262
+
bottom: -100%;
1263
+
left: -100%;
1264
+
right: -100%;
1265
+
}
1266
+
1267
+
.w-background-video > video::-webkit-media-controls-start-playback-button {
1268
+
-webkit-appearance: none;
1269
+
display: none !important;
1270
+
}
1271
+
1272
+
.w-background-video--control {
1273
+
background-color: rgba(0, 0, 0, 0);
1274
+
padding: 0;
1275
+
position: absolute;
1276
+
bottom: 1em;
1277
+
right: 1em;
1278
+
}
1279
+
1280
+
.w-background-video--control > [hidden] {
1281
+
display: none !important;
1282
+
}
1283
+
1284
+
.w-slider {
1285
+
text-align: center;
1286
+
clear: both;
1287
+
1288
+
background: #ddd;
1289
+
height: 300px;
1290
+
position: relative;
1291
+
}
1292
+
1293
+
.w-slider-mask {
1294
+
z-index: 1;
1295
+
white-space: nowrap;
1296
+
height: 100%;
1297
+
display: block;
1298
+
position: relative;
1299
+
left: 0;
1300
+
right: 0;
1301
+
overflow: hidden;
1302
+
}
1303
+
1304
+
.w-slide {
1305
+
vertical-align: top;
1306
+
white-space: normal;
1307
+
text-align: left;
1308
+
width: 100%;
1309
+
height: 100%;
1310
+
display: inline-block;
1311
+
position: relative;
1312
+
}
1313
+
1314
+
.w-slider-nav {
1315
+
z-index: 2;
1316
+
text-align: center;
1317
+
1318
+
height: 40px;
1319
+
margin: auto;
1320
+
padding-top: 10px;
1321
+
position: absolute;
1322
+
top: auto;
1323
+
bottom: 0;
1324
+
left: 0;
1325
+
right: 0;
1326
+
}
1327
+
1328
+
.w-slider-nav.w-round > div {
1329
+
border-radius: 100%;
1330
+
}
1331
+
1332
+
.w-slider-nav.w-num > div {
1333
+
font-size: inherit;
1334
+
line-height: inherit;
1335
+
width: auto;
1336
+
height: auto;
1337
+
padding: 0.2em 0.5em;
1338
+
}
1339
+
1340
+
.w-slider-nav.w-shadow > div {
1341
+
box-shadow: 0 0 3px rgba(51, 51, 51, 0.4);
1342
+
}
1343
+
1344
+
.w-slider-nav-invert {
1345
+
color: #fff;
1346
+
}
1347
+
1348
+
.w-slider-nav-invert > div {
1349
+
background-color: rgba(34, 34, 34, 0.4);
1350
+
}
1351
+
1352
+
.w-slider-nav-invert > div.w-active {
1353
+
background-color: #222;
1354
+
}
1355
+
1356
+
.w-slider-dot {
1357
+
cursor: pointer;
1358
+
background-color: rgba(255, 255, 255, 0.4);
1359
+
width: 1em;
1360
+
height: 1em;
1361
+
margin: 0 3px 0.5em;
1362
+
transition:
1363
+
background-color 0.1s,
1364
+
color 0.1s;
1365
+
display: inline-block;
1366
+
position: relative;
1367
+
}
1368
+
1369
+
.w-slider-dot.w-active {
1370
+
background-color: #fff;
1371
+
}
1372
+
1373
+
.w-slider-dot:focus {
1374
+
outline: none;
1375
+
box-shadow: 0 0 0 2px #fff;
1376
+
}
1377
+
1378
+
.w-slider-dot:focus.w-active {
1379
+
box-shadow: none;
1380
+
}
1381
+
1382
+
.w-slider-arrow-left,
1383
+
.w-slider-arrow-right {
1384
+
cursor: pointer;
1385
+
color: #fff;
1386
+
1387
+
-webkit-user-select: none;
1388
+
-ms-user-select: none;
1389
+
user-select: none;
1390
+
width: 80px;
1391
+
margin: auto;
1392
+
font-size: 40px;
1393
+
position: absolute;
1394
+
top: 0;
1395
+
bottom: 0;
1396
+
left: 0;
1397
+
right: 0;
1398
+
overflow: hidden;
1399
+
}
1400
+
1401
+
.w-slider-arrow-left [class^='w-icon-'],
1402
+
.w-slider-arrow-right [class^='w-icon-'],
1403
+
.w-slider-arrow-left [class*=' w-icon-'],
1404
+
.w-slider-arrow-right [class*=' w-icon-'] {
1405
+
position: absolute;
1406
+
}
1407
+
1408
+
.w-slider-arrow-left:focus,
1409
+
.w-slider-arrow-right:focus {
1410
+
outline: 0;
1411
+
}
1412
+
1413
+
.w-slider-arrow-left {
1414
+
z-index: 3;
1415
+
right: auto;
1416
+
}
1417
+
1418
+
.w-slider-arrow-right {
1419
+
z-index: 4;
1420
+
left: auto;
1421
+
}
1422
+
1423
+
.w-icon-slider-left,
1424
+
.w-icon-slider-right {
1425
+
width: 1em;
1426
+
height: 1em;
1427
+
margin: auto;
1428
+
top: 0;
1429
+
bottom: 0;
1430
+
left: 0;
1431
+
right: 0;
1432
+
}
1433
+
1434
+
.w-slider-aria-label {
1435
+
clip: rect(0 0 0 0);
1436
+
border: 0;
1437
+
width: 1px;
1438
+
height: 1px;
1439
+
margin: -1px;
1440
+
padding: 0;
1441
+
position: absolute;
1442
+
overflow: hidden;
1443
+
}
1444
+
1445
+
.w-slider-force-show {
1446
+
display: block !important;
1447
+
}
1448
+
1449
+
.w-dropdown {
1450
+
text-align: left;
1451
+
z-index: 900;
1452
+
margin-left: auto;
1453
+
margin-right: auto;
1454
+
display: inline-block;
1455
+
position: relative;
1456
+
}
1457
+
1458
+
.w-dropdown-btn,
1459
+
.w-dropdown-toggle,
1460
+
.w-dropdown-link {
1461
+
vertical-align: top;
1462
+
color: #222;
1463
+
text-align: left;
1464
+
white-space: nowrap;
1465
+
margin-left: auto;
1466
+
margin-right: auto;
1467
+
padding: 20px;
1468
+
text-decoration: none;
1469
+
position: relative;
1470
+
}
1471
+
1472
+
.w-dropdown-toggle {
1473
+
-webkit-user-select: none;
1474
+
-ms-user-select: none;
1475
+
user-select: none;
1476
+
cursor: pointer;
1477
+
padding-right: 40px;
1478
+
display: inline-block;
1479
+
}
1480
+
1481
+
.w-dropdown-toggle:focus {
1482
+
outline: 0;
1483
+
}
1484
+
1485
+
.w-icon-dropdown-toggle {
1486
+
width: 1em;
1487
+
height: 1em;
1488
+
margin: auto 20px auto auto;
1489
+
position: absolute;
1490
+
top: 0;
1491
+
bottom: 0;
1492
+
right: 0;
1493
+
}
1494
+
1495
+
.w-dropdown-list {
1496
+
background: #ddd;
1497
+
min-width: 100%;
1498
+
display: none;
1499
+
position: absolute;
1500
+
}
1501
+
1502
+
.w-dropdown-list.w--open {
1503
+
display: block;
1504
+
}
1505
+
1506
+
.w-dropdown-link {
1507
+
color: #222;
1508
+
padding: 10px 20px;
1509
+
display: block;
1510
+
}
1511
+
1512
+
.w-dropdown-link.w--current {
1513
+
color: #0082f3;
1514
+
}
1515
+
1516
+
.w-dropdown-link:focus {
1517
+
outline: 0;
1518
+
}
1519
+
1520
+
@media screen and (max-width: 767px) {
1521
+
.w-nav-brand {
1522
+
padding-left: 10px;
1523
+
}
1524
+
}
1525
+
1526
+
.w-lightbox-backdrop {
1527
+
cursor: auto;
1528
+
letter-spacing: normal;
1529
+
text-indent: 0;
1530
+
text-shadow: none;
1531
+
text-transform: none;
1532
+
visibility: visible;
1533
+
white-space: normal;
1534
+
word-break: normal;
1535
+
word-spacing: normal;
1536
+
word-wrap: normal;
1537
+
color: #fff;
1538
+
text-align: center;
1539
+
z-index: 2000;
1540
+
opacity: 0;
1541
+
-webkit-tap-highlight-color: transparent;
1542
+
background: rgba(0, 0, 0, 0.9);
1543
+
outline: 0;
1544
+
font-family:
1545
+
Helvetica Neue,
1546
+
Helvetica,
1547
+
Ubuntu,
1548
+
Segoe UI,
1549
+
Verdana,
1550
+
sans-serif;
1551
+
font-size: 17px;
1552
+
font-style: normal;
1553
+
font-weight: 300;
1554
+
line-height: 1.2;
1555
+
list-style: disc;
1556
+
position: fixed;
1557
+
top: 0;
1558
+
bottom: 0;
1559
+
left: 0;
1560
+
right: 0;
1561
+
-webkit-transform: translate(0);
1562
+
transform: translate(0);
1563
+
}
1564
+
1565
+
.w-lightbox-backdrop,
1566
+
.w-lightbox-container {
1567
+
-webkit-overflow-scrolling: touch;
1568
+
height: 100%;
1569
+
overflow: auto;
1570
+
}
1571
+
1572
+
.w-lightbox-content {
1573
+
height: 100vh;
1574
+
position: relative;
1575
+
overflow: hidden;
1576
+
}
1577
+
1578
+
.w-lightbox-view {
1579
+
opacity: 0;
1580
+
width: 100vw;
1581
+
height: 100vh;
1582
+
position: absolute;
1583
+
}
1584
+
1585
+
.w-lightbox-view:before {
1586
+
content: '';
1587
+
height: 100vh;
1588
+
}
1589
+
1590
+
.w-lightbox-group,
1591
+
.w-lightbox-group .w-lightbox-view,
1592
+
.w-lightbox-group .w-lightbox-view:before {
1593
+
height: 86vh;
1594
+
}
1595
+
1596
+
.w-lightbox-frame,
1597
+
.w-lightbox-view:before {
1598
+
vertical-align: middle;
1599
+
display: inline-block;
1600
+
}
1601
+
1602
+
.w-lightbox-figure {
1603
+
margin: 0;
1604
+
position: relative;
1605
+
}
1606
+
1607
+
.w-lightbox-group .w-lightbox-figure {
1608
+
cursor: pointer;
1609
+
}
1610
+
1611
+
.w-lightbox-img {
1612
+
width: auto;
1613
+
max-width: none;
1614
+
height: auto;
1615
+
}
1616
+
1617
+
.w-lightbox-image {
1618
+
float: none;
1619
+
max-width: 100vw;
1620
+
max-height: 100vh;
1621
+
display: block;
1622
+
}
1623
+
1624
+
.w-lightbox-group .w-lightbox-image {
1625
+
max-height: 86vh;
1626
+
}
1627
+
1628
+
.w-lightbox-caption {
1629
+
text-align: left;
1630
+
text-overflow: ellipsis;
1631
+
white-space: nowrap;
1632
+
background: rgba(0, 0, 0, 0.4);
1633
+
padding: 0.5em 1em;
1634
+
position: absolute;
1635
+
bottom: 0;
1636
+
left: 0;
1637
+
right: 0;
1638
+
overflow: hidden;
1639
+
}
1640
+
1641
+
.w-lightbox-embed {
1642
+
width: 100%;
1643
+
height: 100%;
1644
+
position: absolute;
1645
+
top: 0;
1646
+
bottom: 0;
1647
+
left: 0;
1648
+
right: 0;
1649
+
}
1650
+
1651
+
.w-lightbox-control {
1652
+
cursor: pointer;
1653
+
background-position: center;
1654
+
background-repeat: no-repeat;
1655
+
background-size: 24px;
1656
+
width: 4em;
1657
+
transition: all 0.3s;
1658
+
position: absolute;
1659
+
top: 0;
1660
+
}
1661
+
1662
+
.w-lightbox-left {
1663
+
background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9Ii0yMCAwIDI0IDQwIiB3aWR0aD0iMjQiIGhlaWdodD0iNDAiPjxnIHRyYW5zZm9ybT0icm90YXRlKDQ1KSI+PHBhdGggZD0ibTAgMGg1djIzaDIzdjVoLTI4eiIgb3BhY2l0eT0iLjQiLz48cGF0aCBkPSJtMSAxaDN2MjNoMjN2M2gtMjZ6IiBmaWxsPSIjZmZmIi8+PC9nPjwvc3ZnPg==');
1664
+
display: none;
1665
+
bottom: 0;
1666
+
left: 0;
1667
+
}
1668
+
1669
+
.w-lightbox-right {
1670
+
background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9Ii00IDAgMjQgNDAiIHdpZHRoPSIyNCIgaGVpZ2h0PSI0MCI+PGcgdHJhbnNmb3JtPSJyb3RhdGUoNDUpIj48cGF0aCBkPSJtMC0waDI4djI4aC01di0yM2gtMjN6IiBvcGFjaXR5PSIuNCIvPjxwYXRoIGQ9Im0xIDFoMjZ2MjZoLTN2LTIzaC0yM3oiIGZpbGw9IiNmZmYiLz48L2c+PC9zdmc+');
1671
+
display: none;
1672
+
bottom: 0;
1673
+
right: 0;
1674
+
}
1675
+
1676
+
.w-lightbox-close {
1677
+
background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9Ii00IDAgMTggMTciIHdpZHRoPSIxOCIgaGVpZ2h0PSIxNyI+PGcgdHJhbnNmb3JtPSJyb3RhdGUoNDUpIj48cGF0aCBkPSJtMCAwaDd2LTdoNXY3aDd2NWgtN3Y3aC01di03aC03eiIgb3BhY2l0eT0iLjQiLz48cGF0aCBkPSJtMSAxaDd2LTdoM3Y3aDd2M2gtN3Y3aC0zdi03aC03eiIgZmlsbD0iI2ZmZiIvPjwvZz48L3N2Zz4=');
1678
+
background-size: 18px;
1679
+
height: 2.6em;
1680
+
right: 0;
1681
+
}
1682
+
1683
+
.w-lightbox-strip {
1684
+
white-space: nowrap;
1685
+
padding: 0 1vh;
1686
+
line-height: 0;
1687
+
position: absolute;
1688
+
bottom: 0;
1689
+
left: 0;
1690
+
right: 0;
1691
+
overflow-x: auto;
1692
+
overflow-y: hidden;
1693
+
}
1694
+
1695
+
.w-lightbox-item {
1696
+
box-sizing: content-box;
1697
+
cursor: pointer;
1698
+
width: 10vh;
1699
+
padding: 2vh 1vh;
1700
+
display: inline-block;
1701
+
-webkit-transform: translate3d(0, 0, 0);
1702
+
transform: translate3d(0, 0, 0);
1703
+
}
1704
+
1705
+
.w-lightbox-active {
1706
+
opacity: 0.3;
1707
+
}
1708
+
1709
+
.w-lightbox-thumbnail {
1710
+
background: #222;
1711
+
height: 10vh;
1712
+
position: relative;
1713
+
overflow: hidden;
1714
+
}
1715
+
1716
+
.w-lightbox-thumbnail-image {
1717
+
position: absolute;
1718
+
top: 0;
1719
+
left: 0;
1720
+
}
1721
+
1722
+
.w-lightbox-thumbnail .w-lightbox-tall {
1723
+
width: 100%;
1724
+
top: 50%;
1725
+
transform: translate(0, -50%);
1726
+
}
1727
+
1728
+
.w-lightbox-thumbnail .w-lightbox-wide {
1729
+
height: 100%;
1730
+
left: 50%;
1731
+
transform: translate(-50%);
1732
+
}
1733
+
1734
+
.w-lightbox-spinner {
1735
+
box-sizing: border-box;
1736
+
border: 5px solid rgba(0, 0, 0, 0.4);
1737
+
border-radius: 50%;
1738
+
width: 40px;
1739
+
height: 40px;
1740
+
margin-top: -20px;
1741
+
margin-left: -20px;
1742
+
animation: 0.8s linear infinite spin;
1743
+
position: absolute;
1744
+
top: 50%;
1745
+
left: 50%;
1746
+
}
1747
+
1748
+
.w-lightbox-spinner:after {
1749
+
content: '';
1750
+
border: 3px solid rgba(0, 0, 0, 0);
1751
+
border-bottom-color: #fff;
1752
+
border-radius: 50%;
1753
+
position: absolute;
1754
+
top: -4px;
1755
+
bottom: -4px;
1756
+
left: -4px;
1757
+
right: -4px;
1758
+
}
1759
+
1760
+
.w-lightbox-hide {
1761
+
display: none;
1762
+
}
1763
+
1764
+
.w-lightbox-noscroll {
1765
+
overflow: hidden;
1766
+
}
1767
+
1768
+
@media (min-width: 768px) {
1769
+
.w-lightbox-content {
1770
+
height: 96vh;
1771
+
margin-top: 2vh;
1772
+
}
1773
+
1774
+
.w-lightbox-view,
1775
+
.w-lightbox-view:before {
1776
+
height: 96vh;
1777
+
}
1778
+
1779
+
.w-lightbox-group,
1780
+
.w-lightbox-group .w-lightbox-view,
1781
+
.w-lightbox-group .w-lightbox-view:before {
1782
+
height: 84vh;
1783
+
}
1784
+
1785
+
.w-lightbox-image {
1786
+
max-width: 96vw;
1787
+
max-height: 96vh;
1788
+
}
1789
+
1790
+
.w-lightbox-group .w-lightbox-image {
1791
+
max-width: 82.3vw;
1792
+
max-height: 84vh;
1793
+
}
1794
+
1795
+
.w-lightbox-left,
1796
+
.w-lightbox-right {
1797
+
opacity: 0.5;
1798
+
display: block;
1799
+
}
1800
+
1801
+
.w-lightbox-close {
1802
+
opacity: 0.8;
1803
+
}
1804
+
1805
+
.w-lightbox-control:hover {
1806
+
opacity: 1;
1807
+
}
1808
+
}
1809
+
1810
+
.w-lightbox-inactive,
1811
+
.w-lightbox-inactive:hover {
1812
+
opacity: 0;
1813
+
}
1814
+
1815
+
.w-richtext:before,
1816
+
.w-richtext:after {
1817
+
content: ' ';
1818
+
grid-area: 1 / 1 / 2 / 2;
1819
+
display: table;
1820
+
}
1821
+
1822
+
.w-richtext:after {
1823
+
clear: both;
1824
+
}
1825
+
1826
+
.w-richtext[contenteditable='true']:before,
1827
+
.w-richtext[contenteditable='true']:after {
1828
+
white-space: initial;
1829
+
}
1830
+
1831
+
.w-richtext ol,
1832
+
.w-richtext ul {
1833
+
overflow: hidden;
1834
+
}
1835
+
1836
+
.w-richtext .w-richtext-figure-selected.w-richtext-figure-type-video div:after,
1837
+
.w-richtext .w-richtext-figure-selected[data-rt-type='video'] div:after,
1838
+
.w-richtext .w-richtext-figure-selected.w-richtext-figure-type-image div,
1839
+
.w-richtext .w-richtext-figure-selected[data-rt-type='image'] div {
1840
+
outline: 2px solid #2895f7;
1841
+
}
1842
+
1843
+
.w-richtext figure.w-richtext-figure-type-video > div:after,
1844
+
.w-richtext figure[data-rt-type='video'] > div:after {
1845
+
content: '';
1846
+
display: none;
1847
+
position: absolute;
1848
+
top: 0;
1849
+
bottom: 0;
1850
+
left: 0;
1851
+
right: 0;
1852
+
}
1853
+
1854
+
.w-richtext figure {
1855
+
max-width: 60%;
1856
+
position: relative;
1857
+
}
1858
+
1859
+
.w-richtext figure > div:before {
1860
+
cursor: default !important;
1861
+
}
1862
+
1863
+
.w-richtext figure img {
1864
+
width: 100%;
1865
+
}
1866
+
1867
+
.w-richtext figure figcaption.w-richtext-figcaption-placeholder {
1868
+
opacity: 0.6;
1869
+
}
1870
+
1871
+
.w-richtext figure div {
1872
+
color: rgba(0, 0, 0, 0);
1873
+
font-size: 0;
1874
+
}
1875
+
1876
+
.w-richtext figure.w-richtext-figure-type-image,
1877
+
.w-richtext figure[data-rt-type='image'] {
1878
+
display: table;
1879
+
}
1880
+
1881
+
.w-richtext figure.w-richtext-figure-type-image > div,
1882
+
.w-richtext figure[data-rt-type='image'] > div {
1883
+
display: inline-block;
1884
+
}
1885
+
1886
+
.w-richtext figure.w-richtext-figure-type-image > figcaption,
1887
+
.w-richtext figure[data-rt-type='image'] > figcaption {
1888
+
caption-side: bottom;
1889
+
display: table-caption;
1890
+
}
1891
+
1892
+
.w-richtext figure.w-richtext-figure-type-video,
1893
+
.w-richtext figure[data-rt-type='video'] {
1894
+
width: 60%;
1895
+
height: 0;
1896
+
}
1897
+
1898
+
.w-richtext figure.w-richtext-figure-type-video iframe,
1899
+
.w-richtext figure[data-rt-type='video'] iframe {
1900
+
width: 100%;
1901
+
height: 100%;
1902
+
position: absolute;
1903
+
top: 0;
1904
+
left: 0;
1905
+
}
1906
+
1907
+
.w-richtext figure.w-richtext-figure-type-video > div,
1908
+
.w-richtext figure[data-rt-type='video'] > div {
1909
+
width: 100%;
1910
+
}
1911
+
1912
+
.w-richtext figure.w-richtext-align-center {
1913
+
clear: both;
1914
+
margin-left: auto;
1915
+
margin-right: auto;
1916
+
}
1917
+
1918
+
.w-richtext figure.w-richtext-align-center.w-richtext-figure-type-image > div,
1919
+
.w-richtext figure.w-richtext-align-center[data-rt-type='image'] > div {
1920
+
max-width: 100%;
1921
+
}
1922
+
1923
+
.w-richtext figure.w-richtext-align-normal {
1924
+
clear: both;
1925
+
}
1926
+
1927
+
.w-richtext figure.w-richtext-align-fullwidth {
1928
+
text-align: center;
1929
+
clear: both;
1930
+
width: 100%;
1931
+
max-width: 100%;
1932
+
margin-left: auto;
1933
+
margin-right: auto;
1934
+
display: block;
1935
+
}
1936
+
1937
+
.w-richtext figure.w-richtext-align-fullwidth > div {
1938
+
padding-bottom: inherit;
1939
+
display: inline-block;
1940
+
}
1941
+
1942
+
.w-richtext figure.w-richtext-align-fullwidth > figcaption {
1943
+
display: block;
1944
+
}
1945
+
1946
+
.w-richtext figure.w-richtext-align-floatleft {
1947
+
float: left;
1948
+
clear: none;
1949
+
margin-right: 15px;
1950
+
}
1951
+
1952
+
.w-richtext figure.w-richtext-align-floatright {
1953
+
float: right;
1954
+
clear: none;
1955
+
margin-left: 15px;
1956
+
}
1957
+
1958
+
.w-nav {
1959
+
z-index: 1000;
1960
+
background: #ddd;
1961
+
position: relative;
1962
+
}
1963
+
1964
+
.w-nav:before,
1965
+
.w-nav:after {
1966
+
content: ' ';
1967
+
grid-area: 1 / 1 / 2 / 2;
1968
+
display: table;
1969
+
}
1970
+
1971
+
.w-nav:after {
1972
+
clear: both;
1973
+
}
1974
+
1975
+
.w-nav-brand {
1976
+
float: left;
1977
+
color: #333;
1978
+
text-decoration: none;
1979
+
position: relative;
1980
+
}
1981
+
1982
+
.w-nav-link {
1983
+
vertical-align: top;
1984
+
color: #222;
1985
+
text-align: left;
1986
+
margin-left: auto;
1987
+
margin-right: auto;
1988
+
padding: 20px;
1989
+
text-decoration: none;
1990
+
display: inline-block;
1991
+
position: relative;
1992
+
}
1993
+
1994
+
.w-nav-link.w--current {
1995
+
color: #0082f3;
1996
+
}
1997
+
1998
+
.w-nav-menu {
1999
+
float: right;
2000
+
position: relative;
2001
+
}
2002
+
2003
+
[data-nav-menu-open] {
2004
+
text-align: center;
2005
+
background: #c8c8c8;
2006
+
min-width: 200px;
2007
+
position: absolute;
2008
+
top: 100%;
2009
+
left: 0;
2010
+
right: 0;
2011
+
overflow: visible;
2012
+
display: block !important;
2013
+
}
2014
+
2015
+
.w--nav-link-open {
2016
+
display: block;
2017
+
position: relative;
2018
+
}
2019
+
2020
+
.w-nav-overlay {
2021
+
width: 100%;
2022
+
display: none;
2023
+
position: absolute;
2024
+
top: 100%;
2025
+
left: 0;
2026
+
right: 0;
2027
+
overflow: hidden;
2028
+
}
2029
+
2030
+
.w-nav-overlay [data-nav-menu-open] {
2031
+
top: 0;
2032
+
}
2033
+
2034
+
.w-nav[data-animation='over-left'] .w-nav-overlay {
2035
+
width: auto;
2036
+
}
2037
+
2038
+
.w-nav[data-animation='over-left'] .w-nav-overlay,
2039
+
.w-nav[data-animation='over-left'] [data-nav-menu-open] {
2040
+
z-index: 1;
2041
+
top: 0;
2042
+
right: auto;
2043
+
}
2044
+
2045
+
.w-nav[data-animation='over-right'] .w-nav-overlay {
2046
+
width: auto;
2047
+
}
2048
+
2049
+
.w-nav[data-animation='over-right'] .w-nav-overlay,
2050
+
.w-nav[data-animation='over-right'] [data-nav-menu-open] {
2051
+
z-index: 1;
2052
+
top: 0;
2053
+
left: auto;
2054
+
}
2055
+
2056
+
.w-nav-button {
2057
+
float: right;
2058
+
cursor: pointer;
2059
+
2060
+
-webkit-user-select: none;
2061
+
-ms-user-select: none;
2062
+
user-select: none;
2063
+
padding: 18px;
2064
+
font-size: 24px;
2065
+
display: none;
2066
+
position: relative;
2067
+
}
2068
+
2069
+
.w-nav-button:focus {
2070
+
outline: 0;
2071
+
}
2072
+
2073
+
.w-nav-button.w--open {
2074
+
color: #fff;
2075
+
background-color: #c8c8c8;
2076
+
}
2077
+
2078
+
.w-nav[data-collapse='all'] .w-nav-menu {
2079
+
display: none;
2080
+
}
2081
+
2082
+
.w-nav[data-collapse='all'] .w-nav-button,
2083
+
.w--nav-dropdown-open,
2084
+
.w--nav-dropdown-toggle-open {
2085
+
display: block;
2086
+
}
2087
+
2088
+
.w--nav-dropdown-list-open {
2089
+
position: static;
2090
+
}
2091
+
2092
+
@media screen and (max-width: 991px) {
2093
+
.w-nav[data-collapse='medium'] .w-nav-menu {
2094
+
display: none;
2095
+
}
2096
+
2097
+
.w-nav[data-collapse='medium'] .w-nav-button {
2098
+
display: block;
2099
+
}
2100
+
}
2101
+
2102
+
@media screen and (max-width: 767px) {
2103
+
.w-nav[data-collapse='small'] .w-nav-menu {
2104
+
display: none;
2105
+
}
2106
+
2107
+
.w-nav[data-collapse='small'] .w-nav-button {
2108
+
display: block;
2109
+
}
2110
+
2111
+
.w-nav-brand {
2112
+
padding-left: 10px;
2113
+
}
2114
+
}
2115
+
2116
+
@media screen and (max-width: 479px) {
2117
+
.w-nav[data-collapse='tiny'] .w-nav-menu {
2118
+
display: none;
2119
+
}
2120
+
2121
+
.w-nav[data-collapse='tiny'] .w-nav-button {
2122
+
display: block;
2123
+
}
2124
+
}
2125
+
2126
+
.w-tabs {
2127
+
position: relative;
2128
+
}
2129
+
2130
+
.w-tabs:before,
2131
+
.w-tabs:after {
2132
+
content: ' ';
2133
+
grid-area: 1 / 1 / 2 / 2;
2134
+
display: table;
2135
+
}
2136
+
2137
+
.w-tabs:after {
2138
+
clear: both;
2139
+
}
2140
+
2141
+
.w-tab-menu {
2142
+
position: relative;
2143
+
}
2144
+
2145
+
.w-tab-link {
2146
+
vertical-align: top;
2147
+
text-align: left;
2148
+
cursor: pointer;
2149
+
color: #222;
2150
+
background-color: #ddd;
2151
+
padding: 9px 30px;
2152
+
text-decoration: none;
2153
+
display: inline-block;
2154
+
position: relative;
2155
+
}
2156
+
2157
+
.w-tab-link.w--current {
2158
+
background-color: #c8c8c8;
2159
+
}
2160
+
2161
+
.w-tab-link:focus {
2162
+
outline: 0;
2163
+
}
2164
+
2165
+
.w-tab-content {
2166
+
display: block;
2167
+
position: relative;
2168
+
overflow: hidden;
2169
+
}
2170
+
2171
+
.w-tab-pane {
2172
+
display: none;
2173
+
position: relative;
2174
+
}
2175
+
2176
+
.w--tab-active {
2177
+
display: block;
2178
+
}
2179
+
2180
+
@media screen and (max-width: 479px) {
2181
+
.w-tab-link {
2182
+
display: block;
2183
+
}
2184
+
}
2185
+
2186
+
.w-ix-emptyfix:after {
2187
+
content: '';
2188
+
}
2189
+
2190
+
@keyframes spin {
2191
+
0% {
2192
+
transform: rotate(0);
2193
+
}
2194
+
2195
+
100% {
2196
+
transform: rotate(360deg);
2197
+
}
2198
+
}
2199
+
2200
+
.w-dyn-empty {
2201
+
background-color: #ddd;
2202
+
padding: 10px;
2203
+
}
2204
+
2205
+
.w-dyn-hide,
2206
+
.w-dyn-bind-empty,
2207
+
.w-condition-invisible {
2208
+
display: none !important;
2209
+
}
2210
+
2211
+
.wf-layout-layout {
2212
+
display: grid;
2213
+
}
2214
+
2215
+
.w-code-component > * {
2216
+
width: 100%;
2217
+
height: 100%;
2218
+
position: absolute;
2219
+
top: 0;
2220
+
left: 0;
2221
+
}
2222
+
2223
+
:root {
2224
+
--mono-98: #f5f5ff;
2225
+
--mono-00: #00010d;
2226
+
--act-1: #01f;
2227
+
--hi-1: #fb0;
2228
+
--mono-75: #a9aabf;
2229
+
--act-2: #000cb3;
2230
+
--trans-50: rgba(51, 54, 102, 0.5);
2231
+
--mono-100: white;
2232
+
--mono-35: #000659;
2233
+
--mono-97: #e4e5f7;
2234
+
--mono-95: #d5d7f2;
2235
+
--act-100: #d1d4ff;
2236
+
--hi-2: #ffcd42;
2237
+
--mono-50: #000980;
2238
+
--mono-25: #101340;
2239
+
--act-90: #b3b8ff;
2240
+
--trans-25: rgba(51, 54, 102, 0.25);
2241
+
--err-1: #cc2900;
2242
+
--err-2: #f5c4b8;
2243
+
--mono-92: #ced0eb;
2244
+
--mono-85: #c3c5d9;
2245
+
}
2246
+
2247
+
.w-layout-blockcontainer {
2248
+
max-width: 940px;
2249
+
margin-left: auto;
2250
+
margin-right: auto;
2251
+
display: block;
2252
+
}
2253
+
2254
+
.w-layout-hflex {
2255
+
flex-direction: row;
2256
+
align-items: flex-start;
2257
+
display: flex;
2258
+
}
2259
+
2260
+
.w-layout-grid {
2261
+
grid-row-gap: 16px;
2262
+
grid-column-gap: 16px;
2263
+
grid-template-rows: auto auto;
2264
+
grid-template-columns: 1fr 1fr;
2265
+
grid-auto-columns: 1fr;
2266
+
display: grid;
2267
+
}
2268
+
2269
+
@media screen and (max-width: 991px) {
2270
+
.w-layout-blockcontainer {
2271
+
max-width: 728px;
2272
+
}
2273
+
}
2274
+
2275
+
@media screen and (max-width: 767px) {
2276
+
.w-layout-blockcontainer {
2277
+
max-width: none;
2278
+
}
2279
+
}
2280
+
2281
+
body {
2282
+
background-color: var(--mono-98);
2283
+
color: var(--mono-00);
2284
+
font-family:
2285
+
DM Sans,
2286
+
sans-serif;
2287
+
font-size: 24px;
2288
+
font-weight: 400;
2289
+
line-height: 1.6;
2290
+
transition:
2291
+
flex 0.4s linear,
2292
+
background-color 0.2s linear,
2293
+
color 0.2s linear;
2294
+
}
2295
+
2296
+
h1,
2297
+
h2,
2298
+
h3,
2299
+
h4,
2300
+
h5 {
2301
+
margin-top: 0;
2302
+
margin-bottom: 0;
2303
+
font-size: 1em;
2304
+
font-weight: 400;
2305
+
line-height: 1.6;
2306
+
}
2307
+
2308
+
h6 {
2309
+
margin-top: 0;
2310
+
margin-bottom: 0;
2311
+
font-size: 1em;
2312
+
font-weight: 400;
2313
+
}
2314
+
2315
+
p {
2316
+
margin-bottom: 0;
2317
+
font-size: 1em;
2318
+
}
2319
+
2320
+
/* a {
2321
+
color: var(--act-1);
2322
+
font-size: 1em;
2323
+
font-weight: 400;
2324
+
text-decoration: none;
2325
+
} */
2326
+
2327
+
/* a:hover {
2328
+
text-decoration: underline;
2329
+
} */
2330
+
2331
+
/* a:focus-visible {
2332
+
outline-color: var(--hi-1);
2333
+
outline-offset: 4px;
2334
+
border-radius: 2px;
2335
+
outline-width: 4px;
2336
+
outline-style: solid;
2337
+
} */
2338
+
2339
+
/* a[data-wf-focus-visible] {
2340
+
outline-color: var(--hi-1);
2341
+
outline-offset: 4px;
2342
+
border-radius: 2px;
2343
+
outline-width: 4px;
2344
+
outline-style: solid;
2345
+
} */
2346
+
2347
+
ul,
2348
+
ol {
2349
+
margin-top: 0;
2350
+
margin-bottom: 0;
2351
+
padding-left: 0;
2352
+
font-size: 1em;
2353
+
}
2354
+
2355
+
li {
2356
+
margin-bottom: 0;
2357
+
}
2358
+
2359
+
label {
2360
+
margin-bottom: 5px;
2361
+
font-size: 1.5rem;
2362
+
font-weight: 500;
2363
+
line-height: 2rem;
2364
+
}
2365
+
2366
+
blockquote {
2367
+
border-left: 1px solid var(--mono-75);
2368
+
letter-spacing: 0.5px;
2369
+
margin-top: 0;
2370
+
margin-bottom: 0;
2371
+
padding: 0.25em 1em 0.5em;
2372
+
font-family:
2373
+
DM Serif Text,
2374
+
sans-serif;
2375
+
font-size: 1em;
2376
+
font-style: normal;
2377
+
font-weight: 400;
2378
+
line-height: 1.6;
2379
+
}
2380
+
2381
+
figcaption {
2382
+
color: #2a2f31;
2383
+
text-align: center;
2384
+
margin-top: 6px;
2385
+
font-size: 16px;
2386
+
}
2387
+
2388
+
.bp--text {
2389
+
line-height: 1.6;
2390
+
}
2391
+
2392
+
.bp--text:hover {
2393
+
text-decoration: none;
2394
+
}
2395
+
2396
+
.bp--text.md {
2397
+
font-size: 1.25em;
2398
+
}
2399
+
2400
+
.bp--text.lg {
2401
+
margin-bottom: 0;
2402
+
font-size: 1.5em;
2403
+
}
2404
+
2405
+
.bp--text.sm {
2406
+
margin-bottom: 0;
2407
+
font-size: 0.75em;
2408
+
line-height: 1.8em;
2409
+
}
2410
+
2411
+
.bp--text.xs {
2412
+
font-size: 0.625em;
2413
+
}
2414
+
2415
+
.bp--text.hero-primary {
2416
+
font-family:
2417
+
DM Serif Display,
2418
+
sans-serif;
2419
+
font-size: 2.5em;
2420
+
font-style: italic;
2421
+
font-weight: 700;
2422
+
line-height: 1.25;
2423
+
}
2424
+
2425
+
.bp--text.hero-secondary {
2426
+
font-family:
2427
+
DM Sans,
2428
+
sans-serif;
2429
+
font-size: 1.25em;
2430
+
font-weight: 400;
2431
+
}
2432
+
2433
+
.bp--text.hidden {
2434
+
display: none;
2435
+
}
2436
+
2437
+
.bp--image {
2438
+
display: block;
2439
+
}
2440
+
2441
+
.bp--button {
2442
+
background-color: var(--act-2);
2443
+
box-shadow: 0 0 0 0 var(--trans-50);
2444
+
color: var(--mono-100);
2445
+
text-align: left;
2446
+
border-radius: 2px;
2447
+
padding: 0.375em 0.75em;
2448
+
font-size: 1em;
2449
+
font-weight: 500;
2450
+
transition:
2451
+
box-shadow 80ms ease-in,
2452
+
color 80ms linear,
2453
+
transform 80ms ease-in-out,
2454
+
background-color 80ms linear;
2455
+
}
2456
+
2457
+
.bp--button:hover {
2458
+
background-color: var(--act-1);
2459
+
box-shadow:
2460
+
0 10px 2px -4px rgba(95, 92, 153, 0.24),
2461
+
0 2px 3px -2px var(--trans-50);
2462
+
color: var(--mono-100);
2463
+
text-decoration: none;
2464
+
transform: scale(1.025);
2465
+
}
2466
+
2467
+
.bp--button:active {
2468
+
background-color: var(--mono-35);
2469
+
box-shadow: 0 2px 1px 0 var(--trans-50);
2470
+
transform: scale(1);
2471
+
}
2472
+
2473
+
.bp--button:focus-visible {
2474
+
background-color: var(--act-1);
2475
+
outline-color: var(--hi-1);
2476
+
outline-offset: 2px;
2477
+
border-radius: 1px;
2478
+
outline-width: 3px;
2479
+
outline-style: solid;
2480
+
transform: scale(1.05);
2481
+
}
2482
+
2483
+
.bp--button[data-wf-focus-visible] {
2484
+
background-color: var(--act-1);
2485
+
outline-color: var(--hi-1);
2486
+
outline-offset: 2px;
2487
+
border-radius: 1px;
2488
+
outline-width: 3px;
2489
+
outline-style: solid;
2490
+
transform: scale(1.05);
2491
+
}
2492
+
2493
+
.bp--button.emphasis-low {
2494
+
background-color: var(--mono-97);
2495
+
color: var(--act-2);
2496
+
}
2497
+
2498
+
.bp--button.emphasis-low:hover {
2499
+
background-color: var(--mono-98);
2500
+
color: var(--act-1);
2501
+
}
2502
+
2503
+
.bp--button.emphasis-low:active {
2504
+
background-color: var(--mono-95);
2505
+
color: var(--act-2);
2506
+
}
2507
+
2508
+
.bp--button.emphasis-low.w--current:hover {
2509
+
background-color: var(--act-100);
2510
+
color: var(--act-1);
2511
+
}
2512
+
2513
+
.bp--button.icon {
2514
+
background-color: var(--mono-100);
2515
+
padding-left: 1rem;
2516
+
padding-right: 1rem;
2517
+
}
2518
+
2519
+
.bp--button.icon:hover {
2520
+
background-color: #ced6f5;
2521
+
transform: scale(1.1);
2522
+
}
2523
+
2524
+
.bp--button.primary {
2525
+
background-color: var(--act-1);
2526
+
color: var(--mono-100);
2527
+
}
2528
+
2529
+
.bp--button.primary:hover,
2530
+
.bp--button.primary.w--current {
2531
+
background-color: var(--act-2);
2532
+
}
2533
+
2534
+
.bp--button.primary.mobile {
2535
+
display: none;
2536
+
}
2537
+
2538
+
.bp--button.primary.dropup {
2539
+
grid-column-gap: 16px;
2540
+
grid-row-gap: 16px;
2541
+
grid-template-rows: auto auto;
2542
+
grid-template-columns: 1fr 1fr;
2543
+
grid-auto-columns: 1fr;
2544
+
justify-content: flex-start;
2545
+
position: fixed;
2546
+
bottom: 1em;
2547
+
left: 1em;
2548
+
}
2549
+
2550
+
.bp--button.primary.dropup:hover {
2551
+
transform: none;
2552
+
}
2553
+
2554
+
.bp--button.dropup {
2555
+
display: flex;
2556
+
}
2557
+
2558
+
.bp--button.emphasis-lowest {
2559
+
box-shadow: none;
2560
+
color: var(--mono-00);
2561
+
background-color: rgba(0, 0, 0, 0);
2562
+
}
2563
+
2564
+
.bp--button.emphasis-lowest:hover {
2565
+
background-color: var(--mono-98);
2566
+
box-shadow: none;
2567
+
color: var(--act-1);
2568
+
}
2569
+
2570
+
.bp--button.emphasis-lowest:active {
2571
+
background-color: var(--mono-95);
2572
+
color: var(--act-1);
2573
+
}
2574
+
2575
+
.bp--button.emphasis-lowest:focus-visible {
2576
+
background-color: var(--act-100);
2577
+
color: var(--act-1);
2578
+
}
2579
+
2580
+
.bp--button.emphasis-lowest[data-wf-focus-visible] {
2581
+
background-color: var(--act-100);
2582
+
color: var(--act-1);
2583
+
}
2584
+
2585
+
.bp--button.emphasis-lowest.w--current {
2586
+
background-color: var(--mono-98);
2587
+
color: var(--act-1);
2588
+
}
2589
+
2590
+
.bp--button.emphasis-lowest.w--current:hover {
2591
+
transform: none;
2592
+
}
2593
+
2594
+
.bp--button.emphasis-lowest.icon {
2595
+
justify-content: center;
2596
+
align-items: center;
2597
+
font-family: 'FontAwesome 6', sans-serif;
2598
+
font-weight: 300;
2599
+
display: flex;
2600
+
}
2601
+
2602
+
.bp--button.emphasis-lowest.icon.brand {
2603
+
font-family: 'FontAwesome Brands 6', sans-serif;
2604
+
}
2605
+
2606
+
.bp--button.wide {
2607
+
width: 100%;
2608
+
}
2609
+
2610
+
.bp--section {
2611
+
flex-direction: column;
2612
+
margin-left: auto;
2613
+
margin-right: auto;
2614
+
padding-top: 2em;
2615
+
padding-bottom: 2em;
2616
+
display: flex;
2617
+
}
2618
+
2619
+
.bp--section.hero {
2620
+
background-color: var(--mono-100);
2621
+
}
2622
+
2623
+
.bp--section.nav-bar {
2624
+
z-index: 999998;
2625
+
background-color: var(--mono-100);
2626
+
box-shadow: 0 4px 16px -3px var(--trans-50);
2627
+
padding-top: 0.125rem;
2628
+
padding-bottom: 0.125rem;
2629
+
position: -webkit-sticky;
2630
+
position: sticky;
2631
+
top: 0%;
2632
+
bottom: auto;
2633
+
left: 0%;
2634
+
right: 0%;
2635
+
}
2636
+
2637
+
.bp--section.nav-callout {
2638
+
z-index: 999999;
2639
+
background-color: var(--hi-2);
2640
+
}
2641
+
2642
+
.bp--section.fit {
2643
+
width: 100%;
2644
+
padding-left: 2em;
2645
+
}
2646
+
2647
+
.bp--row {
2648
+
grid-column-gap: 1rem;
2649
+
grid-row-gap: 1rem;
2650
+
border-radius: 2px;
2651
+
flex-direction: column;
2652
+
display: flex;
2653
+
}
2654
+
2655
+
.bp--row.image-caption {
2656
+
grid-column-gap: 0.5em;
2657
+
grid-row-gap: 0.5em;
2658
+
}
2659
+
2660
+
.bp--row.grid {
2661
+
grid-column-gap: 1px;
2662
+
grid-row-gap: 1px;
2663
+
grid-template-rows: auto auto;
2664
+
grid-template-columns: 1fr 1fr;
2665
+
grid-auto-columns: 1fr;
2666
+
display: grid;
2667
+
}
2668
+
2669
+
.bp--row.large-gap {
2670
+
grid-column-gap: 2rem;
2671
+
grid-row-gap: 2rem;
2672
+
}
2673
+
2674
+
.bp--row.small-gap {
2675
+
grid-column-gap: 0.5rem;
2676
+
grid-row-gap: 0.5rem;
2677
+
}
2678
+
2679
+
.bp--row.small-gap.small-text {
2680
+
font-size: 0.75em;
2681
+
}
2682
+
2683
+
.bp--row.no-gap {
2684
+
grid-column-gap: 0rem;
2685
+
grid-row-gap: 0rem;
2686
+
}
2687
+
2688
+
.bp--row.no-gap.align-c {
2689
+
justify-content: center;
2690
+
}
2691
+
2692
+
.bp--row.align-l {
2693
+
align-items: flex-start;
2694
+
}
2695
+
2696
+
.bp--col {
2697
+
grid-column-gap: 1rem;
2698
+
grid-row-gap: 1rem;
2699
+
flex-direction: row;
2700
+
align-items: stretch;
2701
+
display: flex;
2702
+
}
2703
+
2704
+
.bp--col.icons {
2705
+
grid-column-gap: 1rem;
2706
+
grid-row-gap: 1rem;
2707
+
flex-direction: row;
2708
+
grid-template-rows: auto;
2709
+
grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr;
2710
+
grid-auto-columns: 1fr;
2711
+
width: 100%;
2712
+
display: flex;
2713
+
}
2714
+
2715
+
.bp--col.keywords {
2716
+
display: block;
2717
+
}
2718
+
2719
+
.bp--col.menu {
2720
+
grid-column-gap: 0.5em;
2721
+
grid-row-gap: 0.5em;
2722
+
flex-direction: row;
2723
+
flex: 1;
2724
+
grid-template-rows: auto;
2725
+
grid-template-columns: 1fr 1fr 1fr 1fr 1fr;
2726
+
grid-auto-columns: 1fr;
2727
+
align-items: center;
2728
+
display: flex;
2729
+
}
2730
+
2731
+
.bp--col.menu.trigger {
2732
+
display: none;
2733
+
}
2734
+
2735
+
.bp--col.menu.right {
2736
+
justify-content: flex-end;
2737
+
}
2738
+
2739
+
.bp--col.menu.left {
2740
+
grid-column-gap: 0.125em;
2741
+
grid-row-gap: 0.125em;
2742
+
flex: 0 auto;
2743
+
}
2744
+
2745
+
.bp--col.large-gap {
2746
+
grid-column-gap: 2rem;
2747
+
grid-row-gap: 2rem;
2748
+
}
2749
+
2750
+
.bp--col.small-gap {
2751
+
grid-column-gap: 0.5rem;
2752
+
grid-row-gap: 0.5rem;
2753
+
}
2754
+
2755
+
.bp--col.no-gap {
2756
+
grid-column-gap: 0rem;
2757
+
grid-row-gap: 0rem;
2758
+
}
2759
+
2760
+
.bp--col.nav-bar {
2761
+
justify-content: space-between;
2762
+
max-width: 100%;
2763
+
padding-top: 0.5em;
2764
+
padding-bottom: 0.5em;
2765
+
font-size: 0.75em;
2766
+
}
2767
+
2768
+
.bp--col.fieldset {
2769
+
flex-direction: row;
2770
+
align-items: stretch;
2771
+
}
2772
+
2773
+
.bp--col.right {
2774
+
justify-content: flex-end;
2775
+
}
2776
+
2777
+
.bp--col.align-m {
2778
+
grid-column-gap: 0.25em;
2779
+
grid-row-gap: 0.25em;
2780
+
align-items: center;
2781
+
}
2782
+
2783
+
.bp--container-2rem {
2784
+
grid-column-gap: 2em;
2785
+
grid-row-gap: 2em;
2786
+
flex-direction: column;
2787
+
grid-template-rows: auto auto;
2788
+
grid-template-columns: 1fr;
2789
+
grid-auto-columns: 1fr;
2790
+
justify-content: space-around;
2791
+
display: flex;
2792
+
}
2793
+
2794
+
.bp--body {
2795
+
color: var(--mono-00);
2796
+
}
2797
+
2798
+
.bp--type-overline {
2799
+
color: var(--mono-50);
2800
+
letter-spacing: 0.1em;
2801
+
text-transform: uppercase;
2802
+
margin-bottom: 0;
2803
+
font-size: 1em;
2804
+
font-weight: 300;
2805
+
line-height: 1.5em;
2806
+
}
2807
+
2808
+
.bp--heading {
2809
+
letter-spacing: 0.375px;
2810
+
font-family:
2811
+
DM Serif Display,
2812
+
sans-serif;
2813
+
font-size: 1em;
2814
+
font-weight: 400;
2815
+
line-height: 1.6em;
2816
+
}
2817
+
2818
+
.bp--heading.overline {
2819
+
letter-spacing: 0.1em;
2820
+
text-transform: uppercase;
2821
+
font-family:
2822
+
DM Sans,
2823
+
sans-serif;
2824
+
font-size: 0.75em;
2825
+
}
2826
+
2827
+
.bp--heading.xxl {
2828
+
font-family:
2829
+
DM Serif Text,
2830
+
sans-serif;
2831
+
font-size: 2em;
2832
+
line-height: 1.3em;
2833
+
}
2834
+
2835
+
.bp--heading.xl {
2836
+
font-size: 2.75rem;
2837
+
line-height: 1.4;
2838
+
}
2839
+
2840
+
.bp--heading.lg {
2841
+
font-size: 1.5em;
2842
+
line-height: 1.3em;
2843
+
}
2844
+
2845
+
.bp--heading.lg.sans {
2846
+
color: var(--mono-00);
2847
+
letter-spacing: -0.375px;
2848
+
font-family:
2849
+
DM Sans,
2850
+
sans-serif;
2851
+
font-size: 1.25em;
2852
+
font-weight: 700;
2853
+
line-height: 1.2;
2854
+
}
2855
+
2856
+
.bp--heading.md {
2857
+
font-size: 1.25em;
2858
+
line-height: 1.4em;
2859
+
}
2860
+
2861
+
.bp--heading.sm {
2862
+
font-size: 0.75em;
2863
+
font-weight: 700;
2864
+
}
2865
+
2866
+
.bp--heading.xs {
2867
+
font-family:
2868
+
DM Serif Text,
2869
+
sans-serif;
2870
+
font-size: 0.625em;
2871
+
font-weight: 400;
2872
+
}
2873
+
2874
+
.bp--quote {
2875
+
font-size: 1em;
2876
+
font-style: italic;
2877
+
}
2878
+
2879
+
.bp--quote.lg {
2880
+
font-size: 1.5em;
2881
+
line-height: 1.4;
2882
+
}
2883
+
2884
+
.bp--quote.md {
2885
+
font-size: 1.25em;
2886
+
}
2887
+
2888
+
.bp--quote.sm {
2889
+
font-size: 0.75em;
2890
+
}
2891
+
2892
+
.bp--list {
2893
+
grid-column-gap: 0.5em;
2894
+
grid-row-gap: 0.5em;
2895
+
flex-direction: column;
2896
+
padding-left: 2rem;
2897
+
display: flex;
2898
+
}
2899
+
2900
+
.bp--list.ul {
2901
+
list-style-type: disc;
2902
+
}
2903
+
2904
+
.bp--list.ol {
2905
+
list-style-type: decimal;
2906
+
}
2907
+
2908
+
.bp--hightlight {
2909
+
background-color: var(--hi-1);
2910
+
padding-left: 0.125rem;
2911
+
padding-right: 0.125rem;
2912
+
font-weight: 400;
2913
+
transition: background-color 0.2s;
2914
+
}
2915
+
2916
+
.bp-type--link {
2917
+
color: var(--act-1);
2918
+
text-decoration: none;
2919
+
transition:
2920
+
transform 0.1s linear,
2921
+
color 0.1s linear;
2922
+
}
2923
+
2924
+
.bp-type--link:hover {
2925
+
color: var(--act-1);
2926
+
text-decoration: underline;
2927
+
}
2928
+
2929
+
.bp-type--link:focus-visible {
2930
+
outline-offset: 4px;
2931
+
border-radius: 0.25rem;
2932
+
outline-width: 4px;
2933
+
text-decoration: underline;
2934
+
}
2935
+
2936
+
.bp-type--link[data-wf-focus-visible] {
2937
+
outline-offset: 4px;
2938
+
border-radius: 0.25rem;
2939
+
outline-width: 4px;
2940
+
text-decoration: underline;
2941
+
}
2942
+
2943
+
.homepage-link {
2944
+
text-decoration: underline;
2945
+
transition: all 0.2s ease;
2946
+
}
2947
+
2948
+
.homepage-link:hover {
2949
+
text-decoration: none;
2950
+
}
2951
+
2952
+
.homepage-link:focus-visible {
2953
+
outline-color: var(--bones-yellow, #fb0);
2954
+
outline-offset: 4px;
2955
+
outline-width: 4px;
2956
+
outline-style: solid;
2957
+
border-radius: 2px;
2958
+
}
2959
+
2960
+
.bp-type--link.icon {
2961
+
text-align: center;
2962
+
width: 1.5em;
2963
+
font-family: 'FontAwesome 6', sans-serif;
2964
+
text-decoration: none;
2965
+
}
2966
+
2967
+
.bp-type--link.icon.brand {
2968
+
font-family: 'FontAwesome Brands 6', sans-serif;
2969
+
font-weight: 400;
2970
+
}
2971
+
2972
+
.bp-type--link.dropup {
2973
+
color: var(--mono-00);
2974
+
flex: none;
2975
+
}
2976
+
2977
+
.bp-type--link.dropup:hover {
2978
+
color: var(--act-1);
2979
+
text-decoration: none;
2980
+
}
2981
+
2982
+
.bp--icon {
2983
+
text-align: center;
2984
+
font-family: 'FontAwesome 6', sans-serif;
2985
+
font-weight: 400;
2986
+
display: inline-block;
2987
+
}
2988
+
2989
+
.bp--icon.brand {
2990
+
font-family: 'FontAwesome Brands 6', sans-serif;
2991
+
}
2992
+
2993
+
.bp--icon.button {
2994
+
min-width: 1.5em;
2995
+
}
2996
+
2997
+
.bp--icon.value {
2998
+
color: var(--act-1);
2999
+
text-align: center;
3000
+
border-radius: 1rem;
3001
+
font-size: 4em;
3002
+
font-weight: 100;
3003
+
line-height: 1.25em;
3004
+
}
3005
+
3006
+
.bp--icon.sm {
3007
+
font-size: 0.75em;
3008
+
font-weight: 400;
3009
+
}
3010
+
3011
+
.sg--icon-holder {
3012
+
background-color: var(--mono-100);
3013
+
color: #04041e;
3014
+
text-align: center;
3015
+
border-radius: 0.5rem;
3016
+
padding: 0.5rem;
3017
+
}
3018
+
3019
+
.bp--keyword {
3020
+
background-color: var(--mono-97);
3021
+
color: var(--mono-25);
3022
+
cursor: default;
3023
+
transform-style: preserve-3d;
3024
+
border-radius: 2px;
3025
+
margin-bottom: 2px;
3026
+
margin-right: 2px;
3027
+
padding: 0.125em 0.5em;
3028
+
font-weight: 400;
3029
+
transition: background-color 0.1s;
3030
+
display: inline-block;
3031
+
}
3032
+
3033
+
.bp--keyword.small {
3034
+
background-color: var(--mono-35);
3035
+
color: var(--mono-100);
3036
+
padding-top: 0;
3037
+
padding-bottom: 0;
3038
+
font-size: 0.75em;
3039
+
}
3040
+
3041
+
.bp--nav-menu {
3042
+
z-index: 9999;
3043
+
grid-column-gap: 0.5em;
3044
+
grid-row-gap: 0.5em;
3045
+
background-color: var(--mono-100);
3046
+
flex-direction: column;
3047
+
align-content: flex-start;
3048
+
justify-content: space-between;
3049
+
align-items: stretch;
3050
+
width: 100svw;
3051
+
height: 100svh;
3052
+
padding: 2em;
3053
+
display: flex;
3054
+
position: fixed;
3055
+
top: 0%;
3056
+
bottom: 0%;
3057
+
left: 0%;
3058
+
right: 0%;
3059
+
}
3060
+
3061
+
.bp--global-icon {
3062
+
padding-left: 0.125rem;
3063
+
padding-right: 0.125rem;
3064
+
font-family: 'FontAwesome 6', sans-serif;
3065
+
font-weight: 300;
3066
+
}
3067
+
3068
+
.bp--dropup {
3069
+
z-index: 9999999;
3070
+
flex-direction: column;
3071
+
position: fixed;
3072
+
bottom: 1em;
3073
+
left: 1em;
3074
+
}
3075
+
3076
+
.bp--dropup-content {
3077
+
grid-column-gap: 1em;
3078
+
grid-row-gap: 1em;
3079
+
background-color: var(--mono-100);
3080
+
flex-direction: column;
3081
+
padding: 2em;
3082
+
font-size: 1em;
3083
+
display: flex;
3084
+
position: fixed;
3085
+
top: 0%;
3086
+
bottom: 0%;
3087
+
left: 0%;
3088
+
right: auto;
3089
+
overflow: hidden;
3090
+
}
3091
+
3092
+
.bp-link:hover {
3093
+
color: var(--act-2);
3094
+
}
3095
+
3096
+
.bp-avatar {
3097
+
background-color: var(--act-90);
3098
+
background-image: url('https://assets-global.website-files.com/63020a6ad41103c31cd7414e/6342ba1ac5c73022236607cb_me--site-hero-colour.jpg');
3099
+
background-position: 50%;
3100
+
background-size: cover;
3101
+
border-radius: 100%;
3102
+
width: 3em;
3103
+
height: 3em;
3104
+
}
3105
+
3106
+
.bp-avatar.large {
3107
+
width: 5em;
3108
+
height: 5em;
3109
+
}
3110
+
3111
+
.bp--plate {
3112
+
grid-column-gap: 1em;
3113
+
grid-row-gap: 1em;
3114
+
border-radius: 0;
3115
+
flex-direction: column;
3116
+
grid-template:
3117
+
'.'
3118
+
/ 1fr 0.5fr;
3119
+
grid-auto-columns: 1fr;
3120
+
grid-auto-flow: row;
3121
+
align-content: end;
3122
+
justify-content: end;
3123
+
height: 28em;
3124
+
display: grid;
3125
+
position: relative;
3126
+
overflow: hidden;
3127
+
}
3128
+
3129
+
.bp--plate:hover {
3130
+
box-shadow: none;
3131
+
text-decoration: none;
3132
+
}
3133
+
3134
+
.bp--plate:focus-visible {
3135
+
background-color: var(--mono-100);
3136
+
outline-color: var(--hi-1);
3137
+
outline-style: solid;
3138
+
}
3139
+
3140
+
.bp--plate[data-wf-focus-visible] {
3141
+
background-color: var(--mono-100);
3142
+
outline-color: var(--hi-1);
3143
+
outline-style: solid;
3144
+
}
3145
+
3146
+
.bp--plate.mini {
3147
+
grid-column-gap: 0em;
3148
+
grid-row-gap: 0em;
3149
+
grid-template-columns: 1fr;
3150
+
}
3151
+
3152
+
.bp--plate-card {
3153
+
grid-column-gap: 0em;
3154
+
grid-row-gap: 0em;
3155
+
background-color: var(--mono-100);
3156
+
box-shadow: 0 0 15px 0 var(--trans-25);
3157
+
border-radius: 0;
3158
+
flex-direction: column;
3159
+
padding: 2em 1.5em;
3160
+
text-decoration: none;
3161
+
display: flex;
3162
+
}
3163
+
3164
+
.bp--plate-card:hover {
3165
+
text-decoration: none;
3166
+
}
3167
+
3168
+
.error-message {
3169
+
background-color: var(--hi-1);
3170
+
}
3171
+
3172
+
.bp-input {
3173
+
border-style: solid;
3174
+
border-width: 1px 0 0;
3175
+
border-color: var(--mono-75) black var(--mono-25);
3176
+
border-radius: 2px;
3177
+
margin-bottom: 0;
3178
+
padding: 1.5em 1em;
3179
+
font-size: 1.25rem;
3180
+
line-height: 1.5;
3181
+
transition:
3182
+
background-color 0.1s linear,
3183
+
color 0.1s linear;
3184
+
}
3185
+
3186
+
.bp-input:hover {
3187
+
border-color: var(--mono-00);
3188
+
}
3189
+
3190
+
.bp-input:focus-visible {
3191
+
border-color: var(--mono-00);
3192
+
outline-color: var(--hi-1);
3193
+
outline-offset: 2px;
3194
+
outline-width: 3px;
3195
+
outline-style: solid;
3196
+
}
3197
+
3198
+
.bp-input[data-wf-focus-visible] {
3199
+
border-color: var(--mono-00);
3200
+
outline-color: var(--hi-1);
3201
+
outline-offset: 2px;
3202
+
outline-width: 3px;
3203
+
outline-style: solid;
3204
+
}
3205
+
3206
+
.bp-input::placeholder {
3207
+
color: var(--mono-50);
3208
+
}
3209
+
3210
+
.fill-mono-00 {
3211
+
background-color: #000;
3212
+
}
3213
+
3214
+
.fill-mono-100 {
3215
+
background-color: var(--mono-100);
3216
+
}
3217
+
3218
+
.fill-mono-50 {
3219
+
background-color: var(--mono-50);
3220
+
}
3221
+
3222
+
.fill-trans {
3223
+
background-color: rgba(0, 0, 0, 0);
3224
+
}
3225
+
3226
+
.fill-trans-50 {
3227
+
background-color: var(--trans-50);
3228
+
}
3229
+
3230
+
.fill-mono-95 {
3231
+
background-color: var(--mono-95);
3232
+
}
3233
+
3234
+
.fill-info {
3235
+
background-color: #fbb800;
3236
+
}
3237
+
3238
+
.fill-error {
3239
+
background-color: var(--err-1);
3240
+
}
3241
+
3242
+
.fill-error-low {
3243
+
background-color: var(--err-2);
3244
+
}
3245
+
3246
+
.bp-pad-1 {
3247
+
padding: 1rem;
3248
+
}
3249
+
3250
+
.bp-pad-2 {
3251
+
padding: 2rem;
3252
+
}
3253
+
3254
+
.bp-pad-4 {
3255
+
padding: 4rem;
3256
+
}
3257
+
3258
+
.bp-pad-0_5 {
3259
+
padding: 0.5rem;
3260
+
}
3261
+
3262
+
.bp-pad-0 {
3263
+
padding: 0;
3264
+
}
3265
+
3266
+
.bp-pad-0_5-v {
3267
+
padding: 0.5rem 0;
3268
+
}
3269
+
3270
+
.bp-pad-1-v {
3271
+
padding: 1rem 0;
3272
+
}
3273
+
3274
+
.bp-pad-2-v {
3275
+
padding: 2rem 0;
3276
+
}
3277
+
3278
+
.bp-pad-4-v {
3279
+
padding: 4rem 0;
3280
+
}
3281
+
3282
+
.tooltip-container {
3283
+
z-index: 9999;
3284
+
background-color: var(--mono-00);
3285
+
opacity: 0;
3286
+
color: var(--mono-100);
3287
+
white-space: nowrap;
3288
+
border-radius: 4px;
3289
+
padding: 0.5rem 0.75rem;
3290
+
font-size: 1rem;
3291
+
font-weight: 500;
3292
+
line-height: 1rem;
3293
+
transition: opacity 0.2s;
3294
+
display: none;
3295
+
position: absolute;
3296
+
}
3297
+
3298
+
.tooltip-container.visible {
3299
+
opacity: 1;
3300
+
display: block;
3301
+
}
3302
+
3303
+
.tooltip {
3304
+
cursor: default;
3305
+
display: inline-block;
3306
+
position: relative;
3307
+
}
3308
+
3309
+
.meta {
3310
+
color: var(--mono-50);
3311
+
}
3312
+
3313
+
.bp--plate-bg {
3314
+
z-index: -1;
3315
+
transform: scale3d(1none, 1none, 1none);
3316
+
object-fit: cover;
3317
+
transform-style: preserve-3d;
3318
+
width: 100%;
3319
+
height: 100%;
3320
+
transition: transform 0.425s;
3321
+
position: absolute;
3322
+
top: 0%;
3323
+
bottom: 0%;
3324
+
left: 0%;
3325
+
right: 0%;
3326
+
}
3327
+
3328
+
.fill-act-4 {
3329
+
background-color: var(--act-100);
3330
+
}
3331
+
3332
+
.fill-act-1 {
3333
+
background-color: #000ed9;
3334
+
}
3335
+
3336
+
.fill-act-3 {
3337
+
background-color: var(--act-90);
3338
+
}
3339
+
3340
+
.fill-act-2 {
3341
+
background-color: var(--act-1);
3342
+
}
3343
+
3344
+
.fill-mono-25 {
3345
+
background-color: var(--mono-25);
3346
+
}
3347
+
3348
+
.bp--section-hero {
3349
+
background-color: var(--mono-100);
3350
+
padding-top: 2em;
3351
+
padding-bottom: 2em;
3352
+
}
3353
+
3354
+
.bp--section-hero.portfolio {
3355
+
background-color: var(--mono-00);
3356
+
color: var(--mono-100);
3357
+
background-image: url('https://d3e54v103j8qbb.cloudfront.net/img/background-image.svg');
3358
+
background-position: 50%;
3359
+
background-repeat: no-repeat;
3360
+
background-size: cover;
3361
+
}
3362
+
3363
+
.bp--job {
3364
+
grid-column-gap: 0.5em;
3365
+
grid-row-gap: 0.5em;
3366
+
background-color: var(--mono-100);
3367
+
text-align: left;
3368
+
flex-direction: column;
3369
+
justify-content: center;
3370
+
padding: 2em;
3371
+
text-decoration: none;
3372
+
display: flex;
3373
+
}
3374
+
3375
+
.bp--job:hover {
3376
+
text-decoration: none;
3377
+
}
3378
+
3379
+
.bp--value {
3380
+
grid-column-gap: 0.5em;
3381
+
grid-row-gap: 0.5em;
3382
+
background-color: var(--mono-100);
3383
+
text-align: center;
3384
+
flex-direction: column;
3385
+
justify-content: center;
3386
+
padding: 2em 1em;
3387
+
text-decoration: none;
3388
+
display: flex;
3389
+
}
3390
+
3391
+
.bp--value:hover {
3392
+
text-decoration: none;
3393
+
}
3394
+
3395
+
.bp-block-inline {
3396
+
display: inline-block;
3397
+
}
3398
+
3399
+
.hopper {
3400
+
height: 1px;
3401
+
}
3402
+
3403
+
.bp--button-group {
3404
+
grid-column-gap: 1rem;
3405
+
grid-row-gap: 1rem;
3406
+
flex-direction: row;
3407
+
align-items: stretch;
3408
+
padding-top: 0.5em;
3409
+
padding-bottom: 0;
3410
+
display: flex;
3411
+
}
3412
+
3413
+
.bp--button-group.mini {
3414
+
font-size: 0.75em;
3415
+
}
3416
+
3417
+
.bp--plate-card-content {
3418
+
grid-column-gap: 0.5em;
3419
+
grid-row-gap: 0.5em;
3420
+
flex-direction: column;
3421
+
display: flex;
3422
+
}
3423
+
3424
+
.bp--identity {
3425
+
grid-column-gap: 1em;
3426
+
grid-row-gap: 1em;
3427
+
align-items: center;
3428
+
display: flex;
3429
+
}
3430
+
3431
+
.bp--container {
3432
+
max-width: 940px;
3433
+
margin-left: auto;
3434
+
margin-right: auto;
3435
+
}
3436
+
3437
+
.bp--card {
3438
+
grid-column-gap: 0.5em;
3439
+
grid-row-gap: 0.5em;
3440
+
background-color: var(--mono-100);
3441
+
text-align: left;
3442
+
flex-direction: column;
3443
+
justify-content: center;
3444
+
padding: 2em;
3445
+
text-decoration: none;
3446
+
display: flex;
3447
+
}
3448
+
3449
+
.bp--card:hover {
3450
+
text-decoration: none;
3451
+
}
3452
+
3453
+
.bp--container-max {
3454
+
grid-column-gap: 1em;
3455
+
grid-row-gap: 1em;
3456
+
border-radius: 2px;
3457
+
flex-direction: column;
3458
+
width: 100%;
3459
+
display: flex;
3460
+
}
3461
+
3462
+
.bp--container-max.hero {
3463
+
max-width: 1024px;
3464
+
}
3465
+
3466
+
.bp--container-full {
3467
+
grid-column-gap: 3em;
3468
+
grid-row-gap: 3em;
3469
+
grid-template-rows: auto;
3470
+
grid-template-columns: 1fr 1fr;
3471
+
grid-auto-columns: 1fr;
3472
+
grid-auto-flow: row;
3473
+
justify-content: space-between;
3474
+
width: 100%;
3475
+
max-width: 100%;
3476
+
margin-left: auto;
3477
+
margin-right: auto;
3478
+
padding-left: 2em;
3479
+
padding-right: 2em;
3480
+
display: grid;
3481
+
}
3482
+
3483
+
.bp--container-collection_source {
3484
+
width: 100%;
3485
+
max-width: 100%;
3486
+
margin-left: auto;
3487
+
margin-right: auto;
3488
+
padding-left: 2em;
3489
+
padding-right: 2em;
3490
+
display: none;
3491
+
}
3492
+
3493
+
.bp--prev {
3494
+
grid-column-gap: 0rem;
3495
+
grid-row-gap: 0rem;
3496
+
border-radius: 2px;
3497
+
flex-direction: column;
3498
+
grid-template-rows: auto auto;
3499
+
grid-template-columns: 1fr;
3500
+
grid-auto-columns: 1fr;
3501
+
justify-content: start;
3502
+
display: grid;
3503
+
}
3504
+
3505
+
.bp--next {
3506
+
grid-column-gap: 0rem;
3507
+
grid-row-gap: 0rem;
3508
+
border-radius: 2px;
3509
+
flex-direction: column;
3510
+
grid-template-rows: auto auto;
3511
+
grid-template-columns: 1fr;
3512
+
grid-auto-columns: 1fr;
3513
+
justify-content: end;
3514
+
display: grid;
3515
+
}
3516
+
3517
+
.bp--prev_next-wrapper {
3518
+
grid-column-gap: 1rem;
3519
+
grid-row-gap: 1rem;
3520
+
border-radius: 2px;
3521
+
flex-direction: column;
3522
+
align-items: stretch;
3523
+
display: block;
3524
+
}
3525
+
3526
+
.bp--footer {
3527
+
background-color: var(--mono-97);
3528
+
border-bottom: 1px solid #e4ebf3;
3529
+
margin-top: 4rem;
3530
+
margin-left: auto;
3531
+
margin-right: auto;
3532
+
position: relative;
3533
+
}
3534
+
3535
+
.bp--footer-col {
3536
+
flex-direction: column;
3537
+
justify-content: flex-start;
3538
+
align-items: flex-start;
3539
+
display: flex;
3540
+
}
3541
+
3542
+
.bp--divider {
3543
+
background-color: var(--mono-75);
3544
+
width: 100%;
3545
+
height: 1px;
3546
+
margin-top: 70px;
3547
+
margin-bottom: 15px;
3548
+
}
3549
+
3550
+
.bp--footer-grid {
3551
+
grid-column-gap: 1em;
3552
+
grid-row-gap: 1em;
3553
+
grid-template-rows: auto;
3554
+
grid-template-columns: 2fr 1fr 1fr;
3555
+
grid-auto-columns: 1fr;
3556
+
display: grid;
3557
+
}
3558
+
3559
+
.bp--badge {
3560
+
background-color: var(--mono-92);
3561
+
color: var(--mono-50);
3562
+
border-radius: 2px;
3563
+
padding-left: 0.5em;
3564
+
padding-right: 0.5em;
3565
+
font-size: 0.75em;
3566
+
line-height: 1.8em;
3567
+
display: inline-block;
3568
+
}
3569
+
3570
+
.bp--empty-state {
3571
+
background-color: var(--mono-92);
3572
+
padding: 1em;
3573
+
}
3574
+
3575
+
.fill-mono-35 {
3576
+
background-color: var(--mono-35);
3577
+
}
3578
+
3579
+
.fill-mono-75 {
3580
+
background-color: var(--mono-75);
3581
+
}
3582
+
3583
+
.fill-mono-85 {
3584
+
background-color: var(--mono-85);
3585
+
}
3586
+
3587
+
.fill-mono-92 {
3588
+
background-color: var(--mono-92);
3589
+
}
3590
+
3591
+
.fill-mono-97 {
3592
+
background-color: var(--mono-97);
3593
+
}
3594
+
3595
+
.bp--main {
3596
+
flex-direction: column;
3597
+
display: flex;
3598
+
}
3599
+
3600
+
.bp--navbar {
3601
+
width: 240px;
3602
+
max-width: 400px;
3603
+
height: 100vh;
3604
+
padding-top: 2em;
3605
+
padding-left: 1em;
3606
+
padding-right: 1em;
3607
+
font-size: 0.75em;
3608
+
position: -webkit-sticky;
3609
+
position: sticky;
3610
+
top: 0%;
3611
+
bottom: 0%;
3612
+
left: 0%;
3613
+
right: auto;
3614
+
}
3615
+
3616
+
.bp--navbar.hero {
3617
+
grid-column-gap: 1px;
3618
+
grid-row-gap: 1px;
3619
+
background-color: var(--mono-100);
3620
+
flex-direction: row;
3621
+
justify-content: space-between;
3622
+
align-items: flex-start;
3623
+
padding-top: 1em;
3624
+
padding-bottom: 1em;
3625
+
display: flex;
3626
+
}
3627
+
3628
+
.bp--navbar.h {
3629
+
z-index: 999998;
3630
+
background-color: var(--mono-100);
3631
+
box-shadow: 0 4px 16px -3px var(--trans-50);
3632
+
padding-top: 0.125rem;
3633
+
padding-bottom: 0.125rem;
3634
+
position: -webkit-sticky;
3635
+
position: sticky;
3636
+
top: 0%;
3637
+
bottom: auto;
3638
+
left: 0%;
3639
+
right: 0%;
3640
+
}
3641
+
3642
+
.bp--navbar.nav-callout {
3643
+
z-index: 999999;
3644
+
background-color: var(--hi-2);
3645
+
}
3646
+
3647
+
.bp--navbar.v {
3648
+
z-index: 999998;
3649
+
background-color: var(--mono-100);
3650
+
box-shadow: 0 4px 16px -3px var(--trans-50);
3651
+
flex-direction: column;
3652
+
padding-top: 0.125rem;
3653
+
padding-bottom: 0.125rem;
3654
+
display: flex;
3655
+
position: -webkit-sticky;
3656
+
position: sticky;
3657
+
top: 0%;
3658
+
bottom: auto;
3659
+
left: 0%;
3660
+
right: 0%;
3661
+
}
3662
+
3663
+
.bp--scaffold {
3664
+
width: 100vw;
3665
+
display: flex;
3666
+
}
3667
+
3668
+
.bp--col-copy {
3669
+
grid-column-gap: 1rem;
3670
+
grid-row-gap: 1rem;
3671
+
flex-direction: row;
3672
+
align-items: stretch;
3673
+
display: flex;
3674
+
}
3675
+
3676
+
.bp--col-copy.icons {
3677
+
grid-column-gap: 1rem;
3678
+
grid-row-gap: 1rem;
3679
+
flex-direction: row;
3680
+
grid-template-rows: auto;
3681
+
grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr;
3682
+
grid-auto-columns: 1fr;
3683
+
width: 100%;
3684
+
display: flex;
3685
+
}
3686
+
3687
+
.bp--col-copy.keywords {
3688
+
display: block;
3689
+
}
3690
+
3691
+
.bp--col-copy.menu {
3692
+
grid-column-gap: 0.5em;
3693
+
grid-row-gap: 0.5em;
3694
+
flex-direction: row;
3695
+
flex: 1;
3696
+
grid-template-rows: auto;
3697
+
grid-template-columns: 1fr 1fr 1fr 1fr 1fr;
3698
+
grid-auto-columns: 1fr;
3699
+
align-items: center;
3700
+
display: flex;
3701
+
}
3702
+
3703
+
.bp--col-copy.menu.trigger {
3704
+
display: none;
3705
+
}
3706
+
3707
+
.bp--col-copy.menu.right {
3708
+
justify-content: flex-end;
3709
+
}
3710
+
3711
+
.bp--col-copy.menu.left {
3712
+
grid-column-gap: 0.125em;
3713
+
grid-row-gap: 0.125em;
3714
+
flex: 0 auto;
3715
+
}
3716
+
3717
+
.bp--col-copy.large-gap {
3718
+
grid-column-gap: 2rem;
3719
+
grid-row-gap: 2rem;
3720
+
}
3721
+
3722
+
.bp--col-copy.small-gap {
3723
+
grid-column-gap: 0.5rem;
3724
+
grid-row-gap: 0.5rem;
3725
+
}
3726
+
3727
+
.bp--col-copy.no-gap {
3728
+
grid-column-gap: 0rem;
3729
+
grid-row-gap: 0rem;
3730
+
}
3731
+
3732
+
.bp--col-copy.nav-bar {
3733
+
justify-content: space-between;
3734
+
max-width: 100%;
3735
+
padding-top: 0.5em;
3736
+
padding-bottom: 0.5em;
3737
+
font-size: 0.625em;
3738
+
}
3739
+
3740
+
.bp--col-copy.fieldset {
3741
+
flex-direction: row;
3742
+
align-items: stretch;
3743
+
}
3744
+
3745
+
.bp--col-copy.right {
3746
+
justify-content: flex-end;
3747
+
}
3748
+
3749
+
.bp--col-copy.align-m {
3750
+
grid-column-gap: 0.25em;
3751
+
grid-row-gap: 0.25em;
3752
+
align-items: center;
3753
+
}
3754
+
3755
+
.surface {
3756
+
z-index: 999999;
3757
+
background-color: var(--mono-100);
3758
+
box-shadow: 0 4px 12px 0 var(--trans-25);
3759
+
position: -webkit-sticky;
3760
+
position: sticky;
3761
+
top: 0;
3762
+
}
3763
+
3764
+
@media screen and (min-width: 1280px) {
3765
+
.bp--keyword:hover {
3766
+
transform: scale3d(1none, 1none, 1none);
3767
+
}
3768
+
}
3769
+
3770
+
@media screen and (max-width: 991px) {
3771
+
.bp--container-2rem {
3772
+
grid-column-gap: 2em;
3773
+
grid-row-gap: 2em;
3774
+
}
3775
+
3776
+
.bp--body,
3777
+
.bp--site-body {
3778
+
font-size: 20px;
3779
+
}
3780
+
3781
+
.bp--plate {
3782
+
grid-template-columns: 1fr;
3783
+
grid-auto-columns: 5fr;
3784
+
display: flex;
3785
+
}
3786
+
3787
+
.bp--badge {
3788
+
font-size: 20px;
3789
+
}
3790
+
}
3791
+
3792
+
@media screen and (max-width: 767px) {
3793
+
.bp--button.icon {
3794
+
text-align: center;
3795
+
padding-left: 0.75rem;
3796
+
padding-right: 0.75rem;
3797
+
}
3798
+
3799
+
.bp--section {
3800
+
padding-left: 1em;
3801
+
padding-right: 1em;
3802
+
}
3803
+
3804
+
.bp--container-2rem {
3805
+
grid-column-gap: 1em;
3806
+
grid-row-gap: 1em;
3807
+
padding-left: 1em;
3808
+
padding-right: 1em;
3809
+
}
3810
+
3811
+
.bp--body,
3812
+
.bp--site-body {
3813
+
font-size: 16px;
3814
+
}
3815
+
3816
+
.bp-avatar.large {
3817
+
width: 6rem;
3818
+
height: 6rem;
3819
+
}
3820
+
3821
+
.bp--footer {
3822
+
padding-left: 15px;
3823
+
padding-right: 15px;
3824
+
}
3825
+
3826
+
.bp--footer-col {
3827
+
align-items: center;
3828
+
}
3829
+
3830
+
.bp--divider {
3831
+
margin-top: 60px;
3832
+
}
3833
+
3834
+
.bp--badge {
3835
+
font-size: 16px;
3836
+
}
3837
+
3838
+
.bp--navbar {
3839
+
padding-left: 1em;
3840
+
padding-right: 1em;
3841
+
}
3842
+
}
3843
+
3844
+
@media screen and (max-width: 479px) {
3845
+
.bp--button.primary.mobile {
3846
+
display: block;
3847
+
}
3848
+
3849
+
.bp--button.primary.desktop {
3850
+
display: none;
3851
+
}
3852
+
3853
+
.bp--quote {
3854
+
padding-left: 0.5em;
3855
+
padding-right: 1em;
3856
+
}
3857
+
3858
+
.bp--site-body {
3859
+
font-size: 14px;
3860
+
}
3861
+
3862
+
.bp--dropup {
3863
+
bottom: 4em;
3864
+
right: 1em;
3865
+
}
3866
+
3867
+
.bp-avatar.large {
3868
+
width: 4rem;
3869
+
height: 4rem;
3870
+
}
3871
+
3872
+
.bp--plate {
3873
+
padding: 0 1em 1em;
3874
+
}
3875
+
3876
+
.bp--plate:hover {
3877
+
transform: scale(1.01);
3878
+
}
3879
+
3880
+
.bp--plate-card {
3881
+
padding-top: 1.5em;
3882
+
padding-left: 1.5em;
3883
+
padding-right: 1.5em;
3884
+
}
3885
+
3886
+
.bp-input {
3887
+
font-size: 1.5rem;
3888
+
}
3889
+
3890
+
.bp--job,
3891
+
.bp--value,
3892
+
.bp--card {
3893
+
padding-top: 1.5em;
3894
+
padding-left: 1.5em;
3895
+
padding-right: 1.5em;
3896
+
}
3897
+
}
3898
+
3899
+
#w-node-_399d947d-56b1-e710-5746-a0a5f0039a87-9fd74154,
3900
+
#w-node-_399d947d-56b1-e710-5746-a0a5f0039a82-9fd74154,
3901
+
#w-node-_399d947d-56b1-e710-5746-a0a5f0039a8c-9fd74154,
3902
+
#w-node-_399d947d-56b1-e710-5746-a0a5f0039a91-9fd74154,
3903
+
#w-node-_041de344-4f4b-53e4-1bfd-fb069093f632-9093f623,
3904
+
#w-node-_041de344-4f4b-53e4-1bfd-fb069093f63d-9093f623,
3905
+
#w-node-_4c308b66-d1d3-2bd2-33c3-6d4a8eb213b0-79ded8ce,
3906
+
#w-node-_692c258b-e6b3-6ae4-a71f-374b5ed108ec-22d74155,
3907
+
#w-node-_27d964d7-71bf-8ce5-1e1d-4b972b3ba478-22d74155,
3908
+
#w-node-_7466db0e-81a6-9bbe-98ec-b431b3344db5-22d74155,
3909
+
#w-node-_817dc116-5c27-258c-e786-af444fa08762-22d74155,
3910
+
#w-node-_38676560-e717-595a-5094-877f49e544a0-49e5449f,
3911
+
#w-node-_9b92584f-99b9-23be-771a-34fd65faf4d4-a9745761,
3912
+
#w-node-_6ae5c451-b99c-2666-8289-3a462e35fd71-2e35fd71,
3913
+
#w-node-c87483e8-cc45-6b38-841c-2f17ba12af6d-2e35fd71 {
3914
+
grid-area: span 1 / span 1 / span 1 / span 1;
3915
+
}
3916
+
3917
+
@font-face {
3918
+
font-family: 'FontAwesome 6';
3919
+
src:
3920
+
url('https://uploads-ssl.webflow.com/63020a6ad41103c31cd7414e/63020a6ad41103330ed7417a_fa-regular-400.woff2')
3921
+
format('woff2'),
3922
+
url('https://uploads-ssl.webflow.com/63020a6ad41103c31cd7414e/63020a6ad41103db67d7417e_fa-regular-400.ttf')
3923
+
format('truetype');
3924
+
font-weight: 400;
3925
+
font-style: normal;
3926
+
font-display: auto;
3927
+
}
3928
+
3929
+
@font-face {
3930
+
font-family: 'FontAwesome 6';
3931
+
src:
3932
+
url('https://uploads-ssl.webflow.com/63020a6ad41103c31cd7414e/63020a6ad41103794bd7418c_fa-solid-900.woff2')
3933
+
format('woff2'),
3934
+
url('https://uploads-ssl.webflow.com/63020a6ad41103c31cd7414e/63020a6ad411033fc7d7417d_fa-solid-900.ttf')
3935
+
format('truetype');
3936
+
font-weight: 900;
3937
+
font-style: normal;
3938
+
font-display: auto;
3939
+
}
3940
+
3941
+
@font-face {
3942
+
font-family: 'FontAwesome Brands 6';
3943
+
src:
3944
+
url('https://uploads-ssl.webflow.com/63020a6ad41103c31cd7414e/63020a6ad41103fe94d74178_fa-brands-400.woff2')
3945
+
format('woff2'),
3946
+
url('https://uploads-ssl.webflow.com/63020a6ad41103c31cd7414e/63020a6ad411037fcdd7417c_fa-brands-400.ttf')
3947
+
format('truetype');
3948
+
font-weight: 400;
3949
+
font-style: normal;
3950
+
font-display: auto;
3951
+
}
3952
+
3953
+
@font-face {
3954
+
font-family: 'FontAwesome 6';
3955
+
src:
3956
+
url('https://uploads-ssl.webflow.com/63020a6ad41103c31cd7414e/63020a6ad411039933d74179_fa-thin-100.woff2')
3957
+
format('woff2'),
3958
+
url('https://uploads-ssl.webflow.com/63020a6ad41103c31cd7414e/63020a6ad411038365d7418e_fa-thin-100.ttf')
3959
+
format('truetype');
3960
+
font-weight: 100;
3961
+
font-style: normal;
3962
+
font-display: auto;
3963
+
}
3964
+
3965
+
@font-face {
3966
+
font-family: 'FontAwesome 6';
3967
+
src:
3968
+
url('https://uploads-ssl.webflow.com/63020a6ad41103c31cd7414e/63020a6ad411031febd7417b_fa-light-300.woff2')
3969
+
format('woff2'),
3970
+
url('https://uploads-ssl.webflow.com/63020a6ad41103c31cd7414e/63020a6ad41103530ed7418d_fa-light-300.ttf')
3971
+
format('truetype');
3972
+
font-weight: 300;
3973
+
font-style: normal;
3974
+
font-display: auto;
3975
+
}
+139
src/hooks/atproto/fetchPublications.ts
+139
src/hooks/atproto/fetchPublications.ts
···
1
+
import { useEffect, useState } from 'react';
2
+
import { ATPROTO_COLLECTIONS, buildBlobUrl } from '@/config/atproto';
3
+
import type { ATProtocolDocument, ATProtocolPublication, FetchResult } from '@/types/atproto';
4
+
import { fetchRecords } from './fetchRecords';
5
+
6
+
/**
7
+
* Publication data with resolved metadata
8
+
*/
9
+
export interface Publication {
10
+
uri: string;
11
+
name: string;
12
+
basePath: string;
13
+
icon?: string;
14
+
description?: string;
15
+
}
16
+
17
+
/**
18
+
* Document data with resolved publication metadata
19
+
*/
20
+
export interface Document {
21
+
uri: string;
22
+
slug: string;
23
+
title: string;
24
+
description?: string;
25
+
publishedAt: string;
26
+
articleUrl: string;
27
+
publication: Publication;
28
+
}
29
+
30
+
/**
31
+
* Hook for fetching publications and their associated documents
32
+
* Automatically resolves publication references in documents
33
+
*
34
+
* @returns FetchResult with combined documents and publications data
35
+
*
36
+
* @example
37
+
* ```tsx
38
+
* const { data: posts, loading, error } = fetchPublications();
39
+
*
40
+
* if (loading) return <div>Loading...</div>;
41
+
* if (error) return <div>Error: {error}</div>;
42
+
*
43
+
* return posts?.map(post => (
44
+
* <article key={post.uri}>
45
+
* <h2>{post.title}</h2>
46
+
* <p>{post.publication.name}</p>
47
+
* </article>
48
+
* ));
49
+
* ```
50
+
*/
51
+
export function fetchPublications(): FetchResult<Document[]> {
52
+
const {
53
+
data: publicationsData,
54
+
loading: publicationsLoading,
55
+
error: publicationsError,
56
+
} = fetchRecords<ATProtocolPublication['value']>(ATPROTO_COLLECTIONS.PUBLICATION);
57
+
58
+
const {
59
+
data: documentsData,
60
+
loading: documentsLoading,
61
+
error: documentsError,
62
+
} = fetchRecords<ATProtocolDocument['value']>(ATPROTO_COLLECTIONS.DOCUMENT);
63
+
64
+
const [data, setData] = useState<Document[] | null>(null);
65
+
const [loading, setLoading] = useState(true);
66
+
const [error, setError] = useState<string | null>(null);
67
+
68
+
useEffect(() => {
69
+
// Wait for both fetches to complete
70
+
if (publicationsLoading || documentsLoading) {
71
+
setLoading(true);
72
+
return;
73
+
}
74
+
75
+
// Check for errors
76
+
if (publicationsError || documentsError) {
77
+
setError(publicationsError || documentsError);
78
+
setLoading(false);
79
+
return;
80
+
}
81
+
82
+
// Check if we have data
83
+
if (!publicationsData || !documentsData) {
84
+
setLoading(false);
85
+
return;
86
+
}
87
+
88
+
try {
89
+
// Create publication lookup map
90
+
const publicationMap = new Map<string, Publication>();
91
+
publicationsData.forEach((record) => {
92
+
const iconUrl = record.value.icon ? buildBlobUrl(record.value.icon.ref.$link) : undefined;
93
+
94
+
publicationMap.set(record.uri, {
95
+
uri: record.uri,
96
+
name: record.value.name,
97
+
basePath: record.value.base_path,
98
+
icon: iconUrl,
99
+
description: record.value.description,
100
+
});
101
+
});
102
+
103
+
// Transform documents with resolved publication data
104
+
const documents: Document[] = documentsData
105
+
.map((record) => {
106
+
const slug = record.uri.split('/').pop() || '';
107
+
const publication = publicationMap.get(record.value.publication);
108
+
109
+
if (!publication) {
110
+
console.warn(`Publication not found for document: ${record.uri}`);
111
+
return null;
112
+
}
113
+
114
+
return {
115
+
uri: record.uri,
116
+
slug,
117
+
title: record.value.title,
118
+
description: record.value.description,
119
+
publishedAt: record.value.publishedAt,
120
+
articleUrl: `https://${publication.basePath}/${slug}`,
121
+
publication,
122
+
};
123
+
})
124
+
.filter((doc): doc is Document => doc !== null)
125
+
// Sort by published date, newest first
126
+
.sort((a, b) => new Date(b.publishedAt).getTime() - new Date(a.publishedAt).getTime());
127
+
128
+
setData(documents);
129
+
setError(null);
130
+
} catch (err) {
131
+
console.error('Error processing publications and documents:', err);
132
+
setError(err instanceof Error ? err.message : 'An error occurred');
133
+
} finally {
134
+
setLoading(false);
135
+
}
136
+
}, [publicationsData, documentsData, publicationsLoading, documentsLoading, publicationsError, documentsError]);
137
+
138
+
return { data, loading, error };
139
+
}
+51
src/hooks/atproto/fetchRecords.ts
+51
src/hooks/atproto/fetchRecords.ts
···
1
+
import { useEffect, useState } from 'react';
2
+
import { buildRecordsUrl } from '@/config/atproto';
3
+
import type { ATProtocolRecord, FetchResult, ListRecordsResponse } from '@/types/atproto';
4
+
5
+
/**
6
+
* Generic hook for fetching records from any AT Protocol collection
7
+
*
8
+
* @param collection - The collection identifier (e.g., 'pub.leaflet.publication')
9
+
* @param repo - Optional repo DID (defaults to configured DID)
10
+
* @returns FetchResult with records data, loading state, and error
11
+
*
12
+
* @example
13
+
* ```tsx
14
+
* const { data: publications, loading, error } = fetchRecords<PublicationValue>(
15
+
* 'pub.leaflet.publication'
16
+
* );
17
+
* ```
18
+
*/
19
+
export function fetchRecords<T = unknown>(collection: string, repo?: string): FetchResult<ATProtocolRecord<T>[]> {
20
+
const [data, setData] = useState<ATProtocolRecord<T>[] | null>(null);
21
+
const [loading, setLoading] = useState(true);
22
+
const [error, setError] = useState<string | null>(null);
23
+
24
+
useEffect(() => {
25
+
const fetchRecords = async () => {
26
+
try {
27
+
setLoading(true);
28
+
setError(null);
29
+
30
+
const url = buildRecordsUrl(collection, repo);
31
+
const response = await fetch(url);
32
+
33
+
if (!response.ok) {
34
+
throw new Error(`Failed to fetch records from collection: ${collection}`);
35
+
}
36
+
37
+
const data: ListRecordsResponse<T> = await response.json();
38
+
setData(data.records);
39
+
} catch (err) {
40
+
console.error(`Error fetching AT Protocol records from ${collection}:`, err);
41
+
setError(err instanceof Error ? err.message : 'An error occurred');
42
+
} finally {
43
+
setLoading(false);
44
+
}
45
+
};
46
+
47
+
fetchRecords();
48
+
}, [collection, repo]);
49
+
50
+
return { data, loading, error };
51
+
}
+7
src/hooks/atproto/index.ts
+7
src/hooks/atproto/index.ts
+5
src/hooks/dom/index.ts
+5
src/hooks/dom/index.ts
+61
src/hooks/dom/trackVisibility.ts
+61
src/hooks/dom/trackVisibility.ts
···
1
+
import { useEffect, useRef, useState } from 'react';
2
+
3
+
interface UseInViewOptions {
4
+
threshold?: number;
5
+
triggerOnce?: boolean;
6
+
rootMargin?: string;
7
+
}
8
+
9
+
/**
10
+
* Hook to track element visibility using Intersection Observer
11
+
*
12
+
* @param options - Configuration options
13
+
* @param options.threshold - Percentage of element that must be visible (0-1)
14
+
* @param options.triggerOnce - Whether to stop observing after first intersection
15
+
* @param options.rootMargin - Margin around the root element
16
+
* @returns Object with ref to attach to element and isInView boolean
17
+
*
18
+
* @example
19
+
* ```tsx
20
+
* const { ref, isInView } = trackVisibility({ threshold: 0.5, triggerOnce: true });
21
+
* return <div ref={ref}>{isInView ? 'Visible!' : 'Hidden'}</div>;
22
+
* ```
23
+
*/
24
+
export function trackVisibility<T extends HTMLElement = HTMLElement>({
25
+
threshold = 0.1,
26
+
triggerOnce = true,
27
+
rootMargin = '0px',
28
+
}: UseInViewOptions = {}) {
29
+
const [isInView, setIsInView] = useState(false);
30
+
const ref = useRef<T>(null);
31
+
32
+
useEffect(() => {
33
+
const element = ref.current;
34
+
if (!element) return;
35
+
36
+
const observer = new IntersectionObserver(
37
+
([entry]) => {
38
+
if (entry.isIntersecting) {
39
+
setIsInView(true);
40
+
if (triggerOnce) {
41
+
observer.unobserve(element);
42
+
}
43
+
} else if (!triggerOnce) {
44
+
setIsInView(false);
45
+
}
46
+
},
47
+
{ threshold, rootMargin },
48
+
);
49
+
50
+
observer.observe(element);
51
+
52
+
return () => {
53
+
observer.disconnect();
54
+
};
55
+
}, [threshold, triggerOnce, rootMargin]);
56
+
57
+
return { ref, isInView };
58
+
}
59
+
60
+
// Legacy export for backward compatibility
61
+
export { trackVisibility as useInView };
+11
src/index.css
+11
src/index.css
···
1
+
@import url('https://fonts.googleapis.com/css2?family=DM+Sans:ital,opsz,wght@0,9..40,100..1000;1,9..40,100..1000&family=DM+Serif+Display:ital@0;1&display=swap');
2
+
3
+
@tailwind base;
4
+
@tailwind components;
5
+
@tailwind utilities;
6
+
7
+
@layer utilities {
8
+
::selection {
9
+
@apply bg-bones-yellow text-bones-black;
10
+
}
11
+
}
+60
src/lib/data/getData.ts
+60
src/lib/data/getData.ts
···
1
+
import { promises as fs } from 'fs';
2
+
import path from 'path';
3
+
import type { Article, CaseStudy, Company, ContentData, Job, Skill } from '@/types/content';
4
+
5
+
const dataDirectory = path.join(process.cwd(), 'src', 'lib', 'data', 'json');
6
+
7
+
export async function getContent(): Promise<ContentData> {
8
+
const filePath = path.join(dataDirectory, 'content.json');
9
+
const jsonData = await fs.readFile(filePath, 'utf8');
10
+
return JSON.parse(jsonData);
11
+
}
12
+
13
+
export async function getArticles(): Promise<Article[]> {
14
+
const filePath = path.join(dataDirectory, 'articles.json');
15
+
const jsonData = await fs.readFile(filePath, 'utf8');
16
+
return JSON.parse(jsonData);
17
+
}
18
+
19
+
export async function getCaseStudies(): Promise<CaseStudy[]> {
20
+
const filePath = path.join(dataDirectory, 'casestudies.json');
21
+
const jsonData = await fs.readFile(filePath, 'utf8');
22
+
return JSON.parse(jsonData);
23
+
}
24
+
25
+
export async function getCompanies(): Promise<Company[]> {
26
+
const filePath = path.join(dataDirectory, 'companies.json');
27
+
const jsonData = await fs.readFile(filePath, 'utf8');
28
+
return JSON.parse(jsonData);
29
+
}
30
+
31
+
export async function getJobs(): Promise<Job[]> {
32
+
const filePath = path.join(dataDirectory, 'jobs.json');
33
+
const jsonData = await fs.readFile(filePath, 'utf8');
34
+
return JSON.parse(jsonData);
35
+
}
36
+
37
+
export async function getSkills(): Promise<Skill[]> {
38
+
const filePath = path.join(dataDirectory, 'skills.json');
39
+
const jsonData = await fs.readFile(filePath, 'utf8');
40
+
return JSON.parse(jsonData);
41
+
}
42
+
43
+
// Helper function to get a single item by slug
44
+
export async function getItemBySlug<T extends { slug: string }>(items: T[], slug: string): Promise<T | undefined> {
45
+
return items.find((item) => item.slug === slug);
46
+
}
47
+
48
+
// Helper function to get featured articles
49
+
export async function getFeaturedArticles(): Promise<Article[]> {
50
+
const articles = await getArticles();
51
+
return articles.filter((article) => article.featured);
52
+
}
53
+
54
+
// Helper function to get latest case studies
55
+
export async function getLatestCaseStudies(limit: number = 3): Promise<CaseStudy[]> {
56
+
const caseStudies = await getCaseStudies();
57
+
return caseStudies
58
+
.sort((a, b) => new Date(b.publishedOn).getTime() - new Date(a.publishedOn).getTime())
59
+
.slice(0, limit);
60
+
}
+5
src/lib/utils/index.ts
+5
src/lib/utils/index.ts
+22
src/lib/utils/mergeClasses.ts
+22
src/lib/utils/mergeClasses.ts
···
1
+
import { clsx, type ClassValue } from 'clsx';
2
+
import { twMerge } from 'tailwind-merge';
3
+
4
+
/**
5
+
* Merges class names using clsx and tailwind-merge
6
+
* Combines multiple class values and resolves Tailwind CSS conflicts
7
+
*
8
+
* @param inputs - Class values to merge (strings, objects, arrays)
9
+
* @returns Merged class string with Tailwind conflicts resolved
10
+
*
11
+
* @example
12
+
* ```tsx
13
+
* mergeClasses('px-4', 'px-2') // => 'px-2' (later wins)
14
+
* mergeClasses('text-red-500', condition && 'text-blue-500') // => conditional classes
15
+
* ```
16
+
*/
17
+
export function mergeClasses(...inputs: ClassValue[]) {
18
+
return twMerge(clsx(inputs));
19
+
}
20
+
21
+
// Legacy export for backward compatibility
22
+
export { mergeClasses as cn };
+17
src/main.tsx
+17
src/main.tsx
···
1
+
import React from 'react';
2
+
import ReactDOM from 'react-dom/client';
3
+
import { HelmetProvider } from 'react-helmet-async';
4
+
import { BrowserRouter as Router } from 'react-router-dom';
5
+
import App from './App.tsx';
6
+
import './index.css';
7
+
import './global.css';
8
+
9
+
ReactDOM.createRoot(document.getElementById('root')!).render(
10
+
<React.StrictMode>
11
+
<HelmetProvider>
12
+
<Router>
13
+
<App />
14
+
</Router>
15
+
</HelmetProvider>
16
+
</React.StrictMode>,
17
+
);
+163
src/pages/AboutPage.tsx
+163
src/pages/AboutPage.tsx
···
1
+
import { Heading } from '@/components/Heading/Heading';
2
+
import { Aside, Layout, Main } from '@/components/Layout/Layout';
3
+
import { Link } from '@/components/Link/Link';
4
+
import { Paragraph } from '@/components/Paragraph/Paragraph';
5
+
import TLDRProfile from '@/components/TLDRProfile/TLDRProfile';
6
+
import type { JSX } from 'react';
7
+
import { Helmet } from 'react-helmet-async';
8
+
9
+
/**
10
+
* About page component
11
+
*
12
+
* @returns JSX element with about page content
13
+
*/
14
+
export default function AboutPage(): JSX.Element {
15
+
const jsonLd = {
16
+
'@context': 'https://schema.org',
17
+
'@type': 'AboutPage',
18
+
mainEntity: {
19
+
'@type': 'Person',
20
+
name: 'Barry Prendergast',
21
+
jobTitle: 'Consulting Design Strategist',
22
+
description:
23
+
'Design strategist helping ambitious organisations get better products to market faster by focusing on the metrics that matter.',
24
+
url: 'https://renderg.host/about',
25
+
sameAs: [
26
+
'https://bsky.app/profile/renderg.host',
27
+
'https://linkedin.com/in/barryprendergast',
28
+
'https://signal.me/#eu/XO_aKC1aE1GZYWdMx7WK7HKGSCfrlpNhlxLGNi774dhiL7qr32BAMrH1BqgChaiM',
29
+
],
30
+
},
31
+
};
32
+
33
+
return (
34
+
<>
35
+
<Helmet>
36
+
<title>About | Barry Prendergast</title>
37
+
<meta
38
+
name="description"
39
+
content="Design strategist helping ambitious organisations get better products to market faster through outcome-driven design."
40
+
/>
41
+
<script type="application/ld+json" dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }} />
42
+
</Helmet>
43
+
44
+
<Layout theme="default">
45
+
<Main>
46
+
<div className="flex flex-col gap-12">
47
+
<Heading level={1} style="page">
48
+
About Me
49
+
</Heading>
50
+
<Paragraph size="billboard">
51
+
I help ambitious organisations get better products to market faster by focusing on the metrics that
52
+
matter.
53
+
</Paragraph>
54
+
55
+
<Paragraph size="billboard">
56
+
I believe that great design comes from <em>bold ideas</em>, timely conversations with the right people,
57
+
and rigorous testing against the right metrics in lean, iterative cycles.
58
+
</Paragraph>
59
+
60
+
<Paragraph size="billboard">
61
+
I'm a fellow of the{' '}
62
+
<Link href="https://thomaskuhnfoundation.org/" target="_blank">
63
+
Thomas Kuhn Foundation
64
+
</Link>
65
+
, supporting new ways to understand scientific knowledge.
66
+
</Paragraph>
67
+
68
+
<Paragraph size="billboard">
69
+
I try to tackle the hardest problems by listening closely, communicating clearly and collaborating openly
70
+
by default.
71
+
</Paragraph>
72
+
73
+
<Paragraph size="billboard">
74
+
My design approach balances <em>strategic clarity</em> with research and design excellence, while
75
+
responding to the everchanging needs of an agile product team.
76
+
</Paragraph>
77
+
78
+
<Paragraph size="billboard">
79
+
I help teams to cut through distractions, to adapt when things don't go to plan, and to stay focused
80
+
on what matters most—to the teams and their customers alike.
81
+
</Paragraph>
82
+
83
+
<Heading level={2} style="section">
84
+
I <Link href="#">specialise</Link> in three areas.
85
+
</Heading>
86
+
87
+
<Paragraph size="billboard">
88
+
<em>Design Strategy</em>: Aligning key business metrics with unmet user needs. I translate business goals
89
+
into actionable product and design objectives, ensuring every design decision drives meaningful success.
90
+
</Paragraph>
91
+
92
+
<Paragraph size="billboard">
93
+
<em>Product Design</em>: Hands-on design and prototyping to validate bets and improve user experiences. I
94
+
combine research, usability, and rapid prototyping to de-risk product decisions and refine solutions over
95
+
time through continuous iteration.
96
+
</Paragraph>
97
+
98
+
<Paragraph size="billboard">
99
+
<em>Design Operations</em>: Optimising the tools, rituals, and metrics that nurture great design culture.
100
+
I streamline workflows, remove friction, and embed scalable design practices that empower teams to move
101
+
fast without compromising quality.
102
+
</Paragraph>
103
+
104
+
<Paragraph size="billboard">
105
+
Since 2008, I've worked with organisations including{' '}
106
+
<Link href="https://www.morressier.com/" target="_blank">
107
+
Morressier
108
+
</Link>
109
+
,{' '}
110
+
<Link href="https://www.leo-pharma.com/" target="_blank">
111
+
LEO Pharma
112
+
</Link>
113
+
,{' '}
114
+
<Link href="https://www.edfenergy.com/" target="_blank">
115
+
EDF Energy
116
+
</Link>
117
+
,{' '}
118
+
<Link href="https://www.gov.uk/government/organisations/home-office" target="_blank">
119
+
UK Home Office
120
+
</Link>
121
+
,{' '}
122
+
<Link href="https://www.brandwatch.com/" target="_blank">
123
+
Brandwatch
124
+
</Link>
125
+
, and{' '}
126
+
<Link href="https://mediatonicgames.com/" target="_blank">
127
+
Mediatonic
128
+
</Link>
129
+
—from scientific publishing to pharmaceuticals, energy to government, consumer intelligence to gaming.
130
+
</Paragraph>
131
+
132
+
<Paragraph size="billboard">
133
+
<Link href="https://calendar.app.google/cuYkSrDLca1Wxfqo9" target="_blank" rel="noopener noreferrer">
134
+
Book our first meeting
135
+
</Link>
136
+
, connect on{' '}
137
+
<Link href="https://linkedin.com/in/barryprendergast" target="_blank" rel="noopener noreferrer">
138
+
LinkedIn
139
+
</Link>
140
+
, or message me on{' '}
141
+
<Link
142
+
href="https://signal.me/#eu/XO_aKC1aE1GZYWdMx7WK7HKGSCfrlpNhlxLGNi774dhiL7qr32BAMrH1BqgChaiM"
143
+
target="_blank"
144
+
rel="noopener noreferrer"
145
+
>
146
+
Signal
147
+
</Link>
148
+
.
149
+
</Paragraph>
150
+
151
+
<Paragraph size="billboard">
152
+
<Link href="/">← Back to Home</Link>
153
+
</Paragraph>
154
+
</div>
155
+
</Main>
156
+
157
+
<Aside>
158
+
<TLDRProfile />
159
+
</Aside>
160
+
</Layout>
161
+
</>
162
+
);
163
+
}
+109
src/pages/HomePage.tsx
+109
src/pages/HomePage.tsx
···
1
+
import { Heading } from '@/components/Heading/Heading';
2
+
import { Aside, Layout, Main } from '@/components/Layout/Layout';
3
+
import { Link } from '@/components/Link/Link';
4
+
import { Paragraph } from '@/components/Paragraph/Paragraph';
5
+
import TLDRProfile from '@/components/TLDRProfile/TLDRProfile';
6
+
import type { JSX } from 'react';
7
+
import { Helmet } from 'react-helmet-async';
8
+
9
+
/**
10
+
* Main home page component
11
+
*
12
+
* @returns JSX element with homepage content
13
+
*/
14
+
export default function HomePage(): JSX.Element {
15
+
const jsonLd = {
16
+
'@context': 'https://schema.org',
17
+
'@type': 'Person',
18
+
name: 'Barry Prendergast',
19
+
jobTitle: 'Consulting Design Strategist',
20
+
url: 'https://renderg.host',
21
+
address: {
22
+
'@type': 'PostalAddress',
23
+
addressLocality: 'Berlin',
24
+
addressCountry: 'Germany',
25
+
},
26
+
sameAs: [
27
+
'https://bsky.app/profile/renderg.host',
28
+
'https://linkedin.com/in/barryprendergast',
29
+
'https://signal.me/#eu/XO_aKC1aE1GZYWdMx7WK7HKGSCfrlpNhlxLGNi774dhiL7qr32BAMrH1BqgChaiM',
30
+
],
31
+
worksFor: {
32
+
'@type': 'Organization',
33
+
name: 'Thomas Kuhn Foundation',
34
+
url: 'https://thomaskuhnfoundation.org/',
35
+
},
36
+
knowsAbout: [
37
+
'Design Strategy',
38
+
'Service Design',
39
+
'Product Design',
40
+
'Systems Thinking',
41
+
'Human-Centred Design',
42
+
'Technology',
43
+
'Science Communication',
44
+
],
45
+
};
46
+
47
+
return (
48
+
<>
49
+
<Helmet>
50
+
<script type="application/ld+json" dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }} />
51
+
</Helmet>
52
+
53
+
<Layout theme="accent">
54
+
<Main>
55
+
<div className="flex flex-col gap-12">
56
+
<Heading level={1} style="billboard">
57
+
Hi! 👋 I'm Barry Prendergast, a design strategist living in Berlin, Germany.
58
+
</Heading>
59
+
60
+
<Paragraph size="billboard">
61
+
I <Link href="/about">specialise</Link> in <em>outcome</em>-driven design strategy, practice, and systems
62
+
for digital products and services.
63
+
</Paragraph>
64
+
65
+
<Paragraph size="billboard">
66
+
I{' '}
67
+
<Link href="https://www.linkedin.com/in/barrymprendergast/details/experience/" target="_blank">
68
+
work
69
+
</Link>{' '}
70
+
with nonprofits and startups to ease their growing pains, and to market faster.
71
+
</Paragraph>
72
+
73
+
<Paragraph size="billboard">
74
+
I <Link href="/writing">write</Link> about about academia, design, product, science, systems, technology &
75
+
the messy in-betweens.
76
+
</Paragraph>
77
+
78
+
<Paragraph size="billboard">
79
+
<Link href="https://cal.com/renderghost" target="_blank" rel="noopener noreferrer">
80
+
Book a meeting
81
+
</Link>{' '}
82
+
with me or let's talk first on{' '}
83
+
<Link href="https://bsky.app/profile/renderg.host" target="_blank" rel="noopener noreferrer">
84
+
Bluesky
85
+
</Link>
86
+
,{' '}
87
+
<Link href="https://linkedin.com/in/barryprendergast" target="_blank" rel="noopener noreferrer">
88
+
LinkedIn
89
+
</Link>
90
+
, or{' '}
91
+
<Link
92
+
href="https://signal.me/#eu/XO_aKC1aE1GZYWdMx7WK7HKGSCfrlpNhlxLGNi774dhiL7qr32BAMrH1BqgChaiM"
93
+
target="_blank"
94
+
rel="noopener noreferrer"
95
+
>
96
+
Signal
97
+
</Link>
98
+
.
99
+
</Paragraph>
100
+
</div>
101
+
</Main>
102
+
103
+
<Aside>
104
+
<TLDRProfile />
105
+
</Aside>
106
+
</Layout>
107
+
</>
108
+
);
109
+
}
+71
src/pages/WorksPage.tsx
+71
src/pages/WorksPage.tsx
···
1
+
import { Link } from '@/components/Link/Link';
2
+
import type { JSX } from 'react';
3
+
import { Helmet } from 'react-helmet-async';
4
+
5
+
/**
6
+
* Works page component
7
+
*
8
+
* @returns JSX element with works page content
9
+
*/
10
+
export default function WorksPage(): JSX.Element {
11
+
const jsonLd = {
12
+
'@context': 'https://schema.org',
13
+
'@type': 'CollectionPage',
14
+
name: 'Works by Barry Prendergast',
15
+
description: 'Case studies and projects by Barry Prendergast, design strategist.',
16
+
url: 'https://renderg.host/works',
17
+
};
18
+
19
+
const caseStudies = [
20
+
{ id: 1, title: 'Democratising insightful decision making across organisations', company: 'Brandwatch' },
21
+
{ id: 2, title: 'Building a professional community for scientists', company: 'Morressier' },
22
+
{ id: 3, title: 'Scaling a platform design system', company: 'Morressier' },
23
+
{ id: 4, title: 'Designing dermatology as a digital service', company: 'LEO Pharma' },
24
+
{ id: 5, title: 'Reducing energy waste at home', company: 'EDF Energy' },
25
+
{ id: 6, title: 'Defining the product strategy for eco shopping', company: 'MyGoodPlanet' },
26
+
{ id: 7, title: 'Improving the recruitment experience for design candidates', company: 'Morressier' },
27
+
{ id: 8, title: 'Scaling product design feedback', company: 'Morressier' },
28
+
{ id: 9, title: 'Streamlining immigration services', company: 'UK Home Office' },
29
+
{ id: 10, title: 'Creating data-driven insights for enterprises', company: 'Brandwatch' },
30
+
{ id: 11, title: 'Launching scalable design systems', company: 'Pure360' },
31
+
{ id: 12, title: 'Building inclusive gaming experiences', company: 'Mediatonic' },
32
+
{ id: 13, title: 'Enhancing smart energy platforms', company: 'EDF Energy' },
33
+
{ id: 14, title: 'Designing for scientific publishing', company: 'Morressier' },
34
+
{ id: 15, title: 'Supporting sustainable shopping decisions', company: 'MyGoodPlanet' },
35
+
{ id: 16, title: 'Developing enterprise software solutions', company: 'Schlumberger' },
36
+
];
37
+
38
+
return (
39
+
<>
40
+
<Helmet>
41
+
<title>Works | Barry Prendergast</title>
42
+
<meta
43
+
name="description"
44
+
content="Case studies and projects by Barry Prendergast, showcasing design strategy and product design work."
45
+
/>
46
+
<script type="application/ld+json" dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }} />
47
+
</Helmet>
48
+
49
+
<main className="min-h-screen bg-bones-blue text-bones-white">
50
+
<div className="grid grid-cols-1 sm:grid-cols-2 xl:grid-cols-3">
51
+
{caseStudies.map((study) => (
52
+
<Link
53
+
key={study.id}
54
+
href="#"
55
+
className="flex flex-col justify-start items-start p-8 border border-bones-white/10 hover:bg-bones-white/5 transition-colors overflow-hidden aspect-square"
56
+
>
57
+
<span className="text-5xl font-medium leading-tight">{study.title}</span>
58
+
<span className="text-2xl opacity-60 mt-2">{study.company}</span>
59
+
</Link>
60
+
))}
61
+
<Link
62
+
href="/"
63
+
className="flex flex-col justify-start items-start p-8 border border-bones-white/10 hover:bg-bones-white/5 transition-colors col-span-1 sm:col-span-2 xl:col-span-3"
64
+
>
65
+
<span className="text-6xl font-medium">← Back to Home</span>
66
+
</Link>
67
+
</div>
68
+
</main>
69
+
</>
70
+
);
71
+
}
+97
src/pages/WritingPage.tsx
+97
src/pages/WritingPage.tsx
···
1
+
import { CardArticle } from '@/components/CardArticle/CardArticle';
2
+
import { Divider } from '@/components/Divider/Divider';
3
+
import { Heading } from '@/components/Heading/Heading';
4
+
import { Aside, Layout, Main } from '@/components/Layout/Layout';
5
+
import { Link } from '@/components/Link/Link';
6
+
import { Paragraph } from '@/components/Paragraph/Paragraph';
7
+
import TLDRProfile from '@/components/TLDRProfile/TLDRProfile';
8
+
import { fetchPublications } from '@/hooks/atproto';
9
+
import type { JSX } from 'react';
10
+
import { Helmet } from 'react-helmet-async';
11
+
12
+
/**
13
+
* Writing page component - displays blog posts from AT Protocol PDS
14
+
*
15
+
* @returns JSX element with writing page content
16
+
*/
17
+
export default function WritingPage(): JSX.Element {
18
+
const { data: documents, loading, error } = fetchPublications();
19
+
20
+
const jsonLd = {
21
+
'@context': 'https://schema.org',
22
+
'@type': 'CollectionPage',
23
+
name: 'Writing by Barry Prendergast',
24
+
description: 'Articles and writing on design strategy, product design, and design operations.',
25
+
url: 'https://renderg.host/writing',
26
+
author: {
27
+
'@type': 'Person',
28
+
name: 'Barry Prendergast',
29
+
url: 'https://renderg.host',
30
+
},
31
+
};
32
+
33
+
return (
34
+
<>
35
+
<Helmet>
36
+
<title>Writing | Barry Prendergast</title>
37
+
<meta
38
+
name="description"
39
+
content="Articles and writing on design strategy, product design, and design operations by Barry Prendergast."
40
+
/>
41
+
<script type="application/ld+json" dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }} />
42
+
</Helmet>
43
+
44
+
<Layout theme="default">
45
+
<Main>
46
+
<div className="flex flex-col gap-12">
47
+
<Heading level={1} style="page">
48
+
Writing
49
+
</Heading>
50
+
51
+
<Paragraph size="billboard">
52
+
Thoughts on design strategy, product design, and building better products.
53
+
</Paragraph>
54
+
55
+
{loading && <Paragraph size="billboard">Loading posts...</Paragraph>}
56
+
57
+
{error && <Paragraph size="billboard">Error loading posts: {error}</Paragraph>}
58
+
59
+
{!loading && !error && (!documents || documents.length === 0) && (
60
+
<Paragraph size="billboard">No posts found.</Paragraph>
61
+
)}
62
+
63
+
{!loading && !error && documents && documents.length > 0 && (
64
+
<div className="grid grid-cols-1 border-2 border-bones-white-30">
65
+
{documents.map((doc, index) => (
66
+
<>
67
+
<CardArticle
68
+
key={doc.uri}
69
+
article={{
70
+
title: doc.title,
71
+
subtitle: doc.description || '',
72
+
coverImage: '',
73
+
articleUrl: doc.articleUrl,
74
+
publication: doc.publication.name,
75
+
publicationIcon: doc.publication.icon,
76
+
published: doc.publishedAt,
77
+
}}
78
+
/>
79
+
{index < documents.length - 1 && <Divider />}
80
+
</>
81
+
))}
82
+
</div>
83
+
)}
84
+
85
+
<Paragraph size="billboard">
86
+
<Link href="/">← Back to Home</Link>
87
+
</Paragraph>
88
+
</div>
89
+
</Main>
90
+
91
+
<Aside>
92
+
<TLDRProfile />
93
+
</Aside>
94
+
</Layout>
95
+
</>
96
+
);
97
+
}
+157
src/scripts/convertCsvToJson.ts
+157
src/scripts/convertCsvToJson.ts
···
1
+
// src/scripts/convertCsvToJson.ts
2
+
3
+
import fs from 'node:fs';
4
+
import path from 'node:path';
5
+
import { parse } from 'csv-parse/sync';
6
+
import type { Article, CaseStudy, Company, ContentData, Job, ProjectType, Skill } from '@/types/content';
7
+
8
+
// Define interfaces for raw CSV data
9
+
interface RawCSVRow {
10
+
[key: string]: string;
11
+
}
12
+
13
+
// Helper function to parse CSV file
14
+
function parseCsvFile(filePath: string): RawCSVRow[] {
15
+
const fileContent = fs.readFileSync(filePath, 'utf-8');
16
+
return parse(fileContent, {
17
+
columns: true,
18
+
skip_empty_lines: true,
19
+
});
20
+
}
21
+
22
+
// Convert Companies CSV
23
+
function convertCompanies(data: RawCSVRow[]): Company[] {
24
+
return data.map((row) => ({
25
+
name: row.Name,
26
+
slug: row.Slug,
27
+
collectionId: row['Collection ID'],
28
+
itemId: row['Item ID'],
29
+
createdOn: row['Created On'],
30
+
updatedOn: row['Updated On'],
31
+
publishedOn: row['Published On'],
32
+
website: row.Website,
33
+
type: row.Type as Company['type'],
34
+
industry: row.Industry,
35
+
city: row.City,
36
+
country: row.Country,
37
+
logo: row.Logo,
38
+
}));
39
+
}
40
+
41
+
// Convert Skills CSV
42
+
function convertSkills(data: RawCSVRow[]): Skill[] {
43
+
return data.map((row) => ({
44
+
name: row.Skill,
45
+
slug: row.Slug,
46
+
collectionId: row['Collection ID'],
47
+
itemId: row['Item ID'],
48
+
createdOn: row['Created On'],
49
+
updatedOn: row['Updated On'],
50
+
publishedOn: row['Published On'],
51
+
}));
52
+
}
53
+
54
+
// Convert Portfolio/Case Studies CSV
55
+
function convertCaseStudies(data: RawCSVRow[]): CaseStudy[] {
56
+
return data.map((row) => ({
57
+
name: row['Case Study Name'],
58
+
slug: row.Slug,
59
+
collectionId: row['Collection ID'],
60
+
itemId: row['Item ID'],
61
+
createdOn: row['Created On'],
62
+
updatedOn: row['Updated On'],
63
+
publishedOn: row['Published On'],
64
+
summary: row.Summary,
65
+
body: row.Body,
66
+
pitchEmbed: row['Pitch Embed'],
67
+
coverImage: row['Cover Image'],
68
+
type: row.Type as ProjectType,
69
+
endDate: row['End Date'],
70
+
role: row.Role,
71
+
company: row.Company,
72
+
relevantSkills: row['Relevant Skills']?.split(';').map((s: string) => s.trim()) || [],
73
+
}));
74
+
}
75
+
76
+
// Convert Jobs CSV
77
+
function convertJobs(data: RawCSVRow[]): Job[] {
78
+
return data.map((row) => ({
79
+
jobTitle: row['Job title'],
80
+
slug: row.Slug,
81
+
collectionId: row['Collection ID'],
82
+
itemId: row['Item ID'],
83
+
createdOn: row['Created On'],
84
+
updatedOn: row['Updated On'],
85
+
publishedOn: row['Published On'],
86
+
cover: row.cover,
87
+
jobDescription: row['Job description'],
88
+
userNeed: row['User need'],
89
+
startDate: row['Start date'],
90
+
endDate: row['End date'],
91
+
employmentType: row['Employment type'] as Job['employmentType'],
92
+
company: row.Company,
93
+
skills: row.Skills?.split(';').map((s: string) => s.trim()) || [],
94
+
caseStudies: row['Case Studies']?.split(';').map((s: string) => s.trim()) || [],
95
+
client: row.Client,
96
+
}));
97
+
}
98
+
99
+
// Convert Articles CSV
100
+
function convertArticles(data: RawCSVRow[]): Article[] {
101
+
return data.map((row) => ({
102
+
title: row.Title,
103
+
slug: row.Slug,
104
+
collectionId: row['Collection ID'],
105
+
itemId: row['Item ID'],
106
+
createdOn: row['Created On'],
107
+
updatedOn: row['Updated On'],
108
+
publishedOn: row['Published On'],
109
+
subtitle: row.Subtitle,
110
+
featured: row.Featured === 'true',
111
+
coverImage: row.Cover,
112
+
articleUrl: row['Article URL'],
113
+
published: row.Published,
114
+
publication: row.Publication,
115
+
publicationUrl: row['Publication URL'],
116
+
}));
117
+
}
118
+
119
+
// Main conversion function
120
+
async function convertCsvToJson(): Promise<void> {
121
+
const inputDir = path.join(process.cwd(), 'src', 'data', 'csv');
122
+
const outputDir = path.join(process.cwd(), 'src', 'data', 'json');
123
+
124
+
// Ensure output directory exists
125
+
if (!fs.existsSync(outputDir)) {
126
+
fs.mkdirSync(outputDir, { recursive: true });
127
+
}
128
+
129
+
// Read and convert all CSV files
130
+
const companies = convertCompanies(parseCsvFile(path.join(inputDir, 'Barry Prendergast - Companies.csv')));
131
+
const skills = convertSkills(parseCsvFile(path.join(inputDir, 'Barry Prendergast - Skills.csv')));
132
+
const caseStudies = convertCaseStudies(parseCsvFile(path.join(inputDir, 'Barry Prendergast - Portfolio.csv')));
133
+
const jobs = convertJobs(parseCsvFile(path.join(inputDir, 'Barry Prendergast - Jobs.csv')));
134
+
const articles = convertArticles(parseCsvFile(path.join(inputDir, 'Barry Prendergast - Articles.csv')));
135
+
136
+
// Create combined content data
137
+
const contentData: ContentData = {
138
+
companies,
139
+
skills,
140
+
caseStudies,
141
+
jobs,
142
+
articles,
143
+
};
144
+
145
+
// Write individual JSON files
146
+
fs.writeFileSync(path.join(outputDir, 'companies.json'), JSON.stringify(companies, null, 2));
147
+
fs.writeFileSync(path.join(outputDir, 'skills.json'), JSON.stringify(skills, null, 2));
148
+
fs.writeFileSync(path.join(outputDir, 'case-studies.json'), JSON.stringify(caseStudies, null, 2));
149
+
fs.writeFileSync(path.join(outputDir, 'jobs.json'), JSON.stringify(jobs, null, 2));
150
+
fs.writeFileSync(path.join(outputDir, 'articles.json'), JSON.stringify(articles, null, 2));
151
+
152
+
// Write combined content data
153
+
fs.writeFileSync(path.join(outputDir, 'content.json'), JSON.stringify(contentData, null, 2));
154
+
}
155
+
156
+
// Run the conversion
157
+
convertCsvToJson().catch(console.error);
+66
src/types/atproto/defineRecords.ts
+66
src/types/atproto/defineRecords.ts
···
1
+
/**
2
+
* AT Protocol record type definitions
3
+
* Type-safe interfaces for AT Protocol data structures
4
+
*/
5
+
6
+
/**
7
+
* AT Protocol Blob reference
8
+
* Used for binary data like images
9
+
*/
10
+
export interface ATProtocolBlob {
11
+
$type: 'blob';
12
+
ref: {
13
+
$link: string;
14
+
};
15
+
mimeType: string;
16
+
size: number;
17
+
}
18
+
19
+
/**
20
+
* Base AT Protocol record structure
21
+
*/
22
+
export interface ATProtocolRecord<T = unknown> {
23
+
uri: string;
24
+
cid: string;
25
+
value: T;
26
+
}
27
+
28
+
/**
29
+
* Publication record value structure
30
+
*/
31
+
export interface PublicationValue {
32
+
name: string;
33
+
base_path: string;
34
+
icon?: ATProtocolBlob;
35
+
description?: string;
36
+
$type: string;
37
+
}
38
+
39
+
/**
40
+
* Document record value structure
41
+
*/
42
+
export interface DocumentValue {
43
+
title: string;
44
+
description?: string;
45
+
publishedAt: string;
46
+
publication: string; // URI reference to the publication
47
+
$type: string;
48
+
}
49
+
50
+
/**
51
+
* Full Publication record
52
+
*/
53
+
export type ATProtocolPublication = ATProtocolRecord<PublicationValue>;
54
+
55
+
/**
56
+
* Full Document record
57
+
*/
58
+
export type ATProtocolDocument = ATProtocolRecord<DocumentValue>;
59
+
60
+
/**
61
+
* Response from listRecords XRPC endpoint
62
+
*/
63
+
export interface ListRecordsResponse<T = unknown> {
64
+
records: ATProtocolRecord<T>[];
65
+
cursor?: string;
66
+
}
+12
src/types/atproto/defineResults.ts
+12
src/types/atproto/defineResults.ts
+15
src/types/atproto/index.ts
+15
src/types/atproto/index.ts
···
1
+
/**
2
+
* AT Protocol type exports
3
+
*/
4
+
5
+
export type {
6
+
ATProtocolBlob,
7
+
ATProtocolDocument,
8
+
ATProtocolPublication,
9
+
ATProtocolRecord,
10
+
DocumentValue,
11
+
ListRecordsResponse,
12
+
PublicationValue,
13
+
} from './defineRecords';
14
+
15
+
export type { FetchResult } from './defineResults';
+16
src/types/content/defineArticles.ts
+16
src/types/content/defineArticles.ts
···
1
+
/**
2
+
* Article type definitions
3
+
*/
4
+
5
+
import type { BaseContent } from './defineBase';
6
+
7
+
export interface Article extends BaseContent {
8
+
title: string;
9
+
subtitle?: string;
10
+
featured: boolean;
11
+
coverImage?: string;
12
+
articleUrl: string;
13
+
published: string;
14
+
publication: string;
15
+
publicationUrl: string;
16
+
}
+13
src/types/content/defineBase.ts
+13
src/types/content/defineBase.ts
+20
src/types/content/defineCaseStudies.ts
+20
src/types/content/defineCaseStudies.ts
···
1
+
/**
2
+
* Case study and project type definitions
3
+
*/
4
+
5
+
import type { BaseContent } from './defineBase';
6
+
7
+
export type ProjectType = 'design-operations' | 'design-strategy' | 'product-design' | 'service-design';
8
+
9
+
export interface CaseStudy extends BaseContent {
10
+
name: string;
11
+
summary: string;
12
+
body?: string;
13
+
pitchEmbed?: string;
14
+
coverImage?: string;
15
+
type: ProjectType;
16
+
endDate: string;
17
+
role: string;
18
+
company: string;
19
+
relevantSkills: string[];
20
+
}
+15
src/types/content/defineCompanies.ts
+15
src/types/content/defineCompanies.ts
···
1
+
/**
2
+
* Company and client type definitions
3
+
*/
4
+
5
+
import type { BaseContent } from './defineBase';
6
+
7
+
export interface Company extends BaseContent {
8
+
name: string;
9
+
website?: string;
10
+
type?: 'B2B' | 'B2C';
11
+
industry: string;
12
+
city: string;
13
+
country: string;
14
+
logo?: string;
15
+
}
+28
src/types/content/defineContentData.ts
+28
src/types/content/defineContentData.ts
···
1
+
/**
2
+
* Aggregate content data type definitions
3
+
*/
4
+
5
+
import type { Article } from './defineArticles';
6
+
import type { CaseStudy } from './defineCaseStudies';
7
+
import type { Company } from './defineCompanies';
8
+
import type { Job } from './defineJobs';
9
+
import type { Skill } from './defineSkills';
10
+
11
+
export interface ContentData {
12
+
companies: Company[];
13
+
skills: Skill[];
14
+
caseStudies: CaseStudy[];
15
+
jobs: Job[];
16
+
articles: Article[];
17
+
}
18
+
19
+
// Additional types for Next.js specific features
20
+
export type Params = {
21
+
params: {
22
+
slug: string;
23
+
};
24
+
};
25
+
26
+
export type SearchParams = {
27
+
searchParams: { [key: string]: string | string[] | undefined };
28
+
};
+19
src/types/content/defineJobs.ts
+19
src/types/content/defineJobs.ts
···
1
+
/**
2
+
* Job and role type definitions
3
+
*/
4
+
5
+
import type { BaseContent } from './defineBase';
6
+
7
+
export interface Job extends BaseContent {
8
+
jobTitle: string;
9
+
company: string;
10
+
jobDescription: string;
11
+
userNeed: string;
12
+
startDate: string;
13
+
endDate?: string;
14
+
employmentType: 'Contract' | 'Full-time';
15
+
skills: string[];
16
+
caseStudies?: string[];
17
+
client?: string;
18
+
cover?: string;
19
+
}
+11
src/types/content/defineSkills.ts
+11
src/types/content/defineSkills.ts
+11
src/types/content/index.ts
+11
src/types/content/index.ts
···
1
+
/**
2
+
* Content type exports
3
+
*/
4
+
5
+
export type { Article } from './defineArticles';
6
+
export type { BaseContent } from './defineBase';
7
+
export type { CaseStudy, ProjectType } from './defineCaseStudies';
8
+
export type { Company } from './defineCompanies';
9
+
export type { ContentData, Params, SearchParams } from './defineContentData';
10
+
export type { Job } from './defineJobs';
11
+
export type { Skill, SkillType } from './defineSkills';
+120
tailwind.config.ts
+120
tailwind.config.ts
···
1
+
import type { Config } from 'tailwindcss';
2
+
import plugin from 'tailwindcss/plugin';
3
+
import fluidType from './plugins/fluidType';
4
+
5
+
export default {
6
+
darkMode: 'class',
7
+
content: [
8
+
'./index.html',
9
+
'./src/**/*.{js,ts,jsx,tsx}',
10
+
],
11
+
theme: {
12
+
extend: {
13
+
fontFamily: {
14
+
sans: ['DM Sans', 'sans-serif'],
15
+
serif: ['DM Serif Display', 'serif'],
16
+
},
17
+
colors: {
18
+
// Mono
19
+
'bones-black': {
20
+
DEFAULT: 'oklch(0 0 0)',
21
+
100: 'oklch(0 0 0 / 1)',
22
+
90: 'oklch(0 0 0 / 0.9)',
23
+
80: 'oklch(0 0 0 / 0.8)',
24
+
70: 'oklch(0 0 0 / 0.7)',
25
+
60: 'oklch(0 0 0 / 0.6)',
26
+
50: 'oklch(0 0 0 / 0.5)',
27
+
40: 'oklch(0 0 0 / 0.4)',
28
+
30: 'oklch(0 0 0 / 0.3)',
29
+
20: 'oklch(0 0 0 / 0.2)',
30
+
10: 'oklch(0 0 0 / 0.1)',
31
+
5: 'oklch(0 0 0 / 0.05)',
32
+
2: 'oklch(0 0 0 / 0.02)',
33
+
},
34
+
'bones-white': {
35
+
DEFAULT: 'oklch(1 0 0)',
36
+
100: 'oklch(1 0 0 / 1)',
37
+
90: 'oklch(1 0 0 / 0.9)',
38
+
80: 'oklch(1 0 0 / 0.8)',
39
+
70: 'oklch(1 0 0 / 0.7)',
40
+
60: 'oklch(1 0 0 / 0.6)',
41
+
50: 'oklch(1 0 0 / 0.5)',
42
+
40: 'oklch(1 0 0 / 0.4)',
43
+
30: 'oklch(1 0 0 / 0.3)',
44
+
20: 'oklch(1 0 0 / 0.2)',
45
+
10: 'oklch(1 0 0 / 0.1)',
46
+
5: 'oklch(1 0 0 / 0.05)',
47
+
2: 'oklch(1 0 0 / 0.02)',
48
+
},
49
+
// Blues (light mode: blue, dark mode: mediumblue)
50
+
'bones-blue': {
51
+
DEFAULT: 'oklch(0.452 0.313214 264.052)',
52
+
100: 'oklch(0.452 0.313214 264.052 / 1)',
53
+
90: 'oklch(0.452 0.313214 264.052 / 0.9)',
54
+
80: 'oklch(0.452 0.313214 264.052 / 0.8)',
55
+
70: 'oklch(0.452 0.313214 264.052 / 0.7)',
56
+
60: 'oklch(0.452 0.313214 264.052 / 0.6)',
57
+
50: 'oklch(0.452 0.313214 264.052 / 0.5)',
58
+
40: 'oklch(0.452 0.313214 264.052 / 0.4)',
59
+
30: 'oklch(0.452 0.313214 264.052 / 0.3)',
60
+
20: 'oklch(0.452 0.313214 264.052 / 0.2)',
61
+
10: 'oklch(0.452 0.313214 264.052 / 0.1)',
62
+
5: 'oklch(0.452 0.313214 264.052 / 0.05)',
63
+
2: 'oklch(0.452 0.313214 264.052 / 0.02)',
64
+
},
65
+
'bones-mediumblue': {
66
+
DEFAULT: 'oklch(0.3835 0.2657 264.05)',
67
+
100: 'oklch(0.3835 0.2657 264.05 / 1)',
68
+
90: 'oklch(0.3835 0.2657 264.05 / 0.9)',
69
+
80: 'oklch(0.3835 0.2657 264.05 / 0.8)',
70
+
70: 'oklch(0.3835 0.2657 264.05 / 0.7)',
71
+
60: 'oklch(0.3835 0.2657 264.05 / 0.6)',
72
+
50: 'oklch(0.3835 0.2657 264.05 / 0.5)',
73
+
40: 'oklch(0.3835 0.2657 264.05 / 0.4)',
74
+
30: 'oklch(0.3835 0.2657 264.05 / 0.3)',
75
+
20: 'oklch(0.3835 0.2657 264.05 / 0.2)',
76
+
10: 'oklch(0.3835 0.2657 264.05 / 0.1)',
77
+
5: 'oklch(0.3835 0.2657 264.05 / 0.05)',
78
+
2: 'oklch(0.3835 0.2657 264.05 / 0.02)',
79
+
},
80
+
// Yellows (light mode: yellow, dark mode: gold)
81
+
'bones-yellow': {
82
+
DEFAULT: 'oklch(0.968 0.211 109.77)',
83
+
100: 'oklch(0.968 0.211 109.77 / 1)',
84
+
90: 'oklch(0.968 0.211 109.77 / 0.9)',
85
+
80: 'oklch(0.968 0.211 109.77 / 0.8)',
86
+
70: 'oklch(0.968 0.211 109.77 / 0.7)',
87
+
60: 'oklch(0.968 0.211 109.77 / 0.6)',
88
+
50: 'oklch(0.968 0.211 109.77 / 0.5)',
89
+
40: 'oklch(0.968 0.211 109.77 / 0.4)',
90
+
30: 'oklch(0.968 0.211 109.77 / 0.3)',
91
+
20: 'oklch(0.968 0.211 109.77 / 0.2)',
92
+
10: 'oklch(0.968 0.211 109.77 / 0.1)',
93
+
5: 'oklch(0.968 0.211 109.77 / 0.05)',
94
+
2: 'oklch(0.968 0.211 109.77 / 0.02)',
95
+
},
96
+
'bones-gold': {
97
+
DEFAULT: 'oklch(0.8683 0.1788 96.51)',
98
+
100: 'oklch(0.8683 0.1788 96.51 / 1)',
99
+
90: 'oklch(0.8683 0.1788 96.51 / 0.9)',
100
+
80: 'oklch(0.8683 0.1788 96.51 / 0.8)',
101
+
70: 'oklch(0.8683 0.1788 96.51 / 0.7)',
102
+
60: 'oklch(0.8683 0.1788 96.51 / 0.6)',
103
+
50: 'oklch(0.8683 0.1788 96.51 / 0.5)',
104
+
40: 'oklch(0.8683 0.1788 96.51 / 0.4)',
105
+
30: 'oklch(0.8683 0.1788 96.51 / 0.3)',
106
+
20: 'oklch(0.8683 0.1788 96.51 / 0.2)',
107
+
10: 'oklch(0.8683 0.1788 96.51 / 0.1)',
108
+
5: 'oklch(0.8683 0.1788 96.51 / 0.05)',
109
+
2: 'oklch(0.8683 0.1788 96.51 / 0.02)',
110
+
},
111
+
// Utilities
112
+
'bones-transparent': 'transparent',
113
+
},
114
+
},
115
+
},
116
+
plugins: [
117
+
require('@tailwindcss/typography'),
118
+
fluidType(),
119
+
],
120
+
} satisfies Config;
+12
tsconfig.eslint.json
+12
tsconfig.eslint.json
+30
tsconfig.json
+30
tsconfig.json
···
1
+
{
2
+
"compilerOptions": {
3
+
"allowImportingTsExtensions": true,
4
+
"baseUrl": ".",
5
+
"isolatedModules": true,
6
+
"jsx": "react-jsx",
7
+
"lib": [
8
+
"ES2020",
9
+
"DOM",
10
+
"DOM.Iterable"
11
+
],
12
+
"module": "ESNext",
13
+
"moduleResolution": "bundler",
14
+
"noEmit": true,
15
+
"noFallthroughCasesInSwitch": true,
16
+
"noUnusedLocals": true,
17
+
"noUnusedParameters": true,
18
+
"paths": {
19
+
"@/*": ["./src/*"]
20
+
},
21
+
"resolveJsonModule": true,
22
+
"skipLibCheck": true,
23
+
"strict": true,
24
+
"target": "ES2020",
25
+
"types": ["react"],
26
+
"useDefineForClassFields": true
27
+
},
28
+
"include": ["src", "src/components/Sidebar/.Sidebar.tsx.off"],
29
+
"references": [{ "path": "./tsconfig.node.json" }]
30
+
}
+10
tsconfig.node.json
+10
tsconfig.node.json
+15
vite.config.ts
+15
vite.config.ts
···
1
+
// vite.config.ts
2
+
3
+
import path from 'path';
4
+
import react from '@vitejs/plugin-react';
5
+
import { defineConfig } from 'vite';
6
+
7
+
// https://vitejs.dev/config/
8
+
export default defineConfig({
9
+
plugins: [react()],
10
+
resolve: {
11
+
alias: {
12
+
'@': path.resolve(__dirname, './src'),
13
+
},
14
+
},
15
+
});