diff --git a/.vscode/settings.json b/.vscode/settings.json index c5632ba..5f69485 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,30 +1,53 @@ { // Enable the ESlint flat config support "eslint.experimental.useFlatConfig": true, - // Disable the default formatter, use eslint instead "prettier.enable": false, "editor.formatOnSave": false, - // Auto fix "editor.codeActionsOnSave": { "source.fixAll": "explicit", "source.organizeImports": "never" }, - // Silent the stylistic rules in you IDE, but still auto fix them "eslint.rules.customizations": [ - { "rule": "style/*", "severity": "off" }, - { "rule": "*-indent", "severity": "off" }, - { "rule": "*-spacing", "severity": "off" }, - { "rule": "*-spaces", "severity": "off" }, - { "rule": "*-order", "severity": "off" }, - { "rule": "*-dangle", "severity": "off" }, - { "rule": "*-newline", "severity": "off" }, - { "rule": "*quotes", "severity": "off" }, - { "rule": "*semi", "severity": "off" } + { + "rule": "style/*", + "severity": "off" + }, + { + "rule": "*-indent", + "severity": "off" + }, + { + "rule": "*-spacing", + "severity": "off" + }, + { + "rule": "*-spaces", + "severity": "off" + }, + { + "rule": "*-order", + "severity": "off" + }, + { + "rule": "*-dangle", + "severity": "off" + }, + { + "rule": "*-newline", + "severity": "off" + }, + { + "rule": "*quotes", + "severity": "off" + }, + { + "rule": "*semi", + "severity": "off" + } ], - // Enable eslint for all supported languages "eslint.validate": [ "javascript", diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts index 9b07bf6..74d2a85 100644 --- a/docs/.vitepress/config.ts +++ b/docs/.vitepress/config.ts @@ -1,5 +1,8 @@ import { defineConfig } from 'vitepress' import { transformerTwoslash } from 'vitepress-plugin-twoslash' +import container from 'markdown-it-container' +import { renderSandbox } from 'vitepress-plugin-sandpack' +import Unocss from 'unocss/vite' // https://vitepress.dev/reference/site-config export default defineConfig({ @@ -13,12 +16,26 @@ export default defineConfig({ codeTransformers: [ transformerTwoslash(), ], + config(md) { + md + .use(container, 'sandbox', { + render(tokens, idx) { + return renderSandbox(tokens, idx, 'sandbox') + }, + }) + .use(container, 'code-sandbox', { + render(tokens, idx) { + return renderSandbox(tokens, idx, 'code-sandbox') + }, + }) + }, }, lastUpdated: true, ignoreDeadLinks: true, cleanUrls: true, - titleTemplate: ':title - Typed-xlsx', + titleTemplate: 'Typed-xlsx | :title', themeConfig: { + aside: true, logo: '/images/logo.png', editLink: { pattern: 'https://github.com/ChronicStone/typed-xlsx/edit/main/docs/:path', @@ -47,31 +64,40 @@ export default defineConfig({ { text: 'Schema Builder', items: [ - { text: 'Columns', link: '/schema-builder/columns' }, + { text: 'Create schema', link: '/schema-builder/create-schema' }, + { text: 'Define columns', link: '/schema-builder/columns' }, { text: 'Dynamic Columns', link: '/schema-builder/dynamic-columns' }, { text: 'Global Transformers', link: '/schema-builder/global-transformers' }, { text: 'Build Schema', link: '/schema-builder/build-schema' }, ], }, - { - text: 'Column Definition', - items: [ - { text: 'Header', link: '/column-definition/header' }, - { text: 'Value Transformation', link: '/column-definition/value-transformation' }, - { text: 'Key & Value', link: '/column-definition/key-value' }, - { text: 'Default Value', link: '/column-definition/default-value' }, - { text: 'Cell Format', link: '/column-definition/cell-format' }, - { text: 'Cell Style', link: '/column-definition/cell-style' }, - { text: 'Summary', link: '/column-definition/summary' }, - ], - }, + // { + // text: 'Column Definition', + // items: [ + // { text: 'Header', link: '/column-definition/header' }, + // { text: 'Value Transformation', link: '/column-definition/value-transformation' }, + // { text: 'Key & Value', link: '/column-definition/key-value' }, + // { text: 'Default Value', link: '/column-definition/default-value' }, + // { text: 'Cell Format', link: '/column-definition/cell-format' }, + // { text: 'Cell Style', link: '/column-definition/cell-style' }, + // { text: 'Summary', link: '/column-definition/summary' }, + // ], + // }, { text: 'File Builder', items: [ + { text: 'Create file builder', link: '/file-builder/create-file-builder' }, { text: 'Define Sheets', link: '/file-builder/define-sheets' }, { text: 'Define Tables', link: '/file-builder/define-tables' }, + { text: 'Build excel file', link: '/file-builder/build-excel-file' }, ], }, ], }, + vite: { + plugins: [ + // @ts-expect-error unknown ts issue + Unocss({}), + ], + }, }) diff --git a/docs/.vitepress/theme/components/CodeSandbox.vue b/docs/.vitepress/theme/components/CodeSandbox.vue new file mode 100644 index 0000000..d77b224 --- /dev/null +++ b/docs/.vitepress/theme/components/CodeSandbox.vue @@ -0,0 +1,29 @@ + + + diff --git a/docs/.vitepress/theme/index.ts b/docs/.vitepress/theme/index.ts index 12e61f4..72908a5 100644 --- a/docs/.vitepress/theme/index.ts +++ b/docs/.vitepress/theme/index.ts @@ -3,10 +3,20 @@ import TwoslashFloatingVue from 'vitepress-plugin-twoslash/client' import 'vitepress-plugin-twoslash/style.css' import type { EnhanceAppContext } from 'vitepress' import './style.css' +import 'vitepress-plugin-sandpack/dist/style.css' +import { Sandbox } from 'vitepress-plugin-sandpack' +import vitepressNprogress from 'vitepress-plugin-nprogress' +import CodeSandbox from './components/CodeSandbox.vue' +import 'vitepress-plugin-nprogress/lib/css/index.css' +import 'uno.css' export default { ...DefaultTheme, - enhanceApp({ app }: EnhanceAppContext) { - app.use(TwoslashFloatingVue) + enhanceApp(ctx: EnhanceAppContext) { + ctx.app.use(TwoslashFloatingVue) + DefaultTheme.enhanceApp?.(ctx) + vitepressNprogress(ctx) + ctx.app.component('Sandbox', Sandbox) + ctx.app.component('CodeSandbox', CodeSandbox) }, } diff --git a/docs/.vitepress/theme/style.css b/docs/.vitepress/theme/style.css index 7ab65fc..36c936d 100644 --- a/docs/.vitepress/theme/style.css +++ b/docs/.vitepress/theme/style.css @@ -190,4 +190,4 @@ body { .VPHero.has-image .image { display: none; } -} \ No newline at end of file +} diff --git a/docs/file-builder/build-excel-file.md b/docs/file-builder/build-excel-file.md new file mode 100644 index 0000000..e909d5b --- /dev/null +++ b/docs/file-builder/build-excel-file.md @@ -0,0 +1,122 @@ +# Build Excel File + +After defining the sheets and tables, the final step is to build the Excel file using the `build()` method. This method allows you to specify various parameters to customize the output. Here's a detailed explanation of each parameter: + +## Build Method + +To build the Excel file, call the `build()` method on the ExcelBuilder instance : + +```ts twoslash +// @noErrors +import { ExcelBuilder } from '@chronicstone/typed-xlsx' +// ---cut-before--- +const excelFile = ExcelBuilder.create() + .sheet('Sheet1') + .addTable({ data, schema, }) + .build({ output: 'buffer' }) +``` + +## Parameters + +### `output` +- **Description:** Specifies the format of the output. +- **Type:** `'buffer' | 'workbook' | 'base64' | 'file'` +- **Required:** Yes +- **Example:** + ```ts twoslash + // @noErrors + import { ExcelBuilder } from '@chronicstone/typed-xlsx' + // ---cut-before--- + const buffer = ExcelBuilder.create() + // ^? + .sheet('Sheet1') + .addTable({ data, schema, }) + .build({ output: 'buffer' }) + + const workbook = ExcelBuilder.create() + // ^? + .sheet('Sheet1') + .addTable({ data, schema, }) + .build({ output: 'workbook' }) + + const base64 = ExcelBuilder.create() + // ^? + .sheet('Sheet1') + .addTable({ data, schema, }) + .build({ output: 'base64' }) + + const file = ExcelBuilder.create() + // ^? + .sheet('Sheet1') + .addTable({ data, schema, }) + .build({ output: 'file' }) + ``` + + +### `rtl` +- **Description:** Specifies whether the Excel file should be rendered in right-to-left (RTL) mode. +- **Type:** `boolean` +- **Required:** No +- **Default:** `false` +- **Example:** + + +```ts twoslash +// @noErrors +import { ExcelBuilder } from '@chronicstone/typed-xlsx' +// ---cut-before--- +const excelFile = ExcelBuilder.create() + .sheet('Sheet1') + .addTable({ data, schema, }) + .build({ output: 'buffer', rtl: true }) +``` + +### `extraLength` +- **Description:** Specifies the extra length each cell should be rendered with. +- **Type:** `number` +- **Required:** No +- **Default:** `10` +- **Example:** + +```ts twoslash +// @noErrors +import { ExcelBuilder } from '@chronicstone/typed-xlsx' +// ---cut-before--- +const excelFile = ExcelBuilder.create() + .sheet('Sheet1') + .addTable({ data, schema, }) + .build({ output: 'buffer', extraLength: 5 }) +``` + +### `rowHeight` +- **Description:** Specifies the height of each row in the Excel file. +- **Type:** `number` +- **Required:** No +- **Default:** `30` +- **Example:** + +```ts twoslash +// @noErrors +import { ExcelBuilder } from '@chronicstone/typed-xlsx' +// ---cut-before--- +const excelFile = ExcelBuilder.create() + .sheet('Sheet1') + .addTable({ data, schema, }) + .build({ output: 'buffer', rowHeight: 30 }) + ``` + +### `bordered` +- **Description:** Specifies whether the Excel file should have borders. +- **Type:** `boolean` +- **Required:** No +- **Default:** `true` +- **Example:** + +```ts twoslash +// @noErrors +import { ExcelBuilder } from '@chronicstone/typed-xlsx' +// ---cut-before--- +const excelFile = ExcelBuilder.create() + .sheet('Sheet1') + .addTable({ data, schema, }) + .build({ output: 'buffer', bordered: false }) \ No newline at end of file diff --git a/docs/file-builder/create-file-builder.md b/docs/file-builder/create-file-builder.md new file mode 100644 index 0000000..34e54b1 --- /dev/null +++ b/docs/file-builder/create-file-builder.md @@ -0,0 +1,52 @@ +# Create File Builder + +To construct an Excel file with `typed-xlsx`, start by creating an instance of the file builder using `ExcelBuilder`. This class facilitates the construction of Excel files through a method chaining approach that allows you to configure properties and behaviors sequentially. + +## Importing ExcelBuilder + +First, ensure that `ExcelBuilder` is imported from the `typed-xlsx` package: + +```ts twoslash +import { ExcelBuilder } from '@chronicstone/typed-xlsx' +``` + +## Creating an ExcelBuilder Instance + +To start building an Excel file, create a new instance of ExcelBuilder by calling create(). This method initializes a new Excel file builder instance: + +```ts twoslash +import { ExcelBuilder } from '@chronicstone/typed-xlsx' +// ---cut-before--- +const excelFile = ExcelBuilder.create() +``` + +## Method Chaining + +ExcelBuilder utilizes method chaining to streamline the configuration of your Excel file, to preserve type-safety and ensure consistency. + +```ts twoslash +// @noErrors +import { ExcelBuilder } from '@chronicstone/typed-xlsx' +// ---cut-before--- +const excelFile = ExcelBuilder.create() + .sheet('Sheet1') + .addTable({ data, schema, }) + .build({ output: 'buffer' }) +``` + +## Multiple Sheets + +In typed-xlsx, you can define multiple sheets in a single workbook. You just need to chain the method calls for each sheet you want to add: + +```ts twoslash +// @noErrors +import { ExcelBuilder } from '@chronicstone/typed-xlsx' +// ---cut-before--- +const excelFile = ExcelBuilder.create() + .sheet('Sheet1') + .addTable({ data, schema, }) + .sheet('Sheet2') + .addTable({ data, schema, }) + .build({ output: 'buffer' }) +``` + diff --git a/docs/file-builder/define-sheets.md b/docs/file-builder/define-sheets.md index dd5231d..9ac986f 100644 --- a/docs/file-builder/define-sheets.md +++ b/docs/file-builder/define-sheets.md @@ -1 +1,37 @@ # Define Sheets + +In `typed-xlsx`, sheets in an Excel workbook are defined using the `.sheet()` method on an `ExcelBuilder` instance. This method allows you to configure individual sheets with specific settings that control the layout and organization of tables within the sheet. + +## Method Usage + +To add a sheet to your Excel workbook, call the `.sheet()` method with the name of the sheet as the first argument. This name will appear as the tab name in the Excel file: + +```ts twoslash +import { ExcelBuilder } from '@chronicstone/typed-xlsx' +// ---cut-before--- +const workbook = ExcelBuilder.create() + .sheet('Sales Data') + ``` + + ## Optional Parameters + +The `.sheet()` method accepts a second optional parameter, an object that allows you to specify additional settings for how tables are laid out within the sheet: + +- **tableSeparatorWidth** (`number`): Defines the width of the separator between tables when multiple tables are placed on a single sheet. This is measured in Excel's column width units. +- **tablesPerRow** (`number`): Specifies the number of tables to display in a single row. This is useful for organizing multiple tables side by side within the same sheet. + +### Example with Optional Parameters + +Hereโ€™s how to use these optional parameters to customize the layout of tables in a sheet: + +```ts twoslash +import { ExcelBuilder } from '@chronicstone/typed-xlsx' +// ---cut-before--- +const workbook = ExcelBuilder.create() + .sheet('Financial Overview', { + tableSeparatorWidth: 2, // Adds a gap equivalent to 2 columns between tables + tablesPerRow: 2 // Places two tables per row + }) +``` + +In this example, the sheet named "Financial Overview" is configured to place two tables per row, separated by a width equivalent to two standard Excel columns. \ No newline at end of file diff --git a/docs/file-builder/define-tables.md b/docs/file-builder/define-tables.md index 5a8d76a..7bc0ed8 100644 --- a/docs/file-builder/define-tables.md +++ b/docs/file-builder/define-tables.md @@ -1 +1,171 @@ # Define Tables + +In `typed-xlsx`, tables within a sheet are defined to organize and display data effectively. Each table can be customized with various properties to control its presentation and behavior. Here's a detailed look at each property and how to use them: + +## Table Properties + +### `schema` +- **Description:** The `ExcelSchemaBuilder` schema you want to use for the table. +- **Type:** `ExcelSchema` +- **Required:** Yes + +```ts twoslash +import { ExcelBuilder, ExcelSchemaBuilder } from '@chronicstone/typed-xlsx' +// ---cut-before--- +const userSchema = ExcelSchemaBuilder.create<{ firstName: string, lastName: string }>() + .column('firstName', { key: 'firstName' }) + .column('lastName', { key: 'lastName' }) + .build() + +const file = ExcelBuilder.create() + .sheet('Users') + .addTable({ + data: [] as Array<{ firstName: string, lastName: string }>, + schema: userSchema, + }) + .build({ output: 'buffer' }) +``` + +### data +- **Description:** The data to be displayed in the table. +- **Type:** `T[]` +- **Required:** Yes + +```ts twoslash +import { ExcelBuilder, ExcelSchemaBuilder } from '@chronicstone/typed-xlsx' +// ---cut-before--- +const userSchema = ExcelSchemaBuilder.create<{ firstName: string, lastName: string }>() + .column('firstName', { key: 'firstName' }) + .column('lastName', { key: 'lastName' }) + .build() + +const file = ExcelBuilder.create() + .sheet('Users') + .addTable({ + data: [{ firstName: 'John', lastName: 'Doe' }], + schema: userSchema, + }) + .build({ output: 'buffer' }) +``` + +### select +- **Description:** A map of column keys to boolean values that determines which columns to include in the table. +- **Type:** `{ [key in ColKeys]?: boolean }` +- **Required:** No + +```ts twoslash +import { ExcelBuilder, ExcelSchemaBuilder } from '@chronicstone/typed-xlsx' +// ---cut-before--- +const userSchema = ExcelSchemaBuilder.create<{ firstName: string, lastName: string }>() + .column('firstName', { key: 'firstName' }) + .column('lastName', { key: 'lastName' }) + .build() + +const file = ExcelBuilder.create() + .sheet('Users') + .addTable({ + data: [{ firstName: 'John', lastName: 'Doe' }], + schema: userSchema, + select: { firstName: true }, + // There are thruthy values, so only columns set to true will be returned (firstName and lastName) are included + }) + .addTable({ + data: [{ firstName: 'John', lastName: 'Doe' }], + schema: userSchema, + select: { firstName: false }, + // All values are false, so ALL columns are included except firstName + }) + .build({ output: 'buffer' }) +``` + +### context +- **Description:** A map of column keys to values that can be used to dynamically generate the table. +- **Type:** `{ [Key in GroupColKey]: GroupColumnContext[Key] }` +- **Required:** Depends on the schema & selected columns + +```ts twoslash +// @errors: 2741 +import { ExcelBuilder, ExcelSchemaBuilder } from '@chronicstone/typed-xlsx' +// ---cut-before--- + +interface Organization { id: string, name: string } + +const userSchema = ExcelSchemaBuilder.create<{ firstName: string, lastName: string, organizations: Organization[] }>() + .column('firstName', { key: 'firstName' }) + .column('lastName', { key: 'lastName' }) + .group('group:org', (builder, context: Organization[]) => { + for (const org of context) { + builder + .column(`orga-${org.id}`, { + label: `User in ${org.name}`, + key: 'organizations', + transform: orgs => orgs.some(o => o.id === org.id) ? 'YES' : 'NO', + cellStyle: data => ({ + font: { + color: { rgb: data.organizations.some(o => o.id === org.id) + ? '61eb34' + : 'd10808' }, + }, + }), + }) + } + }) + .build() + +const organizations: Organization[] = [{ id: '1', name: 'Org 1' }, { id: '2', name: 'Org 2' }, { id: '3', name: 'Org 3' }] + +const file = ExcelBuilder.create() + .sheet('Users') + .addTable({ + data: [{ firstName: 'John', lastName: 'Doe', organizations: [{ id: '1', name: 'Org 1' }] }], + schema: userSchema, + context: { }, + }) + .build({ output: 'buffer' }) +``` + + +### summary +- **Description:** Enable or disable the summary of the table. +- **Type:** `boolean` +- **Required:** No + +```ts twoslash +import { ExcelBuilder, ExcelSchemaBuilder } from '@chronicstone/typed-xlsx' +const schema = ExcelSchemaBuilder.create<{ firstName: string, lastName: string }>() + .column('firstName', { key: 'firstName' }) + .column('lastName', { key: 'lastName' }) + .build() + +const data: Array<{ firstName: string, lastName: string }> = [] + +// ---cut-before--- +const file = ExcelBuilder.create() + .sheet('Users') + .addTable({ data, schema, summary: false, }) + // The summary is disabled, so the table will not have a summary + .build({ output: 'buffer' }) +``` + +## Multiple Tables per Sheets + +In typed-xlsx, you can define multiple tables per sheet, arranged in various layouts. Below is an example of displaying four tables, arranged in a row of two: + +```ts twoslash +import { ExcelBuilder, ExcelSchemaBuilder } from '@chronicstone/typed-xlsx' +const schema = ExcelSchemaBuilder.create<{ firstName: string, lastName: string }>() + .column('firstName', { key: 'firstName' }) + .column('lastName', { key: 'lastName' }) + .build() + +const data: Array<{ firstName: string, lastName: string }> = [] + +// ---cut-before--- +const file = ExcelBuilder.create() + .sheet('Users', { tablesPerRow: 2 }) + .addTable({ data, schema, title: 'Table 1', }) + .addTable({ data, schema, title: 'Table 2', }) + .addTable({ data, schema, title: 'Table 3', }) + .addTable({ data, schema, title: 'Table 4', }) + .build({ output: 'buffer' }) +``` \ No newline at end of file diff --git a/docs/getting-started/installation.md b/docs/getting-started/installation.md index 48c5ea9..7bc6d5d 100644 --- a/docs/getting-started/installation.md +++ b/docs/getting-started/installation.md @@ -1,6 +1,65 @@ ---- -layout: doc ---- - # Installation +To install `typed-xlsx` into your project, follow these straightforward steps: + +## 1. Install the package + +Choose your preferred package manager and run the corresponding command to add `typed-xlsx` to your project: + +::: code-group +```sh [npm] +npm install @chronicstone/typed-xlsx +``` + +```sh [yarn] +yarn add @chronicstone/typed-xlsx +``` + +```sh [pnpm] +pnpm add @chronicstone/typed-xlsx +``` + +```sh [bun] +bun add @chronicstone/typed-xlsx +``` +::: + +## 2. Import the library + +With the package installed, you can now import `ExcelBuilder` and `ExcelSchemaBuilder` into your project: + +```ts twoslash +// @errors: 2345 +import { ExcelBuilder, ExcelSchemaBuilder } from '@chronicstone/typed-xlsx' + +interface User { + id: number + name: string + email: string + posts: Array<{ + id: number + title: string + likes: number + }> +} + +const schema = ExcelSchemaBuilder.create() + .column('ID', { key: 'id' }) + .column('Name', { key: 'name' }) + .column('Email', { key: 'email' }) + .column('Posts.ID', { key: 'posts', transform: row => row.map(post => post.id) }) + .column('Posts.Title', { key: 'posts', transform: row => row.map(post => post.title) }) + .column('Posts.Likes', { key: 'posts', transform: row => row.map(post => post.likes) }) + .build() + +const users: User[] = [] +const excelFile = ExcelBuilder.create() + .sheet('Sheet1') + .addTable({ + data: users, + schema, + }) + .build({ output: 'buffer' }) +``` + +After completing these steps, `typed-xlsx` will be set up and ready to generate sophisticated Excel reports with ease. diff --git a/docs/getting-started/key-benefits-why.md b/docs/getting-started/key-benefits-why.md index 188fcd6..3bd15ce 100644 --- a/docs/getting-started/key-benefits-why.md +++ b/docs/getting-started/key-benefits-why.md @@ -1 +1,40 @@ # Key Benefits & Why + +`typed-xlsx` aims to transform the complexity of generating type-safe and feature-rich Excel reports in TypeScript into a simplified and efficient process. This document outlines the core advantages of adopting `typed-xlsx` for your reporting needs. + +## Overcoming Common Challenges + +### The Complexity of Excel Report Generation +Creating Excel reports in TypeScript often entails a steep learning curve and extensive coding due to the low-level nature of powerful libraries like SheetJs. While these libraries are powerful, their complexity can overshadow their utility, making them less developer-friendly. + +### Custom Wrappers: A Time Sink +In a typical scenario, developers find themselves writing extensive custom wrappers to make the existing libraries more accessible and to provide essential features that aren't available out-of-the-box. This process is time-consuming and detracts from the actual goal of report generation. + +## The `typed-xlsx` Advantage + +### High-Level API with Essential Features +`typed-xlsx` addresses these pain points by offering a high-level API that wraps SheetJs, retaining its robust capabilities while greatly improving type-safety and the developer experience. It comes equipped with essential features needed for modern report generation, including: + +- **Multi-Sheet Support:** Organize complex data sets across multiple sheets within a single workbook. +- **Multi-Tables Per Sheet:** Easily manage and display multiple data tables on individual sheets. +- **Enhanced Cell Styling and Formatting:** Apply styles and formats to cells directly within your TypeScript code. +- **Type-Safe Data Serialization & Validation:** Ensure that your data adheres to expected types, reducing errors and improving report reliability. +- **Automated Column Summaries:** Generate summaries for data columns, facilitating quick analysis and insights. +- And many more... + +### Developer Experience Focused +`typed-xlsx` is designed with the developer in mind, simplifying the API and abstracting the complexities, which results in: + +- A cleaner and more intuitive codebase. +- Reduced development time thanks to easy-to-use features. +- An overall improvement in code maintainability and readability. + +## Selecting the Right Tool for the Job + +While `typed-xlsx` provides a comprehensive solution for Excel report generation, it's essential to consider the scope of your project when selecting a library. + +### Dynamic Reports and Lower-Level Libraries +If your project involves generating highly dynamic reports with unknown data and structures, lower-level libraries like SheetJs might be the preferred tool due to their extensive configurability and direct control over the Excel features. + +### Structured Data and Rapid Development +For projects with well-defined data structures, `typed-xlsx` excels by enabling developers to create high-quality, aesthetically pleasing reports with speed and type-safety. It's all about building reports 100x faster without compromising on quality or safety. diff --git a/docs/index.md b/docs/index.md index 84ef834..81d41c1 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,13 +1,16 @@ --- layout: home +title: Feature-rich Type-safe Excel Reporting hero: name: "Typed-xlsx" text: "Feature-rich Type-safe Excel Reporting" tagline: "Craft complex Excel reports with ease in a type-safe manner." image: - src: /images/logo.png + src: /images/logo.svg alt: Typed-xlsx + style: + margin-left: 50px actions: - theme: brand text: Get Started @@ -18,34 +21,37 @@ hero: features: - title: Type-safe Schema Builder - details: Construct spreadsheet schemas with TypeScript, ensuring the structure of your reports matches the data types they represent. + details: Construct type-safe spreadsheet schemas with TypeScript icon: "๐Ÿ› " - title: Dynamic Cell Styling/Formatting - details: Tailor cell styles and formats dynamically, allowing per-row customization that responds to your data. + details: Tailor cell styles and formats dynamically, allowing advanced per-row customization icon: "๐ŸŽจ" - title: Multi-sheet Support - details: Manage complex datasets easily with support for multiple sheets within a single workbook, organizing data logically and efficiently. + details: Manage complex datasets easily with support for multiple sheets within a single workbook icon: "๐Ÿ“‘" - title: Advanced Row Structures - details: Leverage sophisticated row layouts that support sub-rows and automatic merging, presenting intricate data in a clear, hierarchical format. + details: Leverage sophisticated row layouts that support sub-rows and automatic merging icon: "๐Ÿงฉ" - title: Serializing Complex Data Types - details: Serialize arrays, booleans, and more with type-safe methods, transforming your raw data into a user-friendly Excel format. + details: Serialize arrays, booleans, and more in a 100% type-safe way icon: "๐Ÿ”„" - title: Easy Default Value Management - details: Set and manage default values for your cells effortlessly, ensuring consistency and clarity in reports lacking certain data points. + details: Simple default / fallback values management for your cells icon: "๐ŸŽฏ" - title: Multiple Tables Per Sheet - details: Include numerous tables on a single sheet, complete with dynamic layouts whether linear or grid-like, catering to diverse reporting needs. + details: Include numerous tables on a single sheet, with deep layout customization (linear or grid-like) icon: "๐Ÿ—๏ธ" - title: Dynamic Column Mapping - details: Map your data fields to columns with contextual type-safety, providing a seamless transition from database to spreadsheet. + details: Use type-safe context to generate columns based on your data icon: "๐Ÿ—บ๏ธ" - title: Column Summaries - details: Automatically calculate and insert column summaries to analyze data at a glance, saving time and adding analytical value to your spreadsheets. + details: Automatically calculate and insert column summaries to analyze data at a glance icon: "๐Ÿงฎ" footer: message: "Licensed under the MIT License. Created by Cyprien Thao. Extendable and customizable for developers." --- + +::: code-sandbox {template=vue3-ts} +::: diff --git a/docs/public/images/logo.svg b/docs/public/images/logo.svg new file mode 100644 index 0000000..f4e5696 --- /dev/null +++ b/docs/public/images/logo.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/schema-builder/build-schema.md b/docs/schema-builder/build-schema.md index 783ef3d..3abde2f 100644 --- a/docs/schema-builder/build-schema.md +++ b/docs/schema-builder/build-schema.md @@ -1 +1,18 @@ # Build Schema + +To finalize your schema definition in `typed-xlsx`, simply call the `.build()` method after defining all your columns. This method compiles the schema and prepares it for use in generating Excel reports. + +## Example + +Here's how you complete a schema setup: + +```ts twoslash +import { ExcelSchemaBuilder } from '@chronicstone/typed-xlsx' + +const schema = ExcelSchemaBuilder.create<{ firstName: string, lastName: string }>() + .column('firstName', { key: 'firstName' }) + .column('lastName', { key: 'lastName' }) + .build() // Finalize the schema +``` + +The .build() method finalizes the schema configuration and ensures it is ready for use with ExcelBuilder to generate Excel files. It's essential to call .build() after all columns are added to lock in the configuration and prevent further modifications. \ No newline at end of file diff --git a/docs/schema-builder/columns.md b/docs/schema-builder/columns.md index 1be3abf..8a7bc77 100644 --- a/docs/schema-builder/columns.md +++ b/docs/schema-builder/columns.md @@ -1 +1,139 @@ -# Columns +# Define Column + +In `typed-xlsx`, defining a column is a straightforward process that sets the foundation for the structure of your Excel report. Let's go through the syntax and the properties you can define for a column. + +## Column Syntax + +To define a column, use the `column` method provided by `ExcelSchemaBuilder`: + +```ts twoslash +import { ExcelSchemaBuilder } from '@chronicstone/typed-xlsx' + +// Instantiate a schema with a single column +const schema = ExcelSchemaBuilder.create<{ firstName: string }>() + .column('First Name', { key: 'firstName' }) +``` + +## Column Properties + +Each column in `typed-xlsx` can be configured with a variety of properties to fine-tune its behavior and presentation: + +## Label (optional) + +The `label` property specifies the column's header text in the Excel file. + +```ts twoslash +import { ExcelSchemaBuilder } from '@chronicstone/typed-xlsx' +// ---cut-before--- + +ExcelSchemaBuilder.create<{ firstName: string, lastName: string }>() + .column('First Name', { key: 'firstName', label: 'First Name' }) +``` + +## Key (required) + +The `key` property is a path to the value in the data object. It can also be a nested path, supporting deep access to the value. + +```ts twoslash +import { ExcelSchemaBuilder } from '@chronicstone/typed-xlsx' +// ---cut-before--- +ExcelSchemaBuilder.create<{ personal: { firstName: string, lastName: string } }>() + .column('First Name', { key: 'personal.firstName' }) // For nested objects +``` + +If the key points to an array, `typed-xlsx` automatically handles sub-rows and merging. + +```ts twoslash +import { ExcelSchemaBuilder } from '@chronicstone/typed-xlsx' +// ---cut-before--- +ExcelSchemaBuilder.create<{ aliases: string[] }>() + .column('Aliases', { key: 'aliases' }) +``` + +## Transform (optional) + +The `transform` property allows you to specify how to process the data before it's output to the cell. + +```ts twoslash +import { ExcelSchemaBuilder } from '@chronicstone/typed-xlsx' +// ---cut-before--- +ExcelSchemaBuilder.create<{ isActive: boolean, name: { first: string, last: string } }>() + .withTransformers({ booleanToString: (value: boolean) => value ? 'Yes' : 'No' }) +// Using a shared transformer + .column('Active', { key: 'isActive', transform: 'booleanToString' }) + +// Using a custom transformer function + .column('Full Name', { + key: 'name', + transform: name => `${name.first} ${name.last}` + }) +``` + +If the key points to a non-primitive value, which can't be serialized into a cell value, transformer will be necessary, and required by typescript : + +```ts twoslash +// @errors: 2345 +import { ExcelSchemaBuilder } from '@chronicstone/typed-xlsx' +// ---cut-before--- + +ExcelSchemaBuilder.create<{ name: { first: string, last: string } }>() + .column('Full Name', { + key: 'name', + }) +``` + +## Default (optional) + +The `default` property sets a fallback value for the cell if the original value is `undefined`. + +```ts twoslash +import { ExcelSchemaBuilder } from '@chronicstone/typed-xlsx' +// ---cut-before--- +ExcelSchemaBuilder.create<{ middleName: string }>() + .column('Middle Name', { key: 'middleName', default: 'N/A' }) +``` + +##Format (optional) + +The `format` property specifies the cell format, such as for currency or dates. + +```ts twoslash +import { ExcelSchemaBuilder } from '@chronicstone/typed-xlsx' +// ---cut-before--- +ExcelSchemaBuilder.create<{ salary: number }>() + .column('Salary', { key: 'salary', format: '$#,##0.00;[Red]-$#,##0.00' }) +``` + +## CellStyle (optional) + +Define the style for the cell, either as a static `CellStyle` object or a function for dynamic styling. + +```ts twoslash +import { ExcelSchemaBuilder } from '@chronicstone/typed-xlsx' +// ---cut-before--- + +ExcelSchemaBuilder.create<{ status: string }>() + .column('Status', { + key: 'status', + cellStyle: { fill: { fgColor: { rgb: 'FFFF00' } } } + // ^? + }) +``` + +## Summary (optional) + +Summaries provide aggregate information at the end of the table. + +```ts twoslash +import { ExcelSchemaBuilder } from '@chronicstone/typed-xlsx' +// ---cut-before--- +ExcelSchemaBuilder.create<{ value: number }>() + .column('Total', { + key: 'value', + summary: [{ + value: rows => rows.reduce((sum, row) => sum + row.value, 0) + }] + }) +``` + +By setting these properties, you can tailor each column to fit the specific needs of your report, ensuring both the data integrity and the aesthetic quality of the final output. diff --git a/docs/schema-builder/create-schema.md b/docs/schema-builder/create-schema.md new file mode 100644 index 0000000..f509d50 --- /dev/null +++ b/docs/schema-builder/create-schema.md @@ -0,0 +1,48 @@ +# Create Schema + +Creating a well-defined schema is crucial for generating consistent and type-safe Excel reports. `ExcelSchemaBuilder` is a class provided by `typed-xlsx` that enables you to construct such schemas with ease. + +## What is ExcelSchemaBuilder? + +`ExcelSchemaBuilder` is a builder class designed to create a type-safe schema that represents the structure of the tables you plan to export to an Excel file. + +## Instantiating a Schema + +To begin defining a schema, instantiate an `ExcelSchemaBuilder` object using the `create` method. You need to provide a type parameter that describes the shape of the data you'll be working with. + +Here's how to instantiate a schema for a table with `firstName` and `lastName` fields: + +```ts twoslash +import { ExcelSchemaBuilder } from '@chronicstone/typed-xlsx' +// @noErrors +const schema = ExcelSchemaBuilder.create() +``` + +## Method Chaining + +`ExcelSchemaBuilder` utilizes method chaining to define each column of your schema. This approach is necessary to provide type-safety and ensure that your schema is well-defined and consistent. + +Here's an example of what not to do: + +```ts twoslash +import { ExcelSchemaBuilder } from '@chronicstone/typed-xlsx' +// ---cut-before--- +const schema = ExcelSchemaBuilder.create<{ firstName: string, lastName: string }>() +schema.column('firstName', { key: 'firstName' }) +// DUPLICATE COLUMN KEY, BUT NO TYPESCRIPT ERROR +schema.column('firstName', { key: 'firstName' }) +``` + +Instead, chain the method calls like this: + +```ts twoslash +// @errors: 2345 +import { ExcelSchemaBuilder } from '@chronicstone/typed-xlsx' +// ---cut-before--- +const schema = ExcelSchemaBuilder.create<{ firstName: string, lastName: string }>() + .column('firstName', { key: 'firstName' }) + // WILL THROW ERROR, KEY ALREADY EXISTS + .column('firstName', { key: 'firstName' }) +``` + + diff --git a/docs/schema-builder/dynamic-columns.md b/docs/schema-builder/dynamic-columns.md index 2eda578..04a16c1 100644 --- a/docs/schema-builder/dynamic-columns.md +++ b/docs/schema-builder/dynamic-columns.md @@ -1 +1,39 @@ # Dynamic Columns + +In `typed-xlsx`, dynamic columns allow for the creation of multiple columns based on runtime context, providing a powerful way to tailor your Excel reports to specific data sets. This feature is particularly useful when the structure of your output depends on data that isn't known until the time of file generation. + +## How Dynamic Columns Work + +Dynamic columns are defined using the `group` method of `ExcelSchemaBuilder`. This method takes a unique group identifier and a callback function. The callback function is called with an instance of `ExcelSchemaBuilder` and the context data, allowing you to dynamically generate columns based on this context. + + +### Defining Dynamic Columns + +To define dynamic columns, you provide a context which is injected when building the actual file with `ExcelBuilder`. The context can be of any type you define, and it will be enforced when passing data to ensure type safety. Group column key must always be prefixed with `group:`. + +```ts twoslash +import { ExcelSchemaBuilder } from '@chronicstone/typed-xlsx' +// ---cut-before--- +interface Organization { id: string, name: string } +interface User { id: string, name: string, organizations: Organization[] } + +// Group definition within the schema +ExcelSchemaBuilder.create() + .column('id', { key: 'id' }) + .column('name', { key: 'name' }) + .group('group:org', (builder, context: Organization[]) => { + for (const org of context) { + builder + .column(`orga-${org.id}`, { + label: `User in ${org.name}`, + key: 'organizations', + transform: orgs => orgs.some(o => o.id === org.id) ? 'YES' : 'NO', + cellStyle: data => ({ + font: { + color: { rgb: data.organizations.some(o => o.id === org.id) ? '61eb34' : 'd10808' }, + }, + }), + }) + } + }) +``` \ No newline at end of file diff --git a/docs/schema-builder/global-transformers.md b/docs/schema-builder/global-transformers.md index 68165d3..c2be256 100644 --- a/docs/schema-builder/global-transformers.md +++ b/docs/schema-builder/global-transformers.md @@ -1 +1,40 @@ # Global Transformers + +Global transformers are functions that can be registered when creating a schema builder. They can then be used to transform values with the `transform` property of a column, simply by referencing the function name. + +```ts twoslash +// @noErrors +import { ExcelSchemaBuilder } from '@chronicstone/typed-xlsx' +// ---cut-before--- +const schema = ExcelSchemaBuilder.create<{ firstName: string, lastName: string, countries: string[] }>() + .withTransformers({ + uppercase: (value: string) => value.toUpperCase(), + lowercase: (value: string) => value.toLowerCase(), + listArray: (value: string[]) => value.join(', '), + listArrayUppercase: (value: string[]) => value.map(v => v.toUpperCase()).join(', '), + }) + .column('firstName', { key: 'firstName', transform: 'uppercase' }) + .column('lastName', { key: 'lastName', transform: 'lowercase' }) + .column('countries', { key: 'countries', transform: '' }) +// ^| +``` + +## Reusable Transformers + +You can also define reusable transformers that can be used across multiple schemas : + +```ts twoslash +import { ExcelSchemaBuilder } from '@chronicstone/typed-xlsx' + +const transformers = { + uppercase: (value: string) => value.toUpperCase(), + lowercase: (value: string) => value.toLowerCase(), + listArray: (value: string[]) => value.join(', '), +} as const + +const schema = ExcelSchemaBuilder.create<{ firstName: string, lastName: string, countries: string[] }>() + .withTransformers(transformers) + .column('firstName', { key: 'firstName', transform: 'uppercase' }) + .column('lastName', { key: 'lastName', transform: 'lowercase' }) + .column('countries', { key: 'countries', transform: 'listArray' }) +``` \ No newline at end of file diff --git a/eslint.config.js b/eslint.config.js index 64149c8..0f91d02 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -4,12 +4,12 @@ import antfu from '@antfu/eslint-config' export default antfu( { ignores: [ - // eslint ignore globs here + '*.md', ], }, { rules: { - // overrides + 'line-comment-position': 'off', }, }, ) diff --git a/package.json b/package.json index 777cc7e..736ee61 100644 --- a/package.json +++ b/package.json @@ -66,13 +66,17 @@ "eslint": "^8.54.0", "esno": "^4.0.0", "lint-staged": "^15.1.0", + "markdown-it-container": "^4.0.0", "pnpm": "^8.11.0", "rimraf": "^5.0.5", "simple-git-hooks": "^2.9.0", "typescript": "^5.3.2", "unbuild": "^2.0.0", + "unocss": "^0.59.4", "vite": "^5.0.4", "vitepress": "1.1.3", + "vitepress-plugin-nprogress": "^0.0.4", + "vitepress-plugin-sandpack": "^1.1.4", "vitest": "^1.0.0-beta.6" }, "simple-git-hooks": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 74cb961..6ae95b2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -51,6 +51,9 @@ importers: lint-staged: specifier: ^15.1.0 version: 15.1.0 + markdown-it-container: + specifier: ^4.0.0 + version: 4.0.0 pnpm: specifier: ^8.11.0 version: 8.11.0 @@ -66,12 +69,21 @@ importers: unbuild: specifier: ^2.0.0 version: 2.0.0(typescript@5.3.2) + unocss: + specifier: ^0.59.4 + version: 0.59.4(postcss@8.4.38)(rollup@3.28.1)(vite@5.0.4) vite: specifier: ^5.0.4 version: 5.0.4(@types/node@20.10.1) vitepress: specifier: 1.1.3 - version: 1.1.3(@algolia/client-search@4.23.3)(@types/node@20.10.1)(search-insights@2.13.0)(typescript@5.3.2) + version: 1.1.3(@algolia/client-search@4.23.3)(@types/node@20.10.1)(postcss@8.4.38)(search-insights@2.13.0)(typescript@5.3.2) + vitepress-plugin-nprogress: + specifier: ^0.0.4 + version: 0.0.4 + vitepress-plugin-sandpack: + specifier: ^1.1.4 + version: 1.1.4(@lezer/common@1.2.1)(vite@5.0.4)(vitepress@1.1.3)(vue@3.4.24) vitest: specifier: ^1.0.0-beta.6 version: 1.0.0-beta.6(@types/node@20.10.1) @@ -241,6 +253,14 @@ packages: '@jridgewell/trace-mapping': 0.3.17 dev: true + /@ampproject/remapping@2.3.0: + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + dev: true + /@antfu/eslint-config@2.1.2(eslint@8.54.0)(typescript@5.3.2)(vitest@1.0.0-beta.6): resolution: {integrity: sha512-eOkXtRcj3pAqkdbqNYEBUgFKTcDYYwAAAnGEs+DTTcJJJReIlrPx4WJIE02whOsi+5oKcJ7EK/swS6PcdcCIog==} hasBin: true @@ -309,6 +329,13 @@ packages: engines: {node: '>=18.0.0', npm: '>=9.0.0', pnpm: '>= 8.6.0'} dev: true + /@antfu/install-pkg@0.1.1: + resolution: {integrity: sha512-LyB/8+bSfa0DFGC06zpCEfs89/XoWZwws5ygEa5D+Xsm3OfI+aXQ86VgVG7Acyef+rSZ5HE7J8rrxzrQeM3PjQ==} + dependencies: + execa: 5.1.1 + find-up: 5.0.0 + dev: true + /@antfu/install-pkg@0.3.0: resolution: {integrity: sha512-hzTVgEFGBBMXUjsNhIRDdt9jvAkZzPbMLQW8q2wXz455+1zxGFtM0nxPl2pukFWHXcC/Bn/UCHV9rd0+pwYsmw==} dependencies: @@ -325,6 +352,10 @@ packages: resolution: {integrity: sha512-pvFiLP2BeOKA/ZOS6jxx4XhKzdVLHDhGlFEaZ2flWWYf2xOqVniqpk38I04DFRyz+L0ASggl7SkItTc+ZLju4w==} dev: true + /@antfu/utils@0.7.7: + resolution: {integrity: sha512-gFPqTG7otEJ8uP6wrhDv6mqwGWYZKNvAcCq6u9hOj0c+IKCEsY4L1oC9trPq2SaWIzAfHvqfBDxF591JkMf+kg==} + dev: true + /@babel/code-frame@7.22.13: resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} engines: {node: '>=6.9.0'} @@ -333,11 +364,24 @@ packages: chalk: 2.4.2 dev: true + /@babel/code-frame@7.24.2: + resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.24.2 + picocolors: 1.0.0 + dev: true + /@babel/compat-data@7.22.9: resolution: {integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==} engines: {node: '>=6.9.0'} dev: true + /@babel/compat-data@7.24.4: + resolution: {integrity: sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==} + engines: {node: '>=6.9.0'} + dev: true + /@babel/core@7.22.11: resolution: {integrity: sha512-lh7RJrtPdhibbxndr6/xx0w8+CVlY5FJZiaSz908Fpy+G0xkBFTvwLcKJFF4PJxVfGhVWNebikpWGnOoC71juQ==} engines: {node: '>=6.9.0'} @@ -361,6 +405,29 @@ packages: - supports-color dev: true + /@babel/core@7.24.4: + resolution: {integrity: sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.0 + '@babel/code-frame': 7.24.2 + '@babel/generator': 7.24.4 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4) + '@babel/helpers': 7.24.4 + '@babel/parser': 7.24.4 + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.1 + '@babel/types': 7.24.0 + convert-source-map: 2.0.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/generator@7.22.10: resolution: {integrity: sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==} engines: {node: '>=6.9.0'} @@ -371,6 +438,23 @@ packages: jsesc: 2.5.2 dev: true + /@babel/generator@7.24.4: + resolution: {integrity: sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + dev: true + + /@babel/helper-annotate-as-pure@7.22.5: + resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.11 + dev: true + /@babel/helper-compilation-targets@7.22.10: resolution: {integrity: sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==} engines: {node: '>=6.9.0'} @@ -382,6 +466,40 @@ packages: semver: 6.3.1 dev: true + /@babel/helper-compilation-targets@7.23.6: + resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.24.4 + '@babel/helper-validator-option': 7.23.5 + browserslist: 4.23.0 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: true + + /@babel/helper-create-class-features-plugin@7.24.4(@babel/core@7.24.4): + resolution: {integrity: sha512-lG75yeuUSVu0pIcbhiYMXBXANHrpUPaOfu7ryAzskCgKUHuAxRQI5ssrtmF0X9UXldPlvT0XM/A4F44OXRt6iQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.4) + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + semver: 6.3.1 + dev: true + + /@babel/helper-environment-visitor@7.22.20: + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + engines: {node: '>=6.9.0'} + dev: true + /@babel/helper-environment-visitor@7.22.5: resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} engines: {node: '>=6.9.0'} @@ -395,6 +513,14 @@ packages: '@babel/types': 7.22.11 dev: true + /@babel/helper-function-name@7.23.0: + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.24.0 + '@babel/types': 7.24.0 + dev: true + /@babel/helper-hoist-variables@7.22.5: resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} @@ -402,6 +528,13 @@ packages: '@babel/types': 7.22.11 dev: true + /@babel/helper-member-expression-to-functions@7.23.0: + resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + dev: true + /@babel/helper-module-imports@7.22.5: resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} engines: {node: '>=6.9.0'} @@ -409,6 +542,13 @@ packages: '@babel/types': 7.22.11 dev: true + /@babel/helper-module-imports@7.24.3: + resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + dev: true + /@babel/helper-module-transforms@7.22.9(@babel/core@7.22.11): resolution: {integrity: sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==} engines: {node: '>=6.9.0'} @@ -423,6 +563,44 @@ packages: '@babel/helper-validator-identifier': 7.22.20 dev: true + /@babel/helper-module-transforms@7.23.3(@babel/core@7.24.4): + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.24.3 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + dev: true + + /@babel/helper-optimise-call-expression@7.22.5: + resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.11 + dev: true + + /@babel/helper-plugin-utils@7.24.0: + resolution: {integrity: sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-replace-supers@7.24.1(@babel/core@7.24.4): + resolution: {integrity: sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + dev: true + /@babel/helper-simple-access@7.22.5: resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} engines: {node: '>=6.9.0'} @@ -430,6 +608,13 @@ packages: '@babel/types': 7.22.11 dev: true + /@babel/helper-skip-transparent-expression-wrappers@7.22.5: + resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.11 + dev: true + /@babel/helper-split-export-declaration@7.22.6: resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} engines: {node: '>=6.9.0'} @@ -441,6 +626,11 @@ packages: resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} engines: {node: '>=6.9.0'} + /@babel/helper-string-parser@7.24.1: + resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} + engines: {node: '>=6.9.0'} + dev: true + /@babel/helper-validator-identifier@7.22.20: resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} engines: {node: '>=6.9.0'} @@ -450,6 +640,11 @@ packages: engines: {node: '>=6.9.0'} dev: true + /@babel/helper-validator-option@7.23.5: + resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + engines: {node: '>=6.9.0'} + dev: true + /@babel/helpers@7.22.11: resolution: {integrity: sha512-vyOXC8PBWaGc5h7GMsNx68OH33cypkEDJCHvYVVgVbbxJDROYVtexSk0gK5iCF1xNjRIN2s8ai7hwkWDq5szWg==} engines: {node: '>=6.9.0'} @@ -461,6 +656,17 @@ packages: - supports-color dev: true + /@babel/helpers@7.24.4: + resolution: {integrity: sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.1 + '@babel/types': 7.24.0 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/highlight@7.22.13: resolution: {integrity: sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==} engines: {node: '>=6.9.0'} @@ -471,6 +677,16 @@ packages: js-tokens: 4.0.0 dev: true + /@babel/highlight@7.24.2: + resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.0 + dev: true + /@babel/parser@7.22.13: resolution: {integrity: sha512-3l6+4YOvc9wx7VlCSw4yQfcBo01ECA8TicQfbnCPuCEpRQrf+gTUyGdxNw+pyTUyywp6JRD1w0YQs9TpBXYlkw==} engines: {node: '>=6.0.0'} @@ -486,6 +702,65 @@ packages: dependencies: '@babel/types': 7.22.11 + /@babel/plugin-syntax-jsx@7.24.1(@babel/core@7.24.4): + resolution: {integrity: sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-typescript@7.24.1(@babel/core@7.24.4): + resolution: {integrity: sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-transform-modules-commonjs@7.24.1(@babel/core@7.24.4): + resolution: {integrity: sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4) + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-simple-access': 7.22.5 + dev: true + + /@babel/plugin-transform-typescript@7.24.4(@babel/core@7.24.4): + resolution: {integrity: sha512-79t3CQ8+oBGk/80SQ8MN3Bs3obf83zJ0YZjDmDaEZN8MqhMI760apl5z6a20kFeMXBwJX99VpKT8CKxEBp5H1g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.24.4(@babel/core@7.24.4) + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-typescript': 7.24.1(@babel/core@7.24.4) + dev: true + + /@babel/preset-typescript@7.24.1(@babel/core@7.24.4): + resolution: {integrity: sha512-1DBaMmRDpuYQBPWD8Pf/WEwCrtgRHxsZnP4mIy9G/X+hFfbI47Q2G4t1Paakld84+qsk2fSsUPMKg71jkoOOaQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-validator-option': 7.23.5 + '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-typescript': 7.24.4(@babel/core@7.24.4) + dev: true + /@babel/standalone@7.22.13: resolution: {integrity: sha512-JoI61IOKM8jJv8V4yD0HprU/Lnx3Y29bGGULdIdJgvIUS7oCWcl43gtXoLY7nrYZhZerXYncYfDtmq4wUEofcg==} engines: {node: '>=6.9.0'} @@ -500,6 +775,15 @@ packages: '@babel/types': 7.22.11 dev: true + /@babel/template@7.24.0: + resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.24.2 + '@babel/parser': 7.24.4 + '@babel/types': 7.24.0 + dev: true + /@babel/traverse@7.22.11: resolution: {integrity: sha512-mzAenteTfomcB7mfPtyi+4oe5BZ6MXxWcn4CX+h4IRJ+OOGXBrWU6jDQavkQI9Vuc5P+donFabBfFCcmWka9lQ==} engines: {node: '>=6.9.0'} @@ -518,6 +802,24 @@ packages: - supports-color dev: true + /@babel/traverse@7.24.1: + resolution: {integrity: sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.24.2 + '@babel/generator': 7.24.4 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.24.4 + '@babel/types': 7.24.0 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/types@7.22.11: resolution: {integrity: sha512-siazHiGuZRz9aB9NpHy9GOs9xiQPKnMzgdr493iI1M67vRXpnEq8ZOOKzezC5q7zwuQ6sDhdSp4SD9ixKSqKZg==} engines: {node: '>=6.9.0'} @@ -526,6 +828,128 @@ packages: '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 + /@babel/types@7.24.0: + resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.24.1 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + dev: true + + /@codemirror/autocomplete@6.16.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1): + resolution: {integrity: sha512-P/LeCTtZHRTCU4xQsa89vSKWecYv1ZqwzOd5topheGRf+qtacFgBeIMQi3eL8Kt/BUNvxUWkx+5qP2jlGoARrg==} + peerDependencies: + '@codemirror/language': ^6.0.0 + '@codemirror/state': ^6.0.0 + '@codemirror/view': ^6.0.0 + '@lezer/common': ^1.0.0 + dependencies: + '@codemirror/language': 6.10.1 + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.26.3 + '@lezer/common': 1.2.1 + dev: true + + /@codemirror/commands@6.5.0: + resolution: {integrity: sha512-rK+sj4fCAN/QfcY9BEzYMgp4wwL/q5aj/VfNSoH1RWPF9XS/dUwBkvlL3hpWgEjOqlpdN1uLC9UkjJ4tmyjJYg==} + dependencies: + '@codemirror/language': 6.10.1 + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.26.3 + '@lezer/common': 1.2.1 + dev: true + + /@codemirror/lang-css@6.2.1(@codemirror/view@6.26.3): + resolution: {integrity: sha512-/UNWDNV5Viwi/1lpr/dIXJNWiwDxpw13I4pTUAsNxZdg6E0mI2kTQb0P2iHczg1Tu+H4EBgJR+hYhKiHKko7qg==} + dependencies: + '@codemirror/autocomplete': 6.16.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1) + '@codemirror/language': 6.10.1 + '@codemirror/state': 6.4.1 + '@lezer/common': 1.2.1 + '@lezer/css': 1.1.8 + transitivePeerDependencies: + - '@codemirror/view' + dev: true + + /@codemirror/lang-html@6.4.9: + resolution: {integrity: sha512-aQv37pIMSlueybId/2PVSP6NPnmurFDVmZwzc7jszd2KAF8qd4VBbvNYPXWQq90WIARjsdVkPbw29pszmHws3Q==} + dependencies: + '@codemirror/autocomplete': 6.16.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1) + '@codemirror/lang-css': 6.2.1(@codemirror/view@6.26.3) + '@codemirror/lang-javascript': 6.2.2 + '@codemirror/language': 6.10.1 + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.26.3 + '@lezer/common': 1.2.1 + '@lezer/css': 1.1.8 + '@lezer/html': 1.3.9 + dev: true + + /@codemirror/lang-javascript@6.2.2: + resolution: {integrity: sha512-VGQfY+FCc285AhWuwjYxQyUQcYurWlxdKYT4bqwr3Twnd5wP5WSeu52t4tvvuWmljT4EmgEgZCqSieokhtY8hg==} + dependencies: + '@codemirror/autocomplete': 6.16.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1) + '@codemirror/language': 6.10.1 + '@codemirror/lint': 6.5.0 + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.26.3 + '@lezer/common': 1.2.1 + '@lezer/javascript': 1.4.14 + dev: true + + /@codemirror/language@6.10.1: + resolution: {integrity: sha512-5GrXzrhq6k+gL5fjkAwt90nYDmjlzTIJV8THnxNFtNKWotMIlzzN+CpqxqwXOECnUdOndmSeWntVrVcv5axWRQ==} + dependencies: + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.26.3 + '@lezer/common': 1.2.1 + '@lezer/highlight': 1.2.0 + '@lezer/lr': 1.4.0 + style-mod: 4.1.2 + dev: true + + /@codemirror/lint@6.5.0: + resolution: {integrity: sha512-+5YyicIaaAZKU8K43IQi8TBy6mF6giGeWAH7N96Z5LC30Wm5JMjqxOYIE9mxwMG1NbhT2mA3l9hA4uuKUM3E5g==} + dependencies: + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.26.3 + crelt: 1.0.6 + dev: true + + /@codemirror/state@6.4.1: + resolution: {integrity: sha512-QkEyUiLhsJoZkbumGZlswmAhA7CBU02Wrz7zvH4SrcifbsqwlXShVXg65f3v/ts57W3dqyamEriMhij1Z3Zz4A==} + dev: true + + /@codemirror/view@6.26.3: + resolution: {integrity: sha512-gmqxkPALZjkgSxIeeweY/wGQXBfwTUaLs8h7OKtSwfbj9Ct3L11lD+u1sS7XHppxFQoMDiMDp07P9f3I2jWOHw==} + dependencies: + '@codemirror/state': 6.4.1 + style-mod: 4.1.2 + w3c-keyname: 2.2.8 + dev: true + + /@codesandbox/nodebox@0.1.8: + resolution: {integrity: sha512-2VRS6JDSk+M+pg56GA6CryyUSGPjBEe8Pnae0QL3jJF1mJZJVMDKr93gJRtBbLkfZN6LD/DwMtf+2L0bpWrjqg==} + dependencies: + outvariant: 1.4.0 + strict-event-emitter: 0.4.6 + dev: true + + /@codesandbox/sandpack-client@2.13.8: + resolution: {integrity: sha512-IjVlqfVK0fascNyUVH9hs5UZBx4KhKtyZyDrxdiDyQBtLmgESNaFWelAf4a/PX4gJp+H+WW6/iC6KzR7XtK//w==} + dependencies: + '@codesandbox/nodebox': 0.1.8 + buffer: 6.0.3 + dequal: 2.0.3 + outvariant: 1.4.0 + static-browser-server: 1.0.3 + dev: true + + /@codesandbox/sandpack-themes@2.0.21: + resolution: {integrity: sha512-CMH/MO/dh6foPYb/3eSn2Cu/J3+1+/81Fsaj7VggICkCrmRk0qG5dmgjGAearPTnRkOGORIPHuRqwNXgw0E6YQ==} + dev: true + /@docsearch/css@3.6.0: resolution: {integrity: sha512-+sbxb71sWre+PwDK7X2T8+bhS6clcVMLwBPznX45Qu6opJcgRjAp7gYSDzVFp187J+feSj5dNBN1mJoi6ckkUQ==} dev: true @@ -1271,6 +1695,24 @@ packages: resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} dev: true + /@iconify/types@2.0.0: + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + dev: true + + /@iconify/utils@2.1.23: + resolution: {integrity: sha512-YGNbHKM5tyDvdWZ92y2mIkrfvm5Fvhe6WJSkWu7vvOFhMtYDP0casZpoRz0XEHZCrYsR4stdGT3cZ52yp5qZdQ==} + dependencies: + '@antfu/install-pkg': 0.1.1 + '@antfu/utils': 0.7.7 + '@iconify/types': 2.0.0 + debug: 4.3.4 + kolorist: 1.8.0 + local-pkg: 0.5.0 + mlly: 1.6.1 + transitivePeerDependencies: + - supports-color + dev: true + /@isaacs/cliui@8.0.2: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -1307,6 +1749,15 @@ packages: '@jridgewell/trace-mapping': 0.3.17 dev: true + /@jridgewell/gen-mapping@0.3.5: + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 + dev: true + /@jridgewell/resolve-uri@3.1.0: resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} engines: {node: '>=6.0.0'} @@ -1317,6 +1768,11 @@ packages: engines: {node: '>=6.0.0'} dev: true + /@jridgewell/set-array@1.2.1: + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + dev: true + /@jridgewell/sourcemap-codec@1.4.14: resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} dev: true @@ -1331,6 +1787,13 @@ packages: '@jridgewell/sourcemap-codec': 1.4.14 dev: true + /@jridgewell/trace-mapping@0.3.25: + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + /@jsdevtools/ez-spawn@3.0.4: resolution: {integrity: sha512-f5DRIOZf7wxogefH03RjMPMdBF7ADTWUMoOs9kaJo06EfwF+aFhMZMDZxHg/Xe12hptN9xoZjGso2fdjapBRIA==} engines: {node: '>=10'} @@ -1341,6 +1804,46 @@ packages: type-detect: 4.0.8 dev: true + /@lezer/common@1.2.1: + resolution: {integrity: sha512-yemX0ZD2xS/73llMZIK6KplkjIjf2EvAHcinDi/TfJ9hS25G0388+ClHt6/3but0oOxinTcQHJLDXh6w1crzFQ==} + dev: true + + /@lezer/css@1.1.8: + resolution: {integrity: sha512-7JhxupKuMBaWQKjQoLtzhGj83DdnZY9MckEOG5+/iLKNK2ZJqKc6hf6uc0HjwCX7Qlok44jBNqZhHKDhEhZYLA==} + dependencies: + '@lezer/common': 1.2.1 + '@lezer/highlight': 1.2.0 + '@lezer/lr': 1.4.0 + dev: true + + /@lezer/highlight@1.2.0: + resolution: {integrity: sha512-WrS5Mw51sGrpqjlh3d4/fOwpEV2Hd3YOkp9DBt4k8XZQcoTHZFB7sx030A6OcahF4J1nDQAa3jXlTVVYH50IFA==} + dependencies: + '@lezer/common': 1.2.1 + dev: true + + /@lezer/html@1.3.9: + resolution: {integrity: sha512-MXxeCMPyrcemSLGaTQEZx0dBUH0i+RPl8RN5GwMAzo53nTsd/Unc/t5ZxACeQoyPUM5/GkPLRUs2WliOImzkRA==} + dependencies: + '@lezer/common': 1.2.1 + '@lezer/highlight': 1.2.0 + '@lezer/lr': 1.4.0 + dev: true + + /@lezer/javascript@1.4.14: + resolution: {integrity: sha512-GEdUyspTRgc5dwIGebUk+f3BekvqEWVIYsIuAC3pA8e8wcikGwBZRWRa450L0s8noGWuULwnmi4yjxTnYz9PpA==} + dependencies: + '@lezer/common': 1.2.1 + '@lezer/highlight': 1.2.0 + '@lezer/lr': 1.4.0 + dev: true + + /@lezer/lr@1.4.0: + resolution: {integrity: sha512-Wst46p51km8gH0ZUmeNrtpRYmdlRHUpN1DQd3GFAyKANi8WVz8c2jHYTf1CVScFaCjQw1iO3ZZdqGDxQPRErTg==} + dependencies: + '@lezer/common': 1.2.1 + dev: true + /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -1362,6 +1865,10 @@ packages: fastq: 1.13.0 dev: true + /@open-draft/deferred-promise@2.2.0: + resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==} + dev: true + /@pkgjs/parseargs@0.11.0: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -1369,6 +1876,10 @@ packages: dev: true optional: true + /@polka/url@1.0.0-next.25: + resolution: {integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==} + dev: true + /@rollup/plugin-alias@5.0.0(rollup@3.28.1): resolution: {integrity: sha512-l9hY5chSCjuFRPsnRm16twWBiSApl2uYFLsepQYwtBuAxNMQ/1dJqADld40P0Jkqm65GRTLy/AC6hnpVebtLsA==} engines: {node: '>=14.0.0'} @@ -1460,6 +1971,21 @@ packages: rollup: 3.28.1 dev: true + /@rollup/pluginutils@5.1.0(rollup@3.28.1): + resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@types/estree': 1.0.5 + estree-walker: 2.0.2 + picomatch: 2.3.1 + rollup: 3.28.1 + dev: true + /@rollup/rollup-android-arm-eabi@4.16.2: resolution: {integrity: sha512-VGodkwtEuZ+ENPz/CpDSl091koMv8ao5jHVMbG1vNK+sbx/48/wVzP84M5xSfDAC69mAKKoEkSo+ym9bXYRK9w==} cpu: [arm] @@ -1698,6 +2224,10 @@ packages: resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} dev: true + /@stitches/core@1.2.8: + resolution: {integrity: sha512-Gfkvwk9o9kE9r9XNBmJRfV8zONvXThnm1tcuojL04Uy5uRyqg93DC83lDebl0rocZCfKSjUv+fWYtMQmEDJldg==} + dev: true + /@stylistic/eslint-plugin-js@1.4.1(eslint@8.54.0): resolution: {integrity: sha512-WXHPEVw5PB7OML7cLwHJDEcCyLiP7vzKeBbSwmpHLK0oh0JYkoJfTg2hEdFuQT5rQxFy3KzCy9R1mZ0wgLjKrA==} engines: {node: ^16.0.0 || >=18.0.0} @@ -1929,55 +2459,269 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 6.13.1 - '@typescript-eslint/visitor-keys': 6.13.1 - debug: 4.3.4 - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.5.4 - ts-api-utils: 1.0.1(typescript@5.3.2) - typescript: 5.3.2 + '@typescript-eslint/types': 6.13.1 + '@typescript-eslint/visitor-keys': 6.13.1 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.4 + ts-api-utils: 1.0.1(typescript@5.3.2) + typescript: 5.3.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/utils@6.13.1(eslint@8.54.0)(typescript@5.3.2): + resolution: {integrity: sha512-ouPn/zVoan92JgAegesTXDB/oUp6BP1v8WpfYcqh649ejNc9Qv+B4FF2Ff626kO1xg0wWwwG48lAJ4JuesgdOw==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.54.0) + '@types/json-schema': 7.0.12 + '@types/semver': 7.5.0 + '@typescript-eslint/scope-manager': 6.13.1 + '@typescript-eslint/types': 6.13.1 + '@typescript-eslint/typescript-estree': 6.13.1(typescript@5.3.2) + eslint: 8.54.0 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/visitor-keys@6.13.1: + resolution: {integrity: sha512-NDhQUy2tg6XGNBGDRm1XybOHSia8mcXmlbKWoQP+nm1BIIMxa55shyJfZkHpEBN62KNPLrocSM2PdPcaLgDKMQ==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.13.1 + eslint-visitor-keys: 3.4.3 + dev: true + + /@typescript/vfs@1.5.0: + resolution: {integrity: sha512-AJS307bPgbsZZ9ggCT3wwpg3VbTKMFNHfaY/uF0ahSkYYrPF2dSSKDNIDIQAHm9qJqbLvCsSJH7yN4Vs/CsMMg==} + dependencies: + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: false + + /@ungap/structured-clone@1.2.0: + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + + /@unocss/astro@0.59.4(rollup@3.28.1)(vite@5.0.4): + resolution: {integrity: sha512-DU3OR5MMR1Uvvec4/wB9EetDASHRg19Moy6z/MiIhn8JWJ0QzWYgSeJcfUX8exomMYv6WUEQJL+CyLI34Wmn8w==} + peerDependencies: + vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 + peerDependenciesMeta: + vite: + optional: true + dependencies: + '@unocss/core': 0.59.4 + '@unocss/reset': 0.59.4 + '@unocss/vite': 0.59.4(rollup@3.28.1)(vite@5.0.4) + vite: 5.0.4(@types/node@20.10.1) + transitivePeerDependencies: + - rollup + dev: true + + /@unocss/cli@0.59.4(rollup@3.28.1): + resolution: {integrity: sha512-TT+WKedSifhsRqnpoYD2LfyYipVzEbzIU4DDGIaDNeDxGXYOGpb876zzkPDcvZSpI37IJ/efkkV7PGYpPBcQBQ==} + engines: {node: '>=14'} + hasBin: true + dependencies: + '@ampproject/remapping': 2.3.0 + '@rollup/pluginutils': 5.1.0(rollup@3.28.1) + '@unocss/config': 0.59.4 + '@unocss/core': 0.59.4 + '@unocss/preset-uno': 0.59.4 + cac: 6.7.14 + chokidar: 3.6.0 + colorette: 2.0.20 + consola: 3.2.3 + fast-glob: 3.3.2 + magic-string: 0.30.10 + pathe: 1.1.2 + perfect-debounce: 1.0.0 + transitivePeerDependencies: + - rollup + dev: true + + /@unocss/config@0.59.4: + resolution: {integrity: sha512-h3yhj+D5Ygn5R7gbK4wMrtXZX6FF5DF6YD517sSSb0XB3lxHD9PhhT4HaV1hpHknvu0cMFU3460M45+TN1TI0Q==} + engines: {node: '>=14'} + dependencies: + '@unocss/core': 0.59.4 + unconfig: 0.3.13 + dev: true + + /@unocss/core@0.59.4: + resolution: {integrity: sha512-bBZ1sgcAtezQVZ1BST9IS3jqcsTLyqKNjiIf7FTnX3DHpfpYuMDFzSOtmkZDzBleOLO/CtcRWjT0HwTSQAmV0A==} + dev: true + + /@unocss/extractor-arbitrary-variants@0.59.4: + resolution: {integrity: sha512-RDe4FgMGJQ+tp9GLvhPHni7Cc2O0lHBRMElVlN8LoXJAdODMICdbrEPGJlEfrc+7x/QgVFoR895KpYJh3hIgGA==} + dependencies: + '@unocss/core': 0.59.4 + dev: true + + /@unocss/inspector@0.59.4: + resolution: {integrity: sha512-QczJFNDiggmekkJyNcbcZIUVwlhvxz7ZwjnSf0w7K4znxfjKkZ1hNUbqLviM1HumkTKOdT27VISW7saN/ysO4w==} + dependencies: + '@unocss/core': 0.59.4 + '@unocss/rule-utils': 0.59.4 + gzip-size: 6.0.0 + sirv: 2.0.4 + dev: true + + /@unocss/postcss@0.59.4(postcss@8.4.38): + resolution: {integrity: sha512-KVz+AD7McHKp7VEWHbFahhyyVEo0oP/e1vnuNSuPlHthe+1V2zfH6lps+iJcvfL2072r5J+0PvD/1kOp5ryUSg==} + engines: {node: '>=14'} + peerDependencies: + postcss: ^8.4.21 + dependencies: + '@unocss/config': 0.59.4 + '@unocss/core': 0.59.4 + '@unocss/rule-utils': 0.59.4 + css-tree: 2.3.1 + fast-glob: 3.3.2 + magic-string: 0.30.10 + postcss: 8.4.38 + dev: true + + /@unocss/preset-attributify@0.59.4: + resolution: {integrity: sha512-BeogWuYaIakC1gmOZFFCjFVWmu/m3AqEX8UYQS6tY6lAaK2L4Qf4AstYBlT2zAMxy9LNxPDxFQrvfSfFk5Klsg==} + dependencies: + '@unocss/core': 0.59.4 + dev: true + + /@unocss/preset-icons@0.59.4: + resolution: {integrity: sha512-Afjwh5oC4KRE8TNZDUkRK6hvvV1wKLrS1e5trniE0B0AM9HK3PBolQaIU7QmzPv6WQrog+MZgIwafg1eqsPUCA==} + dependencies: + '@iconify/utils': 2.1.23 + '@unocss/core': 0.59.4 + ofetch: 1.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@unocss/preset-mini@0.59.4: + resolution: {integrity: sha512-ZLywGrXi1OCr4My5vX2rLUb5Xgx6ufR9WTQOvpQJGBdIV/jnZn/pyE5avCs476SnOq2K172lnd8mFmTK7/zArA==} + dependencies: + '@unocss/core': 0.59.4 + '@unocss/extractor-arbitrary-variants': 0.59.4 + '@unocss/rule-utils': 0.59.4 + dev: true + + /@unocss/preset-tagify@0.59.4: + resolution: {integrity: sha512-vWMdTUoghOSmTbdmZtERssffmdUdOuhh4vUdl0R8Kv6KxB0PkvEFCu2FItn97nRJdSPlZSFxxDkaOIg9w+STNQ==} + dependencies: + '@unocss/core': 0.59.4 + dev: true + + /@unocss/preset-typography@0.59.4: + resolution: {integrity: sha512-ZX9bxZUqlXK1qEDzO5lkK96ICt9itR/oNyn/7mMc1JPqwj263LumQMn5silocgzoLSUXEeq//L6GylqYjkL8GA==} + dependencies: + '@unocss/core': 0.59.4 + '@unocss/preset-mini': 0.59.4 + dev: true + + /@unocss/preset-uno@0.59.4: + resolution: {integrity: sha512-G1f8ZluplvXZ3bERj+sM/8zzY//XD++nNOlAQNKOANSVht3qEoJebrfEiMClNpA5qW5VWOZhEhPkh0M7GsXtnA==} + dependencies: + '@unocss/core': 0.59.4 + '@unocss/preset-mini': 0.59.4 + '@unocss/preset-wind': 0.59.4 + '@unocss/rule-utils': 0.59.4 + dev: true + + /@unocss/preset-web-fonts@0.59.4: + resolution: {integrity: sha512-ehutTjKHnf2KPmdatN42N9a8+y+glKSU3UlcBRNsVIIXVIlaBQuPVGZSPhnMtrKD17IgWylXq2K6RJK+ab0hZA==} + dependencies: + '@unocss/core': 0.59.4 + ofetch: 1.3.4 + dev: true + + /@unocss/preset-wind@0.59.4: + resolution: {integrity: sha512-CNX6w0ZpSQg/i1oF0/WKWzto8PtLqoknC5h8JmmcGb7VsyBQeV0oNnhbURxpbuMEhbv1MWVIGvk8a+P6y0rFkQ==} + dependencies: + '@unocss/core': 0.59.4 + '@unocss/preset-mini': 0.59.4 + '@unocss/rule-utils': 0.59.4 + dev: true + + /@unocss/reset@0.59.4: + resolution: {integrity: sha512-Upy4xzdWl4RChbLAXBq1BoR4WqxXMoIfjvtcwSZcZK2sylXCFAseSWnyzJFdSiXPqNfmMuNgPXgiSxiQB+cmNA==} + dev: true + + /@unocss/rule-utils@0.59.4: + resolution: {integrity: sha512-1qoLJlBWAkS4D4sg73990S1MT7E8E5md/YhopKjTQuEC9SyeVmEg+5pR/Xd8xhPKMqbcuBPl/DS8b6l/GQO56A==} + engines: {node: '>=14'} + dependencies: + '@unocss/core': 0.59.4 + magic-string: 0.30.10 + dev: true + + /@unocss/scope@0.59.4: + resolution: {integrity: sha512-wBQJ39kw4Tfj4km7AoGvSIobPKVnRZVsgc0bema5Y0PL3g1NeVQ/LopBI2zEJWdpxGXUWxSDsXm7BZo6qVlD/A==} + dev: true + + /@unocss/transformer-attributify-jsx-babel@0.59.4: + resolution: {integrity: sha512-xtCRSgeTaDBiNJLVX7oOSFe63JiFB5nrdK23PHn3IlZM9O7Bxx4ZxI3MQJtFZFQNE+INFko+DVyY1WiFEm1p/Q==} + dependencies: + '@babel/core': 7.24.4 + '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.4) + '@babel/preset-typescript': 7.24.1(@babel/core@7.24.4) + '@unocss/core': 0.59.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils@6.13.1(eslint@8.54.0)(typescript@5.3.2): - resolution: {integrity: sha512-ouPn/zVoan92JgAegesTXDB/oUp6BP1v8WpfYcqh649ejNc9Qv+B4FF2Ff626kO1xg0wWwwG48lAJ4JuesgdOw==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 + /@unocss/transformer-attributify-jsx@0.59.4: + resolution: {integrity: sha512-m4b83utzKMfUQH/45V2QkjJoXd8Tu2pRP1nic91Xf7QRceyKDD+BxoTneo2JNC2K274cQu7HqqotnCm2aFfEGw==} dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.54.0) - '@types/json-schema': 7.0.12 - '@types/semver': 7.5.0 - '@typescript-eslint/scope-manager': 6.13.1 - '@typescript-eslint/types': 6.13.1 - '@typescript-eslint/typescript-estree': 6.13.1(typescript@5.3.2) - eslint: 8.54.0 - semver: 7.5.4 - transitivePeerDependencies: - - supports-color - - typescript + '@unocss/core': 0.59.4 dev: true - /@typescript-eslint/visitor-keys@6.13.1: - resolution: {integrity: sha512-NDhQUy2tg6XGNBGDRm1XybOHSia8mcXmlbKWoQP+nm1BIIMxa55shyJfZkHpEBN62KNPLrocSM2PdPcaLgDKMQ==} - engines: {node: ^16.0.0 || >=18.0.0} + /@unocss/transformer-compile-class@0.59.4: + resolution: {integrity: sha512-Vgk2OCLPW0pU+Uzr1IgDtHVspSBb+gPrQFkV+5gxHk9ZdKi3oYKxLuufVWYDSwv7o9yfQGbYrMH9YLsjRsnA7Q==} dependencies: - '@typescript-eslint/types': 6.13.1 - eslint-visitor-keys: 3.4.3 + '@unocss/core': 0.59.4 dev: true - /@typescript/vfs@1.5.0: - resolution: {integrity: sha512-AJS307bPgbsZZ9ggCT3wwpg3VbTKMFNHfaY/uF0ahSkYYrPF2dSSKDNIDIQAHm9qJqbLvCsSJH7yN4Vs/CsMMg==} + /@unocss/transformer-directives@0.59.4: + resolution: {integrity: sha512-nXUTEclUbs0vQ4KfLhKt4J/5SLSEq1az2FNlJmiXMmqmn75X89OrtCu2OJu9sGXhn+YyBApxgcSSdxmtpqMi1Q==} dependencies: - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: false + '@unocss/core': 0.59.4 + '@unocss/rule-utils': 0.59.4 + css-tree: 2.3.1 + dev: true - /@ungap/structured-clone@1.2.0: - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + /@unocss/transformer-variant-group@0.59.4: + resolution: {integrity: sha512-9XLixxn1NRgP62Kj4R/NC/rpqhql5F2s6ulJ8CAMTEbd/NylVhEANluPGDVUGcLJ4cj6E02hFa8C1PLGSm7/xw==} + dependencies: + '@unocss/core': 0.59.4 + dev: true + + /@unocss/vite@0.59.4(rollup@3.28.1)(vite@5.0.4): + resolution: {integrity: sha512-q7GN7vkQYn79n7vYIUlaa7gXGwc7pk0Qo3z3ZFwWGE43/DtZnn2Hwl5UjgBAgi9McA+xqHJEHRsJnI7HJPHUYA==} + peerDependencies: + vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 + dependencies: + '@ampproject/remapping': 2.3.0 + '@rollup/pluginutils': 5.1.0(rollup@3.28.1) + '@unocss/config': 0.59.4 + '@unocss/core': 0.59.4 + '@unocss/inspector': 0.59.4 + '@unocss/scope': 0.59.4 + '@unocss/transformer-directives': 0.59.4 + chokidar: 3.6.0 + fast-glob: 3.3.2 + magic-string: 0.30.10 + vite: 5.0.4(@types/node@20.10.1) + transitivePeerDependencies: + - rollup + dev: true /@vitejs/plugin-vue@5.0.4(vite@5.2.10)(vue@3.4.24): resolution: {integrity: sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ==} @@ -2245,6 +2989,12 @@ packages: hasBin: true dev: true + /acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + /adler-32@1.2.0: resolution: {integrity: sha512-/vUqU/UY4MVeFsg+SsK6c+/05RZXIHZMGJA+PX5JyWI0ZRcBpupnRuPLU/NXXoFwMYCPCoxIfElM2eS+DUXCqQ==} engines: {node: '>=0.8'} @@ -2297,6 +3047,10 @@ packages: '@algolia/transporter': 4.23.3 dev: true + /anser@2.1.1: + resolution: {integrity: sha512-nqLm4HxOTpeLOxcmB3QWmV5TcDFhW9y/fyQ+hivtDFcK4OQ+pQ5fzPnXHM1Mfcm0VkLtvVi1TCPr++Qy0Q/3EQ==} + dev: true + /ansi-escapes@5.0.0: resolution: {integrity: sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==} engines: {node: '>=12'} @@ -2339,6 +3093,20 @@ packages: engines: {node: '>=12'} dev: true + /ansi-to-vue3@0.1.2(vue@3.4.24): + resolution: {integrity: sha512-mkfWeVNBKfmpoWLeLqmAeKQalqvOyAhhMnndqu1oJZEzz8tn56mbUqJC7OfvB8cOEg70ooKjmgeIZoI0i9cdxw==} + engines: {node: '>=16', npm: '>=7'} + peerDependencies: + vue: ^3.2.0 + peerDependenciesMeta: + vue: + optional: true + dependencies: + anser: 2.1.1 + escape-carriage: 1.3.1 + vue: 3.4.24(typescript@5.3.2) + dev: true + /anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -2368,6 +3136,10 @@ packages: /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: true + /binary-extensions@2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} @@ -2407,10 +3179,28 @@ packages: update-browserslist-db: 1.0.11(browserslist@4.21.10) dev: true + /browserslist@4.23.0: + resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001612 + electron-to-chromium: 1.4.746 + node-releases: 2.0.14 + update-browserslist-db: 1.0.13(browserslist@4.23.0) + dev: true + /buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} dev: true + /buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: true + /builtin-modules@3.3.0: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} @@ -2473,6 +3263,10 @@ packages: resolution: {integrity: sha512-Jj917pJtYg9HSJBF95HVX3Cdr89JUyLT4IZ8SvM5aDRni95swKgYi3TgYLH5hnGfPE/U1dg6IfZ50UsIlLkwSA==} dev: true + /caniuse-lite@1.0.30001612: + resolution: {integrity: sha512-lFgnZ07UhaCcsSZgWW0K5j4e69dK1u/ltrL9lTUiFOwNHs12S3UMIEYgBV0Z6C6hRDev7iRnMzzYmKabYdXF9g==} + dev: true + /ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} dev: false @@ -2558,6 +3352,21 @@ packages: fsevents: 2.3.3 dev: true + /chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + dev: true + /chownr@2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} @@ -2581,6 +3390,10 @@ packages: escape-string-regexp: 1.0.5 dev: true + /clean-set@1.1.2: + resolution: {integrity: sha512-cA8uCj0qSoG9e0kevyOWXwPaELRPVg5Pxp6WskLMwerx257Zfnh8Nl0JBH59d7wQzij2CK7qEfJQK3RjuKKIug==} + dev: true + /cli-cursor@4.0.0: resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -2682,12 +3495,20 @@ packages: safe-buffer: 5.1.2 dev: true + /convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + dev: true + /crc-32@1.2.2: resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} engines: {node: '>=0.8'} hasBin: true dev: false + /crelt@1.0.6: + resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} + dev: true + /cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} @@ -2697,6 +3518,14 @@ packages: which: 2.0.2 dev: true + /css-tree@2.3.1: + resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + dependencies: + mdn-data: 2.0.30 + source-map-js: 1.2.0 + dev: true + /cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} @@ -2767,15 +3596,22 @@ packages: resolution: {integrity: sha512-+uO4+qr7msjNNWKYPHqN/3+Dx3NFkmIzayk2L1MyZQlvgZb/J1A0fo410dpKrN2SnqFjt8n4JL8fDJE0wIgjFQ==} dev: true + /defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + dev: true + /dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} - dev: false /destr@2.0.0: resolution: {integrity: sha512-FJ9RDpf3GicEBvzI3jxc2XhHzbqD8p4ANw/1kPsFBfTvP1b7Gn/Lg1vO7R9J4IVgoMbyUmFrFGZafJ1hPZpvlg==} dev: true + /destr@2.0.3: + resolution: {integrity: sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==} + dev: true + /devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} dependencies: @@ -2813,6 +3649,10 @@ packages: engines: {node: '>=12'} dev: true + /duplexer@0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + dev: true + /eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} dev: true @@ -2821,6 +3661,10 @@ packages: resolution: {integrity: sha512-cSMwIAd8yUh54VwitVRVvHK66QqHWE39C3DRj8SWiXitEpVSY3wNPD9y1pxQtLIi4w3UdzF9klLsmuPshz09DQ==} dev: true + /electron-to-chromium@1.4.746: + resolution: {integrity: sha512-jeWaIta2rIG2FzHaYIhSuVWqC6KJYo7oSBX4Jv7g+aVujKztfvdpf+n6MGwZdC5hQXbax4nntykLH2juIQrfPg==} + dev: true + /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} dev: true @@ -2935,6 +3779,10 @@ packages: engines: {node: '>=6'} dev: true + /escape-carriage@1.3.1: + resolution: {integrity: sha512-GwBr6yViW3ttx1kb7/Oh+gKQ1/TrhYwxKqVmg5gS+BK+Qe2KrOa/Vh7w3HPBvgGf0LfcDGoY9I6NHKoA5Hozhw==} + dev: true + /escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} @@ -3360,6 +4208,21 @@ packages: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} dev: true + /execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + /execa@8.0.1: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} @@ -3395,6 +4258,17 @@ packages: micromatch: 4.0.5 dev: true + /fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + /fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} dev: true @@ -3548,6 +4422,11 @@ packages: resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} dev: true + /get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: true + /get-stream@8.0.1: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} @@ -3665,6 +4544,13 @@ packages: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} dev: true + /gzip-size@6.0.0: + resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} + engines: {node: '>=10'} + dependencies: + duplexer: 0.1.2 + dev: true + /has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} @@ -3706,11 +4592,20 @@ packages: - supports-color dev: true + /human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: true + /human-signals@5.0.0: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} dev: true + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: true + /ignore@5.2.4: resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} engines: {node: '>= 4'} @@ -3830,6 +4725,11 @@ packages: '@types/estree': 1.0.0 dev: true + /is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: true + /is-stream@3.0.0: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -3853,6 +4753,11 @@ packages: hasBin: true dev: true + /jiti@1.21.0: + resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} + hasBin: true + dev: true + /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} requiresBuild: true @@ -3932,6 +4837,10 @@ packages: engines: {node: '>=6'} dev: true + /kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + dev: true + /levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -4056,6 +4965,11 @@ packages: engines: {node: 14 || >=16.14} dev: true + /lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true + dev: true + /magic-string@0.27.0: resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} engines: {node: '>=12'} @@ -4079,6 +4993,14 @@ packages: resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} dev: true + /markdown-it-container@3.0.0: + resolution: {integrity: sha512-y6oKTq4BB9OQuY/KLfk/O3ysFhB3IMYoIWhGJEidXt1NQFocFK2sA2t0NYZAMyMShAGL6x5OPIbrmXPIqaN9rw==} + dev: true + + /markdown-it-container@4.0.0: + resolution: {integrity: sha512-HaNccxUH0l7BNGYbFbjmGpf5aLHAMTinqRZQAEQbMr2cdD3z91Q6kIo1oUn1CQndkT03jat6ckrdRYuwwqLlQw==} + dev: true + /markdown-table@3.0.3: resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} dev: false @@ -4236,6 +5158,10 @@ packages: '@types/mdast': 4.0.3 dev: false + /mdn-data@2.0.30: + resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + dev: true + /merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} dev: true @@ -4437,6 +5363,11 @@ packages: picomatch: 2.3.1 dev: true + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + dev: true + /mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} @@ -4543,11 +5474,25 @@ packages: ufo: 1.3.1 dev: true + /mlly@1.6.1: + resolution: {integrity: sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==} + dependencies: + acorn: 8.11.3 + pathe: 1.1.2 + pkg-types: 1.0.3 + ufo: 1.5.3 + dev: true + /mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} dev: true + /mrmime@2.0.0: + resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} + engines: {node: '>=10'} + dev: true + /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} @@ -4582,10 +5527,18 @@ packages: resolution: {integrity: sha512-KIkvH1jl6b3O7es/0ShyCgWLcfXxlBrLBbP3rOr23WArC66IMcU4DeZEeYEOwnopYhawLTn7/y+YtmASe8DFVQ==} dev: true + /node-fetch-native@1.6.4: + resolution: {integrity: sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==} + dev: true + /node-releases@2.0.13: resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} dev: true + /node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + dev: true + /normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} dependencies: @@ -4600,6 +5553,13 @@ packages: engines: {node: '>=0.10.0'} dev: true + /npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + dev: true + /npm-run-path@5.1.0: resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -4607,12 +5567,24 @@ packages: path-key: 4.0.0 dev: true + /nprogress@0.2.0: + resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==} + dev: true + /nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} dependencies: boolbase: 1.0.0 dev: true + /ofetch@1.3.4: + resolution: {integrity: sha512-KLIET85ik3vhEfS+3fDlc/BAZiAp+43QEC/yCo5zkNoY2YaKvNkOaFr/6wCFgFH1kuYQM5pMNi0Tg8koiIemtw==} + dependencies: + destr: 2.0.3 + node-fetch-native: 1.6.4 + ufo: 1.5.3 + dev: true + /ohash@1.1.2: resolution: {integrity: sha512-9CIOSq5945rI045GFtcO3uudyOkYVY1nyfFxVQp+9BRgslr8jPNiSSrsFGg/BNTUFOLqx0P5tng6G32brIPw0w==} dev: true @@ -4649,6 +5621,10 @@ packages: type-check: 0.4.0 dev: true + /outvariant@1.4.0: + resolution: {integrity: sha512-AlWY719RF02ujitly7Kk/0QlV+pXGFDHrHf9O2OKqyqgBieaPOIeuSkL8sRK6j2WK+/ZAURq2kZsY0d8JapUiw==} + dev: true + /p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -4786,6 +5762,10 @@ packages: resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} dev: true + /pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + dev: true + /pathval@1.1.1: resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} dev: true @@ -5018,7 +5998,7 @@ packages: rollup: 3.28.1 typescript: 5.3.2 optionalDependencies: - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.24.2 dev: true /rollup@3.28.1: @@ -5085,6 +6065,35 @@ packages: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} dev: true + /sandpack-vue3@3.1.11(@lezer/common@1.2.1)(vue@3.4.24): + resolution: {integrity: sha512-VuXLTvKJJEZa2TPqhWhN6kZ/LWW7igo/3QzMRiYdJnRpR7FfpCd3sSWtIExmv2MILFkLrIb3hH0M1e2LA0SEoQ==} + engines: {node: '>=16'} + peerDependencies: + vue: '>=3.2.0' + peerDependenciesMeta: + vue: + optional: true + dependencies: + '@codemirror/autocomplete': 6.16.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1) + '@codemirror/commands': 6.5.0 + '@codemirror/lang-css': 6.2.1(@codemirror/view@6.26.3) + '@codemirror/lang-html': 6.4.9 + '@codemirror/lang-javascript': 6.2.2 + '@codemirror/language': 6.10.1 + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.26.3 + '@codesandbox/sandpack-client': 2.13.8 + '@lezer/highlight': 1.2.0 + '@stitches/core': 1.2.8 + ansi-to-vue3: 0.1.2(vue@3.4.24) + clean-set: 1.1.2 + dequal: 2.0.3 + lz-string: 1.5.0 + vue: 3.4.24(typescript@5.3.2) + transitivePeerDependencies: + - '@lezer/common' + dev: true + /scule@1.0.0: resolution: {integrity: sha512-4AsO/FrViE/iDNEPaAQlb77tf0csuq27EsVpy6ett584EcRTp6pTDLoGWVxCD77y5iU5FauOvhsI4o1APwPoSQ==} dev: true @@ -5168,6 +6177,15 @@ packages: requiresBuild: true dev: true + /sirv@2.0.4: + resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} + engines: {node: '>= 10'} + dependencies: + '@polka/url': 1.0.0-next.25 + mrmime: 2.0.0 + totalist: 3.0.1 + dev: true + /sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} dev: true @@ -5249,10 +6267,23 @@ packages: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} dev: true + /static-browser-server@1.0.3: + resolution: {integrity: sha512-ZUyfgGDdFRbZGGJQ1YhiM930Yczz5VlbJObrQLlk24+qNHVQx4OlLcYswEUo3bIyNAbQUIUR9Yr5/Hqjzqb4zA==} + dependencies: + '@open-draft/deferred-promise': 2.2.0 + dotenv: 16.3.1 + mime-db: 1.52.0 + outvariant: 1.4.0 + dev: true + /std-env@3.5.0: resolution: {integrity: sha512-JGUEaALvL0Mf6JCfYnJOTcobY+Nc7sG/TemDRBqCA0wEr4DER7zDchaaixTlmOxAjG1uRJmX82EQcxwTQTkqVA==} dev: true + /strict-event-emitter@0.4.6: + resolution: {integrity: sha512-12KWeb+wixJohmnwNFerbyiBrAlq5qJLwIt38etRtKtmmHyDSoGlIqFE9wx+4IwG0aDjI7GV8tc8ZccjWZZtTg==} + dev: true + /string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} @@ -5290,6 +6321,11 @@ packages: ansi-regex: 6.0.1 dev: true + /strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + dev: true + /strip-final-newline@3.0.0: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} @@ -5313,6 +6349,10 @@ packages: acorn: 8.11.2 dev: true + /style-mod@4.1.2: + resolution: {integrity: sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==} + dev: true + /supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -5378,6 +6418,11 @@ packages: is-number: 7.0.0 dev: true + /totalist@3.0.1: + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} + dev: true + /trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} dev: false @@ -5467,6 +6512,10 @@ packages: resolution: {integrity: sha512-uY/99gMLIOlJPwATcMVYfqDSxUR9//AUcgZMzwfSTJPDKzA1S8mX4VLqa+fiAtveraQUBCz4FFcwVZBGbwBXIw==} dev: true + /ufo@1.5.3: + resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} + dev: true + /unbuild@2.0.0(typescript@5.3.2): resolution: {integrity: sha512-JWCUYx3Oxdzvw2J9kTAp+DKE8df/BnH/JTSj6JyA4SH40ECdFu7FoJJcrm8G92B7TjofQ6GZGjJs50TRxoH6Wg==} hasBin: true @@ -5506,6 +6555,14 @@ packages: - supports-color dev: true + /unconfig@0.3.13: + resolution: {integrity: sha512-N9Ph5NC4+sqtcOjPfHrRcHekBCadCXWTBzp2VYYbySOHW0PfD9XLCeXshTXjkPYwLrBr9AtSeU0CZmkYECJhng==} + dependencies: + '@antfu/utils': 0.7.7 + defu: 6.1.4 + jiti: 1.21.0 + dev: true + /undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} dev: true @@ -5559,6 +6616,45 @@ packages: engines: {node: '>= 10.0.0'} dev: true + /unocss@0.59.4(postcss@8.4.38)(rollup@3.28.1)(vite@5.0.4): + resolution: {integrity: sha512-QmCVjRObvVu/gsGrJGVt0NnrdhFFn314BUZn2WQyXV9rIvHLRmG5bIu0j5vibJkj7ZhFchTrnTM1pTFXP1xt5g==} + engines: {node: '>=14'} + peerDependencies: + '@unocss/webpack': 0.59.4 + vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 + peerDependenciesMeta: + '@unocss/webpack': + optional: true + vite: + optional: true + dependencies: + '@unocss/astro': 0.59.4(rollup@3.28.1)(vite@5.0.4) + '@unocss/cli': 0.59.4(rollup@3.28.1) + '@unocss/core': 0.59.4 + '@unocss/extractor-arbitrary-variants': 0.59.4 + '@unocss/postcss': 0.59.4(postcss@8.4.38) + '@unocss/preset-attributify': 0.59.4 + '@unocss/preset-icons': 0.59.4 + '@unocss/preset-mini': 0.59.4 + '@unocss/preset-tagify': 0.59.4 + '@unocss/preset-typography': 0.59.4 + '@unocss/preset-uno': 0.59.4 + '@unocss/preset-web-fonts': 0.59.4 + '@unocss/preset-wind': 0.59.4 + '@unocss/reset': 0.59.4 + '@unocss/transformer-attributify-jsx': 0.59.4 + '@unocss/transformer-attributify-jsx-babel': 0.59.4 + '@unocss/transformer-compile-class': 0.59.4 + '@unocss/transformer-directives': 0.59.4 + '@unocss/transformer-variant-group': 0.59.4 + '@unocss/vite': 0.59.4(rollup@3.28.1)(vite@5.0.4) + vite: 5.0.4(@types/node@20.10.1) + transitivePeerDependencies: + - postcss + - rollup + - supports-color + dev: true + /untyped@1.4.0: resolution: {integrity: sha512-Egkr/s4zcMTEuulcIb7dgURS6QpN7DyqQYdf+jBtiaJvQ+eRsrtWUoX84SbvQWuLkXsOjM+8sJC9u6KoMK/U7Q==} hasBin: true @@ -5585,6 +6681,17 @@ packages: picocolors: 1.0.0 dev: true + /update-browserslist-db@1.0.13(browserslist@4.23.0): + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.23.0 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: true + /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: @@ -5710,6 +6817,37 @@ packages: fsevents: 2.3.3 dev: true + /vitepress-plugin-nprogress@0.0.4: + resolution: {integrity: sha512-YzW36kBnjuFH91DOFIA5snyBf4WpF/cYfhAiyNefhqif8QQIKGsbpzvI8VN0M8RHLGr9iQyHhF7dQsm//Xf5Hw==} + dependencies: + nprogress: 0.2.0 + dev: true + + /vitepress-plugin-sandpack@1.1.4(@lezer/common@1.2.1)(vite@5.0.4)(vitepress@1.1.3)(vue@3.4.24): + resolution: {integrity: sha512-8ZAQLpg9VDY1o8wCjEQeKgfTnmxaV/1thElx5mhA6QbKpzo7Jo8WSYcWYA7yTCvBfTY+Blt8ngwXRnwbNbw5ig==} + engines: {node: '>=16'} + peerDependencies: + vite: '>=4.0.0' + vitepress: ^1.0.0-beta.1 + vue: '>=3.2.0' + peerDependenciesMeta: + vite: + optional: true + vitepress: + optional: true + vue: + optional: true + dependencies: + '@codesandbox/sandpack-themes': 2.0.21 + markdown-it-container: 3.0.0 + sandpack-vue3: 3.1.11(@lezer/common@1.2.1)(vue@3.4.24) + vite: 5.0.4(@types/node@20.10.1) + vitepress: 1.1.3(@algolia/client-search@4.23.3)(@types/node@20.10.1)(postcss@8.4.38)(search-insights@2.13.0)(typescript@5.3.2) + vue: 3.4.24(typescript@5.3.2) + transitivePeerDependencies: + - '@lezer/common' + dev: true + /vitepress-plugin-twoslash@0.10.2(typescript@5.3.2): resolution: {integrity: sha512-4Ydecs+aZJkIu/QmTTJNqYmBE6taRU4NTx/CQq7fbWex0mFqbplSwfFmyI/wmZtcGtGYE8xmk/jGqORVBmi0Nw==} dependencies: @@ -5727,7 +6865,7 @@ packages: - typescript dev: false - /vitepress@1.1.3(@algolia/client-search@4.23.3)(@types/node@20.10.1)(search-insights@2.13.0)(typescript@5.3.2): + /vitepress@1.1.3(@algolia/client-search@4.23.3)(@types/node@20.10.1)(postcss@8.4.38)(search-insights@2.13.0)(typescript@5.3.2): resolution: {integrity: sha512-hGrIYN0w9IHWs0NQSnlMjKV/v/HLfD+Ywv5QdvCSkiT32mpNOOwUrZjnqZv/JL/WBPpUc94eghTUvmipxw0xrA==} hasBin: true peerDependencies: @@ -5751,6 +6889,7 @@ packages: focus-trap: 7.5.4 mark.js: 8.11.1 minisearch: 6.3.0 + postcss: 8.4.38 shiki: 1.3.0 vite: 5.2.10(@types/node@20.10.1) vue: 3.4.24(typescript@5.3.2) @@ -5902,6 +7041,10 @@ packages: '@vue/shared': 3.4.24 typescript: 5.3.2 + /w3c-keyname@2.2.8: + resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} + dev: true + /which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} diff --git a/src/types.ts b/src/types.ts index d5c89dc..115eb5d 100644 --- a/src/types.ts +++ b/src/types.ts @@ -20,24 +20,24 @@ export type NestedPaths = T extends Array export type Not = T extends U ? never : T type IfExistsInAllUnionMembers = - T extends any ? K extends keyof T ? true : false : never + T extends any ? K extends keyof T ? true : false : never export type TypeFromPath = - T extends any ? ( - Path extends keyof T ? T[Path] : - Path extends `${infer P}.${infer R}` ? - P extends keyof T ? - T[P] extends GenericObject | null | undefined ? - TypeFromPath, R> : - never : + T extends any ? ( + Path extends keyof T ? T[Path] : + Path extends `${infer P}.${infer R}` ? + P extends keyof T ? + T[P] extends GenericObject | null | undefined ? + TypeFromPath, R> : never : - never - ) : never + never : + never + ) : never export type TypeFromPathUnion = - IfExistsInAllUnionMembers extends true - ? TypeFromPath - : TypeFromPath | undefined + IfExistsInAllUnionMembers extends true + ? TypeFromPath + : TypeFromPath | undefined export type AllKeysMatch = { [K in keyof T]: T[K] extends U ? true : false; @@ -90,10 +90,10 @@ export type Column< cellStyle?: CellStyle | ((data: T[]) => CellStyle) }> } & ( - ExtractColumnValue extends CellValue - ? { transform?: TypedTransformersMap> | ((value: ExtractColumnValue, index: number) => CellValue) } - : { transform: TypedTransformersMap> | ((value: ExtractColumnValue, index: number) => CellValue) } -) + ExtractColumnValue extends CellValue + ? { transform?: TypedTransformersMap> | ((value: ExtractColumnValue, index: number) => CellValue) } + : { transform: TypedTransformersMap> | ((value: ExtractColumnValue, index: number) => CellValue) } + ) export interface ColumnGroup< T extends GenericObject, @@ -203,7 +203,7 @@ export type ExtractSelectedContext< export type TOutputType = 'buffer' | 'workbook' | 'base64' | 'file' export interface ExcelBuildParams { +> { output: Output rtl?: boolean extraLength?: number diff --git a/uno.config.ts b/uno.config.ts new file mode 100644 index 0000000..0af5944 --- /dev/null +++ b/uno.config.ts @@ -0,0 +1,26 @@ +import { defineConfig, presetTypography, presetUno, presetWebFonts, transformerDirectives, transformerVariantGroup } from 'unocss' + +export default defineConfig({ + presets: [ + presetUno(), + presetTypography(), + presetWebFonts({ + provider: 'fontshare', + fonts: { + satoshi: 'Satoshi', + }, + }), + ], + transformers: [ + transformerVariantGroup(), + transformerDirectives({ + applyVariable: ['--at-apply', '--uno-apply', '--uno'], + }), + ], + theme: { + colors: { + primary: '#FF9600', + }, + }, + rules: [['h-layout', { height: 'calc(100vh - 4rem)' }]], +})