diff --git a/README.md b/README.md index d0f62cc4e..e95e6ef83 100644 --- a/README.md +++ b/README.md @@ -3,24 +3,24 @@ ![Website status](https://img.shields.io/website?down_color=red&down_message=offline&up_color=green&up_message=online&url=https%3A%2F%2Fjackdomleo.dev "Website status") [![deploy](https://github.com/jackdomleo7/jackdomleo.dev/actions/workflows/deploy.yml/badge.svg)](https://github.com/jackdomleo7/jackdomleo.dev/actions/workflows/deploy.yml) -Jack Domleo's personal website. +The central hub of my professional presence, built with **Nuxt 4**. This project serves as a production testbed for my architectural standards and frontend expertise. -My online portfolio has transformed over the years from a static HTML, CSS and JavaScript site, to a Vue.js SPA application, to now a Nuxt.js static site. +## ⏳ Project Evolution -Website timeline: -- **September 2018** - Created first website using HTML, CSS, JavaScript & Bootstrap 4. -- **September 2019** - Redesigned & rebuilt website using Vue.js, TypeScript & SCSS. -- **May 2020** - Redesigned & rebuilt website using Nuxt 2, TypeScript & SCSS. Introduced light & dark themes. Introduced blog using Nuxt Content. -- **January 2022** - Redesigned site using newly improved UI skills (still not good UI skills, but better). Introduced Jest & Prismic CMS. -- **January 2023** - Redesigned site to be more minimalistic & rebuilt using Nuxt 3, TypeScript & SCSS. Replaced Prismic CMS & Nuxt Content with Contentful. -- **August 2025** - Removed Contentful & reverted back to Nuxt Content while removing blog. Upgraded to Nuxt 4. +- **Sept 2018**: Initial launch using fundamental web technologies and Bootstrap 4. +- **Sept 2019**: Migration to **Vue.js** and **TypeScript**, adopting **SCSS** for architecture-first styling. +- **May 2020**: Rebuilt with **Nuxt 2** for SSG performance; introduced a markdown-based blog. +- **Jan 2022**: UI/UX overhaul; integrated **Jest** and **Prismic** for headless CMS management. +- **Jan 2023**: Minimalist redesign and migration to **Nuxt 3** and **Contentful**. +- **Aug 2025**: Streamlined architecture by returning to **Nuxt Content** and upgrading to **Nuxt 4**. +- **Feb 2026**: Repurposed to focus on **technical leadership** and high-leverage workflows, reflecting a shift toward architectural oversight. --- -## Local Setup +## 🛠 Local Setup -- Node: v24 -- pnpm: v10 +- **Node**: v24 +- **pnpm**: v10 Create a `.env` file with the following properties: - `NUXT_BASE_URL` diff --git a/app/assets/icons/ai.svg b/app/assets/icons/ai.svg new file mode 100644 index 000000000..63087388f --- /dev/null +++ b/app/assets/icons/ai.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/assets/icons/balanced-scale.svg b/app/assets/icons/balanced-scale.svg new file mode 100644 index 000000000..6f26f9f75 --- /dev/null +++ b/app/assets/icons/balanced-scale.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/assets/icons/css.svg b/app/assets/icons/css.svg new file mode 100644 index 000000000..8906c68dd --- /dev/null +++ b/app/assets/icons/css.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/assets/icons/git.svg b/app/assets/icons/git.svg new file mode 100644 index 000000000..60ec4f4da --- /dev/null +++ b/app/assets/icons/git.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/assets/icons/npm.svg b/app/assets/icons/npm.svg deleted file mode 100644 index 7828c8310..000000000 --- a/app/assets/icons/npm.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/app/assets/icons/performance.svg b/app/assets/icons/performance.svg new file mode 100644 index 000000000..b8afc8bac --- /dev/null +++ b/app/assets/icons/performance.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/assets/icons/pinia.svg b/app/assets/icons/pinia.svg new file mode 100644 index 000000000..023ae37a4 --- /dev/null +++ b/app/assets/icons/pinia.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/assets/icons/playwright.svg b/app/assets/icons/playwright.svg new file mode 100644 index 000000000..4caec39ca --- /dev/null +++ b/app/assets/icons/playwright.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/assets/icons/python.svg b/app/assets/icons/python.svg new file mode 100644 index 000000000..8d84a1519 --- /dev/null +++ b/app/assets/icons/python.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/assets/icons/raspberry-pi.svg b/app/assets/icons/raspberry-pi.svg new file mode 100644 index 000000000..9120bc9c0 --- /dev/null +++ b/app/assets/icons/raspberry-pi.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/assets/icons/screwdriver-wrench.svg b/app/assets/icons/screwdriver-wrench.svg new file mode 100644 index 000000000..cb7fd71cb --- /dev/null +++ b/app/assets/icons/screwdriver-wrench.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/assets/icons/seo.svg b/app/assets/icons/seo.svg new file mode 100644 index 000000000..e82133b5a --- /dev/null +++ b/app/assets/icons/seo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/assets/icons/users.svg b/app/assets/icons/users.svg new file mode 100644 index 000000000..f86ec9653 --- /dev/null +++ b/app/assets/icons/users.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/assets/icons/vitest.svg b/app/assets/icons/vitest.svg new file mode 100644 index 000000000..c5f9b458e --- /dev/null +++ b/app/assets/icons/vitest.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/assets/icons/vs-code.svg b/app/assets/icons/vs-code.svg deleted file mode 100644 index a9bee7409..000000000 --- a/app/assets/icons/vs-code.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/app/assets/styles/_colors.scss b/app/assets/styles/_colors.scss index 96d46fd4e..2eede2b84 100644 --- a/app/assets/styles/_colors.scss +++ b/app/assets/styles/_colors.scss @@ -19,7 +19,7 @@ $dark-primary: #fff; color-scheme: light dark; --color-accent: #{$colour-accent}; --color-accent-faint: #{$colour-accent-faint}; - --colour-mid-grey: #{$colour-mid-grey}; + --color-mid-grey: #{$colour-mid-grey}; --color-bg: light-dark(#{$light-bg}, #{$dark-bg}); --color-fg1: light-dark(#{$light-fg1}, #{$dark-fg1}); --color-primary: light-dark(#{$light-primary}, #{$dark-primary}); diff --git a/app/assets/styles/rich-text.scss b/app/assets/styles/rich-text.scss index c2f00401b..96c3c7402 100644 --- a/app/assets/styles/rich-text.scss +++ b/app/assets/styles/rich-text.scss @@ -1,5 +1,9 @@ .rich-text { :deep() { + * { + line-height: 1.5; + } + h2 { font-size: var(--text-subtitle); margin-top: 5rem; @@ -55,94 +59,5 @@ } } } - - pre:has(code) { - margin-block: 2rem; - background-color: var(--color-fg1); - border-radius: var(--border-radius-standard); - padding: 1rem; - overflow-x: auto; - } - - .table { - overflow-x: auto; - margin-block: 2rem; - - table { - border: 0; - border-collapse: collapse; - border-spacing: 0; - width: 100%; - } - - th { - border-bottom: 2px solid var(--color-primary); - } - - tbody { - tr:nth-child(even) { - background-color: var(--color-fg1); - } - } - - td, - th { - padding: 1rem 0.5rem; - vertical-align: top; - min-width: 14rem; - } - - th { - font-weight: 700; - text-align: left; - } - - p { - margin: 0; - } - } - - .youtube { - min-height: 25rem; - } - - .cp_embed_iframe, - .codepen { - height: 40rem; - max-height: 80vh; - min-height: 20rem; - width: 100%; - display: grid; - place-items: center; - border: 1px solid var(--colour-primary); - } - - blockquote { - margin: 0; - padding: 1rem 1rem 1rem 4rem; - background-color: var(--color-bg); - display: inline-block; - position: relative; - - &::after { - content: "“"; - color: var(--color-accent-faint); - position: absolute; - z-index: 0; - font-family: sans-serif; - font-size: 8rem; - line-height: 1; - top: -0.75rem; - left: 0; - transform: rotate(8deg); - pointer-events: none; - } - - cite { - display: block; - font-style: italic; - text-align: right; - } - } } } \ No newline at end of file diff --git a/app/components/Navigation.vue b/app/components/Navigation.vue index 961d90923..301947281 100644 --- a/app/components/Navigation.vue +++ b/app/components/Navigation.vue @@ -342,7 +342,6 @@ $navHeight: 4rem; background-color: var(--color-bg); color: var(--color-primary); z-index: 99; - position: fixed; height: $navHeight; box-shadow: 0 0 0.5rem transparent; diff --git a/app/components/ProjectList.server.vue b/app/components/ProjectList.server.vue index 8d2700a9d..966398586 100644 --- a/app/components/ProjectList.server.vue +++ b/app/components/ProjectList.server.vue @@ -1,259 +1,308 @@ + \ No newline at end of file diff --git a/app/pages/index.vue b/app/pages/index.vue index b155db058..538701eaf 100644 --- a/app/pages/index.vue +++ b/app/pages/index.vue @@ -23,13 +23,13 @@

About me

- Hi, I'm Jack Domleo, a Nottinghamshire-based developer in the UK, currently working as a Senior Frontend Developer at Ocean Finance. + Hi, I'm Jack. I'm a {{ variables.OCCUPATION }} at Ocean Finance with {{ variables.NO_OF_YEARS_EXPERIENCE }} years of professional experience.

- I have {{ variables.NO_OF_YEARS_EXPERIENCE }} years of professional experience working as a developer. I often work with Vue.js, TypeScript, Vite, Vitest, SCSS, Storybook, and PlayWright. + Rather than just building applications, I focus on engineering accessible customer journeys and technical solutions across our financial product range. I have established a standard for high-quality, readable code and a bit of a reputation for my love of refactoring - I'm a firm believer that high-quality, readable code is a gift to the next developer who has to touch it (whether that developer is me or someone else).

- I have a passion for frontend technologies, and writing clean websites and applications while maintaining high accessibility standards. + My work is centered on the Vue.js ecosystem, with a heavy emphasis on performance optimization, technical SEO, web accessibility (WCAG), and maintaining robust component libraries. Outside of work you'll likely find me building LEGO, tinkering with electronics/hardware/software, or following the latest in Formula 1, musical theatre, and theme parks.

@@ -37,9 +37,10 @@

Skills

-
-
    -
  • +
    +

    {{ categoryName }}

    +
      +
    • {{ skill.value }}
    • @@ -49,9 +50,10 @@

Projects

+

A collection of personal experiments, projects, AI-assisted prototypes, and more.

- Check out more of my work + Explore more projects
@@ -79,20 +81,39 @@ useSchemaOrg([ }) ]) -const skills: { key: string; value: string }[] = [ - { key: 'vue', value: 'Vue.js' }, - { key: 'nuxt', value: 'Nuxt.js' }, - { key: 'typescript', value: 'TypeScript' }, - { key: 'vite', value: 'Vite' }, - { key: 'storybook', value: 'Storybook' }, - { key: 'sass', value: 'Sass/SCSS' }, - { key: 'a11y', value: 'Accessibility' }, - { key: 'node-js', value: 'Node.js' }, - { key: 'npm', value: 'npm' }, - { key: 'vs-code', value: 'VS Code' }, - { key: 'javascript', value: 'JavaScript' }, - { key: 'html', value: 'HTML' } -]; +const skills: { [key: string]: { key: string; value: string }[] } = { + 'Core Engineering': [ + { key: 'html', value: 'HTML' }, + { key: 'css', value: 'CSS' }, + { key: 'javascript', value: 'JavaScript' }, + { key: 'typescript', value: 'TypeScript' }, + { key: 'vue', value: 'Vue.js' }, + { key: 'nuxt', value: 'Nuxt.js' }, + { key: 'vite', value: 'Vite' }, + { key: 'sass', value: 'SCSS' }, + { key: 'pinia', value: 'Pinia' }, + ], + 'Quality & Workflow': [ + { key: 'vitest', value: 'Vitest' }, + { key: 'playwright', value: 'PlayWright' }, + { key: 'storybook', value: 'Storybook' }, + { key: 'node-js', value: 'Node.js' }, + { key: 'git', value: 'Git' }, + { key: 'a11y', value: 'Accessibility' }, + { key: 'performance', value: 'Web Performance' }, + { key: 'seo', value: 'Technical SEO' }, + { key: 'ai', value: 'AI-Assisted Workflows' } + ], + 'Leadership': [ + { key: 'users', value: 'Mentoring' }, + { key: 'screwdriver-wrench', value: 'Strategic Refactoring' }, + { key: 'balanced-scale', value: 'Technical Decision Making' } + ], + 'Tinkering': [ + { key: 'raspberry-pi', value: 'Raspberry Pi' }, + { key: 'python', value: 'Python' } + ] +}; \ No newline at end of file diff --git a/app/pages/projects.vue b/app/pages/projects.vue index 43a3f4bb9..e90a780a5 100644 --- a/app/pages/projects.vue +++ b/app/pages/projects.vue @@ -3,20 +3,12 @@

Projects

- I enjoy creating different types of projects in my spare time using a range of technologies. You can find all of my featured projects here, and many more projects on GitHub and CodePen. + A curated archive of production applications, technical experiments, and automated tools. Source available on GitHub and CodePen.

- +
-
-

Mini Projects

- -
-
-

Client Projects

- -
diff --git a/app/pages/work.vue b/app/pages/work.vue index 76fc907dd..c91369d7b 100644 --- a/app/pages/work.vue +++ b/app/pages/work.vue @@ -2,7 +2,7 @@

Work

-

In my {{ variables.NO_OF_YEARS_EXPERIENCE }} years of experience as a web developer, I have worked in the travel, HCM software, and finance industries. During this time I have experienced many different projects and tech stacks.

+

In my {{ variables.NO_OF_YEARS_EXPERIENCE }} years of experience, I have engineered frontend solutions across the travel, HCM software, and finance sectors. My focus has evolved from executing features to architecting resilient systems and leading technical standards.

    @@ -17,48 +17,54 @@

    Senior Frontend Developer

    June 2023 - present

    -

    I was promoted to a Senior Frontend Developer in the summer of 2023 shortly after transitioning from leading the frontend of the Secured Loans product to leading the frontend of the Credit Card product - a product that holds more responsibility due to the larger number of customers and revenue.

    +

    I was promoted to lead the frontend strategy for our Credit Card product - the business's highest-revenue vertical. Beyond my primary product, I spend a lot of my time on cross-product collaboration, ensuring our technical standards and shared systems are consistent across the entire engineering team.

    +

    Key responsibilities:

      -
    • Lead the frontend development of the Credit Card product, while assisting other products.
    • -
    • Migrate the Credit Card project from Vue 2 and JavaScript to Vue 3 and TypeScript, with a big focus on web performance and DX (developer experience).
    • -
    • Collaborate in the planning, feasibility, and estimates of upcoming projects as a spokesperson for frontend development.
    • -
    • Improve the overall quality of frontend architecture and codebases across the business, focusing on quality, reliability, performance, productivity, and developer experience.
    • -
    • Suggest, develop and monitor A/B tests, hardcoding the winning variant, and cleaning up any losing variants.
    • -
    • Write and maintain automated end-to-end tests for the Credit Card product.
    • +
    • Leading the Stack: Managing the transition from legacy Vue 2 and JavaScript to a modern, type-safe Vue 3 and TypeScript ecosystem.
    • +
    • Planning & Feasibility: Acting as a technical spokesperson during project planning to help teams estimate work and define realistic roadmaps.
    • +
    • Feature Engineering: Architecting and delivering complex user features primarily for the Credit Card journey (but also other products), ensuring they are performant, accessible, and align with business requirements.
    • +
    • Cross-Product Collaboration: Working across different product teams to implement shared standards and improve our overall frontend architecture.
    • +
    • Quality & Stability: Driving strategic refactoring to keep our systems maintainable and writing the automated tests that protect our most important customer journeys.
    • +
    • AI Workflow Integration: Utilizing AI-assisted development tools (since early 2025) to accelerate feature delivery, automate boilerplate, and perform deep code analysis for architectural improvements.
    +

    Key achievements:

      -
    • Successfully migrated the Credit Card project to Vue 3 and TypeScript, and improved web performance by 50% resulting in a significant monthly revenue uplift.
    • -
    • Improved developer experience across the board by co-leading the replacement of Webpack to Vite, the replacement of Jest to Vitest, and the remaining JavaScript to TypeScript.
    • -
    • Continuously improved the internally hosted @ocean npm packages. Implemented code-splitting to separate utilities which resulted in up to 80% performance improvement on the affected packages.
    • -
    • Created business-wide web accessibility guidelines for developers and designers, and performed audits to ensure we maintain high-quality accessibility.
    • +
    • Revenue Impact: Vue 3 upgrade delivered a 50% increase in web performance, which resulted in a significant and measurable uplift in monthly revenue.
    • +
    • Accessibility Leadership: Performed deep audits, architectural updates, and training to bring our product quality up to WCAG 2.2 AA standards, ensuring our financial tools are usable by everyone.
    • +
    • Systems Engineering: Re-engineered our internal npm packages with code-splitting, achieving an 80% performance boost for the utilities used across the whole business.
    • +
    • Better Tooling: Co-led the move to Vite and Vitest, which gave the entire engineering department a significantly faster and more reliable feedback loop.
    • +
    • Workflow Innovation: Established internal best practices for using AI in the frontend workflow, leading to faster prototyping and more robust unit test coverage.
    +

    Key technologies:

    -

    Vue JS, Nuxt JS, TypeScript, SCSS, Vite, Vitest, Storybook, PlayWright, git

    +

    Vue.js, Nuxt.js, TypeScript, SCSS, Vite, Vitest, Storybook, PlayWright, Git, AI-assisted workflows

  1. Frontend Developer

    February 2021 - June 2023

    -

    I joined the Ocean Finance frontend development team in early 2021. The business was ready to bring on a new developer to add to their team to aid in the development of new features across all of their financial products, as well as assist in driving the frontend architecture in an upward direction.

    +

    I joined the team to help build out new features across our financial products while helping to push our frontend architecture in a more modern direction.

    +

    Key responsibilities:

      -
    • Lead the frontend development of the Secured Loans product, while assisting other products.
    • -
    • Collaborate in the planning, feasibility, and estimates of upcoming projects as a spokesperson for frontend development.
    • -
    • Maintain the in-house Vue JS component library in accordance with design specifications.
    • -
    • Develop and monitor A/B tests, hardcoding the winning variant, and cleaning up any losing variants.
    • +
    • Product Ownership: Led the frontend development for the Secured Loans product while assisting on other areas of the site.
    • +
    • Component Maintenance: Maintained our in-house Vue.js component library to ensure we stayed consistent with design specifications.
    • +
    • A/B Testing: Developed and monitored A/B tests to optimize user journeys, hardcoding the winners and cleaning up the experiments afterward.
    +

    Key achievements:

      -
    • Improved quality of the in-house Vue JS component library by implementing Jest for unit testing, and Storybook for documentation. This ensured new versions of the component library were not published with unintentional breaking changes, building confidence and trust amongst developers.
    • -
    • Improved quality of the Secured Loans product by migrating from JavaScript to TypeScript, resulting in fewer frontend-related bugs being raised.
    • -
    • Co-created the @ocean internally-hosted npm packages for the component library, common TypeScript utilities, a centralised place for fonts and icons, analytics, and logging.
    • -
    • Solved a business-wide issue where making site-wide APR updates across multiple projects and the CMS was time-consuming and often resulted in risk. I architected a solution - "Global Variables" - that meant APR figures and similar figures alike were stored, maintained, and updated from one single place. This resulted in quicker APR figure changes with fewer mistakes.
    • +
    • The "Global Variables" Solution: I architected a centralized system to manage sensitive financial data (like APRs) from one place. This eliminated manual errors and made site-wide updates much safer and easier across the code and CMS.
    • +
    • Shared Infrastructure: Co-created our internal npm packages for shared utilities, analytics, and assets, which standardized how we build across different projects.
    • +
    • Building Trust: Integrated Jest and Storybook into our component library, ensuring we could ship updates without accidental breaking changes.
    • +
    • Stabilizing Products: Directed the migration of the Secured Loans product to TypeScript, which led to a clear reduction in frontend bugs.
    +

    Key technologies:

    -

    Vue JS, Nuxt JS, TypeScript, SCSS, Jest, Storybook, git

    +

    Vue.js, Nuxt.js, TypeScript, SCSS, Jest, Storybook, Git

@@ -74,43 +80,46 @@

Developer

June 2019 - February 2021

-

It was around this time Mitrefinch was ready to begin creating new teams for a new era of products. After proving myself as a junior developer in the previous months, I was promoted to a mid-level developer and placed in a team alongside other mid-level and senior developers.

+

Following a successful period as a Junior, I was promoted to a mid-level role to support the development of Mitrefinch's next-generation web products. I worked within a cross-functional team to modernize the business's core payroll and security access control offerings.

+

Key responsibilities:

    -
  • Aid in the development of a new era of Mitrefinch products. - a web version of the currently existing Flexipay payroll software, and a new web-based security access control software.
  • -
  • Maintain and update the centralised SCSS component library.
  • -
  • Ensure quality through thorough unit testing.
  • -
  • Influence frontend, UI/UX, and accessibility decisions.
  • -
  • Upskill in other areas of software development such as backend development (C#) and automation testing (Selenium).
  • +
  • Product Modernization: Delivering frontend features for the web-based versions of Flexipay (payroll) and security access control software.
  • +
  • System Maintenance: Managing and updating the centralized SCSS component library to ensure consistency across new product lines.
  • +
  • Quality Assurance: Ensuring codebase reliability through thorough unit testing and participating in code reviews.
  • +
  • Technical Influence: Contributing to frontend, UI/UX, and accessibility decisions to improve the overall end-user experience.
  • +
  • Full-Stack Growth: Expanding my skillset into backend development (C#) and automated regression testing using Selenium.
+

Key achievements:

    -
  • Took ownership of the maintenance and upkeep of the centralised SCSS component library ensuring it kept up-to-date with the dynamic business, software, and design requirements. This library proved to be very useful to the products and to the developers using it.
  • +
  • System Ownership: Took full ownership of the centralized SCSS component library. I ensured it remained scalable and aligned with evolving design requirements, making it a critical resource for developers across the business.
+

Key technologies:

-

Vue JS, TypeScript, Jest, SCSS, HTML, git

+

Vue.js, TypeScript, Jest, SCSS, HTML, Git

  • Junior Developer

    March 2019 - June 2019

    -

    After being made redundant from flybmi filing for administration, I quickly landed a Junior Developer role at a local software house specialising in HCM (Human Capital Management) software. I gained a lot of knowledge and understanding of web development in this role and had lots of support and mentoring during my personal and professional development.

    +

    After flybmi filed for administration, I transitioned to Mitrefinch, a specialist in HCM (Human Capital Management) software. This role was pivotal for my professional development, providing a supportive environment to deepen my understanding of commercial web development.

    +

    Key responsibilities:

      -
    • Shadow and learn from other developers.
    • -
    • Understand scrum agile development and the different roles of a scrum team.
    • -
    -

    Key achievements:

    -
      -
    • Aid in the development of a new era of Mitrefinch products.
    • +
    • Technical Mentorship: Shadowing senior developers to learn best practices in architecting scalable frontend solutions.
    • +
    • Agile Collaboration: Gaining practical experience within the Scrum framework and understanding the dynamics of high-performing agile teams.
    +

    Key achievements:

      -
    • Led the creation and development of a new in-house centralised SCSS component library that was easy to use, followed UX and accessibility standards, and was scalable.
    • +
    • UI Foundation: Led the initial creation of an in-house centralized SCSS component library. I focused on making the system scalable, easy to use, and compliant with modern UX and accessibility standards.
    • +
    • Product Contribution: Aided in the early-stage development of the new era of Mitrefinch web products.
    +

    Key technologies:

    -

    SCSS, HTML, JavaScript, git

    +

    SCSS, HTML, JavaScript, Git

  • @@ -126,19 +135,24 @@

    IT/Developer Apprentice

    September 2018 - February 2019

    -

    This role was an apprenticeship I started fresh out of sixth form after completing my A-Levels. It was my first role in my career as a software developer. In my short time occupying this role, I learned so much about the world of web development. This was an exciting role that also gave me some insights into the travel industry. Despite never finishing the apprenticeship due to the business filing for administration in February 2019, I am grateful for the opportunity.

    +

    I started this apprenticeship fresh out of sixth form as the first step in my software development career. It was a fast-paced introduction to the industry, offering unique insights into the travel sector and commercial web systems. Although the business unfortunately filed for administration in early 2019, the experience was pivotal in building my technical foundation.

    +

    Key responsibilities:

      -
    • Shadow and learn from other web developers while progressing with my apprenticeship coursework and study modules.
    • -
    • Maintain and update the multilingual website, ensuring good organic SEO, good accessibility standards, and optimal core web vitals performance.
    • -
    • Maintain the company intranet that was used for pilot/flight attendant schedules, engineering/ground crew reports, business updates and more.
    • +
    • Site Maintenance: Assisting in the daily upkeep of a high-traffic, multilingual commercial website, focusing on SEO, accessibility, and Core Web Vitals.
    • +
    • Internal Infrastructure: Maintaining the company intranet used for critical operations, including flight crew schedules and ground crew reporting.
    • +
    • Digital Marketing: Building and deploying responsive marketing emails via Mailchimp to support airline campaigns.
    • +
    • Technical Learning: Balancing production-level code changes with apprenticeship coursework and mentorship from senior developers.
    +

    Key achievements:

      -
    • Template and send marketing emails via Mailchimp.
    • +
    • Operational Continuity: Successfully managed site-wide updates and intranet stability for a distributed workforce of pilots, engineers, and ground crew.
    • +
    • Commercial Impact: Delivered time-sensitive marketing templates that reached a global customer base, ensuring brand consistency across email and web.
    +

    Key technologies:

    -

    React JS, Grav CMS, HTML, CSS, Bootstrap, JavaScript, jQuery, git

    +

    React JS, Grav CMS, HTML, CSS, Bootstrap, JavaScript, jQuery, Git

    @@ -249,7 +263,7 @@ useHead({ padding: 0; &__name { - margin: 0; + margin: 0 0 0.5rem; font-size: var(--text-heading); } @@ -262,7 +276,7 @@ useHead({ :deep() .rich-text { // Overrides h4 { - margin-top: 1.5rem; + margin-top: 2rem; } ul { // This is needed to make it seem like these are top-level lists because of the lists for each role diff --git a/app/utilities/variables.ts b/app/utilities/variables.ts index e3147336c..f2456b3b6 100644 --- a/app/utilities/variables.ts +++ b/app/utilities/variables.ts @@ -4,7 +4,7 @@ export default { LINKEDIN_URL: 'https://linkedin.com/in/jackdomleo7/', GITHUB_URL: 'https://github.com/jackdomleo7', CODEPEN_URL: 'https://codepen.io/jackdomleo7', - OCCUPATION: 'Senior Frontend & UX Developer', + OCCUPATION: 'Senior Frontend Developer', CURRENT_YEAR: new Date().getFullYear(), NO_OF_YEARS_EXPERIENCE: (() => { const firstDayAsDeveloper = dayjs(new Date('2018-09-03')) @@ -14,6 +14,7 @@ export default { let yearsExperience = '' + // TODO: From Sept 2028, change to just outputting yearsDifference if (yearsDifferenceRemainder === 1) { yearsExperience = `just over ${yearsDifference}` } diff --git a/content/privacy-policy.md b/content/privacy-policy.md index 790fcefb6..996430b9b 100644 --- a/content/privacy-policy.md +++ b/content/privacy-policy.md @@ -1,17 +1,29 @@ --- title: Privacy Policy sitemap: - lastmod: 2025-08-27 + lastmod: 2026-02-01 --- -**Definitions**: 'I', 'me', 'my': Jack Domleo - owner of this website. +## Overview -Your privacy is important to me. It is my policy to respect your privacy regarding any information I may collect from you across this website, jackdomleo.dev. +Your privacy is important. This Privacy Policy outlines how jackdomleo.dev handles information and your data privacy rights. -I do not collect any personal information. I do not use cookies or any tracking software. +## Data Collection -My website may link to external sites that are not operated by me. Please be aware that I have no control over the content and practices of these sites, and cannot accept responsibility or liability for their respective privacy policies. +This website does **not collect, store, or process any personal data**. We do not use cookies, analytics tools, or any form of user tracking software. Your visits to this site leave no data footprint with us. -My website may link to external sites via an affiliate link. Please be aware that each site may have its own way of tracking the affiliate back to me, whether it be via cookies or my own discount code. Please review their respective privacy policies regarding affiliate tracking. +## Hosting -Your continued use of my website will be regarded as acceptance of my practices around privacy and personal information. If you have any questions about how I handle user data and personal information, feel free to contact me via LinkedIn. +This website is hosted on GitHub Pages. Please refer to [GitHub's Privacy Statement](https://docs.github.com/en/site-policy/privacy-policies/github-privacy-statement) for information about how GitHub may process data related to hosting and infrastructure. + +## External Links + +This website may contain links to external sites not operated by us. We have no control over the content, practices, or privacy policies of these external sites and assume no responsibility for them. We encourage you to review their privacy policies before providing any personal information. + +## Changes to This Policy + +We may update this Privacy Policy periodically. Any changes will be reflected on this page with an updated modification date. + +## Contact + +If you have questions about this Privacy Policy or our privacy practices, please contact us via LinkedIn. diff --git a/nuxt.config.ts b/nuxt.config.ts index 4d2e42b78..b8adf62ea 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -3,7 +3,7 @@ import variables from './app/utilities/variables' const SEO = { TITLE: `Jack Domleo - ${variables.OCCUPATION}`, - DESCRIPTION: `A Nottinghamshire-based ${variables.OCCUPATION.toLowerCase()}, primarily working with Vue.js, Nuxt.js, TypeScript, SCSS & many more technologies.` + DESCRIPTION: `Personal website of Jack Domleo, a ${variables.OCCUPATION.toLowerCase()} specialising in JavaScript-based technologies and web development.` } export default defineNuxtConfig({ @@ -82,16 +82,12 @@ export default defineNuxtConfig({ variables.CODEPEN_URL ], knowsAbout: [ + 'Frontend Engineering', 'Vue.js', - 'Nuxt.js', + 'Nuxt.js', 'TypeScript', - 'SCSS', - 'Frontend Development', - 'UX Design', - 'Web Accessibility', - 'Storybook', - 'Vite', - 'Vitest' + 'Web Accessibility (WCAG)', + 'Technical Leadership' ] } }, diff --git a/package.json b/package.json index 38c2eb09a..04197b56c 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,6 @@ { "name": "jackdomleo.dev", "private": true, - "description": "Jack Domleo's personal website", "author": { "name": "Jack Domleo", "url": "https://jackdomleo.dev" @@ -24,8 +23,8 @@ "dependencies": { "@nuxt/content": "^3.11.0", "@nuxt/icon": "^2.2.1", - "@nuxtjs/robots": "^5.6.7", - "@nuxtjs/sitemap": "^7.5.2", + "@nuxtjs/robots": "^5.7.0", + "@nuxtjs/sitemap": "^7.6.0", "better-sqlite3": "^12.6.2", "cooltipz-css": "^2.5.1", "dayjs": "^1.11.19", @@ -39,8 +38,8 @@ "@nuxtjs/eslint-config-typescript": "^12.1.0", "@nuxtjs/eslint-module": "^4.1.0", "@types/node": "^24.10.9", - "@typescript-eslint/eslint-plugin": "^8.53.1", - "@typescript-eslint/parser": "^8.53.1", + "@typescript-eslint/eslint-plugin": "^8.54.0", + "@typescript-eslint/parser": "^8.54.0", "@vitest/coverage-v8": "^4.0.18", "@vue/test-utils": "^2.4.6", "eslint": "^9.39.2", @@ -48,18 +47,18 @@ "eslint-plugin-nuxt": "^4.0.0", "eslint-plugin-vitest": "^0.5.4", "eslint-plugin-vue": "^10.7.0", - "happy-dom": "^20.3.7", + "happy-dom": "^20.4.0", "nuxt": "^4.3.0", - "nuxt-site-config": "^3.2.18", + "nuxt-site-config": "^3.2.19", "open-cli": "^8.0.0", "prettier": "^3.8.1", "rimraf": "^6.1.2", "sass": "^1.97.3", "ts-node": "^10.9.2", - "type-fest": "^5.4.1", + "type-fest": "^5.4.3", "typescript": "^5.9.3", "vitest": "^4.0.18", - "vue-tsc": "^3.2.3" + "vue-tsc": "^3.2.4" }, "engines": { "node": "24", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d5ab05c2b..dd1e2096c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15,11 +15,11 @@ importers: specifier: ^2.2.1 version: 2.2.1(magicast@0.5.1)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2))(vue@3.5.27(typescript@5.9.3)) '@nuxtjs/robots': - specifier: ^5.6.7 - version: 5.6.7(magicast@0.5.1)(vue@3.5.27(typescript@5.9.3))(zod@3.25.76) + specifier: ^5.7.0 + version: 5.7.0(magicast@0.5.1)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2))(vue@3.5.27(typescript@5.9.3))(zod@3.25.76) '@nuxtjs/sitemap': - specifier: ^7.5.2 - version: 7.5.2(magicast@0.5.1)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2))(vue@3.5.27(typescript@5.9.3))(zod@3.25.76) + specifier: ^7.6.0 + version: 7.6.0(magicast@0.5.1)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2))(vue@3.5.27(typescript@5.9.3))(zod@3.25.76) better-sqlite3: specifier: ^12.6.2 version: 12.6.2 @@ -34,10 +34,10 @@ importers: version: 3.0.1 nuxt-schema-org: specifier: ^5.0.10 - version: 5.0.10(@unhead/vue@2.1.2(vue@3.5.27(typescript@5.9.3)))(magicast@0.5.1)(unhead@2.1.2)(vue@3.5.27(typescript@5.9.3))(zod@3.25.76) + version: 5.0.10(@unhead/vue@2.1.2(vue@3.5.27(typescript@5.9.3)))(magicast@0.5.1)(unhead@2.1.2)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2))(vue@3.5.27(typescript@5.9.3))(zod@3.25.76) nuxt-seo-utils: specifier: ^7.0.19 - version: 7.0.19(magicast@0.5.1)(rollup@4.56.0)(unhead@2.1.2)(vue@3.5.27(typescript@5.9.3)) + version: 7.0.19(magicast@0.5.1)(rollup@4.56.0)(unhead@2.1.2)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2))(vue@3.5.27(typescript@5.9.3)) devDependencies: '@babel/eslint-parser': specifier: ^7.28.6 @@ -55,14 +55,14 @@ importers: specifier: ^24.10.9 version: 24.10.9 '@typescript-eslint/eslint-plugin': - specifier: ^8.53.1 - version: 8.53.1(@typescript-eslint/parser@8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + specifier: ^8.54.0 + version: 8.54.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/parser': - specifier: ^8.53.1 - version: 8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + specifier: ^8.54.0 + version: 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) '@vitest/coverage-v8': specifier: ^4.0.18 - version: 4.0.18(vitest@4.0.18(@types/node@24.10.9)(happy-dom@20.3.7)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2)) + version: 4.0.18(vitest@4.0.18(@types/node@24.10.9)(happy-dom@20.4.0)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2)) '@vue/test-utils': specifier: ^2.4.6 version: 2.4.6 @@ -77,19 +77,19 @@ importers: version: 4.0.0(eslint@9.39.2(jiti@2.6.1)) eslint-plugin-vitest: specifier: ^0.5.4 - version: 0.5.4(@typescript-eslint/eslint-plugin@8.53.1(@typescript-eslint/parser@8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)(vitest@4.0.18(@types/node@24.10.9)(happy-dom@20.3.7)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2)) + version: 0.5.4(@typescript-eslint/eslint-plugin@8.54.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)(vitest@4.0.18(@types/node@24.10.9)(happy-dom@20.4.0)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2)) eslint-plugin-vue: specifier: ^10.7.0 - version: 10.7.0(@typescript-eslint/parser@8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(vue-eslint-parser@9.4.3(eslint@9.39.2(jiti@2.6.1))) + version: 10.7.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(vue-eslint-parser@9.4.3(eslint@9.39.2(jiti@2.6.1))) happy-dom: - specifier: ^20.3.7 - version: 20.3.7 + specifier: ^20.4.0 + version: 20.4.0 nuxt: specifier: ^4.3.0 - version: 4.3.0(@libsql/client@0.17.0)(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@24.10.9)(@vue/compiler-sfc@3.5.27)(better-sqlite3@12.6.2)(cac@6.7.14)(db0@0.3.4(@libsql/client@0.17.0)(better-sqlite3@12.6.2))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.9.2)(magicast@0.5.1)(optionator@0.9.4)(rollup@4.56.0)(sass@1.97.3)(terser@5.43.1)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2))(vue-tsc@3.2.3(typescript@5.9.3))(yaml@2.8.2) + version: 4.3.0(@libsql/client@0.17.0)(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@24.10.9)(@vue/compiler-sfc@3.5.27)(better-sqlite3@12.6.2)(cac@6.7.14)(db0@0.3.4(@libsql/client@0.17.0)(better-sqlite3@12.6.2))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.9.2)(magicast@0.5.1)(optionator@0.9.4)(rollup@4.56.0)(sass@1.97.3)(terser@5.43.1)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2))(vue-tsc@3.2.4(typescript@5.9.3))(yaml@2.8.2) nuxt-site-config: - specifier: ^3.2.18 - version: 3.2.18(magicast@0.5.1)(vue@3.5.27(typescript@5.9.3)) + specifier: ^3.2.19 + version: 3.2.19(magicast@0.5.1)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2))(vue@3.5.27(typescript@5.9.3)) open-cli: specifier: ^8.0.0 version: 8.0.0 @@ -106,17 +106,17 @@ importers: specifier: ^10.9.2 version: 10.9.2(@types/node@24.10.9)(typescript@5.9.3) type-fest: - specifier: ^5.4.1 - version: 5.4.1 + specifier: ^5.4.3 + version: 5.4.3 typescript: specifier: ^5.9.3 version: 5.9.3 vitest: specifier: ^4.0.18 - version: 4.0.18(@types/node@24.10.9)(happy-dom@20.3.7)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2) + version: 4.0.18(@types/node@24.10.9)(happy-dom@20.4.0)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2) vue-tsc: - specifier: ^3.2.3 - version: 3.2.3(typescript@5.9.3) + specifier: ^3.2.4 + version: 3.2.4(typescript@5.9.3) packages: @@ -220,10 +220,6 @@ packages: resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.27.1': - resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} - engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.28.5': resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} @@ -859,16 +855,16 @@ packages: '@nuxtjs/mdc@0.20.0': resolution: {integrity: sha512-CV1FuCZppBpNjtWT+OaV+t7qbm/dD+2bbf7Or0h1gxperlf1bB3VZnDoBkOTRjgPWyYvzzRS7FUOQJLQG28MEA==} - '@nuxtjs/robots@5.6.7': - resolution: {integrity: sha512-0Ex0Y38z9s5I5w3AkdlrpLPACE+cd38KH9dYjZE+flP5RSGMvKzbTc8/jyNeY7numIuFt9BQGXEzkEAmxe04Cg==} + '@nuxtjs/robots@5.7.0': + resolution: {integrity: sha512-pkGtOP88rzIalvYE3rTCkJ+f0TDHfB/sbSCcA7inVemFa17JVu8AFlO4e+y4zthj+Jh98Tkf7yCuaDU5w3C1vQ==} peerDependencies: zod: '>=3' peerDependenciesMeta: zod: optional: true - '@nuxtjs/sitemap@7.5.2': - resolution: {integrity: sha512-c4+ZCX7QLsnIRHKZQbPGmfMFkvImuJl/JAR5zFb+Zi4S3RgxJ1olOD+aG0Hr1cqTIU9Dp8/VslYPbc7rQ/vlLg==} + '@nuxtjs/sitemap@7.6.0': + resolution: {integrity: sha512-JuWwAFn9MDHWFO5C7lpV6DS86ZIrJItGfzCK1kN9WvgvDmTgal3xbfGCADmAaCWOVl2+dcPGHH6BCypQvUX0aQ==} engines: {node: '>=18.0.0'} peerDependencies: zod: '>=3' @@ -1828,11 +1824,11 @@ packages: typescript: optional: true - '@typescript-eslint/eslint-plugin@8.53.1': - resolution: {integrity: sha512-cFYYFZ+oQFi6hUnBTbLRXfTJiaQtYE3t4O692agbBl+2Zy+eqSKWtPjhPXJu1G7j4RLjKgeJPDdq3EqOwmX5Ag==} + '@typescript-eslint/eslint-plugin@8.54.0': + resolution: {integrity: sha512-hAAP5io/7csFStuOmR782YmTthKBJ9ND3WVL60hcOjvtGFb+HJxH4O5huAcmcZ9v9G8P+JETiZ/G1B8MALnWZQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.53.1 + '@typescript-eslint/parser': ^8.54.0 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' @@ -1846,15 +1842,15 @@ packages: typescript: optional: true - '@typescript-eslint/parser@8.53.1': - resolution: {integrity: sha512-nm3cvFN9SqZGXjmw5bZ6cGmvJSyJPn0wU9gHAZZHDnZl2wF9PhHv78Xf06E0MaNk4zLVHL8hb2/c32XvyJOLQg==} + '@typescript-eslint/parser@8.54.0': + resolution: {integrity: sha512-BtE0k6cjwjLZoZixN0t5AKP0kSzlGu7FctRXYuPAm//aaiZhmfq1JwdYpYr1brzEspYyFeF+8XF5j2VK6oalrA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.53.1': - resolution: {integrity: sha512-WYC4FB5Ra0xidsmlPb+1SsnaSKPmS3gsjIARwbEkHkoWloQmuzcfypljaJcR78uyLA1h8sHdWWPHSLDI+MtNog==} + '@typescript-eslint/project-service@8.54.0': + resolution: {integrity: sha512-YPf+rvJ1s7MyiWM4uTRhE4DvBXrEV+d8oC3P9Y2eT7S+HBS0clybdMIPnhiATi9vZOYDc7OQ1L/i6ga6NFYK/g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' @@ -1867,12 +1863,12 @@ packages: resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/scope-manager@8.53.1': - resolution: {integrity: sha512-Lu23yw1uJMFY8cUeq7JlrizAgeQvWugNQzJp8C3x8Eo5Jw5Q2ykMdiiTB9vBVOOUBysMzmRRmUfwFrZuI2C4SQ==} + '@typescript-eslint/scope-manager@8.54.0': + resolution: {integrity: sha512-27rYVQku26j/PbHYcVfRPonmOlVI6gihHtXFbTdB5sb6qA0wdAQAbyXFVarQ5t4HRojIz64IV90YtsjQSSGlQg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.53.1': - resolution: {integrity: sha512-qfvLXS6F6b1y43pnf0pPbXJ+YoXIC7HKg0UGZ27uMIemKMKA6XH2DTxsEDdpdN29D+vHV07x/pnlPNVLhdhWiA==} + '@typescript-eslint/tsconfig-utils@8.54.0': + resolution: {integrity: sha512-dRgOyT2hPk/JwxNMZDsIXDgyl9axdJI3ogZ2XWhBPsnZUv+hPesa5iuhdYt2gzwA9t8RE5ytOJ6xB0moV0Ujvw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' @@ -1887,8 +1883,8 @@ packages: typescript: optional: true - '@typescript-eslint/type-utils@8.53.1': - resolution: {integrity: sha512-MOrdtNvyhy0rHyv0ENzub1d4wQYKb2NmIqG7qEqPWFW7Mpy2jzFC3pQ2yKDvirZB7jypm5uGjF2Qqs6OIqu47w==} + '@typescript-eslint/type-utils@8.54.0': + resolution: {integrity: sha512-hiLguxJWHjjwL6xMBwD903ciAwd7DmK30Y9Axs/etOkftC3ZNN9K44IuRD/EB08amu+Zw6W37x9RecLkOo3pMA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -1902,8 +1898,8 @@ packages: resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/types@8.53.1': - resolution: {integrity: sha512-jr/swrr2aRmUAUjW5/zQHbMaui//vQlsZcJKijZf3M26bnmLj8LyZUpj8/Rd6uzaek06OWsqdofN/Thenm5O8A==} + '@typescript-eslint/types@8.54.0': + resolution: {integrity: sha512-PDUI9R1BVjqu7AUDsRBbKMtwmjWcn4J3le+5LpcFgWULN3LvHC5rkc9gCVxbrsrGmO1jfPybN5s6h4Jy+OnkAA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/typescript-estree@6.21.0': @@ -1924,8 +1920,8 @@ packages: typescript: optional: true - '@typescript-eslint/typescript-estree@8.53.1': - resolution: {integrity: sha512-RGlVipGhQAG4GxV1s34O91cxQ/vWiHJTDHbXRr0li2q/BGg3RR/7NM8QDWgkEgrwQYCvmJV9ichIwyoKCQ+DTg==} + '@typescript-eslint/typescript-estree@8.54.0': + resolution: {integrity: sha512-BUwcskRaPvTk6fzVWgDPdUndLjB87KYDrN5EYGetnktoeAvPtO4ONHlAZDnj5VFnUANg0Sjm7j4usBlnoVMHwA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' @@ -1942,8 +1938,8 @@ packages: peerDependencies: eslint: ^8.56.0 - '@typescript-eslint/utils@8.53.1': - resolution: {integrity: sha512-c4bMvGVWW4hv6JmDUEG7fSYlWOl3II2I4ylt0NM+seinYQlZMQIaKaXIIVJWt9Ofh6whrpM+EdDQXKXjNovvrg==} + '@typescript-eslint/utils@8.54.0': + resolution: {integrity: sha512-9Cnda8GS57AQakvRyG0PTejJNlA2xhvyNtEVIMlDWOOeEyBkYWhGPnfrIAnqxLMTSTo6q8g12XVjjev5l1NvMA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -1957,8 +1953,8 @@ packages: resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/visitor-keys@8.53.1': - resolution: {integrity: sha512-oy+wV7xDKFPRyNggmXuZQSBzvoLnpmJs+GhzRhPjrxl2b/jIlyjVokzm47CZCDUdXKr2zd7ZLodPfOBpOPyPlg==} + '@typescript-eslint/visitor-keys@8.54.0': + resolution: {integrity: sha512-VFlhGSl4opC0bprJiItPQ1RfUhGDIBokcPwaFH4yiBCaNPeld/9VeXbiPO1cLyorQi1G1vL+ecBk1x8o1axORA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@ungap/structured-clone@1.3.0': @@ -2177,15 +2173,9 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@vue/compiler-core@3.5.18': - resolution: {integrity: sha512-3slwjQrrV1TO8MoXgy3aynDQ7lslj5UqDxuHnrzHtpON5CBinhWjJETciPngpin/T3OuW3tXUf86tEurusnztw==} - '@vue/compiler-core@3.5.27': resolution: {integrity: sha512-gnSBQjZA+//qDZen+6a2EdHqJ68Z7uybrMf3SPjEGgG4dicklwDVmMC1AeIHxtLVPT7sn6sH1KOO+tS6gwOUeQ==} - '@vue/compiler-dom@3.5.18': - resolution: {integrity: sha512-RMbU6NTU70++B1JyVJbNbeFkK+A+Q7y9XKE2EM4NLGm2WFR8x9MbAtWxPPLdm0wUkuZv9trpwfSlL6tjdIa1+A==} - '@vue/compiler-dom@3.5.27': resolution: {integrity: sha512-oAFea8dZgCtVVVTEC7fv3T5CbZW9BxpFzGGxC79xakTr6ooeEqmRuvQydIiDAkglZEAd09LgVf1RoDnL54fu5w==} @@ -2212,6 +2202,9 @@ packages: '@vue/language-core@3.2.3': resolution: {integrity: sha512-VpN/GnYDzGLh44AI6i1OB/WsLXo6vwnl0EWHBelGc4TyC0yEq6azwNaed/+Tgr8anFlSdWYnMEkyHJDPe7ii7A==} + '@vue/language-core@3.2.4': + resolution: {integrity: sha512-bqBGuSG4KZM45KKTXzGtoCl9cWju5jsaBKaJJe3h5hRAAWpZUuj5G+L+eI01sPIkm4H6setKRlw7E85wLdDNew==} + '@vue/reactivity@3.5.27': resolution: {integrity: sha512-vvorxn2KXfJ0nBEnj4GYshSgsyMNFnIQah/wczXlsNXt+ijhugmW+PpJ2cNPe4V6jpnBcs0MhCODKllWG+nvoQ==} @@ -2226,9 +2219,6 @@ packages: peerDependencies: vue: 3.5.27 - '@vue/shared@3.5.18': - resolution: {integrity: sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA==} - '@vue/shared@3.5.27': resolution: {integrity: sha512-dXr/3CgqXsJkZ0n9F3I4elY8wM9jMJpP3pvRG52r6m0tu/MsAFIe6JpXVGeNMd/D9F4hQynWT8Rfuj0bdm9kFQ==} @@ -3689,8 +3679,8 @@ packages: h3@1.15.5: resolution: {integrity: sha512-xEyq3rSl+dhGX2Lm0+eFQIAzlDN6Fs0EcC4f7BNUmzaRX/PTzeuM+Tr2lHB8FoXggsQIeXLj8EDVgs5ywxyxmg==} - happy-dom@20.3.7: - resolution: {integrity: sha512-sb5IzoRl1WJKsUSRe+IloJf3z1iDq5PQ7Yk/ULMsZ5IAQEs9ZL7RsFfiKBXU7nK9QmO+iz0e59EH8r8jexTZ/g==} + happy-dom@20.4.0: + resolution: {integrity: sha512-RDeQm3dT9n0A5f/TszjUmNCLEuPnMGv3Tv4BmNINebz/h17PA6LMBcxJ5FrcqltNBMh9jA/8ufgDdBYUdBt+eg==} engines: {node: '>=20.0.0'} has-bigints@1.1.0: @@ -4717,11 +4707,11 @@ packages: nuxt-seo-utils@7.0.19: resolution: {integrity: sha512-OTYhViaifRaFv4kMSjaS/kuX/0g05a26/oNIV6WO8cWBI7azzd/7k8Q/PN0MJb2xUzt+MI//CDQKYk4IXD5+Rw==} - nuxt-site-config-kit@3.2.18: - resolution: {integrity: sha512-Emk/0LKIrojvdidrZep8bS4BGvP4iTxtlUaoEEtEMJbBsNV0nDHrNRpEEeJoAywfMgnKpUorNBT6MkDM7Yt0KA==} + nuxt-site-config-kit@3.2.19: + resolution: {integrity: sha512-5L9Dgw+QGnTLhVO7Km2oZU+wWllvNXLAFXUiZMX1dt37FKXX6v95ZKCVlFfnkSHQ+I2lmuUhFUpuORkOoVnU+g==} - nuxt-site-config@3.2.18: - resolution: {integrity: sha512-pvFM9wNjmb/CTiea36lqVT7WO0zGDHq4MNoFaO4cdOYrym9JeMg5VJIOYnAcAsa6VK1FlH+Cw7Af9UjcqwRg/w==} + nuxt-site-config@3.2.19: + resolution: {integrity: sha512-OUGfo8aJWbymheyb9S2u78ADX73C9qBf8u6BwEJiM82JBhvJTEduJBMlK8MWeh3x9NF+/YX4AYsY5hjfQE5jGA==} nuxt@4.3.0: resolution: {integrity: sha512-99Iw3E3L5/2QtJyV4errZ0axkX/S9IAFK0AHm0pmRHkCu37OFn8mz2P4/CYTt6B/TG3mcKbXAVaeuF2FsAc1cA==} @@ -5586,8 +5576,8 @@ packages: sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - site-config-stack@3.2.18: - resolution: {integrity: sha512-vzLsgSfr4zlJPpB+YKERaFFneC/NcDTHqjNrOtPsdThOMeBowzQwBx/305B58gdPxXX38HQ/NXm1tG/+ox3nYA==} + site-config-stack@3.2.19: + resolution: {integrity: sha512-DJLEbH3WePmwdSDUCKCZTCc6xvY/Uuy3Qk5YG+5z5W7yMQbfRHRlEYhJbh4E431/V4aMROXH8lw5x8ETB71Nig==} peerDependencies: vue: ^3 @@ -5967,8 +5957,8 @@ packages: resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} - type-fest@5.4.1: - resolution: {integrity: sha512-xygQcmneDyzsEuKZrFbRMne5HDqMs++aFzefrJTgEIKjQ3rekM+RPfFCVq2Gp1VIDqddoYeppCj4Pcb+RZW0GQ==} + type-fest@5.4.3: + resolution: {integrity: sha512-AXSAQJu79WGc79/3e9/CR77I/KQgeY1AhNvcShIH4PTcGYyC4xv6H4R4AUOwkPS5799KlVDAu8zExeCrkGquiA==} engines: {node: '>=20'} type-level-regexp@0.1.17: @@ -6408,8 +6398,8 @@ packages: peerDependencies: vue: ^3.5.0 - vue-tsc@3.2.3: - resolution: {integrity: sha512-1RdRB7rQXGFMdpo0aXf9spVzWEPGAk7PEb/ejHQwVrcuQA/HsGiixIc3uBQeqY2YjeEEgvr2ShQewBgcN4c1Cw==} + vue-tsc@3.2.4: + resolution: {integrity: sha512-xj3YCvSLNDKt1iF9OcImWHhmYcihVu9p4b9s4PGR/qp6yhW+tZJaypGxHScRyOrdnHvaOeF+YkZOdKwbgGvp5g==} hasBin: true peerDependencies: typescript: '>=5.0.0' @@ -6643,7 +6633,7 @@ snapshots: '@babel/types': 7.28.6 '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 - debug: 4.4.1 + debug: 4.4.3 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -6757,8 +6747,6 @@ snapshots: '@babel/helper-string-parser@7.27.1': {} - '@babel/helper-validator-identifier@7.27.1': {} - '@babel/helper-validator-identifier@7.28.5': {} '@babel/helper-validator-option@7.27.1': {} @@ -6818,7 +6806,7 @@ snapshots: '@babel/parser': 7.28.6 '@babel/template': 7.27.2 '@babel/types': 7.28.6 - debug: 4.4.1 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -6830,7 +6818,7 @@ snapshots: '@babel/parser': 7.28.6 '@babel/template': 7.28.6 '@babel/types': 7.28.6 - debug: 4.4.1 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -7145,7 +7133,7 @@ snapshots: '@kwsites/file-exists@1.1.1': dependencies: - debug: 4.4.1 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -7518,7 +7506,7 @@ snapshots: transitivePeerDependencies: - magicast - '@nuxt/nitro-server@4.3.0(@libsql/client@0.17.0)(@netlify/blobs@9.1.2)(better-sqlite3@12.6.2)(db0@0.3.4(@libsql/client@0.17.0)(better-sqlite3@12.6.2))(ioredis@5.9.2)(magicast@0.5.1)(nuxt@4.3.0(@libsql/client@0.17.0)(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@24.10.9)(@vue/compiler-sfc@3.5.27)(better-sqlite3@12.6.2)(cac@6.7.14)(db0@0.3.4(@libsql/client@0.17.0)(better-sqlite3@12.6.2))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.9.2)(magicast@0.5.1)(optionator@0.9.4)(rollup@4.56.0)(sass@1.97.3)(terser@5.43.1)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2))(vue-tsc@3.2.3(typescript@5.9.3))(yaml@2.8.2))(typescript@5.9.3)': + '@nuxt/nitro-server@4.3.0(@libsql/client@0.17.0)(@netlify/blobs@9.1.2)(better-sqlite3@12.6.2)(db0@0.3.4(@libsql/client@0.17.0)(better-sqlite3@12.6.2))(ioredis@5.9.2)(magicast@0.5.1)(nuxt@4.3.0(@libsql/client@0.17.0)(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@24.10.9)(@vue/compiler-sfc@3.5.27)(better-sqlite3@12.6.2)(cac@6.7.14)(db0@0.3.4(@libsql/client@0.17.0)(better-sqlite3@12.6.2))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.9.2)(magicast@0.5.1)(optionator@0.9.4)(rollup@4.56.0)(sass@1.97.3)(terser@5.43.1)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2))(vue-tsc@3.2.4(typescript@5.9.3))(yaml@2.8.2))(typescript@5.9.3)': dependencies: '@nuxt/devalue': 2.0.2 '@nuxt/kit': 4.3.0(magicast@0.5.1) @@ -7536,7 +7524,7 @@ snapshots: klona: 2.0.6 mocked-exports: 0.1.1 nitropack: 2.13.1(@libsql/client@0.17.0)(@netlify/blobs@9.1.2)(better-sqlite3@12.6.2) - nuxt: 4.3.0(@libsql/client@0.17.0)(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@24.10.9)(@vue/compiler-sfc@3.5.27)(better-sqlite3@12.6.2)(cac@6.7.14)(db0@0.3.4(@libsql/client@0.17.0)(better-sqlite3@12.6.2))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.9.2)(magicast@0.5.1)(optionator@0.9.4)(rollup@4.56.0)(sass@1.97.3)(terser@5.43.1)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2))(vue-tsc@3.2.3(typescript@5.9.3))(yaml@2.8.2) + nuxt: 4.3.0(@libsql/client@0.17.0)(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@24.10.9)(@vue/compiler-sfc@3.5.27)(better-sqlite3@12.6.2)(cac@6.7.14)(db0@0.3.4(@libsql/client@0.17.0)(better-sqlite3@12.6.2))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.9.2)(magicast@0.5.1)(optionator@0.9.4)(rollup@4.56.0)(sass@1.97.3)(terser@5.43.1)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2))(vue-tsc@3.2.4(typescript@5.9.3))(yaml@2.8.2) ohash: 2.0.11 pathe: 2.0.3 pkg-types: 2.3.0 @@ -7606,7 +7594,7 @@ snapshots: transitivePeerDependencies: - magicast - '@nuxt/vite-builder@4.3.0(@types/node@24.10.9)(eslint@9.39.2(jiti@2.6.1))(magicast@0.5.1)(nuxt@4.3.0(@libsql/client@0.17.0)(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@24.10.9)(@vue/compiler-sfc@3.5.27)(better-sqlite3@12.6.2)(cac@6.7.14)(db0@0.3.4(@libsql/client@0.17.0)(better-sqlite3@12.6.2))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.9.2)(magicast@0.5.1)(optionator@0.9.4)(rollup@4.56.0)(sass@1.97.3)(terser@5.43.1)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2))(vue-tsc@3.2.3(typescript@5.9.3))(yaml@2.8.2))(optionator@0.9.4)(rollup@4.56.0)(sass@1.97.3)(terser@5.43.1)(typescript@5.9.3)(vue-tsc@3.2.3(typescript@5.9.3))(vue@3.5.27(typescript@5.9.3))(yaml@2.8.2)': + '@nuxt/vite-builder@4.3.0(@types/node@24.10.9)(eslint@9.39.2(jiti@2.6.1))(magicast@0.5.1)(nuxt@4.3.0(@libsql/client@0.17.0)(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@24.10.9)(@vue/compiler-sfc@3.5.27)(better-sqlite3@12.6.2)(cac@6.7.14)(db0@0.3.4(@libsql/client@0.17.0)(better-sqlite3@12.6.2))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.9.2)(magicast@0.5.1)(optionator@0.9.4)(rollup@4.56.0)(sass@1.97.3)(terser@5.43.1)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2))(vue-tsc@3.2.4(typescript@5.9.3))(yaml@2.8.2))(optionator@0.9.4)(rollup@4.56.0)(sass@1.97.3)(terser@5.43.1)(typescript@5.9.3)(vue-tsc@3.2.4(typescript@5.9.3))(vue@3.5.27(typescript@5.9.3))(yaml@2.8.2)': dependencies: '@nuxt/kit': 4.3.0(magicast@0.5.1) '@rollup/plugin-replace': 6.0.3(rollup@4.56.0) @@ -7625,7 +7613,7 @@ snapshots: magic-string: 0.30.21 mlly: 1.8.0 mocked-exports: 0.1.1 - nuxt: 4.3.0(@libsql/client@0.17.0)(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@24.10.9)(@vue/compiler-sfc@3.5.27)(better-sqlite3@12.6.2)(cac@6.7.14)(db0@0.3.4(@libsql/client@0.17.0)(better-sqlite3@12.6.2))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.9.2)(magicast@0.5.1)(optionator@0.9.4)(rollup@4.56.0)(sass@1.97.3)(terser@5.43.1)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2))(vue-tsc@3.2.3(typescript@5.9.3))(yaml@2.8.2) + nuxt: 4.3.0(@libsql/client@0.17.0)(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@24.10.9)(@vue/compiler-sfc@3.5.27)(better-sqlite3@12.6.2)(cac@6.7.14)(db0@0.3.4(@libsql/client@0.17.0)(better-sqlite3@12.6.2))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.9.2)(magicast@0.5.1)(optionator@0.9.4)(rollup@4.56.0)(sass@1.97.3)(terser@5.43.1)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2))(vue-tsc@3.2.4(typescript@5.9.3))(yaml@2.8.2) pathe: 2.0.3 pkg-types: 2.3.0 postcss: 8.5.6 @@ -7636,7 +7624,7 @@ snapshots: unenv: 2.0.0-rc.24 vite: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2) vite-node: 5.3.0(@types/node@24.10.9)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2) - vite-plugin-checker: 0.12.0(eslint@9.39.2(jiti@2.6.1))(optionator@0.9.4)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2))(vue-tsc@3.2.3(typescript@5.9.3)) + vite-plugin-checker: 0.12.0(eslint@9.39.2(jiti@2.6.1))(optionator@0.9.4)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2))(vue-tsc@3.2.4(typescript@5.9.3)) vue: 3.5.27(typescript@5.9.3) vue-bundle-renderer: 2.2.0 transitivePeerDependencies: @@ -7671,7 +7659,7 @@ snapshots: '@typescript-eslint/parser': 6.21.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) eslint: 9.39.2(jiti@2.6.1) eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.2(jiti@2.6.1)) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)) eslint-plugin-vue: 9.33.0(eslint@9.39.2(jiti@2.6.1)) transitivePeerDependencies: - eslint-import-resolver-webpack @@ -7758,32 +7746,35 @@ snapshots: - magicast - supports-color - '@nuxtjs/robots@5.6.7(magicast@0.5.1)(vue@3.5.27(typescript@5.9.3))(zod@3.25.76)': + '@nuxtjs/robots@5.7.0(magicast@0.5.1)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2))(vue@3.5.27(typescript@5.9.3))(zod@3.25.76)': dependencies: '@fingerprintjs/botd': 2.0.0 + '@nuxt/devtools-kit': 3.1.1(magicast@0.5.1)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2)) '@nuxt/kit': 4.3.0(magicast@0.5.1) consola: 3.4.2 defu: 6.1.4 - nuxt-site-config: 3.2.18(magicast@0.5.1)(vue@3.5.27(typescript@5.9.3)) + h3: 1.15.5 + nuxt-site-config: 3.2.19(magicast@0.5.1)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2))(vue@3.5.27(typescript@5.9.3)) pathe: 2.0.3 pkg-types: 2.3.0 sirv: 3.0.2 std-env: 3.10.0 - ufo: 1.6.1 + ufo: 1.6.3 optionalDependencies: zod: 3.25.76 transitivePeerDependencies: - magicast + - vite - vue - '@nuxtjs/sitemap@7.5.2(magicast@0.5.1)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2))(vue@3.5.27(typescript@5.9.3))(zod@3.25.76)': + '@nuxtjs/sitemap@7.6.0(magicast@0.5.1)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2))(vue@3.5.27(typescript@5.9.3))(zod@3.25.76)': dependencies: '@nuxt/devtools-kit': 3.1.1(magicast@0.5.1)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2)) '@nuxt/kit': 4.3.0(magicast@0.5.1) chalk: 5.6.2 defu: 6.1.4 fast-xml-parser: 5.3.3 - nuxt-site-config: 3.2.18(magicast@0.5.1)(vue@3.5.27(typescript@5.9.3)) + nuxt-site-config: 3.2.19(magicast@0.5.1)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2))(vue@3.5.27(typescript@5.9.3)) ofetch: 1.5.1 pathe: 2.0.3 pkg-types: 2.3.0 @@ -8466,14 +8457,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@8.53.1(@typescript-eslint/parser@8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.54.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.53.1 - '@typescript-eslint/type-utils': 8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/utils': 8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.53.1 + '@typescript-eslint/parser': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.54.0 + '@typescript-eslint/type-utils': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.54.0 eslint: 9.39.2(jiti@2.6.1) ignore: 7.0.5 natural-compare: 1.4.0 @@ -8495,22 +8486,22 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 8.53.1 - '@typescript-eslint/types': 8.53.1 - '@typescript-eslint/typescript-estree': 8.53.1(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.53.1 + '@typescript-eslint/scope-manager': 8.54.0 + '@typescript-eslint/types': 8.54.0 + '@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.54.0 debug: 4.4.3 eslint: 9.39.2(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.53.1(typescript@5.9.3)': + '@typescript-eslint/project-service@8.54.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.53.1(typescript@5.9.3) - '@typescript-eslint/types': 8.53.1 + '@typescript-eslint/tsconfig-utils': 8.54.0(typescript@5.9.3) + '@typescript-eslint/types': 8.54.0 debug: 4.4.3 typescript: 5.9.3 transitivePeerDependencies: @@ -8526,12 +8517,12 @@ snapshots: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - '@typescript-eslint/scope-manager@8.53.1': + '@typescript-eslint/scope-manager@8.54.0': dependencies: - '@typescript-eslint/types': 8.53.1 - '@typescript-eslint/visitor-keys': 8.53.1 + '@typescript-eslint/types': 8.54.0 + '@typescript-eslint/visitor-keys': 8.54.0 - '@typescript-eslint/tsconfig-utils@8.53.1(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.54.0(typescript@5.9.3)': dependencies: typescript: 5.9.3 @@ -8539,7 +8530,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.9.3) '@typescript-eslint/utils': 6.21.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - debug: 4.4.1 + debug: 4.4.3 eslint: 9.39.2(jiti@2.6.1) ts-api-utils: 1.4.3(typescript@5.9.3) optionalDependencies: @@ -8547,11 +8538,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.53.1 - '@typescript-eslint/typescript-estree': 8.53.1(typescript@5.9.3) - '@typescript-eslint/utils': 8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/types': 8.54.0 + '@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) debug: 4.4.3 eslint: 9.39.2(jiti@2.6.1) ts-api-utils: 2.4.0(typescript@5.9.3) @@ -8563,13 +8554,13 @@ snapshots: '@typescript-eslint/types@7.18.0': {} - '@typescript-eslint/types@8.53.1': {} + '@typescript-eslint/types@8.54.0': {} '@typescript-eslint/typescript-estree@6.21.0(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.4.1 + debug: 4.4.3 globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.3 @@ -8584,7 +8575,7 @@ snapshots: dependencies: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.4.1 + debug: 4.4.3 globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.5 @@ -8595,12 +8586,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.53.1(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.54.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.53.1(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.53.1(typescript@5.9.3) - '@typescript-eslint/types': 8.53.1 - '@typescript-eslint/visitor-keys': 8.53.1 + '@typescript-eslint/project-service': 8.54.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.54.0(typescript@5.9.3) + '@typescript-eslint/types': 8.54.0 + '@typescript-eslint/visitor-keys': 8.54.0 debug: 4.4.3 minimatch: 9.0.5 semver: 7.7.3 @@ -8635,12 +8626,12 @@ snapshots: - supports-color - typescript - '@typescript-eslint/utils@8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/utils@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) - '@typescript-eslint/scope-manager': 8.53.1 - '@typescript-eslint/types': 8.53.1 - '@typescript-eslint/typescript-estree': 8.53.1(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.54.0 + '@typescript-eslint/types': 8.54.0 + '@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3) eslint: 9.39.2(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: @@ -8656,9 +8647,9 @@ snapshots: '@typescript-eslint/types': 7.18.0 eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@8.53.1': + '@typescript-eslint/visitor-keys@8.54.0': dependencies: - '@typescript-eslint/types': 8.53.1 + '@typescript-eslint/types': 8.54.0 eslint-visitor-keys: 4.2.1 '@ungap/structured-clone@1.3.0': {} @@ -8785,7 +8776,7 @@ snapshots: vite: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2) vue: 3.5.27(typescript@5.9.3) - '@vitest/coverage-v8@4.0.18(vitest@4.0.18(@types/node@24.10.9)(happy-dom@20.3.7)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2))': + '@vitest/coverage-v8@4.0.18(vitest@4.0.18(@types/node@24.10.9)(happy-dom@20.4.0)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2))': dependencies: '@bcoe/v8-coverage': 1.0.2 '@vitest/utils': 4.0.18 @@ -8797,7 +8788,7 @@ snapshots: obug: 2.1.1 std-env: 3.10.0 tinyrainbow: 3.0.3 - vitest: 4.0.18(@types/node@24.10.9)(happy-dom@20.3.7)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2) + vitest: 4.0.18(@types/node@24.10.9)(happy-dom@20.4.0)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2) '@vitest/expect@4.0.18': dependencies: @@ -8889,14 +8880,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@vue/compiler-core@3.5.18': - dependencies: - '@babel/parser': 7.28.6 - '@vue/shared': 3.5.18 - entities: 4.5.0 - estree-walker: 2.0.2 - source-map-js: 1.2.1 - '@vue/compiler-core@3.5.27': dependencies: '@babel/parser': 7.28.6 @@ -8905,11 +8888,6 @@ snapshots: estree-walker: 2.0.2 source-map-js: 1.2.1 - '@vue/compiler-dom@3.5.18': - dependencies: - '@vue/compiler-core': 3.5.18 - '@vue/shared': 3.5.18 - '@vue/compiler-dom@3.5.27': dependencies: '@vue/compiler-core': 3.5.27 @@ -8963,8 +8941,18 @@ snapshots: '@vue/language-core@3.2.3': dependencies: '@volar/language-core': 2.4.27 - '@vue/compiler-dom': 3.5.18 - '@vue/shared': 3.5.18 + '@vue/compiler-dom': 3.5.27 + '@vue/shared': 3.5.27 + alien-signals: 3.1.2 + muggle-string: 0.4.1 + path-browserify: 1.0.1 + picomatch: 4.0.3 + + '@vue/language-core@3.2.4': + dependencies: + '@volar/language-core': 2.4.27 + '@vue/compiler-dom': 3.5.27 + '@vue/shared': 3.5.27 alien-signals: 3.1.2 muggle-string: 0.4.1 path-browserify: 1.0.1 @@ -8992,8 +8980,6 @@ snapshots: '@vue/shared': 3.5.27 vue: 3.5.27(typescript@5.9.3) - '@vue/shared@3.5.18': {} - '@vue/shared@3.5.27': {} '@vue/test-utils@2.4.6': @@ -9396,13 +9382,13 @@ snapshots: confbox: 0.2.2 defu: 6.1.4 dotenv: 17.2.1 - exsolve: 1.0.7 + exsolve: 1.0.8 giget: 2.0.0 - jiti: 2.5.1 + jiti: 2.6.1 ohash: 2.0.11 pathe: 2.0.3 perfect-debounce: 1.0.0 - pkg-types: 2.2.0 + pkg-types: 2.3.0 rc9: 2.1.2 optionalDependencies: magicast: 0.5.1 @@ -9845,7 +9831,7 @@ snapshots: dot-prop@10.1.0: dependencies: - type-fest: 5.4.1 + type-fest: 5.4.3 dot-prop@9.0.0: dependencies: @@ -10063,7 +10049,7 @@ snapshots: eslint-config-standard@17.1.0(eslint-plugin-import@2.32.0)(eslint-plugin-n@15.7.0(eslint@9.39.2(jiti@2.6.1)))(eslint-plugin-promise@6.6.0(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)): dependencies: eslint: 9.39.2(jiti@2.6.1) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)) eslint-plugin-n: 15.7.0(eslint@9.39.2(jiti@2.6.1)) eslint-plugin-promise: 6.6.0(eslint@9.39.2(jiti@2.6.1)) @@ -10086,15 +10072,15 @@ snapshots: tinyglobby: 0.2.14 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@2.6.1)): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@2.6.1)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) eslint: 9.39.2(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: @@ -10123,7 +10109,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.39.2(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@2.6.1)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@2.6.1)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -10141,7 +10127,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -10152,7 +10138,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.39.2(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@2.6.1)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@2.6.1)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -10164,7 +10150,7 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -10207,7 +10193,7 @@ snapshots: eslint-plugin-unicorn@44.0.2(eslint@9.39.2(jiti@2.6.1)): dependencies: - '@babel/helper-validator-identifier': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 ci-info: 3.9.0 clean-regexp: 1.0.0 eslint: 9.39.2(jiti@2.6.1) @@ -10223,18 +10209,18 @@ snapshots: semver: 7.7.3 strip-indent: 3.0.0 - eslint-plugin-vitest@0.5.4(@typescript-eslint/eslint-plugin@8.53.1(@typescript-eslint/parser@8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)(vitest@4.0.18(@types/node@24.10.9)(happy-dom@20.3.7)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2)): + eslint-plugin-vitest@0.5.4(@typescript-eslint/eslint-plugin@8.54.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)(vitest@4.0.18(@types/node@24.10.9)(happy-dom@20.4.0)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2)): dependencies: '@typescript-eslint/utils': 7.18.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) eslint: 9.39.2(jiti@2.6.1) optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.53.1(@typescript-eslint/parser@8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - vitest: 4.0.18(@types/node@24.10.9)(happy-dom@20.3.7)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2) + '@typescript-eslint/eslint-plugin': 8.54.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + vitest: 4.0.18(@types/node@24.10.9)(happy-dom@20.4.0)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2) transitivePeerDependencies: - supports-color - typescript - eslint-plugin-vue@10.7.0(@typescript-eslint/parser@8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(vue-eslint-parser@9.4.3(eslint@9.39.2(jiti@2.6.1))): + eslint-plugin-vue@10.7.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(vue-eslint-parser@9.4.3(eslint@9.39.2(jiti@2.6.1))): dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) eslint: 9.39.2(jiti@2.6.1) @@ -10245,7 +10231,7 @@ snapshots: vue-eslint-parser: 9.4.3(eslint@9.39.2(jiti@2.6.1)) xml-name-validator: 4.0.0 optionalDependencies: - '@typescript-eslint/parser': 8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) eslint-plugin-vue@9.33.0(eslint@9.39.2(jiti@2.6.1)): dependencies: @@ -10660,7 +10646,7 @@ snapshots: ufo: 1.6.3 uncrypto: 0.1.3 - happy-dom@20.3.7: + happy-dom@20.4.0: dependencies: '@types/node': 24.10.9 '@types/whatwg-mimetype': 3.0.2 @@ -10861,7 +10847,7 @@ snapshots: https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.4 - debug: 4.4.1 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -10918,7 +10904,7 @@ snapshots: dependencies: '@ioredis/commands': 1.5.0 cluster-key-slot: 1.1.2 - debug: 4.4.1 + debug: 4.4.3 denque: 2.1.0 lodash.defaults: 4.2.0 lodash.isarguments: 3.1.0 @@ -11302,8 +11288,8 @@ snapshots: local-pkg@1.1.1: dependencies: - mlly: 1.7.4 - pkg-types: 2.2.0 + mlly: 1.8.0 + pkg-types: 2.3.0 quansync: 0.2.11 local-pkg@1.1.2: @@ -11789,7 +11775,7 @@ snapshots: acorn: 8.15.0 pathe: 2.0.3 pkg-types: 1.3.1 - ufo: 1.6.1 + ufo: 1.6.3 mlly@1.8.0: dependencies: @@ -12012,12 +11998,12 @@ snapshots: transitivePeerDependencies: - magicast - nuxt-schema-org@5.0.10(@unhead/vue@2.1.2(vue@3.5.27(typescript@5.9.3)))(magicast@0.5.1)(unhead@2.1.2)(vue@3.5.27(typescript@5.9.3))(zod@3.25.76): + nuxt-schema-org@5.0.10(@unhead/vue@2.1.2(vue@3.5.27(typescript@5.9.3)))(magicast@0.5.1)(unhead@2.1.2)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2))(vue@3.5.27(typescript@5.9.3))(zod@3.25.76): dependencies: '@nuxt/kit': 4.3.0(magicast@0.5.1) '@unhead/schema-org': 2.1.2(@unhead/vue@2.1.2(vue@3.5.27(typescript@5.9.3))) defu: 6.1.4 - nuxt-site-config: 3.2.18(magicast@0.5.1)(vue@3.5.27(typescript@5.9.3)) + nuxt-site-config: 3.2.19(magicast@0.5.1)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2))(vue@3.5.27(typescript@5.9.3)) pathe: 2.0.3 pkg-types: 2.3.0 sirv: 3.0.2 @@ -12030,9 +12016,10 @@ snapshots: - '@unhead/solid-js' - '@unhead/svelte' - magicast + - vite - vue - nuxt-seo-utils@7.0.19(magicast@0.5.1)(rollup@4.56.0)(unhead@2.1.2)(vue@3.5.27(typescript@5.9.3)): + nuxt-seo-utils@7.0.19(magicast@0.5.1)(rollup@4.56.0)(unhead@2.1.2)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2))(vue@3.5.27(typescript@5.9.3)): dependencies: '@nuxt/kit': 4.3.0(magicast@0.5.1) '@unhead/addons': 2.1.2(rollup@4.56.0)(unhead@2.1.2) @@ -12040,7 +12027,7 @@ snapshots: escape-string-regexp: 5.0.0 fast-glob: 3.3.3 image-size: 2.0.2 - nuxt-site-config: 3.2.18(magicast@0.5.1)(vue@3.5.27(typescript@5.9.3)) + nuxt-site-config: 3.2.19(magicast@0.5.1)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2))(vue@3.5.27(typescript@5.9.3)) pathe: 2.0.3 pkg-types: 2.3.0 scule: 1.3.0 @@ -12050,43 +12037,46 @@ snapshots: - magicast - rollup - unhead + - vite - vue - nuxt-site-config-kit@3.2.18(magicast@0.5.1)(vue@3.5.27(typescript@5.9.3)): + nuxt-site-config-kit@3.2.19(magicast@0.5.1)(vue@3.5.27(typescript@5.9.3)): dependencies: '@nuxt/kit': 4.3.0(magicast@0.5.1) pkg-types: 2.3.0 - site-config-stack: 3.2.18(vue@3.5.27(typescript@5.9.3)) + site-config-stack: 3.2.19(vue@3.5.27(typescript@5.9.3)) std-env: 3.10.0 ufo: 1.6.3 transitivePeerDependencies: - magicast - vue - nuxt-site-config@3.2.18(magicast@0.5.1)(vue@3.5.27(typescript@5.9.3)): + nuxt-site-config@3.2.19(magicast@0.5.1)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2))(vue@3.5.27(typescript@5.9.3)): dependencies: + '@nuxt/devtools-kit': 3.1.1(magicast@0.5.1)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2)) '@nuxt/kit': 4.3.0(magicast@0.5.1) h3: 1.15.5 - nuxt-site-config-kit: 3.2.18(magicast@0.5.1)(vue@3.5.27(typescript@5.9.3)) + nuxt-site-config-kit: 3.2.19(magicast@0.5.1)(vue@3.5.27(typescript@5.9.3)) pathe: 2.0.3 pkg-types: 2.3.0 sirv: 3.0.2 - site-config-stack: 3.2.18(vue@3.5.27(typescript@5.9.3)) + site-config-stack: 3.2.19(vue@3.5.27(typescript@5.9.3)) ufo: 1.6.3 transitivePeerDependencies: - magicast + - vite - vue - nuxt@4.3.0(@libsql/client@0.17.0)(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@24.10.9)(@vue/compiler-sfc@3.5.27)(better-sqlite3@12.6.2)(cac@6.7.14)(db0@0.3.4(@libsql/client@0.17.0)(better-sqlite3@12.6.2))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.9.2)(magicast@0.5.1)(optionator@0.9.4)(rollup@4.56.0)(sass@1.97.3)(terser@5.43.1)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2))(vue-tsc@3.2.3(typescript@5.9.3))(yaml@2.8.2): + nuxt@4.3.0(@libsql/client@0.17.0)(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@24.10.9)(@vue/compiler-sfc@3.5.27)(better-sqlite3@12.6.2)(cac@6.7.14)(db0@0.3.4(@libsql/client@0.17.0)(better-sqlite3@12.6.2))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.9.2)(magicast@0.5.1)(optionator@0.9.4)(rollup@4.56.0)(sass@1.97.3)(terser@5.43.1)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2))(vue-tsc@3.2.4(typescript@5.9.3))(yaml@2.8.2): dependencies: '@dxup/nuxt': 0.3.2(magicast@0.5.1) '@nuxt/cli': 3.32.0(cac@6.7.14)(magicast@0.5.1) '@nuxt/devtools': 3.1.1(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2))(vue@3.5.27(typescript@5.9.3)) '@nuxt/kit': 4.3.0(magicast@0.5.1) - '@nuxt/nitro-server': 4.3.0(@libsql/client@0.17.0)(@netlify/blobs@9.1.2)(better-sqlite3@12.6.2)(db0@0.3.4(@libsql/client@0.17.0)(better-sqlite3@12.6.2))(ioredis@5.9.2)(magicast@0.5.1)(nuxt@4.3.0(@libsql/client@0.17.0)(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@24.10.9)(@vue/compiler-sfc@3.5.27)(better-sqlite3@12.6.2)(cac@6.7.14)(db0@0.3.4(@libsql/client@0.17.0)(better-sqlite3@12.6.2))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.9.2)(magicast@0.5.1)(optionator@0.9.4)(rollup@4.56.0)(sass@1.97.3)(terser@5.43.1)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2))(vue-tsc@3.2.3(typescript@5.9.3))(yaml@2.8.2))(typescript@5.9.3) + '@nuxt/nitro-server': 4.3.0(@libsql/client@0.17.0)(@netlify/blobs@9.1.2)(better-sqlite3@12.6.2)(db0@0.3.4(@libsql/client@0.17.0)(better-sqlite3@12.6.2))(ioredis@5.9.2)(magicast@0.5.1)(nuxt@4.3.0(@libsql/client@0.17.0)(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@24.10.9)(@vue/compiler-sfc@3.5.27)(better-sqlite3@12.6.2)(cac@6.7.14)(db0@0.3.4(@libsql/client@0.17.0)(better-sqlite3@12.6.2))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.9.2)(magicast@0.5.1)(optionator@0.9.4)(rollup@4.56.0)(sass@1.97.3)(terser@5.43.1)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2))(vue-tsc@3.2.4(typescript@5.9.3))(yaml@2.8.2))(typescript@5.9.3) '@nuxt/schema': 4.3.0 '@nuxt/telemetry': 2.6.6(magicast@0.5.1) - '@nuxt/vite-builder': 4.3.0(@types/node@24.10.9)(eslint@9.39.2(jiti@2.6.1))(magicast@0.5.1)(nuxt@4.3.0(@libsql/client@0.17.0)(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@24.10.9)(@vue/compiler-sfc@3.5.27)(better-sqlite3@12.6.2)(cac@6.7.14)(db0@0.3.4(@libsql/client@0.17.0)(better-sqlite3@12.6.2))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.9.2)(magicast@0.5.1)(optionator@0.9.4)(rollup@4.56.0)(sass@1.97.3)(terser@5.43.1)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2))(vue-tsc@3.2.3(typescript@5.9.3))(yaml@2.8.2))(optionator@0.9.4)(rollup@4.56.0)(sass@1.97.3)(terser@5.43.1)(typescript@5.9.3)(vue-tsc@3.2.3(typescript@5.9.3))(vue@3.5.27(typescript@5.9.3))(yaml@2.8.2) + '@nuxt/vite-builder': 4.3.0(@types/node@24.10.9)(eslint@9.39.2(jiti@2.6.1))(magicast@0.5.1)(nuxt@4.3.0(@libsql/client@0.17.0)(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@24.10.9)(@vue/compiler-sfc@3.5.27)(better-sqlite3@12.6.2)(cac@6.7.14)(db0@0.3.4(@libsql/client@0.17.0)(better-sqlite3@12.6.2))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.9.2)(magicast@0.5.1)(optionator@0.9.4)(rollup@4.56.0)(sass@1.97.3)(terser@5.43.1)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2))(vue-tsc@3.2.4(typescript@5.9.3))(yaml@2.8.2))(optionator@0.9.4)(rollup@4.56.0)(sass@1.97.3)(terser@5.43.1)(typescript@5.9.3)(vue-tsc@3.2.4(typescript@5.9.3))(vue@3.5.27(typescript@5.9.3))(yaml@2.8.2) '@unhead/vue': 2.1.2(vue@3.5.27(typescript@5.9.3)) '@vue/shared': 3.5.27 c12: 3.3.3(magicast@0.5.1) @@ -12203,7 +12193,7 @@ snapshots: citty: 0.1.6 consola: 3.4.2 pathe: 2.0.3 - pkg-types: 2.2.0 + pkg-types: 2.3.0 tinyexec: 1.0.2 nypm@0.6.4: @@ -12526,7 +12516,7 @@ snapshots: pkg-types@2.2.0: dependencies: confbox: 0.2.2 - exsolve: 1.0.7 + exsolve: 1.0.8 pathe: 2.0.3 pkg-types@2.3.0: @@ -13148,7 +13138,7 @@ snapshots: send@1.2.0: dependencies: - debug: 4.4.1 + debug: 4.4.3 encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 @@ -13274,7 +13264,7 @@ snapshots: dependencies: '@kwsites/file-exists': 1.1.1 '@kwsites/promise-deferred': 1.1.1 - debug: 4.4.1 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -13286,7 +13276,7 @@ snapshots: sisteransi@1.0.5: {} - site-config-stack@3.2.18(vue@3.5.27(typescript@5.9.3)): + site-config-stack@3.2.19(vue@3.5.27(typescript@5.9.3)): dependencies: ufo: 1.6.3 vue: 3.5.27(typescript@5.9.3) @@ -13542,7 +13532,7 @@ snapshots: terser-webpack-plugin@5.3.14(webpack@5.101.2): dependencies: - '@jridgewell/trace-mapping': 0.3.30 + '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.2 serialize-javascript: 6.0.2 @@ -13662,7 +13652,7 @@ snapshots: type-fest@4.41.0: optional: true - type-fest@5.4.1: + type-fest@5.4.3: dependencies: tagged-tag: 1.0.0 @@ -13768,13 +13758,13 @@ snapshots: estree-walker: 3.0.3 local-pkg: 1.1.1 magic-string: 0.30.17 - mlly: 1.7.4 + mlly: 1.8.0 pathe: 2.0.3 picomatch: 4.0.3 - pkg-types: 2.2.0 + pkg-types: 2.3.0 scule: 1.3.0 strip-literal: 3.0.0 - tinyglobby: 0.2.14 + tinyglobby: 0.2.15 unplugin: 2.3.6 unplugin-utils: 0.2.5 @@ -14032,7 +14022,7 @@ snapshots: - tsx - yaml - vite-plugin-checker@0.12.0(eslint@9.39.2(jiti@2.6.1))(optionator@0.9.4)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2))(vue-tsc@3.2.3(typescript@5.9.3)): + vite-plugin-checker@0.12.0(eslint@9.39.2(jiti@2.6.1))(optionator@0.9.4)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2))(vue-tsc@3.2.4(typescript@5.9.3)): dependencies: '@babel/code-frame': 7.27.1 chokidar: 4.0.3 @@ -14047,7 +14037,7 @@ snapshots: eslint: 9.39.2(jiti@2.6.1) optionator: 0.9.4 typescript: 5.9.3 - vue-tsc: 3.2.3(typescript@5.9.3) + vue-tsc: 3.2.4(typescript@5.9.3) vite-plugin-eslint@1.8.1(eslint@9.39.2(jiti@2.6.1))(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2)): dependencies: @@ -14060,7 +14050,7 @@ snapshots: vite-plugin-inspect@11.3.3(@nuxt/kit@4.3.0(magicast@0.5.1))(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2)): dependencies: ansis: 4.1.0 - debug: 4.4.1 + debug: 4.4.3 error-stack-parser-es: 1.0.5 ohash: 2.0.11 open: 10.2.0 @@ -14100,7 +14090,7 @@ snapshots: terser: 5.43.1 yaml: 2.8.2 - vitest@4.0.18(@types/node@24.10.9)(happy-dom@20.3.7)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2): + vitest@4.0.18(@types/node@24.10.9)(happy-dom@20.4.0)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2): dependencies: '@vitest/expect': 4.0.18 '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(sass@1.97.3)(terser@5.43.1)(yaml@2.8.2)) @@ -14124,7 +14114,7 @@ snapshots: why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 24.10.9 - happy-dom: 20.3.7 + happy-dom: 20.4.0 transitivePeerDependencies: - jiti - less @@ -14174,10 +14164,10 @@ snapshots: '@vue/devtools-api': 6.6.4 vue: 3.5.27(typescript@5.9.3) - vue-tsc@3.2.3(typescript@5.9.3): + vue-tsc@3.2.4(typescript@5.9.3): dependencies: '@volar/typescript': 2.4.27 - '@vue/language-core': 3.2.3 + '@vue/language-core': 3.2.4 typescript: 5.9.3 vue@3.5.27(typescript@5.9.3): diff --git a/public/assets/google-digital-garage-certificate.pdf b/public/assets/google-digital-garage-certificate.pdf deleted file mode 100644 index 23b35ab7e..000000000 Binary files a/public/assets/google-digital-garage-certificate.pdf and /dev/null differ diff --git a/public/projects/butter-cms-utilities.webp b/public/projects/butter-cms-utilities.webp index db5245ea7..544c736c2 100644 Binary files a/public/projects/butter-cms-utilities.webp and b/public/projects/butter-cms-utilities.webp differ diff --git a/public/projects/lightspeed.webp b/public/projects/lightspeed.webp deleted file mode 100644 index 860ec6161..000000000 Binary files a/public/projects/lightspeed.webp and /dev/null differ diff --git a/public/projects/neumorphic-design-elements.webp b/public/projects/neumorphic-design-elements.webp deleted file mode 100644 index cfc7c31ce..000000000 Binary files a/public/projects/neumorphic-design-elements.webp and /dev/null differ diff --git a/public/projects/npx-jackdomleo7.gif b/public/projects/npx-jackdomleo7.gif deleted file mode 100644 index cd24d79de..000000000 Binary files a/public/projects/npx-jackdomleo7.gif and /dev/null differ diff --git a/public/projects/npx-jackdomleo7.webp b/public/projects/npx-jackdomleo7.webp new file mode 100644 index 000000000..53156f916 Binary files /dev/null and b/public/projects/npx-jackdomleo7.webp differ diff --git a/public/projects/spinning-smiley-face.gif b/public/projects/spinning-smiley-face.gif deleted file mode 100644 index e7089efc3..000000000 Binary files a/public/projects/spinning-smiley-face.gif and /dev/null differ diff --git a/public/projects/spring-clean-twitter-bot.webp b/public/projects/spring-clean-twitter-bot.webp deleted file mode 100644 index 135ca693d..000000000 Binary files a/public/projects/spring-clean-twitter-bot.webp and /dev/null differ diff --git a/public/projects/storybook-addon-css-properties.webp b/public/projects/storybook-addon-css-properties.webp index b041c8ac5..251195633 100644 Binary files a/public/projects/storybook-addon-css-properties.webp and b/public/projects/storybook-addon-css-properties.webp differ diff --git a/public/projects/which-media-queries.webp b/public/projects/which-media-queries.webp index f6bc99254..653824098 100644 Binary files a/public/projects/which-media-queries.webp and b/public/projects/which-media-queries.webp differ